Skip to content

Commit a1d0ef4

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 2a102e7 commit a1d0ef4

File tree

2 files changed

+17
-9
lines changed

2 files changed

+17
-9
lines changed

src/ioctls/mod.rs

Lines changed: 8 additions & 0 deletions
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

Lines changed: 9 additions & 9 deletions
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
@@ -2689,9 +2689,9 @@ mod tests {
26892689
let kvm = Kvm::new().unwrap();
26902690
let vm = kvm.create_vm().unwrap();
26912691
let vcpu = vm.create_vcpu(0).unwrap();
2692-
assert_eq!(vcpu.kvm_run_ptr.as_mut_ref().immediate_exit, 0);
2692+
assert_eq!(vcpu.kvm_run_ptr.as_ref().immediate_exit, 0);
26932693
vcpu.set_kvm_immediate_exit(1);
2694-
assert_eq!(vcpu.kvm_run_ptr.as_mut_ref().immediate_exit, 1);
2694+
assert_eq!(vcpu.kvm_run_ptr.as_ref().immediate_exit, 1);
26952695
}
26962696

26972697
#[test]
@@ -2763,17 +2763,17 @@ mod tests {
27632763
];
27642764
for reg in &sync_regs {
27652765
vcpu.set_sync_valid_reg(*reg);
2766-
assert_eq!(vcpu.kvm_run_ptr.as_mut_ref().kvm_valid_regs, *reg as u64);
2766+
assert_eq!(vcpu.kvm_run_ptr.as_ref().kvm_valid_regs, *reg as u64);
27672767
vcpu.clear_sync_valid_reg(*reg);
2768-
assert_eq!(vcpu.kvm_run_ptr.as_mut_ref().kvm_valid_regs, 0);
2768+
assert_eq!(vcpu.kvm_run_ptr.as_ref().kvm_valid_regs, 0);
27692769
}
27702770

27712771
// Test that multiple valid SyncRegs can be set at the same time
27722772
vcpu.set_sync_valid_reg(SyncReg::Register);
27732773
vcpu.set_sync_valid_reg(SyncReg::SystemRegister);
27742774
vcpu.set_sync_valid_reg(SyncReg::VcpuEvents);
27752775
assert_eq!(
2776-
vcpu.kvm_run_ptr.as_mut_ref().kvm_valid_regs,
2776+
vcpu.kvm_run_ptr.as_ref().kvm_valid_regs,
27772777
SyncReg::Register as u64 | SyncReg::SystemRegister as u64 | SyncReg::VcpuEvents as u64
27782778
);
27792779

@@ -2786,17 +2786,17 @@ mod tests {
27862786

27872787
for reg in &sync_regs {
27882788
vcpu.set_sync_dirty_reg(*reg);
2789-
assert_eq!(vcpu.kvm_run_ptr.as_mut_ref().kvm_dirty_regs, *reg as u64);
2789+
assert_eq!(vcpu.kvm_run_ptr.as_ref().kvm_dirty_regs, *reg as u64);
27902790
vcpu.clear_sync_dirty_reg(*reg);
2791-
assert_eq!(vcpu.kvm_run_ptr.as_mut_ref().kvm_dirty_regs, 0);
2791+
assert_eq!(vcpu.kvm_run_ptr.as_ref().kvm_dirty_regs, 0);
27922792
}
27932793

27942794
// Test that multiple dirty SyncRegs can be set at the same time
27952795
vcpu.set_sync_dirty_reg(SyncReg::Register);
27962796
vcpu.set_sync_dirty_reg(SyncReg::SystemRegister);
27972797
vcpu.set_sync_dirty_reg(SyncReg::VcpuEvents);
27982798
assert_eq!(
2799-
vcpu.kvm_run_ptr.as_mut_ref().kvm_dirty_regs,
2799+
vcpu.kvm_run_ptr.as_ref().kvm_dirty_regs,
28002800
SyncReg::Register as u64 | SyncReg::SystemRegister as u64 | SyncReg::VcpuEvents as u64
28012801
);
28022802
}

0 commit comments

Comments
 (0)