diff options
Diffstat (limited to 'arch/x86/kernel/module.c')
| -rw-r--r-- | arch/x86/kernel/module.c | 9 | 
1 files changed, 8 insertions, 1 deletions
| diff --git a/arch/x86/kernel/module.c b/arch/x86/kernel/module.c index 5e9a34b5bd74..169fb6f4cd2e 100644 --- a/arch/x86/kernel/module.c +++ b/arch/x86/kernel/module.c @@ -251,7 +251,8 @@ int module_finalize(const Elf_Ehdr *hdr,  		    struct module *me)  {  	const Elf_Shdr *s, *text = NULL, *alt = NULL, *locks = NULL, -		*para = NULL, *orc = NULL, *orc_ip = NULL; +		*para = NULL, *orc = NULL, *orc_ip = NULL, +		*retpolines = NULL;  	char *secstrings = (void *)hdr + sechdrs[hdr->e_shstrndx].sh_offset;  	for (s = sechdrs; s < sechdrs + hdr->e_shnum; s++) { @@ -267,8 +268,14 @@ int module_finalize(const Elf_Ehdr *hdr,  			orc = s;  		if (!strcmp(".orc_unwind_ip", secstrings + s->sh_name))  			orc_ip = s; +		if (!strcmp(".retpoline_sites", secstrings + s->sh_name)) +			retpolines = s;  	} +	if (retpolines) { +		void *rseg = (void *)retpolines->sh_addr; +		apply_retpolines(rseg, rseg + retpolines->sh_size); +	}  	if (alt) {  		/* patch .altinstructions */  		void *aseg = (void *)alt->sh_addr; |