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