Merge tag 'driver-core-6.2-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git...
[sfrench/cifs-2.6.git] / include / asm-generic / vmlinux.lds.h
index d06ada2341cb9e2fdcdbd07a846646b8d94856f9..a94219e9916f185acef402efca6538503a1c7680 100644 (file)
@@ -81,8 +81,8 @@
 #define RO_EXCEPTION_TABLE
 #endif
 
-/* Align . to a 8 byte boundary equals to maximum function alignment. */
-#define ALIGN_FUNCTION()  . = ALIGN(8)
+/* Align . function alignment. */
+#define ALIGN_FUNCTION()  . = ALIGN(CONFIG_FUNCTION_ALIGNMENT)
 
 /*
  * LD_DEAD_CODE_DATA_ELIMINATION option enables -fdata-sections, which
 # endif
 #endif
 
+#define BOUNDED_SECTION_PRE_LABEL(_sec_, _label_, _BEGIN_, _END_)      \
+       _BEGIN_##_label_ = .;                                           \
+       KEEP(*(_sec_))                                                  \
+       _END_##_label_ = .;
+
+#define BOUNDED_SECTION_POST_LABEL(_sec_, _label_, _BEGIN_, _END_)     \
+       _label_##_BEGIN_ = .;                                           \
+       KEEP(*(_sec_))                                                  \
+       _label_##_END_ = .;
+
+#define BOUNDED_SECTION_BY(_sec_, _label_)                             \
+       BOUNDED_SECTION_PRE_LABEL(_sec_, _label_, __start, __stop)
+
+#define BOUNDED_SECTION(_sec)   BOUNDED_SECTION_BY(_sec, _sec)
+
+#define HEADERED_SECTION_PRE_LABEL(_sec_, _label_, _BEGIN_, _END_, _HDR_) \
+       _HDR_##_label_  = .;                                            \
+       KEEP(*(.gnu.linkonce.##_sec_))                                  \
+       BOUNDED_SECTION_PRE_LABEL(_sec_, _label_, _BEGIN_, _END_)
+
+#define HEADERED_SECTION_POST_LABEL(_sec_, _label_, _BEGIN_, _END_, _HDR_) \
+       _label_##_HDR_ = .;                                             \
+       KEEP(*(.gnu.linkonce.##_sec_))                                  \
+       BOUNDED_SECTION_POST_LABEL(_sec_, _label_, _BEGIN_, _END_)
+
+#define HEADERED_SECTION_BY(_sec_, _label_)                            \
+       HEADERED_SECTION_PRE_LABEL(_sec_, _label_, __start, __stop)
+
+#define HEADERED_SECTION(_sec)  HEADERED_SECTION_BY(_sec, _sec)
+
 #ifdef CONFIG_TRACE_BRANCH_PROFILING
-#define LIKELY_PROFILE()       __start_annotated_branch_profile = .;   \
-                               KEEP(*(_ftrace_annotated_branch))       \
-                               __stop_annotated_branch_profile = .;
+#define LIKELY_PROFILE()                                               \
+       BOUNDED_SECTION_BY(_ftrace_annotated_branch, _annotated_branch_profile)
 #else
 #define LIKELY_PROFILE()
 #endif
 
 #ifdef CONFIG_PROFILE_ALL_BRANCHES
-#define BRANCH_PROFILE()       __start_branch_profile = .;             \
-                               KEEP(*(_ftrace_branch))                 \
-                               __stop_branch_profile = .;
+#define BRANCH_PROFILE()                                       \
+       BOUNDED_SECTION_BY(_ftrace_branch, _branch_profile)
 #else
 #define BRANCH_PROFILE()
 #endif
 
 #ifdef CONFIG_KPROBES
-#define KPROBE_BLACKLIST()     . = ALIGN(8);                                 \
-                               __start_kprobe_blacklist = .;                 \
-                               KEEP(*(_kprobe_blacklist))                    \
-                               __stop_kprobe_blacklist = .;
+#define KPROBE_BLACKLIST()                             \
+       . = ALIGN(8);                                   \
+       BOUNDED_SECTION(_kprobe_blacklist)
 #else
 #define KPROBE_BLACKLIST()
 #endif
 
 #ifdef CONFIG_FUNCTION_ERROR_INJECTION
-#define ERROR_INJECT_WHITELIST()       STRUCT_ALIGN();                       \
-                       __start_error_injection_whitelist = .;                \
-                       KEEP(*(_error_injection_whitelist))                   \
-                       __stop_error_injection_whitelist = .;
+#define ERROR_INJECT_WHITELIST()                       \
+       STRUCT_ALIGN();                                 \
+       BOUNDED_SECTION(_error_injection_whitelist)
 #else
 #define ERROR_INJECT_WHITELIST()
 #endif
 
 #ifdef CONFIG_EVENT_TRACING
-#define FTRACE_EVENTS()        . = ALIGN(8);                                   \
-                       __start_ftrace_events = .;                      \
-                       KEEP(*(_ftrace_events))                         \
-                       __stop_ftrace_events = .;                       \
-                       __start_ftrace_eval_maps = .;                   \
-                       KEEP(*(_ftrace_eval_map))                       \
-                       __stop_ftrace_eval_maps = .;
+#define FTRACE_EVENTS()                                                        \
+       . = ALIGN(8);                                                   \
+       BOUNDED_SECTION(_ftrace_events)                                 \
+       BOUNDED_SECTION_BY(_ftrace_eval_map, _ftrace_eval_maps)
 #else
 #define FTRACE_EVENTS()
 #endif
 
 #ifdef CONFIG_TRACING
-#define TRACE_PRINTKS()         __start___trace_bprintk_fmt = .;      \
-                        KEEP(*(__trace_printk_fmt)) /* Trace_printk fmt' pointer */ \
-                        __stop___trace_bprintk_fmt = .;
-#define TRACEPOINT_STR() __start___tracepoint_str = .; \
-                        KEEP(*(__tracepoint_str)) /* Trace_printk fmt' pointer */ \
-                        __stop___tracepoint_str = .;
+#define TRACE_PRINTKS()                BOUNDED_SECTION_BY(__trace_printk_fmt, ___trace_bprintk_fmt)
+#define TRACEPOINT_STR()       BOUNDED_SECTION_BY(__tracepoint_str, ___tracepoint_str)
 #else
 #define TRACE_PRINTKS()
 #define TRACEPOINT_STR()
 #endif
 
 #ifdef CONFIG_FTRACE_SYSCALLS
