Source-Changes-HG archive

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

[src/trunk]: src/sys/arch Add and use bootspace.smodule. Initialize it in loc...



details:   https://anonhg.NetBSD.org/src/rev/743bc001ec5a
branches:  trunk
changeset: 320039:743bc001ec5a
user:      maxv <maxv%NetBSD.org@localhost>
date:      Wed Jun 20 11:49:37 2018 +0000

description:
Add and use bootspace.smodule. Initialize it in locore/prekern to better
hide the specifics from the "upper" layers. This allows for greater
flexibility.

diffstat:

 sys/arch/amd64/amd64/machdep.c         |  33 ++++++++++++---------------------
 sys/arch/amd64/stand/prekern/mm.c      |   3 ++-
 sys/arch/amd64/stand/prekern/prekern.h |   3 ++-
 sys/arch/x86/include/pmap.h            |   5 +++--
 4 files changed, 19 insertions(+), 25 deletions(-)

diffs (143 lines):

diff -r 80e79637b456 -r 743bc001ec5a sys/arch/amd64/amd64/machdep.c
--- a/sys/arch/amd64/amd64/machdep.c    Wed Jun 20 11:45:25 2018 +0000
+++ b/sys/arch/amd64/amd64/machdep.c    Wed Jun 20 11:49:37 2018 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: machdep.c,v 1.304 2018/05/08 17:20:44 maxv Exp $       */
+/*     $NetBSD: machdep.c,v 1.305 2018/06/20 11:49:37 maxv Exp $       */
 
 /*
  * Copyright (c) 1996, 1997, 1998, 2000, 2006, 2007, 2008, 2011
@@ -110,9 +110,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.304 2018/05/08 17:20:44 maxv Exp $");
-
-/* #define XENDEBUG_LOW  */
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.305 2018/06/20 11:49:37 maxv Exp $");
 
 #include "opt_modular.h"
 #include "opt_user_ldt.h"
@@ -261,11 +259,9 @@
 vaddr_t ldt_vaddr;
 paddr_t ldt_paddr;
 
-vaddr_t module_start, module_end;
 static struct vm_map module_map_store;
 extern struct vm_map *module_map;
 extern struct bootspace bootspace;
-vaddr_t kern_end;
 
 struct vm_map *phys_map = NULL;
 
@@ -374,15 +370,15 @@
         * Create the module map.
         *
         * The kernel uses RIP-relative addressing with a maximum offset of
-        * 2GB. The problem is, kernel_map is too far away in memory from
-        * the kernel .text. So we cannot use it, and have to create a
-        * special module_map.
+        * 2GB. Because of that, we can't put the kernel modules in kernel_map
+        * (like i386 does), since kernel_map is too far away in memory from
+        * the kernel sections. So we have to create a special module_map.
         *
         * The module map is taken as what is left of the bootstrap memory
-        * created in locore.S. This memory is right above the kernel
-        * image, so this is the best place to put our modules.
+        * created in locore/prekern.
         */
-       uvm_map_setup(&module_map_store, module_start, module_end, 0);
+       uvm_map_setup(&module_map_store, bootspace.smodule,
+           bootspace.emodule, 0);
        module_map_store.pmap = pmap_kernel();
        module_map = &module_map_store;
 
@@ -1577,9 +1573,11 @@
        /* In locore.S, we allocated a tmp va. We will use it now. */
        bootspace.spareva = KERNBASE + NKL2_KIMG_ENTRIES * NBPD_L2;
 
-       /* Virtual address of the L4 page */
+       /* Virtual address of the L4 page. */
        bootspace.pdir = (vaddr_t)(PDPpaddr + KERNBASE);
 
+       /* Kernel module map. */
+       bootspace.smodule = (vaddr_t)atdevbase + IOM_SIZE;
        bootspace.emodule = KERNBASE + NKL2_KIMG_ENTRIES * NBPD_L2;
 }
 
@@ -1665,13 +1663,6 @@
        pmap_pa_end = avail_end;
 #endif
 
-       /* End of the virtual space we have created so far. */
-       kern_end = (vaddr_t)atdevbase + IOM_SIZE;
-
-       /* The area for the module map. */
-       module_start = kern_end;
-       module_end = bootspace.emodule;
-
        /*
         * Call pmap initialization to make new kernel address space.
         * We must do this before loading pages into the VM system.
@@ -2123,7 +2114,7 @@
                return 0;
        }
 
-       if (v >= module_start && v < module_end) {
+       if (v >= bootspace.smodule && v < bootspace.emodule) {
                *handled = true;
                if (!uvm_map_checkprot(module_map, v, v + 1, prot))
                        return EFAULT;
diff -r 80e79637b456 -r 743bc001ec5a sys/arch/amd64/stand/prekern/mm.c
--- a/sys/arch/amd64/stand/prekern/mm.c Wed Jun 20 11:45:25 2018 +0000
+++ b/sys/arch/amd64/stand/prekern/mm.c Wed Jun 20 11:49:37 2018 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: mm.c,v 1.21 2017/12/21 14:32:06 maxv Exp $     */
+/*     $NetBSD: mm.c,v 1.22 2018/06/20 11:49:37 maxv Exp $     */
 
 /*
  * Copyright (c) 2017 The NetBSD Foundation, Inc. All rights reserved.
@@ -420,6 +420,7 @@
        extern uint64_t PDPpaddr;
        bootspace.spareva = bootspace.boot.va + NKL2_KIMG_ENTRIES * NBPD_L2;
        bootspace.pdir = bootspace.boot.va + (PDPpaddr - bootspace.boot.pa);
+       bootspace.smodule = (vaddr_t)iom_base + IOM_SIZE;
        bootspace.emodule = bootspace.boot.va + NKL2_KIMG_ENTRIES * NBPD_L2;
 }
 
diff -r 80e79637b456 -r 743bc001ec5a sys/arch/amd64/stand/prekern/prekern.h
--- a/sys/arch/amd64/stand/prekern/prekern.h    Wed Jun 20 11:45:25 2018 +0000
+++ b/sys/arch/amd64/stand/prekern/prekern.h    Wed Jun 20 11:49:37 2018 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: prekern.h,v 1.19 2018/01/15 22:38:01 christos Exp $    */
+/*     $NetBSD: prekern.h,v 1.20 2018/06/20 11:49:37 maxv Exp $        */
 
 /*
  * Copyright (c) 2017 The NetBSD Foundation, Inc. All rights reserved.
@@ -75,6 +75,7 @@
        } boot;
        vaddr_t spareva;
        vaddr_t pdir;
+       vaddr_t smodule;
        vaddr_t emodule;
 };
 
diff -r 80e79637b456 -r 743bc001ec5a sys/arch/x86/include/pmap.h
--- a/sys/arch/x86/include/pmap.h       Wed Jun 20 11:45:25 2018 +0000
+++ b/sys/arch/x86/include/pmap.h       Wed Jun 20 11:49:37 2018 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: pmap.h,v 1.79 2018/05/19 16:55:59 jakllsch Exp $       */
+/*     $NetBSD: pmap.h,v 1.80 2018/06/20 11:49:38 maxv Exp $   */
 
 /*
  * Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -149,7 +149,8 @@
        /* Virtual address of the page directory. */
        vaddr_t pdir;
 
-       /* End of the area dedicated to kernel modules (amd64 only). */
+       /* Area dedicated to kernel modules (amd64 only). */
+       vaddr_t smodule;
        vaddr_t emodule;
 };
 



Home | Main Index | Thread Index | Old Index