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