1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #include <asm-generic/vmlinux.lds.h> 3 4 #ifdef CONFIG_HOTPLUG_CPU 5 #define ARM_CPU_DISCARD(x) 6 #define ARM_CPU_KEEP(x) x 7 #else 8 #define ARM_CPU_DISCARD(x) x 9 #define ARM_CPU_KEEP(x) 10 #endif 11 12 #if (defined(CONFIG_SMP_ON_UP) && !defined(CONFIG_DEBUG_SPINLOCK)) || \ 13 defined(CONFIG_GENERIC_BUG) || defined(CONFIG_JUMP_LABEL) 14 #define ARM_EXIT_KEEP(x) x 15 #define ARM_EXIT_DISCARD(x) 16 #else 17 #define ARM_EXIT_KEEP(x) 18 #define ARM_EXIT_DISCARD(x) x 19 #endif 20 21 #ifdef CONFIG_MMU 22 #define ARM_MMU_KEEP(x) x 23 #define ARM_MMU_DISCARD(x) 24 #else 25 #define ARM_MMU_KEEP(x) 26 #define ARM_MMU_DISCARD(x) x 27 #endif 28 29 #define PROC_INFO \ 30 . = ALIGN(4); \ 31 __proc_info_begin = .; \ 32 *(.proc.info.init) \ 33 __proc_info_end = .; 34 35 #define IDMAP_TEXT \ 36 ALIGN_FUNCTION(); \ 37 __idmap_text_start = .; \ 38 *(.idmap.text) \ 39 __idmap_text_end = .; \ 40 41 #define ARM_DISCARD \ 42 *(.ARM.exidx.exit.text) \ 43 *(.ARM.extab.exit.text) \ 44 *(.ARM.exidx.text.exit) \ 45 *(.ARM.extab.text.exit) \ 46 ARM_CPU_DISCARD(*(.ARM.exidx.cpuexit.text)) \ 47 ARM_CPU_DISCARD(*(.ARM.extab.cpuexit.text)) \ 48 ARM_EXIT_DISCARD(EXIT_TEXT) \ 49 ARM_EXIT_DISCARD(EXIT_DATA) \ 50 EXIT_CALL \ 51 ARM_MMU_DISCARD(*(.text.fixup)) \ 52 ARM_MMU_DISCARD(*(__ex_table)) \ 53 COMMON_DISCARDS 54 55 /* 56 * Sections that should stay zero sized, which is safer to explicitly 57 * check instead of blindly discarding. 58 */ 59 #define ARM_ASSERTS \ 60 .plt : { \ 61 *(.iplt) *(.rel.iplt) *(.iplt) *(.igot.plt) \ 62 } \ 63 ASSERT(SIZEOF(.plt) == 0, \ 64 "Unexpected run-time procedure linkages detected!") 65 66 #define ARM_DETAILS \ 67 ELF_DETAILS \ 68 .ARM.attributes 0 : { *(.ARM.attributes) } 69 70 #define ARM_STUBS_TEXT \ 71 *(.gnu.warning) \ 72 *(.glue_7) \ 73 *(.glue_7t) \ 74 *(.vfp11_veneer) \ 75 *(.v4_bx) 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 KPROBES_TEXT \ 89 ARM_STUBS_TEXT \ 90 . = ALIGN(4); \ 91 *(.got) /* Global offset table */ \ 92 ARM_CPU_KEEP(PROC_INFO) 93 94 /* Stack unwinding tables */ 95 #define ARM_UNWIND_SECTIONS \ 96 . = ALIGN(8); \ 97 .ARM.unwind_idx : { \ 98 __start_unwind_idx = .; \ 99 *(.ARM.exidx*) \ 100 __stop_unwind_idx = .; \ 101 } \ 102 .ARM.unwind_tab : { \ 103 __start_unwind_tab = .; \ 104 *(.ARM.extab*) \ 105 __stop_unwind_tab = .; \ 106 } 107 108 /* 109 * The vectors and stubs are relocatable code, and the 110 * only thing that matters is their relative offsets 111 */ 112 #define ARM_VECTORS \ 113 __vectors_start = .; \ 114 .vectors 0xffff0000 : AT(__vectors_start) { \ 115 *(.vectors) \ 116 } \ 117 . = __vectors_start + SIZEOF(.vectors); \ 118 __vectors_end = .; \ 119 \ 120 __stubs_start = .; \ 121 .stubs ADDR(.vectors) + 0x1000 : AT(__stubs_start) { \ 122 *(.stubs) \ 123 } \ 124 . = __stubs_start + SIZEOF(.stubs); \ 125 __stubs_end = .; \ 126 \ 127 PROVIDE(vector_fiq_offset = vector_fiq - ADDR(.vectors)); 128 129 #define ARM_TCM \ 130 __itcm_start = ALIGN(4); \ 131 .text_itcm ITCM_OFFSET : AT(__itcm_start - LOAD_OFFSET) { \ 132 __sitcm_text = .; \ 133 *(.tcm.text) \ 134 *(.tcm.rodata) \ 135 . = ALIGN(4); \ 136 __eitcm_text = .; \ 137 } \ 138 . = __itcm_start + SIZEOF(.text_itcm); \ 139 \ 140 __dtcm_start = .; \ 141 .data_dtcm DTCM_OFFSET : AT(__dtcm_start - LOAD_OFFSET) { \ 142 __sdtcm_data = .; \ 143 *(.tcm.data) \ 144 . = ALIGN(4); \ 145 __edtcm_data = .; \ 146 } \ 147 . = __dtcm_start + SIZEOF(.data_dtcm); 148