From b2ff8b33cd8b8beee405cdff01b0612df0c1bc37 Mon Sep 17 00:00:00 2001 From: cxl Date: Tue, 17 Oct 2017 15:45:26 +0000 Subject: [PATCH] CpuHypervisor git-svn-id: svn://ultimatepp.org/upp/trunk@11386 f0d560ea-af0d-0410-9eb7-867de7ffcac7 --- uppsrc/Core/Cpu.cpp | 40 +++++++++++++++++----------------------- uppsrc/Core/Defs.h | 1 + 2 files changed, 18 insertions(+), 23 deletions(-) diff --git a/uppsrc/Core/Cpu.cpp b/uppsrc/Core/Cpu.cpp index 77509ae05..a7984688a 100644 --- a/uppsrc/Core/Cpu.cpp +++ b/uppsrc/Core/Cpu.cpp @@ -1,4 +1,5 @@ #include "Core.h" +#include "cpuid.h" namespace Upp { @@ -8,22 +9,15 @@ static bool sHasMMX; static bool sHasSSE; static bool sHasSSE2; static bool sHasSSE3; +static bool sHypervisor; static void sCheckCPU() { static bool done; if(done) return; done = true; -#ifdef PLATFORM_OSX11 - sHasMMX = true; - sHasSSE = true; - sHasSSE2 = true; -#else - #ifdef CPU_AMD64 - sHasMMX = true; - sHasSSE = true; - sHasSSE2 = true; - #else + unsigned int eax, ebx, ecx, edx; + ONCELOCK { #ifdef COMPILER_MSC dword info1; dword info2; @@ -34,26 +28,26 @@ static void sCheckCPU() mov info2, ecx } #else - dword info1; - dword info2; - __asm__("pushl %%ebx\n\tmovl $1, %%eax\n\tcpuid\n\tpopl %%ebx" : "=d" (info1), "=c" (info2) : : "%eax"); + __get_cpuid(1, &eax, &ebx, &ecx, &edx); #endif - sHasMMX = ((info1 >> 23) & 0x1); - sHasSSE = ((info1 >> 25) & 0x1); - sHasSSE2 = ((info1 >> 26) & 0x1); - sHasSSE3 = ((info2) & 0x1); - #endif -#endif + // https://en.wikipedia.org/wiki/CPUID#EAX.3D1:_Processor_Info_and_Feature_Bits + sHasMMX = edx & (1 << 23); + sHasSSE = edx & (1 << 25); + sHasSSE2 = edx & (1 << 26); + sHasSSE3 = ecx & 1; + sHypervisor = ecx & (1 << 31); + } } INITBLOCK { // sCheckCPU(); } -bool CpuMMX() { sCheckCPU(); return sHasMMX; } -bool CpuSSE() { sCheckCPU(); return sHasSSE; } -bool CpuSSE2() { sCheckCPU(); return sHasSSE2; } -bool CpuSSE3() { sCheckCPU(); return sHasSSE3; } +bool CpuMMX() { sCheckCPU(); return sHasMMX; } +bool CpuSSE() { sCheckCPU(); return sHasSSE; } +bool CpuSSE2() { sCheckCPU(); return sHasSSE2; } +bool CpuSSE3() { sCheckCPU(); return sHasSSE3; } +bool CpuHypervisor() { sCheckCPU(); return sHypervisor; } #ifdef PLATFORM_POSIX #ifdef PLATFORM_BSD diff --git a/uppsrc/Core/Defs.h b/uppsrc/Core/Defs.h index 22b5495d6..d13bd7a39 100644 --- a/uppsrc/Core/Defs.h +++ b/uppsrc/Core/Defs.h @@ -487,6 +487,7 @@ bool CpuMMX(); bool CpuSSE(); bool CpuSSE2(); bool CpuSSE3(); +bool CpuHypervisor(); #endif int CPU_Cores();