summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormiod <miod@openbsd.org>2010-06-29 21:26:09 +0000
committermiod <miod@openbsd.org>2010-06-29 21:26:09 +0000
commitf4918fc13c48ea19564f3b4d43bf6b19d5fc1acf (patch)
tree6bacac714f3d7b391b10c55694a10875303fcb92
parentFix an obviously wrong comment. ok reyk@ (diff)
downloadwireguard-openbsd-f4918fc13c48ea19564f3b4d43bf6b19d5fc1acf.tar.xz
wireguard-openbsd-f4918fc13c48ea19564f3b4d43bf6b19d5fc1acf.zip
There is absolutely no need to double map DVMA addresses into the kernel address
space on SRMMU systems (i.e. sun4m), so don't do it anymore and update misleading comments.
-rw-r--r--sys/arch/sparc/include/param.h12
-rw-r--r--sys/arch/sparc/include/pmap.h10
-rw-r--r--sys/arch/sparc/sparc/machdep.c41
-rw-r--r--sys/arch/sparc/sparc/vaddrs.h23
-rw-r--r--sys/arch/sparc/sparc/vm_machdep.c25
5 files changed, 31 insertions, 80 deletions
diff --git a/sys/arch/sparc/include/param.h b/sys/arch/sparc/include/param.h
index 4eb288b689b..71cc97bf954 100644
--- a/sys/arch/sparc/include/param.h
+++ b/sys/arch/sparc/include/param.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: param.h,v 1.40 2007/11/28 16:33:20 martin Exp $ */
+/* $OpenBSD: param.h,v 1.41 2010/06/29 21:26:09 miod Exp $ */
/* $NetBSD: param.h,v 1.29 1997/03/10 22:50:37 pk Exp $ */
/*
@@ -112,16 +112,6 @@
#define btodb(x) ((x) >> DEV_BSHIFT)
#define dbtob(x) ((x) << DEV_BSHIFT)
-/*
- * dvmamap manages a range of DVMA addresses intended to create double
- * mappings of physical memory. In a way, `dvmamap' is a submap of the
- * VM map `phys_map'. The difference is the use of the `resource map'
- * routines to manage page allocation, allowing DVMA addresses to be
- * allocated and freed from within interrupt routines.
- *
- * Note that `phys_map' can still be used to allocate memory-backed pages
- * in DVMA space.
- */
#ifdef _KERNEL
#ifndef _LOCORE
extern vaddr_t dvma_base;
diff --git a/sys/arch/sparc/include/pmap.h b/sys/arch/sparc/include/pmap.h
index 9c6a85917b2..e4c1c780dc8 100644
--- a/sys/arch/sparc/include/pmap.h
+++ b/sys/arch/sparc/include/pmap.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: pmap.h,v 1.46 2010/06/06 10:04:33 miod Exp $ */
+/* $OpenBSD: pmap.h,v 1.47 2010/06/29 21:26:09 miod Exp $ */
/* $NetBSD: pmap.h,v 1.30 1997/08/04 20:00:47 pk Exp $ */
/*
@@ -58,8 +58,8 @@
* both into the same structure. Fortunately, they are almost the same.
*
* The kernel begins at 0xf8000000 and runs to 0xffffffff (although
- * some of this is not actually used). Kernel space, including DVMA
- * space (for now?), is mapped identically into all user contexts.
+ * some of this is not actually used). Kernel space is mapped identically
+ * into all user contexts.
* There is no point in duplicating this mapping in each user process
* so they do not appear in the user structures.
*
@@ -72,8 +72,8 @@
* makes no such distinction.
*
* Since each virtual segment covers 256 kbytes, the user space
- * requires 3584 segments, while the kernel (including DVMA) requires
- * only 512 segments.
+ * requires 3584 segments, while the kernel (including DVMA on 4/4c)
+ * requires only 512 segments.
*
*
** FOR THE SUN4/SUN4C
diff --git a/sys/arch/sparc/sparc/machdep.c b/sys/arch/sparc/sparc/machdep.c
index 4ed5029fe22..ead377a6ad5 100644
--- a/sys/arch/sparc/sparc/machdep.c
+++ b/sys/arch/sparc/sparc/machdep.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: machdep.c,v 1.126 2010/06/27 13:28:47 miod Exp $ */
+/* $OpenBSD: machdep.c,v 1.127 2010/06/29 21:26:12 miod Exp $ */
/* $NetBSD: machdep.c,v 1.85 1997/09/12 08:55:02 pk Exp $ */
/*
@@ -100,7 +100,6 @@
#endif
struct vm_map *exec_map = NULL;
-struct vm_map *phys_map = NULL;
/*
* Declare these as initialized data so we can patch them.
@@ -128,11 +127,10 @@ int sparc_led_blink = 0;
* safepri is a safe priority for sleep to set for a spin-wait
* during autoconfiguration or after a panic.
*/
-int safepri = 0;
+int safepri = 0;
/*
- * dvmamap is used to manage DVMA memory. Note: this coincides with
- * the memory range in `phys_map' (which is mostly a place-holder).
+ * dvmamap_extent is used to manage DVMA memory.
*/
vaddr_t dvma_base, dvma_end;
struct extent *dvmamap_extent;
@@ -192,38 +190,11 @@ cpu_startup()
* map, but we want one completely separate, even though it uses
* the same pmap.
*/
- dvma_base = CPU_ISSUN4M ? DVMA4M_BASE : DVMA_BASE;
- dvma_end = CPU_ISSUN4M ? DVMA4M_END : DVMA_END;
-#if defined(SUN4M)
- if (CPU_ISSUN4M) {
- /*
- * The DVMA space we want partially overrides kernel_map.
- * Allocate it in kernel_map as well to prevent it from being
- * used for other things.
- */
- if (uvm_map(kernel_map, &dvma_base,
- vm_map_max(kernel_map) - dvma_base,
- NULL, UVM_UNKNOWN_OFFSET, 0,
- UVM_MAPFLAG(UVM_PROT_NONE, UVM_PROT_NONE, UVM_INH_NONE,
- UVM_ADV_NORMAL, UVM_FLAG_FIXED)))
- panic("startup: can not steal dvma map");
- }
-#endif
- phys_map = uvm_map_create(pmap_kernel(), dvma_base, dvma_end,
- VM_MAP_INTRSAFE);
- if (phys_map == NULL)
- panic("unable to create DVMA map");
-
- /*
- * Allocate DVMA space and dump into a privately managed
- * resource map for double mappings which is usable from
- * interrupt contexts.
- */
- if (uvm_km_valloc_wait(phys_map, (dvma_end-dvma_base)) != dvma_base)
- panic("unable to allocate from DVMA map");
+ dvma_base = CPU_ISSUN4DOR4M ? DVMA4M_BASE : DVMA_BASE;
+ dvma_end = CPU_ISSUN4DOR4M ? DVMA4M_END : DVMA_END;
dvmamap_extent = extent_create("dvmamap", dvma_base, dvma_end,
M_DEVBUF, NULL, 0, EX_NOWAIT);
- if (dvmamap_extent == 0)
+ if (dvmamap_extent == NULL)
panic("unable to allocate extent for dvma");
#ifdef DEBUG
diff --git a/sys/arch/sparc/sparc/vaddrs.h b/sys/arch/sparc/sparc/vaddrs.h
index e833b72416e..5afd25688dc 100644
--- a/sys/arch/sparc/sparc/vaddrs.h
+++ b/sys/arch/sparc/sparc/vaddrs.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: vaddrs.h,v 1.7 2005/04/17 18:47:51 miod Exp $ */
+/* $OpenBSD: vaddrs.h,v 1.8 2010/06/29 21:26:12 miod Exp $ */
/* $NetBSD: vaddrs.h,v 1.8 1997/03/10 23:54:41 pk Exp $ */
/*
@@ -52,10 +52,10 @@
* Special (fixed) virtual addresses on the SPARC.
*
* IO virtual space begins at 0xfe000000 (a segment boundary) and
- * continues up to the DVMA edge at 0xff000000. (The upper all-1s
- * byte is special since some of the hardware supplies this to pad
- * a 24-bit address space out to 32 bits. This is a legacy of the
- * IBM PC AT bus, actually, just so you know who to blame.)
+ * continues up to the DVMA edge at 0xff000000 (on non-SRMMU systems only).
+ * (The upper all-1s byte is special anyway since some of the hardware
+ * supplies this to pad a 24-bit address space out to 32 bits. This is a
+ * legacy of the IBM PC AT bus, actually, just so you know who to blame.)
*
* We reserve several pages at the base of our IO virtual space
* for `oft-used' devices which must be present anyway in order to
@@ -100,20 +100,9 @@
* Note that pagetables must be allocated at a cost of 1k per MB of DVMA
* space, plus severe alignment restrictions. So don't make DVMA4M_BASE too
* low (max space = 2G).
- *
- * Since DVMA space overlaps with normal kernel address space (notably
- * the device mappings and the PROM), we don't want to put any DVMA
- * mappings where any of this useful stuff is (i.e. if we dvma_malloc
- * a buffer, we want to still have a SRMMU mapping to it, and we can't
- * have that if its on top of kernel code). Thus the last two
- * constants define the actual DVMA addresses used. These can be anything
- * as long as they are within the bounds setup by the first 2 constants.
- * This is especially important on MP systems with cache coherency: to
- * avoid consistency problems, DVMA addresses must map to the same place
- * in both processor and IOMMU space.
*/
#define DVMA4M_BASE 0xfc000000 /* can change subject to above rule */
-#define DVMA4M_END 0xfffff000 /* XXX is this enough? */
+#define DVMA4M_END 0xfffff000
#define DVMA_D24_BASE 0xff000000
#define DVMA_D24_END 0xfffff000
diff --git a/sys/arch/sparc/sparc/vm_machdep.c b/sys/arch/sparc/sparc/vm_machdep.c
index 7c3f8617c94..912be7ddf40 100644
--- a/sys/arch/sparc/sparc/vm_machdep.c
+++ b/sys/arch/sparc/sparc/vm_machdep.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: vm_machdep.c,v 1.52 2010/06/22 20:27:32 oga Exp $ */
+/* $OpenBSD: vm_machdep.c,v 1.53 2010/06/29 21:26:12 miod Exp $ */
/* $NetBSD: vm_machdep.c,v 1.30 1997/03/10 23:55:40 pk Exp $ */
/*
@@ -140,7 +140,8 @@ u_long dvma_cachealign = 0;
/*
* Map a range [va, va+len] of wired virtual addresses in the given map
- * to a kernel address in DVMA space.
+ * to a valid DVMA address. On non-SRMMU systems, this establish a
+ * second mapping of that range.
*/
vaddr_t
dvma_mapin_space(map, va, len, canwait, space)
@@ -222,33 +223,33 @@ dvma_mapin_space(map, va, len, canwait, space)
}
/*
- * Remove double map of `va' in DVMA space at `kva'.
+ * Remove DVMA mapping of `va' in DVMA space at `dva'.
*/
void
-dvma_mapout(kva, va, len)
- vaddr_t kva, va;
+dvma_mapout(dva, va, len)
+ vaddr_t dva, va;
int len;
{
int s, off;
int error;
- int klen;
+ int dlen;
- off = (int)kva & PGOFSET;
- kva -= off;
- klen = round_page(len + off);
+ off = (int)dva & PGOFSET;
+ dva -= off;
+ dlen = round_page(len + off);
#if defined(SUN4M)
if (CPU_ISSUN4M)
- iommu_remove(kva, klen);
+ iommu_remove(dva, dlen);
else
#endif
{
- pmap_kremove(kva, klen);
+ pmap_kremove(dva, dlen);
pmap_update(pmap_kernel());
}
s = splhigh();
- error = extent_free(dvmamap_extent, kva, klen, EX_NOWAIT);
+ error = extent_free(dvmamap_extent, dva, dlen, EX_NOWAIT);
if (error)
printf("dvma_mapout: extent_free failed\n");
splx(s);