aboutsummaryrefslogtreecommitdiff
path: root/src/cpu/cpu.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/cpu/cpu.cc')
-rw-r--r--src/cpu/cpu.cc35
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;
+ }
+ }
+
+}