| /* SPDX-License-Identifier: GPL-2.0 */ | |
| #ifndef _ASM_SCS_H | |
| #define _ASM_SCS_H | |
| #ifdef __ASSEMBLY__ | |
| #include <asm/asm-offsets.h> | |
| #ifdef CONFIG_SHADOW_CALL_STACK | |
| /* Load init_shadow_call_stack to gp. */ | |
| .macro scs_load_init_stack | |
| la gp, init_shadow_call_stack | |
| XIP_FIXUP_OFFSET gp | |
| .endm | |
| /* Load the per-CPU IRQ shadow call stack to gp. */ | |
| .macro scs_load_irq_stack tmp | |
| load_per_cpu gp, irq_shadow_call_stack_ptr, \tmp | |
| .endm | |
| /* Load task_scs_sp(current) to gp. */ | |
| .macro scs_load_current | |
| REG_L gp, TASK_TI_SCS_SP(tp) | |
| .endm | |
| /* Load task_scs_sp(current) to gp, but only if tp has changed. */ | |
| .macro scs_load_current_if_task_changed prev | |
| beq \prev, tp, _skip_scs | |
| scs_load_current | |
| _skip_scs: | |
| .endm | |
| /* Save gp to task_scs_sp(current). */ | |
| .macro scs_save_current | |
| REG_S gp, TASK_TI_SCS_SP(tp) | |
| .endm | |
| #else /* CONFIG_SHADOW_CALL_STACK */ | |
| .macro scs_load_init_stack | |
| .endm | |
| .macro scs_load_irq_stack tmp | |
| .endm | |
| .macro scs_load_current | |
| .endm | |
| .macro scs_load_current_if_task_changed prev | |
| .endm | |
| .macro scs_save_current | |
| .endm | |
| #endif /* CONFIG_SHADOW_CALL_STACK */ | |
| #endif /* __ASSEMBLY__ */ | |
| #endif /* _ASM_SCS_H */ |