bl_common.h 13 KB
Newer Older
1
/*
2
 * Copyright (c) 2013-2016, ARM Limited and Contributors. All rights reserved.
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * Redistributions of source code must retain the above copyright notice, this
 * list of conditions and the following disclaimer.
 *
 * Redistributions in binary form must reproduce the above copyright notice,
 * this list of conditions and the following disclaimer in the documentation
 * and/or other materials provided with the distribution.
 *
 * Neither the name of ARM nor the names of its contributors may be used
 * to endorse or promote products derived from this software without specific
 * prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef __BL_COMMON_H__
#define __BL_COMMON_H__

34
35
#define SECURE		0x0
#define NON_SECURE	0x1
36
#define sec_state_is_valid(s) (((s) == SECURE) || ((s) == NON_SECURE))
37
38
39
40
41

#define UP	1
#define DOWN	0

/*******************************************************************************
42
43
44
45
46
 * Constants to identify the location of a memory region in a given memory
 * layout.
******************************************************************************/
#define TOP	0x1
#define BOTTOM	!TOP
47

48
49
/*******************************************************************************
 * Constants that allow assembler code to access members of and the
50
 * 'entry_point_info' structure at their correct offsets.
51
 ******************************************************************************/
52
#define ENTRY_POINT_INFO_PC_OFFSET	0x08
53
54
55
#ifdef AARCH32
#define ENTRY_POINT_INFO_ARGS_OFFSET	0x10
#else
56
#define ENTRY_POINT_INFO_ARGS_OFFSET	0x18
57
#endif
58

59
60
61
/* The following are used to set/get image attributes. */
#define PARAM_EP_SECURITY_MASK		(0x1)

62
63
64
65
#define GET_SECURITY_STATE(x) (x & PARAM_EP_SECURITY_MASK)
#define SET_SECURITY_STATE(x, security) \
			((x) = ((x) & ~PARAM_EP_SECURITY_MASK) | (security))

66
67
68
69
70
71
72
73
74
75
76
77

/*
 * The following are used for image state attributes.
 * Image can only be in one of the following state.
 */
#define IMAGE_STATE_RESET			0
#define IMAGE_STATE_COPIED			1
#define IMAGE_STATE_COPYING			2
#define IMAGE_STATE_AUTHENTICATED		3
#define IMAGE_STATE_EXECUTED			4
#define IMAGE_STATE_INTERRUPTED			5

78
79
80
81
82
83
84
85
86
87
88
89
#define EP_EE_MASK	0x2
#define EP_EE_LITTLE	0x0
#define EP_EE_BIG	0x2
#define EP_GET_EE(x) (x & EP_EE_MASK)
#define EP_SET_EE(x, ee) ((x) = ((x) & ~EP_EE_MASK) | (ee))

#define EP_ST_MASK	0x4
#define EP_ST_DISABLE	0x0
#define EP_ST_ENABLE	0x4
#define EP_GET_ST(x) (x & EP_ST_MASK)
#define EP_SET_ST(x, ee) ((x) = ((x) & ~EP_ST_MASK) | (ee))

90
91
92
93
94
95
#define EP_EXE_MASK	0x8
#define NON_EXECUTABLE	0x0
#define EXECUTABLE	0x8
#define EP_GET_EXE(x) (x & EP_EXE_MASK)
#define EP_SET_EXE(x, ee) ((x) = ((x) & ~EP_EXE_MASK) | (ee))

96
97
98
99
100
#define EP_FIRST_EXE_MASK	0x10
#define EP_FIRST_EXE		0x10
#define EP_GET_FIRST_EXE(x) ((x) & EP_FIRST_EXE_MASK)
#define EP_SET_FIRST_EXE(x, ee) ((x) = ((x) & ~EP_FIRST_EXE_MASK) | (ee))

101
102
103
#define PARAM_EP		0x01
#define PARAM_IMAGE_BINARY	0x02
#define PARAM_BL31		0x03
104
105
#define PARAM_BL_LOAD_INFO	0x04
#define PARAM_BL_PARAMS		0x05
106
#define PARAM_PSCI_LIB_ARGS	0x06
107
108
109

#define IMAGE_ATTRIB_SKIP_LOADING	0x02
#define IMAGE_ATTRIB_PLAT_SETUP		0x04
110

111
#define VERSION_1	0x01
112
#define VERSION_2	0x02
113

114
115
#define INVALID_IMAGE_ID		(0xFFFFFFFF)

