blob: 9cf4cbf8f95b8ca9eef1baf1d8f49054999304f8 [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
10 ldr r0,kexec_indirection_page
11 ldr r1,kexec_start_address
12
Mika Westerberg8594a0c2010-05-10 09:24:53 +010013 /*
14 * If there is no indirection page (we are doing crashdumps)
15 * skip any relocation.
16 */
17 cmp r0, #0
18 beq 2f
Richard Purdiec587e4a2007-02-06 21:29:00 +010019
200: /* 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
281:
29 /* Is it an indirection page */
30 tst r3,#2,0
31 beq 1f
32 bic r0,r3,#2
33 b 0b
341:
35
36 /* are we done ? */
37 tst r3,#4,0
38 beq 1f
39 b 2f
40
411:
42 /* is it source ? */
43 tst r3,#8,0
44 beq 0b
45 bic r3,r3,#8
46 mov r6,#1024
479:
48 ldr r5,[r3],#4
49 str r5,[r4],#4
50 subs r6,r6,#1
51 bne 9b
52 b 0b
53
542:
55 /* Jump to relocated kernel */
56 mov lr,r1
57 mov r0,#0
58 ldr r1,kexec_mach_type
Richard Purdie4cd9d6f2008-01-02 00:56:46 +010059 ldr r2,kexec_boot_atags
Richard Purdiec587e4a2007-02-06 21:29:00 +010060 mov pc,lr
61
Dave Martinbc8b57f2010-11-29 19:43:21 +010062 .align
63
Richard Purdiec587e4a2007-02-06 21:29:00 +010064 .globl kexec_start_address
65kexec_start_address:
66 .long 0x0
67
68 .globl kexec_indirection_page
69kexec_indirection_page:
70 .long 0x0
71
72 .globl kexec_mach_type
73kexec_mach_type:
74 .long 0x0
75
Richard Purdie4cd9d6f2008-01-02 00:56:46 +010076 /* phy addr of the atags for the new kernel */
77 .globl kexec_boot_atags
78kexec_boot_atags:
Mike Westerhof033b8ff2007-10-11 03:18:14 +010079 .long 0x0
80
Richard Purdiec587e4a2007-02-06 21:29:00 +010081relocate_new_kernel_end:
82
83 .globl relocate_new_kernel_size
84relocate_new_kernel_size:
85 .long relocate_new_kernel_end - relocate_new_kernel
86
87