summary refs log tree commit diff
path: root/src/plugin/vcpu.rs
diff options
context:
space:
mode:
authorSlava Malyugin <slavamn@google.com>2018-07-06 09:52:05 -0700
committerchrome-bot <chrome-bot@chromium.org>2018-07-11 18:48:50 -0700
commitd1e391b8d490621974eee8b1d6464eac1f9c1bb3 (patch)
tree6888f52768606e3f5bfc6510203e959f0b0bc89c /src/plugin/vcpu.rs
parentcc08cdbd836cb280cebcb5f1d737da58aa3eff07 (diff)
downloadcrosvm-d1e391b8d490621974eee8b1d6464eac1f9c1bb3.tar
crosvm-d1e391b8d490621974eee8b1d6464eac1f9c1bb3.tar.gz
crosvm-d1e391b8d490621974eee8b1d6464eac1f9c1bb3.tar.bz2
crosvm-d1e391b8d490621974eee8b1d6464eac1f9c1bb3.tar.lz
crosvm-d1e391b8d490621974eee8b1d6464eac1f9c1bb3.tar.xz
crosvm-d1e391b8d490621974eee8b1d6464eac1f9c1bb3.tar.zst
crosvm-d1e391b8d490621974eee8b1d6464eac1f9c1bb3.zip
plugin: allow retrieving and setting VCPU events
Add crosvm plugin API to allow fetching and setting VCPU events.

BUG=b:110056268
TEST=cargo test --features plugin -p kvm

Change-Id: Id66230f180f4bdb95bd1850ed050e439083701cc
Reviewed-on: https://chromium-review.googlesource.com/1128045
Commit-Ready: Slava Malyugin <slavamn@chromium.org>
Tested-by: Slava Malyugin <slavamn@chromium.org>
Reviewed-by: Zach Reizner <zachr@chromium.org>
Diffstat (limited to 'src/plugin/vcpu.rs')
-rw-r--r--src/plugin/vcpu.rs11
1 files changed, 10 insertions, 1 deletions
diff --git a/src/plugin/vcpu.rs b/src/plugin/vcpu.rs
index 4ea6482..5ff5366 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_xcrs, kvm_msrs, kvm_msr_entry,
-              KVM_CPUID_FLAG_SIGNIFCANT_INDEX, kvm_lapic_state, kvm_mp_state};
+              KVM_CPUID_FLAG_SIGNIFCANT_INDEX, kvm_lapic_state, kvm_mp_state, kvm_vcpu_events};
 use plugin_proto::*;
 
 use super::*;
@@ -75,6 +75,9 @@ unsafe impl DataInit for VcpuLapicState {}
 #[derive(Copy, Clone)]
 struct VcpuMpState(kvm_mp_state);
 unsafe impl DataInit for VcpuMpState {}
+#[derive(Copy, Clone)]
+struct VcpuEvents(kvm_vcpu_events);
+unsafe impl DataInit for VcpuEvents {}
 
 fn get_vcpu_state(vcpu: &Vcpu, state_set: VcpuRequest_StateSet) -> SysResult<Vec<u8>> {
     Ok(match state_set {
@@ -87,6 +90,7 @@ fn get_vcpu_state(vcpu: &Vcpu, state_set: VcpuRequest_StateSet) -> SysResult<Vec
            VcpuRequest_StateSet::XCREGS => VcpuXcregs(vcpu.get_xcrs()?).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(),
+           VcpuRequest_StateSet::EVENTS => VcpuEvents(vcpu.get_vcpu_events()?).as_slice().to_vec(),
        })
 }
 
@@ -127,6 +131,11 @@ fn set_vcpu_state(vcpu: &Vcpu, state_set: VcpuRequest_StateSet, state: &[u8]) ->
                                    .ok_or(SysError::new(EINVAL))?
                                    .0)
         }
+        VcpuRequest_StateSet::EVENTS => {
+            vcpu.set_vcpu_events(&VcpuEvents::from_slice(state)
+                                    .ok_or(SysError::new(EINVAL))?
+                                    .0)
+        }
     }
 }