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