Add missing braces in pmap_pte_to_pvo (DEBUG|PMAPCHECK defined). Rearrange
some code so that consistency check in pmap_pte_to_pvo do not trigger on false positives. Correct/enhance some printfs.
This commit is contained in:
parent
25a2c4d481
commit
e55c9f74af
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: pmap.c,v 1.9 2001/06/15 20:53:45 matt Exp $ */
|
/* $NetBSD: pmap.c,v 1.10 2001/06/15 21:29:54 matt Exp $ */
|
||||||
/*-
|
/*-
|
||||||
* Copyright (c) 2001 The NetBSD Foundation, Inc.
|
* Copyright (c) 2001 The NetBSD Foundation, Inc.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
|
@ -932,8 +932,7 @@ pmap_pvo_to_pte(const struct pvo_entry *pvo, int pteidx)
|
||||||
if ((pt->pte_hi ^ (pvo->pvo_pte.pte_hi & ~PTE_VALID)) == PTE_VALID) {
|
if ((pt->pte_hi ^ (pvo->pvo_pte.pte_hi & ~PTE_VALID)) == PTE_VALID) {
|
||||||
#ifdef DIAGNOSTIC
|
#ifdef DIAGNOSTIC
|
||||||
if ((pvo->pvo_pte.pte_hi & PTE_VALID) == 0) {
|
if ((pvo->pvo_pte.pte_hi & PTE_VALID) == 0) {
|
||||||
#ifdef DEBUG
|
#if defined(DEBUG) || defined(PMAPCHECK)
|
||||||
pmap_pte_print(&pvo->pvo_pte);
|
|
||||||
pmap_pte_print(pt);
|
pmap_pte_print(pt);
|
||||||
#endif
|
#endif
|
||||||
panic("pmap_pvo_to_pte: pvo %p: has valid pte in "
|
panic("pmap_pvo_to_pte: pvo %p: has valid pte in "
|
||||||
|
@ -941,7 +940,7 @@ pmap_pvo_to_pte(const struct pvo_entry *pvo, int pteidx)
|
||||||
pvo, pt);
|
pvo, pt);
|
||||||
}
|
}
|
||||||
if (((pt->pte_lo ^ pvo->pvo_pte.pte_lo) & ~(PTE_CHG|PTE_REF)) != 0) {
|
if (((pt->pte_lo ^ pvo->pvo_pte.pte_lo) & ~(PTE_CHG|PTE_REF)) != 0) {
|
||||||
#ifdef DEBUG
|
#if defined(DEBUG) || defined(PMAPCHECK)
|
||||||
pmap_pte_print(pt);
|
pmap_pte_print(pt);
|
||||||
#endif
|
#endif
|
||||||
panic("pmap_pvo_to_pte: pvo %p: pvo pte does "
|
panic("pmap_pvo_to_pte: pvo %p: pvo pte does "
|
||||||
|
@ -953,13 +952,14 @@ pmap_pvo_to_pte(const struct pvo_entry *pvo, int pteidx)
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef DIAGNOSTIC
|
#ifdef DIAGNOSTIC
|
||||||
if (pvo->pvo_pte.pte_hi & PTE_VALID)
|
if (pvo->pvo_pte.pte_hi & PTE_VALID) {
|
||||||
#ifdef DEBUG
|
#if defined(DEBUG) || defined(PMAPCHECK)
|
||||||
pmap_pte_print(pt);
|
pmap_pte_print(pt);
|
||||||
#endif
|
#endif
|
||||||
panic("pmap_pvo_to_pte: pvo %p: has invalid pte in "
|
panic("pmap_pvo_to_pte: pvo %p: has invalid pte %p in "
|
||||||
"pmap_pteg_table but valid in pvo", pvo);
|
"pmap_pteg_table but valid in pvo", pvo, pt);
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1549,7 +1549,11 @@ pmap_protect(pmap_t pm, vaddr_t va, vaddr_t endva, vm_prot_t prot)
|
||||||
if ((pvo->pvo_pte.pte_lo & PTE_PP) == PTE_RO)
|
if ((pvo->pvo_pte.pte_lo & PTE_PP) == PTE_RO)
|
||||||
continue;
|
continue;
|
||||||
#endif
|
#endif
|
||||||
|
/*
|
||||||
|
* Grab the PTE pointer before we diddle with
|
||||||
|
* the cached PTE copy.
|
||||||
|
*/
|
||||||
|
pt = pmap_pvo_to_pte(pvo, pteidx);
|
||||||
/*
|
/*
|
||||||
* Change the protection of the page.
|
* Change the protection of the page.
|
||||||
*/
|
*/
|
||||||
|
@ -1560,7 +1564,6 @@ pmap_protect(pmap_t pm, vaddr_t va, vaddr_t endva, vm_prot_t prot)
|
||||||
* If the PVO is in the page table, update
|
* If the PVO is in the page table, update
|
||||||
* that pte at well.
|
* that pte at well.
|
||||||
*/
|
*/
|
||||||
pt = pmap_pvo_to_pte(pvo, pteidx);
|
|
||||||
if (pt != NULL)
|
if (pt != NULL)
|
||||||
pmap_pte_change(pt, &pvo->pvo_pte, pvo->pvo_vaddr);
|
pmap_pte_change(pt, &pvo->pvo_pte, pvo->pvo_vaddr);
|
||||||
|
|
||||||
|
@ -1624,9 +1627,14 @@ pmap_page_protect(struct vm_page *pg, vm_prot_t prot)
|
||||||
pmap_pvo_remove(pvo, -1, TRUE);
|
pmap_pvo_remove(pvo, -1, TRUE);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
|
* Grab the PTE before the we diddle the bits so
|
||||||
|
* pvo_to_pte can verify the pte contents are as
|
||||||
|
* expected.
|
||||||
|
*/
|
||||||
|
pt = pmap_pvo_to_pte(pvo, -1);
|
||||||
pvo->pvo_pte.pte_lo &= ~PTE_PP;
|
pvo->pvo_pte.pte_lo &= ~PTE_PP;
|
||||||
pvo->pvo_pte.pte_lo |= PTE_RO;
|
pvo->pvo_pte.pte_lo |= PTE_RO;
|
||||||
pt = pmap_pvo_to_pte(pvo, -1);
|
|
||||||
if (pt != NULL)
|
if (pt != NULL)
|
||||||
pmap_pte_change(pt, &pvo->pvo_pte, pvo->pvo_vaddr);
|
pmap_pte_change(pt, &pvo->pvo_pte, pvo->pvo_vaddr);
|
||||||
PMAP_PVO_CHECK(pvo); /* sanity check */
|
PMAP_PVO_CHECK(pvo); /* sanity check */
|
||||||
|
|
Loading…
Reference in New Issue