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