diff options
| -rw-r--r-- | arch/x86/kernel/cpu/common.c | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c index f2f9ac7da25c..927e630aeaf3 100644 --- a/arch/x86/kernel/cpu/common.c +++ b/arch/x86/kernel/cpu/common.c | |||
| @@ -704,16 +704,21 @@ void __init early_cpu_init(void) | |||
| 704 | } | 704 | } |
| 705 | 705 | ||
| 706 | /* | 706 | /* |
| 707 | * The NOPL instruction is supposed to exist on all CPUs with | 707 | * The NOPL instruction is supposed to exist on all CPUs of family >= 6; |
| 708 | * family >= 6; unfortunately, that's not true in practice because | 708 | * unfortunately, that's not true in practice because of early VIA |
| 709 | * of early VIA chips and (more importantly) broken virtualizers that | 709 | * chips and (more importantly) broken virtualizers that are not easy |
| 710 | * are not easy to detect. In the latter case it doesn't even *fail* | 710 | * to detect. In the latter case it doesn't even *fail* reliably, so |
| 711 | * reliably, so probing for it doesn't even work. Disable it completely | 711 | * probing for it doesn't even work. Disable it completely on 32-bit |
| 712 | * unless we can find a reliable way to detect all the broken cases. | 712 | * unless we can find a reliable way to detect all the broken cases. |
| 713 | * Enable it explicitly on 64-bit for non-constant inputs of cpu_has(). | ||
| 713 | */ | 714 | */ |
| 714 | static void __cpuinit detect_nopl(struct cpuinfo_x86 *c) | 715 | static void __cpuinit detect_nopl(struct cpuinfo_x86 *c) |
| 715 | { | 716 | { |
| 717 | #ifdef CONFIG_X86_32 | ||
| 716 | clear_cpu_cap(c, X86_FEATURE_NOPL); | 718 | clear_cpu_cap(c, X86_FEATURE_NOPL); |
| 719 | #else | ||
| 720 | set_cpu_cap(c, X86_FEATURE_NOPL); | ||
| 721 | #endif | ||
| 717 | } | 722 | } |
| 718 | 723 | ||
| 719 | static void __cpuinit generic_identify(struct cpuinfo_x86 *c) | 724 | static void __cpuinit generic_identify(struct cpuinfo_x86 *c) |
