mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
x86/amd: Mitigate AMD-SN-7053 / FP-DSS
This is XSA-488 / CVE-2025-54505
Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Reviewed-by: Roger Pau Monné <roger.pau@citrix.com>
(cherry picked from commit 99912d3460)
This commit is contained in:
1 parent
2319a85020
commit
57d0c0cdde
2 files changed
+39
No files matched your search
@@ -982,6 +982,42 @@ static void cf_check fam17_disable_c6(void *arg)
|
||||
wrmsrl(MSR_AMD_CSTATE_CFG, val & mask);
|
||||
}
|
||||
|
||||
static void amd_init_fp_cfg(const struct cpuinfo_x86 *c)
|
||||
{
|
||||
uint64_t val, new = 0;
|
||||
|
||||
/* If virtualised, we won't have mutable access even if we can read it. */
|
||||
if ( cpu_has_hypervisor )
|
||||
return;
|
||||
|
||||
/*
|
||||
* On Zen1, mitigate SB-7053 / FP-DSS Floating Point Divider State
|
||||
* Sampling by setting bit 9 as instructed.
|
||||
*/
|
||||
if ( c->x86 == 0x17 && is_zen1_uarch() )
|
||||
new |= 1 << 9;
|
||||
|
||||
/*
|
||||
* Avoid reading FP_CFG if we don't intend to change anything. The
|
||||
* register doesn't exist on all families.
|
||||
*/
|
||||
if ( !new )
|
||||
return;
|
||||
|
||||
rdmsrl(MSR_AMD64_FP_CFG, val);
|
||||
|
||||
if ( (val & new) == new )
|
||||
return;
|
||||
|
||||
/*
|
||||
* FP_CFG is a Core-scoped MSR, and this write is racy. However, both
|
||||
* threads calculate the new value from state which expected to be
|
||||
* consistent across CPUs and unrelated to the old value, so the result
|
||||
* should be consistent.
|
||||
*/
|
||||
wrmsrl(MSR_AMD64_FP_CFG, val | new);
|
||||
}
|
||||
|
||||
static void amd_check_erratum_1485(void)
|
||||
{
|
||||
uint64_t val, chickenbit = (1 << 5);
|
||||
@@ -1009,6 +1045,8 @@ static void cf_check init_amd(struct cpuinfo_x86 *c)
|
||||
|
||||
unsigned long long value;
|
||||
|
||||
amd_init_fp_cfg(c);
|
||||
|
||||
/* Disable TLB flush filter by setting HWCR.FFDIS on K8
|
||||
* bit 6 of msr C001_0015
|
||||
*
|
||||
|
||||
@@ -386,6 +386,7 @@
|
||||
#define MSR_AMD64_LS_CFG 0xc0011020
|
||||
#define MSR_AMD64_IC_CFG 0xc0011021
|
||||
#define MSR_AMD64_DC_CFG 0xc0011022
|
||||
#define MSR_AMD64_FP_CFG 0xc0011028
|
||||
#define MSR_AMD64_DE_CFG 0xc0011029
|
||||
#define AMD64_DE_CFG_LFENCE_SERIALISE (_AC(1, ULL) << 1)
|
||||
#define MSR_AMD64_EX_CFG 0xc001102c
|
||||
|
||||