x86/speculation/mds: Add sysfs reporting for MDS
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>
This commit is contained in:
Родитель
bc1241700a
Коммит
8a4b06d391
|
@ -484,6 +484,7 @@ What: /sys/devices/system/cpu/vulnerabilities
|
||||||
/sys/devices/system/cpu/vulnerabilities/spectre_v2
|
/sys/devices/system/cpu/vulnerabilities/spectre_v2
|
||||||
/sys/devices/system/cpu/vulnerabilities/spec_store_bypass
|
/sys/devices/system/cpu/vulnerabilities/spec_store_bypass
|
||||||
/sys/devices/system/cpu/vulnerabilities/l1tf
|
/sys/devices/system/cpu/vulnerabilities/l1tf
|
||||||
|
/sys/devices/system/cpu/vulnerabilities/mds
|
||||||
Date: January 2018
|
Date: January 2018
|
||||||
Contact: Linux kernel mailing list <linux-kernel@vger.kernel.org>
|
Contact: Linux kernel mailing list <linux-kernel@vger.kernel.org>
|
||||||
Description: Information about CPU vulnerabilities
|
Description: Information about CPU vulnerabilities
|
||||||
|
|
|
@ -1172,6 +1172,22 @@ static ssize_t l1tf_show_state(char *buf)
|
||||||
}
|
}
|
||||||
#endif
|
#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)
|
static char *stibp_state(void)
|
||||||
{
|
{
|
||||||
if (spectre_v2_enabled == SPECTRE_V2_IBRS_ENHANCED)
|
if (spectre_v2_enabled == SPECTRE_V2_IBRS_ENHANCED)
|
||||||
|
@ -1238,6 +1254,10 @@ static ssize_t cpu_show_common(struct device *dev, struct device_attribute *attr
|
||||||
if (boot_cpu_has(X86_FEATURE_L1TF_PTEINV))
|
if (boot_cpu_has(X86_FEATURE_L1TF_PTEINV))
|
||||||
return l1tf_show_state(buf);
|
return l1tf_show_state(buf);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case X86_BUG_MDS:
|
||||||
|
return mds_show_state(buf);
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1269,4 +1289,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);
|
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
|
#endif
|
||||||
|
|
|
@ -546,11 +546,18 @@ ssize_t __weak cpu_show_l1tf(struct device *dev,
|
||||||
return sprintf(buf, "Not affected\n");
|
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(meltdown, 0444, cpu_show_meltdown, NULL);
|
||||||
static DEVICE_ATTR(spectre_v1, 0444, cpu_show_spectre_v1, 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(spectre_v2, 0444, cpu_show_spectre_v2, NULL);
|
||||||
static DEVICE_ATTR(spec_store_bypass, 0444, cpu_show_spec_store_bypass, 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(l1tf, 0444, cpu_show_l1tf, NULL);
|
||||||
|
static DEVICE_ATTR(mds, 0444, cpu_show_mds, NULL);
|
||||||
|
|
||||||
static struct attribute *cpu_root_vulnerabilities_attrs[] = {
|
static struct attribute *cpu_root_vulnerabilities_attrs[] = {
|
||||||
&dev_attr_meltdown.attr,
|
&dev_attr_meltdown.attr,
|
||||||
|
@ -558,6 +565,7 @@ static struct attribute *cpu_root_vulnerabilities_attrs[] = {
|
||||||
&dev_attr_spectre_v2.attr,
|
&dev_attr_spectre_v2.attr,
|
||||||
&dev_attr_spec_store_bypass.attr,
|
&dev_attr_spec_store_bypass.attr,
|
||||||
&dev_attr_l1tf.attr,
|
&dev_attr_l1tf.attr,
|
||||||
|
&dev_attr_mds.attr,
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -57,6 +57,8 @@ extern ssize_t cpu_show_spec_store_bypass(struct device *dev,
|
||||||
struct device_attribute *attr, char *buf);
|
struct device_attribute *attr, char *buf);
|
||||||
extern ssize_t cpu_show_l1tf(struct device *dev,
|
extern ssize_t cpu_show_l1tf(struct device *dev,
|
||||||
struct device_attribute *attr, char *buf);
|
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)
|
extern __printf(4, 5)
|
||||||
struct device *cpu_device_create(struct device *parent, void *drvdata,
|
struct device *cpu_device_create(struct device *parent, void *drvdata,
|
||||||
|
|
Загрузка…
Ссылка в новой задаче