Skip to content

Commit 7e3a551

Browse files
rvolosatovsharaldh
authored andcommitted
Add support for KVM_MEMORY_ENCRYPT_UNREG_REGION
Co-authored-by: Harald Hoyer <[email protected]> Signed-off-by: Roman Volosatovs <[email protected]>
1 parent 8b62c98 commit 7e3a551

File tree

2 files changed

+80
-0
lines changed

2 files changed

+80
-0
lines changed

src/ioctls/vm.rs

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1399,6 +1399,83 @@ impl VmFd {
13991399
Err(errno::Error::last())
14001400
}
14011401
}
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+
}
14021479
}
14031480

14041481
/// Helper function to create a new `VmFd`.

src/kvm_ioctls.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,9 @@ ioctl_iowr_nr!(KVM_MEMORY_ENCRYPT_OP, KVMIO, 0xba, std::os::raw::c_ulong);
9999
/* Available on SEV-enabled guests. */
100100
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
101101
ioctl_ior_nr!(KVM_MEMORY_ENCRYPT_REG_REGION, KVMIO, 0xbb, kvm_enc_region);
102+
/* Available on SEV-enabled guests. */
103+
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
104+
ioctl_ior_nr!(KVM_MEMORY_ENCRYPT_UNREG_REGION, KVMIO, 0xbc, kvm_enc_region);
102105

103106
// Ioctls for VCPU fds.
104107

0 commit comments

Comments
 (0)