powerpc: Change the default link address for pSeries zImage kernels

Currently we set the start of the .text section to be 4Mb for pSeries.
In situations where the zImage is > 8Mb we'll fail to boot (due to
overlapping with OF).  Move .text in a zImage from 4MB to 64MB
(well past OF).

We still will not be able to load large zImage unless we also move OF,
to that end, add a note to the zImage ELF to move OF to 32Mb.  If this
is the very first kernel booted then we'll need to move OF manually by
setting real-base.

Signed-off-by: Tony Breeds <tony@bakeyournoodle.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
This commit is contained in:
Tony Breeds 2008-06-24 14:20:29 +10:00 committed by Paul Mackerras
parent c230328def
commit 9b09c6d909
5 changed files with 25 additions and 6 deletions

View File

@ -25,7 +25,7 @@ char arch[] = "PowerPC";
#define N_DESCR 6 #define N_DESCR 6
unsigned int descr[N_DESCR] = { unsigned int descr[N_DESCR] = {
0xffffffff, /* real-mode = true */ 0xffffffff, /* real-mode = true */
0x00c00000, /* real-base, i.e. where we expect OF to be */ 0x02000000, /* real-base, i.e. where we expect OF to be */
0xffffffff, /* real-size */ 0xffffffff, /* real-size */
0xffffffff, /* virt-base */ 0xffffffff, /* virt-base */
0xffffffff, /* virt-size */ 0xffffffff, /* virt-size */

View File

@ -168,8 +168,19 @@ void *of_claim(unsigned long virt, unsigned long size, unsigned long align)
void *of_vmlinux_alloc(unsigned long size) void *of_vmlinux_alloc(unsigned long size)
{ {
void *p = malloc(size); unsigned long start = (unsigned long)_start, end = (unsigned long)_end;
void *addr;
void *p;
/* With some older POWER4 firmware we need to claim the area the kernel
* will reside in. Newer firmwares don't need this so we just ignore
* the return value.
*/
addr = of_claim(start, end - start, 0);
printf("Trying to claim from 0x%lx to 0x%lx (0x%lx) got %p\r\n",
start, end, end - start, addr);
p = malloc(size);
if (!p) if (!p)
fatal("Can't allocate memory for kernel image!\n\r"); fatal("Can't allocate memory for kernel image!\n\r");

View File

@ -138,14 +138,20 @@ objflags=-S
tmp=$tmpdir/zImage.$$.o tmp=$tmpdir/zImage.$$.o
ksection=.kernel:vmlinux.strip ksection=.kernel:vmlinux.strip
isection=.kernel:initrd isection=.kernel:initrd
link_address='0x400000'
case "$platform" in case "$platform" in
pmac|pseries|chrp) pseries)
platformo=$object/of.o
link_address='0x4000000'
;;
pmac|chrp)
platformo=$object/of.o platformo=$object/of.o
;; ;;
coff) coff)
platformo=$object/of.o platformo=$object/of.o
lds=$object/zImage.coff.lds lds=$object/zImage.coff.lds
link_address='0x500000'
;; ;;
miboot|uboot) miboot|uboot)
# miboot and U-boot want just the bare bits, not an ELF binary # miboot and U-boot want just the bare bits, not an ELF binary
@ -190,6 +196,7 @@ ps3)
objflags="-O binary --set-section-flags=.bss=contents,alloc,load,data" objflags="-O binary --set-section-flags=.bss=contents,alloc,load,data"
ksection=.kernel:vmlinux.bin ksection=.kernel:vmlinux.bin
isection=.kernel:initrd isection=.kernel:initrd
link_address=''
;; ;;
ep88xc|ep405|ep8248e) ep88xc|ep405|ep8248e)
platformo="$object/fixed-head.o $object/$platform.o" platformo="$object/fixed-head.o $object/$platform.o"
@ -272,7 +279,10 @@ if [ -n "$dtb" ]; then
fi fi
if [ "$platform" != "miboot" ]; then if [ "$platform" != "miboot" ]; then
${CROSS}ld -m elf32ppc -T $lds -o "$ofile" \ if [ -n "$link_address" ] ; then
text_start="-Ttext $link_address --defsym _start=$link_address"
fi
${CROSS}ld -m elf32ppc -T $lds $text_start -o "$ofile" \
$platformo $tmp $object/wrapper.a $platformo $tmp $object/wrapper.a
rm $tmp rm $tmp
fi fi

View File

@ -3,7 +3,6 @@ ENTRY(_zimage_start_opd)
EXTERN(_zimage_start_opd) EXTERN(_zimage_start_opd)
SECTIONS SECTIONS
{ {
. = (5*1024*1024);
_start = .; _start = .;
.text : .text :
{ {

View File

@ -3,7 +3,6 @@ ENTRY(_zimage_start)
EXTERN(_zimage_start) EXTERN(_zimage_start)
SECTIONS SECTIONS
{ {
. = (4*1024*1024);
_start = .; _start = .;
.text : .text :
{ {