diff options
Diffstat (limited to 'arch/powerpc/lib/feature-fixups.c')
| -rw-r--r-- | arch/powerpc/lib/feature-fixups.c | 35 | 
1 files changed, 34 insertions, 1 deletions
| diff --git a/arch/powerpc/lib/feature-fixups.c b/arch/powerpc/lib/feature-fixups.c index 8b69f868298c..e613b02bb2f0 100644 --- a/arch/powerpc/lib/feature-fixups.c +++ b/arch/powerpc/lib/feature-fixups.c @@ -304,6 +304,9 @@ void do_barrier_nospec_fixups_range(bool enable, void *fixup_start, void *fixup_  	printk(KERN_DEBUG "barrier-nospec: patched %d locations\n", i);  } +#endif /* CONFIG_PPC_BOOK3S_64 */ + +#ifdef CONFIG_PPC_BARRIER_NOSPEC  void do_barrier_nospec_fixups(bool enable)  {  	void *start, *end; @@ -313,8 +316,38 @@ void do_barrier_nospec_fixups(bool enable)  	do_barrier_nospec_fixups_range(enable, start, end);  } +#endif /* CONFIG_PPC_BARRIER_NOSPEC */ -#endif /* CONFIG_PPC_BOOK3S_64 */ +#ifdef CONFIG_PPC_FSL_BOOK3E +void do_barrier_nospec_fixups_range(bool enable, void *fixup_start, void *fixup_end) +{ +	unsigned int instr[2], *dest; +	long *start, *end; +	int i; + +	start = fixup_start; +	end = fixup_end; + +	instr[0] = PPC_INST_NOP; +	instr[1] = PPC_INST_NOP; + +	if (enable) { +		pr_info("barrier-nospec: using isync; sync as speculation barrier\n"); +		instr[0] = PPC_INST_ISYNC; +		instr[1] = PPC_INST_SYNC; +	} + +	for (i = 0; start < end; start++, i++) { +		dest = (void *)start + *start; + +		pr_devel("patching dest %lx\n", (unsigned long)dest); +		patch_instruction(dest, instr[0]); +		patch_instruction(dest + 1, instr[1]); +	} + +	printk(KERN_DEBUG "barrier-nospec: patched %d locations\n", i); +} +#endif /* CONFIG_PPC_FSL_BOOK3E */  void do_lwsync_fixups(unsigned long value, void *fixup_start, void *fixup_end)  { |