aboutsummaryrefslogtreecommitdiff
path: root/arch/i386/sys/cpuid.h
diff options
context:
space:
mode:
Diffstat (limited to 'arch/i386/sys/cpuid.h')
-rw-r--r--arch/i386/sys/cpuid.h35
1 files changed, 35 insertions, 0 deletions
diff --git a/arch/i386/sys/cpuid.h b/arch/i386/sys/cpuid.h
new file mode 100644
index 0000000..6613967
--- /dev/null
+++ b/arch/i386/sys/cpuid.h
@@ -0,0 +1,35 @@
+#pragma once
+
+#include <cpuid.h>
+
+struct CPUVersion {
+ unsigned int stepping : 4;
+ unsigned int model : 4;
+ unsigned int family : 4;
+ unsigned int type : 2;
+ unsigned int __unused_1 : 2;
+ unsigned int model_ex : 4;
+ unsigned int family_ex : 8;
+ unsigned int __unused_2 : 4;
+} __attribute__((packed, aligned(__alignof__(unsigned int))));
+/* FIXME _Static_assert(sizeof(struct CPUVersion) == sizeof(unsigned int), "cpuid version struct size"); */
+
+unsigned int
+family(const struct CPUVersion v)
+{
+ if (v.family == 0x0f) return v.family + v.family_ex;
+ else
+ return v.family;
+}
+
+unsigned int
+model(const struct CPUVersion v)
+{
+ switch (v.family) {
+ case 0x06:
+ case 0x0f:
+ return ((unsigned int)v.model_ex << 4) | v.model;
+ default:
+ return v.model;
+ }
+}