WIP FPC-III support
[linux/fpc-iii.git] / arch / arc / include / asm / entry.h
blobfcdd59d77f42cd61b5236144f6b1bfefad29367d
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3 * Copyright (C) 2014-15 Synopsys, Inc. (www.synopsys.com)
4 * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com)
5 */
7 #ifndef __ASM_ARC_ENTRY_H
8 #define __ASM_ARC_ENTRY_H
10 #include <asm/unistd.h> /* For NR_syscalls defination */
11 #include <asm/arcregs.h>
12 #include <asm/ptrace.h>
13 #include <asm/processor.h> /* For VMALLOC_START */
14 #include <asm/mmu.h>
16 #ifdef CONFIG_ISA_ARCOMPACT
17 #include <asm/entry-compact.h> /* ISA specific bits */
18 #else
19 #include <asm/entry-arcv2.h>
20 #endif
22 /* Note on the LD/ST addr modes with addr reg wback
24 * LD.a same as LD.aw
26 * LD.a reg1, [reg2, x] => Pre Incr
27 * Eff Addr for load = [reg2 + x]
29 * LD.ab reg1, [reg2, x] => Post Incr
30 * Eff Addr for load = [reg2]
33 .macro PUSH reg
34 st.a \reg, [sp, -4]
35 .endm
37 .macro PUSHAX aux
38 lr r9, [\aux]
39 PUSH r9
40 .endm
42 .macro POP reg
43 ld.ab \reg, [sp, 4]
44 .endm
46 .macro POPAX aux
47 POP r9
48 sr r9, [\aux]
49 .endm
51 /*--------------------------------------------------------------
52 * Helpers to save/restore Scratch Regs:
53 * used by Interrupt/Exception Prologue/Epilogue
54 *-------------------------------------------------------------*/
55 .macro SAVE_R0_TO_R12
56 PUSH r0
57 PUSH r1
58 PUSH r2
59 PUSH r3
60 PUSH r4
61 PUSH r5
62 PUSH r6
63 PUSH r7
64 PUSH r8
65 PUSH r9
66 PUSH r10
67 PUSH r11
68 PUSH r12
69 .endm
71 .macro RESTORE_R12_TO_R0
72 POP r12
73 POP r11
74 POP r10
75 POP r9
76 POP r8
77 POP r7
78 POP r6
79 POP r5
80 POP r4
81 POP r3
82 POP r2
83 POP r1
84 POP r0
86 .endm
88 /*--------------------------------------------------------------
89 * Helpers to save/restore callee-saved regs:
90 * used by several macros below
91 *-------------------------------------------------------------*/
92 .macro SAVE_R13_TO_R24
93 PUSH r13
94 PUSH r14
95 PUSH r15
96 PUSH r16
97 PUSH r17
98 PUSH r18
99 PUSH r19
100 PUSH r20
101 PUSH r21
102 PUSH r22
103 PUSH r23
104 PUSH r24
105 .endm
107 .macro RESTORE_R24_TO_R13
108 POP r24
109 POP r23
110 POP r22
111 POP r21
112 POP r20
113 POP r19
114 POP r18
115 POP r17
116 POP r16
117 POP r15
118 POP r14
119 POP r13
120 .endm
122 /*--------------------------------------------------------------
123 * Collect User Mode callee regs as struct callee_regs - needed by
124 * fork/do_signal/unaligned-access-emulation.
125 * (By default only scratch regs are saved on entry to kernel)
127 * Special handling for r25 if used for caching Task Pointer.
128 * It would have been saved in task->thread.user_r25 already, but to keep
129 * the interface same it is copied into regular r25 placeholder in
130 * struct callee_regs.
131 *-------------------------------------------------------------*/
132 .macro SAVE_CALLEE_SAVED_USER
134 mov r12, sp ; save SP as ref to pt_regs
135 SAVE_R13_TO_R24
137 #ifdef CONFIG_ARC_CURR_IN_REG
138 ; Retrieve orig r25 and save it with rest of callee_regs
139 ld r12, [r12, PT_user_r25]
140 PUSH r12
141 #else
142 PUSH r25
143 #endif
145 .endm
147 /*--------------------------------------------------------------
148 * Save kernel Mode callee regs at the time of Contect Switch.
150 * Special handling for r25 if used for caching Task Pointer.
151 * Kernel simply skips saving it since it will be loaded with
152 * incoming task pointer anyways
153 *-------------------------------------------------------------*/
154 .macro SAVE_CALLEE_SAVED_KERNEL
156 SAVE_R13_TO_R24
158 #ifdef CONFIG_ARC_CURR_IN_REG
159 sub sp, sp, 4
160 #else
161 PUSH r25
162 #endif
163 .endm
165 /*--------------------------------------------------------------
166 * Opposite of SAVE_CALLEE_SAVED_KERNEL
167 *-------------------------------------------------------------*/
168 .macro RESTORE_CALLEE_SAVED_KERNEL
170 #ifdef CONFIG_ARC_CURR_IN_REG
171 add sp, sp, 4 /* skip usual r25 placeholder */
172 #else
173 POP r25
174 #endif
175 RESTORE_R24_TO_R13
176 .endm
178 /*--------------------------------------------------------------
179 * Opposite of SAVE_CALLEE_SAVED_USER
181 * ptrace tracer or unaligned-access fixup might have changed a user mode
182 * callee reg which is saved back to usual r25 storage location
183 *-------------------------------------------------------------*/
184 .macro RESTORE_CALLEE_SAVED_USER
186 #ifdef CONFIG_ARC_CURR_IN_REG
187 POP r12
188 #else
189 POP r25
190 #endif
191 RESTORE_R24_TO_R13
193 ; SP is back to start of pt_regs
194 #ifdef CONFIG_ARC_CURR_IN_REG
195 st r12, [sp, PT_user_r25]
196 #endif
197 .endm
199 /*--------------------------------------------------------------
200 * Super FAST Restore callee saved regs by simply re-adjusting SP
201 *-------------------------------------------------------------*/
202 .macro DISCARD_CALLEE_SAVED_USER
203 add sp, sp, SZ_CALLEE_REGS
204 .endm
206 /*-------------------------------------------------------------
207 * given a tsk struct, get to the base of it's kernel mode stack
208 * tsk->thread_info is really a PAGE, whose bottom hoists stack
209 * which grows upwards towards thread_info
210 *------------------------------------------------------------*/
212 .macro GET_TSK_STACK_BASE tsk, out
214 /* Get task->thread_info (this is essentially start of a PAGE) */
215 ld \out, [\tsk, TASK_THREAD_INFO]
217 /* Go to end of page where stack begins (grows upwards) */
218 add2 \out, \out, (THREAD_SIZE)/4
220 .endm
223 * @reg [OUT] thread_info->flags of "current"
225 .macro GET_CURR_THR_INFO_FLAGS reg
226 GET_CURR_THR_INFO_FROM_SP \reg
227 ld \reg, [\reg, THREAD_INFO_FLAGS]
228 .endm
230 #ifdef CONFIG_SMP
232 /*-------------------------------------------------
233 * Retrieve the current running task on this CPU
234 * 1. Determine curr CPU id.
235 * 2. Use it to index into _current_task[ ]
237 .macro GET_CURR_TASK_ON_CPU reg
238 GET_CPU_ID \reg
239 ld.as \reg, [@_current_task, \reg]
240 .endm
242 /*-------------------------------------------------
243 * Save a new task as the "current" task on this CPU
244 * 1. Determine curr CPU id.
245 * 2. Use it to index into _current_task[ ]
247 * Coded differently than GET_CURR_TASK_ON_CPU (which uses LD.AS)
248 * because ST r0, [r1, offset] can ONLY have s9 @offset
249 * while LD can take s9 (4 byte insn) or LIMM (8 byte insn)
252 .macro SET_CURR_TASK_ON_CPU tsk, tmp
253 GET_CPU_ID \tmp
254 add2 \tmp, @_current_task, \tmp
255 st \tsk, [\tmp]
256 #ifdef CONFIG_ARC_CURR_IN_REG
257 mov r25, \tsk
258 #endif
260 .endm
263 #else /* Uniprocessor implementation of macros */
265 .macro GET_CURR_TASK_ON_CPU reg
266 ld \reg, [@_current_task]
267 .endm
269 .macro SET_CURR_TASK_ON_CPU tsk, tmp
270 st \tsk, [@_current_task]
271 #ifdef CONFIG_ARC_CURR_IN_REG
272 mov r25, \tsk
273 #endif
274 .endm
276 #endif /* SMP / UNI */
278 /* ------------------------------------------------------------------
279 * Get the ptr to some field of Current Task at @off in task struct
280 * -Uses r25 for Current task ptr if that is enabled
283 #ifdef CONFIG_ARC_CURR_IN_REG
285 .macro GET_CURR_TASK_FIELD_PTR off, reg
286 add \reg, r25, \off
287 .endm
289 #else
291 .macro GET_CURR_TASK_FIELD_PTR off, reg
292 GET_CURR_TASK_ON_CPU \reg
293 add \reg, \reg, \off
294 .endm
296 #endif /* CONFIG_ARC_CURR_IN_REG */
298 #endif /* __ASM_ARC_ENTRY_H */