Module Name: src Committed By: maxv Date: Sat Apr 27 10:40:17 UTC 2019
Modified Files: src/sys/arch/x86/x86: spectre.c Log Message: Add support for EnhancedIBRS, a more performant mitigation for SpectreV2, available on future CPUs (or maybe they already exist now...). To generate a diff of this commit: cvs rdiff -u -r1.25 -r1.26 src/sys/arch/x86/x86/spectre.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/x86/x86/spectre.c diff -u src/sys/arch/x86/x86/spectre.c:1.25 src/sys/arch/x86/x86/spectre.c:1.26 --- src/sys/arch/x86/x86/spectre.c:1.25 Sat Mar 23 10:02:05 2019 +++ src/sys/arch/x86/x86/spectre.c Sat Apr 27 10:40:17 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: spectre.c,v 1.25 2019/03/23 10:02:05 maxv Exp $ */ +/* $NetBSD: spectre.c,v 1.26 2019/04/27 10:40:17 maxv Exp $ */ /* * Copyright (c) 2018 NetBSD Foundation, Inc. @@ -34,7 +34,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: spectre.c,v 1.25 2019/03/23 10:02:05 maxv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: spectre.c,v 1.26 2019/04/27 10:40:17 maxv Exp $"); #include "opt_spectre.h" @@ -54,7 +54,8 @@ __KERNEL_RCSID(0, "$NetBSD: spectre.c,v enum v2_mitigation { V2_MITIGATION_NONE, V2_MITIGATION_AMD_DIS_IND, - V2_MITIGATION_INTEL_IBRS + V2_MITIGATION_INTEL_IBRS, + V2_MITIGATION_INTEL_ENHANCED_IBRS }; enum v4_mitigation { @@ -102,6 +103,9 @@ v2_set_name(void) case V2_MITIGATION_INTEL_IBRS: strlcat(name, "[Intel IBRS]", sizeof(name)); break; + case V2_MITIGATION_INTEL_ENHANCED_IBRS: + strlcat(name, "[Intel Enhanced IBRS]", sizeof(name)); + break; default: panic("%s: impossible", __func__); } @@ -116,20 +120,26 @@ v2_detect_method(void) { struct cpu_info *ci = curcpu(); u_int descs[4]; + uint64_t msr; if (cpu_vendor == CPUVENDOR_INTEL) { if (cpuid_level >= 7) { x86_cpuid(7, descs); - if (descs[3] & CPUID_SEF_IBRS) { - /* descs[3] = %edx */ + + if (descs[3] & CPUID_SEF_ARCH_CAP) { + msr = rdmsr(MSR_IA32_ARCH_CAPABILITIES); + if (msr & IA32_ARCH_IBRS_ALL) { + v2_mitigation_method = + V2_MITIGATION_INTEL_ENHANCED_IBRS; + return; + } + } #ifdef __x86_64__ + if (descs[3] & CPUID_SEF_IBRS) { v2_mitigation_method = V2_MITIGATION_INTEL_IBRS; -#else - /* IBRS not supported on i386. */ - v2_mitigation_method = V2_MITIGATION_NONE; -#endif return; } +#endif } v2_mitigation_method = V2_MITIGATION_NONE; } else if (cpu_vendor == CPUVENDOR_AMD) { @@ -239,6 +249,15 @@ mitigation_v2_apply_cpu(struct cpu_info wrmsr(MSR_IA32_SPEC_CTRL, 0); } break; + case V2_MITIGATION_INTEL_ENHANCED_IBRS: + msr = rdmsr(MSR_IA32_SPEC_CTRL); + if (enabled) { + msr |= IA32_SPEC_CTRL_IBRS; + } else { + msr &= ~IA32_SPEC_CTRL_IBRS; + } + wrmsr(MSR_IA32_SPEC_CTRL, msr); + break; case V2_MITIGATION_AMD_DIS_IND: msr = rdmsr(MSR_IC_CFG); if (enabled) { @@ -302,6 +321,7 @@ mitigation_v2_change(bool enabled) return EOPNOTSUPP; case V2_MITIGATION_AMD_DIS_IND: case V2_MITIGATION_INTEL_IBRS: + case V2_MITIGATION_INTEL_ENHANCED_IBRS: /* Initialize the barriers */ ibrs_cpu_barrier1 = ncpu; ibrs_cpu_barrier2 = ncpu;