Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/uebayasi-xip]: src/sys/arch/arm/arm32 Convert pmap_remove_pv() / pmap_mo...



details:   https://anonhg.NetBSD.org/src/rev/b88e866dbbed
branches:  uebayasi-xip
changeset: 751555:b88e866dbbed
user:      uebayasi <uebayasi%NetBSD.org@localhost>
date:      Wed Feb 10 13:23:57 2010 +0000

description:
Convert pmap_remove_pv() / pmap_modify_pv() to take struct vm_page_md *.

diffstat:

 sys/arch/arm/arm32/pmap.c |  104 +++++++++++++++++++++++-----------------------
 1 files changed, 52 insertions(+), 52 deletions(-)

diffs (271 lines):

diff -r 021fbfdf671f -r b88e866dbbed sys/arch/arm/arm32/pmap.c
--- a/sys/arch/arm/arm32/pmap.c Wed Feb 10 12:53:26 2010 +0000
+++ b/sys/arch/arm/arm32/pmap.c Wed Feb 10 13:23:57 2010 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: pmap.c,v 1.211.2.1 2010/02/10 12:53:26 uebayasi Exp $  */
+/*     $NetBSD: pmap.c,v 1.211.2.2 2010/02/10 13:23:57 uebayasi Exp $  */
 
 /*
  * Copyright 2003 Wasabi Systems, Inc.
@@ -211,7 +211,7 @@
 #include <machine/param.h>
 #include <arm/arm32/katelib.h>
 
-__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.211.2.1 2010/02/10 12:53:26 uebayasi Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.211.2.2 2010/02/10 13:23:57 uebayasi Exp $");
 
 #ifdef PMAP_DEBUG
 
@@ -639,8 +639,8 @@
 static void            pmap_enter_pv(struct vm_page *, struct pv_entry *,
                            pmap_t, vaddr_t, u_int);
 static struct pv_entry *pmap_find_pv(struct vm_page_md *, pmap_t, vaddr_t);
-static struct pv_entry *pmap_remove_pv(struct vm_page *, pmap_t, vaddr_t);
-static u_int           pmap_modify_pv(struct vm_page *, pmap_t, vaddr_t,
+static struct pv_entry *pmap_remove_pv(struct vm_page_md *, paddr_t, pmap_t, vaddr_t);
+static u_int           pmap_modify_pv(struct vm_page_md *, paddr_t, pmap_t, vaddr_t,
                            u_int, u_int);
 
 static void            pmap_pinit(pmap_t);
@@ -960,20 +960,20 @@
  * => we return the removed pv
  */
 static struct pv_entry *
