diff options
| author | Russell King <rmk+kernel@arm.linux.org.uk> | 2011-12-05 23:20:17 +0000 | 
|---|---|---|
| committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2011-12-05 23:20:17 +0000 | 
| commit | 742eaa6a6e356a16788ce6530271de89bc4f8fb5 (patch) | |
| tree | 12fc040daab06ac796c61c1d92bfad9bb054d1c1 /arch/sparc/kernel/module.c | |
| parent | ba8bb18a03f8c7508565c385576a5431a4ad804a (diff) | |
| parent | ae72fd588a2b302222769b44775912b83f0785eb (diff) | |
| download | olio-linux-3.10-742eaa6a6e356a16788ce6530271de89bc4f8fb5.tar.xz olio-linux-3.10-742eaa6a6e356a16788ce6530271de89bc4f8fb5.zip  | |
Merge branch 'for-rmk' of git://git.kernel.org/pub/scm/linux/kernel/git/will/linux into devel-stable
Conflicts:
	arch/arm/common/gic.c
	arch/arm/plat-omap/include/plat/common.h
Diffstat (limited to 'arch/sparc/kernel/module.c')
| -rw-r--r-- | arch/sparc/kernel/module.c | 27 | 
1 files changed, 27 insertions, 0 deletions
diff --git a/arch/sparc/kernel/module.c b/arch/sparc/kernel/module.c index da0c6c70ccb..e5519870c3d 100644 --- a/arch/sparc/kernel/module.c +++ b/arch/sparc/kernel/module.c @@ -17,6 +17,8 @@  #include <asm/processor.h>  #include <asm/spitfire.h> +#include "entry.h" +  #ifdef CONFIG_SPARC64  #include <linux/jump_label.h> @@ -203,6 +205,29 @@ int apply_relocate_add(Elf_Shdr *sechdrs,  }  #ifdef CONFIG_SPARC64 +static void do_patch_sections(const Elf_Ehdr *hdr, +			      const Elf_Shdr *sechdrs) +{ +	const Elf_Shdr *s, *sun4v_1insn = NULL, *sun4v_2insn = NULL; +	char *secstrings = (void *)hdr + sechdrs[hdr->e_shstrndx].sh_offset; + +	for (s = sechdrs; s < sechdrs + hdr->e_shnum; s++) { +		if (!strcmp(".sun4v_1insn_patch", secstrings + s->sh_name)) +			sun4v_1insn = s; +		if (!strcmp(".sun4v_2insn_patch", secstrings + s->sh_name)) +			sun4v_2insn = s; +	} + +	if (sun4v_1insn && tlb_type == hypervisor) { +		void *p = (void *) sun4v_1insn->sh_addr; +		sun4v_patch_1insn_range(p, p + sun4v_1insn->sh_size); +	} +	if (sun4v_2insn && tlb_type == hypervisor) { +		void *p = (void *) sun4v_2insn->sh_addr; +		sun4v_patch_2insn_range(p, p + sun4v_2insn->sh_size); +	} +} +  int module_finalize(const Elf_Ehdr *hdr,  		    const Elf_Shdr *sechdrs,  		    struct module *me) @@ -210,6 +235,8 @@ int module_finalize(const Elf_Ehdr *hdr,  	/* make jump label nops */  	jump_label_apply_nops(me); +	do_patch_sections(hdr, sechdrs); +  	/* Cheetah's I-cache is fully coherent.  */  	if (tlb_type == spitfire) {  		unsigned long va;  |