Module Name: src Committed By: maxv Date: Wed Apr 4 12:59:49 UTC 2018
Modified Files: src/sys/arch/amd64/amd64: machdep.c src/sys/arch/x86/include: cpu.h src/sys/arch/x86/x86: cpu.c spectre.c Log Message: Enable the SpectreV2 mitigation by default at boot time. To generate a diff of this commit: cvs rdiff -u -r1.302 -r1.303 src/sys/arch/amd64/amd64/machdep.c cvs rdiff -u -r1.90 -r1.91 src/sys/arch/x86/include/cpu.h cvs rdiff -u -r1.153 -r1.154 src/sys/arch/x86/x86/cpu.c cvs rdiff -u -r1.7 -r1.8 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/amd64/amd64/machdep.c diff -u src/sys/arch/amd64/amd64/machdep.c:1.302 src/sys/arch/amd64/amd64/machdep.c:1.303 --- src/sys/arch/amd64/amd64/machdep.c:1.302 Sat Mar 17 17:12:39 2018 +++ src/sys/arch/amd64/amd64/machdep.c Wed Apr 4 12:59:49 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: machdep.c,v 1.302 2018/03/17 17:12:39 maxv Exp $ */ +/* $NetBSD: machdep.c,v 1.303 2018/04/04 12:59:49 maxv Exp $ */ /* * Copyright (c) 1996, 1997, 1998, 2000, 2006, 2007, 2008, 2011 @@ -110,7 +110,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.302 2018/03/17 17:12:39 maxv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.303 2018/04/04 12:59:49 maxv Exp $"); /* #define XENDEBUG_LOW */ @@ -1603,6 +1603,9 @@ init_x86_64(paddr_t first_avail) svs_init(); #endif cpu_init_msrs(&cpu_info_primary, true); +#ifndef XEN + cpu_speculation_init(&cpu_info_primary); +#endif use_pae = 1; /* PAE always enabled in long mode */ Index: src/sys/arch/x86/include/cpu.h diff -u src/sys/arch/x86/include/cpu.h:1.90 src/sys/arch/x86/include/cpu.h:1.91 --- src/sys/arch/x86/include/cpu.h:1.90 Fri Mar 30 19:51:53 2018 +++ src/sys/arch/x86/include/cpu.h Wed Apr 4 12:59:49 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: cpu.h,v 1.90 2018/03/30 19:51:53 maxv Exp $ */ +/* $NetBSD: cpu.h,v 1.91 2018/04/04 12:59:49 maxv Exp $ */ /* * Copyright (c) 1990 The Regents of the University of California. @@ -348,6 +348,7 @@ void cpu_kick(struct cpu_info *); void cpu_pcpuarea_init(struct cpu_info *); void cpu_svs_init(struct cpu_info *); +void cpu_speculation_init(struct cpu_info *); #define curcpu() x86_curcpu() #define curlwp x86_curlwp() Index: src/sys/arch/x86/x86/cpu.c diff -u src/sys/arch/x86/x86/cpu.c:1.153 src/sys/arch/x86/x86/cpu.c:1.154 --- src/sys/arch/x86/x86/cpu.c:1.153 Wed Mar 28 14:56:59 2018 +++ src/sys/arch/x86/x86/cpu.c Wed Apr 4 12:59:49 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: cpu.c,v 1.153 2018/03/28 14:56:59 maxv Exp $ */ +/* $NetBSD: cpu.c,v 1.154 2018/04/04 12:59:49 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.153 2018/03/28 14:56:59 maxv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.154 2018/04/04 12:59:49 maxv Exp $"); #include "opt_ddb.h" #include "opt_mpbios.h" /* for MPDEBUG */ @@ -848,6 +848,9 @@ cpu_hatch(void *v) cpu_init_msrs(ci, true); cpu_probe(ci); +#ifdef __x86_64__ + cpu_speculation_init(ci); +#endif ci->ci_data.cpu_cc_freq = cpu_info_primary.ci_data.cpu_cc_freq; /* cpu_get_tsc_freq(ci); */ Index: src/sys/arch/x86/x86/spectre.c diff -u src/sys/arch/x86/x86/spectre.c:1.7 src/sys/arch/x86/x86/spectre.c:1.8 --- src/sys/arch/x86/x86/spectre.c:1.7 Sat Mar 31 08:30:01 2018 +++ src/sys/arch/x86/x86/spectre.c Wed Apr 4 12:59:49 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: spectre.c,v 1.7 2018/03/31 08:30:01 maxv Exp $ */ +/* $NetBSD: spectre.c,v 1.8 2018/04/04 12:59:49 maxv Exp $ */ /* * Copyright (c) 2018 NetBSD Foundation, Inc. @@ -34,7 +34,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: spectre.c,v 1.7 2018/03/31 08:30:01 maxv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: spectre.c,v 1.8 2018/04/04 12:59:49 maxv Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -313,6 +313,24 @@ mitigation_change(bool enabled) } } +void +cpu_speculation_init(struct cpu_info *ci) +{ + /* + * cpu0 is the one that detects the method and sets the global + * variable. + */ + if (ci == &cpu_info_primary) { + speculation_detect_method(); + spec_mitigation_enabled = + (mitigation_method != MITIGATION_NONE); + } + + if (mitigation_method != MITIGATION_NONE) { + mitigation_apply_cpu(ci, true); + } +} + int sysctl_machdep_spectreV2_mitigated(SYSCTLFN_ARGS); int