x86/microcode: Decrease CPUID use
Get CPUID(1).EAX value once per CPU and propagate value into the callers instead of conveniently calling it every time. Signed-off-by: Borislav Petkov <bp@suse.de> Reviewed-by: Thomas Gleixner <tglx@linutronix.de> Link: http://lkml.kernel.org/r/20170120202955.4091-9-bp@alien8.de Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
This commit is contained in:
committed by
Thomas Gleixner
parent
8801b3fcb5
commit
309aac7776
@@ -64,10 +64,6 @@ static DEFINE_MUTEX(microcode_mutex);
|
||||
|
||||
struct ucode_cpu_info ucode_cpu_info[NR_CPUS];
|
||||
|
||||
/*
|
||||
* Operations that are run on a target cpu:
|
||||
*/
|
||||
|
||||
struct cpu_info_ctx {
|
||||
struct cpu_signature *cpu_sig;
|
||||
int err;
|
||||
@@ -76,7 +72,6 @@ struct cpu_info_ctx {
|
||||
static bool __init check_loader_disabled_bsp(void)
|
||||
{
|
||||
static const char *__dis_opt_str = "dis_ucode_ldr";
|
||||
u32 a, b, c, d;
|
||||
|
||||
#ifdef CONFIG_X86_32
|
||||
const char *cmdline = (const char *)__pa_nodebug(boot_command_line);
|
||||
@@ -92,16 +87,12 @@ static bool __init check_loader_disabled_bsp(void)
|
||||
if (!have_cpuid_p())
|
||||
return *res;
|
||||
|
||||
a = 1;
|
||||
c = 0;
|
||||
native_cpuid(&a, &b, &c, &d);
|
||||
|
||||
/*
|
||||
* CPUID(1).ECX[31]: reserved for hypervisor use. This is still not
|
||||
* completely accurate as xen pv guests don't see that CPUID bit set but
|
||||
* that's good enough as they don't land on the BSP path anyway.
|
||||
*/
|
||||
if (c & BIT(31))
|
||||
if (native_cpuid_ecx(1) & BIT(31))
|
||||
return *res;
|
||||
|
||||
if (cmdline_find_option_bool(cmdline, option) <= 0)
|
||||
@@ -131,23 +122,22 @@ bool get_builtin_firmware(struct cpio_data *cd, const char *name)
|
||||
|
||||
void __init load_ucode_bsp(void)
|
||||
{
|
||||
int vendor;
|
||||
unsigned int family;
|
||||
unsigned int vendor, cpuid_1_eax;
|
||||
|
||||
if (check_loader_disabled_bsp())
|
||||
return;
|
||||
|
||||
vendor = x86_cpuid_vendor();
|
||||
family = x86_cpuid_family();
|
||||
vendor = x86_cpuid_vendor();
|
||||
cpuid_1_eax = native_cpuid_eax(1);
|
||||
|
||||
switch (vendor) {
|
||||
case X86_VENDOR_INTEL:
|
||||
if (family >= 6)
|
||||
if (x86_family(cpuid_1_eax) >= 6)
|
||||
load_ucode_intel_bsp();
|
||||
break;
|
||||
case X86_VENDOR_AMD:
|
||||
if (family >= 0x10)
|
||||
load_ucode_amd_bsp(family);
|
||||
if (x86_family(cpuid_1_eax) >= 0x10)
|
||||
load_ucode_amd_bsp(cpuid_1_eax);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -165,22 +155,22 @@ static bool check_loader_disabled_ap(void)
|
||||
|
||||
void load_ucode_ap(void)
|
||||
{
|
||||
int vendor, family;
|
||||
unsigned int vendor, cpuid_1_eax;
|
||||
|
||||
if (check_loader_disabled_ap())
|
||||
return;
|
||||
|
||||
vendor = x86_cpuid_vendor();
|
||||
family = x86_cpuid_family();
|
||||
vendor = x86_cpuid_vendor();
|
||||
cpuid_1_eax = native_cpuid_eax(1);
|
||||
|
||||
switch (vendor) {
|
||||
case X86_VENDOR_INTEL:
|
||||
if (family >= 6)
|
||||
if (x86_family(cpuid_1_eax) >= 6)
|
||||
load_ucode_intel_ap();
|
||||
break;
|
||||
case X86_VENDOR_AMD:
|
||||
if (family >= 0x10)
|
||||
load_ucode_amd_ap(family);
|
||||
if (x86_family(cpuid_1_eax) >= 0x10)
|
||||
load_ucode_amd_ap(cpuid_1_eax);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -198,7 +188,7 @@ static int __init save_microcode_in_initrd(void)
|
||||
break;
|
||||
case X86_VENDOR_AMD:
|
||||
if (c->x86 >= 0x10)
|
||||
return save_microcode_in_initrd_amd(c->x86);
|
||||
return save_microcode_in_initrd_amd(cpuid_eax(1));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user