/* * cpu_info.cpp * * Created on: Dec 14, 2019 * Author: devel */ #include #include #include #include "../cpu_info.hpp" namespace license { namespace os { using namespace std; static string get_cpu_vendor() { // hypervisor flag false, try to get the vendor name, see if it's a virtual cpu int cpui[4] = {0}; __cpuidex(cpui, 0x0, 0x0); char vendor[13]; memset(vendor, 0, sizeof(vendor)); *reinterpret_cast(vendor) = cpui[1]; *reinterpret_cast(vendor + 4) = cpui[3]; *reinterpret_cast(vendor + 8) = cpui[2]; return string(vendor, 12); } static string get_cpu_brand() { int cpui[4] = {0}; __cpuid(cpui, 0x80000000); int maxSupported = cpui[0]; char brand[0x41]; memset(brand, 0, sizeof(brand)); string result; if (maxSupported >= 0x80000004) { int instruction = 0x80000002; for (int i = 0; i <= 2; ++i) { __cpuidex(cpui, instruction + i, 0); memcpy(&brand[i * sizeof(cpui)], cpui, sizeof(cpui)); } result = string(brand); } else { result = "NA"; } return result; } CpuInfo::CpuInfo() : m_vendor(get_cpu_vendor()), m_brand(get_cpu_brand()) {} CpuInfo::~CpuInfo() {} /** * Detect Virtual machine using hypervisor bit. * @return true if the cpu hypervisor bit is set to 1 */ bool CpuInfo::is_hypervisor_set() const { int cpui[4] = {0}; __cpuid(cpui, 0x1); return ((cpui[2] >> 31) & 1); } uint32_t CpuInfo::model() const { int cpui[4] = {0}; __cpuid(cpui, 0x1); // ax bits 0-3 stepping,4-7 model,8-11 family id,12-13 processor type // 14-15 reserved, 16-19 extended model, 20-27 extended family, 27-31 reserved // bx bits 0-7 brand index return (cpui[0] & 0x3FFF) | (cpui[0] & 0x3FF8000) >> 2 | (cpui[1] & 0xff) << 24; } } // namespace os } /* namespace license */