summary refs log tree commit diff
path: root/src/plugin/vcpu.rs
diff options
context:
space:
mode:
authorDmitry Torokhov <dtor@chromium.org>2018-05-16 11:03:52 -0700
committerchrome-bot <chrome-bot@chromium.org>2018-05-18 20:08:21 -0700
commitbb6580167937475e2d54e39bbf4babd402202a08 (patch)
treec35bd28c8e9194f5d00fd46763f6b21ecefa21c3 /src/plugin/vcpu.rs
parentf0656b661c97281f56d91e24224334b7e4d6ebc4 (diff)
downloadcrosvm-bb6580167937475e2d54e39bbf4babd402202a08.tar
crosvm-bb6580167937475e2d54e39bbf4babd402202a08.tar.gz
crosvm-bb6580167937475e2d54e39bbf4babd402202a08.tar.bz2
crosvm-bb6580167937475e2d54e39bbf4babd402202a08.tar.lz
crosvm-bb6580167937475e2d54e39bbf4babd402202a08.tar.xz
crosvm-bb6580167937475e2d54e39bbf4babd402202a08.tar.zst
crosvm-bb6580167937475e2d54e39bbf4babd402202a08.zip
plugin: allow retrieving and setting XCR VCPU states
Add crossvm plugin API to allow fetching and setting XCRs for VCPU.

BUG=b:79692549
TEST=cargo test -p kvm

Change-Id: I2a988279c08051a8d8865efc1e60f9692fa26272
Signed-off-by: Dmitry Torokhov <dtor@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/1062646
Commit-Ready: ChromeOS CL Exonerator Bot <chromiumos-cl-exonerator@appspot.gserviceaccount.com>
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 477cf61..4ea6482 100644
--- a/src/plugin/vcpu.rs
+++ b/src/plugin/vcpu.rs
@@ -17,7 +17,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,
+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};
 use plugin_proto::*;
 
@@ -67,6 +67,9 @@ unsafe impl DataInit for VcpuFpu {}
 struct VcpuDebugregs(kvm_debugregs);
 unsafe impl DataInit for VcpuDebugregs {}
 #[derive(Copy, Clone)]
+struct VcpuXcregs(kvm_xcrs);
+unsafe impl DataInit for VcpuXcregs {}
+#[derive(Copy, Clone)]
 struct VcpuLapicState(kvm_lapic_state);
 unsafe impl DataInit for VcpuLapicState {}
 #[derive(Copy, Clone)]
@@ -81,6 +84,7 @@ 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::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(),
        })
@@ -108,6 +112,11 @@ fn set_vcpu_state(vcpu: &Vcpu, state_set: VcpuRequest_StateSet, state: &[u8]) ->
                                     .ok_or(SysError::new(EINVAL))?
                                     .0)
         }
+        VcpuRequest_StateSet::XCREGS => {
+            vcpu.set_xcrs(&VcpuXcregs::from_slice(state)
+                              .ok_or(SysError::new(EINVAL))?
+                              .0)
+        }
         VcpuRequest_StateSet::LAPIC => {
             vcpu.set_lapic(&VcpuLapicState::from_slice(state)
                                 .ok_or(SysError::new(EINVAL))?