From 3abfa2c24677666cfd7ad5120e254e6e459dc202 Mon Sep 17 00:00:00 2001 From: gcontini <1121667+gcontini@users.noreply.github.com> Date: 周六, 05 12月 2020 23:37:58 +0800 Subject: [PATCH] fix missing increment in wine --- src/library/os/windows/cpu_info.cpp | 78 ++++++++++++++++++-------------------- 1 files changed, 37 insertions(+), 41 deletions(-) diff --git a/src/library/os/windows/cpu_info.cpp b/src/library/os/windows/cpu_info.cpp index cb41804..a58cc6c 100644 --- a/src/library/os/windows/cpu_info.cpp +++ b/src/library/os/windows/cpu_info.cpp @@ -15,7 +15,42 @@ namespace os { using namespace std; -CpuInfo::CpuInfo() {} +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<int *>(vendor) = cpui[1]; + *reinterpret_cast<int *>(vendor + 4) = cpui[3]; + *reinterpret_cast<int *>(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() {} /** @@ -38,45 +73,6 @@ return (cpui[0] & 0x3FFF) | (cpui[0] & 0x3FF8000) >> 2 | (cpui[1] & 0xff) << 24; } -string CpuInfo::vendor() const { - // hypervisor flag false, try to get the vendor name, see if it's a virtual cpu - int cpui[4] = {0}; - __cpuid(cpui, 0x0); - return string(reinterpret_cast<const char *>(cpui), 12); -} + } // namespace os -======= -using namespace std; - -CpuInfo::CpuInfo() {} - -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; -} - -string CpuInfo::vendor() const { - // hypervisor flag false, try to get the vendor name, see if it's a virtual cpu - int cpui[4] = {0}; - __cpuid(cpui, 0x0); - return string(reinterpret_cast<const char *>(cpui), 12); -} - ->>>>>>> branch 'feature/pc_identifiers' of https://github.com/open-license-manager/open-license-manager.git } /* namespace license */ -- Gitblit v1.9.1