Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/arch Add a fifth region, called "head". On kaslr kernels...



details:   https://anonhg.NetBSD.org/src/rev/18fedf13ab45
branches:  trunk
changeset: 827463:18fedf13ab45
user:      maxv <maxv%NetBSD.org@localhost>
date:      Sun Oct 29 10:01:21 2017 +0000

description:
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.

diffstat:

 sys/arch/amd64/amd64/machdep.c         |  15 +++++++++++++--
 sys/arch/amd64/stand/prekern/prekern.c |   7 ++++++-
 sys/arch/amd64/stand/prekern/prekern.h |   7 ++++++-
 sys/arch/i386/i386/machdep.c           |   8 ++++++--
 sys/arch/x86/include/pmap.h            |   8 +++++++-
 sys/arch/x86/x86/pmap.c                |  13 +++++++++++--
 sys/arch/x86/x86/x86_machdep.c         |   6 +++---
 7 files changed, 52 insertions(+), 12 deletions(-)

diffs (197 lines):

diff -r 9ed8d86c6097 -r 18fedf13ab45 sys/arch/amd64/amd64/machdep.c
--- a/sys/arch/amd64/amd64/machdep.c    Sun Oct 29 09:51:42 2017 +0000
+++ b/sys/arch/amd64/amd64/machdep.c    Sun Oct 29 10:01:21 2017 +0000
@@ -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 @@
 
        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 @@
        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) {
diff -r 9ed8d86c6097 -r 18fedf13ab45 sys/arch/amd64/stand/prekern/prekern.c
--- a/sys/arch/amd64/stand/prekern/prekern.c    Sun Oct 29 09:51:42 2017 +0000
+++ b/sys/arch/amd64/stand/prekern/prekern.c    Sun Oct 29 10:01:21 2017 +0000
@@ -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 @@
            &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) -
diff -r 9ed8d86c6097 -r 18fedf13ab45 sys/arch/amd64/stand/prekern/prekern.h
--- a/sys/arch/amd64/stand/prekern/prekern.h    Sun Oct 29 09:51:42 2017 +0000
+++ b/sys/arch/amd64/stand/prekern/prekern.h    Sun Oct 29 10:01:21 2017 +0000
@@ -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 @@
                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;
diff -r 9ed8d86c6097 -r 18fedf13ab45 sys/arch/i386/i386/machdep.c
--- a/sys/arch/i386/i386/machdep.c      Sun Oct 29 09:51:42 2017 +0000
+++ b/sys/arch/i386/i386/machdep.c      Sun Oct 29 10:01:21 2017 +0000
@@ -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 @@
 
        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;
diff -r 9ed8d86c6097 -r 18fedf13ab45 sys/arch/x86/include/pmap.h
--- a/sys/arch/x86/include/pmap.h       Sun Oct 29 09:51:42 2017 +0000
+++ b/sys/arch/x86/include/pmap.h       Sun Oct 29 10:01:21 2017 +0000
@@ -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;
diff -r 9ed8d86c6097 -r 18fedf13ab45 sys/arch/x86/x86/pmap.c
--- a/sys/arch/x86/x86/pmap.c   Sun Oct 29 09:51:42 2017 +0000
+++ b/sys/arch/x86/x86/pmap.c   Sun Oct 29 10:01:21 2017 +0000
@@ -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 @@
        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;
diff -r 9ed8d86c6097 -r 18fedf13ab45 sys/arch/x86/x86/x86_machdep.c
--- a/sys/arch/x86/x86/x86_machdep.c    Sun Oct 29 09:51:42 2017 +0000
+++ b/sys/arch/x86/x86/x86_machdep.c    Sun Oct 29 10:01:21 2017 +0000
@@ -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 @@
 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;



Home | Main Index | Thread Index | Old Index