diff options
| author | Mark Brown <[email protected]> | 2015-10-12 18:09:27 +0100 | 
|---|---|---|
| committer | Mark Brown <[email protected]> | 2015-10-12 18:09:27 +0100 | 
| commit | 79828b4fa835f73cdaf4bffa48696abdcbea9d02 (patch) | |
| tree | 5e0fa7156acb75ba603022bc807df8f2fedb97a8 /arch/mips/include/asm/stackframe.h | |
| parent | 721b51fcf91898299d96f4b72cb9434cda29dce6 (diff) | |
| parent | 8c1a9d6323abf0fb1e5dad96cf3f1c783505ea5a (diff) | |
Merge remote-tracking branch 'asoc/fix/rt5645' into asoc-fix-rt5645
Diffstat (limited to 'arch/mips/include/asm/stackframe.h')
| -rw-r--r-- | arch/mips/include/asm/stackframe.h | 25 | 
1 files changed, 25 insertions, 0 deletions
diff --git a/arch/mips/include/asm/stackframe.h b/arch/mips/include/asm/stackframe.h index 28d6d9364bd1..a71da576883c 100644 --- a/arch/mips/include/asm/stackframe.h +++ b/arch/mips/include/asm/stackframe.h @@ -152,6 +152,31 @@  		.set	noreorder  		bltz	k0, 8f  		 move	k1, sp +#ifdef CONFIG_EVA +		/* +		 * Flush interAptiv's Return Prediction Stack (RPS) by writing +		 * EntryHi. Toggling Config7.RPS is slower and less portable. +		 * +		 * The RPS isn't automatically flushed when exceptions are +		 * taken, which can result in kernel mode speculative accesses +		 * to user addresses if the RPS mispredicts. That's harmless +		 * when user and kernel share the same address space, but with +		 * EVA the same user segments may be unmapped to kernel mode, +		 * even containing sensitive MMIO regions or invalid memory. +		 * +		 * This can happen when the kernel sets the return address to +		 * ret_from_* and jr's to the exception handler, which looks +		 * more like a tail call than a function call. If nested calls +		 * don't evict the last user address in the RPS, it will +		 * mispredict the return and fetch from a user controlled +		 * address into the icache. +		 * +		 * More recent EVA-capable cores with MAAR to restrict +		 * speculative accesses aren't affected. +		 */ +		MFC0	k0, CP0_ENTRYHI +		MTC0	k0, CP0_ENTRYHI +#endif  		.set	reorder  		/* Called from user mode, new stack. */  		get_saved_sp  |