Module Name:    src
Committed By:   maxv
Date:           Sat Nov 11 12:51:06 UTC 2017

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

Log Message:
Modify the layout of the bootspace structure, in such a way that it can
contain several kernel segments of the same type (eg several .text
segments). Some parts are still a bit messy but will be cleaned up soon.

I cannot compile-test this change on i386, but it seems fine enough.

NOTE: you need to rebuild and reinstall a new prekern after this change.


To generate a diff of this commit:
cvs rdiff -u -r1.275 -r1.276 src/sys/arch/amd64/amd64/machdep.c
cvs rdiff -u -r1.9 -r1.10 src/sys/arch/amd64/stand/prekern/mm.c
cvs rdiff -u -r1.8 -r1.9 src/sys/arch/amd64/stand/prekern/prekern.h
cvs rdiff -u -r1.798 -r1.799 src/sys/arch/i386/i386/machdep.c
cvs rdiff -u -r1.70 -r1.71 src/sys/arch/x86/include/pmap.h
cvs rdiff -u -r1.3 -r1.4 src/sys/arch/x86/x86/db_memrw.c
cvs rdiff -u -r1.263 -r1.264 src/sys/arch/x86/x86/pmap.c

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.275 src/sys/arch/amd64/amd64/machdep.c:1.276
--- src/sys/arch/amd64/amd64/machdep.c:1.275	Sat Nov  4 08:50:47 2017
+++ src/sys/arch/amd64/amd64/machdep.c	Sat Nov 11 12:51:06 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: machdep.c,v 1.275 2017/11/04 08:50:47 cherry Exp $	*/
+/*	$NetBSD: machdep.c,v 1.276 2017/11/11 12:51:06 maxv 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.275 2017/11/04 08:50:47 cherry Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.276 2017/11/11 12:51:06 maxv Exp $");
 
 /* #define XENDEBUG_LOW  */
 
@@ -1507,6 +1507,7 @@ init_bootspace(void)
 	extern char __rodata_start;
 	extern char __data_start;
 	extern char __kernel_end;
+	size_t i = 0;
 
 	memset(&bootspace, 0, sizeof(bootspace));
 
@@ -1514,17 +1515,23 @@ init_bootspace(void)
 	bootspace.head.pa = KERNTEXTOFF - KERNBASE;
 	bootspace.head.sz = 0;
 
-	bootspace.text.va = KERNTEXTOFF;
-	bootspace.text.pa = KERNTEXTOFF - KERNBASE;
-	bootspace.text.sz = (size_t)&__rodata_start - KERNTEXTOFF;
-
-	bootspace.rodata.va = (vaddr_t)&__rodata_start;
-	bootspace.rodata.pa = (paddr_t)&__rodata_start - KERNBASE;
-	bootspace.rodata.sz = (size_t)&__data_start - (size_t)&__rodata_start;
-
-	bootspace.data.va = (vaddr_t)&__data_start;
-	bootspace.data.pa = (paddr_t)&__data_start - KERNBASE;
-	bootspace.data.sz = (size_t)&__kernel_end - (size_t)&__data_start;
+	bootspace.segs[i].type = BTSEG_TEXT;
+	bootspace.segs[i].va = KERNTEXTOFF;
+	bootspace.segs[i].pa = KERNTEXTOFF - KERNBASE;
+	bootspace.segs[i].sz = (size_t)&__rodata_start - KERNTEXTOFF;
+	i++;
+
+	bootspace.segs[i].type = BTSEG_RODATA;
+	bootspace.segs[i].va = (vaddr_t)&__rodata_start;
+	bootspace.segs[i].pa = (paddr_t)&__rodata_start - KERNBASE;
+	bootspace.segs[i].sz = (size_t)&__data_start - (size_t)&__rodata_start;
+	i++;
+
+	bootspace.segs[i].type = BTSEG_DATA;
+	bootspace.segs[i].va = (vaddr_t)&__data_start;
+	bootspace.segs[i].pa = (paddr_t)&__data_start - KERNBASE;
+	bootspace.segs[i].sz = (size_t)&__kernel_end - (size_t)&__data_start;
+	i++;
 
 	bootspace.boot.va = (vaddr_t)&__kernel_end;
 	bootspace.boot.pa = (paddr_t)&__kernel_end - KERNBASE;
