u-boot/arch/arm/include/asm/secure.h
Chee Hong Ang f6b0115a96 ARMv8: Allow SiP service extensions on top of PSCI code
Allow PSCI layer to handle any SiP service functions added by
platform vendors. PSCI layer will look for SiP service function
in the SiP function table located in '._secure_svc_tbl_entries'
section if the SMC function identifier is not found in the PSCI
standard functions table. Use DECLARE_SECURE_SVC macro to declare
and add platform specific SiP service function.
This new section '._secure_svc_tbl_entries' is located next to
'._secure.text' section. Refer to arch/arm/cpu/armv8/u-boot.lds.

Signed-off-by: Chee Hong Ang <chee.hong.ang@intel.com>
2019-04-22 18:13:21 -04:00

60 lines
1.4 KiB
C

#ifndef __ASM_SECURE_H
#define __ASM_SECURE_H
#include <config.h>
#define __secure __attribute__ ((section ("._secure.text")))
#define __secure_data __attribute__ ((section ("._secure.data")))
#ifndef __ASSEMBLY__
typedef struct secure_svc_tbl {
u32 id;
#ifdef CONFIG_ARMV8_PSCI
u8 pad[4];
#endif
void *func;
} secure_svc_tbl_t;
/*
* Macro to declare a SiP function service in '_secure_svc_tbl_entries' section
*/
#define DECLARE_SECURE_SVC(_name, _id, _fn) \
static const secure_svc_tbl_t __secure_svc_ ## _name \
__attribute__((used, section("._secure_svc_tbl_entries"))) \
= { \
.id = _id, \
.func = _fn }
#else
#ifdef CONFIG_ARMV8_PSCI
#define SECURE_SVC_TBL_OFFSET 16
#else
#define SECURE_SVC_TBL_OFFSET 8
#endif
#endif /* __ASSEMBLY__ */
#if defined(CONFIG_ARMV7_SECURE_BASE) || defined(CONFIG_ARMV8_SECURE_BASE)
/*
* Warning, horror ahead.
*
* The target code lives in our "secure ram", but u-boot doesn't know
* that, and has blindly added reloc_off to every relocation
* entry. Gahh. Do the opposite conversion. This hack also prevents
* GCC from generating code veeners, which u-boot doesn't relocate at
* all...
*/
#define secure_ram_addr(_fn) ({ \
DECLARE_GLOBAL_DATA_PTR; \
void *__fn = _fn; \
typeof(_fn) *__tmp = (__fn - gd->reloc_off); \
__tmp; \
})
#else
#define secure_ram_addr(_fn) (_fn)
#endif
#endif