Module Name: src
Committed By: matt
Date: Thu May 26 01:46:41 UTC 2011
Modified Files:
src/sys/arch/mips/mips [matt-nb5-mips64]: mipsX_subr.S
Log Message:
Use some mipsNNr2 instructions to extract the non-wired bits from a pte.
(Saves on instruction per use).
To generate a diff of this commit:
cvs rdiff -u -r1.26.36.1.2.40 -r1.26.36.1.2.41 \
src/sys/arch/mips/mips/mipsX_subr.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/mips/mips/mipsX_subr.S
diff -u src/sys/arch/mips/mips/mipsX_subr.S:1.26.36.1.2.40 src/sys/arch/mips/mips/mipsX_subr.S:1.26.36.1.2.41
--- src/sys/arch/mips/mips/mipsX_subr.S:1.26.36.1.2.40 Fri Apr 29 08:26:28 2011
+++ src/sys/arch/mips/mips/mipsX_subr.S Thu May 26 01:46:40 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: mipsX_subr.S,v 1.26.36.1.2.40 2011/04/29 08:26:28 matt Exp $ */
+/* $NetBSD: mipsX_subr.S,v 1.26.36.1.2.41 2011/05/26 01:46:40 matt Exp $ */
/*
* Copyright 2002 Wasabi Systems, Inc.
@@ -181,11 +181,17 @@
#if defined(USE_64BIT_CP0_FUNCTIONS)
#define _SLL dsll
#define _SRL dsrl
+#define _EXT dext
+#define _INS dins
#define WIRED_SHIFT 34
+#define WIRED_POS 30
#else
#define _SLL sll
#define _SRL srl
+#define _EXT ext
+#define _INS ins
#define WIRED_SHIFT 2
+#define WIRED_POS 30
#endif
/*
@@ -329,7 +335,7 @@
.set noat
_MFC0 k0, MIPS_COP_0_BAD_VADDR #00: k0=bad address
lui k1, %hi(CPUVAR(PMAP_SEG0TAB)) #01: k1=hi of seg0tab
- bltz k0, MIPSX(kernelfault) #02: k0<0 -> 4f (kernel fault)
+ bltz k0, MIPSX(kernelfault) #02: k0<0 -> kernel fault
PTR_SRL k0, 1*(PGSHIFT-PTR_SCALESHIFT)+(PGSHIFT-2)#03: k0=seg offset (almost)
PTR_L k1, %lo(CPUVAR(PMAP_SEG0TAB))(k1)#04: k1=seg0tab
MIPSX(tlb_miss_common):
@@ -341,17 +347,32 @@
PTR_ADDU k1, k0 #08: k1=seg entry address
PTR_L k1, 0(k1) #09: k1=seg entry
_MFC0 k0, MIPS_COP_0_BAD_VADDR #0a: k0=bad address (again)
+#if (MIPS32R2 + MIPS64R2) > 0
+ beqz k1, MIPSX(nopagetable) #0b: ==0 -- no page table
+ _EXT k0, k0, PGSHIFT+1, PGSHIFT-3 #0c: k0=VA[13:21]
+ _INS k1, k0, 3, PGSHIFT-3 #0d: k0=page table index
+ #0d: k1=pte address
+#else
beqz k1, MIPSX(nopagetable) #0b: ==0 -- no page table
PTR_SRL k0, (PGSHIFT-2) #0c: k0=VPN (aka va>>10)
andi k0, (NBPG-8) #0d: k0=page table offset
PTR_ADDU k1, k0 #0e: k1=pte address
+#endif
INT_L k0, 0(k1) #0f: k0=lo0 pte
INT_L k1, 4(k1) #10: k1=lo1 pte
+#if (MIPS32R2 + MIPS64R2) > 0
+ _EXT k0, k0, 0, WIRED_POS
+#else
_SLL k0, WIRED_SHIFT #11: chop top 2 bits (part 1a)
_SRL k0, WIRED_SHIFT #12: chop top 2 bits (part 1b)
+#endif
_MTC0 k0, MIPS_COP_0_TLB_LO0 #13: lo0 is loaded
+#if (MIPS32R2 + MIPS64R2) > 0
+ _EXT k1, k1, 0, WIRED_POS
+#else
_SLL k1, WIRED_SHIFT #14: chop top 2 bits (part 2a)
_SRL k1, WIRED_SHIFT #15: chop top 2 bits (part 2b)
+#endif
_MTC0 k1, MIPS_COP_0_TLB_LO1 #16: lo1 is loaded
sll $0, $0, 3 #17: standard nop (ehb)
#ifdef MIPS3
@@ -1527,13 +1548,20 @@
PTR_ADDU k1, k0
INT_L k0, 0(k1) # get PTE entry
INT_L k1, 4(k1) # get odd PTE entry
+#if (MIPS32R2 + MIPS64R2) > 0
+ _EXT k0, k0, 0, WIRED_POS # get rid of "wired" bit
+#else
_SLL k0, k0, WIRED_SHIFT # get rid of "wired" bit
_SRL k0, k0, WIRED_SHIFT
+#endif
_MTC0 k0, MIPS_COP_0_TLB_LO0 # load PTE entry
- COP0_SYNC
+#if (MIPS32R2 + MIPS64R2) > 0
+ _EXT k1, k1, 0, WIRED_POS
+#else
_SLL k1, k1, WIRED_SHIFT
_SRL k1, k1, WIRED_SHIFT
_MTC0 k1, MIPS_COP_0_TLB_LO1 # load PTE entry
+#endif
COP0_SYNC
tlbwr # write random TLB
COP0_SYNC
@@ -1607,8 +1635,12 @@
nop
INT_L k0, 0(k1) # get PTE entry
+#if (MIPS32R2 + MIPS64R2) > 0
+ _EXT k0, k0, 0, WIRED_POS
+#else
_SLL k0, k0, WIRED_SHIFT # get rid of "wired" bit
_SRL k0, k0, WIRED_SHIFT
+#endif
_MTC0 k0, MIPS_COP_0_TLB_LO0 # load PTE entry
COP0_SYNC
and k0, k0, MIPS3_PG_V # check for valid entry
@@ -1619,9 +1651,13 @@
nop # - delay slot -
INT_L k0, 4(k1) # get odd PTE entry
- _SLL k0, k0, WIRED_SHIFT
mfc0 k1, MIPS_COP_0_TLB_INDEX
+#if (MIPS32R2 + MIPS64R2) > 0
+ _EXT k0, k0, 0, WIRED_POS
+#else
+ _SLL k0, k0, WIRED_SHIFT
_SRL k0, k0, WIRED_SHIFT
+#endif
sltiu k1, k1, MIPS3_TLB_WIRED_UPAGES # Luckily this is MIPS3_PG_G
or k1, k1, k0
_MTC0 k0, MIPS_COP_0_TLB_LO1 # load PTE entry
@@ -1636,8 +1672,12 @@
MIPSX(kern_tlbi_odd):
INT_L k0, 0(k1) # get PTE entry
+#if (MIPS32R2 + MIPS64R2) > 0
+ _EXT k0, k0, 0, WIRED_POS
+#else
_SLL k0, k0, WIRED_SHIFT # get rid of wired bit
_SRL k0, k0, WIRED_SHIFT
+#endif
_MTC0 k0, MIPS_COP_0_TLB_LO1 # save PTE entry
COP0_SYNC
and k0, k0, MIPS3_PG_V # check for valid entry
@@ -1648,9 +1688,13 @@
nop # - delay slot -
INT_L k0, -4(k1) # get even PTE entry
- _SLL k0, k0, WIRED_SHIFT
mfc0 k1, MIPS_COP_0_TLB_INDEX
+#if (MIPS32R2 + MIPS64R2) > 0
+ _EXT k0, k0, 0, WIRED_POS
+#else
+ _SLL k0, k0, WIRED_SHIFT
_SRL k0, k0, WIRED_SHIFT
+#endif
sltiu k1, k1, MIPS3_TLB_WIRED_UPAGES # Luckily this is MIPS3_PG_G
or k1, k1, k0
_MTC0 k0, MIPS_COP_0_TLB_LO0 # save PTE entry
@@ -1722,8 +1766,12 @@
and a2, a1, MIPS3_PG_G # Copy global bit
tlbp # Probe for the entry.
COP0_SYNC
+#if (MIPS32R2 + MIPS64R2) > 0
+ _EXT a1, a1, 0, WIRED_POS
+#else
_SLL a1, a1, WIRED_SHIFT # Clear top 34 bits of EntryLo
_SRL a1, a1, WIRED_SHIFT
+#endif
mfc0 v0, MIPS_COP_0_TLB_INDEX # See what we got
bnez t1, 1f # Decide even odd
nop