Linux 5.7.6
[linux/fpc-iii.git] / arch / arm / kernel / relocate_kernel.S
blob72a08786e16eb0bbc172e144e9300c75a6b6f988
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * relocate_kernel.S - put the kernel image in place to boot
4  */
6 #include <linux/linkage.h>
7 #include <asm/assembler.h>
8 #include <asm/kexec.h>
10         .align  3       /* not needed for this code, but keeps fncpy() happy */
12 ENTRY(relocate_new_kernel)
14         ldr     r0,kexec_indirection_page
15         ldr     r1,kexec_start_address
17         /*
18          * If there is no indirection page (we are doing crashdumps)
19          * skip any relocation.
20          */
21         cmp     r0, #0
22         beq     2f
24 0:      /* top, read another word for the indirection page */
25         ldr     r3, [r0],#4
27         /* Is it a destination page. Put destination address to r4 */
28         tst     r3,#1
29         beq     1f
30         bic     r4,r3,#1
31         b       0b
33         /* Is it an indirection page */
34         tst     r3,#2
35         beq     1f
36         bic     r0,r3,#2
37         b       0b
40         /* are we done ? */
41         tst     r3,#4
42         beq     1f
43         b       2f
46         /* is it source ? */
47         tst     r3,#8
48         beq     0b
49         bic r3,r3,#8
50         mov r6,#1024
52         ldr r5,[r3],#4
53         str r5,[r4],#4
54         subs r6,r6,#1
55         bne 9b
56         b 0b
59         /* Jump to relocated kernel */
60         mov lr,r1
61         mov r0,#0
62         ldr r1,kexec_mach_type
63         ldr r2,kexec_boot_atags
64  ARM(   ret lr  )
65  THUMB( bx lr           )
67         .align
69         .globl kexec_start_address
70 kexec_start_address:
71         .long   0x0
73         .globl kexec_indirection_page
74 kexec_indirection_page:
75         .long   0x0
77         .globl kexec_mach_type
78 kexec_mach_type:
79         .long   0x0
81         /* phy addr of the atags for the new kernel */
82         .globl kexec_boot_atags
83 kexec_boot_atags:
84         .long   0x0
86 ENDPROC(relocate_new_kernel)
88 relocate_new_kernel_end:
90         .globl relocate_new_kernel_size
91 relocate_new_kernel_size:
92         .long relocate_new_kernel_end - relocate_new_kernel