2
0
mirror of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git synced 2025-09-04 20:19:47 +08:00

x86/microcode/AMD: Handle the case of no BIOS microcode

Machines can be shipped without any microcode in the BIOS. Which means,
the microcode patch revision is 0.

Handle that gracefully.

Fixes: 94838d230a ("x86/microcode/AMD: Use the family,model,stepping encoded in the patch ID")
Reported-by: Vítek Vávra <vit.vavra.kh@gmail.com>
Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
Cc: <stable@kernel.org>
This commit is contained in:
Borislav Petkov (AMD) 2025-08-20 11:58:57 +02:00
parent 24963ae1b0
commit fcf8239ad6

View File

@ -171,8 +171,28 @@ static int cmp_id(const void *key, const void *elem)
return 1; return 1;
} }
static u32 cpuid_to_ucode_rev(unsigned int val)
{
union zen_patch_rev p = {};
union cpuid_1_eax c;
c.full = val;
p.stepping = c.stepping;
p.model = c.model;
p.ext_model = c.ext_model;
p.ext_fam = c.ext_fam;
return p.ucode_rev;
}
static bool need_sha_check(u32 cur_rev) static bool need_sha_check(u32 cur_rev)
{ {
if (!cur_rev) {
cur_rev = cpuid_to_ucode_rev(bsp_cpuid_1_eax);
pr_info_once("No current revision, generating the lowest one: 0x%x\n", cur_rev);
}
switch (cur_rev >> 8) { switch (cur_rev >> 8) {
case 0x80012: return cur_rev <= 0x800126f; break; case 0x80012: return cur_rev <= 0x800126f; break;
case 0x80082: return cur_rev <= 0x800820f; break; case 0x80082: return cur_rev <= 0x800820f; break;
@ -749,8 +769,6 @@ static struct ucode_patch *cache_find_patch(struct ucode_cpu_info *uci, u16 equi
n.equiv_cpu = equiv_cpu; n.equiv_cpu = equiv_cpu;
n.patch_id = uci->cpu_sig.rev; n.patch_id = uci->cpu_sig.rev;
WARN_ON_ONCE(!n.patch_id);
list_for_each_entry(p, &microcode_cache, plist) list_for_each_entry(p, &microcode_cache, plist)
if (patch_cpus_equivalent(p, &n, false)) if (patch_cpus_equivalent(p, &n, false))
return p; return p;