[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

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.