GNU Linux-libre 4.19.245-gnu1
[releases.git] / arch / arm / kernel / vmlinux.lds.h
1 /* SPDX-License-Identifier: GPL-2.0 */
2
3 #ifdef CONFIG_HOTPLUG_CPU
4 #define ARM_CPU_DISCARD(x)
5 #define ARM_CPU_KEEP(x)         x
6 #else
7 #define ARM_CPU_DISCARD(x)      x
8 #define ARM_CPU_KEEP(x)
9 #endif
10
11 #if (defined(CONFIG_SMP_ON_UP) && !defined(CONFIG_DEBUG_SPINLOCK)) || \
12         defined(CONFIG_GENERIC_BUG) || defined(CONFIG_JUMP_LABEL)
13 #define ARM_EXIT_KEEP(x)        x
14 #define ARM_EXIT_DISCARD(x)
15 #else
16 #define ARM_EXIT_KEEP(x)
17 #define ARM_EXIT_DISCARD(x)     x
18 #endif
19
20 #ifdef CONFIG_MMU
21 #define ARM_MMU_KEEP(x)         x
22 #define ARM_MMU_DISCARD(x)
23 #else
24 #define ARM_MMU_KEEP(x)
25 #define ARM_MMU_DISCARD(x)      x
26 #endif
27
28 /*
29  * ld.lld does not support NOCROSSREFS:
30  * https://github.com/ClangBuiltLinux/linux/issues/1609
31  */
32 #ifdef CONFIG_LD_IS_LLD
33 #define NOCROSSREFS
34 #endif
35
36 /* Set start/end symbol names to the LMA for the section */
37 #define ARM_LMA(sym, section)                                           \
38         sym##_start = LOADADDR(section);                                \
39         sym##_end = LOADADDR(section) + SIZEOF(section)
40
41 #define PROC_INFO                                                       \
42                 . = ALIGN(4);                                           \
43                 __proc_info_begin = .;                                  \
44                 *(.proc.info.init)                                      \
45                 __proc_info_end = .;
46
47 #define HYPERVISOR_TEXT                                                 \
48                 __hyp_text_start = .;                                   \
49                 *(.hyp.text)                                            \
50                 __hyp_text_end = .;
51
52 #define IDMAP_TEXT                                                      \
53                 ALIGN_FUNCTION();                                       \
54                 __idmap_text_start = .;                                 \
55                 *(.idmap.text)                                          \
56                 __idmap_text_end = .;                                   \
57                 . = ALIGN(PAGE_SIZE);                                   \
58                 __hyp_idmap_text_start = .;                             \
59                 *(.hyp.idmap.text)                                      \
60                 __hyp_idmap_text_end = .;
61
62 #define ARM_DISCARD                                                     \
63                 *(.ARM.exidx.exit.text)                                 \
64                 *(.ARM.extab.exit.text)                                 \
65                 *(.ARM.exidx.text.exit)                                 \
66                 *(.ARM.extab.text.exit)                                 \
67                 ARM_CPU_DISCARD(*(.ARM.exidx.cpuexit.text))             \
68                 ARM_CPU_DISCARD(*(.ARM.extab.cpuexit.text))             \
69                 ARM_EXIT_DISCARD(EXIT_TEXT)                             \
70                 ARM_EXIT_DISCARD(EXIT_DATA)                             \
71                 EXIT_CALL                                               \
72                 ARM_MMU_DISCARD(*(.text.fixup))                         \
73                 ARM_MMU_DISCARD(*(__ex_table))                          \
74                 *(.discard)                                             \
75                 *(.discard.*)
76
77 #define ARM_TEXT                                                        \
78                 IDMAP_TEXT                                              \
79                 __entry_text_start = .;                                 \
80                 *(.entry.text)                                          \
81                 __entry_text_end = .;                                   \
82                 IRQENTRY_TEXT                                           \
83                 SOFTIRQENTRY_TEXT                                       \
84                 TEXT_TEXT                                               \
85                 SCHED_TEXT                                              \
86                 CPUIDLE_TEXT                                            \
87                 LOCK_TEXT                                               \
88                 HYPERVISOR_TEXT                                         \
89                 KPROBES_TEXT                                            \
90                 *(.gnu.warning)                                         \
91                 *(.glue_7)                                              \
92                 *(.glue_7t)                                             \
93                 . = ALIGN(4);                                           \
94                 *(.got)                 /* Global offset table */       \
95                 ARM_CPU_KEEP(PROC_INFO)
96
97 /* Stack unwinding tables */
98 #define ARM_UNWIND_SECTIONS                                             \
99         . = ALIGN(8);                                                   \
100         .ARM.unwind_idx : {                                             \
101                 __start_unwind_idx = .;                                 \
102                 *(.ARM.exidx*)                                          \
103                 __stop_unwind_idx = .;                                  \
104         }                                                               \
105         .ARM.unwind_tab : {                                             \
106                 __start_unwind_tab = .;                                 \
107                 *(.ARM.extab*)                                          \
108                 __stop_unwind_tab = .;                                  \
109         }
110
111 /*
112  * The vectors and stubs are relocatable code, and the
113  * only thing that matters is their relative offsets
114  */
115 #define ARM_VECTORS                                                     \
116         __vectors_lma = .;                                              \
117         OVERLAY 0xffff0000 : NOCROSSREFS AT(__vectors_lma) {            \
118                 .vectors {                                              \
119                         *(.vectors)                                     \
120                 }                                                       \
121                 .vectors.bhb.loop8 {                                    \
122                         *(.vectors.bhb.loop8)                           \
123                 }                                                       \
124                 .vectors.bhb.bpiall {                                   \
125                         *(.vectors.bhb.bpiall)                          \
126                 }                                                       \
127         }                                                               \
128         ARM_LMA(__vectors, .vectors);                                   \
129         ARM_LMA(__vectors_bhb_loop8, .vectors.bhb.loop8);               \
130         ARM_LMA(__vectors_bhb_bpiall, .vectors.bhb.bpiall);             \
131         . = __vectors_lma + SIZEOF(.vectors) +                          \
132                 SIZEOF(.vectors.bhb.loop8) +                            \
133                 SIZEOF(.vectors.bhb.bpiall);                            \
134                                                                         \
135         __stubs_lma = .;                                                \
136         .stubs ADDR(.vectors) + 0x1000 : AT(__stubs_lma) {              \
137                 *(.stubs)                                               \
138         }                                                               \
139         ARM_LMA(__stubs, .stubs);                                       \
140         . = __stubs_lma + SIZEOF(.stubs);                               \
141                                                                         \
142         PROVIDE(vector_fiq_offset = vector_fiq - ADDR(.vectors));
143
144 #define ARM_TCM                                                         \
145         __itcm_start = ALIGN(4);                                        \
146         .text_itcm ITCM_OFFSET : AT(__itcm_start - LOAD_OFFSET) {       \
147                 __sitcm_text = .;                                       \
148                 *(.tcm.text)                                            \
149                 *(.tcm.rodata)                                          \
150                 . = ALIGN(4);                                           \
151                 __eitcm_text = .;                                       \
152         }                                                               \
153         . = __itcm_start + SIZEOF(.text_itcm);                          \
154                                                                         \
155         __dtcm_start = .;                                               \
156         .data_dtcm DTCM_OFFSET : AT(__dtcm_start - LOAD_OFFSET) {       \
157                 __sdtcm_data = .;                                       \
158                 *(.tcm.data)                                            \
159                 . = ALIGN(4);                                           \
160                 __edtcm_data = .;                                       \
161         }                                                               \
162         . = __dtcm_start + SIZEOF(.data_dtcm);