bl_common.h 6.0 KB

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