Merge master.kernel.org:/pub/scm/linux/kernel/git/davej/cpufreq
[sfrench/cifs-2.6.git] / arch / ppc64 / boot / crt0.S
index da6618a865c945916dfffe3f23d3521e2a6758aa..9cc442263939750c94b8d55c96cea067668fa9c5 100644 (file)
 #include "ppc_asm.h"
 
        .text
-       .globl  _start
-_start:
+       .globl  _zimage_start
+_zimage_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
@@ -25,5 +54,6 @@ _start:
        sync
        isync
 
+       mr      r6,r1
        b       start