xref: /rk3399_ARM-atf/include/export/common/ep_info_exp.h (revision 1d651211748cdc01b6a838925e7987572a5816e0)
157bf6057SJulius Werner /*
2*4693ff72SZelalem Aweke  * Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.
357bf6057SJulius Werner  *
457bf6057SJulius Werner  * SPDX-License-Identifier: BSD-3-Clause
557bf6057SJulius Werner  */
657bf6057SJulius Werner 
757bf6057SJulius Werner #ifndef ARM_TRUSTED_FIRMWARE_EXPORT_COMMON_EP_INFO_EXP_H
857bf6057SJulius Werner #define ARM_TRUSTED_FIRMWARE_EXPORT_COMMON_EP_INFO_EXP_H
957bf6057SJulius Werner 
1057bf6057SJulius Werner /* EXPORT HEADER -- See include/export/README for details! -- EXPORT HEADER */
1157bf6057SJulius Werner 
1257bf6057SJulius Werner #include "../lib/utils_def_exp.h"
1357bf6057SJulius Werner #include "param_header_exp.h"
1457bf6057SJulius Werner 
1557bf6057SJulius Werner /*******************************************************************************
1657bf6057SJulius Werner  * Constants that allow assembler code to access members of and the
1757bf6057SJulius Werner  * 'entry_point_info' structure at their correct offsets.
1857bf6057SJulius Werner  ******************************************************************************/
1957bf6057SJulius Werner #define ENTRY_POINT_INFO_PC_OFFSET	U(0x08)
2057bf6057SJulius Werner #ifdef __aarch64__
2157bf6057SJulius Werner #define ENTRY_POINT_INFO_ARGS_OFFSET	U(0x18)
2257bf6057SJulius Werner #else
2357bf6057SJulius Werner #define ENTRY_POINT_INFO_LR_SVC_OFFSET	U(0x10)
2457bf6057SJulius Werner #define ENTRY_POINT_INFO_ARGS_OFFSET	U(0x14)
2557bf6057SJulius Werner #endif
2657bf6057SJulius Werner 
27*4693ff72SZelalem Aweke /*
28*4693ff72SZelalem Aweke  * Security state of the image. Bit 0 and
29*4693ff72SZelalem Aweke  * bit 5 are used to determine the security
30*4693ff72SZelalem Aweke  * state of the image as follows:
31*4693ff72SZelalem Aweke  *
32*4693ff72SZelalem Aweke  * ---------------------------------
33*4693ff72SZelalem Aweke  *  Bit 5 | Bit 0 | Security state
34*4693ff72SZelalem Aweke  * ---------------------------------
35*4693ff72SZelalem Aweke  *   0        0      EP_SECURE
36*4693ff72SZelalem Aweke  *   0        1      EP_NON_SECURE
37*4693ff72SZelalem Aweke  *   1        1      EP_REALM
38*4693ff72SZelalem Aweke  */
39*4693ff72SZelalem Aweke #define EP_SECURITY_MASK	UL(0x21)
40d7b5f408SJimmy Brisson #define EP_SECURITY_SHIFT	UL(0)
41d7b5f408SJimmy Brisson #define EP_SECURE		UL(0x0)
42d7b5f408SJimmy Brisson #define EP_NON_SECURE		UL(0x1)
43*4693ff72SZelalem Aweke #define EP_REALM		UL(0x21)
4457bf6057SJulius Werner 
4557bf6057SJulius Werner /* Endianness of the image. */
4657bf6057SJulius Werner #define EP_EE_MASK		U(0x2)
4757bf6057SJulius Werner #define EP_EE_SHIFT		U(1)
4857bf6057SJulius Werner #define EP_EE_LITTLE		U(0x0)
4957bf6057SJulius Werner #define EP_EE_BIG		U(0x2)
5057bf6057SJulius Werner #define EP_GET_EE(x)		((x) & EP_EE_MASK)
5157bf6057SJulius Werner #define EP_SET_EE(x, ee)	((x) = ((x) & ~EP_EE_MASK) | (ee))
5257bf6057SJulius Werner 
5357bf6057SJulius Werner /* Enable or disable access to the secure timer from secure images. */
5457bf6057SJulius Werner #define EP_ST_MASK		U(0x4)
5557bf6057SJulius Werner #define EP_ST_SHIFT		U(2)
5657bf6057SJulius Werner #define EP_ST_DISABLE		U(0x0)
5757bf6057SJulius Werner #define EP_ST_ENABLE		U(0x4)
5857bf6057SJulius Werner #define EP_GET_ST(x)		((x) & EP_ST_MASK)
5957bf6057SJulius Werner #define EP_SET_ST(x, ee)	((x) = ((x) & ~EP_ST_MASK) | (ee))
6057bf6057SJulius Werner 
6157bf6057SJulius Werner /* Determine if an image is executable or not. */
6257bf6057SJulius Werner #define EP_EXE_MASK		U(0x8)
6357bf6057SJulius Werner #define EP_EXE_SHIFT		U(3)
6457bf6057SJulius Werner #define EP_NON_EXECUTABLE	U(0x0)
6557bf6057SJulius Werner #define EP_EXECUTABLE		U(0x8)
6657bf6057SJulius Werner #define EP_GET_EXE(x)		((x) & EP_EXE_MASK)
6757bf6057SJulius Werner #define EP_SET_EXE(x, ee)	((x) = ((x) & ~EP_EXE_MASK) | (ee))
6857bf6057SJulius Werner 
6957bf6057SJulius Werner /* Flag to indicate the first image that is executed. */
7057bf6057SJulius Werner #define EP_FIRST_EXE_MASK	U(0x10)
7157bf6057SJulius Werner #define EP_FIRST_EXE_SHIFT	U(4)
7257bf6057SJulius Werner #define EP_FIRST_EXE		U(0x10)
7357bf6057SJulius Werner #define EP_GET_FIRST_EXE(x)	((x) & EP_FIRST_EXE_MASK)
7457bf6057SJulius Werner #define EP_SET_FIRST_EXE(x, ee)	((x) = ((x) & ~EP_FIRST_EXE_MASK) | (ee))
7557bf6057SJulius Werner 
7657bf6057SJulius Werner #ifndef __ASSEMBLER__
7757bf6057SJulius Werner 
7857bf6057SJulius Werner typedef struct aapcs64_params {
7957bf6057SJulius Werner 	uint64_t arg0;
8057bf6057SJulius Werner 	uint64_t arg1;
8157bf6057SJulius Werner 	uint64_t arg2;
8257bf6057SJulius Werner 	uint64_t arg3;
8357bf6057SJulius Werner 	uint64_t arg4;
8457bf6057SJulius Werner 	uint64_t arg5;
8557bf6057SJulius Werner 	uint64_t arg6;
8657bf6057SJulius Werner 	uint64_t arg7;
8757bf6057SJulius Werner } aapcs64_params_t;
8857bf6057SJulius Werner 
8957bf6057SJulius Werner typedef struct aapcs32_params {
9057bf6057SJulius Werner 	uint32_t arg0;
9157bf6057SJulius Werner 	uint32_t arg1;
9257bf6057SJulius Werner 	uint32_t arg2;
9357bf6057SJulius Werner 	uint32_t arg3;
9457bf6057SJulius Werner } aapcs32_params_t;
9557bf6057SJulius Werner 
9657bf6057SJulius Werner /*****************************************************************************
9757bf6057SJulius Werner  * This structure represents the superset of information needed while
9857bf6057SJulius Werner  * switching exception levels. The only two mechanisms to do so are
9957bf6057SJulius Werner  * ERET & SMC. Security state is indicated using bit zero of header
10057bf6057SJulius Werner  * attribute
10157bf6057SJulius Werner  * NOTE: BL1 expects entrypoint followed by spsr at an offset from the start
10257bf6057SJulius Werner  * of this structure defined by the macro `ENTRY_POINT_INFO_PC_OFFSET` while
10357bf6057SJulius Werner  * processing SMC to jump to BL31.
10457bf6057SJulius Werner  *****************************************************************************/
10557bf6057SJulius Werner typedef struct entry_point_info {
10657bf6057SJulius Werner 	param_header_t h;
10757bf6057SJulius Werner 	uintptr_t pc;
10857bf6057SJulius Werner 	uint32_t spsr;
10957bf6057SJulius Werner #ifdef __aarch64__
11057bf6057SJulius Werner 	aapcs64_params_t args;
11157bf6057SJulius Werner #else
11257bf6057SJulius Werner 	uintptr_t lr_svc;
11357bf6057SJulius Werner 	aapcs32_params_t args;
11457bf6057SJulius Werner #endif
11557bf6057SJulius Werner } entry_point_info_t;
11657bf6057SJulius Werner 
11757bf6057SJulius Werner #endif /*__ASSEMBLER__*/
11857bf6057SJulius Werner 
11957bf6057SJulius Werner #endif /* ARM_TRUSTED_FIRMWARE_EXPORT_COMMON_EP_INFO_EXP_H */
120