xref: /aosp_15_r20/external/arm-trusted-firmware/include/common/ep_info.h (revision 54fd6939e177f8ff529b10183254802c76df6d08)
1*54fd6939SJiyong Park /*
2*54fd6939SJiyong Park  * Copyright (c) 2017-2021, Arm Limited and Contributors. All rights reserved.
3*54fd6939SJiyong Park  *
4*54fd6939SJiyong Park  * SPDX-License-Identifier: BSD-3-Clause
5*54fd6939SJiyong Park  */
6*54fd6939SJiyong Park 
7*54fd6939SJiyong Park #ifndef EP_INFO_H
8*54fd6939SJiyong Park #define EP_INFO_H
9*54fd6939SJiyong Park 
10*54fd6939SJiyong Park #include <common/param_header.h>
11*54fd6939SJiyong Park 
12*54fd6939SJiyong Park #ifndef __ASSEMBLER__
13*54fd6939SJiyong Park #include <stdint.h>
14*54fd6939SJiyong Park #include <lib/cassert.h>
15*54fd6939SJiyong Park #endif /* __ASSEMBLER__ */
16*54fd6939SJiyong Park 
17*54fd6939SJiyong Park #include <export/common/ep_info_exp.h>
18*54fd6939SJiyong Park 
19*54fd6939SJiyong Park #define SECURE		EP_SECURE
20*54fd6939SJiyong Park #define NON_SECURE	EP_NON_SECURE
21*54fd6939SJiyong Park #define REALM		EP_REALM
22*54fd6939SJiyong Park #if ENABLE_RME
23*54fd6939SJiyong Park #define sec_state_is_valid(s)	(((s) == SECURE) ||	\
24*54fd6939SJiyong Park 				((s) == NON_SECURE) ||	\
25*54fd6939SJiyong Park 				((s) == REALM))
26*54fd6939SJiyong Park #else
27*54fd6939SJiyong Park #define sec_state_is_valid(s) (((s) == SECURE) || ((s) == NON_SECURE))
28*54fd6939SJiyong Park #endif
29*54fd6939SJiyong Park 
30*54fd6939SJiyong Park #define PARAM_EP_SECURITY_MASK	EP_SECURITY_MASK
31*54fd6939SJiyong Park 
32*54fd6939SJiyong Park #define NON_EXECUTABLE	EP_NON_EXECUTABLE
33*54fd6939SJiyong Park #define EXECUTABLE	EP_EXECUTABLE
34*54fd6939SJiyong Park 
35*54fd6939SJiyong Park /* Get/set security state of an image */
36*54fd6939SJiyong Park #define GET_SECURITY_STATE(x) ((x) & EP_SECURITY_MASK)
37*54fd6939SJiyong Park #define SET_SECURITY_STATE(x, security) \
38*54fd6939SJiyong Park 			((x) = ((x) & ~EP_SECURITY_MASK) | (security))
39*54fd6939SJiyong Park 
40*54fd6939SJiyong Park #ifndef __ASSEMBLER__
41*54fd6939SJiyong Park 
42*54fd6939SJiyong Park /*
43*54fd6939SJiyong Park  * Compile time assertions related to the 'entry_point_info' structure to
44*54fd6939SJiyong Park  * ensure that the assembler and the compiler view of the offsets of
45*54fd6939SJiyong Park  * the structure members is the same.
46*54fd6939SJiyong Park  */
47*54fd6939SJiyong Park CASSERT(ENTRY_POINT_INFO_PC_OFFSET ==
48*54fd6939SJiyong Park 		__builtin_offsetof(entry_point_info_t, pc), \
49*54fd6939SJiyong Park 		assert_BL31_pc_offset_mismatch);
50*54fd6939SJiyong Park 
51*54fd6939SJiyong Park #ifndef __aarch64__
52*54fd6939SJiyong Park CASSERT(ENTRY_POINT_INFO_LR_SVC_OFFSET ==
53*54fd6939SJiyong Park 		__builtin_offsetof(entry_point_info_t, lr_svc),
54*54fd6939SJiyong Park 		assert_entrypoint_lr_offset_error);
55*54fd6939SJiyong Park #endif
56*54fd6939SJiyong Park 
57*54fd6939SJiyong Park CASSERT(ENTRY_POINT_INFO_ARGS_OFFSET == \
58*54fd6939SJiyong Park 		__builtin_offsetof(entry_point_info_t, args), \
59*54fd6939SJiyong Park 		assert_BL31_args_offset_mismatch);
60*54fd6939SJiyong Park 
61*54fd6939SJiyong Park CASSERT(sizeof(uintptr_t) ==
62*54fd6939SJiyong Park 		__builtin_offsetof(entry_point_info_t, spsr) - \
63*54fd6939SJiyong Park 		__builtin_offsetof(entry_point_info_t, pc), \
64*54fd6939SJiyong Park 		assert_entrypoint_and_spsr_should_be_adjacent);
65*54fd6939SJiyong Park 
66*54fd6939SJiyong Park #endif /*__ASSEMBLER__*/
67*54fd6939SJiyong Park 
68*54fd6939SJiyong Park #endif /* EP_INFO_H */
69