summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkettenis <kettenis@openbsd.org>2011-07-07 18:40:12 +0000
committerkettenis <kettenis@openbsd.org>2011-07-07 18:40:12 +0000
commit34cd121b5f0d61e575a36cc875eda368a3e9a2ec (patch)
tree65a5b29a9e23caadae2a638cfe0bca6ff4040c22
parentDo not use absolute paths for things on our (very simple safe) path. (diff)
downloadwireguard-openbsd-34cd121b5f0d61e575a36cc875eda368a3e9a2ec.tar.xz
wireguard-openbsd-34cd121b5f0d61e575a36cc875eda368a3e9a2ec.zip
Bring over a few more cache flushing and TLB purging fixes from hppa.
-rw-r--r--sys/arch/hppa64/hppa64/pmap.c38
-rw-r--r--sys/arch/hppa64/include/pmap.h5
2 files changed, 35 insertions, 8 deletions
diff --git a/sys/arch/hppa64/hppa64/pmap.c b/sys/arch/hppa64/hppa64/pmap.c
index de522cfa6bb..606a900e454 100644
--- a/sys/arch/hppa64/hppa64/pmap.c
+++ b/sys/arch/hppa64/hppa64/pmap.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: pmap.c,v 1.17 2011/07/04 17:07:27 kettenis Exp $ */
+/* $OpenBSD: pmap.c,v 1.18 2011/07/07 18:40:12 kettenis Exp $ */
/*
* Copyright (c) 2005 Michael Shalayeff
@@ -229,6 +229,7 @@ pmap_pde_release(struct pmap *pmap, vaddr_t va, struct vm_page *ptp)
panic("pmap_pde_release: busy page table page");
#endif
pdcache(HPPA_SID_KERNEL, (vaddr_t)ptp, PAGE_SIZE);
+ pdtlb(HPPA_SID_KERNEL, (vaddr_t)ptp);
uvm_pagefree(ptp);
}
}
@@ -254,12 +255,13 @@ pmap_pte_set(volatile pt_entry_t *pde, vaddr_t va, pt_entry_t pte)
void
pmap_pte_flush(struct pmap *pmap, vaddr_t va, pt_entry_t pte)
{
+ fdcache(pmap->pm_space, va, PAGE_SIZE);
if (pte & PTE_EXEC) {
ficache(pmap->pm_space, va, PAGE_SIZE);
+ pdtlb(pmap->pm_space, va);
pitlb(pmap->pm_space, va);
- }
- fdcache(pmap->pm_space, va, PAGE_SIZE);
- pdtlb(pmap->pm_space, va);
+ } else
+ pdtlb(pmap->pm_space, va);
}
static __inline pt_entry_t
@@ -1078,11 +1080,15 @@ pmap_flush_page(struct vm_page *pg, int purge)
/* purge cache for all possible mappings for the pa */
simple_lock(&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);
+ ficache(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);
+}
simple_unlock(&pg->mdpage.pvh_lock);
}
@@ -1096,6 +1102,7 @@ pmap_zero_page(struct vm_page *pg)
pmap_flush_page(pg, 1);
bzero((void *)pa, PAGE_SIZE);
fdcache(HPPA_SID_KERNEL, pa, PAGE_SIZE);
+ pdtlb(HPPA_SID_KERNEL, pa);
}
void
@@ -1110,6 +1117,8 @@ pmap_copy_page(struct vm_page *srcpg, struct vm_page *dstpg)
bcopy((void *)spa, (void *)dpa, 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);
}
void
@@ -1209,3 +1218,22 @@ pmap_kremove(vaddr_t va, vsize_t size)
DPRINTF(PDB_FOLLOW|PDB_REMOVE, ("pmap_kremove: leaving\n"));
}
+
+void
+pmap_proc_iflush(struct proc *p, vaddr_t va, vsize_t len)
+{
+ struct pmap *pmap = p->p_vmspace->vm_map.pmap;
+
+ fdcache(pmap->pm_space, va, len);
+ sync_caches();
+ ficache(pmap->pm_space, va, len);
+ sync_caches();
+}
+
+struct vm_page *
+pmap_unmap_direct(vaddr_t va)
+{
+ fdcache(HPPA_SID_KERNEL, va, PAGE_SIZE);
+ pdtlb(HPPA_SID_KERNEL, va);
+ return (PHYS_TO_VM_PAGE(va));
+}
diff --git a/sys/arch/hppa64/include/pmap.h b/sys/arch/hppa64/include/pmap.h
index ed847b04cfe..af516aee4c4 100644
--- a/sys/arch/hppa64/include/pmap.h
+++ b/sys/arch/hppa64/include/pmap.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: pmap.h,v 1.6 2011/05/07 15:27:01 oga Exp $ */
+/* $OpenBSD: pmap.h,v 1.7 2011/07/07 18:40:12 kettenis Exp $ */
/*
* Copyright (c) 2005 Michael Shalayeff
@@ -51,7 +51,7 @@ extern struct pmap kernel_pmap_store;
* pool quickmaps
*/
#define pmap_map_direct(pg) ((vaddr_t)VM_PAGE_TO_PHYS(pg))
-#define pmap_unmap_direct(va) PHYS_TO_VM_PAGE((paddr_t)(va))
+struct vm_page *pmap_unmap_direct(vaddr_t);
#define __HAVE_PMAP_DIRECT
/*
@@ -87,7 +87,6 @@ pmap_prefer(vaddr_t offs, vaddr_t hint)
#define pmap_is_modified(pg) pmap_testbit(pg, PTE_DIRTY)
#define pmap_is_referenced(pg) pmap_testbit(pg, PTE_REFTRAP)
-#define pmap_proc_iflush(p,va,len) /* nothing */
#define pmap_unuse_final(p) /* nothing */
#define pmap_remove_holes(map) do { /* nothing */ } while (0)