Alexandre Julliard : kernel: Better CPU detection on MacOS.
Alexandre Julliard
julliard at wine.codeweavers.com
Mon Sep 11 11:22:15 CDT 2006
Module: wine
Branch: master
Commit: abae1e81e4bc6bedccb032d1a581f5ab89d57df1
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=abae1e81e4bc6bedccb032d1a581f5ab89d57df1
Author: Alexandre Julliard <julliard at winehq.org>
Date: Mon Sep 11 17:45:32 2006 +0200
kernel: Better CPU detection on MacOS.
---
dlls/kernel/cpu.c | 85 ++++++++++++++++++++++++++++-------------------------
1 files changed, 45 insertions(+), 40 deletions(-)
diff --git a/dlls/kernel/cpu.c b/dlls/kernel/cpu.c
index 40aedcd..70febe7 100644
--- a/dlls/kernel/cpu.c
+++ b/dlls/kernel/cpu.c
@@ -655,7 +655,8 @@ #elif defined (__APPLE__)
unsigned long long longVal;
int value;
int cputype;
-
+ char buffer[256];
+
valSize = sizeof(int);
if (sysctlbyname ("hw.optional.floatingpoint", &value, &valSize, NULL, 0) == 0)
{
@@ -675,13 +676,13 @@ #elif defined (__APPLE__)
valSize = sizeof(int);
if (sysctlbyname ("hw.cputype", &cputype, &valSize, NULL, 0) == 0)
{
- valSize = sizeof(int);
- if (sysctlbyname ("hw.cpusubtype", &value, &valSize, NULL, 0) == 0)
- {
- switch (cputype)
- {
- case CPU_TYPE_POWERPC:
- cachedsi.u.s.wProcessorArchitecture = PROCESSOR_ARCHITECTURE_PPC;
+ switch (cputype)
+ {
+ case CPU_TYPE_POWERPC:
+ cachedsi.u.s.wProcessorArchitecture = PROCESSOR_ARCHITECTURE_PPC;
+ valSize = sizeof(int);
+ if (sysctlbyname ("hw.cpusubtype", &value, &valSize, NULL, 0) == 0)
+ {
switch (value)
{
case CPU_SUBTYPE_POWERPC_601:
@@ -724,38 +725,42 @@ #elif defined (__APPLE__)
break;
default: break;
}
- break; /* CPU_TYPE_POWERPC */
- case CPU_TYPE_I386:
- cachedsi.u.s.wProcessorArchitecture = PROCESSOR_ARCHITECTURE_INTEL;
- switch (value)
- {
- case CPU_SUBTYPE_386:
- cachedsi.dwProcessorType = PROCESSOR_INTEL_386;
- cachedsi.wProcessorLevel = 3;
- break;
- case CPU_SUBTYPE_486:
- case CPU_SUBTYPE_486SX:
- cachedsi.dwProcessorType = PROCESSOR_INTEL_486;
- cachedsi.wProcessorLevel = 4;
- break;
- case CPU_SUBTYPE_586:
- case CPU_SUBTYPE_PENTPRO:
- cachedsi.dwProcessorType = PROCESSOR_INTEL_PENTIUM;
- cachedsi.wProcessorLevel = 5;
- break;
- case CPU_SUBTYPE_PENTII_M3:
- case CPU_SUBTYPE_PENTII_M5:
- cachedsi.dwProcessorType = PROCESSOR_INTEL_PENTIUM;
- cachedsi.wProcessorLevel = 5;
- /* this should imply MMX */
- PF[PF_MMX_INSTRUCTIONS_AVAILABLE] = TRUE;
- break;
- default: break;
- }
- break; /* CPU_TYPE_I386 */
- default: break;
- } /* switch (cputype) */
- }
+ }
+ break; /* CPU_TYPE_POWERPC */
+ case CPU_TYPE_I386:
+ cachedsi.u.s.wProcessorArchitecture = PROCESSOR_ARCHITECTURE_INTEL;
+ valSize = sizeof(int);
+ if (sysctlbyname ("machdep.cpu.family", &value, &valSize, NULL, 0) == 0)
+ {
+ cachedsi.wProcessorLevel = value;
+ switch (value)
+ {
+ case 3: cachedsi.dwProcessorType = PROCESSOR_INTEL_386; break;
+ case 4: cachedsi.dwProcessorType = PROCESSOR_INTEL_486; break;
+ default: cachedsi.dwProcessorType = PROCESSOR_INTEL_PENTIUM; break;
+ }
+ }
+ valSize = sizeof(int);
+ if (sysctlbyname ("machdep.cpu.model", &value, &valSize, NULL, 0) == 0)
+ cachedsi.wProcessorRevision = (value << 8);
+ valSize = sizeof(int);
+ if (sysctlbyname ("machdep.cpu.stepping", &value, &valSize, NULL, 0) == 0)
+ cachedsi.wProcessorRevision |= value;
+ valSize = sizeof(buffer);
+ if (sysctlbyname ("machdep.cpu.features", buffer, &valSize, NULL, 0) == 0)
+ {
+ cachedsi.wProcessorRevision |= value;
+ if (strstr(buffer,"CX8")) PF[PF_COMPARE_EXCHANGE_DOUBLE] = TRUE;
+ if (strstr(buffer,"MMX")) PF[PF_MMX_INSTRUCTIONS_AVAILABLE] = TRUE;
+ if (strstr(buffer,"TSC")) PF[PF_RDTSC_INSTRUCTION_AVAILABLE] = TRUE;
+ if (strstr(buffer,"3DNOW")) PF[PF_3DNOW_INSTRUCTIONS_AVAILABLE] = TRUE;
+ if (strstr(buffer,"SSE")) PF[PF_XMMI_INSTRUCTIONS_AVAILABLE] = TRUE;
+ if (strstr(buffer,"SSE2")) PF[PF_XMMI64_INSTRUCTIONS_AVAILABLE] = TRUE;
+ if (strstr(buffer,"PAE")) PF[PF_PAE_ENABLED] = TRUE;
+ }
+ break; /* CPU_TYPE_I386 */
+ default: break;
+ } /* switch (cputype) */
}
valSize = sizeof(longVal);
if (!sysctlbyname("hw.cpufrequency", &longVal, &valSize, NULL, 0))
More information about the wine-cvs
mailing list