Module Name:    src
Committed By:   maxv
Date:           Sat Jan 27 09:33:25 UTC 2018

Modified Files:
        src/sys/arch/i386/i386: copy.S trap.c
        src/sys/arch/i386/include: frameasm.h
        src/sys/arch/x86/x86: cpu.c patch.c

Log Message:
Add SMAP support for i386.


To generate a diff of this commit:
cvs rdiff -u -r1.26 -r1.27 src/sys/arch/i386/i386/copy.S
cvs rdiff -u -r1.291 -r1.292 src/sys/arch/i386/i386/trap.c
cvs rdiff -u -r1.23 -r1.24 src/sys/arch/i386/include/frameasm.h
cvs rdiff -u -r1.146 -r1.147 src/sys/arch/x86/x86/cpu.c
cvs rdiff -u -r1.30 -r1.31 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/i386/i386/copy.S
diff -u src/sys/arch/i386/i386/copy.S:1.26 src/sys/arch/i386/i386/copy.S:1.27
--- src/sys/arch/i386/i386/copy.S:1.26	Sat Jan 27 07:45:57 2018
+++ src/sys/arch/i386/i386/copy.S	Sat Jan 27 09:33:25 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: copy.S,v 1.26 2018/01/27 07:45:57 maxv Exp $	*/
+/*	$NetBSD: copy.S,v 1.27 2018/01/27 09:33:25 maxv Exp $	*/
 
 /*
  * Copyright (c) 1998, 2000, 2004, 2008 The NetBSD Foundation, Inc.
@@ -64,7 +64,7 @@
  */
 
 #include <machine/asm.h>
-__KERNEL_RCSID(0, "$NetBSD: copy.S,v 1.26 2018/01/27 07:45:57 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: copy.S,v 1.27 2018/01/27 09:33:25 maxv Exp $");
 
 #include "assym.h"
 
@@ -234,6 +234,7 @@ ENTRY(copyout)
 	cmpl	$VM_MAXUSER_ADDRESS,%edx
 	ja	_C_LABEL(copy_efault)
 
+	SMAP_DISABLE
 .Lcopyout_start:
 	movl	%eax,%ecx
 	shrl	$2,%ecx
@@ -245,6 +246,7 @@ ENTRY(copyout)
 	rep
 	movsb
 .Lcopyout_end:
+	SMAP_ENABLE
 
 	popl	%edi
 	popl	%esi
@@ -272,6 +274,7 @@ ENTRY(copyin)
 	cmpl	$VM_MAXUSER_ADDRESS,%edx
 	ja	_C_LABEL(copy_efault)
 
+	SMAP_DISABLE
 .Lcopyin_start:
 	movl	%eax,%ecx
 	shrl	$2,%ecx
@@ -283,6 +286,7 @@ ENTRY(copyin)
 	rep
 	movsb
 .Lcopyin_end:
+	SMAP_ENABLE
 
 	popl	%edi
 	popl	%esi
@@ -311,6 +315,7 @@ NENTRY(kcopy_fault)
 END(kcopy_fault)
 
 NENTRY(copy_fault)
+	SMAP_ENABLE
 	popl	%edi
 	popl	%esi
 	ret
@@ -350,6 +355,7 @@ ENTRY(copyoutstr)
 	movl	%eax,20(%esp)
 1:	incl	%edx
 
+	SMAP_DISABLE
 .Lcopyoutstr_start:
 1:	decl	%edx
 	jz	2f
@@ -358,6 +364,7 @@ ENTRY(copyoutstr)
 	testb	%al,%al
 	jnz	1b
 .Lcopyoutstr_end:
+	SMAP_ENABLE
 
 	/* Success -- 0 byte reached. */
 	decl	%edx
@@ -365,6 +372,7 @@ ENTRY(copyoutstr)
 	jmp	copystr_return
 
 2:	/* edx is zero -- return EFAULT or ENAMETOOLONG. */
+	SMAP_ENABLE
 	cmpl	$VM_MAXUSER_ADDRESS,%edi
 	jae	_C_LABEL(copystr_efault)
 	movl	$ENAMETOOLONG,%eax
@@ -400,6 +408,7 @@ ENTRY(copyinstr)
 	movl	%eax,20(%esp)
 1:	incl	%edx
 
+	SMAP_DISABLE
 .Lcopyinstr_start:
 1:	decl	%edx
 	jz	2f
@@ -408,6 +417,7 @@ ENTRY(copyinstr)
 	testb	%al,%al
 	jnz	1b
 .Lcopyinstr_end:
+	SMAP_ENABLE
 
 	/* Success -- 0 byte reached. */
 	decl	%edx
