Source-Changes-HG archive

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

[src/trunk]: src/sys/arch/x86/x86 Convert few panic() uses to asserts, reduce...



details:   https://anonhg.NetBSD.org/src/rev/b02f440d4ddc
branches:  trunk
changeset: 768293:b02f440d4ddc
user:      rmind <rmind%NetBSD.org@localhost>
date:      Sun Aug 14 02:31:08 2011 +0000

description:
Convert few panic() uses to asserts, reduce the scope of variable use.
No functional changes.

diffstat:

 sys/arch/x86/x86/pmap.c |  133 +++++++++++++++++++----------------------------
 1 files changed, 54 insertions(+), 79 deletions(-)

diffs (229 lines):

diff -r 2dc83d4a7788 -r b02f440d4ddc sys/arch/x86/x86/pmap.c
--- a/sys/arch/x86/x86/pmap.c   Sun Aug 14 01:20:33 2011 +0000
+++ b/sys/arch/x86/x86/pmap.c   Sun Aug 14 02:31:08 2011 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: pmap.c,v 1.127 2011/07/05 14:07:12 yamt Exp $  */
+/*     $NetBSD: pmap.c,v 1.128 2011/08/14 02:31:08 rmind Exp $ */
 
 /*-
  * Copyright (c) 2008, 2010 The NetBSD Foundation, Inc.
@@ -171,7 +171,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.127 2011/07/05 14:07:12 yamt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.128 2011/08/14 02:31:08 rmind Exp $");
 
 #include "opt_user_ldt.h"
 #include "opt_lockdebug.h"
@@ -1966,7 +1966,6 @@
 /*
  * pmap_pdp_ctor: constructor for the PDP cache.
  */
-
 int
 pmap_pdp_ctor(void *arg, void *v, int flags)
 {
@@ -2041,7 +2040,7 @@
        object = (vaddr_t)v;
        for (i = 0; i < PDP_SIZE; i++, object += PAGE_SIZE) {
                (void) pmap_extract(pmap_kernel(), object, &pdirpa);
-               /* remap this page RO */
+               /* FIXME: This should use pmap_protect() .. */
                pmap_kenter_pa(object, pdirpa, VM_PROT_READ, 0);
                pmap_update(pmap_kernel());
                /*
@@ -3655,30 +3654,28 @@
 /* see pmap.h */
 
 /*
- * pmap_write_protect: write-protect pages in a pmap
+ * pmap_write_protect: write-protect pages in a pmap.
  */
-
 void
 pmap_write_protect(struct pmap *pmap, vaddr_t sva, vaddr_t eva, vm_prot_t prot)
 {
-       int i;
-       pt_entry_t *ptes, *epte;
-       pt_entry_t *spte;
-       pd_entry_t * const *pdes;
+       pt_entry_t *ptes;
+       pt_entry_t * const *pdes;
+       struct pmap *pmap2;
        vaddr_t blockend, va;
-       pt_entry_t opte;
-       struct pmap *pmap2;
 
        KASSERT(curlwp->l_md.md_gc_pmap != pmap);
 
-       kpreempt_disable();
-       pmap_map_ptes(pmap, &pmap2, &ptes, &pdes);      /* locks pmap */
-
-       /* should be ok, but just in case ... */
        sva &= PG_FRAME;
        eva &= PG_FRAME;
 
+       /* Acquire pmap. */
+       kpreempt_disable();
+       pmap_map_ptes(pmap, &pmap2, &ptes, &pdes);
+
        for (va = sva ; va < eva ; va = blockend) {
+               pt_entry_t *spte, *epte;
+               int i;
 
                blockend = (va & L2_FRAME) + NBPD_L2;
                if (blockend > eva)
@@ -3699,21 +3696,17 @@
                                continue;
                }
 
-               /* empty block? */
-               if (!pmap_pdes_valid(va, pdes, NULL))
+               /* Is it a valid block? */
+               if (!pmap_pdes_valid(va, pdes, NULL)) {
                        continue;
-
-#ifdef DIAGNOSTIC
-               if (va >= VM_MAXUSER_ADDRESS &&
-                   va < VM_MAX_ADDRESS)
-                       panic("pmap_write_protect: PTE space");
-#endif
+               }
+               KASSERT(va < VM_MAXUSER_ADDRESS || va >= VM_MAX_ADDRESS);
 
                spte = &ptes[pl1_i(va)];
                epte = &ptes[pl1_i(blockend)];
 
                for (/*null */; spte < epte ; spte++) {
-                       pt_entry_t npte;
+                       pt_entry_t opte, npte;
 
                        do {
                                opte = *spte;
@@ -3722,10 +3715,9 @@
                                }
                                npte = opte & ~PG_RW;
                        } while (pmap_pte_cas(spte, opte, npte) != opte);
+
                        if ((opte & PG_M) != 0) {
-                               vaddr_t tva;
-
-                               tva = x86_ptob(spte - ptes);
+                               vaddr_t tva = x86_ptob(spte - ptes);
                                pmap_tlb_shootdown(pmap, tva, opte,
                                    TLBSHOOT_WRITE_PROTECT);
                        }
@@ -3733,57 +3725,47 @@
                }
        }
 
-       pmap_unmap_ptes(pmap, pmap2);   /* unlocks pmap */
+       /* Release pmap. */
+       pmap_unmap_ptes(pmap, pmap2);
        kpreempt_enable();
 }
 
 /*
- * end of protection functions
+ * pmap_unwire: clear the wired bit in the PTE.
+ *
+ * => Mapping should already be present.
  */
