Borislav Petkov b3703f
From: Pawan Gupta <pawan.kumar.gupta@linux.intel.com>
Borislav Petkov b3703f
Date: Thu, 19 May 2022 20:32:13 -0700
Borislav Petkov b3703f
Subject: x86/speculation/mmio: Add sysfs reporting for Processor MMIO Stale Data
Borislav Petkov b3703f
Git-commit: 8d50cdf8b8341770bc6367bce40c0c1bb0e1d5b3
Borislav Petkov b3703f
Git-repo: git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git
Borislav Petkov b3703f
Patch-mainline: Queued in tip for v5.19
Borislav Petkov b3703f
References: bsc#1199650 CVE-2022-21166 CVE-2022-21127 CVE-2022-21123 CVE-2022-21125 CVE-2022-21180
Borislav Petkov b3703f
Borislav Petkov b3703f
Add the sysfs reporting file for Processor MMIO Stale Data
Borislav Petkov b3703f
vulnerability. It exposes the vulnerability and mitigation state similar
Borislav Petkov b3703f
to the existing files for the other hardware vulnerabilities.
Borislav Petkov b3703f
Borislav Petkov b3703f
Signed-off-by: Pawan Gupta <pawan.kumar.gupta@linux.intel.com>
Borislav Petkov b3703f
Signed-off-by: Borislav Petkov <bp@suse.de>
Borislav Petkov b3703f
---
Borislav Petkov b3703f
 Documentation/ABI/testing/sysfs-devices-system-cpu |    1 
Borislav Petkov b3703f
 arch/x86/kernel/cpu/bugs.c                         |   22 +++++++++++++++++++++
Borislav Petkov b3703f
 drivers/base/cpu.c                                 |    8 +++++++
Borislav Petkov b3703f
 include/linux/cpu.h                                |    3 ++
Borislav Petkov b3703f
 4 files changed, 34 insertions(+)
Borislav Petkov b3703f
Borislav Petkov b3703f
--- a/arch/x86/kernel/cpu/bugs.c
Borislav Petkov b3703f
+++ b/arch/x86/kernel/cpu/bugs.c
Borislav Petkov b3703f
@@ -1828,6 +1828,20 @@ static ssize_t tsx_async_abort_show_stat
Borislav Petkov b3703f
 		       sched_smt_active() ? "vulnerable" : "disabled");
Borislav Petkov b3703f
 }
Borislav Petkov b3703f
 
Borislav Petkov b3703f
+static ssize_t mmio_stale_data_show_state(char *buf)
Borislav Petkov b3703f
+{
Borislav Petkov b3703f
+	if (mmio_mitigation == MMIO_MITIGATION_OFF)
Borislav Petkov b3703f
+		return sprintf(buf, "%s\n", mmio_strings[mmio_mitigation]);
Borislav Petkov b3703f
+
Borislav Petkov b3703f
+	if (boot_cpu_has(X86_FEATURE_HYPERVISOR)) {
Borislav Petkov b3703f
+		return sprintf(buf, "%s; SMT Host state unknown\n",
Borislav Petkov b3703f
+				  mmio_strings[mmio_mitigation]);
Borislav Petkov b3703f
+	}
Borislav Petkov b3703f
+
Borislav Petkov b3703f
+	return sprintf(buf, "%s; SMT %s\n", mmio_strings[mmio_mitigation],
Borislav Petkov b3703f
+			  sched_smt_active() ? "vulnerable" : "disabled");
Borislav Petkov b3703f
+}
Borislav Petkov b3703f
+
Borislav Petkov b3703f
 static char *stibp_state(void)
