xref: /optee_os/core/include/kernel/linker.h (revision 4a96f1f595f2c6f838a1476c000be925f20f8e05)
1*4a96f1f5SMarouene Boubakri /* SPDX-License-Identifier: BSD-2-Clause */
2*4a96f1f5SMarouene Boubakri /*
3*4a96f1f5SMarouene Boubakri  * Copyright (c) 2017, Linaro Limited
4*4a96f1f5SMarouene Boubakri  */
5*4a96f1f5SMarouene Boubakri #ifndef __KERNEL_LINKER_H
6*4a96f1f5SMarouene Boubakri #define __KERNEL_LINKER_H
7*4a96f1f5SMarouene Boubakri 
8*4a96f1f5SMarouene Boubakri #include <kernel/dt.h>
9*4a96f1f5SMarouene Boubakri #include <types_ext.h>
10*4a96f1f5SMarouene Boubakri 
11*4a96f1f5SMarouene Boubakri /*
12*4a96f1f5SMarouene Boubakri  * Symbols exported by the link script.
13*4a96f1f5SMarouene Boubakri  */
14*4a96f1f5SMarouene Boubakri 
15*4a96f1f5SMarouene Boubakri #ifdef __arm__
16*4a96f1f5SMarouene Boubakri 
17*4a96f1f5SMarouene Boubakri /*
18*4a96f1f5SMarouene Boubakri  * These addresses will be the start or end of the exception binary search
19*4a96f1f5SMarouene Boubakri  * index table (.ARM.exidx section)
20*4a96f1f5SMarouene Boubakri  */
21*4a96f1f5SMarouene Boubakri extern const uint8_t __exidx_start[];
22*4a96f1f5SMarouene Boubakri extern const uint8_t __exidx_end[];
23*4a96f1f5SMarouene Boubakri extern const uint8_t __extab_start[];
24*4a96f1f5SMarouene Boubakri extern const uint8_t __extab_end[];
25*4a96f1f5SMarouene Boubakri 
26*4a96f1f5SMarouene Boubakri #endif
27*4a96f1f5SMarouene Boubakri 
28*4a96f1f5SMarouene Boubakri /*
29*4a96f1f5SMarouene Boubakri  * Warning! (ASLR) Do not use any of the _SZ_UNSAFE defines or _size[] variables
30*4a96f1f5SMarouene Boubakri  * below in code that runs after dynamic relocations have been applied. Their
31*4a96f1f5SMarouene Boubakri  * value could be *wrong* after relocation (for instance Aarch64 GCC 9.2
32*4a96f1f5SMarouene Boubakri  * generates dynamic relocations for the _size[] symbols, but Clang 11.0.0 does
33*4a96f1f5SMarouene Boubakri  * not). The _SZ_UNSAFE macros are mostly here for use in register_phys_mem()
34*4a96f1f5SMarouene Boubakri  * where the _SZ macros would be rejected by the compiler ('initializer element
35*4a96f1f5SMarouene Boubakri  * is not constant'). Other uses are likely to be incorrect.
36*4a96f1f5SMarouene Boubakri  */
37*4a96f1f5SMarouene Boubakri 
38*4a96f1f5SMarouene Boubakri #define VCORE_UNPG_RX_PA	((unsigned long)__vcore_unpg_rx_start)
39*4a96f1f5SMarouene Boubakri #define VCORE_UNPG_RX_SZ_UNSAFE	((size_t)__vcore_unpg_rx_size)
40*4a96f1f5SMarouene Boubakri #define VCORE_UNPG_RX_SZ	((size_t)(__vcore_unpg_rx_end - \
41*4a96f1f5SMarouene Boubakri 					  __vcore_unpg_rx_start))
42*4a96f1f5SMarouene Boubakri #define VCORE_UNPG_RO_PA	((unsigned long)__vcore_unpg_ro_start)
43*4a96f1f5SMarouene Boubakri #define VCORE_UNPG_RO_SZ_UNSAFE	((size_t)__vcore_unpg_ro_size)
44*4a96f1f5SMarouene Boubakri #define VCORE_UNPG_RO_SZ	((size_t)(__vcore_unpg_ro_end - \
45*4a96f1f5SMarouene Boubakri 					  __vcore_unpg_ro_start))
46*4a96f1f5SMarouene Boubakri #define VCORE_UNPG_RW_PA	((unsigned long)__vcore_unpg_rw_start)
47*4a96f1f5SMarouene Boubakri #define VCORE_UNPG_RW_SZ_UNSAFE	((size_t)__vcore_unpg_rw_size)
48*4a96f1f5SMarouene Boubakri #define VCORE_UNPG_RW_SZ	((size_t)(__vcore_unpg_rw_end - \
49*4a96f1f5SMarouene Boubakri 					  __vcore_unpg_rw_start))
50*4a96f1f5SMarouene Boubakri #define VCORE_NEX_RW_PA	((unsigned long)__vcore_nex_rw_start)
51*4a96f1f5SMarouene Boubakri #define VCORE_NEX_RW_SZ_UNSAFE	((size_t)__vcore_nex_rw_size)
52*4a96f1f5SMarouene Boubakri #define VCORE_NEX_RW_SZ	((size_t)__vcore_nex_rw_end - \
53*4a96f1f5SMarouene Boubakri 					 __vcore_nex_rw_start)
54*4a96f1f5SMarouene Boubakri #define VCORE_INIT_RX_PA	((unsigned long)__vcore_init_rx_start)
55*4a96f1f5SMarouene Boubakri #define VCORE_INIT_RX_SZ_UNSAFE	((size_t)__vcore_init_rx_size)
56*4a96f1f5SMarouene Boubakri #define VCORE_INIT_RX_SZ	((size_t)(__vcore_init_rx_end - \
57*4a96f1f5SMarouene Boubakri 					  __vcore_init_rx_start))
58*4a96f1f5SMarouene Boubakri #define VCORE_INIT_RO_PA	((unsigned long)__vcore_init_ro_start)
59*4a96f1f5SMarouene Boubakri #define VCORE_INIT_RO_SZ_UNSAFE	((size_t)__vcore_init_ro_size)
60*4a96f1f5SMarouene Boubakri #define VCORE_INIT_RO_SZ	((size_t)(__vcore_init_ro_end - \
61*4a96f1f5SMarouene Boubakri 					  __vcore_init_ro_start))
62*4a96f1f5SMarouene Boubakri 
63*4a96f1f5SMarouene Boubakri #define VCORE_START_VA		((vaddr_t)__text_start)
64*4a96f1f5SMarouene Boubakri 
65*4a96f1f5SMarouene Boubakri #define EMIT_SECTION_INFO_SYMBOLS(section_name) \
66*4a96f1f5SMarouene Boubakri 	extern const uint8_t __vcore_ ## section_name ## _start[]; \
67*4a96f1f5SMarouene Boubakri 	extern const uint8_t __vcore_ ## section_name ## _end[]; \
68*4a96f1f5SMarouene Boubakri 	extern const uint8_t __vcore_ ## section_name ## _size[]
69*4a96f1f5SMarouene Boubakri 
70*4a96f1f5SMarouene Boubakri EMIT_SECTION_INFO_SYMBOLS(unpg_rx);
71*4a96f1f5SMarouene Boubakri EMIT_SECTION_INFO_SYMBOLS(unpg_ro);
72*4a96f1f5SMarouene Boubakri EMIT_SECTION_INFO_SYMBOLS(unpg_rw);
73*4a96f1f5SMarouene Boubakri EMIT_SECTION_INFO_SYMBOLS(nex_rw);
74*4a96f1f5SMarouene Boubakri EMIT_SECTION_INFO_SYMBOLS(init_ro);
75*4a96f1f5SMarouene Boubakri EMIT_SECTION_INFO_SYMBOLS(init_rx);
76*4a96f1f5SMarouene Boubakri 
77*4a96f1f5SMarouene Boubakri #undef EMIT_SECTION_INFO_SYMBOLS
78*4a96f1f5SMarouene Boubakri 
79*4a96f1f5SMarouene Boubakri extern const uint8_t __text_start[];
80*4a96f1f5SMarouene Boubakri extern const uint8_t __end[];
81*4a96f1f5SMarouene Boubakri 
82*4a96f1f5SMarouene Boubakri extern const uint8_t __identity_map_init_start[];
83*4a96f1f5SMarouene Boubakri extern const uint8_t __identity_map_init_end[];
84*4a96f1f5SMarouene Boubakri 
85*4a96f1f5SMarouene Boubakri extern uint8_t __data_start[];
86*4a96f1f5SMarouene Boubakri extern const uint8_t __data_end[];
87*4a96f1f5SMarouene Boubakri extern const uint8_t __rodata_start[];
88*4a96f1f5SMarouene Boubakri extern const uint8_t __rodata_end[];
89*4a96f1f5SMarouene Boubakri extern const uint8_t __bss_start[];
90*4a96f1f5SMarouene Boubakri extern const uint8_t __bss_end[];
91*4a96f1f5SMarouene Boubakri extern const uint8_t __nozi_start[];
92*4a96f1f5SMarouene Boubakri extern const uint8_t __nozi_end[];
93*4a96f1f5SMarouene Boubakri extern const uint8_t __nozi_stack_start[];
94*4a96f1f5SMarouene Boubakri extern const uint8_t __nozi_stack_end[];
95*4a96f1f5SMarouene Boubakri extern const uint8_t __init_start[];
96*4a96f1f5SMarouene Boubakri extern const uint8_t __init_end[];
97*4a96f1f5SMarouene Boubakri 
98*4a96f1f5SMarouene Boubakri extern uint8_t __heap1_start[];
99*4a96f1f5SMarouene Boubakri extern const uint8_t __heap1_end[];
100*4a96f1f5SMarouene Boubakri extern uint8_t __heap2_start[];
101*4a96f1f5SMarouene Boubakri extern const uint8_t __heap2_end[];
102*4a96f1f5SMarouene Boubakri 
103*4a96f1f5SMarouene Boubakri extern uint8_t __nex_heap_start[];
104*4a96f1f5SMarouene Boubakri extern const uint8_t __nex_heap_end[];
105*4a96f1f5SMarouene Boubakri 
106*4a96f1f5SMarouene Boubakri extern const uint8_t __pageable_part_start[];
107*4a96f1f5SMarouene Boubakri extern const uint8_t __pageable_part_end[];
108*4a96f1f5SMarouene Boubakri extern const uint8_t __pageable_start[];
109*4a96f1f5SMarouene Boubakri extern const uint8_t __pageable_end[];
110*4a96f1f5SMarouene Boubakri 
111*4a96f1f5SMarouene Boubakri #define ASAN_SHADOW_PA	((paddr_t)__asan_shadow_start)
112*4a96f1f5SMarouene Boubakri #define ASAN_SHADOW_SZ	((size_t)__asan_shadow_size)
113*4a96f1f5SMarouene Boubakri extern const uint8_t __asan_shadow_start[];
114*4a96f1f5SMarouene Boubakri extern const uint8_t __asan_shadow_end[];
115*4a96f1f5SMarouene Boubakri extern const uint8_t __asan_shadow_size[];
116*4a96f1f5SMarouene Boubakri 
117*4a96f1f5SMarouene Boubakri #define ASAN_MAP_PA	((paddr_t)__asan_map_start)
118*4a96f1f5SMarouene Boubakri #define ASAN_MAP_SZ	((size_t)__asan_map_size)
119*4a96f1f5SMarouene Boubakri extern const uint8_t __asan_map_start[];
120*4a96f1f5SMarouene Boubakri extern const uint8_t __asan_map_end[];
121*4a96f1f5SMarouene Boubakri extern const uint8_t __asan_map_size[];
122*4a96f1f5SMarouene Boubakri 
123*4a96f1f5SMarouene Boubakri extern const vaddr_t __ctor_list;
124*4a96f1f5SMarouene Boubakri extern const vaddr_t __ctor_end;
125*4a96f1f5SMarouene Boubakri 
126*4a96f1f5SMarouene Boubakri 
127*4a96f1f5SMarouene Boubakri extern const struct dt_driver __rodata_dtdrv_start;
128*4a96f1f5SMarouene Boubakri extern const struct dt_driver __rodata_dtdrv_end;
129*4a96f1f5SMarouene Boubakri 
130*4a96f1f5SMarouene Boubakri /* Generated by core/arch/$(ARCH)/kernel/link.mk */
131*4a96f1f5SMarouene Boubakri extern const char core_v_str[];
132*4a96f1f5SMarouene Boubakri 
133*4a96f1f5SMarouene Boubakri #endif /*__KERNEL_LINKER_H*/
134*4a96f1f5SMarouene Boubakri 
135