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

View File

@ -655,6 +655,7 @@ VOID WINAPI GetSystemInfo(
unsigned long long longVal; unsigned long long longVal;
int value; int value;
int cputype; int cputype;
char buffer[256];
valSize = sizeof(int); valSize = sizeof(int);
if (sysctlbyname ("hw.optional.floatingpoint", &value, &valSize, NULL, 0) == 0) if (sysctlbyname ("hw.optional.floatingpoint", &value, &valSize, NULL, 0) == 0)
@ -674,14 +675,14 @@ VOID WINAPI GetSystemInfo(
valSize = sizeof(int); valSize = sizeof(int);
if (sysctlbyname ("hw.cputype", &cputype, &valSize, NULL, 0) == 0) if (sysctlbyname ("hw.cputype", &cputype, &valSize, NULL, 0) == 0)
{
valSize = sizeof(int);
if (sysctlbyname ("hw.cpusubtype", &value, &valSize, NULL, 0) == 0)
{ {
switch (cputype) switch (cputype)
{ {
case CPU_TYPE_POWERPC: case CPU_TYPE_POWERPC:
cachedsi.u.s.wProcessorArchitecture = PROCESSOR_ARCHITECTURE_PPC; cachedsi.u.s.wProcessorArchitecture = PROCESSOR_ARCHITECTURE_PPC;
valSize = sizeof(int);
if (sysctlbyname ("hw.cpusubtype", &value, &valSize, NULL, 0) == 0)
{
switch (value) switch (value)
{ {
case CPU_SUBTYPE_POWERPC_601: case CPU_SUBTYPE_POWERPC_601:
@ -724,39 +725,43 @@ VOID WINAPI GetSystemInfo(
break; break;
default: break; default: break;
} }
}
break; /* CPU_TYPE_POWERPC */ break; /* CPU_TYPE_POWERPC */
case CPU_TYPE_I386: case CPU_TYPE_I386:
cachedsi.u.s.wProcessorArchitecture = PROCESSOR_ARCHITECTURE_INTEL; 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) switch (value)
{ {
case CPU_SUBTYPE_386: case 3: cachedsi.dwProcessorType = PROCESSOR_INTEL_386; break;
cachedsi.dwProcessorType = PROCESSOR_INTEL_386; case 4: cachedsi.dwProcessorType = PROCESSOR_INTEL_486; break;
cachedsi.wProcessorLevel = 3; default: cachedsi.dwProcessorType = PROCESSOR_INTEL_PENTIUM; break;
break; }
case CPU_SUBTYPE_486: }
case CPU_SUBTYPE_486SX: valSize = sizeof(int);
cachedsi.dwProcessorType = PROCESSOR_INTEL_486; if (sysctlbyname ("machdep.cpu.model", &value, &valSize, NULL, 0) == 0)
cachedsi.wProcessorLevel = 4; cachedsi.wProcessorRevision = (value << 8);
break; valSize = sizeof(int);
case CPU_SUBTYPE_586: if (sysctlbyname ("machdep.cpu.stepping", &value, &valSize, NULL, 0) == 0)
case CPU_SUBTYPE_PENTPRO: cachedsi.wProcessorRevision |= value;
cachedsi.dwProcessorType = PROCESSOR_INTEL_PENTIUM; valSize = sizeof(buffer);
cachedsi.wProcessorLevel = 5; if (sysctlbyname ("machdep.cpu.features", buffer, &valSize, NULL, 0) == 0)
break; {
case CPU_SUBTYPE_PENTII_M3: cachedsi.wProcessorRevision |= value;
case CPU_SUBTYPE_PENTII_M5: if (strstr(buffer,"CX8")) PF[PF_COMPARE_EXCHANGE_DOUBLE] = TRUE;
cachedsi.dwProcessorType = PROCESSOR_INTEL_PENTIUM; if (strstr(buffer,"MMX")) PF[PF_MMX_INSTRUCTIONS_AVAILABLE] = TRUE;
cachedsi.wProcessorLevel = 5; if (strstr(buffer,"TSC")) PF[PF_RDTSC_INSTRUCTION_AVAILABLE] = TRUE;
/* this should imply MMX */ if (strstr(buffer,"3DNOW")) PF[PF_3DNOW_INSTRUCTIONS_AVAILABLE] = TRUE;
PF[PF_MMX_INSTRUCTIONS_AVAILABLE] = TRUE; if (strstr(buffer,"SSE")) PF[PF_XMMI_INSTRUCTIONS_AVAILABLE] = TRUE;
break; if (strstr(buffer,"SSE2")) PF[PF_XMMI64_INSTRUCTIONS_AVAILABLE] = TRUE;
default: break; if (strstr(buffer,"PAE")) PF[PF_PAE_ENABLED] = TRUE;
} }
break; /* CPU_TYPE_I386 */ break; /* CPU_TYPE_I386 */
default: break; default: break;
} /* switch (cputype) */ } /* switch (cputype) */
} }
}
valSize = sizeof(longVal); valSize = sizeof(longVal);
if (!sysctlbyname("hw.cpufrequency", &longVal, &valSize, NULL, 0)) if (!sysctlbyname("hw.cpufrequency", &longVal, &valSize, NULL, 0))
cpuHz = longVal; cpuHz = longVal;