| /* SPDX-License-Identifier: BSD-2-Clause */ |
| /* |
| * Copyright (c) 2016, Linaro Limited |
| * Copyright (c) 2014, STMicroelectronics International N.V. |
| */ |
| |
| #ifndef SM_SM_H |
| #define SM_SM_H |
| |
| #ifndef __ASSEMBLER__ |
| |
| #include <compiler.h> |
| #include <types_ext.h> |
| |
| struct sm_unbanked_regs { |
| uint32_t usr_sp; |
| uint32_t usr_lr; |
| uint32_t irq_spsr; |
| uint32_t irq_sp; |
| uint32_t irq_lr; |
| uint32_t fiq_spsr; |
| uint32_t fiq_sp; |
| uint32_t fiq_lr; |
| /* |
| * Note that fiq_r{8-12} are not saved here. Instead thread_fiq_handler |
| * preserves r{8-12}. |
| */ |
| uint32_t svc_spsr; |
| uint32_t svc_sp; |
| uint32_t svc_lr; |
| uint32_t abt_spsr; |
| uint32_t abt_sp; |
| uint32_t abt_lr; |
| uint32_t und_spsr; |
| uint32_t und_sp; |
| uint32_t und_lr; |
| #ifdef CFG_SM_NO_CYCLE_COUNTING |
| uint32_t pmcr; |
| #endif |
| #ifdef CFG_FTRACE_SUPPORT |
| uint32_t cntkctl; |
| uint32_t pad; |
| #endif |
| }; |
| |
| struct sm_nsec_ctx { |
| struct sm_unbanked_regs ub_regs; |
| |
| uint32_t r8; |
| uint32_t r9; |
| uint32_t r10; |
| uint32_t r11; |
| uint32_t r12; |
| |
| uint32_t r0; |
| uint32_t r1; |
| uint32_t r2; |
| uint32_t r3; |
| uint32_t r4; |
| uint32_t r5; |
| uint32_t r6; |
| uint32_t r7; |
| |
| /* return state */ |
| uint32_t mon_lr; |
| uint32_t mon_spsr; |
| }; |
| |
| struct sm_sec_ctx { |
| struct sm_unbanked_regs ub_regs; |
| |
| uint32_t r0; |
| uint32_t r1; |
| uint32_t r2; |
| uint32_t r3; |
| uint32_t r4; |
| uint32_t r5; |
| uint32_t r6; |
| uint32_t r7; |
| |
| /* return state */ |
| uint32_t mon_lr; |
| uint32_t mon_spsr; |
| }; |
| |
| struct sm_ctx { |
| #ifndef CFG_SM_NO_CYCLE_COUNTING |
| uint32_t pad; |
| #endif |
| struct sm_sec_ctx sec; |
| #ifdef CFG_SM_NO_CYCLE_COUNTING |
| uint32_t pad; |
| #endif |
| struct sm_nsec_ctx nsec; |
| }; |
| |
| /* |
| * The secure monitor reserves space at top of stack_tmp to hold struct |
| * sm_ctx. |
| */ |
| #define SM_STACK_TMP_RESERVE_SIZE sizeof(struct sm_ctx) |
| |
| |
| |
| /* Returns storage location of non-secure context for current CPU */ |
| struct sm_nsec_ctx *sm_get_nsec_ctx(void); |
| |
| /* Returns stack pointer to use in monitor mode for current CPU */ |
| void *sm_get_sp(void); |
| |
| /* |
| * Initializes secure monitor, must be called by each CPU |
| */ |
| void sm_init(vaddr_t stack_pointer); |
| |
| enum sm_handler_ret { |
| SM_HANDLER_SMC_HANDLED = 0, |
| SM_HANDLER_PENDING_SMC, |
| }; |
| |
| #ifdef CFG_SM_PLATFORM_HANDLER |
| /* |
| * Returns whether SMC was handled from platform handler in secure monitor |
| * or if it shall reach OP-TEE core . |
| */ |
| enum sm_handler_ret sm_platform_handler(struct sm_ctx *ctx); |
| #endif |
| |
| void sm_save_unbanked_regs(struct sm_unbanked_regs *regs); |
| void sm_restore_unbanked_regs(struct sm_unbanked_regs *regs); |
| |
| #endif /*!__ASSEMBLER__*/ |
| |
| /* 32 bit return value for sm_from_nsec() */ |
| #define SM_EXIT_TO_NON_SECURE 0 |
| #define SM_EXIT_TO_SECURE 1 |
| |
| #endif /*SM_SM_H*/ |