177 lines · 4.5 KB · C
RawDownload
/* 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);