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 148  
149 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 202 void pic_info(Monitor *mon)
153 203 {
... ... @@ -503,7 +553,6 @@ static void sun4uv_init(ram_addr_t RAM_size,
503 553 {
504 554 CPUState *env;
505 555 m48t59_t *nvram;
506   - int linux_boot;
507 556 unsigned int i;
508 557 long initrd_size, kernel_size;
509 558 PCIBus *pci_bus, *pci_bus2, *pci_bus3;
... ... @@ -513,8 +562,6 @@ static void sun4uv_init(ram_addr_t RAM_size,
513 562 BlockDriverState *fd[MAX_FD];
514 563 void *fw_cfg;
515 564  
516   - linux_boot = (kernel_filename != NULL);
517   -
518 565 /* init CPUs */
519 566 env = cpu_devinit(cpu_model, hwdef);
520 567  
... ... @@ -523,45 +570,6 @@ static void sun4uv_init(ram_addr_t RAM_size,
523 570  
524 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 574 irq = qemu_allocate_irqs(cpu_set_irq, env, MAX_PILS);
567 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 629 }
622 630 floppy_controller = fdctrl_init(NULL/*6*/, 2, 0, 0x3f0, fd);
623 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 637 sun4u_NVRAM_set_params(nvram, NVRAM_SIZE, "Sun4u", RAM_size, boot_devices,
625 638 KERNEL_LOAD_ADDR, kernel_size,
626 639 kernel_cmdline,
... ...