xref: /linux/arch/riscv/include/asm/scs.h (revision 8e07e0e3964ca4e23ce7b68e2096fe660a888942)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef _ASM_SCS_H
3 #define _ASM_SCS_H
4 
5 #ifdef __ASSEMBLY__
6 #include <asm/asm-offsets.h>
7 
8 #ifdef CONFIG_SHADOW_CALL_STACK
9 
10 /* Load init_shadow_call_stack to gp. */
11 .macro scs_load_init_stack
12 	la	gp, init_shadow_call_stack
13 	XIP_FIXUP_OFFSET gp
14 .endm
15 
16 /* Load the per-CPU IRQ shadow call stack to gp. */
17 .macro scs_load_irq_stack tmp
18 	load_per_cpu gp, irq_shadow_call_stack_ptr, \tmp
19 .endm
20 
21 /* Load task_scs_sp(current) to gp. */
22 .macro scs_load_current
23 	REG_L	gp, TASK_TI_SCS_SP(tp)
24 .endm
25 
26 /* Load task_scs_sp(current) to gp, but only if tp has changed. */
27 .macro scs_load_current_if_task_changed prev
28 	beq	\prev, tp, _skip_scs
29 	scs_load_current
30 _skip_scs:
31 .endm
32 
33 /* Save gp to task_scs_sp(current). */
34 .macro scs_save_current
35 	REG_S	gp, TASK_TI_SCS_SP(tp)
36 .endm
37 
38 #else /* CONFIG_SHADOW_CALL_STACK */
39 
40 .macro scs_load_init_stack
41 .endm
42 .macro scs_load_irq_stack tmp
43 .endm
44 .macro scs_load_current
45 .endm
46 .macro scs_load_current_if_task_changed prev
47 .endm
48 .macro scs_save_current
49 .endm
50 
51 #endif /* CONFIG_SHADOW_CALL_STACK */
52 #endif /* __ASSEMBLY__ */
53 
54 #endif /* _ASM_SCS_H */
55