| /* SPDX-License-Identifier: GPL-2.0 */ |
| |
| #ifdef CONFIG_HOTPLUG_CPU |
| #define ARM_CPU_DISCARD(x) |
| #define ARM_CPU_KEEP(x) x |
| #else |
| #define ARM_CPU_DISCARD(x) x |
| #define ARM_CPU_KEEP(x) |
| #endif |
| |
| #if (defined(CONFIG_SMP_ON_UP) && !defined(CONFIG_DEBUG_SPINLOCK)) || \ |
| defined(CONFIG_GENERIC_BUG) || defined(CONFIG_JUMP_LABEL) |
| #define ARM_EXIT_KEEP(x) x |
| #define ARM_EXIT_DISCARD(x) |
| #else |
| #define ARM_EXIT_KEEP(x) |
| #define ARM_EXIT_DISCARD(x) x |
| #endif |
| |
| #ifdef CONFIG_MMU |
| #define ARM_MMU_KEEP(x) x |
| #define ARM_MMU_DISCARD(x) |
| #else |
| #define ARM_MMU_KEEP(x) |
| #define ARM_MMU_DISCARD(x) x |
| #endif |
| |
| #define PROC_INFO \ |
| . = ALIGN(4); \ |
| VMLINUX_SYMBOL(__proc_info_begin) = .; \ |
| *(.proc.info.init) \ |
| VMLINUX_SYMBOL(__proc_info_end) = .; |
| |
| #define HYPERVISOR_TEXT \ |
| VMLINUX_SYMBOL(__hyp_text_start) = .; \ |
| *(.hyp.text) \ |
| VMLINUX_SYMBOL(__hyp_text_end) = .; |
| |
| #define IDMAP_TEXT \ |
| ALIGN_FUNCTION(); \ |
| VMLINUX_SYMBOL(__idmap_text_start) = .; \ |
| *(.idmap.text) \ |
| VMLINUX_SYMBOL(__idmap_text_end) = .; \ |
| . = ALIGN(PAGE_SIZE); \ |
| VMLINUX_SYMBOL(__hyp_idmap_text_start) = .; \ |
| *(.hyp.idmap.text) \ |
| VMLINUX_SYMBOL(__hyp_idmap_text_end) = .; |
| |
| #define ARM_DISCARD \ |
| *(.ARM.exidx.exit.text) \ |
| *(.ARM.extab.exit.text) \ |
| ARM_CPU_DISCARD(*(.ARM.exidx.cpuexit.text)) \ |
| ARM_CPU_DISCARD(*(.ARM.extab.cpuexit.text)) \ |
| ARM_EXIT_DISCARD(EXIT_TEXT) \ |
| ARM_EXIT_DISCARD(EXIT_DATA) \ |
| EXIT_CALL \ |
| ARM_MMU_DISCARD(*(.text.fixup)) \ |
| ARM_MMU_DISCARD(*(__ex_table)) \ |
| *(.discard) \ |
| *(.discard.*) |
| |
| #define ARM_TEXT \ |
| IDMAP_TEXT \ |
| __entry_text_start = .; \ |
| *(.entry.text) \ |
| __entry_text_end = .; \ |
| IRQENTRY_TEXT \ |
| SOFTIRQENTRY_TEXT \ |
| TEXT_TEXT \ |
| SCHED_TEXT \ |
| CPUIDLE_TEXT \ |
| LOCK_TEXT \ |
| HYPERVISOR_TEXT \ |
| KPROBES_TEXT \ |
| *(.gnu.warning) \ |
| *(.glue_7) \ |
| *(.glue_7t) \ |
| . = ALIGN(4); \ |
| *(.got) /* Global offset table */ \ |
| ARM_CPU_KEEP(PROC_INFO) |
| |
| /* Stack unwinding tables */ |
| #define ARM_UNWIND_SECTIONS \ |
| . = ALIGN(8); \ |
| .ARM.unwind_idx : { \ |
| __start_unwind_idx = .; \ |
| *(.ARM.exidx*) \ |
| __stop_unwind_idx = .; \ |
| } \ |
| .ARM.unwind_tab : { \ |
| __start_unwind_tab = .; \ |
| *(.ARM.extab*) \ |
| __stop_unwind_tab = .; \ |
| } |
| |
| /* |
| * The vectors and stubs are relocatable code, and the |
| * only thing that matters is their relative offsets |
| */ |
| #define ARM_VECTORS \ |
| __vectors_start = .; \ |
| .vectors 0xffff0000 : AT(__vectors_start) { \ |
| *(.vectors) \ |
| } \ |
| . = __vectors_start + SIZEOF(.vectors); \ |
| __vectors_end = .; \ |
| \ |
| __stubs_start = .; \ |
| .stubs ADDR(.vectors) + 0x1000 : AT(__stubs_start) { \ |
| *(.stubs) \ |
| } \ |
| . = __stubs_start + SIZEOF(.stubs); \ |
| __stubs_end = .; \ |
| \ |
| PROVIDE(vector_fiq_offset = vector_fiq - ADDR(.vectors)); |
| |
| #define ARM_TCM \ |
| __itcm_start = ALIGN(4); \ |
| .text_itcm ITCM_OFFSET : AT(__itcm_start - LOAD_OFFSET) { \ |
| __sitcm_text = .; \ |
| *(.tcm.text) \ |
| *(.tcm.rodata) \ |
| . = ALIGN(4); \ |
| __eitcm_text = .; \ |
| } \ |
| . = __itcm_start + SIZEOF(.text_itcm); \ |
| \ |
| __dtcm_start = .; \ |
| .data_dtcm DTCM_OFFSET : AT(__dtcm_start - LOAD_OFFSET) { \ |
| __sdtcm_data = .; \ |
| *(.tcm.data) \ |
| . = ALIGN(4); \ |
| __edtcm_data = .; \ |
| } \ |
| . = __dtcm_start + SIZEOF(.data_dtcm); |