Module Name:    src
Committed By:   martin
Date:           Sat Apr 14 10:11:49 UTC 2018

Modified Files:
        src/sys/arch/amd64/amd64 [netbsd-8]: amd64_trap.S copy.S trap.c
        src/sys/arch/amd64/include [netbsd-8]: frameasm.h
        src/sys/arch/x86/x86 [netbsd-8]: cpu.c patch.c

Log Message:
Pullup the following revisions via patch, requested by maxv in ticket #748:

sys/arch/amd64/amd64/copy.S             1.29 (adapted, via patch)
sys/arch/amd64/amd64/amd64_trap.S       1.16,1.19 (partial) (via patch)
sys/arch/amd64/amd64/trap.c             1.102,1.106 (partial),1.110 (via patch)
sys/arch/amd64/include/frameasm.h       1.22,1.24 (via patch)
sys/arch/x86/x86/cpu.c                  1.137 (via patch)
sys/arch/x86/x86/patch.c                1.23,1.26 (partial) (via patch)

Backport of SMAP support.


To generate a diff of this commit:
cvs rdiff -u -r1.5.6.2 -r1.5.6.3 src/sys/arch/amd64/amd64/amd64_trap.S
cvs rdiff -u -r1.20.10.2 -r1.20.10.3 src/sys/arch/amd64/amd64/copy.S
cvs rdiff -u -r1.96.4.3 -r1.96.4.4 src/sys/arch/amd64/amd64/trap.c
cvs rdiff -u -r1.20.32.2 -r1.20.32.3 src/sys/arch/amd64/include/frameasm.h
cvs rdiff -u -r1.130.2.5 -r1.130.2.6 src/sys/arch/x86/x86/cpu.c
cvs rdiff -u -r1.22.22.1 -r1.22.22.2 src/sys/arch/x86/x86/patch.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.5.6.2 src/sys/arch/amd64/amd64/amd64_trap.S:1.5.6.3
--- src/sys/arch/amd64/amd64/amd64_trap.S:1.5.6.2	Thu Mar 22 16:59:03 2018
+++ src/sys/arch/amd64/amd64/amd64_trap.S	Sat Apr 14 10:11:49 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: amd64_trap.S,v 1.5.6.2 2018/03/22 16:59:03 martin Exp $	*/
+/*	$NetBSD: amd64_trap.S,v 1.5.6.3 2018/04/14 10:11:49 martin Exp $	*/
 
 /*
  * Copyright (c) 1998, 2007, 2008, 2017 The NetBSD Foundation, Inc.
@@ -136,6 +136,7 @@ IDTVEC(trap02)
 	INTR_SAVE_GPRS
 	SVS_ENTER_ALTSTACK
 	cld
+	SMAP_ENABLE
 	movw	%gs,TF_GS(%rsp)
 	movw	%fs,TF_FS(%rsp)
 	movw	%es,TF_ES(%rsp)
@@ -236,6 +237,7 @@ IDTVEC(trap08)
 	swapgs
 1:
 	cld
+	SMAP_ENABLE
 	movw	%gs,TF_GS(%rsp)
 	movw	%fs,TF_FS(%rsp)
 	movw	%es,TF_ES(%rsp)

Index: src/sys/arch/amd64/amd64/copy.S
diff -u src/sys/arch/amd64/amd64/copy.S:1.20.10.2 src/sys/arch/amd64/amd64/copy.S:1.20.10.3
--- src/sys/arch/amd64/amd64/copy.S:1.20.10.2	Mon Feb 26 00:49:48 2018
+++ src/sys/arch/amd64/amd64/copy.S	Sat Apr 14 10:11:49 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: copy.S,v 1.20.10.2 2018/02/26 00:49:48 snj Exp $	*/
+/*	$NetBSD: copy.S,v 1.20.10.3 2018/04/14 10:11:49 martin Exp $	*/
 
 /*
  * Copyright (c) 2001 Wasabi Systems, Inc.
@@ -187,6 +187,7 @@ ENTRY(copyout)
 	cmpq	%r8,%rdx
 	ja	_C_LABEL(copy_efault)	/* jump if end in kernel space */
 
+	SMAP_DISABLE
 .Lcopyout_start:
 	movq	%rax,%rcx		/* length */
 	shrq	$3,%rcx			/* count of 8-byte words */
@@ -197,6 +198,7 @@ ENTRY(copyout)
 	rep
 	movsb				/* copy remaining bytes */
 .Lcopyout_end:
+	SMAP_ENABLE
 
 	xorl	%eax,%eax
 	ret
