120 lines
4.2 KiB
Diff
120 lines
4.2 KiB
Diff
From: speck for Pawan Gupta <speck@linutronix.de>
|
|
Date: Wed, 9 Oct 2019 16:26:56 -0700
|
|
Subject: TAAv6 5
|
|
|
|
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>
|
|
Reviewed-by: Mark Gross <mgross@linux.intel.com>
|
|
Reviewed-by: Tony Luck <tony.luck@intel.com>
|
|
Tested-by: Neelima Krishnan <neelima.krishnan@intel.com>
|
|
[bwh: Forward-ported on top of NX: Fix conflicts (neighbouring
|
|
insertions) in arch/x86/kernel/cpu/bugs.c, drivers/base/cpu.c,
|
|
include/linux/cpu.h]
|
|
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
|
|
---
|
|
arch/x86/kernel/cpu/bugs.c | 23 +++++++++++++++++++++++
|
|
drivers/base/cpu.c | 9 +++++++++
|
|
include/linux/cpu.h | 3 +++
|
|
3 files changed, 35 insertions(+)
|
|
|
|
diff --git a/arch/x86/kernel/cpu/bugs.c b/arch/x86/kernel/cpu/bugs.c
|
|
index 841f106a277a..c435bc5dc19b 100644
|
|
--- a/arch/x86/kernel/cpu/bugs.c
|
|
+++ b/arch/x86/kernel/cpu/bugs.c
|
|
@@ -1439,6 +1439,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_DISABLE) ||
|
|
+ (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)
|
|
@@ -1510,6 +1525,9 @@ static ssize_t cpu_show_common(struct device *dev, struct device_attribute *attr
|
|
case X86_BUG_ITLB_MULTIHIT:
|
|
return itlb_multihit_show_state(buf);
|
|
|
|
+ case X86_BUG_TAA:
|
|
+ return tsx_async_abort_show_state(buf);
|
|
+
|
|
default:
|
|
break;
|
|
}
|
|
@@ -1551,4 +1569,9 @@ ssize_t cpu_show_itlb_multihit(struct device *dev, struct device_attribute *attr
|
|
{
|
|
return cpu_show_common(dev, attr, buf, X86_BUG_ITLB_MULTIHIT);
|
|
}
|
|
+
|
|
+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 c21e2aec5cbb..e9e7fde0fe00 100644
|
|
--- a/drivers/base/cpu.c
|
|
+++ b/drivers/base/cpu.c
|
|
@@ -558,6 +558,13 @@ ssize_t __weak cpu_show_itlb_multihit(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);
|
|
@@ -565,6 +572,7 @@ 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(itlb_multihit, 0444, cpu_show_itlb_multihit, 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,
|
|
@@ -574,6 +582,7 @@ static struct attribute *cpu_root_vulnerabilities_attrs[] = {
|
|
&dev_attr_l1tf.attr,
|
|
&dev_attr_mds.attr,
|
|
&dev_attr_itlb_multihit.attr,
|
|
+ &dev_attr_tsx_async_abort.attr,
|
|
NULL
|
|
};
|
|
|
|
diff --git a/include/linux/cpu.h b/include/linux/cpu.h
|
|
index 7bb824b0f30e..9d8dba19844e 100644
|
|
--- a/include/linux/cpu.h
|
|
+++ b/include/linux/cpu.h
|
|
@@ -61,6 +61,9 @@ extern ssize_t cpu_show_mds(struct device *dev,
|
|
struct device_attribute *attr, char *buf);
|
|
extern ssize_t cpu_show_itlb_multihit(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,
|