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