Index: arch/hppa/hppa/pmap.c =================================================================== RCS file: /cvsroot/src/sys/arch/hppa/hppa/pmap.c,v retrieving revision 1.49 diff -u -p -u -r1.49 pmap.c --- arch/hppa/hppa/pmap.c 30 Apr 2009 07:01:27 -0000 1.49 +++ arch/hppa/hppa/pmap.c 31 May 2009 19:38:28 -0000 @@ -256,7 +304,16 @@ pmap_pagealloc(struct uvm_object *obj, v void pmap_pagefree(struct vm_page *pg) { - fdcache(HPPA_SID_KERNEL, VM_PAGE_TO_PHYS(pg), PAGE_SIZE); + paddr_t pa = VM_PAGE_TO_PHYS(pg); + /* + * XXXNH purge is probably good enough, although page might + * zero, so could tell UVM that (after flushing). + */ + fdcache(HPPA_SID_KERNEL, pa, PAGE_SIZE); + pdtlb(HPPA_SID_KERNEL, pa); + ficache(HPPA_SID_KERNEL, pa, PAGE_SIZE); + pitlb(HPPA_SID_KERNEL, pa); + uvm_pagefree(pg); } @@ -799,6 +890,7 @@ pmap_bootstrap(vaddr_t vstart) va = HPPA_IOBEGIN; /* now map the pde for the physmem */ memset((void *)addr, 0, PAGE_SIZE); + fdcache(HPPA_SID_KERNEL, addr, PAGE_SIZE); DPRINTF(PDB_INIT|PDB_VP, ("%s: pde premap 0x%08x 0x%08x\n", __func__, (int)va, (int)addr)); Index: arch/hppa/include/pmap.h =================================================================== RCS file: /cvsroot/src/sys/arch/hppa/include/pmap.h,v retrieving revision 1.21 diff -u -p -u -r1.21 pmap.h --- arch/hppa/include/pmap.h 24 May 2009 06:53:35 -0000 1.21 +++ arch/hppa/include/pmap.h 31 May 2009 19:38:28 -0000 @@ -122,6 +122,11 @@ static inline paddr_t hppa_unmap_poolpag { pdcache(HPPA_SID_KERNEL, va, PAGE_SIZE); + /* PA2.0 only */ + pdtlb(HPPA_SID_KERNEL, va); + ficache(HPPA_SID_KERNEL, va, PAGE_SIZE); + pitlb(HPPA_SID_KERNEL, va); + return (paddr_t)va; }