blob: 062c111c572feb9bc223ea08399e931f67613c10 [file] [log] [blame]
Richard Purdiec587e4a2007-02-06 21:29:00 +01001/*
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
8relocate_new_kernel:
9
Mike Westerhof033b8ff2007-10-11 03:18:14 +010010 /* Move boot params back to where the kernel expects them */
11
12 ldr r0,kexec_boot_params_address
13 teq r0,#0
14 beq 8f
15
16 ldr r1,kexec_boot_params_copy
17 mov r6,#KEXEC_BOOT_PARAMS_SIZE/4
187:
19 ldr r5,[r1],#4
20 str r5,[r0],#4
21 subs r6,r6,#1
22 bne 7b
23
248:
25 /* Boot params moved, now go on with the kernel */
26
Richard Purdiec587e4a2007-02-06 21:29:00 +010027 ldr r0,kexec_indirection_page
28 ldr r1,kexec_start_address
29
30
310: /* top, read another word for the indirection page */
32 ldr r3, [r0],#4
33
34 /* Is it a destination page. Put destination address to r4 */
35 tst r3,#1,0
36 beq 1f
37 bic r4,r3,#1
38 b 0b
391:
40 /* Is it an indirection page */
41 tst r3,#2,0
42 beq 1f
43 bic r0,r3,#2
44 b 0b
451:
46
47 /* are we done ? */
48 tst r3,#4,0
49 beq 1f
50 b 2f
51
521:
53 /* is it source ? */
54 tst r3,#8,0
55 beq 0b
56 bic r3,r3,#8
57 mov r6,#1024
589:
59 ldr r5,[r3],#4
60 str r5,[r4],#4
61 subs r6,r6,#1
62 bne 9b
63 b 0b
64
652:
66 /* Jump to relocated kernel */
67 mov lr,r1
68 mov r0,#0
69 ldr r1,kexec_mach_type
Mike Westerhof033b8ff2007-10-11 03:18:14 +010070 ldr r2,kexec_boot_params_address
Richard Purdiec587e4a2007-02-06 21:29:00 +010071 mov pc,lr
72
73 .globl kexec_start_address
74kexec_start_address:
75 .long 0x0
76
77 .globl kexec_indirection_page
78kexec_indirection_page:
79 .long 0x0
80
81 .globl kexec_mach_type
82kexec_mach_type:
83 .long 0x0
84
Mike Westerhof033b8ff2007-10-11 03:18:14 +010085 /* phy addr where new kernel will expect to find boot params */
86 .globl kexec_boot_params_address
87kexec_boot_params_address:
88 .long 0x0
89
90 /* phy addr where old kernel put a copy of orig boot params */
91 .globl kexec_boot_params_copy
92kexec_boot_params_copy:
93 .long 0x0
94
Richard Purdiec587e4a2007-02-06 21:29:00 +010095relocate_new_kernel_end:
96
97 .globl relocate_new_kernel_size
98relocate_new_kernel_size:
99 .long relocate_new_kernel_end - relocate_new_kernel
100
101