summaryrefslogtreecommitdiffstats
path: root/arch/x86_64/msr.c
diff options
context:
space:
mode:
authorJon Santmyer <jon@jonsantmyer.com>2024-05-22 13:00:41 -0400
committerJon Santmyer <jon@jonsantmyer.com>2024-05-22 13:00:41 -0400
commitace65b453151845bc361f21f3e5b651c35f9f126 (patch)
tree262ebd29b0ca1d8584f0b6f1efa7a00d9f4f3e43 /arch/x86_64/msr.c
parentf004c1ade8d617a82cea2fe249434cccb47a2358 (diff)
downloadjove-kernel-ace65b453151845bc361f21f3e5b651c35f9f126.tar.gz
jove-kernel-ace65b453151845bc361f21f3e5b651c35f9f126.tar.bz2
jove-kernel-ace65b453151845bc361f21f3e5b651c35f9f126.zip
massive refactor for mp and organizationHEADmaster
Diffstat (limited to 'arch/x86_64/msr.c')
-rw-r--r--arch/x86_64/msr.c67
1 files changed, 67 insertions, 0 deletions
diff --git a/arch/x86_64/msr.c b/arch/x86_64/msr.c
new file mode 100644
index 0000000..1891126
--- /dev/null
+++ b/arch/x86_64/msr.c
@@ -0,0 +1,67 @@
+#include "arch/x86_64/msr.h"
+
+void
+msr_write(uint32_t msr, uint64_t v)
+{
+ __asm__ volatile("wrmsr":: "a"(v), "d"(v >> 32), "c"(msr));
+}
+
+uint64_t
+msr_read(uint32_t msr)
+{
+ uint32_t lo, hi;
+ __asm__ volatile("rdmsr": "=a"(lo), "=d"(hi): "c"(msr));
+ uint64_t v = hi;
+ v = (v << 32) | lo;
+ return v;
+}
+
+void
+msr_efer_write(msr_efer_t v)
+{
+ msr_write(MSR_EFER, *((uintptr_t*)&v));
+}
+
+msr_efer_t
+msr_efer_read(void)
+{
+ uint64_t rawv = msr_read(MSR_EFER);
+ return *((msr_efer_t*)&rawv);
+}
+
+void
+msr_star_write(msr_star_t v)
+{
+ msr_write(MSR_STAR, *((uintptr_t*)&v));
+}
+
+msr_star_t
+msr_star_read(void)
+{
+ uint64_t rawv = msr_read(MSR_STAR);
+ return *((msr_star_t*)&rawv);
+}
+
+void
+msr_lstar_write(msr_lstar_t v)
+{
+ msr_write(MSR_LSTAR, v);
+}
+
+msr_lstar_t
+msr_lstar_read(void)
+{
+ return msr_read(MSR_LSTAR);
+}
+
+void
+msr_gsbase_write(uintptr_t gsbase)
+{
+ msr_write(MSR_GSBASE, gsbase);
+}
+
+uintptr_t
+msr_gsbase_read(void)
+{
+ return msr_read(MSR_GSBASE);
+}