Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/arch/mips Use a 16kB USPACE (and larger kernel stack) fo...



details:   https://anonhg.NetBSD.org/src/rev/b9c6fd080f68
branches:  trunk
changeset: 937668:b9c6fd080f68
user:      simonb <simonb%NetBSD.org@localhost>
date:      Sun Aug 23 10:23:38 2020 +0000

description:
Use a 16kB USPACE (and larger kernel stack) for LP64 kernels.  Invert
the logic for setting the USPACE size.  Define a desired USPACE size
(16kB for LP64, 8kB otherwise) then divide by PAGE_SIZE to get UPAGES.

Fixes random segmap lossage, since the uarea usually sits immediately
above the segmap for a process.  Thanks to mrg@, skrll@ and dholland@
for testing, debugging and general help tracking down this problem.

diffstat:

 sys/arch/mips/include/mips_param.h |  16 +++++++++++-----
 sys/arch/mips/include/proc.h       |   4 ++--
 sys/arch/mips/mips/mipsX_subr.S    |  13 ++++++++-----
 sys/arch/mips/mips/vm_machdep.c    |   9 ++-------
 4 files changed, 23 insertions(+), 19 deletions(-)

diffs (117 lines):

diff -r 7ee02d06b600 -r b9c6fd080f68 sys/arch/mips/include/mips_param.h
--- a/sys/arch/mips/include/mips_param.h        Sun Aug 23 09:55:58 2020 +0000
+++ b/sys/arch/mips/include/mips_param.h        Sun Aug 23 10:23:38 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: mips_param.h,v 1.45 2020/07/26 08:08:41 simonb Exp $   */
+/*     $NetBSD: mips_param.h,v 1.46 2020/08/23 10:23:38 simonb Exp $   */
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -117,12 +117,18 @@
 #endif
 #define        NSEGPG          (1 << SEGLENGTH)
 
-#if PGSHIFT >= 13
-#define        UPAGES          1               /* pages of u-area */
+#ifdef _LP64
+#define        __MIN_USPACE    16384           /* LP64 needs a 16kB stack */
 #else
-#define        UPAGES          2               /* pages of u-area */
+/*
+ * Note for the non-LP64 case, cpu_switch_resume has the assumption
+ * that UPAGES == 2.  For MIPS-I we wire USPACE in TLB #0 and #1.
+ * For MIPS3+ we wire USPACE in the the TLB #0 pair.
+ */
+#define        __MIN_USPACE    8192            /* otherwise use an 8kB stack */
 #endif
-#define        USPACE          (UPAGES*NBPG)   /* size of u-area in bytes */
+#define        USPACE          MAX(__MIN_USPACE, PAGE_SIZE)
+#define        UPAGES          (USPACE / PAGE_SIZE) /* number of pages for u-area */
 #define        USPACE_ALIGN    USPACE          /* make sure it starts on a even VA */
 
 /*
diff -r 7ee02d06b600 -r b9c6fd080f68 sys/arch/mips/include/proc.h
--- a/sys/arch/mips/include/proc.h      Sun Aug 23 09:55:58 2020 +0000
+++ b/sys/arch/mips/include/proc.h      Sun Aug 23 10:23:38 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: proc.h,v 1.29 2020/07/26 08:08:41 simonb Exp $ */
+/*     $NetBSD: proc.h,v 1.30 2020/08/23 10:23:38 simonb Exp $ */
 
 /*
  * Copyright (c) 1992, 1993
@@ -52,7 +52,7 @@
        vaddr_t md_ss_addr;             /* single step address for ptrace */
        int     md_ss_instr;            /* single step instruction for ptrace */
        volatile int md_astpending;     /* AST pending on return to userland */
-       int     md_upte[2];             /* ptes for mapping u page */
+       int     md_upte[UPAGES];        /* ptes for mapping u page */
 };
 
 struct mdproc {
diff -r 7ee02d06b600 -r b9c6fd080f68 sys/arch/mips/mips/mipsX_subr.S
--- a/sys/arch/mips/mips/mipsX_subr.S   Sun Aug 23 09:55:58 2020 +0000
+++ b/sys/arch/mips/mips/mipsX_subr.S   Sun Aug 23 10:23:38 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: mipsX_subr.S,v 1.108 2020/06/13 12:53:42 simonb Exp $  */
+/*     $NetBSD: mipsX_subr.S,v 1.109 2020/08/23 10:23:38 simonb Exp $  */
 
 /*
  * Copyright 2002 Wasabi Systems, Inc.
@@ -2707,12 +2707,14 @@
  * 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.
+ * A TLB entry isn't used for the following cases:
+ *  - 16kB USPACE
+ *  - LP64 - USPACE is always accessed directly via XKPHYS
  */
 
 LEAF_NOPROFILE(MIPSX(cpu_switch_resume))
-#if (PGSHIFT < 14)
+#if !defined(_LP64)
+#if (PAGE_SIZE < 16384)
 #if (USPACE > PAGE_SIZE) || !defined(_LP64)
        INT_L   a1, L_MD_UPTE_0(a0)             # a1 = upte[0]
 #if (PGSHIFT & 1)
@@ -2789,7 +2791,8 @@
        COP0_SYNC
 MIPSX(resume):
 #endif /* (USPACE > PAGE_SIZE) || !defined(_LP64) */
-#endif /* PGSHIFT < 14 */
+#endif /* PAGE_SIZE < 16384 */
+#endif /* ! LP64 */
 #ifdef MIPSNNR2
        PTR_L   v0, L_PRIVATE(a0)               # get lwp private
        _MTC0   v0, MIPS_COP_0_USERLOCAL        # make available for rdhwr
diff -r 7ee02d06b600 -r b9c6fd080f68 sys/arch/mips/mips/vm_machdep.c
--- a/sys/arch/mips/mips/vm_machdep.c   Sun Aug 23 09:55:58 2020 +0000
+++ b/sys/arch/mips/mips/vm_machdep.c   Sun Aug 23 10:23:38 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: vm_machdep.c,v 1.161 2020/08/09 07:09:35 skrll Exp $   */
+/*     $NetBSD: vm_machdep.c,v 1.162 2020/08/23 10:23:38 simonb Exp $  */
 
 /*
  * Copyright (c) 1988 University of Utah.
@@ -39,7 +39,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vm_machdep.c,v 1.161 2020/08/09 07:09:35 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vm_machdep.c,v 1.162 2020/08/23 10:23:38 simonb Exp $");
 
 #include "opt_ddb.h"
 #include "opt_cputype.h"
@@ -120,11 +120,6 @@
                l2->l_md.md_upte[i] = 0;
        }
        if (!pmap_md_direct_mapped_vaddr_p(ua2)) {
-               /*
-                * UPAGES has to be 2 for 4KB PAGE_SIZE
-                * UPAGES has to be 1 for >= 8KB PAGE_SIZE
-                */
-               CTASSERT((PGSHIFT == 12) == (UPAGES == 2));
                pt_entry_t * const pte = pmap_pte_lookup(pmap_kernel(), ua2);
                const uint32_t x = MIPS_HAS_R4K_MMU
                    ? (MIPS3_PG_RO | MIPS3_PG_WIRED)



Home | Main Index | Thread Index | Old Index