1 /* SPDX-License-Identifier: GPL-2.0 */
3 #ifdef CONFIG_HOTPLUG_CPU
4 #define ARM_CPU_DISCARD(x)
5 #define ARM_CPU_KEEP(x) x
7 #define ARM_CPU_DISCARD(x) x
8 #define ARM_CPU_KEEP(x)
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)
16 #define ARM_EXIT_KEEP(x)
17 #define ARM_EXIT_DISCARD(x) x
21 #define ARM_MMU_KEEP(x) x
22 #define ARM_MMU_DISCARD(x)
24 #define ARM_MMU_KEEP(x)
25 #define ARM_MMU_DISCARD(x) x
29 * ld.lld does not support NOCROSSREFS:
30 * https://github.com/ClangBuiltLinux/linux/issues/1609
32 #ifdef CONFIG_LD_IS_LLD
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)
43 __proc_info_begin = .; \
47 #define HYPERVISOR_TEXT \
48 __hyp_text_start = .; \
54 __idmap_text_start = .; \
56 __idmap_text_end = .; \
57 . = ALIGN(PAGE_SIZE); \
58 __hyp_idmap_text_start = .; \
60 __hyp_idmap_text_end = .;
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) \
72 ARM_MMU_DISCARD(*(.text.fixup)) \
73 ARM_MMU_DISCARD(*(__ex_table)) \
79 __entry_text_start = .; \
81 __entry_text_end = .; \
94 *(.got) /* Global offset table */ \
95 ARM_CPU_KEEP(PROC_INFO)
97 /* Stack unwinding tables */
98 #define ARM_UNWIND_SECTIONS \
100 .ARM.unwind_idx : { \
101 __start_unwind_idx = .; \
103 __stop_unwind_idx = .; \
105 .ARM.unwind_tab : { \
106 __start_unwind_tab = .; \
108 __stop_unwind_tab = .; \
112 * The vectors and stubs are relocatable code, and the
113 * only thing that matters is their relative offsets
115 #define ARM_VECTORS \
117 OVERLAY 0xffff0000 : NOCROSSREFS AT(__vectors_lma) { \
121 .vectors.bhb.loop8 { \
122 *(.vectors.bhb.loop8) \
124 .vectors.bhb.bpiall { \
125 *(.vectors.bhb.bpiall) \
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); \
136 .stubs ADDR(.vectors) + 0x1000 : AT(__stubs_lma) { \
139 ARM_LMA(__stubs, .stubs); \
140 . = __stubs_lma + SIZEOF(.stubs); \
142 PROVIDE(vector_fiq_offset = vector_fiq - ADDR(.vectors));
145 __itcm_start = ALIGN(4); \
146 .text_itcm ITCM_OFFSET : AT(__itcm_start - LOAD_OFFSET) { \
153 . = __itcm_start + SIZEOF(.text_itcm); \
156 .data_dtcm DTCM_OFFSET : AT(__dtcm_start - LOAD_OFFSET) { \
162 . = __dtcm_start + SIZEOF(.data_dtcm);