summary refs log tree commit diff
path: root/crosvm_plugin
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 /crosvm_plugin
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 'crosvm_plugin')
-rw-r--r--crosvm_plugin/Cargo.toml2
-rw-r--r--crosvm_plugin/crosvm.h5
-rw-r--r--crosvm_plugin/src/lib.rs29
3 files changed, 33 insertions, 3 deletions
diff --git a/crosvm_plugin/Cargo.toml b/crosvm_plugin/Cargo.toml
index 5b775e3..3c61aa4 100644
--- a/crosvm_plugin/Cargo.toml
+++ b/crosvm_plugin/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "crosvm_plugin"
-version = "0.13.0"
+version = "0.14.0"
 authors = ["The Chromium OS Authors"]
 
 [lib]
diff --git a/crosvm_plugin/crosvm.h b/crosvm_plugin/crosvm.h
index c7589e2..42c979a 100644
--- a/crosvm_plugin/crosvm.h
+++ b/crosvm_plugin/crosvm.h
@@ -495,6 +495,11 @@ int crosvm_vcpu_get_debugregs(struct crosvm_vcpu*, struct kvm_debugregs*);
 /* Sets the state of the vcpu's debug registers */
 int crosvm_vcpu_set_debugregs(struct crosvm_vcpu*, const struct kvm_debugregs*);
 
+/* Gets the state of the vcpu's xcr registers. */
+int crosvm_vcpu_get_xcrs(struct crosvm_vcpu*, struct kvm_xcrs*);
+/* Sets the state of the vcpu's xcr registers. */
+int crosvm_vcpu_set_xcrs(struct crosvm_vcpu*, const struct kvm_xcrs*);
+
 /* Gets the MSRs of the vcpu indicated by the index field of each entry. */
 int crosvm_vcpu_get_msrs(struct crosvm_vcpu*, uint32_t __msr_count,
                          struct kvm_msr_entry *__msr_entries);
diff --git a/crosvm_plugin/src/lib.rs b/crosvm_plugin/src/lib.rs
index 6bd1be8..231ee25 100644
--- a/crosvm_plugin/src/lib.rs
+++ b/crosvm_plugin/src/lib.rs
@@ -44,8 +44,9 @@ use sys_util::Scm;
 
 use kvm::dirty_log_bitmap_size;
 
-use kvm_sys::{kvm_regs, kvm_sregs, kvm_fpu, kvm_debugregs, kvm_msr_entry, kvm_cpuid_entry2,
-              kvm_lapic_state, kvm_mp_state, kvm_pic_state, kvm_ioapic_state, kvm_pit_state2};
+use kvm_sys::{kvm_regs, kvm_sregs, kvm_fpu, kvm_debugregs, kvm_xcrs, kvm_msr_entry,
+              kvm_cpuid_entry2, kvm_lapic_state, kvm_mp_state, kvm_pic_state, kvm_ioapic_state,
+              kvm_pit_state2};
 
 use plugin_proto::*;
 
@@ -162,6 +163,8 @@ enum Stat {
     SetFpu,
     GetDebugRegs,
     SetDebugRegs,
+    GetXCRegs,
+    SetXCRegs,
     VcpuGetMsrs,
     VcpuSetMsrs,
     VcpuSetCpuid,
@@ -1383,6 +1386,28 @@ pub unsafe extern "C" fn crosvm_vcpu_set_debugregs(this: *mut crosvm_vcpu,
 }
 
 #[no_mangle]
+pub unsafe extern "C" fn crosvm_vcpu_get_xcrs(this: *mut crosvm_vcpu,
+                                              xcrs: *mut kvm_xcrs)
+                                              -> c_int {
+    let _u = STATS.record(Stat::GetXCRegs);
+    let this = &mut *this;
+    let xcrs = from_raw_parts_mut(xcrs as *mut u8, size_of::<kvm_xcrs>());
+    let ret = this.get_state(VcpuRequest_StateSet::XCREGS, xcrs);
+    to_crosvm_rc(ret)
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn crosvm_vcpu_set_xcrs(this: *mut crosvm_vcpu,
+                                              xcrs: *const kvm_xcrs)
+                                              -> c_int {
+    let _u = STATS.record(Stat::SetXCRegs);
+    let this = &mut *this;
+    let xcrs = from_raw_parts(xcrs as *mut u8, size_of::<kvm_xcrs>());
+    let ret = this.set_state(VcpuRequest_StateSet::XCREGS, xcrs);
+    to_crosvm_rc(ret)
+}
+
+#[no_mangle]
 pub unsafe extern "C" fn crosvm_vcpu_get_msrs(this: *mut crosvm_vcpu,
                                               msr_count: u32,
                                               msr_entries: *mut kvm_msr_entry)