From f111aacc61e229a4c40298713890a3d01024fbec Mon Sep 17 00:00:00 2001 From: rahnds Date: Thu, 9 Jan 1997 03:07:15 +0000 Subject: [PATCH] support resident page count. Attempt at least, pmap doesn't allow for exact tracking. --- sys/arch/powerpc/powerpc/genassym.c | 5 ++++- sys/arch/powerpc/powerpc/pmap.c | 35 +++++++++++++++++++++-------- 2 files changed, 30 insertions(+), 10 deletions(-) diff --git a/sys/arch/powerpc/powerpc/genassym.c b/sys/arch/powerpc/powerpc/genassym.c index dc714df7243..0478d8d00ab 100644 --- a/sys/arch/powerpc/powerpc/genassym.c +++ b/sys/arch/powerpc/powerpc/genassym.c @@ -1,4 +1,4 @@ -/* $OpenBSD: genassym.c,v 1.2 1996/12/28 06:22:00 rahnds Exp $ */ +/* $OpenBSD: genassym.c,v 1.3 1997/01/09 03:07:15 rahnds Exp $ */ /* $NetBSD: genassym.c,v 1.1 1996/09/30 16:34:46 ws Exp $ */ /* @@ -36,6 +36,9 @@ #include #include #include + #include + #include + #include #include diff --git a/sys/arch/powerpc/powerpc/pmap.c b/sys/arch/powerpc/powerpc/pmap.c index 71cfefecbe0..64e47f746b6 100644 --- a/sys/arch/powerpc/powerpc/pmap.c +++ b/sys/arch/powerpc/powerpc/pmap.c @@ -1,4 +1,4 @@ -/* $OpenBSD: pmap.c,v 1.2 1996/12/28 06:22:14 rahnds Exp $ */ +/* $OpenBSD: pmap.c,v 1.3 1997/01/09 03:07:16 rahnds Exp $ */ /* $NetBSD: pmap.c,v 1.1 1996/09/30 16:34:52 ws Exp $ */ /* @@ -873,7 +873,8 @@ pmap_enter_pv(pteidx, va, pind) } static void -pmap_remove_pv(pteidx, va, pind, pte) +pmap_remove_pv(pm, pteidx, va, pind, pte) + struct pmap *pm; int pteidx; vm_offset_t va; int pind; @@ -905,8 +906,16 @@ pmap_remove_pv(pteidx, va, pind, pte) if (npv) { *pv = *npv; pmap_free_pv(npv); - } else + } else { pv->pv_idx = -1; + } + if (pm != NULL) { + /* if called from pmap_page_protect, + * we don't know what pmap it was removed from. + * BAD DESIGN. + */ + pm->pm_stats.resident_count--; + } } else { for (; npv = pv->pv_next; pv = npv) if (pteidx == npv->pv_idx && va == npv->pv_va) @@ -914,6 +923,9 @@ pmap_remove_pv(pteidx, va, pind, pte) if (npv) { pv->pv_next = npv->pv_next; pmap_free_pv(npv); + if (pm != NULL) { + pm->pm_stats.resident_count--; + } } #ifdef DIAGNOSTIC else @@ -942,6 +954,8 @@ pmap_enter(pm, va, pa, prot, wired) * Have to remove any existing mapping first. */ pmap_remove(pm, va, va + NBPG - 1); + + pm->pm_stats.resident_count++; /* * Compute the HTAB index. @@ -1015,7 +1029,8 @@ pmap_remove(pm, va, endva) idx = pteidx(sr = ptesr(pm->pm_sr, va), va); for (ptp = ptable + idx * 8, i = 8; --i >= 0; ptp++) if (ptematch(ptp, sr, va, PTE_VALID)) { - pmap_remove_pv(idx, va, pmap_page_index(ptp->pte_lo), ptp); + pmap_remove_pv(pm, idx, va, + pmap_page_index(ptp->pte_lo), ptp); ptp->pte_hi &= ~PTE_VALID; asm volatile ("sync"); tlbie(va); @@ -1023,7 +1038,8 @@ pmap_remove(pm, va, endva) } for (ptp = ptable + (idx ^ ptab_mask) * 8, i = 8; --i >= 0; ptp++) if (ptematch(ptp, sr, va, PTE_VALID | PTE_HID)) { - pmap_remove_pv(idx, va, pmap_page_index(ptp->pte_lo), ptp); + pmap_remove_pv(pm, idx, va, + pmap_page_index(ptp->pte_lo), ptp); ptp->pte_hi &= ~PTE_VALID; asm volatile ("sync"); tlbie(va); @@ -1032,7 +1048,8 @@ pmap_remove(pm, va, endva) for (po = potable[idx].lh_first; po; po = npo) { npo = po->po_list.le_next; if (ptematch(&po->po_pte, sr, va, 0)) { - pmap_remove_pv(idx, va, pmap_page_index(po->po_pte.pte_lo), + pmap_remove_pv(pm, idx, va, + pmap_page_index(po->po_pte.pte_lo), &po->po_pte); LIST_REMOVE(po, po_list); pofree(po, 1); @@ -1275,7 +1292,7 @@ pmap_page_protect(pa, prot) for (ptp = ptable + idx * 8, i = 8; --i >= 0; ptp++) if ((ptp->pte_hi & PTE_VALID) && (ptp->pte_lo & PTE_RPGN) == pa) { - pmap_remove_pv(idx, va, pind, ptp); + pmap_remove_pv(NULL, idx, va, pind, ptp); ptp->pte_hi &= ~PTE_VALID; asm volatile ("sync"); tlbie(va); @@ -1284,7 +1301,7 @@ pmap_page_protect(pa, prot) for (ptp = ptable + (idx ^ ptab_mask) * 8, i = 8; --i >= 0; ptp++) if ((ptp->pte_hi & PTE_VALID) && (ptp->pte_lo & PTE_RPGN) == pa) { - pmap_remove_pv(idx, va, pind, ptp); + pmap_remove_pv(NULL, idx, va, pind, ptp); ptp->pte_hi &= ~PTE_VALID; asm volatile ("sync"); tlbie(va); @@ -1293,7 +1310,7 @@ pmap_page_protect(pa, prot) for (po = potable[idx].lh_first; po; po = npo) { npo = po->po_list.le_next; if ((po->po_pte.pte_lo & PTE_RPGN) == pa) { - pmap_remove_pv(idx, va, pind, &po->po_pte); + pmap_remove_pv(NULL,idx, va, pind, &po->po_pte); LIST_REMOVE(po, po_list); pofree(po, 1); } -- 2.20.1