[PATCH] ppc64 boot: make the zImage relocateable
authorOlaf Hering <olh@suse.de>
Sat, 29 Oct 2005 00:46:48 +0000 (17:46 -0700)
committerPaul Mackerras <paulus@samba.org>
Sat, 29 Oct 2005 05:10:12 +0000 (15:10 +1000)
Make the zImage relocateable.  So yaboot could just load and run any ELF
binary, without worrying about its load address.

Signed-off-by: Olaf Hering <olh@suse.de>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Anton Blanchard <anton@samba.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Paul Mackerras <paulus@samba.org>
arch/ppc64/boot/Makefile
arch/ppc64/boot/crt0.S
arch/ppc64/boot/zImage.lds

index f8f3599..9e19351 100644 (file)
@@ -22,7 +22,7 @@
 
 
 HOSTCC         := gcc
-BOOTCFLAGS     := $(HOSTCFLAGS) -fno-builtin -nostdinc -isystem $(shell $(CROSS32CC) -print-file-name=include)
+BOOTCFLAGS     := $(HOSTCFLAGS) -fno-builtin -nostdinc -isystem $(shell $(CROSS32CC) -print-file-name=include) -fPIC
 BOOTAFLAGS     := -D__ASSEMBLY__ $(BOOTCFLAGS) -traditional -nostdinc
 BOOTLFLAGS     := -Ttext 0x00400000 -e _start -T $(srctree)/$(src)/zImage.lds
 OBJCOPYFLAGS    := contents,alloc,load,readonly,data
index da6618a..5788a45 100644 (file)
        .text
        .globl  _start
 _start:
+       bl      reloc_offset
+
+reloc_offset:
+       mflr    r0
+       lis     r9,reloc_offset@ha
+       addi    r9,r9,reloc_offset@l
+       subf.   r0,r9,r0
+       beq     clear_caches
+
+reloc_got2:
+       lis     r9,__got2_start@ha
+       addi    r9,r9,__got2_start@l
+       lis     r8,__got2_end@ha
+       addi    r8,r8,__got2_end@l
+       subf.   r8,r9,r8
+       beq     clear_caches
+       srwi.   r8,r8,2
+       mtctr   r8
+       add     r9,r0,r9
+reloc_got2_loop:
+       lwz     r8,0(r9)
+       add     r8,r8,r0
+       stw     r8,0(r9)
+       addi    r9,r9,4
+       bdnz    reloc_got2_loop
+
+clear_caches:
        lis     r9,_start@h
+       add     r9,r0,r9
        lis     r8,_etext@ha
        addi    r8,r8,_etext@l
+       add     r8,r0,r8
 1:     dcbf    r0,r9
        icbi    r0,r9
        addi    r9,r9,0x20
index fb465a4..79d62c7 100644 (file)
@@ -13,7 +13,9 @@ SECTIONS
     *(.rodata*)
     *(.data*)
     *(.sdata*)
-    *(.got*)
+    __got2_start = .;
+    *(.got2)
+    __got2_end = .;
   }
 
   . = ALIGN(4096);