| From 57f7f58e7de8b7d206208e2e60b5f03ee22c124b Mon Sep 17 00:00:00 2001 |
| From: Pawan Gupta <pawan.kumar.gupta@linux.intel.com> |
| Date: Wed, 23 Oct 2019 12:19:51 +0200 |
| Subject: [PATCH] x86/speculation/taa: Add sysfs reporting for TSX Async Abort |
| |
| commit 6608b45ac5ecb56f9e171252229c39580cc85f0f upstream. |
| |
| Add the sysfs reporting file for TSX Async Abort. It exposes the |
| vulnerability and the mitigation state similar to the existing files for |
| the other hardware vulnerabilities. |
| |
| Sysfs file path is: |
| /sys/devices/system/cpu/vulnerabilities/tsx_async_abort |
| |
| Signed-off-by: Pawan Gupta <pawan.kumar.gupta@linux.intel.com> |
| Signed-off-by: Borislav Petkov <bp@suse.de> |
| Signed-off-by: Thomas Gleixner <tglx@linutronix.de> |
| Tested-by: Neelima Krishnan <neelima.krishnan@intel.com> |
| Reviewed-by: Mark Gross <mgross@linux.intel.com> |
| Reviewed-by: Tony Luck <tony.luck@intel.com> |
| Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| Reviewed-by: Josh Poimboeuf <jpoimboe@redhat.com> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/arch/x86/kernel/cpu/bugs.c b/arch/x86/kernel/cpu/bugs.c |
| index bfadb5985635..1050c20d0b78 100644 |
| --- a/arch/x86/kernel/cpu/bugs.c |
| +++ b/arch/x86/kernel/cpu/bugs.c |
| @@ -1436,6 +1436,21 @@ static ssize_t mds_show_state(char *buf) |
| sched_smt_active() ? "vulnerable" : "disabled"); |
| } |
| |
| +static ssize_t tsx_async_abort_show_state(char *buf) |
| +{ |
| + if ((taa_mitigation == TAA_MITIGATION_TSX_DISABLED) || |
| + (taa_mitigation == TAA_MITIGATION_OFF)) |
| + return sprintf(buf, "%s\n", taa_strings[taa_mitigation]); |
| + |
| + if (boot_cpu_has(X86_FEATURE_HYPERVISOR)) { |
| + return sprintf(buf, "%s; SMT Host state unknown\n", |
| + taa_strings[taa_mitigation]); |
| + } |
| + |
| + return sprintf(buf, "%s; SMT %s\n", taa_strings[taa_mitigation], |
| + sched_smt_active() ? "vulnerable" : "disabled"); |
| +} |
| + |
| static char *stibp_state(void) |
| { |
| if (spectre_v2_enabled == SPECTRE_V2_IBRS_ENHANCED) |
| @@ -1506,6 +1521,9 @@ static ssize_t cpu_show_common(struct device *dev, struct device_attribute *attr |
| case X86_BUG_MDS: |
| return mds_show_state(buf); |
| |
| + case X86_BUG_TAA: |
| + return tsx_async_abort_show_state(buf); |
| + |
| default: |
| break; |
| } |
| @@ -1542,4 +1560,9 @@ ssize_t cpu_show_mds(struct device *dev, struct device_attribute *attr, char *bu |
| { |
| return cpu_show_common(dev, attr, buf, X86_BUG_MDS); |
| } |
| + |
| +ssize_t cpu_show_tsx_async_abort(struct device *dev, struct device_attribute *attr, char *buf) |
| +{ |
| + return cpu_show_common(dev, attr, buf, X86_BUG_TAA); |
| +} |
| #endif |
| diff --git a/drivers/base/cpu.c b/drivers/base/cpu.c |
| index cc37511de866..0fccd8c0312e 100644 |
| --- a/drivers/base/cpu.c |
| +++ b/drivers/base/cpu.c |
| @@ -554,12 +554,20 @@ ssize_t __weak cpu_show_mds(struct device *dev, |
| return sprintf(buf, "Not affected\n"); |
| } |
| |
| +ssize_t __weak cpu_show_tsx_async_abort(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 DEVICE_ATTR(tsx_async_abort, 0444, cpu_show_tsx_async_abort, NULL); |
| |
| static struct attribute *cpu_root_vulnerabilities_attrs[] = { |
| &dev_attr_meltdown.attr, |
| @@ -568,6 +576,7 @@ static struct attribute *cpu_root_vulnerabilities_attrs[] = { |
| &dev_attr_spec_store_bypass.attr, |
| &dev_attr_l1tf.attr, |
| &dev_attr_mds.attr, |
| + &dev_attr_tsx_async_abort.attr, |
| NULL |
| }; |
| |
| diff --git a/include/linux/cpu.h b/include/linux/cpu.h |
| index fcb1386bb0d4..1872b15bda75 100644 |
| --- a/include/linux/cpu.h |
| +++ b/include/linux/cpu.h |
| @@ -59,6 +59,9 @@ 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 ssize_t cpu_show_tsx_async_abort(struct device *dev, |
| + struct device_attribute *attr, |
| + char *buf); |
| |
| extern __printf(4, 5) |
| struct device *cpu_device_create(struct device *parent, void *drvdata, |
| -- |
| 2.7.4 |
| |