From 9f025e829ab6ed468cfb51d72ac105624afc3851 Mon Sep 17 00:00:00 2001 From: johannst Date: Thu, 1 Jul 2021 23:11:14 +0200 Subject: added support to query caps on kvm fd + few caps --- src/cap.rs | 34 ++++++++++++++++++++++++++++++++++ src/kvm.rs | 23 ++++++++++++++++++++++- src/lib.rs | 3 ++- 3 files changed, 58 insertions(+), 2 deletions(-) create mode 100644 src/cap.rs (limited to 'src') 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 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 for CapInt { + fn into(self) -> u64 { + self as u64 + } +} diff --git a/src/kvm.rs b/src/kvm.rs index 23112aa..30a00bb 100644 --- a/src/kvm.rs +++ b/src/kvm.rs @@ -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) + } } diff --git a/src/lib.rs b/src/lib.rs index 1833890..372255c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -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 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) } } } -- cgit v1.2.3