Index: arch/hppa/hppa/pmap.c =================================================================== RCS file: /cvsroot/src/sys/arch/hppa/hppa/pmap.c,v retrieving revision 1.43.8.43 diff -u -p -u -r1.43.8.43 pmap.c --- arch/hppa/hppa/pmap.c 28 Mar 2009 11:00:47 -0000 1.43.8.43 +++ arch/hppa/hppa/pmap.c 31 Mar 2009 17:12:34 -0000 @@ -207,7 +233,7 @@ static inline struct pv_entry *pmap_pv_r static inline void pmap_flush_page(struct vm_page *, bool); -void pmap_copy_page(paddr_t, paddr_t); +void pmap_copy_page(struct vm_page *, struct vm_page *); #ifdef USE_HPT static inline struct hpt_entry *pmap_hash(pmap_t, vaddr_t); @@ -1662,33 +1735,39 @@ pmap_flush_page(struct vm_page *pg, bool { struct pv_entry *pve; + /* XXXNH icache ??? */ /* purge cache for all possible mappings for the pa */ mutex_enter(&pg->mdpage.pvh_lock); - for (pve = pg->mdpage.pvh_list; pve; pve = pve->pv_next) + for (pve = pg->mdpage.pvh_list; pve; pve = pve->pv_next) { if (purge) pdcache(pve->pv_pmap->pm_space, pve->pv_va, PAGE_SIZE); else fdcache(pve->pv_pmap->pm_space, pve->pv_va, PAGE_SIZE); + pdtlb(pve->pv_pmap->pm_space, pve->pv_va); + pitlb(pve->pv_pmap->pm_space, pve->pv_va); + } mutex_exit(&pg->mdpage.pvh_lock); } /* - * pmap_zero_page(pa) + * pmap_zero_page(pg) * * Zeros the specified page. */ void -pmap_zero_page(paddr_t pa) +pmap_zero_page(struct vm_page *pg) { - struct vm_page *pg = PHYS_TO_VM_PAGE(pa); - - DPRINTF(PDB_FOLLOW|PDB_PHYS, ("%s(%x)\n", __func__, (int)pa)); + paddr_t pa = VM_PAGE_TO_PHYS(pg); KASSERT(pg->mdpage.pvh_list == NULL); - pmap_flush_page(pg, true); + DPRINTF(PDB_FOLLOW|PDB_PHYS, ("%s(%x)\n", __func__, (int)pa)); + memset((void *)pa, 0, PAGE_SIZE); fdcache(HPPA_SID_KERNEL, pa, PAGE_SIZE); + pdtlb(HPPA_SID_KERNEL, pa); + ficache(HPPA_SID_KERNEL, pa, PAGE_SIZE); + pitlb(HPPA_SID_KERNEL, pa); } /* @@ -1700,10 +1779,10 @@ pmap_zero_page(paddr_t pa) * physical address since there is usually no mapping for it. */ void -pmap_copy_page(paddr_t spa, paddr_t dpa) +pmap_copy_page(struct vm_page *srcpg, struct vm_page *dstpg) { - struct vm_page *srcpg = PHYS_TO_VM_PAGE(spa); - struct vm_page *dstpg = PHYS_TO_VM_PAGE(dpa); + paddr_t spa = VM_PAGE_TO_PHYS(srcpg); + paddr_t dpa = VM_PAGE_TO_PHYS(dstpg); DPRINTF(PDB_FOLLOW|PDB_PHYS, ("%s(%x, %x)\n", __func__, (int)spa, (int)dpa)); @@ -1711,12 +1790,18 @@ pmap_copy_page(paddr_t spa, paddr_t dpa) KASSERT(dstpg->mdpage.pvh_list == NULL); pmap_flush_page(srcpg, false); - pmap_flush_page(dstpg, true); + //pmap_flush_page(dstpg, true); -- NOP memcpy((void *)dpa, (void *)spa, PAGE_SIZE); pdcache(HPPA_SID_KERNEL, spa, PAGE_SIZE); fdcache(HPPA_SID_KERNEL, dpa, PAGE_SIZE); + pdtlb(HPPA_SID_KERNEL, spa); + pdtlb(HPPA_SID_KERNEL, dpa); + ficache(HPPA_SID_KERNEL, spa, PAGE_SIZE); + ficache(HPPA_SID_KERNEL, dpa, PAGE_SIZE); + pitlb(HPPA_SID_KERNEL, spa); + pitlb(HPPA_SID_KERNEL, dpa); } void Index: uvm/uvm_page.c =================================================================== RCS file: /cvsroot/src/sys/uvm/uvm_page.c,v retrieving revision 1.140.4.2 diff -u -p -u -r1.140.4.2 uvm_page.c --- uvm/uvm_page.c 3 Mar 2009 18:34:40 -0000 1.140.4.2 +++ uvm/uvm_page.c 31 Mar 2009 17:13:37 -0000 @@ -1226,7 +1226,7 @@ uvm_pagealloc_strat(struct uvm_object *o */ pg->flags &= ~PG_CLEAN; if (zeroit) - pmap_zero_page(VM_PAGE_TO_PHYS(pg)); + pmap_zero_page(pg); } return(pg); @@ -1652,7 +1652,7 @@ uvm_pageidlezero(void) goto quit; } #else - pmap_zero_page(VM_PAGE_TO_PHYS(pg)); + pmap_zero_page(pg); #endif /* PMAP_PAGEIDLEZERO */ pg->flags |= PG_ZERO; @@ -1825,7 +1825,7 @@ void uvm_pagezero(struct vm_page *pg) { pg->flags &= ~PG_CLEAN; - pmap_zero_page(VM_PAGE_TO_PHYS(pg)); + pmap_zero_page(pg); } /* @@ -1840,7 +1840,7 @@ uvm_pagecopy(struct vm_page *src, struct { dst->flags &= ~PG_CLEAN; - pmap_copy_page(VM_PAGE_TO_PHYS(src), VM_PAGE_TO_PHYS(dst)); + pmap_copy_page(src, dst); } /* Index: uvm/uvm_pmap.h =================================================================== RCS file: /cvsroot/src/sys/uvm/uvm_pmap.h,v retrieving revision 1.23.2.1 diff -u -p -u -r1.23.2.1 uvm_pmap.h --- uvm/uvm_pmap.h 19 Jan 2009 13:20:36 -0000 1.23.2.1 +++ uvm/uvm_pmap.h 31 Mar 2009 17:13:37 -0000 @@ -128,7 +128,7 @@ void pmap_collect(pmap_t); void pmap_copy(pmap_t, pmap_t, vaddr_t, vsize_t, vaddr_t); #endif #if !defined(pmap_copy_page) -void pmap_copy_page(paddr_t, paddr_t); +void pmap_copy_page(struct vm_page *, struct vm_page *); #endif struct pmap *pmap_create(void); void pmap_destroy(pmap_t); @@ -172,7 +172,7 @@ long pmap_resident_count(pmap_t); long pmap_wired_count(pmap_t); #endif #if !defined(pmap_zero_page) -void pmap_zero_page(paddr_t); +void pmap_zero_page(struct vm_page *); #endif void pmap_virtual_space(vaddr_t *, vaddr_t *);