/* SPDX-License-Identifier: GPL-2.0 */ #include #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 /* * ld.lld does not support NOCROSSREFS: * https://github.com/ClangBuiltLinux/linux/issues/1609 */ #ifdef CONFIG_LD_IS_LLD #define NOCROSSREFS #endif /* Set start/end symbol names to the LMA for the section */ #define ARM_LMA(sym, section) \ sym##_start = LOADADDR(section); \ sym##_end = LOADADDR(section) + SIZEOF(section) #define PROC_INFO \ . = ALIGN(4); \ __proc_info_begin = .; \ KEEP(*(.proc.info.init)) \ __proc_info_end = .; #define IDMAP_TEXT \ ALIGN_FUNCTION(); \ __idmap_text_start = .; \ KEEP(*(.idmap.text)) \ __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)) \ COMMON_DISCARDS /* * Sections that should stay zero sized, which is safer to explicitly * check instead of blindly discarding. */ #define ARM_ASSERTS \ .plt : { \ *(.iplt) *(.rel.iplt) *(.iplt) *(.igot.plt) \ } \ ASSERT(SIZEOF(.plt) == 0, \ "Unexpected run-time procedure linkages detected!") #define ARM_DETAILS \ ELF_DETAILS \ .ARM.attributes 0 : { *(.ARM.attributes) } #define ARM_STUBS_TEXT \ *(.gnu.warning) \ *(.glue_7) \ *(.glue_7t) \ *(.vfp11_veneer) \ *(.v4_bx) #define ARM_TEXT \ IDMAP_TEXT \ __entry_text_start = .; \ *(.entry.text) \ __entry_text_end = .; \ IRQENTRY_TEXT \ SOFTIRQENTRY_TEXT \ TEXT_TEXT \ SCHED_TEXT \ LOCK_TEXT \ KPROBES_TEXT \ ARM_STUBS_TEXT \ . = 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 = .; \ KEEP(*(.ARM.exidx*)) \ __stop_unwind_idx = .; \ } \ .ARM.unwind_tab : { \ __start_unwind_tab = .; \ KEEP(*(.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_lma = .; \ OVERLAY 0xffff0000 : NOCROSSREFS AT(__vectors_lma) { \ .vectors { \ KEEP(*(.vectors)) \ } \ .vectors.bhb.loop8 { \ *(.vectors.bhb.loop8) \ } \ .vectors.bhb.bpiall { \ *(.vectors.bhb.bpiall) \ } \ } \ ARM_LMA(__vectors, .vectors); \ ARM_LMA(__vectors_bhb_loop8, .vectors.bhb.loop8); \ ARM_LMA(__vectors_bhb_bpiall, .vectors.bhb.bpiall); \ . = __vectors_lma + SIZEOF(.vectors) + \ SIZEOF(.vectors.bhb.loop8) + \ SIZEOF(.vectors.bhb.bpiall); \ \ __stubs_lma = .; \ .stubs ADDR(.vectors) + 0x1000 : AT(__stubs_lma) { \ KEEP(*(.stubs)) \ } \ ARM_LMA(__stubs, .stubs); \ . = __stubs_lma + SIZEOF(.stubs); \ \ 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);