diff options
author | Ingo Molnar <mingo@kernel.org> | 2017-11-29 07:11:24 +0100 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2017-11-29 07:11:24 +0100 |
commit | 4fc31ba13d052c2933bf91095c063cf9a39effd0 (patch) | |
tree | beabb73c2fe245e6541126732895da62e55bc8ee /arch/s390/kernel/module.c | |
parent | 0e18dd12064e07519f7cbff4149ca7fff620cbed (diff) | |
parent | b29c6ef7bb1257853c1e31616d84f55e561cf631 (diff) |
Merge branch 'linus' into perf/urgent, to pick up dependent commits
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'arch/s390/kernel/module.c')
-rw-r--r-- | arch/s390/kernel/module.c | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/arch/s390/kernel/module.c b/arch/s390/kernel/module.c index 1a27f307a920..6d9f73bb4142 100644 --- a/arch/s390/kernel/module.c +++ b/arch/s390/kernel/module.c @@ -31,6 +31,7 @@ #include <linux/kernel.h> #include <linux/moduleloader.h> #include <linux/bug.h> +#include <asm/alternative.h> #if 0 #define DEBUGP printk @@ -429,6 +430,22 @@ int module_finalize(const Elf_Ehdr *hdr, const Elf_Shdr *sechdrs, struct module *me) { + const Elf_Shdr *s; + char *secstrings; + + if (IS_ENABLED(CONFIG_ALTERNATIVES)) { + secstrings = (void *)hdr + sechdrs[hdr->e_shstrndx].sh_offset; + for (s = sechdrs; s < sechdrs + hdr->e_shnum; s++) { + if (!strcmp(".altinstructions", + secstrings + s->sh_name)) { + /* patch .altinstructions */ + void *aseg = (void *)s->sh_addr; + + apply_alternatives(aseg, aseg + s->sh_size); + } + } + } + jump_label_apply_nops(me); return 0; } |