mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 21:38:32 +08:00
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:
parent
c230328def
commit
9b09c6d909
@ -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 */
|
||||||
|
@ -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");
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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 :
|
||||||
{
|
{
|
||||||
|
@ -3,7 +3,6 @@ ENTRY(_zimage_start)
|
|||||||
EXTERN(_zimage_start)
|
EXTERN(_zimage_start)
|
||||||
SECTIONS
|
SECTIONS
|
||||||
{
|
{
|
||||||
. = (4*1024*1024);
|
|
||||||
_start = .;
|
_start = .;
|
||||||
.text :
|
.text :
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user