@@ -215,6 +217,7 @@ ENTRY(copyin)
 	cmpq	%r8,%rdx
 	ja	_C_LABEL(copy_efault)	/* j if end in kernel space */
 
+	SMAP_DISABLE
 .Lcopyin_start:
 3:	/* bcopy(%rsi, %rdi, %rax); */
 	movq	%rax,%rcx
@@ -226,6 +229,7 @@ ENTRY(copyin)
 	rep
 	movsb
 .Lcopyin_end:
+	SMAP_ENABLE
 
 	xorl	%eax,%eax
 	ret
@@ -242,6 +246,7 @@ NENTRY(kcopy_fault)
 END(kcopy_fault)
 
 NENTRY(copy_fault)
+	SMAP_ENABLE
 	ret
 END(copy_fault)
 
@@ -263,6 +268,7 @@ ENTRY(copyoutstr)
 	movq	%rax,%r8
 1:	incq	%rdx
 
+	SMAP_DISABLE
 .Lcopyoutstr_start:
 1:	decq	%rdx
 	jz	2f
@@ -271,6 +277,7 @@ ENTRY(copyoutstr)
 	testb	%al,%al
 	jnz	1b
 .Lcopyoutstr_end:
+	SMAP_ENABLE
 
 	/* Success -- 0 byte reached. */
 	decq	%rdx
@@ -278,6 +285,7 @@ ENTRY(copyoutstr)
 	jmp	copystr_return
 
 2:	/* rdx is zero -- return EFAULT or ENAMETOOLONG. */
+	SMAP_ENABLE
 	movq	$VM_MAXUSER_ADDRESS,%r11
 	cmpq	%r11,%rdi
 	jae	_C_LABEL(copystr_efault)
@@ -304,6 +312,7 @@ ENTRY(copyinstr)
 	movq	%rax,%r8
 1:	incq	%rdx
 
+	SMAP_DISABLE
 .Lcopyinstr_start:
 1:	decq	%rdx
 	jz	2f
@@ -312,6 +321,7 @@ ENTRY(copyinstr)
 	testb	%al,%al
 	jnz	1b
 .Lcopyinstr_end:
+	SMAP_ENABLE
 
 	/* Success -- 0 byte reached. */
 	decq	%rdx
@@ -319,6 +329,7 @@ ENTRY(copyinstr)
 	jmp	copystr_return
 
 2:	/* rdx is zero -- return EFAULT or ENAMETOOLONG. */
+	SMAP_ENABLE
 	movq	$VM_MAXUSER_ADDRESS,%r11
 	cmpq	%r11,%rsi
 	jae	_C_LABEL(copystr_efault)
@@ -333,6 +344,7 @@ ENTRY(copystr_efault)
 END(copystr_efault)
 
 ENTRY(copystr_fault)
+	SMAP_ENABLE
 copystr_return:
 	/* Set *lencopied and return %eax. */
 	testq	%r9,%r9
@@ -382,7 +394,9 @@ ENTRY(fuswintr)
 	leaq	_C_LABEL(fusuintrfailure)(%rip),%r11
 	movq	%r11,PCB_ONFAULT(%rcx)
 
+	SMAP_DISABLE
 	movzwl	(%rdi),%eax
+	SMAP_ENABLE
 
 	movq	$0,PCB_ONFAULT(%rcx)
 	ret
@@ -397,7 +411,9 @@ ENTRY(fubyte)
 	leaq	_C_LABEL(fusufailure)(%rip),%r11
 	movq	%r11,PCB_ONFAULT(%rcx)
 
+	SMAP_DISABLE
 	movzbl	(%rdi),%eax
+	SMAP_ENABLE
 
 	movq	$0,PCB_ONFAULT(%rcx)
 	ret
@@ -414,7 +430,9 @@ ENTRY(suswintr)
 	leaq	_C_LABEL(fusuintrfailure)(%rip),%r11
 	movq	%r11,PCB_ONFAULT(%rcx)
 
+	SMAP_DISABLE
 	movw	%si,(%rdi)
+	SMAP_ENABLE
 
 	xorq	%rax,%rax
 	movq	%rax,PCB_ONFAULT(%rcx)
@@ -431,7 +449,9 @@ ENTRY(subyte)
 	leaq	_C_LABEL(fusufailure)(%rip),%r11
 	movq	%r11,PCB_ONFAULT(%rcx)
 
+	SMAP_DISABLE
 	movb	%sil,(%rdi)
