Re: [PATCH] x86: better CPU identification without the CPUID

Previous thread: [PATCH] anysee: initialize anysee_usb_mutex statically by Akinobu Mita on Saturday, September 13, 2008 - 3:08 am. (1 message)

Next thread: Stable regression: usb-storage is stuck in 2.6.26.5 by Michael Tokarev on Saturday, September 13, 2008 - 5:16 am. (8 messages)
From: Krzysztof Helt
Date: Saturday, September 13, 2008 - 3:56 am

From: Krzysztof Helt <krzysztof.h1@wp.pl>

cpus without the CPUID instruction are identified
as general 386 or 486 while some cpus (mostly made
by Cyrix) provide c_identify function which identify
correctly older cpus using cpu specific registers).

Cyrix cpus are even worse as 5x86 and 6x68 have
the CPUID instruction disabled. The CPUID is
enabled by the c_identify() but the c_identify
is only called when the CPUID is available.

Fix this by calling the c_identify() for all known
cpu families if there is no the CPUID instruction

Signed-off-by: Krzysztof Helt <krzysztof.h1@wp.pl>
---

I have tested it on Cyrix Cx486DX2 cpu.

I suspect that coma_bug field and mtrr support is not
set correctly for the Cyrix 6x86 family. I have not a cpu from
the Cyrix 6x68 family to test. 

The code path is (+ where the patch code is added)

if (have_cpuid_p()) {

}
+ } else {
...
+ }

so it does not affect cpus with the CPUID instruction.

Regards,
Krzysztof

diff -urp linux-mm/arch/x86/kernel/cpu/common.c linux-486/arch/x86/kernel/cpu/common.c
--- linux-mm/arch/x86/kernel/cpu/common.c	2008-09-05 23:38:20.295563396 +0200
+++ linux-486/arch/x86/kernel/cpu/common.c	2008-09-12 22:53:27.062265329 +0200
@@ -444,6 +444,17 @@ static void __cpuinit generic_identify(s
 
 		init_scattered_cpuid_features(c);
 		detect_nopl(c);
+	} else {
+		int i;
+		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, 0);
+					break;
+				}
+			}
 	}
 }
 
--

From: Yinghai Lu
Date: Saturday, September 13, 2008 - 9:43 pm

1. can you check tip/master?
2. please check if you can add code in early_identify_cpu
3. need to move c_identify_cpu calling to identify_cpu

YH
--

From: Yinghai Lu
Date: Saturday, September 13, 2008 - 10:55 pm

I updated it to tip/master and call that in early_identify_cpu. it
should solve mtrr detection for Cyrix ...

Please check attached patch.

Thanks

YH
From: Krzysztof Helt
Date: Sunday, September 14, 2008 - 1:30 am

On Sat, 13 Sep 2008 22:55:10 -0700


As I wrote I have no CPU to test this (Cyrix with ARRs). Finally, I am going
 to buy one or two of them during next two weeks so I will test.

I would like to postpone your patch until I (or someone else) test it.

There is some misunderstanding about the patch. There are two issues here.
The early enabling of mtrr registers and nicer and more accurate /proc/cpuinfo
content (and the CPU's name during boot). My patch was only about the latter.
It was not about the early identification or solving the mtrr problem (as without 
testing I am not sure I can correctly do this). Your patch resets the /proc/cpuinfo

One wants to call c_early_init() here for Cyrix cpus- otherwise 
the mtrr caps are not set. The correct patch here is only:

 -
 -	if (!have_cpuid_p())
 -		return;

- 	    cpu_detect(c);

+	if (!have_cpuid_p())
+		enable_cpuid_on_some_cpus(); /* pseudo code for now */

+	if (have_cpuid_p())
+ 	    cpu_detect(c);



I have just checked:
http://git.kernel.org/?p=linux/kernel/git/x86/linux-2.6-tip.git


The identify_cpu can stay the way it was. No changes here needed.
My patch improves the /proc/cpuinfo content. The next patch should
only enable the cpuid instruction on cyrix.

Regards,
Krzysztof
--

From: Yinghai Lu
Date: Sunday, September 14, 2008 - 2:01 am

could change to

if (!have_cpuid_p()) {
         identify_cpu_without_cpuid(c);

if (!have_cpuid_p())
         return;

cpu_detect(c);
get_cpu_vendor(c);
get_cpu_cap(c);

if (this_cpu->c_early_init)
 this_cpu->c_early_init(c);


tip/master is changed a lot to mainline.

YH
--

From: Yinghai Lu
Date: Sunday, September 14, 2008 - 2:16 am

please check v2 in another mail.

YH
--

Previous thread: [PATCH] anysee: initialize anysee_usb_mutex statically by Akinobu Mita on Saturday, September 13, 2008 - 3:08 am. (1 message)

Next thread: Stable regression: usb-storage is stuck in 2.6.26.5 by Michael Tokarev on Saturday, September 13, 2008 - 5:16 am. (8 messages)