| /* 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 */ |