summaryrefslogtreecommitdiffstats
path: root/scripts
diff options
context:
space:
mode:
authorHelge Deller <deller@gmx.de>2022-07-08 11:44:54 +0200
committerLuis Chamberlain <mcgrof@kernel.org>2022-07-11 10:49:14 -0700
commit87c482bdfa79f378297d92af49cdf265be199df5 (patch)
tree6e3010ffc8e2d07a23e1388900ff8d89d86d8dbb /scripts
parent07ade45a765bb7d7571f1a89ab8edfa4ce5e7268 (diff)
downloadlinux-87c482bdfa79f378297d92af49cdf265be199df5.tar.gz
linux-87c482bdfa79f378297d92af49cdf265be199df5.tar.bz2
linux-87c482bdfa79f378297d92af49cdf265be199df5.zip
modules: Ensure natural alignment for .altinstructions and __bug_table sections
In the kernel image vmlinux.lds.S linker scripts the .altinstructions and __bug_table sections are 4- or 8-byte aligned because they hold 32- and/or 64-bit values. Most architectures use altinstructions and BUG() or WARN() in modules as well, but in the module linker script (module.lds.S) those sections are currently missing. As consequence the linker will store their content byte-aligned by default, which then can lead to unnecessary unaligned memory accesses by the CPU when those tables are processed at runtime. Usually unaligned memory accesses are unnoticed, because either the hardware (as on x86 CPUs) or in-kernel exception handlers (e.g. on parisc or sparc) emulate and fix them up at runtime. Nevertheless, such unaligned accesses introduce a performance penalty and can even crash the kernel if there is a bug in the unalignment exception handlers (which happened once to me on the parisc architecture and which is why I noticed that issue at all). This patch fixes a non-critical issue and might be backported at any time. It's trivial and shouldn't introduce any regression because it simply tells the linker to use a different (8-byte alignment) for those sections by default. Signed-off-by: Helge Deller <deller@gmx.de> Link: https://lore.kernel.org/all/Yr8%2Fgr8e8I7tVX4d@p100/ Signed-off-by: Luis Chamberlain <mcgrof@kernel.org>
Diffstat (limited to 'scripts')
-rw-r--r--scripts/module.lds.S2
1 files changed, 2 insertions, 0 deletions
diff --git a/scripts/module.lds.S b/scripts/module.lds.S
index 1d0e1e4dc3d2..3a3aa2354ed8 100644
--- a/scripts/module.lds.S
+++ b/scripts/module.lds.S
@@ -27,6 +27,8 @@ SECTIONS {
.ctors 0 : ALIGN(8) { *(SORT(.ctors.*)) *(.ctors) }
.init_array 0 : ALIGN(8) { *(SORT(.init_array.*)) *(.init_array) }
+ .altinstructions 0 : ALIGN(8) { KEEP(*(.altinstructions)) }
+ __bug_table 0 : ALIGN(8) { KEEP(*(__bug_table)) }
__jump_table 0 : ALIGN(8) { KEEP(*(__jump_table)) }
__patchable_function_entries : { *(__patchable_function_entries) }