|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v2 2/4] x86: Read MSR_ARCH_CAPS after early_microcode_init()
tsx_init() has some ad-hoc code to read MSR_ARCH_CAPS if present. In order
to suuport DIS_MCU_UPDATE we need access to it earlier, so this patch moves
early read to the tail of early_microcode_init(), after the early microcode
update.
The read of the 7d0 CPUID leaf is left in a helper because it's reused in a
later patch.
No functional change.
Signed-off-by: Alejandro Vallejo <alejandro.vallejo@xxxxxxxxx>
---
I suspect there was an oversight in tsx_init() by which
boot_cpu_data.cpuid_level was never read? The first read I can
see is in identify_cpu(), which happens after tsx_init().
v2:
* New addition
---
xen/arch/x86/cpu/microcode/core.c | 21 +++++++++++++++++++++
xen/arch/x86/tsx.c | 15 +++------------
2 files changed, 24 insertions(+), 12 deletions(-)
diff --git a/xen/arch/x86/cpu/microcode/core.c
b/xen/arch/x86/cpu/microcode/core.c
index 29ff38f35c..892bcec901 100644
--- a/xen/arch/x86/cpu/microcode/core.c
+++ b/xen/arch/x86/cpu/microcode/core.c
@@ -840,6 +840,15 @@ static int __init early_microcode_update_cpu(void)
return microcode_update_cpu(patch);
}
+static void __init early_read_cpuid_7d0(void)
+{
+ boot_cpu_data.cpuid_level = cpuid_eax(0);
+
+ if ( boot_cpu_data.cpuid_level >= 7 )
+ boot_cpu_data.x86_capability[FEATURESET_7d0]
+ = cpuid_count_edx(7, 0);
+}
+
int __init early_microcode_init(unsigned long *module_map,
const struct multiboot_info *mbi)
{
@@ -878,5 +887,17 @@ int __init early_microcode_init(unsigned long *module_map,
if ( ucode_mod.mod_end || ucode_blob.size )
rc = early_microcode_update_cpu();
+ early_read_cpuid_7d0();
+
+ /*
+ * tsx_init() needs MSR_ARCH_CAPS, but it runs before identify_cpu()
+ * populates boot_cpu_data, so we read it here to centralize early
+ * CPUID/MSR reads in the same place.
+ */
+ if ( cpu_has_arch_caps )
+ rdmsr(MSR_ARCH_CAPABILITIES,
+ boot_cpu_data.x86_capability[FEATURESET_m10Al],
+ boot_cpu_data.x86_capability[FEATURESET_m10Ah]);
+
return rc;
}
diff --git a/xen/arch/x86/tsx.c b/xen/arch/x86/tsx.c
index 80c6f4cedd..0501e181bf 100644
--- a/xen/arch/x86/tsx.c
+++ b/xen/arch/x86/tsx.c
@@ -39,9 +39,9 @@ void tsx_init(void)
static bool __read_mostly once;
/*
- * This function is first called between microcode being loaded, and CPUID
- * being scanned generally. Read into boot_cpu_data.x86_capability[] for
- * the cpu_has_* bits we care about using here.
+ * While MSRs/CPUID haven't yet been scanned, MSR_ARCH_CAPABILITIES
+ * and leaf 7d0 have already been read if present after early microcode
+ * loading time. So we can assume _those_ are present.
*/
if ( unlikely(!once) )
{
@@ -49,15 +49,6 @@ void tsx_init(void)
once = true;
- if ( boot_cpu_data.cpuid_level >= 7 )
- boot_cpu_data.x86_capability[FEATURESET_7d0]
- = cpuid_count_edx(7, 0);
-
- if ( cpu_has_arch_caps )
- rdmsr(MSR_ARCH_CAPABILITIES,
- boot_cpu_data.x86_capability[FEATURESET_m10Al],
- boot_cpu_data.x86_capability[FEATURESET_m10Ah]);
-
has_rtm_always_abort = cpu_has_rtm_always_abort;
if ( cpu_has_tsx_ctrl && cpu_has_srbds_ctrl )
--
2.34.1
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |