diff options
Diffstat (limited to 'arch/x86/cpuinfo')
| -rw-r--r-- | arch/x86/cpuinfo/CpuidCheck.s | 21 | ||||
| -rw-r--r-- | arch/x86/cpuinfo/Cpuinfo.cpp | 345 | ||||
| -rw-r--r-- | arch/x86/cpuinfo/Cpuinfo.h | 365 |
3 files changed, 0 insertions, 731 deletions
diff --git a/arch/x86/cpuinfo/CpuidCheck.s b/arch/x86/cpuinfo/CpuidCheck.s deleted file mode 100644 index 67bc9eb..0000000 --- a/arch/x86/cpuinfo/CpuidCheck.s +++ /dev/null @@ -1,21 +0,0 @@ -global CPUIDCHK:function -CPUIDCHK: - push ebx - pushfd - pop eax - mov ebx, eax - xor eax, 0x200000 - push eax - popfd - pushfd - pop eax - xor eax, ebx - je nocpuid - mov eax, 1 - jmp restore -nocpuid: - mov eax, 0 -restore: - pop ebx - ret -.endchk: diff --git a/arch/x86/cpuinfo/Cpuinfo.cpp b/arch/x86/cpuinfo/Cpuinfo.cpp deleted file mode 100644 index b246ef7..0000000 --- a/arch/x86/cpuinfo/Cpuinfo.cpp +++ /dev/null @@ -1,345 +0,0 @@ -#include "Cpuinfo.h" - - -inline Cpuinfo::cpuidFunctionIndex operator++(Cpuinfo::cpuidFunctionIndex& command) -{ - command = Cpuinfo::cpuidFunctionIndex(int(command) + 1); - switch(int(command)) - { - case 0x8: command = Cpuinfo::DirectCacheAccessInfo; break; - case 0xC: command = Cpuinfo::ExtendedStateInfo; break; - case 0xE: command = Cpuinfo::RDTMonitoring; break; - case 0x11: command = Cpuinfo::SGXInfo; break; - case 0x13: command = Cpuinfo::TraceInfo; break; - default: - { - uint32 commandInt(command); - if(commandInt > Cpuinfo::SOCInfo - and commandInt < Cpuinfo::UnimplementedStart) - { - command = Cpuinfo::UnimplementedStart; - } - else if(commandInt > Cpuinfo::UnimplementedStart - and commandInt < Cpuinfo::UnimplementedEnd) - { - command = Cpuinfo::UnimplementedEnd; - } - else if(commandInt > Cpuinfo::UnimplementedEnd - and commandInt < Cpuinfo::ExtendedCpuidStart) - { - command = Cpuinfo::ExtendedCpuidStart; - } - else if(commandInt > Cpuinfo::ExtendedCpuidEnd) - { - command = Cpuinfo::BasicInfo; - } - break; - } - }; - - return command; -}; - -Cpuinfo::Cpuinfo() -{ - eax = ebx = ecx = edx = 0; - cpuidAvailable = CPUIDCHK(); - isBrandStringSupported = false; - maximumInputValue = maximumInputValueExtended = 0; - displayModel = displayFamily = stepping = 0; - brandIndex = clflushLineSize = maxNumberApicsIds = initialApicId = 0; - maxNumberProcessorsIds = 0; - currentCpuType = processorType::NotRead; - serialNumber = 0; - - MemoryOperations::set(vendorString, '\0', vendorStringSize); - MemoryOperations::set(brandString, '\0', brandStringSize); - - dataFilling(Cpuinfo::BasicInfo, Cpuinfo::ExtendedCpuidEnd); -}; - -bool Cpuinfo::isEaxValueCorrect(const cpuidFunctionIndex eaxInitValue) -{ - if(!cpuidAvailable) return false; - - else if(eaxInitValue > maximumInputValue - and eaxInitValue < ExtendedCpuidStart) return false; - - else if(eaxInitValue > maximumInputValueExtended - and eaxInitValue > ExtendedCpuidStart) return false; - - else if(eaxInitValue == 0x8 - or eaxInitValue == 0xC - or eaxInitValue == 0xE - or eaxInitValue == 0x11 - or eaxInitValue == 0x13) return false; - - else return true; -}; - -void Cpuinfo::setBasicData() -{ - maximumInputValue = eax; - - uint32 vendorStringInt[3] = {ebx, edx, ecx}; - - MemoryOperations::copy(vendorStringInt, vendorString, sizeof(uint32) * 3); -}; - -void Cpuinfo::setVersionData() -{ - uint8 steppingId, modelId, familyId, modelIdExt, familyIdExt; - - steppingId = eax & 0xf; - modelId = (eax >> 4) & 0xf; - familyId = (eax >> 8) & 0xf; - modelIdExt = (eax >> 16) & 0xf; - familyIdExt = (eax >> 20) & 0xf; - - stepping = steppingId; - currentCpuType = (processorType)((eax >> 12) & 0x3); - - if(familyId != 0xf) - { - displayFamily = familyId; - } - else displayFamily = familyIdExt + familyId; - - if(familyId == 0x6 or familyId == 0xf) - { - displayModel = (modelIdExt << 4) + modelId; - } - else displayModel = modelId; - - brandIndex = (uint8)ebx; - clflushLineSize = ((uint8)(ebx >> 8)) << 3; - maxNumberProcessorsIds = (ebx >> 16) & 0x0F; - initialApicId = ebx >> 24; - - if(edx & Cpuinfo::HTT) - { - uint8 powerOfTwo = 1; - for(; powerOfTwo < maxNumberProcessorsIds; powerOfTwo *= 2); - if(maxNumberProcessorsIds == NULL) maxNumberApicsIds = NULL; - else maxNumberApicsIds = powerOfTwo; - } -}; - -void Cpuinfo::setInternalData() -{ - uint32 regs[4] = {eax, ebx, ecx, edx}; - uint8 idxDesc = 0; - - for(uint8 idx = 0; idx < 4; idx++) - { - uint32 ® = regs[idx]; - for(uint8 bytes = 0; bytes < 4; bytes++) - { - internalInfoDescriptors[idxDesc++] = reg & 0xff; - reg >>= 8; - } - } -}; - -void Cpuinfo::setSerialData() -{ - if(cpuid(VersionInfo) - || !(edx & Cpuinfo::PSN) - || cpuid(SerialNumberInfo)) return; - - serialNumber = ((uint64)ecx) | (((uint64)edx) << 32); -}; - -void Cpuinfo::setExtendedBasicData() -{ - if(eax & Cpuinfo::ExtendedBasicInfo) - { - maximumInputValueExtended = eax; - isBrandStringSupported = true; - } - else isBrandStringSupported = false; -}; - -void Cpuinfo::setBrandString(brandStringPart part) -{ - if((part == Cpuinfo::brandString_low or - part == Cpuinfo::brandString_middle or - part == Cpuinfo::brandString_hight) - and isBrandStringSupported) - { - uint8 partUint = uint8(part); - uint32 regs[4] = {eax, ebx, ecx, edx}; - - MemoryOperations::copy(regs, &brandString[partUint], sizeof(uint32) * 4); - } -}; - -bool Cpuinfo::decodeCpuidResult(const cpuidFunctionIndex eaxValue) -{ - switch(eaxValue) - { - case Cpuinfo::BasicInfo: setBasicData(); break; - case Cpuinfo::VersionInfo: setVersionData(); break; - case Cpuinfo::InternalInfo: setInternalData(); break; - case Cpuinfo::SerialNumberInfo: setSerialData(); break; - case Cpuinfo::MonitorMwaitInfo: break; - case Cpuinfo::ThermalPowerInfo: break; - case Cpuinfo::DirectCacheAccessInfo: break; - case Cpuinfo::PerformanceMonitoring: break; - case Cpuinfo::ClockInfo: break; - case Cpuinfo::FrequencyInfo: break; - case Cpuinfo::ExtendedBasicInfo: setExtendedBasicData(); break; - case Cpuinfo::MoreFeatureInfo: break; - case Cpuinfo::BrandStringLow: setBrandString(brandString_low); break; - case Cpuinfo::BrandStringMiddle: setBrandString(brandString_middle); break; - case Cpuinfo::BrandStringHight: setBrandString(brandString_hight); break; - case Cpuinfo::CacheInfo: break; - case Cpuinfo::MiscFeatureInfo: break; - case Cpuinfo::AddressSize: break; - default: return true; break; - }; - - return false; -}; - -bool Cpuinfo::decodeCpuidCommand(const cpuidFunctionIndex eaxValue) -{ - if(cpuid(eaxValue)) - { - return true; - } - else - { - return decodeCpuidResult(eaxValue); - } -}; - -bool Cpuinfo::cpuid(const cpuidFunctionIndex eaxValue) -{ - // Clear registers - eax = ebx = ecx = edx = 0; - - if(!isEaxValueCorrect(eaxValue) - or isCommandSupportSubLeaf(eaxValue)) return true; - - asm("movl %[eaxValue], %%eax\n\t" - "movl %0, %%eax\n\t" - "cpuid\n\t" - "movl %%eax, %0\n\t" - "movl %%ebx, %1\n\t" - "movl %%ecx, %2\n\t" - "movl %%edx, %3\n\t" - : "=r" (eax), "=r" (ebx), "=r" (ecx), "=r" (edx) - : [eaxValue] "r" (eaxValue)); - - return false; -}; - -bool Cpuinfo::cpuid(const cpuidFunctionIndex eaxValue, uint32 ecxValue) -{ - // Clear registers - eax = ebx = ecx = edx = 0; - - if(!isEaxValueCorrect(eaxValue) - or !isCommandSupportSubLeaf(eaxValue)) return true; - - asm("movl %[eaxValue], %%eax\n\t" - "movl %[ecxValue], %%ecx\n\t" - "cpuid\n\t" - "movl %%eax, %0\n\t" - "movl %%ebx, %1\n\t" - "movl %%ecx, %2\n\t" - "movl %%edx, %3\n\t" - : "=r" (eax), "=r" (ebx), "=r" (ecx), "=r" (edx) - : [eaxValue] "r" (eaxValue), [ecxValue] "r" (ecxValue)); - - return false; -}; - -bool Cpuinfo::isCommandSupportSubLeaf(const cpuidFunctionIndex eaxValue) -{ - switch(eaxValue) - { - case DeterministicCacheInfo: return true; break; - case FeatureInfo: return true; break; - case ExtendedTopologyInfo: return true; break; - case ExtendedStateInfo: return true; break; - case RDTMonitoring: return true; break; - case AllocationInfo: return true; break; - case SGXInfo: return true; break; - case TraceInfo: return true; break; - case SOCInfo: return true; break; - default: return false; break; - }; -}; - -const char* Cpuinfo::getVendorString() -{ - const char* vendorStringInvalid = "VendorStringInvalid"; - - if(maximumInputValue != NULL) return (const char *)vendorString; - else return vendorStringInvalid; -}; - -void Cpuinfo::dataFilling(cpuidFunctionIndex startValue, - cpuidFunctionIndex endValue) -{ - cpuidFunctionIndex command = startValue; - uint32 ecx = 0; - - do{ - if(isEaxValueCorrect(command)) - { - if(isCommandSupportSubLeaf(command)) - { - cpuid(command, ecx); - } - else decodeCpuidCommand(command); - } - }while(++command <= endValue and command != Cpuinfo::BasicInfo); -}; - -cpuidOutputRegisters Cpuinfo::getRegs() -{ - return {eax, ebx, ecx, edx}; -}; - -uint8 Cpuinfo::getDisplayFamily() -{ - return displayFamily; -}; - -uint8 Cpuinfo::getDisplayModel() -{ - return displayModel; -}; - -uint8 Cpuinfo::getStepping() -{ - return stepping; -}; - -Cpuinfo::processorType Cpuinfo::getProcessorType() -{ - return currentCpuType; -}; - -uint8 Cpuinfo::getMaxFunctionIndex() -{ - return maximumInputValue; -}; - -uint32 Cpuinfo::getMaxFunctionIndexExtended() -{ - return maximumInputValueExtended; -}; - -const char* Cpuinfo::getBrandString() -{ - return (const char*)brandString; -}; - -uint8* Cpuinfo::getInternalDescriptors() -{ - return internalInfoDescriptors; -}; diff --git a/arch/x86/cpuinfo/Cpuinfo.h b/arch/x86/cpuinfo/Cpuinfo.h deleted file mode 100644 index 6adce11..0000000 --- a/arch/x86/cpuinfo/Cpuinfo.h +++ /dev/null @@ -1,365 +0,0 @@ -#ifndef CPUID_H -#define CPUID_H -#include <types.h> -#include <MemoryOperations.h> - - -#ifdef __cplusplus -extern "C" { -#endif -extern bool CPUIDCHK(); -#ifdef __cplusplus -}; -#endif - -struct cpuidOutputRegisters -{ - uint32 eax; - uint32 ebx; - uint32 ecx; - uint32 edx; -}; - -/* Some updates: -// 1. Add ability to initialize all variables -// who depend on initial eax value in construction -*/ - -class Cpuinfo -{ - public: - // Initial value passed to eax register - enum cpuidFunctionIndex - { - BasicInfo = 0, - VersionInfo = 0x1, - InternalInfo = 0x2, - SerialNumberInfo = 0x3, - DeterministicCacheInfo = 0x4, - MonitorMwaitInfo = 0x5, - ThermalPowerInfo = 0x6, - FeatureInfo = 0x7, - DirectCacheAccessInfo = 0x9, - PerformanceMonitoring = 0xA, - ExtendedTopologyInfo = 0xB, - ExtendedStateInfo = 0xD, - RDTMonitoring = 0xF, - AllocationInfo = 0x10, - SGXInfo = 0x12, - TraceInfo = 0x14, - ClockInfo = 0x15, - FrequencyInfo = 0x16, - SOCInfo = 0x17, - UnimplementedStart = 0x40000000, - UnimplementedEnd = 0x4FFFFFFF, - ExtendedCpuidStart = 0x80000000, - ExtendedBasicInfo = 0x80000000, - MoreFeatureInfo = 0x80000001, - BrandStringLow = 0x80000002, - BrandStringMiddle = 0x80000003, - BrandStringHight = 0x80000004, - NotInfo = 0x80000005, - CacheInfo = 0x80000006, - MiscFeatureInfo = 0x80000007, - AddressSize = 0x80000008, - ExtendedCpuidEnd = 0x80000008, - }; - - enum processorType - { - OriginalOEM = 0, - IntelOneDrive = 1, - Dual = 2, - Reserved = 3, - NotRead = 0xf - }; - - enum featureInformationEcx - { - SSE3 = 1, - PCLMULDQDQ = 1 << 1, - DTES64 = 1 << 2, - MONITOR = 1 << 3, - DS_CPL = 1 << 4, - VMX = 1 << 5, - SMX = 1 << 6, - EIST = 1 << 7, - TM2 = 1 << 8, - SSSE3 = 1 << 9, - CNXT_ID = 1 << 10, - SDBG = 1 << 11, - FMA = 1 << 12, - CMPXCHG16B = 1 << 13, - xTPRUpdateControl = 1 << 14, - PDCM = 1 << 15, - PCID = 1 << 17, - DCA = 1 << 18, - SSE4_1 = 1 << 19, - SSE4_2 = 1 << 20, - x2APIC = 1 << 21, - MOVBE = 1 << 22, - POPCNT = 1 << 23, - TSC_Deadline = 1 << 24, - AESNI = 1 << 25, - XSAVE = 1 << 26, - OSXSAVE = 1 << 27, - AVX = 1 << 28, - F16C = 1 << 29, - RDRAND = 1 << 30 - }; - - enum featureInformationEdx - { - FPU = 1, - VME = 1 << 1, - DE = 1 << 2, - PSE = 1 << 3, - TSC = 1 << 4, - MSR = 1 << 5, - PAE = 1 << 6, - MCE = 1 << 7, - CX8 = 1 << 8, - APIC = 1 << 9, - SEP = 1 << 11, - MTRR = 1 << 12, - PGE = 1 << 13, - MCA = 1 << 14, - CMOV = 1 << 15, - PAT = 1 << 16, - PSE_36 = 1 << 17, - PSN = 1 << 18, - CLFSH = 1 << 19, - DS = 1 << 21, - ACPI = 1 << 22, - MMX = 1 << 23, - FXSR = 1 << 24, - SSE = 1 << 25, - SSE2 = 1 << 26, - SS = 1 << 27, - HTT = 1 << 28, - TM = 1 << 29, - PBE = 1 << 31 - }; - - enum generalDescriptors - { - NullDescriptor = 0, - NotreportInformation = 0xFF - }; - - enum TlbDescriptors - { - // TLB + type _ page size _ associative _ amount entries _ array (not necessary) - TLBI_4Kb_4WSA_32E = 0x1, - TLBI_4Mb_fullyA_32E = 0x2, - TLBD_4Kb_4WSA_64E = 0x3, - TLBD_4Mb_4WSA_8E = 0x4, - TLBD_4Mb_4WSA_32E = 0x5, - TLBI_4Mb_4WSA_4E = 0xB, - TLBI_4Kb_32E = 0x4F, - TLBI_4Kb2Mb_64E = 0x50, - TLBI_4Mb_64E = 0x50, - TLBI_4Kb2Mb_128E = 0x51, - TLBI_4Mb_128E = 0x51, - TLBI_4Kb2Mb_256E = 0x52, - TLBI_4Mb_256E = 0x52, - TLBI_2Mb_fully_7E = 0x55, - TLBI_4Mb_fully_7E = 0x55, - TLB0D_4Mb_4WSA_16E = 0x56, - TLB0D_4Kb_4WA_16E = 0x57, - TLB0D_4Kb_fully_16E = 0x59, - TLB0D_2Mb_4WSA_32E = 0x5A, - TLB0D_4Mb_4WSA_32E = 0x5A, - TLBD_4Kb4Mb_64E = 0x5B, - TLBD_4Kb4Mb_128E = 0x5C, - TLBD_4Kb4Mb_256E = 0x5D, - TLBI_4Kb_fully_48E = 0x61, - TLBD_2Mb_4WSA_32E_1GbArray4E = 0x63, - TLBD_4Mb_4WSA_32E_1GbArray4E = 0x63, - TLBD_4Kb_4WSA_512E = 0x64, - TLBI_2Mb_fully_8E = 0x76, - TLBI_4Mb_fully_8E = 0x76, - DTLB_4Kb_fully_32E = 0xA0, - TLBI_4Kb_4WSA_128E = 0xB0, - TLBI_2Mb_4WA_8E = 0xB1, - TLBI_4Mb_4WA_4E = 0xB1, - TLBI_4Kb_4WSA_64E = 0xB2, - TLBD_4Kb_4WSA_128E = 0xB3, - TLB1D_4Kb_4WSA_256E = 0xB4, - TLBI_4Kb_8WSA_64E = 0xB5, - TLBI_4Kb_8WSA_128E = 0xB6, - TLBD_4Kb_4WA_64E = 0xBA, - TLBD_4Kb4Mb_4WA_8E = 0xC0, - STLB_4Kb_8WA_1024 = 0xC1, - STLB_2Mb_8WA_1024 = 0xC1, - DTLB_4Kb_4WA_16E = 0xC2, - DTLB_2Mb_4WA_16E = 0xC2, - STLB_4Kb_6WA_1536E = 0xC3, - STLB_2Mb_6WA_1536E = 0xC3, - STLB_1Gb_4WA_16E = 0xC3, - DTLB_2Mb_4WA_32E = 0xC4, - DTLB_4Mb_4WA_32E = 0xC4, - STLB_4Kb_4WA_512E = 0xCA - }; - - enum CacheDescriptors - { - // CACHE _ lvl + type (if 1 lvl) _ size _ associative ways _ line size in bytes - CACHE_1lvlI_8Kb_4w_32b = 0x06, - CACHE_1lvlI_16Kb_4w_32b = 0x08, - CACHE_1lvlI_32Kb_4w_64b = 0x09, - CACHE_1lvlD_8Kb_2w_32b = 0x0A, - CACHE_1lvlD_16Kb_4w_32b = 0x0C, - CACHE_1lvlD_16Kb_4w_64b = 0x0D, - CACHE_1lvlD_24Kb_6w_64b = 0x0E, - CACHE_2lvl_128Kb_2w_64b = 0x1D, - CACHE_2lvl_256Kb_8w_64b = 0x21, - CACHE_3lvl_512_4w_64b_2lines = 0x22, - CACHE_3lvl_1Mb_8w_64b_2lines = 0x23, - CACHE_2lvl_1Mb_16w_64b = 0x24, - CACHE_3lvl_2Mb_8w_64b_2lines = 0x25, - CACHE_3lvl_4Mb_8w_64b_2lines = 0x29, - CACHE_1lvlD_32Kb_8w_64b = 0x2C, - CACHE_1lvlI_32Kb_8w_64b = 0x30, - CACHE_No2lvl_or_No3lvl = 0x40, - CACHE_2lvl_128Kb_4w_32b = 0x41, - CACHE_2lvl_256Kb_4w_32b = 0x42, - CACHE_2lvl_512Kb_4w_32b = 0x43, - CACHE_2lvl_1Mb_4w_32b = 0x44, - CACHE_2lvl_2Mb_4w_32b = 0x45, - CACHE_3lvl_4Mb_4w_64b = 0x46, - CACHE_3lvl_8Mb_8w_64b = 0x47, - CACHE_2lvl_3Mb_12w_64b = 0x48, - CACHE_3lvl_4Mb_16w_64b = 0x49, - CACHE_2lvl_4Mb_16w_64b = 0x49, - CACHE_3lvl_6Mb_12w_64b = 0x4A, - CACHE_3lvl_8Mb_16w_64b = 0x4B, - CACHE_3lvl_12Mb_12w_64b = 0x4C, - CACHE_3lvl_16Mb_16w_64b = 0x4D, - CACHE_2lvl_6Mb_24w_64b = 0x4E, - CACHE_1lvlD_16Kb_8w_64b = 0x60, - CACHE_1lvlD_8Kb_4w_64b = 0x66, - CACHE_1lvlD_16Kb_4w_64b_Repeat = 0x67, - CACHE_1lvlD_32Kb_4w_64b = 0x68, - CACHE_uTLB_4Kb_8w_64E = 0x6A, - CACHE_DTLB_4Kb_8w_256E = 0x6B, - CACHE_DTLB_2Mb_8w_128E = 0x6C, - CACHE_DTLB_4Mb_8w_128E = 0x6C, - CACHE_DTLB_1Gb_fully_16E = 0x6D, - CACHE_Trace_12K_8w = 0x70, - CACHE_Trace_16K_8w = 0x71, - CACHE_Trace_32K_8w = 0x72, - CACHE_2lvl_1Mb_4w_64b = 0x78, - CACHE_2lvl_128Kb_8w_64b_2lines = 0x79, - CACHE_2lvl_256Kb_8w_64b_2lines = 0x7A, - CACHE_2lvl_512Kb_8w_64b_2lines = 0x7B, - CACHE_2lvl_1Mb_8w_64b_2lines = 0x7C, - CACHE_2lvl_2Mb_8w_64b = 0x7D, - CACHE_2lvl_512Kb_2w_64b = 0x7F, - CACHE_2lvl_512Kb_8w_64b = 0x80, - CACHE_2lvl_256Kb_8w_32b = 0x82, - CACHE_2lvl_512Kb_8w_32b = 0x83, - CACHE_2lvl_1Mb_8w_32b = 0x84, - CACHE_2lvl_2Mb_8w_32b = 0x85, - CACHE_2lvl_512Kb_4w_64b = 0x86, - CACHE_2lvl_1Mb_8w_64b = 0x87, - CACHE_3lvl_512Kb_4w_64b = 0xD0, - CACHE_3lvl_1Mb_4w_64b = 0xD1, - CACHE_3lvl_2Mb_4w_64b = 0xD2, - CACHE_3lvl_1Mb_8w_64b = 0xD6, - CACHE_3lvl_2Mb_8w_64b = 0xD7, - CACHE_3lvl_4Mb_8w_64b = 0xD8, - CACHE_3lvl_1536Kb_12w_64b = 0xDC, - CACHE_3lvl_3Mb_12w_64b = 0xDD, - CACHE_3lvl_6Mb_12w_64b_Repeat = 0xDE, - CACHE_3lvl_2Mb_16w_64b = 0xE2, - CACHE_3lvl_4Mb_16w_64b_Repeat = 0xE3, - CACHE_3lvl_8Mb_16w_64b_Repeat = 0xE4, - CACHE_3lvl_12Mb_24w_64b = 0xEA, - CACHE_3lvl_18Mb_24w_64b = 0xEB, - CACHE_3lvl_24Mb_24w_64b = 0xEC - }; - - enum PrefetchDescriptors - { - PREFETCH_64 = 0xF0, - PREFETCH_128 = 0xF1 - }; - - enum brandStringPart - { - brandString_low = 0, - brandString_middle = 16, - brandString_hight = 32 - }; - - public: - const static uint8 amountBytesRegisters = 16; - const static uint8 amountDescriptors = 16; - // 12 ASCII-symbols + null symbol - const constexpr static uint8 vendorStringSize = 12 + 1; - const constexpr static uint8 brandStringSize = (3 * 4 * 4) + 1; - // Optional - const static uint8 amountRegisters = 4; - const static uint8 amountBytesInRegister = 4; - - private: - - bool cpuidAvailable; - // Saved data of cpuid for eax = 0 - char vendorString[vendorStringSize]; - uint8 maximumInputValue; - // The result of using the method cpuid last time - uint32 eax, ebx, ecx, edx; - // Saved data of cpuid for eax = 1 - uint8 displayFamily, displayModel, stepping, brandIndex; - // clflushLineSize - cache line size in bytes, max number variables for logical processors - uint8 maxNumberProcessorsIds, maxNumberApicsIds, initialApicId; - uint16 clflushLineSize; - processorType currentCpuType; - // Saved data of cpuid eax = 2 - uint8 internalInfoDescriptors[amountBytesRegisters]; - // Saved data of cpuid eax = 3 - uint64 serialNumber; - // Saved data for processor brand string function - uint8 brandString[brandStringSize]; - // Saved daata for extended basic data function - bool isBrandStringSupported; - uint32 maximumInputValueExtended; - - // If eax value correct - true, else false - bool isEaxValueCorrect(const cpuidFunctionIndex eaxValue); - // Decode and set local properties after cpuid command - // False result if cpuid result successfully decode, otherwise true - bool decodeCpuidResult(const cpuidFunctionIndex eaxValue); - // Cpuid command with decode result - bool decodeCpuidCommand(const cpuidFunctionIndex eaxValue); - // Below methods read data from registers and set some properties - void setBasicData(); - void setVersionData(); - void setSerialData(); - void setInternalData(); - void setExtendedBasicData(); - void setBrandString(brandStringPart part); - - void dataFilling(cpuidFunctionIndex startValue, - cpuidFunctionIndex endValue); - - public: - Cpuinfo(); - // false - if value in eax correct, else true - bool cpuid(const cpuidFunctionIndex eaxValue); - bool cpuid(const cpuidFunctionIndex eaxValue, uint32 ecxValue); - bool isCommandSupportSubLeaf(const cpuidFunctionIndex eaxValue); - cpuidOutputRegisters getRegs(); - const char* getVendorString(); - processorType getProcessorType(); - uint8 getDisplayFamily(); - uint8 getDisplayModel(); - uint8 getStepping(); - uint8 getMaxFunctionIndex(); - uint32 getMaxFunctionIndexExtended(); - const char* getBrandString(); - uint8* getInternalDescriptors(); -}; -#endif |
