bl_common.h 8.89 KB
Newer Older
1
/*
2
 * Copyright (c) 2013-2019, ARM Limited and Contributors. All rights reserved.
3
 *
dp-arm's avatar
dp-arm committed
4
 * SPDX-License-Identifier: BSD-3-Clause
5
6
 */

7
8
#ifndef BL_COMMON_H
#define BL_COMMON_H
9

10
11
12
#include <common/ep_info.h>
#include <common/param_header.h>
#include <lib/utils_def.h>
13

14
15
#define UP	U(1)
#define DOWN	U(0)
16
17

/*******************************************************************************
18
19
20
 * Constants to identify the location of a memory region in a given memory
 * layout.
******************************************************************************/
21
22
#define TOP	U(0x1)
#define BOTTOM	U(0x0)
23

24
25
26
27
/*
 * The following are used for image state attributes.
 * Image can only be in one of the following state.
 */
28
29
30
31
32
33
#define IMAGE_STATE_RESET		U(0)
#define IMAGE_STATE_COPIED		U(1)
#define IMAGE_STATE_COPYING		U(2)
#define IMAGE_STATE_AUTHENTICATED	U(3)
#define IMAGE_STATE_EXECUTED		U(4)
#define IMAGE_STATE_INTERRUPTED		U(5)
34

Soby Mathew's avatar
Soby Mathew committed
35
36
#define IMAGE_ATTRIB_SKIP_LOADING	U(0x02)
#define IMAGE_ATTRIB_PLAT_SETUP		U(0x04)
37

Soby Mathew's avatar
Soby Mathew committed
38
#define INVALID_IMAGE_ID		U(0xFFFFFFFF)
39

40
41
42
/*******************************************************************************
 * Constants to indicate type of exception to the common exception handler.
 ******************************************************************************/
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#define SYNC_EXCEPTION_SP_EL0		U(0x0)
#define IRQ_SP_EL0			U(0x1)
#define FIQ_SP_EL0			U(0x2)
#define SERROR_SP_EL0			U(0x3)
#define SYNC_EXCEPTION_SP_ELX		U(0x4)
#define IRQ_SP_ELX			U(0x5)
#define FIQ_SP_ELX			U(0x6)
#define SERROR_SP_ELX			U(0x7)
#define SYNC_EXCEPTION_AARCH64		U(0x8)
#define IRQ_AARCH64			U(0x9)
#define FIQ_AARCH64			U(0xa)
#define SERROR_AARCH64			U(0xb)
#define SYNC_EXCEPTION_AARCH32		U(0xc)
#define IRQ_AARCH32			U(0xd)
#define FIQ_AARCH32			U(0xe)
#define SERROR_AARCH32			U(0xf)
59

60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
/*
 * Mapping to connect linker symbols from .ld.S with their counterparts
 * from .scat for the BL31 image
 */
