From patchwork Thu Aug 5 00:21:37 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hollis Blanchard X-Patchwork-Id: 60910 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [199.232.76.165]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id D39F7B70A9 for ; Thu, 5 Aug 2010 10:29:30 +1000 (EST) Received: from localhost ([127.0.0.1]:44041 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1OgoKr-0001ZA-S9 for incoming@patchwork.ozlabs.org; Wed, 04 Aug 2010 20:29:26 -0400 Received: from [140.186.70.92] (port=35745 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1OgoEB-0005Q7-6J for qemu-devel@nongnu.org; Wed, 04 Aug 2010 20:22:33 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1OgoE8-0003aA-DP for qemu-devel@nongnu.org; Wed, 04 Aug 2010 20:22:31 -0400 Received: from qmta01.emeryville.ca.mail.comcast.net ([76.96.30.16]:44026) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1OgoE8-0003Pz-5P for qemu-devel@nongnu.org; Wed, 04 Aug 2010 20:22:28 -0400 Received: from omta04.emeryville.ca.mail.comcast.net ([76.96.30.35]) by qmta01.emeryville.ca.mail.comcast.net with comcast id qCph1e0040lTkoCA1QN5Pe; Thu, 05 Aug 2010 00:22:05 +0000 Received: from reflectivity.mgc.mentorg.com ([24.20.193.174]) by omta04.emeryville.ca.mail.comcast.net with comcast id qQN31e00M3mDZfc8QQN5Ru; Thu, 05 Aug 2010 00:22:05 +0000 From: Hollis Blanchard To: qemu-devel@nongnu.org Date: Wed, 4 Aug 2010 17:21:37 -0700 Message-Id: <1280967697-1875-5-git-send-email-hollis@penguinppc.org> X-Mailer: git-send-email 1.7.2 In-Reply-To: <1280967697-1875-1-git-send-email-hollis@penguinppc.org> References: <1280967697-1875-1-git-send-email-hollis@penguinppc.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. Cc: kvm-ppc@vger.kernel.org Subject: [Qemu-devel] [PATCH 4/4] ppc4xx: load Bamboo kernel, initrd, and fdt at fixed addresses X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org We can't use the return value of load_uimage() for the kernel because it can't account for BSS size, and the PowerPC kernel does not relocate blobs before zeroing BSS. Instead, we now load at the fixed addresses chosen by u-boot (the normal firmware for the board). Signed-off-by: Hollis Blanchard Acked-by: Edgar E. Iglesias --- hw/ppc440_bamboo.c | 39 ++++++++++++++++++--------------------- 1 files changed, 18 insertions(+), 21 deletions(-) This fixes a critical bug in PowerPC 440 Bamboo board emulation. diff --git a/hw/ppc440_bamboo.c b/hw/ppc440_bamboo.c index d471d5d..34ddf45 100644 --- a/hw/ppc440_bamboo.c +++ b/hw/ppc440_bamboo.c @@ -27,6 +27,11 @@ #define BINARY_DEVICE_TREE_FILE "bamboo.dtb" +/* from u-boot */ +#define KERNEL_ADDR 0x1000000 +#define FDT_ADDR 0x1800000 +#define RAMDISK_ADDR 0x1900000 + static int bamboo_load_device_tree(target_phys_addr_t addr, uint32_t ramsize, target_phys_addr_t initrd_base, @@ -98,10 +103,8 @@ static void bamboo_init(ram_addr_t ram_size, uint64_t elf_lowaddr; target_phys_addr_t entry = 0; target_phys_addr_t loadaddr = 0; - target_long kernel_size = 0; - target_ulong initrd_base = 0; target_long initrd_size = 0; - target_ulong dt_base = 0; + int success; int i; /* Setup CPU. */ @@ -118,15 +121,15 @@ static void bamboo_init(ram_addr_t ram_size, /* Load kernel. */ if (kernel_filename) { - kernel_size = load_uimage(kernel_filename, &entry, &loadaddr, NULL); - if (kernel_size < 0) { - kernel_size = load_elf(kernel_filename, NULL, NULL, &elf_entry, - &elf_lowaddr, NULL, 1, ELF_MACHINE, 0); + success = load_uimage(kernel_filename, &entry, &loadaddr, NULL); + if (success < 0) { + success = load_elf(kernel_filename, NULL, NULL, &elf_entry, + &elf_lowaddr, NULL, 1, ELF_MACHINE, 0); entry = elf_entry; loadaddr = elf_lowaddr; } /* XXX try again as binary */ - if (kernel_size < 0) { + if (success < 0) { fprintf(stderr, "qemu: could not load kernel '%s'\n", kernel_filename); exit(1); @@ -135,26 +138,20 @@ static void bamboo_init(ram_addr_t ram_size, /* Load initrd. */ if (initrd_filename) { - initrd_base = kernel_size + loadaddr; - initrd_size = load_image_targphys(initrd_filename, initrd_base, - ram_size - initrd_base); + initrd_size = load_image_targphys(initrd_filename, RAMDISK_ADDR, + ram_size - RAMDISK_ADDR); if (initrd_size < 0) { - fprintf(stderr, "qemu: could not load initial ram disk '%s'\n", - initrd_filename); + fprintf(stderr, "qemu: could not load ram disk '%s' at %x\n", + initrd_filename, RAMDISK_ADDR); exit(1); } } /* If we're loading a kernel directly, we must load the device tree too. */ if (kernel_filename) { - if (initrd_base) - dt_base = initrd_base + initrd_size; - else - dt_base = kernel_size + loadaddr; - - if (bamboo_load_device_tree(dt_base, ram_size, - initrd_base, initrd_size, kernel_cmdline) < 0) { + if (bamboo_load_device_tree(FDT_ADDR, ram_size, RAMDISK_ADDR, + initrd_size, kernel_cmdline) < 0) { fprintf(stderr, "couldn't load device tree\n"); exit(1); } @@ -163,7 +160,7 @@ static void bamboo_init(ram_addr_t ram_size, /* Set initial guest state. */ env->gpr[1] = (16<<20) - 8; - env->gpr[3] = dt_base; + env->gpr[3] = FDT_ADDR; env->nip = entry; /* XXX we currently depend on KVM to create some initial TLB entries. */ }