1*54fd6939SJiyong Park /* 2*54fd6939SJiyong Park * Copyright (c) 2013-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 BL_COMMON_H 8*54fd6939SJiyong Park #define BL_COMMON_H 9*54fd6939SJiyong Park 10*54fd6939SJiyong Park #include <common/ep_info.h> 11*54fd6939SJiyong Park #include <common/param_header.h> 12*54fd6939SJiyong Park #include <lib/utils_def.h> 13*54fd6939SJiyong Park 14*54fd6939SJiyong Park #ifndef __ASSEMBLER__ 15*54fd6939SJiyong Park #include <stddef.h> 16*54fd6939SJiyong Park #include <stdint.h> 17*54fd6939SJiyong Park #include <lib/cassert.h> 18*54fd6939SJiyong Park #endif /* __ASSEMBLER__ */ 19*54fd6939SJiyong Park 20*54fd6939SJiyong Park #include <export/common/bl_common_exp.h> 21*54fd6939SJiyong Park 22*54fd6939SJiyong Park #define UP U(1) 23*54fd6939SJiyong Park #define DOWN U(0) 24*54fd6939SJiyong Park 25*54fd6939SJiyong Park /******************************************************************************* 26*54fd6939SJiyong Park * Constants to identify the location of a memory region in a given memory 27*54fd6939SJiyong Park * layout. 28*54fd6939SJiyong Park ******************************************************************************/ 29*54fd6939SJiyong Park #define TOP U(0x1) 30*54fd6939SJiyong Park #define BOTTOM U(0x0) 31*54fd6939SJiyong Park 32*54fd6939SJiyong Park /******************************************************************************* 33*54fd6939SJiyong Park * Constants to indicate type of exception to the common exception handler. 34*54fd6939SJiyong Park ******************************************************************************/ 35*54fd6939SJiyong Park #define SYNC_EXCEPTION_SP_EL0 U(0x0) 36*54fd6939SJiyong Park #define IRQ_SP_EL0 U(0x1) 37*54fd6939SJiyong Park #define FIQ_SP_EL0 U(0x2) 38*54fd6939SJiyong Park #define SERROR_SP_EL0 U(0x3) 39*54fd6939SJiyong Park #define SYNC_EXCEPTION_SP_ELX U(0x4) 40*54fd6939SJiyong Park #define IRQ_SP_ELX U(0x5) 41*54fd6939SJiyong Park #define FIQ_SP_ELX U(0x6) 42*54fd6939SJiyong Park #define SERROR_SP_ELX U(0x7) 43*54fd6939SJiyong Park #define SYNC_EXCEPTION_AARCH64 U(0x8) 44*54fd6939SJiyong Park #define IRQ_AARCH64 U(0x9) 45*54fd6939SJiyong Park #define FIQ_AARCH64 U(0xa) 46*54fd6939SJiyong Park #define SERROR_AARCH64 U(0xb) 47*54fd6939SJiyong Park #define SYNC_EXCEPTION_AARCH32 U(0xc) 48*54fd6939SJiyong Park #define IRQ_AARCH32 U(0xd) 49*54fd6939SJiyong Park #define FIQ_AARCH32 U(0xe) 50*54fd6939SJiyong Park #define SERROR_AARCH32 U(0xf) 51*54fd6939SJiyong Park 52*54fd6939SJiyong Park /* 53*54fd6939SJiyong Park * Mapping to connect linker symbols from .ld.S with their counterparts 54*54fd6939SJiyong Park * from .scat for the BL31 image 55*54fd6939SJiyong Park */ 56*54fd6939SJiyong Park #if defined(USE_ARM_LINK) 57*54fd6939SJiyong Park #define __BL31_END__ Load$$LR$$LR_END$$Base 58*54fd6939SJiyong Park #define __BSS_START__ Load$$LR$$LR_BSS$$Base 59*54fd6939SJiyong Park #define __BSS_END__ Load$$LR$$LR_BSS$$Limit 60*54fd6939SJiyong Park #define __BSS_SIZE__ Load$$LR$$LR_BSS$$Length 61*54fd6939SJiyong Park #define __COHERENT_RAM_START__ Load$$LR$$LR_COHERENT_RAM$$Base 62*54fd6939SJiyong Park #define __COHERENT_RAM_END_UNALIGNED__ Load$$__COHERENT_RAM_EPILOGUE_UNALIGNED__$$Base 63*54fd6939SJiyong Park #define __COHERENT_RAM_END__ Load$$LR$$LR_COHERENT_RAM$$Limit 64*54fd6939SJiyong Park #define __COHERENT_RAM_UNALIGNED_SIZE__ Load$$__COHERENT_RAM__$$Length 65*54fd6939SJiyong Park #define __CPU_OPS_START__ Load$$__CPU_OPS__$$Base 66*54fd6939SJiyong Park #define __CPU_OPS_END__ Load$$__CPU_OPS__$$Limit 67*54fd6939SJiyong Park #define __DATA_START__ Load$$__DATA__$$Base 68*54fd6939SJiyong Park #define __DATA_END__ Load$$__DATA__$$Limit 69*54fd6939SJiyong Park #define __GOT_START__ Load$$__GOT__$$Base 70*54fd6939SJiyong Park #define __GOT_END__ Load$$__GOT__$$Limit 71*54fd6939SJiyong Park #define __PERCPU_BAKERY_LOCK_START__ Load$$__BAKERY_LOCKS__$$Base 72*54fd6939SJiyong Park #define __PERCPU_BAKERY_LOCK_END__ Load$$__BAKERY_LOCKS_EPILOGUE__$$Base 73*54fd6939SJiyong Park #define __PMF_SVC_DESCS_START__ Load$$__PMF_SVC_DESCS__$$Base 74*54fd6939SJiyong Park #define __PMF_SVC_DESCS_END__ Load$$__PMF_SVC_DESCS__$$Limit 75*54fd6939SJiyong Park #define __PMF_TIMESTAMP_START__ Load$$__PMF_TIMESTAMP__$$Base 76*54fd6939SJiyong Park #define __PMF_TIMESTAMP_END__ Load$$__PER_CPU_TIMESTAMPS__$$Limit 77*54fd6939SJiyong Park #define __PMF_PERCPU_TIMESTAMP_END__ Load$$__PMF_TIMESTAMP_EPILOGUE__$$Base 78*54fd6939SJiyong Park #define __RELA_END__ Load$$__RELA__$$Limit 79*54fd6939SJiyong Park #define __RELA_START__ Load$$__RELA__$$Base 80*54fd6939SJiyong Park #define __RODATA_START__ Load$$__RODATA__$$Base 81*54fd6939SJiyong Park #define __RODATA_END__ Load$$__RODATA_EPILOGUE__$$Base 82*54fd6939SJiyong Park #define __RT_SVC_DESCS_START__ Load$$__RT_SVC_DESCS__$$Base 83*54fd6939SJiyong Park #define __RT_SVC_DESCS_END__ Load$$__RT_SVC_DESCS__$$Limit 84*54fd6939SJiyong Park #define __RW_START__ Load$$LR$$LR_RW_DATA$$Base 85*54fd6939SJiyong Park #define __RW_END__ Load$$LR$$LR_END$$Base 86*54fd6939SJiyong Park #define __SPM_SHIM_EXCEPTIONS_START__ Load$$__SPM_SHIM_EXCEPTIONS__$$Base 87*54fd6939SJiyong Park #define __SPM_SHIM_EXCEPTIONS_END__ Load$$__SPM_SHIM_EXCEPTIONS_EPILOGUE__$$Base 88*54fd6939SJiyong Park #define __STACKS_START__ Load$$__STACKS__$$Base 89*54fd6939SJiyong Park #define __STACKS_END__ Load$$__STACKS__$$Limit 90*54fd6939SJiyong Park #define __TEXT_START__ Load$$__TEXT__$$Base 91*54fd6939SJiyong Park #define __TEXT_END__ Load$$__TEXT_EPILOGUE__$$Base 92*54fd6939SJiyong Park #endif /* USE_ARM_LINK */ 93*54fd6939SJiyong Park 94*54fd6939SJiyong Park #ifndef __ASSEMBLER__ 95*54fd6939SJiyong Park 96*54fd6939SJiyong Park /* 97*54fd6939SJiyong Park * Declarations of linker defined symbols to help determine memory layout of 98*54fd6939SJiyong Park * BL images 99*54fd6939SJiyong Park */ 100*54fd6939SJiyong Park #if SEPARATE_CODE_AND_RODATA 101*54fd6939SJiyong Park IMPORT_SYM(uintptr_t, __TEXT_START__, BL_CODE_BASE); 102*54fd6939SJiyong Park IMPORT_SYM(uintptr_t, __TEXT_END__, BL_CODE_END); 103*54fd6939SJiyong Park IMPORT_SYM(uintptr_t, __RODATA_START__, BL_RO_DATA_BASE); 104*54fd6939SJiyong Park IMPORT_SYM(uintptr_t, __RODATA_END__, BL_RO_DATA_END); 105*54fd6939SJiyong Park #else 106*54fd6939SJiyong Park IMPORT_SYM(uintptr_t, __RO_START__, BL_CODE_BASE); 107*54fd6939SJiyong Park IMPORT_SYM(uintptr_t, __RO_END__, BL_CODE_END); 108*54fd6939SJiyong Park #endif 109*54fd6939SJiyong Park #if SEPARATE_NOBITS_REGION 110*54fd6939SJiyong Park IMPORT_SYM(uintptr_t, __NOBITS_START__, BL_NOBITS_BASE); 111*54fd6939SJiyong Park IMPORT_SYM(uintptr_t, __NOBITS_END__, BL_NOBITS_END); 112*54fd6939SJiyong Park #endif 113*54fd6939SJiyong Park IMPORT_SYM(uintptr_t, __RW_END__, BL_END); 114*54fd6939SJiyong Park 115*54fd6939SJiyong Park #if defined(IMAGE_BL1) 116*54fd6939SJiyong Park IMPORT_SYM(uintptr_t, __BL1_ROM_END__, BL1_ROM_END); 117*54fd6939SJiyong Park 118*54fd6939SJiyong Park IMPORT_SYM(uintptr_t, __BL1_RAM_START__, BL1_RAM_BASE); 119*54fd6939SJiyong Park IMPORT_SYM(uintptr_t, __BL1_RAM_END__, BL1_RAM_LIMIT); 120*54fd6939SJiyong Park #elif defined(IMAGE_BL2) 121*54fd6939SJiyong Park IMPORT_SYM(uintptr_t, __BL2_END__, BL2_END); 122*54fd6939SJiyong Park #elif defined(IMAGE_BL2U) 123*54fd6939SJiyong Park IMPORT_SYM(uintptr_t, __BL2U_END__, BL2U_END); 124*54fd6939SJiyong Park #elif defined(IMAGE_BL31) 125*54fd6939SJiyong Park IMPORT_SYM(uintptr_t, __BL31_START__, BL31_START); 126*54fd6939SJiyong Park IMPORT_SYM(uintptr_t, __BL31_END__, BL31_END); 127*54fd6939SJiyong Park #elif defined(IMAGE_BL32) 128*54fd6939SJiyong Park IMPORT_SYM(uintptr_t, __BL32_END__, BL32_END); 129*54fd6939SJiyong Park #elif defined(IMAGE_RMM) 130*54fd6939SJiyong Park IMPORT_SYM(uintptr_t, __RMM_END__, RMM_END); 131*54fd6939SJiyong Park #endif /* IMAGE_BLX */ 132*54fd6939SJiyong Park 133*54fd6939SJiyong Park /* The following symbols are only exported from the BL2 at EL3 linker script. */ 134*54fd6939SJiyong Park #if BL2_IN_XIP_MEM && defined(IMAGE_BL2) 135*54fd6939SJiyong Park IMPORT_SYM(uintptr_t, __BL2_ROM_END__, BL2_ROM_END); 136*54fd6939SJiyong Park 137*54fd6939SJiyong Park IMPORT_SYM(uintptr_t, __BL2_RAM_START__, BL2_RAM_BASE); 138*54fd6939SJiyong Park IMPORT_SYM(uintptr_t, __BL2_RAM_END__, BL2_RAM_END); 139*54fd6939SJiyong Park #endif /* BL2_IN_XIP_MEM */ 140*54fd6939SJiyong Park 141*54fd6939SJiyong Park /* 142*54fd6939SJiyong Park * The next 2 constants identify the extents of the coherent memory region. 143*54fd6939SJiyong Park * These addresses are used by the MMU setup code and therefore they must be 144*54fd6939SJiyong Park * page-aligned. It is the responsibility of the linker script to ensure that 145*54fd6939SJiyong Park * __COHERENT_RAM_START__ and __COHERENT_RAM_END__ linker symbols refer to 146*54fd6939SJiyong Park * page-aligned addresses. 147*54fd6939SJiyong Park */ 148*54fd6939SJiyong Park #if USE_COHERENT_MEM 149*54fd6939SJiyong Park IMPORT_SYM(uintptr_t, __COHERENT_RAM_START__, BL_COHERENT_RAM_BASE); 150*54fd6939SJiyong Park IMPORT_SYM(uintptr_t, __COHERENT_RAM_END__, BL_COHERENT_RAM_END); 151*54fd6939SJiyong Park #endif 152*54fd6939SJiyong Park 153*54fd6939SJiyong Park /******************************************************************************* 154*54fd6939SJiyong Park * Structure used for telling the next BL how much of a particular type of 155*54fd6939SJiyong Park * memory is available for its use and how much is already used. 156*54fd6939SJiyong Park ******************************************************************************/ 157*54fd6939SJiyong Park typedef struct meminfo { 158*54fd6939SJiyong Park uintptr_t total_base; 159*54fd6939SJiyong Park size_t total_size; 160*54fd6939SJiyong Park } meminfo_t; 161*54fd6939SJiyong Park 162*54fd6939SJiyong Park /******************************************************************************* 163*54fd6939SJiyong Park * Function & variable prototypes 164*54fd6939SJiyong Park ******************************************************************************/ 165*54fd6939SJiyong Park int load_auth_image(unsigned int image_id, image_info_t *image_data); 166*54fd6939SJiyong Park 167*54fd6939SJiyong Park #if TRUSTED_BOARD_BOOT && defined(DYN_DISABLE_AUTH) 168*54fd6939SJiyong Park /* 169*54fd6939SJiyong Park * API to dynamically disable authentication. Only meant for development 170*54fd6939SJiyong Park * systems. 171*54fd6939SJiyong Park */ 172*54fd6939SJiyong Park void dyn_disable_auth(void); 173*54fd6939SJiyong Park #endif 174*54fd6939SJiyong Park 175*54fd6939SJiyong Park extern const char build_message[]; 176*54fd6939SJiyong Park extern const char version_string[]; 177*54fd6939SJiyong Park 178*54fd6939SJiyong Park void print_entry_point_info(const entry_point_info_t *ep_info); 179*54fd6939SJiyong Park uintptr_t page_align(uintptr_t value, unsigned dir); 180*54fd6939SJiyong Park 181*54fd6939SJiyong Park struct mmap_region; 182*54fd6939SJiyong Park 183*54fd6939SJiyong Park void setup_page_tables(const struct mmap_region *bl_regions, 184*54fd6939SJiyong Park const struct mmap_region *plat_regions); 185*54fd6939SJiyong Park 186*54fd6939SJiyong Park void bl_handle_pauth(void); 187*54fd6939SJiyong Park 188*54fd6939SJiyong Park #endif /*__ASSEMBLER__*/ 189*54fd6939SJiyong Park 190*54fd6939SJiyong Park #endif /* BL_COMMON_H */ 191