aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/kernel/exceptions-64e.S
diff options
context:
space:
mode:
authorJack Miller <jack@codezen.org>2011-04-14 18:32:05 -0400
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>2011-04-26 23:02:16 -0400
commitf0aae3238fc1c28b543cbaaa0e7c5d57685f5f89 (patch)
tree7d2f01cebc6ac4079fc069b96ea823a235cfbe7e /arch/powerpc/kernel/exceptions-64e.S
parent1a51dde139d5305b2592c716c50c005d6ab9624b (diff)
powerpc/book3e: Flush IPROT protected TLB entries leftover by firmware
When we set up the TLB for ourselves on Book3E, we need to flush out any old mappings established by the firmware or bootloader. At present we attempt this with a tlbilx to flush everything, but this will leave behind any entries with the IPROT bit set. There are several good reason firmware might establish mappings with IPROT, and in fact ePAPR compliant firmwares are required to establish their initial mapped area with IPROT. This patch, therefore adds more complex code to scan through the TLB upon entry and flush away any entries that are not our own. Signed-off-by: Jack Miller <jack@codezen.org> Signed-off-by: David Gibson <david@gibson.dropbear.id.au> Signed-off-by: Michael Ellerman <michael@ellerman.id.au> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Diffstat (limited to 'arch/powerpc/kernel/exceptions-64e.S')
-rw-r--r--arch/powerpc/kernel/exceptions-64e.S45
1 files changed, 44 insertions, 1 deletions
diff --git a/arch/powerpc/kernel/exceptions-64e.S b/arch/powerpc/kernel/exceptions-64e.S
index 8fe0fc233f02..23bd83b20be4 100644
--- a/arch/powerpc/kernel/exceptions-64e.S
+++ b/arch/powerpc/kernel/exceptions-64e.S
@@ -886,8 +886,51 @@ have_hes:
886 bctr 886 bctr
887 887
8881: /* We are now running at PAGE_OFFSET, clean the TLB of everything 8881: /* We are now running at PAGE_OFFSET, clean the TLB of everything
889 * else (XXX we should scan for bolted crap from the firmware too) 889 * else (including IPROTed things left by firmware)
890 * r4 = TLBnCFG
891 * r3 = current address (more or less)
890 */ 892 */
893
894 li r5,0
895 mtspr SPRN_MAS6,r5
896 tlbsx 0,r3
897
898 rlwinm r9,r4,0,TLBnCFG_N_ENTRY
899 rlwinm r10,r4,8,0xff
900 addi r10,r10,-1 /* Get inner loop mask */
901
902 li r3,1
903
904 mfspr r5,SPRN_MAS1
905 rlwinm r5,r5,0,(~(MAS1_VALID|MAS1_IPROT))
906
907 mfspr r6,SPRN_MAS2
908 rldicr r6,r6,0,51 /* Extract EPN */
909
910 mfspr r7,SPRN_MAS0
911 rlwinm r7,r7,0,0xffff0fff /* Clear HES and WQ */
912
913 rlwinm r8,r7,16,0xfff /* Extract ESEL */
914
9152: add r4,r3,r8
916 and r4,r4,r10
917
918 rlwimi r7,r4,16,MAS0_ESEL_MASK
919
920 mtspr SPRN_MAS0,r7
921 mtspr SPRN_MAS1,r5
922 mtspr SPRN_MAS2,r6
923 tlbwe
924
925 addi r3,r3,1
926 and. r4,r3,r10
927
928 bne 3f
929 addis r6,r6,(1<<30)@h
9303:
931 cmpw r3,r9
932 blt 2b
933
891 PPC_TLBILX(0,0,0) 934 PPC_TLBILX(0,0,0)
892 sync 935 sync
893 isync 936 isync