157bf6057SJulius Werner /* 2*d7b5f408SJimmy Brisson * Copyright (c) 2020, 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 2757bf6057SJulius Werner /* Security state of the image. */ 28*d7b5f408SJimmy Brisson #define EP_SECURITY_MASK UL(0x1) 29*d7b5f408SJimmy Brisson #define EP_SECURITY_SHIFT UL(0) 30*d7b5f408SJimmy Brisson #define EP_SECURE UL(0x0) 31*d7b5f408SJimmy Brisson #define EP_NON_SECURE UL(0x1) 3257bf6057SJulius Werner 3357bf6057SJulius Werner /* Endianness of the image. */ 3457bf6057SJulius Werner #define EP_EE_MASK U(0x2) 3557bf6057SJulius Werner #define EP_EE_SHIFT U(1) 3657bf6057SJulius Werner #define EP_EE_LITTLE U(0x0) 3757bf6057SJulius Werner #define EP_EE_BIG U(0x2) 3857bf6057SJulius Werner #define EP_GET_EE(x) ((x) & EP_EE_MASK) 3957bf6057SJulius Werner #define EP_SET_EE(x, ee) ((x) = ((x) & ~EP_EE_MASK) | (ee)) 4057bf6057SJulius Werner 4157bf6057SJulius Werner /* Enable or disable access to the secure timer from secure images. */ 4257bf6057SJulius Werner #define EP_ST_MASK U(0x4) 4357bf6057SJulius Werner #define EP_ST_SHIFT U(2) 4457bf6057SJulius Werner #define EP_ST_DISABLE U(0x0) 4557bf6057SJulius Werner #define EP_ST_ENABLE U(0x4) 4657bf6057SJulius Werner #define EP_GET_ST(x) ((x) & EP_ST_MASK) 4757bf6057SJulius Werner #define EP_SET_ST(x, ee) ((x) = ((x) & ~EP_ST_MASK) | (ee)) 4857bf6057SJulius Werner 4957bf6057SJulius Werner /* Determine if an image is executable or not. */ 5057bf6057SJulius Werner #define EP_EXE_MASK U(0x8) 5157bf6057SJulius Werner #define EP_EXE_SHIFT U(3) 5257bf6057SJulius Werner #define EP_NON_EXECUTABLE U(0x0) 5357bf6057SJulius Werner #define EP_EXECUTABLE U(0x8) 5457bf6057SJulius Werner #define EP_GET_EXE(x) ((x) & EP_EXE_MASK) 5557bf6057SJulius Werner #define EP_SET_EXE(x, ee) ((x) = ((x) & ~EP_EXE_MASK) | (ee)) 5657bf6057SJulius Werner 5757bf6057SJulius Werner /* Flag to indicate the first image that is executed. */ 5857bf6057SJulius Werner #define EP_FIRST_EXE_MASK U(0x10) 5957bf6057SJulius Werner #define EP_FIRST_EXE_SHIFT U(4) 6057bf6057SJulius Werner #define EP_FIRST_EXE U(0x10) 6157bf6057SJulius Werner #define EP_GET_FIRST_EXE(x) ((x) & EP_FIRST_EXE_MASK) 6257bf6057SJulius Werner #define EP_SET_FIRST_EXE(x, ee) ((x) = ((x) & ~EP_FIRST_EXE_MASK) | (ee)) 6357bf6057SJulius Werner 6457bf6057SJulius Werner #ifndef __ASSEMBLER__ 6557bf6057SJulius Werner 6657bf6057SJulius Werner typedef struct aapcs64_params { 6757bf6057SJulius Werner uint64_t arg0; 6857bf6057SJulius Werner uint64_t arg1; 6957bf6057SJulius Werner uint64_t arg2; 7057bf6057SJulius Werner uint64_t arg3; 7157bf6057SJulius Werner uint64_t arg4; 7257bf6057SJulius Werner uint64_t arg5; 7357bf6057SJulius Werner uint64_t arg6; 7457bf6057SJulius Werner uint64_t arg7; 7557bf6057SJulius Werner } aapcs64_params_t; 7657bf6057SJulius Werner 7757bf6057SJulius Werner typedef struct aapcs32_params { 7857bf6057SJulius Werner uint32_t arg0; 7957bf6057SJulius Werner uint32_t arg1; 8057bf6057SJulius Werner uint32_t arg2; 8157bf6057SJulius Werner uint32_t arg3; 8257bf6057SJulius Werner } aapcs32_params_t; 8357bf6057SJulius Werner 8457bf6057SJulius Werner /***************************************************************************** 8557bf6057SJulius Werner * This structure represents the superset of information needed while 8657bf6057SJulius Werner * switching exception levels. The only two mechanisms to do so are 8757bf6057SJulius Werner * ERET & SMC. Security state is indicated using bit zero of header 8857bf6057SJulius Werner * attribute 8957bf6057SJulius Werner * NOTE: BL1 expects entrypoint followed by spsr at an offset from the start 9057bf6057SJulius Werner * of this structure defined by the macro `ENTRY_POINT_INFO_PC_OFFSET` while 9157bf6057SJulius Werner * processing SMC to jump to BL31. 9257bf6057SJulius Werner *****************************************************************************/ 9357bf6057SJulius Werner typedef struct entry_point_info { 9457bf6057SJulius Werner param_header_t h; 9557bf6057SJulius Werner uintptr_t pc; 9657bf6057SJulius Werner uint32_t spsr; 9757bf6057SJulius Werner #ifdef __aarch64__ 9857bf6057SJulius Werner aapcs64_params_t args; 9957bf6057SJulius Werner #else 10057bf6057SJulius Werner uintptr_t lr_svc; 10157bf6057SJulius Werner aapcs32_params_t args; 10257bf6057SJulius Werner #endif 10357bf6057SJulius Werner } entry_point_info_t; 10457bf6057SJulius Werner 10557bf6057SJulius Werner #endif /*__ASSEMBLER__*/ 10657bf6057SJulius Werner 10757bf6057SJulius Werner #endif /* ARM_TRUSTED_FIRMWARE_EXPORT_COMMON_EP_INFO_EXP_H */ 108