Commit 36bee1e3a4bce569e3f3ab4627e5a379a717bc48

Authored by aurel32
1 parent 947f5fcb

target-ppc: always load kernel to KERNEL_LOAD_ADDR

Linux changed its physical address location in the elf header from
0xc0000000 to 0 on 2.6.25, causing later kernels to fail booting
with the -kernel option.

This patch assures that the lowest segment in the elf binary is loaded
to KERNEL_LOAD_ADDR, which is where the firmware expects it.

Signed-off-by: Alexander Graf <agraf@suse.de>
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>

git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6437 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 9 additions and 3 deletions
hw/ppc_oldworld.c
... ... @@ -207,10 +207,16 @@ static void ppc_heathrow_init (ram_addr_t ram_size, int vga_ram_size,
207 207 }
208 208  
209 209 if (linux_boot) {
  210 + uint64_t lowaddr = 0;
210 211 kernel_base = KERNEL_LOAD_ADDR;
211   - /* now we can load the kernel */
212   - kernel_size = load_elf(kernel_filename, kernel_base - 0xc0000000ULL,
213   - NULL, NULL, NULL);
  212 + /* Now we can load the kernel. The first step tries to load the kernel
  213 + supposing PhysAddr = 0x00000000. If that was wrong the kernel is
  214 + loaded again, the new PhysAddr being computed from lowaddr. */
  215 + kernel_size = load_elf(kernel_filename, kernel_base, NULL, &lowaddr, NULL);
  216 + if (kernel_size > 0 && lowaddr != KERNEL_LOAD_ADDR) {
  217 + kernel_size = load_elf(kernel_filename, (2 * kernel_base) - lowaddr,
  218 + NULL, 0, NULL);
  219 + }
214 220 if (kernel_size < 0)
215 221 kernel_size = load_aout(kernel_filename, kernel_base,
216 222 ram_size - kernel_base);
... ...