Skip to content

Commit 9c23a90

Browse files
pa1guptagregkh
authored andcommitted
x86/vmscape: Enable the mitigation
Commit 556c1ad upstream. Enable the previously added mitigation for VMscape. Add the cmdline vmscape={off|ibpb|force} and sysfs reporting. Signed-off-by: Pawan Gupta <pawan.kumar.gupta@linux.intel.com> Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com> Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de> Reviewed-by: Borislav Petkov (AMD) <bp@alien8.de> Reviewed-by: Dave Hansen <dave.hansen@linux.intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 510603f commit 9c23a90

File tree

6 files changed

+115
-0
lines changed

6 files changed

+115
-0
lines changed

Documentation/ABI/testing/sysfs-devices-system-cpu

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -586,6 +586,7 @@ What: /sys/devices/system/cpu/vulnerabilities
586586
/sys/devices/system/cpu/vulnerabilities/srbds
587587
/sys/devices/system/cpu/vulnerabilities/tsa
588588
/sys/devices/system/cpu/vulnerabilities/tsx_async_abort
589+
/sys/devices/system/cpu/vulnerabilities/vmscape
589590
Date: January 2018
590591
Contact: Linux kernel mailing list <linux-kernel@vger.kernel.org>
591592
Description: Information about CPU vulnerabilities

Documentation/admin-guide/kernel-parameters.txt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3774,6 +3774,7 @@
37743774
srbds=off [X86,INTEL]
37753775
ssbd=force-off [ARM64]
37763776
tsx_async_abort=off [X86]
3777+
vmscape=off [X86]
37773778

37783779
Exceptions:
37793780
This does not have any effect on
@@ -7937,6 +7938,16 @@
79377938
vmpoff= [KNL,S390] Perform z/VM CP command after power off.
79387939
Format: <command>
79397940

7941+
vmscape= [X86] Controls mitigation for VMscape attacks.
7942+
VMscape attacks can leak information from a userspace
7943+
hypervisor to a guest via speculative side-channels.
7944+
7945+
off - disable the mitigation
7946+
ibpb - use Indirect Branch Prediction Barrier
7947+
(IBPB) mitigation (default)
7948+
force - force vulnerability detection even on
7949+
unaffected processors
7950+
79407951
vsyscall= [X86-64,EARLY]
79417952
Controls the behavior of vsyscalls (i.e. calls to
79427953
fixed addresses of 0xffffffffff600x00 from legacy

arch/x86/Kconfig

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2704,6 +2704,15 @@ config MITIGATION_TSA
27042704
security vulnerability on AMD CPUs which can lead to forwarding of
27052705
invalid info to subsequent instructions and thus can affect their
27062706
timing and thereby cause a leakage.
2707+
2708+
config MITIGATION_VMSCAPE
2709+
bool "Mitigate VMSCAPE"
2710+
depends on KVM
2711+
default y
2712+
help
2713+
Enable mitigation for VMSCAPE attacks. VMSCAPE is a hardware security
2714+
vulnerability on Intel and AMD CPUs that may allow a guest to do
2715+
Spectre v2 style attacks on userspace hypervisor.
27072716
endif
27082717

27092718
config ARCH_HAS_ADD_PAGES

arch/x86/kernel/cpu/bugs.c

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,9 @@ static void __init its_update_mitigation(void);
9696
static void __init its_apply_mitigation(void);
9797
static void __init tsa_select_mitigation(void);
9898
static void __init tsa_apply_mitigation(void);
99+
static void __init vmscape_select_mitigation(void);
100+
static void __init vmscape_update_mitigation(void);
101+
static void __init vmscape_apply_mitigation(void);
99102

100103
/* The base value of the SPEC_CTRL MSR without task-specific bits set */
101104
u64 x86_spec_ctrl_base;
@@ -235,6 +238,7 @@ void __init cpu_select_mitigations(void)
235238
its_select_mitigation();
236239
bhi_select_mitigation();
237240
tsa_select_mitigation();
241+
vmscape_select_mitigation();
238242

239243
/*
240244
* After mitigations are selected, some may need to update their
@@ -266,6 +270,7 @@ void __init cpu_select_mitigations(void)
266270
bhi_update_mitigation();
267271
/* srso_update_mitigation() depends on retbleed_update_mitigation(). */
268272
srso_update_mitigation();
273+
vmscape_update_mitigation();
269274

270275
spectre_v1_apply_mitigation();
271276
spectre_v2_apply_mitigation();
@@ -283,6 +288,7 @@ void __init cpu_select_mitigations(void)
283288
its_apply_mitigation();
284289
bhi_apply_mitigation();
285290
tsa_apply_mitigation();
291+
vmscape_apply_mitigation();
286292
}
287293

