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