[PATCH] x86: identify_cpu_without_cpuid need to call c_identify() for cpus without cpuid earlier... Signed-off-by: Yinghai Lu --- arch/x86/kernel/cpu/common.c | 63 +++++++++++++++++++++++++++---------------- 1 file changed, 40 insertions(+), 23 deletions(-) Index: linux-2.6/arch/x86/kernel/cpu/common.c =================================================================== --- linux-2.6.orig/arch/x86/kernel/cpu/common.c +++ linux-2.6/arch/x86/kernel/cpu/common.c @@ -485,6 +485,33 @@ static void __cpuinit get_cpu_cap(struct c->x86_power = cpuid_edx(0x80000007); } + +static void __cpuinit identify_cpu_without_cpuid(struct cpuinfo_x86 *c) +{ +#ifdef CONFIG_X86_32 + int i; + + /* + * First of all, decide if this is a 486 or higher + * It's a 486 if we can modify the AC flag + */ + if (flag_is_changeable_p(X86_EFLAGS_AC)) + c->x86 = 4; + else + c->x86 = 3; + + for (i = 0; i < X86_VENDOR_NUM; i++) + if (cpu_devs[i] && cpu_devs[i]->c_identify) { + c->x86_vendor_id[0] = 0; + cpu_devs[i]->c_identify(c); + if (c->x86_vendor_id[0]) { + get_cpu_vendor(c); + break; + } + } +#endif +} + /* * Do minimum CPU detection early. * Fields really needed: vendor, cpuid_level, family, model, mask, @@ -503,18 +530,17 @@ static void __init early_identify_cpu(st #endif c->x86_cache_alignment = c->x86_clflush_size; - if (!have_cpuid_p()) - return; - memset(&c->x86_capability, 0, sizeof c->x86_capability); - c->extended_cpuid_level = 0; - cpu_detect(c); - - get_cpu_vendor(c); - - get_cpu_cap(c); + if (!have_cpuid_p()) { + identify_cpu_without_cpuid(c); + return; + } else { + cpu_detect(c); + get_cpu_vendor(c); + get_cpu_cap(c); + } if (this_cpu->c_early_init) this_cpu->c_early_init(c); @@ -583,11 +609,13 @@ static void __cpuinit detect_nopl(struct static void __cpuinit generic_identify(struct cpuinfo_x86 *c) { - if (!have_cpuid_p()) - return; - c->extended_cpuid_level = 0; + if (!have_cpuid_p()) { + identify_cpu_without_cpuid(c); + return; + } + cpu_detect(c); get_cpu_vendor(c); @@ -639,17 +667,6 @@ static void __cpuinit identify_cpu(struc c->x86_cache_alignment = c->x86_clflush_size; memset(&c->x86_capability, 0, sizeof c->x86_capability); - if (!have_cpuid_p()) { - /* - * First of all, decide if this is a 486 or higher - * It's a 486 if we can modify the AC flag - */ - if (flag_is_changeable_p(X86_EFLAGS_AC)) - c->x86 = 4; - else - c->x86 = 3; - } - generic_identify(c); if (this_cpu->c_identify)