@@ -415,6 +425,7 @@ ENTRY(copyinstr)
 	jmp	copystr_return
 
 2:	/* edx is zero -- return EFAULT or ENAMETOOLONG. */
+	SMAP_ENABLE
 	cmpl	$VM_MAXUSER_ADDRESS,%esi
 	jae	_C_LABEL(copystr_efault)
 	movl	$ENAMETOOLONG,%eax
@@ -428,6 +439,7 @@ NENTRY(copystr_efault)
 END(copystr_efault)
 
 NENTRY(copystr_fault)
+	SMAP_ENABLE
 copystr_return:
 	/* Set *lencopied and return %eax. */
 	movl	20(%esp),%ecx
@@ -499,7 +511,9 @@ ENTRY(fuword)
 	GET_CURPCB(%ecx)
 	movl	$_C_LABEL(fusufault),PCB_ONFAULT(%ecx)
 
+	SMAP_DISABLE
 	movl	(%edx),%eax
+	SMAP_ENABLE
 
 	movl	$0,PCB_ONFAULT(%ecx)
 	ret
@@ -522,7 +536,9 @@ ENTRY(fuswintr)
 	movl	L_PCB(%ecx),%ecx
 	movl	$_C_LABEL(fusubail),PCB_ONFAULT(%ecx)
 
+	SMAP_DISABLE
 	movzwl	(%edx),%eax
+	SMAP_ENABLE
 
 	movl	$0,PCB_ONFAULT(%ecx)
 	ret
@@ -541,7 +557,9 @@ ENTRY(fubyte)
 	GET_CURPCB(%ecx)
 	movl	$_C_LABEL(fusufault),PCB_ONFAULT(%ecx)
 
+	SMAP_DISABLE
 	movzbl	(%edx),%eax
+	SMAP_ENABLE
 
 	movl	$0,PCB_ONFAULT(%ecx)
 	ret
@@ -552,6 +570,7 @@ END(fubyte)
  * Handle faults from [fs]u*().  Clean up and return -1.
  */
 NENTRY(fusufault)
+	SMAP_ENABLE
 	movl	$0,PCB_ONFAULT(%ecx)
 	movl	$-1,%eax
 	ret
@@ -563,6 +582,7 @@ END(fusufault)
  * than trying to page fault.
  */
 NENTRY(fusubail)
+	SMAP_ENABLE
 	movl	$0,PCB_ONFAULT(%ecx)
 	movl	$-1,%eax
 	ret
@@ -593,7 +613,9 @@ ENTRY(suswintr)
 	movl	$_C_LABEL(fusubail),PCB_ONFAULT(%ecx)
 	movl	8(%esp),%eax
 
+	SMAP_DISABLE
 	movw	%ax,(%edx)
+	SMAP_ENABLE
 
 	xorl	%eax,%eax
 	movl	%eax,PCB_ONFAULT(%ecx)
@@ -614,7 +636,9 @@ ENTRY(subyte)
 	movl	$_C_LABEL(fusufault),PCB_ONFAULT(%ecx)
 	movb	8(%esp),%al
 
+	SMAP_DISABLE
 	movb	%al,(%edx)
+	SMAP_ENABLE
 
 	xorl	%eax,%eax
 	movl	%eax,PCB_ONFAULT(%ecx)
@@ -636,11 +660,13 @@ ENTRY(ucas_32)
 	cmpl	$VM_MAXUSER_ADDRESS-4,%edx
 	ja	_C_LABEL(ucas_efault)
 
+	SMAP_DISABLE
 .Lucas32_start:
 	/* Perform the CAS */
 	lock
 	cmpxchgl %ecx,(%edx)
 .Lucas32_end:
+	SMAP_ENABLE
 
 	/*
 	 * Note: %eax is "old" value.
@@ -659,6 +685,7 @@ NENTRY(ucas_efault)
 END(ucas_efault)
 
 NENTRY(ucas_fault)
+	SMAP_ENABLE
 	ret
 END(ucas_fault)
 
@@ -693,6 +720,7 @@ ENTRY(x86_copyargs)
 	cmpl	$VM_MAXUSER_ADDRESS,%eax
 	ja	_C_LABEL(x86_copyargs_efault)
 
+	SMAP_DISABLE
 .Lx86_copyargs_start:
 	/* There are a maximum of 8 args + 2 for syscall indirect */
 	cmp	$16,%ecx
@@ -722,6 +750,7 @@ ENTRY(x86_copyargs)
 	movl	%eax,32(%edx)
 	movl	%ecx,36(%edx)
 .Lx86_copyargs_end:
+	SMAP_ENABLE
 
 	popl	%esi
 	xorl	%eax,%eax
