[PATCH 6/6] [Kernel32]: rewrite GetSystemInfo() purely on ntdll calls

Eric Pouech eric.pouech at orange.fr
Tue Sep 15 14:38:31 CDT 2009


(and get rid of all CPU fetching code in kernel32)

A+
---

 dlls/kernel32/cpu.c |  585 ++++-----------------------------------------------
 1 files changed, 44 insertions(+), 541 deletions(-)


diff --git a/dlls/kernel32/cpu.c b/dlls/kernel32/cpu.c
index 83d99f4..40d3825 100644
--- a/dlls/kernel32/cpu.c
+++ b/dlls/kernel32/cpu.c
@@ -22,22 +22,6 @@
 #include "config.h"
 #include "wine/port.h"
 
-#ifdef HAVE_SYS_PARAM_H
-# include <sys/param.h>
-#endif
-#ifdef HAVE_SYS_SYSCTL_H
-# include <sys/sysctl.h>
-#endif
-#ifdef HAVE_MACHINE_CPU_H
-# include <machine/cpu.h>
-#endif
-#ifdef HAVE_MACH_MACHINE_H
-# include <mach/machine.h>
-#endif
-
-#include <ctype.h>
-#include <string.h>
-#include <stdarg.h>
 #include <stdio.h>
 #include <stdlib.h>
 #ifdef HAVE_SYS_TIME_H
@@ -61,101 +45,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(reg);
 
 #define SHARED_DATA     ((KSHARED_USER_DATA*)0x7ffe0000)
 
