mirror of
https://git.proxmox.com/git/pve-kernel
synced 2025-04-28 16:53:28 +00:00

(generated with debian/scripts/import-upstream-tag) Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
80 lines
2.7 KiB
Diff
80 lines
2.7 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: "Borislav Petkov (AMD)" <bp@alien8.de>
|
|
Date: Sun, 24 Mar 2024 20:51:35 +0100
|
|
Subject: [PATCH] x86/CPU/AMD: Improve the erratum 1386 workaround
|
|
|
|
Disable XSAVES only on machines which haven't loaded the microcode
|
|
revision containing the erratum fix.
|
|
|
|
This will come in handy when running archaic OSes as guests. OSes whose
|
|
brilliant programmers thought that CPUID is overrated and one should not
|
|
query it but use features directly, ala shoot first, ask questions
|
|
later... but only if you're alive after the shooting.
|
|
|
|
Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
|
|
Tested-by: "Maciej S. Szmigiero" <maciej.szmigiero@oracle.com>
|
|
Cc: Boris Ostrovsky <boris.ostrovsky@oracle.com>
|
|
Link: https://lore.kernel.org/r/20240324200525.GBZgCHhYFsBj12PrKv@fat_crate.local
|
|
---
|
|
arch/x86/include/asm/cpu_device_id.h | 8 ++++++++
|
|
arch/x86/kernel/cpu/amd.c | 12 ++++++++++++
|
|
2 files changed, 20 insertions(+)
|
|
|
|
diff --git a/arch/x86/include/asm/cpu_device_id.h b/arch/x86/include/asm/cpu_device_id.h
|
|
index e8e3dbe7f173..b6325ee30871 100644
|
|
--- a/arch/x86/include/asm/cpu_device_id.h
|
|
+++ b/arch/x86/include/asm/cpu_device_id.h
|
|
@@ -288,6 +288,14 @@ struct x86_cpu_desc {
|
|
.x86_microcode_rev = (revision), \
|
|
}
|
|
|
|
+#define AMD_CPU_DESC(fam, model, stepping, revision) { \
|
|
+ .x86_family = (fam), \
|
|
+ .x86_vendor = X86_VENDOR_AMD, \
|
|
+ .x86_model = (model), \
|
|
+ .x86_stepping = (stepping), \
|
|
+ .x86_microcode_rev = (revision), \
|
|
+}
|
|
+
|
|
extern const struct x86_cpu_id *x86_match_cpu(const struct x86_cpu_id *match);
|
|
extern bool x86_cpu_has_min_microcode_rev(const struct x86_cpu_desc *table);
|
|
|
|
diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c
|
|
index 0838ea579eb0..ca6096dcc5c6 100644
|
|
--- a/arch/x86/kernel/cpu/amd.c
|
|
+++ b/arch/x86/kernel/cpu/amd.c
|
|
@@ -13,6 +13,7 @@
|
|
#include <asm/apic.h>
|
|
#include <asm/cacheinfo.h>
|
|
#include <asm/cpu.h>
|
|
+#include <asm/cpu_device_id.h>
|
|
#include <asm/spec-ctrl.h>
|
|
#include <asm/smp.h>
|
|
#include <asm/numa.h>
|
|
@@ -925,6 +926,11 @@ static void init_amd_bd(struct cpuinfo_x86 *c)
|
|
clear_rdrand_cpuid_bit(c);
|
|
}
|
|
|
|
+static const struct x86_cpu_desc erratum_1386_microcode[] = {
|
|
+ AMD_CPU_DESC(0x17, 0x1, 0x2, 0x0800126e),
|
|
+ AMD_CPU_DESC(0x17, 0x31, 0x0, 0x08301052),
|
|
+};
|
|
+
|
|
static void fix_erratum_1386(struct cpuinfo_x86 *c)
|
|
{
|
|
/*
|
|
@@ -934,7 +940,13 @@ static void fix_erratum_1386(struct cpuinfo_x86 *c)
|
|
*
|
|
* Affected parts all have no supervisor XSAVE states, meaning that
|
|
* the XSAVEC instruction (which works fine) is equivalent.
|
|
+ *
|
|
+ * Clear the feature flag only on microcode revisions which
|
|
+ * don't have the fix.
|
|
*/
|
|
+ if (x86_cpu_has_min_microcode_rev(erratum_1386_microcode))
|
|
+ return;
|
|
+
|
|
clear_cpu_cap(c, X86_FEATURE_XSAVES);
|
|
}
|
|
|