xref: /optee_os/core/arch/arm/include/sm/sm.h (revision d50fee0321fe6853ac6352cf0fd548666457b407)
11bb92983SJerome Forissier /* SPDX-License-Identifier: BSD-2-Clause */
2abe38974SJens Wiklander /*
33f4d6849SJens Wiklander  * Copyright (c) 2016, Linaro Limited
4abe38974SJens Wiklander  * Copyright (c) 2014, STMicroelectronics International N.V.
5abe38974SJens Wiklander  */
6abe38974SJens Wiklander 
7*d50fee03SEtienne Carriere #ifndef __SM_SM_H
8*d50fee03SEtienne Carriere #define __SM_SM_H
9abe38974SJens Wiklander 
10757331fcSJens Wiklander #ifndef __ASSEMBLER__
1165363c52SEtienne Carriere 
125849875fSAndrew F. Davis #include <compiler.h>
13abe38974SJens Wiklander #include <types_ext.h>
14abe38974SJens Wiklander 
150160fec3SJerome Forissier struct sm_unbanked_regs {
16abe38974SJens Wiklander 	uint32_t usr_sp;
17abe38974SJens Wiklander 	uint32_t usr_lr;
18abe38974SJens Wiklander 	uint32_t irq_spsr;
19abe38974SJens Wiklander 	uint32_t irq_sp;
20abe38974SJens Wiklander 	uint32_t irq_lr;
21f2dec49bSJens Wiklander 	uint32_t fiq_spsr;
22f2dec49bSJens Wiklander 	uint32_t fiq_sp;
23f2dec49bSJens Wiklander 	uint32_t fiq_lr;
243f4d6849SJens Wiklander 	/*
253f4d6849SJens Wiklander 	 * Note that fiq_r{8-12} are not saved here. Instead thread_fiq_handler
263f4d6849SJens Wiklander 	 * preserves r{8-12}.
273f4d6849SJens Wiklander 	 */
28abe38974SJens Wiklander 	uint32_t svc_spsr;
29abe38974SJens Wiklander 	uint32_t svc_sp;
30abe38974SJens Wiklander 	uint32_t svc_lr;
31abe38974SJens Wiklander 	uint32_t abt_spsr;
32abe38974SJens Wiklander 	uint32_t abt_sp;
33abe38974SJens Wiklander 	uint32_t abt_lr;
34abe38974SJens Wiklander 	uint32_t und_spsr;
35abe38974SJens Wiklander 	uint32_t und_sp;
36abe38974SJens Wiklander 	uint32_t und_lr;
378267e19bSJerome Forissier #ifdef CFG_SM_NO_CYCLE_COUNTING
388267e19bSJerome Forissier 	uint32_t pmcr;
398267e19bSJerome Forissier #endif
40099918f6SSumit Garg #ifdef CFG_FTRACE_SUPPORT
41edaf8c38SSumit Garg 	uint32_t cntkctl;
42edaf8c38SSumit Garg 	uint32_t pad;
43edaf8c38SSumit Garg #endif
443f4d6849SJens Wiklander };
453f4d6849SJens Wiklander 
463f4d6849SJens Wiklander struct sm_nsec_ctx {
470160fec3SJerome Forissier 	struct sm_unbanked_regs ub_regs;
483f4d6849SJens Wiklander 
49abe38974SJens Wiklander 	uint32_t r8;
50abe38974SJens Wiklander 	uint32_t r9;
51abe38974SJens Wiklander 	uint32_t r10;
52abe38974SJens Wiklander 	uint32_t r11;
53abe38974SJens Wiklander 	uint32_t r12;
543f4d6849SJens Wiklander 
55abe38974SJens Wiklander 	uint32_t r0;
56abe38974SJens Wiklander 	uint32_t r1;
57abe38974SJens Wiklander 	uint32_t r2;
58abe38974SJens Wiklander 	uint32_t r3;
593f4d6849SJens Wiklander 	uint32_t r4;
603f4d6849SJens Wiklander 	uint32_t r5;
613f4d6849SJens Wiklander 	uint32_t r6;
623f4d6849SJens Wiklander 	uint32_t r7;
633f4d6849SJens Wiklander 
643f4d6849SJens Wiklander 	/* return state */
653f4d6849SJens Wiklander 	uint32_t mon_lr;
663f4d6849SJens Wiklander 	uint32_t mon_spsr;
67abe38974SJens Wiklander };
68abe38974SJens Wiklander 
69abe38974SJens Wiklander struct sm_sec_ctx {
700160fec3SJerome Forissier 	struct sm_unbanked_regs ub_regs;
713f4d6849SJens Wiklander 
723f4d6849SJens Wiklander 	uint32_t r0;
733f4d6849SJens Wiklander 	uint32_t r1;
743f4d6849SJens Wiklander 	uint32_t r2;
753f4d6849SJens Wiklander 	uint32_t r3;
763f4d6849SJens Wiklander 	uint32_t r4;
773f4d6849SJens Wiklander 	uint32_t r5;
783f4d6849SJens Wiklander 	uint32_t r6;
793f4d6849SJens Wiklander 	uint32_t r7;
803f4d6849SJens Wiklander 
813f4d6849SJens Wiklander 	/* return state */
82abe38974SJens Wiklander 	uint32_t mon_lr;
83abe38974SJens Wiklander 	uint32_t mon_spsr;
84abe38974SJens Wiklander };
85abe38974SJens Wiklander 
863f4d6849SJens Wiklander struct sm_ctx {
87e72c941fSJens Wiklander #ifndef CFG_SM_NO_CYCLE_COUNTING
883f4d6849SJens Wiklander 	uint32_t pad;
89e72c941fSJens Wiklander #endif
903f4d6849SJens Wiklander 	struct sm_sec_ctx sec;
91e72c941fSJens Wiklander #ifdef CFG_SM_NO_CYCLE_COUNTING
92e72c941fSJens Wiklander 	uint32_t pad;
93e72c941fSJens Wiklander #endif
943f4d6849SJens Wiklander 	struct sm_nsec_ctx nsec;
953f4d6849SJens Wiklander };
963f4d6849SJens Wiklander 
973f4d6849SJens Wiklander /*
98c822f03fSJens Wiklander  * The secure monitor reserves space at top of stack_tmp to hold struct
99c822f03fSJens Wiklander  * sm_ctx.
1003f4d6849SJens Wiklander  */
101c822f03fSJens Wiklander #define SM_STACK_TMP_RESERVE_SIZE	sizeof(struct sm_ctx)
1023f4d6849SJens Wiklander 
103abe38974SJens Wiklander /* Returns storage location of non-secure context for current CPU */
104abe38974SJens Wiklander struct sm_nsec_ctx *sm_get_nsec_ctx(void);
105abe38974SJens Wiklander 
106abe38974SJens Wiklander /* Returns stack pointer to use in monitor mode for current CPU */
107abe38974SJens Wiklander void *sm_get_sp(void);
108abe38974SJens Wiklander 
109abe38974SJens Wiklander /*
110abe38974SJens Wiklander  * Initializes secure monitor, must be called by each CPU
111abe38974SJens Wiklander  */
112abe38974SJens Wiklander void sm_init(vaddr_t stack_pointer);
113abe38974SJens Wiklander 
114aea0999eSEtienne Carriere enum sm_handler_ret {
115aea0999eSEtienne Carriere 	SM_HANDLER_SMC_HANDLED = 0,
116aea0999eSEtienne Carriere 	SM_HANDLER_PENDING_SMC,
117aea0999eSEtienne Carriere };
118aea0999eSEtienne Carriere 
119aea0999eSEtienne Carriere /*
120aea0999eSEtienne Carriere  * Returns whether SMC was handled from platform handler in secure monitor
121aea0999eSEtienne Carriere  * or if it shall reach OP-TEE core .
122aea0999eSEtienne Carriere  */
123aea0999eSEtienne Carriere enum sm_handler_ret sm_platform_handler(struct sm_ctx *ctx);
1245849875fSAndrew F. Davis 
1250160fec3SJerome Forissier void sm_save_unbanked_regs(struct sm_unbanked_regs *regs);
1260160fec3SJerome Forissier void sm_restore_unbanked_regs(struct sm_unbanked_regs *regs);
12765363c52SEtienne Carriere 
128651d7537SJens Wiklander /*
129651d7537SJens Wiklander  * These function return to secure monitor by SMC instead of a normal
130651d7537SJens Wiklander  * function return.
131651d7537SJens Wiklander  */
132651d7537SJens Wiklander void vector_std_smc_entry(uint32_t a0, uint32_t a1, uint32_t a2, uint32_t a3,
133651d7537SJens Wiklander 			  uint32_t a4, uint32_t a5, uint32_t a6, uint32_t a7);
134651d7537SJens Wiklander void vector_fast_smc_entry(uint32_t a0, uint32_t a1, uint32_t a2, uint32_t a3,
135651d7537SJens Wiklander 			   uint32_t a4, uint32_t a5, uint32_t a6, uint32_t a7);
136651d7537SJens Wiklander void vector_fiq_entry(uint32_t a0, uint32_t a1, uint32_t a2, uint32_t a3,
137651d7537SJens Wiklander 		      uint32_t a4, uint32_t a5, uint32_t a6, uint32_t a7);
138651d7537SJens Wiklander 
139757331fcSJens Wiklander #endif /*!__ASSEMBLER__*/
14065363c52SEtienne Carriere 
14165363c52SEtienne Carriere /* 32 bit return value for sm_from_nsec() */
14265363c52SEtienne Carriere #define SM_EXIT_TO_NON_SECURE		0
14365363c52SEtienne Carriere #define SM_EXIT_TO_SECURE		1
14465363c52SEtienne Carriere 
145*d50fee03SEtienne Carriere #endif /*__SM_SM_H*/
146