Home | History | Annotate | Download | only in common
      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