288294
/*
@@ -3145,6 +3151,77 @@ static void __init srso_apply_mitigation(void)
31453151
}
31463152
}
31473153

3154+
#undef pr_fmt
3155+
#define pr_fmt(fmt) "VMSCAPE: " fmt
3156+
3157+
enum vmscape_mitigations {
3158+
VMSCAPE_MITIGATION_NONE,
3159+
VMSCAPE_MITIGATION_AUTO,
3160+
VMSCAPE_MITIGATION_IBPB_EXIT_TO_USER,
3161+
VMSCAPE_MITIGATION_IBPB_ON_VMEXIT,
3162+
};
3163+
3164+
static const char * const vmscape_strings[] = {
3165+
[VMSCAPE_MITIGATION_NONE] = "Vulnerable",
3166+
/* [VMSCAPE_MITIGATION_AUTO] */
3167+
[VMSCAPE_MITIGATION_IBPB_EXIT_TO_USER] = "Mitigation: IBPB before exit to userspace",
3168+
[VMSCAPE_MITIGATION_IBPB_ON_VMEXIT] = "Mitigation: IBPB on VMEXIT",
3169+
};
3170+
3171+
static enum vmscape_mitigations vmscape_mitigation __ro_after_init =
3172+
IS_ENABLED(CONFIG_MITIGATION_VMSCAPE) ? VMSCAPE_MITIGATION_AUTO : VMSCAPE_MITIGATION_NONE;
3173+
3174+
static int __init vmscape_parse_cmdline(char *str)
3175+
{
3176+
if (!str)
3177+
return -EINVAL;
3178+
3179+
if (!strcmp(str, "off")) {
3180+
vmscape_mitigation = VMSCAPE_MITIGATION_NONE;
3181+
} else if (!strcmp(str, "ibpb")) {
3182+
vmscape_mitigation = VMSCAPE_MITIGATION_IBPB_EXIT_TO_USER;
3183+
} else if (!strcmp(str, "force")) {
3184+
setup_force_cpu_bug(X86_BUG_VMSCAPE);
3185+
vmscape_mitigation = VMSCAPE_MITIGATION_AUTO;
3186+
} else {
3187+
pr_err("Ignoring unknown vmscape=%s option.\n", str);
3188+
}
3189+
3190+
return 0;
3191+
}
3192+
early_param("vmscape", vmscape_parse_cmdline);
3193+
3194+
static void __init vmscape_select_mitigation(void)
3195+
{
3196+
if (cpu_mitigations_off() ||
3197+
!boot_cpu_has_bug(X86_BUG_VMSCAPE) ||
3198+
!boot_cpu_has(X86_FEATURE_IBPB)) {
3199+
vmscape_mitigation = VMSCAPE_MITIGATION_NONE;
3200+
return;
3201+
}
3202+
3203+
if (vmscape_mitigation == VMSCAPE_MITIGATION_AUTO)
3204+
vmscape_mitigation = VMSCAPE_MITIGATION_IBPB_EXIT_TO_USER;
3205+
}
3206+
3207+
static void __init vmscape_update_mitigation(void)
3208+
{
3209+
if (!boot_cpu_has_bug(X86_BUG_VMSCAPE))
3210+
return;
3211+
3212+
if (retbleed_mitigation == RETBLEED_MITIGATION_IBPB ||
3213+
srso_mitigation == SRSO_MITIGATION_IBPB_ON_VMEXIT)
3214+
vmscape_mitigation = VMSCAPE_MITIGATION_IBPB_ON_VMEXIT;
3215+
3216+
pr_info("%s\n", vmscape_strings[vmscape_mitigation]);
3217+
}
3218+
3219+
static void __init vmscape_apply_mitigation(void)
3220+
{
3221+
if (vmscape_mitigation == VMSCAPE_MITIGATION_IBPB_EXIT_TO_USER)
3222+
setup_force_cpu_cap(X86_FEATURE_IBPB_EXIT_TO_USER);
3223+
}
3224+
31483225
#undef pr_fmt
31493226
#define pr_fmt(fmt) fmt
31503227