+	SMAP_ENABLE
 
 	xorq	%rax,%rax
 	movq	%rax,PCB_ONFAULT(%rcx)
@@ -444,12 +464,14 @@ END(subyte)
  * because trap.c checks for them.
  */
 ENTRY(fusuintrfailure)
+	SMAP_ENABLE
 	movq	$0,PCB_ONFAULT(%rcx)
 	movl	$-1,%eax
 	ret
 END(fusuintrfailure)
 
 ENTRY(fusufailure)
+	SMAP_ENABLE
 	movq	$0,PCB_ONFAULT(%rcx)
 	movl	$-1,%eax
 	ret
@@ -473,11 +495,13 @@ ENTRY(ucas_64)
 	ja	_C_LABEL(ucas_efault)
 	movq	%rsi,%rax
 
+	SMAP_DISABLE
 .Lucas64_start:
 	/* Perform the CAS */
 	lock
 	cmpxchgq %rdx,(%rdi)
 .Lucas64_end:
+	SMAP_ENABLE
 
 	/*
 	 * Note: %rax is "old" value.
@@ -500,11 +524,13 @@ ENTRY(ucas_32)
 	ja	_C_LABEL(ucas_efault)
 	movl	%esi,%eax
 
+	SMAP_DISABLE
 .Lucas32_start:
 	/* Perform the CAS */
 	lock
 	cmpxchgl %edx,(%rdi)
 .Lucas32_end:
