c40fef858d
When both CONFIG_IRQ_STACKS and SCS are enabled, also use a separate per-CPU shadow call stack. Signed-off-by: Sami Tolvanen <samitolvanen@google.com> Tested-by: Nathan Chancellor <nathan@kernel.org> Link: https://lore.kernel.org/r/20230927224757.1154247-13-samitolvanen@google.com Signed-off-by: Palmer Dabbelt <palmer@rivosinc.com>
55 lines
1.1 KiB
C
55 lines
1.1 KiB
C
/* 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 */
|