Merge branch 'upstream-linus' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik...
[sfrench/cifs-2.6.git] / arch / ppc64 / boot / crt0.S
1 /*
2  * Copyright (C) Paul Mackerras 1997.
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version
7  * 2 of the License, or (at your option) any later version.
8  *
9  * NOTE: this code runs in 32 bit mode and is packaged as ELF32.
10  */
11
12 #include "ppc_asm.h"
13
14         .text
15         .globl  _zimage_start
16 _zimage_start:
17         bl      reloc_offset
18
19 reloc_offset:
20         mflr    r0
21         lis     r9,reloc_offset@ha
22         addi    r9,r9,reloc_offset@l
23         subf.   r0,r9,r0
24         beq     clear_caches
25
26 reloc_got2:
27         lis     r9,__got2_start@ha
28         addi    r9,r9,__got2_start@l
29         lis     r8,__got2_end@ha
30         addi    r8,r8,__got2_end@l
31         subf.   r8,r9,r8
32         beq     clear_caches
33         srwi.   r8,r8,2
34         mtctr   r8
35         add     r9,r0,r9
36 reloc_got2_loop:
37         lwz     r8,0(r9)
38         add     r8,r8,r0
39         stw     r8,0(r9)
40         addi    r9,r9,4
41         bdnz    reloc_got2_loop
42
43 clear_caches:
44         lis     r9,_start@h
45         add     r9,r0,r9
46         lis     r8,_etext@ha
47         addi    r8,r8,_etext@l
48         add     r8,r0,r8
49 1:      dcbf    r0,r9
50         icbi    r0,r9
51         addi    r9,r9,0x20
52         cmplwi  0,r9,8
53         blt     1b
54         sync
55         isync
56
57         mr      r6,r1
58         b       start
59