Mercurial > mplayer.hg
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",®s[1],®s[3],®s[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",®s[1],®s[3],®s[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 ) |