From a1d0ef427d3fbb024bc64f8a5ed868121be44305 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20L=C3=B3pez?= Date: Fri, 17 Nov 2023 10:20:12 +0100 Subject: [PATCH] Introduce KvmRunWrapper::as_ref() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Introduce a new method to get an immutable reference to the kvm_run struct. Replace uses of `as_mut_ref()` with `as_ref()` where possible. Signed-off-by: Carlos López --- src/ioctls/mod.rs | 8 ++++++++ src/ioctls/vcpu.rs | 18 +++++++++--------- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/ioctls/mod.rs b/src/ioctls/mod.rs index 9079acc7..a0f6ef7c 100644 --- a/src/ioctls/mod.rs +++ b/src/ioctls/mod.rs @@ -86,6 +86,14 @@ impl KvmRunWrapper { } } +impl AsRef for KvmRunWrapper { + fn as_ref(&self) -> &kvm_run { + // SAFETY: Safe because we know we mapped enough memory to hold the kvm_run struct because + // the kernel told us how large it was. + unsafe { &*(self.kvm_run_ptr as *const kvm_run) } + } +} + impl Drop for KvmRunWrapper { fn drop(&mut self) { // SAFETY: This is safe because we mmap the area at kvm_run_ptr ourselves, diff --git a/src/ioctls/vcpu.rs b/src/ioctls/vcpu.rs index 1154dfca..2e98fa12 100644 --- a/src/ioctls/vcpu.rs +++ b/src/ioctls/vcpu.rs @@ -1764,7 +1764,7 @@ impl VcpuFd { /// ``` #[cfg(any(target_arch = "x86", target_arch = "x86_64"))] pub fn sync_regs(&self) -> kvm_sync_regs { - let kvm_run: &mut kvm_run = self.kvm_run_ptr.as_mut_ref(); + let kvm_run = self.kvm_run_ptr.as_ref(); // SAFETY: Accessing this union field could be out of bounds if the `kvm_run` // allocation isn't large enough. The `kvm_run` region is set using @@ -2689,9 +2689,9 @@ mod tests { let kvm = Kvm::new().unwrap(); let vm = kvm.create_vm().unwrap(); let vcpu = vm.create_vcpu(0).unwrap(); - assert_eq!(vcpu.kvm_run_ptr.as_mut_ref().immediate_exit, 0); + assert_eq!(vcpu.kvm_run_ptr.as_ref().immediate_exit, 0); vcpu.set_kvm_immediate_exit(1); - assert_eq!(vcpu.kvm_run_ptr.as_mut_ref().immediate_exit, 1); + assert_eq!(vcpu.kvm_run_ptr.as_ref().immediate_exit, 1); } #[test] @@ -2763,9 +2763,9 @@ mod tests { ]; for reg in &sync_regs { vcpu.set_sync_valid_reg(*reg); - assert_eq!(vcpu.kvm_run_ptr.as_mut_ref().kvm_valid_regs, *reg as u64); + assert_eq!(vcpu.kvm_run_ptr.as_ref().kvm_valid_regs, *reg as u64); vcpu.clear_sync_valid_reg(*reg); - assert_eq!(vcpu.kvm_run_ptr.as_mut_ref().kvm_valid_regs, 0); + assert_eq!(vcpu.kvm_run_ptr.as_ref().kvm_valid_regs, 0); } // Test that multiple valid SyncRegs can be set at the same time @@ -2773,7 +2773,7 @@ mod tests { vcpu.set_sync_valid_reg(SyncReg::SystemRegister); vcpu.set_sync_valid_reg(SyncReg::VcpuEvents); assert_eq!( - vcpu.kvm_run_ptr.as_mut_ref().kvm_valid_regs, + vcpu.kvm_run_ptr.as_ref().kvm_valid_regs, SyncReg::Register as u64 | SyncReg::SystemRegister as u64 | SyncReg::VcpuEvents as u64 ); @@ -2786,9 +2786,9 @@ mod tests { for reg in &sync_regs { vcpu.set_sync_dirty_reg(*reg); - assert_eq!(vcpu.kvm_run_ptr.as_mut_ref().kvm_dirty_regs, *reg as u64); + assert_eq!(vcpu.kvm_run_ptr.as_ref().kvm_dirty_regs, *reg as u64); vcpu.clear_sync_dirty_reg(*reg); - assert_eq!(vcpu.kvm_run_ptr.as_mut_ref().kvm_dirty_regs, 0); + assert_eq!(vcpu.kvm_run_ptr.as_ref().kvm_dirty_regs, 0); } // Test that multiple dirty SyncRegs can be set at the same time @@ -2796,7 +2796,7 @@ mod tests { vcpu.set_sync_dirty_reg(SyncReg::SystemRegister); vcpu.set_sync_dirty_reg(SyncReg::VcpuEvents); assert_eq!( - vcpu.kvm_run_ptr.as_mut_ref().kvm_dirty_regs, + vcpu.kvm_run_ptr.as_ref().kvm_dirty_regs, SyncReg::Register as u64 | SyncReg::SystemRegister as u64 | SyncReg::VcpuEvents as u64 ); }