From d2d2ba7c6602e73dc2e3dbd0aa4215e4c412a688 Mon Sep 17 00:00:00 2001 From: johannst Date: Wed, 2 Jun 2021 22:38:57 +0000 Subject: deploy: d2e2063cb2b5a82709e9c5188602a9fc0f7dadbd --- src/kvm_rs/kvm.rs.html | 111 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 src/kvm_rs/kvm.rs.html (limited to 'src/kvm_rs/kvm.rs.html') diff --git a/src/kvm_rs/kvm.rs.html b/src/kvm_rs/kvm.rs.html new file mode 100644 index 0000000..ccd6c37 --- /dev/null +++ b/src/kvm_rs/kvm.rs.html @@ -0,0 +1,111 @@ +kvm.rs - source + +
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+
+//! KVM system ioctls.
+
+use std::fs;
+use std::io;
+use std::os::unix::io::FromRawFd;
+
+use crate::{libcret, ioctl, kvm_sys};
+use crate::vm::Vm;
+
+/// Wrapper for `/dev/kvm` ioctls.
+///
+/// Representation of the file descriptor obtained by opening `/dev/kvm`.
+/// This wrapper provides access to the `system ioctls` as described in [KVM API][kvm].
+///
+/// [kvm]: https://www.kernel.org/doc/html/latest/virt/kvm/api.html#general-description
+pub struct Kvm {
+    kvm: fs::File,
+}
+
+impl Kvm {
+    /// Open the `/dev/kvm` device.
+    pub fn new() -> io::Result<Kvm> {
+        let kvm = libcret(unsafe {
+            libc::open("/dev/kvm\0".as_ptr().cast(), libc::O_RDWR | libc::O_CLOEXEC)
+        })
+        .map(|fd| unsafe { fs::File::from_raw_fd(fd) })?;
+
+        assert_eq!(
+            kvm_sys::KVM_API_VERSION,
+            ioctl(&kvm, kvm_sys::KVM_GET_API_VERSION, 0)?
+        );
+
+        Ok(Kvm { kvm })
+    }
+
+    fn get_vpcu_mmap_size(&self) -> io::Result<usize> {
+        ioctl(&self.kvm, kvm_sys::KVM_GET_VCPU_MMAP_SIZE, 0).map(|size| size as usize)
+    }
+
+    /// Create a new virtual machine with the [`KVM_CREATE_VM`][kvm-create-vm] ioctl.
+    /// Returns a wrapper [`vm::Vm`][crate::vm::Vm] representing the VM.
+    ///
+    /// [kvm-create-vm]: https://www.kernel.org/doc/html/latest/virt/kvm/api.html#kvm-create-vm
+    pub fn create_vm(&self) -> io::Result<Vm> {
+        let vm = ioctl(&self.kvm, kvm_sys::KVM_CREATE_VM, 0 /* machine id */)
+            .map(|fd| unsafe { fs::File::from_raw_fd(fd) })?;
+
+        let vcpu_mmap_size = self.get_vpcu_mmap_size()?;
+
+        Ok(Vm::new(vm, vcpu_mmap_size))
+    }
+}
+
+
+ \ No newline at end of file -- cgit v1.2.3