mirror of
https://github.com/cloud-hypervisor/cloud-hypervisor.git
synced 2026-08-05 02:19:16 +00:00
misc: Work around vfio_dma_map being unsound
This API passes a u64 to a kernel API that treats the u64 as a userspace address. Therefore, it should be marked unsafe, but it currently is not [1]. Wrap the call in an unsafe block to document that invariants must be upheld to avoid undefined behavior. This causes a compiler warning, so suppress the warning with #[allow(unused_unsafe)]. [1]: https://github.com/rust-vmm/vfio/issues/100 Signed-off-by: Demi Marie Obenour <demiobenour@gmail.com>
This commit is contained in:
committed by
Rob Bradford
parent
12c7cc5e4f
commit
8be28f8438
@@ -3754,13 +3754,19 @@ impl DeviceManager {
|
||||
// virtio-mem device itself.
|
||||
for (_, zone) in self.memory_manager.lock().unwrap().memory_zones().iter() {
|
||||
for region in zone.regions() {
|
||||
vfio_container
|
||||
.vfio_dma_map(
|
||||
// vfio_dma_map is unsound and ought to be marked as unsafe
|
||||
#[allow(unused_unsafe)]
|
||||
// SAFETY: GuestMemoryMmap guarantees that region points
|
||||
// to len bytes of valid memory starting at as_ptr()
|
||||
// that will only be freed with munmap().
|
||||
unsafe {
|
||||
vfio_container.vfio_dma_map(
|
||||
region.start_addr().raw_value(),
|
||||
region.len(),
|
||||
region.as_ptr() as u64,
|
||||
)
|
||||
.map_err(DeviceManagerError::VfioDmaMap)?;
|
||||
}
|
||||
.map_err(DeviceManagerError::VfioDmaMap)?;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4368,13 +4374,19 @@ impl DeviceManager {
|
||||
|
||||
// Take care of updating the memory for VFIO PCI devices.
|
||||
if let Some(vfio_container) = &self.vfio_container {
|
||||
vfio_container
|
||||
.vfio_dma_map(
|
||||
// vfio_dma_map is unsound and ought to be marked as unsafe
|
||||
#[allow(unused_unsafe)]
|
||||
// SAFETY: GuestMemoryMmap guarantees that region points
|
||||
// to len bytes of valid memory starting at as_ptr()
|
||||
// that will only be freed with munmap().
|
||||
unsafe {
|
||||
vfio_container.vfio_dma_map(
|
||||
new_region.start_addr().raw_value(),
|
||||
new_region.len(),
|
||||
new_region.as_ptr() as u64,
|
||||
)
|
||||
.map_err(DeviceManagerError::UpdateMemoryForVfioPciDevice)?;
|
||||
}
|
||||
.map_err(DeviceManagerError::UpdateMemoryForVfioPciDevice)?;
|
||||
}
|
||||
|
||||
// Take care of updating the memory for vfio-user devices.
|
||||
|
||||
Reference in New Issue
Block a user