/* SPDX-License-Identifier: GPL-2.0 */#include <asm-generic/vmlinux.lds.h> #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) KEEP(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 #ifdef CONFIG_LD_CAN_USE_KEEP_IN_OVERLAY#define OVERLAY_KEEP(x) KEEP(x)#else#define OVERLAY_KEEP(x) x#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 = .; \ *(.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 = .; \ *(.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_lma = .; \ OVERLAY 0xffff0000 : NOCROSSREFS AT(__vectors_lma) { \ .vectors { \ OVERLAY_KEEP(*(.vectors)) \ } \ .vectors.bhb.loop8 { \ OVERLAY_KEEP(*(.vectors.bhb.loop8)) \ } \ .vectors.bhb.bpiall { \ OVERLAY_KEEP(*(.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) { \ *(.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);
/* SPDX-License-Identifier: GPL-2.0 */
#include <asm-generic/vmlinux.lds.h>
#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) KEEP(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
#ifdef CONFIG_LD_CAN_USE_KEEP_IN_OVERLAY
#define OVERLAY_KEEP(x) KEEP(x)
#else
#define OVERLAY_KEEP(x) x
#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 = .; \
*(.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 = .; \
*(.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_lma = .; \
OVERLAY 0xffff0000 : NOCROSSREFS AT(__vectors_lma) { \
.vectors { \
OVERLAY_KEEP(*(.vectors)) \
} \
.vectors.bhb.loop8 { \
OVERLAY_KEEP(*(.vectors.bhb.loop8)) \
} \
.vectors.bhb.bpiall { \
OVERLAY_KEEP(*(.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) { \
*(.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);