xref: /linux/arch/arm/kernel/relocate_kernel.S (revision 4cd9d6f774c7e0578bbc4409d4490d8f2097d40a)
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
8relocate_new_kernel:
9
10	ldr	r0,kexec_indirection_page
11	ldr	r1,kexec_start_address
12
13
140:	/* top, read another word for the indirection page */
15	ldr	r3, [r0],#4
16
17	/* Is it a destination page. Put destination address to r4 */
18	tst	r3,#1,0
19	beq	1f
20	bic	r4,r3,#1
21	b	0b
221:
23	/* Is it an indirection page */
24	tst	r3,#2,0
25	beq	1f
26	bic	r0,r3,#2
27	b	0b
281:
29
30	/* are we done ? */
31	tst	r3,#4,0
32	beq	1f
33	b	2f
34
351:
36	/* is it source ? */
37	tst	r3,#8,0
38	beq	0b
39	bic r3,r3,#8
40	mov r6,#1024
419:
42	ldr r5,[r3],#4
43	str r5,[r4],#4
44	subs r6,r6,#1
45	bne 9b
46	b 0b
47
482:
49	/* Jump to relocated kernel */
50	mov lr,r1
51	mov r0,#0
52	ldr r1,kexec_mach_type
53	ldr r2,kexec_boot_atags
54	mov pc,lr
55
56	.globl kexec_start_address
57kexec_start_address:
58	.long	0x0
59
60	.globl kexec_indirection_page
61kexec_indirection_page:
62	.long	0x0
63
64	.globl kexec_mach_type
65kexec_mach_type:
66	.long	0x0
67
68	/* phy addr of the atags for the new kernel */
69	.globl kexec_boot_atags
70kexec_boot_atags:
71	.long	0x0
72
73relocate_new_kernel_end:
74
75	.globl relocate_new_kernel_size
76relocate_new_kernel_size:
77	.long relocate_new_kernel_end - relocate_new_kernel
78
79
80