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