Linux 5.8-rc4
[linux/fpc-iii.git] / arch / parisc / kernel / relocate_kernel.S
blob2561e52b8d9bc8f47f00b88600fa3e884c590d9f
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #include <linux/linkage.h>
3 #include <linux/kexec.h>
5 #include <asm/assembly.h>
6 #include <asm/asm-offsets.h>
7 #include <asm/page.h>
8 #include <asm/setup.h>
9 #include <asm/psw.h>
11 .level PA_ASM_LEVEL
13 .macro  kexec_param name
14 .align 8
15 ENTRY(kexec\()_\name)
16 #ifdef CONFIG_64BIT
17         .dword 0
18 #else
19         .word 0
20 #endif
22 ENTRY(kexec\()_\name\()_offset)
23         .word kexec\()_\name - relocate_new_kernel
24 .endm
26 .text
28 /* args:
29  * r26 - kimage->head
30  * r25 - start address of kernel
31  * r24 - physical address of relocate code
32  */
34 ENTRY_CFI(relocate_new_kernel)
35 0:      copy    %arg1, %rp
36         /* disable I and Q bit, so we are allowed to execute RFI */
37         rsm PSW_SM_I, %r0
38         nop
39         nop
40         nop
41         nop
42         nop
43         nop
44         nop
46         rsm PSW_SM_Q, %r0
47         nop
48         nop
49         nop
50         nop
51         nop
52         nop
53         nop
55         /*
56          * After return-from-interrupt, we want to run without Code/Data
57          * translation enabled just like on a normal boot.
58          */
60         /* calculate new physical execution address */
61         ldo     1f-0b(%arg2), %r1
62         mtctl   %r0, %cr17 /* IIASQ */
63         mtctl   %r0, %cr17 /* IIASQ */
64         mtctl   %r1, %cr18 /* IIAOQ */
65         ldo     4(%r1),%r1
66         mtctl   %r1, %cr18 /* IIAOQ */
67 #ifdef CONFIG_64BIT
68         depdi,z 1, PSW_W_BIT, 1, %r1
69         mtctl   %r1, %cr22 /* IPSW */
70 #else
71         mtctl   %r0, %cr22 /* IPSW */
72 #endif
73         /* lets go... */
74         rfi
75 1:      nop
76         nop
78 .Lloop:
79         LDREG,ma        REG_SZ(%arg0), %r3
80         /* If crash kernel, no copy needed */
81         cmpib,COND(=),n 0,%r3,boot
83         bb,<,n          %r3, 31 - IND_DONE_BIT, boot
84         bb,>=,n         %r3, 31 - IND_INDIRECTION_BIT, .Lnotind
85         /* indirection, load and restart */
86         movb            %r3, %arg0, .Lloop
87         depi            0, 31, PAGE_SHIFT, %arg0
89 .Lnotind:
90         bb,>=,n         %r3, 31 - IND_DESTINATION_BIT, .Lnotdest
91         b               .Lloop
92         copy            %r3, %r20
94 .Lnotdest:
95         bb,>=           %r3, 31 - IND_SOURCE_BIT, .Lloop
96         depi            0, 31, PAGE_SHIFT, %r3
97         copy            %r3, %r21
99         /* copy page */
100         copy            %r0, %r18
101         zdepi           1, 31 - PAGE_SHIFT, 1, %r18
102         add             %r20, %r18, %r17
104         depi            0, 31, PAGE_SHIFT, %r20
105 .Lcopy:
106         copy            %r20, %r12
107         LDREG,ma        REG_SZ(%r21), %r8
108         LDREG,ma        REG_SZ(%r21), %r9
109         LDREG,ma        REG_SZ(%r21), %r10
110         LDREG,ma        REG_SZ(%r21), %r11
111         STREG,ma        %r8, REG_SZ(%r20)
112         STREG,ma        %r9, REG_SZ(%r20)
113         STREG,ma        %r10, REG_SZ(%r20)
114         STREG,ma        %r11, REG_SZ(%r20)
116 #ifndef CONFIG_64BIT
117         LDREG,ma        REG_SZ(%r21), %r8
118         LDREG,ma        REG_SZ(%r21), %r9
119         LDREG,ma        REG_SZ(%r21), %r10
120         LDREG,ma        REG_SZ(%r21), %r11
121         STREG,ma        %r8, REG_SZ(%r20)
122         STREG,ma        %r9, REG_SZ(%r20)
123         STREG,ma        %r10, REG_SZ(%r20)
124         STREG,ma        %r11, REG_SZ(%r20)
125 #endif
127         fdc             %r0(%r12)
128         cmpb,COND(<<)   %r20,%r17,.Lcopy
129         fic             (%sr4, %r12)
130         b,n             .Lloop
132 boot:
133         mtctl   %r0, %cr15
135         LDREG   kexec_free_mem-0b(%arg2), %arg0
136         LDREG   kexec_cmdline-0b(%arg2), %arg1
137         LDREG   kexec_initrd_end-0b(%arg2), %arg3
138         LDREG   kexec_initrd_start-0b(%arg2), %arg2
139         bv,n %r0(%rp)
141 ENDPROC_CFI(relocate_new_kernel);
143 ENTRY(relocate_new_kernel_size)
144        .word relocate_new_kernel_size - relocate_new_kernel
146 kexec_param cmdline
147 kexec_param initrd_start
148 kexec_param initrd_end
149 kexec_param free_mem