diff options
Diffstat (limited to 'arch/arm64/kernel/module.c')
| -rw-r--r-- | arch/arm64/kernel/module.c | 18 | 
1 files changed, 18 insertions, 0 deletions
diff --git a/arch/arm64/kernel/module.c b/arch/arm64/kernel/module.c index 1eb1cc955139..fd027b101de5 100644 --- a/arch/arm64/kernel/module.c +++ b/arch/arm64/kernel/module.c @@ -26,6 +26,7 @@  #include <linux/moduleloader.h>  #include <linux/vmalloc.h>  #include <asm/insn.h> +#include <asm/sections.h>  #define	AARCH64_INSN_IMM_MOVNZ		AARCH64_INSN_IMM_MAX  #define	AARCH64_INSN_IMM_MOVK		AARCH64_INSN_IMM_16 @@ -394,3 +395,20 @@ overflow:  	       me->name, (int)ELF64_R_TYPE(rel[i].r_info), val);  	return -ENOEXEC;  } + +int module_finalize(const Elf_Ehdr *hdr, +		    const Elf_Shdr *sechdrs, +		    struct module *me) +{ +	const Elf_Shdr *s, *se; +	const char *secstrs = (void *)hdr + sechdrs[hdr->e_shstrndx].sh_offset; + +	for (s = sechdrs, se = sechdrs + hdr->e_shnum; s < se; s++) { +		if (strcmp(".altinstructions", secstrs + s->sh_name) == 0) { +			apply_alternatives((void *)s->sh_addr, s->sh_size); +			return 0; +		} +	} + +	return 0; +}  |