Module Name: src
Committed By: martin
Date: Wed Sep 11 18:27:44 UTC 2013
Modified Files:
src/sys/arch/sparc64/include: pmap.h
src/sys/arch/sparc64/sparc64: pmap.c
Log Message:
Disallow MAP_FIXED mmap's in the sparc64 VA hole (XXX - need to deal with
different variants of the hole for different CPU types)
To generate a diff of this commit:
cvs rdiff -u -r1.55 -r1.56 src/sys/arch/sparc64/include/pmap.h
cvs rdiff -u -r1.280 -r1.281 src/sys/arch/sparc64/sparc64/pmap.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/sparc64/include/pmap.h
diff -u src/sys/arch/sparc64/include/pmap.h:1.55 src/sys/arch/sparc64/include/pmap.h:1.56
--- src/sys/arch/sparc64/include/pmap.h:1.55 Thu Oct 6 06:55:34 2011
+++ src/sys/arch/sparc64/include/pmap.h Wed Sep 11 18:27:44 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: pmap.h,v 1.55 2011/10/06 06:55:34 mrg Exp $ */
+/* $NetBSD: pmap.h,v 1.56 2013/09/11 18:27:44 martin Exp $ */
/*-
* Copyright (C) 1995, 1996 Wolfgang Solfrank.
@@ -90,6 +90,11 @@
#ifndef _LOCORE
+#ifdef _LP64
+int sparc64_mmap_range_test(vaddr_t, vaddr_t);
+#define MD_MMAP_RANGE_TEST(MINVA, MAXVA) sparc64_mmap_range_test(MINVA, MAXVA)
+#endif
+
/*
* Support for big page sizes. This maps the page size to the
* page bits.
Index: src/sys/arch/sparc64/sparc64/pmap.c
diff -u src/sys/arch/sparc64/sparc64/pmap.c:1.280 src/sys/arch/sparc64/sparc64/pmap.c:1.281
--- src/sys/arch/sparc64/sparc64/pmap.c:1.280 Fri Jan 25 17:12:33 2013
+++ src/sys/arch/sparc64/sparc64/pmap.c Wed Sep 11 18:27:44 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: pmap.c,v 1.280 2013/01/25 17:12:33 hannken Exp $ */
+/* $NetBSD: pmap.c,v 1.281 2013/09/11 18:27:44 martin Exp $ */
/*
*
* Copyright (C) 1996-1999 Eduardo Horvath.
@@ -26,7 +26,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.280 2013/01/25 17:12:33 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.281 2013/09/11 18:27:44 martin Exp $");
#undef NO_VCACHE /* Don't forget the locked TLB in dostart */
#define HWREF
@@ -1839,6 +1839,11 @@ pmap_enter(struct pmap *pm, vaddr_t va,
retry:
i = pseg_set(pm, va, tte.data, ptp);
+ if (i == -2) {
+ if (flags & PMAP_CANFAIL)
+ return (ENOMEM);
+ panic("pmap_enter: invalid VA (inside hole)");
+ }
if (i & 4) {
/* ptp used as L3 */
KASSERT(ptp != 0);
@@ -3735,3 +3740,19 @@ pmap_zero_page(paddr_t pa)
dcache_flush_page_all(pa);
pmap_zero_page_phys(pa);
}
+
+#ifdef _LP64
+int
+sparc64_mmap_range_test(vaddr_t addr, vaddr_t eaddr)
+{
+ const vaddr_t hole_start = 0x000007ffffffffff;
+ const vaddr_t hole_end = 0xfffff80000000000;
+
+ if (addr >= hole_end)
+ return 0;
+ if (eaddr <= hole_start)
+ return 0;
+
+ return EINVAL;
+}
+#endif