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#define PROC_INFO \ 29 . = ALIGN(4); \ 30 __proc_info_begin = .; \ 31 *(.proc.info.init) \ 32 __proc_info_end = .; 33 34#define IDMAP_TEXT \ 35 ALIGN_FUNCTION(); \ 36 __idmap_text_start = .; \ 37 *(.idmap.text) \ 38 __idmap_text_end = .; \ 39 40#define ARM_DISCARD \ 41 *(.ARM.exidx.exit.text) \ 42 *(.ARM.extab.exit.text) \ 43 *(.ARM.exidx.text.exit) \ 44 *(.ARM.extab.text.exit) \ 45 ARM_CPU_DISCARD(*(.ARM.exidx.cpuexit.text)) \ 46 ARM_CPU_DISCARD(*(.ARM.extab.cpuexit.text)) \ 47 ARM_EXIT_DISCARD(EXIT_TEXT) \ 48 ARM_EXIT_DISCARD(EXIT_DATA) \ 49 EXIT_CALL \ 50 ARM_MMU_DISCARD(*(.text.fixup)) \ 51 ARM_MMU_DISCARD(*(__ex_table)) \ 52 *(.discard) \ 53 *(.discard.*) 54 55#define ARM_TEXT \ 56 IDMAP_TEXT \ 57 __entry_text_start = .; \ 58 *(.entry.text) \ 59 __entry_text_end = .; \ 60 IRQENTRY_TEXT \ 61 SOFTIRQENTRY_TEXT \ 62 TEXT_TEXT \ 63 SCHED_TEXT \ 64 CPUIDLE_TEXT \ 65 LOCK_TEXT \ 66 KPROBES_TEXT \ 67 *(.gnu.warning) \ 68 *(.glue_7) \ 69 *(.glue_7t) \ 70 . = ALIGN(4); \ 71 *(.got) /* Global offset table */ \ 72 ARM_CPU_KEEP(PROC_INFO) 73 74/* Stack unwinding tables */ 75#define ARM_UNWIND_SECTIONS \ 76 . = ALIGN(8); \ 77 .ARM.unwind_idx : { \ 78 __start_unwind_idx = .; \ 79 *(.ARM.exidx*) \ 80 __stop_unwind_idx = .; \ 81 } \ 82 .ARM.unwind_tab : { \ 83 __start_unwind_tab = .; \ 84 *(.ARM.extab*) \ 85 __stop_unwind_tab = .; \ 86 } 87 88/* 89 * The vectors and stubs are relocatable code, and the 90 * only thing that matters is their relative offsets 91 */ 92#define ARM_VECTORS \ 93 __vectors_start = .; \ 94 .vectors 0xffff0000 : AT(__vectors_start) { \ 95 *(.vectors) \ 96 } \ 97 . = __vectors_start + SIZEOF(.vectors); \ 98 __vectors_end = .; \ 99 \ 100 __stubs_start = .; \ 101 .stubs ADDR(.vectors) + 0x1000 : AT(__stubs_start) { \ 102 *(.stubs) \ 103 } \ 104 . = __stubs_start + SIZEOF(.stubs); \ 105 __stubs_end = .; \ 106 \ 107 PROVIDE(vector_fiq_offset = vector_fiq - ADDR(.vectors)); 108 109#define ARM_TCM \ 110 __itcm_start = ALIGN(4); \ 111 .text_itcm ITCM_OFFSET : AT(__itcm_start - LOAD_OFFSET) { \ 112 __sitcm_text = .; \ 113 *(.tcm.text) \ 114 *(.tcm.rodata) \ 115 . = ALIGN(4); \ 116 __eitcm_text = .; \ 117 } \ 118 . = __itcm_start + SIZEOF(.text_itcm); \ 119 \ 120 __dtcm_start = .; \ 121 .data_dtcm DTCM_OFFSET : AT(__dtcm_start - LOAD_OFFSET) { \ 122 __sdtcm_data = .; \ 123 *(.tcm.data) \ 124 . = ALIGN(4); \ 125 __edtcm_data = .; \ 126 } \ 127 . = __dtcm_start + SIZEOF(.data_dtcm); 128