aboutsummaryrefslogtreecommitdiff
path: root/mirai.old/asm/msr.zig
diff options
context:
space:
mode:
Diffstat (limited to 'mirai.old/asm/msr.zig')
-rw-r--r--mirai.old/asm/msr.zig26
1 files changed, 26 insertions, 0 deletions
diff --git a/mirai.old/asm/msr.zig b/mirai.old/asm/msr.zig
new file mode 100644
index 0000000..c8ac37f
--- /dev/null
+++ b/mirai.old/asm/msr.zig
@@ -0,0 +1,26 @@
+//! Model Specific Register Operations
+//! Wrappers for reading and writing CPU-specific registers
+
+/// Read model specific register
+pub inline fn read(register: u32) u64 {
+ var low: u32 = undefined;
+ var high: u32 = undefined;
+ asm volatile ("rdmsr"
+ : [low] "={eax}" (low),
+ [high] "={edx}" (high),
+ : [msr] "{ecx}" (register),
+ );
+ return (@as(u64, high) << 32) | @as(u64, low);
+}
+
+/// Write model specific register
+pub inline fn write(register: u32, value: u64) void {
+ const low: u32 = @truncate(value);
+ const high: u32 = @truncate(value >> 32);
+ asm volatile ("wrmsr"
+ :
+ : [msr] "{ecx}" (register),
+ [low] "{eax}" (low),
+ [high] "{edx}" (high),
+ );
+}