bl_common.h 8 KB
Newer Older
1
/*
2
 * Copyright (c) 2013-2018, 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
9
 */

#ifndef __BL_COMMON_H__
#define __BL_COMMON_H__

10
11
#include <ep_info.h>
#include <param_header.h>
Soby Mathew's avatar
Soby Mathew committed
12
#include <utils_def.h>
13
14
15
16
17

#define UP	1
#define DOWN	0

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

24
25
26
27
28
29
30
31
32
33
34
/*
 * 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

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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
/*******************************************************************************
 * 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

60
#ifndef __ASSEMBLY__
61
#include <cassert.h>
62
#include <stddef.h>
63
#include <stdint.h>
64
#include <types.h>
65
#include <utils_def.h> /* To retain compatibility */
66

67

68
69
70
71
/*
 * Declarations of linker defined symbols to help determine memory layout of
 * BL images
 */
72
#if SEPARATE_CODE_AND_RODATA
73
74
75
76
IMPORT_SYM(unsigned long, __TEXT_START__,	BL_CODE_BASE);
IMPORT_SYM(unsigned long, __TEXT_END__,		BL_CODE_END);
IMPORT_SYM(unsigned long, __RODATA_START__,	BL_RO_DATA_BASE);
IMPORT_SYM(unsigned long, __RODATA_END__,	BL_RO_DATA_END);
77
#else
78
79
IMPORT_SYM(unsigned long, __RO_START__,		BL_CODE_BASE);
IMPORT_SYM(unsigned long, __RO_END__,		BL_CODE_END);
80
81
#endif

82
#if defined(IMAGE_BL2)
83
IMPORT_SYM(unsigned long, __BL2_END__,		BL2_END);
84
#elif defined(IMAGE_BL2U)
85
IMPORT_SYM(unsigned long, __BL2U_END__,		BL2U_END);
86
#elif defined(IMAGE_BL31)
87
IMPORT_SYM(unsigned long, __BL31_END__,		BL31_END);
88
#elif defined(IMAGE_BL32)
89
IMPORT_SYM(unsigned long, __BL32_END__,		BL32_END);
90
91
#endif /* IMAGE_BLX */

92
93
94
95
96
97
98
/*
 * 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.
 */
99
#if USE_COHERENT_MEM
100
101
IMPORT_SYM(unsigned long, __COHERENT_RAM_START__,	BL_COHERENT_RAM_BASE);
IMPORT_SYM(unsigned long, __COHERENT_RAM_END__,		BL_COHERENT_RAM_END);
102
103
#endif

104
105
106
107
/*******************************************************************************
 * 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.
 ******************************************************************************/
108
typedef struct meminfo {
109
	uintptr_t total_base;
110
	size_t total_size;
111
#if !LOAD_IMAGE_V2
112
	uintptr_t free_base;
113
	size_t free_size;
114
#endif
115
} meminfo_t;
116

117
118
119
120
121
122
123
124
125
126
127
/*****************************************************************************
 * 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 */
128
129
130
#if LOAD_IMAGE_V2
	uint32_t image_max_size;
#endif
131
} image_info_t;
132

133
134
135
136
137
138
139
140
141
142
143
/*****************************************************************************
 * 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;
144
	uint32_t copied_size;	/* image size copied in blocks */
145
146
	image_info_t image_info;
	entry_point_info_t ep_info;
147
148
} image_desc_t;

149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
#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 */

182
183
184
/*******************************************************************************
 * 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
185
 * populated only if BL2 detects its presence. A pointer to a structure of this
186
 * type should be passed in X0 to BL31's cold boot entrypoint.
187
 *
188
 * Use of this structure and the X0 parameter is not mandatory: the BL31
189
 * platform code can use other mechanisms to provide the necessary information
190
 * about BL32 and BL33 to the common and SPD code.
191
 *
192
193
 * 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
194
 * indicated by the respective image_info pointers being zero.
195
 ******************************************************************************/
196
197
198
199
200
201
202
203
204
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;

205
#endif /* LOAD_IMAGE_V2 */
206

207
208
209
/*******************************************************************************
 * Function & variable prototypes
 ******************************************************************************/
Daniel Boulby's avatar
Daniel Boulby committed
210
size_t get_image_size(unsigned int image_id);
211

212
213
214
int is_mem_free(uintptr_t free_base, size_t free_size,
		uintptr_t addr, size_t size);

215
216
217
218
219
220
#if LOAD_IMAGE_V2

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

#else

221
int load_image(meminfo_t *mem_layout,
222
	       unsigned int image_id,
223
	       uintptr_t image_base,
224
225
	       image_info_t *image_data,
	       entry_point_info_t *entry_point_info);
226
int load_auth_image(meminfo_t *mem_layout,
227
		    unsigned int image_id,
228
229
230
		    uintptr_t image_base,
		    image_info_t *image_data,
		    entry_point_info_t *entry_point_info);
231
232
void reserve_mem(uintptr_t *free_base, size_t *free_size,
		uintptr_t addr, size_t size);
233

234
235
#endif /* LOAD_IMAGE_V2 */

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

244
245
246
extern const char build_message[];
extern const char version_string[];

247
void print_entry_point_info(const entry_point_info_t *ep_info);
Roberto Vargas's avatar
Roberto Vargas committed
248
uintptr_t page_align(uintptr_t value, unsigned dir);
249

250
251
252
#endif /*__ASSEMBLY__*/

#endif /* __BL_COMMON_H__ */