diff options
author | Paul Mackerras <paulus@samba.org> | 2005-11-15 21:38:21 -0500 |
---|---|---|
committer | Paul Mackerras <paulus@samba.org> | 2005-11-15 21:52:21 -0500 |
commit | 94b212c29f685ca54b5689a8e89ac7671c43d651 (patch) | |
tree | 356266520a5ba530b2a5b77b68e90e87a2402ecb /arch/powerpc/boot/crt0.S | |
parent | 7486a38f683d49e6f8b2b9050ff06778b151a40c (diff) |
powerpc: Move ppc64 boot wrapper code over to arch/powerpc
This also extends the code to handle 32-bit ELF vmlinux files as well
as 64-bit ones. This is sufficient for booting on new-world 32-bit
powermacs (i.e. all recent machines).
Signed-off-by: Paul Mackerras <paulus@samba.org>
Diffstat (limited to 'arch/powerpc/boot/crt0.S')
-rw-r--r-- | arch/powerpc/boot/crt0.S | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/arch/powerpc/boot/crt0.S b/arch/powerpc/boot/crt0.S new file mode 100644 index 000000000000..9cc442263939 --- /dev/null +++ b/arch/powerpc/boot/crt0.S | |||
@@ -0,0 +1,59 @@ | |||
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 | |||