162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci#include <asm-generic/vmlinux.lds.h>
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci#ifdef CONFIG_HOTPLUG_CPU
562306a36Sopenharmony_ci#define ARM_CPU_DISCARD(x)
662306a36Sopenharmony_ci#define ARM_CPU_KEEP(x)		x
762306a36Sopenharmony_ci#else
862306a36Sopenharmony_ci#define ARM_CPU_DISCARD(x)	x
962306a36Sopenharmony_ci#define ARM_CPU_KEEP(x)
1062306a36Sopenharmony_ci#endif
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#if (defined(CONFIG_SMP_ON_UP) && !defined(CONFIG_DEBUG_SPINLOCK)) || \
1362306a36Sopenharmony_ci	defined(CONFIG_GENERIC_BUG) || defined(CONFIG_JUMP_LABEL)
1462306a36Sopenharmony_ci#define ARM_EXIT_KEEP(x)	x
1562306a36Sopenharmony_ci#define ARM_EXIT_DISCARD(x)
1662306a36Sopenharmony_ci#else
1762306a36Sopenharmony_ci#define ARM_EXIT_KEEP(x)
1862306a36Sopenharmony_ci#define ARM_EXIT_DISCARD(x)	x
1962306a36Sopenharmony_ci#endif
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci#ifdef CONFIG_MMU
2262306a36Sopenharmony_ci#define ARM_MMU_KEEP(x)		x
2362306a36Sopenharmony_ci#define ARM_MMU_DISCARD(x)
2462306a36Sopenharmony_ci#else
2562306a36Sopenharmony_ci#define ARM_MMU_KEEP(x)
2662306a36Sopenharmony_ci#define ARM_MMU_DISCARD(x)	x
2762306a36Sopenharmony_ci#endif
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci/*
3062306a36Sopenharmony_ci * ld.lld does not support NOCROSSREFS:
3162306a36Sopenharmony_ci * https://github.com/ClangBuiltLinux/linux/issues/1609
3262306a36Sopenharmony_ci */
3362306a36Sopenharmony_ci#ifdef CONFIG_LD_IS_LLD
3462306a36Sopenharmony_ci#define NOCROSSREFS
3562306a36Sopenharmony_ci#endif
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci/* Set start/end symbol names to the LMA for the section */
3862306a36Sopenharmony_ci#define ARM_LMA(sym, section)						\
3962306a36Sopenharmony_ci	sym##_start = LOADADDR(section);				\
4062306a36Sopenharmony_ci	sym##_end = LOADADDR(section) + SIZEOF(section)
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci#define PROC_INFO							\
4362306a36Sopenharmony_ci		. = ALIGN(4);						\
4462306a36Sopenharmony_ci		__proc_info_begin = .;					\
4562306a36Sopenharmony_ci		*(.proc.info.init)					\
4662306a36Sopenharmony_ci		__proc_info_end = .;
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci#define IDMAP_TEXT							\
4962306a36Sopenharmony_ci		ALIGN_FUNCTION();					\
5062306a36Sopenharmony_ci		__idmap_text_start = .;					\
5162306a36Sopenharmony_ci		*(.idmap.text)						\
5262306a36Sopenharmony_ci		__idmap_text_end = .;					\
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_ci#define ARM_DISCARD							\
5562306a36Sopenharmony_ci		*(.ARM.exidx.exit.text)					\
5662306a36Sopenharmony_ci		*(.ARM.extab.exit.text)					\
5762306a36Sopenharmony_ci		*(.ARM.exidx.text.exit)					\
5862306a36Sopenharmony_ci		*(.ARM.extab.text.exit)					\
5962306a36Sopenharmony_ci		ARM_CPU_DISCARD(*(.ARM.exidx.cpuexit.text))		\
6062306a36Sopenharmony_ci		ARM_CPU_DISCARD(*(.ARM.extab.cpuexit.text))		\
6162306a36Sopenharmony_ci		ARM_EXIT_DISCARD(EXIT_TEXT)				\
6262306a36Sopenharmony_ci		ARM_EXIT_DISCARD(EXIT_DATA)				\
6362306a36Sopenharmony_ci		EXIT_CALL						\
6462306a36Sopenharmony_ci		ARM_MMU_DISCARD(*(.text.fixup))				\
6562306a36Sopenharmony_ci		ARM_MMU_DISCARD(*(__ex_table))				\
6662306a36Sopenharmony_ci		COMMON_DISCARDS
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_ci/*
6962306a36Sopenharmony_ci * Sections that should stay zero sized, which is safer to explicitly
7062306a36Sopenharmony_ci * check instead of blindly discarding.
7162306a36Sopenharmony_ci */
7262306a36Sopenharmony_ci#define ARM_ASSERTS							\
7362306a36Sopenharmony_ci	.plt : {							\
7462306a36Sopenharmony_ci		*(.iplt) *(.rel.iplt) *(.iplt) *(.igot.plt)		\
7562306a36Sopenharmony_ci	}								\
7662306a36Sopenharmony_ci	ASSERT(SIZEOF(.plt) == 0,					\
7762306a36Sopenharmony_ci	       "Unexpected run-time procedure linkages detected!")
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_ci#define ARM_DETAILS							\
8062306a36Sopenharmony_ci		ELF_DETAILS						\
8162306a36Sopenharmony_ci		.ARM.attributes 0 : { *(.ARM.attributes) }
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_ci#define ARM_STUBS_TEXT							\
8462306a36Sopenharmony_ci		*(.gnu.warning)						\
8562306a36Sopenharmony_ci		*(.glue_7)						\
8662306a36Sopenharmony_ci		*(.glue_7t)						\
8762306a36Sopenharmony_ci		*(.vfp11_veneer)                                        \
8862306a36Sopenharmony_ci		*(.v4_bx)
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_ci#define ARM_TEXT							\
9162306a36Sopenharmony_ci		IDMAP_TEXT						\
9262306a36Sopenharmony_ci		__entry_text_start = .;					\
9362306a36Sopenharmony_ci		*(.entry.text)						\
9462306a36Sopenharmony_ci		__entry_text_end = .;					\
9562306a36Sopenharmony_ci		IRQENTRY_TEXT						\
9662306a36Sopenharmony_ci		SOFTIRQENTRY_TEXT					\
9762306a36Sopenharmony_ci		TEXT_TEXT						\
9862306a36Sopenharmony_ci		SCHED_TEXT						\
9962306a36Sopenharmony_ci		LOCK_TEXT						\
10062306a36Sopenharmony_ci		KPROBES_TEXT						\
10162306a36Sopenharmony_ci		ARM_STUBS_TEXT						\
10262306a36Sopenharmony_ci		. = ALIGN(4);						\
10362306a36Sopenharmony_ci		*(.got)			/* Global offset table */	\
10462306a36Sopenharmony_ci		ARM_CPU_KEEP(PROC_INFO)
10562306a36Sopenharmony_ci
10662306a36Sopenharmony_ci/* Stack unwinding tables */
10762306a36Sopenharmony_ci#define ARM_UNWIND_SECTIONS						\
10862306a36Sopenharmony_ci	. = ALIGN(8);							\
10962306a36Sopenharmony_ci	.ARM.unwind_idx : {						\
11062306a36Sopenharmony_ci		__start_unwind_idx = .;					\
11162306a36Sopenharmony_ci		*(.ARM.exidx*)						\
11262306a36Sopenharmony_ci		__stop_unwind_idx = .;					\
11362306a36Sopenharmony_ci	}								\
11462306a36Sopenharmony_ci	.ARM.unwind_tab : {						\
11562306a36Sopenharmony_ci		__start_unwind_tab = .;					\
11662306a36Sopenharmony_ci		*(.ARM.extab*)						\
11762306a36Sopenharmony_ci		__stop_unwind_tab = .;					\
11862306a36Sopenharmony_ci	}
11962306a36Sopenharmony_ci
12062306a36Sopenharmony_ci/*
12162306a36Sopenharmony_ci * The vectors and stubs are relocatable code, and the
12262306a36Sopenharmony_ci * only thing that matters is their relative offsets
12362306a36Sopenharmony_ci */
12462306a36Sopenharmony_ci#define ARM_VECTORS							\
12562306a36Sopenharmony_ci	__vectors_lma = .;						\
12662306a36Sopenharmony_ci	OVERLAY 0xffff0000 : NOCROSSREFS AT(__vectors_lma) {		\
12762306a36Sopenharmony_ci		.vectors {						\
12862306a36Sopenharmony_ci			*(.vectors)					\
12962306a36Sopenharmony_ci		}							\
13062306a36Sopenharmony_ci		.vectors.bhb.loop8 {					\
13162306a36Sopenharmony_ci			*(.vectors.bhb.loop8)				\
13262306a36Sopenharmony_ci		}							\
13362306a36Sopenharmony_ci		.vectors.bhb.bpiall {					\
13462306a36Sopenharmony_ci			*(.vectors.bhb.bpiall)				\
13562306a36Sopenharmony_ci		}							\
13662306a36Sopenharmony_ci	}								\
13762306a36Sopenharmony_ci	ARM_LMA(__vectors, .vectors);					\
13862306a36Sopenharmony_ci	ARM_LMA(__vectors_bhb_loop8, .vectors.bhb.loop8);		\
13962306a36Sopenharmony_ci	ARM_LMA(__vectors_bhb_bpiall, .vectors.bhb.bpiall);		\
14062306a36Sopenharmony_ci	. = __vectors_lma + SIZEOF(.vectors) +				\
14162306a36Sopenharmony_ci		SIZEOF(.vectors.bhb.loop8) +				\
14262306a36Sopenharmony_ci		SIZEOF(.vectors.bhb.bpiall);				\
14362306a36Sopenharmony_ci									\
14462306a36Sopenharmony_ci	__stubs_lma = .;						\
14562306a36Sopenharmony_ci	.stubs ADDR(.vectors) + 0x1000 : AT(__stubs_lma) {		\
14662306a36Sopenharmony_ci		*(.stubs)						\
14762306a36Sopenharmony_ci	}								\
14862306a36Sopenharmony_ci	ARM_LMA(__stubs, .stubs);					\
14962306a36Sopenharmony_ci	. = __stubs_lma + SIZEOF(.stubs);				\
15062306a36Sopenharmony_ci									\
15162306a36Sopenharmony_ci	PROVIDE(vector_fiq_offset = vector_fiq - ADDR(.vectors));
15262306a36Sopenharmony_ci
15362306a36Sopenharmony_ci#define ARM_TCM								\
15462306a36Sopenharmony_ci	__itcm_start = ALIGN(4);					\
15562306a36Sopenharmony_ci	.text_itcm ITCM_OFFSET : AT(__itcm_start - LOAD_OFFSET) {	\
15662306a36Sopenharmony_ci		__sitcm_text = .;					\
15762306a36Sopenharmony_ci		*(.tcm.text)						\
15862306a36Sopenharmony_ci		*(.tcm.rodata)						\
15962306a36Sopenharmony_ci		. = ALIGN(4);						\
16062306a36Sopenharmony_ci		__eitcm_text = .;					\
16162306a36Sopenharmony_ci	}								\
16262306a36Sopenharmony_ci	. = __itcm_start + SIZEOF(.text_itcm);				\
16362306a36Sopenharmony_ci									\
16462306a36Sopenharmony_ci	__dtcm_start = .;						\
16562306a36Sopenharmony_ci	.data_dtcm DTCM_OFFSET : AT(__dtcm_start - LOAD_OFFSET) {	\
16662306a36Sopenharmony_ci		__sdtcm_data = .;					\
16762306a36Sopenharmony_ci		*(.tcm.data)						\
16862306a36Sopenharmony_ci		. = ALIGN(4);						\
16962306a36Sopenharmony_ci		__edtcm_data = .;					\
17062306a36Sopenharmony_ci	}								\
17162306a36Sopenharmony_ci	. = __dtcm_start + SIZEOF(.data_dtcm);
172