diff options
author | 2015-02-09 13:34:49 +0000 | |
---|---|---|
committer | 2015-02-09 13:34:49 +0000 | |
commit | b6134f1ff7f34f28bb23e680295c760a7df5df42 (patch) | |
tree | 3ccf73e41951cea46ef1502c06d4dd82387ba9b1 | |
parent | getdtablecount() can go NOLOCK (diff) | |
download | wireguard-openbsd-b6134f1ff7f34f28bb23e680295c760a7df5df42.tar.xz wireguard-openbsd-b6134f1ff7f34f28bb23e680295c760a7df5df42.zip |
sync
-rw-r--r-- | sys/arch/powerpc/include/pmap.h | 12 | ||||
-rw-r--r-- | sys/arch/powerpc/powerpc/bus_space.c | 81 | ||||
-rw-r--r-- | sys/arch/powerpc/powerpc/pmap.c | 94 | ||||
-rw-r--r-- | sys/kern/init_sysent.c | 6 | ||||
-rw-r--r-- | sys/kern/syscalls.c | 4 | ||||
-rw-r--r-- | sys/sys/syscall.h | 4 | ||||
-rw-r--r-- | sys/sys/syscallargs.h | 4 |
7 files changed, 109 insertions, 96 deletions
diff --git a/sys/arch/powerpc/include/pmap.h b/sys/arch/powerpc/include/pmap.h index 74d188675d0..dfeba5b50db 100644 --- a/sys/arch/powerpc/include/pmap.h +++ b/sys/arch/powerpc/include/pmap.h @@ -1,4 +1,4 @@ -/* $OpenBSD: pmap.h,v 1.52 2015/01/22 17:55:45 mpi Exp $ */ +/* $OpenBSD: pmap.h,v 1.53 2015/02/09 13:34:49 deraadt Exp $ */ /* $NetBSD: pmap.h,v 1.1 1996/09/30 16:34:29 ws Exp $ */ /*- @@ -71,6 +71,9 @@ typedef u_int sr_t; #define VP_IDX2_MASK (VP_IDX2_SIZE-1) #define VP_IDX2_POS 12 +/* functions used by the bus layer for device accesses */ +void pmap_kenter_cache(vaddr_t va, paddr_t pa, vm_prot_t prot, int cacheable); + /* cache flags */ #define PMAP_CACHE_DEFAULT 0 /* WB cache managed mem, devices not */ #define PMAP_CACHE_CI 1 /* cache inhibit */ @@ -155,11 +158,12 @@ int reserve_dumppages(caddr_t p); #define PG_PMAP_EXE PG_PMAP2 /* - * MD flags that we use for pmap_enter (in the pa): + * MD flags to pmap_enter: */ -#define PMAP_PA_MASK ~((paddr_t)PAGE_MASK) /* to remove the flags */ + +/* to get just the pa from params to pmap_enter */ +#define PMAP_PA_MASK ~((paddr_t)PAGE_MASK) #define PMAP_NOCACHE 0x1 /* map uncached */ -#define PMAP_WT 0x2 /* map write-through */ #endif /* _KERNEL */ diff --git a/sys/arch/powerpc/powerpc/bus_space.c b/sys/arch/powerpc/powerpc/bus_space.c index 578654bddf5..3e3b0b4c4f5 100644 --- a/sys/arch/powerpc/powerpc/bus_space.c +++ b/sys/arch/powerpc/powerpc/bus_space.c @@ -1,4 +1,4 @@ -/* $OpenBSD: bus_space.c,v 1.3 2015/02/08 06:21:04 mpi Exp $ */ +/* $OpenBSD: bus_space.c,v 1.4 2015/02/09 13:34:49 deraadt Exp $ */ /* $NetBSD: machdep.c,v 1.4 1996/10/16 19:33:11 ws Exp $ */ /* @@ -46,6 +46,7 @@ extern struct extent *devio_ex; int bus_mem_add_mapping(bus_addr_t, bus_size_t, int, bus_space_handle_t *); bus_addr_t bus_space_unmap_p(bus_space_tag_t, bus_space_handle_t, bus_size_t); +void bus_space_unmap(bus_space_tag_t, bus_space_handle_t, bus_size_t); /* BUS functions */ @@ -100,27 +101,28 @@ bus_space_unmap(bus_space_tag_t t, bus_space_handle_t bsh, bus_size_t size) bus_size_t off, len; bus_addr_t bpa; + /* should this verify that the proper size is freed? */ sva = trunc_page(bsh); off = bsh - sva; - len = round_page(size+off); + len = size+off; if (pmap_extract(pmap_kernel(), sva, &bpa) == TRUE) { - if (extent_free(devio_ex, bpa | (bsh & PAGE_MASK), size, - EX_NOWAIT | (ppc_malloc_ok ? EX_MALLOCOK : 0))) + if (extent_free(devio_ex, bpa | (bsh & PAGE_MASK), size, EX_NOWAIT | + (ppc_malloc_ok ? EX_MALLOCOK : 0))) { printf("bus_space_map: pa 0x%lx, size 0x%lx\n", bpa, size); printf("bus_space_map: can't free region\n"); } } - - pmap_kremove(sva, len); - pmap_update(pmap_kernel()); - /* do not free memory which was stolen from the vm system */ if (ppc_malloc_ok && ((sva >= VM_MIN_KERNEL_ADDRESS) && (sva < VM_MAX_KERNEL_ADDRESS))) - km_free((void *)sva, len, &kv_any, &kp_none); + uvm_km_free(kernel_map, sva, len); + else { + pmap_remove(pmap_kernel(), sva, sva + len); + pmap_update(pmap_kernel()); + } } paddr_t @@ -153,46 +155,48 @@ bus_mem_add_mapping(bus_addr_t bpa, bus_size_t size, int flags, { bus_addr_t vaddr; bus_addr_t spa, epa; - bus_size_t off, len; - int pmapflags; + bus_size_t off; + int len; spa = trunc_page(bpa); epa = bpa + size; off = bpa - spa; - len = round_page(size+off); + len = size+off; -#ifdef DIAGNOSTIC - if (epa <= spa && epa != 0) +#if 0 + if (epa <= spa) { panic("bus_mem_add_mapping: overflow"); + } #endif - if (ppc_malloc_ok == 0) { + bus_size_t alloc_size; + /* need to steal vm space before kernel vm is initialized */ + alloc_size = round_page(len); + vaddr = VM_MIN_KERNEL_ADDRESS + ppc_kvm_stolen; - ppc_kvm_stolen += len; + ppc_kvm_stolen += alloc_size; if (ppc_kvm_stolen > PPC_SEGMENT_LENGTH) { panic("ppc_kvm_stolen, out of space"); } } else { - vaddr = (vaddr_t)km_alloc(len, &kv_any, &kp_none, &kd_nowait); + vaddr = uvm_km_valloc(kernel_map, len); if (vaddr == 0) return (ENOMEM); } *bshp = vaddr + off; - - if (flags & BUS_SPACE_MAP_CACHEABLE) - pmapflags = PMAP_WT; - else - pmapflags = PMAP_NOCACHE; - +#ifdef DEBUG_BUS_MEM_ADD_MAPPING + printf("mapping %x size %x to %x vbase %x\n", + bpa, size, *bshp, spa); +#endif for (; len > 0; len -= PAGE_SIZE) { - pmap_kenter_pa(vaddr, spa | pmapflags, PROT_READ | PROT_WRITE); + pmap_kenter_cache(vaddr, spa, PROT_READ | PROT_WRITE, + (flags & BUS_SPACE_MAP_CACHEABLE) ? + PMAP_CACHE_WT : PMAP_CACHE_CI); spa += PAGE_SIZE; vaddr += PAGE_SIZE; } - pmap_update(pmap_kernel()); - - return (0); + return 0; } int @@ -230,18 +234,18 @@ mapiodev(paddr_t pa, psize_t len) panic("ppc_kvm_stolen, out of space"); } } else { - va = (vaddr_t)km_alloc(size, &kv_any, &kp_none, &kd_nowait); - if (va == 0) - return (NULL); + va = uvm_km_valloc(kernel_map, size); } + if (va == 0) + return NULL; + for (vaddr = va; size > 0; size -= PAGE_SIZE) { - pmap_kenter_pa(vaddr, spa, PROT_READ | PROT_WRITE); + pmap_kenter_cache(vaddr, spa, + PROT_READ | PROT_WRITE, PMAP_CACHE_DEFAULT); spa += PAGE_SIZE; vaddr += PAGE_SIZE; } - pmap_update(pmap_kernel()); - return (void *) (va+off); } @@ -251,14 +255,17 @@ unmapiodev(void *kva, psize_t p_size) vaddr_t vaddr; int size; - size = round_page(p_size); + size = p_size; vaddr = trunc_page((vaddr_t)kva); - pmap_kremove(vaddr, size); - pmap_update(pmap_kernel()); + uvm_km_free(kernel_map, vaddr, size); - km_free((void *)vaddr, size, &kv_any, &kp_none); + for (; size > 0; size -= PAGE_SIZE) { + pmap_remove(pmap_kernel(), vaddr, vaddr + PAGE_SIZE - 1); + vaddr += PAGE_SIZE; + } + pmap_update(pmap_kernel()); } diff --git a/sys/arch/powerpc/powerpc/pmap.c b/sys/arch/powerpc/powerpc/pmap.c index 8827bb7f31a..513dbffb7bf 100644 --- a/sys/arch/powerpc/powerpc/pmap.c +++ b/sys/arch/powerpc/powerpc/pmap.c @@ -1,4 +1,4 @@ -/* $OpenBSD: pmap.c,v 1.140 2015/01/22 19:47:00 deraadt Exp $ */ +/* $OpenBSD: pmap.c,v 1.141 2015/02/09 13:34:49 deraadt Exp $ */ /* * Copyright (c) 2001, 2002, 2007 Dale Rahn. @@ -153,9 +153,9 @@ void pmap_hash_remove(struct pte_desc *); void pte_insert32(struct pte_desc *) __noprof; void pte_insert64(struct pte_desc *) __noprof; void pmap_fill_pte64(pmap_t, vaddr_t, paddr_t, struct pte_desc *, vm_prot_t, - int) __noprof; + int, int) __noprof; void pmap_fill_pte32(pmap_t, vaddr_t, paddr_t, struct pte_desc *, vm_prot_t, - int) __noprof; + int, int) __noprof; void pmap_syncicache_user_virt(pmap_t pm, vaddr_t va); @@ -535,15 +535,11 @@ pmap_enter(pmap_t pm, vaddr_t va, paddr_t pa, vm_prot_t prot, int flags) struct pte_desc *pted; struct vm_page *pg; boolean_t nocache = (pa & PMAP_NOCACHE) != 0; - boolean_t wt = (pa & PMAP_WT) != 0; int s; int need_sync = 0; int cache; int error; - KASSERT(!(wt && nocache)); - pa &= PMAP_PA_MASK; - /* MP - Acquire lock for this pmap */ s = splvm(); @@ -575,19 +571,19 @@ pmap_enter(pmap_t pm, vaddr_t va, paddr_t pa, vm_prot_t prot, int flags) } } + pa &= PMAP_PA_MASK; + + /* Calculate PTE */ pg = PHYS_TO_VM_PAGE(pa); - if (wt) - cache = PMAP_CACHE_WT; - else if (pg != NULL && !(pg->pg_flags & PG_DEV) && !nocache) - cache = PMAP_CACHE_WB; + if (pg != NULL && !nocache) + cache = PMAP_CACHE_WB; /* managed memory is cacheable */ else cache = PMAP_CACHE_CI; - /* Calculate PTE */ if (ppc_proc_is_64b) - pmap_fill_pte64(pm, va, pa, pted, prot, cache); + pmap_fill_pte64(pm, va, pa, pted, prot, flags, cache); else - pmap_fill_pte32(pm, va, pa, pted, prot, cache); + pmap_fill_pte32(pm, va, pa, pted, prot, flags, cache); if (pg != NULL) { pmap_enter_pv(pted, pg); /* only managed mem */ @@ -764,17 +760,12 @@ pmap_remove_pg(pmap_t pm, vaddr_t va) * */ void -pmap_kenter_pa(vaddr_t va, paddr_t pa, vm_prot_t prot) +_pmap_kenter_pa(vaddr_t va, paddr_t pa, vm_prot_t prot, int flags, int cache) { struct pte_desc *pted; struct vm_page *pg; - boolean_t nocache = (pa & PMAP_NOCACHE) != 0; - boolean_t wt = (pa & PMAP_WT) != 0; + int s; pmap_t pm; - int cache, s; - - KASSERT(!(wt && nocache)); - pa &= PMAP_PA_MASK; pm = pmap_kernel(); @@ -786,7 +777,6 @@ pmap_kenter_pa(vaddr_t va, paddr_t pa, vm_prot_t prot) pmap_remove_pg(pm, va); /* pted is reused */ pm->pm_stats.resident_count++; - if (prot & PROT_WRITE) { pg = PHYS_TO_VM_PAGE(pa); if (pg != NULL) @@ -799,19 +789,19 @@ pmap_kenter_pa(vaddr_t va, paddr_t pa, vm_prot_t prot) va, pa); } - pg = PHYS_TO_VM_PAGE(pa); - if (wt) - cache = PMAP_CACHE_WT; - else if (pg != NULL && !(pg->pg_flags & PG_DEV) && !nocache) - cache = PMAP_CACHE_WB; - else - cache = PMAP_CACHE_CI; + if (cache == PMAP_CACHE_DEFAULT) { + pg = PHYS_TO_VM_PAGE(pa); + if (pg != NULL && (pg->pg_flags & PG_DEV) == 0) + cache = PMAP_CACHE_WB; + else + cache = PMAP_CACHE_CI; + } /* Calculate PTE */ if (ppc_proc_is_64b) - pmap_fill_pte64(pm, va, pa, pted, prot, cache); + pmap_fill_pte64(pm, va, pa, pted, prot, flags, cache); else - pmap_fill_pte32(pm, va, pa, pted, prot, cache); + pmap_fill_pte32(pm, va, pa, pted, prot, flags, cache); /* * Insert into HTAB @@ -836,6 +826,18 @@ pmap_kenter_pa(vaddr_t va, paddr_t pa, vm_prot_t prot) splx(s); } +void +pmap_kenter_pa(vaddr_t va, paddr_t pa, vm_prot_t prot) +{ + _pmap_kenter_pa(va, pa, prot, 0, PMAP_CACHE_DEFAULT); +} + +void +pmap_kenter_cache(vaddr_t va, paddr_t pa, vm_prot_t prot, int cacheable) +{ + _pmap_kenter_pa(va, pa, prot, 0, cacheable); +} + /* * remove kernel (pmap_kernel()) mappings */ @@ -949,7 +951,7 @@ pmap_hash_remove(struct pte_desc *pted) */ void pmap_fill_pte64(pmap_t pm, vaddr_t va, paddr_t pa, struct pte_desc *pted, - vm_prot_t prot, int cache) + vm_prot_t prot, int flags, int cache) { sr_t sr; struct pte_64 *pte64; @@ -989,7 +991,7 @@ pmap_fill_pte64(pmap_t pm, vaddr_t va, paddr_t pa, struct pte_desc *pted, */ void pmap_fill_pte32(pmap_t pm, vaddr_t va, paddr_t pa, struct pte_desc *pted, - vm_prot_t prot, int cache) + vm_prot_t prot, int flags, int cache) { sr_t sr; struct pte_32 *pte32; @@ -1711,24 +1713,24 @@ pmap_deactivate(struct proc *p) { } -/* - * pmap_extract: extract a PA for the given VA - */ - +/* + * Get the physical page address for the given pmap/virtual address. + */ boolean_t pmap_extract(pmap_t pm, vaddr_t va, paddr_t *pa) { struct pte_desc *pted; - if (pm == pmap_kernel() && va < physmaxaddr) { - *pa = va; - return TRUE; - } - pted = pmap_vp_lookup(pm, va); - if (pted == NULL || !PTED_VALID(pted)) + if (pted == NULL || !PTED_VALID(pted)) { + if (pm == pmap_kernel() && va < 0x80000000) { + /* XXX - this is not true without BATs */ + /* if in kernel, va==pa for 0-0x80000000 */ + *pa = va; + return TRUE; + } return FALSE; - + } if (ppc_proc_is_64b) *pa = (pted->p.pted_pte64.pte_lo & PTE_RPGN_64) | (va & ~PTE_RPGN_64); @@ -2242,12 +2244,12 @@ pte_spill_r(u_int32_t va, u_int32_t msr, u_int32_t dsisr, int exec_fault) aligned_va = trunc_page(va); if (ppc_proc_is_64b) { pmap_fill_pte64(pm, aligned_va, aligned_va, - pted, prot, PMAP_CACHE_WB); + pted, prot, 0, PMAP_CACHE_WB); pte_insert64(pted); return 1; } else { pmap_fill_pte32(pm, aligned_va, aligned_va, - pted, prot, PMAP_CACHE_WB); + pted, prot, 0, PMAP_CACHE_WB); pte_insert32(pted); return 1; } diff --git a/sys/kern/init_sysent.c b/sys/kern/init_sysent.c index 34dfa4c8ab1..edcb7a510c4 100644 --- a/sys/kern/init_sysent.c +++ b/sys/kern/init_sysent.c @@ -1,10 +1,10 @@ -/* $OpenBSD: init_sysent.c,v 1.161 2014/12/08 20:56:34 guenther Exp $ */ +/* $OpenBSD: init_sysent.c,v 1.162 2015/02/09 13:34:49 deraadt Exp $ */ /* * System call switch table. * * DO NOT EDIT-- this file is automatically generated. - * created from; OpenBSD: syscalls.master,v 1.149 2014/12/08 20:56:11 guenther Exp + * created from; OpenBSD: syscalls.master,v 1.150 2015/02/09 13:34:19 deraadt Exp */ #include <sys/param.h> @@ -54,7 +54,7 @@ struct sysent sysent[] = { sys_chown }, /* 16 = chown */ { 1, s(struct sys_obreak_args), 0, sys_obreak }, /* 17 = break */ - { 0, 0, 0, + { 0, 0, SY_NOLOCK | 0, sys_getdtablecount }, /* 18 = getdtablecount */ { 2, s(struct sys_getrusage_args), 0, sys_getrusage }, /* 19 = getrusage */ diff --git a/sys/kern/syscalls.c b/sys/kern/syscalls.c index 705971ee151..427827559f5 100644 --- a/sys/kern/syscalls.c +++ b/sys/kern/syscalls.c @@ -1,10 +1,10 @@ -/* $OpenBSD: syscalls.c,v 1.162 2014/12/08 20:56:34 guenther Exp $ */ +/* $OpenBSD: syscalls.c,v 1.163 2015/02/09 13:34:49 deraadt Exp $ */ /* * System call names. * * DO NOT EDIT-- this file is automatically generated. - * created from; OpenBSD: syscalls.master,v 1.149 2014/12/08 20:56:11 guenther Exp + * created from; OpenBSD: syscalls.master,v 1.150 2015/02/09 13:34:19 deraadt Exp */ char *syscallnames[] = { diff --git a/sys/sys/syscall.h b/sys/sys/syscall.h index bcee306b2e2..cab4cd28374 100644 --- a/sys/sys/syscall.h +++ b/sys/sys/syscall.h @@ -1,10 +1,10 @@ -/* $OpenBSD: syscall.h,v 1.161 2014/12/08 20:56:34 guenther Exp $ */ +/* $OpenBSD: syscall.h,v 1.162 2015/02/09 13:34:49 deraadt Exp $ */ /* * System call numbers. * * DO NOT EDIT-- this file is automatically generated. - * created from; OpenBSD: syscalls.master,v 1.149 2014/12/08 20:56:11 guenther Exp + * created from; OpenBSD: syscalls.master,v 1.150 2015/02/09 13:34:19 deraadt Exp */ /* syscall: "syscall" ret: "int" args: "int" "..." */ diff --git a/sys/sys/syscallargs.h b/sys/sys/syscallargs.h index 67e0dddc48f..a8a005566c5 100644 --- a/sys/sys/syscallargs.h +++ b/sys/sys/syscallargs.h @@ -1,10 +1,10 @@ -/* $OpenBSD: syscallargs.h,v 1.163 2014/12/08 20:56:34 guenther Exp $ */ +/* $OpenBSD: syscallargs.h,v 1.164 2015/02/09 13:34:49 deraadt Exp $ */ /* * System call argument lists. * * DO NOT EDIT-- this file is automatically generated. - * created from; OpenBSD: syscalls.master,v 1.149 2014/12/08 20:56:11 guenther Exp + * created from; OpenBSD: syscalls.master,v 1.150 2015/02/09 13:34:19 deraadt Exp */ #ifdef syscallarg |