43 lines
1.4 KiB
Rust
43 lines
1.4 KiB
Rust
|
use core::mem::size_of;
|
||
|
use std::format;
|
||
|
use std::fs::{File, OpenOptions};
|
||
|
use std::os::unix::fs::FileExt;
|
||
|
use std::io::{Result, Error, ErrorKind};
|
||
|
|
||
|
pub fn write_msr_on_cpu(msr: u32, cpu: u8, value: u64) -> Result<()> {
|
||
|
let path = format!("/dev/cpu/{}/msr", cpu);
|
||
|
let file : File = OpenOptions::new().write(true).open(path).expect("Failed to open MSR, are you running as root ?");
|
||
|
match file.write_at(&value.to_ne_bytes(), msr as u64) {
|
||
|
Ok(size) => {
|
||
|
if size == size_of::<u64>() {
|
||
|
Ok(())
|
||
|
} else {
|
||
|
Err(Error::other("Failed to write complete value"))
|
||
|
}
|
||
|
},
|
||
|
Err(e) => Err(e)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
pub fn read_msr_on_cpu(msr: u32, cpu: u8) -> Result<u64> {
|
||
|
let path = format!("/dev/cpu/{}/msr", cpu);
|
||
|
let file : File = OpenOptions::new().read(true).open(path).expect("Failed to open MSR, are you running as root ?");
|
||
|
let mut read_data = [0u8; size_of::<u64>()];
|
||
|
match file.read_at(&mut read_data, msr as u64) {
|
||
|
Ok(size) => {
|
||
|
if size == size_of::<u64>() {
|
||
|
Ok(u64::from_ne_bytes(read_data))
|
||
|
} else {
|
||
|
Err(Error::other("Failed to write complete value"))
|
||
|
}
|
||
|
},
|
||
|
Err(e) => Err(e)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#[cfg(test)]
|
||
|
mod tests {
|
||
|
use super::*;
|
||
|
// TODO how can we test model specific register read / write ?
|
||
|
}
|