Commit fcf8239a authored by Borislav Petkov (AMD)'s avatar Borislav Petkov (AMD)
Browse files

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: 94838d23 ("x86/microcode/AMD: Use the family,model,stepping encoded in the patch ID")
Reported-by: default avatarVítek Vávra <vit.vavra.kh@gmail.com>
Signed-off-by: default avatarBorislav Petkov (AMD) <bp@alien8.de>
Cc: <stable@kernel.org>
parent 24963ae1
Loading
Loading
Loading
Loading
+20 −2
Original line number Diff line number Diff line
@@ -171,8 +171,28 @@ static int cmp_id(const void *key, const void *elem)
		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)
{
	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) {
	case 0x80012: return cur_rev <= 0x800126f; 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.patch_id  = uci->cpu_sig.rev;

	WARN_ON_ONCE(!n.patch_id);

	list_for_each_entry(p, &microcode_cache, plist)
		if (patch_cpus_equivalent(p, &n, false))
			return p;