(can lead to mappings that cannot be removed as opposed to removing wired
mappings that shouldn't be removed)
SCCS-vsn: sys/hp300/hp300/pmap.c 8.4
*
* %sccs.include.redist.c%
*
*
* %sccs.include.redist.c%
*
- * @(#)pmap.c 8.3 (Berkeley) %G%
+ * @(#)pmap.c 8.4 (Berkeley) %G%
switch (prot) {
case VM_PROT_READ|VM_PROT_WRITE:
case VM_PROT_ALL:
switch (prot) {
case VM_PROT_READ|VM_PROT_WRITE:
case VM_PROT_ALL:
/* copy_on_write */
case VM_PROT_READ:
case VM_PROT_READ|VM_PROT_EXECUTE:
pmap_changebit(pa, PG_RO, TRUE);
/* copy_on_write */
case VM_PROT_READ:
case VM_PROT_READ|VM_PROT_EXECUTE:
pmap_changebit(pa, PG_RO, TRUE);
/* remove_all */
default:
/* remove_all */
default:
- pv = pa_to_pvh(pa);
- s = splimp();
- while (pv->pv_pmap != NULL) {
+ break;
+ }
+ pv = pa_to_pvh(pa);
+ s = splimp();
+ while (pv->pv_pmap != NULL) {
+ register pt_entry_t *pte;
+
+ pte = pmap_pte(pv->pv_pmap, pv->pv_va);
- if (!pmap_ste_v(pv->pv_pmap, pv->pv_va) ||
- pmap_pte_pa(pmap_pte(pv->pv_pmap,pv->pv_va)) != pa)
- panic("pmap_page_protect: bad mapping");
+ if (!pmap_ste_v(pv->pv_pmap, pv->pv_va) ||
+ pmap_pte_pa(pte) != pa)
+ panic("pmap_page_protect: bad mapping");
pmap_remove_mapping(pv->pv_pmap, pv->pv_va,
pmap_remove_mapping(pv->pv_pmap, pv->pv_va,
- PT_ENTRY_NULL,
- PRM_TFLUSH|PRM_CFLUSH);
+ pte, PRM_TFLUSH|PRM_CFLUSH);
+ else {
+ pv = pv->pv_next;
+#ifdef DEBUG
+ if (pmapdebug & PDB_PARANOIA)
+ printf("%s wired mapping for %x not removed\n",
+ "pmap_page_protect:", pa);
+#endif
*/
pmap_changebit(pa, PG_M, FALSE);
#ifdef DEBUG
*/
pmap_changebit(pa, PG_M, FALSE);
#ifdef DEBUG
+ if ((PHYS_TO_VM_PAGE(pa)->flags & PG_CLEAN) == 0) {
+ printf("pa %x: flags=%x: not clean\n",
+ pa, PHYS_TO_VM_PAGE(pa)->flags);
+ PHYS_TO_VM_PAGE(pa)->flags |= PG_CLEAN;
+ }
if (pmapdebug & PDB_PTPAGE)
printf("pmap_pageable: PT page %x(%x) unmodified\n",
sva, *(int *)pmap_pte(pmap, sva));
if (pmapdebug & PDB_PTPAGE)
printf("pmap_pageable: PT page %x(%x) unmodified\n",
sva, *(int *)pmap_pte(pmap, sva));
PMAP_ACTIVATE(ptpmap,
(struct pcb *)curproc->p_addr, 1);
}
PMAP_ACTIVATE(ptpmap,
(struct pcb *)curproc->p_addr, 1);
}
+#ifdef DEBUG
+ else if (ptpmap->pm_sref < 0)
+ panic("remove: sref < 0");
+#endif