bl_common.h 8.62 KB
Newer Older
1
/*
2
 * Copyright (c) 2013-2017, 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
#include <ep_info.h>
#include <param_header.h>
36
37
38
39
40

#define UP	1
#define DOWN	0

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

47
48
49
50
51
52
53
54
55
56
57
/*
 * 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

58
59
#define IMAGE_ATTRIB_SKIP_LOADING	0x02
#define IMAGE_ATTRIB_PLAT_SETUP		0x04
60

61
62
#define INVALID_IMAGE_ID		(0xFFFFFFFF)

63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
/*******************************************************************************
 * 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

83
#ifndef __ASSEMBLY__
84
#include <cassert.h>
85
#include <stddef.h>
86
#include <stdint.h>
87
#include <types.h>
88
#include <utils.h> /* To retain compatibility */
89

90
91
92
93
/*
 * Declarations of linker defined symbols to help determine memory layout of
 * BL images
 */
94
#if SEPARATE_CODE_AND_RODATA
95
96
97
98
extern uintptr_t __TEXT_START__;
extern uintptr_t __TEXT_END__;
extern uintptr_t __RODATA_START__;
extern uintptr_t __RODATA_END__;
99
#else
100
101
extern uintptr_t __RO_START__;
extern uintptr_t __RO_END__;
102
103
#endif

104
#if defined(IMAGE_BL2)
105
extern uintptr_t __BL2_END__;
106
#elif defined(IMAGE_BL2U)
107
extern uintptr_t __BL2U_END__;
108
#elif defined(IMAGE_BL31)
109
extern uintptr_t __BL31_END__;
110
#elif defined(IMAGE_BL32)
111
extern uintptr_t __BL32_END__;
112
113
114
#endif /* IMAGE_BLX */

#if USE_COHERENT_MEM
115
116
extern uintptr_t __COHERENT_RAM_START__;
extern uintptr_t __COHERENT_RAM_END__;
117
118
#endif

119
120
121
122
/*******************************************************************************
 * 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.
 ******************************************************************************/
123
typedef struct meminfo {
124
	uintptr_t total_base;
125
	size_t total_size;
126
#if !LOAD_IMAGE_V2
127
	uintptr_t free_base;
128
	size_t free_size;
129
#endif
130
} meminfo_t;
131

132
133
134
135
136
137
138
139
140
141
142
/*****************************************************************************
 * 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 */
143
144
145
#if LOAD_IMAGE_V2
	uint32_t image_max_size;
#endif
146
} image_info_t;
147

148
149
150
151
152
153
154
155
156
157
158
/*****************************************************************************
 * 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;
159
	uint32_t copied_size;	/* image size copied in blocks */
160
161
	image_info_t image_info;
	entry_point_info_t ep_info;
162
163
} image_desc_t;

164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
#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 */

197
198
199
/*******************************************************************************
 * 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
200
 * populated only if BL2 detects its presence. A pointer to a structure of this
201
 * type should be passed in X0 to BL31's cold boot entrypoint.
202
 *
203
 * Use of this structure and the X0 parameter is not mandatory: the BL31
204
 * platform code can use other mechanisms to provide the necessary information
205
 * about BL32 and BL33 to the common and SPD code.
206
 *
207
208
 * 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
209
 * indicated by the respective image_info pointers being zero.
210
 ******************************************************************************/
211
212
213
214
215
216
217
218
219
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;

220
#endif /* LOAD_IMAGE_V2 */
221

222
223
224
/*******************************************************************************
 * Function & variable prototypes
 ******************************************************************************/
225
size_t image_size(unsigned int image_id);
226

227
228
229
int is_mem_free(uintptr_t free_base, size_t free_size,
		uintptr_t addr, size_t size);

230
231
232
233
234
235
236
237
#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);
238
int load_image(meminfo_t *mem_layout,
239
	       unsigned int image_id,
240
	       uintptr_t image_base,
241
242
	       image_info_t *image_data,
	       entry_point_info_t *entry_point_info);
243
int load_auth_image(meminfo_t *mem_layout,
244
		    unsigned int image_id,
245
246
247
		    uintptr_t image_base,
		    image_info_t *image_data,
		    entry_point_info_t *entry_point_info);
248
249
void reserve_mem(uintptr_t *free_base, size_t *free_size,
		uintptr_t addr, size_t size);
250

251
252
253
254
255
#endif /* LOAD_IMAGE_V2 */

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

256
257
void print_entry_point_info(const entry_point_info_t *ep_info);

258
259
260
#endif /*__ASSEMBLY__*/

#endif /* __BL_COMMON_H__ */