Enhanced CPU detection

Clemens Huebner - Sun Germany Technical Solution Center - Munich (Clemens.Huebner@germany.sun.com)
Mon, 2 Dec 1996 18:01:36 +0100


Hi,

after all this discussion about CPU detection i revived an old patch i created against
1.3.95.
It streamlines the code quite a bit (in my opinion) and makes extensions trivial.

I'd be interested, if people with AMD or UMC Cpus would test this. There is no Cyrix
vendor line there, since i've never seen a Cyrix running Linux yet.

Clemens

--- linux-2.0.26/arch/i386/kernel/setup.c Fri Sep 20 16:00:34 1996
+++ linux/arch/i386/kernel/setup.c Sun Dec 1 14:55:06 1996
@@ -204,59 +204,6 @@
request_region(0xf0,0x10,"npu");
}

-static const char * i486model(unsigned int nr)
-{
- static const char *model[] = {
- "0","DX","SX","DX/2","4","SX/2","6","DX/2-WB","DX/4","DX/4-WB",
- "10","11","12","13","Am5x86-WT","Am5x86-WB"
- };
- if (nr < sizeof(model)/sizeof(char *))
- return model[nr];
- return NULL;
-}
-
-static const char * i586model(unsigned int nr)
-{
- static const char *model[] = {
- "0", "Pentium 60/66","Pentium 75+","OverDrive PODP5V83"
- };
- if (nr < sizeof(model)/sizeof(char *))
- return model[nr];
- return NULL;
-}
-
-static const char * i686model(unsigned int nr)
-{
- static const char *model[] = {
- "PPro A-step", "Pentium Pro"
- };
- if (nr < sizeof(model)/sizeof(char *))
- return model[nr];
- return NULL;
-}
-
-static const char * getmodel(int x86, int model)
-{
- const char *p = NULL;
- static char nbuf[12];
- switch (x86) {
- case 4:
- p = i486model(model);
- break;
- case 5:
- p = i586model(model);
- break;
- case 6:
- p = i686model(model);
- break;
- }
- if (p)
- return p;
-
- sprintf(nbuf, "%d", model);
- return nbuf;
-}
-
int get_cpuinfo(char * buffer)
{
int i, len = 0;
@@ -266,6 +213,30 @@
"16", "17", "18", "19", "20", "21", "22", "mmx",
"24", "25", "26", "27", "28", "29", "30", "31"
};
+
+ struct vendorinfo_t
+ {
+ char *vendor_id;
+ char x86_type;
+ char *model[16];
+ };
+ struct vendorinfo_t vendorinfo[] = {
+ {"GenuineIntel",4,{"0","DX","SX","DX/2-WT","4","SX/2",
+ "6","DX/2-WB","DX/4","DX/4-WB","A","B","C","D","E","F"}},
+ {"GenuineIntel",5,{"0","Pentium 60/66","Pentium 75+",
+ "OverDrive PODP5V83","4","5","6","7","8","9","A","B","C",
+ "D","E","F"}},
+ {"GenuineIntel",6,{"PPro A-step", "Pentium Pro","3","4","5",
+ "6","7","8","9","A","B","C","D","E","F"}},
+ {"AuthenticAMD",4,{"0","1","2","DX/2-WT","4","5","6","DX/2-WB",
+ "DX/4-WT","DX/4-WB","A","B","C","D","Am5x86-WT","Am5x86-WB"}},
+ {"UMCUMCUMCUMC",4,{"0","1","2","3","4","5","6","7","8",
+ "9","A","B","C","D","E","F"}},
+ {(char *)0,0,{"0","1","2","3","4","5","6","7","8","9",
+ "A","B","C","D","E","F"}}};
+
+ int vendor_nr;
+

#ifdef __SMP__
int n;
@@ -283,6 +254,23 @@
#define CD(X) (X)
#define CPUN 0
#endif
+ for(vendor_nr=0;vendorinfo[vendor_nr].vendor_id;
+ vendor_nr++)
+ {
+ int flag=1;
+ int j;
+ if(vendorinfo[vendor_nr].x86_type!=x86)
+ continue;
+ for(j=0;j<12;j++)
+ if(vendorinfo[vendor_nr].vendor_id[j]!=
+ x86_vendor_id[j])
+ {
+ flag=0;
+ break;
+ }
+ if(flag)
+ break;
+ }

len += sprintf(buffer+len,"processor\t: %d\n"
"cpu\t\t: %c86\n"
@@ -291,13 +279,13 @@
CPUN,
CD(x86)+'0',
CD(have_cpuid) ?
- getmodel(CD(x86), CD(x86_model)) :
- "unknown",
+ vendorinfo[vendor_nr].model[x86_model]
+ : "unknown",
CD(x86_vendor_id));

if (CD(x86_mask))
len += sprintf(buffer+len,
- "stepping\t: %d\n",
+ "stepping\t: %X\n",
CD(x86_mask));
else
len += sprintf(buffer+len,