From: Linus Torvalds Date: Thu, 21 Oct 2010 20:18:36 +0000 (-0700) Subject: Merge branch 'x86-cpu-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git... X-Git-Tag: v2.6.37-rc1~208 X-Git-Url: https://git.openpandora.org/cgi-bin/gitweb.cgi?p=pandora-kernel.git;a=commitdiff_plain;h=bf70030dc0b031f000c74721f2e9c88686b7da6d;hp=-c Merge branch 'x86-cpu-for-linus' of git://git./linux/kernel/git/tip/linux-2.6-tip * 'x86-cpu-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: x86, cpu: Fix X86_FEATURE_NOPL x86, cpu: Re-run get_cpu_cap() after adjusting the CPUID level --- bf70030dc0b031f000c74721f2e9c88686b7da6d diff --combined arch/x86/kernel/cpu/common.c index 15c671385f59,927e630aeaf3..92af7b420ab2 --- a/arch/x86/kernel/cpu/common.c +++ b/arch/x86/kernel/cpu/common.c @@@ -665,7 -665,7 +665,7 @@@ static void __init early_identify_cpu(s this_cpu->c_early_init(c); #ifdef CONFIG_SMP - c->cpu_index = boot_cpu_id; + c->cpu_index = 0; #endif filter_cpuid_features(c, false); } @@@ -704,16 -704,21 +704,21 @@@ void __init early_cpu_init(void } /* - * The NOPL instruction is supposed to exist on all CPUs with - * family >= 6; unfortunately, that's not true in practice because - * of early VIA chips and (more importantly) broken virtualizers that - * are not easy to detect. In the latter case it doesn't even *fail* - * reliably, so probing for it doesn't even work. Disable it completely + * The NOPL instruction is supposed to exist on all CPUs of family >= 6; + * unfortunately, that's not true in practice because of early VIA + * chips and (more importantly) broken virtualizers that are not easy + * to detect. In the latter case it doesn't even *fail* reliably, so + * probing for it doesn't even work. Disable it completely on 32-bit * unless we can find a reliable way to detect all the broken cases. + * Enable it explicitly on 64-bit for non-constant inputs of cpu_has(). */ static void __cpuinit detect_nopl(struct cpuinfo_x86 *c) { + #ifdef CONFIG_X86_32 clear_cpu_cap(c, X86_FEATURE_NOPL); + #else + set_cpu_cap(c, X86_FEATURE_NOPL); + #endif } static void __cpuinit generic_identify(struct cpuinfo_x86 *c) diff --combined arch/x86/kernel/cpu/cpu.h index f668bb1f7d43,c16456bc11a7..e765633f210e --- a/arch/x86/kernel/cpu/cpu.h +++ b/arch/x86/kernel/cpu/cpu.h @@@ -32,7 -32,7 +32,8 @@@ struct cpu_dev extern const struct cpu_dev *const __x86_cpu_dev_start[], *const __x86_cpu_dev_end[]; + extern void get_cpu_cap(struct cpuinfo_x86 *c); extern void cpu_detect_cache_sizes(struct cpuinfo_x86 *c); +extern void get_cpu_cap(struct cpuinfo_x86 *c); #endif