Skip to content

Commit f1541e4

Browse files
rvolosatovsandreeaflorescu
authored andcommitted
Add KVM_MEMORY_ENCRYPT_{UN,}REG_REGION test
Signed-off-by: Roman Volosatovs <[email protected]>
1 parent 7e3a551 commit f1541e4

File tree

1 file changed

+70
-0
lines changed

1 file changed

+70
-0
lines changed

src/ioctls/vm.rs

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1557,6 +1557,9 @@ mod tests {
15571557
use super::*;
15581558
use Kvm;
15591559

1560+
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
1561+
use std::{fs::OpenOptions, ptr::null_mut};
1562+
15601563
use libc::EFD_NONBLOCK;
15611564

15621565
#[test]
@@ -2054,4 +2057,71 @@ mod tests {
20542057
let mut init: kvm_sev_cmd = Default::default();
20552058
assert!(vm.encrypt_op_sev(&mut init).is_ok());
20562059
}
2060+
2061+
#[test]
2062+
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
2063+
#[cfg_attr(not(has_sev), ignore)]
2064+
fn test_register_unregister_enc_memory_region() {
2065+
let sev = OpenOptions::new()
2066+
.read(true)
2067+
.write(true)
2068+
.open("/dev/sev")
2069+
.unwrap();
2070+
2071+
let kvm = Kvm::new().unwrap();
2072+
let vm = kvm.create_vm().unwrap();
2073+
2074+
// Perform SEV launch sequence according to
2075+
// https://www.kernel.org/doc/Documentation/virtual/kvm/amd-memory-encryption.rst
2076+
2077+
let mut init: kvm_sev_cmd = Default::default();
2078+
assert!(vm.encrypt_op_sev(&mut init).is_ok());
2079+
2080+
let start_data: kvm_sev_launch_start = Default::default();
2081+
let mut start = kvm_sev_cmd {
2082+
id: sev_cmd_id_KVM_SEV_LAUNCH_START,
2083+
data: &start_data as *const kvm_sev_launch_start as _,
2084+
sev_fd: sev.as_raw_fd() as _,
2085+
..Default::default()
2086+
};
2087+
assert!(vm.encrypt_op_sev(&mut start).is_ok());
2088+
2089+
let addr = unsafe {
2090+
libc::mmap(
2091+
null_mut(),
2092+
4096,
2093+
libc::PROT_READ | libc::PROT_WRITE,
2094+
libc::MAP_PRIVATE | libc::MAP_ANONYMOUS,
2095+
-1,
2096+
0,
2097+
)
2098+
};
2099+
assert_ne!(addr, libc::MAP_FAILED);
2100+
2101+
assert_eq!(
2102+
vm.register_enc_memory_region(&Default::default())
2103+
.unwrap_err()
2104+
.errno(),
2105+
libc::EINVAL
2106+
);
2107+
assert_eq!(
2108+
vm.unregister_enc_memory_region(&Default::default())
2109+
.unwrap_err()
2110+
.errno(),
2111+
libc::EINVAL
2112+
);
2113+
2114+
let memory_region = kvm_enc_region {
2115+
addr: addr as _,
2116+
size: 4096,
2117+
};
2118+
assert_eq!(
2119+
vm.unregister_enc_memory_region(&memory_region)
2120+
.unwrap_err()
2121+
.errno(),
2122+
libc::EINVAL
2123+
);
2124+
assert!(vm.register_enc_memory_region(&memory_region).is_ok());
2125+
assert!(vm.unregister_enc_memory_region(&memory_region).is_ok());
2126+
}
20572127
}

0 commit comments

Comments
 (0)