@@ -1348,6 +1348,44 @@ impl Vcpu {
1348
1348
}
1349
1349
Ok ( VcpuEmulation :: Stopped )
1350
1350
}
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
+ }
1351
1389
#[ cfg( feature = "intel-tdx" ) ]
1352
1390
VcpuExit :: Tdx => {
1353
1391
let kvm_run = self . fd . get_kvm_run ( ) ;
0 commit comments