comparison cpudetect.c @ 2288:dac462a0ac8c

final fix?
author arpi
date Fri, 19 Oct 2001 14:02:12 +0000
parents 0c5fea3a0b91
children b4c4c832cce7
comparison
equal deleted inserted replaced
2287:69157262ca34 2288:dac462a0ac8c
84 { 84 {
85 unsigned int regs[4]; 85 unsigned int regs[4];
86 unsigned int regs2[4]; 86 unsigned int regs2[4];
87 87
88 bzero(caps, sizeof(*caps)); 88 bzero(caps, sizeof(*caps));
89 printf("CPUid available: %s\n",has_cpuid()?"yes":"no"); 89 if (!has_cpuid()) {
90 /*if (!has_cpuid()) 90 printf("CPUID not supported!???\n");
91 return;*/ 91 return;
92 do_cpuid(0x00000000, regs); 92 }
93 printf("CPU vendor name: %.4s%.4s%.4s cpuid level: %d\n",&regs[1],&regs[3],&regs[2],regs[0]); 93 do_cpuid(0x00000000, regs); // get _max_ cpuid level and vendor name
94 if (regs[0]>0x00000001) 94 printf("CPU vendor name: %.4s%.4s%.4s max cpuid level: %d\n",&regs[1],&regs[3],&regs[2],regs[0]);
95 if (regs[0]>=0x00000001)
95 { 96 {
96 do_cpuid(0x00000001, regs2); 97 do_cpuid(0x00000001, regs2);
97 printf("CPU family: %d\n",(regs2[0] >> 8)&0xf); 98 caps->cpuType=(regs2[0] >> 8)&0xf;
98 switch ((regs2[0] >> 8)&0xf) { 99 if(caps->cpuType==0xf){
99 case 3: 100 // use extended family (P4, IA64)
100 caps->cpuType=CPUTYPE_I386; 101 caps->cpuType=8+((regs2[0]>>20)&255);
101 break;
102 case 4:
103 caps->cpuType=CPUTYPE_I486;
104 break;
105 case 5:
106 caps->cpuType=CPUTYPE_I586;
107 break;
108 case 6:
109 caps->cpuType=CPUTYPE_I686;
110 break;
111 default:
112 caps->cpuType=CPUTYPE_I386;
113 printf("Unknown cpu type, default to i386\n");
114 break;
115 } 102 }
103
104 // general feature flags:
116 caps->hasMMX = (regs2[3] & (1 << 23 )) >> 23; // 0x0800000 105 caps->hasMMX = (regs2[3] & (1 << 23 )) >> 23; // 0x0800000
117
118 // FIXME: is this ok for non-intel CPUs too? (cyrix,amd)
119 caps->hasSSE = (regs2[3] & (1 << 25 )) >> 25; // 0x2000000 106 caps->hasSSE = (regs2[3] & (1 << 25 )) >> 25; // 0x2000000
120 caps->hasSSE2 = (regs2[3] & (1 << 26 )) >> 26; // 0x4000000 107 caps->hasSSE2 = (regs2[3] & (1 << 26 )) >> 26; // 0x4000000
121 /* FIXME: Does SSE2 need more OS support, too? */ 108 caps->hasMMX2 = caps->hasSSE; // SSE cpus supports mmxext too
122 #if defined(__linux__) || defined(__FreeBSD__)
123 if (caps->hasSSE)
124 check_os_katmai_support();
125 if (!caps->hasSSE)
126 caps->hasSSE2 = 0;
127 #else
128 caps->hasSSE=0;
129 caps->hasSSE2 = 0;
130 #endif
131 /* FIXME: Are MMX2 ops on the same set of processors as SSE? Do they need OS support?*/
132 caps->hasMMX2 = caps->hasSSE;
133 } 109 }
134 if (regs[1] == 0x68747541 && // AuthenticAMD 110 do_cpuid(0x80000000, regs);
135 regs[3] == 0x69746e65 && 111 if (regs[0]>=0x80000001) {
136 regs[2] == 0x444d4163) { 112 printf("extended cpuid-level: %d\n",regs[0]&0x7FFFFFFF);
137 do_cpuid(0x00000001, regs2); 113 do_cpuid(0x80000001, regs2);
138 printf("CPU family: %d\n",(regs2[0] >> 8)&0xf); 114 caps->hasMMX = (regs2[3] & (1 << 23 )) >> 23; // 0x0800000
139 switch ((regs2[0] >> 8)&0xf) { 115 caps->hasMMX2 = (regs2[3] & (1 << 22 )) >> 22; // 0x400000
140 case 3: 116 caps->has3DNow = (regs2[3] & (1 << 31 )) >> 31; //0x80000000
141 caps->cpuType=CPUTYPE_I386; 117 caps->has3DNowExt = (regs2[3] & (1 << 30 )) >> 30;
142 break;
143 case 4:
144 caps->cpuType=CPUTYPE_I486;
145 break;
146 case 5:
147 caps->cpuType=CPUTYPE_I586;
148 break;
149 case 6:
150 caps->cpuType=CPUTYPE_I686;
151 break;
152 default:
153 caps->cpuType=CPUTYPE_I386;
154 printf("Unknown cpu type, default to i386\n");
155 break;
156 }
157 do_cpuid(0x80000000, regs);
158 printf("AMD cpuid-level: 0x%X\n",regs[0]);
159 if (regs[0]>=0x80000001) {
160 do_cpuid(0x80000001, regs2);
161 caps->hasMMX = (regs2[3] & (1 << 23 )) >> 23; // 0x0800000
162 caps->hasMMX2 = (regs2[3] & (1 << 22 )) >> 22; // 0x400000
163 caps->has3DNow = (regs2[3] & (1 << 31 )) >> 31; //0x80000000
164 caps->has3DNowExt = (regs2[3] & (1 << 30 )) >> 30;
165 }
166 } 118 }
167 #if 0 119 #if 0
168 printf("cpudetect: MMX=%d MMX2=%d SSE=%d SSE2=%d 3DNow=%d 3DNowExt=%d\n", 120 printf("cpudetect: MMX=%d MMX2=%d SSE=%d SSE2=%d 3DNow=%d 3DNowExt=%d\n",
169 gCpuCaps.hasMMX, 121 gCpuCaps.hasMMX,
170 gCpuCaps.hasMMX2, 122 gCpuCaps.hasMMX2,
171 gCpuCaps.hasSSE, 123 gCpuCaps.hasSSE,
172 gCpuCaps.hasSSE2, 124 gCpuCaps.hasSSE2,
173 gCpuCaps.has3DNow, 125 gCpuCaps.has3DNow,
174 gCpuCaps.has3DNowExt ); 126 gCpuCaps.has3DNowExt );
175 #endif 127 #endif
128
129 /* FIXME: Does SSE2 need more OS support, too? */
130 #if defined(__linux__) || defined(__FreeBSD__)
131 if (caps->hasSSE)
132 check_os_katmai_support();
133 if (!caps->hasSSE)
134 caps->hasSSE2 = 0;
135 #else
136 caps->hasSSE=0;
137 caps->hasSSE2 = 0;
138 #endif
139
176 140
177 } 141 }
178 142
179 #if defined(__linux__) && defined(_POSIX_SOURCE) && defined(X86_FXSR_MAGIC) 143 #if defined(__linux__) && defined(_POSIX_SOURCE) && defined(X86_FXSR_MAGIC)
180 static void sigill_handler_sse( int signal, struct sigcontext sc ) 144 static void sigill_handler_sse( int signal, struct sigcontext sc )