kernel: Better CPU detection on MacOS.
This commit is contained in:
parent
5f7b77bb91
commit
abae1e81e4
@ -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(
|
|||||||
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(
|
|||||||
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))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user