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