summaryrefslogtreecommitdiff
path: root/msr.h
diff options
context:
space:
mode:
Diffstat (limited to 'msr.h')
-rw-r--r--msr.h25
1 files changed, 25 insertions, 0 deletions
diff --git a/msr.h b/msr.h
new file mode 100644
index 0000000..ad901a6
--- /dev/null
+++ b/msr.h
@@ -0,0 +1,25 @@
+// SYSCALL and SYSRET registers
+#define MSR_STAR 0xc0000081
+#define MSR_LSTAR 0xc0000082
+#define MSR_CSTAR 0xc0000083
+#define MSR_SFMASK 0xc0000084
+
+// GS
+#define MSR_GS_BASE 0xc0000101
+#define MSR_GS_KERNBASE 0xc0000102
+
+static inline uint64
+readmsr(uint32 msr)
+{
+ uint32 hi, lo;
+ __asm volatile("rdmsr" : "=d" (hi), "=a" (lo) : "c" (msr));
+ return ((uint64) lo) | (((uint64) hi) << 32);
+}
+
+static inline void
+writemsr(uint64 msr, uint64 val)
+{
+ uint32 lo = val & 0xffffffff;
+ uint32 hi = val >> 32;
+ __asm volatile("wrmsr" : : "c" (msr), "a" (lo), "d" (hi) : "memory");
+}