diff options
Diffstat (limited to 'mirai.old/asm/msr.zig')
| -rw-r--r-- | mirai.old/asm/msr.zig | 26 |
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), + ); +} |
