Almost all uses of the BOUNDED_SECTION macros are ALIGN(8), either
explicitly, or by being below an aligned section.  The noteworthy
exception is BOUNDED_SECTION(__dyndbg), which immediately follows
BOUNDED_SECTION(__dyndbg_classes).

On i386, struct _ddebug_classmap is 28 bytes, so without an explicit
ALIGN(8) in the macro, the following __dyndbg section gets misaligned,
causing a NULL ptr deref in dynamic_debug_init().

So fix this with an explicit ALIGN(8) in the existing macros, and
introduce _ALIGNED variants to handle the rare exceptions.

NOTES:

ORC_UNWIND_TABLE now uses _ALIGNED macros to match the explicit
. = ALIGN(x) instructions, but keeps the instructions so the symbols
between them are not "re-aligned"; scripts/sorttable.c does not
tolerate sloppy padding.

Also add . = ALIGN(4) and change BOUNDED_SECTION to _ALIGNED, to agree
with .orc_header, added here:

b9f174c811e3 ("x86/unwind/orc: Add ELF section with ORC version identifier")

Suggested-by: Louis Chauvet <[email protected]>  # _ALIGNED variants.
Link: 
https://lore.kernel.org/lkml/177402491426.6181.12855763650074831089.b4-review@b4/
Signed-off-by: Jim Cromie <[email protected]>
---
 include/asm-generic/bounded_sections.lds.h | 17 ++++++++++++++---
 include/asm-generic/vmlinux.lds.h          |  9 +++++----
 2 files changed, 19 insertions(+), 7 deletions(-)

diff --git a/include/asm-generic/bounded_sections.lds.h 
b/include/asm-generic/bounded_sections.lds.h
index 268cdc34389b..8ff3e3420f60 100644
--- a/include/asm-generic/bounded_sections.lds.h
+++ b/include/asm-generic/bounded_sections.lds.h
@@ -3,19 +3,30 @@
 #ifndef _ASM_GENERIC_BOUNDED_SECTIONS_H
 #define _ASM_GENERIC_BOUNDED_SECTIONS_H
 
-#define BOUNDED_SECTION_PRE_LABEL(_sec_, _label_, _BEGIN_, _END_)      \
+#define BOUNDED_SECTION_PRE_LABEL_ALIGNED(_sec_, _label_, _BEGIN_, _END_, 
_ALIGNED_) \
+       . = ALIGN(_ALIGNED_);                                           \
        _BEGIN_##_label_ = .;                                           \
        KEEP(*(_sec_))                                                  \
        _END_##_label_ = .;
 
-#define BOUNDED_SECTION_POST_LABEL(_sec_, _label_, _BEGIN_, _END_)     \
+#define BOUNDED_SECTION_PRE_LABEL(_sec_, _label_, _BEGIN_, _END_)      \
+       BOUNDED_SECTION_PRE_LABEL_ALIGNED(_sec_, _label_, _BEGIN_, _END_, 8)
+
+#define BOUNDED_SECTION_POST_LABEL_ALIGNED(_sec_, _label_, _BEGIN_, _END_, 
_ALIGNED_) \
+       . = ALIGN(_ALIGNED_);                                           \
        _label_##_BEGIN_ = .;                                           \
        KEEP(*(_sec_))                                                  \
        _label_##_END_ = .;
 
+#define BOUNDED_SECTION_POST_LABEL(_sec_, _label_, _BEGIN_, _END_)     \
+       BOUNDED_SECTION_POST_LABEL_ALIGNED(_sec_, _label_, _BEGIN_, _END_, 8)
+
 #define BOUNDED_SECTION_BY(_sec_, _label_)                             \
        BOUNDED_SECTION_PRE_LABEL(_sec_, _label_, __start, __stop)
 
-#define BOUNDED_SECTION(_sec)   BOUNDED_SECTION_BY(_sec, _sec)
+#define BOUNDED_SECTION_BY_ALIGNED(_sec_, _label_, _ALIGNED_)          \
+       BOUNDED_SECTION_PRE_LABEL_ALIGNED(_sec_, _label_, __start, __stop, 
_ALIGNED_)
+
+#define BOUNDED_SECTION(_sec)   BOUNDED_SECTION_BY(_sec, _sec)
 
 #endif /* _ASM_GENERIC_BOUNDED_SECTIONS_H */
diff --git a/include/asm-generic/vmlinux.lds.h 
b/include/asm-generic/vmlinux.lds.h
index f78300aea8f6..d3f20b411e16 100644
--- a/include/asm-generic/vmlinux.lds.h
+++ b/include/asm-generic/vmlinux.lds.h
@@ -641,7 +641,7 @@
 #define EXCEPTION_TABLE(align)                                         \
        . = ALIGN(align);                                               \
        __ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) {               \
-               BOUNDED_SECTION_BY(__ex_table, ___ex_table)             \
+               BOUNDED_SECTION_BY_ALIGNED(__ex_table, ___ex_table, align) \
        }
 
 /*
@@ -833,16 +833,17 @@
 
 #ifdef CONFIG_UNWINDER_ORC
 #define ORC_UNWIND_TABLE                                               \
+       . = ALIGN(4);                                                   \
        .orc_header : AT(ADDR(.orc_header) - LOAD_OFFSET) {             \
-               BOUNDED_SECTION_BY(.orc_header, _orc_header)            \
+               BOUNDED_SECTION_BY_ALIGNED(.orc_header, _orc_header, 4) \
        }                                                               \
        . = ALIGN(4);                                                   \
        .orc_unwind_ip : AT(ADDR(.orc_unwind_ip) - LOAD_OFFSET) {       \
-               BOUNDED_SECTION_BY(.orc_unwind_ip, _orc_unwind_ip)      \
+               BOUNDED_SECTION_BY_ALIGNED(.orc_unwind_ip, _orc_unwind_ip, 4)\
        }                                                               \
        . = ALIGN(2);                                                   \
        .orc_unwind : AT(ADDR(.orc_unwind) - LOAD_OFFSET) {             \
-               BOUNDED_SECTION_BY(.orc_unwind, _orc_unwind)            \
+               BOUNDED_SECTION_BY_ALIGNED(.orc_unwind, _orc_unwind, 2) \
        }                                                               \
        text_size = _etext - _stext;                                    \
        . = ALIGN(4);                                                   \

-- 
2.54.0


Reply via email to