Source-Changes-HG archive

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

[src/trunk]: src/sys/arch/vax Rewrite the "emulate page reference bits" code ...



details:   https://anonhg.NetBSD.org/src/rev/ba3abb30f279
branches:  trunk
changeset: 473186:ba3abb30f279
user:      ragge <ragge%NetBSD.org@localhost>
date:      Sun May 23 23:03:44 1999 +0000

description:
Rewrite the "emulate page reference bits" code to avoid a bunch of
pv_lists traversal and unneccessary page faults.

diffstat:

 sys/arch/vax/include/pte.h |  13 +++----
 sys/arch/vax/vax/intvec.s  |  51 ++++++------------------------
 sys/arch/vax/vax/pmap.c    |  75 ++++++++++++++++++++++++---------------------
 3 files changed, 57 insertions(+), 82 deletions(-)

diffs (220 lines):

diff -r f1dc46c7ee68 -r ba3abb30f279 sys/arch/vax/include/pte.h
--- a/sys/arch/vax/include/pte.h        Sun May 23 22:56:53 1999 +0000
+++ b/sys/arch/vax/include/pte.h        Sun May 23 23:03:44 1999 +0000
@@ -1,4 +1,4 @@
-/*      $NetBSD: pte.h,v 1.11 1999/01/01 21:43:18 ragge Exp $      */
+/*      $NetBSD: pte.h,v 1.12 1999/05/23 23:03:44 ragge Exp $      */
 
 /*
  * Copyright (c) 1994 Ludd, University of Lule}, Sweden.
@@ -71,7 +71,7 @@
 #define PG_W            0x00400000
 #define PG_U            0x00200000
 #define PG_FRAME        0x001fffff
-#define        PG_PFNUM(x)     ((x) >> VAX_PGSHIFT)
+#define        PG_PFNUM(x)     (((unsigned long)(x) & 0x3ffffe00) >> VAX_PGSHIFT)
 
 #ifndef _LOCORE
 extern pt_entry_t *Sysmap;
@@ -80,13 +80,12 @@
  */
 #endif
 
-#define        kvtopte(va) \
-       (&Sysmap[((unsigned)(va) & ~KERNBASE) >> VAX_PGSHIFT])
+#define        kvtopte(va) (&Sysmap[PG_PFNUM(va)])
 #define        ptetokv(pt) \
        ((((pt_entry_t *)(pt) - Sysmap) << VAX_PGSHIFT) + 0x80000000)
 #define        kvtophys(va) \
        (((kvtopte(va))->pg_pfn << VAX_PGSHIFT) | ((int)(va) & VAX_PGOFSET))
 #define        uvtopte(va, pcb) \
-       (((unsigned)va < 0x40000000) || ((unsigned)va > 0x80000000) ? \
-       &((pcb->P0BR)[(unsigned)va >> VAX_PGSHIFT]) : \
-       &((pcb->P1BR)[((unsigned)va & 0x3fffffff) >> VAX_PGSHIFT]))
+       (((unsigned)va < 0x40000000) ? \
+       &((pcb->P0BR)[PG_PFNUM(va)]) : \
+       &((pcb->P1BR)[PG_PFNUM(va)]))
diff -r f1dc46c7ee68 -r ba3abb30f279 sys/arch/vax/vax/intvec.s
--- a/sys/arch/vax/vax/intvec.s Sun May 23 22:56:53 1999 +0000
+++ b/sys/arch/vax/vax/intvec.s Sun May 23 23:03:44 1999 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: intvec.s,v 1.37 1999/02/02 18:37:20 ragge Exp $   */
+/*     $NetBSD: intvec.s,v 1.38 1999/05/23 23:03:44 ragge Exp $   */
 
 /*
  * Copyright (c) 1994, 1997 Ludd, University of Lule}, Sweden.
@@ -208,50 +208,21 @@
  * Therefore it is done a fast revalidation of the page if it is
  * referenced. Trouble here is the hardware bug on KA650 CPUs that
  * put in a need for an extra check when the fault is gotten during
- * PTE reference.
+ * PTE reference. Handled in pmap.c.
  */
                .align  2
 transl_v: .globl transl_v      # Translation violation, 20
-#ifdef DEBUG
-       bbc     $0,(sp),1f      # pte len illegal in trans fault
-       pushab  2f
-       calls   $1,_panic
-2:     .asciz  "pte trans"
-#endif
-1:     pushr   $3              # save r0 & r1
-       movl    12(sp),r0       # Save faulted address in r0
-       blss    2f              # Jump if in kernelspace
-
-       ashl    $1,r0,r0
-       blss    3f              # Jump if P1
-       mfpr    $PR_P0BR,r1
-       brb     4f
-3:     mfpr    $PR_P1BR,r1
-
-4:     bbc     $1,8(sp),5f     # Jump if not indirect
-       extzv   $10,$21,r0,r0   # extract pte number
-       moval   (r1)[r0],r0     # get address of pte
-#if defined(VAX650) || defined(DEBUG)
-       extzv   $10,$20,r0,r1
-       movl    _Sysmap,r0
-       movaq   (r0)[r1],r0
-       tstl    (r0)            # If pte clear, found HW bug.
-       bneq    6f
-       popr    $3
-       brb     access_v
-#endif
-2:     extzv   $10,$20,r0,r1   # get pte index
-       movl    _Sysmap,r0
-       movaq   (r0)[r1],r0     # pte address
-6:     bisl2   $0x80000000,(r0)+ # set valid bit
-       bisl2   $0x80000000,(r0)
-       popr    $3
+       pushr   $0x3f
+       pushl   28(sp)
+       pushl   28(sp)
+       calls   $2,_pmap_simulref
+       tstl    r0
+       bneq    1f
+       popr    $0x3f
        addl2   $8,sp
        rei