#if defined(USE_ARM_LINK)
#define __BL31_END__			Load$$LR$$LR_END$$Base
#define __BSS_START__			Load$$LR$$LR_BSS$$Base
#define __BSS_END__			Load$$LR$$LR_BSS$$Limit
#define __BSS_SIZE__			Load$$LR$$LR_BSS$$Length
#define __COHERENT_RAM_START__		Load$$LR$$LR_COHERENT_RAM$$Base
#define __COHERENT_RAM_END_UNALIGNED__	Load$$__COHERENT_RAM_EPILOGUE_UNALIGNED__$$Base
#define __COHERENT_RAM_END__		Load$$LR$$LR_COHERENT_RAM$$Limit
#define __COHERENT_RAM_UNALIGNED_SIZE__	Load$$__COHERENT_RAM__$$Length
#define __CPU_OPS_START__		Load$$__CPU_OPS__$$Base
#define __CPU_OPS_END__			Load$$__CPU_OPS__$$Limit
#define __DATA_START__			Load$$__DATA__$$Base
#define __DATA_END__			Load$$__DATA__$$Limit
#define __GOT_START__			Load$$__GOT__$$Base
#define __GOT_END__			Load$$__GOT__$$Limit
#define __PERCPU_BAKERY_LOCK_START__	Load$$__BAKERY_LOCKS__$$Base
#define __PERCPU_BAKERY_LOCK_END__	Load$$__BAKERY_LOCKS_EPILOGUE__$$Base
#define __PMF_SVC_DESCS_START__		Load$$__PMF_SVC_DESCS__$$Base
#define __PMF_SVC_DESCS_END__		Load$$__PMF_SVC_DESCS__$$Limit
#define __PMF_TIMESTAMP_START__		Load$$__PMF_TIMESTAMP__$$Base
#define __PMF_TIMESTAMP_END__		Load$$__PER_CPU_TIMESTAMPS__$$Limit
#define __PMF_PERCPU_TIMESTAMP_END__	Load$$__PMF_TIMESTAMP_EPILOGUE__$$Base
#define __RELA_END__			Load$$__RELA__$$Limit
#define __RELA_START__			Load$$__RELA__$$Base
#define __RODATA_START__		Load$$__RODATA__$$Base
#define __RODATA_END__			Load$$__RODATA_EPILOGUE__$$Base
#define __RT_SVC_DESCS_START__		Load$$__RT_SVC_DESCS__$$Base
#define __RT_SVC_DESCS_END__		Load$$__RT_SVC_DESCS__$$Limit
#define __RW_START__			Load$$LR$$LR_RW_DATA$$Base
#define __RW_END__			Load$$LR$$LR_END$$Base
#define __SPM_SHIM_EXCEPTIONS_START__	Load$$__SPM_SHIM_EXCEPTIONS__$$Base
#define __SPM_SHIM_EXCEPTIONS_END__	Load$$__SPM_SHIM_EXCEPTIONS_EPILOGUE__$$Base
#define __STACKS_START__		Load$$__STACKS__$$Base
#define __STACKS_END__			Load$$__STACKS__$$Limit
#define __TEXT_START__			Load$$__TEXT__$$Base
#define __TEXT_END__			Load$$__TEXT_EPILOGUE__$$Base
#endif /* USE_ARM_LINK */

102
#ifndef __ASSEMBLY__
103

104
#include <stddef.h>
105
#include <stdint.h>
106

107
#include <lib/cassert.h>
108

109
110
111
112
/*
 * Declarations of linker defined symbols to help determine memory layout of
 * BL images
 */
113
#if SEPARATE_CODE_AND_RODATA
114
115
116
117
IMPORT_SYM(uintptr_t, __TEXT_START__,		BL_CODE_BASE);
IMPORT_SYM(uintptr_t, __TEXT_END__,		BL_CODE_END);
IMPORT_SYM(uintptr_t, __RODATA_START__,		BL_RO_DATA_BASE);
IMPORT_SYM(uintptr_t, __RODATA_END__,		BL_RO_DATA_END);
118
#else
119
120
IMPORT_SYM(uintptr_t, __RO_START__,		BL_CODE_BASE);
IMPORT_SYM(uintptr_t, __RO_END__,		BL_CODE_END);
121
122
#endif

123
#if defined(IMAGE_BL1)
124
IMPORT_SYM(uintptr_t, __BL1_ROM_END__,		BL1_ROM_END);
125

126
127
IMPORT_SYM(uintptr_t, __BL1_RAM_START__,	BL1_RAM_BASE);
IMPORT_SYM(uintptr_t, __BL1_RAM_END__,		BL1_RAM_LIMIT);
128
#elif defined(IMAGE_BL2)
129
IMPORT_SYM(uintptr_t, __BL2_END__,		BL2_END);
130
#elif defined(IMAGE_BL2U)
131
IMPORT_SYM(uintptr_t, __BL2U_END__,		BL2U_END);
132
#elif defined(IMAGE_BL31)
133
134
IMPORT_SYM(uintptr_t, __BL31_START__,		BL31_START);
IMPORT_SYM(uintptr_t, __BL31_END__,		BL31_END);
135
#elif defined(IMAGE_BL32)
136
IMPORT_SYM(uintptr_t, __BL32_END__,		BL32_END);
137
138
#endif /* IMAGE_BLX */

139
140
/* The following symbols are only exported from the BL2 at EL3 linker script. */
#if BL2_IN_XIP_MEM && defined(IMAGE_BL2)
141
IMPORT_SYM(uintptr_t, __BL2_ROM_END__,		BL2_ROM_END);
142

