diff options
Diffstat (limited to 'sys-freebsd/freebsd-usbin/files/freebsd-usbin-SA-1803-speculative_execution-amd64-11.patch')
-rw-r--r-- | sys-freebsd/freebsd-usbin/files/freebsd-usbin-SA-1803-speculative_execution-amd64-11.patch | 189 |
1 files changed, 189 insertions, 0 deletions
diff --git a/sys-freebsd/freebsd-usbin/files/freebsd-usbin-SA-1803-speculative_execution-amd64-11.patch b/sys-freebsd/freebsd-usbin/files/freebsd-usbin-SA-1803-speculative_execution-amd64-11.patch new file mode 100644 index 000000000000..0cc67ad8f342 --- /dev/null +++ b/sys-freebsd/freebsd-usbin/files/freebsd-usbin-SA-1803-speculative_execution-amd64-11.patch @@ -0,0 +1,189 @@ +--- usr.sbin/cpucontrol/cpucontrol.8.orig ++++ usr.sbin/cpucontrol/cpucontrol.8 +@@ -24,7 +24,7 @@ + .\" + .\" $FreeBSD$ + .\" +-.Dd June 30, 2009 ++.Dd January 5, 2018 + .Dt CPUCONTROL 8 + .Os + .Sh NAME +@@ -36,44 +36,48 @@ + .Nm + .Op Fl vh + .Fl m Ar msr +-.Bk + .Ar device + .Ek ++.Bk + .Nm + .Op Fl vh + .Fl m Ar msr Ns = Ns Ar value +-.Bk + .Ar device + .Ek ++.Bk + .Nm + .Op Fl vh + .Fl m Ar msr Ns &= Ns Ar mask +-.Bk + .Ar device + .Ek ++.Bk + .Nm + .Op Fl vh + .Fl m Ar msr Ns |= Ns Ar mask +-.Bk + .Ar device + .Ek ++.Bk + .Nm + .Op Fl vh + .Fl i Ar level +-.Bk + .Ar device + .Ek ++.Bk + .Nm + .Op Fl vh + .Fl i Ar level,level_type +-.Bk + .Ar device + .Ek ++.Bk + .Nm + .Op Fl vh + .Op Fl d Ar datadir + .Fl u ++.Ar device ++.Ek + .Bk ++.Nm ++.Fl e + .Ar device + .Ek + .Sh DESCRIPTION +@@ -129,6 +133,20 @@ + .Nm + utility will walk through the configured data directories + and apply all firmware updates available for this CPU. ++.It Fl e ++Re-evaluate the kernel flags indicating the present CPU features. ++This command is typically executed after a firmware update was applied ++which changes information reported by the ++.Dv CPUID ++instruction. ++.Pp ++.Bf -symbolic ++Only execute the ++.Fl e ++command after the microcode update was applied to all CPUs in the system. ++The kernel does not operate correctly if the features of processors are ++not identical. ++.Ef + .It Fl v + Increase the verbosity level. + .It Fl h +--- usr.sbin/cpucontrol/cpucontrol.c.orig ++++ usr.sbin/cpucontrol/cpucontrol.c +@@ -60,6 +60,7 @@ + #define FLAG_I 0x01 + #define FLAG_M 0x02 + #define FLAG_U 0x04 ++#define FLAG_E 0x10 + + #define OP_INVAL 0x00 + #define OP_READ 0x01 +@@ -114,7 +115,7 @@ + if (name == NULL) + name = "cpuctl"; + fprintf(stderr, "Usage: %s [-vh] [-d datadir] [-m msr[=value] | " +- "-i level | -i level,level_type | -u] device\n", name); ++ "-i level | -i level,level_type | -e | -u] device\n", name); + exit(EX_USAGE); + } + +@@ -338,6 +339,25 @@ + } + + static int ++do_eval_cpu_features(const char *dev) ++{ ++ int fd, error; ++ ++ assert(dev != NULL); ++ ++ fd = open(dev, O_RDWR); ++ if (fd < 0) { ++ WARN(0, "error opening %s for writing", dev); ++ return (1); ++ } ++ error = ioctl(fd, CPUCTL_EVAL_CPU_FEATURES, NULL); ++ if (error < 0) ++ WARN(0, "ioctl(%s, CPUCTL_EVAL_CPU_FEATURES)", dev); ++ close(fd); ++ return (error); ++} ++ ++static int + do_update(const char *dev) + { + int fd; +@@ -431,11 +451,14 @@ + * Add all default data dirs to the list first. + */ + datadir_add(DEFAULT_DATADIR); +- while ((c = getopt(argc, argv, "d:hi:m:uv")) != -1) { ++ while ((c = getopt(argc, argv, "d:ehi:m:uv")) != -1) { + switch (c) { + case 'd': + datadir_add(optarg); + break; ++ case 'e': ++ flags |= FLAG_E; ++ break; + case 'i': + flags |= FLAG_I; + cmdarg = optarg; +@@ -464,22 +487,25 @@ + /* NOTREACHED */ + } + dev = argv[0]; +- c = flags & (FLAG_I | FLAG_M | FLAG_U); ++ c = flags & (FLAG_E | FLAG_I | FLAG_M | FLAG_U); + switch (c) { +- case FLAG_I: +- if (strstr(cmdarg, ",") != NULL) +- error = do_cpuid_count(cmdarg, dev); +- else +- error = do_cpuid(cmdarg, dev); +- break; +- case FLAG_M: +- error = do_msr(cmdarg, dev); +- break; +- case FLAG_U: +- error = do_update(dev); +- break; +- default: +- usage(); /* Only one command can be selected. */ ++ case FLAG_I: ++ if (strstr(cmdarg, ",") != NULL) ++ error = do_cpuid_count(cmdarg, dev); ++ else ++ error = do_cpuid(cmdarg, dev); ++ break; ++ case FLAG_M: ++ error = do_msr(cmdarg, dev); ++ break; ++ case FLAG_U: ++ error = do_update(dev); ++ break; ++ case FLAG_E: ++ error = do_eval_cpu_features(dev); ++ break; ++ default: ++ usage(); /* Only one command can be selected. */ + } + SLIST_FREE(&datadirs, next, free); + return (error == 0 ? 0 : 1); |