Module Name: src
Committed By: palle
Date: Fri Jan 27 21:35:38 UTC 2017
Modified Files:
src/sys/arch/sparc64/sparc64: genassym.cf locore.s
Log Message:
sun4v: implement missing handling of itsb traps 0x008 and 0x009. Based on code
from OpenBSD. Tested using qemu.
To generate a diff of this commit:
cvs rdiff -u -r1.79 -r1.80 src/sys/arch/sparc64/sparc64/genassym.cf
cvs rdiff -u -r1.405 -r1.406 src/sys/arch/sparc64/sparc64/locore.s
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/sparc64/sparc64/genassym.cf
diff -u src/sys/arch/sparc64/sparc64/genassym.cf:1.79 src/sys/arch/sparc64/sparc64/genassym.cf:1.80
--- src/sys/arch/sparc64/sparc64/genassym.cf:1.79 Tue May 17 19:43:28 2016
+++ src/sys/arch/sparc64/sparc64/genassym.cf Fri Jan 27 21:35:38 2017
@@ -1,4 +1,4 @@
-# $NetBSD: genassym.cf,v 1.79 2016/05/17 19:43:28 palle Exp $
+# $NetBSD: genassym.cf,v 1.80 2017/01/27 21:35:38 palle Exp $
#
# Copyright (c) 1997 The NetBSD Foundation, Inc.
@@ -149,6 +149,7 @@ export SUN4U_TTE_P
export SUN4U_TTE_EXEC
export SUN4V_TLB_ACCESS
export SUN4V_TLB_MODIFY
+export SUN4V_TLB_EXEC
export SUN4V_TLB_W
export SUN4V_TLB_TSB_LOCK
Index: src/sys/arch/sparc64/sparc64/locore.s
diff -u src/sys/arch/sparc64/sparc64/locore.s:1.405 src/sys/arch/sparc64/sparc64/locore.s:1.406
--- src/sys/arch/sparc64/sparc64/locore.s:1.405 Sat Jan 7 20:19:09 2017
+++ src/sys/arch/sparc64/sparc64/locore.s Fri Jan 27 21:35:38 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: locore.s,v 1.405 2017/01/07 20:19:09 palle Exp $ */
+/* $NetBSD: locore.s,v 1.406 2017/01/27 21:35:38 palle Exp $ */
/*
* Copyright (c) 2006-2010 Matthew R. Green
@@ -1076,7 +1076,10 @@ _C_LABEL(trapbase_sun4v):
!
! trap level 0
!
- sun4v_trap_entry 36 ! 0x000-0x023
+ sun4v_trap_entry 8 ! 0x000-0x007
+ VTRAP(T_INST_EXCEPT, sun4v_tl0_itsb_miss) ! 0x008 - inst except
+ VTRAP(T_TEXTFAULT, sun4v_tl0_itsb_miss) ! 0x009 - inst MMU miss
+ sun4v_trap_entry 26 ! 0x00a-0x023
CLEANWIN0 ! 0x24-0x27 = clean window
sun4v_trap_entry 9 ! 0x028-0x030
VTRAP(T_DATA_MMU_MISS, sun4v_dtsb_miss) ! 0x031 = data MMU miss
@@ -2819,7 +2822,7 @@ sun4v_dtsb_miss:
btst SUN4V_TLB_ACCESS, %g4 ! Need to update access bit?
bne,pt %xcc, 2f
nop
- casxa [%g6] ASI_PHYS_CACHED, %g4, %g7 ! and write it out
+ casxa [%g6] ASI_PHYS_CACHED, %g4, %g7 ! and write it out
cmp %g4, %g7
bne,pn %xcc, 1b
or %g4, SUN4V_TLB_ACCESS, %g4 ! Update the access bit
@@ -2845,8 +2848,8 @@ sun4v_dtsb_miss:
membar #StoreStore
- STPTR %g4, [%g2 + 8] ! store TTE data
- STPTR %g1, [%g2] ! store TTE tag
+ STPTR %g4, [%g2 + 8] ! store TTE data
+ STPTR %g1, [%g2] ! store TTE tag
retry
NOTREACHED
@@ -3007,6 +3010,139 @@ sun4v_tl0_dtsb_prot:
retry
NOTREACHED
+
+sun4v_tl0_itsb_miss:
+ GET_MMFSA %g1 ! MMU Fault status area
+ add %g1, 0x8, %g3
+ LDPTRA [%g3] ASI_PHYS_CACHED, %g3 ! Instruction fault address
+ add %g1, 0x10, %g6
+ LDPTRA [%g6] ASI_PHYS_CACHED, %g6 ! Data fault context
+
+ GET_CTXBUSY %g4
+ sllx %g6, 3, %g6 ! Make it into an offset into ctxbusy
+ LDPTR [%g4 + %g6], %g4 ! Load up our page table.
+
+ srax %g3, HOLESHIFT, %g5 ! Check for valid address
+ brz,pt %g5, 0f ! Should be zero or -1
+ inc %g5 ! Make -1 -> 0
+ brnz,pn %g5, sun4v_texttrap ! Error! In hole!
+0:
+ srlx %g3, STSHIFT, %g6
+ and %g6, STMASK, %g6 ! Index into pm_segs
+ sll %g6, 3, %g6
+ add %g4, %g6, %g4
+ LDPTRA [%g4] ASI_PHYS_CACHED, %g4 ! Load page directory pointer
+
+ srlx %g3, PDSHIFT, %g6
+ and %g6, PDMASK, %g6
+ sll %g6, 3, %g6
+ brz,pn %g4, sun4v_texttrap ! NULL entry? check somewhere else
+ add %g4, %g6, %g4
+ LDPTRA [%g4] ASI_PHYS_CACHED, %g4 ! Load page table pointer
+
+ srlx %g3, PTSHIFT, %g6 ! Convert to ptab offset
+ and %g6, PTMASK, %g6
+ sll %g6, 3, %g6
+ brz,pn %g4, sun4v_texttrap ! NULL entry? check somewhere else
+ add %g4, %g6, %g6
+1:
+ LDPTRA [%g6] ASI_PHYS_CACHED, %g4 ! Fetch TTE
+ brgez,pn %g4, sun4v_texttrap ! Entry invalid? Punt
+ or %g4, SUN4V_TLB_ACCESS, %g7 ! Update the access bit
+
+ btst SUN4V_TLB_EXEC, %g4 ! Need to update exec bit?
+ bz,pn %xcc, sun4v_texttrap
+ nop
+ btst SUN4V_TLB_ACCESS, %g4 ! Need to update access bit?
+ bne,pt %xcc, 2f
+ nop
+ casxa [%g6] ASI_PHYS_CACHED, %g4, %g7 ! and write it out
+ cmp %g4, %g7
+ bne,pn %xcc, 1b
+ or %g4, SUN4V_TLB_ACCESS, %g4 ! Update the modified bit
+2:
+ GET_TSB_DMMU %g2
+
+ mov %g1, %g7
+ /* Construct TSB tag word. */
+ add %g1, 0x10, %g6
+ LDPTRA [%g6] ASI_PHYS_CACHED, %g6 ! Instruction fault context
+ mov %g3, %g1 ! Instruction fault address
+ srlx %g1, 22, %g1 ! 63..22 of virt addr
+ sllx %g6, 48, %g6 ! context_id in 63..48
+ or %g1, %g6, %g1 ! construct TTE tag
+
+ srlx %g3, PTSHIFT, %g3
+ sethi %hi(_C_LABEL(tsbsize)), %g5
+ mov 512, %g6
+ ld [%g5 + %lo(_C_LABEL(tsbsize))], %g5
+ sllx %g6, %g5, %g5 ! %g5 = 512 << tsbsize = TSBENTS
+ sub %g5, 1, %g5 ! TSBENTS -> offset
+ and %g3, %g5, %g3 ! mask out TTE index
+ sllx %g3, 4, %g3 ! TTE size is 16 bytes
+ add %g2, %g3, %g2 ! location of TTE in ci_tsb_dmmu (FIXME ci_tsb_immu?)
+
+ membar #StoreStore
+ STPTR %g4, [%g2 + 8] ! store TTE data
+ stx %g1, [%g2] ! store TTE tag
+
+ retry
+ NOTREACHED
+
+sun4v_texttrap:
+ GET_MMFSA %g3 ! MMU Fault status area
+ add %g3, 0x08, %g1
+ LDPTRA [%g1] ASI_PHYS_CACHED, %g1 ! Instruction fault address
+ add %g3, 0x10, %g2
+ LDPTRA [%g2] ASI_PHYS_CACHED, %g2 ! Instruction fault context
+
+ TRAP_SETUP(-CC64FSZ-TF_SIZE)
+
+ or %g1, %g2, %o2
+ clr %o3
+
+ rdpr %tt, %g4
+ rdpr %tstate, %g1
+ rdpr %tpc, %g2
+ rdpr %tnpc, %g3
+
+ stx %g1, [%sp + CC64FSZ + BIAS + TF_TSTATE]
+ mov %g4, %o1 ! (type)
+ stx %g2, [%sp + CC64FSZ + BIAS + TF_PC]
+ rd %y, %g5
+ stx %g3, [%sp + CC64FSZ + BIAS + TF_NPC]
+ st %g5, [%sp + CC64FSZ + BIAS + TF_Y]
+ sth %o1, [%sp + CC64FSZ + BIAS + TF_TT]! debug
+
+ ! Get back to normal globals
+ wrpr %g0, PSTATE_KERN, %pstate
+ NORMAL_GLOBALS_SUN4V
+
+ stx %g1, [%sp + CC64FSZ + BIAS + TF_G + (1*8)]
+ stx %g2, [%sp + CC64FSZ + BIAS + TF_G + (2*8)]
+ add %sp, CC64FSZ + BIAS, %o0 ! (&tf)
+ stx %g3, [%sp + CC64FSZ + BIAS + TF_G + (3*8)]
+ stx %g4, [%sp + CC64FSZ + BIAS + TF_G + (4*8)]
+ stx %g5, [%sp + CC64FSZ + BIAS + TF_G + (5*8)]
+ rdpr %pil, %g5
+ stx %g6, [%sp + CC64FSZ + BIAS + TF_G + (6*8)]
+ stx %g7, [%sp + CC64FSZ + BIAS + TF_G + (7*8)]
+ stb %g5, [%sp + CC64FSZ + BIAS + TF_PIL]
+ stb %g5, [%sp + CC64FSZ + BIAS + TF_OLDPIL]
+
+ /*
+ * Phew, ready to enable traps and call C code.
+ */
+ wrpr %g0, 0, %tl
+
+ wr %g0, ASI_PRIMARY_NOFAULT, %asi ! Restore default ASI
+ wrpr %g0, PSTATE_INTR, %pstate ! traps on again
+ call _C_LABEL(text_access_fault) ! text_access_fault(tf, type, ...)
+ nop
+
+ ba,a,pt %icc, return_from_trap
+ nop
+ NOTREACHED
/*
* End of traps for sun4v.