hypervisor: Implement support for fetching sys regs on MSHV

ARM64 system register constants are not 1:1 mapped to MSHV definition of
those registers so we need a small helper function to translate that
mapping before retrieving those system registers.

Signed-off-by: Jinank Jain <jinankjain@microsoft.com>
This commit is contained in:
Jinank Jain
2025-04-23 09:17:42 +00:00
parent 58f71b0c44
commit f1f6814774
2 changed files with 29 additions and 3 deletions
+7 -1
View File
@@ -323,7 +323,13 @@ pub enum HypervisorCpuError {
#[cfg(feature = "sev_snp")] #[cfg(feature = "sev_snp")]
#[error("Failed to set sev control register: {0}")] #[error("Failed to set sev control register: {0}")]
SetSevControlRegister(#[source] anyhow::Error), SetSevControlRegister(#[source] anyhow::Error),
///
/// Unsupported SysReg registers
///
#[cfg(target_arch = "aarch64")]
#[error("Unsupported SysReg registers: {0}")]
UnsupportedSysReg(u32),
///
/// Error injecting NMI /// Error injecting NMI
/// ///
#[error("Failed to inject NMI")] #[error("Failed to inject NMI")]
+22 -2
View File
@@ -1328,8 +1328,20 @@ impl cpu::Vcpu for MshvVcpu {
} }
#[cfg(target_arch = "aarch64")] #[cfg(target_arch = "aarch64")]
fn get_sys_reg(&self, _sys_reg: u32) -> cpu::Result<u64> { fn get_sys_reg(&self, sys_reg: u32) -> cpu::Result<u64> {
unimplemented!() let mshv_reg = self.sys_reg_to_mshv_reg(sys_reg)?;
let mut reg_assocs = [hv_register_assoc {
name: mshv_reg,
..Default::default()
}];
self.fd
.get_reg(&mut reg_assocs)
.map_err(|e| cpu::HypervisorCpuError::GetRegister(e.into()))?;
// SAFETY: Accessing a union element from bindgen generated definition.
let res = unsafe { reg_assocs[0].value.reg64 };
Ok(res)
} }
#[cfg(target_arch = "aarch64")] #[cfg(target_arch = "aarch64")]
@@ -1744,6 +1756,14 @@ impl MshvVcpu {
} }
Ok(()) Ok(())
} }
#[cfg(target_arch = "aarch64")]
fn sys_reg_to_mshv_reg(&self, sys_regs: u32) -> cpu::Result<u32> {
match sys_regs {
regs::MPIDR_EL1 => Ok(hv_register_name_HV_ARM64_REGISTER_MPIDR_EL1),
_ => Err(cpu::HypervisorCpuError::UnsupportedSysReg(sys_regs)),
}
}
} }
/// Wrapper over Mshv VM ioctls. /// Wrapper over Mshv VM ioctls.