116
117
118
119
120
121
122
#define SET_PARAM_HEAD(_p, _type, _ver, _attr) do { \
	(_p)->h.type = (uint8_t)(_type); \
	(_p)->h.version = (uint8_t)(_ver); \
	(_p)->h.size = (uint16_t)sizeof(*_p); \
	(_p)->h.attr = (uint32_t)(_attr) ; \
	} while (0)

123
124
125
126
127
128
129
130
/* Following is used for populating structure members statically. */
#define SET_STATIC_PARAM_HEAD(_p, _type, _ver, _p_type, _attr)	\
	._p.h.type = (uint8_t)(_type), \
	._p.h.version = (uint8_t)(_ver), \
	._p.h.size = (uint16_t)sizeof(_p_type), \
	._p.h.attr = (uint32_t)(_attr)


131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
/*******************************************************************************
 * Constants to indicate type of exception to the common exception handler.
 ******************************************************************************/
#define SYNC_EXCEPTION_SP_EL0		0x0
#define IRQ_SP_EL0			0x1
#define FIQ_SP_EL0			0x2
#define SERROR_SP_EL0			0x3
#define SYNC_EXCEPTION_SP_ELX		0x4
#define IRQ_SP_ELX			0x5
#define FIQ_SP_ELX			0x6
#define SERROR_SP_ELX			0x7
#define SYNC_EXCEPTION_AARCH64		0x8
#define IRQ_AARCH64			0x9
#define FIQ_AARCH64			0xa
#define SERROR_AARCH64			0xb
#define SYNC_EXCEPTION_AARCH32		0xc
#define IRQ_AARCH32			0xd
#define FIQ_AARCH32			0xe
#define SERROR_AARCH32			0xf

151
#ifndef __ASSEMBLY__
152
#include <cdefs.h> /* For __dead2 */
153
#include <cassert.h>
154
#include <stdint.h>
155
#include <stddef.h>
156
#include <types.h>
157
#include <utils.h> /* To retain compatibility */
158

159
160
161
162
/*
 * Declarations of linker defined symbols to help determine memory layout of
 * BL images
 */
163
#if SEPARATE_CODE_AND_RODATA
164
165
166
167
extern uintptr_t __TEXT_START__;
extern uintptr_t __TEXT_END__;
extern uintptr_t __RODATA_START__;
extern uintptr_t __RODATA_END__;
168
#else
169
170
extern uintptr_t __RO_START__;
extern uintptr_t __RO_END__;
171
172
#endif

173
#if IMAGE_BL2
174
extern uintptr_t __BL2_END__;
175
#elif IMAGE_BL2U
176
extern uintptr_t __BL2U_END__;
177
#elif IMAGE_BL31
178
extern uintptr_t __BL31_END__;
179
#elif IMAGE_BL32
180
extern uintptr_t __BL32_END__;
181
182
183
#endif /* IMAGE_BLX */

#if USE_COHERENT_MEM
184
185
extern uintptr_t __COHERENT_RAM_START__;
extern uintptr_t __COHERENT_RAM_END__;
186
187
188
#endif


189
190
191
192
/*******************************************************************************
 * 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.
 ******************************************************************************/
193
typedef struct meminfo {
194
	uintptr_t total_base;
195
	size_t total_size;
196
#if !LOAD_IMAGE_V2
197
	uintptr_t free_base;
198
	size_t free_size;
199
#endif
200
} meminfo_t;
201

202
typedef struct aapcs64_params {
203
204
205
206
207
208
209
210
	u_register_t arg0;
	u_register_t arg1;
	u_register_t arg2;
	u_register_t arg3;
	u_register_t arg4;
	u_register_t arg5;
	u_register_t arg6;
	u_register_t arg7;
211
} aapcs64_params_t;
212

213
214
215
216
217
218
219
typedef struct aapcs32_params {
	u_register_t arg0;
	u_register_t arg1;
	u_register_t arg2;
	u_register_t arg3;
} aapcs32_params_t;

220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
/***************************************************************************
 * This structure provides version information and the size of the
 * structure, attributes for the structure it represents
 ***************************************************************************/
typedef struct param_header {
	uint8_t type;		/* type of the structure */
	uint8_t version;    /* version of this structure */
	uint16_t size;      /* size of this structure in bytes */
	uint32_t attr;      /* attributes: unused bits SBZ */
} param_header_t;

/*****************************************************************************
 * This structure represents the superset of information needed while
 * switching exception levels. The only two mechanisms to do so are
 * ERET & SMC. Security state is indicated using bit zero of header
 * attribute
236
237
238
 * NOTE: BL1 expects entrypoint followed by spsr at an offset from the start
 * of this structure defined by the macro `ENTRY_POINT_INFO_PC_OFFSET` while
 * processing SMC to jump to BL31.
239
240
241
242
243
 *****************************************************************************/
