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 */