Commit 75478ebe authored by Zwane Mwaikambo's avatar Zwane Mwaikambo Committed by Linus Torvalds

[PATCH] Cyrix MII cpuid returns stale %ecx

This patch is for the following bug, thanks to Ondrej Zary for reporting,
testing and submitting a patch.

http://bugzilla.kernel.org/show_bug.cgi?id=3767

It appears that the Cyrix MII won't touch %ecx at all resulting in stale
data being returned as extended attributes, so clear ecx before issuing the
cpuid.  I have also made the capability print code display all the
capability words for easier debugging in future.
Signed-off-by: default avatarZwane Mwaikambo <zwane@linuxpower.ca>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent a9d72e63
...@@ -334,21 +334,19 @@ void __init identify_cpu(struct cpuinfo_x86 *c) ...@@ -334,21 +334,19 @@ void __init identify_cpu(struct cpuinfo_x86 *c)
generic_identify(c); generic_identify(c);
printk(KERN_DEBUG "CPU: After generic identify, caps: %08lx %08lx %08lx %08lx\n", printk(KERN_DEBUG "CPU: After generic identify, caps:");
c->x86_capability[0], for (i = 0; i < NCAPINTS; i++)
c->x86_capability[1], printk(" %08lx", c->x86_capability[i]);
c->x86_capability[2], printk("\n");
c->x86_capability[3]);
if (this_cpu->c_identify) { if (this_cpu->c_identify) {
this_cpu->c_identify(c); this_cpu->c_identify(c);
printk(KERN_DEBUG "CPU: After vendor identify, caps: %08lx %08lx %08lx %08lx\n", printk(KERN_DEBUG "CPU: After vendor identify, caps:");
c->x86_capability[0], for (i = 0; i < NCAPINTS; i++)
c->x86_capability[1], printk(" %08lx", c->x86_capability[i]);
c->x86_capability[2], printk("\n");
c->x86_capability[3]); }
}
/* /*
* Vendor-specific initialization. In this section we * Vendor-specific initialization. In this section we
...@@ -398,11 +396,10 @@ void __init identify_cpu(struct cpuinfo_x86 *c) ...@@ -398,11 +396,10 @@ void __init identify_cpu(struct cpuinfo_x86 *c)
/* Now the feature flags better reflect actual CPU features! */ /* Now the feature flags better reflect actual CPU features! */
printk(KERN_DEBUG "CPU: After all inits, caps: %08lx %08lx %08lx %08lx\n", printk(KERN_DEBUG "CPU: After all inits, caps:");
c->x86_capability[0], for (i = 0; i < NCAPINTS; i++)
c->x86_capability[1], printk(" %08lx", c->x86_capability[i]);
c->x86_capability[2], printk("\n");
c->x86_capability[3]);
/* /*
* On SMP, boot_cpu_data holds the common feature set between * On SMP, boot_cpu_data holds the common feature set between
......
...@@ -126,6 +126,8 @@ extern void dodgy_tsc(void); ...@@ -126,6 +126,8 @@ extern void dodgy_tsc(void);
/* /*
* Generic CPUID function * Generic CPUID function
* clear %ecx since some cpus (Cyrix MII) do not set or clear %ecx
* resulting in stale register contents being returned.
*/ */
static inline void cpuid(int op, int *eax, int *ebx, int *ecx, int *edx) static inline void cpuid(int op, int *eax, int *ebx, int *ecx, int *edx)
{ {
...@@ -134,7 +136,7 @@ static inline void cpuid(int op, int *eax, int *ebx, int *ecx, int *edx) ...@@ -134,7 +136,7 @@ static inline void cpuid(int op, int *eax, int *ebx, int *ecx, int *edx)
"=b" (*ebx), "=b" (*ebx),
"=c" (*ecx), "=c" (*ecx),
"=d" (*edx) "=d" (*edx)
: "0" (op)); : "0" (op), "c"(0));
} }
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment