summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorderaadt <deraadt@openbsd.org>2015-02-09 13:34:49 +0000
committerderaadt <deraadt@openbsd.org>2015-02-09 13:34:49 +0000
commitb6134f1ff7f34f28bb23e680295c760a7df5df42 (patch)
tree3ccf73e41951cea46ef1502c06d4dd82387ba9b1
parentgetdtablecount() can go NOLOCK (diff)
downloadwireguard-openbsd-b6134f1ff7f34f28bb23e680295c760a7df5df42.tar.xz
wireguard-openbsd-b6134f1ff7f34f28bb23e680295c760a7df5df42.zip
sync
-rw-r--r--sys/arch/powerpc/include/pmap.h12
-rw-r--r--sys/arch/powerpc/powerpc/bus_space.c81
-rw-r--r--sys/arch/powerpc/powerpc/pmap.c94
-rw-r--r--sys/kern/init_sysent.c6
-rw-r--r--sys/kern/syscalls.c4
-rw-r--r--sys/sys/syscall.h4
-rw-r--r--sys/sys/syscallargs.h4
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