Commit 636aa70ade7e9b96eb9382ba3a503043e83d876b

Authored by Blue Swirl
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,