+	SMAP_ENABLE
 
 	/*
 	 * Note: %eax is "old" value.
@@ -522,6 +548,7 @@ ENTRY(ucas_efault)
 END(ucas_efault)
 
 NENTRY(ucas_fault)
+	SMAP_ENABLE
 	ret
 END(ucas_fault)
 

Index: src/sys/arch/amd64/amd64/trap.c
diff -u src/sys/arch/amd64/amd64/trap.c:1.96.4.3 src/sys/arch/amd64/amd64/trap.c:1.96.4.4
--- src/sys/arch/amd64/amd64/trap.c:1.96.4.3	Sun Apr  8 06:14:18 2018
+++ src/sys/arch/amd64/amd64/trap.c	Sat Apr 14 10:11:49 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: trap.c,v 1.96.4.3 2018/04/08 06:14:18 snj Exp $	*/
+/*	$NetBSD: trap.c,v 1.96.4.4 2018/04/14 10:11:49 martin Exp $	*/
 
 /*-
  * Copyright (c) 1998, 2000 The NetBSD Foundation, Inc.
@@ -68,7 +68,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.96.4.3 2018/04/08 06:14:18 snj Exp $");
+__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.96.4.4 2018/04/14 10:11:49 martin Exp $");
 
 #include "opt_ddb.h"
 #include "opt_kgdb.h"
@@ -502,6 +502,15 @@ copyfault:
 				    (void *)cr2);
 		}
 
+		if ((frame->tf_err & PGEX_P) &&
+		    cr2 < VM_MAXUSER_ADDRESS) {
+			/* SMAP might have brought us here */
+			if (onfault_handler(pcb, frame) == NULL) {
+				panic("prevented access to %p (SMAP)",
+				    (void *)cr2);
+			}
+		}
+
 		goto faultcommon;
 
 	case T_PAGEFLT|T_USER: {	/* page fault */

Index: src/sys/arch/amd64/include/frameasm.h
diff -u src/sys/arch/amd64/include/frameasm.h:1.20.32.2 src/sys/arch/amd64/include/frameasm.h:1.20.32.3
--- src/sys/arch/amd64/include/frameasm.h:1.20.32.2	Thu Mar 22 16:59:03 2018
+++ src/sys/arch/amd64/include/frameasm.h	Sat Apr 14 10:11:49 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: frameasm.h,v 1.20.32.2 2018/03/22 16:59:03 martin Exp $	*/
+/*	$NetBSD: frameasm.h,v 1.20.32.3 2018/04/14 10:11:49 martin Exp $	*/
 
 #ifndef _AMD64_MACHINE_FRAMEASM_H
 #define _AMD64_MACHINE_FRAMEASM_H
@@ -36,6 +36,8 @@
 #define STI(temp_reg) sti
 #endif	/* XEN */
 
+#define HP_NAME_CLAC		1
+#define HP_NAME_STAC		2
 #define HP_NAME_SVS_ENTER	5
 #define HP_NAME_SVS_LEAVE	6
 #define HP_NAME_SVS_ENTER_ALT	7
@@ -49,6 +51,14 @@
 	.quad		123b			; \
 	.popsection
 
+#define SMAP_ENABLE \
+	HOTPATCH(HP_NAME_CLAC, 3)		; \
+	.byte 0x0F, 0x1F, 0x00			; \
+
+#define SMAP_DISABLE \
+	HOTPATCH(HP_NAME_STAC, 3)		; \
+	.byte 0x0F, 0x1F, 0x00			; \
+
 #define	SWAPGS	NOT_XEN(swapgs)
 
 /*
@@ -142,6 +152,7 @@
 	subq	$TF_REGSIZE,%rsp	; \
 	INTR_SAVE_GPRS			; \
 	cld				; \
+	SMAP_ENABLE			; \
 	testb	$SEL_UPL,TF_CS(%rsp)	; \
 	je	98f			; \
 	SWAPGS				; \

Index: src/sys/arch/x86/x86/cpu.c
diff -u src/sys/arch/x86/x86/cpu.c:1.130.2.5 src/sys/arch/x86/x86/cpu.c:1.130.2.6
--- src/sys/arch/x86/x86/cpu.c:1.130.2.5	Thu Mar 22 16:59:04 2018
+++ src/sys/arch/x86/x86/cpu.c	Sat Apr 14 10:11:49 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: cpu.c,v 1.130.2.5 2018/03/22 16:59:04 martin Exp $	*/
+/*	$NetBSD: cpu.c,v 1.130.2.6 2018/04/14 10:11:49 martin Exp $	*/
 
 /*-
  * Copyright (c) 2000-2012 NetBSD Foundation, Inc.
@@ -62,7 +62,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.130.2.5 2018/03/22 16:59:04 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.130.2.6 2018/04/14 10:11:49 martin Exp $");
 
 #include "opt_ddb.h"
 #include "opt_mpbios.h"		/* for MPDEBUG */
@@ -628,6 +628,12 @@ cpu_init(struct cpu_info *ci)
 	if (cpu_feature[5] & CPUID_SEF_SMEP)
 		cr4 |= CR4_SMEP;
 
+#ifdef amd64
+	/* If SMAP is supported, enable it */
+	if (cpu_feature[5] & CPUID_SEF_SMAP)
+		cr4 |= CR4_SMAP;
+#endif
+
 	if (cr4) {
 		cr4 |= rcr4();
 		lcr4(cr4);
@@ -1091,7 +1097,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_D);
+	wrmsr(MSR_SFMASK, PSL_NT|PSL_T|PSL_I|PSL_C|PSL_D|PSL_AC);
 
 #ifdef SVS
 	if (svs_enabled)

Index: src/sys/arch/x86/x86/patch.c
diff -u src/sys/arch/x86/x86/patch.c:1.22.22.1 src/sys/arch/x86/x86/patch.c:1.22.22.2
--- src/sys/arch/x86/x86/patch.c:1.22.22.1	Tue Mar  6 10:17:11 2018
+++ src/sys/arch/x86/x86/patch.c	Sat Apr 14 10:11:49 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: patch.c,v 1.22.22.1 2018/03/06 10:17:11 martin Exp $	*/
+/*	$NetBSD: patch.c,v 1.22.22.2 2018/04/14 10:11:49 martin Exp $	*/
 
 /*-
  * Copyright (c) 2007, 2008, 2009 The NetBSD Foundation, Inc.
@@ -34,7 +34,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: patch.c,v 1.22.22.1 2018/03/06 10:17:11 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: patch.c,v 1.22.22.2 2018/04/14 10:11:49 martin Exp $");
 
 #include "opt_lockdebug.h"
 #ifdef i386
@@ -293,5 +293,26 @@ x86_patch(bool early)
 		}
 	}
 
+#ifdef amd64
+	/*
+	 * SMAP.
+	 */
+	if (!early && cpu_feature[5] & CPUID_SEF_SMAP) {
+		KASSERT(rcr4() & CR4_SMAP);
+		const uint8_t clac_bytes[] = {
+			0x0F, 0x01, 0xCA /* clac */
+		};
+		const uint8_t stac_bytes[] = {
+			0x0F, 0x01, 0xCB /* stac */
+		};
+
+		/* nop,nop,nop -> clac */
+		x86_hotpatch(HP_NAME_CLAC, clac_bytes, sizeof(clac_bytes));
+
+		/* nop,nop,nop -> stac */
+		x86_hotpatch(HP_NAME_STAC, stac_bytes, sizeof(stac_bytes));
+	}
+#endif
+
 	x86_patch_window_close(psl, cr0);
 }

Reply via email to