| From 0487743593c7df7d637db9048c5727bd7c1cea03 Mon Sep 17 00:00:00 2001 |
| From: Thomas Gleixner <tglx@linutronix.de> |
| Date: Mon, 2 Oct 2023 13:59:39 +0200 |
| Subject: x86/microcode/intel: Simplify scan_microcode() |
| |
| From: Thomas Gleixner <tglx@linutronix.de> |
| |
| commit b0f0bf5eef5fac6ba30b7cac15ca4cb01f8a6ca9 upstream |
| |
| Make it readable and comprehensible. |
| |
| Signed-off-by: Thomas Gleixner <tglx@linutronix.de> |
| Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de> |
| Link: https://lore.kernel.org/r/20231002115902.271940980@linutronix.de |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| arch/x86/kernel/cpu/microcode/intel.c | 28 +++++++--------------------- |
| 1 file changed, 7 insertions(+), 21 deletions(-) |
| |
| --- a/arch/x86/kernel/cpu/microcode/intel.c |
| +++ b/arch/x86/kernel/cpu/microcode/intel.c |
| @@ -266,22 +266,16 @@ static void save_microcode_patch(void *d |
| intel_ucode_patch = (struct microcode_intel *)p; |
| } |
| |
| -/* |
| - * Get microcode matching with BSP's model. Only CPUs with the same model as |
| - * BSP can stay in the platform. |
| - */ |
| -static struct microcode_intel * |
| -scan_microcode(void *data, size_t size, struct ucode_cpu_info *uci, bool save) |
| +/* Scan CPIO for microcode matching the boot CPU's family, model, stepping */ |
| +static struct microcode_intel *scan_microcode(void *data, size_t size, |
| + struct ucode_cpu_info *uci, bool save) |
| { |
| struct microcode_header_intel *mc_header; |
| struct microcode_intel *patch = NULL; |
| u32 cur_rev = uci->cpu_sig.rev; |
| unsigned int mc_size; |
| |
| - while (size) { |
| - if (size < sizeof(struct microcode_header_intel)) |
| - break; |
| - |
| + for (; size >= sizeof(struct microcode_header_intel); size -= mc_size, data += mc_size) { |
| mc_header = (struct microcode_header_intel *)data; |
| |
| mc_size = get_totalsize(mc_header); |
| @@ -289,27 +283,19 @@ scan_microcode(void *data, size_t size, |
| intel_microcode_sanity_check(data, false, MC_HEADER_TYPE_MICROCODE) < 0) |
| break; |
| |
| - size -= mc_size; |
| - |
| - if (!intel_find_matching_signature(data, uci->cpu_sig.sig, |
| - uci->cpu_sig.pf)) { |
| - data += mc_size; |
| + if (!intel_find_matching_signature(data, uci->cpu_sig.sig, uci->cpu_sig.pf)) |
| continue; |
| - } |
| |
| /* BSP scan: Check whether there is newer microcode */ |
| if (!save && cur_rev >= mc_header->rev) |
| - goto next; |
| + continue; |
| |
| /* Save scan: Check whether there is newer or matching microcode */ |
| if (save && cur_rev != mc_header->rev) |
| - goto next; |
| + continue; |
| |
| patch = data; |
| cur_rev = mc_header->rev; |
| - |
| -next: |
| - data += mc_size; |
| } |
| |
| if (size) |