| From abf2d2791c7a5bb2352ebfa035f612b384865260 Mon Sep 17 00:00:00 2001 |
| From: Thomas Gleixner <tglx@linutronix.de> |
| Date: Mon, 18 Feb 2019 22:51:43 +0100 |
| Subject: [PATCH 14/30] x86/speculation/mds: Add sysfs reporting for MDS |
| |
| commit 8a4b06d391b0a42a373808979b5028f5c84d9c6a upstream |
| |
| Add the sysfs reporting file for MDS. It exposes the vulnerability and |
| mitigation state similar to the existing files for the other speculative |
| hardware vulnerabilities. |
| |
| Signed-off-by: Thomas Gleixner <tglx@linutronix.de> |
| Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| Reviewed-by: Borislav Petkov <bp@suse.de> |
| Reviewed-by: Jon Masters <jcm@redhat.com> |
| Tested-by: Jon Masters <jcm@redhat.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| .../ABI/testing/sysfs-devices-system-cpu | 1 + |
| arch/x86/kernel/cpu/bugs.c | 25 +++++++++++++++++++ |
| drivers/base/cpu.c | 8 ++++++ |
| include/linux/cpu.h | 2 ++ |
| 4 files changed, 36 insertions(+) |
| |
| diff --git a/Documentation/ABI/testing/sysfs-devices-system-cpu b/Documentation/ABI/testing/sysfs-devices-system-cpu |
| index 73318225a368..02b7bb711214 100644 |
| --- a/Documentation/ABI/testing/sysfs-devices-system-cpu |
| +++ b/Documentation/ABI/testing/sysfs-devices-system-cpu |
| @@ -477,6 +477,7 @@ What: /sys/devices/system/cpu/vulnerabilities |
| /sys/devices/system/cpu/vulnerabilities/spectre_v2 |
| /sys/devices/system/cpu/vulnerabilities/spec_store_bypass |
| /sys/devices/system/cpu/vulnerabilities/l1tf |
| + /sys/devices/system/cpu/vulnerabilities/mds |
| Date: January 2018 |
| Contact: Linux kernel mailing list <linux-kernel@vger.kernel.org> |
| Description: Information about CPU vulnerabilities |
| diff --git a/arch/x86/kernel/cpu/bugs.c b/arch/x86/kernel/cpu/bugs.c |
| index 413a672f03a3..50b7d2a980e8 100644 |
| --- a/arch/x86/kernel/cpu/bugs.c |
| +++ b/arch/x86/kernel/cpu/bugs.c |
| @@ -1154,6 +1154,22 @@ static ssize_t l1tf_show_state(char *buf) |
| } |
| #endif |
| |
| +static ssize_t mds_show_state(char *buf) |
| +{ |
| + if (!hypervisor_is_type(X86_HYPER_NATIVE)) { |
| + return sprintf(buf, "%s; SMT Host state unknown\n", |
| + mds_strings[mds_mitigation]); |
| + } |
| + |
| + if (boot_cpu_has(X86_BUG_MSBDS_ONLY)) { |
| + return sprintf(buf, "%s; SMT %s\n", mds_strings[mds_mitigation], |
| + sched_smt_active() ? "mitigated" : "disabled"); |
| + } |
| + |
| + return sprintf(buf, "%s; SMT %s\n", mds_strings[mds_mitigation], |
| + sched_smt_active() ? "vulnerable" : "disabled"); |
| +} |
| + |
| static char *stibp_state(void) |
| { |
| if (spectre_v2_enabled == SPECTRE_V2_IBRS_ENHANCED) |
| @@ -1218,6 +1234,10 @@ static ssize_t cpu_show_common(struct device *dev, struct device_attribute *attr |
| if (boot_cpu_has(X86_FEATURE_L1TF_PTEINV)) |
| return l1tf_show_state(buf); |
| break; |
| + |
| + case X86_BUG_MDS: |
| + return mds_show_state(buf); |
| + |
| default: |
| break; |
| } |
| @@ -1249,4 +1269,9 @@ ssize_t cpu_show_l1tf(struct device *dev, struct device_attribute *attr, char *b |
| { |
| return cpu_show_common(dev, attr, buf, X86_BUG_L1TF); |
| } |
| + |
| +ssize_t cpu_show_mds(struct device *dev, struct device_attribute *attr, char *buf) |
| +{ |
| + return cpu_show_common(dev, attr, buf, X86_BUG_MDS); |
| +} |
| #endif |
| diff --git a/drivers/base/cpu.c b/drivers/base/cpu.c |
| index eb9443d5bae1..2fd6ca1021c2 100644 |
| --- a/drivers/base/cpu.c |
| +++ b/drivers/base/cpu.c |
| @@ -546,11 +546,18 @@ ssize_t __weak cpu_show_l1tf(struct device *dev, |
| return sprintf(buf, "Not affected\n"); |
| } |
| |
| +ssize_t __weak cpu_show_mds(struct device *dev, |
| + struct device_attribute *attr, char *buf) |
| +{ |
| + return sprintf(buf, "Not affected\n"); |
| +} |
| + |
| static DEVICE_ATTR(meltdown, 0444, cpu_show_meltdown, NULL); |
| static DEVICE_ATTR(spectre_v1, 0444, cpu_show_spectre_v1, NULL); |
| static DEVICE_ATTR(spectre_v2, 0444, cpu_show_spectre_v2, NULL); |
| static DEVICE_ATTR(spec_store_bypass, 0444, cpu_show_spec_store_bypass, NULL); |
| static DEVICE_ATTR(l1tf, 0444, cpu_show_l1tf, NULL); |
| +static DEVICE_ATTR(mds, 0444, cpu_show_mds, NULL); |
| |
| static struct attribute *cpu_root_vulnerabilities_attrs[] = { |
| &dev_attr_meltdown.attr, |
| @@ -558,6 +565,7 @@ static struct attribute *cpu_root_vulnerabilities_attrs[] = { |
| &dev_attr_spectre_v2.attr, |
| &dev_attr_spec_store_bypass.attr, |
| &dev_attr_l1tf.attr, |
| + &dev_attr_mds.attr, |
| NULL |
| }; |
| |
| diff --git a/include/linux/cpu.h b/include/linux/cpu.h |
| index 5041357d0297..3c87ad888ed3 100644 |
| --- a/include/linux/cpu.h |
| +++ b/include/linux/cpu.h |
| @@ -57,6 +57,8 @@ extern ssize_t cpu_show_spec_store_bypass(struct device *dev, |
| struct device_attribute *attr, char *buf); |
| extern ssize_t cpu_show_l1tf(struct device *dev, |
| struct device_attribute *attr, char *buf); |
| +extern ssize_t cpu_show_mds(struct device *dev, |
| + struct device_attribute *attr, char *buf); |
| |
| extern __printf(4, 5) |
| struct device *cpu_device_create(struct device *parent, void *drvdata, |
| -- |
| 2.21.0 |
| |