-
-5:     extzv   $11,$20,r0,r0
-       movaq   (r1)[r0],r0
-       brb     6b
+1:     popr    $0x3f
+       brb     access_v
 
                .align  2
 access_v:.globl access_v       # Access cntrl viol fault,      24
diff -r f1dc46c7ee68 -r ba3abb30f279 sys/arch/vax/vax/pmap.c
--- a/sys/arch/vax/vax/pmap.c   Sun May 23 22:56:53 1999 +0000
+++ b/sys/arch/vax/vax/pmap.c   Sun May 23 23:03:44 1999 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: pmap.c,v 1.63 1999/04/17 17:02:50 ragge Exp $     */
+/*     $NetBSD: pmap.c,v 1.64 1999/05/23 23:03:44 ragge Exp $     */
 /*
  * Copyright (c) 1994, 1998 Ludd, University of Lule}, Sweden.
  * All rights reserved.
@@ -808,35 +808,63 @@
        mtpr(0,PR_TBIA);
 }
 
-#ifdef NEW_REF
+int pmap_simulref(int bits, int addr);
 /*
  * Called from interrupt vector routines if we get a page invalid fault.
  * Note: the save mask must be or'ed with 0x3f for this function.
  * Returns 0 if normal call, 1 if CVAX bug detected.
  */
 int
-pmap_simulref(bits, addr)
-       int     bits, addr;
+pmap_simulref(int bits, int addr)
 {
+       u_int   *pte;
+       struct  pv_entry *pv;
+       paddr_t pa;
 
-
+#ifdef PMAPDEBUG
+if (startpmapdebug) 
+       printf("pmap_simulref: bits %x addr %x\n", bits, addr);
+#endif
 #ifdef DEBUG
        if (bits & 1)
                panic("pte trans len");
 #endif
+       /* Set addess on logical page boundary */
+       addr &= ~PGOFSET;
        /* First decode userspace addr */
        if (addr >= 0) {
                if ((addr << 1) < 0)
-                       pte = mfpr(PR_P1BR);
+                       pte = (u_int *)mfpr(PR_P1BR);
                else
-                       pte = mfpr(PR_P0BR);
+                       pte = (u_int *)mfpr(PR_P0BR);
+               pte += PG_PFNUM(addr);
                if (bits & 2) { /* PTE reference */
-                       
-
+                       pte = (u_int *)TRUNC_PAGE(pte);
+                       pte = (u_int *)kvtopte(pte);
+                       if (pte[0] == 0) /* Check for CVAX bug */
+                               return 1;       
+                       pa = (u_int)pte & ~KERNBASE;
+               } else
+                       pa = Sysmap[PG_PFNUM(pte)].pg_pfn << VAX_PGSHIFT;
+       } else {
+               pte = (u_int *)kvtopte(addr);
+               pa = (u_int)pte & ~KERNBASE;
+       }
+       pte[0] |= PG_V;
+       pte[1] |= PG_V;
+       pte[2] |= PG_V;
+       pte[3] |= PG_V;
+       pte[4] |= PG_V;
+       pte[5] |= PG_V;
+       pte[6] |= PG_V;
+       pte[7] |= PG_V;
+       pv = pv_table + (pa >> PGSHIFT);
+       pv->pv_attr |= PG_V; /* Referenced */
+       if (bits & 4)
+               pv->pv_attr |= PG_M; /* (will be) modified. XXX page tables  */
+       return 0;
+}
 
-
-
-#endif
 /*
  * Checks if page is referenced; returns true or false depending on result.
  */
@@ -863,29 +891,6 @@
        if (pv->pv_attr & PG_V)
                return 1;
 
-#ifndef NEW_REF
-       if (pv->pv_pte)
-               if ((pv->pv_pte[0].pg_v | pv->pv_pte[2].pg_v |
-                   pv->pv_pte[4].pg_v | pv->pv_pte[6].pg_v)) {
-#ifdef PMAPDEBUG
-                       if (startpmapdebug) printf("Yes (1)\n");
-#endif
-                       return 1;
-               }
-
-       while ((pv = pv->pv_next)) {
-               if ((pv->pv_pte[0].pg_v | pv->pv_pte[2].pg_v |
-                   pv->pv_pte[4].pg_v | pv->pv_pte[6].pg_v)) {
-#ifdef PMAPDEBUG
-                       if (startpmapdebug) printf("Yes (2)\n");
-#endif
-                       return 1;
-               }
-       }
-#ifdef PMAPDEBUG
-       if (startpmapdebug) printf("No pmap_is_referenced\n");
-#endif
-#endif
        return 0;
 }
 



Home | Main Index | Thread Index | Old Index