[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH 1/2] x86/ucode: Move vendor specifics back out of early_microcode_init()
On 25.10.2023 20:06, Andrew Cooper wrote: > --- a/xen/arch/x86/cpu/microcode/core.c > +++ b/xen/arch/x86/cpu/microcode/core.c > @@ -847,25 +847,19 @@ int __init early_microcode_init(unsigned long > *module_map, > { > const struct cpuinfo_x86 *c = &boot_cpu_data; > int rc = 0; > - bool can_load = false; > > switch ( c->x86_vendor ) > { > case X86_VENDOR_AMD: > - if ( c->x86 >= 0x10 ) > - { > - ucode_ops = amd_ucode_ops; > - can_load = true; > - } > + ucode_probe_amd(&ucode_ops); > break; > > case X86_VENDOR_INTEL: > - ucode_ops = intel_ucode_ops; > - can_load = intel_can_load_microcode(); > + ucode_probe_intel(&ucode_ops); > break; > } > > - if ( !ucode_ops.apply_microcode ) > + if ( !ucode_ops.collect_cpu_info ) > { > printk(XENLOG_INFO "Microcode loading not available\n"); > return -ENODEV; > @@ -882,10 +876,10 @@ int __init early_microcode_init(unsigned long > *module_map, > * > * Take the hint in either case and ignore the microcode interface. > */ > - if ( this_cpu(cpu_sig).rev == ~0 || !can_load ) > + if ( !ucode_ops.apply_microcode || this_cpu(cpu_sig).rev == ~0 ) Here ucode_ops.apply_microcode simply replaces can_load, as expected. > { > printk(XENLOG_INFO "Microcode loading disabled due to: %s\n", > - can_load ? "rev = ~0" : "HW toggle"); > + ucode_ops.apply_microcode ? "HW toggle" : "rev = ~0"); Here, otoh, you invert sense, which I don't think is right. With 2nd and 3rd operands swapped back Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx> > @@ -398,9 +398,17 @@ bool __init intel_can_load_microcode(void) > return !(mcu_ctrl & MCU_CONTROL_DIS_MCU_LOAD); > } > > -const struct microcode_ops __initconst_cf_clobber intel_ucode_ops = { > +static const struct microcode_ops __initconst_cf_clobber intel_ucode_ops = { > .cpu_request_microcode = cpu_request_microcode, > .collect_cpu_info = collect_cpu_info, > .apply_microcode = apply_microcode, > .compare_patch = compare_patch, > }; > + > +void __init ucode_probe_intel(struct microcode_ops *ops) > +{ > + *ops = intel_ucode_ops; > + > + if ( !can_load_microcode() ) > + ops->apply_microcode = NULL; > +} I was wondering why you didn't use the return value to supply the pointer to the caller, but this override explains it. Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |