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