xref: /arm-trusted-firmware/include/export/common/ep_info_exp.h (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.
3*91f16700Schasinglulu  *
4*91f16700Schasinglulu  * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu  */
6*91f16700Schasinglulu 
7*91f16700Schasinglulu #ifndef ARM_TRUSTED_FIRMWARE_EXPORT_COMMON_EP_INFO_EXP_H
8*91f16700Schasinglulu #define ARM_TRUSTED_FIRMWARE_EXPORT_COMMON_EP_INFO_EXP_H
9*91f16700Schasinglulu 
10*91f16700Schasinglulu /* EXPORT HEADER -- See include/export/README for details! -- EXPORT HEADER */
11*91f16700Schasinglulu 
12*91f16700Schasinglulu #include "../lib/utils_def_exp.h"
13*91f16700Schasinglulu #include "param_header_exp.h"
14*91f16700Schasinglulu 
15*91f16700Schasinglulu /*******************************************************************************
16*91f16700Schasinglulu  * Constants that allow assembler code to access members of and the
17*91f16700Schasinglulu  * 'entry_point_info' structure at their correct offsets.
18*91f16700Schasinglulu  ******************************************************************************/
19*91f16700Schasinglulu #define ENTRY_POINT_INFO_PC_OFFSET	U(0x08)
20*91f16700Schasinglulu #ifdef __aarch64__
21*91f16700Schasinglulu #define ENTRY_POINT_INFO_ARGS_OFFSET	U(0x18)
22*91f16700Schasinglulu #else
23*91f16700Schasinglulu #define ENTRY_POINT_INFO_LR_SVC_OFFSET	U(0x10)
24*91f16700Schasinglulu #define ENTRY_POINT_INFO_ARGS_OFFSET	U(0x14)
25*91f16700Schasinglulu #endif
26*91f16700Schasinglulu 
27*91f16700Schasinglulu /*
28*91f16700Schasinglulu  * Security state of the image. Bit 0 and
29*91f16700Schasinglulu  * bit 5 are used to determine the security
30*91f16700Schasinglulu  * state of the image as follows:
31*91f16700Schasinglulu  *
32*91f16700Schasinglulu  * ---------------------------------
33*91f16700Schasinglulu  *  Bit 5 | Bit 0 | Security state
34*91f16700Schasinglulu  * ---------------------------------
35*91f16700Schasinglulu  *   0        0      EP_SECURE
36*91f16700Schasinglulu  *   0        1      EP_NON_SECURE
37*91f16700Schasinglulu  *   1        1      EP_REALM
38*91f16700Schasinglulu  */
39*91f16700Schasinglulu #define EP_SECURITY_MASK	UL(0x21)
40*91f16700Schasinglulu #define EP_SECURITY_SHIFT	UL(0)
41*91f16700Schasinglulu #define EP_SECURE		UL(0x0)
42*91f16700Schasinglulu #define EP_NON_SECURE		UL(0x1)
43*91f16700Schasinglulu #define EP_REALM		UL(0x21)
44*91f16700Schasinglulu 
45*91f16700Schasinglulu /* Endianness of the image. */
46*91f16700Schasinglulu #define EP_EE_MASK		U(0x2)
47*91f16700Schasinglulu #define EP_EE_SHIFT		U(1)
48*91f16700Schasinglulu #define EP_EE_LITTLE		U(0x0)
49*91f16700Schasinglulu #define EP_EE_BIG		U(0x2)
50*91f16700Schasinglulu #define EP_GET_EE(x)		((x) & EP_EE_MASK)
51*91f16700Schasinglulu #define EP_SET_EE(x, ee)	((x) = ((x) & ~EP_EE_MASK) | (ee))
52*91f16700Schasinglulu 
53*91f16700Schasinglulu /* Enable or disable access to the secure timer from secure images. */
54*91f16700Schasinglulu #define EP_ST_MASK		U(0x4)
55*91f16700Schasinglulu #define EP_ST_SHIFT		U(2)
56*91f16700Schasinglulu #define EP_ST_DISABLE		U(0x0)
57*91f16700Schasinglulu #define EP_ST_ENABLE		U(0x4)
58*91f16700Schasinglulu #define EP_GET_ST(x)		((x) & EP_ST_MASK)
59*91f16700Schasinglulu #define EP_SET_ST(x, ee)	((x) = ((x) & ~EP_ST_MASK) | (ee))
60*91f16700Schasinglulu 
61*91f16700Schasinglulu /* Determine if an image is executable or not. */
62*91f16700Schasinglulu #define EP_EXE_MASK		U(0x8)
63*91f16700Schasinglulu #define EP_EXE_SHIFT		U(3)
64*91f16700Schasinglulu #define EP_NON_EXECUTABLE	U(0x0)
65*91f16700Schasinglulu #define EP_EXECUTABLE		U(0x8)
66*91f16700Schasinglulu #define EP_GET_EXE(x)		((x) & EP_EXE_MASK)
67*91f16700Schasinglulu #define EP_SET_EXE(x, ee)	((x) = ((x) & ~EP_EXE_MASK) | (ee))
68*91f16700Schasinglulu 
69*91f16700Schasinglulu /* Flag to indicate the first image that is executed. */
70*91f16700Schasinglulu #define EP_FIRST_EXE_MASK	U(0x10)
71*91f16700Schasinglulu #define EP_FIRST_EXE_SHIFT	U(4)
72*91f16700Schasinglulu #define EP_FIRST_EXE		U(0x10)
73*91f16700Schasinglulu #define EP_GET_FIRST_EXE(x)	((x) & EP_FIRST_EXE_MASK)
74*91f16700Schasinglulu #define EP_SET_FIRST_EXE(x, ee)	((x) = ((x) & ~EP_FIRST_EXE_MASK) | (ee))
75*91f16700Schasinglulu 
76*91f16700Schasinglulu #ifndef __ASSEMBLER__
77*91f16700Schasinglulu 
78*91f16700Schasinglulu typedef struct aapcs64_params {
79*91f16700Schasinglulu 	uint64_t arg0;
80*91f16700Schasinglulu 	uint64_t arg1;
81*91f16700Schasinglulu 	uint64_t arg2;
82*91f16700Schasinglulu 	uint64_t arg3;
83*91f16700Schasinglulu 	uint64_t arg4;
84*91f16700Schasinglulu 	uint64_t arg5;
85*91f16700Schasinglulu 	uint64_t arg6;
86*91f16700Schasinglulu 	uint64_t arg7;
87*91f16700Schasinglulu } aapcs64_params_t;
88*91f16700Schasinglulu 
89*91f16700Schasinglulu typedef struct aapcs32_params {
90*91f16700Schasinglulu 	uint32_t arg0;
91*91f16700Schasinglulu 	uint32_t arg1;
92*91f16700Schasinglulu 	uint32_t arg2;
93*91f16700Schasinglulu 	uint32_t arg3;
94*91f16700Schasinglulu } aapcs32_params_t;
95*91f16700Schasinglulu 
96*91f16700Schasinglulu /*****************************************************************************
97*91f16700Schasinglulu  * This structure represents the superset of information needed while
98*91f16700Schasinglulu  * switching exception levels. The only two mechanisms to do so are
99*91f16700Schasinglulu  * ERET & SMC. Security state is indicated using bit zero of header
100*91f16700Schasinglulu  * attribute
101*91f16700Schasinglulu  * NOTE: BL1 expects entrypoint followed by spsr at an offset from the start
102*91f16700Schasinglulu  * of this structure defined by the macro `ENTRY_POINT_INFO_PC_OFFSET` while
103*91f16700Schasinglulu  * processing SMC to jump to BL31.
104*91f16700Schasinglulu  *****************************************************************************/
105*91f16700Schasinglulu typedef struct entry_point_info {
106*91f16700Schasinglulu 	param_header_t h;
107*91f16700Schasinglulu 	uintptr_t pc;
108*91f16700Schasinglulu 	uint32_t spsr;
109*91f16700Schasinglulu #ifdef __aarch64__
110*91f16700Schasinglulu 	aapcs64_params_t args;
111*91f16700Schasinglulu #else
112*91f16700Schasinglulu 	uintptr_t lr_svc;
113*91f16700Schasinglulu 	aapcs32_params_t args;
114*91f16700Schasinglulu #endif
115*91f16700Schasinglulu } entry_point_info_t;
116*91f16700Schasinglulu 
117*91f16700Schasinglulu #endif /*__ASSEMBLER__*/
118*91f16700Schasinglulu 
119*91f16700Schasinglulu #endif /* ARM_TRUSTED_FIRMWARE_EXPORT_COMMON_EP_INFO_EXP_H */
120