Skip to content

Commit 94aaed3

Browse files
committed
vmm: check memory fault flag on vCPU exit
When the vCPU exits with VcpuExit::MemoryFault, ensure that we are checking the exit flag has the private bit set to 1 before attempting to convert any memory. Signed-off-by: Jake Correnti <jakecorrenti+github@proton.me>
1 parent 0f66cd3 commit 94aaed3

File tree

1 file changed

+18
-16
lines changed

1 file changed

+18
-16
lines changed

src/vmm/src/linux/vstate.rs

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1368,23 +1368,25 @@ impl Vcpu {
13681368
}
13691369
#[cfg(feature = "tee")]
13701370
VcpuExit::MemoryFault { gpa, size, flags } => {
1371-
let private = (flags & (KVM_MEMORY_EXIT_FLAG_PRIVATE as u64)) != 0;
1372-
1373-
let mem_properties = MemoryProperties { gpa, size, private };
1374-
1375-
let (response_sender, response_receiver) = unbounded();
1376-
self.pm_sender
1377-
.send(WorkerMessage::ConvertMemory(
1378-
response_sender.clone(),
1379-
mem_properties,
1380-
))
1381-
.unwrap();
1382-
if !response_receiver.recv().unwrap() {
1383-
error!("Unable to convert memory with properties: gpa: 0x{:x} size: 0x{:x} to_private: {}", gpa, size, private);
1384-
return Err(Error::VcpuUnhandledKvmExit);
1371+
if flags & !kvm_bindings::KVM_MEMORY_EXIT_FLAG_PRIVATE as u64 != 0 {
1372+
println!("KVM_EXIT_MEMORY_FAULT: Unknown flag {}", flags);
1373+
Err(Error::VcpuUnhandledKvmExit)
1374+
} else {
1375+
let private = (flags & (KVM_MEMORY_EXIT_FLAG_PRIVATE as u64)) != 0;
1376+
let mem_properties = MemoryProperties { gpa, size, private };
1377+
let (response_sender, response_receiver) = unbounded();
1378+
self.pm_sender
1379+
.send(WorkerMessage::ConvertMemory(
1380+
response_sender.clone(),
1381+
mem_properties,
1382+
))
1383+
.unwrap();
1384+
if !response_receiver.recv().unwrap() {
1385+
error!("Unable to convert memory with properties: gpa: 0x{:x} size: 0x{:x} to_private: {}", gpa, size, private);
1386+
return Err(Error::VcpuUnhandledKvmExit);
1387+
}
1388+
Ok(VcpuEmulation::Handled)
13851389
}
1386-
1387-
Ok(VcpuEmulation::Handled)
13881390
}
13891391
VcpuExit::MmioRead(addr, data) => {
13901392
if let Some(ref mmio_bus) = self.mmio_bus {

0 commit comments

Comments
 (0)