Module Name: src Committed By: maxv Date: Tue Oct 17 07:33:44 UTC 2017
Modified Files: src/sys/arch/amd64/amd64: amd64_trap.S locore.S src/sys/arch/amd64/include: frameasm.h src/sys/arch/x86/x86: cpu.c Log Message: Have the cpu clear PSL_D automatically when entering the kernel via a syscall. Then, don't clear PSL_D and PSL_AC in the syscall entry point, they are now both cleared by the cpu (faster). However they still need to be manually cleared in the interrupt/trap entry points. To generate a diff of this commit: cvs rdiff -u -r1.11 -r1.12 src/sys/arch/amd64/amd64/amd64_trap.S cvs rdiff -u -r1.131 -r1.132 src/sys/arch/amd64/amd64/locore.S cvs rdiff -u -r1.22 -r1.23 src/sys/arch/amd64/include/frameasm.h cvs rdiff -u -r1.137 -r1.138 src/sys/arch/x86/x86/cpu.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/amd64_trap.S diff -u src/sys/arch/amd64/amd64/amd64_trap.S:1.11 src/sys/arch/amd64/amd64/amd64_trap.S:1.12 --- src/sys/arch/amd64/amd64/amd64_trap.S:1.11 Fri Sep 15 17:32:12 2017 +++ src/sys/arch/amd64/amd64/amd64_trap.S Tue Oct 17 07:33:44 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: amd64_trap.S,v 1.11 2017/09/15 17:32:12 maxv Exp $ */ +/* $NetBSD: amd64_trap.S,v 1.12 2017/10/17 07:33:44 maxv Exp $ */ /* * Copyright (c) 1998, 2007, 2008, 2017 The NetBSD Foundation, Inc. @@ -66,7 +66,7 @@ #if 0 #include <machine/asm.h> -__KERNEL_RCSID(0, "$NetBSD: amd64_trap.S,v 1.11 2017/09/15 17:32:12 maxv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: amd64_trap.S,v 1.12 2017/10/17 07:33:44 maxv Exp $"); #endif /* @@ -122,6 +122,8 @@ IDTVEC(trap02) pushq $T_NMI subq $TF_REGSIZE,%rsp INTR_SAVE_GPRS + cld + callq smap_enable movw %gs,TF_GS(%rsp) movw %fs,TF_FS(%rsp) movw %es,TF_ES(%rsp) Index: src/sys/arch/amd64/amd64/locore.S diff -u src/sys/arch/amd64/amd64/locore.S:1.131 src/sys/arch/amd64/amd64/locore.S:1.132 --- src/sys/arch/amd64/amd64/locore.S:1.131 Sat Sep 30 11:43:57 2017 +++ src/sys/arch/amd64/amd64/locore.S Tue Oct 17 07:33:44 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: locore.S,v 1.131 2017/09/30 11:43:57 maxv Exp $ */ +/* $NetBSD: locore.S,v 1.132 2017/10/17 07:33:44 maxv Exp $ */ /* * Copyright-o-rama! @@ -1278,6 +1278,7 @@ IDTVEC(syscall) pushq $2 /* error code */ pushq $T_ASTFLT subq $TF_REGSIZE,%rsp + cld #endif INTR_SAVE_GPRS movw %es,TF_ES(%rsp) Index: src/sys/arch/amd64/include/frameasm.h diff -u src/sys/arch/amd64/include/frameasm.h:1.22 src/sys/arch/amd64/include/frameasm.h:1.23 --- src/sys/arch/amd64/include/frameasm.h:1.22 Tue Oct 17 06:58:15 2017 +++ src/sys/arch/amd64/include/frameasm.h Tue Oct 17 07:33:44 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: frameasm.h,v 1.22 2017/10/17 06:58:15 maxv Exp $ */ +/* $NetBSD: frameasm.h,v 1.23 2017/10/17 07:33:44 maxv Exp $ */ #ifndef _AMD64_MACHINE_FRAMEASM_H #define _AMD64_MACHINE_FRAMEASM_H @@ -55,9 +55,7 @@ movq %r15,TF_R15(%rsp) ; \ movq %rbp,TF_RBP(%rsp) ; \ movq %rbx,TF_RBX(%rsp) ; \ - movq %rax,TF_RAX(%rsp) ; \ - cld ; \ - callq smap_enable + movq %rax,TF_RAX(%rsp) #define INTR_RESTORE_GPRS \ movq TF_RDI(%rsp),%rdi ; \ @@ -79,6 +77,8 @@ #define INTRENTRY_L(kernel_trap, usertrap) \ subq $TF_REGSIZE,%rsp ; \ INTR_SAVE_GPRS ; \ + cld ; \ + callq smap_enable ; \ testb $SEL_UPL,TF_CS(%rsp) ; \ je kernel_trap ; \ usertrap ; \ Index: src/sys/arch/x86/x86/cpu.c diff -u src/sys/arch/x86/x86/cpu.c:1.137 src/sys/arch/x86/x86/cpu.c:1.138 --- src/sys/arch/x86/x86/cpu.c:1.137 Tue Oct 17 06:58:15 2017 +++ src/sys/arch/x86/x86/cpu.c Tue Oct 17 07:33:44 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: cpu.c,v 1.137 2017/10/17 06:58:15 maxv Exp $ */ +/* $NetBSD: cpu.c,v 1.138 2017/10/17 07:33:44 maxv Exp $ */ /* * Copyright (c) 2000-2012 NetBSD Foundation, Inc. @@ -62,7 +62,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.137 2017/10/17 06:58:15 maxv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.138 2017/10/17 07:33:44 maxv Exp $"); #include "opt_ddb.h" #include "opt_mpbios.h" /* for MPDEBUG */ @@ -1048,7 +1048,7 @@ cpu_init_msrs(struct cpu_info *ci, bool ((uint64_t)LSEL(LSYSRETBASE_SEL, SEL_UPL) << 48)); wrmsr(MSR_LSTAR, (uint64_t)Xsyscall); wrmsr(MSR_CSTAR, (uint64_t)Xsyscall32); - wrmsr(MSR_SFMASK, PSL_NT|PSL_T|PSL_I|PSL_C|PSL_AC); + wrmsr(MSR_SFMASK, PSL_NT|PSL_T|PSL_I|PSL_C|PSL_D|PSL_AC); if (full) { wrmsr(MSR_FSBASE, 0);