| From bc3afdddf0f2ea65e10c7353468f2ec7aea12ef9 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Fri, 21 Sep 2018 17:20:41 -0400 |
| Subject: x86/CPU: Change query logic so CPUID is enabled before testing |
| |
| From: Matthew Whitehead <tedheadster@gmail.com> |
| |
| [ Upstream commit 2893cc8ff892fa74972d8dc0e1d0dc65116daaa3 ] |
| |
| Presently we check first if CPUID is enabled. If it is not already |
| enabled, then we next call identify_cpu_without_cpuid() and clear |
| X86_FEATURE_CPUID. |
| |
| Unfortunately, identify_cpu_without_cpuid() is the function where CPUID |
| becomes _enabled_ on Cyrix 6x86/6x86L CPUs. |
| |
| Reverse the calling sequence so that CPUID is first enabled, and then |
| check a second time to see if the feature has now been activated. |
| |
| [ bp: Massage commit message and remove trailing whitespace. ] |
| |
| Suggested-by: Andy Lutomirski <luto@amacapital.net> |
| Signed-off-by: Matthew Whitehead <tedheadster@gmail.com> |
| Signed-off-by: Borislav Petkov <bp@suse.de> |
| Reviewed-by: Andy Lutomirski <luto@amacapital.net> |
| Cc: David Woodhouse <dwmw@amazon.co.uk> |
| Cc: H. Peter Anvin <hpa@zytor.com> |
| Cc: Ingo Molnar <mingo@kernel.org> |
| Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> |
| Cc: Peter Zijlstra <peterz@infradead.org> |
| Cc: Thomas Gleixner <tglx@linutronix.de> |
| Link: http://lkml.kernel.org/r/20180921212041.13096-3-tedheadster@gmail.com |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| arch/x86/kernel/cpu/common.c | 4 +++- |
| 1 file changed, 3 insertions(+), 1 deletion(-) |
| |
| diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c |
| index 1e07814f02bc6..a6458ab499c21 100644 |
| --- a/arch/x86/kernel/cpu/common.c |
| +++ b/arch/x86/kernel/cpu/common.c |
| @@ -1133,6 +1133,9 @@ static void __init early_identify_cpu(struct cpuinfo_x86 *c) |
| memset(&c->x86_capability, 0, sizeof c->x86_capability); |
| c->extended_cpuid_level = 0; |
| |
| + if (!have_cpuid_p()) |
| + identify_cpu_without_cpuid(c); |
| + |
| /* cyrix could have cpuid enabled via c_identify()*/ |
| if (have_cpuid_p()) { |
| cpu_detect(c); |
| @@ -1150,7 +1153,6 @@ static void __init early_identify_cpu(struct cpuinfo_x86 *c) |
| if (this_cpu->c_bsp_init) |
| this_cpu->c_bsp_init(c); |
| } else { |
| - identify_cpu_without_cpuid(c); |
| setup_clear_cpu_cap(X86_FEATURE_CPUID); |
| } |
| |
| -- |
| 2.20.1 |
| |