Move MSR helpers to inline asm
authorJack Miller <jack@codezen.org>
Fri, 25 Mar 2016 18:18:57 +0000 (13:18 -0500)
committerJack Miller <jack@codezen.org>
Fri, 25 Mar 2016 21:59:18 +0000 (16:59 -0500)
asm/misc.asm
include/asm/misc.h
include/asm/msr.h [new file with mode: 0644]
kernel/apic.c

index 00b9320..8bc82ec 100644 (file)
@@ -33,26 +33,6 @@ cpuid:
     mov [rsi], edx
     ret
 
-GLOBAL rdmsr
-
-rdmsr:
-    mov ecx, edi
-    mov rax, 0
-    rdmsr
-    shl rdx, 32
-    or  rax, rdx
-    ret
-
-GLOBAL wrmsr
-
-wrmsr:
-    mov ecx, edi
-    mov rdx, rsi
-    shr rdx, 32
-    mov eax, esi
-    wrmsr
-    ret
-
 GLOBAL disable_pic
 
 disable_pic:
index b40cc2e..d50ccd8 100644 (file)
@@ -11,6 +11,3 @@ extern u64 get_cr3(void);
 extern void cpuid(u32 eax, u32 *buf);
 
 extern void disable_pic(void);
-
-extern u64 rdmsr(u32 msr);
-extern void wrmsr(u32 msr, u64 val);
diff --git a/include/asm/msr.h b/include/asm/msr.h
new file mode 100644 (file)
index 0000000..5d6ebb8
--- /dev/null
@@ -0,0 +1,15 @@
+#pragma once
+
+static inline u64 rdmsr(u32 msr)
+{
+    u32 eax, edx;
+
+    asm volatile("rdmsr" : "=a" (eax), "=d" (edx) : "c" (msr));
+
+    return (((u64) edx << 32) | eax);
+}
+
+static inline void wrmsr(u32 msr, u64 val)
+{
+    asm volatile("wrmsr" : : "c" (msr), "d" ((u32) (val >> 32)), "a" ((u32) val));
+}
index da42605..ee727e5 100644 (file)
@@ -29,6 +29,7 @@
 #include <asm/realmode.h>
 #include <asm/barrier.h>
 #include <asm/mmio.h>
+#include <asm/msr.h>
 
 #define CPUID_X2APIC   (1 << 21)
 #define CPUID_LAPIC            (1 << 9)