From ce3cd11d08e289aa51dabf7191404b12804b355c Mon Sep 17 00:00:00 2001 From: bjh21 Date: Tue, 26 Dec 2000 23:18:50 +0000 Subject: [PATCH] Unreasonably simple fix for PR#11817: Don't worry about duplicate mappings, just get pmap_fault to shove them back in. Crude, but effective. Fix inspired by Chuck Silvers. This breaks pmap_confess, but it probably deserves to die. --- sys/arch/arm26/arm26/pmap.c | 55 ++++++++++--------------------------- 1 file changed, 15 insertions(+), 40 deletions(-) diff --git a/sys/arch/arm26/arm26/pmap.c b/sys/arch/arm26/arm26/pmap.c index 9cefec42f82b..eb3f1c544fdb 100644 --- a/sys/arch/arm26/arm26/pmap.c +++ b/sys/arch/arm26/arm26/pmap.c @@ -1,4 +1,4 @@ -/* $NetBSD: pmap.c,v 1.8 2000/12/23 23:06:51 bjh21 Exp $ */ +/* $NetBSD: pmap.c,v 1.9 2000/12/26 23:18:50 bjh21 Exp $ */ /*- * Copyright (c) 1997, 1998, 2000 Ben Harris * All rights reserved. @@ -85,7 +85,7 @@ #include -__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.8 2000/12/23 23:06:51 bjh21 Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.9 2000/12/26 23:18:50 bjh21 Exp $"); #include /* for cold */ #include @@ -537,44 +537,6 @@ pmap_enter(pmap_t pmap, vaddr_t va, paddr_t pa, vm_prot_t prot, int flags) ppn, lpn, pmap); #endif s = splimp(); - /* Check if the physical page is mapped already elsewhere. */ - if (pmap == pmap_kernel()) { - for (pv = &pv_table[ppn]; pv != NULL; pv = pv->pv_next) - if (pv->pv_pmap != NULL && - (pv->pv_pmap != pmap || pv->pv_lpn != lpn)) { - if (pv->pv_vflags & PV_WIRED) { - printf("new: pmap = %p, ppn = %d, " - "lpn = %d\n", pmap, ppn, lpn); - printf("old: pmap = %p, ppn = %d, " - "lpn = %d\n", pv->pv_pmap, - pv->pv_ppn, pv->pv_lpn); - panic("Mapping clash not handled"); - } else { - pmap_remove(pv->pv_pmap, - pv->pv_lpn * PAGE_SIZE, - (pv->pv_lpn+1) * - PAGE_SIZE); - } - } - } else { - for (pv = &pv_table[ppn]; pv != NULL; pv = pv->pv_next) - if (pv->pv_pmap == pmap_kernel() || - (pv->pv_pmap == pmap && pv->pv_lpn != lpn)) { - if (pv->pv_vflags & PV_WIRED) { - printf("new: pmap = %p, ppn = %d, " - "lpn = %d\n", pmap, ppn, lpn); - printf("old: pmap = %p, ppn = %d, " - "lpn = %d\n", pv->pv_pmap, - pv->pv_ppn, pv->pv_lpn); - panic("Mapping clash not handled"); - } else { - pmap_remove(pv->pv_pmap, - pv->pv_lpn * PAGE_SIZE, - (pv->pv_lpn+1) * - PAGE_SIZE); - } - } - } /* Remove any existing mapping at this lpn */ if (pmap->pm_entries[lpn] != NULL && @@ -775,6 +737,19 @@ pmap_fault(struct pmap *pmap, vaddr_t va, vm_prot_t atype) return TRUE; } } + /* + * It wasn't a referenced/modified fault. + * If it looks like the access should have been allowed, try pushing + * the mapping back into the MEMC. + */ + if ((atype & ~pv->pv_prot) == 0) { +#if 0 + printf("pmap_fault: MEMC miss; pmap = %p, lpn = %d, ppn = %d\n", + pv->pv_pmap, pv->pv_lpn, pv->pv_ppn); +#endif + MEMC_WRITE(pv->pv_activate); + return TRUE; + } return FALSE; }