Commit 636aa70ade7e9b96eb9382ba3a503043e83d876b
1 parent
7b833f5b
Sparc64: refactor kernel init
Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
Showing
1 changed file
with
55 additions
and
42 deletions
hw/sun4u.c
| @@ -148,6 +148,56 @@ static int sun4u_NVRAM_set_params (m48t59_t *nvram, uint16_t NVRAM_size, | @@ -148,6 +148,56 @@ static int sun4u_NVRAM_set_params (m48t59_t *nvram, uint16_t NVRAM_size, | ||
| 148 | 148 | ||
| 149 | return 0; | 149 | return 0; |
| 150 | } | 150 | } |
| 151 | +static unsigned long sun4u_load_kernel(const char *kernel_filename, | ||
| 152 | + const char *initrd_filename, | ||
| 153 | + ram_addr_t RAM_size, long *initrd_size) | ||
| 154 | +{ | ||
| 155 | + int linux_boot; | ||
| 156 | + unsigned int i; | ||
| 157 | + long kernel_size; | ||
| 158 | + | ||
| 159 | + linux_boot = (kernel_filename != NULL); | ||
| 160 | + | ||
| 161 | + kernel_size = 0; | ||
| 162 | + if (linux_boot) { | ||
| 163 | + kernel_size = load_elf(kernel_filename, 0, NULL, NULL, NULL); | ||
| 164 | + if (kernel_size < 0) | ||
| 165 | + kernel_size = load_aout(kernel_filename, KERNEL_LOAD_ADDR, | ||
| 166 | + RAM_size - KERNEL_LOAD_ADDR); | ||
| 167 | + if (kernel_size < 0) | ||
| 168 | + kernel_size = load_image_targphys(kernel_filename, | ||
| 169 | + KERNEL_LOAD_ADDR, | ||
| 170 | + RAM_size - KERNEL_LOAD_ADDR); | ||
| 171 | + if (kernel_size < 0) { | ||
| 172 | + fprintf(stderr, "qemu: could not load kernel '%s'\n", | ||
| 173 | + kernel_filename); | ||
| 174 | + exit(1); | ||
| 175 | + } | ||
| 176 | + | ||
| 177 | + /* load initrd */ | ||
| 178 | + *initrd_size = 0; | ||
| 179 | + if (initrd_filename) { | ||
| 180 | + *initrd_size = load_image_targphys(initrd_filename, | ||
| 181 | + INITRD_LOAD_ADDR, | ||
| 182 | + RAM_size - INITRD_LOAD_ADDR); | ||
| 183 | + if (*initrd_size < 0) { | ||
| 184 | + fprintf(stderr, "qemu: could not load initial ram disk '%s'\n", | ||
| 185 | + initrd_filename); | ||
| 186 | + exit(1); | ||
| 187 | + } | ||
| 188 | + } | ||
| 189 | + if (*initrd_size > 0) { | ||
| 190 | + for (i = 0; i < 64 * TARGET_PAGE_SIZE; i += TARGET_PAGE_SIZE) { | ||
| 191 | + if (ldl_phys(KERNEL_LOAD_ADDR + i) == 0x48647253) { // HdrS | ||
| 192 | + stl_phys(KERNEL_LOAD_ADDR + i + 16, INITRD_LOAD_ADDR); | ||
| 193 | + stl_phys(KERNEL_LOAD_ADDR + i + 20, *initrd_size); | ||
| 194 | + break; | ||
| 195 | + } | ||
| 196 | + } | ||
| 197 | + } | ||
| 198 | + } | ||
| 199 | + return kernel_size; | ||
| 200 | +} | ||
| 151 | 201 | ||
| 152 | void pic_info(Monitor *mon) | 202 | void pic_info(Monitor *mon) |
| 153 | { | 203 | { |
| @@ -503,7 +553,6 @@ static void sun4uv_init(ram_addr_t RAM_size, | @@ -503,7 +553,6 @@ static void sun4uv_init(ram_addr_t RAM_size, | ||
| 503 | { | 553 | { |
| 504 | CPUState *env; | 554 | CPUState *env; |
| 505 | m48t59_t *nvram; | 555 | m48t59_t *nvram; |
| 506 | - int linux_boot; | ||
| 507 | unsigned int i; | 556 | unsigned int i; |
| 508 | long initrd_size, kernel_size; | 557 | long initrd_size, kernel_size; |
| 509 | PCIBus *pci_bus, *pci_bus2, *pci_bus3; | 558 | PCIBus *pci_bus, *pci_bus2, *pci_bus3; |
| @@ -513,8 +562,6 @@ static void sun4uv_init(ram_addr_t RAM_size, | @@ -513,8 +562,6 @@ static void sun4uv_init(ram_addr_t RAM_size, | ||
| 513 | BlockDriverState *fd[MAX_FD]; | 562 | BlockDriverState *fd[MAX_FD]; |
| 514 | void *fw_cfg; | 563 | void *fw_cfg; |
| 515 | 564 | ||
| 516 | - linux_boot = (kernel_filename != NULL); | ||
| 517 | - | ||
| 518 | /* init CPUs */ | 565 | /* init CPUs */ |
| 519 | env = cpu_devinit(cpu_model, hwdef); | 566 | env = cpu_devinit(cpu_model, hwdef); |
| 520 | 567 | ||
| @@ -523,45 +570,6 @@ static void sun4uv_init(ram_addr_t RAM_size, | @@ -523,45 +570,6 @@ static void sun4uv_init(ram_addr_t RAM_size, | ||
| 523 | 570 | ||
| 524 | prom_init(hwdef->prom_addr, bios_name); | 571 | prom_init(hwdef->prom_addr, bios_name); |
| 525 | 572 | ||
| 526 | - kernel_size = 0; | ||
| 527 | - initrd_size = 0; | ||
| 528 | - if (linux_boot) { | ||
| 529 | - /* XXX: put correct offset */ | ||
| 530 | - kernel_size = load_elf(kernel_filename, 0, NULL, NULL, NULL); | ||
| 531 | - if (kernel_size < 0) | ||
| 532 | - kernel_size = load_aout(kernel_filename, KERNEL_LOAD_ADDR, | ||
| 533 | - ram_size - KERNEL_LOAD_ADDR); | ||
| 534 | - if (kernel_size < 0) | ||
| 535 | - kernel_size = load_image_targphys(kernel_filename, | ||
| 536 | - KERNEL_LOAD_ADDR, | ||
| 537 | - ram_size - KERNEL_LOAD_ADDR); | ||
| 538 | - if (kernel_size < 0) { | ||
| 539 | - fprintf(stderr, "qemu: could not load kernel '%s'\n", | ||
| 540 | - kernel_filename); | ||
| 541 | - exit(1); | ||
| 542 | - } | ||
| 543 | - | ||
| 544 | - /* load initrd */ | ||
| 545 | - if (initrd_filename) { | ||
| 546 | - initrd_size = load_image_targphys(initrd_filename, | ||
| 547 | - INITRD_LOAD_ADDR, | ||
| 548 | - ram_size - INITRD_LOAD_ADDR); | ||
| 549 | - if (initrd_size < 0) { | ||
| 550 | - fprintf(stderr, "qemu: could not load initial ram disk '%s'\n", | ||
| 551 | - initrd_filename); | ||
| 552 | - exit(1); | ||
| 553 | - } | ||
| 554 | - } | ||
| 555 | - if (initrd_size > 0) { | ||
| 556 | - for (i = 0; i < 64 * TARGET_PAGE_SIZE; i += TARGET_PAGE_SIZE) { | ||
| 557 | - if (ldl_phys(KERNEL_LOAD_ADDR + i) == 0x48647253) { // HdrS | ||
| 558 | - stl_phys(KERNEL_LOAD_ADDR + i + 16, INITRD_LOAD_ADDR); | ||
| 559 | - stl_phys(KERNEL_LOAD_ADDR + i + 20, initrd_size); | ||
| 560 | - break; | ||
| 561 | - } | ||
| 562 | - } | ||
| 563 | - } | ||
| 564 | - } | ||
| 565 | 573 | ||
| 566 | irq = qemu_allocate_irqs(cpu_set_irq, env, MAX_PILS); | 574 | irq = qemu_allocate_irqs(cpu_set_irq, env, MAX_PILS); |
| 567 | pci_bus = pci_apb_init(APB_SPECIAL_BASE, APB_MEM_BASE, irq, &pci_bus2, | 575 | pci_bus = pci_apb_init(APB_SPECIAL_BASE, APB_MEM_BASE, irq, &pci_bus2, |
| @@ -621,6 +629,11 @@ static void sun4uv_init(ram_addr_t RAM_size, | @@ -621,6 +629,11 @@ static void sun4uv_init(ram_addr_t RAM_size, | ||
| 621 | } | 629 | } |
| 622 | floppy_controller = fdctrl_init(NULL/*6*/, 2, 0, 0x3f0, fd); | 630 | floppy_controller = fdctrl_init(NULL/*6*/, 2, 0, 0x3f0, fd); |
| 623 | nvram = m48t59_init(NULL/*8*/, 0, 0x0074, NVRAM_SIZE, 59); | 631 | nvram = m48t59_init(NULL/*8*/, 0, 0x0074, NVRAM_SIZE, 59); |
| 632 | + | ||
| 633 | + initrd_size = 0; | ||
| 634 | + kernel_size = sun4u_load_kernel(kernel_filename, initrd_filename, | ||
| 635 | + ram_size, &initrd_size); | ||
| 636 | + | ||
| 624 | sun4u_NVRAM_set_params(nvram, NVRAM_SIZE, "Sun4u", RAM_size, boot_devices, | 637 | sun4u_NVRAM_set_params(nvram, NVRAM_SIZE, "Sun4u", RAM_size, boot_devices, |
| 625 | KERNEL_LOAD_ADDR, kernel_size, | 638 | KERNEL_LOAD_ADDR, kernel_size, |
| 626 | kernel_cmdline, | 639 | kernel_cmdline, |