Skip to content

Commit 32f8ebb

Browse files
committed
implement VcpuExit::MemoryFault
Signed-off-by: Jake Correnti <jakecorrenti+github@proton.me>
1 parent 1cef607 commit 32f8ebb

File tree

1 file changed

+38
-0
lines changed

1 file changed

+38
-0
lines changed

src/vmm/src/linux/vstate.rs

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1348,6 +1348,44 @@ impl Vcpu {
13481348
}
13491349
Ok(VcpuEmulation::Stopped)
13501350
}
1351+
VcpuExit::MemoryFault { flags, gpa, size } => {
1352+
#[cfg(feature = "intel-tdx")]
1353+
if flags & !kvm_bindings::KVM_MEMORY_EXIT_FLAG_PRIVATE as u64 != 0 {
1354+
println!("KVM_EXIT_MEMORY_FAULT: Unknown flag {}", flags);
1355+
Err(Error::VcpuUnhandledKvmExit)
1356+
} else {
1357+
let attr = (flags & kvm_bindings::KVM_MEMORY_EXIT_FLAG_PRIVATE as u64);
1358+
1359+
if let Err(e) = self.vmcall_sender.send((
1360+
MemoryConversionProperties {
1361+
gpa,
1362+
size,
1363+
to_private: attr > 0,
1364+
},
1365+
self.memory_evt.try_clone().unwrap(),
1366+
)) {
1367+
println!(
1368+
"KVM_EXIT_MEMORY_FAULT: unable to convert memory: Exit {:#?}",
1369+
e
1370+
);
1371+
return Err(Error::VcpuUnhandledKvmExit);
1372+
}
1373+
if let Err(e) = self.memory_evt.read() {
1374+
println!(
1375+
"KVM_EXIT_MEMORY_FAULT: unable to convert memory: Exit {:#?}",
1376+
e
1377+
);
1378+
return Err(Error::VcpuUnhandledKvmExit);
1379+
}
1380+
Ok(VcpuEmulation::Handled)
1381+
}
1382+
1383+
#[cfg(not(feature = "intel-tdx"))]
1384+
{
1385+
error!("Received KVM_EXIT_MEMORY_FAULT: flags=0x{:x}, gpa=0x{:x}, size=0x{:x})", flags, gpa, size);
1386+
Err(Error::VcpuUnhandledKvmExit)
1387+
}
1388+
}
13511389
#[cfg(feature = "intel-tdx")]
13521390
VcpuExit::Tdx => {
13531391
let kvm_run = self.fd.get_kvm_run();

0 commit comments

Comments
 (0)