diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/cap.rs | 34 | ||||
-rw-r--r-- | src/kvm.rs | 23 | ||||
-rw-r--r-- | src/lib.rs | 3 |
3 files changed, 58 insertions, 2 deletions
diff --git a/src/cap.rs b/src/cap.rs new file mode 100644 index 0000000..672ca75 --- /dev/null +++ b/src/cap.rs @@ -0,0 +1,34 @@ +//! Definitions of KVM capabilities. + +use crate::kvm_sys; +use std::convert::Into; + +/// Definition of capabilities that return a bool value indicating whether the capability is +/// supported or not. +#[repr(u64)] +pub enum CapBool { + /// Check if capabilities can be queried on VM fds (`KVM_CAP_CHECK_EXTENSION_VM`). + CheckExtensionVm = kvm_sys::KVM_CAP_CHECK_EXTENSION_VM, +} + +impl Into<u64> for CapBool { + fn into(self) -> u64 { + self as u64 + } +} + +/// Definition of capabilities that return an integer value indicating the amount of the queried +/// capability. +#[repr(u64)] +pub enum CapInt { + /// Get the recommended max VPCUs (`KVM_CAP_NR_VCPUS`). + NrVcpus = kvm_sys::KVM_CAP_NR_VCPUS, + /// Get the possible max VPCUs (`KVM_CAP_MAX_VCPUS`). + MaxVcpus = kvm_sys::KVM_CAP_MAX_VCPUS, +} + +impl Into<u64> for CapInt { + fn into(self) -> u64 { + self as u64 + } +} @@ -4,8 +4,9 @@ use std::fs; use std::io; use std::os::unix::io::FromRawFd; -use crate::{libcret, ioctl, kvm_sys}; +use crate::cap::{CapBool, CapInt}; use crate::vm::Vm; +use crate::{ioctl, kvm_sys, libcret}; /// Wrapper for `/dev/kvm` ioctls. /// @@ -49,4 +50,24 @@ impl Kvm { Ok(Vm::new(vm, vcpu_mmap_size)) } + + /// Check availability of an extension with the [`KVM_CHECK_EXTENSION`][kvm-check-extension] + /// ioctl. + /// + /// [kvm-check-extension]: https://www.kernel.org/doc/html/latest/virt/kvm/api.html#kvm-check-extension + pub fn check_extenstion(&self, cap: CapBool) -> bool { + let ret = ioctl(&self.kvm, kvm_sys::KVM_CHECK_EXTENSION, cap.into()); + + matches!(ret, Ok(ret) if ret > 0) + } + + /// Check availability of an extension with the [`KVM_CHECK_EXTENSION`][kvm-check-extension] + /// ioctl. + /// + /// [kvm-check-extension]: https://www.kernel.org/doc/html/latest/virt/kvm/api.html#kvm-check-extension + pub fn check_extenstion_int(&self, cap: CapInt) -> i32 { + let ret = ioctl(&self.kvm, kvm_sys::KVM_CHECK_EXTENSION, cap.into()); + + ret.unwrap_or(0) + } } @@ -3,6 +3,7 @@ use std::io; use std::ops; use std::os::unix::io::AsRawFd; +pub mod cap; mod fmt; pub mod kvm; pub mod kvm_sys; @@ -154,7 +155,7 @@ impl ops::Drop for KvmRun { impl AsRef<kvm_sys::kvm_run> for KvmRun { fn as_ref(&self) -> &kvm_sys::kvm_run { - unsafe { & *(self.ptr as *const kvm_sys::kvm_run) } + unsafe { &*(self.ptr as *const kvm_sys::kvm_run) } } } |