Module Name: src Committed By: uebayasi Date: Thu Feb 25 05:54:03 UTC 2010
Modified Files: src/sys/arch/sparc/include [uebayasi-xip]: vmparam.h src/sys/arch/sparc64/sparc64 [uebayasi-xip]: pmap.c Log Message: Use VM_PAGE_TO_MD(). Only compile tested. To generate a diff of this commit: cvs rdiff -u -r1.40.2.1 -r1.40.2.2 src/sys/arch/sparc/include/vmparam.h cvs rdiff -u -r1.250 -r1.250.2.1 src/sys/arch/sparc64/sparc64/pmap.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/sparc/include/vmparam.h diff -u src/sys/arch/sparc/include/vmparam.h:1.40.2.1 src/sys/arch/sparc/include/vmparam.h:1.40.2.2 --- src/sys/arch/sparc/include/vmparam.h:1.40.2.1 Tue Feb 23 15:27:56 2010 +++ src/sys/arch/sparc/include/vmparam.h Thu Feb 25 05:54:03 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: vmparam.h,v 1.40.2.1 2010/02/23 15:27:56 uebayasi Exp $ */ +/* $NetBSD: vmparam.h,v 1.40.2.2 2010/02/25 05:54:03 uebayasi Exp $ */ /* * Copyright (c) 1992, 1993 @@ -136,7 +136,7 @@ int pv_flags; /* flags (below) */ } pvlisthead; }; -#define VM_MDPAGE_PVHEAD(pg) (&(pg)->mdpage.pvlisthead) +#define VM_MDPAGE_PVHEAD(pg) (&VM_PAGE_TO_MD(pg)->pvlisthead) #define VM_MDPAGE_INIT(md, pa) do { \ (md)->pvlisthead.pv_next = NULL; \ Index: src/sys/arch/sparc64/sparc64/pmap.c diff -u src/sys/arch/sparc64/sparc64/pmap.c:1.250 src/sys/arch/sparc64/sparc64/pmap.c:1.250.2.1 --- src/sys/arch/sparc64/sparc64/pmap.c:1.250 Fri Feb 5 12:04:10 2010 +++ src/sys/arch/sparc64/sparc64/pmap.c Thu Feb 25 05:54:03 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: pmap.c,v 1.250 2010/02/05 12:04:10 martin Exp $ */ +/* $NetBSD: pmap.c,v 1.250.2.1 2010/02/25 05:54:03 uebayasi Exp $ */ /* * * Copyright (C) 1996-1999 Eduardo Horvath. @@ -26,7 +26,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.250 2010/02/05 12:04:10 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.250.2.1 2010/02/25 05:54:03 uebayasi Exp $"); #undef NO_VCACHE /* Don't forget the locked TLB in dostart */ #define HWREF @@ -1398,9 +1398,13 @@ /* we could be a little smarter and leave pages zeroed */ for (pg = TAILQ_FIRST(&pm->pm_obj.memq); pg != NULL; pg = nextpg) { +#ifdef DIAGNOSTIC + struct vm_page_md * const md = VM_PAGE_TO_MD(pg); +#endif + nextpg = TAILQ_NEXT(pg, listq.queue); TAILQ_REMOVE(&pm->pm_obj.memq, pg, listq.queue); - KASSERT(pg->mdpage.mdpg_pvh.pv_pmap == NULL); + KASSERT(md->mdpg_pvh.pv_pmap == NULL); uvm_pagefree(pg); } pmap_free_page((paddr_t)(u_long)pm->pm_segs); @@ -1667,7 +1671,9 @@ */ pg = PHYS_TO_VM_PAGE(pa); if (pg) { - pvh = &pg->mdpage.mdpg_pvh; + struct vm_page_md * const md = VM_PAGE_TO_MD(pg); + + pvh = &md->mdpg_pvh; uncached = (pvh->pv_va & (PV_ALIAS|PV_NVC)); #ifdef DIAGNOSTIC if ((flags & VM_PROT_ALL) & ~prot) @@ -2064,8 +2070,10 @@ pg = PHYS_TO_VM_PAGE(pa); if (pg) { + struct vm_page_md * const md = VM_PAGE_TO_MD(pg); + /* Save REF/MOD info */ - pv = &pg->mdpage.mdpg_pvh; + pv = &md->mdpg_pvh; if (data & TLB_ACCESS) pv->pv_va |= PV_REF; if (data & TLB_MODIFY) @@ -2410,6 +2418,7 @@ bool pmap_clear_modify(struct vm_page *pg) { + struct vm_page_md * const md = VM_PAGE_TO_MD(pg); pv_entry_t pv; int rv; int changed = 0; @@ -2424,7 +2433,7 @@ #endif mutex_enter(&pmap_lock); /* Clear all mappings */ - pv = &pg->mdpage.mdpg_pvh; + pv = &md->mdpg_pvh; #ifdef DEBUG if (pv->pv_va & PV_MOD) pv->pv_va |= PV_WE; /* Remember this was modified */ @@ -2493,6 +2502,7 @@ bool pmap_clear_reference(struct vm_page *pg) { + struct vm_page_md * const md = VM_PAGE_TO_MD(pg); pv_entry_t pv; int rv; int changed = 0; @@ -2506,7 +2516,7 @@ referenced = pmap_is_referenced_locked(pg); #endif /* Clear all references */ - pv = &pg->mdpage.mdpg_pvh; + pv = &md->mdpg_pvh; if (pv->pv_va & PV_REF) { changed |= 1; pv->pv_va &= ~PV_REF; @@ -2559,7 +2569,7 @@ pv_check(); #ifdef DEBUG if (pmap_is_referenced_locked(pg)) { - pv = &pg->mdpage.mdpg_pvh; + pv = &md->mdpg_pvh; printf("pmap_clear_reference(): %p still referenced " "(pmap = %p, ctx = %d)\n", pg, pv->pv_pmap, pv->pv_pmap ? pmap_ctx(pv->pv_pmap) : 0); @@ -2584,13 +2594,14 @@ bool pmap_is_modified(struct vm_page *pg) { + struct vm_page_md * const md = VM_PAGE_TO_MD(pg); pv_entry_t pv, npv; bool res = false; KASSERT(!mutex_owned(&pmap_lock)); /* Check if any mapping has been modified */ - pv = &pg->mdpage.mdpg_pvh; + pv = &md->mdpg_pvh; if (pv->pv_va & PV_MOD) res = true; #ifdef HWREF @@ -2640,13 +2651,14 @@ static bool pmap_is_referenced_locked(struct vm_page *pg) { + struct vm_page_md * const md = VM_PAGE_TO_MD(pg); pv_entry_t pv, npv; bool res = false; KASSERT(mutex_owned(&pmap_lock)); /* Check if any mapping has been referenced */ - pv = &pg->mdpage.mdpg_pvh; + pv = &md->mdpg_pvh; if (pv->pv_va & PV_REF) return true; @@ -2688,13 +2700,14 @@ bool pmap_is_referenced(struct vm_page *pg) { + struct vm_page_md * const md = VM_PAGE_TO_MD(pg); pv_entry_t pv; bool res = false; KASSERT(!mutex_owned(&pmap_lock)); /* Check if any mapping has been referenced */ - pv = &pg->mdpage.mdpg_pvh; + pv = &md->mdpg_pvh; if (pv->pv_va & PV_REF) return true; @@ -2766,6 +2779,7 @@ void pmap_page_protect(struct vm_page *pg, vm_prot_t prot) { + struct vm_page_md * const md = VM_PAGE_TO_MD(pg); int64_t clear, set; int64_t data = 0; int rv; @@ -2778,7 +2792,7 @@ ("pmap_page_protect: pg %p prot %x\n", pg, prot)); mutex_enter(&pmap_lock); - pv = &pg->mdpage.mdpg_pvh; + pv = &md->mdpg_pvh; if (prot & (VM_PROT_READ|VM_PROT_EXECUTE)) { /* copy_on_write */ @@ -3171,11 +3185,12 @@ pmap_enter_pv(struct pmap *pmap, vaddr_t va, paddr_t pa, struct vm_page *pg, pv_entry_t npv) { + struct vm_page_md * const md = VM_PAGE_TO_MD(pg); pv_entry_t pvh; KASSERT(mutex_owned(&pmap_lock)); - pvh = &pg->mdpage.mdpg_pvh; + pvh = &md->mdpg_pvh; DPRINTF(PDB_ENTER, ("pmap_enter: pvh %p: was %lx/%p/%p\n", pvh, pvh->pv_va, pvh->pv_pmap, pvh->pv_next)); if (pvh->pv_pmap == NULL) { @@ -3232,12 +3247,13 @@ pv_entry_t pmap_remove_pv(struct pmap *pmap, vaddr_t va, struct vm_page *pg) { + struct vm_page_md * const md = VM_PAGE_TO_MD(pg); pv_entry_t pvh, npv, pv; int64_t data = 0; KASSERT(mutex_owned(&pmap_lock)); - pvh = &pg->mdpage.mdpg_pvh; + pvh = &md->mdpg_pvh; DPRINTF(PDB_REMOVE, ("pmap_remove_pv(pm=%p, va=%p, pg=%p)\n", pmap, (void *)(u_long)va, pg)); @@ -3308,6 +3324,7 @@ pmap_page_cache(struct pmap *pm, paddr_t pa, int mode) { struct vm_page *pg; + struct vm_page_md *md; pv_entry_t pv; vaddr_t va; int rv; @@ -3317,7 +3334,8 @@ DPRINTF(PDB_ENTER, ("pmap_page_uncache(%llx)\n", (unsigned long long)pa)); pg = PHYS_TO_VM_PAGE(pa); - pv = &pg->mdpage.mdpg_pvh; + md = VM_PAGE_TO_MD(pg); + pv = &md->mdpg_pvh; while (pv) { va = pv->pv_va & PV_VAMASK; if (pv->pv_va & PV_NC) { @@ -3399,6 +3417,7 @@ db_dump_pv(db_expr_t addr, int have_addr, db_expr_t count, const char *modif) { struct vm_page *pg; + struct vm_page_md *md; struct pv_entry *pv; if (!have_addr) { @@ -3411,7 +3430,8 @@ db_printf("page is not managed\n"); return; } - for (pv = &pg->mdpage.mdpg_pvh; pv; pv = pv->pv_next) + md = VM_PAGE_TO_MD(pg); + for (pv = &md->mdpg_pvh; pv; pv = pv->pv_next) db_printf("p...@%p: next=%p pmap=%p va=0x%llx\n", pv, pv->pv_next, pv->pv_pmap, (unsigned long long)pv->pv_va);