Merge branch 'devicetree/arm-next' of git://git.secretlab.ca/git/linux-2.6 into devel...
[pandora-kernel.git] / arch / arm / kernel / relocate_kernel.S
1 /*
2  * relocate_kernel.S - put the kernel image in place to boot
3  */
4
5 #include <asm/kexec.h>
6
7         .globl relocate_new_kernel
8 relocate_new_kernel:
9
10         ldr     r0,kexec_indirection_page
11         ldr     r1,kexec_start_address
12
13         /*
14          * If there is no indirection page (we are doing crashdumps)
15          * skip any relocation.
16          */
17         cmp     r0, #0
18         beq     2f
19
20 0:      /* top, read another word for the indirection page */
21         ldr     r3, [r0],#4
22
23         /* Is it a destination page. Put destination address to r4 */
24         tst     r3,#1,0
25         beq     1f
26         bic     r4,r3,#1
27         b       0b
28 1:
29         /* Is it an indirection page */
30         tst     r3,#2,0
31         beq     1f
32         bic     r0,r3,#2
33         b       0b
34 1:
35
36         /* are we done ? */
37         tst     r3,#4,0
38         beq     1f
39         b       2f
40
41 1:
42         /* is it source ? */
43         tst     r3,#8,0
44         beq     0b
45         bic r3,r3,#8
46         mov r6,#1024
47 9:
48         ldr r5,[r3],#4
49         str r5,[r4],#4
50         subs r6,r6,#1
51         bne 9b
52         b 0b
53
54 2:
55         /* Jump to relocated kernel */
56         mov lr,r1
57         mov r0,#0
58         ldr r1,kexec_mach_type
59         ldr r2,kexec_boot_atags
60         mov pc,lr
61
62         .align
63
64         .globl kexec_start_address
65 kexec_start_address:
66         .long   0x0
67
68         .globl kexec_indirection_page
69 kexec_indirection_page:
70         .long   0x0
71
72         .globl kexec_mach_type
73 kexec_mach_type:
74         .long   0x0
75
76         /* phy addr of the atags for the new kernel */
77         .globl kexec_boot_atags
78 kexec_boot_atags:
79         .long   0x0
80
81 relocate_new_kernel_end:
82
83         .globl relocate_new_kernel_size
84 relocate_new_kernel_size:
85         .long relocate_new_kernel_end - relocate_new_kernel
86
87