@@ -1399,6 +1399,83 @@ impl VmFd {
1399
1399
Err ( errno:: Error :: last ( ) )
1400
1400
}
1401
1401
}
1402
+
1403
+ /// Unregister a guest memory region registered with
1404
+ /// [`register_enc_memory_region`](Self::register_enc_memory_region).
1405
+ ///
1406
+ /// It is used in the SEV-enabled guest.
1407
+ ///
1408
+ /// See the documentation for `KVM_MEMORY_ENCRYPT_UNREG_REGION` in the
1409
+ /// [KVM API doc](https://www.kernel.org/doc/Documentation/virtual/kvm/api.txt).
1410
+ ///
1411
+ /// # Arguments
1412
+ ///
1413
+ /// * `memory_region` - Guest physical memory region.
1414
+ ///
1415
+ /// # Example
1416
+ #[ cfg_attr( has_sev, doc = "```rust" ) ]
1417
+ #[ cfg_attr( not( has_sev) , doc = "```rust,no_run" ) ]
1418
+ /// # extern crate kvm_bindings;
1419
+ /// # extern crate kvm_ioctls;
1420
+ /// # extern crate libc;
1421
+ /// # use std::{fs::OpenOptions, ptr::null_mut};
1422
+ /// # use std::os::unix::io::AsRawFd;
1423
+ /// use kvm_bindings::bindings::{kvm_enc_region, kvm_sev_cmd, kvm_sev_launch_start, sev_cmd_id_KVM_SEV_LAUNCH_START};
1424
+ /// # use kvm_ioctls::Kvm;
1425
+ /// use libc;
1426
+ ///
1427
+ /// let kvm = Kvm::new().unwrap();
1428
+ /// let vm = kvm.create_vm().unwrap();
1429
+ /// let sev = OpenOptions::new()
1430
+ /// .read(true)
1431
+ /// .write(true)
1432
+ /// .open("/dev/sev")
1433
+ /// .unwrap();
1434
+ ///
1435
+ /// // Initialize the SEV platform context.
1436
+ /// let mut init: kvm_sev_cmd = Default::default();
1437
+ /// assert!(vm.encrypt_op_sev(&mut init).is_ok());
1438
+ ///
1439
+ /// // Create the memory encryption context.
1440
+ /// let start_data: kvm_sev_launch_start = Default::default();
1441
+ /// let mut start = kvm_sev_cmd {
1442
+ /// id: sev_cmd_id_KVM_SEV_LAUNCH_START,
1443
+ /// data: &start_data as *const kvm_sev_launch_start as _,
1444
+ /// sev_fd: sev.as_raw_fd() as _,
1445
+ /// ..Default::default()
1446
+ /// };
1447
+ /// assert!(vm.encrypt_op_sev(&mut start).is_ok());
1448
+ ///
1449
+ /// let addr = unsafe {
1450
+ /// libc::mmap(
1451
+ /// null_mut(),
1452
+ /// 4096,
1453
+ /// libc::PROT_READ | libc::PROT_WRITE,
1454
+ /// libc::MAP_PRIVATE | libc::MAP_ANONYMOUS,
1455
+ /// -1,
1456
+ /// 0,
1457
+ /// )
1458
+ /// };
1459
+ /// assert_ne!(addr, libc::MAP_FAILED);
1460
+ ///
1461
+ /// let memory_region = kvm_enc_region {
1462
+ /// addr: addr as _,
1463
+ /// size: 4096,
1464
+ /// };
1465
+ /// vm.register_enc_memory_region(&memory_region).unwrap();
1466
+ /// vm.unregister_enc_memory_region(&memory_region).unwrap();
1467
+ /// ```
1468
+ #[ cfg( any( target_arch = "x86" , target_arch = "x86_64" ) ) ]
1469
+ pub fn unregister_enc_memory_region ( & self , memory_region : & kvm_enc_region ) -> Result < ( ) > {
1470
+ // Safe because we know that our file is a VM fd, we know the kernel will only read the
1471
+ // correct amount of memory from our pointer, and we verify the return result.
1472
+ let ret = unsafe { ioctl_with_ref ( self , KVM_MEMORY_ENCRYPT_UNREG_REGION ( ) , memory_region) } ;
1473
+ if ret == 0 {
1474
+ Ok ( ( ) )
1475
+ } else {
1476
+ Err ( errno:: Error :: last ( ) )
1477
+ }
1478
+ }
1402
1479
}
1403
1480
1404
1481
/// Helper function to create a new `VmFd`.
0 commit comments