diff options
author | Dmitry Torokhov <dtor@chromium.org> | 2019-01-17 16:20:33 -0800 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2019-01-22 21:05:18 -0800 |
commit | 2c7e88199ea4f7e8a9486c1c76ecaeababad4d49 (patch) | |
tree | 814f2b2a341f34917b5492a7832771fd883a2575 /crosvm_plugin | |
parent | 5d471b454a04dbb38e8338017b204f1a403aadb9 (diff) | |
download | crosvm-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.toml | 2 | ||||
-rw-r--r-- | crosvm_plugin/crosvm.h | 9 | ||||
-rw-r--r-- | crosvm_plugin/src/lib.rs | 31 |
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_); |