1#ifndef __ASM_SECURE_H 2#define __ASM_SECURE_H 3 4#include <asm/global_data.h> 5 6#define __secure __section("._secure.text") 7#define __secure_data __section("._secure.data") 8 9#ifndef __ASSEMBLY__ 10 11typedef 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 __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