typedef struct entry_point_info {
	param_header_t h;
	uintptr_t pc;
	uint32_t spsr;
244
245
246
#ifdef AARCH32
	aapcs32_params_t args;
#else
247
	aapcs64_params_t args;
248
#endif
249
250
251
252
253
254
255
256
257
258
259
260
261
} entry_point_info_t;

/*****************************************************************************
 * 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 */
262
263
264
#if LOAD_IMAGE_V2
	uint32_t image_max_size;
#endif
265
} image_info_t;
266

267
268
269
270
271
272
273
274
275
276
277
/*****************************************************************************
 * 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;
278
	uint32_t copied_size;	/* image size copied in blocks */
279
280
	image_info_t image_info;
	entry_point_info_t ep_info;
281
282
} image_desc_t;

283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
#if LOAD_IMAGE_V2
/* 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;

#else /* LOAD_IMAGE_V2 */

316
317
318
/*******************************************************************************
 * This structure represents the superset of information that can be passed to
 * BL31 e.g. while passing control to it from BL2. The BL32 parameters will be
319
 * populated only if BL2 detects its presence. A pointer to a structure of this
320
 * type should be passed in X0 to BL31's cold boot entrypoint.
321
 *
322
 * Use of this structure and the X0 parameter is not mandatory: the BL31
323
 * platform code can use other mechanisms to provide the necessary information
324
 * about BL32 and BL33 to the common and SPD code.
325
 *
326
327
 * BL31 image information is mandatory if this structure is used. If either of
 * the optional BL32 and BL33 image information is not provided, this is
328
 * indicated by the respective image_info pointers being zero.
329
 ******************************************************************************/
330
331
332
333
334
335
336
337
338
typedef struct bl31_params {
	param_header_t h;
	image_info_t *bl31_image_info;
	entry_point_info_t *bl32_ep_info;
	image_info_t *bl32_image_info;
	entry_point_info_t *bl33_ep_info;
	image_info_t *bl33_image_info;
} bl31_params_t;

339
#endif /* LOAD_IMAGE_V2 */
340

341
/*
342
 * Compile time assertions related to the 'entry_point_info' structure to
343
344
345
 * ensure that the assembler and the compiler view of the offsets of
 * the structure members is the same.
 */
346
347
348
CASSERT(ENTRY_POINT_INFO_PC_OFFSET ==
		__builtin_offsetof(entry_point_info_t, pc), \
		assert_BL31_pc_offset_mismatch);
349

350
351
CASSERT(ENTRY_POINT_INFO_ARGS_OFFSET == \
		__builtin_offsetof(entry_point_info_t, args), \
352
353
		assert_BL31_args_offset_mismatch);

354
CASSERT(sizeof(uintptr_t) ==
355
356
		__builtin_offsetof(entry_point_info_t, spsr) - \
		__builtin_offsetof(entry_point_info_t, pc), \
357
358
		assert_entrypoint_and_spsr_should_be_adjacent);

359
360
361
/*******************************************************************************
 * Function & variable prototypes
 ******************************************************************************/
362
size_t image_size(unsigned int image_id);
363

364
365
366
int is_mem_free(uintptr_t free_base, size_t free_size,
		uintptr_t addr, size_t size);

367
368
369
370
371
372
373
374
#if LOAD_IMAGE_V2

int load_image(unsigned int image_id, image_info_t *image_data);
int load_auth_image(unsigned int image_id, image_info_t *image_data);

#else

uintptr_t page_align(uintptr_t, unsigned);
375
int load_image(meminfo_t *mem_layout,
376
	       unsigned int image_id,
377
	       uintptr_t image_base,
378
379
	       image_info_t *image_data,
	       entry_point_info_t *entry_point_info);
380
int load_auth_image(meminfo_t *mem_layout,
381
		    unsigned int image_id,
382
383
384
		    uintptr_t image_base,
		    image_info_t *image_data,
		    entry_point_info_t *entry_point_info);
385
386
void reserve_mem(uintptr_t *free_base, size_t *free_size,
		uintptr_t addr, size_t size);
387

388
389
390
391
392
#endif /* LOAD_IMAGE_V2 */

extern const char build_message[];
extern const char version_string[];

393
394
void print_entry_point_info(const entry_point_info_t *ep_info);

395
396
397
#endif /*__ASSEMBLY__*/

#endif /* __BL_COMMON_H__ */