1 | /* |
2 | * Helper macros to support writing architecture specific |
3 | * linker scripts. |
4 | * |
5 | * A minimal linker scripts has following content: |
6 | * [This is a sample, architectures may have special requiriements] |
7 | * |
8 | * OUTPUT_FORMAT(...) |
9 | * OUTPUT_ARCH(...) |
10 | * ENTRY(...) |
11 | * SECTIONS |
12 | * { |
13 | * . = START; |
14 | * __init_begin = .; |
15 | * HEAD_TEXT_SECTION |
16 | * INIT_TEXT_SECTION(PAGE_SIZE) |
17 | * INIT_DATA_SECTION(...) |
18 | * PERCPU_SECTION(CACHELINE_SIZE) |
19 | * __init_end = .; |
20 | * |
21 | * _stext = .; |
22 | * TEXT_SECTION = 0 |
23 | * _etext = .; |
24 | * |
25 | * _sdata = .; |
26 | * RO_DATA(PAGE_SIZE) |
27 | * RW_DATA(...) |
28 | * _edata = .; |
29 | * |
30 | * EXCEPTION_TABLE(...) |
31 | * |
32 | * BSS_SECTION(0, 0, 0) |
33 | * _end = .; |
34 | * |
35 | * STABS_DEBUG |
36 | * DWARF_DEBUG |
37 | * ELF_DETAILS |
38 | * |
39 | * DISCARDS // must be the last |
40 | * } |
41 | * |
42 | * [__init_begin, __init_end] is the init section that may be freed after init |
43 | * // __init_begin and __init_end should be page aligned, so that we can |
44 | * // free the whole .init memory |
45 | * [_stext, _etext] is the text section |
46 | * [_sdata, _edata] is the data section |
47 | * |
48 | * Some of the included output section have their own set of constants. |
49 | * Examples are: [__initramfs_start, __initramfs_end] for initramfs and |
50 | * [__nosave_begin, __nosave_end] for the nosave data |
51 | */ |
52 | |
53 | #ifndef LOAD_OFFSET |
54 | #define LOAD_OFFSET 0 |
55 | #endif |
56 | |
57 | /* |
58 | * Only some architectures want to have the .notes segment visible in |
59 | * a separate PT_NOTE ELF Program Header. When this happens, it needs |
60 | * to be visible in both the kernel text's PT_LOAD and the PT_NOTE |
61 | * Program Headers. In this case, though, the PT_LOAD needs to be made |
62 | * the default again so that all the following sections don't also end |
63 | * up in the PT_NOTE Program Header. |
64 | */ |
65 | #ifdef EMITS_PT_NOTE |
66 | #define :text :note |
67 | #define __restore_ph : { *(.__restore_ph) } :text |
68 | #else |
69 | #define NOTES_HEADERS |
70 | #define NOTES_HEADERS_RESTORE |
71 | #endif |
72 | |
73 | /* |
74 | * Some architectures have non-executable read-only exception tables. |
75 | * They can be added to the RO_DATA segment by specifying their desired |
76 | * alignment. |
77 | */ |
78 | #ifdef RO_EXCEPTION_TABLE_ALIGN |
79 | #define RO_EXCEPTION_TABLE EXCEPTION_TABLE(RO_EXCEPTION_TABLE_ALIGN) |
80 | #else |
81 | #define RO_EXCEPTION_TABLE |
82 | #endif |
83 | |
84 | /* Align . function alignment. */ |
85 | #define ALIGN_FUNCTION() . = ALIGN(CONFIG_FUNCTION_ALIGNMENT) |
86 | |
87 | /* |
88 | * LD_DEAD_CODE_DATA_ELIMINATION option enables -fdata-sections, which |
89 | * generates .data.identifier sections, which need to be pulled in with |
90 | * .data. We don't want to pull in .data..other sections, which Linux |
91 | * has defined. Same for text and bss. |
92 | * |
93 | * With LTO_CLANG, the linker also splits sections by default, so we need |
94 | * these macros to combine the sections during the final link. |
95 | * |
96 | * RODATA_MAIN is not used because existing code already defines .rodata.x |
97 | * sections to be brought in with rodata. |
98 | */ |
99 | #if defined(CONFIG_LD_DEAD_CODE_DATA_ELIMINATION) || defined(CONFIG_LTO_CLANG) |
100 | #define TEXT_MAIN .text .text.[0-9a-zA-Z_]* |
101 | #define DATA_MAIN .data .data.[0-9a-zA-Z_]* .data..L* .data..compoundliteral* .data.$__unnamed_* .data.$L* |
102 | #define SDATA_MAIN .sdata .sdata.[0-9a-zA-Z_]* |
103 | #define RODATA_MAIN .rodata .rodata.[0-9a-zA-Z_]* .rodata..L* |
104 | #define BSS_MAIN .bss .bss.[0-9a-zA-Z_]* .bss..compoundliteral* |
105 | #define SBSS_MAIN .sbss .sbss.[0-9a-zA-Z_]* |
106 | #else |
107 | #define TEXT_MAIN .text |
108 | #define DATA_MAIN .data |
109 | #define SDATA_MAIN .sdata |
110 | #define RODATA_MAIN .rodata |
111 | #define BSS_MAIN .bss |
112 | #define SBSS_MAIN .sbss |
113 | #endif |
114 | |
115 | /* |
116 | * GCC 4.5 and later have a 32 bytes section alignment for structures. |
117 | * Except GCC 4.9, that feels the need to align on 64 bytes. |
118 | */ |
119 | #define STRUCT_ALIGNMENT 32 |
120 | #define STRUCT_ALIGN() . = ALIGN(STRUCT_ALIGNMENT) |
121 | |
122 | /* |
123 | * The order of the sched class addresses are important, as they are |
124 | * used to determine the order of the priority of each sched class in |
125 | * relation to each other. |
126 | */ |
127 | #define SCHED_DATA \ |
128 | STRUCT_ALIGN(); \ |
129 | __sched_class_highest = .; \ |
130 | *(__stop_sched_class) \ |
131 | *(__dl_sched_class) \ |
132 | *(__rt_sched_class) \ |
133 | *(__fair_sched_class) \ |
134 | *(__idle_sched_class) \ |
135 | __sched_class_lowest = .; |
136 | |
137 | /* The actual configuration determine if the init/exit sections |
138 | * are handled as text/data or they can be discarded (which |
139 | * often happens at runtime) |
140 | */ |
141 | |
142 | #if defined(CONFIG_MEMORY_HOTPLUG) |
143 | #define MEM_KEEP(sec) *(.mem##sec) |
144 | #define MEM_DISCARD(sec) |
145 | #else |
146 | #define MEM_KEEP(sec) |
147 | #define MEM_DISCARD(sec) *(.mem##sec) |
148 | #endif |
149 | |
150 | #ifndef CONFIG_HAVE_DYNAMIC_FTRACE_NO_PATCHABLE |
151 | #define KEEP_PATCHABLE KEEP(*(__patchable_function_entries)) |
152 | #define PATCHABLE_DISCARDS |
153 | #else |
154 | #define KEEP_PATCHABLE |
155 | #define PATCHABLE_DISCARDS *(__patchable_function_entries) |
156 | #endif |
157 | |
158 | #ifndef CONFIG_ARCH_SUPPORTS_CFI_CLANG |
159 | /* |
160 | * Simply points to ftrace_stub, but with the proper protocol. |
161 | * Defined by the linker script in linux/vmlinux.lds.h |
162 | */ |
163 | #define FTRACE_STUB_HACK ftrace_stub_graph = ftrace_stub; |
164 | #else |
165 | #define FTRACE_STUB_HACK |
166 | #endif |
167 | |
168 | #ifdef CONFIG_FTRACE_MCOUNT_RECORD |
169 | /* |
170 | * The ftrace call sites are logged to a section whose name depends on the |
171 | * compiler option used. A given kernel image will only use one, AKA |
172 | * FTRACE_CALLSITE_SECTION. We capture all of them here to avoid header |
173 | * dependencies for FTRACE_CALLSITE_SECTION's definition. |
174 | * |
175 | * ftrace_ops_list_func will be defined as arch_ftrace_ops_list_func |
176 | * as some archs will have a different prototype for that function |
177 | * but ftrace_ops_list_func() will have a single prototype. |
178 | */ |
179 | #define MCOUNT_REC() . = ALIGN(8); \ |
180 | __start_mcount_loc = .; \ |
181 | KEEP(*(__mcount_loc)) \ |
182 | KEEP_PATCHABLE \ |
183 | __stop_mcount_loc = .; \ |
184 | FTRACE_STUB_HACK \ |
185 | ftrace_ops_list_func = arch_ftrace_ops_list_func; |
186 | #else |
187 | # ifdef CONFIG_FUNCTION_TRACER |
188 | # define MCOUNT_REC() FTRACE_STUB_HACK \ |
189 | ftrace_ops_list_func = arch_ftrace_ops_list_func; |
190 | # else |
191 | # define MCOUNT_REC() |
192 | # endif |
193 | #endif |
194 | |
195 | #define BOUNDED_SECTION_PRE_LABEL(_sec_, _label_, _BEGIN_, _END_) \ |
196 | _BEGIN_##_label_ = .; \ |
197 | KEEP(*(_sec_)) \ |
198 | _END_##_label_ = .; |
199 | |
200 | #define BOUNDED_SECTION_POST_LABEL(_sec_, _label_, _BEGIN_, _END_) \ |
201 | _label_##_BEGIN_ = .; \ |
202 | KEEP(*(_sec_)) \ |
203 | _label_##_END_ = .; |
204 | |
205 | #define BOUNDED_SECTION_BY(_sec_, _label_) \ |
206 | BOUNDED_SECTION_PRE_LABEL(_sec_, _label_, __start, __stop) |
207 | |
208 | #define BOUNDED_SECTION(_sec) BOUNDED_SECTION_BY(_sec, _sec) |
209 | |
210 | #define (_sec_, _label_, _BEGIN_, _END_, _HDR_) \ |
211 | _HDR_##_label_ = .; \ |
212 | KEEP(*(.gnu.linkonce.##_sec_)) \ |
213 | BOUNDED_SECTION_PRE_LABEL(_sec_, _label_, _BEGIN_, _END_) |
214 | |
215 | #define (_sec_, _label_, _BEGIN_, _END_, _HDR_) \ |
216 | _label_##_HDR_ = .; \ |
217 | KEEP(*(.gnu.linkonce.##_sec_)) \ |
218 | BOUNDED_SECTION_POST_LABEL(_sec_, _label_, _BEGIN_, _END_) |
219 | |
220 | #define (_sec_, _label_) \ |
221 | HEADERED_SECTION_PRE_LABEL(_sec_, _label_, __start, __stop) |
222 | |
223 | #define (_sec) HEADERED_SECTION_BY(_sec, _sec) |
224 | |
225 | #ifdef CONFIG_TRACE_BRANCH_PROFILING |
226 | #define LIKELY_PROFILE() \ |
227 | BOUNDED_SECTION_BY(_ftrace_annotated_branch, _annotated_branch_profile) |
228 | #else |
229 | #define LIKELY_PROFILE() |
230 | #endif |
231 | |
232 | #ifdef CONFIG_PROFILE_ALL_BRANCHES |
233 | #define BRANCH_PROFILE() \ |
234 | BOUNDED_SECTION_BY(_ftrace_branch, _branch_profile) |
235 | #else |
236 | #define BRANCH_PROFILE() |
237 | #endif |
238 | |
239 | #ifdef CONFIG_KPROBES |
240 | #define KPROBE_BLACKLIST() \ |
241 | . = ALIGN(8); \ |
242 | BOUNDED_SECTION(_kprobe_blacklist) |
243 | #else |
244 | #define KPROBE_BLACKLIST() |
245 | #endif |
246 | |
247 | #ifdef CONFIG_FUNCTION_ERROR_INJECTION |
248 | #define ERROR_INJECT_WHITELIST() \ |
249 | STRUCT_ALIGN(); \ |
250 | BOUNDED_SECTION(_error_injection_whitelist) |
251 | #else |
252 | #define ERROR_INJECT_WHITELIST() |
253 | #endif |
254 | |
255 | #ifdef CONFIG_EVENT_TRACING |
256 | #define FTRACE_EVENTS() \ |
257 | . = ALIGN(8); \ |
258 | BOUNDED_SECTION(_ftrace_events) \ |
259 | BOUNDED_SECTION_BY(_ftrace_eval_map, _ftrace_eval_maps) |
260 | #else |
261 | #define FTRACE_EVENTS() |
262 | #endif |
263 | |
264 | #ifdef CONFIG_TRACING |
265 | #define TRACE_PRINTKS() BOUNDED_SECTION_BY(__trace_printk_fmt, ___trace_bprintk_fmt) |
266 | #define TRACEPOINT_STR() BOUNDED_SECTION_BY(__tracepoint_str, ___tracepoint_str) |
267 | #else |
268 | #define TRACE_PRINTKS() |
269 | #define TRACEPOINT_STR() |
270 | #endif |
271 | |
272 | #ifdef CONFIG_FTRACE_SYSCALLS |
273 | #define TRACE_SYSCALLS() \ |
274 | . = ALIGN(8); \ |
275 | BOUNDED_SECTION_BY(__syscalls_metadata, _syscalls_metadata) |
276 | #else |
277 | #define TRACE_SYSCALLS() |
278 | #endif |
279 | |
280 | #ifdef CONFIG_BPF_EVENTS |
281 | #define BPF_RAW_TP() STRUCT_ALIGN(); \ |
282 | BOUNDED_SECTION_BY(__bpf_raw_tp_map, __bpf_raw_tp) |
283 | #else |
284 | #define BPF_RAW_TP() |
285 | #endif |
286 | |
287 | #ifdef CONFIG_SERIAL_EARLYCON |
288 | #define EARLYCON_TABLE() \ |
289 | . = ALIGN(8); \ |
290 | BOUNDED_SECTION_POST_LABEL(__earlycon_table, __earlycon_table, , _end) |
291 | #else |
292 | #define EARLYCON_TABLE() |
293 | #endif |
294 | |
295 | #ifdef CONFIG_SECURITY |
296 | #define LSM_TABLE() \ |
297 | . = ALIGN(8); \ |
298 | BOUNDED_SECTION_PRE_LABEL(.lsm_info.init, _lsm_info, __start, __end) |
299 | |
300 | #define EARLY_LSM_TABLE() \ |
301 | . = ALIGN(8); \ |
302 | BOUNDED_SECTION_PRE_LABEL(.early_lsm_info.init, _early_lsm_info, __start, __end) |
303 | #else |
304 | #define LSM_TABLE() |
305 | #define EARLY_LSM_TABLE() |
306 | #endif |
307 | |
308 | #define ___OF_TABLE(cfg, name) _OF_TABLE_##cfg(name) |
309 | #define __OF_TABLE(cfg, name) ___OF_TABLE(cfg, name) |
310 | #define OF_TABLE(cfg, name) __OF_TABLE(IS_ENABLED(cfg), name) |
311 | #define _OF_TABLE_0(name) |
312 | #define _OF_TABLE_1(name) \ |
313 | . = ALIGN(8); \ |
314 | __##name##_of_table = .; \ |
315 | KEEP(*(__##name##_of_table)) \ |
316 | KEEP(*(__##name##_of_table_end)) |
317 | |
318 | #define TIMER_OF_TABLES() OF_TABLE(CONFIG_TIMER_OF, timer) |
319 | #define IRQCHIP_OF_MATCH_TABLE() OF_TABLE(CONFIG_IRQCHIP, irqchip) |
320 | #define CLK_OF_TABLES() OF_TABLE(CONFIG_COMMON_CLK, clk) |
321 | #define RESERVEDMEM_OF_TABLES() OF_TABLE(CONFIG_OF_RESERVED_MEM, reservedmem) |
322 | #define CPU_METHOD_OF_TABLES() OF_TABLE(CONFIG_SMP, cpu_method) |
323 | #define CPUIDLE_METHOD_OF_TABLES() OF_TABLE(CONFIG_CPU_IDLE, cpuidle_method) |
324 | |
325 | #ifdef CONFIG_ACPI |
326 | #define ACPI_PROBE_TABLE(name) \ |
327 | . = ALIGN(8); \ |
328 | BOUNDED_SECTION_POST_LABEL(__##name##_acpi_probe_table, \ |
329 | __##name##_acpi_probe_table,, _end) |
330 | #else |
331 | #define ACPI_PROBE_TABLE(name) |
332 | #endif |
333 | |
334 | #ifdef CONFIG_THERMAL |
335 | #define THERMAL_TABLE(name) \ |
336 | . = ALIGN(8); \ |
337 | BOUNDED_SECTION_POST_LABEL(__##name##_thermal_table, \ |
338 | __##name##_thermal_table,, _end) |
339 | #else |
340 | #define THERMAL_TABLE(name) |
341 | #endif |
342 | |
343 | #define KERNEL_DTB() \ |
344 | STRUCT_ALIGN(); \ |
345 | __dtb_start = .; \ |
346 | KEEP(*(.dtb.init.rodata)) \ |
347 | __dtb_end = .; |
348 | |
349 | /* |
350 | * .data section |
351 | */ |
352 | #define DATA_DATA \ |
353 | *(.xiptext) \ |
354 | *(DATA_MAIN) \ |
355 | *(.data..decrypted) \ |
356 | *(.ref.data) \ |
357 | *(.data..shared_aligned) /* percpu related */ \ |
358 | MEM_KEEP(init.data*) \ |
359 | *(.data.unlikely) \ |
360 | __start_once = .; \ |
361 | *(.data.once) \ |
362 | __end_once = .; \ |
363 | STRUCT_ALIGN(); \ |
364 | *(__tracepoints) \ |
365 | /* implement dynamic printk debug */ \ |
366 | . = ALIGN(8); \ |
367 | BOUNDED_SECTION_BY(__dyndbg_classes, ___dyndbg_classes) \ |
368 | BOUNDED_SECTION_BY(__dyndbg, ___dyndbg) \ |
369 | LIKELY_PROFILE() \ |
370 | BRANCH_PROFILE() \ |
371 | TRACE_PRINTKS() \ |
372 | BPF_RAW_TP() \ |
373 | TRACEPOINT_STR() |
374 | |
375 | /* |
376 | * Data section helpers |
377 | */ |
378 | #define NOSAVE_DATA \ |
379 | . = ALIGN(PAGE_SIZE); \ |
380 | __nosave_begin = .; \ |
381 | *(.data..nosave) \ |
382 | . = ALIGN(PAGE_SIZE); \ |
383 | __nosave_end = .; |
384 | |
385 | #define PAGE_ALIGNED_DATA(page_align) \ |
386 | . = ALIGN(page_align); \ |
387 | *(.data..page_aligned) \ |
388 | . = ALIGN(page_align); |
389 | |
390 | #define READ_MOSTLY_DATA(align) \ |
391 | . = ALIGN(align); \ |
392 | *(.data..read_mostly) \ |
393 | . = ALIGN(align); |
394 | |
395 | #define CACHELINE_ALIGNED_DATA(align) \ |
396 | . = ALIGN(align); \ |
397 | *(.data..cacheline_aligned) |
398 | |
399 | #define INIT_TASK_DATA(align) \ |
400 | . = ALIGN(align); \ |
401 | __start_init_task = .; \ |
402 | init_thread_union = .; \ |
403 | init_stack = .; \ |
404 | KEEP(*(.data..init_task)) \ |
405 | KEEP(*(.data..init_thread_info)) \ |
406 | . = __start_init_task + THREAD_SIZE; \ |
407 | __end_init_task = .; |
408 | |
409 | #define JUMP_TABLE_DATA \ |
410 | . = ALIGN(8); \ |
411 | BOUNDED_SECTION_BY(__jump_table, ___jump_table) |
412 | |
413 | #ifdef CONFIG_HAVE_STATIC_CALL_INLINE |
414 | #define STATIC_CALL_DATA \ |
415 | . = ALIGN(8); \ |
416 | BOUNDED_SECTION_BY(.static_call_sites, _static_call_sites) \ |
417 | BOUNDED_SECTION_BY(.static_call_tramp_key, _static_call_tramp_key) |
418 | #else |
419 | #define STATIC_CALL_DATA |
420 | #endif |
421 | |
422 | /* |
423 | * Allow architectures to handle ro_after_init data on their |
424 | * own by defining an empty RO_AFTER_INIT_DATA. |
425 | */ |
426 | #ifndef RO_AFTER_INIT_DATA |
427 | #define RO_AFTER_INIT_DATA \ |
428 | . = ALIGN(8); \ |
429 | __start_ro_after_init = .; \ |
430 | *(.data..ro_after_init) \ |
431 | JUMP_TABLE_DATA \ |
432 | STATIC_CALL_DATA \ |
433 | __end_ro_after_init = .; |
434 | #endif |
435 | |
436 | /* |
437 | * .kcfi_traps contains a list KCFI trap locations. |
438 | */ |
439 | #ifndef KCFI_TRAPS |
440 | #ifdef CONFIG_ARCH_USES_CFI_TRAPS |
441 | #define KCFI_TRAPS \ |
442 | __kcfi_traps : AT(ADDR(__kcfi_traps) - LOAD_OFFSET) { \ |
443 | BOUNDED_SECTION_BY(.kcfi_traps, ___kcfi_traps) \ |
444 | } |
445 | #else |
446 | #define KCFI_TRAPS |
447 | #endif |
448 | #endif |
449 | |
450 | /* |
451 | * Read only Data |
452 | */ |
453 | #define RO_DATA(align) \ |
454 | . = ALIGN((align)); \ |
455 | .rodata : AT(ADDR(.rodata) - LOAD_OFFSET) { \ |
456 | __start_rodata = .; \ |
457 | *(.rodata) *(.rodata.*) \ |
458 | SCHED_DATA \ |
459 | RO_AFTER_INIT_DATA /* Read only after init */ \ |
460 | . = ALIGN(8); \ |
461 | BOUNDED_SECTION_BY(__tracepoints_ptrs, ___tracepoints_ptrs) \ |
462 | *(__tracepoints_strings)/* Tracepoints: strings */ \ |
463 | } \ |
464 | \ |
465 | .rodata1 : AT(ADDR(.rodata1) - LOAD_OFFSET) { \ |
466 | *(.rodata1) \ |
467 | } \ |
468 | \ |
469 | /* PCI quirks */ \ |
470 | .pci_fixup : AT(ADDR(.pci_fixup) - LOAD_OFFSET) { \ |
471 | BOUNDED_SECTION_PRE_LABEL(.pci_fixup_early, _pci_fixups_early, __start, __end) \ |
472 | BOUNDED_SECTION_PRE_LABEL(.pci_fixup_header, _pci_fixups_header, __start, __end) \ |
473 | BOUNDED_SECTION_PRE_LABEL(.pci_fixup_final, _pci_fixups_final, __start, __end) \ |
474 | BOUNDED_SECTION_PRE_LABEL(.pci_fixup_enable, _pci_fixups_enable, __start, __end) \ |
475 | BOUNDED_SECTION_PRE_LABEL(.pci_fixup_resume, _pci_fixups_resume, __start, __end) \ |
476 | BOUNDED_SECTION_PRE_LABEL(.pci_fixup_suspend, _pci_fixups_suspend, __start, __end) \ |
477 | BOUNDED_SECTION_PRE_LABEL(.pci_fixup_resume_early, _pci_fixups_resume_early, __start, __end) \ |
478 | BOUNDED_SECTION_PRE_LABEL(.pci_fixup_suspend_late, _pci_fixups_suspend_late, __start, __end) \ |
479 | } \ |
480 | \ |
481 | FW_LOADER_BUILT_IN_DATA \ |
482 | TRACEDATA \ |
483 | \ |
484 | PRINTK_INDEX \ |
485 | \ |
486 | /* Kernel symbol table: Normal symbols */ \ |
487 | __ksymtab : AT(ADDR(__ksymtab) - LOAD_OFFSET) { \ |
488 | __start___ksymtab = .; \ |
489 | KEEP(*(SORT(___ksymtab+*))) \ |
490 | __stop___ksymtab = .; \ |
491 | } \ |
492 | \ |
493 | /* Kernel symbol table: GPL-only symbols */ \ |
494 | __ksymtab_gpl : AT(ADDR(__ksymtab_gpl) - LOAD_OFFSET) { \ |
495 | __start___ksymtab_gpl = .; \ |
496 | KEEP(*(SORT(___ksymtab_gpl+*))) \ |
497 | __stop___ksymtab_gpl = .; \ |
498 | } \ |
499 | \ |
500 | /* Kernel symbol table: Normal symbols */ \ |
501 | __kcrctab : AT(ADDR(__kcrctab) - LOAD_OFFSET) { \ |
502 | __start___kcrctab = .; \ |
503 | KEEP(*(SORT(___kcrctab+*))) \ |
504 | __stop___kcrctab = .; \ |
505 | } \ |
506 | \ |
507 | /* Kernel symbol table: GPL-only symbols */ \ |
508 | __kcrctab_gpl : AT(ADDR(__kcrctab_gpl) - LOAD_OFFSET) { \ |
509 | __start___kcrctab_gpl = .; \ |
510 | KEEP(*(SORT(___kcrctab_gpl+*))) \ |
511 | __stop___kcrctab_gpl = .; \ |
512 | } \ |
513 | \ |
514 | /* Kernel symbol table: strings */ \ |
515 | __ksymtab_strings : AT(ADDR(__ksymtab_strings) - LOAD_OFFSET) { \ |
516 | *(__ksymtab_strings) \ |
517 | } \ |
518 | \ |
519 | /* __*init sections */ \ |
520 | __init_rodata : AT(ADDR(__init_rodata) - LOAD_OFFSET) { \ |
521 | *(.ref.rodata) \ |
522 | MEM_KEEP(init.rodata) \ |
523 | } \ |
524 | \ |
525 | /* Built-in module parameters. */ \ |
526 | __param : AT(ADDR(__param) - LOAD_OFFSET) { \ |
527 | BOUNDED_SECTION_BY(__param, ___param) \ |
528 | } \ |
529 | \ |
530 | /* Built-in module versions. */ \ |
531 | __modver : AT(ADDR(__modver) - LOAD_OFFSET) { \ |
532 | BOUNDED_SECTION_BY(__modver, ___modver) \ |
533 | } \ |
534 | \ |
535 | KCFI_TRAPS \ |
536 | \ |
537 | RO_EXCEPTION_TABLE \ |
538 | NOTES \ |
539 | BTF \ |
540 | \ |
541 | . = ALIGN((align)); \ |
542 | __end_rodata = .; |
543 | |
544 | |
545 | /* |
546 | * Non-instrumentable text section |
547 | */ |
548 | #define NOINSTR_TEXT \ |
549 | ALIGN_FUNCTION(); \ |
550 | __noinstr_text_start = .; \ |
551 | *(.noinstr.text) \ |
552 | __cpuidle_text_start = .; \ |
553 | *(.cpuidle.text) \ |
554 | __cpuidle_text_end = .; \ |
555 | __noinstr_text_end = .; |
556 | |
557 | /* |
558 | * .text section. Map to function alignment to avoid address changes |
559 | * during second ld run in second ld pass when generating System.map |
560 | * |
561 | * TEXT_MAIN here will match .text.fixup and .text.unlikely if dead |
562 | * code elimination is enabled, so these sections should be converted |
563 | * to use ".." first. |
564 | */ |
565 | #define TEXT_TEXT \ |
566 | ALIGN_FUNCTION(); \ |
567 | *(.text.hot .text.hot.*) \ |
568 | *(TEXT_MAIN .text.fixup) \ |
569 | *(.text.unlikely .text.unlikely.*) \ |
570 | *(.text.unknown .text.unknown.*) \ |
571 | NOINSTR_TEXT \ |
572 | *(.ref.text) \ |
573 | *(.text.asan.* .text.tsan.*) \ |
574 | MEM_KEEP(init.text*) \ |
575 | |
576 | |
577 | /* sched.text is aling to function alignment to secure we have same |
578 | * address even at second ld pass when generating System.map */ |
579 | #define SCHED_TEXT \ |
580 | ALIGN_FUNCTION(); \ |
581 | __sched_text_start = .; \ |
582 | *(.sched.text) \ |
583 | __sched_text_end = .; |
584 | |
585 | /* spinlock.text is aling to function alignment to secure we have same |
586 | * address even at second ld pass when generating System.map */ |
587 | #define LOCK_TEXT \ |
588 | ALIGN_FUNCTION(); \ |
589 | __lock_text_start = .; \ |
590 | *(.spinlock.text) \ |
591 | __lock_text_end = .; |
592 | |
593 | #define KPROBES_TEXT \ |
594 | ALIGN_FUNCTION(); \ |
595 | __kprobes_text_start = .; \ |
596 | *(.kprobes.text) \ |
597 | __kprobes_text_end = .; |
598 | |
599 | #define ENTRY_TEXT \ |
600 | ALIGN_FUNCTION(); \ |
601 | __entry_text_start = .; \ |
602 | *(.entry.text) \ |
603 | __entry_text_end = .; |
604 | |
605 | #define IRQENTRY_TEXT \ |
606 | ALIGN_FUNCTION(); \ |
607 | __irqentry_text_start = .; \ |
608 | *(.irqentry.text) \ |
609 | __irqentry_text_end = .; |
610 | |
611 | #define SOFTIRQENTRY_TEXT \ |
612 | ALIGN_FUNCTION(); \ |
613 | __softirqentry_text_start = .; \ |
614 | *(.softirqentry.text) \ |
615 | __softirqentry_text_end = .; |
616 | |
617 | #define STATIC_CALL_TEXT \ |
618 | ALIGN_FUNCTION(); \ |
619 | __static_call_text_start = .; \ |
620 | *(.static_call.text) \ |
621 | __static_call_text_end = .; |
622 | |
623 | /* Section used for early init (in .S files) */ |
624 | #define HEAD_TEXT KEEP(*(.head.text)) |
625 | |
626 | #define HEAD_TEXT_SECTION \ |
627 | .head.text : AT(ADDR(.head.text) - LOAD_OFFSET) { \ |
628 | HEAD_TEXT \ |
629 | } |
630 | |
631 | /* |
632 | * Exception table |
633 | */ |
634 | #define EXCEPTION_TABLE(align) \ |
635 | . = ALIGN(align); \ |
636 | __ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) { \ |
637 | BOUNDED_SECTION_BY(__ex_table, ___ex_table) \ |
638 | } |
639 | |
640 | /* |
641 | * .BTF |
642 | */ |
643 | #ifdef CONFIG_DEBUG_INFO_BTF |
644 | #define BTF \ |
645 | .BTF : AT(ADDR(.BTF) - LOAD_OFFSET) { \ |
646 | BOUNDED_SECTION_BY(.BTF, _BTF) \ |
647 | } \ |
648 | . = ALIGN(4); \ |
649 | .BTF_ids : AT(ADDR(.BTF_ids) - LOAD_OFFSET) { \ |
650 | *(.BTF_ids) \ |
651 | } |
652 | #else |
653 | #define BTF |
654 | #endif |
655 | |
656 | /* |
657 | * Init task |
658 | */ |
659 | #define INIT_TASK_DATA_SECTION(align) \ |
660 | . = ALIGN(align); \ |
661 | .data..init_task : AT(ADDR(.data..init_task) - LOAD_OFFSET) { \ |
662 | INIT_TASK_DATA(align) \ |
663 | } |
664 | |
665 | #ifdef CONFIG_CONSTRUCTORS |
666 | #define KERNEL_CTORS() . = ALIGN(8); \ |
667 | __ctors_start = .; \ |
668 | KEEP(*(SORT(.ctors.*))) \ |
669 | KEEP(*(.ctors)) \ |
670 | KEEP(*(SORT(.init_array.*))) \ |
671 | KEEP(*(.init_array)) \ |
672 | __ctors_end = .; |
673 | #else |
674 | #define KERNEL_CTORS() |
675 | #endif |
676 | |
677 | /* init and exit section handling */ |
678 | #define INIT_DATA \ |
679 | KEEP(*(SORT(___kentry+*))) \ |
680 | *(.init.data .init.data.*) \ |
681 | MEM_DISCARD(init.data*) \ |
682 | KERNEL_CTORS() \ |
683 | MCOUNT_REC() \ |
684 | *(.init.rodata .init.rodata.*) \ |
685 | FTRACE_EVENTS() \ |
686 | TRACE_SYSCALLS() \ |
687 | KPROBE_BLACKLIST() \ |
688 | ERROR_INJECT_WHITELIST() \ |
689 | MEM_DISCARD(init.rodata) \ |
690 | CLK_OF_TABLES() \ |
691 | RESERVEDMEM_OF_TABLES() \ |
692 | TIMER_OF_TABLES() \ |
693 | CPU_METHOD_OF_TABLES() \ |
694 | CPUIDLE_METHOD_OF_TABLES() \ |
695 | KERNEL_DTB() \ |
696 | IRQCHIP_OF_MATCH_TABLE() \ |
697 | ACPI_PROBE_TABLE(irqchip) \ |
698 | ACPI_PROBE_TABLE(timer) \ |
699 | THERMAL_TABLE(governor) \ |
700 | EARLYCON_TABLE() \ |
701 | LSM_TABLE() \ |
702 | EARLY_LSM_TABLE() \ |
703 | KUNIT_TABLE() |
704 | |
705 | #define INIT_TEXT \ |
706 | *(.init.text .init.text.*) \ |
707 | *(.text.startup) \ |
708 | MEM_DISCARD(init.text*) |
709 | |
710 | #define EXIT_DATA \ |
711 | *(.exit.data .exit.data.*) \ |
712 | *(.fini_array .fini_array.*) \ |
713 | *(.dtors .dtors.*) \ |
714 | |
715 | #define EXIT_TEXT \ |
716 | *(.exit.text) \ |
717 | *(.text.exit) \ |
718 | |
719 | #define EXIT_CALL \ |
720 | *(.exitcall.exit) |
721 | |
722 | /* |
723 | * bss (Block Started by Symbol) - uninitialized data |
724 | * zeroed during startup |
725 | */ |
726 | #define SBSS(sbss_align) \ |
727 | . = ALIGN(sbss_align); \ |
728 | .sbss : AT(ADDR(.sbss) - LOAD_OFFSET) { \ |
729 | *(.dynsbss) \ |
730 | *(SBSS_MAIN) \ |
731 | *(.scommon) \ |
732 | } |
733 | |
734 | /* |
735 | * Allow archectures to redefine BSS_FIRST_SECTIONS to add extra |
736 | * sections to the front of bss. |
737 | */ |
738 | #ifndef BSS_FIRST_SECTIONS |
739 | #define BSS_FIRST_SECTIONS |
740 | #endif |
741 | |
742 | #define BSS(bss_align) \ |
743 | . = ALIGN(bss_align); \ |
744 | .bss : AT(ADDR(.bss) - LOAD_OFFSET) { \ |
745 | BSS_FIRST_SECTIONS \ |
746 | . = ALIGN(PAGE_SIZE); \ |
747 | *(.bss..page_aligned) \ |
748 | . = ALIGN(PAGE_SIZE); \ |
749 | *(.dynbss) \ |
750 | *(BSS_MAIN) \ |
751 | *(COMMON) \ |
752 | } |
753 | |
754 | /* |
755 | * DWARF debug sections. |
756 | * Symbols in the DWARF debugging sections are relative to |
757 | * the beginning of the section so we begin them at 0. |
758 | */ |
759 | #define DWARF_DEBUG \ |
760 | /* DWARF 1 */ \ |
761 | .debug 0 : { *(.debug) } \ |
762 | .line 0 : { *(.line) } \ |
763 | /* GNU DWARF 1 extensions */ \ |
764 | .debug_srcinfo 0 : { *(.debug_srcinfo) } \ |
765 | .debug_sfnames 0 : { *(.debug_sfnames) } \ |
766 | /* DWARF 1.1 and DWARF 2 */ \ |
767 | .debug_aranges 0 : { *(.debug_aranges) } \ |
768 | .debug_pubnames 0 : { *(.debug_pubnames) } \ |
769 | /* DWARF 2 */ \ |
770 | .debug_info 0 : { *(.debug_info \ |
771 | .gnu.linkonce.wi.*) } \ |
772 | .debug_abbrev 0 : { *(.debug_abbrev) } \ |
773 | .debug_line 0 : { *(.debug_line) } \ |
774 | .debug_frame 0 : { *(.debug_frame) } \ |
775 | .debug_str 0 : { *(.debug_str) } \ |
776 | .debug_loc 0 : { *(.debug_loc) } \ |
777 | .debug_macinfo 0 : { *(.debug_macinfo) } \ |
778 | .debug_pubtypes 0 : { *(.debug_pubtypes) } \ |
779 | /* DWARF 3 */ \ |
780 | .debug_ranges 0 : { *(.debug_ranges) } \ |
781 | /* SGI/MIPS DWARF 2 extensions */ \ |
782 | .debug_weaknames 0 : { *(.debug_weaknames) } \ |
783 | .debug_funcnames 0 : { *(.debug_funcnames) } \ |
784 | .debug_typenames 0 : { *(.debug_typenames) } \ |
785 | .debug_varnames 0 : { *(.debug_varnames) } \ |
786 | /* GNU DWARF 2 extensions */ \ |
787 | .debug_gnu_pubnames 0 : { *(.debug_gnu_pubnames) } \ |
788 | .debug_gnu_pubtypes 0 : { *(.debug_gnu_pubtypes) } \ |
789 | /* DWARF 4 */ \ |
790 | .debug_types 0 : { *(.debug_types) } \ |
791 | /* DWARF 5 */ \ |
792 | .debug_addr 0 : { *(.debug_addr) } \ |
793 | .debug_line_str 0 : { *(.debug_line_str) } \ |
794 | .debug_loclists 0 : { *(.debug_loclists) } \ |
795 | .debug_macro 0 : { *(.debug_macro) } \ |
796 | .debug_names 0 : { *(.debug_names) } \ |
797 | .debug_rnglists 0 : { *(.debug_rnglists) } \ |
798 | .debug_str_offsets 0 : { *(.debug_str_offsets) } |
799 | |
800 | /* Stabs debugging sections. */ |
801 | #define STABS_DEBUG \ |
802 | .stab 0 : { *(.stab) } \ |
803 | .stabstr 0 : { *(.stabstr) } \ |
804 | .stab.excl 0 : { *(.stab.excl) } \ |
805 | .stab.exclstr 0 : { *(.stab.exclstr) } \ |
806 | .stab.index 0 : { *(.stab.index) } \ |
807 | .stab.indexstr 0 : { *(.stab.indexstr) } |
808 | |
809 | /* Required sections not related to debugging. */ |
810 | #define ELF_DETAILS \ |
811 | .comment 0 : { *(.comment) } \ |
812 | .symtab 0 : { *(.symtab) } \ |
813 | .strtab 0 : { *(.strtab) } \ |
814 | .shstrtab 0 : { *(.shstrtab) } |
815 | |
816 | #ifdef CONFIG_GENERIC_BUG |
817 | #define BUG_TABLE \ |
818 | . = ALIGN(8); \ |
819 | __bug_table : AT(ADDR(__bug_table) - LOAD_OFFSET) { \ |
820 | BOUNDED_SECTION_BY(__bug_table, ___bug_table) \ |
821 | } |
822 | #else |
823 | #define BUG_TABLE |
824 | #endif |
825 | |
826 | #ifdef CONFIG_UNWINDER_ORC |
827 | #define ORC_UNWIND_TABLE \ |
828 | .orc_header : AT(ADDR(.orc_header) - LOAD_OFFSET) { \ |
829 | BOUNDED_SECTION_BY(.orc_header, _orc_header) \ |
830 | } \ |
831 | . = ALIGN(4); \ |
832 | .orc_unwind_ip : AT(ADDR(.orc_unwind_ip) - LOAD_OFFSET) { \ |
833 | BOUNDED_SECTION_BY(.orc_unwind_ip, _orc_unwind_ip) \ |
834 | } \ |
835 | . = ALIGN(2); \ |
836 | .orc_unwind : AT(ADDR(.orc_unwind) - LOAD_OFFSET) { \ |
837 | BOUNDED_SECTION_BY(.orc_unwind, _orc_unwind) \ |
838 | } \ |
839 | text_size = _etext - _stext; \ |
840 | . = ALIGN(4); \ |
841 | .orc_lookup : AT(ADDR(.orc_lookup) - LOAD_OFFSET) { \ |
842 | orc_lookup = .; \ |
843 | . += (((text_size + LOOKUP_BLOCK_SIZE - 1) / \ |
844 | LOOKUP_BLOCK_SIZE) + 1) * 4; \ |
845 | orc_lookup_end = .; \ |
846 | } |
847 | #else |
848 | #define ORC_UNWIND_TABLE |
849 | #endif |
850 | |
851 | /* Built-in firmware blobs */ |
852 | #ifdef CONFIG_FW_LOADER |
853 | #define FW_LOADER_BUILT_IN_DATA \ |
854 | .builtin_fw : AT(ADDR(.builtin_fw) - LOAD_OFFSET) ALIGN(8) { \ |
855 | BOUNDED_SECTION_PRE_LABEL(.builtin_fw, _builtin_fw, __start, __end) \ |
856 | } |
857 | #else |
858 | #define FW_LOADER_BUILT_IN_DATA |
859 | #endif |
860 | |
861 | #ifdef CONFIG_PM_TRACE |
862 | #define TRACEDATA \ |
863 | . = ALIGN(4); \ |
864 | .tracedata : AT(ADDR(.tracedata) - LOAD_OFFSET) { \ |
865 | BOUNDED_SECTION_POST_LABEL(.tracedata, __tracedata, _start, _end) \ |
866 | } |
867 | #else |
868 | #define TRACEDATA |
869 | #endif |
870 | |
871 | #ifdef CONFIG_PRINTK_INDEX |
872 | #define PRINTK_INDEX \ |
873 | .printk_index : AT(ADDR(.printk_index) - LOAD_OFFSET) { \ |
874 | BOUNDED_SECTION_BY(.printk_index, _printk_index) \ |
875 | } |
876 | #else |
877 | #define PRINTK_INDEX |
878 | #endif |
879 | |
880 | /* |
881 | * Discard .note.GNU-stack, which is emitted as PROGBITS by the compiler. |
882 | * Otherwise, the type of .notes section would become PROGBITS instead of NOTES. |
883 | * |
884 | * Also, discard .note.gnu.property, otherwise it forces the notes section to |
885 | * be 8-byte aligned which causes alignment mismatches with the kernel's custom |
886 | * 4-byte aligned notes. |
887 | */ |
888 | #define NOTES \ |
889 | /DISCARD/ : { \ |
890 | *(.note.GNU-stack) \ |
891 | *(.note.gnu.property) \ |
892 | } \ |
893 | .notes : AT(ADDR(.notes) - LOAD_OFFSET) { \ |
894 | BOUNDED_SECTION_BY(.note.*, _notes) \ |
895 | } NOTES_HEADERS \ |
896 | NOTES_HEADERS_RESTORE |
897 | |
898 | #define INIT_SETUP(initsetup_align) \ |
899 | . = ALIGN(initsetup_align); \ |
900 | BOUNDED_SECTION_POST_LABEL(.init.setup, __setup, _start, _end) |
901 | |
902 | #define INIT_CALLS_LEVEL(level) \ |
903 | __initcall##level##_start = .; \ |
904 | KEEP(*(.initcall##level##.init)) \ |
905 | KEEP(*(.initcall##level##s.init)) \ |
906 | |
907 | #define INIT_CALLS \ |
908 | __initcall_start = .; \ |
909 | KEEP(*(.initcallearly.init)) \ |
910 | INIT_CALLS_LEVEL(0) \ |
911 | INIT_CALLS_LEVEL(1) \ |
912 | INIT_CALLS_LEVEL(2) \ |
913 | INIT_CALLS_LEVEL(3) \ |
914 | INIT_CALLS_LEVEL(4) \ |
915 | INIT_CALLS_LEVEL(5) \ |
916 | INIT_CALLS_LEVEL(rootfs) \ |
917 | INIT_CALLS_LEVEL(6) \ |
918 | INIT_CALLS_LEVEL(7) \ |
919 | __initcall_end = .; |
920 | |
921 | #define CON_INITCALL \ |
922 | BOUNDED_SECTION_POST_LABEL(.con_initcall.init, __con_initcall, _start, _end) |
923 | |
924 | /* Alignment must be consistent with (kunit_suite *) in include/kunit/test.h */ |
925 | #define KUNIT_TABLE() \ |
926 | . = ALIGN(8); \ |
927 | BOUNDED_SECTION_POST_LABEL(.kunit_test_suites, __kunit_suites, _start, _end) |
928 | |
929 | #ifdef CONFIG_BLK_DEV_INITRD |
930 | #define INIT_RAM_FS \ |
931 | . = ALIGN(4); \ |
932 | __initramfs_start = .; \ |
933 | KEEP(*(.init.ramfs)) \ |
934 | . = ALIGN(8); \ |
935 | KEEP(*(.init.ramfs.info)) |
936 | #else |
937 | #define INIT_RAM_FS |
938 | #endif |
939 | |
940 | /* |
941 | * Memory encryption operates on a page basis. Since we need to clear |
942 | * the memory encryption mask for this section, it needs to be aligned |
943 | * on a page boundary and be a page-size multiple in length. |
944 | * |
945 | * Note: We use a separate section so that only this section gets |
946 | * decrypted to avoid exposing more than we wish. |
947 | */ |
948 | #ifdef CONFIG_AMD_MEM_ENCRYPT |
949 | #define PERCPU_DECRYPTED_SECTION \ |
950 | . = ALIGN(PAGE_SIZE); \ |
951 | *(.data..percpu..decrypted) \ |
952 | . = ALIGN(PAGE_SIZE); |
953 | #else |
954 | #define PERCPU_DECRYPTED_SECTION |
955 | #endif |
956 | |
957 | |
958 | /* |
959 | * Default discarded sections. |
960 | * |
961 | * Some archs want to discard exit text/data at runtime rather than |
962 | * link time due to cross-section references such as alt instructions, |
963 | * bug table, eh_frame, etc. DISCARDS must be the last of output |
964 | * section definitions so that such archs put those in earlier section |
965 | * definitions. |
966 | */ |
967 | #ifdef RUNTIME_DISCARD_EXIT |
968 | #define EXIT_DISCARDS |
969 | #else |
970 | #define EXIT_DISCARDS \ |
971 | EXIT_TEXT \ |
972 | EXIT_DATA |
973 | #endif |
974 | |
975 | /* |
976 | * Clang's -fprofile-arcs, -fsanitize=kernel-address, and |
977 | * -fsanitize=thread produce unwanted sections (.eh_frame |
978 | * and .init_array.*), but CONFIG_CONSTRUCTORS wants to |
979 | * keep any .init_array.* sections. |
980 | * https://bugs.llvm.org/show_bug.cgi?id=46478 |
981 | */ |
982 | #ifdef CONFIG_UNWIND_TABLES |
983 | #define DISCARD_EH_FRAME |
984 | #else |
985 | #define DISCARD_EH_FRAME *(.eh_frame) |
986 | #endif |
987 | #if defined(CONFIG_GCOV_KERNEL) || defined(CONFIG_KASAN_GENERIC) || defined(CONFIG_KCSAN) |
988 | # ifdef CONFIG_CONSTRUCTORS |
989 | # define SANITIZER_DISCARDS \ |
990 | DISCARD_EH_FRAME |
991 | # else |
992 | # define SANITIZER_DISCARDS \ |
993 | *(.init_array) *(.init_array.*) \ |
994 | DISCARD_EH_FRAME |
995 | # endif |
996 | #else |
997 | # define SANITIZER_DISCARDS |
998 | #endif |
999 | |
1000 | #define COMMON_DISCARDS \ |
1001 | SANITIZER_DISCARDS \ |
1002 | PATCHABLE_DISCARDS \ |
1003 | *(.discard) \ |
1004 | *(.discard.*) \ |
1005 | *(.export_symbol) \ |
1006 | *(.modinfo) \ |
1007 | /* ld.bfd warns about .gnu.version* even when not emitted */ \ |
1008 | *(.gnu.version*) \ |
1009 | |
1010 | #define DISCARDS \ |
1011 | /DISCARD/ : { \ |
1012 | EXIT_DISCARDS \ |
1013 | EXIT_CALL \ |
1014 | COMMON_DISCARDS \ |
1015 | } |
1016 | |
1017 | /** |
1018 | * PERCPU_INPUT - the percpu input sections |
1019 | * @cacheline: cacheline size |
1020 | * |
1021 | * The core percpu section names and core symbols which do not rely |
1022 | * directly upon load addresses. |
1023 | * |
1024 | * @cacheline is used to align subsections to avoid false cacheline |
1025 | * sharing between subsections for different purposes. |
1026 | */ |
1027 | #define PERCPU_INPUT(cacheline) \ |
1028 | __per_cpu_start = .; \ |
1029 | *(.data..percpu..first) \ |
1030 | . = ALIGN(PAGE_SIZE); \ |
1031 | *(.data..percpu..page_aligned) \ |
1032 | . = ALIGN(cacheline); \ |
1033 | *(.data..percpu..read_mostly) \ |
1034 | . = ALIGN(cacheline); \ |
1035 | *(.data..percpu) \ |
1036 | *(.data..percpu..shared_aligned) \ |
1037 | PERCPU_DECRYPTED_SECTION \ |
1038 | __per_cpu_end = .; |
1039 | |
1040 | /** |
1041 | * PERCPU_VADDR - define output section for percpu area |
1042 | * @cacheline: cacheline size |
1043 | * @vaddr: explicit base address (optional) |
1044 | * @phdr: destination PHDR (optional) |
1045 | * |
1046 | * Macro which expands to output section for percpu area. |
1047 | * |
1048 | * @cacheline is used to align subsections to avoid false cacheline |
1049 | * sharing between subsections for different purposes. |
1050 | * |
1051 | * If @vaddr is not blank, it specifies explicit base address and all |
1052 | * percpu symbols will be offset from the given address. If blank, |
1053 | * @vaddr always equals @laddr + LOAD_OFFSET. |
1054 | * |
1055 | * @phdr defines the output PHDR to use if not blank. Be warned that |
1056 | * output PHDR is sticky. If @phdr is specified, the next output |
1057 | * section in the linker script will go there too. @phdr should have |
1058 | * a leading colon. |
1059 | * |
1060 | * Note that this macros defines __per_cpu_load as an absolute symbol. |
1061 | * If there is no need to put the percpu section at a predetermined |
1062 | * address, use PERCPU_SECTION. |
1063 | */ |
1064 | #define PERCPU_VADDR(cacheline, vaddr, phdr) \ |
1065 | __per_cpu_load = .; \ |
1066 | .data..percpu vaddr : AT(__per_cpu_load - LOAD_OFFSET) { \ |
1067 | PERCPU_INPUT(cacheline) \ |
1068 | } phdr \ |
1069 | . = __per_cpu_load + SIZEOF(.data..percpu); |
1070 | |
1071 | /** |
1072 | * PERCPU_SECTION - define output section for percpu area, simple version |
1073 | * @cacheline: cacheline size |
1074 | * |
1075 | * Align to PAGE_SIZE and outputs output section for percpu area. This |
1076 | * macro doesn't manipulate @vaddr or @phdr and __per_cpu_load and |
1077 | * __per_cpu_start will be identical. |
1078 | * |
1079 | * This macro is equivalent to ALIGN(PAGE_SIZE); PERCPU_VADDR(@cacheline,,) |
1080 | * except that __per_cpu_load is defined as a relative symbol against |
1081 | * .data..percpu which is required for relocatable x86_32 configuration. |
1082 | */ |
1083 | #define PERCPU_SECTION(cacheline) \ |
1084 | . = ALIGN(PAGE_SIZE); \ |
1085 | .data..percpu : AT(ADDR(.data..percpu) - LOAD_OFFSET) { \ |
1086 | __per_cpu_load = .; \ |
1087 | PERCPU_INPUT(cacheline) \ |
1088 | } |
1089 | |
1090 | |
1091 | /* |
1092 | * Definition of the high level *_SECTION macros |
1093 | * They will fit only a subset of the architectures |
1094 | */ |
1095 | |
1096 | |
1097 | /* |
1098 | * Writeable data. |
1099 | * All sections are combined in a single .data section. |
1100 | * The sections following CONSTRUCTORS are arranged so their |
1101 | * typical alignment matches. |
1102 | * A cacheline is typical/always less than a PAGE_SIZE so |
1103 | * the sections that has this restriction (or similar) |
1104 | * is located before the ones requiring PAGE_SIZE alignment. |
1105 | * NOSAVE_DATA starts and ends with a PAGE_SIZE alignment which |
1106 | * matches the requirement of PAGE_ALIGNED_DATA. |
1107 | * |
1108 | * use 0 as page_align if page_aligned data is not used */ |
1109 | #define RW_DATA(cacheline, pagealigned, inittask) \ |
1110 | . = ALIGN(PAGE_SIZE); \ |
1111 | .data : AT(ADDR(.data) - LOAD_OFFSET) { \ |
1112 | INIT_TASK_DATA(inittask) \ |
1113 | NOSAVE_DATA \ |
1114 | PAGE_ALIGNED_DATA(pagealigned) \ |
1115 | CACHELINE_ALIGNED_DATA(cacheline) \ |
1116 | READ_MOSTLY_DATA(cacheline) \ |
1117 | DATA_DATA \ |
1118 | CONSTRUCTORS \ |
1119 | } \ |
1120 | BUG_TABLE \ |
1121 | |
1122 | #define INIT_TEXT_SECTION(inittext_align) \ |
1123 | . = ALIGN(inittext_align); \ |
1124 | .init.text : AT(ADDR(.init.text) - LOAD_OFFSET) { \ |
1125 | _sinittext = .; \ |
1126 | INIT_TEXT \ |
1127 | _einittext = .; \ |
1128 | } |
1129 | |
1130 | #define INIT_DATA_SECTION(initsetup_align) \ |
1131 | .init.data : AT(ADDR(.init.data) - LOAD_OFFSET) { \ |
1132 | INIT_DATA \ |
1133 | INIT_SETUP(initsetup_align) \ |
1134 | INIT_CALLS \ |
1135 | CON_INITCALL \ |
1136 | INIT_RAM_FS \ |
1137 | } |
1138 | |
1139 | #define BSS_SECTION(sbss_align, bss_align, stop_align) \ |
1140 | . = ALIGN(sbss_align); \ |
1141 | __bss_start = .; \ |
1142 | SBSS(sbss_align) \ |
1143 | BSS(bss_align) \ |
1144 | . = ALIGN(stop_align); \ |
1145 | __bss_stop = .; |
1146 | |