xref: /aosp_15_r20/external/arm-trusted-firmware/include/common/bl_common.h (revision 54fd6939e177f8ff529b10183254802c76df6d08)
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