|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v2 2/4] x86: Read MSR_ARCH_CAPS after early_microcode_init()
On 05.06.2023 19:08, Alejandro Vallejo wrote:
> 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().
See early_cpu_init(). (I have to admit that I was also struggling with
your use of "read": Aiui you mean the field was never written / set,
and "read" really refers to the reading of the corresponding CPUID
leaf.)
> --- 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);
As per above I don't think this is needed.
> + if ( boot_cpu_data.cpuid_level >= 7 )
> + boot_cpu_data.x86_capability[FEATURESET_7d0]
> + = cpuid_count_edx(7, 0);
This is actually filled in early_cpu_init() as well, so doesn't need
re-doing here unless because of a suspected change to the value (but
then other CPUID output may have changed, too). At which point ...
> @@ -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]);
... "centralize" aspect goes away, and hence the comment needs adjusting.
> --- 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) )
> {
I think I'd like to see at least the initial part of the original comment
retained here.
Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |