Commit abae1e81 authored by Alexandre Julliard's avatar Alexandre Julliard

kernel: Better CPU detection on MacOS.

parent 5f7b77bb
...@@ -655,7 +655,8 @@ VOID WINAPI GetSystemInfo( ...@@ -655,7 +655,8 @@ 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)
{ {
...@@ -675,13 +676,13 @@ VOID WINAPI GetSystemInfo( ...@@ -675,13 +676,13 @@ 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); switch (cputype)
if (sysctlbyname ("hw.cpusubtype", &value, &valSize, NULL, 0) == 0) {
{ case CPU_TYPE_POWERPC:
switch (cputype) cachedsi.u.s.wProcessorArchitecture = PROCESSOR_ARCHITECTURE_PPC;
{ valSize = sizeof(int);
case CPU_TYPE_POWERPC: if (sysctlbyname ("hw.cpusubtype", &value, &valSize, NULL, 0) == 0)
cachedsi.u.s.wProcessorArchitecture = PROCESSOR_ARCHITECTURE_PPC; {
switch (value) switch (value)
{ {
case CPU_SUBTYPE_POWERPC_601: case CPU_SUBTYPE_POWERPC_601:
...@@ -724,38 +725,42 @@ VOID WINAPI GetSystemInfo( ...@@ -724,38 +725,42 @@ VOID WINAPI GetSystemInfo(
break; break;
default: break; default: break;
} }
break; /* CPU_TYPE_POWERPC */ }
case CPU_TYPE_I386: break; /* CPU_TYPE_POWERPC */
cachedsi.u.s.wProcessorArchitecture = PROCESSOR_ARCHITECTURE_INTEL; case CPU_TYPE_I386:
switch (value) cachedsi.u.s.wProcessorArchitecture = PROCESSOR_ARCHITECTURE_INTEL;
{ valSize = sizeof(int);
case CPU_SUBTYPE_386: if (sysctlbyname ("machdep.cpu.family", &value, &valSize, NULL, 0) == 0)
cachedsi.dwProcessorType = PROCESSOR_INTEL_386; {
cachedsi.wProcessorLevel = 3; cachedsi.wProcessorLevel = value;
break; switch (value)
case CPU_SUBTYPE_486: {
case CPU_SUBTYPE_486SX: case 3: cachedsi.dwProcessorType = PROCESSOR_INTEL_386; break;
cachedsi.dwProcessorType = PROCESSOR_INTEL_486; case 4: cachedsi.dwProcessorType = PROCESSOR_INTEL_486; break;
cachedsi.wProcessorLevel = 4; default: cachedsi.dwProcessorType = PROCESSOR_INTEL_PENTIUM; break;
break; }
case CPU_SUBTYPE_586: }
case CPU_SUBTYPE_PENTPRO: valSize = sizeof(int);
cachedsi.dwProcessorType = PROCESSOR_INTEL_PENTIUM; if (sysctlbyname ("machdep.cpu.model", &value, &valSize, NULL, 0) == 0)
cachedsi.wProcessorLevel = 5; cachedsi.wProcessorRevision = (value << 8);
break; valSize = sizeof(int);
case CPU_SUBTYPE_PENTII_M3: if (sysctlbyname ("machdep.cpu.stepping", &value, &valSize, NULL, 0) == 0)
case CPU_SUBTYPE_PENTII_M5: cachedsi.wProcessorRevision |= value;
cachedsi.dwProcessorType = PROCESSOR_INTEL_PENTIUM; valSize = sizeof(buffer);
cachedsi.wProcessorLevel = 5; if (sysctlbyname ("machdep.cpu.features", buffer, &valSize, NULL, 0) == 0)
/* this should imply MMX */ {
PF[PF_MMX_INSTRUCTIONS_AVAILABLE] = TRUE; cachedsi.wProcessorRevision |= value;
break; if (strstr(buffer,"CX8")) PF[PF_COMPARE_EXCHANGE_DOUBLE] = TRUE;
default: break; if (strstr(buffer,"MMX")) PF[PF_MMX_INSTRUCTIONS_AVAILABLE] = TRUE;
} if (strstr(buffer,"TSC")) PF[PF_RDTSC_INSTRUCTION_AVAILABLE] = TRUE;
break; /* CPU_TYPE_I386 */ if (strstr(buffer,"3DNOW")) PF[PF_3DNOW_INSTRUCTIONS_AVAILABLE] = TRUE;
default: break; if (strstr(buffer,"SSE")) PF[PF_XMMI_INSTRUCTIONS_AVAILABLE] = TRUE;
} /* switch (cputype) */ 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); valSize = sizeof(longVal);
if (!sysctlbyname("hw.cpufrequency", &longVal, &valSize, NULL, 0)) if (!sysctlbyname("hw.cpufrequency", &longVal, &valSize, NULL, 0))
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment