1#![cfg(guest_arch = "x86_64")]
7
8use fs_err::os::unix::fs::FileExt;
9
10pub(crate) struct MsrDevice(fs_err::File);
11
12impl MsrDevice {
13 pub fn new(cpu: u32) -> std::io::Result<Self> {
15 let path = format!("/dev/cpu/{}/msr", cpu);
16 let file = fs_err::OpenOptions::new()
17 .read(true)
18 .write(true)
19 .open(path)?;
20
21 Ok(Self(file))
22 }
23
24 pub fn read_msr(&self, msr: u32) -> std::io::Result<u64> {
26 let mut data = [0; 8];
27 self.0.read_at(&mut data, msr as u64)?;
28 Ok(u64::from_ne_bytes(data))
29 }
30}