x86/microcode/intel: Rework intel_find_matching_signature()
authorThomas Gleixner <tglx@linutronix.de>
Mon, 2 Oct 2023 11:59:50 +0000 (13:59 +0200)
committerBorislav Petkov (AMD) <bp@alien8.de>
Tue, 24 Oct 2023 13:05:54 +0000 (15:05 +0200)
Take a cpu_signature argument and work from there. Move the match()
helper next to the callsite as there is no point for having it in
a header.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
Link: https://lore.kernel.org/r/20231002115902.797820205@linutronix.de
arch/x86/include/asm/cpu.h
arch/x86/kernel/cpu/microcode/intel.c
drivers/platform/x86/intel/ifs/load.c

index 068a07ed616546ebfc0134bbd2554bba7dba4bea..fecc4fe1d68aff799c7b91b363d69e961cefbab1 100644 (file)
@@ -75,22 +75,8 @@ struct cpu_signature;
 
 void intel_collect_cpu_info(struct cpu_signature *sig);
 
-static inline bool intel_cpu_signatures_match(unsigned int s1, unsigned int p1,
-                                             unsigned int s2, unsigned int p2)
-{
-       if (s1 != s2)
-               return false;
-
-       /* Processor flags are either both 0 ... */
-       if (!p1 && !p2)
-               return true;
-
-       /* ... or they intersect. */
-       return p1 & p2;
-}
-
 extern u64 x86_read_arch_cap_msr(void);
-int intel_find_matching_signature(void *mc, unsigned int csig, int cpf);
+bool intel_find_matching_signature(void *mc, struct cpu_signature *sig);
 int intel_microcode_sanity_check(void *mc, bool print_err, int hdr_type);
 
 extern struct cpumask cpus_stop_mask;
index 47a96c0ef65f552e5a7f44331d306b9435987050..e5c5ddfd68310e87fe97cfa8a665e7cac02bc61b 100644 (file)
@@ -84,29 +84,36 @@ void intel_collect_cpu_info(struct cpu_signature *sig)
 }
 EXPORT_SYMBOL_GPL(intel_collect_cpu_info);
 
-/*
- * Returns 1 if update has been found, 0 otherwise.
- */
-int intel_find_matching_signature(void *mc, unsigned int csig, int cpf)
+static inline bool cpu_signatures_match(struct cpu_signature *s1, unsigned int sig2,
+                                       unsigned int pf2)
+{
+       if (s1->sig != sig2)
+               return false;
+
+       /* Processor flags are either both 0 or they intersect. */
+       return ((!s1->pf && !pf2) || (s1->pf & pf2));
+}
+
+bool intel_find_matching_signature(void *mc, struct cpu_signature *sig)
 {
        struct microcode_header_intel *mc_hdr = mc;
-       struct extended_sigtable *ext_hdr;
        struct extended_signature *ext_sig;
+       struct extended_sigtable *ext_hdr;
        int i;
 
-       if (intel_cpu_signatures_match(csig, cpf, mc_hdr->sig, mc_hdr->pf))
-               return 1;
+       if (cpu_signatures_match(sig, mc_hdr->sig, mc_hdr->pf))
+               return true;
 
        /* Look for ext. headers: */
        if (get_totalsize(mc_hdr) <= intel_microcode_get_datasize(mc_hdr) + MC_HEADER_SIZE)
-               return 0;
+               return false;
 
        ext_hdr = mc + intel_microcode_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;
+               if (cpu_signatures_match(sig, ext_sig->sig, ext_sig->pf))
+                       return true;
                ext_sig++;
        }
        return 0;
@@ -268,7 +275,7 @@ static __init struct microcode_intel *scan_microcode(void *data, size_t size,
                    intel_microcode_sanity_check(data, false, MC_HEADER_TYPE_MICROCODE) < 0)
                        break;
 
-               if (!intel_find_matching_signature(data, uci->cpu_sig.sig, uci->cpu_sig.pf))
+               if (!intel_find_matching_signature(data, &uci->cpu_sig))
                        continue;
 
                /*
@@ -512,7 +519,7 @@ static enum ucode_state parse_microcode_blobs(int cpu, struct iov_iter *iter)
                if (cur_rev >= mc_header.rev)
                        continue;
 
-               if (!intel_find_matching_signature(mc, uci->cpu_sig.sig, uci->cpu_sig.pf))
+               if (!intel_find_matching_signature(mc, &uci->cpu_sig))
                        continue;
 
                kvfree(new_mc);
index 61174bd48fd5b154af8d85037d3eb75a8472c8bc..3e1880f8e12af5dd3ed8487658a1cce2c3090977 100644 (file)
@@ -242,7 +242,7 @@ static int image_sanity_check(struct device *dev, const struct microcode_header_
 
        intel_collect_cpu_info(&sig);
 
-       if (!intel_find_matching_signature((void *)data, sig.sig, sig.pf)) {
+       if (!intel_find_matching_signature((void *)data, &sig)) {
                dev_err(dev, "cpu signature, processor flags not matching\n");
                return -EINVAL;
        }