kernel: Better CPU detection on MacOS.

This commit is contained in:
Alexandre Julliard 2006-09-11 17:45:32 +02:00
parent 5f7b77bb91
commit abae1e81e4
1 changed files with 45 additions and 40 deletions

View File

@ -655,6 +655,7 @@ VOID WINAPI GetSystemInfo(
unsigned long long longVal;
int value;
int cputype;
char buffer[256];
valSize = sizeof(int);
if (sysctlbyname ("hw.optional.floatingpoint", &value, &valSize, NULL, 0) == 0)
@ -674,14 +675,14 @@ VOID WINAPI GetSystemInfo(
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;
valSize = sizeof(int);
if (sysctlbyname ("hw.cpusubtype", &value, &valSize, NULL, 0) == 0)
{
switch (value)
{
case CPU_SUBTYPE_POWERPC_601:
@ -724,39 +725,43 @@ VOID WINAPI GetSystemInfo(
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 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;
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))
cpuHz = longVal;