aboutsummaryrefslogtreecommitdiff
path: root/arch/powerpc/mm/slb_low.S
diff options
context:
space:
mode:
authorAlex Shi <alex.shi@linaro.org>2017-06-30 14:26:00 +0800
committerAlex Shi <alex.shi@linaro.org>2017-06-30 14:26:00 +0800
commit267aa95e09eec438abf8979b58cded5cbc5586cb (patch)
tree7401fc52691565f31c0ad96a94a7a54971cc6e6a /arch/powerpc/mm/slb_low.S
parentd87abdcbf8871b5ee58083b3bdf216ba406224b9 (diff)
parent6ee496d7218aeccffe5380cb65e9d50d1a61c323 (diff)
Merge tag 'v4.4.75' into linux-linaro-lsk-v4.4lsk-v4.4-17.06
This is the 4.4.75 stable release
Diffstat (limited to 'arch/powerpc/mm/slb_low.S')
-rw-r--r--arch/powerpc/mm/slb_low.S10
1 files changed, 10 insertions, 0 deletions
diff --git a/arch/powerpc/mm/slb_low.S b/arch/powerpc/mm/slb_low.S
index 4c48b487698c..0b48ce40d351 100644
--- a/arch/powerpc/mm/slb_low.S
+++ b/arch/powerpc/mm/slb_low.S
@@ -179,6 +179,16 @@ END_MMU_FTR_SECTION_IFSET(MMU_FTR_1T_SEGMENT)
b slb_finish_load
8: /* invalid EA */
+ /*
+ * It's possible the bad EA is too large to fit in the SLB cache, which
+ * would mean we'd fail to invalidate it on context switch. So mark the
+ * SLB cache as full so we force a full flush. We also set cr7+eq to
+ * mark the address as a kernel address, so slb_finish_load() skips
+ * trying to insert it into the SLB cache.
+ */
+ li r9,SLB_CACHE_ENTRIES + 1
+ sth r9,PACASLBCACHEPTR(r13)
+ crset 4*cr7+eq
li r10,0 /* BAD_VSID */
li r9,0 /* BAD_VSID */
li r11,SLB_VSID_USER /* flags don't much matter */