annotate cpudetect.c @ 5950:184f37880f90

Darwin needs to run ranlib on any static lib before linking, we do this in this script just before the final linking.
author atmos4
date Fri, 03 May 2002 19:23:15 +0000
parents 4b18bf35f153
children 2f59920361ff
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2268
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
1 #include "config.h"
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
2 #include "cpudetect.h"
5937
4b18bf35f153 printf to mp_msg
albeu
parents: 4829
diff changeset
3 #include "mp_msg.h"
2268
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
4
3146
3164eaa93396 non x86 fix (otherwise we would need #ifdef ARCH_X86 around every if(gCpuCaps.has...))
michael
parents: 2417
diff changeset
5 CpuCaps gCpuCaps;
3164eaa93396 non x86 fix (otherwise we would need #ifdef ARCH_X86 around every if(gCpuCaps.has...))
michael
parents: 2417
diff changeset
6
3837
6659db99f200 warning fix
pl
parents: 3700
diff changeset
7 #ifdef HAVE_MALLOC_H
6659db99f200 warning fix
pl
parents: 3700
diff changeset
8 #include <malloc.h>
6659db99f200 warning fix
pl
parents: 3700
diff changeset
9 #endif
6659db99f200 warning fix
pl
parents: 3700
diff changeset
10 #include <stdlib.h>
6659db99f200 warning fix
pl
parents: 3700
diff changeset
11
2268
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
12 #ifdef ARCH_X86
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
13
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
14 #include <stdio.h>
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
15
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
16 #ifdef __FreeBSD__
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
17 #include <sys/types.h>
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
18 #include <sys/sysctl.h>
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
19 #endif
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
20
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
21 #ifdef __linux__
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
22 #include <signal.h>
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
23 #endif
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
24
2272
c26a9eff0993 cpu detection fixed
arpi
parents: 2268
diff changeset
25 //#define X86_FXSR_MAGIC
2268
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
26 /* Thanks to the FreeBSD project for some of this cpuid code, and
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
27 * help understanding how to use it. Thanks to the Mesa
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
28 * team for SSE support detection and more cpu detect code.
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
29 */
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
30
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
31 /* I believe this code works. However, it has only been used on a PII and PIII */
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
32
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
33 static void check_os_katmai_support( void );
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
34
2272
c26a9eff0993 cpu detection fixed
arpi
parents: 2268
diff changeset
35 #if 1
c26a9eff0993 cpu detection fixed
arpi
parents: 2268
diff changeset
36 // return TRUE if cpuid supported
2268
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
37 static int has_cpuid()
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
38 {
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
39 int a, c;
2272
c26a9eff0993 cpu detection fixed
arpi
parents: 2268
diff changeset
40
c26a9eff0993 cpu detection fixed
arpi
parents: 2268
diff changeset
41 // code from libavcodec:
c26a9eff0993 cpu detection fixed
arpi
parents: 2268
diff changeset
42 __asm__ __volatile__ (
c26a9eff0993 cpu detection fixed
arpi
parents: 2268
diff changeset
43 /* See if CPUID instruction is supported ... */
c26a9eff0993 cpu detection fixed
arpi
parents: 2268
diff changeset
44 /* ... Get copies of EFLAGS into eax and ecx */
c26a9eff0993 cpu detection fixed
arpi
parents: 2268
diff changeset
45 "pushf\n\t"
c26a9eff0993 cpu detection fixed
arpi
parents: 2268
diff changeset
46 "popl %0\n\t"
c26a9eff0993 cpu detection fixed
arpi
parents: 2268
diff changeset
47 "movl %0, %1\n\t"
c26a9eff0993 cpu detection fixed
arpi
parents: 2268
diff changeset
48
c26a9eff0993 cpu detection fixed
arpi
parents: 2268
diff changeset
49 /* ... Toggle the ID bit in one copy and store */
c26a9eff0993 cpu detection fixed
arpi
parents: 2268
diff changeset
50 /* to the EFLAGS reg */
c26a9eff0993 cpu detection fixed
arpi
parents: 2268
diff changeset
51 "xorl $0x200000, %0\n\t"
c26a9eff0993 cpu detection fixed
arpi
parents: 2268
diff changeset
52 "push %0\n\t"
c26a9eff0993 cpu detection fixed
arpi
parents: 2268
diff changeset
53 "popf\n\t"
c26a9eff0993 cpu detection fixed
arpi
parents: 2268
diff changeset
54
c26a9eff0993 cpu detection fixed
arpi
parents: 2268
diff changeset
55 /* ... Get the (hopefully modified) EFLAGS */
c26a9eff0993 cpu detection fixed
arpi
parents: 2268
diff changeset
56 "pushf\n\t"
c26a9eff0993 cpu detection fixed
arpi
parents: 2268
diff changeset
57 "popl %0\n\t"
c26a9eff0993 cpu detection fixed
arpi
parents: 2268
diff changeset
58 : "=a" (a), "=c" (c)
c26a9eff0993 cpu detection fixed
arpi
parents: 2268
diff changeset
59 :
c26a9eff0993 cpu detection fixed
arpi
parents: 2268
diff changeset
60 : "cc"
c26a9eff0993 cpu detection fixed
arpi
parents: 2268
diff changeset
61 );
c26a9eff0993 cpu detection fixed
arpi
parents: 2268
diff changeset
62
c26a9eff0993 cpu detection fixed
arpi
parents: 2268
diff changeset
63 return (a!=c);
2268
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
64 }
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
65 #endif
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
66
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
67 static void
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
68 do_cpuid(unsigned int ax, unsigned int *p)
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
69 {
2272
c26a9eff0993 cpu detection fixed
arpi
parents: 2268
diff changeset
70 #if 0
2268
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
71 __asm __volatile(
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
72 "cpuid;"
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
73 : "=a" (p[0]), "=b" (p[1]), "=c" (p[2]), "=d" (p[3])
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
74 : "0" (ax)
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
75 );
2272
c26a9eff0993 cpu detection fixed
arpi
parents: 2268
diff changeset
76 #else
c26a9eff0993 cpu detection fixed
arpi
parents: 2268
diff changeset
77 // code from libavcodec:
c26a9eff0993 cpu detection fixed
arpi
parents: 2268
diff changeset
78 __asm __volatile
c26a9eff0993 cpu detection fixed
arpi
parents: 2268
diff changeset
79 ("movl %%ebx, %%esi\n\t"
c26a9eff0993 cpu detection fixed
arpi
parents: 2268
diff changeset
80 "cpuid\n\t"
c26a9eff0993 cpu detection fixed
arpi
parents: 2268
diff changeset
81 "xchgl %%ebx, %%esi"
3403
c4ca766a2d05 added cpuStepping to CpuCaps struct (needed win32.c)
alex
parents: 3146
diff changeset
82 : "=a" (p[0]), "=S" (p[1]),
2272
c26a9eff0993 cpu detection fixed
arpi
parents: 2268
diff changeset
83 "=c" (p[2]), "=d" (p[3])
c26a9eff0993 cpu detection fixed
arpi
parents: 2268
diff changeset
84 : "0" (ax));
c26a9eff0993 cpu detection fixed
arpi
parents: 2268
diff changeset
85 #endif
c26a9eff0993 cpu detection fixed
arpi
parents: 2268
diff changeset
86
2268
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
87 }
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
88
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
89 void GetCpuCaps( CpuCaps *caps)
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
90 {
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
91 unsigned int regs[4];
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
92 unsigned int regs2[4];
3146
3164eaa93396 non x86 fix (otherwise we would need #ifdef ARCH_X86 around every if(gCpuCaps.has...))
michael
parents: 2417
diff changeset
93
3164eaa93396 non x86 fix (otherwise we would need #ifdef ARCH_X86 around every if(gCpuCaps.has...))
michael
parents: 2417
diff changeset
94 caps->isX86=1;
3164eaa93396 non x86 fix (otherwise we would need #ifdef ARCH_X86 around every if(gCpuCaps.has...))
michael
parents: 2417
diff changeset
95
3700
91f801a94a59 memset is more portable than bzero ("BSD"ism)
pl
parents: 3403
diff changeset
96 memset(caps, 0, sizeof(*caps));
2288
dac462a0ac8c final fix?
arpi
parents: 2284
diff changeset
97 if (!has_cpuid()) {
5937
4b18bf35f153 printf to mp_msg
albeu
parents: 4829
diff changeset
98 mp_msg(MSGT_CPUDETECT,MSGL_ERR,"CPUID not supported!???\n");
2288
dac462a0ac8c final fix?
arpi
parents: 2284
diff changeset
99 return;
dac462a0ac8c final fix?
arpi
parents: 2284
diff changeset
100 }
dac462a0ac8c final fix?
arpi
parents: 2284
diff changeset
101 do_cpuid(0x00000000, regs); // get _max_ cpuid level and vendor name
5937
4b18bf35f153 printf to mp_msg
albeu
parents: 4829
diff changeset
102 mp_msg(MSGT_CPUDETECT,MSGL_INFO,"CPU vendor name: %.4s%.4s%.4s max cpuid level: %d\n",
3837
6659db99f200 warning fix
pl
parents: 3700
diff changeset
103 (char*) (regs+1),(char*) (regs+3),(char*) (regs+2), regs[0]);
2288
dac462a0ac8c final fix?
arpi
parents: 2284
diff changeset
104 if (regs[0]>=0x00000001)
2280
b318387bfeda amd fix
pontscho
parents: 2272
diff changeset
105 {
2303
456e22bfb147 returns a malloc()'ed string instead of an auto char[]
pl
parents: 2301
diff changeset
106 char *tmpstr;
3146
3164eaa93396 non x86 fix (otherwise we would need #ifdef ARCH_X86 around every if(gCpuCaps.has...))
michael
parents: 2417
diff changeset
107
2268
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
108 do_cpuid(0x00000001, regs2);
2301
b4c4c832cce7 Detect and show cpu name.
atmos4
parents: 2288
diff changeset
109
2303
456e22bfb147 returns a malloc()'ed string instead of an auto char[]
pl
parents: 2301
diff changeset
110 tmpstr=GetCpuFriendlyName(regs, regs2);
5937
4b18bf35f153 printf to mp_msg
albeu
parents: 4829
diff changeset
111 mp_msg(MSGT_CPUDETECT,MSGL_INFO,"CPU: %s ",tmpstr);
2303
456e22bfb147 returns a malloc()'ed string instead of an auto char[]
pl
parents: 2301
diff changeset
112 free(tmpstr);
2301
b4c4c832cce7 Detect and show cpu name.
atmos4
parents: 2288
diff changeset
113
2288
dac462a0ac8c final fix?
arpi
parents: 2284
diff changeset
114 caps->cpuType=(regs2[0] >> 8)&0xf;
dac462a0ac8c final fix?
arpi
parents: 2284
diff changeset
115 if(caps->cpuType==0xf){
dac462a0ac8c final fix?
arpi
parents: 2284
diff changeset
116 // use extended family (P4, IA64)
dac462a0ac8c final fix?
arpi
parents: 2284
diff changeset
117 caps->cpuType=8+((regs2[0]>>20)&255);
2268
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
118 }
3403
c4ca766a2d05 added cpuStepping to CpuCaps struct (needed win32.c)
alex
parents: 3146
diff changeset
119 caps->cpuStepping=regs2[0] & 0xf;
5937
4b18bf35f153 printf to mp_msg
albeu
parents: 4829
diff changeset
120 mp_msg(MSGT_CPUDETECT,MSGL_INFO,"(Type: %d, Stepping: %d)\n",
3403
c4ca766a2d05 added cpuStepping to CpuCaps struct (needed win32.c)
alex
parents: 3146
diff changeset
121 caps->cpuType, caps->cpuStepping);
2288
dac462a0ac8c final fix?
arpi
parents: 2284
diff changeset
122
dac462a0ac8c final fix?
arpi
parents: 2284
diff changeset
123 // general feature flags:
2272
c26a9eff0993 cpu detection fixed
arpi
parents: 2268
diff changeset
124 caps->hasMMX = (regs2[3] & (1 << 23 )) >> 23; // 0x0800000
c26a9eff0993 cpu detection fixed
arpi
parents: 2268
diff changeset
125 caps->hasSSE = (regs2[3] & (1 << 25 )) >> 25; // 0x2000000
c26a9eff0993 cpu detection fixed
arpi
parents: 2268
diff changeset
126 caps->hasSSE2 = (regs2[3] & (1 << 26 )) >> 26; // 0x4000000
2288
dac462a0ac8c final fix?
arpi
parents: 2284
diff changeset
127 caps->hasMMX2 = caps->hasSSE; // SSE cpus supports mmxext too
dac462a0ac8c final fix?
arpi
parents: 2284
diff changeset
128 }
dac462a0ac8c final fix?
arpi
parents: 2284
diff changeset
129 do_cpuid(0x80000000, regs);
dac462a0ac8c final fix?
arpi
parents: 2284
diff changeset
130 if (regs[0]>=0x80000001) {
5937
4b18bf35f153 printf to mp_msg
albeu
parents: 4829
diff changeset
131 mp_msg(MSGT_CPUDETECT,MSGL_INFO,"extended cpuid-level: %d\n",regs[0]&0x7FFFFFFF);
2288
dac462a0ac8c final fix?
arpi
parents: 2284
diff changeset
132 do_cpuid(0x80000001, regs2);
3840
4ff660150386 Intel P4 support
arpi
parents: 3837
diff changeset
133 caps->hasMMX |= (regs2[3] & (1 << 23 )) >> 23; // 0x0800000
4ff660150386 Intel P4 support
arpi
parents: 3837
diff changeset
134 caps->hasMMX2 |= (regs2[3] & (1 << 22 )) >> 22; // 0x400000
2288
dac462a0ac8c final fix?
arpi
parents: 2284
diff changeset
135 caps->has3DNow = (regs2[3] & (1 << 31 )) >> 31; //0x80000000
dac462a0ac8c final fix?
arpi
parents: 2284
diff changeset
136 caps->has3DNowExt = (regs2[3] & (1 << 30 )) >> 30;
dac462a0ac8c final fix?
arpi
parents: 2284
diff changeset
137 }
dac462a0ac8c final fix?
arpi
parents: 2284
diff changeset
138 #if 0
5937
4b18bf35f153 printf to mp_msg
albeu
parents: 4829
diff changeset
139 mp_msg(MSGT_CPUDETECT,MSGL_INFO,"cpudetect: MMX=%d MMX2=%d SSE=%d SSE2=%d 3DNow=%d 3DNowExt=%d\n",
2288
dac462a0ac8c final fix?
arpi
parents: 2284
diff changeset
140 gCpuCaps.hasMMX,
dac462a0ac8c final fix?
arpi
parents: 2284
diff changeset
141 gCpuCaps.hasMMX2,
dac462a0ac8c final fix?
arpi
parents: 2284
diff changeset
142 gCpuCaps.hasSSE,
dac462a0ac8c final fix?
arpi
parents: 2284
diff changeset
143 gCpuCaps.hasSSE2,
dac462a0ac8c final fix?
arpi
parents: 2284
diff changeset
144 gCpuCaps.has3DNow,
dac462a0ac8c final fix?
arpi
parents: 2284
diff changeset
145 gCpuCaps.has3DNowExt );
dac462a0ac8c final fix?
arpi
parents: 2284
diff changeset
146 #endif
dac462a0ac8c final fix?
arpi
parents: 2284
diff changeset
147
2268
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
148 /* FIXME: Does SSE2 need more OS support, too? */
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
149 #if defined(__linux__) || defined(__FreeBSD__)
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
150 if (caps->hasSSE)
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
151 check_os_katmai_support();
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
152 if (!caps->hasSSE)
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
153 caps->hasSSE2 = 0;
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
154 #else
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
155 caps->hasSSE=0;
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
156 caps->hasSSE2 = 0;
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
157 #endif
3146
3164eaa93396 non x86 fix (otherwise we would need #ifdef ARCH_X86 around every if(gCpuCaps.has...))
michael
parents: 2417
diff changeset
158 // caps->has3DNow=1;
3164eaa93396 non x86 fix (otherwise we would need #ifdef ARCH_X86 around every if(gCpuCaps.has...))
michael
parents: 2417
diff changeset
159 // caps->hasMMX2 = 0;
3164eaa93396 non x86 fix (otherwise we would need #ifdef ARCH_X86 around every if(gCpuCaps.has...))
michael
parents: 2417
diff changeset
160 // caps->hasMMX = 0;
2268
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
161
4829
35ed5387b804 dont ignore --disable-mmx, ...
michael
parents: 3850
diff changeset
162 #ifndef HAVE_MMX
5937
4b18bf35f153 printf to mp_msg
albeu
parents: 4829
diff changeset
163 if(caps->hasMMX) mp_msg(MSGT_CPUDETECT,MSGL_INFO,"MMX supported but disabled\n");
4829
35ed5387b804 dont ignore --disable-mmx, ...
michael
parents: 3850
diff changeset
164 caps->hasMMX=0;
35ed5387b804 dont ignore --disable-mmx, ...
michael
parents: 3850
diff changeset
165 #endif
35ed5387b804 dont ignore --disable-mmx, ...
michael
parents: 3850
diff changeset
166 #ifndef HAVE_MMX2
5937
4b18bf35f153 printf to mp_msg
albeu
parents: 4829
diff changeset
167 if(caps->hasMMX2) mp_msg(MSGT_CPUDETECT,MSGL_INFO,"MMX2 supported but disabled\n");
4829
35ed5387b804 dont ignore --disable-mmx, ...
michael
parents: 3850
diff changeset
168 caps->hasMMX2=0;
35ed5387b804 dont ignore --disable-mmx, ...
michael
parents: 3850
diff changeset
169 #endif
35ed5387b804 dont ignore --disable-mmx, ...
michael
parents: 3850
diff changeset
170 #ifndef HAVE_SSE
5937
4b18bf35f153 printf to mp_msg
albeu
parents: 4829
diff changeset
171 if(caps->hasSSE) mp_msg(MSGT_CPUDETECT,MSGL_INFO,"SSE supported but disabled\n");
4829
35ed5387b804 dont ignore --disable-mmx, ...
michael
parents: 3850
diff changeset
172 caps->hasSSE=0;
35ed5387b804 dont ignore --disable-mmx, ...
michael
parents: 3850
diff changeset
173 #endif
35ed5387b804 dont ignore --disable-mmx, ...
michael
parents: 3850
diff changeset
174 #ifndef HAVE_SSE2
5937
4b18bf35f153 printf to mp_msg
albeu
parents: 4829
diff changeset
175 if(caps->hasSSE2) mp_msg(MSGT_CPUDETECT,MSGL_INFO,"SSE2 supported but disabled\n");
4829
35ed5387b804 dont ignore --disable-mmx, ...
michael
parents: 3850
diff changeset
176 caps->hasSSE2=0;
35ed5387b804 dont ignore --disable-mmx, ...
michael
parents: 3850
diff changeset
177 #endif
35ed5387b804 dont ignore --disable-mmx, ...
michael
parents: 3850
diff changeset
178 #ifndef HAVE_3DNOW
5937
4b18bf35f153 printf to mp_msg
albeu
parents: 4829
diff changeset
179 if(caps->has3DNow) mp_msg(MSGT_CPUDETECT,MSGL_INFO,"3DNow supported but disabled\n");
4829
35ed5387b804 dont ignore --disable-mmx, ...
michael
parents: 3850
diff changeset
180 caps->has3DNow=0;
35ed5387b804 dont ignore --disable-mmx, ...
michael
parents: 3850
diff changeset
181 #endif
35ed5387b804 dont ignore --disable-mmx, ...
michael
parents: 3850
diff changeset
182 #ifndef HAVE_3DNOWEX
5937
4b18bf35f153 printf to mp_msg
albeu
parents: 4829
diff changeset
183 if(caps->has3DNowExt) mp_msg(MSGT_CPUDETECT,MSGL_INFO,"3DNowExt supported but disabled\n");
4829
35ed5387b804 dont ignore --disable-mmx, ...
michael
parents: 3850
diff changeset
184 caps->has3DNowExt=0;
35ed5387b804 dont ignore --disable-mmx, ...
michael
parents: 3850
diff changeset
185 #endif
2268
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
186 }
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
187
2301
b4c4c832cce7 Detect and show cpu name.
atmos4
parents: 2288
diff changeset
188
b4c4c832cce7 Detect and show cpu name.
atmos4
parents: 2288
diff changeset
189 #define CPUID_EXTFAMILY ((regs2[0] >> 20)&0xFF) /* 27..20 */
b4c4c832cce7 Detect and show cpu name.
atmos4
parents: 2288
diff changeset
190 #define CPUID_EXTMODEL ((regs2[0] >> 16)&0x0F) /* 19..16 */
b4c4c832cce7 Detect and show cpu name.
atmos4
parents: 2288
diff changeset
191 #define CPUID_TYPE ((regs2[0] >> 12)&0x04) /* 13..12 */
b4c4c832cce7 Detect and show cpu name.
atmos4
parents: 2288
diff changeset
192 #define CPUID_FAMILY ((regs2[0] >> 8)&0x0F) /* 11..08 */
b4c4c832cce7 Detect and show cpu name.
atmos4
parents: 2288
diff changeset
193 #define CPUID_MODEL ((regs2[0] >> 4)&0x0F) /* 07..04 */
b4c4c832cce7 Detect and show cpu name.
atmos4
parents: 2288
diff changeset
194 #define CPUID_STEPPING ((regs2[0] >> 0)&0x0F) /* 03..00 */
b4c4c832cce7 Detect and show cpu name.
atmos4
parents: 2288
diff changeset
195
b4c4c832cce7 Detect and show cpu name.
atmos4
parents: 2288
diff changeset
196 char *GetCpuFriendlyName(unsigned int regs[], unsigned int regs2[]){
b4c4c832cce7 Detect and show cpu name.
atmos4
parents: 2288
diff changeset
197 #include "cputable.h" /* get cpuname and cpuvendors */
b4c4c832cce7 Detect and show cpu name.
atmos4
parents: 2288
diff changeset
198 char vendor[17];
2303
456e22bfb147 returns a malloc()'ed string instead of an auto char[]
pl
parents: 2301
diff changeset
199 char *retname;
2301
b4c4c832cce7 Detect and show cpu name.
atmos4
parents: 2288
diff changeset
200 int i;
b4c4c832cce7 Detect and show cpu name.
atmos4
parents: 2288
diff changeset
201
2417
6b4952e00ad0 removed warning
pl
parents: 2303
diff changeset
202 if (NULL==(retname=(char*)malloc(256))) {
5937
4b18bf35f153 printf to mp_msg
albeu
parents: 4829
diff changeset
203 mp_msg(MSGT_CPUDETECT,MSGL_FATAL,"Error: GetCpuFriendlyName() not enough memory\n");
2303
456e22bfb147 returns a malloc()'ed string instead of an auto char[]
pl
parents: 2301
diff changeset
204 exit(1);
456e22bfb147 returns a malloc()'ed string instead of an auto char[]
pl
parents: 2301
diff changeset
205 }
456e22bfb147 returns a malloc()'ed string instead of an auto char[]
pl
parents: 2301
diff changeset
206
3837
6659db99f200 warning fix
pl
parents: 3700
diff changeset
207 sprintf(vendor,"%.4s%.4s%.4s",(char*)(regs+1),(char*)(regs+3),(char*)(regs+2));
3146
3164eaa93396 non x86 fix (otherwise we would need #ifdef ARCH_X86 around every if(gCpuCaps.has...))
michael
parents: 2417
diff changeset
208
2301
b4c4c832cce7 Detect and show cpu name.
atmos4
parents: 2288
diff changeset
209 for(i=0; i<MAX_VENDORS; i++){
b4c4c832cce7 Detect and show cpu name.
atmos4
parents: 2288
diff changeset
210 if(!strcmp(cpuvendors[i].string,vendor)){
b4c4c832cce7 Detect and show cpu name.
atmos4
parents: 2288
diff changeset
211 if(cpuname[i][CPUID_FAMILY][CPUID_MODEL]){
2303
456e22bfb147 returns a malloc()'ed string instead of an auto char[]
pl
parents: 2301
diff changeset
212 snprintf(retname,255,"%s %s",cpuvendors[i].name,cpuname[i][CPUID_FAMILY][CPUID_MODEL]);
2301
b4c4c832cce7 Detect and show cpu name.
atmos4
parents: 2288
diff changeset
213 } else {
2303
456e22bfb147 returns a malloc()'ed string instead of an auto char[]
pl
parents: 2301
diff changeset
214 snprintf(retname,255,"unknown %s %d. Generation CPU",cpuvendors[i].name,CPUID_FAMILY);
5937
4b18bf35f153 printf to mp_msg
albeu
parents: 4829
diff changeset
215 mp_msg(MSGT_CPUDETECT,MSGL_WARN,"unknown %s CPU:\n",cpuvendors[i].name);
4b18bf35f153 printf to mp_msg
albeu
parents: 4829
diff changeset
216 mp_msg(MSGT_CPUDETECT,MSGL_WARN,"Vendor: %s\n",cpuvendors[i].string);
4b18bf35f153 printf to mp_msg
albeu
parents: 4829
diff changeset
217 mp_msg(MSGT_CPUDETECT,MSGL_WARN,"Type: %d\n",CPUID_TYPE);
4b18bf35f153 printf to mp_msg
albeu
parents: 4829
diff changeset
218 mp_msg(MSGT_CPUDETECT,MSGL_WARN,"Family: %d (ext: %d)\n",CPUID_FAMILY,CPUID_EXTFAMILY);
4b18bf35f153 printf to mp_msg
albeu
parents: 4829
diff changeset
219 mp_msg(MSGT_CPUDETECT,MSGL_WARN,"Model: %d (ext: %d)\n",CPUID_MODEL,CPUID_EXTMODEL);
4b18bf35f153 printf to mp_msg
albeu
parents: 4829
diff changeset
220 mp_msg(MSGT_CPUDETECT,MSGL_WARN,"Stepping: %d\n",CPUID_STEPPING);
4b18bf35f153 printf to mp_msg
albeu
parents: 4829
diff changeset
221 mp_msg(MSGT_CPUDETECT,MSGL_WARN,"Please send the above info along with the exact CPU name"
2301
b4c4c832cce7 Detect and show cpu name.
atmos4
parents: 2288
diff changeset
222 "to the MPlayer-Developers, so we can add it to the list!\n");
b4c4c832cce7 Detect and show cpu name.
atmos4
parents: 2288
diff changeset
223 }
b4c4c832cce7 Detect and show cpu name.
atmos4
parents: 2288
diff changeset
224 }
b4c4c832cce7 Detect and show cpu name.
atmos4
parents: 2288
diff changeset
225 }
b4c4c832cce7 Detect and show cpu name.
atmos4
parents: 2288
diff changeset
226
b4c4c832cce7 Detect and show cpu name.
atmos4
parents: 2288
diff changeset
227 //printf("Detected CPU: %s\n", retname);
b4c4c832cce7 Detect and show cpu name.
atmos4
parents: 2288
diff changeset
228 return retname;
b4c4c832cce7 Detect and show cpu name.
atmos4
parents: 2288
diff changeset
229 }
b4c4c832cce7 Detect and show cpu name.
atmos4
parents: 2288
diff changeset
230
b4c4c832cce7 Detect and show cpu name.
atmos4
parents: 2288
diff changeset
231 #undef CPUID_EXTFAMILY
b4c4c832cce7 Detect and show cpu name.
atmos4
parents: 2288
diff changeset
232 #undef CPUID_EXTMODEL
b4c4c832cce7 Detect and show cpu name.
atmos4
parents: 2288
diff changeset
233 #undef CPUID_TYPE
b4c4c832cce7 Detect and show cpu name.
atmos4
parents: 2288
diff changeset
234 #undef CPUID_FAMILY
b4c4c832cce7 Detect and show cpu name.
atmos4
parents: 2288
diff changeset
235 #undef CPUID_MODEL
b4c4c832cce7 Detect and show cpu name.
atmos4
parents: 2288
diff changeset
236 #undef CPUID_STEPPING
b4c4c832cce7 Detect and show cpu name.
atmos4
parents: 2288
diff changeset
237
b4c4c832cce7 Detect and show cpu name.
atmos4
parents: 2288
diff changeset
238
2268
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
239 #if defined(__linux__) && defined(_POSIX_SOURCE) && defined(X86_FXSR_MAGIC)
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
240 static void sigill_handler_sse( int signal, struct sigcontext sc )
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
241 {
5937
4b18bf35f153 printf to mp_msg
albeu
parents: 4829
diff changeset
242 mp_msg(MSGT_CPUDETECT,MSGL_FATAL, "SIGILL, " );
2268
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
243
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
244 /* Both the "xorps %%xmm0,%%xmm0" and "divps %xmm0,%%xmm1"
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
245 * instructions are 3 bytes long. We must increment the instruction
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
246 * pointer manually to avoid repeated execution of the offending
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
247 * instruction.
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
248 *
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
249 * If the SIGILL is caused by a divide-by-zero when unmasked
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
250 * exceptions aren't supported, the SIMD FPU status and control
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
251 * word will be restored at the end of the test, so we don't need
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
252 * to worry about doing it here. Besides, we may not be able to...
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
253 */
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
254 sc.eip += 3;
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
255
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
256 gCpuCaps.hasSSE=0;
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
257 }
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
258
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
259 static void sigfpe_handler_sse( int signal, struct sigcontext sc )
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
260 {
5937
4b18bf35f153 printf to mp_msg
albeu
parents: 4829
diff changeset
261 mp_msg(MSGT_CPUDETECT,MSGL_FATAL, "SIGFPE, " );
2268
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
262
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
263 if ( sc.fpstate->magic != 0xffff ) {
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
264 /* Our signal context has the extended FPU state, so reset the
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
265 * divide-by-zero exception mask and clear the divide-by-zero
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
266 * exception bit.
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
267 */
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
268 sc.fpstate->mxcsr |= 0x00000200;
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
269 sc.fpstate->mxcsr &= 0xfffffffb;
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
270 } else {
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
271 /* If we ever get here, we're completely hosed.
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
272 */
5937
4b18bf35f153 printf to mp_msg
albeu
parents: 4829
diff changeset
273 mp_msg(MSGT_CPUDETECT,MSGL_FATAL, "\n\n" );
4b18bf35f153 printf to mp_msg
albeu
parents: 4829
diff changeset
274 mp_msg(MSGT_CPUDETECT,MSGL_FATAL, "SSE enabling test failed badly!" );
2268
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
275 }
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
276 }
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
277 #endif /* __linux__ && _POSIX_SOURCE && X86_FXSR_MAGIC */
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
278
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
279 /* If we're running on a processor that can do SSE, let's see if we
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
280 * are allowed to or not. This will catch 2.4.0 or later kernels that
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
281 * haven't been configured for a Pentium III but are running on one,
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
282 * and RedHat patched 2.2 kernels that have broken exception handling
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
283 * support for user space apps that do SSE.
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
284 */
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
285 static void check_os_katmai_support( void )
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
286 {
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
287 #if defined(__FreeBSD__)
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
288 int has_sse=0, ret;
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
289 size_t len=sizeof(has_sse);
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
290
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
291 ret = sysctlbyname("hw.instruction_sse", &has_sse, &len, NULL, 0);
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
292 if (ret || !has_sse)
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
293 gCpuCaps.hasSSE=0;
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
294
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
295 #elif defined(__linux__)
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
296 #if defined(_POSIX_SOURCE) && defined(X86_FXSR_MAGIC)
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
297 struct sigaction saved_sigill;
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
298 struct sigaction saved_sigfpe;
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
299
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
300 /* Save the original signal handlers.
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
301 */
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
302 sigaction( SIGILL, NULL, &saved_sigill );
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
303 sigaction( SIGFPE, NULL, &saved_sigfpe );
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
304
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
305 signal( SIGILL, (void (*)(int))sigill_handler_sse );
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
306 signal( SIGFPE, (void (*)(int))sigfpe_handler_sse );
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
307
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
308 /* Emulate test for OSFXSR in CR4. The OS will set this bit if it
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
309 * supports the extended FPU save and restore required for SSE. If
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
310 * we execute an SSE instruction on a PIII and get a SIGILL, the OS
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
311 * doesn't support Streaming SIMD Exceptions, even if the processor
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
312 * does.
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
313 */
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
314 if ( gCpuCaps.hasSSE ) {
5937
4b18bf35f153 printf to mp_msg
albeu
parents: 4829
diff changeset
315 mp_msg(MSGT_CPUDETECT,MSGL_INFO, "Testing OS support for SSE... " );
2268
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
316
2272
c26a9eff0993 cpu detection fixed
arpi
parents: 2268
diff changeset
317 // __asm __volatile ("xorps %%xmm0, %%xmm0");
c26a9eff0993 cpu detection fixed
arpi
parents: 2268
diff changeset
318 __asm __volatile ("xorps %xmm0, %xmm0");
2268
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
319
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
320 if ( gCpuCaps.hasSSE ) {
5937
4b18bf35f153 printf to mp_msg
albeu
parents: 4829
diff changeset
321 mp_msg(MSGT_CPUDETECT,MSGL_INFO, "yes.\n" );
2268
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
322 } else {
5937
4b18bf35f153 printf to mp_msg
albeu
parents: 4829
diff changeset
323 mp_msg(MSGT_CPUDETECT,MSGL_INFO, "no!\n" );
2268
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
324 }
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
325 }
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
326
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
327 /* Emulate test for OSXMMEXCPT in CR4. The OS will set this bit if
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
328 * it supports unmasked SIMD FPU exceptions. If we unmask the
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
329 * exceptions, do a SIMD divide-by-zero and get a SIGILL, the OS
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
330 * doesn't support unmasked SIMD FPU exceptions. If we get a SIGFPE
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
331 * as expected, we're okay but we need to clean up after it.
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
332 *
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
333 * Are we being too stringent in our requirement that the OS support
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
334 * unmasked exceptions? Certain RedHat 2.2 kernels enable SSE by
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
335 * setting CR4.OSFXSR but don't support unmasked exceptions. Win98
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
336 * doesn't even support them. We at least know the user-space SSE
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
337 * support is good in kernels that do support unmasked exceptions,
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
338 * and therefore to be safe I'm going to leave this test in here.
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
339 */
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
340 if ( gCpuCaps.hasSSE ) {
5937
4b18bf35f153 printf to mp_msg
albeu
parents: 4829
diff changeset
341 mp_msg(MSGT_CPUDETECT,MSGL_INFO, "Testing OS support for SSE unmasked exceptions... " );
2268
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
342
2272
c26a9eff0993 cpu detection fixed
arpi
parents: 2268
diff changeset
343 // test_os_katmai_exception_support();
2268
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
344
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
345 if ( gCpuCaps.hasSSE ) {
5937
4b18bf35f153 printf to mp_msg
albeu
parents: 4829
diff changeset
346 mp_msg(MSGT_CPUDETECT,MSGL_INFO, "yes.\n" );
2268
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
347 } else {
5937
4b18bf35f153 printf to mp_msg
albeu
parents: 4829
diff changeset
348 mp_msg(MSGT_CPUDETECT,MSGL_INFO, "no!\n" );
2268
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
349 }
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
350 }
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
351
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
352 /* Restore the original signal handlers.
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
353 */
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
354 sigaction( SIGILL, &saved_sigill, NULL );
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
355 sigaction( SIGFPE, &saved_sigfpe, NULL );
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
356
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
357 /* If we've gotten to here and the XMM CPUID bit is still set, we're
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
358 * safe to go ahead and hook out the SSE code throughout Mesa.
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
359 */
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
360 if ( gCpuCaps.hasSSE ) {
5937
4b18bf35f153 printf to mp_msg
albeu
parents: 4829
diff changeset
361 mp_msg(MSGT_CPUDETECT,MSGL_INFO, "Tests of OS support for SSE passed.\n" );
2268
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
362 } else {
5937
4b18bf35f153 printf to mp_msg
albeu
parents: 4829
diff changeset
363 mp_msg(MSGT_CPUDETECT,MSGL_INFO, "Tests of OS support for SSE failed!\n" );
2268
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
364 }
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
365 #else
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
366 /* We can't use POSIX signal handling to test the availability of
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
367 * SSE, so we disable it by default.
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
368 */
5937
4b18bf35f153 printf to mp_msg
albeu
parents: 4829
diff changeset
369 mp_msg(MSGT_CPUDETECT,MSGL_WARN, "Cannot test OS support for SSE, disabling to be safe.\n" );
2268
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
370 gCpuCaps.hasSSE=0;
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
371 #endif /* _POSIX_SOURCE && X86_FXSR_MAGIC */
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
372 #else
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
373 /* Do nothing on other platforms for now.
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
374 */
5937
4b18bf35f153 printf to mp_msg
albeu
parents: 4829
diff changeset
375 mp_msg(MSGT_CPUDETECT,MSGL_WARN, "Not testing OS support for SSE, leaving disabled.\n" );
2268
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
376 gCpuCaps.hasSSE=0;
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
377 #endif /* __linux__ */
72ff2179d396 cpu detect code by Eric Anholt <eanholt@gladstone.uoregon.edu>
arpi
parents:
diff changeset
378 }
3146
3164eaa93396 non x86 fix (otherwise we would need #ifdef ARCH_X86 around every if(gCpuCaps.has...))
michael
parents: 2417
diff changeset
379 #else /* ARCH_X86 */
3164eaa93396 non x86 fix (otherwise we would need #ifdef ARCH_X86 around every if(gCpuCaps.has...))
michael
parents: 2417
diff changeset
380
3164eaa93396 non x86 fix (otherwise we would need #ifdef ARCH_X86 around every if(gCpuCaps.has...))
michael
parents: 2417
diff changeset
381 void GetCpuCaps( CpuCaps *caps)
3164eaa93396 non x86 fix (otherwise we would need #ifdef ARCH_X86 around every if(gCpuCaps.has...))
michael
parents: 2417
diff changeset
382 {
3164eaa93396 non x86 fix (otherwise we would need #ifdef ARCH_X86 around every if(gCpuCaps.has...))
michael
parents: 2417
diff changeset
383 caps->cpuType=0;
3403
c4ca766a2d05 added cpuStepping to CpuCaps struct (needed win32.c)
alex
parents: 3146
diff changeset
384 caps->cpuStepping=0;
3146
3164eaa93396 non x86 fix (otherwise we would need #ifdef ARCH_X86 around every if(gCpuCaps.has...))
michael
parents: 2417
diff changeset
385 caps->hasMMX=0;
3164eaa93396 non x86 fix (otherwise we would need #ifdef ARCH_X86 around every if(gCpuCaps.has...))
michael
parents: 2417
diff changeset
386 caps->hasMMX2=0;
3164eaa93396 non x86 fix (otherwise we would need #ifdef ARCH_X86 around every if(gCpuCaps.has...))
michael
parents: 2417
diff changeset
387 caps->has3DNow=0;
3164eaa93396 non x86 fix (otherwise we would need #ifdef ARCH_X86 around every if(gCpuCaps.has...))
michael
parents: 2417
diff changeset
388 caps->has3DNowExt=0;
3164eaa93396 non x86 fix (otherwise we would need #ifdef ARCH_X86 around every if(gCpuCaps.has...))
michael
parents: 2417
diff changeset
389 caps->hasSSE=0;
3164eaa93396 non x86 fix (otherwise we would need #ifdef ARCH_X86 around every if(gCpuCaps.has...))
michael
parents: 2417
diff changeset
390 caps->hasSSE2=0;
3164eaa93396 non x86 fix (otherwise we would need #ifdef ARCH_X86 around every if(gCpuCaps.has...))
michael
parents: 2417
diff changeset
391 caps->isX86=0;
3164eaa93396 non x86 fix (otherwise we would need #ifdef ARCH_X86 around every if(gCpuCaps.has...))
michael
parents: 2417
diff changeset
392 }
3164eaa93396 non x86 fix (otherwise we would need #ifdef ARCH_X86 around every if(gCpuCaps.has...))
michael
parents: 2417
diff changeset
393 #endif /* !ARCH_X86 */