-#define TRACE_SYSCALLS() . = ALIGN(8);                                 \
-                        __start_syscalls_metadata = .;                 \
-                        KEEP(*(__syscalls_metadata))                   \
-                        __stop_syscalls_metadata = .;
+#define TRACE_SYSCALLS()                       \
+       . = ALIGN(8);                           \
+       BOUNDED_SECTION_BY(__syscalls_metadata, _syscalls_metadata)
 #else
 #define TRACE_SYSCALLS()
 #endif
 
 #ifdef CONFIG_BPF_EVENTS
-#define BPF_RAW_TP() STRUCT_ALIGN();                                   \
-                        __start__bpf_raw_tp = .;                       \
-                        KEEP(*(__bpf_raw_tp_map))                      \
-                        __stop__bpf_raw_tp = .;
+#define BPF_RAW_TP() STRUCT_ALIGN();                           \
+       BOUNDED_SECTION_BY(__bpf_raw_tp_map, __bpf_raw_tp)
 #else
 #define BPF_RAW_TP()
 #endif
 
 #ifdef CONFIG_SERIAL_EARLYCON
-#define EARLYCON_TABLE() . = ALIGN(8);                         \
-                        __earlycon_table = .;                  \
-                        KEEP(*(__earlycon_table))              \
-                        __earlycon_table_end = .;
+#define EARLYCON_TABLE()                                               \
+       . = ALIGN(8);                                                   \
+       BOUNDED_SECTION_POST_LABEL(__earlycon_table, __earlycon_table, , _end)
 #else
 #define EARLYCON_TABLE()
 #endif
 
 #ifdef CONFIG_SECURITY
