1*4ecca339SDan Handley /* 2*4ecca339SDan Handley * Copyright (c) 2013-2014, ARM Limited and Contributors. All rights reserved. 3*4ecca339SDan Handley * 4*4ecca339SDan Handley * Redistribution and use in source and binary forms, with or without 5*4ecca339SDan Handley * modification, are permitted provided that the following conditions are met: 6*4ecca339SDan Handley * 7*4ecca339SDan Handley * Redistributions of source code must retain the above copyright notice, this 8*4ecca339SDan Handley * list of conditions and the following disclaimer. 9*4ecca339SDan Handley * 10*4ecca339SDan Handley * Redistributions in binary form must reproduce the above copyright notice, 11*4ecca339SDan Handley * this list of conditions and the following disclaimer in the documentation 12*4ecca339SDan Handley * and/or other materials provided with the distribution. 13*4ecca339SDan Handley * 14*4ecca339SDan Handley * Neither the name of ARM nor the names of its contributors may be used 15*4ecca339SDan Handley * to endorse or promote products derived from this software without specific 16*4ecca339SDan Handley * prior written permission. 17*4ecca339SDan Handley * 18*4ecca339SDan Handley * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 19*4ecca339SDan Handley * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20*4ecca339SDan Handley * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21*4ecca339SDan Handley * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 22*4ecca339SDan Handley * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 23*4ecca339SDan Handley * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 24*4ecca339SDan Handley * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 25*4ecca339SDan Handley * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 26*4ecca339SDan Handley * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 27*4ecca339SDan Handley * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28*4ecca339SDan Handley * POSSIBILITY OF SUCH DAMAGE. 29*4ecca339SDan Handley */ 30*4ecca339SDan Handley 31*4ecca339SDan Handley #ifndef __BL_COMMON_H__ 32*4ecca339SDan Handley #define __BL_COMMON_H__ 33*4ecca339SDan Handley 34*4ecca339SDan Handley #define SECURE 0 35*4ecca339SDan Handley #define NON_SECURE 1 36*4ecca339SDan Handley 37*4ecca339SDan Handley #define UP 1 38*4ecca339SDan Handley #define DOWN 0 39*4ecca339SDan Handley 40*4ecca339SDan Handley /******************************************************************************* 41*4ecca339SDan Handley * Constants for loading images. When BLx wants to load BLy, it looks at a 42*4ecca339SDan Handley * meminfo structure to find the extents of free memory. Then depending upon 43*4ecca339SDan Handley * how it has been configured, it can either load BLy at the top or bottom of 44*4ecca339SDan Handley * the free memory. These constants indicate the choice. 45*4ecca339SDan Handley * TODO: Make this configurable while building the trusted firmware. 46*4ecca339SDan Handley ******************************************************************************/ 47*4ecca339SDan Handley #define TOP_LOAD 0x1 48*4ecca339SDan Handley #define BOT_LOAD !TOP_LOAD 49*4ecca339SDan Handley #define LOAD_MASK (1 << 0) 50*4ecca339SDan Handley 51*4ecca339SDan Handley /******************************************************************************* 52*4ecca339SDan Handley * Macro to flag a compile time assertion. It uses the preprocessor to generate 53*4ecca339SDan Handley * an invalid C construct if 'cond' evaluates to false. 54*4ecca339SDan Handley * The following compilation error is triggered if the assertion fails: 55*4ecca339SDan Handley * "error: size of array 'msg' is negative" 56*4ecca339SDan Handley ******************************************************************************/ 57*4ecca339SDan Handley #define CASSERT(cond, msg) typedef char msg[(cond) ? 1 : -1] 58*4ecca339SDan Handley 59*4ecca339SDan Handley /****************************************************************************** 60*4ecca339SDan Handley * Opcode passed in x0 to tell next EL that we want to run an image. 61*4ecca339SDan Handley * Corresponds to the function ID of the only SMC that the BL1 exception 62*4ecca339SDan Handley * handlers service. That's why the chosen value is the first function ID of 63*4ecca339SDan Handley * the ARM SMC64 range. 64*4ecca339SDan Handley *****************************************************************************/ 65*4ecca339SDan Handley #define RUN_IMAGE 0xC0000000 66*4ecca339SDan Handley 67*4ecca339SDan Handley 68*4ecca339SDan Handley #ifndef __ASSEMBLY__ 69*4ecca339SDan Handley #include <stdio.h> 70*4ecca339SDan Handley 71*4ecca339SDan Handley /******************************************************************************* 72*4ecca339SDan Handley * Structure used for telling the next BL how much of a particular type of 73*4ecca339SDan Handley * memory is available for its use and how much is already used. 74*4ecca339SDan Handley ******************************************************************************/ 75*4ecca339SDan Handley typedef struct { 76*4ecca339SDan Handley unsigned long total_base; 77*4ecca339SDan Handley long total_size; 78*4ecca339SDan Handley unsigned long free_base; 79*4ecca339SDan Handley long free_size; 80*4ecca339SDan Handley unsigned long attr; 81*4ecca339SDan Handley unsigned long next; 82*4ecca339SDan Handley } meminfo; 83*4ecca339SDan Handley 84*4ecca339SDan Handley typedef struct { 85*4ecca339SDan Handley unsigned long arg0; 86*4ecca339SDan Handley unsigned long arg1; 87*4ecca339SDan Handley unsigned long arg2; 88*4ecca339SDan Handley unsigned long arg3; 89*4ecca339SDan Handley unsigned long arg4; 90*4ecca339SDan Handley unsigned long arg5; 91*4ecca339SDan Handley unsigned long arg6; 92*4ecca339SDan Handley unsigned long arg7; 93*4ecca339SDan Handley } aapcs64_params; 94*4ecca339SDan Handley 95*4ecca339SDan Handley /******************************************************************************* 96*4ecca339SDan Handley * This structure represents the superset of information needed while switching 97*4ecca339SDan Handley * exception levels. The only two mechanisms to do so are ERET & SMC. In case of 98*4ecca339SDan Handley * SMC all members apart from 'aapcs64_params' will be ignored. 99*4ecca339SDan Handley ******************************************************************************/ 100*4ecca339SDan Handley typedef struct { 101*4ecca339SDan Handley unsigned long entrypoint; 102*4ecca339SDan Handley unsigned long spsr; 103*4ecca339SDan Handley unsigned long security_state; 104*4ecca339SDan Handley aapcs64_params args; 105*4ecca339SDan Handley } el_change_info; 106*4ecca339SDan Handley 107*4ecca339SDan Handley /******************************************************************************* 108*4ecca339SDan Handley * This structure represents the superset of information that can be passed to 109*4ecca339SDan Handley * BL31 e.g. while passing control to it from BL2. The BL32 parameters will be 110*4ecca339SDan Handley * populated only if BL2 detects its presence. 111*4ecca339SDan Handley ******************************************************************************/ 112*4ecca339SDan Handley typedef struct { 113*4ecca339SDan Handley meminfo bl31_meminfo; 114*4ecca339SDan Handley el_change_info bl32_image_info; 115*4ecca339SDan Handley meminfo bl32_meminfo; 116*4ecca339SDan Handley el_change_info bl33_image_info; 117*4ecca339SDan Handley meminfo bl33_meminfo; 118*4ecca339SDan Handley } bl31_args; 119*4ecca339SDan Handley 120*4ecca339SDan Handley /******************************************************************************* 121*4ecca339SDan Handley * Function & variable prototypes 122*4ecca339SDan Handley ******************************************************************************/ 123*4ecca339SDan Handley extern unsigned long page_align(unsigned long, unsigned); 124*4ecca339SDan Handley extern void change_security_state(unsigned int); 125*4ecca339SDan Handley extern void __dead2 drop_el(aapcs64_params *, unsigned long, unsigned long); 126*4ecca339SDan Handley extern void __dead2 raise_el(aapcs64_params *); 127*4ecca339SDan Handley extern void __dead2 change_el(el_change_info *); 128*4ecca339SDan Handley extern unsigned long make_spsr(unsigned long, unsigned long, unsigned long); 129*4ecca339SDan Handley extern void init_bl2_mem_layout(meminfo *, 130*4ecca339SDan Handley meminfo *, 131*4ecca339SDan Handley unsigned int, 132*4ecca339SDan Handley unsigned long) __attribute__((weak)); 133*4ecca339SDan Handley extern void init_bl31_mem_layout(const meminfo *, 134*4ecca339SDan Handley meminfo *, 135*4ecca339SDan Handley unsigned int) __attribute__((weak)); 136*4ecca339SDan Handley extern unsigned long image_size(const char *); 137*4ecca339SDan Handley extern unsigned long load_image(meminfo *, 138*4ecca339SDan Handley const char *, 139*4ecca339SDan Handley unsigned int, 140*4ecca339SDan Handley unsigned long); 141*4ecca339SDan Handley extern void __dead2 run_image(unsigned long entrypoint, 142*4ecca339SDan Handley unsigned long spsr, 143*4ecca339SDan Handley unsigned long security_state, 144*4ecca339SDan Handley void *first_arg, 145*4ecca339SDan Handley void *second_arg); 146*4ecca339SDan Handley extern unsigned long *get_el_change_mem_ptr(void); 147*4ecca339SDan Handley extern const char build_message[]; 148*4ecca339SDan Handley 149*4ecca339SDan Handley #endif /*__ASSEMBLY__*/ 150*4ecca339SDan Handley 151*4ecca339SDan Handley #endif /* __BL_COMMON_H__ */ 152