[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 4/4] ppc4xx: load Bamboo kernel, initrd, and fdt
From: |
Edgar E. Iglesias |
Subject: |
Re: [Qemu-devel] [PATCH 4/4] ppc4xx: load Bamboo kernel, initrd, and fdt at fixed addresses |
Date: |
Thu, 5 Aug 2010 06:57:21 +0200 |
User-agent: |
Mutt/1.5.20 (2009-06-14) |
On Wed, Aug 04, 2010 at 05:21:37PM -0700, Hollis Blanchard wrote:
> 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 <address@hidden>
This looks good to me, thanks Hollis.
Acked-by: Edgar E. Iglesias <address@hidden>
>
> ---
> 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. */
> }
> --
> 1.7.2
>
>