diff options
Diffstat (limited to 'arch/x86/kernel/cpu/microcode/amd.c')
| -rw-r--r-- | arch/x86/kernel/cpu/microcode/amd.c | 22 | 
1 files changed, 20 insertions, 2 deletions
diff --git a/arch/x86/kernel/cpu/microcode/amd.c b/arch/x86/kernel/cpu/microcode/amd.c index cdce885e2fd5..b7c797dc94f4 100644 --- a/arch/x86/kernel/cpu/microcode/amd.c +++ b/arch/x86/kernel/cpu/microcode/amd.c @@ -194,7 +194,7 @@ static bool need_sha_check(u32 cur_rev)  	}  	switch (cur_rev >> 8) { -	case 0x80012: return cur_rev <= 0x800126f; break; +	case 0x80012: return cur_rev <= 0x8001277; break;  	case 0x80082: return cur_rev <= 0x800820f; break;  	case 0x83010: return cur_rev <= 0x830107c; break;  	case 0x86001: return cur_rev <= 0x860010e; break; @@ -233,13 +233,31 @@ static bool need_sha_check(u32 cur_rev)  	return true;  } +static bool cpu_has_entrysign(void) +{ +	unsigned int fam   = x86_family(bsp_cpuid_1_eax); +	unsigned int model = x86_model(bsp_cpuid_1_eax); + +	if (fam == 0x17 || fam == 0x19) +		return true; + +	if (fam == 0x1a) { +		if (model <= 0x2f || +		    (0x40 <= model && model <= 0x4f) || +		    (0x60 <= model && model <= 0x6f)) +			return true; +	} + +	return false; +} +  static bool verify_sha256_digest(u32 patch_id, u32 cur_rev, const u8 *data, unsigned int len)  {  	struct patch_digest *pd = NULL;  	u8 digest[SHA256_DIGEST_SIZE];  	int i; -	if (x86_family(bsp_cpuid_1_eax) < 0x17) +	if (!cpu_has_entrysign())  		return true;  	if (!need_sha_check(cur_rev))  | 
