diff options
Diffstat (limited to 'crosvm_plugin/src/lib.rs')
-rw-r--r-- | crosvm_plugin/src/lib.rs | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/crosvm_plugin/src/lib.rs b/crosvm_plugin/src/lib.rs index 24d99ca..c6f858a 100644 --- a/crosvm_plugin/src/lib.rs +++ b/crosvm_plugin/src/lib.rs @@ -139,6 +139,7 @@ enum Stat { CheckExtentsion, GetSupportedCpuid, GetEmulatedCpuid, + GetMsrIndexList, NetGetConfig, ReserveRange, SetIrq, @@ -427,6 +428,30 @@ impl crosvm { Ok(emulated_cpuids.get_entries().len()) } + fn get_msr_index_list(&mut self, msr_indices: &mut [u32]) + -> result::Result<usize, c_int> { + let mut r = MainRequest::new(); + r.mut_get_msr_index_list(); + + let (response, _) = self.main_transaction(&r, &[])?; + if !response.has_get_msr_index_list() { + return Err(EPROTO); + } + + let msr_list: &MainResponse_MsrListResponse = response.get_get_msr_index_list(); + if msr_list.get_indices().len() > msr_indices.len() { + return Err(E2BIG); + } + + for (proto_entry, kvm_entry) in + msr_list.get_indices().iter() + .zip(msr_indices.iter_mut()) { + *kvm_entry = *proto_entry; + } + + Ok(msr_list.get_indices().len()) + } + fn reserve_range(&mut self, space: u32, start: u64, length: u64) -> result::Result<(), c_int> { let mut r = MainRequest::new(); { @@ -1126,6 +1151,25 @@ fn crosvm_get_emulated_cpuid(this: *mut crosvm, } #[no_mangle] +pub unsafe extern "C" +fn crosvm_get_msr_index_list(this: *mut crosvm, + entry_count: u32, + msr_indices: *mut u32, + out_count: *mut u32) + -> c_int { + let _u = STATS.record(Stat::GetMsrIndexList); + let this = &mut *this; + let msr_indices = from_raw_parts_mut(msr_indices, entry_count as usize); + let ret = this.get_msr_index_list(msr_indices); + + if let Ok(num) = ret { + *out_count = num as u32; + } + to_crosvm_rc(ret) +} + + +#[no_mangle] pub unsafe extern "C" fn crosvm_net_get_config(self_: *mut crosvm, config: *mut crosvm_net_config) -> c_int { |