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();