1ef53dae8SSam Ravnborg /*
2ef53dae8SSam Ravnborg  * Helper macros to support writing architecture specific
3ef53dae8SSam Ravnborg  * linker scripts.
4ef53dae8SSam Ravnborg  *
5ef53dae8SSam Ravnborg  * A minimal linker scripts has following content:
6ef53dae8SSam Ravnborg  * [This is a sample, architectures may have special requiriements]
7ef53dae8SSam Ravnborg  *
8ef53dae8SSam Ravnborg  * OUTPUT_FORMAT(...)
9ef53dae8SSam Ravnborg  * OUTPUT_ARCH(...)
10ef53dae8SSam Ravnborg  * ENTRY(...)
11ef53dae8SSam Ravnborg  * SECTIONS
12ef53dae8SSam Ravnborg  * {
13ef53dae8SSam Ravnborg  *	. = START;
14ef53dae8SSam Ravnborg  *	__init_begin = .;
157923f90fSSam Ravnborg  *	HEAD_TEXT_SECTION
16ef53dae8SSam Ravnborg  *	INIT_TEXT_SECTION(PAGE_SIZE)
17ef53dae8SSam Ravnborg  *	INIT_DATA_SECTION(...)
180415b00dSTejun Heo  *	PERCPU_SECTION(CACHELINE_SIZE)
19ef53dae8SSam Ravnborg  *	__init_end = .;
20ef53dae8SSam Ravnborg  *
21ef53dae8SSam Ravnborg  *	_stext = .;
22ef53dae8SSam Ravnborg  *	TEXT_SECTION = 0
23ef53dae8SSam Ravnborg  *	_etext = .;
24ef53dae8SSam Ravnborg  *
25ef53dae8SSam Ravnborg  *      _sdata = .;
2693240b32SKees Cook  *	RO_DATA(PAGE_SIZE)
27ef53dae8SSam Ravnborg  *	RW_DATA_SECTION(...)
28ef53dae8SSam Ravnborg  *	_edata = .;
29ef53dae8SSam Ravnborg  *
30ef53dae8SSam Ravnborg  *	EXCEPTION_TABLE(...)
31ef53dae8SSam Ravnborg  *
3204e448d9STim Abbott  *	BSS_SECTION(0, 0, 0)
33ef53dae8SSam Ravnborg  *	_end = .;
34ef53dae8SSam Ravnborg  *
35ef53dae8SSam Ravnborg  *	STABS_DEBUG
36ef53dae8SSam Ravnborg  *	DWARF_DEBUG
37023bf6f1STejun Heo  *
38023bf6f1STejun Heo  *	DISCARDS		// must be the last
39ef53dae8SSam Ravnborg  * }
40ef53dae8SSam Ravnborg  *
41ef53dae8SSam Ravnborg  * [__init_begin, __init_end] is the init section that may be freed after init
42562c85caSYalin Wang  * 	// __init_begin and __init_end should be page aligned, so that we can
43562c85caSYalin Wang  *	// free the whole .init memory
44ef53dae8SSam Ravnborg  * [_stext, _etext] is the text section
45ef53dae8SSam Ravnborg  * [_sdata, _edata] is the data section
46ef53dae8SSam Ravnborg  *
47ef53dae8SSam Ravnborg  * Some of the included output section have their own set of constants.
48ef53dae8SSam Ravnborg  * Examples are: [__initramfs_start, __initramfs_end] for initramfs and
49ef53dae8SSam Ravnborg  *               [__nosave_begin, __nosave_end] for the nosave data
50ef53dae8SSam Ravnborg  */
51c80d471aSTim Abbott 
521da177e4SLinus Torvalds #ifndef LOAD_OFFSET
531da177e4SLinus Torvalds #define LOAD_OFFSET 0
541da177e4SLinus Torvalds #endif
551da177e4SLinus Torvalds 
56441110a5SKees Cook /*
57441110a5SKees Cook  * Only some architectures want to have the .notes segment visible in
58fbe6a8e6SKees Cook  * a separate PT_NOTE ELF Program Header. When this happens, it needs
59fbe6a8e6SKees Cook  * to be visible in both the kernel text's PT_LOAD and the PT_NOTE
60fbe6a8e6SKees Cook  * Program Headers. In this case, though, the PT_LOAD needs to be made
61fbe6a8e6SKees Cook  * the default again so that all the following sections don't also end
62fbe6a8e6SKees Cook  * up in the PT_NOTE Program Header.
63441110a5SKees Cook  */
64441110a5SKees Cook #ifdef EMITS_PT_NOTE
65441110a5SKees Cook #define NOTES_HEADERS		:text :note
66fbe6a8e6SKees Cook #define NOTES_HEADERS_RESTORE	__restore_ph : { *(.__restore_ph) } :text
67fbe6a8e6SKees Cook #else
68fbe6a8e6SKees Cook #define NOTES_HEADERS
69fbe6a8e6SKees Cook #define NOTES_HEADERS_RESTORE
70441110a5SKees Cook #endif
71441110a5SKees Cook 
726d30e3a8SSam Ravnborg /* Align . to a 8 byte boundary equals to maximum function alignment. */
736d30e3a8SSam Ravnborg #define ALIGN_FUNCTION()  . = ALIGN(8)
746d30e3a8SSam Ravnborg 
7507fca0e5SSam Ravnborg /*
76cb87481eSNicholas Piggin  * LD_DEAD_CODE_DATA_ELIMINATION option enables -fdata-sections, which
77cb87481eSNicholas Piggin  * generates .data.identifier sections, which need to be pulled in with
78cb87481eSNicholas Piggin  * .data. We don't want to pull in .data..other sections, which Linux
79cb87481eSNicholas Piggin  * has defined. Same for text and bss.
80266ff2a8SNicholas Piggin  *
81266ff2a8SNicholas Piggin  * RODATA_MAIN is not used because existing code already defines .rodata.x
82266ff2a8SNicholas Piggin  * sections to be brought in with rodata.
83cb87481eSNicholas Piggin  */
84cb87481eSNicholas Piggin #ifdef CONFIG_LD_DEAD_CODE_DATA_ELIMINATION
85cb87481eSNicholas Piggin #define TEXT_MAIN .text .text.[0-9a-zA-Z_]*
8652c8ee5bSPeter Oberparleiter #define DATA_MAIN .data .data.[0-9a-zA-Z_]* .data..LPBX*
87266ff2a8SNicholas Piggin #define SDATA_MAIN .sdata .sdata.[0-9a-zA-Z_]*
88266ff2a8SNicholas Piggin #define RODATA_MAIN .rodata .rodata.[0-9a-zA-Z_]*
89cb87481eSNicholas Piggin #define BSS_MAIN .bss .bss.[0-9a-zA-Z_]*
90266ff2a8SNicholas Piggin #define SBSS_MAIN .sbss .sbss.[0-9a-zA-Z_]*
91cb87481eSNicholas Piggin #else
92cb87481eSNicholas Piggin #define TEXT_MAIN .text
93cb87481eSNicholas Piggin #define DATA_MAIN .data
94266ff2a8SNicholas Piggin #define SDATA_MAIN .sdata
95266ff2a8SNicholas Piggin #define RODATA_MAIN .rodata
96cb87481eSNicholas Piggin #define BSS_MAIN .bss
97266ff2a8SNicholas Piggin #define SBSS_MAIN .sbss
98cb87481eSNicholas Piggin #endif
99cb87481eSNicholas Piggin 
100cb87481eSNicholas Piggin /*
10107fca0e5SSam Ravnborg  * Align to a 32 byte boundary equal to the
10207fca0e5SSam Ravnborg  * alignment gcc 4.5 uses for a struct
10307fca0e5SSam Ravnborg  */
104aab94339SDirk Brandewie #define STRUCT_ALIGNMENT 32
105aab94339SDirk Brandewie #define STRUCT_ALIGN() . = ALIGN(STRUCT_ALIGNMENT)
10607fca0e5SSam Ravnborg 
107eb8f6890SSam Ravnborg /* The actual configuration determine if the init/exit sections
108eb8f6890SSam Ravnborg  * are handled as text/data or they can be discarded (which
109eb8f6890SSam Ravnborg  * often happens at runtime)
110eb8f6890SSam Ravnborg  */
111eb8f6890SSam Ravnborg #ifdef CONFIG_HOTPLUG_CPU
112eb8f6890SSam Ravnborg #define CPU_KEEP(sec)    *(.cpu##sec)
113eb8f6890SSam Ravnborg #define CPU_DISCARD(sec)
114eb8f6890SSam Ravnborg #else
115eb8f6890SSam Ravnborg #define CPU_KEEP(sec)
116eb8f6890SSam Ravnborg #define CPU_DISCARD(sec) *(.cpu##sec)
117eb8f6890SSam Ravnborg #endif
118eb8f6890SSam Ravnborg 
1191a3fb6d4SAdrian Bunk #if defined(CONFIG_MEMORY_HOTPLUG)
120eb8f6890SSam Ravnborg #define MEM_KEEP(sec)    *(.mem##sec)
121eb8f6890SSam Ravnborg #define MEM_DISCARD(sec)
122eb8f6890SSam Ravnborg #else
123eb8f6890SSam Ravnborg #define MEM_KEEP(sec)
124eb8f6890SSam Ravnborg #define MEM_DISCARD(sec) *(.mem##sec)
125eb8f6890SSam Ravnborg #endif
126eb8f6890SSam Ravnborg 
1278da3821bSSteven Rostedt #ifdef CONFIG_FTRACE_MCOUNT_RECORD
1286ca63662SSven Schnelle #ifdef CC_USING_PATCHABLE_FUNCTION_ENTRY
1296ca63662SSven Schnelle #define MCOUNT_REC()	. = ALIGN(8);				\
1306ca63662SSven Schnelle 			__start_mcount_loc = .;			\
1316ca63662SSven Schnelle 			KEEP(*(__patchable_function_entries))	\
1326ca63662SSven Schnelle 			__stop_mcount_loc = .;
1336ca63662SSven Schnelle #else
1344b3b4c5eSJohn Reiser #define MCOUNT_REC()	. = ALIGN(8);				\
135a6214385SMasahiro Yamada 			__start_mcount_loc = .;			\
136266ff2a8SNicholas Piggin 			KEEP(*(__mcount_loc))			\
137a6214385SMasahiro Yamada 			__stop_mcount_loc = .;
1386ca63662SSven Schnelle #endif
1398da3821bSSteven Rostedt #else
1408da3821bSSteven Rostedt #define MCOUNT_REC()
1418da3821bSSteven Rostedt #endif
142eb8f6890SSam Ravnborg 
1432ed84eebSSteven Rostedt #ifdef CONFIG_TRACE_BRANCH_PROFILING
144a6214385SMasahiro Yamada #define LIKELY_PROFILE()	__start_annotated_branch_profile = .;	\
145266ff2a8SNicholas Piggin 				KEEP(*(_ftrace_annotated_branch))	\
146a6214385SMasahiro Yamada 				__stop_annotated_branch_profile = .;
1471f0d69a9SSteven Rostedt #else
1481f0d69a9SSteven Rostedt #define LIKELY_PROFILE()
1491f0d69a9SSteven Rostedt #endif
1501f0d69a9SSteven Rostedt 
1512bcd521aSSteven Rostedt #ifdef CONFIG_PROFILE_ALL_BRANCHES
152a6214385SMasahiro Yamada #define BRANCH_PROFILE()	__start_branch_profile = .;		\
153266ff2a8SNicholas Piggin 				KEEP(*(_ftrace_branch))			\
154a6214385SMasahiro Yamada 				__stop_branch_profile = .;
1552bcd521aSSteven Rostedt #else
1562bcd521aSSteven Rostedt #define BRANCH_PROFILE()
1572bcd521aSSteven Rostedt #endif
1582bcd521aSSteven Rostedt 
159376e2424SMasami Hiramatsu #ifdef CONFIG_KPROBES
16069902c71SVineet Gupta #define KPROBE_BLACKLIST()	. = ALIGN(8);				      \
161a6214385SMasahiro Yamada 				__start_kprobe_blacklist = .;		      \
1624b89b7f7SNicholas Piggin 				KEEP(*(_kprobe_blacklist))		      \
163a6214385SMasahiro Yamada 				__stop_kprobe_blacklist = .;
164376e2424SMasami Hiramatsu #else
165376e2424SMasami Hiramatsu #define KPROBE_BLACKLIST()
166376e2424SMasami Hiramatsu #endif
167376e2424SMasami Hiramatsu 
168540adea3SMasami Hiramatsu #ifdef CONFIG_FUNCTION_ERROR_INJECTION
169663faf9fSMasami Hiramatsu #define ERROR_INJECT_WHITELIST()	STRUCT_ALIGN();			      \
170a6214385SMasahiro Yamada 			__start_error_injection_whitelist = .;		      \
171540adea3SMasami Hiramatsu 			KEEP(*(_error_injection_whitelist))		      \
172a6214385SMasahiro Yamada 			__stop_error_injection_whitelist = .;
17392ace999SJosef Bacik #else
174540adea3SMasami Hiramatsu #define ERROR_INJECT_WHITELIST()
17592ace999SJosef Bacik #endif
17692ace999SJosef Bacik 
1775f77a88bSTom Zanussi #ifdef CONFIG_EVENT_TRACING
178e4a9ea5eSSteven Rostedt #define FTRACE_EVENTS()	. = ALIGN(8);					\
179a6214385SMasahiro Yamada 			__start_ftrace_events = .;			\
1804b89b7f7SNicholas Piggin 			KEEP(*(_ftrace_events))				\
181a6214385SMasahiro Yamada 			__stop_ftrace_events = .;			\
182a6214385SMasahiro Yamada 			__start_ftrace_eval_maps = .;			\
18302fd7f68SJeremy Linton 			KEEP(*(_ftrace_eval_map))			\
184a6214385SMasahiro Yamada 			__stop_ftrace_eval_maps = .;
185b77e38aaSSteven Rostedt #else
186b77e38aaSSteven Rostedt #define FTRACE_EVENTS()
187b77e38aaSSteven Rostedt #endif
188b77e38aaSSteven Rostedt 
1891ba28e02SLai Jiangshan #ifdef CONFIG_TRACING
190a6214385SMasahiro Yamada #define TRACE_PRINTKS()	 __start___trace_bprintk_fmt = .;      \
1914b89b7f7SNicholas Piggin 			 KEEP(*(__trace_printk_fmt)) /* Trace_printk fmt' pointer */ \
192a6214385SMasahiro Yamada 			 __stop___trace_bprintk_fmt = .;
193a6214385SMasahiro Yamada #define TRACEPOINT_STR() __start___tracepoint_str = .;	\
1944b89b7f7SNicholas Piggin 			 KEEP(*(__tracepoint_str)) /* Trace_printk fmt' pointer */ \
195a6214385SMasahiro Yamada 			 __stop___tracepoint_str = .;
1961ba28e02SLai Jiangshan #else
1971ba28e02SLai Jiangshan #define TRACE_PRINTKS()
198102c9323SSteven Rostedt (Red Hat) #define TRACEPOINT_STR()
1991ba28e02SLai Jiangshan #endif
2001ba28e02SLai Jiangshan 
201bed1ffcaSFrederic Weisbecker #ifdef CONFIG_FTRACE_SYSCALLS
2023d56e331SSteven Rostedt #define TRACE_SYSCALLS() . = ALIGN(8);					\
203a6214385SMasahiro Yamada 			 __start_syscalls_metadata = .;			\
2044b89b7f7SNicholas Piggin 			 KEEP(*(__syscalls_metadata))			\
205a6214385SMasahiro Yamada 			 __stop_syscalls_metadata = .;
206bed1ffcaSFrederic Weisbecker #else
207bed1ffcaSFrederic Weisbecker #define TRACE_SYSCALLS()
208bed1ffcaSFrederic Weisbecker #endif
209bed1ffcaSFrederic Weisbecker 
210c4f6699dSAlexei Starovoitov #ifdef CONFIG_BPF_EVENTS
211c4f6699dSAlexei Starovoitov #define BPF_RAW_TP() STRUCT_ALIGN();					\
212a6214385SMasahiro Yamada 			 __start__bpf_raw_tp = .;			\
213c4f6699dSAlexei Starovoitov 			 KEEP(*(__bpf_raw_tp_map))			\
214a6214385SMasahiro Yamada 			 __stop__bpf_raw_tp = .;
215c4f6699dSAlexei Starovoitov #else
216c4f6699dSAlexei Starovoitov #define BPF_RAW_TP()
217c4f6699dSAlexei Starovoitov #endif
218c4f6699dSAlexei Starovoitov 
219470ca0deSPeter Hurley #ifdef CONFIG_SERIAL_EARLYCON
220dd709e72SDaniel Kurtz #define EARLYCON_TABLE() . = ALIGN(8);				\
221a6214385SMasahiro Yamada 			 __earlycon_table = .;			\
2224b89b7f7SNicholas Piggin 			 KEEP(*(__earlycon_table))		\
223a6214385SMasahiro Yamada 			 __earlycon_table_end = .;
224470ca0deSPeter Hurley #else
225470ca0deSPeter Hurley #define EARLYCON_TABLE()
226470ca0deSPeter Hurley #endif
227aab94339SDirk Brandewie 
2283ac946d1SKees Cook #ifdef CONFIG_SECURITY
2293ac946d1SKees Cook #define LSM_TABLE()	. = ALIGN(8);					\
2303ac946d1SKees Cook 			__start_lsm_info = .;				\
2313ac946d1SKees Cook 			KEEP(*(.lsm_info.init))				\
2323ac946d1SKees Cook 			__end_lsm_info = .;
233e6b1db98SMatthew Garrett #define EARLY_LSM_TABLE()	. = ALIGN(8);				\
234e6b1db98SMatthew Garrett 			__start_early_lsm_info = .;			\
235e6b1db98SMatthew Garrett 			KEEP(*(.early_lsm_info.init))			\
236e6b1db98SMatthew Garrett 			__end_early_lsm_info = .;
2373ac946d1SKees Cook #else
2383ac946d1SKees Cook #define LSM_TABLE()
239e6b1db98SMatthew Garrett #define EARLY_LSM_TABLE()
2403ac946d1SKees Cook #endif
2413ac946d1SKees Cook 
24206309288SRob Herring #define ___OF_TABLE(cfg, name)	_OF_TABLE_##cfg(name)
24306309288SRob Herring #define __OF_TABLE(cfg, name)	___OF_TABLE(cfg, name)
2445ee02af1SMasahiro Yamada #define OF_TABLE(cfg, name)	__OF_TABLE(IS_ENABLED(cfg), name)
24506309288SRob Herring #define _OF_TABLE_0(name)
24606309288SRob Herring #define _OF_TABLE_1(name)						\
247f6e916b8SThomas Petazzoni 	. = ALIGN(8);							\
248a6214385SMasahiro Yamada 	__##name##_of_table = .;					\
2494b89b7f7SNicholas Piggin 	KEEP(*(__##name##_of_table))					\
2504b89b7f7SNicholas Piggin 	KEEP(*(__##name##_of_table_end))
251aab94339SDirk Brandewie 
252bb0eb050SDaniel Lezcano #define TIMER_OF_TABLES()	OF_TABLE(CONFIG_TIMER_OF, timer)
25306309288SRob Herring #define IRQCHIP_OF_MATCH_TABLE() OF_TABLE(CONFIG_IRQCHIP, irqchip)
25406309288SRob Herring #define CLK_OF_TABLES()		OF_TABLE(CONFIG_COMMON_CLK, clk)
25506309288SRob Herring #define RESERVEDMEM_OF_TABLES()	OF_TABLE(CONFIG_OF_RESERVED_MEM, reservedmem)
25606309288SRob Herring #define CPU_METHOD_OF_TABLES()	OF_TABLE(CONFIG_SMP, cpu_method)
257449e056cSDaniel Lezcano #define CPUIDLE_METHOD_OF_TABLES() OF_TABLE(CONFIG_CPU_IDLE, cpuidle_method)
2586c3ff8b1SStephen Boyd 
259e647b532SMarc Zyngier #ifdef CONFIG_ACPI
260e647b532SMarc Zyngier #define ACPI_PROBE_TABLE(name)						\
261e647b532SMarc Zyngier 	. = ALIGN(8);							\
262a6214385SMasahiro Yamada 	__##name##_acpi_probe_table = .;				\
2634b89b7f7SNicholas Piggin 	KEEP(*(__##name##_acpi_probe_table))				\
264a6214385SMasahiro Yamada 	__##name##_acpi_probe_table_end = .;
265e647b532SMarc Zyngier #else
266e647b532SMarc Zyngier #define ACPI_PROBE_TABLE(name)
267e647b532SMarc Zyngier #endif
268e647b532SMarc Zyngier 
269980af75eSDaniel Lezcano #ifdef CONFIG_THERMAL
270980af75eSDaniel Lezcano #define THERMAL_TABLE(name)						\
271980af75eSDaniel Lezcano 	. = ALIGN(8);							\
272980af75eSDaniel Lezcano 	__##name##_thermal_table = .;					\
273980af75eSDaniel Lezcano 	KEEP(*(__##name##_thermal_table))				\
274980af75eSDaniel Lezcano 	__##name##_thermal_table_end = .;
275980af75eSDaniel Lezcano #else
276980af75eSDaniel Lezcano #define THERMAL_TABLE(name)
277980af75eSDaniel Lezcano #endif
278980af75eSDaniel Lezcano 
279aab94339SDirk Brandewie #define KERNEL_DTB()							\
280aab94339SDirk Brandewie 	STRUCT_ALIGN();							\
281a6214385SMasahiro Yamada 	__dtb_start = .;						\
2824b89b7f7SNicholas Piggin 	KEEP(*(.dtb.init.rodata))					\
283a6214385SMasahiro Yamada 	__dtb_end = .;
284aab94339SDirk Brandewie 
285b67067f1SNicholas Piggin /*
286b67067f1SNicholas Piggin  * .data section
287b67067f1SNicholas Piggin  */
288ca967258SSam Ravnborg #define DATA_DATA							\
289129f6c48SArnd Bergmann 	*(.xiptext)							\
290cb87481eSNicholas Piggin 	*(DATA_MAIN)							\
291312b1485SSam Ravnborg 	*(.ref.data)							\
292d356c0b6SMike Frysinger 	*(.data..shared_aligned) /* percpu related */			\
293266ff2a8SNicholas Piggin 	MEM_KEEP(init.data*)						\
294266ff2a8SNicholas Piggin 	MEM_KEEP(exit.data*)						\
2957ccaba53SJan Beulich 	*(.data.unlikely)						\
296a6214385SMasahiro Yamada 	__start_once = .;						\
297b1fca27dSAndi Kleen 	*(.data.once)							\
298a6214385SMasahiro Yamada 	__end_once = .;							\
29965498646SMathieu Desnoyers 	STRUCT_ALIGN();							\
30097e1c18eSMathieu Desnoyers 	*(__tracepoints)						\
301e9d376f0SJason Baron 	/* implement dynamic printk debug */				\
302e9d376f0SJason Baron 	. = ALIGN(8);							\
303a6214385SMasahiro Yamada 	__start___verbose = .;						\
3044b89b7f7SNicholas Piggin 	KEEP(*(__verbose))                                              \
305a6214385SMasahiro Yamada 	__stop___verbose = .;						\
3062bcd521aSSteven Rostedt 	LIKELY_PROFILE()		       				\
307b77e38aaSSteven Rostedt 	BRANCH_PROFILE()						\
308102c9323SSteven Rostedt (Red Hat) 	TRACE_PRINTKS()							\
309c4f6699dSAlexei Starovoitov 	BPF_RAW_TP()							\
310102c9323SSteven Rostedt (Red Hat) 	TRACEPOINT_STR()
311ca967258SSam Ravnborg 
312ef53dae8SSam Ravnborg /*
313ef53dae8SSam Ravnborg  * Data section helpers
314ef53dae8SSam Ravnborg  */
315ef53dae8SSam Ravnborg #define NOSAVE_DATA							\
316ef53dae8SSam Ravnborg 	. = ALIGN(PAGE_SIZE);						\
317a6214385SMasahiro Yamada 	__nosave_begin = .;						\
31807b3bb1eSDenys Vlasenko 	*(.data..nosave)						\
319ef53dae8SSam Ravnborg 	. = ALIGN(PAGE_SIZE);						\
320a6214385SMasahiro Yamada 	__nosave_end = .;
321ef53dae8SSam Ravnborg 
322ef53dae8SSam Ravnborg #define PAGE_ALIGNED_DATA(page_align)					\
323ef53dae8SSam Ravnborg 	. = ALIGN(page_align);						\
32475b13483STim Abbott 	*(.data..page_aligned)
325ef53dae8SSam Ravnborg 
326ef53dae8SSam Ravnborg #define READ_MOSTLY_DATA(align)						\
327ef53dae8SSam Ravnborg 	. = ALIGN(align);						\
3288369744fSShaohua Li 	*(.data..read_mostly)						\
3298369744fSShaohua Li 	. = ALIGN(align);
330ef53dae8SSam Ravnborg 
331ef53dae8SSam Ravnborg #define CACHELINE_ALIGNED_DATA(align)					\
332ef53dae8SSam Ravnborg 	. = ALIGN(align);						\
3334af57b78STim Abbott 	*(.data..cacheline_aligned)
334ef53dae8SSam Ravnborg 
33539a449d9STim Abbott #define INIT_TASK_DATA(align)						\
336ef53dae8SSam Ravnborg 	. = ALIGN(align);						\
337a6214385SMasahiro Yamada 	__start_init_task = .;						\
338a6214385SMasahiro Yamada 	init_thread_union = .;						\
339a6214385SMasahiro Yamada 	init_stack = .;							\
340266ff2a8SNicholas Piggin 	KEEP(*(.data..init_task))					\
341266ff2a8SNicholas Piggin 	KEEP(*(.data..init_thread_info))				\
342a6214385SMasahiro Yamada 	. = __start_init_task + THREAD_SIZE;				\
343a6214385SMasahiro Yamada 	__end_init_task = .;
344ef53dae8SSam Ravnborg 
345e872267bSArd Biesheuvel #define JUMP_TABLE_DATA							\
346e872267bSArd Biesheuvel 	. = ALIGN(8);							\
347e872267bSArd Biesheuvel 	__start___jump_table = .;					\
348e872267bSArd Biesheuvel 	KEEP(*(__jump_table))						\
349e872267bSArd Biesheuvel 	__stop___jump_table = .;
350e872267bSArd Biesheuvel 
351ef53dae8SSam Ravnborg /*
35232fb2fc5SHeiko Carstens  * Allow architectures to handle ro_after_init data on their
35332fb2fc5SHeiko Carstens  * own by defining an empty RO_AFTER_INIT_DATA.
35432fb2fc5SHeiko Carstens  */
35532fb2fc5SHeiko Carstens #ifndef RO_AFTER_INIT_DATA
356d7c19b06SJakub Kicinski #define RO_AFTER_INIT_DATA						\
357a6214385SMasahiro Yamada 	__start_ro_after_init = .;					\
358d7c19b06SJakub Kicinski 	*(.data..ro_after_init)						\
359e872267bSArd Biesheuvel 	JUMP_TABLE_DATA							\
360a6214385SMasahiro Yamada 	__end_ro_after_init = .;
36132fb2fc5SHeiko Carstens #endif
36232fb2fc5SHeiko Carstens 
36332fb2fc5SHeiko Carstens /*
364ef53dae8SSam Ravnborg  * Read only Data
365ef53dae8SSam Ravnborg  */
36693240b32SKees Cook #define RO_DATA(align)							\
3674096b46fSSam Ravnborg 	. = ALIGN((align));						\
3681da177e4SLinus Torvalds 	.rodata           : AT(ADDR(.rodata) - LOAD_OFFSET) {		\
369a6214385SMasahiro Yamada 		__start_rodata = .;					\
3701da177e4SLinus Torvalds 		*(.rodata) *(.rodata.*)					\
37132fb2fc5SHeiko Carstens 		RO_AFTER_INIT_DATA	/* Read only after init */	\
37265498646SMathieu Desnoyers 		. = ALIGN(8);						\
373a6214385SMasahiro Yamada 		__start___tracepoints_ptrs = .;				\
3744b89b7f7SNicholas Piggin 		KEEP(*(__tracepoints_ptrs)) /* Tracepoints: pointer array */ \
375a6214385SMasahiro Yamada 		__stop___tracepoints_ptrs = .;				\
37697e1c18eSMathieu Desnoyers 		*(__tracepoints_strings)/* Tracepoints: strings */	\
3771da177e4SLinus Torvalds 	}								\
3781da177e4SLinus Torvalds 									\
3791da177e4SLinus Torvalds 	.rodata1          : AT(ADDR(.rodata1) - LOAD_OFFSET) {		\
3801da177e4SLinus Torvalds 		*(.rodata1)						\
3811da177e4SLinus Torvalds 	}								\
3821da177e4SLinus Torvalds 									\
3831da177e4SLinus Torvalds 	/* PCI quirks */						\
3841da177e4SLinus Torvalds 	.pci_fixup        : AT(ADDR(.pci_fixup) - LOAD_OFFSET) {	\
385a6214385SMasahiro Yamada 		__start_pci_fixups_early = .;				\
3864b89b7f7SNicholas Piggin 		KEEP(*(.pci_fixup_early))				\
387a6214385SMasahiro Yamada 		__end_pci_fixups_early = .;				\
388a6214385SMasahiro Yamada 		__start_pci_fixups_header = .;				\
3894b89b7f7SNicholas Piggin 		KEEP(*(.pci_fixup_header))				\
390a6214385SMasahiro Yamada 		__end_pci_fixups_header = .;				\
391a6214385SMasahiro Yamada 		__start_pci_fixups_final = .;				\
3924b89b7f7SNicholas Piggin 		KEEP(*(.pci_fixup_final))				\
393a6214385SMasahiro Yamada 		__end_pci_fixups_final = .;				\
394a6214385SMasahiro Yamada 		__start_pci_fixups_enable = .;				\
3954b89b7f7SNicholas Piggin 		KEEP(*(.pci_fixup_enable))				\
396a6214385SMasahiro Yamada 		__end_pci_fixups_enable = .;				\
397a6214385SMasahiro Yamada 		__start_pci_fixups_resume = .;				\
3984b89b7f7SNicholas Piggin 		KEEP(*(.pci_fixup_resume))				\
399a6214385SMasahiro Yamada 		__end_pci_fixups_resume = .;				\
400a6214385SMasahiro Yamada 		__start_pci_fixups_resume_early = .;			\
4014b89b7f7SNicholas Piggin 		KEEP(*(.pci_fixup_resume_early))			\
402a6214385SMasahiro Yamada 		__end_pci_fixups_resume_early = .;			\
403a6214385SMasahiro Yamada 		__start_pci_fixups_suspend = .;				\
4044b89b7f7SNicholas Piggin 		KEEP(*(.pci_fixup_suspend))				\
405a6214385SMasahiro Yamada 		__end_pci_fixups_suspend = .;				\
406a6214385SMasahiro Yamada 		__start_pci_fixups_suspend_late = .;			\
4074b89b7f7SNicholas Piggin 		KEEP(*(.pci_fixup_suspend_late))			\
408a6214385SMasahiro Yamada 		__end_pci_fixups_suspend_late = .;			\
4091da177e4SLinus Torvalds 	}								\
4101da177e4SLinus Torvalds 									\
4115658c769SDavid Woodhouse 	/* Built-in firmware blobs */					\
4125658c769SDavid Woodhouse 	.builtin_fw        : AT(ADDR(.builtin_fw) - LOAD_OFFSET) {	\
413a6214385SMasahiro Yamada 		__start_builtin_fw = .;					\
4144b89b7f7SNicholas Piggin 		KEEP(*(.builtin_fw))					\
415a6214385SMasahiro Yamada 		__end_builtin_fw = .;					\
4165658c769SDavid Woodhouse 	}								\
4175658c769SDavid Woodhouse 									\
41863687a52SJan Beulich 	TRACEDATA							\
41963687a52SJan Beulich 									\
4201da177e4SLinus Torvalds 	/* Kernel symbol table: Normal symbols */			\
4211da177e4SLinus Torvalds 	__ksymtab         : AT(ADDR(__ksymtab) - LOAD_OFFSET) {		\
422a6214385SMasahiro Yamada 		__start___ksymtab = .;					\
423b67067f1SNicholas Piggin 		KEEP(*(SORT(___ksymtab+*)))				\
424a6214385SMasahiro Yamada 		__stop___ksymtab = .;					\
4251da177e4SLinus Torvalds 	}								\
4261da177e4SLinus Torvalds 									\
4271da177e4SLinus Torvalds 	/* Kernel symbol table: GPL-only symbols */			\
4281da177e4SLinus Torvalds 	__ksymtab_gpl     : AT(ADDR(__ksymtab_gpl) - LOAD_OFFSET) {	\
429a6214385SMasahiro Yamada 		__start___ksymtab_gpl = .;				\
430b67067f1SNicholas Piggin 		KEEP(*(SORT(___ksymtab_gpl+*)))				\
431a6214385SMasahiro Yamada 		__stop___ksymtab_gpl = .;				\
4321da177e4SLinus Torvalds 	}								\
4331da177e4SLinus Torvalds 									\
434f71d20e9SArjan van de Ven 	/* Kernel symbol table: Normal unused symbols */		\
435f71d20e9SArjan van de Ven 	__ksymtab_unused  : AT(ADDR(__ksymtab_unused) - LOAD_OFFSET) {	\
436a6214385SMasahiro Yamada 		__start___ksymtab_unused = .;				\
437b67067f1SNicholas Piggin 		KEEP(*(SORT(___ksymtab_unused+*)))			\
438a6214385SMasahiro Yamada 		__stop___ksymtab_unused = .;				\
439f71d20e9SArjan van de Ven 	}								\
440f71d20e9SArjan van de Ven 									\
441f71d20e9SArjan van de Ven 	/* Kernel symbol table: GPL-only unused symbols */		\
442f71d20e9SArjan van de Ven 	__ksymtab_unused_gpl : AT(ADDR(__ksymtab_unused_gpl) - LOAD_OFFSET) { \
443a6214385SMasahiro Yamada 		__start___ksymtab_unused_gpl = .;			\
444b67067f1SNicholas Piggin 		KEEP(*(SORT(___ksymtab_unused_gpl+*)))			\
445a6214385SMasahiro Yamada 		__stop___ksymtab_unused_gpl = .;			\
446f71d20e9SArjan van de Ven 	}								\
447f71d20e9SArjan van de Ven 									\
4489f28bb7eSGreg Kroah-Hartman 	/* Kernel symbol table: GPL-future-only symbols */		\
4499f28bb7eSGreg Kroah-Hartman 	__ksymtab_gpl_future : AT(ADDR(__ksymtab_gpl_future) - LOAD_OFFSET) { \
450a6214385SMasahiro Yamada 		__start___ksymtab_gpl_future = .;			\
451b67067f1SNicholas Piggin 		KEEP(*(SORT(___ksymtab_gpl_future+*)))			\
452a6214385SMasahiro Yamada 		__stop___ksymtab_gpl_future = .;			\
4539f28bb7eSGreg Kroah-Hartman 	}								\
4549f28bb7eSGreg Kroah-Hartman 									\
4551da177e4SLinus Torvalds 	/* Kernel symbol table: Normal symbols */			\
4561da177e4SLinus Torvalds 	__kcrctab         : AT(ADDR(__kcrctab) - LOAD_OFFSET) {		\
457a6214385SMasahiro Yamada 		__start___kcrctab = .;					\
458b67067f1SNicholas Piggin 		KEEP(*(SORT(___kcrctab+*)))				\
459a6214385SMasahiro Yamada 		__stop___kcrctab = .;					\
4601da177e4SLinus Torvalds 	}								\
4611da177e4SLinus Torvalds 									\
4621da177e4SLinus Torvalds 	/* Kernel symbol table: GPL-only symbols */			\
4631da177e4SLinus Torvalds 	__kcrctab_gpl     : AT(ADDR(__kcrctab_gpl) - LOAD_OFFSET) {	\
464a6214385SMasahiro Yamada 		__start___kcrctab_gpl = .;				\
465b67067f1SNicholas Piggin 		KEEP(*(SORT(___kcrctab_gpl+*)))				\
466a6214385SMasahiro Yamada 		__stop___kcrctab_gpl = .;				\
4671da177e4SLinus Torvalds 	}								\
4681da177e4SLinus Torvalds 									\
469f71d20e9SArjan van de Ven 	/* Kernel symbol table: Normal unused symbols */		\
470f71d20e9SArjan van de Ven 	__kcrctab_unused  : AT(ADDR(__kcrctab_unused) - LOAD_OFFSET) {	\
471a6214385SMasahiro Yamada 		__start___kcrctab_unused = .;				\
472b67067f1SNicholas Piggin 		KEEP(*(SORT(___kcrctab_unused+*)))			\
473a6214385SMasahiro Yamada 		__stop___kcrctab_unused = .;				\
474f71d20e9SArjan van de Ven 	}								\
475f71d20e9SArjan van de Ven 									\
476f71d20e9SArjan van de Ven 	/* Kernel symbol table: GPL-only unused symbols */		\
477f71d20e9SArjan van de Ven 	__kcrctab_unused_gpl : AT(ADDR(__kcrctab_unused_gpl) - LOAD_OFFSET) { \
478a6214385SMasahiro Yamada 		__start___kcrctab_unused_gpl = .;			\
479b67067f1SNicholas Piggin 		KEEP(*(SORT(___kcrctab_unused_gpl+*)))			\
480a6214385SMasahiro Yamada 		__stop___kcrctab_unused_gpl = .;			\
481f71d20e9SArjan van de Ven 	}								\
482f71d20e9SArjan van de Ven 									\
4839f28bb7eSGreg Kroah-Hartman 	/* Kernel symbol table: GPL-future-only symbols */		\
4849f28bb7eSGreg Kroah-Hartman 	__kcrctab_gpl_future : AT(ADDR(__kcrctab_gpl_future) - LOAD_OFFSET) { \
485a6214385SMasahiro Yamada 		__start___kcrctab_gpl_future = .;			\
486b67067f1SNicholas Piggin 		KEEP(*(SORT(___kcrctab_gpl_future+*)))			\
487a6214385SMasahiro Yamada 		__stop___kcrctab_gpl_future = .;			\
4889f28bb7eSGreg Kroah-Hartman 	}								\
4899f28bb7eSGreg Kroah-Hartman 									\
4901da177e4SLinus Torvalds 	/* Kernel symbol table: strings */				\
4911da177e4SLinus Torvalds         __ksymtab_strings : AT(ADDR(__ksymtab_strings) - LOAD_OFFSET) {	\
4924b89b7f7SNicholas Piggin 		*(__ksymtab_strings)					\
4931da177e4SLinus Torvalds 	}								\
4941da177e4SLinus Torvalds 									\
495eb8f6890SSam Ravnborg 	/* __*init sections */						\
496eb8f6890SSam Ravnborg 	__init_rodata : AT(ADDR(__init_rodata) - LOAD_OFFSET) {		\
497312b1485SSam Ravnborg 		*(.ref.rodata)						\
498eb8f6890SSam Ravnborg 		MEM_KEEP(init.rodata)					\
499eb8f6890SSam Ravnborg 		MEM_KEEP(exit.rodata)					\
500eb8f6890SSam Ravnborg 	}								\
501eb8f6890SSam Ravnborg 									\
5021da177e4SLinus Torvalds 	/* Built-in module parameters. */				\
5031da177e4SLinus Torvalds 	__param : AT(ADDR(__param) - LOAD_OFFSET) {			\
504a6214385SMasahiro Yamada 		__start___param = .;					\
5054b89b7f7SNicholas Piggin 		KEEP(*(__param))					\
506a6214385SMasahiro Yamada 		__stop___param = .;					\
507e94965edSDmitry Torokhov 	}								\
508e94965edSDmitry Torokhov 									\
509e94965edSDmitry Torokhov 	/* Built-in module versions. */					\
510e94965edSDmitry Torokhov 	__modver : AT(ADDR(__modver) - LOAD_OFFSET) {			\
511a6214385SMasahiro Yamada 		__start___modver = .;					\
5124b89b7f7SNicholas Piggin 		KEEP(*(__modver))					\
513a6214385SMasahiro Yamada 		__stop___modver = .;					\
5147583ddfdSMarcelo Tosatti 	}								\
515eaf93707SKees Cook 									\
516eaf93707SKees Cook 	NOTES								\
517eaf93707SKees Cook 									\
518eaf93707SKees Cook 	. = ALIGN((align));						\
519eaf93707SKees Cook 	__end_rodata = .;
5204096b46fSSam Ravnborg 
521cb87481eSNicholas Piggin /*
522cb87481eSNicholas Piggin  * .text section. Map to function alignment to avoid address changes
5230f4c4af0SNicholas Piggin  * during second ld run in second ld pass when generating System.map
524cb87481eSNicholas Piggin  *
525cb87481eSNicholas Piggin  * TEXT_MAIN here will match .text.fixup and .text.unlikely if dead
526cb87481eSNicholas Piggin  * code elimination is enabled, so these sections should be converted
527cb87481eSNicholas Piggin  * to use ".." first.
528cb87481eSNicholas Piggin  */
5297664709bSSam Ravnborg #define TEXT_TEXT							\
5307664709bSSam Ravnborg 		ALIGN_FUNCTION();					\
531cb87481eSNicholas Piggin 		*(.text.hot TEXT_MAIN .text.fixup .text.unlikely)	\
532564c9cc8SKees Cook 		*(.text..refcount)					\
533312b1485SSam Ravnborg 		*(.ref.text)						\
534266ff2a8SNicholas Piggin 	MEM_KEEP(init.text*)						\
535266ff2a8SNicholas Piggin 	MEM_KEEP(exit.text*)						\
536eb8f6890SSam Ravnborg 
5377664709bSSam Ravnborg 
5386d30e3a8SSam Ravnborg /* sched.text is aling to function alignment to secure we have same
5396d30e3a8SSam Ravnborg  * address even at second ld pass when generating System.map */
5401da177e4SLinus Torvalds #define SCHED_TEXT							\
5416d30e3a8SSam Ravnborg 		ALIGN_FUNCTION();					\
542a6214385SMasahiro Yamada 		__sched_text_start = .;					\
5431da177e4SLinus Torvalds 		*(.sched.text)						\
544a6214385SMasahiro Yamada 		__sched_text_end = .;
5451da177e4SLinus Torvalds 
5466d30e3a8SSam Ravnborg /* spinlock.text is aling to function alignment to secure we have same
5476d30e3a8SSam Ravnborg  * address even at second ld pass when generating System.map */
5481da177e4SLinus Torvalds #define LOCK_TEXT							\
5496d30e3a8SSam Ravnborg 		ALIGN_FUNCTION();					\
550a6214385SMasahiro Yamada 		__lock_text_start = .;					\
5511da177e4SLinus Torvalds 		*(.spinlock.text)					\
552a6214385SMasahiro Yamada 		__lock_text_end = .;
553d0aaff97SPrasanna S Panchamukhi 
5546727ad9eSChris Metcalf #define CPUIDLE_TEXT							\
5556727ad9eSChris Metcalf 		ALIGN_FUNCTION();					\
556a6214385SMasahiro Yamada 		__cpuidle_text_start = .;				\
5576727ad9eSChris Metcalf 		*(.cpuidle.text)					\
558a6214385SMasahiro Yamada 		__cpuidle_text_end = .;
5596727ad9eSChris Metcalf 
560d0aaff97SPrasanna S Panchamukhi #define KPROBES_TEXT							\
561d0aaff97SPrasanna S Panchamukhi 		ALIGN_FUNCTION();					\
562a6214385SMasahiro Yamada 		__kprobes_text_start = .;				\
563d0aaff97SPrasanna S Panchamukhi 		*(.kprobes.text)					\
564a6214385SMasahiro Yamada 		__kprobes_text_end = .;
565a7d0c210SPaolo 'Blaisorblade' Giarrusso 
566ea714547SJiri Olsa #define ENTRY_TEXT							\
567ea714547SJiri Olsa 		ALIGN_FUNCTION();					\
568a6214385SMasahiro Yamada 		__entry_text_start = .;					\
569ea714547SJiri Olsa 		*(.entry.text)						\
570a6214385SMasahiro Yamada 		__entry_text_end = .;
571ea714547SJiri Olsa 
572a0343e82SFrederic Weisbecker #define IRQENTRY_TEXT							\
573a0343e82SFrederic Weisbecker 		ALIGN_FUNCTION();					\
574a6214385SMasahiro Yamada 		__irqentry_text_start = .;				\
575a0343e82SFrederic Weisbecker 		*(.irqentry.text)					\
576a6214385SMasahiro Yamada 		__irqentry_text_end = .;
577a0343e82SFrederic Weisbecker 
578be7635e7SAlexander Potapenko #define SOFTIRQENTRY_TEXT						\
579be7635e7SAlexander Potapenko 		ALIGN_FUNCTION();					\
580a6214385SMasahiro Yamada 		__softirqentry_text_start = .;				\
581be7635e7SAlexander Potapenko 		*(.softirqentry.text)					\
582a6214385SMasahiro Yamada 		__softirqentry_text_end = .;
583be7635e7SAlexander Potapenko 
58437c514e3SSam Ravnborg /* Section used for early init (in .S files) */
585266ff2a8SNicholas Piggin #define HEAD_TEXT  KEEP(*(.head.text))
58637c514e3SSam Ravnborg 
5877923f90fSSam Ravnborg #define HEAD_TEXT_SECTION							\
588ef53dae8SSam Ravnborg 	.head.text : AT(ADDR(.head.text) - LOAD_OFFSET) {		\
589ef53dae8SSam Ravnborg 		HEAD_TEXT						\
590ef53dae8SSam Ravnborg 	}
591ef53dae8SSam Ravnborg 
592ef53dae8SSam Ravnborg /*
593ef53dae8SSam Ravnborg  * Exception table
594ef53dae8SSam Ravnborg  */
595ef53dae8SSam Ravnborg #define EXCEPTION_TABLE(align)						\
596ef53dae8SSam Ravnborg 	. = ALIGN(align);						\
597ef53dae8SSam Ravnborg 	__ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) {		\
598a6214385SMasahiro Yamada 		__start___ex_table = .;					\
5994b89b7f7SNicholas Piggin 		KEEP(*(__ex_table))					\
600a6214385SMasahiro Yamada 		__stop___ex_table = .;					\
601ef53dae8SSam Ravnborg 	}
602ef53dae8SSam Ravnborg 
603ef53dae8SSam Ravnborg /*
604ef53dae8SSam Ravnborg  * Init task
605ef53dae8SSam Ravnborg  */
60639a449d9STim Abbott #define INIT_TASK_DATA_SECTION(align)					\
607ef53dae8SSam Ravnborg 	. = ALIGN(align);						\
608da5e37efSSam Ravnborg 	.data..init_task :  AT(ADDR(.data..init_task) - LOAD_OFFSET) {	\
60939a449d9STim Abbott 		INIT_TASK_DATA(align)					\
610ef53dae8SSam Ravnborg 	}
611eb8f6890SSam Ravnborg 
612b99b87f7SPeter Oberparleiter #ifdef CONFIG_CONSTRUCTORS
6132a2325e6SHeiko Carstens #define KERNEL_CTORS()	. = ALIGN(8);			   \
614a6214385SMasahiro Yamada 			__ctors_start = .;		   \
6154b89b7f7SNicholas Piggin 			KEEP(*(.ctors))			   \
6164b89b7f7SNicholas Piggin 			KEEP(*(SORT(.init_array.*)))	   \
6174b89b7f7SNicholas Piggin 			KEEP(*(.init_array))		   \
618a6214385SMasahiro Yamada 			__ctors_end = .;
619b99b87f7SPeter Oberparleiter #else
620b99b87f7SPeter Oberparleiter #define KERNEL_CTORS()
621b99b87f7SPeter Oberparleiter #endif
622b99b87f7SPeter Oberparleiter 
62301ba2bdcSSam Ravnborg /* init and exit section handling */
624eb8f6890SSam Ravnborg #define INIT_DATA							\
625b67067f1SNicholas Piggin 	KEEP(*(SORT(___kentry+*)))					\
626266ff2a8SNicholas Piggin 	*(.init.data init.data.*)					\
627266ff2a8SNicholas Piggin 	MEM_DISCARD(init.data*)						\
628b99b87f7SPeter Oberparleiter 	KERNEL_CTORS()							\
6294b3b4c5eSJohn Reiser 	MCOUNT_REC()							\
630266ff2a8SNicholas Piggin 	*(.init.rodata .init.rodata.*)					\
631e4a9ea5eSSteven Rostedt 	FTRACE_EVENTS()							\
6323d56e331SSteven Rostedt 	TRACE_SYSCALLS()						\
633376e2424SMasami Hiramatsu 	KPROBE_BLACKLIST()						\
634540adea3SMasami Hiramatsu 	ERROR_INJECT_WHITELIST()					\
635aab94339SDirk Brandewie 	MEM_DISCARD(init.rodata)					\
636f2f6c255SPrashant Gaikwad 	CLK_OF_TABLES()							\
637f618c470SMarek Szyprowski 	RESERVEDMEM_OF_TABLES()						\
6382fcc112aSDaniel Lezcano 	TIMER_OF_TABLES()						\
6396c3ff8b1SStephen Boyd 	CPU_METHOD_OF_TABLES()						\
640449e056cSDaniel Lezcano 	CPUIDLE_METHOD_OF_TABLES()					\
641f6e916b8SThomas Petazzoni 	KERNEL_DTB()							\
642b0b6abd3SRob Herring 	IRQCHIP_OF_MATCH_TABLE()					\
64346e589a3SMarc Zyngier 	ACPI_PROBE_TABLE(irqchip)					\
6442fcc112aSDaniel Lezcano 	ACPI_PROBE_TABLE(timer)						\
645980af75eSDaniel Lezcano 	THERMAL_TABLE(governor)						\
6463ac946d1SKees Cook 	EARLYCON_TABLE()						\
647e6b1db98SMatthew Garrett 	LSM_TABLE()							\
648e6b1db98SMatthew Garrett 	EARLY_LSM_TABLE()
64901ba2bdcSSam Ravnborg 
650eb8f6890SSam Ravnborg #define INIT_TEXT							\
651266ff2a8SNicholas Piggin 	*(.init.text .init.text.*)					\
652e41f501dSDmitry Vyukov 	*(.text.startup)						\
653266ff2a8SNicholas Piggin 	MEM_DISCARD(init.text*)
654eb8f6890SSam Ravnborg 
655eb8f6890SSam Ravnborg #define EXIT_DATA							\
656266ff2a8SNicholas Piggin 	*(.exit.data .exit.data.*)					\
6578dcf86caSPeter Oberparleiter 	*(.fini_array .fini_array.*)					\
6588dcf86caSPeter Oberparleiter 	*(.dtors .dtors.*)						\
659266ff2a8SNicholas Piggin 	MEM_DISCARD(exit.data*)						\
660266ff2a8SNicholas Piggin 	MEM_DISCARD(exit.rodata*)
661eb8f6890SSam Ravnborg 
662eb8f6890SSam Ravnborg #define EXIT_TEXT							\
663eb8f6890SSam Ravnborg 	*(.exit.text)							\
664e41f501dSDmitry Vyukov 	*(.text.exit)							\
665eb8f6890SSam Ravnborg 	MEM_DISCARD(exit.text)
66601ba2bdcSSam Ravnborg 
6677923f90fSSam Ravnborg #define EXIT_CALL							\
6687923f90fSSam Ravnborg 	*(.exitcall.exit)
6697923f90fSSam Ravnborg 
670ef53dae8SSam Ravnborg /*
671ef53dae8SSam Ravnborg  * bss (Block Started by Symbol) - uninitialized data
672ef53dae8SSam Ravnborg  * zeroed during startup
673ef53dae8SSam Ravnborg  */
67404e448d9STim Abbott #define SBSS(sbss_align)						\
67504e448d9STim Abbott 	. = ALIGN(sbss_align);						\
676ef53dae8SSam Ravnborg 	.sbss : AT(ADDR(.sbss) - LOAD_OFFSET) {				\
67783a092cfSNicholas Piggin 		*(.dynsbss)						\
678266ff2a8SNicholas Piggin 		*(SBSS_MAIN)						\
679ef53dae8SSam Ravnborg 		*(.scommon)						\
680ef53dae8SSam Ravnborg 	}
681ef53dae8SSam Ravnborg 
682c87728caSDavid Daney /*
683c87728caSDavid Daney  * Allow archectures to redefine BSS_FIRST_SECTIONS to add extra
684c87728caSDavid Daney  * sections to the front of bss.
685c87728caSDavid Daney  */
686c87728caSDavid Daney #ifndef BSS_FIRST_SECTIONS
687c87728caSDavid Daney #define BSS_FIRST_SECTIONS
688c87728caSDavid Daney #endif
689c87728caSDavid Daney 
690ef53dae8SSam Ravnborg #define BSS(bss_align)							\
691ef53dae8SSam Ravnborg 	. = ALIGN(bss_align);						\
692ef53dae8SSam Ravnborg 	.bss : AT(ADDR(.bss) - LOAD_OFFSET) {				\
693c87728caSDavid Daney 		BSS_FIRST_SECTIONS					\
6947c74df07STim Abbott 		*(.bss..page_aligned)					\
695ef53dae8SSam Ravnborg 		*(.dynbss)						\
696cb87481eSNicholas Piggin 		*(BSS_MAIN)						\
697ef53dae8SSam Ravnborg 		*(COMMON)						\
698ef53dae8SSam Ravnborg 	}
699ef53dae8SSam Ravnborg 
700ef53dae8SSam Ravnborg /*
701ef53dae8SSam Ravnborg  * DWARF debug sections.
702ef53dae8SSam Ravnborg  * Symbols in the DWARF debugging sections are relative to
703ef53dae8SSam Ravnborg  * the beginning of the section so we begin them at 0.
704ef53dae8SSam Ravnborg  */
705a7d0c210SPaolo 'Blaisorblade' Giarrusso #define DWARF_DEBUG							\
706a7d0c210SPaolo 'Blaisorblade' Giarrusso 		/* DWARF 1 */						\
707a7d0c210SPaolo 'Blaisorblade' Giarrusso 		.debug          0 : { *(.debug) }			\
708a7d0c210SPaolo 'Blaisorblade' Giarrusso 		.line           0 : { *(.line) }			\
709a7d0c210SPaolo 'Blaisorblade' Giarrusso 		/* GNU DWARF 1 extensions */				\
710a7d0c210SPaolo 'Blaisorblade' Giarrusso 		.debug_srcinfo  0 : { *(.debug_srcinfo) }		\
711a7d0c210SPaolo 'Blaisorblade' Giarrusso 		.debug_sfnames  0 : { *(.debug_sfnames) }		\
712a7d0c210SPaolo 'Blaisorblade' Giarrusso 		/* DWARF 1.1 and DWARF 2 */				\
713a7d0c210SPaolo 'Blaisorblade' Giarrusso 		.debug_aranges  0 : { *(.debug_aranges) }		\
714a7d0c210SPaolo 'Blaisorblade' Giarrusso 		.debug_pubnames 0 : { *(.debug_pubnames) }		\
715a7d0c210SPaolo 'Blaisorblade' Giarrusso 		/* DWARF 2 */						\
716a7d0c210SPaolo 'Blaisorblade' Giarrusso 		.debug_info     0 : { *(.debug_info			\
717a7d0c210SPaolo 'Blaisorblade' Giarrusso 				.gnu.linkonce.wi.*) }			\
718a7d0c210SPaolo 'Blaisorblade' Giarrusso 		.debug_abbrev   0 : { *(.debug_abbrev) }		\
719a7d0c210SPaolo 'Blaisorblade' Giarrusso 		.debug_line     0 : { *(.debug_line) }			\
720a7d0c210SPaolo 'Blaisorblade' Giarrusso 		.debug_frame    0 : { *(.debug_frame) }			\
721a7d0c210SPaolo 'Blaisorblade' Giarrusso 		.debug_str      0 : { *(.debug_str) }			\
722a7d0c210SPaolo 'Blaisorblade' Giarrusso 		.debug_loc      0 : { *(.debug_loc) }			\
723a7d0c210SPaolo 'Blaisorblade' Giarrusso 		.debug_macinfo  0 : { *(.debug_macinfo) }		\
72483a092cfSNicholas Piggin 		.debug_pubtypes 0 : { *(.debug_pubtypes) }		\
72583a092cfSNicholas Piggin 		/* DWARF 3 */						\
72683a092cfSNicholas Piggin 		.debug_ranges	0 : { *(.debug_ranges) }		\
727a7d0c210SPaolo 'Blaisorblade' Giarrusso 		/* SGI/MIPS DWARF 2 extensions */			\
728a7d0c210SPaolo 'Blaisorblade' Giarrusso 		.debug_weaknames 0 : { *(.debug_weaknames) }		\
729a7d0c210SPaolo 'Blaisorblade' Giarrusso 		.debug_funcnames 0 : { *(.debug_funcnames) }		\
730a7d0c210SPaolo 'Blaisorblade' Giarrusso 		.debug_typenames 0 : { *(.debug_typenames) }		\
731a7d0c210SPaolo 'Blaisorblade' Giarrusso 		.debug_varnames  0 : { *(.debug_varnames) }		\
73283a092cfSNicholas Piggin 		/* GNU DWARF 2 extensions */				\
73383a092cfSNicholas Piggin 		.debug_gnu_pubnames 0 : { *(.debug_gnu_pubnames) }	\
73483a092cfSNicholas Piggin 		.debug_gnu_pubtypes 0 : { *(.debug_gnu_pubtypes) }	\
73583a092cfSNicholas Piggin 		/* DWARF 4 */						\
73683a092cfSNicholas Piggin 		.debug_types	0 : { *(.debug_types) }			\
73783a092cfSNicholas Piggin 		/* DWARF 5 */						\
73883a092cfSNicholas Piggin 		.debug_macro	0 : { *(.debug_macro) }			\
73983a092cfSNicholas Piggin 		.debug_addr	0 : { *(.debug_addr) }
740a7d0c210SPaolo 'Blaisorblade' Giarrusso 
741a7d0c210SPaolo 'Blaisorblade' Giarrusso 		/* Stabs debugging sections.  */
742a7d0c210SPaolo 'Blaisorblade' Giarrusso #define STABS_DEBUG							\
743a7d0c210SPaolo 'Blaisorblade' Giarrusso 		.stab 0 : { *(.stab) }					\
744a7d0c210SPaolo 'Blaisorblade' Giarrusso 		.stabstr 0 : { *(.stabstr) }				\
745a7d0c210SPaolo 'Blaisorblade' Giarrusso 		.stab.excl 0 : { *(.stab.excl) }			\
746a7d0c210SPaolo 'Blaisorblade' Giarrusso 		.stab.exclstr 0 : { *(.stab.exclstr) }			\
747a7d0c210SPaolo 'Blaisorblade' Giarrusso 		.stab.index 0 : { *(.stab.index) }			\
748a7d0c210SPaolo 'Blaisorblade' Giarrusso 		.stab.indexstr 0 : { *(.stab.indexstr) }		\
749a7d0c210SPaolo 'Blaisorblade' Giarrusso 		.comment 0 : { *(.comment) }
7509c9b8b38SJeremy Fitzhardinge 
7516360b1fbSJan Beulich #ifdef CONFIG_GENERIC_BUG
7527664c5a1SJeremy Fitzhardinge #define BUG_TABLE							\
7537664c5a1SJeremy Fitzhardinge 	. = ALIGN(8);							\
7547664c5a1SJeremy Fitzhardinge 	__bug_table : AT(ADDR(__bug_table) - LOAD_OFFSET) {		\
755a6214385SMasahiro Yamada 		__start___bug_table = .;				\
7564b89b7f7SNicholas Piggin 		KEEP(*(__bug_table))					\
757a6214385SMasahiro Yamada 		__stop___bug_table = .;					\
7587664c5a1SJeremy Fitzhardinge 	}
7596360b1fbSJan Beulich #else
7606360b1fbSJan Beulich #define BUG_TABLE
7616360b1fbSJan Beulich #endif
7627664c5a1SJeremy Fitzhardinge 
76311af8474SJosh Poimboeuf #ifdef CONFIG_UNWINDER_ORC
764ee9f8fceSJosh Poimboeuf #define ORC_UNWIND_TABLE						\
765ee9f8fceSJosh Poimboeuf 	. = ALIGN(4);							\
766ee9f8fceSJosh Poimboeuf 	.orc_unwind_ip : AT(ADDR(.orc_unwind_ip) - LOAD_OFFSET) {	\
767a6214385SMasahiro Yamada 		__start_orc_unwind_ip = .;				\
768ee9f8fceSJosh Poimboeuf 		KEEP(*(.orc_unwind_ip))					\
769a6214385SMasahiro Yamada 		__stop_orc_unwind_ip = .;				\
770ee9f8fceSJosh Poimboeuf 	}								\
771f76a16adSJosh Poimboeuf 	. = ALIGN(2);							\
772ee9f8fceSJosh Poimboeuf 	.orc_unwind : AT(ADDR(.orc_unwind) - LOAD_OFFSET) {		\
773a6214385SMasahiro Yamada 		__start_orc_unwind = .;					\
774ee9f8fceSJosh Poimboeuf 		KEEP(*(.orc_unwind))					\
775a6214385SMasahiro Yamada 		__stop_orc_unwind = .;					\
776ee9f8fceSJosh Poimboeuf 	}								\
777ee9f8fceSJosh Poimboeuf 	. = ALIGN(4);							\
778ee9f8fceSJosh Poimboeuf 	.orc_lookup : AT(ADDR(.orc_lookup) - LOAD_OFFSET) {		\
779a6214385SMasahiro Yamada 		orc_lookup = .;						\
780ee9f8fceSJosh Poimboeuf 		. += (((SIZEOF(.text) + LOOKUP_BLOCK_SIZE - 1) /	\
781ee9f8fceSJosh Poimboeuf 			LOOKUP_BLOCK_SIZE) + 1) * 4;			\
782a6214385SMasahiro Yamada 		orc_lookup_end = .;					\
783ee9f8fceSJosh Poimboeuf 	}
784ee9f8fceSJosh Poimboeuf #else
785ee9f8fceSJosh Poimboeuf #define ORC_UNWIND_TABLE
786ee9f8fceSJosh Poimboeuf #endif
787ee9f8fceSJosh Poimboeuf 
78863687a52SJan Beulich #ifdef CONFIG_PM_TRACE
78963687a52SJan Beulich #define TRACEDATA							\
79063687a52SJan Beulich 	. = ALIGN(4);							\
79163687a52SJan Beulich 	.tracedata : AT(ADDR(.tracedata) - LOAD_OFFSET) {		\
792a6214385SMasahiro Yamada 		__tracedata_start = .;					\
7934b89b7f7SNicholas Piggin 		KEEP(*(.tracedata))					\
794a6214385SMasahiro Yamada 		__tracedata_end = .;					\
79563687a52SJan Beulich 	}
79663687a52SJan Beulich #else
79763687a52SJan Beulich #define TRACEDATA
79863687a52SJan Beulich #endif
79963687a52SJan Beulich 
8009c9b8b38SJeremy Fitzhardinge #define NOTES								\
801cbe87121SRoland McGrath 	.notes : AT(ADDR(.notes) - LOAD_OFFSET) {			\
802a6214385SMasahiro Yamada 		__start_notes = .;					\
803266ff2a8SNicholas Piggin 		KEEP(*(.note.*))					\
804a6214385SMasahiro Yamada 		__stop_notes = .;					\
805fbe6a8e6SKees Cook 	} NOTES_HEADERS							\
806fbe6a8e6SKees Cook 	NOTES_HEADERS_RESTORE
80761ce1efeSAndrew Morton 
808ef53dae8SSam Ravnborg #define INIT_SETUP(initsetup_align)					\
809ef53dae8SSam Ravnborg 		. = ALIGN(initsetup_align);				\
810a6214385SMasahiro Yamada 		__setup_start = .;					\
8114b89b7f7SNicholas Piggin 		KEEP(*(.init.setup))					\
812a6214385SMasahiro Yamada 		__setup_end = .;
813ef53dae8SSam Ravnborg 
814026cee00SPawel Moll #define INIT_CALLS_LEVEL(level)						\
815a6214385SMasahiro Yamada 		__initcall##level##_start = .;				\
816b67067f1SNicholas Piggin 		KEEP(*(.initcall##level##.init))			\
817b67067f1SNicholas Piggin 		KEEP(*(.initcall##level##s.init))			\
81861ce1efeSAndrew Morton 
819ef53dae8SSam Ravnborg #define INIT_CALLS							\
820a6214385SMasahiro Yamada 		__initcall_start = .;					\
821b67067f1SNicholas Piggin 		KEEP(*(.initcallearly.init))				\
822026cee00SPawel Moll 		INIT_CALLS_LEVEL(0)					\
823026cee00SPawel Moll 		INIT_CALLS_LEVEL(1)					\
824026cee00SPawel Moll 		INIT_CALLS_LEVEL(2)					\
825026cee00SPawel Moll 		INIT_CALLS_LEVEL(3)					\
826026cee00SPawel Moll 		INIT_CALLS_LEVEL(4)					\
827026cee00SPawel Moll 		INIT_CALLS_LEVEL(5)					\
828026cee00SPawel Moll 		INIT_CALLS_LEVEL(rootfs)				\
829026cee00SPawel Moll 		INIT_CALLS_LEVEL(6)					\
830026cee00SPawel Moll 		INIT_CALLS_LEVEL(7)					\
831a6214385SMasahiro Yamada 		__initcall_end = .;
832ef53dae8SSam Ravnborg 
833ef53dae8SSam Ravnborg #define CON_INITCALL							\
834a6214385SMasahiro Yamada 		__con_initcall_start = .;				\
835b67067f1SNicholas Piggin 		KEEP(*(.con_initcall.init))				\
836a6214385SMasahiro Yamada 		__con_initcall_end = .;
837ef53dae8SSam Ravnborg 
838ef53dae8SSam Ravnborg #ifdef CONFIG_BLK_DEV_INITRD
839ef53dae8SSam Ravnborg #define INIT_RAM_FS							\
840d8826262SMike Frysinger 	. = ALIGN(4);							\
841a6214385SMasahiro Yamada 	__initramfs_start = .;						\
842b67067f1SNicholas Piggin 	KEEP(*(.init.ramfs))						\
843ffe8018cSHendrik Brueckner 	. = ALIGN(8);							\
844b67067f1SNicholas Piggin 	KEEP(*(.init.ramfs.info))
845ef53dae8SSam Ravnborg #else
846eadfe219SDavid Howells #define INIT_RAM_FS
847ef53dae8SSam Ravnborg #endif
848ef53dae8SSam Ravnborg 
849023bf6f1STejun Heo /*
850ac26963aSBrijesh Singh  * Memory encryption operates on a page basis. Since we need to clear
851ac26963aSBrijesh Singh  * the memory encryption mask for this section, it needs to be aligned
852ac26963aSBrijesh Singh  * on a page boundary and be a page-size multiple in length.
853ac26963aSBrijesh Singh  *
854ac26963aSBrijesh Singh  * Note: We use a separate section so that only this section gets
855ac26963aSBrijesh Singh  * decrypted to avoid exposing more than we wish.
856ac26963aSBrijesh Singh  */
857ac26963aSBrijesh Singh #ifdef CONFIG_AMD_MEM_ENCRYPT
858ac26963aSBrijesh Singh #define PERCPU_DECRYPTED_SECTION					\
859ac26963aSBrijesh Singh 	. = ALIGN(PAGE_SIZE);						\
860ac26963aSBrijesh Singh 	*(.data..percpu..decrypted)					\
861ac26963aSBrijesh Singh 	. = ALIGN(PAGE_SIZE);
862ac26963aSBrijesh Singh #else
863ac26963aSBrijesh Singh #define PERCPU_DECRYPTED_SECTION
864ac26963aSBrijesh Singh #endif
865ac26963aSBrijesh Singh 
866ac26963aSBrijesh Singh 
867ac26963aSBrijesh Singh /*
868023bf6f1STejun Heo  * Default discarded sections.
869023bf6f1STejun Heo  *
870023bf6f1STejun Heo  * Some archs want to discard exit text/data at runtime rather than
871023bf6f1STejun Heo  * link time due to cross-section references such as alt instructions,
872023bf6f1STejun Heo  * bug table, eh_frame, etc.  DISCARDS must be the last of output
873023bf6f1STejun Heo  * section definitions so that such archs put those in earlier section
874023bf6f1STejun Heo  * definitions.
875023bf6f1STejun Heo  */
876405d967dSTejun Heo #define DISCARDS							\
877405d967dSTejun Heo 	/DISCARD/ : {							\
878405d967dSTejun Heo 	EXIT_TEXT							\
879405d967dSTejun Heo 	EXIT_DATA							\
880023bf6f1STejun Heo 	EXIT_CALL							\
881405d967dSTejun Heo 	*(.discard)							\
882c7f52cdcSJeremy Fitzhardinge 	*(.discard.*)							\
883898490c0SAlexey Gladkov 	*(.modinfo)							\
884405d967dSTejun Heo 	}
885405d967dSTejun Heo 
8863e5d8f97STejun Heo /**
8876ea0c34dSMike Frysinger  * PERCPU_INPUT - the percpu input sections
8886ea0c34dSMike Frysinger  * @cacheline: cacheline size
8896ea0c34dSMike Frysinger  *
8906ea0c34dSMike Frysinger  * The core percpu section names and core symbols which do not rely
8916ea0c34dSMike Frysinger  * directly upon load addresses.
8926ea0c34dSMike Frysinger  *
8936ea0c34dSMike Frysinger  * @cacheline is used to align subsections to avoid false cacheline
8946ea0c34dSMike Frysinger  * sharing between subsections for different purposes.
8956ea0c34dSMike Frysinger  */
8966ea0c34dSMike Frysinger #define PERCPU_INPUT(cacheline)						\
897a6214385SMasahiro Yamada 	__per_cpu_start = .;						\
8986ea0c34dSMike Frysinger 	*(.data..percpu..first)						\
8996ea0c34dSMike Frysinger 	. = ALIGN(PAGE_SIZE);						\
9006ea0c34dSMike Frysinger 	*(.data..percpu..page_aligned)					\
9016ea0c34dSMike Frysinger 	. = ALIGN(cacheline);						\
902330d2822SZhengyu He 	*(.data..percpu..read_mostly)					\
9036ea0c34dSMike Frysinger 	. = ALIGN(cacheline);						\
9046ea0c34dSMike Frysinger 	*(.data..percpu)						\
9056ea0c34dSMike Frysinger 	*(.data..percpu..shared_aligned)				\
906ac26963aSBrijesh Singh 	PERCPU_DECRYPTED_SECTION					\
907a6214385SMasahiro Yamada 	__per_cpu_end = .;
9086ea0c34dSMike Frysinger 
9096ea0c34dSMike Frysinger /**
9106b7c38d5STejun Heo  * PERCPU_VADDR - define output section for percpu area
91119df0c2fSTejun Heo  * @cacheline: cacheline size
9123e5d8f97STejun Heo  * @vaddr: explicit base address (optional)
9133e5d8f97STejun Heo  * @phdr: destination PHDR (optional)
9143e5d8f97STejun Heo  *
91519df0c2fSTejun Heo  * Macro which expands to output section for percpu area.
91619df0c2fSTejun Heo  *
91719df0c2fSTejun Heo  * @cacheline is used to align subsections to avoid false cacheline
91819df0c2fSTejun Heo  * sharing between subsections for different purposes.
91919df0c2fSTejun Heo  *
92019df0c2fSTejun Heo  * If @vaddr is not blank, it specifies explicit base address and all
92119df0c2fSTejun Heo  * percpu symbols will be offset from the given address.  If blank,
92219df0c2fSTejun Heo  * @vaddr always equals @laddr + LOAD_OFFSET.
9233e5d8f97STejun Heo  *
9243e5d8f97STejun Heo  * @phdr defines the output PHDR to use if not blank.  Be warned that
9253e5d8f97STejun Heo  * output PHDR is sticky.  If @phdr is specified, the next output
9263e5d8f97STejun Heo  * section in the linker script will go there too.  @phdr should have
9273e5d8f97STejun Heo  * a leading colon.
9283e5d8f97STejun Heo  *
9293ac6cffeSTejun Heo  * Note that this macros defines __per_cpu_load as an absolute symbol.
9303ac6cffeSTejun Heo  * If there is no need to put the percpu section at a predetermined
9310415b00dSTejun Heo  * address, use PERCPU_SECTION.
9323e5d8f97STejun Heo  */
93319df0c2fSTejun Heo #define PERCPU_VADDR(cacheline, vaddr, phdr)				\
934a6214385SMasahiro Yamada 	__per_cpu_load = .;						\
935a6214385SMasahiro Yamada 	.data..percpu vaddr : AT(__per_cpu_load - LOAD_OFFSET) {	\
9366ea0c34dSMike Frysinger 		PERCPU_INPUT(cacheline)					\
9376b7c38d5STejun Heo 	} phdr								\
938a6214385SMasahiro Yamada 	. = __per_cpu_load + SIZEOF(.data..percpu);
9393e5d8f97STejun Heo 
9403e5d8f97STejun Heo /**
9410415b00dSTejun Heo  * PERCPU_SECTION - define output section for percpu area, simple version
94219df0c2fSTejun Heo  * @cacheline: cacheline size
9433e5d8f97STejun Heo  *
9440415b00dSTejun Heo  * Align to PAGE_SIZE and outputs output section for percpu area.  This
9450415b00dSTejun Heo  * macro doesn't manipulate @vaddr or @phdr and __per_cpu_load and
9463e5d8f97STejun Heo  * __per_cpu_start will be identical.
9473ac6cffeSTejun Heo  *
9480415b00dSTejun Heo  * This macro is equivalent to ALIGN(PAGE_SIZE); PERCPU_VADDR(@cacheline,,)
94919df0c2fSTejun Heo  * except that __per_cpu_load is defined as a relative symbol against
95019df0c2fSTejun Heo  * .data..percpu which is required for relocatable x86_32 configuration.
9513e5d8f97STejun Heo  */
9520415b00dSTejun Heo #define PERCPU_SECTION(cacheline)					\
9530415b00dSTejun Heo 	. = ALIGN(PAGE_SIZE);						\
9543d9a854cSDenys Vlasenko 	.data..percpu	: AT(ADDR(.data..percpu) - LOAD_OFFSET) {	\
955a6214385SMasahiro Yamada 		__per_cpu_load = .;					\
9566ea0c34dSMike Frysinger 		PERCPU_INPUT(cacheline)					\
9573ac6cffeSTejun Heo 	}
958ef53dae8SSam Ravnborg 
959ef53dae8SSam Ravnborg 
960ef53dae8SSam Ravnborg /*
961ef53dae8SSam Ravnborg  * Definition of the high level *_SECTION macros
962ef53dae8SSam Ravnborg  * They will fit only a subset of the architectures
963ef53dae8SSam Ravnborg  */
964ef53dae8SSam Ravnborg 
965ef53dae8SSam Ravnborg 
966ef53dae8SSam Ravnborg /*
967ef53dae8SSam Ravnborg  * Writeable data.
968ef53dae8SSam Ravnborg  * All sections are combined in a single .data section.
969ef53dae8SSam Ravnborg  * The sections following CONSTRUCTORS are arranged so their
970ef53dae8SSam Ravnborg  * typical alignment matches.
971ef53dae8SSam Ravnborg  * A cacheline is typical/always less than a PAGE_SIZE so
972ef53dae8SSam Ravnborg  * the sections that has this restriction (or similar)
973ef53dae8SSam Ravnborg  * is located before the ones requiring PAGE_SIZE alignment.
974ef53dae8SSam Ravnborg  * NOSAVE_DATA starts and ends with a PAGE_SIZE alignment which
97525985edcSLucas De Marchi  * matches the requirement of PAGE_ALIGNED_DATA.
976ef53dae8SSam Ravnborg  *
9777923f90fSSam Ravnborg  * use 0 as page_align if page_aligned data is not used */
97873f1d939SPaul Mundt #define RW_DATA_SECTION(cacheline, pagealigned, inittask)		\
979ef53dae8SSam Ravnborg 	. = ALIGN(PAGE_SIZE);						\
980ef53dae8SSam Ravnborg 	.data : AT(ADDR(.data) - LOAD_OFFSET) {				\
98139a449d9STim Abbott 		INIT_TASK_DATA(inittask)				\
9821b208622STim Abbott 		NOSAVE_DATA						\
9831b208622STim Abbott 		PAGE_ALIGNED_DATA(pagealigned)				\
984ef53dae8SSam Ravnborg 		CACHELINE_ALIGNED_DATA(cacheline)			\
985ef53dae8SSam Ravnborg 		READ_MOSTLY_DATA(cacheline)				\
986ef53dae8SSam Ravnborg 		DATA_DATA						\
987ef53dae8SSam Ravnborg 		CONSTRUCTORS						\
98819d43626SPeter Zijlstra 	}								\
989ee9f8fceSJosh Poimboeuf 	BUG_TABLE							\
990ef53dae8SSam Ravnborg 
991ef53dae8SSam Ravnborg #define INIT_TEXT_SECTION(inittext_align)				\
992ef53dae8SSam Ravnborg 	. = ALIGN(inittext_align);					\
993ef53dae8SSam Ravnborg 	.init.text : AT(ADDR(.init.text) - LOAD_OFFSET) {		\
994a6214385SMasahiro Yamada 		_sinittext = .;						\
995ef53dae8SSam Ravnborg 		INIT_TEXT						\
996a6214385SMasahiro Yamada 		_einittext = .;						\
997ef53dae8SSam Ravnborg 	}
998ef53dae8SSam Ravnborg 
999ef53dae8SSam Ravnborg #define INIT_DATA_SECTION(initsetup_align)				\
1000ef53dae8SSam Ravnborg 	.init.data : AT(ADDR(.init.data) - LOAD_OFFSET) {		\
1001ef53dae8SSam Ravnborg 		INIT_DATA						\
1002ef53dae8SSam Ravnborg 		INIT_SETUP(initsetup_align)				\
1003ef53dae8SSam Ravnborg 		INIT_CALLS						\
1004ef53dae8SSam Ravnborg 		CON_INITCALL						\
1005ef53dae8SSam Ravnborg 		INIT_RAM_FS						\
1006ef53dae8SSam Ravnborg 	}
1007ef53dae8SSam Ravnborg 
100804e448d9STim Abbott #define BSS_SECTION(sbss_align, bss_align, stop_align)			\
100904e448d9STim Abbott 	. = ALIGN(sbss_align);						\
1010a6214385SMasahiro Yamada 	__bss_start = .;						\
101104e448d9STim Abbott 	SBSS(sbss_align)						\
1012ef53dae8SSam Ravnborg 	BSS(bss_align)							\
101304e448d9STim Abbott 	. = ALIGN(stop_align);						\
1014a6214385SMasahiro Yamada 	__bss_stop = .;
1015