Prepare v2023.10
[platform/kernel/u-boot.git] / arch / arm / include / asm / secure.h
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 __section("._secure.text")
8 #define __secure_data __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                 __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