提交 35ffccdb 编写于 作者: L Linus Torvalds

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()
#ifndef _ASM_X86_MICROCODE_H #ifndef _ASM_X86_MICROCODE_H
#define _ASM_X86_MICROCODE_H #define _ASM_X86_MICROCODE_H
#include <linux/earlycpio.h>
#define native_rdmsr(msr, val1, val2) \ #define native_rdmsr(msr, val1, val2) \
do { \ do { \
u64 __val = native_read_msr((msr)); \ u64 __val = native_read_msr((msr)); \
...@@ -152,6 +154,7 @@ extern void __init load_ucode_bsp(void); ...@@ -152,6 +154,7 @@ extern void __init load_ucode_bsp(void);
extern void load_ucode_ap(void); extern void load_ucode_ap(void);
extern int __init save_microcode_in_initrd(void); extern int __init save_microcode_in_initrd(void);
void reload_early_microcode(void); void reload_early_microcode(void);
extern bool get_builtin_firmware(struct cpio_data *cd, const char *name);
#else #else
static inline void __init load_ucode_bsp(void) {} static inline void __init load_ucode_bsp(void) {}
static inline void load_ucode_ap(void) {} static inline void load_ucode_ap(void) {}
...@@ -160,6 +163,9 @@ static inline int __init save_microcode_in_initrd(void) ...@@ -160,6 +163,9 @@ static inline int __init save_microcode_in_initrd(void)
return 0; return 0;
} }
static inline void reload_early_microcode(void) {} static inline void reload_early_microcode(void) {}
static inline bool get_builtin_firmware(struct cpio_data *cd, const char *name)
{
return false;
}
#endif #endif
#endif /* _ASM_X86_MICROCODE_H */ #endif /* _ASM_X86_MICROCODE_H */
...@@ -65,12 +65,12 @@ extern enum ucode_state load_microcode_amd(int cpu, u8 family, const u8 *data, s ...@@ -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]; extern u8 amd_ucode_patch[PATCH_MAX_SIZE];
#ifdef CONFIG_MICROCODE_AMD_EARLY #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 void load_ucode_amd_ap(void);
extern int __init save_microcode_in_initrd_amd(void); extern int __init save_microcode_in_initrd_amd(void);
void reload_ucode_amd(void); void reload_ucode_amd(void);
#else #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 void load_ucode_amd_ap(void) {}
static inline int __init save_microcode_in_initrd_amd(void) { return -EINVAL; } static inline int __init save_microcode_in_initrd_amd(void) { return -EINVAL; }
void reload_ucode_amd(void) {} void reload_ucode_amd(void) {}
......
...@@ -51,20 +51,11 @@ struct extended_sigtable { ...@@ -51,20 +51,11 @@ struct extended_sigtable {
(((struct microcode_intel *)mc)->hdr.datasize ? \ (((struct microcode_intel *)mc)->hdr.datasize ? \
((struct microcode_intel *)mc)->hdr.datasize : DEFAULT_UCODE_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) #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 microcode_sanity_check(void *mc, int print_err);
extern int get_matching_sig(unsigned int csig, int cpf, int rev, void *mc); extern int find_matching_signature(void *mc, unsigned int csig, int cpf);
static inline int
revision_is_newer(struct microcode_header_intel *mc_header, int rev)
{
return (mc_header->rev <= rev) ? 0 : 1;
}
#ifdef CONFIG_MICROCODE_INTEL_EARLY #ifdef CONFIG_MICROCODE_INTEL_EARLY
extern void __init load_ucode_intel_bsp(void); 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) ...@@ -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; struct cpio_data cp;
void **data; void **data;
...@@ -243,8 +259,10 @@ void __init load_ucode_amd_bsp(void) ...@@ -243,8 +259,10 @@ void __init load_ucode_amd_bsp(void)
#endif #endif
cp = find_ucode_in_initrd(); cp = find_ucode_in_initrd();
if (!cp.data) if (!cp.data) {
return; if (!load_builtin_amd_microcode(&cp, family))
return;
}
*data = cp.data; *data = cp.data;
*size = cp.size; *size = cp.size;
......
/* /*
* Intel CPU Microcode Update Driver for Linux * CPU Microcode Update Driver for Linux
* *
* Copyright (C) 2000-2006 Tigran Aivazian <tigran@aivazian.fsnet.co.uk> * Copyright (C) 2000-2006 Tigran Aivazian <tigran@aivazian.fsnet.co.uk>
* 2006 Shaohua Li <shaohua.li@intel.com> * 2006 Shaohua Li <shaohua.li@intel.com>
* 2013-2015 Borislav Petkov <bp@alien8.de>
* *
* This driver allows to upgrade microcode on Intel processors * This driver allows to upgrade microcode on x86 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 * This program is free software; you can redistribute it and/or
* Software Developer's Manual * modify it under the terms of the GNU General Public License
* Order Number 253668 or free download from: * as published by the Free Software Foundation; either version
* * 2 of the License, or (at your option) any later version.
* 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.
*/ */
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
* *
* Copyright (C) 2012 Fenghua Yu <fenghua.yu@intel.com> * Copyright (C) 2012 Fenghua Yu <fenghua.yu@intel.com>
* H Peter Anvin" <hpa@zytor.com> * H Peter Anvin" <hpa@zytor.com>
* (C) 2015 Borislav Petkov <bp@alien8.de>
* *
* This driver allows to early upgrade microcode on Intel processors * This driver allows to early upgrade microcode on Intel processors
* belonging to IA-32 family - PentiumPro, Pentium II, * belonging to IA-32 family - PentiumPro, Pentium II,
...@@ -17,6 +18,7 @@ ...@@ -17,6 +18,7 @@
* 2 of the License, or (at your option) any later version. * 2 of the License, or (at your option) any later version.
*/ */
#include <linux/module.h> #include <linux/module.h>
#include <linux/firmware.h>
#include <asm/microcode.h> #include <asm/microcode.h>
#include <asm/microcode_intel.h> #include <asm/microcode_intel.h>
#include <asm/microcode_amd.h> #include <asm/microcode_amd.h>
...@@ -43,9 +45,29 @@ static bool __init check_loader_disabled_bsp(void) ...@@ -43,9 +45,29 @@ static bool __init check_loader_disabled_bsp(void)
return *res; 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) void __init load_ucode_bsp(void)
{ {
int vendor, family; int vendor;
unsigned int family;
if (check_loader_disabled_bsp()) if (check_loader_disabled_bsp())
return; return;
...@@ -63,7 +85,7 @@ void __init load_ucode_bsp(void) ...@@ -63,7 +85,7 @@ void __init load_ucode_bsp(void)
break; break;
case X86_VENDOR_AMD: case X86_VENDOR_AMD:
if (family >= 0x10) if (family >= 0x10)
load_ucode_amd_bsp(); load_ucode_amd_bsp(family);
break; break;
default: default:
break; break;
......
/* /*
* 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> * Copyright (C) 2000-2006 Tigran Aivazian <tigran@aivazian.fsnet.co.uk>
* 2006 Shaohua Li <shaohua.li@intel.com> * 2006 Shaohua Li <shaohua.li@intel.com>
* *
* This driver allows to upgrade microcode on Intel processors * This program is free software; you can redistribute it and/or
* belonging to IA-32 family - PentiumPro, Pentium II, * modify it under the terms of the GNU General Public License
* Pentium III, Xeon, Pentium 4, etc. * as published by the Free Software Foundation; either version
* * 2 of the License, or (at your option) any later version.
* 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.
*/ */
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
...@@ -124,7 +63,7 @@ static int get_matching_mc(struct microcode_intel *mc_intel, int cpu) ...@@ -124,7 +63,7 @@ static int get_matching_mc(struct microcode_intel *mc_intel, int cpu)
cpf = cpu_sig.pf; cpf = cpu_sig.pf;
crev = cpu_sig.rev; 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) 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, ...@@ -226,7 +165,7 @@ static enum ucode_state generic_load_microcode(int cpu, void *data, size_t size,
csig = uci->cpu_sig.sig; csig = uci->cpu_sig.sig;
cpf = uci->cpu_sig.pf; 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); vfree(new_mc);
new_rev = mc_header.rev; new_rev = mc_header.rev;
new_mc = mc; new_mc = mc;
......
...@@ -59,10 +59,10 @@ load_microcode_early(struct microcode_intel **saved, ...@@ -59,10 +59,10 @@ load_microcode_early(struct microcode_intel **saved,
ucode_ptr = saved[i]; ucode_ptr = saved[i];
mc_hdr = (struct microcode_header_intel *)ucode_ptr; mc_hdr = (struct microcode_header_intel *)ucode_ptr;
ret = get_matching_microcode(uci->cpu_sig.sig, ret = has_newer_microcode(ucode_ptr,
uci->cpu_sig.pf, uci->cpu_sig.sig,
new_rev, uci->cpu_sig.pf,
ucode_ptr); new_rev);
if (!ret) if (!ret)
continue; continue;
...@@ -246,7 +246,7 @@ static unsigned int _save_mc(struct microcode_intel **mc_saved, ...@@ -246,7 +246,7 @@ static unsigned int _save_mc(struct microcode_intel **mc_saved,
u8 *ucode_ptr, unsigned int num_saved) u8 *ucode_ptr, unsigned int num_saved)
{ {
struct microcode_header_intel *mc_hdr, *mc_saved_hdr; struct microcode_header_intel *mc_hdr, *mc_saved_hdr;
unsigned int sig, pf, new_rev; unsigned int sig, pf;
int found = 0, i; int found = 0, i;
mc_hdr = (struct microcode_header_intel *)ucode_ptr; mc_hdr = (struct microcode_header_intel *)ucode_ptr;
...@@ -255,14 +255,13 @@ static unsigned int _save_mc(struct microcode_intel **mc_saved, ...@@ -255,14 +255,13 @@ static unsigned int _save_mc(struct microcode_intel **mc_saved,
mc_saved_hdr = (struct microcode_header_intel *)mc_saved[i]; mc_saved_hdr = (struct microcode_header_intel *)mc_saved[i];
sig = mc_saved_hdr->sig; sig = mc_saved_hdr->sig;
pf = mc_saved_hdr->pf; 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; continue;
found = 1; found = 1;
if (!revision_is_newer(mc_hdr, new_rev)) if (mc_hdr->rev <= mc_saved_hdr->rev)
continue; continue;
/* /*
...@@ -522,6 +521,27 @@ int save_mc_for_early(u8 *mc) ...@@ -522,6 +521,27 @@ int save_mc_for_early(u8 *mc)
EXPORT_SYMBOL_GPL(save_mc_for_early); EXPORT_SYMBOL_GPL(save_mc_for_early);
#endif #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 __initdata char ucode_name[] = "kernel/x86/microcode/GenuineIntel.bin";
static __init enum ucode_state static __init enum ucode_state
scan_microcode(struct mc_saved_data *mc_saved_data, unsigned long *initrd, 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, ...@@ -540,8 +560,10 @@ scan_microcode(struct mc_saved_data *mc_saved_data, unsigned long *initrd,
cd.size = 0; cd.size = 0;
cd = find_cpio_data(p, (void *)start, size, &offset); cd = find_cpio_data(p, (void *)start, size, &offset);
if (!cd.data) if (!cd.data) {
return UCODE_ERROR; if (!load_builtin_intel_microcode(&cd))
return UCODE_ERROR;
}
return get_matching_model_microcode(0, start, cd.data, cd.size, return get_matching_model_microcode(0, start, cd.data, cd.size,
mc_saved_data, initrd, uci); mc_saved_data, initrd, uci);
......
...@@ -31,11 +31,18 @@ ...@@ -31,11 +31,18 @@
#include <asm/processor.h> #include <asm/processor.h>
#include <asm/msr.h> #include <asm/msr.h>
static inline int static inline bool cpu_signatures_match(unsigned int s1, unsigned int p1,
update_match_cpu(unsigned int csig, unsigned int cpf, unsigned int s2, unsigned int p2)
unsigned int sig, unsigned int pf)
{ {
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) int microcode_sanity_check(void *mc, int print_err)
...@@ -124,27 +131,25 @@ EXPORT_SYMBOL_GPL(microcode_sanity_check); ...@@ -124,27 +131,25 @@ EXPORT_SYMBOL_GPL(microcode_sanity_check);
/* /*
* Returns 1 if update has been found, 0 otherwise. * 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 microcode_header_intel *mc_hdr = mc;
struct extended_sigtable *ext_header; struct extended_sigtable *ext_hdr;
unsigned long total_size = get_totalsize(mc_header);
int ext_sigcount, i;
struct extended_signature *ext_sig; 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; return 1;
/* Look for ext. headers: */ /* 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; return 0;
ext_header = mc + get_datasize(mc_header) + MC_HEADER_SIZE; ext_hdr = mc + get_datasize(mc_hdr) + MC_HEADER_SIZE;
ext_sigcount = ext_header->count; ext_sig = (void *)ext_hdr + EXT_HEADER_SIZE;
ext_sig = (void *)ext_header + EXT_HEADER_SIZE;
for (i = 0; i < ext_sigcount; i++) { for (i = 0; i < ext_hdr->count; i++) {
if (update_match_cpu(csig, cpf, ext_sig->sig, ext_sig->pf)) if (cpu_signatures_match(csig, cpf, ext_sig->sig, ext_sig->pf))
return 1; return 1;
ext_sig++; ext_sig++;
} }
...@@ -154,13 +159,13 @@ int get_matching_sig(unsigned int csig, int cpf, int rev, void *mc) ...@@ -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. * 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; struct microcode_header_intel *mc_hdr = mc;
if (!revision_is_newer(mc_hdr, rev)) if (mc_hdr->rev <= new_rev)
return 0; 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);
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册