version 1.97.4.3, 2002/11/21 20:15:23 |
version 1.97.4.4, 2002/12/07 20:43:02 |
Line 813 pmap_enter_pv(struct vm_page *pg, struct |
|
Line 813 pmap_enter_pv(struct vm_page *pg, struct |
|
simple_unlock(&pg->mdpage.pvh_slock); /* unlock, done! */ |
simple_unlock(&pg->mdpage.pvh_slock); /* unlock, done! */ |
if (pve->pv_flags & PVF_WIRED) |
if (pve->pv_flags & PVF_WIRED) |
++pmap->pm_stats.wired_count; |
++pmap->pm_stats.wired_count; |
|
#ifdef PMAP_ALIAS_DEBUG |
|
{ |
|
int s = splhigh(); |
|
if (pve->pv_flags & PVF_WRITE) |
|
pg->mdpage.rw_mappings++; |
|
else |
|
pg->mdpage.ro_mappings++; |
|
if (pg->mdpage.rw_mappings != 0 && |
|
(pg->mdpage.kro_mappings != 0 || pg->mdpage.krw_mappings != 0)) { |
|
printf("pmap_enter_pv: rw %u, kro %u, krw %u\n", |
|
pg->mdpage.rw_mappings, pg->mdpage.kro_mappings, |
|
pg->mdpage.krw_mappings); |
|
} |
|
splx(s); |
|
} |
|
#endif /* PMAP_ALIAS_DEBUG */ |
} |
} |
|
|
/* |
/* |
Line 838 pmap_remove_pv(struct vm_page *pg, struc |
|
Line 854 pmap_remove_pv(struct vm_page *pg, struc |
|
*prevptr = pve->pv_next; /* remove it! */ |
*prevptr = pve->pv_next; /* remove it! */ |
if (pve->pv_flags & PVF_WIRED) |
if (pve->pv_flags & PVF_WIRED) |
--pmap->pm_stats.wired_count; |
--pmap->pm_stats.wired_count; |
|
#ifdef PMAP_ALIAS_DEBUG |
|
{ |
|
int s = splhigh(); |
|
if (pve->pv_flags & PVF_WRITE) { |
|
KASSERT(pg->mdpage.rw_mappings != 0); |
|
pg->mdpage.rw_mappings--; |
|
} else { |
|
KASSERT(pg->mdpage.ro_mappings != 0); |
|
pg->mdpage.ro_mappings--; |
|
} |
|
splx(s); |
|
} |
|
#endif /* PMAP_ALIAS_DEBUG */ |
break; |
break; |
} |
} |
prevptr = &pve->pv_next; /* previous pointer */ |
prevptr = &pve->pv_next; /* previous pointer */ |
Line 881 pmap_modify_pv(struct pmap *pmap, vaddr_ |
|
Line 910 pmap_modify_pv(struct pmap *pmap, vaddr_ |
|
else |
else |
--pmap->pm_stats.wired_count; |
--pmap->pm_stats.wired_count; |
} |
} |
|
#ifdef PMAP_ALIAS_DEBUG |
|
{ |
|
int s = splhigh(); |
|
if ((flags ^ oflags) & PVF_WRITE) { |
|
if (flags & PVF_WRITE) { |
|
pg->mdpage.rw_mappings++; |
|
pg->mdpage.ro_mappings--; |
|
if (pg->mdpage.rw_mappings != 0 && |
|
(pg->mdpage.kro_mappings != 0 || |
|
pg->mdpage.krw_mappings != 0)) { |
|
printf("pmap_modify_pv: rw %u, " |
|
"kro %u, krw %u\n", |
|
pg->mdpage.rw_mappings, |
|
pg->mdpage.kro_mappings, |
|
pg->mdpage.krw_mappings); |
|
} |
|
} else { |
|
KASSERT(pg->mdpage.rw_mappings != 0); |
|
pg->mdpage.rw_mappings--; |
|
pg->mdpage.ro_mappings++; |
|
} |
|
} |
|
splx(s); |
|
} |
|
#endif /* PMAP_ALIAS_DEBUG */ |
return (oflags); |
return (oflags); |
} |
} |
} |
} |
Line 1367 pmap_alloc_ptpt(struct pmap *pmap) |
|
Line 1421 pmap_alloc_ptpt(struct pmap *pmap) |
|
|
|
*pte = L2_S_PROTO | pmap->pm_pptpt | |
*pte = L2_S_PROTO | pmap->pm_pptpt | |
L2_S_PROT(PTE_KERNEL, VM_PROT_READ|VM_PROT_WRITE); |
L2_S_PROT(PTE_KERNEL, VM_PROT_READ|VM_PROT_WRITE); |
|
#ifdef PMAP_ALIAS_DEBUG |
|
{ |
|
int s = splhigh(); |
|
pg->mdpage.krw_mappings++; |
|
splx(s); |
|
} |
|
#endif /* PMAP_ALIAS_DEBUG */ |
|
|
return (0); |
return (0); |
} |
} |
|
|
pmap_kenter_pa(vaddr_t va, paddr_t pa, vm_prot_t prot) |
pmap_kenter_pa(vaddr_t va, paddr_t pa, vm_prot_t prot) |
{ |
{ |
pt_entry_t *pte; |
pt_entry_t *pte; |
|
|
pte = vtopte(va); |
pte = vtopte(va); |
KASSERT(!pmap_pte_v(pte)); |
KASSERT(!pmap_pte_v(pte)); |
|
|
|
#ifdef PMAP_ALIAS_DEBUG |
|
{ |
|
struct vm_page *pg; |
|
int s; |
|
|
|
pg = PHYS_TO_VM_PAGE(pa); |
|
if (pg != NULL) { |
|
s = splhigh(); |
|
if (pg->mdpage.ro_mappings == 0 && |
|
pg->mdpage.rw_mappings == 0 && |
|
pg->mdpage.kro_mappings == 0 && |
|
pg->mdpage.krw_mappings == 0) { |
|
/* This case is okay. */ |
|
} else if (pg->mdpage.rw_mappings == 0 && |
|
pg->mdpage.krw_mappings == 0 && |
|
(prot & VM_PROT_WRITE) == 0) { |
|
/* This case is okay. */ |
|
} else { |
|
/* Something is awry. */ |
|
printf("pmap_kenter_pa: ro %u, rw %u, kro %u, krw %u " |
|
"prot 0x%x\n", pg->mdpage.ro_mappings, |
|
pg->mdpage.rw_mappings, pg->mdpage.kro_mappings, |
|
pg->mdpage.krw_mappings, prot); |
|
Debugger(); |
|
} |
|
if (prot & VM_PROT_WRITE) |
|
pg->mdpage.krw_mappings++; |
|
else |
|
pg->mdpage.kro_mappings++; |
|
splx(s); |
|
} |
|
} |
|
#endif /* PMAP_ALIAS_DEBUG */ |
|
|
*pte = L2_S_PROTO | pa | |
*pte = L2_S_PROTO | pa | |
L2_S_PROT(PTE_KERNEL, prot) | pte_l2_s_cache_mode; |
L2_S_PROT(PTE_KERNEL, prot) | pte_l2_s_cache_mode; |
} |
} |
Line 2842 pmap_kremove(vaddr_t va, vsize_t len) |
|
Line 2937 pmap_kremove(vaddr_t va, vsize_t len) |
|
|
|
KASSERT(pmap_pde_page(pmap_pde(pmap_kernel(), va))); |
KASSERT(pmap_pde_page(pmap_pde(pmap_kernel(), va))); |
pte = vtopte(va); |
pte = vtopte(va); |
|
#ifdef PMAP_ALIAS_DEBUG |
|
{ |
|
struct vm_page *pg; |
|
int s; |
|
|
|
if ((*pte & L2_TYPE_MASK) != L2_TYPE_INV && |
|
(pg = PHYS_TO_VM_PAGE(*pte & L2_S_FRAME)) != NULL) { |
|
s = splhigh(); |
|
if (*pte & L2_S_PROT_W) { |
|
KASSERT(pg->mdpage.krw_mappings != 0); |
|
pg->mdpage.krw_mappings--; |
|
} else { |
|
KASSERT(pg->mdpage.kro_mappings != 0); |
|
pg->mdpage.kro_mappings--; |
|
} |
|
splx(s); |
|
} |
|
} |
|
#endif /* PMAP_ALIAS_DEBUG */ |
cpu_idcache_wbinv_range(va, PAGE_SIZE); |
cpu_idcache_wbinv_range(va, PAGE_SIZE); |
*pte = 0; |
*pte = 0; |
cpu_tlb_flushID_SE(va); |
cpu_tlb_flushID_SE(va); |
Line 3106 pmap_clearbit(struct vm_page *pg, u_int |
|
Line 3220 pmap_clearbit(struct vm_page *pg, u_int |
|
* Loop over all current mappings setting/clearing as appropos |
* Loop over all current mappings setting/clearing as appropos |
*/ |
*/ |
for (pv = pg->mdpage.pvh_list; pv; pv = pv->pv_next) { |
for (pv = pg->mdpage.pvh_list; pv; pv = pv->pv_next) { |
|
#ifdef PMAP_ALIAS_DEBUG |
|
{ |
|
int s = splhigh(); |
|
if ((maskbits & PVF_WRITE) != 0 && |
|
(pv->pv_flags & PVF_WRITE) != 0) { |
|
KASSERT(pg->mdpage.rw_mappings != 0); |
|
pg->mdpage.rw_mappings--; |
|
pg->mdpage.ro_mappings++; |
|
} |
|
splx(s); |
|
} |
|
#endif /* PMAP_ALIAS_DEBUG */ |
va = pv->pv_va; |
va = pv->pv_va; |
pv->pv_flags &= ~maskbits; |
pv->pv_flags &= ~maskbits; |
ptes = pmap_map_ptes(pv->pv_pmap); /* locks pmap */ |
ptes = pmap_map_ptes(pv->pv_pmap); /* locks pmap */ |