-#define AUTH	0x68747541	/* "Auth" */
-#define ENTI	0x69746e65	/* "enti" */
-#define CAMD	0x444d4163	/* "cAMD" */
-
-/* Calls cpuid with an eax of 'ax' and returns the 16 bytes in *p
- * We are compiled with -fPIC, so we can't clobber ebx.
- */
-static inline void do_cpuid(unsigned int ax, unsigned int *p)
-{
-#ifdef __i386__
-	__asm__("pushl %%ebx\n\t"
-                "cpuid\n\t"
-                "movl %%ebx, %%esi\n\t"
-                "popl %%ebx"
-                : "=a" (p[0]), "=S" (p[1]), "=c" (p[2]), "=d" (p[3])
-                :  "0" (ax));
-#endif
-}
-
-/* From xf86info havecpuid.c 1.11 */
-static inline int have_cpuid(void)
-{
-#ifdef __i386__
-	unsigned int f1, f2;
-	__asm__("pushfl\n\t"
-                "pushfl\n\t"
-                "popl %0\n\t"
-                "movl %0,%1\n\t"
-                "xorl %2,%0\n\t"
-                "pushl %0\n\t"
-                "popfl\n\t"
-                "pushfl\n\t"
-                "popl %0\n\t"
-                "popfl"
-                : "=&r" (f1), "=&r" (f2)
-                : "ir" (0x00200000));
-	return ((f1^f2) & 0x00200000) != 0;
-#else
-        return 0;
-#endif
-}
-
-static ULONGLONG cpuHz = 1000000000; /* default to a 1GHz */
-
-static inline void get_cpuinfo( SYSTEM_INFO *info )
-{
-    unsigned int regs[4], regs2[4];
-
-    if (!have_cpuid()) return;
-
-    do_cpuid(0x00000000, regs);  /* get standard cpuid level and vendor name */
-    if (regs[0]>=0x00000001)   /* Check for supported cpuid version */
-    {
-        do_cpuid(0x00000001, regs2); /* get cpu features */
-        switch ((regs2[0] >> 8) & 0xf)  /* cpu family */
-        {
-        case 3:
-            info->dwProcessorType = PROCESSOR_INTEL_386;
-            info->wProcessorLevel = 3;
-            break;
-        case 4:
-            info->dwProcessorType = PROCESSOR_INTEL_486;
-            info->wProcessorLevel = 4;
-            break;
-        case 5:
-            info->dwProcessorType = PROCESSOR_INTEL_PENTIUM;
-            info->wProcessorLevel = 5;
-            break;
-        case 6:
-        case 15: /* PPro/2/3/4 has same info as P1 */
-            info->dwProcessorType = PROCESSOR_INTEL_PENTIUM;
-            info->wProcessorLevel = 6;
-            break;
-        default:
-            FIXME("unknown cpu family %d, please report! (-> setting to 386)\n",
-                  (regs2[0] >> 8)&0xf);
-            break;
-        }
-        SHARED_DATA->ProcessorFeatures[PF_FLOATING_POINT_EMULATED]     = !(regs2[3] & 1);
-        SHARED_DATA->ProcessorFeatures[PF_RDTSC_INSTRUCTION_AVAILABLE] = (regs2[3] & (1 << 4 )) >> 4;
-        SHARED_DATA->ProcessorFeatures[PF_COMPARE_EXCHANGE_DOUBLE]     = (regs2[3] & (1 << 8 )) >> 8;
-        SHARED_DATA->ProcessorFeatures[PF_MMX_INSTRUCTIONS_AVAILABLE]  = (regs2[3] & (1 << 23)) >> 23;
-
-        if (regs[1] == AUTH &&
-            regs[3] == ENTI &&
-            regs[2] == CAMD) {
-            do_cpuid(0x80000000, regs);  /* get vendor cpuid level */
-            if (regs[0]>=0x80000001) {
-                do_cpuid(0x80000001, regs2);  /* get vendor features */
-                SHARED_DATA->ProcessorFeatures[PF_3DNOW_INSTRUCTIONS_AVAILABLE] = (regs2[3] & (1 << 31 )) >> 31;
-            }
-        }
-    }
-}
-
 /****************************************************************************
  *		QueryPerformanceCounter (KERNEL32.@)
  *
@@ -213,444 +102,61 @@ BOOL WINAPI QueryPerformanceFrequency(PLARGE_INTEGER frequency)
  * On the first call it creates cached values, so it doesn't have to determine
  * them repeatedly. On Linux, the "/proc/cpuinfo" special file is used.
  *
- * It creates a registry subhierarchy, looking like:
- * "\HARDWARE\DESCRIPTION\System\CentralProcessor\<processornumber>\Identifier (CPU x86)".
- * Note that there is a hierarchy for every processor installed, so this
- * supports multiprocessor systems. This is done like Win95 does it, I think.
- *
- * It creates some registry entries in the environment part:
- * "\HKLM\System\CurrentControlSet\Control\Session Manager\Environment". These are
- * always present. When deleted, Windows will add them again.
- *
  * It also creates a cached flag array for IsProcessorFeaturePresent().
  */
 VOID WINAPI GetSystemInfo(
 	LPSYSTEM_INFO si	/* [out] Destination for system information, may not be NULL */)
 {
-	static int cache = 0;
-	static SYSTEM_INFO cachedsi;
-        SYSTEM_BASIC_INFORMATION sbi;
-
-	TRACE("si=0x%p\n", si);
-	if (cache) {
-		*si = cachedsi;
-		return;
-	}
-	memset(SHARED_DATA->ProcessorFeatures,0,sizeof(SHARED_DATA->ProcessorFeatures));
-
-        NtQuerySystemInformation( SystemBasicInformation, &sbi, sizeof(sbi), NULL );
-        cachedsi.dwPageSize                  = sbi.PageSize;
-        cachedsi.lpMinimumApplicationAddress = sbi.LowestUserAddress;
-        cachedsi.lpMaximumApplicationAddress = sbi.HighestUserAddress;
-        cachedsi.dwNumberOfProcessors        = sbi.NumberOfProcessors;
-        cachedsi.dwAllocationGranularity     = sbi.AllocationGranularity;
-
-	/* choose sensible defaults ...
-	 * FIXME: perhaps overridable with precompiler flags?
-	 */
-	cachedsi.u.s.wProcessorArchitecture     = PROCESSOR_ARCHITECTURE_INTEL;
-	cachedsi.dwActiveProcessorMask		= 0;
-	cachedsi.dwProcessorType		= PROCESSOR_INTEL_PENTIUM;
-	cachedsi.wProcessorLevel		= 5; /* 586 */
-	cachedsi.wProcessorRevision		= 0;
-
-	cache = 1; /* even if there is no more info, we now have a cache entry */
-	*si = cachedsi;
-
-	/* Hmm, reasonable processor feature defaults? */
+    NTSTATUS                 nts;
+    SYSTEM_BASIC_INFORMATION sbi;
+    SYSTEM_CPU_INFORMATION   sci;
 
-#ifdef linux
-	{
-	char line[200];
-	FILE *f = fopen ("/proc/cpuinfo", "r");
+    TRACE("si=0x%p\n", si);
 
-	if (!f)
-		return;
-	while (fgets(line,200,f)!=NULL) {
-		char	*s,*value;
-
-		/* NOTE: the ':' is the only character we can rely on */
-		if (!(value = strchr(line,':')))
-			continue;
-		
-		/* terminate the valuename */
-		s = value - 1;
-		while ((s >= line) && ((*s == ' ') || (*s == '\t'))) s--;
-		*(s + 1) = '\0';
-
-		/* and strip leading spaces from value */
-		value += 1;
-		while (*value==' ') value++;
-		if ((s=strchr(value,'\n')))
-			*s='\0';
-
-		if (!strcasecmp(line,"processor")) {
-			/* processor number counts up... */
-			unsigned int x;
-
-			if (sscanf(value,"%d",&x))
-				if (x+1>cachedsi.dwNumberOfProcessors)
-					cachedsi.dwNumberOfProcessors=x+1;
-			
-			continue;
-		}
-                if (!strcasecmp(line,"model")) {
-                        /* First part of wProcessorRevision */
-			int	x;
-
-			if (sscanf(value,"%d",&x))
-				cachedsi.wProcessorRevision = cachedsi.wProcessorRevision | (x << 8);
-
-			continue;
-                }
-
-		/* 2.1 method */
-		if (!strcasecmp(line, "cpu family")) {
-			if (isdigit (value[0])) {
-				switch (value[0] - '0') {
-				case 3: cachedsi.dwProcessorType = PROCESSOR_INTEL_386;
-					cachedsi.wProcessorLevel= 3;
-					break;
-				case 4: cachedsi.dwProcessorType = PROCESSOR_INTEL_486;
-					cachedsi.wProcessorLevel= 4;
-					break;
-				case 5: cachedsi.dwProcessorType = PROCESSOR_INTEL_PENTIUM;
-					cachedsi.wProcessorLevel= 5;
-					break;
-
-				default:
-					cachedsi.dwProcessorType = PROCESSOR_INTEL_PENTIUM;
-					cachedsi.wProcessorLevel = atoi(value);
-					break;
-				}
-			}
-			continue;
-		}
-		/* old 2.0 method */
-		if (!strcasecmp(line, "cpu")) {
-			if (	isdigit (value[0]) && value[1] == '8' &&
-				value[2] == '6' && value[3] == 0
-			) {
-				switch (value[0] - '0') {
-				case 3: cachedsi.dwProcessorType = PROCESSOR_INTEL_386;
-					cachedsi.wProcessorLevel= 3;
-					break;
-				case 4: cachedsi.dwProcessorType = PROCESSOR_INTEL_486;
-					cachedsi.wProcessorLevel= 4;
-					break;
-				case 5: cachedsi.dwProcessorType = PROCESSOR_INTEL_PENTIUM;
-					cachedsi.wProcessorLevel= 5;
-					break;
-				case 6: cachedsi.dwProcessorType = PROCESSOR_INTEL_PENTIUM;
-					cachedsi.wProcessorLevel= 6;
-					break;
-				default:
-					FIXME("unknown Linux 2.0 cpu family '%s', please report ! (-> setting to 386)\n", value);
-					break;
-				}
-			}
-			continue;
-		}
-		if (!strcasecmp(line,"stepping")) {
-                        /* Second part of wProcessorRevision */
-			int	x;
-
-			if (sscanf(value,"%d",&x))
-				cachedsi.wProcessorRevision = cachedsi.wProcessorRevision | x;
-
-			continue;
-		}
-		if (!strcasecmp(line, "cpu MHz")) {
-			double cmz;
-			if (sscanf( value, "%lf", &cmz ) == 1) {
-				/* SYSTEMINFO doesn't have a slot for cpu speed, so store in a global */
-				cpuHz = cmz * 1000 * 1000;
-			}
-			continue;
-		}
-		if (!strcasecmp(line,"fdiv_bug")) {
-			if (!strncasecmp(value,"yes",3))
-				SHARED_DATA->ProcessorFeatures[PF_FLOATING_POINT_PRECISION_ERRATA] = TRUE;
+    if ((nts = NtQuerySystemInformation( SystemBasicInformation, &sbi, sizeof(sbi), NULL )) != STATUS_SUCCESS ||
+        (nts = NtQuerySystemInformation( SystemCpuInformation, &sci, sizeof(sci), NULL )) != STATUS_SUCCESS)
+    {
+        SetLastError(RtlNtStatusToDosError(nts));
+        return;
+    }
 
-			continue;
-		}
-		if (!strcasecmp(line,"fpu")) {
-			if (!strncasecmp(value,"no",2))
-				SHARED_DATA->ProcessorFeatures[PF_FLOATING_POINT_EMULATED] = TRUE;
+    si->u.s.wProcessorArchitecture  = sci.Architecture;
+    si->u.s.wReserved               = 0;
+    si->dwPageSize                  = sbi.PageSize;
+    si->lpMinimumApplicationAddress = sbi.LowestUserAddress;
+    si->lpMaximumApplicationAddress = sbi.HighestUserAddress;
+    si->dwActiveProcessorMask       = sbi.ActiveProcessorsAffinityMask;
+    si->dwNumberOfProcessors        = sbi.NumberOfProcessors;
 
-			continue;
-		}
-		if (	!strcasecmp(line,"flags")	||
-			!strcasecmp(line,"features")) {
-			if (strstr(value,"cx8"))
-				SHARED_DATA->ProcessorFeatures[PF_COMPARE_EXCHANGE_DOUBLE] = TRUE;
-			if (strstr(value,"mmx"))
-				SHARED_DATA->ProcessorFeatures[PF_MMX_INSTRUCTIONS_AVAILABLE] = TRUE;
-			if (strstr(value,"tsc"))
-				SHARED_DATA->ProcessorFeatures[PF_RDTSC_INSTRUCTION_AVAILABLE] = TRUE;
-			if (strstr(value,"3dnow"))
-				SHARED_DATA->ProcessorFeatures[PF_3DNOW_INSTRUCTIONS_AVAILABLE] = TRUE;
-			/* This will also catch sse2, but we have sse itself
-			 * if we have sse2, so no problem */
-			if (strstr(value,"sse"))
-				SHARED_DATA->ProcessorFeatures[PF_XMMI_INSTRUCTIONS_AVAILABLE] = TRUE;
-			if (strstr(value,"sse2"))
-				SHARED_DATA->ProcessorFeatures[PF_XMMI64_INSTRUCTIONS_AVAILABLE] = TRUE;
-			if (strstr(value,"pae"))
-				SHARED_DATA->ProcessorFeatures[PF_PAE_ENABLED] = TRUE;
-			
-			continue;
-		}
-	}
-	fclose (f);
-	}
-#elif defined (__NetBSD__)
+    switch (sci.Architecture)
+    {
+    case PROCESSOR_ARCHITECTURE_INTEL:
+        switch (sci.Level)
         {
-             int mib[2];
-             int value;
-             size_t val_len;
-             char model[256];
-             char *cpuclass;
-             FILE *f = fopen ("/var/run/dmesg.boot", "r");
-
-             /* first deduce as much as possible from the sysctls */
-             mib[0] = CTL_MACHDEP;
-#ifdef CPU_FPU_PRESENT
-             mib[1] = CPU_FPU_PRESENT;
-             val_len = sizeof(value);
-             if (sysctl(mib, 2, &value, &val_len, NULL, 0) >= 0)
-                 SHARED_DATA->ProcessorFeatures[PF_FLOATING_POINT_EMULATED] = !value;
-#endif
-#ifdef CPU_SSE
-             mib[1] = CPU_SSE;   /* this should imply MMX */
-             val_len = sizeof(value);
-             if (sysctl(mib, 2, &value, &val_len, NULL, 0) >= 0)
-                 if (value) SHARED_DATA->ProcessorFeatures[PF_MMX_INSTRUCTIONS_AVAILABLE] = TRUE;
-#endif
-#ifdef CPU_SSE2
-             mib[1] = CPU_SSE2;  /* this should imply MMX */
-             val_len = sizeof(value);
-             if (sysctl(mib, 2, &value, &val_len, NULL, 0) >= 0)
-                 if (value) SHARED_DATA->ProcessorFeatures[PF_MMX_INSTRUCTIONS_AVAILABLE] = TRUE;
-#endif
-             mib[0] = CTL_HW;
-             mib[1] = HW_NCPU;
-             val_len = sizeof(value);
-             if (sysctl(mib, 2, &value, &val_len, NULL, 0) >= 0)
-                 if (value > cachedsi.dwNumberOfProcessors)
-                    cachedsi.dwNumberOfProcessors = value;
-             mib[1] = HW_MODEL;
-             val_len = sizeof(model)-1;
-             if (sysctl(mib, 2, model, &val_len, NULL, 0) >= 0) {
-                  model[val_len] = '\0'; /* just in case */
-                  cpuclass = strstr(model, "-class");
-                  if (cpuclass != NULL) {
-                       while(cpuclass > model && cpuclass[0] != '(') cpuclass--;
-                       if (!strncmp(cpuclass+1, "386", 3)) {
-                            cachedsi.dwProcessorType = PROCESSOR_INTEL_386;
-                            cachedsi.wProcessorLevel= 3;
-                       }
-                       if (!strncmp(cpuclass+1, "486", 3)) {
-                            cachedsi.dwProcessorType = PROCESSOR_INTEL_486;
-                            cachedsi.wProcessorLevel= 4;
-                       }
-                       if (!strncmp(cpuclass+1, "586", 3)) {
-                            cachedsi.dwProcessorType = PROCESSOR_INTEL_PENTIUM;
-                            cachedsi.wProcessorLevel= 5;
-                       }
-                       if (!strncmp(cpuclass+1, "686", 3)) {
-                            cachedsi.dwProcessorType = PROCESSOR_INTEL_PENTIUM;
-                            cachedsi.wProcessorLevel= 6;
-                            /* this should imply MMX */
-                            SHARED_DATA->ProcessorFeatures[PF_MMX_INSTRUCTIONS_AVAILABLE] = TRUE;
-                       }
-                  }
-             }
-
-             /* it may be worth reading from /var/run/dmesg.boot for
-                additional information such as CX8, MMX and TSC
-                (however this information should be considered less
-                 reliable than that from the sysctl calls) */
-             if (f != NULL)
-             {
-	         while (fgets(model, 255, f) != NULL) {
-                        int cpu, features;
-                        if (sscanf(model,"cpu%d: features %x<", &cpu, &features) == 2) {
-                            /* we could scan the string but it is easier
-                               to test the bits directly */
-                            if (features & 0x1)
-                                SHARED_DATA->ProcessorFeatures[PF_FLOATING_POINT_EMULATED] = TRUE;
-                            if (features & 0x10)
-                                SHARED_DATA->ProcessorFeatures[PF_RDTSC_INSTRUCTION_AVAILABLE] = TRUE;
-                            if (features & 0x100)
-                                SHARED_DATA->ProcessorFeatures[PF_COMPARE_EXCHANGE_DOUBLE] = TRUE;
-                            if (features & 0x800000)
-                                SHARED_DATA->ProcessorFeatures[PF_MMX_INSTRUCTIONS_AVAILABLE] = TRUE;
-
-                            break;
-                        }
-                 }
-                 fclose(f);
-             }
-
+        case 3:  si->dwProcessorType = PROCESSOR_INTEL_386;     break;
+        case 4:  si->dwProcessorType = PROCESSOR_INTEL_486;     break;
+        case 5:
+        case 6:  si->dwProcessorType = PROCESSOR_INTEL_PENTIUM; break;
+        default: si->dwProcessorType = PROCESSOR_INTEL_PENTIUM; break;
         }
-#elif defined(__FreeBSD__)
-	{
-	int ret, num;
-	size_t len;
-
-        get_cpuinfo( &cachedsi );
-
-        /* Check for OS support of SSE -- Is this used, and should it be sse1 or sse2? */
-        /*len = sizeof(num);
-          ret = sysctlbyname("hw.instruction_sse", &num, &len, NULL, 0);
-          if (!ret)
-          SHARED_DATA->ProcessorFeatures[PF_XMMI_INSTRUCTIONS_AVAILABLE] = num;*/
-
-	len = sizeof(num);
-	ret = sysctlbyname("hw.ncpu", &num, &len, NULL, 0);
-	if (!ret)
-		cachedsi.dwNumberOfProcessors = num;
-	}
-#elif defined(__sun)
-	{
-            int num = sysconf( _SC_NPROCESSORS_ONLN );
-
-            if (num == -1) num = 1;
-            get_cpuinfo( &cachedsi );
-            cachedsi.dwNumberOfProcessors = num;
-	}
-#elif defined (__APPLE__)
-	{
-	size_t valSize;
-	unsigned long long longVal;
-	int value;
-	int cputype;
-        char buffer[256];
-
-	valSize = sizeof(int);
-	if (sysctlbyname ("hw.optional.floatingpoint", &value, &valSize, NULL, 0) == 0)
-	{
-	    if (value)
-		SHARED_DATA->ProcessorFeatures[PF_FLOATING_POINT_EMULATED] = FALSE;
-	    else
-		SHARED_DATA->ProcessorFeatures[PF_FLOATING_POINT_EMULATED] = TRUE;
-	}
-	valSize = sizeof(int);
-	if (sysctlbyname ("hw.ncpu", &value, &valSize, NULL, 0) == 0)
-            cachedsi.dwNumberOfProcessors = value;
-
-	valSize = sizeof(int);
-	if (sysctlbyname ("hw.activecpu", &value, &valSize, NULL, 0) == 0)
-	    cachedsi.dwActiveProcessorMask = ((ULONG_PTR)1 << value) - 1;
-
-	valSize = sizeof(int);
-	if (sysctlbyname ("hw.cputype", &cputype, &valSize, NULL, 0) == 0)
-	{
-            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:
-			    case CPU_SUBTYPE_POWERPC_602:
-				cachedsi.dwProcessorType = PROCESSOR_PPC_601;
-				cachedsi.wProcessorLevel = 1;
-				break;
-			    case CPU_SUBTYPE_POWERPC_603:
-				cachedsi.dwProcessorType = PROCESSOR_PPC_603;
-				cachedsi.wProcessorLevel = 3;
-				break;
-			    case CPU_SUBTYPE_POWERPC_603e:
-			    case CPU_SUBTYPE_POWERPC_603ev:
-				cachedsi.dwProcessorType = PROCESSOR_PPC_603;
-				cachedsi.wProcessorLevel = 6;
-				break;
-			    case CPU_SUBTYPE_POWERPC_604:
-				cachedsi.dwProcessorType = PROCESSOR_PPC_604;
-				cachedsi.wProcessorLevel = 4;
-				break;
-			    case CPU_SUBTYPE_POWERPC_604e:
-				cachedsi.dwProcessorType = PROCESSOR_PPC_604;
-				cachedsi.wProcessorLevel = 9;
-				break;
-			    case CPU_SUBTYPE_POWERPC_620:
-				cachedsi.dwProcessorType = PROCESSOR_PPC_620;
-				cachedsi.wProcessorLevel = 20;
-				break;
-			    case CPU_SUBTYPE_POWERPC_750:
-			    case CPU_SUBTYPE_POWERPC_7400:
-			    case CPU_SUBTYPE_POWERPC_7450:
-				/* G3/G4 derive from 603 so ... */
-				cachedsi.dwProcessorType = PROCESSOR_PPC_603;
-				cachedsi.wProcessorLevel = 6;
-				break;
-			    case CPU_SUBTYPE_POWERPC_970:
-				cachedsi.dwProcessorType = PROCESSOR_PPC_604;
-				cachedsi.wProcessorLevel = 9;
-				/* :o) SHARED_DATA->ProcessorFeatures[PF_ALTIVEC_INSTRUCTIONS_AVAILABLE] ;-) */
-				break;
-			    default: break;
-			}
-                }
-                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"))  SHARED_DATA->ProcessorFeatures[PF_COMPARE_EXCHANGE_DOUBLE] = TRUE;
-                    if (strstr(buffer,"MMX"))   SHARED_DATA->ProcessorFeatures[PF_MMX_INSTRUCTIONS_AVAILABLE] = TRUE;
-                    if (strstr(buffer,"TSC"))   SHARED_DATA->ProcessorFeatures[PF_RDTSC_INSTRUCTION_AVAILABLE] = TRUE;
-                    if (strstr(buffer,"3DNOW")) SHARED_DATA->ProcessorFeatures[PF_3DNOW_INSTRUCTIONS_AVAILABLE] = TRUE;
-                    if (strstr(buffer,"SSE"))   SHARED_DATA->ProcessorFeatures[PF_XMMI_INSTRUCTIONS_AVAILABLE] = TRUE;
-                    if (strstr(buffer,"SSE2"))  SHARED_DATA->ProcessorFeatures[PF_XMMI64_INSTRUCTIONS_AVAILABLE] = TRUE;
-                    if (strstr(buffer,"PAE"))   SHARED_DATA->ProcessorFeatures[PF_PAE_ENABLED] = TRUE;
-                }
-                break; /* CPU_TYPE_I386 */
-            default: break;
-            } /* switch (cputype) */
-	}
-	valSize = sizeof(longVal);
-	if (!sysctlbyname("hw.cpufrequency", &longVal, &valSize, NULL, 0))
-	    cpuHz = longVal;
-	}
-#else
-	FIXME("not yet supported on this system\n");
-#endif
-        if (!cachedsi.dwActiveProcessorMask)
-            cachedsi.dwActiveProcessorMask = ((ULONG_PTR)1 << cachedsi.dwNumberOfProcessors) - 1;
-
-        *si = cachedsi;
-
-        TRACE("<- CPU arch %d, res'd %d, pagesize %d, minappaddr %p, maxappaddr %p,"
-              " act.cpumask %lx, numcpus %d, CPU type %d, allocgran. %d, CPU level %d, CPU rev %d\n",
-              si->u.s.wProcessorArchitecture, si->u.s.wReserved, si->dwPageSize,
-              si->lpMinimumApplicationAddress, si->lpMaximumApplicationAddress,
-              si->dwActiveProcessorMask, si->dwNumberOfProcessors, si->dwProcessorType,
-              si->dwAllocationGranularity, si->wProcessorLevel, si->wProcessorRevision);
+        break;
+    case PROCESSOR_ARCHITECTURE_PPC:
+        switch (sci.Level)
+        {
+        case 1:  si->dwProcessorType = PROCESSOR_PPC_601;       break;
+        case 3:
+        case 6:  si->dwProcessorType = PROCESSOR_PPC_603;       break;
+        case 4:  si->dwProcessorType = PROCESSOR_PPC_604;       break;
+        case 9:  si->dwProcessorType = PROCESSOR_PPC_604;       break;
+        case 20: si->dwProcessorType = PROCESSOR_PPC_620;       break;
+        default: si->dwProcessorType = 0;
+        }
+        break;
+    default: FIXME("Unknown processor architecture %x\n", sci.Architecture);
+    }
+    si->dwAllocationGranularity     = sbi.AllocationGranularity;
+    si->wProcessorLevel             = sci.Level;
+    si->wProcessorRevision          = sci.Revision;
 }
 
 
@@ -681,9 +187,6 @@ VOID WINAPI GetNativeSystemInfo(
 BOOL WINAPI IsProcessorFeaturePresent (
 	DWORD feature	/* [in] Feature number, (PF_ constants from "winnt.h") */) 
 {
-  SYSTEM_INFO si;
-  GetSystemInfo (&si); /* To ensure the information is loaded and cached */
-
   if (feature < 64)
     return SHARED_DATA->ProcessorFeatures[feature];
   else






More information about the wine-patches mailing list