/* 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); \ __proc_info_begin = .; \ *(.proc.info.init) \ __proc_info_end = .; #define HYPERVISOR_TEXT \ __hyp_text_start = .; \ *(.hyp.text) \ __hyp_text_end = .; #define IDMAP_TEXT \ ALIGN_FUNCTION(); \ __idmap_text_start = .; \ *(.idmap.text) \ __idmap_text_end = .; \ . = ALIGN(PAGE_SIZE); \ __hyp_idmap_text_start = .; \ *(.hyp.idmap.text) \ __hyp_idmap_text_end = .; #define ARM_DISCARD \ *(.ARM.exidx.exit.text) \ *(.ARM.extab.exit.text) \ *(.ARM.exidx.text.exit) \ *(.ARM.extab.text.exit) \ 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);