Module Name: src Committed By: maxv Date: Thu Jan 11 09:00:04 UTC 2018
Modified Files: src/sys/arch/amd64/amd64: locore.S machdep.c src/sys/arch/amd64/include: frameasm.h types.h Log Message: Declare new SVS_* variants: SVS_ENTER_NOSTACK and SVS_LEAVE_NOSTACK. Use SVS_ENTER_NOSTACK in the syscall entry point, and put it before the code that touches curlwp. (curlwp is located in the direct map.) Then, disable __HAVE_CPU_UAREA_ROUTINES (to be removed later). This moves the kernel stack into pmap_kernel(), and not the direct map. That's a change I've always wanted to make: because of the direct map we can't add a redzone on the stack, and basically, a stack overflow can go very far in memory without being detected (as far as erasing all of the system's memory). Finally, unmap the direct map from userland. To generate a diff of this commit: cvs rdiff -u -r1.145 -r1.146 src/sys/arch/amd64/amd64/locore.S cvs rdiff -u -r1.285 -r1.286 src/sys/arch/amd64/amd64/machdep.c cvs rdiff -u -r1.27 -r1.28 src/sys/arch/amd64/include/frameasm.h cvs rdiff -u -r1.53 -r1.54 src/sys/arch/amd64/include/types.h 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/locore.S diff -u src/sys/arch/amd64/amd64/locore.S:1.145 src/sys/arch/amd64/amd64/locore.S:1.146 --- src/sys/arch/amd64/amd64/locore.S:1.145 Sun Jan 7 16:10:16 2018 +++ src/sys/arch/amd64/amd64/locore.S Thu Jan 11 09:00:04 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: locore.S,v 1.145 2018/01/07 16:10:16 maxv Exp $ */ +/* $NetBSD: locore.S,v 1.146 2018/01/11 09:00:04 maxv Exp $ */ /* * Copyright-o-rama! @@ -1268,6 +1268,7 @@ IDTVEC(syscall) * is ignored as well. */ swapgs + SVS_ENTER_NOSTACK movq %r15,CPUVAR(SCRATCH) movq CPUVAR(CURLWP),%r15 movq L_PCB(%r15),%r15 @@ -1295,7 +1296,6 @@ IDTVEC(syscall) subq $TF_REGSIZE,%rsp cld #endif - SVS_ENTER INTR_SAVE_GPRS movw $GSEL(GUDATA_SEL, SEL_UPL),TF_DS(%rsp) movw $GSEL(GUDATA_SEL, SEL_UPL),TF_ES(%rsp) Index: src/sys/arch/amd64/amd64/machdep.c diff -u src/sys/arch/amd64/amd64/machdep.c:1.285 src/sys/arch/amd64/amd64/machdep.c:1.286 --- src/sys/arch/amd64/amd64/machdep.c:1.285 Sun Jan 7 16:10:16 2018 +++ src/sys/arch/amd64/amd64/machdep.c Thu Jan 11 09:00:04 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: machdep.c,v 1.285 2018/01/07 16:10:16 maxv Exp $ */ +/* $NetBSD: machdep.c,v 1.286 2018/01/11 09:00:04 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.285 2018/01/07 16:10:16 maxv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.286 2018/01/11 09:00:04 maxv Exp $"); /* #define XENDEBUG_LOW */ @@ -2339,6 +2339,8 @@ svs_pte_atomic_read(struct pmap *pmap, s void svs_pdir_switch(struct pmap *pmap) { + extern size_t pmap_direct_pdpe; + extern size_t pmap_direct_npdp; struct cpu_info *ci = curcpu(); pt_entry_t pte; size_t i; @@ -2351,8 +2353,14 @@ svs_pdir_switch(struct pmap *pmap) mutex_enter(&ci->ci_svs_mtx); for (i = 0; i < 512; i++) { - if (i == PDIR_SLOT_PTE) { - /* We don't want to have this mapped. */ + /* + * This is where we decide what to unmap from the user page + * tables. + */ + if (pmap_direct_pdpe <= i && + i < pmap_direct_pdpe + pmap_direct_npdp) { + ci->ci_svs_updir[i] = 0; + } else if (i == PDIR_SLOT_PTE) { ci->ci_svs_updir[i] = 0; } else { pte = svs_pte_atomic_read(pmap, i); Index: src/sys/arch/amd64/include/frameasm.h diff -u src/sys/arch/amd64/include/frameasm.h:1.27 src/sys/arch/amd64/include/frameasm.h:1.28 --- src/sys/arch/amd64/include/frameasm.h:1.27 Sun Jan 7 16:10:16 2018 +++ src/sys/arch/amd64/include/frameasm.h Thu Jan 11 09:00:04 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: frameasm.h,v 1.27 2018/01/07 16:10:16 maxv Exp $ */ +/* $NetBSD: frameasm.h,v 1.28 2018/01/11 09:00:04 maxv Exp $ */ #ifndef _AMD64_MACHINE_FRAMEASM_H #define _AMD64_MACHINE_FRAMEASM_H @@ -107,9 +107,21 @@ movq CPUVAR(UPDIRPA),%rax ; \ movq %rax,%cr3 ; \ popq %rax +#define SVS_ENTER_NOSTACK \ + movq %rax,CPUVAR(SCRATCH) ; \ + movq CPUVAR(KPDIRPA),%rax ; \ + movq %rax,%cr3 ; \ + movq CPUVAR(SCRATCH),%rax +#define SVS_LEAVE_NOSTACK \ + movq %rax,CPUVAR(SCRATCH) ; \ + movq CPUVAR(UPDIRPA),%rax ; \ + movq %rax,%cr3 ; \ + movq CPUVAR(SCRATCH),%rax #else #define SVS_ENTER /* nothing */ #define SVS_LEAVE /* nothing */ +#define SVS_ENTER_NOSTACK /* nothing */ +#define SVS_LEAVE_NOSTACK /* nothing */ #endif #define INTRENTRY_L(kernel_trap, usertrap) \ Index: src/sys/arch/amd64/include/types.h diff -u src/sys/arch/amd64/include/types.h:1.53 src/sys/arch/amd64/include/types.h:1.54 --- src/sys/arch/amd64/include/types.h:1.53 Fri Jan 5 08:04:21 2018 +++ src/sys/arch/amd64/include/types.h Thu Jan 11 09:00:04 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: types.h,v 1.53 2018/01/05 08:04:21 maxv Exp $ */ +/* $NetBSD: types.h,v 1.54 2018/01/11 09:00:04 maxv Exp $ */ /*- * Copyright (c) 1990 The Regents of the University of California. @@ -106,7 +106,7 @@ typedef unsigned char __cpu_simple_lock #define __HAVE_DIRECT_MAP 1 #define __HAVE_MM_MD_DIRECT_MAPPED_IO #define __HAVE_MM_MD_DIRECT_MAPPED_PHYS -#define __HAVE_CPU_UAREA_ROUTINES +/* #define __HAVE_CPU_UAREA_ROUTINES */ #if !defined(NO_PCI_MSI_MSIX) #define __HAVE_PCI_MSI_MSIX #endif