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) 27c9174047SKees Cook * RW_DATA(...) 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 72b8c2f776SKees Cook /* 73b8c2f776SKees Cook * Some architectures have non-executable read-only exception tables. 74b8c2f776SKees Cook * They can be added to the RO_DATA segment by specifying their desired 75b8c2f776SKees Cook * alignment. 76b8c2f776SKees Cook */ 77b8c2f776SKees Cook #ifdef RO_EXCEPTION_TABLE_ALIGN 78b8c2f776SKees Cook #define RO_EXCEPTION_TABLE EXCEPTION_TABLE(RO_EXCEPTION_TABLE_ALIGN) 79b8c2f776SKees Cook #else 80b8c2f776SKees Cook #define RO_EXCEPTION_TABLE 81b8c2f776SKees Cook #endif 82b8c2f776SKees Cook 836d30e3a8SSam Ravnborg /* Align . to a 8 byte boundary equals to maximum function alignment. */ 846d30e3a8SSam Ravnborg #define ALIGN_FUNCTION() . = ALIGN(8) 856d30e3a8SSam Ravnborg 8607fca0e5SSam Ravnborg /* 87cb87481eSNicholas Piggin * LD_DEAD_CODE_DATA_ELIMINATION option enables -fdata-sections, which 88cb87481eSNicholas Piggin * generates .data.identifier sections, which need to be pulled in with 89cb87481eSNicholas Piggin * .data. We don't want to pull in .data..other sections, which Linux 90cb87481eSNicholas Piggin * has defined. Same for text and bss. 91266ff2a8SNicholas Piggin * 92266ff2a8SNicholas Piggin * RODATA_MAIN is not used because existing code already defines .rodata.x 93266ff2a8SNicholas Piggin * sections to be brought in with rodata. 94cb87481eSNicholas Piggin */ 95cb87481eSNicholas Piggin #ifdef CONFIG_LD_DEAD_CODE_DATA_ELIMINATION 96cb87481eSNicholas Piggin #define TEXT_MAIN .text .text.[0-9a-zA-Z_]* 9752c8ee5bSPeter Oberparleiter #define DATA_MAIN .data .data.[0-9a-zA-Z_]* .data..LPBX* 98266ff2a8SNicholas Piggin #define SDATA_MAIN .sdata .sdata.[0-9a-zA-Z_]* 99266ff2a8SNicholas Piggin #define RODATA_MAIN .rodata .rodata.[0-9a-zA-Z_]* 100cb87481eSNicholas Piggin #define BSS_MAIN .bss .bss.[0-9a-zA-Z_]* 101266ff2a8SNicholas Piggin #define SBSS_MAIN .sbss .sbss.[0-9a-zA-Z_]* 102cb87481eSNicholas Piggin #else 103cb87481eSNicholas Piggin #define TEXT_MAIN .text 104cb87481eSNicholas Piggin #define DATA_MAIN .data 105266ff2a8SNicholas Piggin #define SDATA_MAIN .sdata 106266ff2a8SNicholas Piggin #define RODATA_MAIN .rodata 107cb87481eSNicholas Piggin #define BSS_MAIN .bss 108266ff2a8SNicholas Piggin #define SBSS_MAIN .sbss 109cb87481eSNicholas Piggin #endif 110cb87481eSNicholas Piggin 111cb87481eSNicholas Piggin /* 11285c2ce91SPeter Zijlstra * GCC 4.5 and later have a 32 bytes section alignment for structures. 11385c2ce91SPeter Zijlstra * Except GCC 4.9, that feels the need to align on 64 bytes. 11407fca0e5SSam Ravnborg */ 11585c2ce91SPeter Zijlstra #if __GNUC__ == 4 && __GNUC_MINOR__ == 9 11685c2ce91SPeter Zijlstra #define STRUCT_ALIGNMENT 64 11785c2ce91SPeter Zijlstra #else 118aab94339SDirk Brandewie #define STRUCT_ALIGNMENT 32 11985c2ce91SPeter Zijlstra #endif 120aab94339SDirk Brandewie #define STRUCT_ALIGN() . = ALIGN(STRUCT_ALIGNMENT) 12107fca0e5SSam Ravnborg 12285c2ce91SPeter Zijlstra /* 123590d6979SSteven Rostedt (VMware) * The order of the sched class addresses are important, as they are 124590d6979SSteven Rostedt (VMware) * used to determine the order of the priority of each sched class in 125590d6979SSteven Rostedt (VMware) * relation to each other. 126590d6979SSteven Rostedt (VMware) */ 127590d6979SSteven Rostedt (VMware) #define SCHED_DATA \ 128c3a340f7SSteven Rostedt (VMware) STRUCT_ALIGN(); \ 129c3a340f7SSteven Rostedt (VMware) __begin_sched_classes = .; \ 130590d6979SSteven Rostedt (VMware) *(__idle_sched_class) \ 131590d6979SSteven Rostedt (VMware) *(__fair_sched_class) \ 132590d6979SSteven Rostedt (VMware) *(__rt_sched_class) \ 133590d6979SSteven Rostedt (VMware) *(__dl_sched_class) \ 134c3a340f7SSteven Rostedt (VMware) *(__stop_sched_class) \ 135c3a340f7SSteven Rostedt (VMware) __end_sched_classes = .; 136590d6979SSteven Rostedt (VMware) 137eb8f6890SSam Ravnborg /* The actual configuration determine if the init/exit sections 138eb8f6890SSam Ravnborg * are handled as text/data or they can be discarded (which 139eb8f6890SSam Ravnborg * often happens at runtime) 140eb8f6890SSam Ravnborg */ 141eb8f6890SSam Ravnborg #ifdef CONFIG_HOTPLUG_CPU 142eb8f6890SSam Ravnborg #define CPU_KEEP(sec) *(.cpu##sec) 143eb8f6890SSam Ravnborg #define CPU_DISCARD(sec) 144eb8f6890SSam Ravnborg #else 145eb8f6890SSam Ravnborg #define CPU_KEEP(sec) 146eb8f6890SSam Ravnborg #define CPU_DISCARD(sec) *(.cpu##sec) 147eb8f6890SSam Ravnborg #endif 148eb8f6890SSam Ravnborg 1491a3fb6d4SAdrian Bunk #if defined(CONFIG_MEMORY_HOTPLUG) 150eb8f6890SSam Ravnborg #define MEM_KEEP(sec) *(.mem##sec) 151eb8f6890SSam Ravnborg #define MEM_DISCARD(sec) 152eb8f6890SSam Ravnborg #else 153eb8f6890SSam Ravnborg #define MEM_KEEP(sec) 154eb8f6890SSam Ravnborg #define MEM_DISCARD(sec) *(.mem##sec) 155eb8f6890SSam Ravnborg #endif 156eb8f6890SSam Ravnborg 1578da3821bSSteven Rostedt #ifdef CONFIG_FTRACE_MCOUNT_RECORD 158a1326b17SMark Rutland /* 159a1326b17SMark Rutland * The ftrace call sites are logged to a section whose name depends on the 160a1326b17SMark Rutland * compiler option used. A given kernel image will only use one, AKA 161a1326b17SMark Rutland * FTRACE_CALLSITE_SECTION. We capture all of them here to avoid header 162a1326b17SMark Rutland * dependencies for FTRACE_CALLSITE_SECTION's definition. 16395f1fa9eSLinus Torvalds * 16446f94692SSteven Rostedt (VMware) * Need to also make ftrace_stub_graph point to ftrace_stub 165b83b43ffSSteven Rostedt (VMware) * so that the same stub location may have different protocols 166b83b43ffSSteven Rostedt (VMware) * and not mess up with C verifiers. 167a1326b17SMark Rutland */ 1684b3b4c5eSJohn Reiser #define MCOUNT_REC() . = ALIGN(8); \ 169a6214385SMasahiro Yamada __start_mcount_loc = .; \ 170266ff2a8SNicholas Piggin KEEP(*(__mcount_loc)) \ 171a1326b17SMark Rutland KEEP(*(__patchable_function_entries)) \ 172b83b43ffSSteven Rostedt (VMware) __stop_mcount_loc = .; \ 17346f94692SSteven Rostedt (VMware) ftrace_stub_graph = ftrace_stub; 1748da3821bSSteven Rostedt #else 175b83b43ffSSteven Rostedt (VMware) # ifdef CONFIG_FUNCTION_TRACER 17646f94692SSteven Rostedt (VMware) # define MCOUNT_REC() ftrace_stub_graph = ftrace_stub; 1778da3821bSSteven Rostedt # else 1788da3821bSSteven Rostedt # define MCOUNT_REC() 1798da3821bSSteven Rostedt # endif 180b83b43ffSSteven Rostedt (VMware) #endif 181eb8f6890SSam Ravnborg 1822ed84eebSSteven Rostedt #ifdef CONFIG_TRACE_BRANCH_PROFILING 183a6214385SMasahiro Yamada #define LIKELY_PROFILE() __start_annotated_branch_profile = .; \ 184266ff2a8SNicholas Piggin KEEP(*(_ftrace_annotated_branch)) \ 185a6214385SMasahiro Yamada __stop_annotated_branch_profile = .; 1861f0d69a9SSteven Rostedt #else 1871f0d69a9SSteven Rostedt #define LIKELY_PROFILE() 1881f0d69a9SSteven Rostedt #endif 1891f0d69a9SSteven Rostedt 1902bcd521aSSteven Rostedt #ifdef CONFIG_PROFILE_ALL_BRANCHES 191a6214385SMasahiro Yamada #define BRANCH_PROFILE() __start_branch_profile = .; \ 192266ff2a8SNicholas Piggin KEEP(*(_ftrace_branch)) \ 193a6214385SMasahiro Yamada __stop_branch_profile = .; 1942bcd521aSSteven Rostedt #else 1952bcd521aSSteven Rostedt #define BRANCH_PROFILE() 1962bcd521aSSteven Rostedt #endif 1972bcd521aSSteven Rostedt 198376e2424SMasami Hiramatsu #ifdef CONFIG_KPROBES 19969902c71SVineet Gupta #define KPROBE_BLACKLIST() . = ALIGN(8); \ 200a6214385SMasahiro Yamada __start_kprobe_blacklist = .; \ 2014b89b7f7SNicholas Piggin KEEP(*(_kprobe_blacklist)) \ 202a6214385SMasahiro Yamada __stop_kprobe_blacklist = .; 203376e2424SMasami Hiramatsu #else 204376e2424SMasami Hiramatsu #define KPROBE_BLACKLIST() 205376e2424SMasami Hiramatsu #endif 206376e2424SMasami Hiramatsu 207540adea3SMasami Hiramatsu #ifdef CONFIG_FUNCTION_ERROR_INJECTION 208663faf9fSMasami Hiramatsu #define ERROR_INJECT_WHITELIST() STRUCT_ALIGN(); \ 209a6214385SMasahiro Yamada __start_error_injection_whitelist = .; \ 210540adea3SMasami Hiramatsu KEEP(*(_error_injection_whitelist)) \ 211a6214385SMasahiro Yamada __stop_error_injection_whitelist = .; 21292ace999SJosef Bacik #else 213540adea3SMasami Hiramatsu #define ERROR_INJECT_WHITELIST() 21492ace999SJosef Bacik #endif 21592ace999SJosef Bacik 2165f77a88bSTom Zanussi #ifdef CONFIG_EVENT_TRACING 217e4a9ea5eSSteven Rostedt #define FTRACE_EVENTS() . = ALIGN(8); \ 218a6214385SMasahiro Yamada __start_ftrace_events = .; \ 2194b89b7f7SNicholas Piggin KEEP(*(_ftrace_events)) \ 220a6214385SMasahiro Yamada __stop_ftrace_events = .; \ 221a6214385SMasahiro Yamada __start_ftrace_eval_maps = .; \ 22202fd7f68SJeremy Linton KEEP(*(_ftrace_eval_map)) \ 223a6214385SMasahiro Yamada __stop_ftrace_eval_maps = .; 224b77e38aaSSteven Rostedt #else 225b77e38aaSSteven Rostedt #define FTRACE_EVENTS() 226b77e38aaSSteven Rostedt #endif 227b77e38aaSSteven Rostedt 2281ba28e02SLai Jiangshan #ifdef CONFIG_TRACING 229a6214385SMasahiro Yamada #define TRACE_PRINTKS() __start___trace_bprintk_fmt = .; \ 2304b89b7f7SNicholas Piggin KEEP(*(__trace_printk_fmt)) /* Trace_printk fmt' pointer */ \ 231a6214385SMasahiro Yamada __stop___trace_bprintk_fmt = .; 232a6214385SMasahiro Yamada #define TRACEPOINT_STR() __start___tracepoint_str = .; \ 2334b89b7f7SNicholas Piggin KEEP(*(__tracepoint_str)) /* Trace_printk fmt' pointer */ \ 234a6214385SMasahiro Yamada __stop___tracepoint_str = .; 2351ba28e02SLai Jiangshan #else 2361ba28e02SLai Jiangshan #define TRACE_PRINTKS() 237102c9323SSteven Rostedt (Red Hat) #define TRACEPOINT_STR() 2381ba28e02SLai Jiangshan #endif 2391ba28e02SLai Jiangshan 240bed1ffcaSFrederic Weisbecker #ifdef CONFIG_FTRACE_SYSCALLS 2413d56e331SSteven Rostedt #define TRACE_SYSCALLS() . = ALIGN(8); \ 242a6214385SMasahiro Yamada __start_syscalls_metadata = .; \ 2434b89b7f7SNicholas Piggin KEEP(*(__syscalls_metadata)) \ 244a6214385SMasahiro Yamada __stop_syscalls_metadata = .; 245bed1ffcaSFrederic Weisbecker #else 246bed1ffcaSFrederic Weisbecker #define TRACE_SYSCALLS() 247bed1ffcaSFrederic Weisbecker #endif 248bed1ffcaSFrederic Weisbecker 249c4f6699dSAlexei Starovoitov #ifdef CONFIG_BPF_EVENTS 250c4f6699dSAlexei Starovoitov #define BPF_RAW_TP() STRUCT_ALIGN(); \ 251a6214385SMasahiro Yamada __start__bpf_raw_tp = .; \ 252c4f6699dSAlexei Starovoitov KEEP(*(__bpf_raw_tp_map)) \ 253a6214385SMasahiro Yamada __stop__bpf_raw_tp = .; 254c4f6699dSAlexei Starovoitov #else 255c4f6699dSAlexei Starovoitov #define BPF_RAW_TP() 256c4f6699dSAlexei Starovoitov #endif 257c4f6699dSAlexei Starovoitov 258470ca0deSPeter Hurley #ifdef CONFIG_SERIAL_EARLYCON 259dd709e72SDaniel Kurtz #define EARLYCON_TABLE() . = ALIGN(8); \ 260a6214385SMasahiro Yamada __earlycon_table = .; \ 2614b89b7f7SNicholas Piggin KEEP(*(__earlycon_table)) \ 262a6214385SMasahiro Yamada __earlycon_table_end = .; 263470ca0deSPeter Hurley #else 264470ca0deSPeter Hurley #define EARLYCON_TABLE() 265470ca0deSPeter Hurley #endif 266aab94339SDirk Brandewie 2673ac946d1SKees Cook #ifdef CONFIG_SECURITY 2683ac946d1SKees Cook #define LSM_TABLE() . = ALIGN(8); \ 2693ac946d1SKees Cook __start_lsm_info = .; \ 2703ac946d1SKees Cook KEEP(*(.lsm_info.init)) \ 2713ac946d1SKees Cook __end_lsm_info = .; 272e6b1db98SMatthew Garrett #define EARLY_LSM_TABLE() . = ALIGN(8); \ 273e6b1db98SMatthew Garrett __start_early_lsm_info = .; \ 274e6b1db98SMatthew Garrett KEEP(*(.early_lsm_info.init)) \ 275e6b1db98SMatthew Garrett __end_early_lsm_info = .; 2763ac946d1SKees Cook #else 2773ac946d1SKees Cook #define LSM_TABLE() 278e6b1db98SMatthew Garrett #define EARLY_LSM_TABLE() 2793ac946d1SKees Cook #endif 2803ac946d1SKees Cook 28106309288SRob Herring #define ___OF_TABLE(cfg, name) _OF_TABLE_##cfg(name) 28206309288SRob Herring #define __OF_TABLE(cfg, name) ___OF_TABLE(cfg, name) 2835ee02af1SMasahiro Yamada #define OF_TABLE(cfg, name) __OF_TABLE(IS_ENABLED(cfg), name) 28406309288SRob Herring #define _OF_TABLE_0(name) 28506309288SRob Herring #define _OF_TABLE_1(name) \ 286f6e916b8SThomas Petazzoni . = ALIGN(8); \ 287a6214385SMasahiro Yamada __##name##_of_table = .; \ 2884b89b7f7SNicholas Piggin KEEP(*(__##name##_of_table)) \ 2894b89b7f7SNicholas Piggin KEEP(*(__##name##_of_table_end)) 290aab94339SDirk Brandewie 291bb0eb050SDaniel Lezcano #define TIMER_OF_TABLES() OF_TABLE(CONFIG_TIMER_OF, timer) 29206309288SRob Herring #define IRQCHIP_OF_MATCH_TABLE() OF_TABLE(CONFIG_IRQCHIP, irqchip) 29306309288SRob Herring #define CLK_OF_TABLES() OF_TABLE(CONFIG_COMMON_CLK, clk) 29406309288SRob Herring #define RESERVEDMEM_OF_TABLES() OF_TABLE(CONFIG_OF_RESERVED_MEM, reservedmem) 29506309288SRob Herring #define CPU_METHOD_OF_TABLES() OF_TABLE(CONFIG_SMP, cpu_method) 296449e056cSDaniel Lezcano #define CPUIDLE_METHOD_OF_TABLES() OF_TABLE(CONFIG_CPU_IDLE, cpuidle_method) 2976c3ff8b1SStephen Boyd 298e647b532SMarc Zyngier #ifdef CONFIG_ACPI 299e647b532SMarc Zyngier #define ACPI_PROBE_TABLE(name) \ 300e647b532SMarc Zyngier . = ALIGN(8); \ 301a6214385SMasahiro Yamada __##name##_acpi_probe_table = .; \ 3024b89b7f7SNicholas Piggin KEEP(*(__##name##_acpi_probe_table)) \ 303a6214385SMasahiro Yamada __##name##_acpi_probe_table_end = .; 304e647b532SMarc Zyngier #else 305e647b532SMarc Zyngier #define ACPI_PROBE_TABLE(name) 306e647b532SMarc Zyngier #endif 307e647b532SMarc Zyngier 308980af75eSDaniel Lezcano #ifdef CONFIG_THERMAL 309980af75eSDaniel Lezcano #define THERMAL_TABLE(name) \ 310980af75eSDaniel Lezcano . = ALIGN(8); \ 311980af75eSDaniel Lezcano __##name##_thermal_table = .; \ 312980af75eSDaniel Lezcano KEEP(*(__##name##_thermal_table)) \ 313980af75eSDaniel Lezcano __##name##_thermal_table_end = .; 314980af75eSDaniel Lezcano #else 315980af75eSDaniel Lezcano #define THERMAL_TABLE(name) 316980af75eSDaniel Lezcano #endif 317980af75eSDaniel Lezcano 318aab94339SDirk Brandewie #define KERNEL_DTB() \ 319aab94339SDirk Brandewie STRUCT_ALIGN(); \ 320a6214385SMasahiro Yamada __dtb_start = .; \ 3214b89b7f7SNicholas Piggin KEEP(*(.dtb.init.rodata)) \ 322a6214385SMasahiro Yamada __dtb_end = .; 323aab94339SDirk Brandewie 324b67067f1SNicholas Piggin /* 325b67067f1SNicholas Piggin * .data section 326b67067f1SNicholas Piggin */ 327ca967258SSam Ravnborg #define DATA_DATA \ 328129f6c48SArnd Bergmann *(.xiptext) \ 329cb87481eSNicholas Piggin *(DATA_MAIN) \ 330312b1485SSam Ravnborg *(.ref.data) \ 331d356c0b6SMike Frysinger *(.data..shared_aligned) /* percpu related */ \ 332266ff2a8SNicholas Piggin MEM_KEEP(init.data*) \ 333266ff2a8SNicholas Piggin MEM_KEEP(exit.data*) \ 3347ccaba53SJan Beulich *(.data.unlikely) \ 335a6214385SMasahiro Yamada __start_once = .; \ 336b1fca27dSAndi Kleen *(.data.once) \ 337a6214385SMasahiro Yamada __end_once = .; \ 33865498646SMathieu Desnoyers STRUCT_ALIGN(); \ 33997e1c18eSMathieu Desnoyers *(__tracepoints) \ 340e9d376f0SJason Baron /* implement dynamic printk debug */ \ 341e9d376f0SJason Baron . = ALIGN(8); \ 342e5ebffe1SJim Cromie __start___dyndbg = .; \ 343e5ebffe1SJim Cromie KEEP(*(__dyndbg)) \ 344e5ebffe1SJim Cromie __stop___dyndbg = .; \ 3452bcd521aSSteven Rostedt LIKELY_PROFILE() \ 346b77e38aaSSteven Rostedt BRANCH_PROFILE() \ 347102c9323SSteven Rostedt (Red Hat) TRACE_PRINTKS() \ 348c4f6699dSAlexei Starovoitov BPF_RAW_TP() \ 349102c9323SSteven Rostedt (Red Hat) TRACEPOINT_STR() 350ca967258SSam Ravnborg 351ef53dae8SSam Ravnborg /* 352ef53dae8SSam Ravnborg * Data section helpers 353ef53dae8SSam Ravnborg */ 354ef53dae8SSam Ravnborg #define NOSAVE_DATA \ 355ef53dae8SSam Ravnborg . = ALIGN(PAGE_SIZE); \ 356a6214385SMasahiro Yamada __nosave_begin = .; \ 35707b3bb1eSDenys Vlasenko *(.data..nosave) \ 358ef53dae8SSam Ravnborg . = ALIGN(PAGE_SIZE); \ 359a6214385SMasahiro Yamada __nosave_end = .; 360ef53dae8SSam Ravnborg 361ef53dae8SSam Ravnborg #define PAGE_ALIGNED_DATA(page_align) \ 362ef53dae8SSam Ravnborg . = ALIGN(page_align); \ 363de2b41beSJoerg Roedel *(.data..page_aligned) \ 364de2b41beSJoerg Roedel . = ALIGN(page_align); 365ef53dae8SSam Ravnborg 366ef53dae8SSam Ravnborg #define READ_MOSTLY_DATA(align) \ 367ef53dae8SSam Ravnborg . = ALIGN(align); \ 3688369744fSShaohua Li *(.data..read_mostly) \ 3698369744fSShaohua Li . = ALIGN(align); 370ef53dae8SSam Ravnborg 371ef53dae8SSam Ravnborg #define CACHELINE_ALIGNED_DATA(align) \ 372ef53dae8SSam Ravnborg . = ALIGN(align); \ 3734af57b78STim Abbott *(.data..cacheline_aligned) 374ef53dae8SSam Ravnborg 37539a449d9STim Abbott #define INIT_TASK_DATA(align) \ 376ef53dae8SSam Ravnborg . = ALIGN(align); \ 377a6214385SMasahiro Yamada __start_init_task = .; \ 378a6214385SMasahiro Yamada init_thread_union = .; \ 379a6214385SMasahiro Yamada init_stack = .; \ 380266ff2a8SNicholas Piggin KEEP(*(.data..init_task)) \ 381266ff2a8SNicholas Piggin KEEP(*(.data..init_thread_info)) \ 382a6214385SMasahiro Yamada . = __start_init_task + THREAD_SIZE; \ 383a6214385SMasahiro Yamada __end_init_task = .; 384ef53dae8SSam Ravnborg 385e872267bSArd Biesheuvel #define JUMP_TABLE_DATA \ 386e872267bSArd Biesheuvel . = ALIGN(8); \ 387e872267bSArd Biesheuvel __start___jump_table = .; \ 388e872267bSArd Biesheuvel KEEP(*(__jump_table)) \ 389e872267bSArd Biesheuvel __stop___jump_table = .; 390e872267bSArd Biesheuvel 391ef53dae8SSam Ravnborg /* 39232fb2fc5SHeiko Carstens * Allow architectures to handle ro_after_init data on their 39332fb2fc5SHeiko Carstens * own by defining an empty RO_AFTER_INIT_DATA. 39432fb2fc5SHeiko Carstens */ 39532fb2fc5SHeiko Carstens #ifndef RO_AFTER_INIT_DATA 396d7c19b06SJakub Kicinski #define RO_AFTER_INIT_DATA \ 3977f897acbSRomain Naour . = ALIGN(8); \ 398a6214385SMasahiro Yamada __start_ro_after_init = .; \ 399d7c19b06SJakub Kicinski *(.data..ro_after_init) \ 400e872267bSArd Biesheuvel JUMP_TABLE_DATA \ 401a6214385SMasahiro Yamada __end_ro_after_init = .; 40232fb2fc5SHeiko Carstens #endif 40332fb2fc5SHeiko Carstens 40432fb2fc5SHeiko Carstens /* 405ef53dae8SSam Ravnborg * Read only Data 406ef53dae8SSam Ravnborg */ 40793240b32SKees Cook #define RO_DATA(align) \ 4084096b46fSSam Ravnborg . = ALIGN((align)); \ 4091da177e4SLinus Torvalds .rodata : AT(ADDR(.rodata) - LOAD_OFFSET) { \ 410a6214385SMasahiro Yamada __start_rodata = .; \ 4111da177e4SLinus Torvalds *(.rodata) *(.rodata.*) \ 412590d6979SSteven Rostedt (VMware) SCHED_DATA \ 41332fb2fc5SHeiko Carstens RO_AFTER_INIT_DATA /* Read only after init */ \ 41465498646SMathieu Desnoyers . = ALIGN(8); \ 415a6214385SMasahiro Yamada __start___tracepoints_ptrs = .; \ 4164b89b7f7SNicholas Piggin KEEP(*(__tracepoints_ptrs)) /* Tracepoints: pointer array */ \ 417a6214385SMasahiro Yamada __stop___tracepoints_ptrs = .; \ 41897e1c18eSMathieu Desnoyers *(__tracepoints_strings)/* Tracepoints: strings */ \ 4191da177e4SLinus Torvalds } \ 4201da177e4SLinus Torvalds \ 4211da177e4SLinus Torvalds .rodata1 : AT(ADDR(.rodata1) - LOAD_OFFSET) { \ 4221da177e4SLinus Torvalds *(.rodata1) \ 4231da177e4SLinus Torvalds } \ 4241da177e4SLinus Torvalds \ 4251da177e4SLinus Torvalds /* PCI quirks */ \ 4261da177e4SLinus Torvalds .pci_fixup : AT(ADDR(.pci_fixup) - LOAD_OFFSET) { \ 427a6214385SMasahiro Yamada __start_pci_fixups_early = .; \ 4284b89b7f7SNicholas Piggin KEEP(*(.pci_fixup_early)) \ 429a6214385SMasahiro Yamada __end_pci_fixups_early = .; \ 430a6214385SMasahiro Yamada __start_pci_fixups_header = .; \ 4314b89b7f7SNicholas Piggin KEEP(*(.pci_fixup_header)) \ 432a6214385SMasahiro Yamada __end_pci_fixups_header = .; \ 433a6214385SMasahiro Yamada __start_pci_fixups_final = .; \ 4344b89b7f7SNicholas Piggin KEEP(*(.pci_fixup_final)) \ 435a6214385SMasahiro Yamada __end_pci_fixups_final = .; \ 436a6214385SMasahiro Yamada __start_pci_fixups_enable = .; \ 4374b89b7f7SNicholas Piggin KEEP(*(.pci_fixup_enable)) \ 438a6214385SMasahiro Yamada __end_pci_fixups_enable = .; \ 439a6214385SMasahiro Yamada __start_pci_fixups_resume = .; \ 4404b89b7f7SNicholas Piggin KEEP(*(.pci_fixup_resume)) \ 441a6214385SMasahiro Yamada __end_pci_fixups_resume = .; \ 442a6214385SMasahiro Yamada __start_pci_fixups_resume_early = .; \ 4434b89b7f7SNicholas Piggin KEEP(*(.pci_fixup_resume_early)) \ 444a6214385SMasahiro Yamada __end_pci_fixups_resume_early = .; \ 445a6214385SMasahiro Yamada __start_pci_fixups_suspend = .; \ 4464b89b7f7SNicholas Piggin KEEP(*(.pci_fixup_suspend)) \ 447a6214385SMasahiro Yamada __end_pci_fixups_suspend = .; \ 448a6214385SMasahiro Yamada __start_pci_fixups_suspend_late = .; \ 4494b89b7f7SNicholas Piggin KEEP(*(.pci_fixup_suspend_late)) \ 450a6214385SMasahiro Yamada __end_pci_fixups_suspend_late = .; \ 4511da177e4SLinus Torvalds } \ 4521da177e4SLinus Torvalds \ 4535658c769SDavid Woodhouse /* Built-in firmware blobs */ \ 4545658c769SDavid Woodhouse .builtin_fw : AT(ADDR(.builtin_fw) - LOAD_OFFSET) { \ 455a6214385SMasahiro Yamada __start_builtin_fw = .; \ 4564b89b7f7SNicholas Piggin KEEP(*(.builtin_fw)) \ 457a6214385SMasahiro Yamada __end_builtin_fw = .; \ 4585658c769SDavid Woodhouse } \ 4595658c769SDavid Woodhouse \ 46063687a52SJan Beulich TRACEDATA \ 46163687a52SJan Beulich \ 4621da177e4SLinus Torvalds /* Kernel symbol table: Normal symbols */ \ 4631da177e4SLinus Torvalds __ksymtab : AT(ADDR(__ksymtab) - LOAD_OFFSET) { \ 464a6214385SMasahiro Yamada __start___ksymtab = .; \ 465b67067f1SNicholas Piggin KEEP(*(SORT(___ksymtab+*))) \ 466a6214385SMasahiro Yamada __stop___ksymtab = .; \ 4671da177e4SLinus Torvalds } \ 4681da177e4SLinus Torvalds \ 4691da177e4SLinus Torvalds /* Kernel symbol table: GPL-only symbols */ \ 4701da177e4SLinus Torvalds __ksymtab_gpl : AT(ADDR(__ksymtab_gpl) - LOAD_OFFSET) { \ 471a6214385SMasahiro Yamada __start___ksymtab_gpl = .; \ 472b67067f1SNicholas Piggin KEEP(*(SORT(___ksymtab_gpl+*))) \ 473a6214385SMasahiro Yamada __stop___ksymtab_gpl = .; \ 4741da177e4SLinus Torvalds } \ 4751da177e4SLinus Torvalds \ 476f71d20e9SArjan van de Ven /* Kernel symbol table: Normal unused symbols */ \ 477f71d20e9SArjan van de Ven __ksymtab_unused : AT(ADDR(__ksymtab_unused) - LOAD_OFFSET) { \ 478a6214385SMasahiro Yamada __start___ksymtab_unused = .; \ 479b67067f1SNicholas Piggin KEEP(*(SORT(___ksymtab_unused+*))) \ 480a6214385SMasahiro Yamada __stop___ksymtab_unused = .; \ 481f71d20e9SArjan van de Ven } \ 482f71d20e9SArjan van de Ven \ 483f71d20e9SArjan van de Ven /* Kernel symbol table: GPL-only unused symbols */ \ 484f71d20e9SArjan van de Ven __ksymtab_unused_gpl : AT(ADDR(__ksymtab_unused_gpl) - LOAD_OFFSET) { \ 485a6214385SMasahiro Yamada __start___ksymtab_unused_gpl = .; \ 486b67067f1SNicholas Piggin KEEP(*(SORT(___ksymtab_unused_gpl+*))) \ 487a6214385SMasahiro Yamada __stop___ksymtab_unused_gpl = .; \ 488f71d20e9SArjan van de Ven } \ 489f71d20e9SArjan van de Ven \ 4909f28bb7eSGreg Kroah-Hartman /* Kernel symbol table: GPL-future-only symbols */ \ 4919f28bb7eSGreg Kroah-Hartman __ksymtab_gpl_future : AT(ADDR(__ksymtab_gpl_future) - LOAD_OFFSET) { \ 492a6214385SMasahiro Yamada __start___ksymtab_gpl_future = .; \ 493b67067f1SNicholas Piggin KEEP(*(SORT(___ksymtab_gpl_future+*))) \ 494a6214385SMasahiro Yamada __stop___ksymtab_gpl_future = .; \ 4959f28bb7eSGreg Kroah-Hartman } \ 4969f28bb7eSGreg Kroah-Hartman \ 4971da177e4SLinus Torvalds /* Kernel symbol table: Normal symbols */ \ 4981da177e4SLinus Torvalds __kcrctab : AT(ADDR(__kcrctab) - LOAD_OFFSET) { \ 499a6214385SMasahiro Yamada __start___kcrctab = .; \ 500b67067f1SNicholas Piggin KEEP(*(SORT(___kcrctab+*))) \ 501a6214385SMasahiro Yamada __stop___kcrctab = .; \ 5021da177e4SLinus Torvalds } \ 5031da177e4SLinus Torvalds \ 5041da177e4SLinus Torvalds /* Kernel symbol table: GPL-only symbols */ \ 5051da177e4SLinus Torvalds __kcrctab_gpl : AT(ADDR(__kcrctab_gpl) - LOAD_OFFSET) { \ 506a6214385SMasahiro Yamada __start___kcrctab_gpl = .; \ 507b67067f1SNicholas Piggin KEEP(*(SORT(___kcrctab_gpl+*))) \ 508a6214385SMasahiro Yamada __stop___kcrctab_gpl = .; \ 5091da177e4SLinus Torvalds } \ 5101da177e4SLinus Torvalds \ 511f71d20e9SArjan van de Ven /* Kernel symbol table: Normal unused symbols */ \ 512f71d20e9SArjan van de Ven __kcrctab_unused : AT(ADDR(__kcrctab_unused) - LOAD_OFFSET) { \ 513a6214385SMasahiro Yamada __start___kcrctab_unused = .; \ 514b67067f1SNicholas Piggin KEEP(*(SORT(___kcrctab_unused+*))) \ 515a6214385SMasahiro Yamada __stop___kcrctab_unused = .; \ 516f71d20e9SArjan van de Ven } \ 517f71d20e9SArjan van de Ven \ 518f71d20e9SArjan van de Ven /* Kernel symbol table: GPL-only unused symbols */ \ 519f71d20e9SArjan van de Ven __kcrctab_unused_gpl : AT(ADDR(__kcrctab_unused_gpl) - LOAD_OFFSET) { \ 520a6214385SMasahiro Yamada __start___kcrctab_unused_gpl = .; \ 521b67067f1SNicholas Piggin KEEP(*(SORT(___kcrctab_unused_gpl+*))) \ 522a6214385SMasahiro Yamada __stop___kcrctab_unused_gpl = .; \ 523f71d20e9SArjan van de Ven } \ 524f71d20e9SArjan van de Ven \ 5259f28bb7eSGreg Kroah-Hartman /* Kernel symbol table: GPL-future-only symbols */ \ 5269f28bb7eSGreg Kroah-Hartman __kcrctab_gpl_future : AT(ADDR(__kcrctab_gpl_future) - LOAD_OFFSET) { \ 527a6214385SMasahiro Yamada __start___kcrctab_gpl_future = .; \ 528b67067f1SNicholas Piggin KEEP(*(SORT(___kcrctab_gpl_future+*))) \ 529a6214385SMasahiro Yamada __stop___kcrctab_gpl_future = .; \ 5309f28bb7eSGreg Kroah-Hartman } \ 5319f28bb7eSGreg Kroah-Hartman \ 5321da177e4SLinus Torvalds /* Kernel symbol table: strings */ \ 5331da177e4SLinus Torvalds __ksymtab_strings : AT(ADDR(__ksymtab_strings) - LOAD_OFFSET) { \ 5344b89b7f7SNicholas Piggin *(__ksymtab_strings) \ 5351da177e4SLinus Torvalds } \ 5361da177e4SLinus Torvalds \ 537eb8f6890SSam Ravnborg /* __*init sections */ \ 538eb8f6890SSam Ravnborg __init_rodata : AT(ADDR(__init_rodata) - LOAD_OFFSET) { \ 539312b1485SSam Ravnborg *(.ref.rodata) \ 540eb8f6890SSam Ravnborg MEM_KEEP(init.rodata) \ 541eb8f6890SSam Ravnborg MEM_KEEP(exit.rodata) \ 542eb8f6890SSam Ravnborg } \ 543eb8f6890SSam Ravnborg \ 5441da177e4SLinus Torvalds /* Built-in module parameters. */ \ 5451da177e4SLinus Torvalds __param : AT(ADDR(__param) - LOAD_OFFSET) { \ 546a6214385SMasahiro Yamada __start___param = .; \ 5474b89b7f7SNicholas Piggin KEEP(*(__param)) \ 548a6214385SMasahiro Yamada __stop___param = .; \ 549e94965edSDmitry Torokhov } \ 550e94965edSDmitry Torokhov \ 551e94965edSDmitry Torokhov /* Built-in module versions. */ \ 552e94965edSDmitry Torokhov __modver : AT(ADDR(__modver) - LOAD_OFFSET) { \ 553a6214385SMasahiro Yamada __start___modver = .; \ 5544b89b7f7SNicholas Piggin KEEP(*(__modver)) \ 555a6214385SMasahiro Yamada __stop___modver = .; \ 5567583ddfdSMarcelo Tosatti } \ 557eaf93707SKees Cook \ 558b8c2f776SKees Cook RO_EXCEPTION_TABLE \ 559eaf93707SKees Cook NOTES \ 56090ceddcbSFangrui Song BTF \ 561eaf93707SKees Cook \ 562eaf93707SKees Cook . = ALIGN((align)); \ 563eaf93707SKees Cook __end_rodata = .; 5641da177e4SLinus Torvalds 565cb87481eSNicholas Piggin /* 56665538966SThomas Gleixner * Non-instrumentable text section 56765538966SThomas Gleixner */ 56865538966SThomas Gleixner #define NOINSTR_TEXT \ 56965538966SThomas Gleixner ALIGN_FUNCTION(); \ 57065538966SThomas Gleixner __noinstr_text_start = .; \ 57165538966SThomas Gleixner *(.noinstr.text) \ 57265538966SThomas Gleixner __noinstr_text_end = .; 57365538966SThomas Gleixner 57465538966SThomas Gleixner /* 575cb87481eSNicholas Piggin * .text section. Map to function alignment to avoid address changes 5760f4c4af0SNicholas Piggin * during second ld run in second ld pass when generating System.map 577cb87481eSNicholas Piggin * 578cb87481eSNicholas Piggin * TEXT_MAIN here will match .text.fixup and .text.unlikely if dead 579cb87481eSNicholas Piggin * code elimination is enabled, so these sections should be converted 580cb87481eSNicholas Piggin * to use ".." first. 581cb87481eSNicholas Piggin */ 5827664709bSSam Ravnborg #define TEXT_TEXT \ 5837664709bSSam Ravnborg ALIGN_FUNCTION(); \ 584cb87481eSNicholas Piggin *(.text.hot TEXT_MAIN .text.fixup .text.unlikely) \ 58565538966SThomas Gleixner NOINSTR_TEXT \ 586564c9cc8SKees Cook *(.text..refcount) \ 587312b1485SSam Ravnborg *(.ref.text) \ 588266ff2a8SNicholas Piggin MEM_KEEP(init.text*) \ 589266ff2a8SNicholas Piggin MEM_KEEP(exit.text*) \ 590eb8f6890SSam Ravnborg 5917664709bSSam Ravnborg 5926d30e3a8SSam Ravnborg /* sched.text is aling to function alignment to secure we have same 5936d30e3a8SSam Ravnborg * address even at second ld pass when generating System.map */ 5941da177e4SLinus Torvalds #define SCHED_TEXT \ 5956d30e3a8SSam Ravnborg ALIGN_FUNCTION(); \ 596a6214385SMasahiro Yamada __sched_text_start = .; \ 5971da177e4SLinus Torvalds *(.sched.text) \ 598a6214385SMasahiro Yamada __sched_text_end = .; 5991da177e4SLinus Torvalds 6006d30e3a8SSam Ravnborg /* spinlock.text is aling to function alignment to secure we have same 6016d30e3a8SSam Ravnborg * address even at second ld pass when generating System.map */ 6021da177e4SLinus Torvalds #define LOCK_TEXT \ 6036d30e3a8SSam Ravnborg ALIGN_FUNCTION(); \ 604a6214385SMasahiro Yamada __lock_text_start = .; \ 6051da177e4SLinus Torvalds *(.spinlock.text) \ 606a6214385SMasahiro Yamada __lock_text_end = .; 607d0aaff97SPrasanna S Panchamukhi 6086727ad9eSChris Metcalf #define CPUIDLE_TEXT \ 6096727ad9eSChris Metcalf ALIGN_FUNCTION(); \ 610a6214385SMasahiro Yamada __cpuidle_text_start = .; \ 6116727ad9eSChris Metcalf *(.cpuidle.text) \ 612a6214385SMasahiro Yamada __cpuidle_text_end = .; 6136727ad9eSChris Metcalf 614d0aaff97SPrasanna S Panchamukhi #define KPROBES_TEXT \ 615d0aaff97SPrasanna S Panchamukhi ALIGN_FUNCTION(); \ 616a6214385SMasahiro Yamada __kprobes_text_start = .; \ 617d0aaff97SPrasanna S Panchamukhi *(.kprobes.text) \ 618a6214385SMasahiro Yamada __kprobes_text_end = .; 619a7d0c210SPaolo 'Blaisorblade' Giarrusso 620ea714547SJiri Olsa #define ENTRY_TEXT \ 621ea714547SJiri Olsa ALIGN_FUNCTION(); \ 622a6214385SMasahiro Yamada __entry_text_start = .; \ 623ea714547SJiri Olsa *(.entry.text) \ 624a6214385SMasahiro Yamada __entry_text_end = .; 625ea714547SJiri Olsa 626a0343e82SFrederic Weisbecker #define IRQENTRY_TEXT \ 627a0343e82SFrederic Weisbecker ALIGN_FUNCTION(); \ 628a6214385SMasahiro Yamada __irqentry_text_start = .; \ 629a0343e82SFrederic Weisbecker *(.irqentry.text) \ 630a6214385SMasahiro Yamada __irqentry_text_end = .; 631a0343e82SFrederic Weisbecker 632be7635e7SAlexander Potapenko #define SOFTIRQENTRY_TEXT \ 633be7635e7SAlexander Potapenko ALIGN_FUNCTION(); \ 634a6214385SMasahiro Yamada __softirqentry_text_start = .; \ 635be7635e7SAlexander Potapenko *(.softirqentry.text) \ 636a6214385SMasahiro Yamada __softirqentry_text_end = .; 637be7635e7SAlexander Potapenko 63837c514e3SSam Ravnborg /* Section used for early init (in .S files) */ 639266ff2a8SNicholas Piggin #define HEAD_TEXT KEEP(*(.head.text)) 64037c514e3SSam Ravnborg 6417923f90fSSam Ravnborg #define HEAD_TEXT_SECTION \ 642ef53dae8SSam Ravnborg .head.text : AT(ADDR(.head.text) - LOAD_OFFSET) { \ 643ef53dae8SSam Ravnborg HEAD_TEXT \ 644ef53dae8SSam Ravnborg } 645ef53dae8SSam Ravnborg 646ef53dae8SSam Ravnborg /* 647ef53dae8SSam Ravnborg * Exception table 648ef53dae8SSam Ravnborg */ 649ef53dae8SSam Ravnborg #define EXCEPTION_TABLE(align) \ 650ef53dae8SSam Ravnborg . = ALIGN(align); \ 651ef53dae8SSam Ravnborg __ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) { \ 652a6214385SMasahiro Yamada __start___ex_table = .; \ 6534b89b7f7SNicholas Piggin KEEP(*(__ex_table)) \ 654a6214385SMasahiro Yamada __stop___ex_table = .; \ 655ef53dae8SSam Ravnborg } 656ef53dae8SSam Ravnborg 657ef53dae8SSam Ravnborg /* 65890ceddcbSFangrui Song * .BTF 65990ceddcbSFangrui Song */ 66090ceddcbSFangrui Song #ifdef CONFIG_DEBUG_INFO_BTF 66190ceddcbSFangrui Song #define BTF \ 66290ceddcbSFangrui Song .BTF : AT(ADDR(.BTF) - LOAD_OFFSET) { \ 66390ceddcbSFangrui Song __start_BTF = .; \ 664*65c20439STony Ambardar KEEP(*(.BTF)) \ 66590ceddcbSFangrui Song __stop_BTF = .; \ 6665a2798abSJiri Olsa } \ 6675a2798abSJiri Olsa . = ALIGN(4); \ 6685a2798abSJiri Olsa .BTF_ids : AT(ADDR(.BTF_ids) - LOAD_OFFSET) { \ 6695a2798abSJiri Olsa *(.BTF_ids) \ 67090ceddcbSFangrui Song } 67190ceddcbSFangrui Song #else 67290ceddcbSFangrui Song #define BTF 67390ceddcbSFangrui Song #endif 67490ceddcbSFangrui Song 67590ceddcbSFangrui Song /* 676ef53dae8SSam Ravnborg * Init task 677ef53dae8SSam Ravnborg */ 67839a449d9STim Abbott #define INIT_TASK_DATA_SECTION(align) \ 679ef53dae8SSam Ravnborg . = ALIGN(align); \ 680da5e37efSSam Ravnborg .data..init_task : AT(ADDR(.data..init_task) - LOAD_OFFSET) { \ 68139a449d9STim Abbott INIT_TASK_DATA(align) \ 682ef53dae8SSam Ravnborg } 683eb8f6890SSam Ravnborg 684b99b87f7SPeter Oberparleiter #ifdef CONFIG_CONSTRUCTORS 6852a2325e6SHeiko Carstens #define KERNEL_CTORS() . = ALIGN(8); \ 686a6214385SMasahiro Yamada __ctors_start = .; \ 6874b89b7f7SNicholas Piggin KEEP(*(.ctors)) \ 6884b89b7f7SNicholas Piggin KEEP(*(SORT(.init_array.*))) \ 6894b89b7f7SNicholas Piggin KEEP(*(.init_array)) \ 690a6214385SMasahiro Yamada __ctors_end = .; 691b99b87f7SPeter Oberparleiter #else 692b99b87f7SPeter Oberparleiter #define KERNEL_CTORS() 693b99b87f7SPeter Oberparleiter #endif 694b99b87f7SPeter Oberparleiter 69501ba2bdcSSam Ravnborg /* init and exit section handling */ 696eb8f6890SSam Ravnborg #define INIT_DATA \ 697b67067f1SNicholas Piggin KEEP(*(SORT(___kentry+*))) \ 698266ff2a8SNicholas Piggin *(.init.data init.data.*) \ 699266ff2a8SNicholas Piggin MEM_DISCARD(init.data*) \ 700b99b87f7SPeter Oberparleiter KERNEL_CTORS() \ 7014b3b4c5eSJohn Reiser MCOUNT_REC() \ 702266ff2a8SNicholas Piggin *(.init.rodata .init.rodata.*) \ 703e4a9ea5eSSteven Rostedt FTRACE_EVENTS() \ 7043d56e331SSteven Rostedt TRACE_SYSCALLS() \ 705376e2424SMasami Hiramatsu KPROBE_BLACKLIST() \ 706540adea3SMasami Hiramatsu ERROR_INJECT_WHITELIST() \ 707aab94339SDirk Brandewie MEM_DISCARD(init.rodata) \ 708f2f6c255SPrashant Gaikwad CLK_OF_TABLES() \ 709f618c470SMarek Szyprowski RESERVEDMEM_OF_TABLES() \ 7102fcc112aSDaniel Lezcano TIMER_OF_TABLES() \ 7116c3ff8b1SStephen Boyd CPU_METHOD_OF_TABLES() \ 712449e056cSDaniel Lezcano CPUIDLE_METHOD_OF_TABLES() \ 713f6e916b8SThomas Petazzoni KERNEL_DTB() \ 714b0b6abd3SRob Herring IRQCHIP_OF_MATCH_TABLE() \ 71546e589a3SMarc Zyngier ACPI_PROBE_TABLE(irqchip) \ 7162fcc112aSDaniel Lezcano ACPI_PROBE_TABLE(timer) \ 717980af75eSDaniel Lezcano THERMAL_TABLE(governor) \ 7183ac946d1SKees Cook EARLYCON_TABLE() \ 719e6b1db98SMatthew Garrett LSM_TABLE() \ 720e6b1db98SMatthew Garrett EARLY_LSM_TABLE() 72101ba2bdcSSam Ravnborg 722eb8f6890SSam Ravnborg #define INIT_TEXT \ 723266ff2a8SNicholas Piggin *(.init.text .init.text.*) \ 724e41f501dSDmitry Vyukov *(.text.startup) \ 725266ff2a8SNicholas Piggin MEM_DISCARD(init.text*) 726eb8f6890SSam Ravnborg 727eb8f6890SSam Ravnborg #define EXIT_DATA \ 728266ff2a8SNicholas Piggin *(.exit.data .exit.data.*) \ 7298dcf86caSPeter Oberparleiter *(.fini_array .fini_array.*) \ 7308dcf86caSPeter Oberparleiter *(.dtors .dtors.*) \ 731266ff2a8SNicholas Piggin MEM_DISCARD(exit.data*) \ 732266ff2a8SNicholas Piggin MEM_DISCARD(exit.rodata*) 733eb8f6890SSam Ravnborg 734eb8f6890SSam Ravnborg #define EXIT_TEXT \ 735eb8f6890SSam Ravnborg *(.exit.text) \ 736e41f501dSDmitry Vyukov *(.text.exit) \ 737eb8f6890SSam Ravnborg MEM_DISCARD(exit.text) 73801ba2bdcSSam Ravnborg 7397923f90fSSam Ravnborg #define EXIT_CALL \ 7407923f90fSSam Ravnborg *(.exitcall.exit) 7417923f90fSSam Ravnborg 742ef53dae8SSam Ravnborg /* 743ef53dae8SSam Ravnborg * bss (Block Started by Symbol) - uninitialized data 744ef53dae8SSam Ravnborg * zeroed during startup 745ef53dae8SSam Ravnborg */ 74604e448d9STim Abbott #define SBSS(sbss_align) \ 74704e448d9STim Abbott . = ALIGN(sbss_align); \ 748ef53dae8SSam Ravnborg .sbss : AT(ADDR(.sbss) - LOAD_OFFSET) { \ 74983a092cfSNicholas Piggin *(.dynsbss) \ 750266ff2a8SNicholas Piggin *(SBSS_MAIN) \ 751ef53dae8SSam Ravnborg *(.scommon) \ 752ef53dae8SSam Ravnborg } 753ef53dae8SSam Ravnborg 754c87728caSDavid Daney /* 755c87728caSDavid Daney * Allow archectures to redefine BSS_FIRST_SECTIONS to add extra 756c87728caSDavid Daney * sections to the front of bss. 757c87728caSDavid Daney */ 758c87728caSDavid Daney #ifndef BSS_FIRST_SECTIONS 759c87728caSDavid Daney #define BSS_FIRST_SECTIONS 760c87728caSDavid Daney #endif 761c87728caSDavid Daney 762ef53dae8SSam Ravnborg #define BSS(bss_align) \ 763ef53dae8SSam Ravnborg . = ALIGN(bss_align); \ 764ef53dae8SSam Ravnborg .bss : AT(ADDR(.bss) - LOAD_OFFSET) { \ 765c87728caSDavid Daney BSS_FIRST_SECTIONS \ 766de2b41beSJoerg Roedel . = ALIGN(PAGE_SIZE); \ 7677c74df07STim Abbott *(.bss..page_aligned) \ 768de2b41beSJoerg Roedel . = ALIGN(PAGE_SIZE); \ 769ef53dae8SSam Ravnborg *(.dynbss) \ 770cb87481eSNicholas Piggin *(BSS_MAIN) \ 771ef53dae8SSam Ravnborg *(COMMON) \ 772ef53dae8SSam Ravnborg } 773ef53dae8SSam Ravnborg 774ef53dae8SSam Ravnborg /* 775ef53dae8SSam Ravnborg * DWARF debug sections. 776ef53dae8SSam Ravnborg * Symbols in the DWARF debugging sections are relative to 777ef53dae8SSam Ravnborg * the beginning of the section so we begin them at 0. 778ef53dae8SSam Ravnborg */ 779a7d0c210SPaolo 'Blaisorblade' Giarrusso #define DWARF_DEBUG \ 780a7d0c210SPaolo 'Blaisorblade' Giarrusso /* DWARF 1 */ \ 781a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug 0 : { *(.debug) } \ 782a7d0c210SPaolo 'Blaisorblade' Giarrusso .line 0 : { *(.line) } \ 783a7d0c210SPaolo 'Blaisorblade' Giarrusso /* GNU DWARF 1 extensions */ \ 784a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_srcinfo 0 : { *(.debug_srcinfo) } \ 785a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_sfnames 0 : { *(.debug_sfnames) } \ 786a7d0c210SPaolo 'Blaisorblade' Giarrusso /* DWARF 1.1 and DWARF 2 */ \ 787a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_aranges 0 : { *(.debug_aranges) } \ 788a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_pubnames 0 : { *(.debug_pubnames) } \ 789a7d0c210SPaolo 'Blaisorblade' Giarrusso /* DWARF 2 */ \ 790a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_info 0 : { *(.debug_info \ 791a7d0c210SPaolo 'Blaisorblade' Giarrusso .gnu.linkonce.wi.*) } \ 792a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_abbrev 0 : { *(.debug_abbrev) } \ 793a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_line 0 : { *(.debug_line) } \ 794a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_frame 0 : { *(.debug_frame) } \ 795a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_str 0 : { *(.debug_str) } \ 796a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_loc 0 : { *(.debug_loc) } \ 797a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_macinfo 0 : { *(.debug_macinfo) } \ 79883a092cfSNicholas Piggin .debug_pubtypes 0 : { *(.debug_pubtypes) } \ 79983a092cfSNicholas Piggin /* DWARF 3 */ \ 80083a092cfSNicholas Piggin .debug_ranges 0 : { *(.debug_ranges) } \ 801a7d0c210SPaolo 'Blaisorblade' Giarrusso /* SGI/MIPS DWARF 2 extensions */ \ 802a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_weaknames 0 : { *(.debug_weaknames) } \ 803a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_funcnames 0 : { *(.debug_funcnames) } \ 804a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_typenames 0 : { *(.debug_typenames) } \ 805a7d0c210SPaolo 'Blaisorblade' Giarrusso .debug_varnames 0 : { *(.debug_varnames) } \ 80683a092cfSNicholas Piggin /* GNU DWARF 2 extensions */ \ 80783a092cfSNicholas Piggin .debug_gnu_pubnames 0 : { *(.debug_gnu_pubnames) } \ 80883a092cfSNicholas Piggin .debug_gnu_pubtypes 0 : { *(.debug_gnu_pubtypes) } \ 80983a092cfSNicholas Piggin /* DWARF 4 */ \ 81083a092cfSNicholas Piggin .debug_types 0 : { *(.debug_types) } \ 81183a092cfSNicholas Piggin /* DWARF 5 */ \ 81283a092cfSNicholas Piggin .debug_macro 0 : { *(.debug_macro) } \ 81383a092cfSNicholas Piggin .debug_addr 0 : { *(.debug_addr) } 814a7d0c210SPaolo 'Blaisorblade' Giarrusso 815a7d0c210SPaolo 'Blaisorblade' Giarrusso /* Stabs debugging sections. */ 816a7d0c210SPaolo 'Blaisorblade' Giarrusso #define STABS_DEBUG \ 817a7d0c210SPaolo 'Blaisorblade' Giarrusso .stab 0 : { *(.stab) } \ 818a7d0c210SPaolo 'Blaisorblade' Giarrusso .stabstr 0 : { *(.stabstr) } \ 819a7d0c210SPaolo 'Blaisorblade' Giarrusso .stab.excl 0 : { *(.stab.excl) } \ 820a7d0c210SPaolo 'Blaisorblade' Giarrusso .stab.exclstr 0 : { *(.stab.exclstr) } \ 821a7d0c210SPaolo 'Blaisorblade' Giarrusso .stab.index 0 : { *(.stab.index) } \ 822a7d0c210SPaolo 'Blaisorblade' Giarrusso .stab.indexstr 0 : { *(.stab.indexstr) } \ 823a7d0c210SPaolo 'Blaisorblade' Giarrusso .comment 0 : { *(.comment) } 8249c9b8b38SJeremy Fitzhardinge 8256360b1fbSJan Beulich #ifdef CONFIG_GENERIC_BUG 8267664c5a1SJeremy Fitzhardinge #define BUG_TABLE \ 8277664c5a1SJeremy Fitzhardinge . = ALIGN(8); \ 8287664c5a1SJeremy Fitzhardinge __bug_table : AT(ADDR(__bug_table) - LOAD_OFFSET) { \ 829a6214385SMasahiro Yamada __start___bug_table = .; \ 8304b89b7f7SNicholas Piggin KEEP(*(__bug_table)) \ 831a6214385SMasahiro Yamada __stop___bug_table = .; \ 8327664c5a1SJeremy Fitzhardinge } 8336360b1fbSJan Beulich #else 8346360b1fbSJan Beulich #define BUG_TABLE 8356360b1fbSJan Beulich #endif 8367664c5a1SJeremy Fitzhardinge 83711af8474SJosh Poimboeuf #ifdef CONFIG_UNWINDER_ORC 838ee9f8fceSJosh Poimboeuf #define ORC_UNWIND_TABLE \ 839ee9f8fceSJosh Poimboeuf . = ALIGN(4); \ 840ee9f8fceSJosh Poimboeuf .orc_unwind_ip : AT(ADDR(.orc_unwind_ip) - LOAD_OFFSET) { \ 841a6214385SMasahiro Yamada __start_orc_unwind_ip = .; \ 842ee9f8fceSJosh Poimboeuf KEEP(*(.orc_unwind_ip)) \ 843a6214385SMasahiro Yamada __stop_orc_unwind_ip = .; \ 844ee9f8fceSJosh Poimboeuf } \ 845f76a16adSJosh Poimboeuf . = ALIGN(2); \ 846ee9f8fceSJosh Poimboeuf .orc_unwind : AT(ADDR(.orc_unwind) - LOAD_OFFSET) { \ 847a6214385SMasahiro Yamada __start_orc_unwind = .; \ 848ee9f8fceSJosh Poimboeuf KEEP(*(.orc_unwind)) \ 849a6214385SMasahiro Yamada __stop_orc_unwind = .; \ 850ee9f8fceSJosh Poimboeuf } \ 851ee9f8fceSJosh Poimboeuf . = ALIGN(4); \ 852ee9f8fceSJosh Poimboeuf .orc_lookup : AT(ADDR(.orc_lookup) - LOAD_OFFSET) { \ 853a6214385SMasahiro Yamada orc_lookup = .; \ 854ee9f8fceSJosh Poimboeuf . += (((SIZEOF(.text) + LOOKUP_BLOCK_SIZE - 1) / \ 855ee9f8fceSJosh Poimboeuf LOOKUP_BLOCK_SIZE) + 1) * 4; \ 856a6214385SMasahiro Yamada orc_lookup_end = .; \ 857ee9f8fceSJosh Poimboeuf } 858ee9f8fceSJosh Poimboeuf #else 859ee9f8fceSJosh Poimboeuf #define ORC_UNWIND_TABLE 860ee9f8fceSJosh Poimboeuf #endif 861ee9f8fceSJosh Poimboeuf 86263687a52SJan Beulich #ifdef CONFIG_PM_TRACE 86363687a52SJan Beulich #define TRACEDATA \ 86463687a52SJan Beulich . = ALIGN(4); \ 86563687a52SJan Beulich .tracedata : AT(ADDR(.tracedata) - LOAD_OFFSET) { \ 866a6214385SMasahiro Yamada __tracedata_start = .; \ 8674b89b7f7SNicholas Piggin KEEP(*(.tracedata)) \ 868a6214385SMasahiro Yamada __tracedata_end = .; \ 86963687a52SJan Beulich } 87063687a52SJan Beulich #else 87163687a52SJan Beulich #define TRACEDATA 87263687a52SJan Beulich #endif 87363687a52SJan Beulich 8749c9b8b38SJeremy Fitzhardinge #define NOTES \ 875cbe87121SRoland McGrath .notes : AT(ADDR(.notes) - LOAD_OFFSET) { \ 876a6214385SMasahiro Yamada __start_notes = .; \ 877266ff2a8SNicholas Piggin KEEP(*(.note.*)) \ 878a6214385SMasahiro Yamada __stop_notes = .; \ 879fbe6a8e6SKees Cook } NOTES_HEADERS \ 880fbe6a8e6SKees Cook NOTES_HEADERS_RESTORE 88161ce1efeSAndrew Morton 882ef53dae8SSam Ravnborg #define INIT_SETUP(initsetup_align) \ 883ef53dae8SSam Ravnborg . = ALIGN(initsetup_align); \ 884a6214385SMasahiro Yamada __setup_start = .; \ 8854b89b7f7SNicholas Piggin KEEP(*(.init.setup)) \ 886a6214385SMasahiro Yamada __setup_end = .; 887ef53dae8SSam Ravnborg 888026cee00SPawel Moll #define INIT_CALLS_LEVEL(level) \ 889a6214385SMasahiro Yamada __initcall##level##_start = .; \ 890b67067f1SNicholas Piggin KEEP(*(.initcall##level##.init)) \ 891b67067f1SNicholas Piggin KEEP(*(.initcall##level##s.init)) \ 89261ce1efeSAndrew Morton 893ef53dae8SSam Ravnborg #define INIT_CALLS \ 894a6214385SMasahiro Yamada __initcall_start = .; \ 895b67067f1SNicholas Piggin KEEP(*(.initcallearly.init)) \ 896026cee00SPawel Moll INIT_CALLS_LEVEL(0) \ 897026cee00SPawel Moll INIT_CALLS_LEVEL(1) \ 898026cee00SPawel Moll INIT_CALLS_LEVEL(2) \ 899026cee00SPawel Moll INIT_CALLS_LEVEL(3) \ 900026cee00SPawel Moll INIT_CALLS_LEVEL(4) \ 901026cee00SPawel Moll INIT_CALLS_LEVEL(5) \ 902026cee00SPawel Moll INIT_CALLS_LEVEL(rootfs) \ 903026cee00SPawel Moll INIT_CALLS_LEVEL(6) \ 904026cee00SPawel Moll INIT_CALLS_LEVEL(7) \ 905a6214385SMasahiro Yamada __initcall_end = .; 906ef53dae8SSam Ravnborg 907ef53dae8SSam Ravnborg #define CON_INITCALL \ 908a6214385SMasahiro Yamada __con_initcall_start = .; \ 909b67067f1SNicholas Piggin KEEP(*(.con_initcall.init)) \ 910a6214385SMasahiro Yamada __con_initcall_end = .; 911ef53dae8SSam Ravnborg 912ef53dae8SSam Ravnborg #ifdef CONFIG_BLK_DEV_INITRD 913ef53dae8SSam Ravnborg #define INIT_RAM_FS \ 914d8826262SMike Frysinger . = ALIGN(4); \ 915a6214385SMasahiro Yamada __initramfs_start = .; \ 916b67067f1SNicholas Piggin KEEP(*(.init.ramfs)) \ 917ffe8018cSHendrik Brueckner . = ALIGN(8); \ 918b67067f1SNicholas Piggin KEEP(*(.init.ramfs.info)) 919ef53dae8SSam Ravnborg #else 920eadfe219SDavid Howells #define INIT_RAM_FS 921ef53dae8SSam Ravnborg #endif 922ef53dae8SSam Ravnborg 923023bf6f1STejun Heo /* 924ac26963aSBrijesh Singh * Memory encryption operates on a page basis. Since we need to clear 925ac26963aSBrijesh Singh * the memory encryption mask for this section, it needs to be aligned 926ac26963aSBrijesh Singh * on a page boundary and be a page-size multiple in length. 927ac26963aSBrijesh Singh * 928ac26963aSBrijesh Singh * Note: We use a separate section so that only this section gets 929ac26963aSBrijesh Singh * decrypted to avoid exposing more than we wish. 930ac26963aSBrijesh Singh */ 931ac26963aSBrijesh Singh #ifdef CONFIG_AMD_MEM_ENCRYPT 932ac26963aSBrijesh Singh #define PERCPU_DECRYPTED_SECTION \ 933ac26963aSBrijesh Singh . = ALIGN(PAGE_SIZE); \ 934ac26963aSBrijesh Singh *(.data..percpu..decrypted) \ 935ac26963aSBrijesh Singh . = ALIGN(PAGE_SIZE); 936ac26963aSBrijesh Singh #else 937ac26963aSBrijesh Singh #define PERCPU_DECRYPTED_SECTION 938ac26963aSBrijesh Singh #endif 939ac26963aSBrijesh Singh 940ac26963aSBrijesh Singh 941ac26963aSBrijesh Singh /* 942023bf6f1STejun Heo * Default discarded sections. 943023bf6f1STejun Heo * 944023bf6f1STejun Heo * Some archs want to discard exit text/data at runtime rather than 945023bf6f1STejun Heo * link time due to cross-section references such as alt instructions, 946023bf6f1STejun Heo * bug table, eh_frame, etc. DISCARDS must be the last of output 947023bf6f1STejun Heo * section definitions so that such archs put those in earlier section 948023bf6f1STejun Heo * definitions. 949023bf6f1STejun Heo */ 95084d5f77fSH.J. Lu #ifdef RUNTIME_DISCARD_EXIT 95184d5f77fSH.J. Lu #define EXIT_DISCARDS 95284d5f77fSH.J. Lu #else 95384d5f77fSH.J. Lu #define EXIT_DISCARDS \ 95484d5f77fSH.J. Lu EXIT_TEXT \ 95584d5f77fSH.J. Lu EXIT_DATA 95684d5f77fSH.J. Lu #endif 95784d5f77fSH.J. Lu 958405d967dSTejun Heo #define DISCARDS \ 959405d967dSTejun Heo /DISCARD/ : { \ 96084d5f77fSH.J. Lu EXIT_DISCARDS \ 961023bf6f1STejun Heo EXIT_CALL \ 962405d967dSTejun Heo *(.discard) \ 963c7f52cdcSJeremy Fitzhardinge *(.discard.*) \ 964898490c0SAlexey Gladkov *(.modinfo) \ 965405d967dSTejun Heo } 966405d967dSTejun Heo 9673e5d8f97STejun Heo /** 9686ea0c34dSMike Frysinger * PERCPU_INPUT - the percpu input sections 9696ea0c34dSMike Frysinger * @cacheline: cacheline size 9706ea0c34dSMike Frysinger * 9716ea0c34dSMike Frysinger * The core percpu section names and core symbols which do not rely 9726ea0c34dSMike Frysinger * directly upon load addresses. 9736ea0c34dSMike Frysinger * 9746ea0c34dSMike Frysinger * @cacheline is used to align subsections to avoid false cacheline 9756ea0c34dSMike Frysinger * sharing between subsections for different purposes. 9766ea0c34dSMike Frysinger */ 9776ea0c34dSMike Frysinger #define PERCPU_INPUT(cacheline) \ 978a6214385SMasahiro Yamada __per_cpu_start = .; \ 9796ea0c34dSMike Frysinger *(.data..percpu..first) \ 9806ea0c34dSMike Frysinger . = ALIGN(PAGE_SIZE); \ 9816ea0c34dSMike Frysinger *(.data..percpu..page_aligned) \ 9826ea0c34dSMike Frysinger . = ALIGN(cacheline); \ 983330d2822SZhengyu He *(.data..percpu..read_mostly) \ 9846ea0c34dSMike Frysinger . = ALIGN(cacheline); \ 9856ea0c34dSMike Frysinger *(.data..percpu) \ 9866ea0c34dSMike Frysinger *(.data..percpu..shared_aligned) \ 987ac26963aSBrijesh Singh PERCPU_DECRYPTED_SECTION \ 988a6214385SMasahiro Yamada __per_cpu_end = .; 9896ea0c34dSMike Frysinger 9906ea0c34dSMike Frysinger /** 9916b7c38d5STejun Heo * PERCPU_VADDR - define output section for percpu area 99219df0c2fSTejun Heo * @cacheline: cacheline size 9933e5d8f97STejun Heo * @vaddr: explicit base address (optional) 9943e5d8f97STejun Heo * @phdr: destination PHDR (optional) 9953e5d8f97STejun Heo * 99619df0c2fSTejun Heo * Macro which expands to output section for percpu area. 99719df0c2fSTejun Heo * 99819df0c2fSTejun Heo * @cacheline is used to align subsections to avoid false cacheline 99919df0c2fSTejun Heo * sharing between subsections for different purposes. 100019df0c2fSTejun Heo * 100119df0c2fSTejun Heo * If @vaddr is not blank, it specifies explicit base address and all 100219df0c2fSTejun Heo * percpu symbols will be offset from the given address. If blank, 100319df0c2fSTejun Heo * @vaddr always equals @laddr + LOAD_OFFSET. 10043e5d8f97STejun Heo * 10053e5d8f97STejun Heo * @phdr defines the output PHDR to use if not blank. Be warned that 10063e5d8f97STejun Heo * output PHDR is sticky. If @phdr is specified, the next output 10073e5d8f97STejun Heo * section in the linker script will go there too. @phdr should have 10083e5d8f97STejun Heo * a leading colon. 10093e5d8f97STejun Heo * 10103ac6cffeSTejun Heo * Note that this macros defines __per_cpu_load as an absolute symbol. 10113ac6cffeSTejun Heo * If there is no need to put the percpu section at a predetermined 10120415b00dSTejun Heo * address, use PERCPU_SECTION. 10133e5d8f97STejun Heo */ 101419df0c2fSTejun Heo #define PERCPU_VADDR(cacheline, vaddr, phdr) \ 1015a6214385SMasahiro Yamada __per_cpu_load = .; \ 1016a6214385SMasahiro Yamada .data..percpu vaddr : AT(__per_cpu_load - LOAD_OFFSET) { \ 10176ea0c34dSMike Frysinger PERCPU_INPUT(cacheline) \ 10186b7c38d5STejun Heo } phdr \ 1019a6214385SMasahiro Yamada . = __per_cpu_load + SIZEOF(.data..percpu); 10203e5d8f97STejun Heo 10213e5d8f97STejun Heo /** 10220415b00dSTejun Heo * PERCPU_SECTION - define output section for percpu area, simple version 102319df0c2fSTejun Heo * @cacheline: cacheline size 10243e5d8f97STejun Heo * 10250415b00dSTejun Heo * Align to PAGE_SIZE and outputs output section for percpu area. This 10260415b00dSTejun Heo * macro doesn't manipulate @vaddr or @phdr and __per_cpu_load and 10273e5d8f97STejun Heo * __per_cpu_start will be identical. 10283ac6cffeSTejun Heo * 10290415b00dSTejun Heo * This macro is equivalent to ALIGN(PAGE_SIZE); PERCPU_VADDR(@cacheline,,) 103019df0c2fSTejun Heo * except that __per_cpu_load is defined as a relative symbol against 103119df0c2fSTejun Heo * .data..percpu which is required for relocatable x86_32 configuration. 10323e5d8f97STejun Heo */ 10330415b00dSTejun Heo #define PERCPU_SECTION(cacheline) \ 10340415b00dSTejun Heo . = ALIGN(PAGE_SIZE); \ 10353d9a854cSDenys Vlasenko .data..percpu : AT(ADDR(.data..percpu) - LOAD_OFFSET) { \ 1036a6214385SMasahiro Yamada __per_cpu_load = .; \ 10376ea0c34dSMike Frysinger PERCPU_INPUT(cacheline) \ 10383ac6cffeSTejun Heo } 1039ef53dae8SSam Ravnborg 1040ef53dae8SSam Ravnborg 1041ef53dae8SSam Ravnborg /* 1042ef53dae8SSam Ravnborg * Definition of the high level *_SECTION macros 1043ef53dae8SSam Ravnborg * They will fit only a subset of the architectures 1044ef53dae8SSam Ravnborg */ 1045ef53dae8SSam Ravnborg 1046ef53dae8SSam Ravnborg 1047ef53dae8SSam Ravnborg /* 1048ef53dae8SSam Ravnborg * Writeable data. 1049ef53dae8SSam Ravnborg * All sections are combined in a single .data section. 1050ef53dae8SSam Ravnborg * The sections following CONSTRUCTORS are arranged so their 1051ef53dae8SSam Ravnborg * typical alignment matches. 1052ef53dae8SSam Ravnborg * A cacheline is typical/always less than a PAGE_SIZE so 1053ef53dae8SSam Ravnborg * the sections that has this restriction (or similar) 1054ef53dae8SSam Ravnborg * is located before the ones requiring PAGE_SIZE alignment. 1055ef53dae8SSam Ravnborg * NOSAVE_DATA starts and ends with a PAGE_SIZE alignment which 105625985edcSLucas De Marchi * matches the requirement of PAGE_ALIGNED_DATA. 1057ef53dae8SSam Ravnborg * 10587923f90fSSam Ravnborg * use 0 as page_align if page_aligned data is not used */ 1059c9174047SKees Cook #define RW_DATA(cacheline, pagealigned, inittask) \ 1060ef53dae8SSam Ravnborg . = ALIGN(PAGE_SIZE); \ 1061ef53dae8SSam Ravnborg .data : AT(ADDR(.data) - LOAD_OFFSET) { \ 106239a449d9STim Abbott INIT_TASK_DATA(inittask) \ 10631b208622STim Abbott NOSAVE_DATA \ 10641b208622STim Abbott PAGE_ALIGNED_DATA(pagealigned) \ 1065ef53dae8SSam Ravnborg CACHELINE_ALIGNED_DATA(cacheline) \ 1066ef53dae8SSam Ravnborg READ_MOSTLY_DATA(cacheline) \ 1067ef53dae8SSam Ravnborg DATA_DATA \ 1068ef53dae8SSam Ravnborg CONSTRUCTORS \ 106919d43626SPeter Zijlstra } \ 1070ee9f8fceSJosh Poimboeuf BUG_TABLE \ 1071ef53dae8SSam Ravnborg 1072ef53dae8SSam Ravnborg #define INIT_TEXT_SECTION(inittext_align) \ 1073ef53dae8SSam Ravnborg . = ALIGN(inittext_align); \ 1074ef53dae8SSam Ravnborg .init.text : AT(ADDR(.init.text) - LOAD_OFFSET) { \ 1075a6214385SMasahiro Yamada _sinittext = .; \ 1076ef53dae8SSam Ravnborg INIT_TEXT \ 1077a6214385SMasahiro Yamada _einittext = .; \ 1078ef53dae8SSam Ravnborg } 1079ef53dae8SSam Ravnborg 1080ef53dae8SSam Ravnborg #define INIT_DATA_SECTION(initsetup_align) \ 1081ef53dae8SSam Ravnborg .init.data : AT(ADDR(.init.data) - LOAD_OFFSET) { \ 1082ef53dae8SSam Ravnborg INIT_DATA \ 1083ef53dae8SSam Ravnborg INIT_SETUP(initsetup_align) \ 1084ef53dae8SSam Ravnborg INIT_CALLS \ 1085ef53dae8SSam Ravnborg CON_INITCALL \ 1086ef53dae8SSam Ravnborg INIT_RAM_FS \ 1087ef53dae8SSam Ravnborg } 1088ef53dae8SSam Ravnborg 108904e448d9STim Abbott #define BSS_SECTION(sbss_align, bss_align, stop_align) \ 109004e448d9STim Abbott . = ALIGN(sbss_align); \ 1091a6214385SMasahiro Yamada __bss_start = .; \ 109204e448d9STim Abbott SBSS(sbss_align) \ 1093ef53dae8SSam Ravnborg BSS(bss_align) \ 109404e448d9STim Abbott . = ALIGN(stop_align); \ 1095a6214385SMasahiro Yamada __bss_stop = .; 1096