From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LdQpD-0004kZ-Rl for qemu-devel@nongnu.org; Sat, 28 Feb 2009 10:09:59 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1LdQpD-0004k0-8F for qemu-devel@nongnu.org; Sat, 28 Feb 2009 10:09:59 -0500 Received: from [199.232.76.173] (port=53563 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LdQpC-0004ju-Pj for qemu-devel@nongnu.org; Sat, 28 Feb 2009 10:09:58 -0500 Received: from ns.suse.de ([195.135.220.2]:46494 helo=mx1.suse.de) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1LdQpC-00047G-5C for qemu-devel@nongnu.org; Sat, 28 Feb 2009 10:09:58 -0500 From: Alexander Graf Date: Sat, 28 Feb 2009 16:09:55 +0100 Message-Id: <1235833795-30441-1-git-send-email-agraf@suse.de> Subject: [Qemu-devel] [PATCH] Mac99: Enable -kernel option Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Alexander Graf Right now -kernel on the Mac99 (newworld) is broken. For starters, the kernel is 1:1 mapped into to virtual machine, which is not what OpenBIOS expects - it wants a preprocessed ELF image. So I just copied over the code from oldworld.c that loads the kernel. While this is not overly pretty, it works so far and keeps working code working. I don't feel comfortable on restructuring newworld and oldworld just yet - AFAIK newworld is not exactly is a good shape anyways. The second issue is the NVRAM. It doesn't get initialized, so the firmware has no idea that a kernel image was actually loaded! I first tried to use the macio nvram device that was specified there, but that didn't work out, so in order to get something working for now, I took the code from oldworld.c again, which works at least with OpenBIOS. Using this patch I can use -kernel on the Mac99 machine. Signed-off-by: Alexander Graf --- hw/ppc_newworld.c | 40 ++++++++++++++++++++++++++++++++++++++-- 1 files changed, 38 insertions(+), 2 deletions(-) diff --git a/hw/ppc_newworld.c b/hw/ppc_newworld.c index 6f60e49..a086f33 100644 --- a/hw/ppc_newworld.c +++ b/hw/ppc_newworld.c @@ -94,6 +94,8 @@ static void ppc_core99_init (ram_addr_t ram_size, int vga_ram_size, uint32_t kernel_base, kernel_size, initrd_base, initrd_size; PCIBus *pci_bus; MacIONVRAMState *nvr; + nvram_t nvram; + m48t59_t *m48t59; int nvram_mem_index; int vga_bios_size, bios_size; qemu_irq *dummy_irq; @@ -166,9 +168,23 @@ static void ppc_core99_init (ram_addr_t ram_size, int vga_ram_size, } if (linux_boot) { + uint64_t lowaddr = 0; kernel_base = KERNEL_LOAD_ADDR; - /* now we can load the kernel */ - kernel_size = load_image(kernel_filename, phys_ram_base + kernel_base); + /* Now we can load the kernel. The first step tries to load the kernel + supposing PhysAddr = 0x00000000. If that was wrong the kernel is + loaded again, the new PhysAddr being computed from lowaddr. */ + kernel_size = load_elf(kernel_filename, kernel_base, NULL, &lowaddr, NULL); + if (kernel_size > 0 && lowaddr != KERNEL_LOAD_ADDR) { + kernel_size = load_elf(kernel_filename, (2 * kernel_base) - lowaddr, + NULL, 0, NULL); + } + if (kernel_size < 0) + kernel_size = load_aout(kernel_filename, kernel_base, + ram_size - kernel_base); + if (kernel_size < 0) + kernel_size = load_image_targphys(kernel_filename, + kernel_base, + ram_size - kernel_base); if (kernel_size < 0) { cpu_abort(env, "qemu: could not load kernel '%s'\n", kernel_filename); @@ -313,7 +329,27 @@ static void ppc_core99_init (ram_addr_t ram_size, int vga_ram_size, /* The NewWorld NVRAM is not located in the MacIO device */ nvr = macio_nvram_init(&nvram_mem_index, 0x2000, 1); pmac_format_nvram_partition(nvr, 0x2000); +# if 0 macio_nvram_map(nvr, 0xFFF04000); + + nvram.opaque = nvr; + nvram.read_fn = &macio_nvram_read; + nvram.write_fn = &macio_nvram_write; +#else + m48t59 = m48t59_init(0, 0xFFF04000, 0x0074, NVRAM_SIZE, 59); + nvram.opaque = m48t59; + nvram.read_fn = &m48t59_read; + nvram.write_fn = &m48t59_write; +#endif + PPC_NVRAM_set_params(&nvram, NVRAM_SIZE, "MAC99", ram_size, + ppc_boot_device, kernel_base, kernel_size, + kernel_cmdline, + initrd_base, initrd_size, + /* XXX: need an option to load a NVRAM image */ + 0, + graphic_width, graphic_height, graphic_depth); + + /* No PCI init: the BIOS will do it */ fw_cfg = fw_cfg_init(0, 0, CFG_ADDR, CFG_ADDR + 2); -- 1.5.3.1