@@ -3396,6 +3473,11 @@ static ssize_t tsa_show_state(char *buf)
33963473
return sysfs_emit(buf, "%s\n", tsa_strings[tsa_mitigation]);
33973474
}
33983475

3476+
static ssize_t vmscape_show_state(char *buf)
3477+
{
3478+
return sysfs_emit(buf, "%s\n", vmscape_strings[vmscape_mitigation]);
3479+
}
3480+
33993481
static ssize_t cpu_show_common(struct device *dev, struct device_attribute *attr,
34003482
char *buf, unsigned int bug)
34013483
{
@@ -3462,6 +3544,9 @@ static ssize_t cpu_show_common(struct device *dev, struct device_attribute *attr
34623544
case X86_BUG_TSA:
34633545
return tsa_show_state(buf);
34643546

3547+
case X86_BUG_VMSCAPE:
3548+
return vmscape_show_state(buf);
3549+
34653550
default:
34663551
break;
34673552
}
@@ -3553,6 +3638,11 @@ ssize_t cpu_show_tsa(struct device *dev, struct device_attribute *attr, char *bu
35533638
{
35543639
return cpu_show_common(dev, attr, buf, X86_BUG_TSA);
35553640
}
3641+
3642+
ssize_t cpu_show_vmscape(struct device *dev, struct device_attribute *attr, char *buf)
3643+
{
3644+
return cpu_show_common(dev, attr, buf, X86_BUG_VMSCAPE);
3645+
}
35563646
#endif
35573647

35583648
void __warn_thunk(void)

drivers/base/cpu.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -603,6 +603,7 @@ CPU_SHOW_VULN_FALLBACK(ghostwrite);
603603
CPU_SHOW_VULN_FALLBACK(old_microcode);
604604
CPU_SHOW_VULN_FALLBACK(indirect_target_selection);
605605
CPU_SHOW_VULN_FALLBACK(tsa);
606+
CPU_SHOW_VULN_FALLBACK(vmscape);
606607

607608
static DEVICE_ATTR(meltdown, 0444, cpu_show_meltdown, NULL);
608609
static DEVICE_ATTR(spectre_v1, 0444, cpu_show_spectre_v1, NULL);
@@ -622,6 +623,7 @@ static DEVICE_ATTR(ghostwrite, 0444, cpu_show_ghostwrite, NULL);
622623
static DEVICE_ATTR(old_microcode, 0444, cpu_show_old_microcode, NULL);
623624
static DEVICE_ATTR(indirect_target_selection, 0444, cpu_show_indirect_target_selection, NULL);
624625
static DEVICE_ATTR(tsa, 0444, cpu_show_tsa, NULL);
626+
static DEVICE_ATTR(vmscape, 0444, cpu_show_vmscape, NULL);
625627

626628
static struct attribute *cpu_root_vulnerabilities_attrs[] = {
627629
&dev_attr_meltdown.attr,
@@ -642,6 +644,7 @@ static struct attribute *cpu_root_vulnerabilities_attrs[] = {
642644
&dev_attr_old_microcode.attr,
643645
&dev_attr_indirect_target_selection.attr,
644646
&dev_attr_tsa.attr,
647+
&dev_attr_vmscape.attr,
645648
NULL
646649
};
647650

include/linux/cpu.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ extern ssize_t cpu_show_old_microcode(struct device *dev,
8383
extern ssize_t cpu_show_indirect_target_selection(struct device *dev,
8484
struct device_attribute *attr, char *buf);
8585
extern ssize_t cpu_show_tsa(struct device *dev, struct device_attribute *attr, char *buf);
86+
extern ssize_t cpu_show_vmscape(struct device *dev, struct device_attribute *attr, char *buf);
8687

8788
extern __printf(4, 5)
8889
struct device *cpu_device_create(struct device *parent, void *drvdata,

0 commit comments

Comments
 (0)