Skip to content

Commit d89ae0d

Browse files
committed
allow creation of snapshots of secret hidden VMs
To take snapshots of secret hidden VMs, we need to bounce guest memory through a userspace buffer. Reuse the `Bounce` wrapper type that is already in use for loading the guest kernel / initrd. Signed-off-by: Patrick Roy <[email protected]>
1 parent fb8631f commit d89ae0d

File tree

2 files changed

+24
-3
lines changed

2 files changed

+24
-3
lines changed

src/vmm/src/vstate/memory.rs

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
// found in the THIRD-PARTY file.
77

88
use std::fs::File;
9-
use std::io::{Read, Seek, SeekFrom};
9+
use std::io::{Read, Seek, SeekFrom, Write};
1010
use std::mem::ManuallyDrop;
1111
use std::os::fd::{AsFd, AsRawFd};
1212
use std::ptr::null_mut;
@@ -86,6 +86,23 @@ impl<T: Read + AsFd> ReadVolatile for Bounce<T> {
8686
}
8787
}
8888

89+
impl<T: Write + AsFd> WriteVolatile for Bounce<T> {
90+
fn write_volatile<B: BitmapSlice>(
91+
&mut self,
92+
buf: &VolatileSlice<B>,
93+
) -> Result<usize, VolatileMemoryError> {
94+
if self.1 {
95+
let mut bbuf = vec![0; buf.len()];
96+
buf.copy_to(bbuf.as_mut_slice());
97+
self.0
98+
.write(bbuf.as_slice())
99+
.map_err(VolatileMemoryError::IOError)
100+
} else {
101+
self.0.as_fd().write_volatile(buf)
102+
}
103+
}
104+
}
105+
89106
impl<R: Read> Read for Bounce<R> {
90107
fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
91108
self.0.read(buf)

src/vmm/src/vstate/vm.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ use crate::persist::{CreateSnapshotError, GuestRegionUffdMapping};
2525
use crate::utils::u64_to_usize;
2626
use crate::vmm_config::snapshot::SnapshotType;
2727
use crate::vstate::memory::{
28-
GuestMemory, GuestMemoryExtension, GuestMemoryMmap, GuestMemoryRegion, GuestRegionMmap,
28+
Bounce, GuestMemory, GuestMemoryExtension, GuestMemoryMmap, GuestMemoryRegion, GuestRegionMmap,
2929
KvmRegion,
3030
};
3131
use crate::vstate::vcpu::VcpuError;
@@ -429,8 +429,12 @@ impl Vm {
429429
.and_then(|_| self.swiotlb_regions().dump_dirty(&mut file, &dirty_bitmap))?;
430430
}
431431
SnapshotType::Full => {
432+
let secret_hidden = self
433+
.guest_memory()
434+
.iter()
435+
.any(|r| r.inner().guest_memfd != 0);
432436
self.guest_memory()
433-
.dump(&mut file)
437+
.dump(&mut Bounce(&file, secret_hidden))
434438
.and_then(|_| self.swiotlb_regions().dump(&mut file))?;
435439
self.reset_dirty_bitmap();
436440
self.guest_memory().reset_dirty();

0 commit comments

Comments
 (0)