summary refs log tree commit diff
path: root/crosvm_plugin
diff options
context:
space:
mode:
authorDmitry Torokhov <dtor@chromium.org>2019-01-17 16:20:33 -0800
committerchrome-bot <chrome-bot@chromium.org>2019-01-22 21:05:18 -0800
commit2c7e88199ea4f7e8a9486c1c76ecaeababad4d49 (patch)
tree814f2b2a341f34917b5492a7832771fd883a2575 /crosvm_plugin
parent5d471b454a04dbb38e8338017b204f1a403aadb9 (diff)
downloadcrosvm-2c7e88199ea4f7e8a9486c1c76ecaeababad4d49.tar
crosvm-2c7e88199ea4f7e8a9486c1c76ecaeababad4d49.tar.gz
crosvm-2c7e88199ea4f7e8a9486c1c76ecaeababad4d49.tar.bz2
crosvm-2c7e88199ea4f7e8a9486c1c76ecaeababad4d49.tar.lz
crosvm-2c7e88199ea4f7e8a9486c1c76ecaeababad4d49.tar.xz
crosvm-2c7e88199ea4f7e8a9486c1c76ecaeababad4d49.tar.zst
crosvm-2c7e88199ea4f7e8a9486c1c76ecaeababad4d49.zip
plugin: allow retrieving and setting VM clock
Add crossvm plugin API to allow reading and setting guest clock.

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

Change-Id: I3fd656c06b0e7e43ac88a337ac5d0caec8c59dba
Signed-off-by: Dmitry Torokhov <dtor@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/1419373
Tested-by: kokoro <noreply+kokoro@google.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.h9
-rw-r--r--crosvm_plugin/src/lib.rs31
3 files changed, 38 insertions, 4 deletions
diff --git a/crosvm_plugin/Cargo.toml b/crosvm_plugin/Cargo.toml
index 9406912..2233b6d 100644
--- a/crosvm_plugin/Cargo.toml
+++ b/crosvm_plugin/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "crosvm_plugin"
-version = "0.16.0"
+version = "0.17.0"
 authors = ["The Chromium OS Authors"]
 
 [lib]
diff --git a/crosvm_plugin/crosvm.h b/crosvm_plugin/crosvm.h
index 3f58739..81c8ade 100644
--- a/crosvm_plugin/crosvm.h
+++ b/crosvm_plugin/crosvm.h
@@ -47,7 +47,7 @@ extern "C" {
  * do not indicate anything about what version of crosvm is running.
  */
 #define CROSVM_API_MAJOR 0
-#define CROSVM_API_MINOR 16
+#define CROSVM_API_MINOR 17
 #define CROSVM_API_PATCH 0
 
 enum crosvm_address_space {
@@ -252,6 +252,13 @@ int crosvm_get_pit_state(struct crosvm *, struct kvm_pit_state2 *__pit_state);
 int crosvm_set_pit_state(struct crosvm *,
                          const struct kvm_pit_state2 *__pit_state);
 
+/* Gets the current timestamp of kvmclock as seen by the VM. */
+int crosvm_get_clock(struct crosvm *, struct kvm_clock_data *__clock_data);
+
+/* Sets the current timestamp of kvmclock for the VM. */
+int crosvm_set_clock(struct crosvm *,
+                     const struct kvm_clock_data *__clock_data);
+
 /* Sets the identity map address as in the KVM_SET_IDENTITY_MAP_ADDR ioctl. */
 int crosvm_set_identity_map_addr(struct crosvm*, uint32_t __addr);
 
diff --git a/crosvm_plugin/src/lib.rs b/crosvm_plugin/src/lib.rs
index 8fd9623..ac6b358 100644
--- a/crosvm_plugin/src/lib.rs
+++ b/crosvm_plugin/src/lib.rs
@@ -45,8 +45,9 @@ use sys_util::ScmSocket;
 use kvm::dirty_log_bitmap_size;
 
 use kvm_sys::{
-    kvm_cpuid_entry2, kvm_debugregs, kvm_fpu, kvm_ioapic_state, kvm_lapic_state, kvm_mp_state,
-    kvm_msr_entry, kvm_pic_state, kvm_pit_state2, kvm_regs, kvm_sregs, kvm_vcpu_events, kvm_xcrs,
+    kvm_clock_data, kvm_cpuid_entry2, kvm_debugregs, kvm_fpu, kvm_ioapic_state, kvm_lapic_state,
+    kvm_mp_state, kvm_msr_entry, kvm_pic_state, kvm_pit_state2, kvm_regs, kvm_sregs,
+    kvm_vcpu_events, kvm_xcrs,
 };
 
 use plugin_proto::*;
@@ -151,6 +152,8 @@ enum Stat {
     SetIoapicState,
     GetPitState,
     SetPitState,
+    GetClock,
+    SetClock,
     SetIdentityMapAddr,
     PauseVcpus,
     Start,
@@ -1356,6 +1359,30 @@ pub unsafe extern "C" fn crosvm_set_pit_state(
 }
 
 #[no_mangle]
+pub unsafe extern "C" fn crosvm_get_clock(
+    this: *mut crosvm,
+    clock_data: *mut kvm_clock_data,
+) -> c_int {
+    let _u = STATS.record(Stat::GetClock);
+    let this = &mut *this;
+    let state = from_raw_parts_mut(clock_data as *mut u8, size_of::<kvm_clock_data>());
+    let ret = this.get_state(MainRequest_StateSet::CLOCK, state);
+    to_crosvm_rc(ret)
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn crosvm_set_clock(
+    this: *mut crosvm,
+    clock_data: *const kvm_clock_data,
+) -> c_int {
+    let _u = STATS.record(Stat::SetClock);
+    let this = &mut *this;
+    let state = from_raw_parts(clock_data as *mut u8, size_of::<kvm_clock_data>());
+    let ret = this.set_state(MainRequest_StateSet::CLOCK, state);
+    to_crosvm_rc(ret)
+}
+
+#[no_mangle]
 pub unsafe extern "C" fn crosvm_set_identity_map_addr(self_: *mut crosvm, addr: u32) -> c_int {
     let _u = STATS.record(Stat::SetIdentityMapAddr);
     let self_ = &mut (*self_);