[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 12/06/2023 4:46 pm, Jan Beulich wrote: > On 05.06.2023 19:08, Alejandro Vallejo wrote: >> --- 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). Hmm, yes. I suspect that is due to the CET series (which needed to know 7d0 much earlier than previously), and me forgetting to clean up tsx_init(). > 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. I find it weird splitting apart the various reads into x86_capability[], but in light of the feedback, only the rdmsr() needs to stay. > >> --- 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. The first sentence needs to stay as-is. That's still relevant even with the feature handling moved out. The second sentence wants to say something like "However, microcode_init() has already prepared the feature bits we need." because it's the justification of why we don't do it here. ~Andrew
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |