Module Name:    src
Committed By:   riastradh
Date:           Thu Nov 15 04:59:02 UTC 2018

Modified Files:
        src/sys/arch/amd64/amd64: machdep.c
        src/sys/arch/amd64/include: types.h
        src/sys/arch/x86/x86: efi.c
        src/sys/rump/librump/rumpkern/arch/generic: Makefile.inc
        src/sys/rump/librump/rumpkern/arch/x86_64: Makefile.inc
Added Files:
        src/sys/rump/librump/rumpkern/arch/generic: rump_generic_directmap.c

Log Message:
Make the direct-map API always available, but fail if KASAN or rump.

(Only for architectures that support it at all; on others,
__HAVE_MM_MD_DIRECT_MAPPED_PHYS/IO are still undefined and the
functions unimplemented.)

This gives modules like zfs an opportunity to use it.

While here, fix the one caller of mm_md_direct_mapped_phys that
ignored the return value (and make sure to call pmap_kremove/update
before uvm_km_free).


To generate a diff of this commit:
cvs rdiff -u -r1.321 -r1.322 src/sys/arch/amd64/amd64/machdep.c
cvs rdiff -u -r1.57 -r1.58 src/sys/arch/amd64/include/types.h
cvs rdiff -u -r1.15 -r1.16 src/sys/arch/x86/x86/efi.c
cvs rdiff -u -r1.2 -r1.3 \
    src/sys/rump/librump/rumpkern/arch/generic/Makefile.inc
cvs rdiff -u -r0 -r1.1 \
    src/sys/rump/librump/rumpkern/arch/generic/rump_generic_directmap.c
cvs rdiff -u -r1.8 -r1.9 \
    src/sys/rump/librump/rumpkern/arch/x86_64/Makefile.inc

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/amd64/amd64/machdep.c
diff -u src/sys/arch/amd64/amd64/machdep.c:1.321 src/sys/arch/amd64/amd64/machdep.c:1.322
--- src/sys/arch/amd64/amd64/machdep.c:1.321	Sun Nov 11 10:58:40 2018
+++ src/sys/arch/amd64/amd64/machdep.c	Thu Nov 15 04:59:02 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: machdep.c,v 1.321 2018/11/11 10:58:40 maxv Exp $	*/
+/*	$NetBSD: machdep.c,v 1.322 2018/11/15 04:59:02 riastradh Exp $	*/
 
 /*
  * Copyright (c) 1996, 1997, 1998, 2000, 2006, 2007, 2008, 2011
@@ -110,7 +110,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.321 2018/11/11 10:58:40 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.322 2018/11/15 04:59:02 riastradh Exp $");
 
 #include "opt_modular.h"
 #include "opt_user_ldt.h"
@@ -2285,23 +2285,30 @@ cpu_fsgs_reload(struct lwp *l, int fssel
 	kpreempt_enable();
 }
 
-#ifdef __HAVE_DIRECT_MAP
 bool
 mm_md_direct_mapped_io(void *addr, paddr_t *paddr)
 {
 	vaddr_t va = (vaddr_t)addr;
 
+#ifdef __HAVE_DIRECT_MAP
 	if (va >= PMAP_DIRECT_BASE && va < PMAP_DIRECT_END) {
 		*paddr = PMAP_DIRECT_UNMAP(va);
 		return true;
 	}
+#else
+	__USE(va);
+#endif
+
 	return false;
 }
 
 bool
 mm_md_direct_mapped_phys(paddr_t paddr, vaddr_t *vaddr)
 {
+#ifdef __HAVE_DIRECT_MAP
 	*vaddr = PMAP_DIRECT_MAP(paddr);
 	return true;
-}
+#else
+	return false;
 #endif
+}

Index: src/sys/arch/amd64/include/types.h
diff -u src/sys/arch/amd64/include/types.h:1.57 src/sys/arch/amd64/include/types.h:1.58
--- src/sys/arch/amd64/include/types.h:1.57	Mon Aug 20 15:04:51 2018
+++ src/sys/arch/amd64/include/types.h	Thu Nov 15 04:59:02 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: types.h,v 1.57 2018/08/20 15:04:51 maxv Exp $	*/
+/*	$NetBSD: types.h,v 1.58 2018/11/15 04:59:02 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 1990 The Regents of the University of California.
@@ -94,6 +94,8 @@ typedef	unsigned char		__cpu_simple_lock
 #define	__HAVE_INTR_CONTROL
 #define	__HAVE_CPU_RNG
 #define	__HAVE_COMPAT_NETBSD32
+#define	__HAVE_MM_MD_DIRECT_MAPPED_IO
+#define	__HAVE_MM_MD_DIRECT_MAPPED_PHYS
 
 #ifdef _KERNEL_OPT
 #define	__HAVE_RAS
@@ -104,8 +106,6 @@ typedef	unsigned char		__cpu_simple_lock
 #if !defined(KASAN)
 #define	__HAVE_PCPU_AREA 1
 #define	__HAVE_DIRECT_MAP 1
-#define	__HAVE_MM_MD_DIRECT_MAPPED_IO
-#define	__HAVE_MM_MD_DIRECT_MAPPED_PHYS
 #endif
 #if !defined(NO_PCI_MSI_MSIX)
 #define	__HAVE_PCI_MSI_MSIX

Index: src/sys/arch/x86/x86/efi.c
diff -u src/sys/arch/x86/x86/efi.c:1.15 src/sys/arch/x86/x86/efi.c:1.16
--- src/sys/arch/x86/x86/efi.c:1.15	Sat May 19 17:18:57 2018
+++ src/sys/arch/x86/x86/efi.c	Thu Nov 15 04:59:02 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: efi.c,v 1.15 2018/05/19 17:18:57 jakllsch Exp $	*/
+/*	$NetBSD: efi.c,v 1.16 2018/11/15 04:59:02 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2016 The NetBSD Foundation, Inc.
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: efi.c,v 1.15 2018/05/19 17:18:57 jakllsch Exp $");
+__KERNEL_RCSID(0, "$NetBSD: efi.c,v 1.16 2018/11/15 04:59:02 riastradh Exp $");
 
 #include <sys/kmem.h>
 #include <sys/param.h>
@@ -55,6 +55,7 @@ void 		efi_aprintuuid(const struct uuid 
 bool 		efi_uuideq(const struct uuid *, const struct uuid *);
 
 static bool efi_is32x64 = false;
+static paddr_t efi_systbl_pa = NULL;
 static struct efi_systbl *efi_systbl_va = NULL;
 static struct efi_cfgtbl *efi_cfgtblhead_va = NULL;
 static struct efi_e820memmap {
@@ -72,8 +73,10 @@ efi_getva(paddr_t pa)
 	vaddr_t va;
 
 #ifdef __HAVE_MM_MD_DIRECT_MAPPED_PHYS
-	mm_md_direct_mapped_phys(pa, &va);
-#else
+	if (mm_md_direct_mapped_phys(pa, &va))
+		return va;
+#endif
+
 	/* XXX This code path is not tested. */
 	va = uvm_km_alloc(kernel_map, PAGE_SIZE, 0,
 	    UVM_KMF_VAONLY | UVM_KMF_WAITVA);
@@ -83,7 +86,7 @@ efi_getva(paddr_t pa)
 	}
 	pmap_kenter_pa(va, pa, VM_PROT_READ, 0);
 	pmap_update(pmap_kernel());
-#endif
+
 	return va;
 }
 
@@ -91,14 +94,21 @@ efi_getva(paddr_t pa)
  * Free a virtual address (VA) allocated using efi_getva().
  */
 static void
-efi_relva(vaddr_t va)
+efi_relva(paddr_t pa, vaddr_t va)
 {
+
 #ifdef __HAVE_MM_MD_DIRECT_MAPPED_PHYS
-	/* XXX Should we free the va? */
-#else
+	vaddr_t va0 __diagused;
+	if (mm_md_direct_mapped_phys(pa, &va0)) {
+		KASSERT(va0 == va);
+		return;
+	}
+#endif
+
 	/* XXX This code path is not tested. */
+	pmap_kremove(va, PAGE_SIZE);
+	pmap_update(pmap_kernel());
 	uvm_km_free(kernel_map, va, PAGE_SIZE, UVM_KMF_VAONLY);
-#endif
 }
 
 /*
@@ -326,6 +336,7 @@ efi_getsystbl(void)
 		return NULL;
 
 	aprint_normal("efi: systbl at pa %" PRIxPADDR "\n", pa);
+	efi_systbl_pa = pa;
 	va = efi_getva(pa);
 	aprint_debug("efi: systbl mapped at va %" PRIxVADDR "\n", va);
 
@@ -403,7 +414,7 @@ efi_init(void)
 	}
 	if (efi_getcfgtblhead() == NULL) {
 		aprint_debug("efi: missing or invalid cfgtbl\n");
-		efi_relva((vaddr_t) efi_systbl_va);
+		efi_relva(efi_systbl_pa, (vaddr_t) efi_systbl_va);
 		bootmethod_efi = false;
 		return;
 	}

Index: src/sys/rump/librump/rumpkern/arch/generic/Makefile.inc
diff -u src/sys/rump/librump/rumpkern/arch/generic/Makefile.inc:1.2 src/sys/rump/librump/rumpkern/arch/generic/Makefile.inc:1.3
--- src/sys/rump/librump/rumpkern/arch/generic/Makefile.inc:1.2	Wed Apr 22 18:12:39 2015
+++ src/sys/rump/librump/rumpkern/arch/generic/Makefile.inc	Thu Nov 15 04:59:02 2018
@@ -1,5 +1,6 @@
-#	$NetBSD: Makefile.inc,v 1.2 2015/04/22 18:12:39 pooka Exp $
+#	$NetBSD: Makefile.inc,v 1.3 2018/11/15 04:59:02 riastradh Exp $
 #
 
 SRCS+=	rump_generic_cpu.c rump_generic_kobj.c rump_generic_pmap.c
 SRCS+=	rump_generic_abi.c
+SRCS+=	rump_generic_directmap.c

Index: src/sys/rump/librump/rumpkern/arch/x86_64/Makefile.inc
diff -u src/sys/rump/librump/rumpkern/arch/x86_64/Makefile.inc:1.8 src/sys/rump/librump/rumpkern/arch/x86_64/Makefile.inc:1.9
--- src/sys/rump/librump/rumpkern/arch/x86_64/Makefile.inc:1.8	Wed Feb 12 22:28:44 2014
+++ src/sys/rump/librump/rumpkern/arch/x86_64/Makefile.inc	Thu Nov 15 04:59:02 2018
@@ -1,7 +1,10 @@
-#	$NetBSD: Makefile.inc,v 1.8 2014/02/12 22:28:44 pooka Exp $
+#	$NetBSD: Makefile.inc,v 1.9 2018/11/15 04:59:02 riastradh Exp $
 #
 
 .include "${RUMPTOP}/librump/rumpkern/arch/x86/Makefile.inc"
 
 .PATH:	${RUMPTOP}/../arch/amd64/amd64
 SRCS+=	kobj_machdep.c
+
+.PATH:	${RUMPTOP}/librump/rumpkern/arch/generic
+SRCS+=	rump_generic_directmap.c

Added files:

Index: src/sys/rump/librump/rumpkern/arch/generic/rump_generic_directmap.c
diff -u /dev/null src/sys/rump/librump/rumpkern/arch/generic/rump_generic_directmap.c:1.1
--- /dev/null	Thu Nov 15 04:59:02 2018
+++ src/sys/rump/librump/rumpkern/arch/generic/rump_generic_directmap.c	Thu Nov 15 04:59:02 2018
@@ -0,0 +1,47 @@
+/*	$NetBSD: rump_generic_directmap.c,v 1.1 2018/11/15 04:59:02 riastradh Exp $	*/
+
+/*-
+ * Copyright (c) 2018 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/types.h>
+
+#include <dev/mm.h>
+
+#ifdef __HAVE_MM_MD_DIRECT_MAPPED_IO
+bool
+mm_md_direct_mapped_io(void *ptr, paddr_t *pap)
+{
+	return false;
+}
+#endif
+
+#ifdef __HAVE_MM_MD_DIRECT_MAPPED_PHYS
+bool
+mm_md_direct_mapped_phys(paddr_t pa, vaddr_t *vap)
+{
+	return false;
+}
+#endif

Reply via email to