x86/spec-ctrl: Rework spec_ctrl_flags context switching

We are shortly going to need to context switch new bits in both the vcpu and
S3 paths.  Introduce SCF_IST_MASK and SCF_DOM_MASK, and rework d->arch.verw
into d->arch.spec_ctrl_flags to accommodate.

No functional change.

This is part of XSA-407.

Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
(cherry picked from commit 5796912f72)
This commit is contained in:
Andrew Cooper committed 2022-07-12 16:31:49 +01:00
1 parent e5fd5081e0
commit b60c995d67
6 files changed
+44 -17

No files matched your search

+4 -4
View File
@@ -246,8 +246,8 @@ static int enter_state(u32 state)
error = 0;
ci = get_cpu_info();
/* Avoid NMI/#MC using MSR_SPEC_CTRL until we've reloaded microcode. */
ci->spec_ctrl_flags &= ~SCF_ist_wrmsr;
/* Avoid NMI/#MC using unsafe MSRs until we've reloaded microcode. */
ci->spec_ctrl_flags &= ~SCF_IST_MASK;
ACPI_FLUSH_CPU_CACHE();
@@ -290,8 +290,8 @@ static int enter_state(u32 state)
if ( !recheck_cpu_features(0) )
panic("Missing previously available feature(s)\n");
/* Re-enabled default NMI/#MC use of MSR_SPEC_CTRL. */
ci->spec_ctrl_flags |= (default_spec_ctrl_flags & SCF_ist_wrmsr);
/* Re-enabled default NMI/#MC use of MSRs now microcode is loaded. */
ci->spec_ctrl_flags |= (default_spec_ctrl_flags & SCF_IST_MASK);
if ( boot_cpu_has(X86_FEATURE_IBRSB) || boot_cpu_has(X86_FEATURE_IBRS) )
{
+4 -4
View File
@@ -1838,10 +1838,10 @@ void context_switch(struct vcpu *prev, struct vcpu *next)
}
}
/* Update the top-of-stack block with the VERW disposition. */
info->spec_ctrl_flags &= ~SCF_verw;
if ( nextd->arch.verw )
info->spec_ctrl_flags |= SCF_verw;
/* Update the top-of-stack block with the new spec_ctrl settings. */
info->spec_ctrl_flags =
(info->spec_ctrl_flags & ~SCF_DOM_MASK) |
(nextd->arch.spec_ctrl_flags & SCF_DOM_MASK);
}
sched_context_switched(prev, next);
+6 -3
View File
@@ -981,9 +981,12 @@ void spec_ctrl_init_domain(struct domain *d)
{
bool pv = is_pv_domain(d);
d->arch.verw =
(pv ? opt_md_clear_pv : opt_md_clear_hvm) ||
(opt_fb_clear_mmio && is_iommu_enabled(d));
bool verw = ((pv ? opt_md_clear_pv : opt_md_clear_hvm) ||
(opt_fb_clear_mmio && is_iommu_enabled(d)));
d->arch.spec_ctrl_flags =
(verw ? SCF_verw : 0) |
0;
}
void __init init_speculation_mitigations(void)
+1 -2
View File
@@ -308,8 +308,7 @@ struct arch_domain
uint32_t pci_cf8;
uint8_t cmos_idx;
/* Use VERW on return-to-guest for its flushing side effect. */
bool verw;
uint8_t spec_ctrl_flags; /* See SCF_DOM_MASK */
union {
struct pv_domain pv;
+29 -1
View File
@@ -20,12 +20,40 @@
#ifndef __X86_SPEC_CTRL_H__
#define __X86_SPEC_CTRL_H__
/* Encoding of cpuinfo.spec_ctrl_flags */
/*
* Encoding of:
* cpuinfo.spec_ctrl_flags
* default_spec_ctrl_flags
* domain.spec_ctrl_flags
*
* Live settings are in the top-of-stack block, because they need to be
* accessable when XPTI is active. Some settings are fixed from boot, some
* context switched per domain, and some inhibited in the S3 path.
*/
#define SCF_use_shadow (1 << 0)
#define SCF_ist_wrmsr (1 << 1)
#define SCF_ist_rsb (1 << 2)
#define SCF_verw (1 << 3)
/*
* The IST paths (NMI/#MC) can interrupt any arbitrary context. Some
* functionality requires updated microcode to work.
*
* On boot, this is easy; we load microcode before figuring out which
* speculative protections to apply. However, on the S3 resume path, we must
* be able to disable the configured mitigations until microcode is reloaded.
*
* These are the controls to inhibit on the S3 resume path until microcode has
* been reloaded.
*/
#define SCF_IST_MASK (SCF_ist_wrmsr)
/*
* Some speculative protections are per-domain. These settings are merged
* into the top-of-stack block in the context switch path.
*/
#define SCF_DOM_MASK (SCF_verw)
#ifndef __ASSEMBLY__
#include <asm/alternative.h>
-3
View File
@@ -248,9 +248,6 @@
/*
* Use in IST interrupt/exception context. May interrupt Xen or PV context.
* Fine grain control of SCF_ist_wrmsr is needed for safety in the S3 resume
* path to avoid using MSR_SPEC_CTRL before the microcode introducing it has
* been reloaded.
*/
.macro SPEC_CTRL_ENTRY_FROM_INTR_IST
/*
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.