forked from Minki/linux
Merge branch 'x86-microcode-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pul x86 microcode updates from Ingo Molnar: "x86 microcode loader updates from Borislav Petkov: - early parsing of the built-in microcode - cleanups - misc smaller fixes" * 'x86-microcode-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: x86/microcode: Correct CPU family related variable types x86/microcode: Disable builtin microcode loading on 32-bit for now x86/microcode/intel: Rename get_matching_sig() x86/microcode/intel: Simplify get_matching_sig() x86/microcode/intel: Simplify update_match_cpu() x86/microcode/intel: Rename get_matching_microcode x86/cpu/microcode: Zap changelog x86/microcode: Parse built-in microcode early x86/microcode/intel: Remove unused @rev arg of get_matching_sig() x86/microcode/intel: Get rid of revision_is_newer()
This commit is contained in:
commit
35ffccdb7e
@ -1,6 +1,8 @@
|
||||
#ifndef _ASM_X86_MICROCODE_H
|
||||
#define _ASM_X86_MICROCODE_H
|
||||
|
||||
#include <linux/earlycpio.h>
|
||||
|
||||
#define native_rdmsr(msr, val1, val2) \
|
||||
do { \
|
||||
u64 __val = native_read_msr((msr)); \
|
||||
@ -152,6 +154,7 @@ extern void __init load_ucode_bsp(void);
|
||||
extern void load_ucode_ap(void);
|
||||
extern int __init save_microcode_in_initrd(void);
|
||||
void reload_early_microcode(void);
|
||||
extern bool get_builtin_firmware(struct cpio_data *cd, const char *name);
|
||||
#else
|
||||
static inline void __init load_ucode_bsp(void) {}
|
||||
static inline void load_ucode_ap(void) {}
|
||||
@ -160,6 +163,9 @@ static inline int __init save_microcode_in_initrd(void)
|
||||
return 0;
|
||||
}
|
||||
static inline void reload_early_microcode(void) {}
|
||||
static inline bool get_builtin_firmware(struct cpio_data *cd, const char *name)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _ASM_X86_MICROCODE_H */
|
||||
|
@ -65,12 +65,12 @@ extern enum ucode_state load_microcode_amd(int cpu, u8 family, const u8 *data, s
|
||||
extern u8 amd_ucode_patch[PATCH_MAX_SIZE];
|
||||
|
||||
#ifdef CONFIG_MICROCODE_AMD_EARLY
|
||||
extern void __init load_ucode_amd_bsp(void);
|
||||
extern void __init load_ucode_amd_bsp(unsigned int family);
|
||||
extern void load_ucode_amd_ap(void);
|
||||
extern int __init save_microcode_in_initrd_amd(void);
|
||||
void reload_ucode_amd(void);
|
||||
#else
|
||||
static inline void __init load_ucode_amd_bsp(void) {}
|
||||
static inline void __init load_ucode_amd_bsp(unsigned int family) {}
|
||||
static inline void load_ucode_amd_ap(void) {}
|
||||
static inline int __init save_microcode_in_initrd_amd(void) { return -EINVAL; }
|
||||
void reload_ucode_amd(void) {}
|
||||
|
@ -51,20 +51,11 @@ struct extended_sigtable {
|
||||
(((struct microcode_intel *)mc)->hdr.datasize ? \
|
||||
((struct microcode_intel *)mc)->hdr.datasize : DEFAULT_UCODE_DATASIZE)
|
||||
|
||||
#define sigmatch(s1, s2, p1, p2) \
|
||||
(((s1) == (s2)) && (((p1) & (p2)) || (((p1) == 0) && ((p2) == 0))))
|
||||
|
||||
#define exttable_size(et) ((et)->count * EXT_SIGNATURE_SIZE + EXT_HEADER_SIZE)
|
||||
|
||||
extern int get_matching_microcode(unsigned int csig, int cpf, int rev, void *mc);
|
||||
extern int has_newer_microcode(void *mc, unsigned int csig, int cpf, int rev);
|
||||
extern int microcode_sanity_check(void *mc, int print_err);
|
||||
extern int get_matching_sig(unsigned int csig, int cpf, int rev, void *mc);
|
||||
|
||||
static inline int
|
||||
revision_is_newer(struct microcode_header_intel *mc_header, int rev)
|
||||
{
|
||||
return (mc_header->rev <= rev) ? 0 : 1;
|
||||
}
|
||||
extern int find_matching_signature(void *mc, unsigned int csig, int cpf);
|
||||
|
||||
#ifdef CONFIG_MICROCODE_INTEL_EARLY
|
||||
extern void __init load_ucode_intel_bsp(void);
|
||||
|
@ -228,7 +228,23 @@ static void apply_ucode_in_initrd(void *ucode, size_t size, bool save_patch)
|
||||
}
|
||||
}
|
||||
|
||||
void __init load_ucode_amd_bsp(void)
|
||||
static bool __init load_builtin_amd_microcode(struct cpio_data *cp,
|
||||
unsigned int family)
|
||||
{
|
||||
#ifdef CONFIG_X86_64
|
||||
char fw_name[36] = "amd-ucode/microcode_amd.bin";
|
||||
|
||||
if (family >= 0x15)
|
||||
snprintf(fw_name, sizeof(fw_name),
|
||||
"amd-ucode/microcode_amd_fam%.2xh.bin", family);
|
||||
|
||||
return get_builtin_firmware(cp, fw_name);
|
||||
#else
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
|
||||
void __init load_ucode_amd_bsp(unsigned int family)
|
||||
{
|
||||
struct cpio_data cp;
|
||||
void **data;
|
||||
@ -243,8 +259,10 @@ void __init load_ucode_amd_bsp(void)
|
||||
#endif
|
||||
|
||||
cp = find_ucode_in_initrd();
|
||||
if (!cp.data)
|
||||
return;
|
||||
if (!cp.data) {
|
||||
if (!load_builtin_amd_microcode(&cp, family))
|
||||
return;
|
||||
}
|
||||
|
||||
*data = cp.data;
|
||||
*size = cp.size;
|
||||
|
@ -1,74 +1,16 @@
|
||||
/*
|
||||
* Intel CPU Microcode Update Driver for Linux
|
||||
* CPU Microcode Update Driver for Linux
|
||||
*
|
||||
* Copyright (C) 2000-2006 Tigran Aivazian <tigran@aivazian.fsnet.co.uk>
|
||||
* 2006 Shaohua Li <shaohua.li@intel.com>
|
||||
* Copyright (C) 2000-2006 Tigran Aivazian <tigran@aivazian.fsnet.co.uk>
|
||||
* 2006 Shaohua Li <shaohua.li@intel.com>
|
||||
* 2013-2015 Borislav Petkov <bp@alien8.de>
|
||||
*
|
||||
* This driver allows to upgrade microcode on Intel processors
|
||||
* belonging to IA-32 family - PentiumPro, Pentium II,
|
||||
* Pentium III, Xeon, Pentium 4, etc.
|
||||
* This driver allows to upgrade microcode on x86 processors.
|
||||
*
|
||||
* Reference: Section 8.11 of Volume 3a, IA-32 Intel? Architecture
|
||||
* Software Developer's Manual
|
||||
* Order Number 253668 or free download from:
|
||||
*
|
||||
* http://developer.intel.com/Assets/PDF/manual/253668.pdf
|
||||
*
|
||||
* For more information, go to http://www.urbanmyth.org/microcode
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version
|
||||
* 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* 1.0 16 Feb 2000, Tigran Aivazian <tigran@sco.com>
|
||||
* Initial release.
|
||||
* 1.01 18 Feb 2000, Tigran Aivazian <tigran@sco.com>
|
||||
* Added read() support + cleanups.
|
||||
* 1.02 21 Feb 2000, Tigran Aivazian <tigran@sco.com>
|
||||
* Added 'device trimming' support. open(O_WRONLY) zeroes
|
||||
* and frees the saved copy of applied microcode.
|
||||
* 1.03 29 Feb 2000, Tigran Aivazian <tigran@sco.com>
|
||||
* Made to use devfs (/dev/cpu/microcode) + cleanups.
|
||||
* 1.04 06 Jun 2000, Simon Trimmer <simon@veritas.com>
|
||||
* Added misc device support (now uses both devfs and misc).
|
||||
* Added MICROCODE_IOCFREE ioctl to clear memory.
|
||||
* 1.05 09 Jun 2000, Simon Trimmer <simon@veritas.com>
|
||||
* Messages for error cases (non Intel & no suitable microcode).
|
||||
* 1.06 03 Aug 2000, Tigran Aivazian <tigran@veritas.com>
|
||||
* Removed ->release(). Removed exclusive open and status bitmap.
|
||||
* Added microcode_rwsem to serialize read()/write()/ioctl().
|
||||
* Removed global kernel lock usage.
|
||||
* 1.07 07 Sep 2000, Tigran Aivazian <tigran@veritas.com>
|
||||
* Write 0 to 0x8B msr and then cpuid before reading revision,
|
||||
* so that it works even if there were no update done by the
|
||||
* BIOS. Otherwise, reading from 0x8B gives junk (which happened
|
||||
* to be 0 on my machine which is why it worked even when I
|
||||
* disabled update by the BIOS)
|
||||
* Thanks to Eric W. Biederman <ebiederman@lnxi.com> for the fix.
|
||||
* 1.08 11 Dec 2000, Richard Schaal <richard.schaal@intel.com> and
|
||||
* Tigran Aivazian <tigran@veritas.com>
|
||||
* Intel Pentium 4 processor support and bugfixes.
|
||||
* 1.09 30 Oct 2001, Tigran Aivazian <tigran@veritas.com>
|
||||
* Bugfix for HT (Hyper-Threading) enabled processors
|
||||
* whereby processor resources are shared by all logical processors
|
||||
* in a single CPU package.
|
||||
* 1.10 28 Feb 2002 Asit K Mallick <asit.k.mallick@intel.com> and
|
||||
* Tigran Aivazian <tigran@veritas.com>,
|
||||
* Serialize updates as required on HT processors due to
|
||||
* speculative nature of implementation.
|
||||
* 1.11 22 Mar 2002 Tigran Aivazian <tigran@veritas.com>
|
||||
* Fix the panic when writing zero-length microcode chunk.
|
||||
* 1.12 29 Sep 2003 Nitin Kamble <nitin.a.kamble@intel.com>,
|
||||
* Jun Nakajima <jun.nakajima@intel.com>
|
||||
* Support for the microcode updates in the new format.
|
||||
* 1.13 10 Oct 2003 Tigran Aivazian <tigran@veritas.com>
|
||||
* Removed ->read() method and obsoleted MICROCODE_IOCFREE ioctl
|
||||
* because we no longer hold a copy of applied microcode
|
||||
* in kernel memory.
|
||||
* 1.14 25 Jun 2004 Tigran Aivazian <tigran@veritas.com>
|
||||
* Fix sigmatch() macro to handle old CPUs with pf == 0.
|
||||
* Thanks to Stuart Swales for pointing out this bug.
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version
|
||||
* 2 of the License, or (at your option) any later version.
|
||||
*/
|
||||
|
||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||
|
@ -3,6 +3,7 @@
|
||||
*
|
||||
* Copyright (C) 2012 Fenghua Yu <fenghua.yu@intel.com>
|
||||
* H Peter Anvin" <hpa@zytor.com>
|
||||
* (C) 2015 Borislav Petkov <bp@alien8.de>
|
||||
*
|
||||
* This driver allows to early upgrade microcode on Intel processors
|
||||
* belonging to IA-32 family - PentiumPro, Pentium II,
|
||||
@ -17,6 +18,7 @@
|
||||
* 2 of the License, or (at your option) any later version.
|
||||
*/
|
||||
#include <linux/module.h>
|
||||
#include <linux/firmware.h>
|
||||
#include <asm/microcode.h>
|
||||
#include <asm/microcode_intel.h>
|
||||
#include <asm/microcode_amd.h>
|
||||
@ -43,9 +45,29 @@ static bool __init check_loader_disabled_bsp(void)
|
||||
return *res;
|
||||
}
|
||||
|
||||
extern struct builtin_fw __start_builtin_fw[];
|
||||
extern struct builtin_fw __end_builtin_fw[];
|
||||
|
||||
bool get_builtin_firmware(struct cpio_data *cd, const char *name)
|
||||
{
|
||||
#ifdef CONFIG_FW_LOADER
|
||||
struct builtin_fw *b_fw;
|
||||
|
||||
for (b_fw = __start_builtin_fw; b_fw != __end_builtin_fw; b_fw++) {
|
||||
if (!strcmp(name, b_fw->name)) {
|
||||
cd->size = b_fw->size;
|
||||
cd->data = b_fw->data;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
|
||||
void __init load_ucode_bsp(void)
|
||||
{
|
||||
int vendor, family;
|
||||
int vendor;
|
||||
unsigned int family;
|
||||
|
||||
if (check_loader_disabled_bsp())
|
||||
return;
|
||||
@ -63,7 +85,7 @@ void __init load_ucode_bsp(void)
|
||||
break;
|
||||
case X86_VENDOR_AMD:
|
||||
if (family >= 0x10)
|
||||
load_ucode_amd_bsp();
|
||||
load_ucode_amd_bsp(family);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
@ -1,74 +1,13 @@
|
||||
/*
|
||||
* Intel CPU Microcode Update Driver for Linux
|
||||
* Intel CPU Microcode Update Driver for Linux
|
||||
*
|
||||
* Copyright (C) 2000-2006 Tigran Aivazian <tigran@aivazian.fsnet.co.uk>
|
||||
* 2006 Shaohua Li <shaohua.li@intel.com>
|
||||
* Copyright (C) 2000-2006 Tigran Aivazian <tigran@aivazian.fsnet.co.uk>
|
||||
* 2006 Shaohua Li <shaohua.li@intel.com>
|
||||
*
|
||||
* This driver allows to upgrade microcode on Intel processors
|
||||
* belonging to IA-32 family - PentiumPro, Pentium II,
|
||||
* Pentium III, Xeon, Pentium 4, etc.
|
||||
*
|
||||
* Reference: Section 8.11 of Volume 3a, IA-32 Intel? Architecture
|
||||
* Software Developer's Manual
|
||||
* Order Number 253668 or free download from:
|
||||
*
|
||||
* http://developer.intel.com/Assets/PDF/manual/253668.pdf
|
||||
*
|
||||
* For more information, go to http://www.urbanmyth.org/microcode
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version
|
||||
* 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* 1.0 16 Feb 2000, Tigran Aivazian <tigran@sco.com>
|
||||
* Initial release.
|
||||
* 1.01 18 Feb 2000, Tigran Aivazian <tigran@sco.com>
|
||||
* Added read() support + cleanups.
|
||||
* 1.02 21 Feb 2000, Tigran Aivazian <tigran@sco.com>
|
||||
* Added 'device trimming' support. open(O_WRONLY) zeroes
|
||||
* and frees the saved copy of applied microcode.
|
||||
* 1.03 29 Feb 2000, Tigran Aivazian <tigran@sco.com>
|
||||
* Made to use devfs (/dev/cpu/microcode) + cleanups.
|
||||
* 1.04 06 Jun 2000, Simon Trimmer <simon@veritas.com>
|
||||
* Added misc device support (now uses both devfs and misc).
|
||||
* Added MICROCODE_IOCFREE ioctl to clear memory.
|
||||
* 1.05 09 Jun 2000, Simon Trimmer <simon@veritas.com>
|
||||
* Messages for error cases (non Intel & no suitable microcode).
|
||||
* 1.06 03 Aug 2000, Tigran Aivazian <tigran@veritas.com>
|
||||
* Removed ->release(). Removed exclusive open and status bitmap.
|
||||
* Added microcode_rwsem to serialize read()/write()/ioctl().
|
||||
* Removed global kernel lock usage.
|
||||
* 1.07 07 Sep 2000, Tigran Aivazian <tigran@veritas.com>
|
||||
* Write 0 to 0x8B msr and then cpuid before reading revision,
|
||||
* so that it works even if there were no update done by the
|
||||
* BIOS. Otherwise, reading from 0x8B gives junk (which happened
|
||||
* to be 0 on my machine which is why it worked even when I
|
||||
* disabled update by the BIOS)
|
||||
* Thanks to Eric W. Biederman <ebiederman@lnxi.com> for the fix.
|
||||
* 1.08 11 Dec 2000, Richard Schaal <richard.schaal@intel.com> and
|
||||
* Tigran Aivazian <tigran@veritas.com>
|
||||
* Intel Pentium 4 processor support and bugfixes.
|
||||
* 1.09 30 Oct 2001, Tigran Aivazian <tigran@veritas.com>
|
||||
* Bugfix for HT (Hyper-Threading) enabled processors
|
||||
* whereby processor resources are shared by all logical processors
|
||||
* in a single CPU package.
|
||||
* 1.10 28 Feb 2002 Asit K Mallick <asit.k.mallick@intel.com> and
|
||||
* Tigran Aivazian <tigran@veritas.com>,
|
||||
* Serialize updates as required on HT processors due to
|
||||
* speculative nature of implementation.
|
||||
* 1.11 22 Mar 2002 Tigran Aivazian <tigran@veritas.com>
|
||||
* Fix the panic when writing zero-length microcode chunk.
|
||||
* 1.12 29 Sep 2003 Nitin Kamble <nitin.a.kamble@intel.com>,
|
||||
* Jun Nakajima <jun.nakajima@intel.com>
|
||||
* Support for the microcode updates in the new format.
|
||||
* 1.13 10 Oct 2003 Tigran Aivazian <tigran@veritas.com>
|
||||
* Removed ->read() method and obsoleted MICROCODE_IOCFREE ioctl
|
||||
* because we no longer hold a copy of applied microcode
|
||||
* in kernel memory.
|
||||
* 1.14 25 Jun 2004 Tigran Aivazian <tigran@veritas.com>
|
||||
* Fix sigmatch() macro to handle old CPUs with pf == 0.
|
||||
* Thanks to Stuart Swales for pointing out this bug.
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version
|
||||
* 2 of the License, or (at your option) any later version.
|
||||
*/
|
||||
|
||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||
@ -124,7 +63,7 @@ static int get_matching_mc(struct microcode_intel *mc_intel, int cpu)
|
||||
cpf = cpu_sig.pf;
|
||||
crev = cpu_sig.rev;
|
||||
|
||||
return get_matching_microcode(csig, cpf, crev, mc_intel);
|
||||
return has_newer_microcode(mc_intel, csig, cpf, crev);
|
||||
}
|
||||
|
||||
static int apply_microcode_intel(int cpu)
|
||||
@ -226,7 +165,7 @@ static enum ucode_state generic_load_microcode(int cpu, void *data, size_t size,
|
||||
|
||||
csig = uci->cpu_sig.sig;
|
||||
cpf = uci->cpu_sig.pf;
|
||||
if (get_matching_microcode(csig, cpf, new_rev, mc)) {
|
||||
if (has_newer_microcode(mc, csig, cpf, new_rev)) {
|
||||
vfree(new_mc);
|
||||
new_rev = mc_header.rev;
|
||||
new_mc = mc;
|
||||
|
@ -59,10 +59,10 @@ load_microcode_early(struct microcode_intel **saved,
|
||||
ucode_ptr = saved[i];
|
||||
mc_hdr = (struct microcode_header_intel *)ucode_ptr;
|
||||
|
||||
ret = get_matching_microcode(uci->cpu_sig.sig,
|
||||
uci->cpu_sig.pf,
|
||||
new_rev,
|
||||
ucode_ptr);
|
||||
ret = has_newer_microcode(ucode_ptr,
|
||||
uci->cpu_sig.sig,
|
||||
uci->cpu_sig.pf,
|
||||
new_rev);
|
||||
if (!ret)
|
||||
continue;
|
||||
|
||||
@ -246,7 +246,7 @@ static unsigned int _save_mc(struct microcode_intel **mc_saved,
|
||||
u8 *ucode_ptr, unsigned int num_saved)
|
||||
{
|
||||
struct microcode_header_intel *mc_hdr, *mc_saved_hdr;
|
||||
unsigned int sig, pf, new_rev;
|
||||
unsigned int sig, pf;
|
||||
int found = 0, i;
|
||||
|
||||
mc_hdr = (struct microcode_header_intel *)ucode_ptr;
|
||||
@ -255,14 +255,13 @@ static unsigned int _save_mc(struct microcode_intel **mc_saved,
|
||||
mc_saved_hdr = (struct microcode_header_intel *)mc_saved[i];
|
||||
sig = mc_saved_hdr->sig;
|
||||
pf = mc_saved_hdr->pf;
|
||||
new_rev = mc_hdr->rev;
|
||||
|
||||
if (!get_matching_sig(sig, pf, new_rev, ucode_ptr))
|
||||
if (!find_matching_signature(ucode_ptr, sig, pf))
|
||||
continue;
|
||||
|
||||
found = 1;
|
||||
|
||||
if (!revision_is_newer(mc_hdr, new_rev))
|
||||
if (mc_hdr->rev <= mc_saved_hdr->rev)
|
||||
continue;
|
||||
|
||||
/*
|
||||
@ -522,6 +521,27 @@ out:
|
||||
EXPORT_SYMBOL_GPL(save_mc_for_early);
|
||||
#endif
|
||||
|
||||
static bool __init load_builtin_intel_microcode(struct cpio_data *cp)
|
||||
{
|
||||
#ifdef CONFIG_X86_64
|
||||
unsigned int eax = 0x00000001, ebx, ecx = 0, edx;
|
||||
unsigned int family, model, stepping;
|
||||
char name[30];
|
||||
|
||||
native_cpuid(&eax, &ebx, &ecx, &edx);
|
||||
|
||||
family = __x86_family(eax);
|
||||
model = x86_model(eax);
|
||||
stepping = eax & 0xf;
|
||||
|
||||
sprintf(name, "intel-ucode/%02x-%02x-%02x", family, model, stepping);
|
||||
|
||||
return get_builtin_firmware(cp, name);
|
||||
#else
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
|
||||
static __initdata char ucode_name[] = "kernel/x86/microcode/GenuineIntel.bin";
|
||||
static __init enum ucode_state
|
||||
scan_microcode(struct mc_saved_data *mc_saved_data, unsigned long *initrd,
|
||||
@ -540,8 +560,10 @@ scan_microcode(struct mc_saved_data *mc_saved_data, unsigned long *initrd,
|
||||
cd.size = 0;
|
||||
|
||||
cd = find_cpio_data(p, (void *)start, size, &offset);
|
||||
if (!cd.data)
|
||||
return UCODE_ERROR;
|
||||
if (!cd.data) {
|
||||
if (!load_builtin_intel_microcode(&cd))
|
||||
return UCODE_ERROR;
|
||||
}
|
||||
|
||||
return get_matching_model_microcode(0, start, cd.data, cd.size,
|
||||
mc_saved_data, initrd, uci);
|
||||
|
@ -31,11 +31,18 @@
|
||||
#include <asm/processor.h>
|
||||
#include <asm/msr.h>
|
||||
|
||||
static inline int
|
||||
update_match_cpu(unsigned int csig, unsigned int cpf,
|
||||
unsigned int sig, unsigned int pf)
|
||||
static inline bool cpu_signatures_match(unsigned int s1, unsigned int p1,
|
||||
unsigned int s2, unsigned int p2)
|
||||
{
|
||||
return (!sigmatch(sig, csig, pf, cpf)) ? 0 : 1;
|
||||
if (s1 != s2)
|
||||
return false;
|
||||
|
||||
/* Processor flags are either both 0 ... */
|
||||
if (!p1 && !p2)
|
||||
return true;
|
||||
|
||||
/* ... or they intersect. */
|
||||
return p1 & p2;
|
||||
}
|
||||
|
||||
int microcode_sanity_check(void *mc, int print_err)
|
||||
@ -124,27 +131,25 @@ EXPORT_SYMBOL_GPL(microcode_sanity_check);
|
||||
/*
|
||||
* Returns 1 if update has been found, 0 otherwise.
|
||||
*/
|
||||
int get_matching_sig(unsigned int csig, int cpf, int rev, void *mc)
|
||||
int find_matching_signature(void *mc, unsigned int csig, int cpf)
|
||||
{
|
||||
struct microcode_header_intel *mc_header = mc;
|
||||
struct extended_sigtable *ext_header;
|
||||
unsigned long total_size = get_totalsize(mc_header);
|
||||
int ext_sigcount, i;
|
||||
struct microcode_header_intel *mc_hdr = mc;
|
||||
struct extended_sigtable *ext_hdr;
|
||||
struct extended_signature *ext_sig;
|
||||
int i;
|
||||
|
||||
if (update_match_cpu(csig, cpf, mc_header->sig, mc_header->pf))
|
||||
if (cpu_signatures_match(csig, cpf, mc_hdr->sig, mc_hdr->pf))
|
||||
return 1;
|
||||
|
||||
/* Look for ext. headers: */
|
||||
if (total_size <= get_datasize(mc_header) + MC_HEADER_SIZE)
|
||||
if (get_totalsize(mc_hdr) <= get_datasize(mc_hdr) + MC_HEADER_SIZE)
|
||||
return 0;
|
||||
|
||||
ext_header = mc + get_datasize(mc_header) + MC_HEADER_SIZE;
|
||||
ext_sigcount = ext_header->count;
|
||||
ext_sig = (void *)ext_header + EXT_HEADER_SIZE;
|
||||
ext_hdr = mc + get_datasize(mc_hdr) + MC_HEADER_SIZE;
|
||||
ext_sig = (void *)ext_hdr + EXT_HEADER_SIZE;
|
||||
|
||||
for (i = 0; i < ext_sigcount; i++) {
|
||||
if (update_match_cpu(csig, cpf, ext_sig->sig, ext_sig->pf))
|
||||
for (i = 0; i < ext_hdr->count; i++) {
|
||||
if (cpu_signatures_match(csig, cpf, ext_sig->sig, ext_sig->pf))
|
||||
return 1;
|
||||
ext_sig++;
|
||||
}
|
||||
@ -154,13 +159,13 @@ int get_matching_sig(unsigned int csig, int cpf, int rev, void *mc)
|
||||
/*
|
||||
* Returns 1 if update has been found, 0 otherwise.
|
||||
*/
|
||||
int get_matching_microcode(unsigned int csig, int cpf, int rev, void *mc)
|
||||
int has_newer_microcode(void *mc, unsigned int csig, int cpf, int new_rev)
|
||||
{
|
||||
struct microcode_header_intel *mc_hdr = mc;
|
||||
|
||||
if (!revision_is_newer(mc_hdr, rev))
|
||||
if (mc_hdr->rev <= new_rev)
|
||||
return 0;
|
||||
|
||||
return get_matching_sig(csig, cpf, rev, mc);
|
||||
return find_matching_signature(mc, csig, cpf);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(get_matching_microcode);
|
||||
EXPORT_SYMBOL_GPL(has_newer_microcode);
|
||||
|
Loading…
Reference in New Issue
Block a user