@@ -736,6 +765,7 @@ NENTRY(x86_copyargs_efault)
 END(x86_copyargs_efault)
 
 NENTRY(x86_copyargs_fault)
+	SMAP_ENABLE
 	popl	%esi
 	ret
 END(x86_copyargs_fault)

Index: src/sys/arch/i386/i386/trap.c
diff -u src/sys/arch/i386/i386/trap.c:1.291 src/sys/arch/i386/i386/trap.c:1.292
--- src/sys/arch/i386/i386/trap.c:1.291	Sun Sep 17 09:41:35 2017
+++ src/sys/arch/i386/i386/trap.c	Sat Jan 27 09:33:25 2018
@@ -1,5 +1,5 @@
 
-/*	$NetBSD: trap.c,v 1.291 2017/09/17 09:41:35 maxv Exp $	*/
+/*	$NetBSD: trap.c,v 1.292 2018/01/27 09:33:25 maxv Exp $	*/
 
 /*-
  * Copyright (c) 1998, 2000, 2005, 2006, 2007, 2008 The NetBSD Foundation, Inc.
@@ -69,7 +69,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.291 2017/09/17 09:41:35 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.292 2018/01/27 09:33:25 maxv Exp $");
 
 #include "opt_ddb.h"
 #include "opt_kgdb.h"
@@ -564,6 +564,15 @@ kernelfault:
 				    (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/i386/include/frameasm.h
diff -u src/sys/arch/i386/include/frameasm.h:1.23 src/sys/arch/i386/include/frameasm.h:1.24
--- src/sys/arch/i386/include/frameasm.h:1.23	Sat Jan 27 08:12:27 2018
+++ src/sys/arch/i386/include/frameasm.h	Sat Jan 27 09:33:25 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: frameasm.h,v 1.23 2018/01/27 08:12:27 maxv Exp $	*/
+/*	$NetBSD: frameasm.h,v 1.24 2018/01/27 09:33:25 maxv Exp $	*/
 
 #ifndef _I386_FRAMEASM_H_
 #define _I386_FRAMEASM_H_
@@ -40,10 +40,19 @@
 	.long		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
+
 /*
  * These are used on interrupt or trap entry or exit.
  */
 #define	INTRENTRY \
+	SMAP_ENABLE			; \
 	subl	$TF_PUSHSIZE,%esp	; \
 	movw	%gs,TF_GS(%esp)		; \
 	movw	%fs,TF_FS(%esp) 	; \

Index: src/sys/arch/x86/x86/cpu.c
diff -u src/sys/arch/x86/x86/cpu.c:1.146 src/sys/arch/x86/x86/cpu.c:1.147
--- src/sys/arch/x86/x86/cpu.c:1.146	Thu Jan 11 13:35:15 2018
+++ src/sys/arch/x86/x86/cpu.c	Sat Jan 27 09:33:25 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: cpu.c,v 1.146 2018/01/11 13:35:15 maxv Exp $	*/
+/*	$NetBSD: cpu.c,v 1.147 2018/01/27 09:33:25 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.146 2018/01/11 13:35:15 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.147 2018/01/27 09:33:25 maxv Exp $");
 
 #include "opt_ddb.h"
 #include "opt_mpbios.h"		/* for MPDEBUG */
@@ -612,11 +612,9 @@ 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();

Index: src/sys/arch/x86/x86/patch.c
diff -u src/sys/arch/x86/x86/patch.c:1.30 src/sys/arch/x86/x86/patch.c:1.31
--- src/sys/arch/x86/x86/patch.c:1.30	Sun Jan  7 16:08:12 2018
+++ src/sys/arch/x86/x86/patch.c	Sat Jan 27 09:33:25 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: patch.c,v 1.30 2018/01/07 16:08:12 christos Exp $	*/
+/*	$NetBSD: patch.c,v 1.31 2018/01/27 09:33:25 maxv 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.30 2018/01/07 16:08:12 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: patch.c,v 1.31 2018/01/27 09:33:25 maxv Exp $");
 
 #include "opt_lockdebug.h"
 #ifdef i386
@@ -275,7 +275,6 @@ x86_patch(bool early)
 		x86_hotpatch(HP_NAME_RETFENCE, bytes, sizeof(bytes));
 	}
 
-#ifdef amd64
 	/*
 	 * If SMAP is present then patch the prepared holes with clac/stac
 	 * instructions.
@@ -298,7 +297,6 @@ x86_patch(bool early)
 		/* nop,nop,nop -> stac */
 		x86_hotpatch(HP_NAME_STAC, stac_bytes, sizeof(stac_bytes));
 	}
-#endif
 
 	/* Write back and invalidate cache, flush pipelines. */
 	wbinvd();

Reply via email to