@@ -2009,6 +2016,7 @@ mm_md_kernacc(void *ptr, vm_prot_t prot,
 {
 	const vaddr_t v = (vaddr_t)ptr;
 	vaddr_t kva, kva_end;
+	size_t i;
 
 	kva = bootspace.head.va;
 	kva_end = kva + bootspace.head.sz;
@@ -2017,33 +2025,19 @@ mm_md_kernacc(void *ptr, vm_prot_t prot,
 		return 0;
 	}
 
-	kva = bootspace.text.va;
-	kva_end = kva + bootspace.text.sz;
-	if (v >= kva && v < kva_end) {
-		*handled = true;
-		if (prot & VM_PROT_WRITE) {
-			return EFAULT;
-		}
-		return 0;
-	}
-
-	kva = bootspace.rodata.va;
-	kva_end = kva + bootspace.rodata.sz;
-	if (v >= kva && v < kva_end) {
+	for (i = 0; i < BTSPACE_NSEGS; i++) {
+		kva = bootspace.segs[i].va;
+		kva_end = kva + bootspace.segs[i].sz;
 		*handled = true;
-		if (prot & VM_PROT_WRITE) {
-			return EFAULT;
+		if (bootspace.segs[i].type == BTSEG_TEXT ||
+		    bootspace.segs[i].type == BTSEG_RODATA) {
+			if (prot & VM_PROT_WRITE) {
+				return EFAULT;
+			}
 		}
 		return 0;
 	}
 
-	kva = bootspace.data.va;
-	kva_end = kva + bootspace.data.sz;
-	if (v >= kva && v < kva_end) {
-		*handled = true;
-		return 0;
-	}
-
 	kva = bootspace.boot.va;
 	kva_end = kva + bootspace.boot.sz;
 	if (v >= kva && v < kva_end) {

Index: src/sys/arch/amd64/stand/prekern/mm.c
diff -u src/sys/arch/amd64/stand/prekern/mm.c:1.9 src/sys/arch/amd64/stand/prekern/mm.c:1.10
--- src/sys/arch/amd64/stand/prekern/mm.c:1.9	Thu Nov  9 15:24:39 2017
+++ src/sys/arch/amd64/stand/prekern/mm.c	Sat Nov 11 12:51:06 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: mm.c,v 1.9 2017/11/09 15:24:39 maxv Exp $	*/
+/*	$NetBSD: mm.c,v 1.10 2017/11/11 12:51:06 maxv Exp $	*/
 
 /*
  * Copyright (c) 2017 The NetBSD Foundation, Inc. All rights reserved.
@@ -121,13 +121,20 @@ mm_mprotect(vaddr_t startva, size_t size
 void
 mm_bootspace_mprotect()
 {
-	/*
-	 * Remap the kernel segments with proper permissions.
-	 */
-	mm_mprotect(bootspace.text.va, bootspace.text.sz,
-	    MM_PROT_READ|MM_PROT_EXECUTE);
-	mm_mprotect(bootspace.rodata.va, bootspace.rodata.sz,
-	    MM_PROT_READ);
+	int prot;
+	size_t i;
+
+	/* Remap the kernel segments with proper permissions. */
+	for (i = 0; i < BTSPACE_NSEGS; i++) {
+		if (bootspace.segs[i].type == BTSEG_TEXT) {
+			prot = MM_PROT_READ|MM_PROT_EXECUTE;
+		} else if (bootspace.segs[i].type == BTSEG_RODATA) {
+			prot = MM_PROT_READ;
+		} else {
+			continue;
+		}
+		mm_mprotect(bootspace.segs[i].va, bootspace.segs[i].sz, prot);
+	}
 
 	print_state(true, "Segments protection updated");
 }
@@ -276,6 +283,42 @@ mm_randva_kregion(size_t size)
 	return randva;
 }
 
+static paddr_t
+bootspace_getend()
+{
+	paddr_t pa, max = 0;
+	size_t i;
+
+	for (i = 0; i < BTSPACE_NSEGS; i++) {
+		if (bootspace.segs[i].type == BTSEG_NONE) {
+			continue;
+		}
+		pa = bootspace.segs[i].pa + bootspace.segs[i].sz;
+		if (pa > max)
+			max = pa;
+	}
+
+	return max;
+}
+
+static void
+bootspace_addseg(int type, vaddr_t va, paddr_t pa, size_t sz)
+{
+	size_t i;
+
+	for (i = 0; i < BTSPACE_NSEGS; i++) {
+		if (bootspace.segs[i].type == BTSEG_NONE) {
+			bootspace.segs[i].type = type;
+			bootspace.segs[i].va = va;
+			bootspace.segs[i].pa = pa;
+			bootspace.segs[i].sz = sz;
+			return;
+		}
+	}
+
+	fatal("bootspace_addseg: segments full");
+}
+
 static void
 mm_map_segments()
 {
@@ -302,9 +345,7 @@ mm_map_segments()
 	memset((void *)(randva + elfsz), PAD_TEXT, size - elfsz);
 
 	/* Register the values in bootspace */
-	bootspace.text.va = randva;
-	bootspace.text.pa = pa;
-	bootspace.text.sz = size;
+	bootspace_addseg(BTSEG_TEXT, randva, pa, size);
 
 	/*
 	 * Kernel rodata segment.
@@ -325,9 +366,7 @@ mm_map_segments()
 	memset((void *)(randva + elfsz), PAD_RODATA, size - elfsz);
 
 	/* Register the values in bootspace */
-	bootspace.rodata.va = randva;
-	bootspace.rodata.pa = pa;
-	bootspace.rodata.sz = size;
+	bootspace_addseg(BTSEG_RODATA, randva, pa, size);
 
 	/*
 	 * Kernel data segment.
@@ -348,9 +387,7 @@ mm_map_segments()
 	memset((void *)(randva + elfsz), PAD_DATA, size - elfsz);
 
 	/* Register the values in bootspace */
-	bootspace.data.va = randva;
-	bootspace.data.pa = pa;
-	bootspace.data.sz = size;
+	bootspace_addseg(BTSEG_DATA, randva, pa, size);
 }
 
 static void
@@ -370,7 +407,7 @@ mm_map_boot()
 	randva = mm_randva_kregion(size);
 
 	/* Enter the area and build the ELF info */
-	bootpa = bootspace.data.pa + bootspace.data.sz;
+	bootpa = bootspace_getend();
 	size = (pa_avail - bootpa);
 	npages = size / PAGE_SIZE;
 	for (i = 0; i < npages; i++) {

Index: src/sys/arch/amd64/stand/prekern/prekern.h
diff -u src/sys/arch/amd64/stand/prekern/prekern.h:1.8 src/sys/arch/amd64/stand/prekern/prekern.h:1.9
--- src/sys/arch/amd64/stand/prekern/prekern.h:1.8	Fri Nov 10 08:52:57 2017
+++ src/sys/arch/amd64/stand/prekern/prekern.h	Sat Nov 11 12:51:06 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: prekern.h,v 1.8 2017/11/10 08:52:57 maxv Exp $	*/
+/*	$NetBSD: prekern.h,v 1.9 2017/11/11 12:51:06 maxv Exp $	*/
 
 /*
  * Copyright (c) 2017 The NetBSD Foundation, Inc. All rights reserved.
@@ -102,6 +102,11 @@ strcmp(char *a, char *b)
 
 /* -------------------------------------------------------------------------- */
 
+#define BTSEG_NONE	0
+#define BTSEG_TEXT	1
+#define BTSEG_RODATA	2
+#define BTSEG_DATA	3
+#define BTSPACE_NSEGS	64
 struct bootspace {
 	struct {
 		vaddr_t va;
@@ -109,20 +114,11 @@ struct bootspace {
 		size_t sz;
 	} head;
 	struct {
+		int type;
 		vaddr_t va;
 		paddr_t pa;
 		size_t sz;
-	} text;
-	struct {
-		vaddr_t va;
-		paddr_t pa;
-		size_t sz;
-	} rodata;
-	struct {
-		vaddr_t va;
-		paddr_t pa;
-		size_t sz;
-	} data;
+	} segs[BTSPACE_NSEGS];
 	struct {
 		vaddr_t va;
 		paddr_t pa;

Index: src/sys/arch/i386/i386/machdep.c
diff -u src/sys/arch/i386/i386/machdep.c:1.798 src/sys/arch/i386/i386/machdep.c:1.799
--- src/sys/arch/i386/i386/machdep.c:1.798	Sat Nov  4 08:50:47 2017
+++ src/sys/arch/i386/i386/machdep.c	Sat Nov 11 12:51:06 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: machdep.c,v 1.798 2017/11/04 08:50:47 cherry Exp $	*/
+/*	$NetBSD: machdep.c,v 1.799 2017/11/11 12:51:06 maxv Exp $	*/
 
 /*
  * Copyright (c) 1996, 1997, 1998, 2000, 2004, 2006, 2008, 2009, 2017
@@ -67,7 +67,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.798 2017/11/04 08:50:47 cherry Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.799 2017/11/11 12:51:06 maxv Exp $");
 
 #include "opt_beep.h"
 #include "opt_compat_freebsd.h"
@@ -1102,6 +1102,7 @@ init_bootspace(void)
 	extern char __rodata_start;
 	extern char __data_start;
 	extern char __kernel_end;
+	size_t i = 0;
 
 	memset(&bootspace, 0, sizeof(bootspace));
 
@@ -1109,17 +1110,23 @@ init_bootspace(void)
 	bootspace.head.pa = KERNTEXTOFF - KERNBASE;
 	bootspace.head.sz = 0;
 
-	bootspace.text.va = KERNTEXTOFF;
-	bootspace.text.pa = KERNTEXTOFF - KERNBASE;
-	bootspace.text.sz = (size_t)&__rodata_start - KERNTEXTOFF;
-
-	bootspace.rodata.va = (vaddr_t)&__rodata_start;
-	bootspace.rodata.pa = (paddr_t)(vaddr_t)&__rodata_start - KERNBASE;
-	bootspace.rodata.sz = (size_t)&__data_start - (size_t)&__rodata_start;
-
-	bootspace.data.va = (vaddr_t)&__data_start;
-	bootspace.data.pa = (paddr_t)(vaddr_t)&__data_start - KERNBASE;
-	bootspace.data.sz = (size_t)&__kernel_end - (size_t)&__data_start;
+	bootspace.segs[i].type = BTSEG_TEXT;
+	bootspace.segs[i].va = KERNTEXTOFF;
+	bootspace.segs[i].pa = KERNTEXTOFF - KERNBASE;
+	bootspace.segs[i].sz = (size_t)&__rodata_start - KERNTEXTOFF;
+	i++;
+
+	bootspace.segs[i].type = BTSEG_RODATA;
+	bootspace.segs[i].va = (vaddr_t)&__rodata_start;
+	bootspace.segs[i].pa = (paddr_t)(vaddr_t)&__rodata_start - KERNBASE;
+	bootspace.segs[i].sz = (size_t)&__data_start - (size_t)&__rodata_start;
+	i++;
+
+	bootspace.segs[i].type = BTSEG_DATA;
+	bootspace.segs[i].va = (vaddr_t)&__data_start;
+	bootspace.segs[i].pa = (paddr_t)(vaddr_t)&__data_start - KERNBASE;
+	bootspace.segs[i].sz = (size_t)&__kernel_end - (size_t)&__data_start;
+	i++;
 
 	bootspace.boot.va = (vaddr_t)&__kernel_end;
 	bootspace.boot.pa = (paddr_t)(vaddr_t)&__kernel_end - KERNBASE;

Index: src/sys/arch/x86/include/pmap.h
diff -u src/sys/arch/x86/include/pmap.h:1.70 src/sys/arch/x86/include/pmap.h:1.71
--- src/sys/arch/x86/include/pmap.h:1.70	Sun Oct 29 10:01:22 2017
+++ src/sys/arch/x86/include/pmap.h	Sat Nov 11 12:51:05 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: pmap.h,v 1.70 2017/10/29 10:01:22 maxv Exp $	*/
+/*	$NetBSD: pmap.h,v 1.71 2017/11/11 12:51:05 maxv Exp $	*/
 
 /*
  * Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -111,6 +111,12 @@
 #include <sys/kcpuset.h>
 #include <uvm/pmap/pmap_pvt.h>
 
+#define BTSEG_NONE	0
+#define BTSEG_TEXT	1
+#define BTSEG_RODATA	2
+#define BTSEG_DATA	3
+#define BTSPACE_NSEGS	64
+
 struct bootspace {
 	struct {
 		vaddr_t va;
@@ -120,20 +126,11 @@ struct bootspace {
 
 	/* Kernel segments. */
 	struct {
+		int type;
 		vaddr_t va;
 		paddr_t pa;
 		size_t sz;
-	} text;
-	struct {
-		vaddr_t va;
-		paddr_t pa;
-		size_t sz;
-	} rodata;
-	struct {
-		vaddr_t va;
-		paddr_t pa;
-		size_t sz;
-	} data;
+	} segs[BTSPACE_NSEGS];
 
 	/*
 	 * The area used by the early kernel bootstrap. It contains the kernel

Index: src/sys/arch/x86/x86/db_memrw.c
diff -u src/sys/arch/x86/x86/db_memrw.c:1.3 src/sys/arch/x86/x86/db_memrw.c:1.4
--- src/sys/arch/x86/x86/db_memrw.c:1.3	Sat Sep 30 12:12:29 2017
+++ src/sys/arch/x86/x86/db_memrw.c	Sat Nov 11 12:51:05 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: db_memrw.c,v 1.3 2017/09/30 12:12:29 maxv Exp $	*/
+/*	$NetBSD: db_memrw.c,v 1.4 2017/11/11 12:51:05 maxv Exp $	*/
 
 /*-
  * Copyright (c) 1996, 2000 The NetBSD Foundation, Inc.
@@ -53,7 +53,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: db_memrw.c,v 1.3 2017/09/30 12:12:29 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: db_memrw.c,v 1.4 2017/11/11 12:51:05 maxv Exp $");
 
 #include <sys/param.h>
 #include <sys/proc.h>
@@ -176,19 +176,21 @@ db_write_bytes(vaddr_t addr, size_t size
 {
 	extern struct bootspace bootspace;
 	char *dst;
+	size_t i;
 
 	dst = (char *)addr;
 
 	/* If any part is in kernel text or rodata, use db_write_text() */
-	if (addr >= bootspace.text.va &&
-	    addr < (bootspace.text.va + bootspace.text.sz)) {
-		db_write_text(addr, size, data);
-		return;
-	}
-	if (addr >= bootspace.rodata.va &&
-	    addr < (bootspace.rodata.va + bootspace.rodata.sz)) {
-		db_write_text(addr, size, data);
-		return;
+	for (i = 0; i < BTSPACE_NSEGS; i++) {
+		if (bootspace.segs[i].type != BTSEG_TEXT &&
+		    bootspace.segs[i].type != BTSEG_RODATA) {
+			continue;
+		}
+		if (addr >= bootspace.segs[i].va &&
+		    addr < (bootspace.segs[i].va + bootspace.segs[i].sz)) {
+			db_write_text(addr, size, data);
+			return;
+		}
 	}
 
 	dst = (char *)addr;

Index: src/sys/arch/x86/x86/pmap.c
diff -u src/sys/arch/x86/x86/pmap.c:1.263 src/sys/arch/x86/x86/pmap.c:1.264
--- src/sys/arch/x86/x86/pmap.c:1.263	Sun Oct 29 10:01:21 2017
+++ src/sys/arch/x86/x86/pmap.c	Sat Nov 11 12:51:05 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: pmap.c,v 1.263 2017/10/29 10:01:21 maxv Exp $	*/
+/*	$NetBSD: pmap.c,v 1.264 2017/11/11 12:51:05 maxv Exp $	*/
 
 /*
  * Copyright (c) 2008, 2010, 2016, 2017 The NetBSD Foundation, Inc.
@@ -170,7 +170,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.263 2017/10/29 10:01:21 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.264 2017/11/11 12:51:05 maxv Exp $");
 
 #include "opt_user_ldt.h"
 #include "opt_lockdebug.h"
@@ -1556,6 +1556,7 @@ pmap_remap_global(void)
 {
 	vaddr_t kva, kva_end;
 	unsigned long p1i;
+	size_t i;
 
 	/* head */
 	kva = bootspace.head.va;
@@ -1566,31 +1567,18 @@ pmap_remap_global(void)
 			PTE_BASE[p1i] |= PG_G;
 	}
 
-	/* kernel text */
-	kva = bootspace.text.va;
-	kva_end = kva + bootspace.text.sz;
-	for ( ; kva < kva_end; kva += PAGE_SIZE) {
-		p1i = pl1_i(kva);
-		if (pmap_valid_entry(PTE_BASE[p1i]))
-			PTE_BASE[p1i] |= PG_G;
-	}
-
-	/* kernel rodata */
-	kva = bootspace.rodata.va;
-	kva_end = kva + bootspace.rodata.sz;
-	for ( ; kva < kva_end; kva += PAGE_SIZE) {
-		p1i = pl1_i(kva);
-		if (pmap_valid_entry(PTE_BASE[p1i]))
-			PTE_BASE[p1i] |= PG_G;
-	}
-
-	/* kernel data */
-	kva = bootspace.data.va;
-	kva_end = kva + bootspace.data.sz;
-	for ( ; kva < kva_end; kva += PAGE_SIZE) {
-		p1i = pl1_i(kva);
-		if (pmap_valid_entry(PTE_BASE[p1i]))
-			PTE_BASE[p1i] |= PG_G;
+	/* kernel segments */
+	for (i = 0; i < BTSPACE_NSEGS; i++) {
+		if (bootspace.segs[i].type == BTSEG_NONE) {
+			continue;
+		}
+		kva = bootspace.segs[i].va;
+		kva_end = kva + bootspace.segs[i].sz;
+		for ( ; kva < kva_end; kva += PAGE_SIZE) {
+			p1i = pl1_i(kva);
+			if (pmap_valid_entry(PTE_BASE[p1i]))
+				PTE_BASE[p1i] |= PG_G;
+		}
 	}
 
 	/* boot space */
@@ -1613,6 +1601,7 @@ pmap_remap_largepages(void)
 	pd_entry_t *pde;
 	vaddr_t kva, kva_end;
 	paddr_t pa;
+	size_t i;
 
 #ifdef KASLR
 	/* XXX no large pages yet, soon */
@@ -1620,36 +1609,51 @@ pmap_remap_largepages(void)
 #endif
 
 	/* Remap the kernel text using large pages. */
-	kva = roundup(bootspace.text.va, NBPD_L2);
-	kva_end = rounddown(bootspace.text.va +
-	    bootspace.text.sz, NBPD_L1);
-	pa = roundup(bootspace.text.pa, NBPD_L2);
-	for (/* */; kva + NBPD_L2 <= kva_end; kva += NBPD_L2, pa += NBPD_L2) {
-		pde = &L2_BASE[pl2_i(kva)];
-		*pde = pa | pmap_pg_g | PG_PS | PG_KR | PG_V;
-		tlbflushg();
+	for (i = 0; i < BTSPACE_NSEGS; i++) {
+		if (bootspace.segs[i].type != BTSEG_TEXT) {
+			continue;
+		}
+		kva = roundup(bootspace.segs[i].va, NBPD_L2);
+		kva_end = rounddown(bootspace.segs[i].va +
+			bootspace.segs[i].sz, NBPD_L1);
+		pa = roundup(bootspace.segs[i].pa, NBPD_L2);
+		for (/* */; kva + NBPD_L2 <= kva_end; kva += NBPD_L2, pa += NBPD_L2) {
+			pde = &L2_BASE[pl2_i(kva)];
+			*pde = pa | pmap_pg_g | PG_PS | PG_KR | PG_V;
+			tlbflushg();
+		}
 	}
 
 	/* Remap the kernel rodata using large pages. */
-	kva = roundup(bootspace.rodata.va, NBPD_L2);
-	kva_end = rounddown(bootspace.rodata.va +
-	    bootspace.rodata.sz, NBPD_L1);
-	pa = roundup(bootspace.rodata.pa, NBPD_L2);
-	for (/* */; kva + NBPD_L2 <= kva_end; kva += NBPD_L2, pa += NBPD_L2) {
-		pde = &L2_BASE[pl2_i(kva)];
-		*pde = pa | pmap_pg_g | PG_PS | pmap_pg_nx | PG_KR | PG_V;
-		tlbflushg();
+	for (i = 0; i < BTSPACE_NSEGS; i++) {
+		if (bootspace.segs[i].type != BTSEG_RODATA) {
+			continue;
+		}
+		kva = roundup(bootspace.segs[i].va, NBPD_L2);
+		kva_end = rounddown(bootspace.segs[i].va +
+			bootspace.segs[i].sz, NBPD_L1);
+		pa = roundup(bootspace.segs[i].pa, NBPD_L2);
+		for (/* */; kva + NBPD_L2 <= kva_end; kva += NBPD_L2, pa += NBPD_L2) {
+			pde = &L2_BASE[pl2_i(kva)];
+			*pde = pa | pmap_pg_g | PG_PS | pmap_pg_nx | PG_KR | PG_V;
+			tlbflushg();
+		}
 	}
 
 	/* Remap the kernel data+bss using large pages. */
-	kva = roundup(bootspace.data.va, NBPD_L2);
-	kva_end = rounddown(bootspace.data.va +
-	    bootspace.data.sz, NBPD_L1);
-	pa = roundup(bootspace.data.pa, NBPD_L2);
-	for (/* */; kva + NBPD_L2 <= kva_end; kva += NBPD_L2, pa += NBPD_L2) {
-		pde = &L2_BASE[pl2_i(kva)];
-		*pde = pa | pmap_pg_g | PG_PS | pmap_pg_nx | PG_KW | PG_V;
-		tlbflushg();
+	for (i = 0; i < BTSPACE_NSEGS; i++) {
+		if (bootspace.segs[i].type != BTSEG_DATA) {
+			continue;
+		}
+		kva = roundup(bootspace.segs[i].va, NBPD_L2);
+		kva_end = rounddown(bootspace.segs[i].va +
+			bootspace.segs[i].sz, NBPD_L1);
+		pa = roundup(bootspace.segs[i].pa, NBPD_L2);
+		for (/* */; kva + NBPD_L2 <= kva_end; kva += NBPD_L2, pa += NBPD_L2) {
+			pde = &L2_BASE[pl2_i(kva)];
+			*pde = pa | pmap_pg_g | PG_PS | pmap_pg_nx | PG_KW | PG_V;
+			tlbflushg();
+		}
 	}
 }
 #endif /* !XEN */

Reply via email to