Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys Make the direct-map API always available, but fail if KA...



details:   https://anonhg.NetBSD.org/src/rev/34adf3aed4ed
branches:  trunk
changeset: 445856:34adf3aed4ed
user:      riastradh <riastradh%NetBSD.org@localhost>
date:      Thu Nov 15 04:59:02 2018 +0000

description:
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).

diffstat:

 sys/arch/amd64/amd64/machdep.c                                  |  15 ++-
 sys/arch/amd64/include/types.h                                  |   6 +-
 sys/arch/x86/x86/efi.c                                          |  31 ++++--
 sys/rump/librump/rumpkern/arch/generic/Makefile.inc             |   3 +-
 sys/rump/librump/rumpkern/arch/generic/rump_generic_directmap.c |  47 ++++++++++
 sys/rump/librump/rumpkern/arch/x86_64/Makefile.inc              |   5 +-
 6 files changed, 88 insertions(+), 19 deletions(-)

diffs (246 lines):

diff -r 465ef4a361ea -r 34adf3aed4ed sys/arch/amd64/amd64/machdep.c
--- a/sys/arch/amd64/amd64/machdep.c    Thu Nov 15 04:57:00 2018 +0000
+++ b/sys/arch/amd64/amd64/machdep.c    Thu Nov 15 04:59:02 2018 +0000
@@ -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 @@
        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
 }
-#endif
diff -r 465ef4a361ea -r 34adf3aed4ed sys/arch/amd64/include/types.h
--- a/sys/arch/amd64/include/types.h    Thu Nov 15 04:57:00 2018 +0000
+++ b/sys/arch/amd64/include/types.h    Thu Nov 15 04:59:02 2018 +0000
@@ -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 @@
 #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 @@
 #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
diff -r 465ef4a361ea -r 34adf3aed4ed sys/arch/x86/x86/efi.c
--- a/sys/arch/x86/x86/efi.c    Thu Nov 15 04:57:00 2018 +0000
+++ b/sys/arch/x86/x86/efi.c    Thu Nov 15 04:59:02 2018 +0000
@@ -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 @@
 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 @@
        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 @@
        }
        pmap_kenter_pa(va, pa, VM_PROT_READ, 0);
        pmap_update(pmap_kernel());
-#endif
+
        return va;
 }
 
@@ -91,14 +94,21 @@
  * 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 @@
                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 @@
        }
        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;
        }
diff -r 465ef4a361ea -r 34adf3aed4ed sys/rump/librump/rumpkern/arch/generic/Makefile.inc
--- a/sys/rump/librump/rumpkern/arch/generic/Makefile.inc       Thu Nov 15 04:57:00 2018 +0000
+++ b/sys/rump/librump/rumpkern/arch/generic/Makefile.inc       Thu Nov 15 04:59:02 2018 +0000
@@ -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
diff -r 465ef4a361ea -r 34adf3aed4ed sys/rump/librump/rumpkern/arch/generic/rump_generic_directmap.c
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/rump/librump/rumpkern/arch/generic/rump_generic_directmap.c   Thu Nov 15 04:59:02 2018 +0000
@@ -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
diff -r 465ef4a361ea -r 34adf3aed4ed sys/rump/librump/rumpkern/arch/x86_64/Makefile.inc
--- a/sys/rump/librump/rumpkern/arch/x86_64/Makefile.inc        Thu Nov 15 04:57:00 2018 +0000
+++ b/sys/rump/librump/rumpkern/arch/x86_64/Makefile.inc        Thu Nov 15 04:59:02 2018 +0000
@@ -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



Home | Main Index | Thread Index | Old Index