diff options
author | 2011-07-07 18:40:12 +0000 | |
---|---|---|
committer | 2011-07-07 18:40:12 +0000 | |
commit | 34cd121b5f0d61e575a36cc875eda368a3e9a2ec (patch) | |
tree | 65a5b29a9e23caadae2a638cfe0bca6ff4040c22 | |
parent | Do not use absolute paths for things on our (very simple safe) path. (diff) | |
download | wireguard-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.c | 38 | ||||
-rw-r--r-- | sys/arch/hppa64/include/pmap.h | 5 |
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) |