virt_mshv_vtl/
devmsr.rs

1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4//! Functionality to read MSR registers via `/dev/msr`.
5
6#![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    /// Open `/dev/msr`.
14    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    /// Read an MSR register.
25    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}