-
-/*
- * pmap_unwire: clear the wired bit in the PTE
- *
- * => mapping should already be in map
- */
-
 void
 pmap_unwire(struct pmap *pmap, vaddr_t va)
 {
-       pt_entry_t *ptes;
+       pt_entry_t *ptes, *ptep, opte;
        pd_entry_t * const *pdes;
        struct pmap *pmap2;
 
+       /* Acquire pmap. */
        kpreempt_disable();
-       pmap_map_ptes(pmap, &pmap2, &ptes, &pdes);      /* locks pmap */
-
-       if (pmap_pdes_valid(va, pdes, NULL)) {
-               pt_entry_t *ptep = &ptes[pl1_i(va)];
-               pt_entry_t opte = *ptep;
-
-#ifdef DIAGNOSTIC
-               if (!pmap_valid_entry(opte))
-                       panic("pmap_unwire: invalid (unmapped) va 0x%lx", va);
-#endif
-               if ((opte & PG_W) != 0) {
-                       pt_entry_t npte = opte & ~PG_W;
-
-                       opte = pmap_pte_testset(ptep, npte);
-                       pmap_stats_update_bypte(pmap, npte, opte);
-               }
-#ifdef DIAGNOSTIC
-               else {
-                       printf("pmap_unwire: wiring for pmap %p va 0x%lx "
-                              "didn't change!\n", pmap, va);
-               }
-#endif
-               pmap_unmap_ptes(pmap, pmap2);           /* unlocks map */
-       }
-#ifdef DIAGNOSTIC
-       else {
+       pmap_map_ptes(pmap, &pmap2, &ptes, &pdes);
+
+       if (!pmap_pdes_valid(va, pdes, NULL)) {
                panic("pmap_unwire: invalid PDE");
        }
-#endif
+
+       ptep = &ptes[pl1_i(va)];
+       opte = *ptep;
+       KASSERT(pmap_valid_entry(opte));
+
+       if (opte & PG_W) {
+               pt_entry_t npte = opte & ~PG_W;
+
+               opte = pmap_pte_testset(ptep, npte);
+               pmap_stats_update_bypte(pmap, npte, opte);
+       } else {
+               printf("pmap_unwire: wiring for pmap %p va 0x%lx "
+                   "did not change!\n", pmap, va);
+       }
+
+       /* Release pmap. */
+       pmap_unmap_ptes(pmap, pmap2);
        kpreempt_enable();
 }
 
@@ -3832,20 +3814,13 @@
 
        KASSERT(pmap_initialized);
        KASSERT(curlwp->l_md.md_gc_pmap != pmap);
-
-#ifdef DIAGNOSTIC
-       /* sanity check: totally out of range? */
-       if (va >= VM_MAX_KERNEL_ADDRESS)
-               panic("pmap_enter: too big");
-
-       if (va == (vaddr_t) PDP_BASE || va == (vaddr_t) APDP_BASE)
-               panic("pmap_enter: trying to map over PDP/APDP!");
-
-       /* sanity check: kernel PTPs should already have been pre-allocated */
-       if (va >= VM_MIN_KERNEL_ADDRESS &&
-           !pmap_valid_entry(pmap->pm_pdir[pl_i(va, PTP_LEVELS)]))
-               panic("pmap_enter: missing kernel PTP for va %lx!", va);
-#endif /* DIAGNOSTIC */
+       KASSERT(va < VM_MAX_KERNEL_ADDRESS);
+       KASSERTMSG(va != (vaddr_t)PDP_BASE && va != (vaddr_t)APDP_BASE,
+           ("pmap_enter: trying to map over PDP/APDP!"));
+       KASSERTMSG(va < VM_MIN_KERNEL_ADDRESS ||
+           pmap_valid_entry(pmap->pm_pdir[pl_i(va, PTP_LEVELS)]),
+           ("pmap_enter: missing kernel PTP for VA %lx!", va));
+
 #ifdef XEN
        KASSERT(domid == DOMID_SELF || pa == 0);
 #endif /* XEN */



Home | Main Index | Thread Index | Old Index