Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch/mips/mips Add/move some COP0_SYNC. increment tlb m...
details: https://anonhg.NetBSD.org/src/rev/03c9882b0267
branches: trunk
changeset: 764656:03c9882b0267
user: matt <matt%NetBSD.org@localhost>
date: Fri Apr 29 22:16:49 2011 +0000
description:
Add/move some COP0_SYNC. increment tlb miss counter on mips3 and mips64r2
#ifdef MIPS3 / #endif more nops
diffstat:
sys/arch/mips/mips/mipsX_subr.S | 62 ++++++++++++++++++++--------------------
1 files changed, 31 insertions(+), 31 deletions(-)
diffs (190 lines):
diff -r b49d02d0e0b8 -r 03c9882b0267 sys/arch/mips/mips/mipsX_subr.S
--- a/sys/arch/mips/mips/mipsX_subr.S Fri Apr 29 22:14:59 2011 +0000
+++ b/sys/arch/mips/mips/mipsX_subr.S Fri Apr 29 22:16:49 2011 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: mipsX_subr.S,v 1.45 2011/04/14 09:25:05 matt Exp $ */
+/* $NetBSD: mipsX_subr.S,v 1.46 2011/04/29 22:16:49 matt Exp $ */
/*
* Copyright 2002 Wasabi Systems, Inc.
@@ -162,11 +162,14 @@
#if (MIPS3 + MIPS64 + MIPS64R2) > 0
#define USE_64BIT_INSTRUCTIONS
#define USE_64BIT_CP0_FUNCTIONS
+#elif (MIPS32 + MIPS32R2) > 0
+#ifdef _LP64
+#error MIPS32 and MIPS32R2 can't run 64-bit kernels.
#endif
-
-#if (MIPS32 + MIPS32R2) > 0
#undef USE_64BIT_INSTRUCTIONS
#undef USE_64BIT_CP0_FUNCTIONS
+#else
+#error One of MIPS{3,32,32R2,64,64R2} must be defined
#endif
#ifdef _LP64
@@ -355,20 +358,19 @@
_SLL k1, WIRED_SHIFT #14: chop top 2 bits (part 2a)
_SRL k1, WIRED_SHIFT #15: chop top 2 bits (part 2b)
_MTC0 k1, MIPS_COP_0_TLB_LO1 #16: lo1 is loaded
- nop #17: standard nop
+ sll $0, $0, 3 #17: standard nop (ehb)
+#ifdef MIPS3
nop #18: extra nop for QED5230
+#endif
tlbwr #19: write to tlb
-#ifdef MIPS64
- lui k1, %hi(CPUVAR(EV_TLBMISSES)) #01: k1=hi of tlbmisses
- REG_L k0, %lo(CPUVAR(EV_TLBMISSES))(k1)
- REG_ADDU k0, 1
- REG_S k0, %lo(CPUVAR(EV_TLBMISSES))(k1)
-#else
- nop #1a: standard nop
- nop #1b: needed by R4000/4400
- nop #1c: needed by R4000/4400
+ sll $0, $0, 3 #1a: standard nop (ehb)
+#if (MIPS3 + MIPS64 + MIPS64R2) > 0
+ lui k1, %hi(CPUVAR(EV_TLBMISSES)) #1b: k1=hi of tlbmisses
+ REG_L k0, %lo(CPUVAR(EV_TLBMISSES))(k1) #1c
+ REG_ADDU k0, 1 #1d
+ REG_S k0, %lo(CPUVAR(EV_TLBMISSES))(k1) #1e
#endif
- eret #1d: return from exception
+ eret #1f: return from exception
.set at
_VECTOR_END(MIPSX(tlb_miss))
@@ -1586,7 +1588,7 @@
dsll32 k1, k1, 0
#endif
bgez k0, _C_LABEL(MIPSX(kern_gen_exception)) # full trap processing
- nop
+ nop # - delay slot -
PTR_SUBU k0, k1
INT_L k1, _C_LABEL(Sysmapsize) # index within range?
PTR_SRL k0, PGSHIFT
@@ -1604,7 +1606,7 @@
nop
#endif
bltz k0, _C_LABEL(MIPSX(kern_gen_exception)) # ASSERT(TLB entry exists)
- nop
+ nop # - delay slot -
and k0, k1, 4 # check even/odd page
#ifdef MIPS3
@@ -1614,7 +1616,6 @@
nop
INT_L k0, 0(k1) # get PTE entry
-
_SLL k0, k0, WIRED_SHIFT # get rid of "wired" bit
_SRL k0, k0, WIRED_SHIFT
_MTC0 k0, MIPS_COP_0_TLB_LO0 # load PTE entry
@@ -1624,7 +1625,8 @@
nop # required for QED5230
#endif
beqz k0, _C_LABEL(MIPSX(kern_gen_exception)) # PTE invalid
- nop
+ nop # - delay slot -
+
INT_L k0, 4(k1) # get odd PTE entry
_SLL k0, k0, WIRED_SHIFT
mfc0 k1, MIPS_COP_0_TLB_INDEX
@@ -1647,7 +1649,6 @@
MIPSX(kern_tlbi_odd):
INT_L k0, 0(k1) # get PTE entry
-
_SLL k0, k0, WIRED_SHIFT # get rid of wired bit
_SRL k0, k0, WIRED_SHIFT
_MTC0 k0, MIPS_COP_0_TLB_LO1 # save PTE entry
@@ -1657,7 +1658,8 @@
nop # required for QED5230
#endif
beqz k0, _C_LABEL(MIPSX(kern_gen_exception)) # PTE invalid
- nop
+ nop # - delay slot -
+
INT_L k0, -4(k1) # get even PTE entry
_SLL k0, k0, WIRED_SHIFT
mfc0 k1, MIPS_COP_0_TLB_INDEX
@@ -1766,7 +1768,6 @@
#ifdef MIPS3
nop # required for QED5230
#endif
-
tlbr # read the entry first
COP0_SYNC
_MTC0 a1, MIPS_COP_0_TLB_LO1 # init low reg1.
@@ -1841,7 +1842,6 @@
_MFC0 ta0, MIPS_COP_0_TLB_LO0 # See what we got
_MFC0 ta1, MIPS_COP_0_TLB_LO1 # See what we got
_MTC0 t0, MIPS_COP_0_TLB_HI # restore PID
- COP0_SYNC
mtc0 ta2, MIPS_COP_0_TLB_PG_MASK # restore pgMask
COP0_SYNC
mtc0 v1, MIPS_COP_0_STATUS # Restore the status register
@@ -1874,8 +1874,6 @@
tlbp # probe the entry in question
COP0_SYNC
mfc0 v0, MIPS_COP_0_TLB_INDEX # see what we got
- #nop # -slip-
- #nop # -slip-
bltz v0, 1f # index < 0 then skip
li t1, MIPS_KSEG0_START # invalid address
PTR_SLL v0, PGSHIFT + 1 # PAGE_SHIFT + 1
@@ -1883,20 +1881,21 @@
_MTC0 t1, MIPS_COP_0_TLB_HI # make entryHi invalid
_MTC0 zero, MIPS_COP_0_TLB_LO0 # zero out entryLo0
_MTC0 zero, MIPS_COP_0_TLB_LO1 # zero out entryLo1
- COP0_SYNC
-#if 1
- nop
-#else
+#if 0
mtc0 zero, MIPS_COP_0_TLB_PG_MASK # zero out pageMask
#endif
COP0_SYNC
+#ifdef MIPS3
nop
nop
+#endif
tlbwi
COP0_SYNC
+#ifdef MIPS3
nop
nop
+#endif
1:
_MTC0 t0, MIPS_COP_0_TLB_HI # restore current ASID
mtc0 t3, MIPS_COP_0_TLB_PG_MASK # restore pgMask
@@ -2049,6 +2048,7 @@
_MTC0 t0, MIPS_COP_0_TLB_HI # restore ASID
mtc0 t2, MIPS_COP_0_TLB_PG_MASK # restore pgMask
+ COP0_SYNC
mtc0 v1, MIPS_COP_0_STATUS # restore status register
JR_HB_RA
END(MIPSX(tlb_invalidate_all))
@@ -2143,6 +2143,7 @@
and t3, a2, MIPS3_PG_G # make prototype tlb_lo1
tlbp # is va in TLB?
+ COP0_SYNC
mfc0 v0, MIPS_COP_0_TLB_INDEX # was it in the TLB?
bltz v0, 1f # nope
@@ -2170,9 +2171,8 @@
COP0_SYNC
and t0, a2, MIPS3_PG_G # make prototype tlb_lo
- mtc0 t0, MIPS_COP_0_TLB_LO0 # use an invalid tlb_lo
- COP0_SYNC
- mtc0 t0, MIPS_COP_0_TLB_LO1 # use an invalid tlb_lo
+ mtc0 t0, MIPS_COP_0_TLB_LO0 # use an invalid tlb_lo0
+ mtc0 t0, MIPS_COP_0_TLB_LO1 # use an invalid tlb_lo1
COP0_SYNC
tlbwi # now write the invalid TLB
Home |
Main Index |
Thread Index |
Old Index