1*bb4ee6a4SAndroid Build Coastguard Worker // Copyright 2017 The ChromiumOS Authors
2*bb4ee6a4SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*bb4ee6a4SAndroid Build Coastguard Worker // found in the LICENSE file.
4*bb4ee6a4SAndroid Build Coastguard Worker
5*bb4ee6a4SAndroid Build Coastguard Worker #![cfg(not(any(target_os = "windows", target_arch = "arm")))]
6*bb4ee6a4SAndroid Build Coastguard Worker
7*bb4ee6a4SAndroid Build Coastguard Worker use kvm_sys::*;
8*bb4ee6a4SAndroid Build Coastguard Worker use libc::c_char;
9*bb4ee6a4SAndroid Build Coastguard Worker use libc::ioctl;
10*bb4ee6a4SAndroid Build Coastguard Worker use libc::open64;
11*bb4ee6a4SAndroid Build Coastguard Worker use libc::O_RDWR;
12*bb4ee6a4SAndroid Build Coastguard Worker
13*bb4ee6a4SAndroid Build Coastguard Worker const KVM_PATH: &str = "/dev/kvm\0";
14*bb4ee6a4SAndroid Build Coastguard Worker
15*bb4ee6a4SAndroid Build Coastguard Worker #[test]
get_version()16*bb4ee6a4SAndroid Build Coastguard Worker fn get_version() {
17*bb4ee6a4SAndroid Build Coastguard Worker // SAFETY: KVM_PATH is expected to be valid and return value is checked.
18*bb4ee6a4SAndroid Build Coastguard Worker let sys_fd = unsafe { open64(KVM_PATH.as_ptr() as *const c_char, O_RDWR) };
19*bb4ee6a4SAndroid Build Coastguard Worker assert!(sys_fd >= 0);
20*bb4ee6a4SAndroid Build Coastguard Worker
21*bb4ee6a4SAndroid Build Coastguard Worker // SAFETY: sys_fd is expected to be valid and return value is checked.
22*bb4ee6a4SAndroid Build Coastguard Worker let ret = unsafe { ioctl(sys_fd, KVM_GET_API_VERSION, 0) };
23*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(ret as u32, KVM_API_VERSION);
24*bb4ee6a4SAndroid Build Coastguard Worker }
25*bb4ee6a4SAndroid Build Coastguard Worker
26*bb4ee6a4SAndroid Build Coastguard Worker #[test]
create_vm_fd()27*bb4ee6a4SAndroid Build Coastguard Worker fn create_vm_fd() {
28*bb4ee6a4SAndroid Build Coastguard Worker // SAFETY: KVM_PATH is expected to be valid and return value is checked.
29*bb4ee6a4SAndroid Build Coastguard Worker let sys_fd = unsafe { open64(KVM_PATH.as_ptr() as *const c_char, O_RDWR) };
30*bb4ee6a4SAndroid Build Coastguard Worker assert!(sys_fd >= 0);
31*bb4ee6a4SAndroid Build Coastguard Worker
32*bb4ee6a4SAndroid Build Coastguard Worker // SAFETY: sys_fd is expected to be valid and return value is checked.
33*bb4ee6a4SAndroid Build Coastguard Worker let vm_fd = unsafe { ioctl(sys_fd, KVM_CREATE_VM, 0) };
34*bb4ee6a4SAndroid Build Coastguard Worker assert!(vm_fd >= 0);
35*bb4ee6a4SAndroid Build Coastguard Worker }
36*bb4ee6a4SAndroid Build Coastguard Worker
37*bb4ee6a4SAndroid Build Coastguard Worker #[test]
check_vm_extension()38*bb4ee6a4SAndroid Build Coastguard Worker fn check_vm_extension() {
39*bb4ee6a4SAndroid Build Coastguard Worker // SAFETY: KVM_PATH is expected to be valid and return value is checked.
40*bb4ee6a4SAndroid Build Coastguard Worker let sys_fd = unsafe { open64(KVM_PATH.as_ptr() as *const c_char, O_RDWR) };
41*bb4ee6a4SAndroid Build Coastguard Worker assert!(sys_fd >= 0);
42*bb4ee6a4SAndroid Build Coastguard Worker
43*bb4ee6a4SAndroid Build Coastguard Worker // SAFETY: sys_fd is expected to be valid and return value is checked.
44*bb4ee6a4SAndroid Build Coastguard Worker let has_user_memory = unsafe { ioctl(sys_fd, KVM_CHECK_EXTENSION, KVM_CAP_USER_MEMORY) };
45*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(has_user_memory, 1);
46*bb4ee6a4SAndroid Build Coastguard Worker }
47