-#define LSM_TABLE()    . = ALIGN(8);                                   \
-                       __start_lsm_info = .;                           \
-                       KEEP(*(.lsm_info.init))                         \
-                       __end_lsm_info = .;
-#define EARLY_LSM_TABLE()      . = ALIGN(8);                           \
-                       __start_early_lsm_info = .;                     \
-                       KEEP(*(.early_lsm_info.init))                   \
-                       __end_early_lsm_info = .;
+#define LSM_TABLE()                                    \
+       . = ALIGN(8);                                   \
+       BOUNDED_SECTION_PRE_LABEL(.lsm_info.init, _lsm_info, __start, __end)
+
+#define EARLY_LSM_TABLE()                                              \
+       . = ALIGN(8);                                                   \
+       BOUNDED_SECTION_PRE_LABEL(.early_lsm_info.init, _early_lsm_info, __start, __end)
 #else
 #define LSM_TABLE()
 #define EARLY_LSM_TABLE()
 #ifdef CONFIG_ACPI
 #define ACPI_PROBE_TABLE(name)                                         \
        . = ALIGN(8);                                                   \
-       __##name##_acpi_probe_table = .;                                \
-       KEEP(*(__##name##_acpi_probe_table))                            \
-       __##name##_acpi_probe_table_end = .;
+       BOUNDED_SECTION_POST_LABEL(__##name##_acpi_probe_table,         \
+                                  __##name##_acpi_probe_table,, _end)
 #else
 #define ACPI_PROBE_TABLE(name)
 #endif
 #ifdef CONFIG_THERMAL
 #define THERMAL_TABLE(name)                                            \
        . = ALIGN(8);                                                   \
-       __##name##_thermal_table = .;                                   \
-       KEEP(*(__##name##_thermal_table))                               \
-       __##name##_thermal_table_end = .;
+       BOUNDED_SECTION_POST_LABEL(__##name##_thermal_table,            \
+                                  __##name##_thermal_table,, _end)
 #else
 #define THERMAL_TABLE(name)
 #endif
 #define DATA_DATA                                                      \
        *(.xiptext)                                                     \
        *(DATA_MAIN)                                                    \
+       *(.data..decrypted)                                             \
        *(.ref.data)                                                    \
        *(.data..shared_aligned) /* percpu related */                   \
        MEM_KEEP(init.data*)                                            \
        *(__tracepoints)                                                \
        /* implement dynamic printk debug */                            \
        . = ALIGN(8);                                                   \
-       __start___dyndbg_classes = .;                                   \
-       KEEP(*(__dyndbg_classes))                                       \
-       __stop___dyndbg_classes = .;                                    \
-       __start___dyndbg = .;                                           \
-       KEEP(*(__dyndbg))                                               \
-       __stop___dyndbg = .;                                            \
+       BOUNDED_SECTION_BY(__dyndbg_classes, ___dyndbg_classes)         \
+       BOUNDED_SECTION_BY(__dyndbg, ___dyndbg)                         \
        LIKELY_PROFILE()                                                \
        BRANCH_PROFILE()                                                \
        TRACE_PRINTKS()                                                 \
 
 #define JUMP_TABLE_DATA                                                        \
        . = ALIGN(8);                                                   \
-       __start___jump_table = .;                                       \
-       KEEP(*(__jump_table))                                           \
-       __stop___jump_table = .;
+       BOUNDED_SECTION_BY(__jump_table, ___jump_table)
 
 #ifdef CONFIG_HAVE_STATIC_CALL_INLINE
 #define STATIC_CALL_DATA                                               \
        . = ALIGN(8);                                                   \
-       __start_static_call_sites = .;                                  \
-       KEEP(*(.static_call_sites))                                     \
-       __stop_static_call_sites = .;                                   \
-       __start_static_call_tramp_key = .;                              \
-       KEEP(*(.static_call_tramp_key))                                 \
-       __stop_static_call_tramp_key = .;
+       BOUNDED_SECTION_BY(.static_call_sites, _static_call_sites)      \
+       BOUNDED_SECTION_BY(.static_call_tramp_key, _static_call_tramp_key)
 #else
 #define STATIC_CALL_DATA
 #endif
 #ifdef CONFIG_ARCH_USES_CFI_TRAPS
 #define KCFI_TRAPS                                                     \
        __kcfi_traps : AT(ADDR(__kcfi_traps) - LOAD_OFFSET) {           \
-               __start___kcfi_traps = .;                               \
-               KEEP(*(.kcfi_traps))                                    \
-               __stop___kcfi_traps = .;                                \
+               BOUNDED_SECTION_BY(.kcfi_traps, ___kcfi_traps)          \
        }
 #else
 #define KCFI_TRAPS
                SCHED_DATA                                              \
                RO_AFTER_INIT_DATA      /* Read only after init */      \
                . = ALIGN(8);                                           \
-               __start___tracepoints_ptrs = .;                         \
-               KEEP(*(__tracepoints_ptrs)) /* Tracepoints: pointer array */ \
-               __stop___tracepoints_ptrs = .;                          \
+               BOUNDED_SECTION_BY(__tracepoints_ptrs, ___tracepoints_ptrs) \
                *(__tracepoints_strings)/* Tracepoints: strings */      \
        }                                                               \
                                                                        \
                                                                        \
        /* PCI quirks */                                                \
        .pci_fixup        : AT(ADDR(.pci_fixup) - LOAD_OFFSET) {        \
-               __start_pci_fixups_early = .;                           \
-               KEEP(*(.pci_fixup_early))                               \
-               __end_pci_fixups_early = .;                             \
-               __start_pci_fixups_header = .;                          \
-               KEEP(*(.pci_fixup_header))                              \
-               __end_pci_fixups_header = .;                            \
-               __start_pci_fixups_final = .;                           \
-               KEEP(*(.pci_fixup_final))                               \
-               __end_pci_fixups_final = .;                             \
-               __start_pci_fixups_enable = .;                          \
-               KEEP(*(.pci_fixup_enable))                              \
-               __end_pci_fixups_enable = .;                            \
-               __start_pci_fixups_resume = .;                          \
-               KEEP(*(.pci_fixup_resume))                              \
-               __end_pci_fixups_resume = .;                            \
-               __start_pci_fixups_resume_early = .;                    \
-               KEEP(*(.pci_fixup_resume_early))                        \
-               __end_pci_fixups_resume_early = .;                      \
-               __start_pci_fixups_suspend = .;                         \
-               KEEP(*(.pci_fixup_suspend))                             \
-               __end_pci_fixups_suspend = .;                           \
-               __start_pci_fixups_suspend_late = .;                    \
-               KEEP(*(.pci_fixup_suspend_late))                        \
-               __end_pci_fixups_suspend_late = .;                      \
+               BOUNDED_SECTION_PRE_LABEL(.pci_fixup_early,  _pci_fixups_early,  __start, __end) \
+               BOUNDED_SECTION_PRE_LABEL(.pci_fixup_header, _pci_fixups_header, __start, __end) \
+               BOUNDED_SECTION_PRE_LABEL(.pci_fixup_final,  _pci_fixups_final,  __start, __end) \
+               BOUNDED_SECTION_PRE_LABEL(.pci_fixup_enable, _pci_fixups_enable, __start, __end) \
+               BOUNDED_SECTION_PRE_LABEL(.pci_fixup_resume, _pci_fixups_resume, __start, __end) \
+               BOUNDED_SECTION_PRE_LABEL(.pci_fixup_suspend, _pci_fixups_suspend, __start, __end) \
+               BOUNDED_SECTION_PRE_LABEL(.pci_fixup_resume_early, _pci_fixups_resume_early, __start, __end) \
+               BOUNDED_SECTION_PRE_LABEL(.pci_fixup_suspend_late, _pci_fixups_suspend_late, __start, __end) \
        }                                                               \
                                                                        \
        FW_LOADER_BUILT_IN_DATA                                         \
                                                                        \
        /* Built-in module parameters. */                               \
        __param : AT(ADDR(__param) - LOAD_OFFSET) {                     \
-               __start___param = .;                                    \
-               KEEP(*(__param))                                        \
-               __stop___param = .;                                     \
+               BOUNDED_SECTION_BY(__param, ___param)                   \
        }                                                               \
                                                                        \
        /* Built-in module versions. */                                 \
        __modver : AT(ADDR(__modver) - LOAD_OFFSET) {                   \
-               __start___modver = .;                                   \
-               KEEP(*(__modver))                                       \
-               __stop___modver = .;                                    \
+               BOUNDED_SECTION_BY(__modver, ___modver)                 \
        }                                                               \
                                                                        \
        KCFI_TRAPS                                                      \
 #define EXCEPTION_TABLE(align)                                         \
        . = ALIGN(align);                                               \
        __ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) {               \
-               __start___ex_table = .;                                 \
-               KEEP(*(__ex_table))                                     \
-               __stop___ex_table = .;                                  \
+               BOUNDED_SECTION_BY(__ex_table, ___ex_table)             \
        }
 
 /*
 #ifdef CONFIG_DEBUG_INFO_BTF
 #define BTF                                                            \
        .BTF : AT(ADDR(.BTF) - LOAD_OFFSET) {                           \
-               __start_BTF = .;                                        \
-               KEEP(*(.BTF))                                           \
-               __stop_BTF = .;                                         \
+               BOUNDED_SECTION_BY(.BTF, _BTF)                          \
        }                                                               \
        . = ALIGN(4);                                                   \
        .BTF_ids : AT(ADDR(.BTF_ids) - LOAD_OFFSET) {                   \
 #define BUG_TABLE                                                      \
        . = ALIGN(8);                                                   \
        __bug_table : AT(ADDR(__bug_table) - LOAD_OFFSET) {             \
-               __start___bug_table = .;                                \
-               KEEP(*(__bug_table))                                    \
-               __stop___bug_table = .;                                 \
+               BOUNDED_SECTION_BY(__bug_table, ___bug_table)           \
        }
 #else
 #define BUG_TABLE
 #define ORC_UNWIND_TABLE                                               \
        . = ALIGN(4);                                                   \
        .orc_unwind_ip : AT(ADDR(.orc_unwind_ip) - LOAD_OFFSET) {       \
-               __start_orc_unwind_ip = .;                              \
-               KEEP(*(.orc_unwind_ip))                                 \
-               __stop_orc_unwind_ip = .;                               \
+               BOUNDED_SECTION_BY(.orc_unwind_ip, _orc_unwind_ip)      \
        }                                                               \
        . = ALIGN(2);                                                   \
        .orc_unwind : AT(ADDR(.orc_unwind) - LOAD_OFFSET) {             \
-               __start_orc_unwind = .;                                 \
-               KEEP(*(.orc_unwind))                                    \
-               __stop_orc_unwind = .;                                  \
+               BOUNDED_SECTION_BY(.orc_unwind, _orc_unwind)            \
        }                                                               \
        text_size = _etext - _stext;                                    \
        . = ALIGN(4);                                                   \
 #ifdef CONFIG_FW_LOADER
 #define FW_LOADER_BUILT_IN_DATA                                                \
        .builtin_fw : AT(ADDR(.builtin_fw) - LOAD_OFFSET) ALIGN(8) {    \
-               __start_builtin_fw = .;                                 \
-               KEEP(*(.builtin_fw))                                    \
-               __end_builtin_fw = .;                                   \
+               BOUNDED_SECTION_PRE_LABEL(.builtin_fw, _builtin_fw, __start, __end) \
        }
 #else
 #define FW_LOADER_BUILT_IN_DATA
 #define TRACEDATA                                                      \
        . = ALIGN(4);                                                   \
        .tracedata : AT(ADDR(.tracedata) - LOAD_OFFSET) {               \
-               __tracedata_start = .;                                  \
-               KEEP(*(.tracedata))                                     \
-               __tracedata_end = .;                                    \
+               BOUNDED_SECTION_POST_LABEL(.tracedata, __tracedata, _start, _end) \
        }
 #else
 #define TRACEDATA
 #ifdef CONFIG_PRINTK_INDEX
 #define PRINTK_INDEX                                                   \
        .printk_index : AT(ADDR(.printk_index) - LOAD_OFFSET) {         \
-               __start_printk_index = .;                               \
-               *(.printk_index)                                        \
-               __stop_printk_index = .;                                \
+               BOUNDED_SECTION_BY(.printk_index, _printk_index)        \
        }
 #else
 #define PRINTK_INDEX
 
 #define NOTES                                                          \
        .notes : AT(ADDR(.notes) - LOAD_OFFSET) {                       \
-               __start_notes = .;                                      \
-               KEEP(*(.note.*))                                        \
-               __stop_notes = .;                                       \
+               BOUNDED_SECTION_BY(.note.*, _notes)                     \
        } NOTES_HEADERS                                                 \
        NOTES_HEADERS_RESTORE
 
 #define INIT_SETUP(initsetup_align)                                    \
                . = ALIGN(initsetup_align);                             \
-               __setup_start = .;                                      \
-               KEEP(*(.init.setup))                                    \
-               __setup_end = .;
+               BOUNDED_SECTION_POST_LABEL(.init.setup, __setup, _start, _end)
 
 #define INIT_CALLS_LEVEL(level)                                                \
                __initcall##level##_start = .;                          \
                __initcall_end = .;
 
 #define CON_INITCALL                                                   \
-               __con_initcall_start = .;                               \
-               KEEP(*(.con_initcall.init))                             \
-               __con_initcall_end = .;
+       BOUNDED_SECTION_POST_LABEL(.con_initcall.init, __con_initcall, _start, _end)
 
 /* Alignment must be consistent with (kunit_suite *) in include/kunit/test.h */
 #define KUNIT_TABLE()                                                  \
                . = ALIGN(8);                                           \
-               __kunit_suites_start = .;                               \
-               KEEP(*(.kunit_test_suites))                             \
-               __kunit_suites_end = .;
+               BOUNDED_SECTION_POST_LABEL(.kunit_test_suites, __kunit_suites, _start, _end)
 
 #ifdef CONFIG_BLK_DEV_INITRD
 #define INIT_RAM_FS                                                    \
 #ifdef CONFIG_AMD_MEM_ENCRYPT
 #define PERCPU_DECRYPTED_SECTION                                       \
        . = ALIGN(PAGE_SIZE);                                           \
-       *(.data..decrypted)                                             \
        *(.data..percpu..decrypted)                                     \
        . = ALIGN(PAGE_SIZE);
 #else
  * keep any .init_array.* sections.
  * https://bugs.llvm.org/show_bug.cgi?id=46478
  */
+#ifdef CONFIG_UNWIND_TABLES
+#define DISCARD_EH_FRAME
+#else
+#define DISCARD_EH_FRAME       *(.eh_frame)
+#endif
 #if defined(CONFIG_GCOV_KERNEL) || defined(CONFIG_KASAN_GENERIC) || defined(CONFIG_KCSAN)
 # ifdef CONFIG_CONSTRUCTORS
 #  define SANITIZER_DISCARDS                                           \
-       *(.eh_frame)
+       DISCARD_EH_FRAME
 # else
 #  define SANITIZER_DISCARDS                                           \
        *(.init_array) *(.init_array.*)                                 \
-       *(.eh_frame)
+       DISCARD_EH_FRAME
 # endif
 #else
 # define SANITIZER_DISCARDS