-pmap_remove_pv(struct vm_page *pg, pmap_t pm, vaddr_t va)
+pmap_remove_pv(struct vm_page_md *md, paddr_t pa, pmap_t pm, vaddr_t va)
 {
        struct pv_entry *pv, **prevptr;
 
        NPDEBUG(PDB_PVDUMP,
-           printf("pmap_remove_pv: pm %p, pg %p, va 0x%08lx\n", pm, pg, va));
-
-       prevptr = &SLIST_FIRST(&pg->mdpage.pvh_list); /* prev pv_entry ptr */
+           printf("pmap_remove_pv: pm %p, md %p, va 0x%08lx\n", pm, md, va));
+
+       prevptr = &SLIST_FIRST(&md->pvh_list); /* prev pv_entry ptr */
        pv = *prevptr;
 
        while (pv) {
                if (pv->pv_pmap == pm && pv->pv_va == va) {     /* match? */
-                       NPDEBUG(PDB_PVDUMP, printf("pmap_remove_pv: pm %p, pg "
-                           "%p, flags 0x%x\n", pm, pg, pv->pv_flags));
+                       NPDEBUG(PDB_PVDUMP, printf("pmap_remove_pv: pm %p, md "
+                           "%p\n", pm, md));
                        if (pv->pv_flags & PVF_WIRED) {
                                --pm->pm_stats.wired_count;
                        }
@@ -981,14 +981,14 @@
                        if (pm == pmap_kernel()) {
                                PMAPCOUNT(kernel_unmappings);
                                if (pv->pv_flags & PVF_WRITE)
-                                       pg->mdpage.krw_mappings--;
+                                       md->krw_mappings--;
                                else
-                                       pg->mdpage.kro_mappings--;
+                                       md->kro_mappings--;
                        } else {
                                if (pv->pv_flags & PVF_WRITE)
-                                       pg->mdpage.urw_mappings--;
+                                       md->urw_mappings--;
                                else
-                                       pg->mdpage.uro_mappings--;
+                                       md->uro_mappings--;
                        }
 
                        PMAPCOUNT(unmappings);
@@ -1000,12 +1000,12 @@
                         * this was the last mapping, discard the contents,
                         * otherwise sync the i-cache for this page.
                         */
-                       if (PV_IS_EXEC_P(pg->mdpage.pvh_attrs)) {
-                               if (SLIST_EMPTY(&pg->mdpage.pvh_list)) {
-                                       pg->mdpage.pvh_attrs &= ~PVF_EXEC;
+                       if (PV_IS_EXEC_P(md->pvh_attrs)) {
+                               if (SLIST_EMPTY(&md->pvh_list)) {
+                                       md->pvh_attrs &= ~PVF_EXEC;
                                        PMAPCOUNT(exec_discarded_unmap);
                                } else {
-                                       pmap_syncicache_page(&pg->mdpage, VM_PAGE_TO_PHYS(pg));
+                                       pmap_syncicache_page(md, pa);
                                        PMAPCOUNT(exec_synced_unmap);
                                }
                        }
@@ -1021,18 +1021,18 @@
         * If we no longer have a WRITEABLE KENTRY at the head of list,
         * clear the KMOD attribute from the page.
         */
-       if (SLIST_FIRST(&pg->mdpage.pvh_list) == NULL
-           || (SLIST_FIRST(&pg->mdpage.pvh_list)->pv_flags & PVF_KWRITE) != PVF_KWRITE)
-               pg->mdpage.pvh_attrs &= ~PVF_KMOD;
+       if (SLIST_FIRST(&md->pvh_list) == NULL
+           || (SLIST_FIRST(&md->pvh_list)->pv_flags & PVF_KWRITE) != PVF_KWRITE)
+               md->pvh_attrs &= ~PVF_KMOD;
 
        /*
         * If this was a writeable page and there are no more writeable
         * mappings (ignoring KMPAGE), clear the WRITE flag and writeback
         * the contents to memory.
         */
-       if (pg->mdpage.krw_mappings + pg->mdpage.urw_mappings == 0)
-               pg->mdpage.pvh_attrs &= ~PVF_WRITE;
-       KASSERT((pg->mdpage.pvh_attrs & PVF_DMOD) == 0 || (pg->mdpage.pvh_attrs & (PVF_DIRTY|PVF_NC)));
+       if (md->krw_mappings + md->urw_mappings == 0)
+               md->pvh_attrs &= ~PVF_WRITE;
+       KASSERT((md->pvh_attrs & PVF_DMOD) == 0 || (md->pvh_attrs & (PVF_DIRTY|PVF_NC)));
 #endif /* PMAP_CACHE_VIPT */
 
        return(pv);                             /* return removed pv */
@@ -1051,7 +1051,7 @@
  * Modify a physical-virtual mapping in the pv table
  */
 static u_int
-pmap_modify_pv(struct vm_page *pg, pmap_t pm, vaddr_t va,
+pmap_modify_pv(struct vm_page_md *md, paddr_t pa, pmap_t pm, vaddr_t va,
     u_int clr_mask, u_int set_mask)
 {
        struct pv_entry *npv;
@@ -1060,22 +1060,22 @@
        KASSERT((clr_mask & PVF_KENTRY) == 0);
        KASSERT((set_mask & PVF_KENTRY) == 0);
 
-       if ((npv = pmap_find_pv(&pg->mdpage, pm, va)) == NULL)
+       if ((npv = pmap_find_pv(md, pm, va)) == NULL)
                return (0);
 
        NPDEBUG(PDB_PVDUMP,
-           printf("pmap_modify_pv: pm %p, pg %p, clr 0x%x, set 0x%x, flags 0x%x\n", pm, pg, clr_mask, set_mask, npv->pv_flags));
+           printf("pmap_modify_pv: pm %p, md %p, clr 0x%x, set 0x%x, flags 0x%x\n", pm, md, clr_mask, set_mask, npv->pv_flags));
 
        /*
         * There is at least one VA mapping this page.
         */
 
        if (clr_mask & (PVF_REF | PVF_MOD)) {
-               pg->mdpage.pvh_attrs |= set_mask & (PVF_REF | PVF_MOD);
+               md->pvh_attrs |= set_mask & (PVF_REF | PVF_MOD);
 #ifdef PMAP_CACHE_VIPT
-               if ((pg->mdpage.pvh_attrs & (PVF_DMOD|PVF_NC)) != PVF_NC)
-                       pg->mdpage.pvh_attrs |= PVF_DIRTY;
-               KASSERT((pg->mdpage.pvh_attrs & PVF_DMOD) == 0 || (pg->mdpage.pvh_attrs & (PVF_DIRTY|PVF_NC)));
+               if ((md->pvh_attrs & (PVF_DMOD|PVF_NC)) != PVF_NC)
+                       md->pvh_attrs |= PVF_DIRTY;
+               KASSERT((md->pvh_attrs & PVF_DMOD) == 0 || (md->pvh_attrs & (PVF_DIRTY|PVF_NC)));
 #endif
        }
 
@@ -1092,38 +1092,38 @@
        if ((flags ^ oflags) & PVF_WRITE) {
                if (pm == pmap_kernel()) {
                        if (flags & PVF_WRITE) {
-                               pg->mdpage.krw_mappings++;
-                               pg->mdpage.kro_mappings--;
+                               md->krw_mappings++;
+                               md->kro_mappings--;
                        } else {
-                               pg->mdpage.kro_mappings++;
-                               pg->mdpage.krw_mappings--;
+                               md->kro_mappings++;
+                               md->krw_mappings--;
                        }
                } else {
                        if (flags & PVF_WRITE) {
-                               pg->mdpage.urw_mappings++;
-                               pg->mdpage.uro_mappings--;
+                               md->urw_mappings++;
+                               md->uro_mappings--;
                        } else {
-                               pg->mdpage.uro_mappings++;
-                               pg->mdpage.urw_mappings--;
+                               md->uro_mappings++;
+                               md->urw_mappings--;
                        }
                }
        }
 #ifdef PMAP_CACHE_VIPT
-       if (pg->mdpage.urw_mappings + pg->mdpage.krw_mappings == 0)
-               pg->mdpage.pvh_attrs &= ~PVF_WRITE;
+       if (md->urw_mappings + md->krw_mappings == 0)
+               md->pvh_attrs &= ~PVF_WRITE;
        /*
         * We have two cases here: the first is from enter_pv (new exec
         * page), the second is a combined pmap_remove_pv/pmap_enter_pv.
         * Since in latter, pmap_enter_pv won't do anything, we just have
         * to do what pmap_remove_pv would do.
         */
-       if ((PV_IS_EXEC_P(flags) && !PV_IS_EXEC_P(pg->mdpage.pvh_attrs))
-           || (PV_IS_EXEC_P(pg->mdpage.pvh_attrs)
+       if ((PV_IS_EXEC_P(flags) && !PV_IS_EXEC_P(md->pvh_attrs))
+           || (PV_IS_EXEC_P(md->pvh_attrs)
                || (!(flags & PVF_WRITE) && (oflags & PVF_WRITE)))) {
-               pmap_syncicache_page(&pg->mdpage, VM_PAGE_TO_PHYS(pg));
+               pmap_syncicache_page(md, pa);
                PMAPCOUNT(exec_synced_remap);
        }
-       KASSERT((pg->mdpage.pvh_attrs & PVF_DMOD) == 0 || (pg->mdpage.pvh_attrs & (PVF_DIRTY|PVF_NC)));
+       KASSERT((md->pvh_attrs & PVF_DMOD) == 0 || (md->pvh_attrs & (PVF_DIRTY|PVF_NC)));
 #endif
 
        PMAPCOUNT(remappings);
@@ -2866,7 +2866,7 @@
                         * We're changing the attrs of an existing mapping.
                         */
                        simple_lock(&pg->mdpage.pvh_slock);
-                       oflags = pmap_modify_pv(pg, pm, va,
+                       oflags = pmap_modify_pv(&pg->mdpage, VM_PAGE_TO_PHYS(pg), pm, va,
                            PVF_WRITE | PVF_EXEC | PVF_WIRED |
                            PVF_MOD | PVF_REF, nflags);
                        simple_unlock(&pg->mdpage.pvh_slock);
@@ -2894,7 +2894,7 @@
                                 * must remove it from the PV list
                                 */
                                simple_lock(&opg->mdpage.pvh_slock);
-                               pv = pmap_remove_pv(opg, pm, va);
+                               pv = pmap_remove_pv(&opg->mdpage, VM_PAGE_TO_PHYS(opg), pm, va);
                                pmap_vac_me_harder(opg, pm, 0);
                                simple_unlock(&opg->mdpage.pvh_slock);
                                oflags = pv->pv_flags;
@@ -2957,7 +2957,7 @@
                         * at this address.
                         */
                        simple_lock(&opg->mdpage.pvh_slock);
-                       pv = pmap_remove_pv(opg, pm, va);
+                       pv = pmap_remove_pv(&opg->mdpage, VM_PAGE_TO_PHYS(opg), pm, va);
                        pmap_vac_me_harder(opg, pm, 0);
                        simple_unlock(&opg->mdpage.pvh_slock);
                        oflags = pv->pv_flags;
@@ -3151,7 +3151,7 @@
                        if ((pg = PHYS_TO_VM_PAGE(pa)) != NULL) {
                                struct pv_entry *pv;
                                simple_lock(&pg->mdpage.pvh_slock);
-                               pv = pmap_remove_pv(pg, pm, sva);
+                               pv = pmap_remove_pv(&pg->mdpage, VM_PAGE_TO_PHYS(pg), pm, sva);
                                pmap_vac_me_harder(pg, pm, 0);
                                simple_unlock(&pg->mdpage.pvh_slock);
                                if (pv != NULL) {
@@ -3279,7 +3279,7 @@
        KASSERT(arm_cache_prefer_mask == 0 || pg->mdpage.pvh_attrs & (PVF_COLORED|PVF_NC));
        KASSERT((pg->mdpage.pvh_attrs & PVF_KMPAGE) == 0);
 
-       pv = pmap_remove_pv(pg, pmap_kernel(), va);
+       pv = pmap_remove_pv(&pg->mdpage, VM_PAGE_TO_PHYS(pg), pmap_kernel(), va);
        KASSERT(pv);
        KASSERT(pv->pv_flags & PVF_KENTRY);
 
@@ -3625,7 +3625,7 @@
 
                                if (pg != NULL) {
                                        simple_lock(&pg->mdpage.pvh_slock);
-                                       f = pmap_modify_pv(pg, pm, sva,
+                                       f = pmap_modify_pv(&pg->mdpage, VM_PAGE_TO_PHYS(pg), pm, sva,
                                            clr_mask, 0);
                                        pmap_vac_me_harder(pg, pm, sva);
                                        simple_unlock(&pg->mdpage.pvh_slock);
@@ -4077,7 +4077,7 @@
        if ((pg = PHYS_TO_VM_PAGE(pa)) != NULL) {
                /* Update the wired bit in the pv entry for this page. */
                simple_lock(&pg->mdpage.pvh_slock);
-               (void) pmap_modify_pv(pg, pm, va, PVF_WIRED, 0);
+               (void) pmap_modify_pv(&pg->mdpage, VM_PAGE_TO_PHYS(pg), pm, va, PVF_WIRED, 0);
                simple_unlock(&pg->mdpage.pvh_slock);
        }
 



Home | Main Index | Thread Index | Old Index