Module Name: src
Committed By: maxv
Date: Sun Oct 29 10:01:22 UTC 2017
Modified Files:
src/sys/arch/amd64/amd64: machdep.c
src/sys/arch/amd64/stand/prekern: prekern.c prekern.h
src/sys/arch/i386/i386: machdep.c
src/sys/arch/x86/include: pmap.h
src/sys/arch/x86/x86: pmap.c x86_machdep.c
Log Message:
Add a fifth region, called "head". On kaslr kernels it contains the ELF
Header and the ELF Section Headers. On normal kernels it is empty (the
headers are in the "boot" region).
Note: if you're using GENERIC_KASLR, you also need to rebuild the prekern.
To generate a diff of this commit:
cvs rdiff -u -r1.272 -r1.273 src/sys/arch/amd64/amd64/machdep.c
cvs rdiff -u -r1.1 -r1.2 src/sys/arch/amd64/stand/prekern/prekern.c \
src/sys/arch/amd64/stand/prekern/prekern.h
cvs rdiff -u -r1.796 -r1.797 src/sys/arch/i386/i386/machdep.c
cvs rdiff -u -r1.69 -r1.70 src/sys/arch/x86/include/pmap.h
cvs rdiff -u -r1.262 -r1.263 src/sys/arch/x86/x86/pmap.c
cvs rdiff -u -r1.100 -r1.101 src/sys/arch/x86/x86/x86_machdep.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.272 src/sys/arch/amd64/amd64/machdep.c:1.273
--- src/sys/arch/amd64/amd64/machdep.c:1.272 Sat Oct 21 06:55:54 2017
+++ src/sys/arch/amd64/amd64/machdep.c Sun Oct 29 10:01:21 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: machdep.c,v 1.272 2017/10/21 06:55:54 maxv Exp $ */
+/* $NetBSD: machdep.c,v 1.273 2017/10/29 10:01:21 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.272 2017/10/21 06:55:54 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.273 2017/10/29 10:01:21 maxv Exp $");
/* #define XENDEBUG_LOW */
@@ -1510,6 +1510,10 @@ init_bootspace(void)
memset(&bootspace, 0, sizeof(bootspace));
+ bootspace.head.va = KERNTEXTOFF;
+ 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;
@@ -2004,6 +2008,13 @@ mm_md_kernacc(void *ptr, vm_prot_t prot,
const vaddr_t v = (vaddr_t)ptr;
vaddr_t kva, kva_end;
+ kva = bootspace.head.va;
+ kva_end = kva + bootspace.head.sz;
+ if (v >= kva && v < kva_end) {
+ *handled = true;
+ return 0;
+ }
+
kva = bootspace.text.va;
kva_end = kva + bootspace.text.sz;
if (v >= kva && v < kva_end) {
Index: src/sys/arch/amd64/stand/prekern/prekern.c
diff -u src/sys/arch/amd64/stand/prekern/prekern.c:1.1 src/sys/arch/amd64/stand/prekern/prekern.c:1.2
--- src/sys/arch/amd64/stand/prekern/prekern.c:1.1 Tue Oct 10 09:29:14 2017
+++ src/sys/arch/amd64/stand/prekern/prekern.c Sun Oct 29 10:01:22 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: prekern.c,v 1.1 2017/10/10 09:29:14 maxv Exp $ */
+/* $NetBSD: prekern.c,v 1.2 2017/10/29 10:01:22 maxv Exp $ */
/*
* Copyright (c) 2017 The NetBSD Foundation, Inc. All rights reserved.
@@ -250,6 +250,11 @@ init_bootspace(vaddr_t baseva)
&bootspace.rodata.sz);
elf_get_data(&bootspace.data.va, &bootspace.data.pa,
&bootspace.data.sz);
+
+ bootspace.head.va = baseva;
+ bootspace.head.pa = mm_vatopa(bootspace.head.va);
+ bootspace.head.sz = bootspace.text.va - baseva;
+
bootspace.boot.va = bootspace.data.va + bootspace.data.sz;
bootspace.boot.pa = mm_vatopa(bootspace.boot.va);
bootspace.boot.sz = (size_t)(iom_base + IOM_SIZE) -
Index: src/sys/arch/amd64/stand/prekern/prekern.h
diff -u src/sys/arch/amd64/stand/prekern/prekern.h:1.1 src/sys/arch/amd64/stand/prekern/prekern.h:1.2
--- src/sys/arch/amd64/stand/prekern/prekern.h:1.1 Tue Oct 10 09:29:14 2017
+++ src/sys/arch/amd64/stand/prekern/prekern.h Sun Oct 29 10:01:22 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: prekern.h,v 1.1 2017/10/10 09:29:14 maxv Exp $ */
+/* $NetBSD: prekern.h,v 1.2 2017/10/29 10:01:22 maxv Exp $ */
/*
* Copyright (c) 2017 The NetBSD Foundation, Inc. All rights reserved.
@@ -62,6 +62,11 @@ struct bootspace {
vaddr_t va;
paddr_t pa;
size_t sz;
+ } head;
+ struct {
+ vaddr_t va;
+ paddr_t pa;
+ size_t sz;
} text;
struct {
vaddr_t va;
Index: src/sys/arch/i386/i386/machdep.c
diff -u src/sys/arch/i386/i386/machdep.c:1.796 src/sys/arch/i386/i386/machdep.c:1.797
--- src/sys/arch/i386/i386/machdep.c:1.796 Mon Oct 9 17:49:27 2017
+++ src/sys/arch/i386/i386/machdep.c Sun Oct 29 10:01:21 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: machdep.c,v 1.796 2017/10/09 17:49:27 maya Exp $ */
+/* $NetBSD: machdep.c,v 1.797 2017/10/29 10:01:21 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.796 2017/10/09 17:49:27 maya Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.797 2017/10/29 10:01:21 maxv Exp $");
#include "opt_beep.h"
#include "opt_compat_freebsd.h"
@@ -1105,6 +1105,10 @@ init_bootspace(void)
memset(&bootspace, 0, sizeof(bootspace));
+ bootspace.head.va = KERNTEXTOFF;
+ 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;
Index: src/sys/arch/x86/include/pmap.h
diff -u src/sys/arch/x86/include/pmap.h:1.69 src/sys/arch/x86/include/pmap.h:1.70
--- src/sys/arch/x86/include/pmap.h:1.69 Sat Sep 30 11:43:57 2017
+++ src/sys/arch/x86/include/pmap.h Sun Oct 29 10:01:22 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: pmap.h,v 1.69 2017/09/30 11:43:57 maxv Exp $ */
+/* $NetBSD: pmap.h,v 1.70 2017/10/29 10:01:22 maxv Exp $ */
/*
* Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -112,6 +112,12 @@
#include <uvm/pmap/pmap_pvt.h>
struct bootspace {
+ struct {
+ vaddr_t va;
+ paddr_t pa;
+ size_t sz;
+ } head;
+
/* Kernel segments. */
struct {
vaddr_t va;
Index: src/sys/arch/x86/x86/pmap.c
diff -u src/sys/arch/x86/x86/pmap.c:1.262 src/sys/arch/x86/x86/pmap.c:1.263
--- src/sys/arch/x86/x86/pmap.c:1.262 Sun Oct 8 13:49:38 2017
+++ src/sys/arch/x86/x86/pmap.c Sun Oct 29 10:01:21 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: pmap.c,v 1.262 2017/10/08 13:49:38 maxv Exp $ */
+/* $NetBSD: pmap.c,v 1.263 2017/10/29 10:01:21 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.262 2017/10/08 13:49:38 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.263 2017/10/29 10:01:21 maxv Exp $");
#include "opt_user_ldt.h"
#include "opt_lockdebug.h"
@@ -1557,6 +1557,15 @@ pmap_remap_global(void)
vaddr_t kva, kva_end;
unsigned long p1i;
+ /* head */
+ kva = bootspace.head.va;
+ kva_end = kva + bootspace.head.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 text */
kva = bootspace.text.va;
kva_end = kva + bootspace.text.sz;
Index: src/sys/arch/x86/x86/x86_machdep.c
diff -u src/sys/arch/x86/x86/x86_machdep.c:1.100 src/sys/arch/x86/x86/x86_machdep.c:1.101
--- src/sys/arch/x86/x86/x86_machdep.c:1.100 Mon Oct 23 06:00:59 2017
+++ src/sys/arch/x86/x86/x86_machdep.c Sun Oct 29 10:01:21 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: x86_machdep.c,v 1.100 2017/10/23 06:00:59 maxv Exp $ */
+/* $NetBSD: x86_machdep.c,v 1.101 2017/10/29 10:01:21 maxv Exp $ */
/*-
* Copyright (c) 2002, 2006, 2007 YAMAMOTO Takashi,
@@ -31,7 +31,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: x86_machdep.c,v 1.100 2017/10/23 06:00:59 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: x86_machdep.c,v 1.101 2017/10/29 10:01:21 maxv Exp $");
#include "opt_modular.h"
#include "opt_physmem.h"
@@ -886,7 +886,7 @@ int
init_x86_vm(paddr_t pa_kend)
{
extern struct bootspace bootspace;
- paddr_t pa_kstart = bootspace.text.pa; /* XXX head instead */
+ paddr_t pa_kstart = bootspace.head.pa;
uint64_t seg_start, seg_end;
uint64_t seg_start1, seg_end1;
int x;