lkml.org 
[lkml]   [2022]   [Nov]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v3 05/16] x86/microcode/intel: Reuse find_matching_signature()
    Date
    IFS uses test images provided by Intel that can be regarded as
    firmware. IFS test image carries microcode header with extended signature
    table.

    Reuse find_matching_signature() for verifying if the test image
    header or the extended signature table indicate whether an IFS test image
    is fit to run on a system.

    No functional change

    Reviewed-by: Tony Luck <tony.luck@intel.com>
    Reviewed-by: Ashok Raj <ashok.raj@intel.com>
    Reviewed-by: Sohil Mehta <sohil.mehta@intel.com>
    Signed-off-by: Jithu Joseph <jithu.joseph@intel.com>
    ---
    arch/x86/include/asm/cpu.h | 1 +
    arch/x86/kernel/cpu/intel.c | 29 ++++++++++++++++++
    arch/x86/kernel/cpu/microcode/intel.c | 44 +++++----------------------
    3 files changed, 38 insertions(+), 36 deletions(-)

    diff --git a/arch/x86/include/asm/cpu.h b/arch/x86/include/asm/cpu.h
    index b472ef76826a..e853440b5c65 100644
    --- a/arch/x86/include/asm/cpu.h
    +++ b/arch/x86/include/asm/cpu.h
    @@ -95,5 +95,6 @@ static inline bool intel_cpu_signatures_match(unsigned int s1, unsigned int p1,
    }

    extern u64 x86_read_arch_cap_msr(void);
    +int intel_find_matching_signature(void *mc, unsigned int csig, int cpf);

    #endif /* _ASM_X86_CPU_H */
    diff --git a/arch/x86/kernel/cpu/intel.c b/arch/x86/kernel/cpu/intel.c
    index 2d7ea5480ec3..b6f9210fb31a 100644
    --- a/arch/x86/kernel/cpu/intel.c
    +++ b/arch/x86/kernel/cpu/intel.c
    @@ -216,6 +216,35 @@ int intel_cpu_collect_info(struct ucode_cpu_info *uci)
    }
    EXPORT_SYMBOL_GPL(intel_cpu_collect_info);

    +/*
    + * Returns 1 if update has been found, 0 otherwise.
    + */
    +int intel_find_matching_signature(void *mc, unsigned int csig, int cpf)
    +{
    + struct microcode_header_intel *mc_hdr = mc;
    + struct extended_sigtable *ext_hdr;
    + struct extended_signature *ext_sig;
    + int i;
    +
    + if (intel_cpu_signatures_match(csig, cpf, mc_hdr->sig, mc_hdr->pf))
    + return 1;
    +
    + /* Look for ext. headers: */
    + if (get_totalsize(mc_hdr) <= get_datasize(mc_hdr) + MC_HEADER_SIZE)
    + return 0;
    +
    + ext_hdr = mc + get_datasize(mc_hdr) + MC_HEADER_SIZE;
    + ext_sig = (void *)ext_hdr + EXT_HEADER_SIZE;
    +
    + for (i = 0; i < ext_hdr->count; i++) {
    + if (intel_cpu_signatures_match(csig, cpf, ext_sig->sig, ext_sig->pf))
    + return 1;
    + ext_sig++;
    + }
    + return 0;
    +}
    +EXPORT_SYMBOL_GPL(intel_find_matching_signature);
    +
    static void early_init_intel(struct cpuinfo_x86 *c)
    {
    u64 misc_enable;
    diff --git a/arch/x86/kernel/cpu/microcode/intel.c b/arch/x86/kernel/cpu/microcode/intel.c
    index 1fcbd671f1df..4e611a708718 100644
    --- a/arch/x86/kernel/cpu/microcode/intel.c
    +++ b/arch/x86/kernel/cpu/microcode/intel.c
    @@ -45,34 +45,6 @@ static struct microcode_intel *intel_ucode_patch;
    /* last level cache size per core */
    static int llc_size_per_core;

    -/*
    - * Returns 1 if update has been found, 0 otherwise.
    - */
    -static int find_matching_signature(void *mc, unsigned int csig, int cpf)
    -{
    - struct microcode_header_intel *mc_hdr = mc;
    - struct extended_sigtable *ext_hdr;
    - struct extended_signature *ext_sig;
    - int i;
    -
    - if (intel_cpu_signatures_match(csig, cpf, mc_hdr->sig, mc_hdr->pf))
    - return 1;
    -
    - /* Look for ext. headers: */
    - if (get_totalsize(mc_hdr) <= get_datasize(mc_hdr) + MC_HEADER_SIZE)
    - return 0;
    -
    - ext_hdr = mc + get_datasize(mc_hdr) + MC_HEADER_SIZE;
    - ext_sig = (void *)ext_hdr + EXT_HEADER_SIZE;
    -
    - for (i = 0; i < ext_hdr->count; i++) {
    - if (intel_cpu_signatures_match(csig, cpf, ext_sig->sig, ext_sig->pf))
    - return 1;
    - ext_sig++;
    - }
    - return 0;
    -}
    -
    /*
    * Returns 1 if update has been found, 0 otherwise.
    */
    @@ -83,7 +55,7 @@ static int has_newer_microcode(void *mc, unsigned int csig, int cpf, int new_rev
    if (mc_hdr->rev <= new_rev)
    return 0;

    - return find_matching_signature(mc, csig, cpf);
    + return intel_find_matching_signature(mc, csig, cpf);
    }

    static struct ucode_patch *memdup_patch(void *data, unsigned int size)
    @@ -117,7 +89,7 @@ static void save_microcode_patch(struct ucode_cpu_info *uci, void *data, unsigne
    sig = mc_saved_hdr->sig;
    pf = mc_saved_hdr->pf;

    - if (find_matching_signature(data, sig, pf)) {
    + if (intel_find_matching_signature(data, sig, pf)) {
    prev_found = true;

    if (mc_hdr->rev <= mc_saved_hdr->rev)
    @@ -149,7 +121,7 @@ static void save_microcode_patch(struct ucode_cpu_info *uci, void *data, unsigne
    if (!p)
    return;

    - if (!find_matching_signature(p->data, uci->cpu_sig.sig, uci->cpu_sig.pf))
    + if (!intel_find_matching_signature(p->data, uci->cpu_sig.sig, uci->cpu_sig.pf))
    return;

    /*
    @@ -286,8 +258,8 @@ scan_microcode(void *data, size_t size, struct ucode_cpu_info *uci, bool save)

    size -= mc_size;

    - if (!find_matching_signature(data, uci->cpu_sig.sig,
    - uci->cpu_sig.pf)) {
    + if (!intel_find_matching_signature(data, uci->cpu_sig.sig,
    + uci->cpu_sig.pf)) {
    data += mc_size;
    continue;
    }
    @@ -652,9 +624,9 @@ static struct microcode_intel *find_patch(struct ucode_cpu_info *uci)
    if (phdr->rev <= uci->cpu_sig.rev)
    continue;

    - if (!find_matching_signature(phdr,
    - uci->cpu_sig.sig,
    - uci->cpu_sig.pf))
    + if (!intel_find_matching_signature(phdr,
    + uci->cpu_sig.sig,
    + uci->cpu_sig.pf))
    continue;

    return iter->data;
    --
    2.25.1
    \
     
     \ /
      Last update: 2022-11-17 05:02    [W:3.077 / U:0.916 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site