diff options
Diffstat (limited to 'Source/kwsys/SystemInformation.cxx')
-rw-r--r-- | Source/kwsys/SystemInformation.cxx | 301 |
1 files changed, 221 insertions, 80 deletions
diff --git a/Source/kwsys/SystemInformation.cxx b/Source/kwsys/SystemInformation.cxx index 894cf57..7041d38 100644 --- a/Source/kwsys/SystemInformation.cxx +++ b/Source/kwsys/SystemInformation.cxx @@ -13,6 +13,18 @@ # include <winsock.h> // WSADATA, include before sys/types.h #endif +// TODO: +// We need an alternative implementation for many functions in this file +// when USE_ASM_INSTRUCTIONS gets defined as 0. +// +// Consider using these on Win32/Win64 for some of them: +// +// IsProcessorFeaturePresent +// http://msdn.microsoft.com/en-us/library/ms724482(VS.85).aspx +// +// GetProcessMemoryInfo +// http://msdn.microsoft.com/en-us/library/ms683219(VS.85).aspx + #include "kwsysPrivate.h" #include KWSYS_HEADER(FundamentalType.h) #include KWSYS_HEADER(stl/string) @@ -22,6 +34,7 @@ #include KWSYS_HEADER(Process.h) #include KWSYS_HEADER(ios/iostream) #include KWSYS_HEADER(ios/sstream) + // Work-around CMake dependency scanning limitation. This must // duplicate the above list of headers. #if 0 @@ -36,7 +49,6 @@ # include "kwsys_ios_iostream.h.in" #endif - #ifndef WIN32 # include <sys/utsname.h> // int uname(struct utsname *buf); #endif @@ -76,7 +88,6 @@ #include <string.h> - namespace KWSYS_NAMESPACE { @@ -89,12 +100,13 @@ namespace KWSYS_NAMESPACE # error "No Long Long" #endif + // Define SystemInformationImplementation class typedef void (*DELAY_FUNC)(unsigned int uiMS); - -class SystemInformationImplementation -{ + +class SystemInformationImplementation +{ public: SystemInformationImplementation (); ~SystemInformationImplementation (); @@ -137,12 +149,13 @@ public: void RunCPUCheck(); void RunOSCheck(); void RunMemoryCheck(); + public: #define VENDOR_STRING_LENGTH (12 + 1) #define CHIPNAME_STRING_LENGTH (48 + 1) #define SERIALNUMBER_STRING_LENGTH (29 + 1) - typedef struct tagID + typedef struct tagID { int Type; int Family; @@ -155,14 +168,14 @@ public: char SerialNumber[SERIALNUMBER_STRING_LENGTH]; } ID; - typedef struct tagCPUPowerManagement + typedef struct tagCPUPowerManagement { bool HasVoltageID; bool HasFrequencyID; bool HasTempSenseDiode; } CPUPowerManagement; - typedef struct tagCPUExtendedFeatures + typedef struct tagCPUExtendedFeatures { bool Has3DNow; bool Has3DNowPlus; @@ -173,9 +186,9 @@ public: unsigned int LogicalProcessorsPerPhysical; int APIC_ID; CPUPowerManagement PowerManagement; - } CPUExtendedFeatures; - - typedef struct CPUtagFeatures + } CPUExtendedFeatures; + + typedef struct CPUtagFeatures { bool HasFPU; bool HasTSC; @@ -196,13 +209,14 @@ public: int L3CacheSize; CPUExtendedFeatures ExtendedFeatures; } CPUFeatures; - - enum Manufacturer + + enum Manufacturer { - AMD, Intel, NSC, UMC, Cyrix, NexGen, IDT, Rise, Transmeta, Sun, IBM, Motorola, UnknownManufacturer + AMD, Intel, NSC, UMC, Cyrix, NexGen, IDT, Rise, Transmeta, Sun, IBM, + Motorola, UnknownManufacturer }; -protected: +protected: // Functions. bool RetrieveCPUFeatures(); bool RetrieveCPUIdentity(); @@ -216,7 +230,7 @@ protected: bool RetrieveCPUPowerManagement(); bool RetrieveClassicalCPUIdentity(); bool RetrieveExtendedCPUIdentity(); - + Manufacturer ChipManufacturer; CPUFeatures Features; ID ChipID; @@ -272,17 +286,14 @@ protected: kwsys_stl::string OSVersion; kwsys_stl::string OSPlatform; }; - - - - + SystemInformation::SystemInformation() { this->Implementation = new SystemInformationImplementation; } -SystemInformation::~SystemInformation () +SystemInformation::~SystemInformation() { delete this->Implementation; } @@ -291,54 +302,67 @@ const char * SystemInformation::GetVendorString() { return this->Implementation->GetVendorString(); } + const char * SystemInformation::GetVendorID() { return this->Implementation->GetVendorID(); } + kwsys_stl::string SystemInformation::GetTypeID() { return this->Implementation->GetTypeID(); } + kwsys_stl::string SystemInformation::GetFamilyID() { return this->Implementation->GetFamilyID(); } + kwsys_stl::string SystemInformation::GetModelID() { return this->Implementation->GetModelID(); } + kwsys_stl::string SystemInformation::GetSteppingCode() { return this->Implementation->GetSteppingCode(); } + const char * SystemInformation::GetExtendedProcessorName() { return this->Implementation->GetExtendedProcessorName(); } + const char * SystemInformation::GetProcessorSerialNumber() { return this->Implementation->GetProcessorSerialNumber(); } + int SystemInformation::GetProcessorCacheSize() { return this->Implementation->GetProcessorCacheSize(); } + unsigned int SystemInformation::GetLogicalProcessorsPerPhysical() { return this->Implementation->GetLogicalProcessorsPerPhysical(); } + float SystemInformation::GetProcessorClockFrequency() { return this->Implementation->GetProcessorClockFrequency(); } + int SystemInformation::GetProcessorAPICID() { return this->Implementation->GetProcessorAPICID(); } + int SystemInformation::GetProcessorCacheXSize(long int l) { return this->Implementation->GetProcessorCacheXSize(l); } + bool SystemInformation::DoesCPUSupportFeature(long int i) { return this->Implementation->DoesCPUSupportFeature(i); @@ -348,18 +372,22 @@ const char * SystemInformation::GetOSName() { return this->Implementation->GetOSName(); } + const char * SystemInformation::GetHostname() { return this->Implementation->GetHostname(); } + const char * SystemInformation::GetOSRelease() { return this->Implementation->GetOSRelease(); } + const char * SystemInformation::GetOSVersion() { return this->Implementation->GetOSVersion(); } + const char * SystemInformation::GetOSPlatform() { return this->Implementation->GetOSPlatform(); @@ -374,6 +402,7 @@ unsigned int SystemInformation::GetNumberOfLogicalCPU() // per physical cpu { return this->Implementation->GetNumberOfLogicalCPU(); } + unsigned int SystemInformation::GetNumberOfPhysicalCPU() { return this->Implementation->GetNumberOfPhysicalCPU(); @@ -389,10 +418,12 @@ size_t SystemInformation::GetTotalVirtualMemory() { return this->Implementation->GetTotalVirtualMemory(); } + size_t SystemInformation::GetAvailableVirtualMemory() { return this->Implementation->GetAvailableVirtualMemory(); } + size_t SystemInformation::GetTotalPhysicalMemory() { return this->Implementation->GetTotalPhysicalMemory(); @@ -408,17 +439,18 @@ void SystemInformation::RunCPUCheck() { this->Implementation->RunCPUCheck(); } + void SystemInformation::RunOSCheck() { this->Implementation->RunOSCheck(); } + void SystemInformation::RunMemoryCheck() { this->Implementation->RunMemoryCheck(); } - // -------------------------------------------------------------- // SystemInformationImplementation starts here @@ -440,29 +472,29 @@ void SystemInformation::RunMemoryCheck() #define CPUID_INSTRUCTION _asm _emit 0x0f _asm _emit 0xa2 #endif -#define MMX_FEATURE 0x00000001 -#define MMX_PLUS_FEATURE 0x00000002 -#define SSE_FEATURE 0x00000004 -#define SSE2_FEATURE 0x00000008 +#define MMX_FEATURE 0x00000001 +#define MMX_PLUS_FEATURE 0x00000002 +#define SSE_FEATURE 0x00000004 +#define SSE2_FEATURE 0x00000008 #define AMD_3DNOW_FEATURE 0x00000010 -#define AMD_3DNOW_PLUS_FEATURE 0x00000020 -#define IA64_FEATURE 0x00000040 -#define MP_CAPABLE 0x00000080 -#define HYPERTHREAD_FEATURE 0x00000100 -#define SERIALNUMBER_FEATURE 0x00000200 -#define APIC_FEATURE 0x00000400 -#define SSE_FP_FEATURE 0x00000800 +#define AMD_3DNOW_PLUS_FEATURE 0x00000020 +#define IA64_FEATURE 0x00000040 +#define MP_CAPABLE 0x00000080 +#define HYPERTHREAD_FEATURE 0x00000100 +#define SERIALNUMBER_FEATURE 0x00000200 +#define APIC_FEATURE 0x00000400 +#define SSE_FP_FEATURE 0x00000800 #define SSE_MMX_FEATURE 0x00001000 -#define CMOV_FEATURE 0x00002000 -#define MTRR_FEATURE 0x00004000 +#define CMOV_FEATURE 0x00002000 +#define MTRR_FEATURE 0x00004000 #define L1CACHE_FEATURE 0x00008000 #define L2CACHE_FEATURE 0x00010000 #define L3CACHE_FEATURE 0x00020000 -#define ACPI_FEATURE 0x00040000 -#define THERMALMONITOR_FEATURE 0x00080000 -#define TEMPSENSEDIODE_FEATURE 0x00100000 -#define FREQUENCYID_FEATURE 0x00200000 -#define VOLTAGEID_FREQUENCY 0x00400000 +#define ACPI_FEATURE 0x00040000 +#define THERMALMONITOR_FEATURE 0x00080000 +#define TEMPSENSEDIODE_FEATURE 0x00100000 +#define FREQUENCYID_FEATURE 0x00200000 +#define VOLTAGEID_FREQUENCY 0x00400000 // Status Flag #define HT_NOT_CAPABLE 0 @@ -489,7 +521,6 @@ void SystemInformation::RunMemoryCheck() // Default value = 0xff if HT is not supported - SystemInformationImplementation::SystemInformationImplementation() { this->TotalVirtualMemory = 0; @@ -518,32 +549,48 @@ void SystemInformationImplementation::RunCPUCheck() { #ifdef WIN32 // Check to see if this processor supports CPUID. - if (DoesCPUSupportCPUID()) + bool supportsCPUID = DoesCPUSupportCPUID(); + + if (supportsCPUID) { // Retrieve the CPU details. RetrieveCPUIdentity(); RetrieveCPUFeatures(); - if (!RetrieveCPUClockSpeed()) - { - RetrieveClassicalCPUClockSpeed(); - } + } + + // These two may be called without support for the CPUID instruction. + // (But if the instruction is there, they should be called *after* + // the above call to RetrieveCPUIdentity... that's why the two if + // blocks exist with the same "if (supportsCPUID)" logic... + // + if (!RetrieveCPUClockSpeed()) + { + RetrieveClassicalCPUClockSpeed(); + } - // Attempt to retrieve cache information. + if (supportsCPUID) + { + // Retrieve cache information. if (!RetrieveCPUCacheDetails()) { RetrieveClassicalCPUCacheDetails(); } + // Retrieve the extended CPU details. if (!RetrieveExtendedCPUIdentity()) { RetrieveClassicalCPUIdentity(); } + RetrieveExtendedCPUFeatures(); + RetrieveCPUPowerManagement(); // Now attempt to retrieve the serial number (if possible). RetrieveProcessorSerialNumber(); } + this->CPUCount(); + #elif defined(__APPLE__) this->ParseSysCtl(); #elif defined (__SVR4) && defined (__sun) @@ -559,7 +606,7 @@ void SystemInformationImplementation::RunOSCheck() { this->QueryOSInformation(); } - + void SystemInformationImplementation::RunMemoryCheck() { #if defined(__APPLE__) @@ -613,7 +660,7 @@ const char* SystemInformationImplementation::GetOSPlatform() const char * SystemInformationImplementation::GetVendorID() { // Return the vendor ID. - switch (this->ChipManufacturer) + switch (this->ChipManufacturer) { case Intel: return "Intel Corporation"; @@ -716,7 +763,7 @@ int SystemInformationImplementation::GetProcessorCacheSize() /** Return the chosen cache size. */ int SystemInformationImplementation::GetProcessorCacheXSize(long int dwCacheID) { - switch (dwCacheID) + switch (dwCacheID) { case L1CACHE_FEATURE: return this->Features.L1CacheSize; @@ -728,6 +775,7 @@ int SystemInformationImplementation::GetProcessorCacheXSize(long int dwCacheID) return -1; } + bool SystemInformationImplementation::DoesCPUSupportFeature(long int dwFeature) { bool bHasFeature = false; @@ -801,6 +849,7 @@ bool SystemInformationImplementation::DoesCPUSupportFeature(long int dwFeature) return bHasFeature; } + void SystemInformationImplementation::Delay(unsigned int uiMS) { #ifdef WIN32 @@ -822,6 +871,7 @@ void SystemInformationImplementation::Delay(unsigned int uiMS) (void)uiMS; } + bool SystemInformationImplementation::DoesCPUSupportCPUID() { #if USE_ASM_INSTRUCTIONS @@ -857,19 +907,20 @@ bool SystemInformationImplementation::DoesCPUSupportCPUID() // The cpuid instruction succeeded. return true; + #else // Assume no cpuid instruction. return false; #endif } + bool SystemInformationImplementation::RetrieveCPUFeatures() { #if USE_ASM_INSTRUCTIONS int localCPUFeatures = 0; int localCPUAdvanced = 0; - // Use assembly to detect CPUID information... __try { _asm { @@ -905,17 +956,17 @@ bool SystemInformationImplementation::RetrieveCPUFeatures() } // Retrieve the features of CPU present. - this->Features.HasFPU = ((localCPUFeatures & 0x00000001) != 0); // FPU Present --> Bit 0 - this->Features.HasTSC = ((localCPUFeatures & 0x00000010) != 0); // TSC Present --> Bit 4 + this->Features.HasFPU = ((localCPUFeatures & 0x00000001) != 0); // FPU Present --> Bit 0 + this->Features.HasTSC = ((localCPUFeatures & 0x00000010) != 0); // TSC Present --> Bit 4 this->Features.HasAPIC = ((localCPUFeatures & 0x00000200) != 0); // APIC Present --> Bit 9 this->Features.HasMTRR = ((localCPUFeatures & 0x00001000) != 0); // MTRR Present --> Bit 12 this->Features.HasCMOV = ((localCPUFeatures & 0x00008000) != 0); // CMOV Present --> Bit 15 this->Features.HasSerial = ((localCPUFeatures & 0x00040000) != 0); // Serial Present --> Bit 18 this->Features.HasACPI = ((localCPUFeatures & 0x00400000) != 0); // ACPI Capable --> Bit 22 - this->Features.HasMMX = ((localCPUFeatures & 0x00800000) != 0); // MMX Present --> Bit 23 - this->Features.HasSSE = ((localCPUFeatures & 0x02000000) != 0); // SSE Present --> Bit 25 + this->Features.HasMMX = ((localCPUFeatures & 0x00800000) != 0); // MMX Present --> Bit 23 + this->Features.HasSSE = ((localCPUFeatures & 0x02000000) != 0); // SSE Present --> Bit 25 this->Features.HasSSE2 = ((localCPUFeatures & 0x04000000) != 0); // SSE2 Present --> Bit 26 - this->Features.HasThermal = ((localCPUFeatures & 0x20000000) != 0); // Thermal Monitor Present --> Bit 29 + this->Features.HasThermal = ((localCPUFeatures & 0x20000000) != 0); // Thermal Monitor Present --> Bit 29 this->Features.HasIA64 = ((localCPUFeatures & 0x40000000) != 0); // IA64 Present --> Bit 30 // Retrieve extended SSE capabilities if SSE is available. @@ -959,15 +1010,19 @@ bool SystemInformationImplementation::RetrieveCPUFeatures() this->Features.ExtendedFeatures.APIC_ID = ((localCPUAdvanced & 0xFF000000) >> 24); } } -#endif + return true; + +#else + return false; +#endif } /** Find the manufacturer given the vendor id */ void SystemInformationImplementation::FindManufacturer() { - if (strcmp (this->ChipID.Vendor, "GenuineIntel") == 0) this->ChipManufacturer = Intel; // Intel Corp. + if (strcmp (this->ChipID.Vendor, "GenuineIntel") == 0) this->ChipManufacturer = Intel; // Intel Corp. else if (strcmp (this->ChipID.Vendor, "UMC UMC UMC ") == 0) this->ChipManufacturer = UMC; // United Microelectronics Corp. else if (strcmp (this->ChipID.Vendor, "AuthenticAMD") == 0) this->ChipManufacturer = AMD; // Advanced Micro Devices else if (strcmp (this->ChipID.Vendor, "AMD ISBETTER") == 0) this->ChipManufacturer = AMD; // Advanced Micro Devices (1994) @@ -981,9 +1036,10 @@ void SystemInformationImplementation::FindManufacturer() else if (strcmp (this->ChipID.Vendor, "Sun") == 0) this->ChipManufacturer = Sun; // Sun Microelectronics else if (strcmp (this->ChipID.Vendor, "IBM") == 0) this->ChipManufacturer = IBM; // IBM Microelectronics else if (strcmp (this->ChipID.Vendor, "Motorola") == 0) this->ChipManufacturer = Motorola; // Motorola Microelectronics - else this->ChipManufacturer = UnknownManufacturer; // Unknown manufacturer + else this->ChipManufacturer = UnknownManufacturer; // Unknown manufacturer } + /** */ bool SystemInformationImplementation::RetrieveCPUIdentity() { @@ -1052,11 +1108,15 @@ bool SystemInformationImplementation::RetrieveCPUIdentity() this->ChipID.Family = ((localCPUSignature & 0x00000F00) >> 8); // Bits 11..8 Used this->ChipID.Model = ((localCPUSignature & 0x000000F0) >> 4); // Bits 7..4 Used this->ChipID.Revision = ((localCPUSignature & 0x0000000F) >> 0); // Bits 3..0 Used -#endif return true; + +#else + return false; +#endif } + /** */ bool SystemInformationImplementation::RetrieveCPUCacheDetails() { @@ -1174,6 +1234,7 @@ bool SystemInformationImplementation::RetrieveCPUCacheDetails() return ((this->Features.L1CacheSize == -1) && (this->Features.L2CacheSize == -1)) ? false : true; } + /** */ bool SystemInformationImplementation::RetrieveClassicalCPUCacheDetails() { @@ -1370,18 +1431,51 @@ bool SystemInformationImplementation::RetrieveClassicalCPUCacheDetails() this->Features.L3CacheSize = L3Unified; } -#endif return true; + +#else + return false; +#endif } + /** */ bool SystemInformationImplementation::RetrieveCPUClockSpeed() { + bool retrieved = false; + #if _WIN32 - // First of all we check to see if the RDTSC (0x0F, 0x31) instruction is supported. - if (!this->Features.HasTSC) + // First of all we check to see if the RDTSC (0x0F, 0x31) instruction is + // supported. If not, we fallback to trying to read this value from the + // registry: + // + if (!this->Features.HasTSC) { - return false; + HKEY hKey = NULL; + LONG err = RegOpenKeyEx(HKEY_LOCAL_MACHINE, + "HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0", 0, + KEY_READ, &hKey); + + if (ERROR_SUCCESS == err) + { + DWORD dwType = 0; + DWORD data = 0; + DWORD dwSize = sizeof(DWORD); + + err = RegQueryValueEx(hKey, "~MHz", 0, + &dwType, (LPBYTE) &data, &dwSize); + + if (ERROR_SUCCESS == err) + { + this->CPUSpeedInMHz = (float) data; + retrieved = true; + } + + RegCloseKey(hKey); + hKey = NULL; + } + + return retrieved; } unsigned int uiRepetitions = 1; @@ -1389,7 +1483,7 @@ bool SystemInformationImplementation::RetrieveCPUClockSpeed() __int64 i64Total = 0; __int64 i64Overhead = 0; - for (unsigned int nCounter = 0; nCounter < uiRepetitions; nCounter ++) + for (unsigned int nCounter = 0; nCounter < uiRepetitions; nCounter ++) { i64Total += GetCyclesDifference (SystemInformationImplementation::Delay, uiMSecPerRepetition); @@ -1407,12 +1501,13 @@ bool SystemInformationImplementation::RetrieveCPUClockSpeed() // Save the CPU speed. this->CPUSpeedInMHz = (float) i64Total; - return true; -#else - return false; + retrieved = true; #endif + + return retrieved; } + /** */ bool SystemInformationImplementation::RetrieveClassicalCPUClockSpeed() { @@ -1466,11 +1561,15 @@ bool SystemInformationImplementation::RetrieveClassicalCPUClockSpeed() // Save the clock speed. this->Features.CPUSpeed = (int) dFrequency; -#else + return true; + +#else + return false; #endif } + /** */ bool SystemInformationImplementation::RetrieveCPUExtendedLevelSupport(int CPULevelToCheck) { @@ -1516,7 +1615,7 @@ bool SystemInformationImplementation::RetrieveCPUExtendedLevelSupport(int CPULev return false; } } - + #if USE_ASM_INSTRUCTIONS // Use assembly to detect CPUID information... @@ -1564,6 +1663,7 @@ bool SystemInformationImplementation::RetrieveCPUExtendedLevelSupport(int CPULev return true; } + /** */ bool SystemInformationImplementation::RetrieveExtendedCPUFeatures() { @@ -1579,6 +1679,7 @@ bool SystemInformationImplementation::RetrieveExtendedCPUFeatures() { return false; } + #if USE_ASM_INSTRUCTIONS int localCPUExtendedFeatures = 0; @@ -1634,11 +1735,15 @@ bool SystemInformationImplementation::RetrieveExtendedCPUFeatures() { this->Features.ExtendedFeatures.HasMMXPlus = ((localCPUExtendedFeatures & 0x01000000) != 0); // Cyrix specific: Extended MMX --> Bit 24 } -#endif return true; + +#else + return false; +#endif } + /** */ bool SystemInformationImplementation::RetrieveProcessorSerialNumber() { @@ -1651,7 +1756,6 @@ bool SystemInformationImplementation::RetrieveProcessorSerialNumber() #if USE_ASM_INSTRUCTIONS int SerialNumber[3]; - // Use assembly to detect CPUID information... __try { _asm { @@ -1701,14 +1805,18 @@ bool SystemInformationImplementation::RetrieveProcessorSerialNumber() ((SerialNumber[2] & 0x00ff0000) >> 16), ((SerialNumber[2] & 0x0000ff00) >> 8), ((SerialNumber[2] & 0x000000ff) >> 0)); -#endif return true; + +#else + return false; +#endif } + /** */ bool SystemInformationImplementation::RetrieveCPUPowerManagement() -{ +{ // Check to see if what we are about to do is supported... if (!RetrieveCPUExtendedLevelSupport(static_cast<int>(0x80000007))) { @@ -1758,11 +1866,14 @@ bool SystemInformationImplementation::RetrieveCPUPowerManagement() this->Features.ExtendedFeatures.PowerManagement.HasFrequencyID = ((localCPUPowerManagement & 0x00000002) != 0); this->Features.ExtendedFeatures.PowerManagement.HasVoltageID = ((localCPUPowerManagement & 0x00000004) != 0); -#endif - return true; + +#else + return false; +#endif } + /** */ bool SystemInformationImplementation::RetrieveExtendedCPUIdentity() { @@ -1773,7 +1884,7 @@ bool SystemInformationImplementation::RetrieveExtendedCPUIdentity() return false; if (!RetrieveCPUExtendedLevelSupport(static_cast<int>(0x80000004))) return false; - + #if USE_ASM_INSTRUCTIONS int ProcessorNameStartPos = 0; int CPUExtendedIdentity[12]; @@ -1869,11 +1980,15 @@ bool SystemInformationImplementation::RetrieveExtendedCPUIdentity() // Now move the name forward so that there is no white space. memmove(this->ChipID.ProcessorName, &(this->ChipID.ProcessorName[ProcessorNameStartPos]), (CHIPNAME_STRING_LENGTH - ProcessorNameStartPos)); } -#endif return true; + +#else + return false; +#endif } + /** */ bool SystemInformationImplementation::RetrieveClassicalCPUIdentity() { @@ -2150,6 +2265,7 @@ bool SystemInformationImplementation::RetrieveClassicalCPUIdentity() return true; } + /** Extract a value from the CPUInfo file */ kwsys_stl::string SystemInformationImplementation::ExtractValueFromCpuInfoFile(kwsys_stl::string buffer,const char* word,size_t init) { @@ -2520,6 +2636,7 @@ LongLong SystemInformationImplementation::GetCyclesDifference (DELAY_FUNC DelayF #endif } + /** Compute the delay overhead */ void SystemInformationImplementation::DelayOverhead(unsigned int uiMS) { @@ -2549,6 +2666,7 @@ void SystemInformationImplementation::DelayOverhead(unsigned int uiMS) unsigned char SystemInformationImplementation::LogicalCPUPerPhysicalCPU(void) { unsigned int Regebx = 0; + #if USE_ASM_INSTRUCTIONS if (!this->IsHyperThreadingSupported()) { @@ -2575,9 +2693,11 @@ unsigned char SystemInformationImplementation::LogicalCPUPerPhysicalCPU(void) return static_cast<unsigned char>(cores_per_package); } #endif + return static_cast<unsigned char> ((Regebx & NUM_LOGICAL_BITS) >> 16); } + /** Works only for windows */ unsigned int SystemInformationImplementation::IsHyperThreadingSupported() { @@ -2624,10 +2744,12 @@ unsigned int SystemInformationImplementation::IsHyperThreadingSupported() return 0; // Not genuine Intel processor } + /** Return the APIC Id. Works only for windows. */ unsigned char SystemInformationImplementation::GetAPICId() { unsigned int Regebx = 0; + #if USE_ASM_INSTRUCTIONS if (!this->IsHyperThreadingSupported()) { @@ -2640,9 +2762,11 @@ unsigned char SystemInformationImplementation::GetAPICId() mov Regebx, ebx } #endif + return static_cast<unsigned char>((Regebx & INITIAL_APIC_ID_BITS) >> 24); } + /** Count the number of CPUs. Works only on windows. */ int SystemInformationImplementation::CPUCount() { @@ -2756,18 +2880,21 @@ int SystemInformationImplementation::CPUCount() #endif } + /** Return the number of logical CPUs on the system */ unsigned int SystemInformationImplementation::GetNumberOfLogicalCPU() { return this->NumberOfLogicalCPU; } + /** Return the number of physical CPUs on the system */ unsigned int SystemInformationImplementation::GetNumberOfPhysicalCPU() { return this->NumberOfPhysicalCPU; } + /** For Mac use sysctlbyname calls to find system info */ bool SystemInformationImplementation::ParseSysCtl() { @@ -2879,6 +3006,7 @@ bool SystemInformationImplementation::ParseSysCtl() #endif } + /** Extract a value from sysctl command */ kwsys_stl::string SystemInformationImplementation::ExtractValueFromSysCtl(const char* word) { @@ -2895,6 +3023,7 @@ kwsys_stl::string SystemInformationImplementation::ExtractValueFromSysCtl(const return ""; } + /** Run a given process */ kwsys_stl::string SystemInformationImplementation::RunProcess(kwsys_stl::vector<const char*> args) { @@ -2955,7 +3084,7 @@ kwsys_stl::string SystemInformationImplementation::RunProcess(kwsys_stl::vector< } return buffer; } - + kwsys_stl::string SystemInformationImplementation::ParseValueFromKStat(const char* arguments) { @@ -3024,6 +3153,7 @@ kwsys_stl::string SystemInformationImplementation::ParseValueFromKStat(const cha return value; } + /** Querying for system information from Solaris */ bool SystemInformationImplementation::QuerySolarisInfo() { @@ -3069,6 +3199,7 @@ bool SystemInformationImplementation::QuerySolarisInfo() return true; } + /** Querying for system information from Haiku OS */ bool SystemInformationImplementation::QueryHaikuInfo() { @@ -3134,10 +3265,14 @@ bool SystemInformationImplementation::QueryHaikuInfo() this->Features.L1CacheSize = 0; this->Features.L2CacheSize = 0; -#endif return true; + +#else + return false; +#endif } + /** Query the operating system information */ bool SystemInformationImplementation::QueryOSInformation() { @@ -3382,15 +3517,18 @@ bool SystemInformationImplementation::QueryOSInformation() this->OSVersion = unameInfo.version; this->OSPlatform = unameInfo.machine; } + #ifdef __APPLE__ this->CallSwVers(); #endif + #endif return true; } + void SystemInformationImplementation::CallSwVers() { #ifdef __APPLE__ @@ -3423,6 +3561,7 @@ void SystemInformationImplementation::CallSwVers() #endif } + void SystemInformationImplementation::TrimNewline(kwsys_stl::string& output) { // remove \r @@ -3440,10 +3579,12 @@ void SystemInformationImplementation::TrimNewline(kwsys_stl::string& output) } } + /** Return true if the machine is 64 bits */ bool SystemInformationImplementation::Is64Bits() { return (sizeof(void*) == 8); } + } // namespace @KWSYS_NAMESPACE@ |