Module Name: src
Committed By: maxv
Date: Sun Oct 8 09:06:50 UTC 2017
Modified Files:
src/sys/arch/amd64/amd64: machdep.c
src/sys/arch/amd64/conf: GENERIC_KASLR files.amd64
src/sys/arch/i386/conf: files.i386
src/sys/arch/x86/x86: pmap.c x86_machdep.c
src/sys/arch/xen/conf: files.compat
Log Message:
KASLR: add workarounds to compute the bootinfo VAs (use the direct map),
and don't use large pages yet. Both will be fixed later.
To generate a diff of this commit:
cvs rdiff -u -r1.262 -r1.263 src/sys/arch/amd64/amd64/machdep.c
cvs rdiff -u -r1.1 -r1.2 src/sys/arch/amd64/conf/GENERIC_KASLR
cvs rdiff -u -r1.93 -r1.94 src/sys/arch/amd64/conf/files.amd64
cvs rdiff -u -r1.387 -r1.388 src/sys/arch/i386/conf/files.i386
cvs rdiff -u -r1.260 -r1.261 src/sys/arch/x86/x86/pmap.c
cvs rdiff -u -r1.96 -r1.97 src/sys/arch/x86/x86/x86_machdep.c
cvs rdiff -u -r1.28 -r1.29 src/sys/arch/xen/conf/files.compat
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.262 src/sys/arch/amd64/amd64/machdep.c:1.263
--- src/sys/arch/amd64/amd64/machdep.c:1.262 Sat Sep 30 11:43:57 2017
+++ src/sys/arch/amd64/amd64/machdep.c Sun Oct 8 09:06:50 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: machdep.c,v 1.262 2017/09/30 11:43:57 maxv Exp $ */
+/* $NetBSD: machdep.c,v 1.263 2017/10/08 09:06:50 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.262 2017/09/30 11:43:57 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.263 2017/10/08 09:06:50 maxv Exp $");
/* #define XENDEBUG_LOW */
@@ -122,6 +122,7 @@ __KERNEL_RCSID(0, "$NetBSD: machdep.c,v
#include "opt_mtrr.h"
#include "opt_realmem.h"
#include "opt_xen.h"
+#include "opt_kaslr.h"
#ifndef XEN
#include "opt_physmem.h"
#endif
@@ -1472,8 +1473,13 @@ init_x86_64_ksyms(void)
#ifndef XEN
symtab = lookup_bootinfo(BTINFO_SYMTAB);
if (symtab) {
+#ifdef KASLR
+ tssym = PMAP_DIRECT_MAP((paddr_t)symtab->ssym);
+ tesym = PMAP_DIRECT_MAP((paddr_t)symtab->esym);
+#else
tssym = (vaddr_t)symtab->ssym + KERNBASE;
tesym = (vaddr_t)symtab->esym + KERNBASE;
+#endif
ksyms_addsyms_elf(symtab->nsym, (void *)tssym, (void *)tesym);
} else
ksyms_addsyms_elf(*(long *)(void *)&end,
Index: src/sys/arch/amd64/conf/GENERIC_KASLR
diff -u src/sys/arch/amd64/conf/GENERIC_KASLR:1.1 src/sys/arch/amd64/conf/GENERIC_KASLR:1.2
--- src/sys/arch/amd64/conf/GENERIC_KASLR:1.1 Sat Oct 7 10:16:47 2017
+++ src/sys/arch/amd64/conf/GENERIC_KASLR Sun Oct 8 09:06:50 2017
@@ -1,5 +1,6 @@
-# $NetBSD: GENERIC_KASLR,v 1.1 2017/10/07 10:16:47 maxv Exp $
+# $NetBSD: GENERIC_KASLR,v 1.2 2017/10/08 09:06:50 maxv Exp $
include "arch/amd64/conf/GENERIC"
makeoptions KASLR=1 # Kernel ASLR
+options KASLR
Index: src/sys/arch/amd64/conf/files.amd64
diff -u src/sys/arch/amd64/conf/files.amd64:1.93 src/sys/arch/amd64/conf/files.amd64:1.94
--- src/sys/arch/amd64/conf/files.amd64:1.93 Sun Oct 8 08:26:01 2017
+++ src/sys/arch/amd64/conf/files.amd64 Sun Oct 8 09:06:50 2017
@@ -1,4 +1,4 @@
-# $NetBSD: files.amd64,v 1.93 2017/10/08 08:26:01 maxv Exp $
+# $NetBSD: files.amd64,v 1.94 2017/10/08 09:06:50 maxv Exp $
#
# new style config file for amd64 architecture
#
@@ -26,6 +26,7 @@ defparam opt_physmem.h PHYSMEM_MAX_ADDR
defflag PMC
defflag USER_LDT
+defflag KASLR
defflag eisa.h EISA
# Start code
Index: src/sys/arch/i386/conf/files.i386
diff -u src/sys/arch/i386/conf/files.i386:1.387 src/sys/arch/i386/conf/files.i386:1.388
--- src/sys/arch/i386/conf/files.i386:1.387 Tue Aug 15 08:51:38 2017
+++ src/sys/arch/i386/conf/files.i386 Sun Oct 8 09:06:50 2017
@@ -1,4 +1,4 @@
-# $NetBSD: files.i386,v 1.387 2017/08/15 08:51:38 maxv Exp $
+# $NetBSD: files.i386,v 1.388 2017/10/08 09:06:50 maxv Exp $
#
# new style config file for i386 architecture
#
@@ -19,6 +19,7 @@ defparam CPURESET_DELAY
obsolete defflag XBOX
defflag PMC
+defflag KASLR
# User-settable LDT (used by WINE)
defflag USER_LDT
Index: src/sys/arch/x86/x86/pmap.c
diff -u src/sys/arch/x86/x86/pmap.c:1.260 src/sys/arch/x86/x86/pmap.c:1.261
--- src/sys/arch/x86/x86/pmap.c:1.260 Sat Sep 30 12:35:48 2017
+++ src/sys/arch/x86/x86/pmap.c Sun Oct 8 09:06:50 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: pmap.c,v 1.260 2017/09/30 12:35:48 maxv Exp $ */
+/* $NetBSD: pmap.c,v 1.261 2017/10/08 09:06:50 maxv Exp $ */
/*
* Copyright (c) 2008, 2010, 2016, 2017 The NetBSD Foundation, Inc.
@@ -51,7 +51,6 @@
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
*/
/*
@@ -171,12 +170,13 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.260 2017/09/30 12:35:48 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.261 2017/10/08 09:06:50 maxv Exp $");
#include "opt_user_ldt.h"
#include "opt_lockdebug.h"
#include "opt_multiprocessor.h"
#include "opt_xen.h"
+#include "opt_kaslr.h"
#include <sys/param.h>
#include <sys/systm.h>
@@ -1605,6 +1605,11 @@ pmap_remap_largepages(void)
vaddr_t kva, kva_end;
paddr_t pa;
+#ifdef KASLR
+ /* XXX no large pages yet, soon */
+ return;
+#endif
+
/* Remap the kernel text using large pages. */
kva = rounddown(bootspace.text.va, NBPD_L2);
kva_end = rounddown(bootspace.text.va +
Index: src/sys/arch/x86/x86/x86_machdep.c
diff -u src/sys/arch/x86/x86/x86_machdep.c:1.96 src/sys/arch/x86/x86/x86_machdep.c:1.97
--- src/sys/arch/x86/x86/x86_machdep.c:1.96 Mon Oct 2 19:23:16 2017
+++ src/sys/arch/x86/x86/x86_machdep.c Sun Oct 8 09:06:50 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: x86_machdep.c,v 1.96 2017/10/02 19:23:16 maxv Exp $ */
+/* $NetBSD: x86_machdep.c,v 1.97 2017/10/08 09:06:50 maxv Exp $ */
/*-
* Copyright (c) 2002, 2006, 2007 YAMAMOTO Takashi,
@@ -31,11 +31,12 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: x86_machdep.c,v 1.96 2017/10/02 19:23:16 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: x86_machdep.c,v 1.97 2017/10/08 09:06:50 maxv Exp $");
#include "opt_modular.h"
#include "opt_physmem.h"
#include "opt_splash.h"
+#include "opt_kaslr.h"
#include <sys/types.h>
#include <sys/param.h>
@@ -229,7 +230,11 @@ module_init_md(void)
bi->path, bi->len, bi->base);
KASSERT(trunc_page(bi->base) == bi->base);
module_prime(bi->path,
+#ifdef KASLR
+ (void *)PMAP_DIRECT_MAP((uintptr_t)bi->base),
+#else
(void *)((uintptr_t)bi->base + KERNBASE),
+#endif
bi->len);
break;
case BI_MODULE_IMAGE:
@@ -238,7 +243,12 @@ module_init_md(void)
bi->path, bi->len, bi->base);
KASSERT(trunc_page(bi->base) == bi->base);
splash_setimage(
- (void *)((uintptr_t)bi->base + KERNBASE), bi->len);
+#ifdef KASLR
+ (void *)PMAP_DIRECT_MAP((uintptr_t)bi->base),
+#else
+ (void *)((uintptr_t)bi->base + KERNBASE),
+#endif
+ bi->len);
#endif
break;
case BI_MODULE_RND:
@@ -246,7 +256,11 @@ module_init_md(void)
bi->path, bi->len, bi->base);
KASSERT(trunc_page(bi->base) == bi->base);
rnd_seed(
+#ifdef KASLR
+ (void *)PMAP_DIRECT_MAP((uintptr_t)bi->base),
+#else
(void *)((uintptr_t)bi->base + KERNBASE),
+#endif
bi->len);
break;
case BI_MODULE_FS:
@@ -254,7 +268,12 @@ module_init_md(void)
bi->path, bi->len, bi->base);
KASSERT(trunc_page(bi->base) == bi->base);
#if defined(MEMORY_DISK_HOOKS) && defined(MEMORY_DISK_DYNAMIC)
- md_root_setconf((void *)((uintptr_t)bi->base + KERNBASE),
+ md_root_setconf(
+#ifdef KASLR
+ (void *)PMAP_DIRECT_MAP((uintptr_t)bi->base),
+#else
+ (void *)((uintptr_t)bi->base + KERNBASE),
+#endif
bi->len);
#endif
break;
Index: src/sys/arch/xen/conf/files.compat
diff -u src/sys/arch/xen/conf/files.compat:1.28 src/sys/arch/xen/conf/files.compat:1.29
--- src/sys/arch/xen/conf/files.compat:1.28 Sat Aug 12 07:21:57 2017
+++ src/sys/arch/xen/conf/files.compat Sun Oct 8 09:06:50 2017
@@ -1,4 +1,4 @@
-# $NetBSD: files.compat,v 1.28 2017/08/12 07:21:57 maxv Exp $
+# $NetBSD: files.compat,v 1.29 2017/10/08 09:06:50 maxv Exp $
# NetBSD: files.x86,v 1.10 2003/10/08 17:30:00 bouyer Exp
# options for MP configuration through the MP spec
@@ -6,7 +6,7 @@
#defflag opt_mpacpi.h MPACPI MPACPI_SCANPCI
# MTRR support
-defflag MTRR
+defflag MTRR
defflag opt_xen.h XEN PAE
@@ -25,7 +25,8 @@ defflag bioscall.h XXXBIOSCALL
defflag opt_pcibios.h XXXOPT_PCIBIOS
defflag opt_pcifixup.h XXXOPT_PCIFIXUP
-defflag opt_pmc.h XXXPMC
+defflag opt_pmc.h XXXPMC
+defflag opt_kaslr.h XXXKASLR
# User-settable LDT (used by WINE)
defflag opt_user_ldt.h XXXUSER_LDT