summary refs log tree commit diff
path: root/plugin_proto/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'plugin_proto/src/lib.rs')
-rw-r--r--plugin_proto/src/lib.rs32
1 files changed, 32 insertions, 0 deletions
diff --git a/plugin_proto/src/lib.rs b/plugin_proto/src/lib.rs
index 7f0d66c..c28635a 100644
--- a/plugin_proto/src/lib.rs
+++ b/plugin_proto/src/lib.rs
@@ -1,2 +1,34 @@
 extern crate protobuf;
+extern crate kvm_sys;
 include!(concat!(env!("OUT_DIR"), "/proto_include.rs"));
+
+/// Converts protobuf representation of CpuId data into KVM format.
+pub fn cpuid_proto_to_kvm(entry: &CpuidEntry) -> kvm_sys::kvm_cpuid_entry2 {
+    // Safe: C structures are expected to be zero-initialized.
+    let mut e: kvm_sys::kvm_cpuid_entry2 = unsafe { std::mem::zeroed() };
+    e.function = entry.function;
+    if entry.has_index {
+        e.flags = kvm_sys::KVM_CPUID_FLAG_SIGNIFCANT_INDEX;
+    }
+    e.index = entry.index;
+    e.eax = entry.eax;
+    e.ebx = entry.ebx;
+    e.ecx = entry.ecx;
+    e.edx = entry.edx;
+
+    e
+}
+
+/// Converts KVM representation of CpuId data into protobuf format.
+pub fn cpuid_kvm_to_proto(entry: &kvm_sys::kvm_cpuid_entry2) -> CpuidEntry {
+    let mut e = CpuidEntry::new();
+    e.function = entry.function;
+    e.has_index = entry.flags & kvm_sys::KVM_CPUID_FLAG_SIGNIFCANT_INDEX != 0;
+    e.index = entry.index;
+    e.eax = entry.eax;
+    e.ebx = entry.ebx;
+    e.ecx = entry.ecx;
+    e.edx = entry.edx;
+
+    e
+}