summaryrefslogtreecommitdiff
path: root/sys/arch/sparc
diff options
context:
space:
mode:
authorMiod Vallat <miod@cvs.openbsd.org>2007-09-10 18:49:46 +0000
committerMiod Vallat <miod@cvs.openbsd.org>2007-09-10 18:49:46 +0000
commitb3c8c11717dc2654a849620f8f2671da4b4042fd (patch)
tree03f29ae358d0dbf5a8ac49aa7b0a310d1b0ad6b1 /sys/arch/sparc
parentf9bdf407d1c2a9694df07c9cf1d03a399b8d3c7e (diff)
Introduce a md pmap hook, pmap_remove_holes(), which is supposed to mark
the holes a MMU may have from a given vm_map. This will be automagically invoked for newly created vmspaces. On platforms with MMU holes (e.g. sun4, sun4c and vax), this prevents mmap(2) hints which would end up being in the hole to be accepted as valid, causing unexpected signals when the process tries to access the hole (since pmap can not fill the hole anyway). Unfortunately, the logic mmap() uses to pick a valid address for anonymous mappings needs work, as it will only try to find an address higher than the hint, which causes all mmap() with a hint in the hole to fail on vax. This will be improved later.
Diffstat (limited to 'sys/arch/sparc')
-rw-r--r--sys/arch/sparc/include/pmap.h3
-rw-r--r--sys/arch/sparc/sparc/pmap.c21
2 files changed, 22 insertions, 2 deletions
diff --git a/sys/arch/sparc/include/pmap.h b/sys/arch/sparc/include/pmap.h
index 8e0e2a94973..449c5b6eb6e 100644
--- a/sys/arch/sparc/include/pmap.h
+++ b/sys/arch/sparc/include/pmap.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: pmap.h,v 1.41 2007/06/06 17:15:12 deraadt Exp $ */
+/* $OpenBSD: pmap.h,v 1.42 2007/09/10 18:49:45 miod Exp $ */
/* $NetBSD: pmap.h,v 1.30 1997/08/04 20:00:47 pk Exp $ */
/*
@@ -283,6 +283,7 @@ vaddr_t pmap_map(vaddr_t, paddr_t, paddr_t, int);
void pmap_reference(pmap_t);
void pmap_release(pmap_t);
void pmap_remove(pmap_t, vaddr_t, vaddr_t);
+void pmap_remove_holes(struct vm_map *);
int pmap_page_index(paddr_t);
void pmap_virtual_space(vaddr_t *, vaddr_t *);
void pmap_redzone(void);
diff --git a/sys/arch/sparc/sparc/pmap.c b/sys/arch/sparc/sparc/pmap.c
index 5eceee1cffd..56f03b9ccb6 100644
--- a/sys/arch/sparc/sparc/pmap.c
+++ b/sys/arch/sparc/sparc/pmap.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: pmap.c,v 1.145 2007/06/06 17:15:12 deraadt Exp $ */
+/* $OpenBSD: pmap.c,v 1.146 2007/09/10 18:49:45 miod Exp $ */
/* $NetBSD: pmap.c,v 1.118 1998/05/19 19:00:18 thorpej Exp $ */
/*
@@ -6151,6 +6151,25 @@ pmap_prefer(foff, vap)
}
void
+pmap_remove_holes(struct vm_map *map)
+{
+#if defined(SUN4) || defined(SUN4C)
+ if (mmu_has_hole) {
+ vaddr_t shole, ehole;
+
+ shole = max(vm_map_min(map), (vaddr_t)MMU_HOLE_START);
+ ehole = min(vm_map_max(map), (vaddr_t)MMU_HOLE_END);
+
+ if (ehole <= shole)
+ return;
+
+ uvm_map_reserve(map, ehole - shole, UVM_UNKNOWN_OFFSET,
+ 0, &shole);
+ }
+#endif
+}
+
+void
pmap_redzone()
{
#if defined(SUN4M)