Re: Enhanced CPU detection

Michael Slater (slaterm@excel.tnet.com.au)
Fri, 6 Dec 1996 09:48:00 +0800 (WST)


I'll try it out, next time i build a new kernel, im running a Cyrix P120+
here, i'll let you know how it turns out.

Michael Slater
slaterm@tnet.com.au

On Mon, 2 Dec 1996, Clemens Huebner - Sun Germany Technical Solution Center - Munich wrote:

>
> 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,
>