143
144
IMPORT_SYM(uintptr_t, __BL2_RAM_START__,	BL2_RAM_BASE);
IMPORT_SYM(uintptr_t, __BL2_RAM_END__,		BL2_RAM_END);
145
146
#endif /* BL2_IN_XIP_MEM */

147
148
149
150
151
152
153
/*
 * The next 2 constants identify the extents of the coherent memory region.
 * These addresses are used by the MMU setup code and therefore they must be
 * page-aligned.  It is the responsibility of the linker script to ensure that
 * __COHERENT_RAM_START__ and __COHERENT_RAM_END__ linker symbols refer to
 * page-aligned addresses.
 */
154
#if USE_COHERENT_MEM
155
156
IMPORT_SYM(uintptr_t, __COHERENT_RAM_START__,	BL_COHERENT_RAM_BASE);
IMPORT_SYM(uintptr_t, __COHERENT_RAM_END__,	BL_COHERENT_RAM_END);
157
158
#endif

159
160
161
162
/*******************************************************************************
 * Structure used for telling the next BL how much of a particular type of
 * memory is available for its use and how much is already used.
 ******************************************************************************/
163
typedef struct meminfo {
164
	uintptr_t total_base;
165
	size_t total_size;
166
} meminfo_t;
167

168
169
170
171
172
173
174
175
176
177
178
/*****************************************************************************
 * Image info binary provides information from the image loader that
 * can be used by the firmware to manage available trusted RAM.
 * More advanced firmware image formats can provide additional
 * information that enables optimization or greater flexibility in the
 * common firmware code
 *****************************************************************************/
typedef struct image_info {
	param_header_t h;
	uintptr_t image_base;   /* physical address of base of image */
	uint32_t image_size;    /* bytes read from image file */
179
	uint32_t image_max_size;
180
} image_info_t;
181

182
183
184
185
186
187
188
189
190
191
192
/*****************************************************************************
 * The image descriptor struct definition.
 *****************************************************************************/
typedef struct image_desc {
	/* Contains unique image id for the image. */
	unsigned int image_id;
	/*
	 * This member contains Image state information.
	 * Refer IMAGE_STATE_XXX defined above.
	 */
	unsigned int state;
193
	uint32_t copied_size;	/* image size copied in blocks */
194
195
	image_info_t image_info;
	entry_point_info_t ep_info;
196
197
} image_desc_t;

198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
/* BL image node in the BL image loading sequence */
typedef struct bl_load_info_node {
	unsigned int image_id;
	image_info_t *image_info;
	struct bl_load_info_node *next_load_info;
} bl_load_info_node_t;

/* BL image head node in the BL image loading sequence */
typedef struct bl_load_info {
	param_header_t h;
	bl_load_info_node_t *head;
} bl_load_info_t;

/* BL image node in the BL image execution sequence */
typedef struct bl_params_node {
	unsigned int image_id;
	image_info_t *image_info;
	entry_point_info_t *ep_info;
	struct bl_params_node *next_params_info;
} bl_params_node_t;

/*
 * BL image head node in the BL image execution sequence
 * It is also used to pass information to next BL image.
 */
typedef struct bl_params {
	param_header_t h;
	bl_params_node_t *head;
} bl_params_t;

228
229
230
/*******************************************************************************
 * Function & variable prototypes
 ******************************************************************************/
231
232
int load_auth_image(unsigned int image_id, image_info_t *image_data);

233
234
235
236
237
238
239
240
#if TRUSTED_BOARD_BOOT && defined(DYN_DISABLE_AUTH)
/*
 * API to dynamically disable authentication. Only meant for development
 * systems.
 */
void dyn_disable_auth(void);
#endif

241
242
243
extern const char build_message[];
extern const char version_string[];

244
void print_entry_point_info(const entry_point_info_t *ep_info);
Roberto Vargas's avatar
Roberto Vargas committed
245
uintptr_t page_align(uintptr_t value, unsigned dir);
246

247
248
249
250
251
struct mmap_region;

void setup_page_tables(const struct mmap_region *bl_regions,
			   const struct mmap_region *plat_regions);

252
253
void bl_handle_pauth(void);

254
255
#endif /*__ASSEMBLY__*/

256
#endif /* BL_COMMON_H */