gcontini
2020-03-08 4467a957a498b93dbcaefbad97df24b43dfbc99d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
/*
 * cpu_info.cpp
 *
 *  Created on: Dec 14, 2019
 *      Author: devel
 */
 
 
#include <intrin.h>
#include <string>
#include <unordered_set>
#include "../cpu_info.hpp"
 
namespace license {
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);
}
}  // namespace os
} /* namespace license */