Linux Audio

Check our new training course

Loading...
v3.15
 
 1/*
 2 * relocate_kernel.S - put the kernel image in place to boot
 3 */
 4
 5#include <linux/linkage.h>
 
 
 6#include <asm/kexec.h>
 7
 8	.align	3	/* not needed for this code, but keeps fncpy() happy */
 9
10ENTRY(relocate_new_kernel)
11
12	ldr	r0,kexec_indirection_page
13	ldr	r1,kexec_start_address
 
14
15	/*
16	 * If there is no indirection page (we are doing crashdumps)
17	 * skip any relocation.
18	 */
19	cmp	r0, #0
20	beq	2f
21
220:	/* top, read another word for the indirection page */
23	ldr	r3, [r0],#4
24
25	/* Is it a destination page. Put destination address to r4 */
26	tst	r3,#1,0
27	beq	1f
28	bic	r4,r3,#1
29	b	0b
301:
31	/* Is it an indirection page */
32	tst	r3,#2,0
33	beq	1f
34	bic	r0,r3,#2
35	b	0b
361:
37
38	/* are we done ? */
39	tst	r3,#4,0
40	beq	1f
41	b	2f
42
431:
44	/* is it source ? */
45	tst	r3,#8,0
46	beq	0b
47	bic r3,r3,#8
48	mov r6,#1024
499:
50	ldr r5,[r3],#4
51	str r5,[r4],#4
52	subs r6,r6,#1
53	bne 9b
54	b 0b
55
562:
57	/* Jump to relocated kernel */
58	mov lr,r1
59	mov r0,#0
60	ldr r1,kexec_mach_type
61	ldr r2,kexec_boot_atags
62 ARM(	mov pc, lr	)
63 THUMB(	bx lr		)
64
65	.align
66
67	.globl kexec_start_address
68kexec_start_address:
69	.long	0x0
70
71	.globl kexec_indirection_page
72kexec_indirection_page:
73	.long	0x0
74
75	.globl kexec_mach_type
76kexec_mach_type:
77	.long	0x0
78
79	/* phy addr of the atags for the new kernel */
80	.globl kexec_boot_atags
81kexec_boot_atags:
82	.long	0x0
83
84ENDPROC(relocate_new_kernel)
85
 
86relocate_new_kernel_end:
87
88	.globl relocate_new_kernel_size
89relocate_new_kernel_size:
90	.long relocate_new_kernel_end - relocate_new_kernel
91
92
v6.8
 1/* SPDX-License-Identifier: GPL-2.0 */
 2/*
 3 * relocate_kernel.S - put the kernel image in place to boot
 4 */
 5
 6#include <linux/linkage.h>
 7#include <asm/assembler.h>
 8#include <asm/asm-offsets.h>
 9#include <asm/kexec.h>
10
11	.align	3	/* not needed for this code, but keeps fncpy() happy */
12
13ENTRY(relocate_new_kernel)
14
15	adr	r7, relocate_new_kernel_end
16	ldr	r0, [r7, #KEXEC_INDIR_PAGE]
17	ldr	r1, [r7, #KEXEC_START_ADDR]
18
19	/*
20	 * If there is no indirection page (we are doing crashdumps)
21	 * skip any relocation.
22	 */
23	cmp	r0, #0
24	beq	2f
25
260:	/* top, read another word for the indirection page */
27	ldr	r3, [r0],#4
28
29	/* Is it a destination page. Put destination address to r4 */
30	tst	r3,#1
31	beq	1f
32	bic	r4,r3,#1
33	b	0b
341:
35	/* Is it an indirection page */
36	tst	r3,#2
37	beq	1f
38	bic	r0,r3,#2
39	b	0b
401:
41
42	/* are we done ? */
43	tst	r3,#4
44	beq	1f
45	b	2f
46
471:
48	/* is it source ? */
49	tst	r3,#8
50	beq	0b
51	bic r3,r3,#8
52	mov r6,#1024
539:
54	ldr r5,[r3],#4
55	str r5,[r4],#4
56	subs r6,r6,#1
57	bne 9b
58	b 0b
59
602:
61	/* Jump to relocated kernel */
62	mov	lr, r1
63	mov	r0, #0
64	ldr	r1, [r7, #KEXEC_MACH_TYPE]
65	ldr	r2, [r7, #KEXEC_R2]
66 ARM(	ret	lr	)
67 THUMB(	bx	lr	)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
68
69ENDPROC(relocate_new_kernel)
70
71	.align	3
72relocate_new_kernel_end:
73
74	.globl relocate_new_kernel_size
75relocate_new_kernel_size:
76	.long relocate_new_kernel_end - relocate_new_kernel
77
78