1 /* 2 * Copyright (c) 2013-2017, ARM Limited and Contributors. All rights reserved. 3 * 4 * SPDX-License-Identifier: BSD-3-Clause 5 */ 6 7 #ifndef __BL_COMMON_H__ 8 #define __BL_COMMON_H__ 9 10 #include <ep_info.h> 11 #include <param_header.h> 12 13 #define UP 1 14 #define DOWN 0 15 16 /******************************************************************************* 17 * Constants to identify the location of a memory region in a given memory 18 * layout. 19 ******************************************************************************/ 20 #define TOP 0x1 21 #define BOTTOM !TOP 22 23 /* 24 * The following are used for image state attributes. 25 * Image can only be in one of the following state. 26 */ 27 #define IMAGE_STATE_RESET 0 28 #define IMAGE_STATE_COPIED 1 29 #define IMAGE_STATE_COPYING 2 30 #define IMAGE_STATE_AUTHENTICATED 3 31 #define IMAGE_STATE_EXECUTED 4 32 #define IMAGE_STATE_INTERRUPTED 5 33 34 #define IMAGE_ATTRIB_SKIP_LOADING 0x02 35 #define IMAGE_ATTRIB_PLAT_SETUP 0x04 36 37 #define INVALID_IMAGE_ID (0xFFFFFFFF) 38 39 /******************************************************************************* 40 * Constants to indicate type of exception to the common exception handler. 41 ******************************************************************************/ 42 #define SYNC_EXCEPTION_SP_EL0 0x0 43 #define IRQ_SP_EL0 0x1 44 #define FIQ_SP_EL0 0x2 45 #define SERROR_SP_EL0 0x3 46 #define SYNC_EXCEPTION_SP_ELX 0x4 47 #define IRQ_SP_ELX 0x5 48 #define FIQ_SP_ELX 0x6 49 #define SERROR_SP_ELX 0x7 50 #define SYNC_EXCEPTION_AARCH64 0x8 51 #define IRQ_AARCH64 0x9 52 #define FIQ_AARCH64 0xa 53 #define SERROR_AARCH64 0xb 54 #define SYNC_EXCEPTION_AARCH32 0xc 55 #define IRQ_AARCH32 0xd 56 #define FIQ_AARCH32 0xe 57 #define SERROR_AARCH32 0xf 58 59 #ifndef __ASSEMBLY__ 60 #include <cassert.h> 61 #include <stddef.h> 62 #include <stdint.h> 63 #include <types.h> 64 #include <utils_def.h> /* To retain compatibility */ 65 66 /* 67 * Declarations of linker defined symbols to help determine memory layout of 68 * BL images 69 */ 70 #if SEPARATE_CODE_AND_RODATA 71 extern uintptr_t __TEXT_START__; 72 extern uintptr_t __TEXT_END__; 73 extern uintptr_t __RODATA_START__; 74 extern uintptr_t __RODATA_END__; 75 #else 76 extern uintptr_t __RO_START__; 77 extern uintptr_t __RO_END__; 78 #endif 79 80 #if defined(IMAGE_BL2) 81 extern uintptr_t __BL2_END__; 82 #elif defined(IMAGE_BL2U) 83 extern uintptr_t __BL2U_END__; 84 #elif defined(IMAGE_BL31) 85 extern uintptr_t __BL31_END__; 86 #elif defined(IMAGE_BL32) 87 extern uintptr_t __BL32_END__; 88 #endif /* IMAGE_BLX */ 89 90 #if USE_COHERENT_MEM 91 extern uintptr_t __COHERENT_RAM_START__; 92 extern uintptr_t __COHERENT_RAM_END__; 93 #endif 94 95 /******************************************************************************* 96 * Structure used for telling the next BL how much of a particular type of 97 * memory is available for its use and how much is already used. 98 ******************************************************************************/ 99 typedef struct meminfo { 100 uintptr_t total_base; 101 size_t total_size; 102 #if !LOAD_IMAGE_V2 103 uintptr_t free_base; 104 size_t free_size; 105 #endif 106 } meminfo_t; 107 108 /***************************************************************************** 109 * Image info binary provides information from the image loader that 110 * can be used by the firmware to manage available trusted RAM. 111 * More advanced firmware image formats can provide additional 112 * information that enables optimization or greater flexibility in the 113 * common firmware code 114 *****************************************************************************/ 115 typedef struct image_info { 116 param_header_t h; 117 uintptr_t image_base; /* physical address of base of image */ 118 uint32_t image_size; /* bytes read from image file */ 119 #if LOAD_IMAGE_V2 120 uint32_t image_max_size; 121 #endif 122 } image_info_t; 123 124 /***************************************************************************** 125 * The image descriptor struct definition. 126 *****************************************************************************/ 127 typedef struct image_desc { 128 /* Contains unique image id for the image. */ 129 unsigned int image_id; 130 /* 131 * This member contains Image state information. 132 * Refer IMAGE_STATE_XXX defined above. 133 */ 134 unsigned int state; 135 uint32_t copied_size; /* image size copied in blocks */ 136 image_info_t image_info; 137 entry_point_info_t ep_info; 138 } image_desc_t; 139 140 #if LOAD_IMAGE_V2 141 /* BL image node in the BL image loading sequence */ 142 typedef struct bl_load_info_node { 143 unsigned int image_id; 144 image_info_t *image_info; 145 struct bl_load_info_node *next_load_info; 146 } bl_load_info_node_t; 147 148 /* BL image head node in the BL image loading sequence */ 149 typedef struct bl_load_info { 150 param_header_t h; 151 bl_load_info_node_t *head; 152 } bl_load_info_t; 153 154 /* BL image node in the BL image execution sequence */ 155 typedef struct bl_params_node { 156 unsigned int image_id; 157 image_info_t *image_info; 158 entry_point_info_t *ep_info; 159 struct bl_params_node *next_params_info; 160 } bl_params_node_t; 161 162 /* 163 * BL image head node in the BL image execution sequence 164 * It is also used to pass information to next BL image. 165 */ 166 typedef struct bl_params { 167 param_header_t h; 168 bl_params_node_t *head; 169 } bl_params_t; 170 171 #else /* LOAD_IMAGE_V2 */ 172 173 /******************************************************************************* 174 * This structure represents the superset of information that can be passed to 175 * BL31 e.g. while passing control to it from BL2. The BL32 parameters will be 176 * populated only if BL2 detects its presence. A pointer to a structure of this 177 * type should be passed in X0 to BL31's cold boot entrypoint. 178 * 179 * Use of this structure and the X0 parameter is not mandatory: the BL31 180 * platform code can use other mechanisms to provide the necessary information 181 * about BL32 and BL33 to the common and SPD code. 182 * 183 * BL31 image information is mandatory if this structure is used. If either of 184 * the optional BL32 and BL33 image information is not provided, this is 185 * indicated by the respective image_info pointers being zero. 186 ******************************************************************************/ 187 typedef struct bl31_params { 188 param_header_t h; 189 image_info_t *bl31_image_info; 190 entry_point_info_t *bl32_ep_info; 191 image_info_t *bl32_image_info; 192 entry_point_info_t *bl33_ep_info; 193 image_info_t *bl33_image_info; 194 } bl31_params_t; 195 196 #endif /* LOAD_IMAGE_V2 */ 197 198 /******************************************************************************* 199 * Function & variable prototypes 200 ******************************************************************************/ 201 size_t image_size(unsigned int image_id); 202 203 int is_mem_free(uintptr_t free_base, size_t free_size, 204 uintptr_t addr, size_t size); 205 206 #if LOAD_IMAGE_V2 207 208 int load_image(unsigned int image_id, image_info_t *image_data); 209 int load_auth_image(unsigned int image_id, image_info_t *image_data); 210 211 #else 212 213 uintptr_t page_align(uintptr_t, unsigned); 214 int load_image(meminfo_t *mem_layout, 215 unsigned int image_id, 216 uintptr_t image_base, 217 image_info_t *image_data, 218 entry_point_info_t *entry_point_info); 219 int load_auth_image(meminfo_t *mem_layout, 220 unsigned int image_id, 221 uintptr_t image_base, 222 image_info_t *image_data, 223 entry_point_info_t *entry_point_info); 224 void reserve_mem(uintptr_t *free_base, size_t *free_size, 225 uintptr_t addr, size_t size); 226 227 #endif /* LOAD_IMAGE_V2 */ 228 229 extern const char build_message[]; 230 extern const char version_string[]; 231 232 void print_entry_point_info(const entry_point_info_t *ep_info); 233 234 #endif /*__ASSEMBLY__*/ 235 236 #endif /* __BL_COMMON_H__ */ 237