diff options
Diffstat (limited to 'src/cpu/cpu.cc')
-rw-r--r-- | src/cpu/cpu.cc | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/src/cpu/cpu.cc b/src/cpu/cpu.cc new file mode 100644 index 0000000..0c9403f --- /dev/null +++ b/src/cpu/cpu.cc @@ -0,0 +1,35 @@ +#include "cpu.h" +#include <stdlib.h> + +static_assert(sizeof(CPU::features_t) == 2 * sizeof(uint32_t)); + +CPU::CPU() { + static_assert(sizeof(CPU::version_t) == sizeof(uint32_t)); + struct { + uint32_t d; + uint32_t c; + uint32_t b; + uint32_t a; + } __attribute__((packed)) r; + size_t highest_param = 0; + + for (int i = 0; i <= highest_param; ++i) { + asm volatile("cpuid" : "=a"(r.a), "=b"(r.b), "=c"(r.c), "=d"(r.d) : "a"(i)); + + switch (i) { + case 0: + highest_param = static_cast<size_t>(r.a); + memcpy(&m_manufacturer[0], &r.b, sizeof(r.b)); + memcpy(&m_manufacturer[4], &r.d, sizeof(r.d)); + memcpy(&m_manufacturer[8], &r.c, sizeof(r.c)); + break; + case 1: + memcpy(&m_info, &r.a, sizeof(r.a)); + memcpy(&m_features, &r.d, sizeof(CPU::features_t)); + break; + default: + return; + } + } + +} |