Revision 409dbce5 hw/sun4m.c

b/hw/sun4m.c
292 292
        cpu_interrupt(cpu_single_env, CPU_INTERRUPT_HALT);
293 293
}
294 294

  
295
static uint64_t translate_kernel_address(void *opaque, uint64_t addr)
296
{
297
    return addr - 0xf0000000ULL;
298
}
299

  
295 300
static unsigned long sun4m_load_kernel(const char *kernel_filename,
296 301
                                       const char *initrd_filename,
297 302
                                       ram_addr_t RAM_size)
......
312 317
#else
313 318
        bswap_needed = 0;
314 319
#endif
315
        kernel_size = load_elf(kernel_filename, -0xf0000000ULL, NULL, NULL,
316
                               NULL, 1, ELF_MACHINE, 0);
320
        kernel_size = load_elf(kernel_filename, translate_kernel_address, NULL,
321
                               NULL, NULL, NULL, 1, ELF_MACHINE, 0);
317 322
        if (kernel_size < 0)
318 323
            kernel_size = load_aout(kernel_filename, KERNEL_LOAD_ADDR,
319 324
                                    RAM_size - KERNEL_LOAD_ADDR, bswap_needed,
......
636 641
device_init(afx_register_devices);
637 642

  
638 643
/* Boot PROM (OpenBIOS) */
644
static uint64_t translate_prom_address(void *opaque, uint64_t addr)
645
{
646
    target_phys_addr_t *base_addr = (target_phys_addr_t *)opaque;
647
    return addr + *base_addr - PROM_VADDR;
648
}
649

  
639 650
static void prom_init(target_phys_addr_t addr, const char *bios_name)
640 651
{
641 652
    DeviceState *dev;
......
655 666
    }
656 667
    filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, bios_name);
657 668
    if (filename) {
658
        ret = load_elf(filename, addr - PROM_VADDR, NULL, NULL, NULL,
659
                       1, ELF_MACHINE, 0);
669
        ret = load_elf(filename, translate_prom_address, &addr, NULL,
670
                       NULL, NULL, 1, ELF_MACHINE, 0);
660 671
        if (ret < 0 || ret > PROM_SIZE_MAX) {
661 672
            ret = load_image_targphys(filename, addr, PROM_SIZE_MAX);
662 673
        }

Also available in: Unified diff