1 #ifndef __ASM_SECURE_H 2 #define __ASM_SECURE_H 3 4 #include <config.h> 5 6 #define __secure __attribute__ ((section ("._secure.text"))) 7 #define __secure_data __attribute__ ((section ("._secure.data"))) 8 9 #ifndef __ASSEMBLY__ 10 11 typedef struct secure_svc_tbl { 12 u32 id; 13 #ifdef CONFIG_ARMV8_PSCI 14 u8 pad[4]; 15 #endif 16 void *func; 17 } secure_svc_tbl_t; 18 19 /* 20 * Macro to declare a SiP function service in '_secure_svc_tbl_entries' section 21 */ 22 #define DECLARE_SECURE_SVC(_name, _id, _fn) \ 23 static const secure_svc_tbl_t __secure_svc_ ## _name \ 24 __attribute__((used, section("._secure_svc_tbl_entries"))) \ 25 = { \ 26 .id = _id, \ 27 .func = _fn } 28 29 #else 30 31 #ifdef CONFIG_ARMV8_PSCI 32 #define SECURE_SVC_TBL_OFFSET 16 33 #else 34 #define SECURE_SVC_TBL_OFFSET 8 35 36 #endif 37 38 #endif /* __ASSEMBLY__ */ 39 40 #if defined(CONFIG_ARMV7_SECURE_BASE) || defined(CONFIG_ARMV8_SECURE_BASE) 41 /* 42 * Warning, horror ahead. 43 * 44 * The target code lives in our "secure ram", but u-boot doesn't know 45 * that, and has blindly added reloc_off to every relocation 46 * entry. Gahh. Do the opposite conversion. This hack also prevents 47 * GCC from generating code veeners, which u-boot doesn't relocate at 48 * all... 49 */ 50 #define secure_ram_addr(_fn) ({ \ 51 DECLARE_GLOBAL_DATA_PTR; \ 52 void *__fn = _fn; \ 53 typeof(_fn) *__tmp = (__fn - gd->reloc_off); \ 54 __tmp; \ 55 }) 56 #else 57 #define secure_ram_addr(_fn) (_fn) 58 #endif 59 60 #endif 61