summary refs log tree commit diff
path: root/crosvm_plugin
diff options
context:
space:
mode:
authorDmitry Torokhov <dtor@chromium.org>2018-08-27 11:34:20 -0700
committerchrome-bot <chrome-bot@chromium.org>2018-08-31 05:22:52 -0700
commitcaa2e5a4ac45c5e107b6802db99c158083321bc4 (patch)
tree2338efb6819d29bba1b3553656c40d40fa8d18d2 /crosvm_plugin
parent9dec40e2420d5faf170fea328b331f9e695cf7d9 (diff)
downloadcrosvm-caa2e5a4ac45c5e107b6802db99c158083321bc4.tar
crosvm-caa2e5a4ac45c5e107b6802db99c158083321bc4.tar.gz
crosvm-caa2e5a4ac45c5e107b6802db99c158083321bc4.tar.bz2
crosvm-caa2e5a4ac45c5e107b6802db99c158083321bc4.tar.lz
crosvm-caa2e5a4ac45c5e107b6802db99c158083321bc4.tar.xz
crosvm-caa2e5a4ac45c5e107b6802db99c158083321bc4.tar.zst
crosvm-caa2e5a4ac45c5e107b6802db99c158083321bc4.zip
plugin: do not fail crosvm_vcpu_get_msrs() if we failed to fetch some
KVM_GET_MSRS may return less MSRs that were requested; do not fail but
instead let callers to know how many were fetched.

BUG=None
TEST=cargo test --features plugin

Change-Id: Ie14a3d38b66bfe34f5279543bea9c6c78423527e
Signed-off-by: Dmitry Torokhov <dtor@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/1192232
Reviewed-by: Zach Reizner <zachr@chromium.org>
Reviewed-by: Dylan Reid <dgreid@chromium.org>
Diffstat (limited to 'crosvm_plugin')
-rw-r--r--crosvm_plugin/crosvm.h3
-rw-r--r--crosvm_plugin/src/lib.rs16
2 files changed, 13 insertions, 6 deletions
diff --git a/crosvm_plugin/crosvm.h b/crosvm_plugin/crosvm.h
index c2139b3..39c2453 100644
--- a/crosvm_plugin/crosvm.h
+++ b/crosvm_plugin/crosvm.h
@@ -509,7 +509,8 @@ 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);
+                         struct kvm_msr_entry *__msr_entries,
+                         uint32_t *__out_count);
 /* Sets the MSRs of the vcpu indicated by the index field of each entry. */
 int crosvm_vcpu_set_msrs(struct crosvm_vcpu*, uint32_t __msr_count,
                          const struct kvm_msr_entry *__msr_entries);
diff --git a/crosvm_plugin/src/lib.rs b/crosvm_plugin/src/lib.rs
index 6567ee8..06cb367 100644
--- a/crosvm_plugin/src/lib.rs
+++ b/crosvm_plugin/src/lib.rs
@@ -995,7 +995,9 @@ impl crosvm_vcpu {
         Ok(())
     }
 
-    fn get_msrs(&mut self, msr_entries: &mut [kvm_msr_entry]) -> result::Result<(), c_int> {
+    fn get_msrs(&mut self, msr_entries: &mut [kvm_msr_entry], msr_count: &mut usize)
+                -> result::Result<(), c_int> {
+        *msr_count = 0;
         let mut r = VcpuRequest::new();
         {
             let entry_indices: &mut Vec<u32> = r.mut_get_msrs().mut_entry_indices();
@@ -1008,8 +1010,9 @@ impl crosvm_vcpu {
             return Err(EPROTO);
         }
         let get_msrs: &VcpuResponse_GetMsrs = response.get_get_msrs();
-        if get_msrs.get_entry_data().len() != msr_entries.len() {
-            return Err(EPROTO);
+        *msr_count = get_msrs.get_entry_data().len();
+        if *msr_count > msr_entries.len() {
+            return Err(E2BIG);
         }
         for (&msr_data, msr_entry) in
             get_msrs
@@ -1464,12 +1467,15 @@ pub unsafe extern "C" fn crosvm_vcpu_set_xcrs(this: *mut crosvm_vcpu,
 #[no_mangle]
 pub unsafe extern "C" fn crosvm_vcpu_get_msrs(this: *mut crosvm_vcpu,
                                               msr_count: u32,
-                                              msr_entries: *mut kvm_msr_entry)
+                                              msr_entries: *mut kvm_msr_entry,
+                                              out_count: *mut u32)
                                               -> c_int {
     let _u = STATS.record(Stat::VcpuGetMsrs);
     let this = &mut *this;
     let msr_entries = from_raw_parts_mut(msr_entries, msr_count as usize);
-    let ret = this.get_msrs(msr_entries);
+    let mut count: usize = 0;
+    let ret = this.get_msrs(msr_entries, &mut count);
+    *out_count = count as u32;
     to_crosvm_rc(ret)
 }