[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v4 1/6] microcode/intel: extend microcode_update_match()
On Wed, Nov 28, 2018 at 01:34:11PM +0800, Chao Gao wrote: > to a more generic function. The benefit is that this function can be > used to check whether a microcode is newer than another as well. We > rely on this function to decide to perform a replacement or an add when > updating the global microcode cache (introduced by later patches in > this series). > > Signed-off-by: Chao Gao <chao.gao@xxxxxxxxx> > --- > xen/arch/x86/microcode_intel.c | 57 > +++++++++++++++++++++++------------------- > 1 file changed, 31 insertions(+), 26 deletions(-) > > diff --git a/xen/arch/x86/microcode_intel.c b/xen/arch/x86/microcode_intel.c > index 9657575..8d9a3b2 100644 > --- a/xen/arch/x86/microcode_intel.c > +++ b/xen/arch/x86/microcode_intel.c > @@ -127,14 +127,37 @@ static int collect_cpu_info(unsigned int cpu_num, > struct cpu_signature *csig) > return 0; > } > > -static inline int microcode_update_match( > - unsigned int cpu_num, const struct microcode_header_intel *mc_header, > - int sig, int pf) > +enum { > + OLD_UCODE, /* signature matched, but revision id isn't newer */ > + NEW_UCODE, /* signature matched, but revision id is newer */ > + MIS_UCODE, /* signature mismatched */ > +}; Shouldn't you give a name to this type ... > +static int microcode_update_match(const void *mc, ... so that this function can return it instead of int? > + unsigned int sig, unsigned int pf, unsigned int rev) > { > - struct ucode_cpu_info *uci = &per_cpu(ucode_cpu_info, cpu_num); > + const struct microcode_header_intel *mc_header = mc; > + const struct extended_sigtable *ext_header; > + unsigned long total_size = get_totalsize(mc_header); size_t might be more appropriate here. > + int ext_sigcount, i; unsigned int. > + struct extended_signature *ext_sig; const? > > - return (sigmatch(sig, uci->cpu_sig.sig, pf, uci->cpu_sig.pf) && > - (mc_header->rev > uci->cpu_sig.rev)); > + if ( sigmatch(sig, mc_header->sig, pf, mc_header->pf) ) > + return (mc_header->rev > rev) ? NEW_UCODE : OLD_UCODE; > + > + if ( total_size <= (get_datasize(mc_header) + MC_HEADER_SIZE) ) > + return MIS_UCODE; Shouldn't you perform this check before the signature check? > + > + ext_header = mc + get_datasize(mc_header) + MC_HEADER_SIZE; > + ext_sigcount = ext_header->count; > + ext_sig = (void *)ext_header + EXT_HEADER_SIZE; You are dropping the const here AFAICT by casting to void *. > + for ( i = 0; i < ext_sigcount; i++ ) > + { > + if ( sigmatch(sig, ext_sig->sig, pf, ext_sig->pf) ) > + return (mc_header->rev > rev) ? NEW_UCODE : OLD_UCODE; > + ext_sig++; > + } I would add a newline here for readability. > + return MIS_UCODE; > } > > static int microcode_sanity_check(void *mc) > @@ -236,31 +259,13 @@ static int get_matching_microcode(const void *mc, > unsigned int cpu) > { > struct ucode_cpu_info *uci = &per_cpu(ucode_cpu_info, cpu); > const struct microcode_header_intel *mc_header = mc; > - const struct extended_sigtable *ext_header; > unsigned long total_size = get_totalsize(mc_header); > - int ext_sigcount, i; > - struct extended_signature *ext_sig; > void *new_mc; > > - if ( microcode_update_match(cpu, mc_header, > - mc_header->sig, mc_header->pf) ) > - goto find; > - > - if ( total_size <= (get_datasize(mc_header) + MC_HEADER_SIZE) ) > + if ( microcode_update_match(mc, uci->cpu_sig.sig, uci->cpu_sig.pf, > + uci->cpu_sig.rev) != NEW_UCODE ) > return 0; Shouldn't you differentiate between the function returning OLD_UCODE or MIS_UCODE? I would expect that trying to load a mismatched UCODE would trigger some kind of message from Xen. Thanks, Roger. _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |