aboutsummaryrefslogtreecommitdiff
path: root/mirai/asm/msr.zig
blob: c8ac37f940f769d809a6782d0a7568d56bf582d5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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),
    );
}