Borislav Petkov b3703f
 {
Borislav Petkov b3703f
 	if (spectre_v2_in_eibrs_mode(spectre_v2_enabled))
Borislav Petkov b3703f
@@ -1928,6 +1942,9 @@ static ssize_t cpu_show_common(struct de
Borislav Petkov b3703f
 	case X86_BUG_SRBDS:
Borislav Petkov b3703f
 		return srbds_show_state(buf);
Borislav Petkov b3703f
 
Borislav Petkov b3703f
+	case X86_BUG_MMIO_STALE_DATA:
Borislav Petkov b3703f
+		return mmio_stale_data_show_state(buf);
Borislav Petkov b3703f
+
Borislav Petkov b3703f
 	default:
Borislav Petkov b3703f
 		break;
Borislav Petkov b3703f
 	}
Borislav Petkov b3703f
@@ -1979,4 +1996,9 @@ ssize_t cpu_show_srbds(struct device *de
Borislav Petkov b3703f
 {
Borislav Petkov b3703f
 	return cpu_show_common(dev, attr, buf, X86_BUG_SRBDS);
Borislav Petkov b3703f
 }
Borislav Petkov b3703f
+
Borislav Petkov b3703f
+ssize_t cpu_show_mmio_stale_data(struct device *dev, struct device_attribute *attr, char *buf)
Borislav Petkov b3703f
+{
Borislav Petkov b3703f
+	return cpu_show_common(dev, attr, buf, X86_BUG_MMIO_STALE_DATA);
Borislav Petkov b3703f
+}
Borislav Petkov b3703f
 #endif
Borislav Petkov b3703f
--- a/Documentation/ABI/testing/sysfs-devices-system-cpu
Borislav Petkov b3703f
+++ b/Documentation/ABI/testing/sysfs-devices-system-cpu
Borislav Petkov b3703f
@@ -495,6 +495,7 @@ What:		/sys/devices/system/cpu/vulnerabi
Borislav Petkov b3703f
 		/sys/devices/system/cpu/vulnerabilities/srbds
Borislav Petkov b3703f
 		/sys/devices/system/cpu/vulnerabilities/tsx_async_abort
Borislav Petkov b3703f
 		/sys/devices/system/cpu/vulnerabilities/itlb_multihit
Borislav Petkov b3703f
+		/sys/devices/system/cpu/vulnerabilities/mmio_stale_data
Borislav Petkov b3703f
 Date:		January 2018
Borislav Petkov b3703f
 Contact:	Linux kernel mailing list <linux-kernel@vger.kernel.org>
Borislav Petkov b3703f
 Description:	Information about CPU vulnerabilities
Borislav Petkov b3703f
--- a/drivers/base/cpu.c
Borislav Petkov b3703f
+++ b/drivers/base/cpu.c
Borislav Petkov b3703f
@@ -573,6 +573,12 @@ ssize_t __weak cpu_show_srbds(struct dev
Borislav Petkov b3703f
 	return sprintf(buf, "Not affected\n");
Borislav Petkov b3703f
 }
Borislav Petkov b3703f
 
Borislav Petkov b3703f
+ssize_t __weak cpu_show_mmio_stale_data(struct device *dev,
Borislav Petkov b3703f
+					struct device_attribute *attr, char *buf)
Borislav Petkov b3703f
+{
Borislav Petkov b3703f
+	return sprintf(buf, "Not affected\n");
Borislav Petkov b3703f
+}
Borislav Petkov b3703f
+
Borislav Petkov b3703f
 static DEVICE_ATTR(meltdown, 0444, cpu_show_meltdown, NULL);
Borislav Petkov b3703f
 static DEVICE_ATTR(spectre_v1, 0444, cpu_show_spectre_v1, NULL);
Borislav Petkov b3703f
 static DEVICE_ATTR(spectre_v2, 0444, cpu_show_spectre_v2, NULL);
Borislav Petkov b3703f
@@ -582,6 +588,7 @@ static DEVICE_ATTR(mds, 0444, cpu_show_m
Borislav Petkov b3703f
 static DEVICE_ATTR(tsx_async_abort, 0444, cpu_show_tsx_async_abort, NULL);
Borislav Petkov b3703f
 static DEVICE_ATTR(itlb_multihit, 0444, cpu_show_itlb_multihit, NULL);
Borislav Petkov b3703f
 static DEVICE_ATTR(srbds, 0444, cpu_show_srbds, NULL);
Borislav Petkov b3703f
+static DEVICE_ATTR(mmio_stale_data, 0444, cpu_show_mmio_stale_data, NULL);
Borislav Petkov b3703f
 
Borislav Petkov b3703f
 static struct attribute *cpu_root_vulnerabilities_attrs[] = {
Borislav Petkov b3703f
 	&dev_attr_meltdown.attr,
Borislav Petkov b3703f
@@ -593,6 +600,7 @@ static struct attribute *cpu_root_vulner
Borislav Petkov b3703f
 	&dev_attr_tsx_async_abort.attr,
Borislav Petkov b3703f
 	&dev_attr_itlb_multihit.attr,
Borislav Petkov b3703f
 	&dev_attr_srbds.attr,
Borislav Petkov b3703f
+	&dev_attr_mmio_stale_data.attr,
Borislav Petkov b3703f
 	NULL
Borislav Petkov b3703f
 };
Borislav Petkov b3703f
 
Borislav Petkov b3703f
--- a/include/linux/cpu.h
Borislav Petkov b3703f
+++ b/include/linux/cpu.h
Borislav Petkov b3703f
@@ -64,6 +64,9 @@ extern ssize_t cpu_show_tsx_async_abort(
Borislav Petkov b3703f
 					char *buf);
Borislav Petkov b3703f
 extern ssize_t cpu_show_itlb_multihit(struct device *dev,
Borislav Petkov b3703f
 				      struct device_attribute *attr, char *buf);
Borislav Petkov b3703f
+extern ssize_t cpu_show_mmio_stale_data(struct device *dev,
Borislav Petkov b3703f
+					struct device_attribute *attr,
Borislav Petkov b3703f
+					char *buf);
Borislav Petkov b3703f
 
Borislav Petkov b3703f
 extern __printf(4, 5)
Borislav Petkov b3703f
 struct device *cpu_device_create(struct device *parent, void *drvdata,