Skip to content

Commit 43c2ceb

Browse files
committed
Introduce KvmRunWrapper::as_ref()
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 <[email protected]>
1 parent c612850 commit 43c2ceb

File tree

2 files changed

+17
-9
lines changed

2 files changed

+17
-9
lines changed

src/ioctls/mod.rs

+8
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,14 @@ impl KvmRunWrapper {
8686
}
8787
}
8888

89+
impl AsRef<kvm_run> for KvmRunWrapper {
90+
fn as_ref(&self) -> &kvm_run {
91+
// SAFETY: Safe because we know we mapped enough memory to hold the kvm_run struct because
92+
// the kernel told us how large it was.
93+
unsafe { &*(self.kvm_run_ptr as *const kvm_run) }
94+
}
95+
}
96+
8997
impl Drop for KvmRunWrapper {
9098
fn drop(&mut self) {
9199
// SAFETY: This is safe because we mmap the area at kvm_run_ptr ourselves,

src/ioctls/vcpu.rs

+9-9
Original file line numberDiff line numberDiff line change
@@ -1764,7 +1764,7 @@ impl VcpuFd {
17641764
/// ```
17651765
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
17661766
pub fn sync_regs(&self) -> kvm_sync_regs {
1767-
let kvm_run: &mut kvm_run = self.kvm_run_ptr.as_mut_ref();
1767+
let kvm_run = self.kvm_run_ptr.as_ref();
17681768

17691769
// SAFETY: Accessing this union field could be out of bounds if the `kvm_run`
17701770
// allocation isn't large enough. The `kvm_run` region is set using
@@ -2663,9 +2663,9 @@ mod tests {
26632663
let kvm = Kvm::new().unwrap();
26642664
let vm = kvm.create_vm().unwrap();
26652665
let vcpu = vm.create_vcpu(0).unwrap();
2666-
assert_eq!(vcpu.kvm_run_ptr.as_mut_ref().immediate_exit, 0);
2666+
assert_eq!(vcpu.kvm_run_ptr.as_ref().immediate_exit, 0);
26672667
vcpu.set_kvm_immediate_exit(1);
2668-
assert_eq!(vcpu.kvm_run_ptr.as_mut_ref().immediate_exit, 1);
2668+
assert_eq!(vcpu.kvm_run_ptr.as_ref().immediate_exit, 1);
26692669
}
26702670

26712671
#[test]
@@ -2737,17 +2737,17 @@ mod tests {
27372737
];
27382738
for reg in &sync_regs {
27392739
vcpu.set_sync_valid_reg(*reg);
2740-
assert_eq!(vcpu.kvm_run_ptr.as_mut_ref().kvm_valid_regs, *reg as u64);
2740+
assert_eq!(vcpu.kvm_run_ptr.as_ref().kvm_valid_regs, *reg as u64);
27412741
vcpu.clear_sync_valid_reg(*reg);
2742-
assert_eq!(vcpu.kvm_run_ptr.as_mut_ref().kvm_valid_regs, 0);
2742+
assert_eq!(vcpu.kvm_run_ptr.as_ref().kvm_valid_regs, 0);
27432743
}
27442744

27452745
// Test that multiple valid SyncRegs can be set at the same time
27462746
vcpu.set_sync_valid_reg(SyncReg::Register);
27472747
vcpu.set_sync_valid_reg(SyncReg::SystemRegister);
27482748
vcpu.set_sync_valid_reg(SyncReg::VcpuEvents);
27492749
assert_eq!(
2750-
vcpu.kvm_run_ptr.as_mut_ref().kvm_valid_regs,
2750+
vcpu.kvm_run_ptr.as_ref().kvm_valid_regs,
27512751
SyncReg::Register as u64 | SyncReg::SystemRegister as u64 | SyncReg::VcpuEvents as u64
27522752
);
27532753

@@ -2760,17 +2760,17 @@ mod tests {
27602760

27612761
for reg in &sync_regs {
27622762
vcpu.set_sync_dirty_reg(*reg);
2763-
assert_eq!(vcpu.kvm_run_ptr.as_mut_ref().kvm_dirty_regs, *reg as u64);
2763+
assert_eq!(vcpu.kvm_run_ptr.as_ref().kvm_dirty_regs, *reg as u64);
27642764
vcpu.clear_sync_dirty_reg(*reg);
2765-
assert_eq!(vcpu.kvm_run_ptr.as_mut_ref().kvm_dirty_regs, 0);
2765+
assert_eq!(vcpu.kvm_run_ptr.as_ref().kvm_dirty_regs, 0);
27662766
}
27672767

27682768
// Test that multiple dirty SyncRegs can be set at the same time
27692769
vcpu.set_sync_dirty_reg(SyncReg::Register);
27702770
vcpu.set_sync_dirty_reg(SyncReg::SystemRegister);
27712771
vcpu.set_sync_dirty_reg(SyncReg::VcpuEvents);
27722772
assert_eq!(
2773-
vcpu.kvm_run_ptr.as_mut_ref().kvm_dirty_regs,
2773+
vcpu.kvm_run_ptr.as_ref().kvm_dirty_regs,
27742774
SyncReg::Register as u64 | SyncReg::SystemRegister as u64 | SyncReg::VcpuEvents as u64
27752775
);
27762776
}

0 commit comments

Comments
 (0)