blob: a03c920b6a93ef6a83b568380834bfcdbb67f94c [file] [log] [blame]
/* 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*/