Module Name: src
Committed By: skrll
Date: Tue Aug 9 09:06:31 UTC 2016
Modified Files:
src/sys/arch/mips/mips: mipsX_subr.S
Log Message:
Disable the USPACE cpu_switch_resume optimisation for 16KB PAGE_SIZE
Always check for existing TLB entry and remove it
Add a comment to say what's going on
To generate a diff of this commit:
cvs rdiff -u -r1.86 -r1.87 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.86 src/sys/arch/mips/mips/mipsX_subr.S:1.87
--- src/sys/arch/mips/mips/mipsX_subr.S:1.86 Tue Aug 9 08:59:08 2016
+++ src/sys/arch/mips/mips/mipsX_subr.S Tue Aug 9 09:06:31 2016
@@ -1,4 +1,4 @@
-/* $NetBSD: mipsX_subr.S,v 1.86 2016/08/09 08:59:08 skrll Exp $ */
+/* $NetBSD: mipsX_subr.S,v 1.87 2016/08/09 09:06:31 skrll Exp $ */
/*
* Copyright 2002 Wasabi Systems, Inc.
@@ -2713,15 +2713,28 @@ END(MIPSX(lwp_trampoline))
* Wiredown the USPACE of newproc in TLB entry#0. Check whether target
* USPACE is already in another place of TLB before that, and make
* sure TBIS(it) in the case.
+ *
+ * Disable the optimisation for PGSHIFT == 14 (aka ENABLE_MIPS_16KB_PAGE)
+ * as the code needs fixing for this case
+ *
+ * _LP64 with UPAGES == 1 is always direct mappable; everything else can have
+ * non-direct mappable USPACE.
*/
+
LEAF_NOPROFILE(MIPSX(cpu_switch_resume))
+#if (PGSHIFT < 14)
#if (USPACE > PAGE_SIZE) || !defined(_LP64)
INT_L a1, L_MD_UPTE_0(a0) # a1 = upte[0]
#if (PGSHIFT & 1)
+#if (USPACE > PAGE_SIZE)
+#error Unsupported
+#else
+ /* even/odd are contiguaous */
INT_ADD a2, a1, MIPS3_PG_NEXT # a2 = upper half
+#endif
#else
INT_L a2, L_MD_UPTE_1(a0) # a2 = upte[1]
-#endif
+#endif /* (PGSHIFT & 1) */
PTR_L v0, L_PCB(a0) # va = l->l_addr
#if VM_MIN_KERNEL_ADDRESS == MIPS_KSEG2_START
li t0, VM_MIN_KERNEL_ADDRESS # compute index
@@ -2750,7 +2763,7 @@ MIPSX(entry0):
#endif /* (PGSHIFT & 1) == 0 */
_MFC0 ta1, MIPS_COP_0_TLB_HI # save TLB_HI
_MTC0 v0, MIPS_COP_0_TLB_HI # VPN = va
-#if (PGSHIFT & 1) == 0
+
COP0_SYNC
tlbp # probe VPN
COP0_SYNC
@@ -2768,7 +2781,7 @@ MIPSX(entry0):
_MTC0 v0, MIPS_COP_0_TLB_HI # set VPN again
COP0_SYNC
MIPSX(entry0set):
-#endif /* (PGSHIFT & 1) == 0 */
+
#ifdef MULTIPROCESSOR
PTR_L t0, L_CPU(a0) # get cpu_info
INT_L t1, CPU_INFO_KSP_TLB_SLOT(t0) # get TLB# for KSP
@@ -2786,6 +2799,7 @@ MIPSX(entry0set):
COP0_SYNC
MIPSX(resume):
#endif /* (USPACE > PAGE_SIZE) || !defined(_LP64) */
+#endif /* PGSHIFT < 14 */
#ifdef MIPSNNR2
PTR_L v0, L_PRIVATE(a0) # get lwp private
_MTC0 v0, MIPS_COP_0_USERLOCAL # make available for rdhwr