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