summary refs log tree commit diff
path: root/src/plugin/vcpu.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugin/vcpu.rs')
-rw-r--r--src/plugin/vcpu.rs21
1 files changed, 19 insertions, 2 deletions
diff --git a/src/plugin/vcpu.rs b/src/plugin/vcpu.rs
index fe59dd6..bf40ccc 100644
--- a/src/plugin/vcpu.rs
+++ b/src/plugin/vcpu.rs
@@ -18,7 +18,7 @@ use protobuf::Message;
 use data_model::DataInit;
 use kvm::{Vcpu, CpuId};
 use kvm_sys::{kvm_regs, kvm_sregs, kvm_fpu, kvm_debugregs, kvm_msrs, kvm_msr_entry,
-              KVM_CPUID_FLAG_SIGNIFCANT_INDEX};
+              KVM_CPUID_FLAG_SIGNIFCANT_INDEX, kvm_lapic_state, kvm_mp_state};
 use plugin_proto::*;
 
 use super::*;
@@ -66,7 +66,12 @@ unsafe impl DataInit for VcpuFpu {}
 #[derive(Copy, Clone)]
 struct VcpuDebugregs(kvm_debugregs);
 unsafe impl DataInit for VcpuDebugregs {}
-
+#[derive(Copy, Clone)]
+struct VcpuLapicState(kvm_lapic_state);
+unsafe impl DataInit for VcpuLapicState {}
+#[derive(Copy, Clone)]
+struct VcpuMpState(kvm_mp_state);
+unsafe impl DataInit for VcpuMpState {}
 
 fn get_vcpu_state(vcpu: &Vcpu, state_set: VcpuRequest_StateSet) -> SysResult<Vec<u8>> {
     Ok(match state_set {
@@ -76,6 +81,8 @@ fn get_vcpu_state(vcpu: &Vcpu, state_set: VcpuRequest_StateSet) -> SysResult<Vec
            VcpuRequest_StateSet::DEBUGREGS => {
                VcpuDebugregs(vcpu.get_debugregs()?).as_slice().to_vec()
            }
+           VcpuRequest_StateSet::LAPIC => VcpuLapicState(vcpu.get_lapic()?).as_slice().to_vec(),
+           VcpuRequest_StateSet::MP => VcpuMpState(vcpu.get_mp_state()?).as_slice().to_vec(),
        })
 }
 
@@ -101,6 +108,16 @@ fn set_vcpu_state(vcpu: &Vcpu, state_set: VcpuRequest_StateSet, state: &[u8]) ->
                                     .ok_or(SysError::new(EINVAL))?
                                     .0)
         }
+        VcpuRequest_StateSet::LAPIC => {
+            vcpu.set_lapic(&VcpuLapicState::from_slice(state)
+                                .ok_or(SysError::new(EINVAL))?
+                                .0)
+        }
+        VcpuRequest_StateSet::MP => {
+            vcpu.set_mp_state(&VcpuMpState::from_slice(state)
+                                    .ok_or(SysError::new(EINVAL))?
+                                    .0)
+        }
     }
 }