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