2 * Copyright (c) 2013-2018, ARM Limited and Contributors. All rights reserved.
4 * SPDX-License-Identifier: BSD-3-Clause
11 #include <param_header.h>
12 #include <utils_def.h>
17 /*******************************************************************************
18 * Constants to identify the location of a memory region in a given memory
20 ******************************************************************************/
25 * The following are used for image state attributes.
26 * Image can only be in one of the following state.
28 #define IMAGE_STATE_RESET U(0)
29 #define IMAGE_STATE_COPIED U(1)
30 #define IMAGE_STATE_COPYING U(2)
31 #define IMAGE_STATE_AUTHENTICATED U(3)
32 #define IMAGE_STATE_EXECUTED U(4)
33 #define IMAGE_STATE_INTERRUPTED U(5)
35 #define IMAGE_ATTRIB_SKIP_LOADING U(0x02)
36 #define IMAGE_ATTRIB_PLAT_SETUP U(0x04)
38 #define INVALID_IMAGE_ID U(0xFFFFFFFF)
40 /*******************************************************************************
41 * Constants to indicate type of exception to the common exception handler.
42 ******************************************************************************/
43 #define SYNC_EXCEPTION_SP_EL0 U(0x0)
44 #define IRQ_SP_EL0 U(0x1)
45 #define FIQ_SP_EL0 U(0x2)
46 #define SERROR_SP_EL0 U(0x3)
47 #define SYNC_EXCEPTION_SP_ELX U(0x4)
48 #define IRQ_SP_ELX U(0x5)
49 #define FIQ_SP_ELX U(0x6)
50 #define SERROR_SP_ELX U(0x7)
51 #define SYNC_EXCEPTION_AARCH64 U(0x8)
52 #define IRQ_AARCH64 U(0x9)
53 #define FIQ_AARCH64 U(0xa)
54 #define SERROR_AARCH64 U(0xb)
55 #define SYNC_EXCEPTION_AARCH32 U(0xc)
56 #define IRQ_AARCH32 U(0xd)
57 #define FIQ_AARCH32 U(0xe)
58 #define SERROR_AARCH32 U(0xf)
64 #include <utils_def.h> /* To retain compatibility */
68 * Declarations of linker defined symbols to help determine memory layout of
71 #if SEPARATE_CODE_AND_RODATA
72 IMPORT_SYM(unsigned long, __TEXT_START__
, BL_CODE_BASE
);
73 IMPORT_SYM(unsigned long, __TEXT_END__
, BL_CODE_END
);
74 IMPORT_SYM(unsigned long, __RODATA_START__
, BL_RO_DATA_BASE
);
75 IMPORT_SYM(unsigned long, __RODATA_END__
, BL_RO_DATA_END
);
77 IMPORT_SYM(unsigned long, __RO_START__
, BL_CODE_BASE
);
78 IMPORT_SYM(unsigned long, __RO_END__
, BL_CODE_END
);
81 #if defined(IMAGE_BL2)
82 IMPORT_SYM(unsigned long, __BL2_END__
, BL2_END
);
83 #elif defined(IMAGE_BL2U)
84 IMPORT_SYM(unsigned long, __BL2U_END__
, BL2U_END
);
85 #elif defined(IMAGE_BL31)
86 IMPORT_SYM(unsigned long, __BL31_START__
, BL31_START
);
87 IMPORT_SYM(unsigned long, __BL31_END__
, BL31_END
);
88 #elif defined(IMAGE_BL32)
89 IMPORT_SYM(unsigned long, __BL32_END__
, BL32_END
);
90 #endif /* IMAGE_BLX */
93 * The next 2 constants identify the extents of the coherent memory region.
94 * These addresses are used by the MMU setup code and therefore they must be
95 * page-aligned. It is the responsibility of the linker script to ensure that
96 * __COHERENT_RAM_START__ and __COHERENT_RAM_END__ linker symbols refer to
97 * page-aligned addresses.
100 IMPORT_SYM(unsigned long, __COHERENT_RAM_START__
, BL_COHERENT_RAM_BASE
);
101 IMPORT_SYM(unsigned long, __COHERENT_RAM_END__
, BL_COHERENT_RAM_END
);
104 /*******************************************************************************
105 * Structure used for telling the next BL how much of a particular type of
106 * memory is available for its use and how much is already used.
107 ******************************************************************************/
108 typedef struct meminfo
{
109 uintptr_t total_base
;
113 /*****************************************************************************
114 * Image info binary provides information from the image loader that
115 * can be used by the firmware to manage available trusted RAM.
116 * More advanced firmware image formats can provide additional
117 * information that enables optimization or greater flexibility in the
118 * common firmware code
119 *****************************************************************************/
120 typedef struct image_info
{
122 uintptr_t image_base
; /* physical address of base of image */
123 uint32_t image_size
; /* bytes read from image file */
124 uint32_t image_max_size
;
127 /*****************************************************************************
128 * The image descriptor struct definition.
129 *****************************************************************************/
130 typedef struct image_desc
{
131 /* Contains unique image id for the image. */
132 unsigned int image_id
;
134 * This member contains Image state information.
135 * Refer IMAGE_STATE_XXX defined above.
138 uint32_t copied_size
; /* image size copied in blocks */
139 image_info_t image_info
;
140 entry_point_info_t ep_info
;
143 /* BL image node in the BL image loading sequence */
144 typedef struct bl_load_info_node
{
145 unsigned int image_id
;
146 image_info_t
*image_info
;
147 struct bl_load_info_node
*next_load_info
;
148 } bl_load_info_node_t
;
150 /* BL image head node in the BL image loading sequence */
151 typedef struct bl_load_info
{
153 bl_load_info_node_t
*head
;
156 /* BL image node in the BL image execution sequence */
157 typedef struct bl_params_node
{
158 unsigned int image_id
;
159 image_info_t
*image_info
;
160 entry_point_info_t
*ep_info
;
161 struct bl_params_node
*next_params_info
;
165 * BL image head node in the BL image execution sequence
166 * It is also used to pass information to next BL image.
168 typedef struct bl_params
{
170 bl_params_node_t
*head
;
173 /*******************************************************************************
174 * Function & variable prototypes
175 ******************************************************************************/
176 size_t get_image_size(unsigned int image_id
);
178 int is_mem_free(uintptr_t free_base
, size_t free_size
,
179 uintptr_t addr
, size_t size
);
181 int load_auth_image(unsigned int image_id
, image_info_t
*image_data
);
183 #if TRUSTED_BOARD_BOOT && defined(DYN_DISABLE_AUTH)
185 * API to dynamically disable authentication. Only meant for development
188 void dyn_disable_auth(void);
191 extern const char build_message
[];
192 extern const char version_string
[];
194 void print_entry_point_info(const entry_point_info_t
*ep_info
);
195 uintptr_t page_align(uintptr_t value
, unsigned dir
);
199 void setup_page_tables(const struct mmap_region
*bl_regions
,
200 const struct mmap_region
*plat_regions
);
202 #endif /*__ASSEMBLY__*/
204 #endif /* BL_COMMON_H */