Module Name:    src
Committed By:   maxv
Date:           Wed Jun 20 11:49:38 UTC 2018

Modified Files:
        src/sys/arch/amd64/amd64: machdep.c
        src/sys/arch/amd64/stand/prekern: mm.c prekern.h
        src/sys/arch/x86/include: pmap.h

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


To generate a diff of this commit:
cvs rdiff -u -r1.304 -r1.305 src/sys/arch/amd64/amd64/machdep.c
cvs rdiff -u -r1.21 -r1.22 src/sys/arch/amd64/stand/prekern/mm.c
cvs rdiff -u -r1.19 -r1.20 src/sys/arch/amd64/stand/prekern/prekern.h
cvs rdiff -u -r1.79 -r1.80 src/sys/arch/x86/include/pmap.h

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.304 src/sys/arch/amd64/amd64/machdep.c:1.305
--- src/sys/arch/amd64/amd64/machdep.c:1.304	Tue May  8 17:20:44 2018
+++ src/sys/arch/amd64/amd64/machdep.c	Wed Jun 20 11:49:37 2018
@@ -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 @@ paddr_t gdt_paddr;
 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 @@ cpu_startup(void)
 	 * 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 @@ init_bootspace(void)
 	/* 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 @@ init_x86_64(paddr_t first_avail)
 	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 @@ mm_md_kernacc(void *ptr, vm_prot_t prot,
 		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;

Index: src/sys/arch/amd64/stand/prekern/mm.c
diff -u src/sys/arch/amd64/stand/prekern/mm.c:1.21 src/sys/arch/amd64/stand/prekern/mm.c:1.22
--- src/sys/arch/amd64/stand/prekern/mm.c:1.21	Thu Dec 21 14:32:06 2017
+++ src/sys/arch/amd64/stand/prekern/mm.c	Wed Jun 20 11:49:37 2018
@@ -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 @@ mm_map_boot(void)
 	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;
 }
 

Index: src/sys/arch/amd64/stand/prekern/prekern.h
diff -u src/sys/arch/amd64/stand/prekern/prekern.h:1.19 src/sys/arch/amd64/stand/prekern/prekern.h:1.20
--- src/sys/arch/amd64/stand/prekern/prekern.h:1.19	Mon Jan 15 22:38:01 2018
+++ src/sys/arch/amd64/stand/prekern/prekern.h	Wed Jun 20 11:49:37 2018
@@ -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 @@ struct bootspace {
 	} boot;
 	vaddr_t spareva;
 	vaddr_t pdir;
+	vaddr_t smodule;
 	vaddr_t emodule;
 };
 

Index: src/sys/arch/x86/include/pmap.h
diff -u src/sys/arch/x86/include/pmap.h:1.79 src/sys/arch/x86/include/pmap.h:1.80
--- src/sys/arch/x86/include/pmap.h:1.79	Sat May 19 16:55:59 2018
+++ src/sys/arch/x86/include/pmap.h	Wed Jun 20 11:49:38 2018
@@ -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 @@ struct bootspace {
 	/* 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;
 };
 

Reply via email to