xref: /aosp_15_r20/external/crosvm/crosvm_plugin/src/lib.rs (revision bb4ee6a4ae7042d18b07a98463b9c8b875e44b39)
1*bb4ee6a4SAndroid Build Coastguard Worker // Copyright 2017 The ChromiumOS Authors
2*bb4ee6a4SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*bb4ee6a4SAndroid Build Coastguard Worker // found in the LICENSE file.
4*bb4ee6a4SAndroid Build Coastguard Worker 
5*bb4ee6a4SAndroid Build Coastguard Worker #![cfg(any(target_os = "android", target_os = "linux"))]
6*bb4ee6a4SAndroid Build Coastguard Worker #![cfg(target_arch = "x86_64")]
7*bb4ee6a4SAndroid Build Coastguard Worker #![allow(non_camel_case_types)]
8*bb4ee6a4SAndroid Build Coastguard Worker #![allow(clippy::missing_safety_doc)]
9*bb4ee6a4SAndroid Build Coastguard Worker 
10*bb4ee6a4SAndroid Build Coastguard Worker //! This module implements the dynamically loaded client library API used by a crosvm plugin,
11*bb4ee6a4SAndroid Build Coastguard Worker //! defined in `crosvm.h`. It implements the client half of the plugin protocol, which is defined in
12*bb4ee6a4SAndroid Build Coastguard Worker //! the `protos::plugin` module.
13*bb4ee6a4SAndroid Build Coastguard Worker //!
14*bb4ee6a4SAndroid Build Coastguard Worker //! To implement the `crosvm.h` C API, each function and struct definition is repeated here, with
15*bb4ee6a4SAndroid Build Coastguard Worker //! concrete definitions for each struct. Most functions are thin shims to the underlying object
16*bb4ee6a4SAndroid Build Coastguard Worker //! oriented Rust implementation method. Most methods require a request over the crosvm connection,
17*bb4ee6a4SAndroid Build Coastguard Worker //! which is done by creating a `MainRequest` or `VcpuRequest` protobuf and sending it over the
18*bb4ee6a4SAndroid Build Coastguard Worker //! connection's socket. Then, that socket is read for a `MainResponse` or `VcpuResponse`, which is
19*bb4ee6a4SAndroid Build Coastguard Worker //! translated to the appropriate return type for the C API.
20*bb4ee6a4SAndroid Build Coastguard Worker 
21*bb4ee6a4SAndroid Build Coastguard Worker use std::env;
22*bb4ee6a4SAndroid Build Coastguard Worker use std::fs::File;
23*bb4ee6a4SAndroid Build Coastguard Worker use std::io::Read;
24*bb4ee6a4SAndroid Build Coastguard Worker use std::io::Write;
25*bb4ee6a4SAndroid Build Coastguard Worker use std::mem::size_of;
26*bb4ee6a4SAndroid Build Coastguard Worker use std::mem::swap;
27*bb4ee6a4SAndroid Build Coastguard Worker use std::os::raw::c_int;
28*bb4ee6a4SAndroid Build Coastguard Worker use std::os::raw::c_void;
29*bb4ee6a4SAndroid Build Coastguard Worker use std::os::unix::io::AsRawFd;
30*bb4ee6a4SAndroid Build Coastguard Worker use std::os::unix::io::FromRawFd;
31*bb4ee6a4SAndroid Build Coastguard Worker use std::os::unix::io::IntoRawFd;
32*bb4ee6a4SAndroid Build Coastguard Worker use std::os::unix::io::RawFd;
33*bb4ee6a4SAndroid Build Coastguard Worker use std::os::unix::net::UnixDatagram;
34*bb4ee6a4SAndroid Build Coastguard Worker use std::ptr;
35*bb4ee6a4SAndroid Build Coastguard Worker use std::ptr::null_mut;
36*bb4ee6a4SAndroid Build Coastguard Worker use std::result;
37*bb4ee6a4SAndroid Build Coastguard Worker use std::slice;
38*bb4ee6a4SAndroid Build Coastguard Worker use std::slice::from_raw_parts;
39*bb4ee6a4SAndroid Build Coastguard Worker use std::slice::from_raw_parts_mut;
40*bb4ee6a4SAndroid Build Coastguard Worker use std::sync::atomic::AtomicUsize;
41*bb4ee6a4SAndroid Build Coastguard Worker use std::sync::atomic::Ordering;
42*bb4ee6a4SAndroid Build Coastguard Worker use std::sync::Arc;
43*bb4ee6a4SAndroid Build Coastguard Worker 
44*bb4ee6a4SAndroid Build Coastguard Worker use base::ScmSocket;
45*bb4ee6a4SAndroid Build Coastguard Worker use kvm::dirty_log_bitmap_size;
46*bb4ee6a4SAndroid Build Coastguard Worker use kvm_sys::kvm_clock_data;
47*bb4ee6a4SAndroid Build Coastguard Worker use kvm_sys::kvm_cpuid_entry2;
48*bb4ee6a4SAndroid Build Coastguard Worker use kvm_sys::kvm_debugregs;
49*bb4ee6a4SAndroid Build Coastguard Worker use kvm_sys::kvm_fpu;
50*bb4ee6a4SAndroid Build Coastguard Worker use kvm_sys::kvm_ioapic_state;
51*bb4ee6a4SAndroid Build Coastguard Worker use kvm_sys::kvm_lapic_state;
52*bb4ee6a4SAndroid Build Coastguard Worker use kvm_sys::kvm_mp_state;
53*bb4ee6a4SAndroid Build Coastguard Worker use kvm_sys::kvm_msr_entry;
54*bb4ee6a4SAndroid Build Coastguard Worker use kvm_sys::kvm_pic_state;
55*bb4ee6a4SAndroid Build Coastguard Worker use kvm_sys::kvm_pit_state2;
56*bb4ee6a4SAndroid Build Coastguard Worker use kvm_sys::kvm_regs;
57*bb4ee6a4SAndroid Build Coastguard Worker use kvm_sys::kvm_sregs;
58*bb4ee6a4SAndroid Build Coastguard Worker use kvm_sys::kvm_vcpu_events;
59*bb4ee6a4SAndroid Build Coastguard Worker use kvm_sys::kvm_xcrs;
60*bb4ee6a4SAndroid Build Coastguard Worker use libc::E2BIG;
61*bb4ee6a4SAndroid Build Coastguard Worker use libc::EINVAL;
62*bb4ee6a4SAndroid Build Coastguard Worker use libc::ENOENT;
63*bb4ee6a4SAndroid Build Coastguard Worker use libc::ENOTCONN;
64*bb4ee6a4SAndroid Build Coastguard Worker use libc::EPROTO;
65*bb4ee6a4SAndroid Build Coastguard Worker use protobuf::Enum;
66*bb4ee6a4SAndroid Build Coastguard Worker use protobuf::Message;
67*bb4ee6a4SAndroid Build Coastguard Worker use protos::plugin::*;
68*bb4ee6a4SAndroid Build Coastguard Worker 
69*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(feature = "stats")]
70*bb4ee6a4SAndroid Build Coastguard Worker mod stats;
71*bb4ee6a4SAndroid Build Coastguard Worker 
72*bb4ee6a4SAndroid Build Coastguard Worker // Needs to be large enough to receive all the VCPU sockets.
73*bb4ee6a4SAndroid Build Coastguard Worker const MAX_DATAGRAM_FD: usize = 32;
74*bb4ee6a4SAndroid Build Coastguard Worker // Needs to be large enough for a sizable dirty log.
75*bb4ee6a4SAndroid Build Coastguard Worker const MAX_DATAGRAM_SIZE: usize = 0x40000;
76*bb4ee6a4SAndroid Build Coastguard Worker 
77*bb4ee6a4SAndroid Build Coastguard Worker const CROSVM_IRQ_ROUTE_IRQCHIP: u32 = 0;
78*bb4ee6a4SAndroid Build Coastguard Worker const CROSVM_IRQ_ROUTE_MSI: u32 = 1;
79*bb4ee6a4SAndroid Build Coastguard Worker 
80*bb4ee6a4SAndroid Build Coastguard Worker const CROSVM_VCPU_EVENT_KIND_INIT: u32 = 0;
81*bb4ee6a4SAndroid Build Coastguard Worker const CROSVM_VCPU_EVENT_KIND_IO_ACCESS: u32 = 1;
82*bb4ee6a4SAndroid Build Coastguard Worker const CROSVM_VCPU_EVENT_KIND_PAUSED: u32 = 2;
83*bb4ee6a4SAndroid Build Coastguard Worker const CROSVM_VCPU_EVENT_KIND_HYPERV_HCALL: u32 = 3;
84*bb4ee6a4SAndroid Build Coastguard Worker const CROSVM_VCPU_EVENT_KIND_HYPERV_SYNIC: u32 = 4;
85*bb4ee6a4SAndroid Build Coastguard Worker 
86*bb4ee6a4SAndroid Build Coastguard Worker pub const CROSVM_GPU_SERVER_FD_ENV: &str = "CROSVM_GPU_SERVER_FD";
87*bb4ee6a4SAndroid Build Coastguard Worker pub const CROSVM_SOCKET_ENV: &str = "CROSVM_SOCKET";
88*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(feature = "stats")]
89*bb4ee6a4SAndroid Build Coastguard Worker pub const CROSVM_STATS_ENV: &str = "CROSVM_STATS";
90*bb4ee6a4SAndroid Build Coastguard Worker 
91*bb4ee6a4SAndroid Build Coastguard Worker #[repr(C)]
92*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Copy, Clone)]
93*bb4ee6a4SAndroid Build Coastguard Worker pub struct crosvm_net_config {
94*bb4ee6a4SAndroid Build Coastguard Worker     tap_fd: c_int,
95*bb4ee6a4SAndroid Build Coastguard Worker     host_ipv4_address: u32,
96*bb4ee6a4SAndroid Build Coastguard Worker     netmask: u32,
97*bb4ee6a4SAndroid Build Coastguard Worker     host_mac_address: [u8; 6],
98*bb4ee6a4SAndroid Build Coastguard Worker     _reserved: [u8; 2],
99*bb4ee6a4SAndroid Build Coastguard Worker }
100*bb4ee6a4SAndroid Build Coastguard Worker 
101*bb4ee6a4SAndroid Build Coastguard Worker #[repr(C)]
102*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Copy, Clone)]
103*bb4ee6a4SAndroid Build Coastguard Worker pub struct anon_irqchip {
104*bb4ee6a4SAndroid Build Coastguard Worker     irqchip: u32,
105*bb4ee6a4SAndroid Build Coastguard Worker     pin: u32,
106*bb4ee6a4SAndroid Build Coastguard Worker }
107*bb4ee6a4SAndroid Build Coastguard Worker 
108*bb4ee6a4SAndroid Build Coastguard Worker #[repr(C)]
109*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Copy, Clone)]
110*bb4ee6a4SAndroid Build Coastguard Worker pub struct anon_msi {
111*bb4ee6a4SAndroid Build Coastguard Worker     address: u64,
112*bb4ee6a4SAndroid Build Coastguard Worker     data: u32,
113*bb4ee6a4SAndroid Build Coastguard Worker }
114*bb4ee6a4SAndroid Build Coastguard Worker 
115*bb4ee6a4SAndroid Build Coastguard Worker #[repr(C)]
116*bb4ee6a4SAndroid Build Coastguard Worker pub union anon_route {
117*bb4ee6a4SAndroid Build Coastguard Worker     irqchip: anon_irqchip,
118*bb4ee6a4SAndroid Build Coastguard Worker     msi: anon_msi,
119*bb4ee6a4SAndroid Build Coastguard Worker     reserved: [u8; 16],
120*bb4ee6a4SAndroid Build Coastguard Worker }
121*bb4ee6a4SAndroid Build Coastguard Worker 
122*bb4ee6a4SAndroid Build Coastguard Worker #[repr(C)]
123*bb4ee6a4SAndroid Build Coastguard Worker pub struct crosvm_irq_route {
124*bb4ee6a4SAndroid Build Coastguard Worker     irq_id: u32,
125*bb4ee6a4SAndroid Build Coastguard Worker     kind: u32,
126*bb4ee6a4SAndroid Build Coastguard Worker     route: anon_route,
127*bb4ee6a4SAndroid Build Coastguard Worker }
128*bb4ee6a4SAndroid Build Coastguard Worker 
129*bb4ee6a4SAndroid Build Coastguard Worker const CROSVM_MAX_HINT_COUNT: u32 = 1;
130*bb4ee6a4SAndroid Build Coastguard Worker const CROSVM_MAX_HINT_DETAIL_COUNT: u32 = 32;
131*bb4ee6a4SAndroid Build Coastguard Worker const CROSVM_HINT_ON_WRITE: u16 = 1;
132*bb4ee6a4SAndroid Build Coastguard Worker 
133*bb4ee6a4SAndroid Build Coastguard Worker #[repr(C)]
134*bb4ee6a4SAndroid Build Coastguard Worker pub struct crosvm_hint {
135*bb4ee6a4SAndroid Build Coastguard Worker     hint_version: u32,
136*bb4ee6a4SAndroid Build Coastguard Worker     reserved: u32,
137*bb4ee6a4SAndroid Build Coastguard Worker     address_space: u32,
138*bb4ee6a4SAndroid Build Coastguard Worker     address_flags: u16,
139*bb4ee6a4SAndroid Build Coastguard Worker     details_count: u16,
140*bb4ee6a4SAndroid Build Coastguard Worker     address: u64,
141*bb4ee6a4SAndroid Build Coastguard Worker     details: *const crosvm_hint_detail,
142*bb4ee6a4SAndroid Build Coastguard Worker }
143*bb4ee6a4SAndroid Build Coastguard Worker 
144*bb4ee6a4SAndroid Build Coastguard Worker #[repr(C)]
145*bb4ee6a4SAndroid Build Coastguard Worker pub struct crosvm_hint_detail {
146*bb4ee6a4SAndroid Build Coastguard Worker     match_rax: bool,
147*bb4ee6a4SAndroid Build Coastguard Worker     match_rbx: bool,
148*bb4ee6a4SAndroid Build Coastguard Worker     match_rcx: bool,
149*bb4ee6a4SAndroid Build Coastguard Worker     match_rdx: bool,
150*bb4ee6a4SAndroid Build Coastguard Worker     reserved1: [u8; 4],
151*bb4ee6a4SAndroid Build Coastguard Worker     rax: u64,
152*bb4ee6a4SAndroid Build Coastguard Worker     rbx: u64,
153*bb4ee6a4SAndroid Build Coastguard Worker     rcx: u64,
154*bb4ee6a4SAndroid Build Coastguard Worker     rdx: u64,
155*bb4ee6a4SAndroid Build Coastguard Worker     send_sregs: bool,
156*bb4ee6a4SAndroid Build Coastguard Worker     send_debugregs: bool,
157*bb4ee6a4SAndroid Build Coastguard Worker     reserved2: [u8; 6],
158*bb4ee6a4SAndroid Build Coastguard Worker }
159*bb4ee6a4SAndroid Build Coastguard Worker 
proto_error_to_int(e: protobuf::Error) -> c_int160*bb4ee6a4SAndroid Build Coastguard Worker fn proto_error_to_int(e: protobuf::Error) -> c_int {
161*bb4ee6a4SAndroid Build Coastguard Worker     std::io::Error::from(e).raw_os_error().unwrap_or(EINVAL)
162*bb4ee6a4SAndroid Build Coastguard Worker }
163*bb4ee6a4SAndroid Build Coastguard Worker 
fd_cast<F: FromRawFd>(f: File) -> F164*bb4ee6a4SAndroid Build Coastguard Worker fn fd_cast<F: FromRawFd>(f: File) -> F {
165*bb4ee6a4SAndroid Build Coastguard Worker     // SAFETY:
166*bb4ee6a4SAndroid Build Coastguard Worker     // Safe because we are transferring unique ownership.
167*bb4ee6a4SAndroid Build Coastguard Worker     unsafe { F::from_raw_fd(f.into_raw_fd()) }
168*bb4ee6a4SAndroid Build Coastguard Worker }
169*bb4ee6a4SAndroid Build Coastguard Worker 
170*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Default)]
171*bb4ee6a4SAndroid Build Coastguard Worker struct IdAllocator(AtomicUsize);
172*bb4ee6a4SAndroid Build Coastguard Worker 
173*bb4ee6a4SAndroid Build Coastguard Worker impl IdAllocator {
alloc(&self) -> u32174*bb4ee6a4SAndroid Build Coastguard Worker     fn alloc(&self) -> u32 {
175*bb4ee6a4SAndroid Build Coastguard Worker         self.0.fetch_add(1, Ordering::Relaxed) as u32
176*bb4ee6a4SAndroid Build Coastguard Worker     }
177*bb4ee6a4SAndroid Build Coastguard Worker 
free(&self, id: u32)178*bb4ee6a4SAndroid Build Coastguard Worker     fn free(&self, id: u32) {
179*bb4ee6a4SAndroid Build Coastguard Worker         let _ = self.0.compare_exchange(
180*bb4ee6a4SAndroid Build Coastguard Worker             id as usize + 1,
181*bb4ee6a4SAndroid Build Coastguard Worker             id as usize,
182*bb4ee6a4SAndroid Build Coastguard Worker             Ordering::Relaxed,
183*bb4ee6a4SAndroid Build Coastguard Worker             Ordering::Relaxed,
184*bb4ee6a4SAndroid Build Coastguard Worker         );
185*bb4ee6a4SAndroid Build Coastguard Worker     }
186*bb4ee6a4SAndroid Build Coastguard Worker }
187*bb4ee6a4SAndroid Build Coastguard Worker 
188*bb4ee6a4SAndroid Build Coastguard Worker #[repr(u8)]
189*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Debug, Clone, Copy)]
190*bb4ee6a4SAndroid Build Coastguard Worker pub enum Stat {
191*bb4ee6a4SAndroid Build Coastguard Worker     IoEvent,
192*bb4ee6a4SAndroid Build Coastguard Worker     MemoryGetDirtyLog,
193*bb4ee6a4SAndroid Build Coastguard Worker     IrqEventGetFd,
194*bb4ee6a4SAndroid Build Coastguard Worker     IrqEventGetResampleFd,
195*bb4ee6a4SAndroid Build Coastguard Worker     Connect,
196*bb4ee6a4SAndroid Build Coastguard Worker     DestroyConnection,
197*bb4ee6a4SAndroid Build Coastguard Worker     GetShutdownEvent,
198*bb4ee6a4SAndroid Build Coastguard Worker     CheckExtentsion,
199*bb4ee6a4SAndroid Build Coastguard Worker     EnableVmCapability,
200*bb4ee6a4SAndroid Build Coastguard Worker     EnableVcpuCapability,
201*bb4ee6a4SAndroid Build Coastguard Worker     GetSupportedCpuid,
202*bb4ee6a4SAndroid Build Coastguard Worker     GetEmulatedCpuid,
203*bb4ee6a4SAndroid Build Coastguard Worker     GetHypervCpuid,
204*bb4ee6a4SAndroid Build Coastguard Worker     GetMsrIndexList,
205*bb4ee6a4SAndroid Build Coastguard Worker     NetGetConfig,
206*bb4ee6a4SAndroid Build Coastguard Worker     ReserveRange,
207*bb4ee6a4SAndroid Build Coastguard Worker     ReserveAsyncWriteRange,
208*bb4ee6a4SAndroid Build Coastguard Worker     SetIrq,
209*bb4ee6a4SAndroid Build Coastguard Worker     SetIrqRouting,
210*bb4ee6a4SAndroid Build Coastguard Worker     GetPicState,
211*bb4ee6a4SAndroid Build Coastguard Worker     SetPicState,
212*bb4ee6a4SAndroid Build Coastguard Worker     GetIoapicState,
213*bb4ee6a4SAndroid Build Coastguard Worker     SetIoapicState,
214*bb4ee6a4SAndroid Build Coastguard Worker     GetPitState,
215*bb4ee6a4SAndroid Build Coastguard Worker     SetPitState,
216*bb4ee6a4SAndroid Build Coastguard Worker     GetClock,
217*bb4ee6a4SAndroid Build Coastguard Worker     SetClock,
218*bb4ee6a4SAndroid Build Coastguard Worker     SetIdentityMapAddr,
219*bb4ee6a4SAndroid Build Coastguard Worker     PauseVcpus,
220*bb4ee6a4SAndroid Build Coastguard Worker     Start,
221*bb4ee6a4SAndroid Build Coastguard Worker     GetVcpu,
222*bb4ee6a4SAndroid Build Coastguard Worker     VcpuWait,
223*bb4ee6a4SAndroid Build Coastguard Worker     VcpuResume,
224*bb4ee6a4SAndroid Build Coastguard Worker     VcpuGetRegs,
225*bb4ee6a4SAndroid Build Coastguard Worker     VcpuSetRegs,
226*bb4ee6a4SAndroid Build Coastguard Worker     VcpuGetSregs,
227*bb4ee6a4SAndroid Build Coastguard Worker     VcpuSetSregs,
228*bb4ee6a4SAndroid Build Coastguard Worker     GetFpu,
229*bb4ee6a4SAndroid Build Coastguard Worker     SetFpu,
230*bb4ee6a4SAndroid Build Coastguard Worker     GetDebugRegs,
231*bb4ee6a4SAndroid Build Coastguard Worker     SetDebugRegs,
232*bb4ee6a4SAndroid Build Coastguard Worker     GetXCRegs,
233*bb4ee6a4SAndroid Build Coastguard Worker     SetXCRegs,
234*bb4ee6a4SAndroid Build Coastguard Worker     VcpuGetMsrs,
235*bb4ee6a4SAndroid Build Coastguard Worker     VcpuSetMsrs,
236*bb4ee6a4SAndroid Build Coastguard Worker     VcpuSetCpuid,
237*bb4ee6a4SAndroid Build Coastguard Worker     VcpuGetLapicState,
238*bb4ee6a4SAndroid Build Coastguard Worker     VcpuSetLapicState,
239*bb4ee6a4SAndroid Build Coastguard Worker     VcpuGetMpState,
240*bb4ee6a4SAndroid Build Coastguard Worker     VcpuSetMpState,
241*bb4ee6a4SAndroid Build Coastguard Worker     VcpuGetVcpuEvents,
242*bb4ee6a4SAndroid Build Coastguard Worker     VcpuSetVcpuEvents,
243*bb4ee6a4SAndroid Build Coastguard Worker     NewConnection,
244*bb4ee6a4SAndroid Build Coastguard Worker     SetHypercallHint,
245*bb4ee6a4SAndroid Build Coastguard Worker 
246*bb4ee6a4SAndroid Build Coastguard Worker     Count,
247*bb4ee6a4SAndroid Build Coastguard Worker }
248*bb4ee6a4SAndroid Build Coastguard Worker 
249*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(feature = "stats")]
record(a: Stat) -> stats::StatUpdater250*bb4ee6a4SAndroid Build Coastguard Worker fn record(a: Stat) -> stats::StatUpdater {
251*bb4ee6a4SAndroid Build Coastguard Worker     unsafe { stats::STATS.record(a) }
252*bb4ee6a4SAndroid Build Coastguard Worker }
253*bb4ee6a4SAndroid Build Coastguard Worker 
254*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(not(feature = "stats"))]
record(_a: Stat) -> u32255*bb4ee6a4SAndroid Build Coastguard Worker fn record(_a: Stat) -> u32 {
256*bb4ee6a4SAndroid Build Coastguard Worker     0
257*bb4ee6a4SAndroid Build Coastguard Worker }
258*bb4ee6a4SAndroid Build Coastguard Worker 
259*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(feature = "stats")]
printstats()260*bb4ee6a4SAndroid Build Coastguard Worker fn printstats() {
261*bb4ee6a4SAndroid Build Coastguard Worker     // Unsafe due to racy access - OK for stats
262*bb4ee6a4SAndroid Build Coastguard Worker     if std::env::var(CROSVM_STATS_ENV).is_ok() {
263*bb4ee6a4SAndroid Build Coastguard Worker         unsafe {
264*bb4ee6a4SAndroid Build Coastguard Worker             stats::STATS.print();
265*bb4ee6a4SAndroid Build Coastguard Worker         }
266*bb4ee6a4SAndroid Build Coastguard Worker     }
267*bb4ee6a4SAndroid Build Coastguard Worker }
268*bb4ee6a4SAndroid Build Coastguard Worker 
269*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(not(feature = "stats"))]
printstats()270*bb4ee6a4SAndroid Build Coastguard Worker fn printstats() {}
271*bb4ee6a4SAndroid Build Coastguard Worker 
272*bb4ee6a4SAndroid Build Coastguard Worker pub struct crosvm {
273*bb4ee6a4SAndroid Build Coastguard Worker     id_allocator: Arc<IdAllocator>,
274*bb4ee6a4SAndroid Build Coastguard Worker     socket: ScmSocket<UnixDatagram>,
275*bb4ee6a4SAndroid Build Coastguard Worker     request_buffer: Vec<u8>,
276*bb4ee6a4SAndroid Build Coastguard Worker     response_buffer: Vec<u8>,
277*bb4ee6a4SAndroid Build Coastguard Worker     vcpus: Arc<[crosvm_vcpu]>,
278*bb4ee6a4SAndroid Build Coastguard Worker }
279*bb4ee6a4SAndroid Build Coastguard Worker 
280*bb4ee6a4SAndroid Build Coastguard Worker impl crosvm {
from_connection(socket: UnixDatagram) -> result::Result<crosvm, c_int>281*bb4ee6a4SAndroid Build Coastguard Worker     fn from_connection(socket: UnixDatagram) -> result::Result<crosvm, c_int> {
282*bb4ee6a4SAndroid Build Coastguard Worker         let mut crosvm = crosvm {
283*bb4ee6a4SAndroid Build Coastguard Worker             id_allocator: Default::default(),
284*bb4ee6a4SAndroid Build Coastguard Worker             socket: socket.try_into().map_err(|_| -1)?,
285*bb4ee6a4SAndroid Build Coastguard Worker             request_buffer: Vec::new(),
286*bb4ee6a4SAndroid Build Coastguard Worker             response_buffer: vec![0; MAX_DATAGRAM_SIZE],
287*bb4ee6a4SAndroid Build Coastguard Worker             vcpus: Arc::new([]),
288*bb4ee6a4SAndroid Build Coastguard Worker         };
289*bb4ee6a4SAndroid Build Coastguard Worker         crosvm.load_all_vcpus()?;
290*bb4ee6a4SAndroid Build Coastguard Worker         Ok(crosvm)
291*bb4ee6a4SAndroid Build Coastguard Worker     }
292*bb4ee6a4SAndroid Build Coastguard Worker 
new( id_allocator: Arc<IdAllocator>, socket: UnixDatagram, vcpus: Arc<[crosvm_vcpu]>, ) -> crosvm293*bb4ee6a4SAndroid Build Coastguard Worker     fn new(
294*bb4ee6a4SAndroid Build Coastguard Worker         id_allocator: Arc<IdAllocator>,
295*bb4ee6a4SAndroid Build Coastguard Worker         socket: UnixDatagram,
296*bb4ee6a4SAndroid Build Coastguard Worker         vcpus: Arc<[crosvm_vcpu]>,
297*bb4ee6a4SAndroid Build Coastguard Worker     ) -> crosvm {
298*bb4ee6a4SAndroid Build Coastguard Worker         crosvm {
299*bb4ee6a4SAndroid Build Coastguard Worker             id_allocator,
300*bb4ee6a4SAndroid Build Coastguard Worker             socket: socket.try_into().unwrap(),
301*bb4ee6a4SAndroid Build Coastguard Worker             request_buffer: Vec::new(),
302*bb4ee6a4SAndroid Build Coastguard Worker             response_buffer: vec![0; MAX_DATAGRAM_SIZE],
303*bb4ee6a4SAndroid Build Coastguard Worker             vcpus,
304*bb4ee6a4SAndroid Build Coastguard Worker         }
305*bb4ee6a4SAndroid Build Coastguard Worker     }
306*bb4ee6a4SAndroid Build Coastguard Worker 
get_id_allocator(&self) -> &IdAllocator307*bb4ee6a4SAndroid Build Coastguard Worker     fn get_id_allocator(&self) -> &IdAllocator {
308*bb4ee6a4SAndroid Build Coastguard Worker         &self.id_allocator
309*bb4ee6a4SAndroid Build Coastguard Worker     }
310*bb4ee6a4SAndroid Build Coastguard Worker 
main_transaction( &mut self, request: &MainRequest, fds: &[RawFd], ) -> result::Result<(MainResponse, Vec<File>), c_int>311*bb4ee6a4SAndroid Build Coastguard Worker     fn main_transaction(
312*bb4ee6a4SAndroid Build Coastguard Worker         &mut self,
313*bb4ee6a4SAndroid Build Coastguard Worker         request: &MainRequest,
314*bb4ee6a4SAndroid Build Coastguard Worker         fds: &[RawFd],
315*bb4ee6a4SAndroid Build Coastguard Worker     ) -> result::Result<(MainResponse, Vec<File>), c_int> {
316*bb4ee6a4SAndroid Build Coastguard Worker         self.request_buffer.clear();
317*bb4ee6a4SAndroid Build Coastguard Worker         request
318*bb4ee6a4SAndroid Build Coastguard Worker             .write_to_vec(&mut self.request_buffer)
319*bb4ee6a4SAndroid Build Coastguard Worker             .map_err(proto_error_to_int)?;
320*bb4ee6a4SAndroid Build Coastguard Worker         self.socket
321*bb4ee6a4SAndroid Build Coastguard Worker             .send_with_fds(&self.request_buffer, fds)
322*bb4ee6a4SAndroid Build Coastguard Worker             // raw_os_error is expected to be `Some` because it is constructed via
323*bb4ee6a4SAndroid Build Coastguard Worker             // `std::io::Error::last_os_error()`.
324*bb4ee6a4SAndroid Build Coastguard Worker             .map_err(|e| -e.raw_os_error().unwrap_or(EINVAL))?;
325*bb4ee6a4SAndroid Build Coastguard Worker 
326*bb4ee6a4SAndroid Build Coastguard Worker         let (msg_size, datagram_descriptors) = self
327*bb4ee6a4SAndroid Build Coastguard Worker             .socket
328*bb4ee6a4SAndroid Build Coastguard Worker             .recv_with_fds(
329*bb4ee6a4SAndroid Build Coastguard Worker                 &mut self.response_buffer,
330*bb4ee6a4SAndroid Build Coastguard Worker                 MAX_DATAGRAM_FD,
331*bb4ee6a4SAndroid Build Coastguard Worker             )
332*bb4ee6a4SAndroid Build Coastguard Worker             // raw_os_error is expected to be `Some` because it is constructed via
333*bb4ee6a4SAndroid Build Coastguard Worker             // `std::io::Error::last_os_error()`.
334*bb4ee6a4SAndroid Build Coastguard Worker             .map_err(|e| -e.raw_os_error().unwrap_or(EINVAL))?;
335*bb4ee6a4SAndroid Build Coastguard Worker 
336*bb4ee6a4SAndroid Build Coastguard Worker         let datagram_files = datagram_descriptors.into_iter().map(File::from).collect();
337*bb4ee6a4SAndroid Build Coastguard Worker 
338*bb4ee6a4SAndroid Build Coastguard Worker         let response: MainResponse = Message::parse_from_bytes(&self.response_buffer[..msg_size])
339*bb4ee6a4SAndroid Build Coastguard Worker             .map_err(proto_error_to_int)?;
340*bb4ee6a4SAndroid Build Coastguard Worker         if response.errno != 0 {
341*bb4ee6a4SAndroid Build Coastguard Worker             return Err(response.errno);
342*bb4ee6a4SAndroid Build Coastguard Worker         }
343*bb4ee6a4SAndroid Build Coastguard Worker         Ok((response, datagram_files))
344*bb4ee6a4SAndroid Build Coastguard Worker     }
345*bb4ee6a4SAndroid Build Coastguard Worker 
try_clone(&mut self) -> result::Result<crosvm, c_int>346*bb4ee6a4SAndroid Build Coastguard Worker     fn try_clone(&mut self) -> result::Result<crosvm, c_int> {
347*bb4ee6a4SAndroid Build Coastguard Worker         let mut r = MainRequest::new();
348*bb4ee6a4SAndroid Build Coastguard Worker         r.mut_new_connection();
349*bb4ee6a4SAndroid Build Coastguard Worker         let mut files = self.main_transaction(&r, &[])?.1;
350*bb4ee6a4SAndroid Build Coastguard Worker         match files.pop() {
351*bb4ee6a4SAndroid Build Coastguard Worker             Some(new_socket) => Ok(crosvm::new(
352*bb4ee6a4SAndroid Build Coastguard Worker                 self.id_allocator.clone(),
353*bb4ee6a4SAndroid Build Coastguard Worker                 fd_cast(new_socket),
354*bb4ee6a4SAndroid Build Coastguard Worker                 self.vcpus.clone(),
355*bb4ee6a4SAndroid Build Coastguard Worker             )),
356*bb4ee6a4SAndroid Build Coastguard Worker             None => Err(EPROTO),
357*bb4ee6a4SAndroid Build Coastguard Worker         }
358*bb4ee6a4SAndroid Build Coastguard Worker     }
359*bb4ee6a4SAndroid Build Coastguard Worker 
destroy(&mut self, id: u32) -> result::Result<(), c_int>360*bb4ee6a4SAndroid Build Coastguard Worker     fn destroy(&mut self, id: u32) -> result::Result<(), c_int> {
361*bb4ee6a4SAndroid Build Coastguard Worker         let mut r = MainRequest::new();
362*bb4ee6a4SAndroid Build Coastguard Worker         r.mut_destroy().id = id;
363*bb4ee6a4SAndroid Build Coastguard Worker         self.main_transaction(&r, &[])?;
364*bb4ee6a4SAndroid Build Coastguard Worker         self.get_id_allocator().free(id);
365*bb4ee6a4SAndroid Build Coastguard Worker         printstats();
366*bb4ee6a4SAndroid Build Coastguard Worker         Ok(())
367*bb4ee6a4SAndroid Build Coastguard Worker     }
368*bb4ee6a4SAndroid Build Coastguard Worker 
369*bb4ee6a4SAndroid Build Coastguard Worker     // Only call this at `from_connection` function.
load_all_vcpus(&mut self) -> result::Result<(), c_int>370*bb4ee6a4SAndroid Build Coastguard Worker     fn load_all_vcpus(&mut self) -> result::Result<(), c_int> {
371*bb4ee6a4SAndroid Build Coastguard Worker         let mut r = MainRequest::new();
372*bb4ee6a4SAndroid Build Coastguard Worker         r.mut_get_vcpus();
373*bb4ee6a4SAndroid Build Coastguard Worker         let (_, mut files) = self.main_transaction(&r, &[])?;
374*bb4ee6a4SAndroid Build Coastguard Worker         if files.is_empty() || files.len() % 2 != 0 {
375*bb4ee6a4SAndroid Build Coastguard Worker             return Err(EPROTO);
376*bb4ee6a4SAndroid Build Coastguard Worker         }
377*bb4ee6a4SAndroid Build Coastguard Worker 
378*bb4ee6a4SAndroid Build Coastguard Worker         let mut vcpus = Vec::with_capacity(files.len() / 2);
379*bb4ee6a4SAndroid Build Coastguard Worker         while files.len() > 1 {
380*bb4ee6a4SAndroid Build Coastguard Worker             let write_pipe = files.remove(0);
381*bb4ee6a4SAndroid Build Coastguard Worker             let read_pipe = files.remove(0);
382*bb4ee6a4SAndroid Build Coastguard Worker             vcpus.push(crosvm_vcpu::new(fd_cast(read_pipe), fd_cast(write_pipe)));
383*bb4ee6a4SAndroid Build Coastguard Worker         }
384*bb4ee6a4SAndroid Build Coastguard Worker         self.vcpus = Arc::from(vcpus);
385*bb4ee6a4SAndroid Build Coastguard Worker         Ok(())
386*bb4ee6a4SAndroid Build Coastguard Worker     }
387*bb4ee6a4SAndroid Build Coastguard Worker 
get_shutdown_event(&mut self) -> result::Result<File, c_int>388*bb4ee6a4SAndroid Build Coastguard Worker     fn get_shutdown_event(&mut self) -> result::Result<File, c_int> {
389*bb4ee6a4SAndroid Build Coastguard Worker         let mut r = MainRequest::new();
390*bb4ee6a4SAndroid Build Coastguard Worker         r.mut_get_shutdown_eventfd();
391*bb4ee6a4SAndroid Build Coastguard Worker         let (_, mut files) = self.main_transaction(&r, &[])?;
392*bb4ee6a4SAndroid Build Coastguard Worker         match files.pop() {
393*bb4ee6a4SAndroid Build Coastguard Worker             Some(f) => Ok(f),
394*bb4ee6a4SAndroid Build Coastguard Worker             None => Err(EPROTO),
395*bb4ee6a4SAndroid Build Coastguard Worker         }
396*bb4ee6a4SAndroid Build Coastguard Worker     }
397*bb4ee6a4SAndroid Build Coastguard Worker 
check_extension(&mut self, extension: u32) -> result::Result<bool, c_int>398*bb4ee6a4SAndroid Build Coastguard Worker     fn check_extension(&mut self, extension: u32) -> result::Result<bool, c_int> {
399*bb4ee6a4SAndroid Build Coastguard Worker         let mut r = MainRequest::new();
400*bb4ee6a4SAndroid Build Coastguard Worker         r.mut_check_extension().extension = extension;
401*bb4ee6a4SAndroid Build Coastguard Worker         let (response, _) = self.main_transaction(&r, &[])?;
402*bb4ee6a4SAndroid Build Coastguard Worker         if !response.has_check_extension() {
403*bb4ee6a4SAndroid Build Coastguard Worker             return Err(EPROTO);
404*bb4ee6a4SAndroid Build Coastguard Worker         }
405*bb4ee6a4SAndroid Build Coastguard Worker         Ok(response.check_extension().has_extension)
406*bb4ee6a4SAndroid Build Coastguard Worker     }
407*bb4ee6a4SAndroid Build Coastguard Worker 
get_supported_cpuid( &mut self, cpuid_entries: &mut [kvm_cpuid_entry2], cpuid_count: &mut usize, ) -> result::Result<(), c_int>408*bb4ee6a4SAndroid Build Coastguard Worker     fn get_supported_cpuid(
409*bb4ee6a4SAndroid Build Coastguard Worker         &mut self,
410*bb4ee6a4SAndroid Build Coastguard Worker         cpuid_entries: &mut [kvm_cpuid_entry2],
411*bb4ee6a4SAndroid Build Coastguard Worker         cpuid_count: &mut usize,
412*bb4ee6a4SAndroid Build Coastguard Worker     ) -> result::Result<(), c_int> {
413*bb4ee6a4SAndroid Build Coastguard Worker         *cpuid_count = 0;
414*bb4ee6a4SAndroid Build Coastguard Worker 
415*bb4ee6a4SAndroid Build Coastguard Worker         let mut r = MainRequest::new();
416*bb4ee6a4SAndroid Build Coastguard Worker         r.mut_get_supported_cpuid();
417*bb4ee6a4SAndroid Build Coastguard Worker 
418*bb4ee6a4SAndroid Build Coastguard Worker         let (response, _) = self.main_transaction(&r, &[])?;
419*bb4ee6a4SAndroid Build Coastguard Worker         if !response.has_get_supported_cpuid() {
420*bb4ee6a4SAndroid Build Coastguard Worker             return Err(EPROTO);
421*bb4ee6a4SAndroid Build Coastguard Worker         }
422*bb4ee6a4SAndroid Build Coastguard Worker 
423*bb4ee6a4SAndroid Build Coastguard Worker         let supported_cpuids = response.get_supported_cpuid();
424*bb4ee6a4SAndroid Build Coastguard Worker 
425*bb4ee6a4SAndroid Build Coastguard Worker         *cpuid_count = supported_cpuids.entries.len();
426*bb4ee6a4SAndroid Build Coastguard Worker         if *cpuid_count > cpuid_entries.len() {
427*bb4ee6a4SAndroid Build Coastguard Worker             return Err(E2BIG);
428*bb4ee6a4SAndroid Build Coastguard Worker         }
429*bb4ee6a4SAndroid Build Coastguard Worker 
430*bb4ee6a4SAndroid Build Coastguard Worker         for (proto_entry, kvm_entry) in supported_cpuids
431*bb4ee6a4SAndroid Build Coastguard Worker             .entries
432*bb4ee6a4SAndroid Build Coastguard Worker             .iter()
433*bb4ee6a4SAndroid Build Coastguard Worker             .zip(cpuid_entries.iter_mut())
434*bb4ee6a4SAndroid Build Coastguard Worker         {
435*bb4ee6a4SAndroid Build Coastguard Worker             *kvm_entry = cpuid_proto_to_kvm(proto_entry);
436*bb4ee6a4SAndroid Build Coastguard Worker         }
437*bb4ee6a4SAndroid Build Coastguard Worker 
438*bb4ee6a4SAndroid Build Coastguard Worker         Ok(())
439*bb4ee6a4SAndroid Build Coastguard Worker     }
440*bb4ee6a4SAndroid Build Coastguard Worker 
get_emulated_cpuid( &mut self, cpuid_entries: &mut [kvm_cpuid_entry2], cpuid_count: &mut usize, ) -> result::Result<(), c_int>441*bb4ee6a4SAndroid Build Coastguard Worker     fn get_emulated_cpuid(
442*bb4ee6a4SAndroid Build Coastguard Worker         &mut self,
443*bb4ee6a4SAndroid Build Coastguard Worker         cpuid_entries: &mut [kvm_cpuid_entry2],
444*bb4ee6a4SAndroid Build Coastguard Worker         cpuid_count: &mut usize,
445*bb4ee6a4SAndroid Build Coastguard Worker     ) -> result::Result<(), c_int> {
446*bb4ee6a4SAndroid Build Coastguard Worker         *cpuid_count = 0;
447*bb4ee6a4SAndroid Build Coastguard Worker 
448*bb4ee6a4SAndroid Build Coastguard Worker         let mut r = MainRequest::new();
449*bb4ee6a4SAndroid Build Coastguard Worker         r.mut_get_emulated_cpuid();
450*bb4ee6a4SAndroid Build Coastguard Worker 
451*bb4ee6a4SAndroid Build Coastguard Worker         let (response, _) = self.main_transaction(&r, &[])?;
452*bb4ee6a4SAndroid Build Coastguard Worker         if !response.has_get_emulated_cpuid() {
453*bb4ee6a4SAndroid Build Coastguard Worker             return Err(EPROTO);
454*bb4ee6a4SAndroid Build Coastguard Worker         }
455*bb4ee6a4SAndroid Build Coastguard Worker 
456*bb4ee6a4SAndroid Build Coastguard Worker         let emulated_cpuids = response.get_emulated_cpuid();
457*bb4ee6a4SAndroid Build Coastguard Worker 
458*bb4ee6a4SAndroid Build Coastguard Worker         *cpuid_count = emulated_cpuids.entries.len();
459*bb4ee6a4SAndroid Build Coastguard Worker         if *cpuid_count > cpuid_entries.len() {
460*bb4ee6a4SAndroid Build Coastguard Worker             return Err(E2BIG);
461*bb4ee6a4SAndroid Build Coastguard Worker         }
462*bb4ee6a4SAndroid Build Coastguard Worker 
463*bb4ee6a4SAndroid Build Coastguard Worker         for (proto_entry, kvm_entry) in emulated_cpuids.entries.iter().zip(cpuid_entries.iter_mut())
464*bb4ee6a4SAndroid Build Coastguard Worker         {
465*bb4ee6a4SAndroid Build Coastguard Worker             *kvm_entry = cpuid_proto_to_kvm(proto_entry);
466*bb4ee6a4SAndroid Build Coastguard Worker         }
467*bb4ee6a4SAndroid Build Coastguard Worker 
468*bb4ee6a4SAndroid Build Coastguard Worker         Ok(())
469*bb4ee6a4SAndroid Build Coastguard Worker     }
470*bb4ee6a4SAndroid Build Coastguard Worker 
get_msr_index_list( &mut self, msr_indices: &mut [u32], msr_count: &mut usize, ) -> result::Result<(), c_int>471*bb4ee6a4SAndroid Build Coastguard Worker     fn get_msr_index_list(
472*bb4ee6a4SAndroid Build Coastguard Worker         &mut self,
473*bb4ee6a4SAndroid Build Coastguard Worker         msr_indices: &mut [u32],
474*bb4ee6a4SAndroid Build Coastguard Worker         msr_count: &mut usize,
475*bb4ee6a4SAndroid Build Coastguard Worker     ) -> result::Result<(), c_int> {
476*bb4ee6a4SAndroid Build Coastguard Worker         *msr_count = 0;
477*bb4ee6a4SAndroid Build Coastguard Worker 
478*bb4ee6a4SAndroid Build Coastguard Worker         let mut r = MainRequest::new();
479*bb4ee6a4SAndroid Build Coastguard Worker         r.mut_get_msr_index_list();
480*bb4ee6a4SAndroid Build Coastguard Worker 
481*bb4ee6a4SAndroid Build Coastguard Worker         let (response, _) = self.main_transaction(&r, &[])?;
482*bb4ee6a4SAndroid Build Coastguard Worker         if !response.has_get_msr_index_list() {
483*bb4ee6a4SAndroid Build Coastguard Worker             return Err(EPROTO);
484*bb4ee6a4SAndroid Build Coastguard Worker         }
485*bb4ee6a4SAndroid Build Coastguard Worker 
486*bb4ee6a4SAndroid Build Coastguard Worker         let msr_list = response.get_msr_index_list();
487*bb4ee6a4SAndroid Build Coastguard Worker 
488*bb4ee6a4SAndroid Build Coastguard Worker         *msr_count = msr_list.indices.len();
489*bb4ee6a4SAndroid Build Coastguard Worker         if *msr_count > msr_indices.len() {
490*bb4ee6a4SAndroid Build Coastguard Worker             return Err(E2BIG);
491*bb4ee6a4SAndroid Build Coastguard Worker         }
492*bb4ee6a4SAndroid Build Coastguard Worker 
493*bb4ee6a4SAndroid Build Coastguard Worker         for (proto_entry, kvm_entry) in msr_list.indices.iter().zip(msr_indices.iter_mut()) {
494*bb4ee6a4SAndroid Build Coastguard Worker             *kvm_entry = *proto_entry;
495*bb4ee6a4SAndroid Build Coastguard Worker         }
496*bb4ee6a4SAndroid Build Coastguard Worker 
497*bb4ee6a4SAndroid Build Coastguard Worker         Ok(())
498*bb4ee6a4SAndroid Build Coastguard Worker     }
499*bb4ee6a4SAndroid Build Coastguard Worker 
reserve_range( &mut self, space: u32, start: u64, length: u64, async_write: bool, ) -> result::Result<(), c_int>500*bb4ee6a4SAndroid Build Coastguard Worker     fn reserve_range(
501*bb4ee6a4SAndroid Build Coastguard Worker         &mut self,
502*bb4ee6a4SAndroid Build Coastguard Worker         space: u32,
503*bb4ee6a4SAndroid Build Coastguard Worker         start: u64,
504*bb4ee6a4SAndroid Build Coastguard Worker         length: u64,
505*bb4ee6a4SAndroid Build Coastguard Worker         async_write: bool,
506*bb4ee6a4SAndroid Build Coastguard Worker     ) -> result::Result<(), c_int> {
507*bb4ee6a4SAndroid Build Coastguard Worker         let mut r = MainRequest::new();
508*bb4ee6a4SAndroid Build Coastguard Worker         let reserve = r.mut_reserve_range();
509*bb4ee6a4SAndroid Build Coastguard Worker         reserve.space = AddressSpace::from_i32(space as i32).ok_or(EINVAL)?.into();
510*bb4ee6a4SAndroid Build Coastguard Worker         reserve.start = start;
511*bb4ee6a4SAndroid Build Coastguard Worker         reserve.length = length;
512*bb4ee6a4SAndroid Build Coastguard Worker         reserve.async_write = async_write;
513*bb4ee6a4SAndroid Build Coastguard Worker 
514*bb4ee6a4SAndroid Build Coastguard Worker         self.main_transaction(&r, &[])?;
515*bb4ee6a4SAndroid Build Coastguard Worker         Ok(())
516*bb4ee6a4SAndroid Build Coastguard Worker     }
517*bb4ee6a4SAndroid Build Coastguard Worker 
set_irq(&mut self, irq_id: u32, active: bool) -> result::Result<(), c_int>518*bb4ee6a4SAndroid Build Coastguard Worker     fn set_irq(&mut self, irq_id: u32, active: bool) -> result::Result<(), c_int> {
519*bb4ee6a4SAndroid Build Coastguard Worker         let mut r = MainRequest::new();
520*bb4ee6a4SAndroid Build Coastguard Worker         let set_irq = r.mut_set_irq();
521*bb4ee6a4SAndroid Build Coastguard Worker         set_irq.irq_id = irq_id;
522*bb4ee6a4SAndroid Build Coastguard Worker         set_irq.active = active;
523*bb4ee6a4SAndroid Build Coastguard Worker 
524*bb4ee6a4SAndroid Build Coastguard Worker         self.main_transaction(&r, &[])?;
525*bb4ee6a4SAndroid Build Coastguard Worker         Ok(())
526*bb4ee6a4SAndroid Build Coastguard Worker     }
527*bb4ee6a4SAndroid Build Coastguard Worker 
set_irq_routing(&mut self, routing: &[crosvm_irq_route]) -> result::Result<(), c_int>528*bb4ee6a4SAndroid Build Coastguard Worker     fn set_irq_routing(&mut self, routing: &[crosvm_irq_route]) -> result::Result<(), c_int> {
529*bb4ee6a4SAndroid Build Coastguard Worker         let mut r = MainRequest::new();
530*bb4ee6a4SAndroid Build Coastguard Worker         let set_irq_routing = &mut r.mut_set_irq_routing().routes;
531*bb4ee6a4SAndroid Build Coastguard Worker         for route in routing {
532*bb4ee6a4SAndroid Build Coastguard Worker             let mut entry = main_request::set_irq_routing::Route::new();
533*bb4ee6a4SAndroid Build Coastguard Worker             entry.irq_id = route.irq_id;
534*bb4ee6a4SAndroid Build Coastguard Worker             match route.kind {
535*bb4ee6a4SAndroid Build Coastguard Worker                 CROSVM_IRQ_ROUTE_IRQCHIP => {
536*bb4ee6a4SAndroid Build Coastguard Worker                     let irqchip = entry.mut_irqchip();
537*bb4ee6a4SAndroid Build Coastguard Worker                     // SAFETY:
538*bb4ee6a4SAndroid Build Coastguard Worker                     // Safe because route.kind indicates which union field is valid.
539*bb4ee6a4SAndroid Build Coastguard Worker                     irqchip.irqchip = unsafe { route.route.irqchip }.irqchip;
540*bb4ee6a4SAndroid Build Coastguard Worker                     // SAFETY:
541*bb4ee6a4SAndroid Build Coastguard Worker                     // Safe because route.kind indicates which union field is valid.
542*bb4ee6a4SAndroid Build Coastguard Worker                     irqchip.pin = unsafe { route.route.irqchip }.pin;
543*bb4ee6a4SAndroid Build Coastguard Worker                 }
544*bb4ee6a4SAndroid Build Coastguard Worker                 CROSVM_IRQ_ROUTE_MSI => {
545*bb4ee6a4SAndroid Build Coastguard Worker                     let msi = entry.mut_msi();
546*bb4ee6a4SAndroid Build Coastguard Worker                     // SAFETY:
547*bb4ee6a4SAndroid Build Coastguard Worker                     // Safe because route.kind indicates which union field is valid.
548*bb4ee6a4SAndroid Build Coastguard Worker                     msi.address = unsafe { route.route.msi }.address;
549*bb4ee6a4SAndroid Build Coastguard Worker                     // SAFETY:
550*bb4ee6a4SAndroid Build Coastguard Worker                     // Safe because route.kind indicates which union field is valid.
551*bb4ee6a4SAndroid Build Coastguard Worker                     msi.data = unsafe { route.route.msi }.data;
552*bb4ee6a4SAndroid Build Coastguard Worker                 }
553*bb4ee6a4SAndroid Build Coastguard Worker                 _ => return Err(EINVAL),
554*bb4ee6a4SAndroid Build Coastguard Worker             }
555*bb4ee6a4SAndroid Build Coastguard Worker             set_irq_routing.push(entry);
556*bb4ee6a4SAndroid Build Coastguard Worker         }
557*bb4ee6a4SAndroid Build Coastguard Worker 
558*bb4ee6a4SAndroid Build Coastguard Worker         self.main_transaction(&r, &[])?;
559*bb4ee6a4SAndroid Build Coastguard Worker         Ok(())
560*bb4ee6a4SAndroid Build Coastguard Worker     }
561*bb4ee6a4SAndroid Build Coastguard Worker 
set_hint( &mut self, space: u32, addr: u64, on_write: bool, hints: &[crosvm_hint_detail], ) -> result::Result<(), c_int>562*bb4ee6a4SAndroid Build Coastguard Worker     fn set_hint(
563*bb4ee6a4SAndroid Build Coastguard Worker         &mut self,
564*bb4ee6a4SAndroid Build Coastguard Worker         space: u32,
565*bb4ee6a4SAndroid Build Coastguard Worker         addr: u64,
566*bb4ee6a4SAndroid Build Coastguard Worker         on_write: bool,
567*bb4ee6a4SAndroid Build Coastguard Worker         hints: &[crosvm_hint_detail],
568*bb4ee6a4SAndroid Build Coastguard Worker     ) -> result::Result<(), c_int> {
569*bb4ee6a4SAndroid Build Coastguard Worker         let mut r = MainRequest::new();
570*bb4ee6a4SAndroid Build Coastguard Worker         let req = r.mut_set_call_hint();
571*bb4ee6a4SAndroid Build Coastguard Worker         let set_hints = &mut req.hints;
572*bb4ee6a4SAndroid Build Coastguard Worker         for hint in hints {
573*bb4ee6a4SAndroid Build Coastguard Worker             let mut entry = main_request::set_call_hint::RegHint::new();
574*bb4ee6a4SAndroid Build Coastguard Worker             entry.match_rax = hint.match_rax;
575*bb4ee6a4SAndroid Build Coastguard Worker             entry.match_rbx = hint.match_rbx;
576*bb4ee6a4SAndroid Build Coastguard Worker             entry.match_rcx = hint.match_rcx;
577*bb4ee6a4SAndroid Build Coastguard Worker             entry.match_rdx = hint.match_rdx;
578*bb4ee6a4SAndroid Build Coastguard Worker             entry.rax = hint.rax;
579*bb4ee6a4SAndroid Build Coastguard Worker             entry.rbx = hint.rbx;
580*bb4ee6a4SAndroid Build Coastguard Worker             entry.rcx = hint.rcx;
581*bb4ee6a4SAndroid Build Coastguard Worker             entry.rdx = hint.rdx;
582*bb4ee6a4SAndroid Build Coastguard Worker             entry.send_sregs = hint.send_sregs;
583*bb4ee6a4SAndroid Build Coastguard Worker             entry.send_debugregs = hint.send_debugregs;
584*bb4ee6a4SAndroid Build Coastguard Worker             set_hints.push(entry);
585*bb4ee6a4SAndroid Build Coastguard Worker         }
586*bb4ee6a4SAndroid Build Coastguard Worker         req.space = AddressSpace::from_i32(space as i32).ok_or(EINVAL)?.into();
587*bb4ee6a4SAndroid Build Coastguard Worker         req.address = addr;
588*bb4ee6a4SAndroid Build Coastguard Worker         req.on_write = on_write;
589*bb4ee6a4SAndroid Build Coastguard Worker 
590*bb4ee6a4SAndroid Build Coastguard Worker         self.main_transaction(&r, &[])?;
591*bb4ee6a4SAndroid Build Coastguard Worker         Ok(())
592*bb4ee6a4SAndroid Build Coastguard Worker     }
593*bb4ee6a4SAndroid Build Coastguard Worker 
get_state( &mut self, state_set: main_request::StateSet, out: &mut [u8], ) -> result::Result<(), c_int>594*bb4ee6a4SAndroid Build Coastguard Worker     fn get_state(
595*bb4ee6a4SAndroid Build Coastguard Worker         &mut self,
596*bb4ee6a4SAndroid Build Coastguard Worker         state_set: main_request::StateSet,
597*bb4ee6a4SAndroid Build Coastguard Worker         out: &mut [u8],
598*bb4ee6a4SAndroid Build Coastguard Worker     ) -> result::Result<(), c_int> {
599*bb4ee6a4SAndroid Build Coastguard Worker         let mut r = MainRequest::new();
600*bb4ee6a4SAndroid Build Coastguard Worker         r.mut_get_state().set = state_set.into();
601*bb4ee6a4SAndroid Build Coastguard Worker         let (response, _) = self.main_transaction(&r, &[])?;
602*bb4ee6a4SAndroid Build Coastguard Worker         if !response.has_get_state() {
603*bb4ee6a4SAndroid Build Coastguard Worker             return Err(EPROTO);
604*bb4ee6a4SAndroid Build Coastguard Worker         }
605*bb4ee6a4SAndroid Build Coastguard Worker         let get_state = response.get_state();
606*bb4ee6a4SAndroid Build Coastguard Worker         if get_state.state.len() != out.len() {
607*bb4ee6a4SAndroid Build Coastguard Worker             return Err(EPROTO);
608*bb4ee6a4SAndroid Build Coastguard Worker         }
609*bb4ee6a4SAndroid Build Coastguard Worker         out.copy_from_slice(&get_state.state);
610*bb4ee6a4SAndroid Build Coastguard Worker         Ok(())
611*bb4ee6a4SAndroid Build Coastguard Worker     }
612*bb4ee6a4SAndroid Build Coastguard Worker 
set_state( &mut self, state_set: main_request::StateSet, new_state: &[u8], ) -> result::Result<(), c_int>613*bb4ee6a4SAndroid Build Coastguard Worker     fn set_state(
614*bb4ee6a4SAndroid Build Coastguard Worker         &mut self,
615*bb4ee6a4SAndroid Build Coastguard Worker         state_set: main_request::StateSet,
616*bb4ee6a4SAndroid Build Coastguard Worker         new_state: &[u8],
617*bb4ee6a4SAndroid Build Coastguard Worker     ) -> result::Result<(), c_int> {
618*bb4ee6a4SAndroid Build Coastguard Worker         let mut r = MainRequest::new();
619*bb4ee6a4SAndroid Build Coastguard Worker         let set_state = r.mut_set_state();
620*bb4ee6a4SAndroid Build Coastguard Worker         set_state.set = state_set.into();
621*bb4ee6a4SAndroid Build Coastguard Worker         set_state.state = new_state.to_vec();
622*bb4ee6a4SAndroid Build Coastguard Worker 
623*bb4ee6a4SAndroid Build Coastguard Worker         self.main_transaction(&r, &[])?;
624*bb4ee6a4SAndroid Build Coastguard Worker         Ok(())
625*bb4ee6a4SAndroid Build Coastguard Worker     }
626*bb4ee6a4SAndroid Build Coastguard Worker 
set_identity_map_addr(&mut self, addr: u32) -> result::Result<(), c_int>627*bb4ee6a4SAndroid Build Coastguard Worker     fn set_identity_map_addr(&mut self, addr: u32) -> result::Result<(), c_int> {
628*bb4ee6a4SAndroid Build Coastguard Worker         let mut r = MainRequest::new();
629*bb4ee6a4SAndroid Build Coastguard Worker         r.mut_set_identity_map_addr().address = addr;
630*bb4ee6a4SAndroid Build Coastguard Worker 
631*bb4ee6a4SAndroid Build Coastguard Worker         self.main_transaction(&r, &[])?;
632*bb4ee6a4SAndroid Build Coastguard Worker         Ok(())
633*bb4ee6a4SAndroid Build Coastguard Worker     }
634*bb4ee6a4SAndroid Build Coastguard Worker 
pause_vcpus(&mut self, cpu_mask: u64, user: *mut c_void) -> result::Result<(), c_int>635*bb4ee6a4SAndroid Build Coastguard Worker     fn pause_vcpus(&mut self, cpu_mask: u64, user: *mut c_void) -> result::Result<(), c_int> {
636*bb4ee6a4SAndroid Build Coastguard Worker         let mut r = MainRequest::new();
637*bb4ee6a4SAndroid Build Coastguard Worker         let pause_vcpus = r.mut_pause_vcpus();
638*bb4ee6a4SAndroid Build Coastguard Worker         pause_vcpus.cpu_mask = cpu_mask;
639*bb4ee6a4SAndroid Build Coastguard Worker         pause_vcpus.user = user as u64;
640*bb4ee6a4SAndroid Build Coastguard Worker         self.main_transaction(&r, &[])?;
641*bb4ee6a4SAndroid Build Coastguard Worker         Ok(())
642*bb4ee6a4SAndroid Build Coastguard Worker     }
643*bb4ee6a4SAndroid Build Coastguard Worker 
start(&mut self) -> result::Result<(), c_int>644*bb4ee6a4SAndroid Build Coastguard Worker     fn start(&mut self) -> result::Result<(), c_int> {
645*bb4ee6a4SAndroid Build Coastguard Worker         let mut r = MainRequest::new();
646*bb4ee6a4SAndroid Build Coastguard Worker         r.mut_start();
647*bb4ee6a4SAndroid Build Coastguard Worker         self.main_transaction(&r, &[])?;
648*bb4ee6a4SAndroid Build Coastguard Worker         Ok(())
649*bb4ee6a4SAndroid Build Coastguard Worker     }
650*bb4ee6a4SAndroid Build Coastguard Worker 
get_vcpu(&mut self, cpu_id: u32) -> Result<*mut crosvm_vcpu, c_int>651*bb4ee6a4SAndroid Build Coastguard Worker     fn get_vcpu(&mut self, cpu_id: u32) -> Result<*mut crosvm_vcpu, c_int> {
652*bb4ee6a4SAndroid Build Coastguard Worker         if let Some(vcpu) = self.vcpus.get(cpu_id as usize) {
653*bb4ee6a4SAndroid Build Coastguard Worker             Ok(vcpu as *const crosvm_vcpu as *mut crosvm_vcpu)
654*bb4ee6a4SAndroid Build Coastguard Worker         } else {
655*bb4ee6a4SAndroid Build Coastguard Worker             Err(ENOENT)
656*bb4ee6a4SAndroid Build Coastguard Worker         }
657*bb4ee6a4SAndroid Build Coastguard Worker     }
658*bb4ee6a4SAndroid Build Coastguard Worker 
get_net_config(&mut self) -> result::Result<crosvm_net_config, c_int>659*bb4ee6a4SAndroid Build Coastguard Worker     fn get_net_config(&mut self) -> result::Result<crosvm_net_config, c_int> {
660*bb4ee6a4SAndroid Build Coastguard Worker         let mut r = MainRequest::new();
661*bb4ee6a4SAndroid Build Coastguard Worker         r.mut_get_net_config();
662*bb4ee6a4SAndroid Build Coastguard Worker 
663*bb4ee6a4SAndroid Build Coastguard Worker         let (response, mut files) = self.main_transaction(&r, &[])?;
664*bb4ee6a4SAndroid Build Coastguard Worker         if !response.has_get_net_config() {
665*bb4ee6a4SAndroid Build Coastguard Worker             return Err(EPROTO);
666*bb4ee6a4SAndroid Build Coastguard Worker         }
667*bb4ee6a4SAndroid Build Coastguard Worker         let config = response.get_net_config();
668*bb4ee6a4SAndroid Build Coastguard Worker 
669*bb4ee6a4SAndroid Build Coastguard Worker         match files.pop() {
670*bb4ee6a4SAndroid Build Coastguard Worker             Some(f) => {
671*bb4ee6a4SAndroid Build Coastguard Worker                 let mut net_config = crosvm_net_config {
672*bb4ee6a4SAndroid Build Coastguard Worker                     tap_fd: f.into_raw_fd(),
673*bb4ee6a4SAndroid Build Coastguard Worker                     host_ipv4_address: config.host_ipv4_address,
674*bb4ee6a4SAndroid Build Coastguard Worker                     netmask: config.netmask,
675*bb4ee6a4SAndroid Build Coastguard Worker                     host_mac_address: [0; 6],
676*bb4ee6a4SAndroid Build Coastguard Worker                     _reserved: [0; 2],
677*bb4ee6a4SAndroid Build Coastguard Worker                 };
678*bb4ee6a4SAndroid Build Coastguard Worker 
679*bb4ee6a4SAndroid Build Coastguard Worker                 let mac_addr = &config.host_mac_address;
680*bb4ee6a4SAndroid Build Coastguard Worker                 if mac_addr.len() != net_config.host_mac_address.len() {
681*bb4ee6a4SAndroid Build Coastguard Worker                     return Err(EPROTO);
682*bb4ee6a4SAndroid Build Coastguard Worker                 }
683*bb4ee6a4SAndroid Build Coastguard Worker                 net_config.host_mac_address.copy_from_slice(mac_addr);
684*bb4ee6a4SAndroid Build Coastguard Worker 
685*bb4ee6a4SAndroid Build Coastguard Worker                 Ok(net_config)
686*bb4ee6a4SAndroid Build Coastguard Worker             }
687*bb4ee6a4SAndroid Build Coastguard Worker             None => Err(EPROTO),
688*bb4ee6a4SAndroid Build Coastguard Worker         }
689*bb4ee6a4SAndroid Build Coastguard Worker     }
690*bb4ee6a4SAndroid Build Coastguard Worker }
691*bb4ee6a4SAndroid Build Coastguard Worker 
692*bb4ee6a4SAndroid Build Coastguard Worker /// This helper macro implements the C API's constructor/destructor for a given type. Because they
693*bb4ee6a4SAndroid Build Coastguard Worker /// all follow the same pattern and include lots of boilerplate unsafe code, it makes sense to write
694*bb4ee6a4SAndroid Build Coastguard Worker /// it once with this helper macro.
695*bb4ee6a4SAndroid Build Coastguard Worker macro_rules! impl_ctor_dtor {
696*bb4ee6a4SAndroid Build Coastguard Worker     (
697*bb4ee6a4SAndroid Build Coastguard Worker         $t:ident,
698*bb4ee6a4SAndroid Build Coastguard Worker         $ctor:ident ( $( $x:ident: $y:ty ),* ),
699*bb4ee6a4SAndroid Build Coastguard Worker         $dtor:ident,
700*bb4ee6a4SAndroid Build Coastguard Worker     ) => {
701*bb4ee6a4SAndroid Build Coastguard Worker         #[allow(unused_unsafe)]
702*bb4ee6a4SAndroid Build Coastguard Worker         #[no_mangle]
703*bb4ee6a4SAndroid Build Coastguard Worker         pub unsafe extern fn $ctor(self_: *mut crosvm, $($x: $y,)* obj_ptr: *mut *mut $t) -> c_int {
704*bb4ee6a4SAndroid Build Coastguard Worker             let self_ = &mut (*self_);
705*bb4ee6a4SAndroid Build Coastguard Worker             match $t::create(self_, $($x,)*) {
706*bb4ee6a4SAndroid Build Coastguard Worker                 Ok(obj) => {
707*bb4ee6a4SAndroid Build Coastguard Worker                     *obj_ptr = Box::into_raw(Box::new(obj));
708*bb4ee6a4SAndroid Build Coastguard Worker                     0
709*bb4ee6a4SAndroid Build Coastguard Worker                 }
710*bb4ee6a4SAndroid Build Coastguard Worker                 Err(e) => -e,
711*bb4ee6a4SAndroid Build Coastguard Worker             }
712*bb4ee6a4SAndroid Build Coastguard Worker         }
713*bb4ee6a4SAndroid Build Coastguard Worker         #[no_mangle]
714*bb4ee6a4SAndroid Build Coastguard Worker         pub unsafe extern fn $dtor(self_: *mut crosvm, obj_ptr: *mut *mut $t) -> c_int {
715*bb4ee6a4SAndroid Build Coastguard Worker             let self_ = &mut (*self_);
716*bb4ee6a4SAndroid Build Coastguard Worker             let obj = Box::from_raw(*obj_ptr);
717*bb4ee6a4SAndroid Build Coastguard Worker             match self_.destroy(obj.id) {
718*bb4ee6a4SAndroid Build Coastguard Worker                 Ok(_) => {
719*bb4ee6a4SAndroid Build Coastguard Worker                     *obj_ptr = null_mut();
720*bb4ee6a4SAndroid Build Coastguard Worker                     0
721*bb4ee6a4SAndroid Build Coastguard Worker                 }
722*bb4ee6a4SAndroid Build Coastguard Worker                 Err(e) =>  {
723*bb4ee6a4SAndroid Build Coastguard Worker                     Box::into_raw(obj);
724*bb4ee6a4SAndroid Build Coastguard Worker                     -e
725*bb4ee6a4SAndroid Build Coastguard Worker                 }
726*bb4ee6a4SAndroid Build Coastguard Worker             }
727*bb4ee6a4SAndroid Build Coastguard Worker         }
728*bb4ee6a4SAndroid Build Coastguard Worker     }
729*bb4ee6a4SAndroid Build Coastguard Worker }
730*bb4ee6a4SAndroid Build Coastguard Worker 
731*bb4ee6a4SAndroid Build Coastguard Worker pub struct crosvm_io_event {
732*bb4ee6a4SAndroid Build Coastguard Worker     id: u32,
733*bb4ee6a4SAndroid Build Coastguard Worker     evt: File,
734*bb4ee6a4SAndroid Build Coastguard Worker }
735*bb4ee6a4SAndroid Build Coastguard Worker 
736*bb4ee6a4SAndroid Build Coastguard Worker impl crosvm_io_event {
737*bb4ee6a4SAndroid Build Coastguard Worker     // Clippy: we use ptr::read_unaligned to read from pointers that may be
738*bb4ee6a4SAndroid Build Coastguard Worker     // underaligned. Dereferencing such a pointer is always undefined behavior
739*bb4ee6a4SAndroid Build Coastguard Worker     // in Rust.
740*bb4ee6a4SAndroid Build Coastguard Worker     //
741*bb4ee6a4SAndroid Build Coastguard Worker     // Lint can be unsuppressed once Clippy recognizes this pattern as correct.
742*bb4ee6a4SAndroid Build Coastguard Worker     // https://github.com/rust-lang/rust-clippy/issues/2881
743*bb4ee6a4SAndroid Build Coastguard Worker     #[allow(clippy::cast_ptr_alignment)]
create( crosvm: &mut crosvm, space: u32, addr: u64, length: u32, datamatch: *const u8, ) -> result::Result<crosvm_io_event, c_int>744*bb4ee6a4SAndroid Build Coastguard Worker     unsafe fn create(
745*bb4ee6a4SAndroid Build Coastguard Worker         crosvm: &mut crosvm,
746*bb4ee6a4SAndroid Build Coastguard Worker         space: u32,
747*bb4ee6a4SAndroid Build Coastguard Worker         addr: u64,
748*bb4ee6a4SAndroid Build Coastguard Worker         length: u32,
749*bb4ee6a4SAndroid Build Coastguard Worker         datamatch: *const u8,
750*bb4ee6a4SAndroid Build Coastguard Worker     ) -> result::Result<crosvm_io_event, c_int> {
751*bb4ee6a4SAndroid Build Coastguard Worker         let datamatch = match length {
752*bb4ee6a4SAndroid Build Coastguard Worker             0 => 0,
753*bb4ee6a4SAndroid Build Coastguard Worker             1 => ptr::read_unaligned(datamatch) as u64,
754*bb4ee6a4SAndroid Build Coastguard Worker             2 => ptr::read_unaligned(datamatch as *const u16) as u64,
755*bb4ee6a4SAndroid Build Coastguard Worker             4 => ptr::read_unaligned(datamatch as *const u32) as u64,
756*bb4ee6a4SAndroid Build Coastguard Worker             8 => ptr::read_unaligned(datamatch as *const u64),
757*bb4ee6a4SAndroid Build Coastguard Worker             _ => return Err(EINVAL),
758*bb4ee6a4SAndroid Build Coastguard Worker         };
759*bb4ee6a4SAndroid Build Coastguard Worker         Self::safe_create(crosvm, space, addr, length, datamatch)
760*bb4ee6a4SAndroid Build Coastguard Worker     }
761*bb4ee6a4SAndroid Build Coastguard Worker 
safe_create( crosvm: &mut crosvm, space: u32, addr: u64, length: u32, datamatch: u64, ) -> result::Result<crosvm_io_event, c_int>762*bb4ee6a4SAndroid Build Coastguard Worker     fn safe_create(
763*bb4ee6a4SAndroid Build Coastguard Worker         crosvm: &mut crosvm,
764*bb4ee6a4SAndroid Build Coastguard Worker         space: u32,
765*bb4ee6a4SAndroid Build Coastguard Worker         addr: u64,
766*bb4ee6a4SAndroid Build Coastguard Worker         length: u32,
767*bb4ee6a4SAndroid Build Coastguard Worker         datamatch: u64,
768*bb4ee6a4SAndroid Build Coastguard Worker     ) -> result::Result<crosvm_io_event, c_int> {
769*bb4ee6a4SAndroid Build Coastguard Worker         let id = crosvm.get_id_allocator().alloc();
770*bb4ee6a4SAndroid Build Coastguard Worker 
771*bb4ee6a4SAndroid Build Coastguard Worker         let mut r = MainRequest::new();
772*bb4ee6a4SAndroid Build Coastguard Worker         let create = r.mut_create();
773*bb4ee6a4SAndroid Build Coastguard Worker         create.id = id;
774*bb4ee6a4SAndroid Build Coastguard Worker         let io_event = create.mut_io_event();
775*bb4ee6a4SAndroid Build Coastguard Worker         io_event.space = AddressSpace::from_i32(space as i32).ok_or(EINVAL)?.into();
776*bb4ee6a4SAndroid Build Coastguard Worker         io_event.address = addr;
777*bb4ee6a4SAndroid Build Coastguard Worker         io_event.length = length;
778*bb4ee6a4SAndroid Build Coastguard Worker         io_event.datamatch = datamatch;
779*bb4ee6a4SAndroid Build Coastguard Worker 
780*bb4ee6a4SAndroid Build Coastguard Worker         let ret = match crosvm.main_transaction(&r, &[]) {
781*bb4ee6a4SAndroid Build Coastguard Worker             Ok((_, mut files)) => match files.pop() {
782*bb4ee6a4SAndroid Build Coastguard Worker                 Some(evt) => return Ok(crosvm_io_event { id, evt }),
783*bb4ee6a4SAndroid Build Coastguard Worker                 None => EPROTO,
784*bb4ee6a4SAndroid Build Coastguard Worker             },
785*bb4ee6a4SAndroid Build Coastguard Worker             Err(e) => e,
786*bb4ee6a4SAndroid Build Coastguard Worker         };
787*bb4ee6a4SAndroid Build Coastguard Worker         crosvm.get_id_allocator().free(id);
788*bb4ee6a4SAndroid Build Coastguard Worker         Err(ret)
789*bb4ee6a4SAndroid Build Coastguard Worker     }
790*bb4ee6a4SAndroid Build Coastguard Worker }
791*bb4ee6a4SAndroid Build Coastguard Worker 
792*bb4ee6a4SAndroid Build Coastguard Worker impl_ctor_dtor!(
793*bb4ee6a4SAndroid Build Coastguard Worker     crosvm_io_event,
794*bb4ee6a4SAndroid Build Coastguard Worker     crosvm_create_io_event(space: u32, addr: u64, len: u32, datamatch: *const u8),
795*bb4ee6a4SAndroid Build Coastguard Worker     crosvm_destroy_io_event,
796*bb4ee6a4SAndroid Build Coastguard Worker );
797*bb4ee6a4SAndroid Build Coastguard Worker 
798*bb4ee6a4SAndroid Build Coastguard Worker #[no_mangle]
crosvm_io_event_fd(this: *mut crosvm_io_event) -> c_int799*bb4ee6a4SAndroid Build Coastguard Worker pub unsafe extern "C" fn crosvm_io_event_fd(this: *mut crosvm_io_event) -> c_int {
800*bb4ee6a4SAndroid Build Coastguard Worker     let _u = record(Stat::IoEvent);
801*bb4ee6a4SAndroid Build Coastguard Worker     (*this).evt.as_raw_fd()
802*bb4ee6a4SAndroid Build Coastguard Worker }
803*bb4ee6a4SAndroid Build Coastguard Worker 
804*bb4ee6a4SAndroid Build Coastguard Worker pub struct crosvm_memory {
805*bb4ee6a4SAndroid Build Coastguard Worker     id: u32,
806*bb4ee6a4SAndroid Build Coastguard Worker     length: u64,
807*bb4ee6a4SAndroid Build Coastguard Worker }
808*bb4ee6a4SAndroid Build Coastguard Worker 
809*bb4ee6a4SAndroid Build Coastguard Worker impl crosvm_memory {
create( crosvm: &mut crosvm, fd: c_int, offset: u64, length: u64, start: u64, read_only: bool, dirty_log: bool, ) -> result::Result<crosvm_memory, c_int>810*bb4ee6a4SAndroid Build Coastguard Worker     fn create(
811*bb4ee6a4SAndroid Build Coastguard Worker         crosvm: &mut crosvm,
812*bb4ee6a4SAndroid Build Coastguard Worker         fd: c_int,
813*bb4ee6a4SAndroid Build Coastguard Worker         offset: u64,
814*bb4ee6a4SAndroid Build Coastguard Worker         length: u64,
815*bb4ee6a4SAndroid Build Coastguard Worker         start: u64,
816*bb4ee6a4SAndroid Build Coastguard Worker         read_only: bool,
817*bb4ee6a4SAndroid Build Coastguard Worker         dirty_log: bool,
818*bb4ee6a4SAndroid Build Coastguard Worker     ) -> result::Result<crosvm_memory, c_int> {
819*bb4ee6a4SAndroid Build Coastguard Worker         const PAGE_MASK: u64 = 0x0fff;
820*bb4ee6a4SAndroid Build Coastguard Worker         if offset & PAGE_MASK != 0 || length & PAGE_MASK != 0 {
821*bb4ee6a4SAndroid Build Coastguard Worker             return Err(EINVAL);
822*bb4ee6a4SAndroid Build Coastguard Worker         }
823*bb4ee6a4SAndroid Build Coastguard Worker         let id = crosvm.get_id_allocator().alloc();
824*bb4ee6a4SAndroid Build Coastguard Worker 
825*bb4ee6a4SAndroid Build Coastguard Worker         let mut r = MainRequest::new();
826*bb4ee6a4SAndroid Build Coastguard Worker         let create = r.mut_create();
827*bb4ee6a4SAndroid Build Coastguard Worker         create.id = id;
828*bb4ee6a4SAndroid Build Coastguard Worker         let memory = create.mut_memory();
829*bb4ee6a4SAndroid Build Coastguard Worker         memory.offset = offset;
830*bb4ee6a4SAndroid Build Coastguard Worker         memory.start = start;
831*bb4ee6a4SAndroid Build Coastguard Worker         memory.length = length;
832*bb4ee6a4SAndroid Build Coastguard Worker         memory.read_only = read_only;
833*bb4ee6a4SAndroid Build Coastguard Worker         memory.dirty_log = dirty_log;
834*bb4ee6a4SAndroid Build Coastguard Worker 
835*bb4ee6a4SAndroid Build Coastguard Worker         let ret = match crosvm.main_transaction(&r, &[fd]) {
836*bb4ee6a4SAndroid Build Coastguard Worker             Ok(_) => return Ok(crosvm_memory { id, length }),
837*bb4ee6a4SAndroid Build Coastguard Worker             Err(e) => e,
838*bb4ee6a4SAndroid Build Coastguard Worker         };
839*bb4ee6a4SAndroid Build Coastguard Worker         crosvm.get_id_allocator().free(id);
840*bb4ee6a4SAndroid Build Coastguard Worker         Err(ret)
841*bb4ee6a4SAndroid Build Coastguard Worker     }
842*bb4ee6a4SAndroid Build Coastguard Worker 
get_dirty_log(&mut self, crosvm: &mut crosvm) -> result::Result<Vec<u8>, c_int>843*bb4ee6a4SAndroid Build Coastguard Worker     fn get_dirty_log(&mut self, crosvm: &mut crosvm) -> result::Result<Vec<u8>, c_int> {
844*bb4ee6a4SAndroid Build Coastguard Worker         let mut r = MainRequest::new();
845*bb4ee6a4SAndroid Build Coastguard Worker         r.mut_dirty_log().id = self.id;
846*bb4ee6a4SAndroid Build Coastguard Worker         let (mut response, _) = crosvm.main_transaction(&r, &[])?;
847*bb4ee6a4SAndroid Build Coastguard Worker         if !response.has_dirty_log() {
848*bb4ee6a4SAndroid Build Coastguard Worker             return Err(EPROTO);
849*bb4ee6a4SAndroid Build Coastguard Worker         }
850*bb4ee6a4SAndroid Build Coastguard Worker         Ok(response.take_dirty_log().bitmap)
851*bb4ee6a4SAndroid Build Coastguard Worker     }
852*bb4ee6a4SAndroid Build Coastguard Worker }
853*bb4ee6a4SAndroid Build Coastguard Worker 
854*bb4ee6a4SAndroid Build Coastguard Worker impl_ctor_dtor!(
855*bb4ee6a4SAndroid Build Coastguard Worker     crosvm_memory,
856*bb4ee6a4SAndroid Build Coastguard Worker     crosvm_create_memory(
857*bb4ee6a4SAndroid Build Coastguard Worker         fd: c_int,
858*bb4ee6a4SAndroid Build Coastguard Worker         offset: u64,
859*bb4ee6a4SAndroid Build Coastguard Worker         length: u64,
860*bb4ee6a4SAndroid Build Coastguard Worker         start: u64,
861*bb4ee6a4SAndroid Build Coastguard Worker         read_only: bool,
862*bb4ee6a4SAndroid Build Coastguard Worker         dirty_log: bool
863*bb4ee6a4SAndroid Build Coastguard Worker     ),
864*bb4ee6a4SAndroid Build Coastguard Worker     crosvm_destroy_memory,
865*bb4ee6a4SAndroid Build Coastguard Worker );
866*bb4ee6a4SAndroid Build Coastguard Worker 
867*bb4ee6a4SAndroid Build Coastguard Worker #[no_mangle]
crosvm_memory_get_dirty_log( crosvm: *mut crosvm, this: *mut crosvm_memory, log: *mut u8, ) -> c_int868*bb4ee6a4SAndroid Build Coastguard Worker pub unsafe extern "C" fn crosvm_memory_get_dirty_log(
869*bb4ee6a4SAndroid Build Coastguard Worker     crosvm: *mut crosvm,
870*bb4ee6a4SAndroid Build Coastguard Worker     this: *mut crosvm_memory,
871*bb4ee6a4SAndroid Build Coastguard Worker     log: *mut u8,
872*bb4ee6a4SAndroid Build Coastguard Worker ) -> c_int {
873*bb4ee6a4SAndroid Build Coastguard Worker     let _u = record(Stat::MemoryGetDirtyLog);
874*bb4ee6a4SAndroid Build Coastguard Worker     let crosvm = &mut *crosvm;
875*bb4ee6a4SAndroid Build Coastguard Worker     let this = &mut *this;
876*bb4ee6a4SAndroid Build Coastguard Worker     let log_slice = slice::from_raw_parts_mut(log, dirty_log_bitmap_size(this.length as usize));
877*bb4ee6a4SAndroid Build Coastguard Worker     match this.get_dirty_log(crosvm) {
878*bb4ee6a4SAndroid Build Coastguard Worker         Ok(bitmap) => {
879*bb4ee6a4SAndroid Build Coastguard Worker             if bitmap.len() == log_slice.len() {
880*bb4ee6a4SAndroid Build Coastguard Worker                 log_slice.copy_from_slice(&bitmap);
881*bb4ee6a4SAndroid Build Coastguard Worker                 0
882*bb4ee6a4SAndroid Build Coastguard Worker             } else {
883*bb4ee6a4SAndroid Build Coastguard Worker                 -EPROTO
884*bb4ee6a4SAndroid Build Coastguard Worker             }
885*bb4ee6a4SAndroid Build Coastguard Worker         }
886*bb4ee6a4SAndroid Build Coastguard Worker         Err(e) => -e,
887*bb4ee6a4SAndroid Build Coastguard Worker     }
888*bb4ee6a4SAndroid Build Coastguard Worker }
889*bb4ee6a4SAndroid Build Coastguard Worker 
890*bb4ee6a4SAndroid Build Coastguard Worker pub struct crosvm_irq_event {
891*bb4ee6a4SAndroid Build Coastguard Worker     id: u32,
892*bb4ee6a4SAndroid Build Coastguard Worker     trigger_evt: File,
893*bb4ee6a4SAndroid Build Coastguard Worker     resample_evt: File,
894*bb4ee6a4SAndroid Build Coastguard Worker }
895*bb4ee6a4SAndroid Build Coastguard Worker 
896*bb4ee6a4SAndroid Build Coastguard Worker impl crosvm_irq_event {
create(crosvm: &mut crosvm, irq_id: u32) -> result::Result<crosvm_irq_event, c_int>897*bb4ee6a4SAndroid Build Coastguard Worker     fn create(crosvm: &mut crosvm, irq_id: u32) -> result::Result<crosvm_irq_event, c_int> {
898*bb4ee6a4SAndroid Build Coastguard Worker         let id = crosvm.get_id_allocator().alloc();
899*bb4ee6a4SAndroid Build Coastguard Worker 
900*bb4ee6a4SAndroid Build Coastguard Worker         let mut r = MainRequest::new();
901*bb4ee6a4SAndroid Build Coastguard Worker         let create = r.mut_create();
902*bb4ee6a4SAndroid Build Coastguard Worker         create.id = id;
903*bb4ee6a4SAndroid Build Coastguard Worker         let irq_event = create.mut_irq_event();
904*bb4ee6a4SAndroid Build Coastguard Worker         irq_event.irq_id = irq_id;
905*bb4ee6a4SAndroid Build Coastguard Worker         irq_event.resample = true;
906*bb4ee6a4SAndroid Build Coastguard Worker 
907*bb4ee6a4SAndroid Build Coastguard Worker         let ret = match crosvm.main_transaction(&r, &[]) {
908*bb4ee6a4SAndroid Build Coastguard Worker             Ok((_, mut files)) => {
909*bb4ee6a4SAndroid Build Coastguard Worker                 if files.len() >= 2 {
910*bb4ee6a4SAndroid Build Coastguard Worker                     let resample_evt = files.pop().unwrap();
911*bb4ee6a4SAndroid Build Coastguard Worker                     let trigger_evt = files.pop().unwrap();
912*bb4ee6a4SAndroid Build Coastguard Worker                     return Ok(crosvm_irq_event {
913*bb4ee6a4SAndroid Build Coastguard Worker                         id,
914*bb4ee6a4SAndroid Build Coastguard Worker                         trigger_evt,
915*bb4ee6a4SAndroid Build Coastguard Worker                         resample_evt,
916*bb4ee6a4SAndroid Build Coastguard Worker                     });
917*bb4ee6a4SAndroid Build Coastguard Worker                 }
918*bb4ee6a4SAndroid Build Coastguard Worker                 EPROTO
919*bb4ee6a4SAndroid Build Coastguard Worker             }
920*bb4ee6a4SAndroid Build Coastguard Worker             Err(e) => e,
921*bb4ee6a4SAndroid Build Coastguard Worker         };
922*bb4ee6a4SAndroid Build Coastguard Worker         crosvm.get_id_allocator().free(id);
923*bb4ee6a4SAndroid Build Coastguard Worker         Err(ret)
924*bb4ee6a4SAndroid Build Coastguard Worker     }
925*bb4ee6a4SAndroid Build Coastguard Worker }
926*bb4ee6a4SAndroid Build Coastguard Worker 
927*bb4ee6a4SAndroid Build Coastguard Worker impl_ctor_dtor!(
928*bb4ee6a4SAndroid Build Coastguard Worker     crosvm_irq_event,
929*bb4ee6a4SAndroid Build Coastguard Worker     crosvm_create_irq_event(irq_id: u32),
930*bb4ee6a4SAndroid Build Coastguard Worker     crosvm_destroy_irq_event,
931*bb4ee6a4SAndroid Build Coastguard Worker );
932*bb4ee6a4SAndroid Build Coastguard Worker 
933*bb4ee6a4SAndroid Build Coastguard Worker #[no_mangle]
crosvm_irq_event_get_fd(this: *mut crosvm_irq_event) -> c_int934*bb4ee6a4SAndroid Build Coastguard Worker pub unsafe extern "C" fn crosvm_irq_event_get_fd(this: *mut crosvm_irq_event) -> c_int {
935*bb4ee6a4SAndroid Build Coastguard Worker     let _u = record(Stat::IrqEventGetFd);
936*bb4ee6a4SAndroid Build Coastguard Worker     (*this).trigger_evt.as_raw_fd()
937*bb4ee6a4SAndroid Build Coastguard Worker }
938*bb4ee6a4SAndroid Build Coastguard Worker 
939*bb4ee6a4SAndroid Build Coastguard Worker #[no_mangle]
crosvm_irq_event_get_resample_fd(this: *mut crosvm_irq_event) -> c_int940*bb4ee6a4SAndroid Build Coastguard Worker pub unsafe extern "C" fn crosvm_irq_event_get_resample_fd(this: *mut crosvm_irq_event) -> c_int {
941*bb4ee6a4SAndroid Build Coastguard Worker     let _u = record(Stat::IrqEventGetResampleFd);
942*bb4ee6a4SAndroid Build Coastguard Worker     (*this).resample_evt.as_raw_fd()
943*bb4ee6a4SAndroid Build Coastguard Worker }
944*bb4ee6a4SAndroid Build Coastguard Worker 
945*bb4ee6a4SAndroid Build Coastguard Worker #[allow(dead_code)]
946*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Copy, Clone)]
947*bb4ee6a4SAndroid Build Coastguard Worker #[repr(C)]
948*bb4ee6a4SAndroid Build Coastguard Worker struct anon_io_access {
949*bb4ee6a4SAndroid Build Coastguard Worker     address_space: u32,
950*bb4ee6a4SAndroid Build Coastguard Worker     __reserved0: [u8; 4],
951*bb4ee6a4SAndroid Build Coastguard Worker     address: u64,
952*bb4ee6a4SAndroid Build Coastguard Worker     data: *mut u8,
953*bb4ee6a4SAndroid Build Coastguard Worker     length: u32,
954*bb4ee6a4SAndroid Build Coastguard Worker     is_write: u8,
955*bb4ee6a4SAndroid Build Coastguard Worker     no_resume: u8,
956*bb4ee6a4SAndroid Build Coastguard Worker     __reserved1: [u8; 2],
957*bb4ee6a4SAndroid Build Coastguard Worker }
958*bb4ee6a4SAndroid Build Coastguard Worker 
959*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Copy, Clone)]
960*bb4ee6a4SAndroid Build Coastguard Worker #[repr(C)]
961*bb4ee6a4SAndroid Build Coastguard Worker struct anon_hyperv_call {
962*bb4ee6a4SAndroid Build Coastguard Worker     input: u64,
963*bb4ee6a4SAndroid Build Coastguard Worker     result: *mut u8,
964*bb4ee6a4SAndroid Build Coastguard Worker     params: [u64; 2],
965*bb4ee6a4SAndroid Build Coastguard Worker }
966*bb4ee6a4SAndroid Build Coastguard Worker 
967*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Copy, Clone)]
968*bb4ee6a4SAndroid Build Coastguard Worker #[repr(C)]
969*bb4ee6a4SAndroid Build Coastguard Worker struct anon_hyperv_synic {
970*bb4ee6a4SAndroid Build Coastguard Worker     msr: u32,
971*bb4ee6a4SAndroid Build Coastguard Worker     reserved: u32,
972*bb4ee6a4SAndroid Build Coastguard Worker     control: u64,
973*bb4ee6a4SAndroid Build Coastguard Worker     evt_page: u64,
974*bb4ee6a4SAndroid Build Coastguard Worker     msg_page: u64,
975*bb4ee6a4SAndroid Build Coastguard Worker }
976*bb4ee6a4SAndroid Build Coastguard Worker 
977*bb4ee6a4SAndroid Build Coastguard Worker #[repr(C)]
978*bb4ee6a4SAndroid Build Coastguard Worker union anon_vcpu_event {
979*bb4ee6a4SAndroid Build Coastguard Worker     io_access: anon_io_access,
980*bb4ee6a4SAndroid Build Coastguard Worker     user: *mut c_void,
981*bb4ee6a4SAndroid Build Coastguard Worker     hyperv_call: anon_hyperv_call,
982*bb4ee6a4SAndroid Build Coastguard Worker     hyperv_synic: anon_hyperv_synic,
983*bb4ee6a4SAndroid Build Coastguard Worker     #[allow(dead_code)]
984*bb4ee6a4SAndroid Build Coastguard Worker     __reserved: [u8; 64],
985*bb4ee6a4SAndroid Build Coastguard Worker }
986*bb4ee6a4SAndroid Build Coastguard Worker 
987*bb4ee6a4SAndroid Build Coastguard Worker #[repr(C)]
988*bb4ee6a4SAndroid Build Coastguard Worker pub struct crosvm_vcpu_event {
989*bb4ee6a4SAndroid Build Coastguard Worker     kind: u32,
990*bb4ee6a4SAndroid Build Coastguard Worker     __reserved: [u8; 4],
991*bb4ee6a4SAndroid Build Coastguard Worker     event: anon_vcpu_event,
992*bb4ee6a4SAndroid Build Coastguard Worker }
993*bb4ee6a4SAndroid Build Coastguard Worker 
994*bb4ee6a4SAndroid Build Coastguard Worker // |get| tracks if the |cache| contains a cached value that can service get()
995*bb4ee6a4SAndroid Build Coastguard Worker // requests.  A set() call will populate |cache| and |set| to true to record
996*bb4ee6a4SAndroid Build Coastguard Worker // that the next resume() should apply the state.  We've got two choices on
997*bb4ee6a4SAndroid Build Coastguard Worker // what to do about |get| on a set(): 1) leave it as true, or 2) clear it and
998*bb4ee6a4SAndroid Build Coastguard Worker // have any call to get() first apply any pending set.  Currently #2 is used
999*bb4ee6a4SAndroid Build Coastguard Worker // to favor correctness over performance (it gives KVM a chance to
1000*bb4ee6a4SAndroid Build Coastguard Worker // modify/massage the values input to the set call). A plugin will rarely
1001*bb4ee6a4SAndroid Build Coastguard Worker // (if ever) issue a get() after a set() on the same vcpu exit, so opting for
1002*bb4ee6a4SAndroid Build Coastguard Worker // #1 is unlikely to provide a tangible performance gain.
1003*bb4ee6a4SAndroid Build Coastguard Worker pub struct crosvm_vcpu_reg_cache {
1004*bb4ee6a4SAndroid Build Coastguard Worker     get: bool,
1005*bb4ee6a4SAndroid Build Coastguard Worker     set: bool,
1006*bb4ee6a4SAndroid Build Coastguard Worker     cache: Vec<u8>,
1007*bb4ee6a4SAndroid Build Coastguard Worker }
1008*bb4ee6a4SAndroid Build Coastguard Worker 
1009*bb4ee6a4SAndroid Build Coastguard Worker pub struct crosvm_vcpu {
1010*bb4ee6a4SAndroid Build Coastguard Worker     read_pipe: File,
1011*bb4ee6a4SAndroid Build Coastguard Worker     write_pipe: File,
1012*bb4ee6a4SAndroid Build Coastguard Worker     send_init: bool,
1013*bb4ee6a4SAndroid Build Coastguard Worker     request_buffer: Vec<u8>,
1014*bb4ee6a4SAndroid Build Coastguard Worker     response_buffer: Vec<u8>,
1015*bb4ee6a4SAndroid Build Coastguard Worker     response_base: usize,
1016*bb4ee6a4SAndroid Build Coastguard Worker     response_length: usize,
1017*bb4ee6a4SAndroid Build Coastguard Worker     resume_data: Vec<u8>,
1018*bb4ee6a4SAndroid Build Coastguard Worker 
1019*bb4ee6a4SAndroid Build Coastguard Worker     regs: crosvm_vcpu_reg_cache,
1020*bb4ee6a4SAndroid Build Coastguard Worker     sregs: crosvm_vcpu_reg_cache,
1021*bb4ee6a4SAndroid Build Coastguard Worker     debugregs: crosvm_vcpu_reg_cache,
1022*bb4ee6a4SAndroid Build Coastguard Worker }
1023*bb4ee6a4SAndroid Build Coastguard Worker 
read_varint32(data: &[u8]) -> (u32, usize)1024*bb4ee6a4SAndroid Build Coastguard Worker fn read_varint32(data: &[u8]) -> (u32, usize) {
1025*bb4ee6a4SAndroid Build Coastguard Worker     let mut value: u32 = 0;
1026*bb4ee6a4SAndroid Build Coastguard Worker     let mut shift: u32 = 0;
1027*bb4ee6a4SAndroid Build Coastguard Worker     for (i, &b) in data.iter().enumerate() {
1028*bb4ee6a4SAndroid Build Coastguard Worker         if b < 0x80 {
1029*bb4ee6a4SAndroid Build Coastguard Worker             return match (b as u32).checked_shl(shift) {
1030*bb4ee6a4SAndroid Build Coastguard Worker                 None => (0, 0),
1031*bb4ee6a4SAndroid Build Coastguard Worker                 Some(b) => (value | b, i + 1),
1032*bb4ee6a4SAndroid Build Coastguard Worker             };
1033*bb4ee6a4SAndroid Build Coastguard Worker         }
1034*bb4ee6a4SAndroid Build Coastguard Worker         match ((b as u32) & 0x7F).checked_shl(shift) {
1035*bb4ee6a4SAndroid Build Coastguard Worker             None => return (0, 0),
1036*bb4ee6a4SAndroid Build Coastguard Worker             Some(b) => value |= b,
1037*bb4ee6a4SAndroid Build Coastguard Worker         }
1038*bb4ee6a4SAndroid Build Coastguard Worker         shift += 7;
1039*bb4ee6a4SAndroid Build Coastguard Worker     }
1040*bb4ee6a4SAndroid Build Coastguard Worker     (0, 0)
1041*bb4ee6a4SAndroid Build Coastguard Worker }
1042*bb4ee6a4SAndroid Build Coastguard Worker 
1043*bb4ee6a4SAndroid Build Coastguard Worker impl crosvm_vcpu {
new(read_pipe: File, write_pipe: File) -> crosvm_vcpu1044*bb4ee6a4SAndroid Build Coastguard Worker     fn new(read_pipe: File, write_pipe: File) -> crosvm_vcpu {
1045*bb4ee6a4SAndroid Build Coastguard Worker         crosvm_vcpu {
1046*bb4ee6a4SAndroid Build Coastguard Worker             read_pipe,
1047*bb4ee6a4SAndroid Build Coastguard Worker             write_pipe,
1048*bb4ee6a4SAndroid Build Coastguard Worker             send_init: true,
1049*bb4ee6a4SAndroid Build Coastguard Worker             request_buffer: Vec::new(),
1050*bb4ee6a4SAndroid Build Coastguard Worker             response_buffer: vec![0; MAX_DATAGRAM_SIZE],
1051*bb4ee6a4SAndroid Build Coastguard Worker             response_base: 0,
1052*bb4ee6a4SAndroid Build Coastguard Worker             response_length: 0,
1053*bb4ee6a4SAndroid Build Coastguard Worker             resume_data: Vec::new(),
1054*bb4ee6a4SAndroid Build Coastguard Worker             regs: crosvm_vcpu_reg_cache {
1055*bb4ee6a4SAndroid Build Coastguard Worker                 get: false,
1056*bb4ee6a4SAndroid Build Coastguard Worker                 set: false,
1057*bb4ee6a4SAndroid Build Coastguard Worker                 cache: vec![],
1058*bb4ee6a4SAndroid Build Coastguard Worker             },
1059*bb4ee6a4SAndroid Build Coastguard Worker             sregs: crosvm_vcpu_reg_cache {
1060*bb4ee6a4SAndroid Build Coastguard Worker                 get: false,
1061*bb4ee6a4SAndroid Build Coastguard Worker                 set: false,
1062*bb4ee6a4SAndroid Build Coastguard Worker                 cache: vec![],
1063*bb4ee6a4SAndroid Build Coastguard Worker             },
1064*bb4ee6a4SAndroid Build Coastguard Worker             debugregs: crosvm_vcpu_reg_cache {
1065*bb4ee6a4SAndroid Build Coastguard Worker                 get: false,
1066*bb4ee6a4SAndroid Build Coastguard Worker                 set: false,
1067*bb4ee6a4SAndroid Build Coastguard Worker                 cache: vec![],
1068*bb4ee6a4SAndroid Build Coastguard Worker             },
1069*bb4ee6a4SAndroid Build Coastguard Worker         }
1070*bb4ee6a4SAndroid Build Coastguard Worker     }
vcpu_send(&mut self, request: &VcpuRequest) -> result::Result<(), c_int>1071*bb4ee6a4SAndroid Build Coastguard Worker     fn vcpu_send(&mut self, request: &VcpuRequest) -> result::Result<(), c_int> {
1072*bb4ee6a4SAndroid Build Coastguard Worker         self.request_buffer.clear();
1073*bb4ee6a4SAndroid Build Coastguard Worker         request
1074*bb4ee6a4SAndroid Build Coastguard Worker             .write_to_vec(&mut self.request_buffer)
1075*bb4ee6a4SAndroid Build Coastguard Worker             .map_err(proto_error_to_int)?;
1076*bb4ee6a4SAndroid Build Coastguard Worker         self.write_pipe
1077*bb4ee6a4SAndroid Build Coastguard Worker             .write(self.request_buffer.as_slice())
1078*bb4ee6a4SAndroid Build Coastguard Worker             .map_err(|e| -e.raw_os_error().unwrap_or(EINVAL))?;
1079*bb4ee6a4SAndroid Build Coastguard Worker         Ok(())
1080*bb4ee6a4SAndroid Build Coastguard Worker     }
1081*bb4ee6a4SAndroid Build Coastguard Worker 
vcpu_recv(&mut self) -> result::Result<VcpuResponse, c_int>1082*bb4ee6a4SAndroid Build Coastguard Worker     fn vcpu_recv(&mut self) -> result::Result<VcpuResponse, c_int> {
1083*bb4ee6a4SAndroid Build Coastguard Worker         if self.response_length == 0 {
1084*bb4ee6a4SAndroid Build Coastguard Worker             let msg_size = self
1085*bb4ee6a4SAndroid Build Coastguard Worker                 .read_pipe
1086*bb4ee6a4SAndroid Build Coastguard Worker                 .read(&mut self.response_buffer)
1087*bb4ee6a4SAndroid Build Coastguard Worker                 .map_err(|e| -e.raw_os_error().unwrap_or(EINVAL))?;
1088*bb4ee6a4SAndroid Build Coastguard Worker             self.response_base = 0;
1089*bb4ee6a4SAndroid Build Coastguard Worker             self.response_length = msg_size;
1090*bb4ee6a4SAndroid Build Coastguard Worker         }
1091*bb4ee6a4SAndroid Build Coastguard Worker         if self.response_length == 0 {
1092*bb4ee6a4SAndroid Build Coastguard Worker             return Err(EINVAL);
1093*bb4ee6a4SAndroid Build Coastguard Worker         }
1094*bb4ee6a4SAndroid Build Coastguard Worker         let (value, bytes) = read_varint32(
1095*bb4ee6a4SAndroid Build Coastguard Worker             &self.response_buffer[self.response_base..self.response_base + self.response_length],
1096*bb4ee6a4SAndroid Build Coastguard Worker         );
1097*bb4ee6a4SAndroid Build Coastguard Worker         let total_size: usize = bytes + value as usize;
1098*bb4ee6a4SAndroid Build Coastguard Worker         if bytes == 0 || total_size > self.response_length {
1099*bb4ee6a4SAndroid Build Coastguard Worker             return Err(EINVAL);
1100*bb4ee6a4SAndroid Build Coastguard Worker         }
1101*bb4ee6a4SAndroid Build Coastguard Worker         let response: VcpuResponse = Message::parse_from_bytes(
1102*bb4ee6a4SAndroid Build Coastguard Worker             &self.response_buffer[self.response_base + bytes..self.response_base + total_size],
1103*bb4ee6a4SAndroid Build Coastguard Worker         )
1104*bb4ee6a4SAndroid Build Coastguard Worker         .map_err(proto_error_to_int)?;
1105*bb4ee6a4SAndroid Build Coastguard Worker         self.response_base += total_size;
1106*bb4ee6a4SAndroid Build Coastguard Worker         self.response_length -= total_size;
1107*bb4ee6a4SAndroid Build Coastguard Worker         if response.errno != 0 {
1108*bb4ee6a4SAndroid Build Coastguard Worker             return Err(response.errno);
1109*bb4ee6a4SAndroid Build Coastguard Worker         }
1110*bb4ee6a4SAndroid Build Coastguard Worker         Ok(response)
1111*bb4ee6a4SAndroid Build Coastguard Worker     }
1112*bb4ee6a4SAndroid Build Coastguard Worker 
vcpu_transaction(&mut self, request: &VcpuRequest) -> result::Result<VcpuResponse, c_int>1113*bb4ee6a4SAndroid Build Coastguard Worker     fn vcpu_transaction(&mut self, request: &VcpuRequest) -> result::Result<VcpuResponse, c_int> {
1114*bb4ee6a4SAndroid Build Coastguard Worker         self.vcpu_send(request)?;
1115*bb4ee6a4SAndroid Build Coastguard Worker         let response: VcpuResponse = self.vcpu_recv()?;
1116*bb4ee6a4SAndroid Build Coastguard Worker         Ok(response)
1117*bb4ee6a4SAndroid Build Coastguard Worker     }
1118*bb4ee6a4SAndroid Build Coastguard Worker 
wait(&mut self, event: &mut crosvm_vcpu_event) -> result::Result<(), c_int>1119*bb4ee6a4SAndroid Build Coastguard Worker     fn wait(&mut self, event: &mut crosvm_vcpu_event) -> result::Result<(), c_int> {
1120*bb4ee6a4SAndroid Build Coastguard Worker         if self.send_init {
1121*bb4ee6a4SAndroid Build Coastguard Worker             self.send_init = false;
1122*bb4ee6a4SAndroid Build Coastguard Worker             let mut r = VcpuRequest::new();
1123*bb4ee6a4SAndroid Build Coastguard Worker             r.mut_wait();
1124*bb4ee6a4SAndroid Build Coastguard Worker             self.vcpu_send(&r)?;
1125*bb4ee6a4SAndroid Build Coastguard Worker         }
1126*bb4ee6a4SAndroid Build Coastguard Worker         let mut response: VcpuResponse = self.vcpu_recv()?;
1127*bb4ee6a4SAndroid Build Coastguard Worker         if !response.has_wait() {
1128*bb4ee6a4SAndroid Build Coastguard Worker             return Err(EPROTO);
1129*bb4ee6a4SAndroid Build Coastguard Worker         }
1130*bb4ee6a4SAndroid Build Coastguard Worker         let wait = response.mut_wait();
1131*bb4ee6a4SAndroid Build Coastguard Worker         if wait.has_init() {
1132*bb4ee6a4SAndroid Build Coastguard Worker             event.kind = CROSVM_VCPU_EVENT_KIND_INIT;
1133*bb4ee6a4SAndroid Build Coastguard Worker             self.regs.get = false;
1134*bb4ee6a4SAndroid Build Coastguard Worker             self.sregs.get = false;
1135*bb4ee6a4SAndroid Build Coastguard Worker             self.debugregs.get = false;
1136*bb4ee6a4SAndroid Build Coastguard Worker             Ok(())
1137*bb4ee6a4SAndroid Build Coastguard Worker         } else if wait.has_io() {
1138*bb4ee6a4SAndroid Build Coastguard Worker             let mut io = wait.take_io();
1139*bb4ee6a4SAndroid Build Coastguard Worker             event.kind = CROSVM_VCPU_EVENT_KIND_IO_ACCESS;
1140*bb4ee6a4SAndroid Build Coastguard Worker             event.event.io_access = anon_io_access {
1141*bb4ee6a4SAndroid Build Coastguard Worker                 address_space: io.space.value() as u32,
1142*bb4ee6a4SAndroid Build Coastguard Worker                 __reserved0: Default::default(),
1143*bb4ee6a4SAndroid Build Coastguard Worker                 address: io.address,
1144*bb4ee6a4SAndroid Build Coastguard Worker                 data: io.data.as_mut_ptr(),
1145*bb4ee6a4SAndroid Build Coastguard Worker                 length: io.data.len() as u32,
1146*bb4ee6a4SAndroid Build Coastguard Worker                 is_write: io.is_write as u8,
1147*bb4ee6a4SAndroid Build Coastguard Worker                 no_resume: io.no_resume as u8,
1148*bb4ee6a4SAndroid Build Coastguard Worker                 __reserved1: Default::default(),
1149*bb4ee6a4SAndroid Build Coastguard Worker             };
1150*bb4ee6a4SAndroid Build Coastguard Worker             self.resume_data = io.data;
1151*bb4ee6a4SAndroid Build Coastguard Worker             self.regs.get = !io.regs.is_empty();
1152*bb4ee6a4SAndroid Build Coastguard Worker             if self.regs.get {
1153*bb4ee6a4SAndroid Build Coastguard Worker                 swap(&mut self.regs.cache, &mut io.regs);
1154*bb4ee6a4SAndroid Build Coastguard Worker             }
1155*bb4ee6a4SAndroid Build Coastguard Worker             self.sregs.get = !io.sregs.is_empty();
1156*bb4ee6a4SAndroid Build Coastguard Worker             if self.sregs.get {
1157*bb4ee6a4SAndroid Build Coastguard Worker                 swap(&mut self.sregs.cache, &mut io.sregs);
1158*bb4ee6a4SAndroid Build Coastguard Worker             }
1159*bb4ee6a4SAndroid Build Coastguard Worker             self.debugregs.get = !io.debugregs.is_empty();
1160*bb4ee6a4SAndroid Build Coastguard Worker             if self.debugregs.get {
1161*bb4ee6a4SAndroid Build Coastguard Worker                 swap(&mut self.debugregs.cache, &mut io.debugregs);
1162*bb4ee6a4SAndroid Build Coastguard Worker             }
1163*bb4ee6a4SAndroid Build Coastguard Worker             Ok(())
1164*bb4ee6a4SAndroid Build Coastguard Worker         } else if wait.has_user() {
1165*bb4ee6a4SAndroid Build Coastguard Worker             let user = wait.user();
1166*bb4ee6a4SAndroid Build Coastguard Worker             event.kind = CROSVM_VCPU_EVENT_KIND_PAUSED;
1167*bb4ee6a4SAndroid Build Coastguard Worker             event.event.user = user.user as *mut c_void;
1168*bb4ee6a4SAndroid Build Coastguard Worker             self.regs.get = false;
1169*bb4ee6a4SAndroid Build Coastguard Worker             self.sregs.get = false;
1170*bb4ee6a4SAndroid Build Coastguard Worker             self.debugregs.get = false;
1171*bb4ee6a4SAndroid Build Coastguard Worker             Ok(())
1172*bb4ee6a4SAndroid Build Coastguard Worker         } else if wait.has_hyperv_call() {
1173*bb4ee6a4SAndroid Build Coastguard Worker             let hv = wait.hyperv_call();
1174*bb4ee6a4SAndroid Build Coastguard Worker             event.kind = CROSVM_VCPU_EVENT_KIND_HYPERV_HCALL;
1175*bb4ee6a4SAndroid Build Coastguard Worker             self.resume_data = vec![0; 8];
1176*bb4ee6a4SAndroid Build Coastguard Worker             event.event.hyperv_call = anon_hyperv_call {
1177*bb4ee6a4SAndroid Build Coastguard Worker                 input: hv.input,
1178*bb4ee6a4SAndroid Build Coastguard Worker                 result: self.resume_data.as_mut_ptr(),
1179*bb4ee6a4SAndroid Build Coastguard Worker                 params: [hv.params0, hv.params1],
1180*bb4ee6a4SAndroid Build Coastguard Worker             };
1181*bb4ee6a4SAndroid Build Coastguard Worker             self.regs.get = false;
1182*bb4ee6a4SAndroid Build Coastguard Worker             self.sregs.get = false;
1183*bb4ee6a4SAndroid Build Coastguard Worker             self.debugregs.get = false;
1184*bb4ee6a4SAndroid Build Coastguard Worker             Ok(())
1185*bb4ee6a4SAndroid Build Coastguard Worker         } else if wait.has_hyperv_synic() {
1186*bb4ee6a4SAndroid Build Coastguard Worker             let hv = wait.hyperv_synic();
1187*bb4ee6a4SAndroid Build Coastguard Worker             event.kind = CROSVM_VCPU_EVENT_KIND_HYPERV_SYNIC;
1188*bb4ee6a4SAndroid Build Coastguard Worker             event.event.hyperv_synic = anon_hyperv_synic {
1189*bb4ee6a4SAndroid Build Coastguard Worker                 msr: hv.msr,
1190*bb4ee6a4SAndroid Build Coastguard Worker                 reserved: 0,
1191*bb4ee6a4SAndroid Build Coastguard Worker                 control: hv.control,
1192*bb4ee6a4SAndroid Build Coastguard Worker                 evt_page: hv.evt_page,
1193*bb4ee6a4SAndroid Build Coastguard Worker                 msg_page: hv.msg_page,
1194*bb4ee6a4SAndroid Build Coastguard Worker             };
1195*bb4ee6a4SAndroid Build Coastguard Worker             self.regs.get = false;
1196*bb4ee6a4SAndroid Build Coastguard Worker             self.sregs.get = false;
1197*bb4ee6a4SAndroid Build Coastguard Worker             self.debugregs.get = false;
1198*bb4ee6a4SAndroid Build Coastguard Worker             Ok(())
1199*bb4ee6a4SAndroid Build Coastguard Worker         } else {
1200*bb4ee6a4SAndroid Build Coastguard Worker             Err(EPROTO)
1201*bb4ee6a4SAndroid Build Coastguard Worker         }
1202*bb4ee6a4SAndroid Build Coastguard Worker     }
1203*bb4ee6a4SAndroid Build Coastguard Worker 
resume(&mut self) -> result::Result<(), c_int>1204*bb4ee6a4SAndroid Build Coastguard Worker     fn resume(&mut self) -> result::Result<(), c_int> {
1205*bb4ee6a4SAndroid Build Coastguard Worker         let mut r = VcpuRequest::new();
1206*bb4ee6a4SAndroid Build Coastguard Worker         let resume = r.mut_resume();
1207*bb4ee6a4SAndroid Build Coastguard Worker         swap(&mut resume.data, &mut self.resume_data);
1208*bb4ee6a4SAndroid Build Coastguard Worker 
1209*bb4ee6a4SAndroid Build Coastguard Worker         if self.regs.set {
1210*bb4ee6a4SAndroid Build Coastguard Worker             swap(&mut resume.regs, &mut self.regs.cache);
1211*bb4ee6a4SAndroid Build Coastguard Worker             self.regs.set = false;
1212*bb4ee6a4SAndroid Build Coastguard Worker         }
1213*bb4ee6a4SAndroid Build Coastguard Worker         if self.sregs.set {
1214*bb4ee6a4SAndroid Build Coastguard Worker             swap(&mut resume.sregs, &mut self.sregs.cache);
1215*bb4ee6a4SAndroid Build Coastguard Worker             self.sregs.set = false;
1216*bb4ee6a4SAndroid Build Coastguard Worker         }
1217*bb4ee6a4SAndroid Build Coastguard Worker         if self.debugregs.set {
1218*bb4ee6a4SAndroid Build Coastguard Worker             swap(&mut resume.debugregs, &mut self.debugregs.cache);
1219*bb4ee6a4SAndroid Build Coastguard Worker             self.debugregs.set = false;
1220*bb4ee6a4SAndroid Build Coastguard Worker         }
1221*bb4ee6a4SAndroid Build Coastguard Worker 
1222*bb4ee6a4SAndroid Build Coastguard Worker         self.vcpu_send(&r)?;
1223*bb4ee6a4SAndroid Build Coastguard Worker         Ok(())
1224*bb4ee6a4SAndroid Build Coastguard Worker     }
1225*bb4ee6a4SAndroid Build Coastguard Worker 
get_state( &mut self, state_set: vcpu_request::StateSet, out: &mut [u8], ) -> result::Result<(), c_int>1226*bb4ee6a4SAndroid Build Coastguard Worker     fn get_state(
1227*bb4ee6a4SAndroid Build Coastguard Worker         &mut self,
1228*bb4ee6a4SAndroid Build Coastguard Worker         state_set: vcpu_request::StateSet,
1229*bb4ee6a4SAndroid Build Coastguard Worker         out: &mut [u8],
1230*bb4ee6a4SAndroid Build Coastguard Worker     ) -> result::Result<(), c_int> {
1231*bb4ee6a4SAndroid Build Coastguard Worker         let mut r = VcpuRequest::new();
1232*bb4ee6a4SAndroid Build Coastguard Worker         r.mut_get_state().set = state_set.into();
1233*bb4ee6a4SAndroid Build Coastguard Worker         let response = self.vcpu_transaction(&r)?;
1234*bb4ee6a4SAndroid Build Coastguard Worker         if !response.has_get_state() {
1235*bb4ee6a4SAndroid Build Coastguard Worker             return Err(EPROTO);
1236*bb4ee6a4SAndroid Build Coastguard Worker         }
1237*bb4ee6a4SAndroid Build Coastguard Worker         let get_state = response.get_state();
1238*bb4ee6a4SAndroid Build Coastguard Worker         if get_state.state.len() != out.len() {
1239*bb4ee6a4SAndroid Build Coastguard Worker             return Err(EPROTO);
1240*bb4ee6a4SAndroid Build Coastguard Worker         }
1241*bb4ee6a4SAndroid Build Coastguard Worker         out.copy_from_slice(&get_state.state);
1242*bb4ee6a4SAndroid Build Coastguard Worker         Ok(())
1243*bb4ee6a4SAndroid Build Coastguard Worker     }
1244*bb4ee6a4SAndroid Build Coastguard Worker 
set_state( &mut self, state_set: vcpu_request::StateSet, new_state: &[u8], ) -> result::Result<(), c_int>1245*bb4ee6a4SAndroid Build Coastguard Worker     fn set_state(
1246*bb4ee6a4SAndroid Build Coastguard Worker         &mut self,
1247*bb4ee6a4SAndroid Build Coastguard Worker         state_set: vcpu_request::StateSet,
1248*bb4ee6a4SAndroid Build Coastguard Worker         new_state: &[u8],
1249*bb4ee6a4SAndroid Build Coastguard Worker     ) -> result::Result<(), c_int> {
1250*bb4ee6a4SAndroid Build Coastguard Worker         let mut r = VcpuRequest::new();
1251*bb4ee6a4SAndroid Build Coastguard Worker         let set_state = r.mut_set_state();
1252*bb4ee6a4SAndroid Build Coastguard Worker         set_state.set = state_set.into();
1253*bb4ee6a4SAndroid Build Coastguard Worker         set_state.state = new_state.to_vec();
1254*bb4ee6a4SAndroid Build Coastguard Worker 
1255*bb4ee6a4SAndroid Build Coastguard Worker         self.vcpu_transaction(&r)?;
1256*bb4ee6a4SAndroid Build Coastguard Worker         Ok(())
1257*bb4ee6a4SAndroid Build Coastguard Worker     }
1258*bb4ee6a4SAndroid Build Coastguard Worker 
set_state_from_cache( &mut self, state_set: vcpu_request::StateSet, ) -> result::Result<(), c_int>1259*bb4ee6a4SAndroid Build Coastguard Worker     fn set_state_from_cache(
1260*bb4ee6a4SAndroid Build Coastguard Worker         &mut self,
1261*bb4ee6a4SAndroid Build Coastguard Worker         state_set: vcpu_request::StateSet,
1262*bb4ee6a4SAndroid Build Coastguard Worker     ) -> result::Result<(), c_int> {
1263*bb4ee6a4SAndroid Build Coastguard Worker         let mut r = VcpuRequest::new();
1264*bb4ee6a4SAndroid Build Coastguard Worker         let set_state = r.mut_set_state();
1265*bb4ee6a4SAndroid Build Coastguard Worker         set_state.set = state_set.into();
1266*bb4ee6a4SAndroid Build Coastguard Worker         match state_set {
1267*bb4ee6a4SAndroid Build Coastguard Worker             vcpu_request::StateSet::REGS => {
1268*bb4ee6a4SAndroid Build Coastguard Worker                 swap(&mut set_state.state, &mut self.regs.cache);
1269*bb4ee6a4SAndroid Build Coastguard Worker                 self.regs.set = false;
1270*bb4ee6a4SAndroid Build Coastguard Worker             }
1271*bb4ee6a4SAndroid Build Coastguard Worker             vcpu_request::StateSet::SREGS => {
1272*bb4ee6a4SAndroid Build Coastguard Worker                 swap(&mut set_state.state, &mut self.sregs.cache);
1273*bb4ee6a4SAndroid Build Coastguard Worker                 self.sregs.set = false;
1274*bb4ee6a4SAndroid Build Coastguard Worker             }
1275*bb4ee6a4SAndroid Build Coastguard Worker             vcpu_request::StateSet::DEBUGREGS => {
1276*bb4ee6a4SAndroid Build Coastguard Worker                 swap(&mut set_state.state, &mut self.debugregs.cache);
1277*bb4ee6a4SAndroid Build Coastguard Worker                 self.debugregs.set = false;
1278*bb4ee6a4SAndroid Build Coastguard Worker             }
1279*bb4ee6a4SAndroid Build Coastguard Worker             _ => return Err(EINVAL),
1280*bb4ee6a4SAndroid Build Coastguard Worker         }
1281*bb4ee6a4SAndroid Build Coastguard Worker 
1282*bb4ee6a4SAndroid Build Coastguard Worker         self.vcpu_transaction(&r)?;
1283*bb4ee6a4SAndroid Build Coastguard Worker         Ok(())
1284*bb4ee6a4SAndroid Build Coastguard Worker     }
1285*bb4ee6a4SAndroid Build Coastguard Worker 
get_hyperv_cpuid( &mut self, cpuid_entries: &mut [kvm_cpuid_entry2], cpuid_count: &mut usize, ) -> result::Result<(), c_int>1286*bb4ee6a4SAndroid Build Coastguard Worker     fn get_hyperv_cpuid(
1287*bb4ee6a4SAndroid Build Coastguard Worker         &mut self,
1288*bb4ee6a4SAndroid Build Coastguard Worker         cpuid_entries: &mut [kvm_cpuid_entry2],
1289*bb4ee6a4SAndroid Build Coastguard Worker         cpuid_count: &mut usize,
1290*bb4ee6a4SAndroid Build Coastguard Worker     ) -> result::Result<(), c_int> {
1291*bb4ee6a4SAndroid Build Coastguard Worker         *cpuid_count = 0;
1292*bb4ee6a4SAndroid Build Coastguard Worker 
1293*bb4ee6a4SAndroid Build Coastguard Worker         let mut r = VcpuRequest::new();
1294*bb4ee6a4SAndroid Build Coastguard Worker         r.mut_get_hyperv_cpuid();
1295*bb4ee6a4SAndroid Build Coastguard Worker 
1296*bb4ee6a4SAndroid Build Coastguard Worker         let response = self.vcpu_transaction(&r)?;
1297*bb4ee6a4SAndroid Build Coastguard Worker         if !response.has_get_hyperv_cpuid() {
1298*bb4ee6a4SAndroid Build Coastguard Worker             return Err(EPROTO);
1299*bb4ee6a4SAndroid Build Coastguard Worker         }
1300*bb4ee6a4SAndroid Build Coastguard Worker 
1301*bb4ee6a4SAndroid Build Coastguard Worker         let hyperv_cpuids = response.get_hyperv_cpuid();
1302*bb4ee6a4SAndroid Build Coastguard Worker 
1303*bb4ee6a4SAndroid Build Coastguard Worker         *cpuid_count = hyperv_cpuids.entries.len();
1304*bb4ee6a4SAndroid Build Coastguard Worker         if *cpuid_count > cpuid_entries.len() {
1305*bb4ee6a4SAndroid Build Coastguard Worker             return Err(E2BIG);
1306*bb4ee6a4SAndroid Build Coastguard Worker         }
1307*bb4ee6a4SAndroid Build Coastguard Worker 
1308*bb4ee6a4SAndroid Build Coastguard Worker         for (proto_entry, kvm_entry) in hyperv_cpuids.entries.iter().zip(cpuid_entries.iter_mut()) {
1309*bb4ee6a4SAndroid Build Coastguard Worker             *kvm_entry = cpuid_proto_to_kvm(proto_entry);
1310*bb4ee6a4SAndroid Build Coastguard Worker         }
1311*bb4ee6a4SAndroid Build Coastguard Worker 
1312*bb4ee6a4SAndroid Build Coastguard Worker         Ok(())
1313*bb4ee6a4SAndroid Build Coastguard Worker     }
1314*bb4ee6a4SAndroid Build Coastguard Worker 
get_msrs( &mut self, msr_entries: &mut [kvm_msr_entry], msr_count: &mut usize, ) -> result::Result<(), c_int>1315*bb4ee6a4SAndroid Build Coastguard Worker     fn get_msrs(
1316*bb4ee6a4SAndroid Build Coastguard Worker         &mut self,
1317*bb4ee6a4SAndroid Build Coastguard Worker         msr_entries: &mut [kvm_msr_entry],
1318*bb4ee6a4SAndroid Build Coastguard Worker         msr_count: &mut usize,
1319*bb4ee6a4SAndroid Build Coastguard Worker     ) -> result::Result<(), c_int> {
1320*bb4ee6a4SAndroid Build Coastguard Worker         *msr_count = 0;
1321*bb4ee6a4SAndroid Build Coastguard Worker 
1322*bb4ee6a4SAndroid Build Coastguard Worker         let mut r = VcpuRequest::new();
1323*bb4ee6a4SAndroid Build Coastguard Worker         let entry_indices: &mut Vec<u32> = &mut r.mut_get_msrs().entry_indices;
1324*bb4ee6a4SAndroid Build Coastguard Worker         for entry in msr_entries.iter() {
1325*bb4ee6a4SAndroid Build Coastguard Worker             entry_indices.push(entry.index);
1326*bb4ee6a4SAndroid Build Coastguard Worker         }
1327*bb4ee6a4SAndroid Build Coastguard Worker 
1328*bb4ee6a4SAndroid Build Coastguard Worker         let response = self.vcpu_transaction(&r)?;
1329*bb4ee6a4SAndroid Build Coastguard Worker         if !response.has_get_msrs() {
1330*bb4ee6a4SAndroid Build Coastguard Worker             return Err(EPROTO);
1331*bb4ee6a4SAndroid Build Coastguard Worker         }
1332*bb4ee6a4SAndroid Build Coastguard Worker         let get_msrs = response.get_msrs();
1333*bb4ee6a4SAndroid Build Coastguard Worker         *msr_count = get_msrs.entry_data.len();
1334*bb4ee6a4SAndroid Build Coastguard Worker         if *msr_count > msr_entries.len() {
1335*bb4ee6a4SAndroid Build Coastguard Worker             return Err(E2BIG);
1336*bb4ee6a4SAndroid Build Coastguard Worker         }
1337*bb4ee6a4SAndroid Build Coastguard Worker         for (&msr_data, msr_entry) in get_msrs.entry_data.iter().zip(msr_entries) {
1338*bb4ee6a4SAndroid Build Coastguard Worker             msr_entry.data = msr_data;
1339*bb4ee6a4SAndroid Build Coastguard Worker         }
1340*bb4ee6a4SAndroid Build Coastguard Worker         Ok(())
1341*bb4ee6a4SAndroid Build Coastguard Worker     }
1342*bb4ee6a4SAndroid Build Coastguard Worker 
set_msrs(&mut self, msr_entries: &[kvm_msr_entry]) -> result::Result<(), c_int>1343*bb4ee6a4SAndroid Build Coastguard Worker     fn set_msrs(&mut self, msr_entries: &[kvm_msr_entry]) -> result::Result<(), c_int> {
1344*bb4ee6a4SAndroid Build Coastguard Worker         let mut r = VcpuRequest::new();
1345*bb4ee6a4SAndroid Build Coastguard Worker         let set_msrs_entries = &mut r.mut_set_msrs().entries;
1346*bb4ee6a4SAndroid Build Coastguard Worker         for msr_entry in msr_entries {
1347*bb4ee6a4SAndroid Build Coastguard Worker             let mut entry = vcpu_request::MsrEntry::new();
1348*bb4ee6a4SAndroid Build Coastguard Worker             entry.index = msr_entry.index;
1349*bb4ee6a4SAndroid Build Coastguard Worker             entry.data = msr_entry.data;
1350*bb4ee6a4SAndroid Build Coastguard Worker             set_msrs_entries.push(entry);
1351*bb4ee6a4SAndroid Build Coastguard Worker         }
1352*bb4ee6a4SAndroid Build Coastguard Worker 
1353*bb4ee6a4SAndroid Build Coastguard Worker         self.vcpu_transaction(&r)?;
1354*bb4ee6a4SAndroid Build Coastguard Worker         Ok(())
1355*bb4ee6a4SAndroid Build Coastguard Worker     }
1356*bb4ee6a4SAndroid Build Coastguard Worker 
set_cpuid(&mut self, cpuid_entries: &[kvm_cpuid_entry2]) -> result::Result<(), c_int>1357*bb4ee6a4SAndroid Build Coastguard Worker     fn set_cpuid(&mut self, cpuid_entries: &[kvm_cpuid_entry2]) -> result::Result<(), c_int> {
1358*bb4ee6a4SAndroid Build Coastguard Worker         let mut r = VcpuRequest::new();
1359*bb4ee6a4SAndroid Build Coastguard Worker         let set_cpuid_entries = &mut r.mut_set_cpuid().entries;
1360*bb4ee6a4SAndroid Build Coastguard Worker         for cpuid_entry in cpuid_entries {
1361*bb4ee6a4SAndroid Build Coastguard Worker             set_cpuid_entries.push(cpuid_kvm_to_proto(cpuid_entry));
1362*bb4ee6a4SAndroid Build Coastguard Worker         }
1363*bb4ee6a4SAndroid Build Coastguard Worker 
1364*bb4ee6a4SAndroid Build Coastguard Worker         self.vcpu_transaction(&r)?;
1365*bb4ee6a4SAndroid Build Coastguard Worker         Ok(())
1366*bb4ee6a4SAndroid Build Coastguard Worker     }
1367*bb4ee6a4SAndroid Build Coastguard Worker 
enable_capability(&mut self, capability: u32) -> result::Result<(), c_int>1368*bb4ee6a4SAndroid Build Coastguard Worker     fn enable_capability(&mut self, capability: u32) -> result::Result<(), c_int> {
1369*bb4ee6a4SAndroid Build Coastguard Worker         let mut r = VcpuRequest::new();
1370*bb4ee6a4SAndroid Build Coastguard Worker         r.mut_enable_capability().capability = capability;
1371*bb4ee6a4SAndroid Build Coastguard Worker         self.vcpu_transaction(&r)?;
1372*bb4ee6a4SAndroid Build Coastguard Worker         Ok(())
1373*bb4ee6a4SAndroid Build Coastguard Worker     }
1374*bb4ee6a4SAndroid Build Coastguard Worker }
1375*bb4ee6a4SAndroid Build Coastguard Worker 
1376*bb4ee6a4SAndroid Build Coastguard Worker // crosvm API signals success as 0 and errors as negative values
1377*bb4ee6a4SAndroid Build Coastguard Worker // derived from `errno`.
to_crosvm_rc<T>(r: result::Result<T, c_int>) -> c_int1378*bb4ee6a4SAndroid Build Coastguard Worker fn to_crosvm_rc<T>(r: result::Result<T, c_int>) -> c_int {
1379*bb4ee6a4SAndroid Build Coastguard Worker     match r {
1380*bb4ee6a4SAndroid Build Coastguard Worker         Ok(_) => 0,
1381*bb4ee6a4SAndroid Build Coastguard Worker         Err(e) => -e,
1382*bb4ee6a4SAndroid Build Coastguard Worker     }
1383*bb4ee6a4SAndroid Build Coastguard Worker }
1384*bb4ee6a4SAndroid Build Coastguard Worker 
1385*bb4ee6a4SAndroid Build Coastguard Worker #[no_mangle]
crosvm_connect(out: *mut *mut crosvm) -> c_int1386*bb4ee6a4SAndroid Build Coastguard Worker pub unsafe extern "C" fn crosvm_connect(out: *mut *mut crosvm) -> c_int {
1387*bb4ee6a4SAndroid Build Coastguard Worker     let _u = record(Stat::Connect);
1388*bb4ee6a4SAndroid Build Coastguard Worker     let socket_name = match env::var(CROSVM_SOCKET_ENV) {
1389*bb4ee6a4SAndroid Build Coastguard Worker         Ok(v) => v,
1390*bb4ee6a4SAndroid Build Coastguard Worker         _ => return -ENOTCONN,
1391*bb4ee6a4SAndroid Build Coastguard Worker     };
1392*bb4ee6a4SAndroid Build Coastguard Worker 
1393*bb4ee6a4SAndroid Build Coastguard Worker     let socket = match socket_name.parse() {
1394*bb4ee6a4SAndroid Build Coastguard Worker         Ok(v) if v < 0 => return -EINVAL,
1395*bb4ee6a4SAndroid Build Coastguard Worker         Ok(v) => v,
1396*bb4ee6a4SAndroid Build Coastguard Worker         _ => return -EINVAL,
1397*bb4ee6a4SAndroid Build Coastguard Worker     };
1398*bb4ee6a4SAndroid Build Coastguard Worker 
1399*bb4ee6a4SAndroid Build Coastguard Worker     let socket = UnixDatagram::from_raw_fd(socket);
1400*bb4ee6a4SAndroid Build Coastguard Worker     let crosvm = match crosvm::from_connection(socket) {
1401*bb4ee6a4SAndroid Build Coastguard Worker         Ok(c) => c,
1402*bb4ee6a4SAndroid Build Coastguard Worker         Err(e) => return -e,
1403*bb4ee6a4SAndroid Build Coastguard Worker     };
1404*bb4ee6a4SAndroid Build Coastguard Worker     *out = Box::into_raw(Box::new(crosvm));
1405*bb4ee6a4SAndroid Build Coastguard Worker     0
1406*bb4ee6a4SAndroid Build Coastguard Worker }
1407*bb4ee6a4SAndroid Build Coastguard Worker 
1408*bb4ee6a4SAndroid Build Coastguard Worker #[no_mangle]
crosvm_new_connection(self_: *mut crosvm, out: *mut *mut crosvm) -> c_int1409*bb4ee6a4SAndroid Build Coastguard Worker pub unsafe extern "C" fn crosvm_new_connection(self_: *mut crosvm, out: *mut *mut crosvm) -> c_int {
1410*bb4ee6a4SAndroid Build Coastguard Worker     let _u = record(Stat::NewConnection);
1411*bb4ee6a4SAndroid Build Coastguard Worker     let self_ = &mut (*self_);
1412*bb4ee6a4SAndroid Build Coastguard Worker     match self_.try_clone() {
1413*bb4ee6a4SAndroid Build Coastguard Worker         Ok(cloned) => {
1414*bb4ee6a4SAndroid Build Coastguard Worker             *out = Box::into_raw(Box::new(cloned));
1415*bb4ee6a4SAndroid Build Coastguard Worker             0
1416*bb4ee6a4SAndroid Build Coastguard Worker         }
1417*bb4ee6a4SAndroid Build Coastguard Worker         Err(e) => -e,
1418*bb4ee6a4SAndroid Build Coastguard Worker     }
1419*bb4ee6a4SAndroid Build Coastguard Worker }
1420*bb4ee6a4SAndroid Build Coastguard Worker 
1421*bb4ee6a4SAndroid Build Coastguard Worker #[no_mangle]
crosvm_destroy_connection(self_: *mut *mut crosvm) -> c_int1422*bb4ee6a4SAndroid Build Coastguard Worker pub unsafe extern "C" fn crosvm_destroy_connection(self_: *mut *mut crosvm) -> c_int {
1423*bb4ee6a4SAndroid Build Coastguard Worker     let _u = record(Stat::DestroyConnection);
1424*bb4ee6a4SAndroid Build Coastguard Worker     drop(Box::from_raw(*self_));
1425*bb4ee6a4SAndroid Build Coastguard Worker     *self_ = null_mut();
1426*bb4ee6a4SAndroid Build Coastguard Worker     0
1427*bb4ee6a4SAndroid Build Coastguard Worker }
1428*bb4ee6a4SAndroid Build Coastguard Worker 
1429*bb4ee6a4SAndroid Build Coastguard Worker #[no_mangle]
crosvm_get_shutdown_eventfd(self_: *mut crosvm) -> c_int1430*bb4ee6a4SAndroid Build Coastguard Worker pub unsafe extern "C" fn crosvm_get_shutdown_eventfd(self_: *mut crosvm) -> c_int {
1431*bb4ee6a4SAndroid Build Coastguard Worker     let _u = record(Stat::GetShutdownEvent);
1432*bb4ee6a4SAndroid Build Coastguard Worker     let self_ = &mut (*self_);
1433*bb4ee6a4SAndroid Build Coastguard Worker     match self_.get_shutdown_event() {
1434*bb4ee6a4SAndroid Build Coastguard Worker         Ok(f) => f.into_raw_fd(),
1435*bb4ee6a4SAndroid Build Coastguard Worker         Err(e) => -e,
1436*bb4ee6a4SAndroid Build Coastguard Worker     }
1437*bb4ee6a4SAndroid Build Coastguard Worker }
1438*bb4ee6a4SAndroid Build Coastguard Worker 
1439*bb4ee6a4SAndroid Build Coastguard Worker #[no_mangle]
crosvm_check_extension( self_: *mut crosvm, extension: u32, has_extension: *mut bool, ) -> c_int1440*bb4ee6a4SAndroid Build Coastguard Worker pub unsafe extern "C" fn crosvm_check_extension(
1441*bb4ee6a4SAndroid Build Coastguard Worker     self_: *mut crosvm,
1442*bb4ee6a4SAndroid Build Coastguard Worker     extension: u32,
1443*bb4ee6a4SAndroid Build Coastguard Worker     has_extension: *mut bool,
1444*bb4ee6a4SAndroid Build Coastguard Worker ) -> c_int {
1445*bb4ee6a4SAndroid Build Coastguard Worker     let _u = record(Stat::CheckExtentsion);
1446*bb4ee6a4SAndroid Build Coastguard Worker     let self_ = &mut (*self_);
1447*bb4ee6a4SAndroid Build Coastguard Worker     let ret = self_.check_extension(extension);
1448*bb4ee6a4SAndroid Build Coastguard Worker 
1449*bb4ee6a4SAndroid Build Coastguard Worker     if let Ok(supported) = ret {
1450*bb4ee6a4SAndroid Build Coastguard Worker         *has_extension = supported;
1451*bb4ee6a4SAndroid Build Coastguard Worker     }
1452*bb4ee6a4SAndroid Build Coastguard Worker     to_crosvm_rc(ret)
1453*bb4ee6a4SAndroid Build Coastguard Worker }
1454*bb4ee6a4SAndroid Build Coastguard Worker 
1455*bb4ee6a4SAndroid Build Coastguard Worker #[no_mangle]
crosvm_enable_capability( _self_: *mut crosvm, _capability: u32, _flags: u32, _args: *const u64, ) -> c_int1456*bb4ee6a4SAndroid Build Coastguard Worker pub unsafe extern "C" fn crosvm_enable_capability(
1457*bb4ee6a4SAndroid Build Coastguard Worker     _self_: *mut crosvm,
1458*bb4ee6a4SAndroid Build Coastguard Worker     _capability: u32,
1459*bb4ee6a4SAndroid Build Coastguard Worker     _flags: u32,
1460*bb4ee6a4SAndroid Build Coastguard Worker     _args: *const u64,
1461*bb4ee6a4SAndroid Build Coastguard Worker ) -> c_int {
1462*bb4ee6a4SAndroid Build Coastguard Worker     let _u = record(Stat::EnableVmCapability);
1463*bb4ee6a4SAndroid Build Coastguard Worker     -EINVAL
1464*bb4ee6a4SAndroid Build Coastguard Worker }
1465*bb4ee6a4SAndroid Build Coastguard Worker 
1466*bb4ee6a4SAndroid Build Coastguard Worker #[no_mangle]
crosvm_get_supported_cpuid( this: *mut crosvm, entry_count: u32, cpuid_entries: *mut kvm_cpuid_entry2, out_count: *mut u32, ) -> c_int1467*bb4ee6a4SAndroid Build Coastguard Worker pub unsafe extern "C" fn crosvm_get_supported_cpuid(
1468*bb4ee6a4SAndroid Build Coastguard Worker     this: *mut crosvm,
1469*bb4ee6a4SAndroid Build Coastguard Worker     entry_count: u32,
1470*bb4ee6a4SAndroid Build Coastguard Worker     cpuid_entries: *mut kvm_cpuid_entry2,
1471*bb4ee6a4SAndroid Build Coastguard Worker     out_count: *mut u32,
1472*bb4ee6a4SAndroid Build Coastguard Worker ) -> c_int {
1473*bb4ee6a4SAndroid Build Coastguard Worker     let _u = record(Stat::GetSupportedCpuid);
1474*bb4ee6a4SAndroid Build Coastguard Worker     let this = &mut *this;
1475*bb4ee6a4SAndroid Build Coastguard Worker     let cpuid_entries = from_raw_parts_mut(cpuid_entries, entry_count as usize);
1476*bb4ee6a4SAndroid Build Coastguard Worker     let mut cpuid_count: usize = 0;
1477*bb4ee6a4SAndroid Build Coastguard Worker     let ret = this.get_supported_cpuid(cpuid_entries, &mut cpuid_count);
1478*bb4ee6a4SAndroid Build Coastguard Worker     *out_count = cpuid_count as u32;
1479*bb4ee6a4SAndroid Build Coastguard Worker     to_crosvm_rc(ret)
1480*bb4ee6a4SAndroid Build Coastguard Worker }
1481*bb4ee6a4SAndroid Build Coastguard Worker 
1482*bb4ee6a4SAndroid Build Coastguard Worker #[no_mangle]
crosvm_get_emulated_cpuid( this: *mut crosvm, entry_count: u32, cpuid_entries: *mut kvm_cpuid_entry2, out_count: *mut u32, ) -> c_int1483*bb4ee6a4SAndroid Build Coastguard Worker pub unsafe extern "C" fn crosvm_get_emulated_cpuid(
1484*bb4ee6a4SAndroid Build Coastguard Worker     this: *mut crosvm,
1485*bb4ee6a4SAndroid Build Coastguard Worker     entry_count: u32,
1486*bb4ee6a4SAndroid Build Coastguard Worker     cpuid_entries: *mut kvm_cpuid_entry2,
1487*bb4ee6a4SAndroid Build Coastguard Worker     out_count: *mut u32,
1488*bb4ee6a4SAndroid Build Coastguard Worker ) -> c_int {
1489*bb4ee6a4SAndroid Build Coastguard Worker     let _u = record(Stat::GetEmulatedCpuid);
1490*bb4ee6a4SAndroid Build Coastguard Worker     let this = &mut *this;
1491*bb4ee6a4SAndroid Build Coastguard Worker     let cpuid_entries = from_raw_parts_mut(cpuid_entries, entry_count as usize);
1492*bb4ee6a4SAndroid Build Coastguard Worker     let mut cpuid_count: usize = 0;
1493*bb4ee6a4SAndroid Build Coastguard Worker     let ret = this.get_emulated_cpuid(cpuid_entries, &mut cpuid_count);
1494*bb4ee6a4SAndroid Build Coastguard Worker     *out_count = cpuid_count as u32;
1495*bb4ee6a4SAndroid Build Coastguard Worker     to_crosvm_rc(ret)
1496*bb4ee6a4SAndroid Build Coastguard Worker }
1497*bb4ee6a4SAndroid Build Coastguard Worker 
1498*bb4ee6a4SAndroid Build Coastguard Worker #[no_mangle]
crosvm_get_msr_index_list( this: *mut crosvm, entry_count: u32, msr_indices: *mut u32, out_count: *mut u32, ) -> c_int1499*bb4ee6a4SAndroid Build Coastguard Worker pub unsafe extern "C" fn crosvm_get_msr_index_list(
1500*bb4ee6a4SAndroid Build Coastguard Worker     this: *mut crosvm,
1501*bb4ee6a4SAndroid Build Coastguard Worker     entry_count: u32,
1502*bb4ee6a4SAndroid Build Coastguard Worker     msr_indices: *mut u32,
1503*bb4ee6a4SAndroid Build Coastguard Worker     out_count: *mut u32,
1504*bb4ee6a4SAndroid Build Coastguard Worker ) -> c_int {
1505*bb4ee6a4SAndroid Build Coastguard Worker     let _u = record(Stat::GetMsrIndexList);
1506*bb4ee6a4SAndroid Build Coastguard Worker     let this = &mut *this;
1507*bb4ee6a4SAndroid Build Coastguard Worker     let msr_indices = from_raw_parts_mut(msr_indices, entry_count as usize);
1508*bb4ee6a4SAndroid Build Coastguard Worker     let mut msr_count: usize = 0;
1509*bb4ee6a4SAndroid Build Coastguard Worker     let ret = this.get_msr_index_list(msr_indices, &mut msr_count);
1510*bb4ee6a4SAndroid Build Coastguard Worker     *out_count = msr_count as u32;
1511*bb4ee6a4SAndroid Build Coastguard Worker     to_crosvm_rc(ret)
1512*bb4ee6a4SAndroid Build Coastguard Worker }
1513*bb4ee6a4SAndroid Build Coastguard Worker 
1514*bb4ee6a4SAndroid Build Coastguard Worker #[no_mangle]
crosvm_net_get_config( self_: *mut crosvm, config: *mut crosvm_net_config, ) -> c_int1515*bb4ee6a4SAndroid Build Coastguard Worker pub unsafe extern "C" fn crosvm_net_get_config(
1516*bb4ee6a4SAndroid Build Coastguard Worker     self_: *mut crosvm,
1517*bb4ee6a4SAndroid Build Coastguard Worker     config: *mut crosvm_net_config,
1518*bb4ee6a4SAndroid Build Coastguard Worker ) -> c_int {
1519*bb4ee6a4SAndroid Build Coastguard Worker     let _u = record(Stat::NetGetConfig);
1520*bb4ee6a4SAndroid Build Coastguard Worker     let self_ = &mut (*self_);
1521*bb4ee6a4SAndroid Build Coastguard Worker     let ret = self_.get_net_config();
1522*bb4ee6a4SAndroid Build Coastguard Worker 
1523*bb4ee6a4SAndroid Build Coastguard Worker     if let Ok(c) = ret {
1524*bb4ee6a4SAndroid Build Coastguard Worker         *config = c;
1525*bb4ee6a4SAndroid Build Coastguard Worker     }
1526*bb4ee6a4SAndroid Build Coastguard Worker 
1527*bb4ee6a4SAndroid Build Coastguard Worker     to_crosvm_rc(ret)
1528*bb4ee6a4SAndroid Build Coastguard Worker }
1529*bb4ee6a4SAndroid Build Coastguard Worker 
1530*bb4ee6a4SAndroid Build Coastguard Worker #[no_mangle]
crosvm_reserve_range( self_: *mut crosvm, space: u32, start: u64, length: u64, ) -> c_int1531*bb4ee6a4SAndroid Build Coastguard Worker pub unsafe extern "C" fn crosvm_reserve_range(
1532*bb4ee6a4SAndroid Build Coastguard Worker     self_: *mut crosvm,
1533*bb4ee6a4SAndroid Build Coastguard Worker     space: u32,
1534*bb4ee6a4SAndroid Build Coastguard Worker     start: u64,
1535*bb4ee6a4SAndroid Build Coastguard Worker     length: u64,
1536*bb4ee6a4SAndroid Build Coastguard Worker ) -> c_int {
1537*bb4ee6a4SAndroid Build Coastguard Worker     let _u = record(Stat::ReserveRange);
1538*bb4ee6a4SAndroid Build Coastguard Worker     let self_ = &mut (*self_);
1539*bb4ee6a4SAndroid Build Coastguard Worker     let ret = self_.reserve_range(space, start, length, false);
1540*bb4ee6a4SAndroid Build Coastguard Worker     to_crosvm_rc(ret)
1541*bb4ee6a4SAndroid Build Coastguard Worker }
1542*bb4ee6a4SAndroid Build Coastguard Worker 
1543*bb4ee6a4SAndroid Build Coastguard Worker #[no_mangle]
crosvm_reserve_async_write_range( self_: *mut crosvm, space: u32, start: u64, length: u64, ) -> c_int1544*bb4ee6a4SAndroid Build Coastguard Worker pub unsafe extern "C" fn crosvm_reserve_async_write_range(
1545*bb4ee6a4SAndroid Build Coastguard Worker     self_: *mut crosvm,
1546*bb4ee6a4SAndroid Build Coastguard Worker     space: u32,
1547*bb4ee6a4SAndroid Build Coastguard Worker     start: u64,
1548*bb4ee6a4SAndroid Build Coastguard Worker     length: u64,
1549*bb4ee6a4SAndroid Build Coastguard Worker ) -> c_int {
1550*bb4ee6a4SAndroid Build Coastguard Worker     let _u = record(Stat::ReserveAsyncWriteRange);
1551*bb4ee6a4SAndroid Build Coastguard Worker     let self_ = &mut (*self_);
1552*bb4ee6a4SAndroid Build Coastguard Worker     let ret = self_.reserve_range(space, start, length, true);
1553*bb4ee6a4SAndroid Build Coastguard Worker     to_crosvm_rc(ret)
1554*bb4ee6a4SAndroid Build Coastguard Worker }
1555*bb4ee6a4SAndroid Build Coastguard Worker 
1556*bb4ee6a4SAndroid Build Coastguard Worker #[no_mangle]
crosvm_set_irq(self_: *mut crosvm, irq_id: u32, active: bool) -> c_int1557*bb4ee6a4SAndroid Build Coastguard Worker pub unsafe extern "C" fn crosvm_set_irq(self_: *mut crosvm, irq_id: u32, active: bool) -> c_int {
1558*bb4ee6a4SAndroid Build Coastguard Worker     let _u = record(Stat::SetIrq);
1559*bb4ee6a4SAndroid Build Coastguard Worker     let self_ = &mut (*self_);
1560*bb4ee6a4SAndroid Build Coastguard Worker     let ret = self_.set_irq(irq_id, active);
1561*bb4ee6a4SAndroid Build Coastguard Worker     to_crosvm_rc(ret)
1562*bb4ee6a4SAndroid Build Coastguard Worker }
1563*bb4ee6a4SAndroid Build Coastguard Worker 
1564*bb4ee6a4SAndroid Build Coastguard Worker #[no_mangle]
crosvm_set_irq_routing( self_: *mut crosvm, route_count: u32, routes: *const crosvm_irq_route, ) -> c_int1565*bb4ee6a4SAndroid Build Coastguard Worker pub unsafe extern "C" fn crosvm_set_irq_routing(
1566*bb4ee6a4SAndroid Build Coastguard Worker     self_: *mut crosvm,
1567*bb4ee6a4SAndroid Build Coastguard Worker     route_count: u32,
1568*bb4ee6a4SAndroid Build Coastguard Worker     routes: *const crosvm_irq_route,
1569*bb4ee6a4SAndroid Build Coastguard Worker ) -> c_int {
1570*bb4ee6a4SAndroid Build Coastguard Worker     let _u = record(Stat::SetIrqRouting);
1571*bb4ee6a4SAndroid Build Coastguard Worker     let self_ = &mut (*self_);
1572*bb4ee6a4SAndroid Build Coastguard Worker     let ret = self_.set_irq_routing(slice::from_raw_parts(routes, route_count as usize));
1573*bb4ee6a4SAndroid Build Coastguard Worker     to_crosvm_rc(ret)
1574*bb4ee6a4SAndroid Build Coastguard Worker }
1575*bb4ee6a4SAndroid Build Coastguard Worker 
1576*bb4ee6a4SAndroid Build Coastguard Worker #[no_mangle]
crosvm_set_hypercall_hint( self_: *mut crosvm, hints_count: u32, hints: *const crosvm_hint, ) -> c_int1577*bb4ee6a4SAndroid Build Coastguard Worker pub unsafe extern "C" fn crosvm_set_hypercall_hint(
1578*bb4ee6a4SAndroid Build Coastguard Worker     self_: *mut crosvm,
1579*bb4ee6a4SAndroid Build Coastguard Worker     hints_count: u32,
1580*bb4ee6a4SAndroid Build Coastguard Worker     hints: *const crosvm_hint,
1581*bb4ee6a4SAndroid Build Coastguard Worker ) -> c_int {
1582*bb4ee6a4SAndroid Build Coastguard Worker     let _u = record(Stat::SetHypercallHint);
1583*bb4ee6a4SAndroid Build Coastguard Worker     let self_ = &mut (*self_);
1584*bb4ee6a4SAndroid Build Coastguard Worker 
1585*bb4ee6a4SAndroid Build Coastguard Worker     if hints_count < 1 {
1586*bb4ee6a4SAndroid Build Coastguard Worker         let ret = self_.set_hint(0, 0, false, &[]);
1587*bb4ee6a4SAndroid Build Coastguard Worker         return to_crosvm_rc(ret);
1588*bb4ee6a4SAndroid Build Coastguard Worker     }
1589*bb4ee6a4SAndroid Build Coastguard Worker     if hints_count > CROSVM_MAX_HINT_COUNT {
1590*bb4ee6a4SAndroid Build Coastguard Worker         return -EINVAL;
1591*bb4ee6a4SAndroid Build Coastguard Worker     }
1592*bb4ee6a4SAndroid Build Coastguard Worker     let hints = slice::from_raw_parts(hints, hints_count as usize);
1593*bb4ee6a4SAndroid Build Coastguard Worker     let hint = &hints[0];
1594*bb4ee6a4SAndroid Build Coastguard Worker     if hint.hint_version != 0
1595*bb4ee6a4SAndroid Build Coastguard Worker         || hint.reserved != 0
1596*bb4ee6a4SAndroid Build Coastguard Worker         || hint.address == 0
1597*bb4ee6a4SAndroid Build Coastguard Worker         || (hint.address_flags != 0 && hint.address_flags != CROSVM_HINT_ON_WRITE)
1598*bb4ee6a4SAndroid Build Coastguard Worker         || hint.details_count > CROSVM_MAX_HINT_DETAIL_COUNT as u16
1599*bb4ee6a4SAndroid Build Coastguard Worker     {
1600*bb4ee6a4SAndroid Build Coastguard Worker         return -EINVAL;
1601*bb4ee6a4SAndroid Build Coastguard Worker     }
1602*bb4ee6a4SAndroid Build Coastguard Worker     let ret = self_.set_hint(
1603*bb4ee6a4SAndroid Build Coastguard Worker         hint.address_space,
1604*bb4ee6a4SAndroid Build Coastguard Worker         hint.address,
1605*bb4ee6a4SAndroid Build Coastguard Worker         hint.address_flags == CROSVM_HINT_ON_WRITE,
1606*bb4ee6a4SAndroid Build Coastguard Worker         slice::from_raw_parts(hint.details, hint.details_count as usize),
1607*bb4ee6a4SAndroid Build Coastguard Worker     );
1608*bb4ee6a4SAndroid Build Coastguard Worker     to_crosvm_rc(ret)
1609*bb4ee6a4SAndroid Build Coastguard Worker }
1610*bb4ee6a4SAndroid Build Coastguard Worker 
1611*bb4ee6a4SAndroid Build Coastguard Worker #[no_mangle]
crosvm_get_pic_state( this: *mut crosvm, primary: bool, state: *mut kvm_pic_state, ) -> c_int1612*bb4ee6a4SAndroid Build Coastguard Worker pub unsafe extern "C" fn crosvm_get_pic_state(
1613*bb4ee6a4SAndroid Build Coastguard Worker     this: *mut crosvm,
1614*bb4ee6a4SAndroid Build Coastguard Worker     primary: bool,
1615*bb4ee6a4SAndroid Build Coastguard Worker     state: *mut kvm_pic_state,
1616*bb4ee6a4SAndroid Build Coastguard Worker ) -> c_int {
1617*bb4ee6a4SAndroid Build Coastguard Worker     let _u = record(Stat::GetPicState);
1618*bb4ee6a4SAndroid Build Coastguard Worker     let this = &mut *this;
1619*bb4ee6a4SAndroid Build Coastguard Worker     let state_set = if primary {
1620*bb4ee6a4SAndroid Build Coastguard Worker         main_request::StateSet::PIC0
1621*bb4ee6a4SAndroid Build Coastguard Worker     } else {
1622*bb4ee6a4SAndroid Build Coastguard Worker         main_request::StateSet::PIC1
1623*bb4ee6a4SAndroid Build Coastguard Worker     };
1624*bb4ee6a4SAndroid Build Coastguard Worker     let state = from_raw_parts_mut(state as *mut u8, size_of::<kvm_pic_state>());
1625*bb4ee6a4SAndroid Build Coastguard Worker     let ret = this.get_state(state_set, state);
1626*bb4ee6a4SAndroid Build Coastguard Worker     to_crosvm_rc(ret)
1627*bb4ee6a4SAndroid Build Coastguard Worker }
1628*bb4ee6a4SAndroid Build Coastguard Worker 
1629*bb4ee6a4SAndroid Build Coastguard Worker #[no_mangle]
crosvm_set_pic_state( this: *mut crosvm, primary: bool, state: *mut kvm_pic_state, ) -> c_int1630*bb4ee6a4SAndroid Build Coastguard Worker pub unsafe extern "C" fn crosvm_set_pic_state(
1631*bb4ee6a4SAndroid Build Coastguard Worker     this: *mut crosvm,
1632*bb4ee6a4SAndroid Build Coastguard Worker     primary: bool,
1633*bb4ee6a4SAndroid Build Coastguard Worker     state: *mut kvm_pic_state,
1634*bb4ee6a4SAndroid Build Coastguard Worker ) -> c_int {
1635*bb4ee6a4SAndroid Build Coastguard Worker     let _u = record(Stat::SetPicState);
1636*bb4ee6a4SAndroid Build Coastguard Worker     let this = &mut *this;
1637*bb4ee6a4SAndroid Build Coastguard Worker     let state_set = if primary {
1638*bb4ee6a4SAndroid Build Coastguard Worker         main_request::StateSet::PIC0
1639*bb4ee6a4SAndroid Build Coastguard Worker     } else {
1640*bb4ee6a4SAndroid Build Coastguard Worker         main_request::StateSet::PIC1
1641*bb4ee6a4SAndroid Build Coastguard Worker     };
1642*bb4ee6a4SAndroid Build Coastguard Worker     let state = from_raw_parts(state as *mut u8, size_of::<kvm_pic_state>());
1643*bb4ee6a4SAndroid Build Coastguard Worker     let ret = this.set_state(state_set, state);
1644*bb4ee6a4SAndroid Build Coastguard Worker     to_crosvm_rc(ret)
1645*bb4ee6a4SAndroid Build Coastguard Worker }
1646*bb4ee6a4SAndroid Build Coastguard Worker 
1647*bb4ee6a4SAndroid Build Coastguard Worker #[no_mangle]
crosvm_get_ioapic_state( this: *mut crosvm, state: *mut kvm_ioapic_state, ) -> c_int1648*bb4ee6a4SAndroid Build Coastguard Worker pub unsafe extern "C" fn crosvm_get_ioapic_state(
1649*bb4ee6a4SAndroid Build Coastguard Worker     this: *mut crosvm,
1650*bb4ee6a4SAndroid Build Coastguard Worker     state: *mut kvm_ioapic_state,
1651*bb4ee6a4SAndroid Build Coastguard Worker ) -> c_int {
1652*bb4ee6a4SAndroid Build Coastguard Worker     let _u = record(Stat::GetIoapicState);
1653*bb4ee6a4SAndroid Build Coastguard Worker     let this = &mut *this;
1654*bb4ee6a4SAndroid Build Coastguard Worker     let state = from_raw_parts_mut(state as *mut u8, size_of::<kvm_ioapic_state>());
1655*bb4ee6a4SAndroid Build Coastguard Worker     let ret = this.get_state(main_request::StateSet::IOAPIC, state);
1656*bb4ee6a4SAndroid Build Coastguard Worker     to_crosvm_rc(ret)
1657*bb4ee6a4SAndroid Build Coastguard Worker }
1658*bb4ee6a4SAndroid Build Coastguard Worker 
1659*bb4ee6a4SAndroid Build Coastguard Worker #[no_mangle]
crosvm_set_ioapic_state( this: *mut crosvm, state: *const kvm_ioapic_state, ) -> c_int1660*bb4ee6a4SAndroid Build Coastguard Worker pub unsafe extern "C" fn crosvm_set_ioapic_state(
1661*bb4ee6a4SAndroid Build Coastguard Worker     this: *mut crosvm,
1662*bb4ee6a4SAndroid Build Coastguard Worker     state: *const kvm_ioapic_state,
1663*bb4ee6a4SAndroid Build Coastguard Worker ) -> c_int {
1664*bb4ee6a4SAndroid Build Coastguard Worker     let _u = record(Stat::SetIoapicState);
1665*bb4ee6a4SAndroid Build Coastguard Worker     let this = &mut *this;
1666*bb4ee6a4SAndroid Build Coastguard Worker     let state = from_raw_parts(state as *mut u8, size_of::<kvm_ioapic_state>());
1667*bb4ee6a4SAndroid Build Coastguard Worker     let ret = this.set_state(main_request::StateSet::IOAPIC, state);
1668*bb4ee6a4SAndroid Build Coastguard Worker     to_crosvm_rc(ret)
1669*bb4ee6a4SAndroid Build Coastguard Worker }
1670*bb4ee6a4SAndroid Build Coastguard Worker 
1671*bb4ee6a4SAndroid Build Coastguard Worker #[no_mangle]
crosvm_get_pit_state( this: *mut crosvm, state: *mut kvm_pit_state2, ) -> c_int1672*bb4ee6a4SAndroid Build Coastguard Worker pub unsafe extern "C" fn crosvm_get_pit_state(
1673*bb4ee6a4SAndroid Build Coastguard Worker     this: *mut crosvm,
1674*bb4ee6a4SAndroid Build Coastguard Worker     state: *mut kvm_pit_state2,
1675*bb4ee6a4SAndroid Build Coastguard Worker ) -> c_int {
1676*bb4ee6a4SAndroid Build Coastguard Worker     let _u = record(Stat::GetPitState);
1677*bb4ee6a4SAndroid Build Coastguard Worker     let this = &mut *this;
1678*bb4ee6a4SAndroid Build Coastguard Worker     let state = from_raw_parts_mut(state as *mut u8, size_of::<kvm_pit_state2>());
1679*bb4ee6a4SAndroid Build Coastguard Worker     let ret = this.get_state(main_request::StateSet::PIT, state);
1680*bb4ee6a4SAndroid Build Coastguard Worker     to_crosvm_rc(ret)
1681*bb4ee6a4SAndroid Build Coastguard Worker }
1682*bb4ee6a4SAndroid Build Coastguard Worker 
1683*bb4ee6a4SAndroid Build Coastguard Worker #[no_mangle]
crosvm_set_pit_state( this: *mut crosvm, state: *const kvm_pit_state2, ) -> c_int1684*bb4ee6a4SAndroid Build Coastguard Worker pub unsafe extern "C" fn crosvm_set_pit_state(
1685*bb4ee6a4SAndroid Build Coastguard Worker     this: *mut crosvm,
1686*bb4ee6a4SAndroid Build Coastguard Worker     state: *const kvm_pit_state2,
1687*bb4ee6a4SAndroid Build Coastguard Worker ) -> c_int {
1688*bb4ee6a4SAndroid Build Coastguard Worker     let _u = record(Stat::SetPitState);
1689*bb4ee6a4SAndroid Build Coastguard Worker     let this = &mut *this;
1690*bb4ee6a4SAndroid Build Coastguard Worker     let state = from_raw_parts(state as *mut u8, size_of::<kvm_pit_state2>());
1691*bb4ee6a4SAndroid Build Coastguard Worker     let ret = this.set_state(main_request::StateSet::PIT, state);
1692*bb4ee6a4SAndroid Build Coastguard Worker     to_crosvm_rc(ret)
1693*bb4ee6a4SAndroid Build Coastguard Worker }
1694*bb4ee6a4SAndroid Build Coastguard Worker 
1695*bb4ee6a4SAndroid Build Coastguard Worker #[no_mangle]
crosvm_get_clock( this: *mut crosvm, clock_data: *mut kvm_clock_data, ) -> c_int1696*bb4ee6a4SAndroid Build Coastguard Worker pub unsafe extern "C" fn crosvm_get_clock(
1697*bb4ee6a4SAndroid Build Coastguard Worker     this: *mut crosvm,
1698*bb4ee6a4SAndroid Build Coastguard Worker     clock_data: *mut kvm_clock_data,
1699*bb4ee6a4SAndroid Build Coastguard Worker ) -> c_int {
1700*bb4ee6a4SAndroid Build Coastguard Worker     let _u = record(Stat::GetClock);
1701*bb4ee6a4SAndroid Build Coastguard Worker     let this = &mut *this;
1702*bb4ee6a4SAndroid Build Coastguard Worker     let state = from_raw_parts_mut(clock_data as *mut u8, size_of::<kvm_clock_data>());
1703*bb4ee6a4SAndroid Build Coastguard Worker     let ret = this.get_state(main_request::StateSet::CLOCK, state);
1704*bb4ee6a4SAndroid Build Coastguard Worker     to_crosvm_rc(ret)
1705*bb4ee6a4SAndroid Build Coastguard Worker }
1706*bb4ee6a4SAndroid Build Coastguard Worker 
1707*bb4ee6a4SAndroid Build Coastguard Worker #[no_mangle]
crosvm_set_clock( this: *mut crosvm, clock_data: *const kvm_clock_data, ) -> c_int1708*bb4ee6a4SAndroid Build Coastguard Worker pub unsafe extern "C" fn crosvm_set_clock(
1709*bb4ee6a4SAndroid Build Coastguard Worker     this: *mut crosvm,
1710*bb4ee6a4SAndroid Build Coastguard Worker     clock_data: *const kvm_clock_data,
1711*bb4ee6a4SAndroid Build Coastguard Worker ) -> c_int {
1712*bb4ee6a4SAndroid Build Coastguard Worker     let _u = record(Stat::SetClock);
1713*bb4ee6a4SAndroid Build Coastguard Worker     let this = &mut *this;
1714*bb4ee6a4SAndroid Build Coastguard Worker     let state = from_raw_parts(clock_data as *mut u8, size_of::<kvm_clock_data>());
1715*bb4ee6a4SAndroid Build Coastguard Worker     let ret = this.set_state(main_request::StateSet::CLOCK, state);
1716*bb4ee6a4SAndroid Build Coastguard Worker     to_crosvm_rc(ret)
1717*bb4ee6a4SAndroid Build Coastguard Worker }
1718*bb4ee6a4SAndroid Build Coastguard Worker 
1719*bb4ee6a4SAndroid Build Coastguard Worker #[no_mangle]
crosvm_set_identity_map_addr(self_: *mut crosvm, addr: u32) -> c_int1720*bb4ee6a4SAndroid Build Coastguard Worker pub unsafe extern "C" fn crosvm_set_identity_map_addr(self_: *mut crosvm, addr: u32) -> c_int {
1721*bb4ee6a4SAndroid Build Coastguard Worker     let _u = record(Stat::SetIdentityMapAddr);
1722*bb4ee6a4SAndroid Build Coastguard Worker     let self_ = &mut (*self_);
1723*bb4ee6a4SAndroid Build Coastguard Worker     let ret = self_.set_identity_map_addr(addr);
1724*bb4ee6a4SAndroid Build Coastguard Worker     to_crosvm_rc(ret)
1725*bb4ee6a4SAndroid Build Coastguard Worker }
1726*bb4ee6a4SAndroid Build Coastguard Worker 
1727*bb4ee6a4SAndroid Build Coastguard Worker #[no_mangle]
crosvm_pause_vcpus( self_: *mut crosvm, cpu_mask: u64, user: *mut c_void, ) -> c_int1728*bb4ee6a4SAndroid Build Coastguard Worker pub unsafe extern "C" fn crosvm_pause_vcpus(
1729*bb4ee6a4SAndroid Build Coastguard Worker     self_: *mut crosvm,
1730*bb4ee6a4SAndroid Build Coastguard Worker     cpu_mask: u64,
1731*bb4ee6a4SAndroid Build Coastguard Worker     user: *mut c_void,
1732*bb4ee6a4SAndroid Build Coastguard Worker ) -> c_int {
1733*bb4ee6a4SAndroid Build Coastguard Worker     let _u = record(Stat::PauseVcpus);
1734*bb4ee6a4SAndroid Build Coastguard Worker     let self_ = &mut (*self_);
1735*bb4ee6a4SAndroid Build Coastguard Worker     let ret = self_.pause_vcpus(cpu_mask, user);
1736*bb4ee6a4SAndroid Build Coastguard Worker     to_crosvm_rc(ret)
1737*bb4ee6a4SAndroid Build Coastguard Worker }
1738*bb4ee6a4SAndroid Build Coastguard Worker 
1739*bb4ee6a4SAndroid Build Coastguard Worker #[no_mangle]
crosvm_start(self_: *mut crosvm) -> c_int1740*bb4ee6a4SAndroid Build Coastguard Worker pub unsafe extern "C" fn crosvm_start(self_: *mut crosvm) -> c_int {
1741*bb4ee6a4SAndroid Build Coastguard Worker     let _u = record(Stat::Start);
1742*bb4ee6a4SAndroid Build Coastguard Worker     let self_ = &mut (*self_);
1743*bb4ee6a4SAndroid Build Coastguard Worker     let ret = self_.start();
1744*bb4ee6a4SAndroid Build Coastguard Worker     to_crosvm_rc(ret)
1745*bb4ee6a4SAndroid Build Coastguard Worker }
1746*bb4ee6a4SAndroid Build Coastguard Worker 
1747*bb4ee6a4SAndroid Build Coastguard Worker #[no_mangle]
crosvm_get_vcpu( self_: *mut crosvm, cpu_id: u32, out: *mut *mut crosvm_vcpu, ) -> c_int1748*bb4ee6a4SAndroid Build Coastguard Worker pub unsafe extern "C" fn crosvm_get_vcpu(
1749*bb4ee6a4SAndroid Build Coastguard Worker     self_: *mut crosvm,
1750*bb4ee6a4SAndroid Build Coastguard Worker     cpu_id: u32,
1751*bb4ee6a4SAndroid Build Coastguard Worker     out: *mut *mut crosvm_vcpu,
1752*bb4ee6a4SAndroid Build Coastguard Worker ) -> c_int {
1753*bb4ee6a4SAndroid Build Coastguard Worker     let _u = record(Stat::GetVcpu);
1754*bb4ee6a4SAndroid Build Coastguard Worker     let self_ = &mut (*self_);
1755*bb4ee6a4SAndroid Build Coastguard Worker     let ret = self_.get_vcpu(cpu_id);
1756*bb4ee6a4SAndroid Build Coastguard Worker 
1757*bb4ee6a4SAndroid Build Coastguard Worker     if let Ok(vcpu) = ret {
1758*bb4ee6a4SAndroid Build Coastguard Worker         *out = vcpu;
1759*bb4ee6a4SAndroid Build Coastguard Worker     }
1760*bb4ee6a4SAndroid Build Coastguard Worker     to_crosvm_rc(ret)
1761*bb4ee6a4SAndroid Build Coastguard Worker }
1762*bb4ee6a4SAndroid Build Coastguard Worker 
1763*bb4ee6a4SAndroid Build Coastguard Worker #[no_mangle]
crosvm_vcpu_wait( this: *mut crosvm_vcpu, event: *mut crosvm_vcpu_event, ) -> c_int1764*bb4ee6a4SAndroid Build Coastguard Worker pub unsafe extern "C" fn crosvm_vcpu_wait(
1765*bb4ee6a4SAndroid Build Coastguard Worker     this: *mut crosvm_vcpu,
1766*bb4ee6a4SAndroid Build Coastguard Worker     event: *mut crosvm_vcpu_event,
1767*bb4ee6a4SAndroid Build Coastguard Worker ) -> c_int {
1768*bb4ee6a4SAndroid Build Coastguard Worker     let _u = record(Stat::VcpuWait);
1769*bb4ee6a4SAndroid Build Coastguard Worker     let this = &mut *this;
1770*bb4ee6a4SAndroid Build Coastguard Worker     let event = &mut *event;
1771*bb4ee6a4SAndroid Build Coastguard Worker     let ret = this.wait(event);
1772*bb4ee6a4SAndroid Build Coastguard Worker     to_crosvm_rc(ret)
1773*bb4ee6a4SAndroid Build Coastguard Worker }
1774*bb4ee6a4SAndroid Build Coastguard Worker 
1775*bb4ee6a4SAndroid Build Coastguard Worker #[no_mangle]
crosvm_vcpu_resume(this: *mut crosvm_vcpu) -> c_int1776*bb4ee6a4SAndroid Build Coastguard Worker pub unsafe extern "C" fn crosvm_vcpu_resume(this: *mut crosvm_vcpu) -> c_int {
1777*bb4ee6a4SAndroid Build Coastguard Worker     let _u = record(Stat::VcpuResume);
1778*bb4ee6a4SAndroid Build Coastguard Worker     let this = &mut *this;
1779*bb4ee6a4SAndroid Build Coastguard Worker     let ret = this.resume();
1780*bb4ee6a4SAndroid Build Coastguard Worker     to_crosvm_rc(ret)
1781*bb4ee6a4SAndroid Build Coastguard Worker }
1782*bb4ee6a4SAndroid Build Coastguard Worker 
1783*bb4ee6a4SAndroid Build Coastguard Worker #[no_mangle]
crosvm_vcpu_get_regs( this: *mut crosvm_vcpu, regs: *mut kvm_regs, ) -> c_int1784*bb4ee6a4SAndroid Build Coastguard Worker pub unsafe extern "C" fn crosvm_vcpu_get_regs(
1785*bb4ee6a4SAndroid Build Coastguard Worker     this: *mut crosvm_vcpu,
1786*bb4ee6a4SAndroid Build Coastguard Worker     regs: *mut kvm_regs,
1787*bb4ee6a4SAndroid Build Coastguard Worker ) -> c_int {
1788*bb4ee6a4SAndroid Build Coastguard Worker     let _u = record(Stat::VcpuGetRegs);
1789*bb4ee6a4SAndroid Build Coastguard Worker     let this = &mut *this;
1790*bb4ee6a4SAndroid Build Coastguard Worker     if this.regs.set {
1791*bb4ee6a4SAndroid Build Coastguard Worker         if let Err(e) = this.set_state_from_cache(vcpu_request::StateSet::REGS) {
1792*bb4ee6a4SAndroid Build Coastguard Worker             return -e;
1793*bb4ee6a4SAndroid Build Coastguard Worker         }
1794*bb4ee6a4SAndroid Build Coastguard Worker     }
1795*bb4ee6a4SAndroid Build Coastguard Worker     let regs = from_raw_parts_mut(regs as *mut u8, size_of::<kvm_regs>());
1796*bb4ee6a4SAndroid Build Coastguard Worker     if this.regs.get {
1797*bb4ee6a4SAndroid Build Coastguard Worker         regs.copy_from_slice(&this.regs.cache);
1798*bb4ee6a4SAndroid Build Coastguard Worker         0
1799*bb4ee6a4SAndroid Build Coastguard Worker     } else {
1800*bb4ee6a4SAndroid Build Coastguard Worker         let ret = this.get_state(vcpu_request::StateSet::REGS, regs);
1801*bb4ee6a4SAndroid Build Coastguard Worker         to_crosvm_rc(ret)
1802*bb4ee6a4SAndroid Build Coastguard Worker     }
1803*bb4ee6a4SAndroid Build Coastguard Worker }
1804*bb4ee6a4SAndroid Build Coastguard Worker 
1805*bb4ee6a4SAndroid Build Coastguard Worker #[no_mangle]
crosvm_vcpu_set_regs( this: *mut crosvm_vcpu, regs: *const kvm_regs, ) -> c_int1806*bb4ee6a4SAndroid Build Coastguard Worker pub unsafe extern "C" fn crosvm_vcpu_set_regs(
1807*bb4ee6a4SAndroid Build Coastguard Worker     this: *mut crosvm_vcpu,
1808*bb4ee6a4SAndroid Build Coastguard Worker     regs: *const kvm_regs,
1809*bb4ee6a4SAndroid Build Coastguard Worker ) -> c_int {
1810*bb4ee6a4SAndroid Build Coastguard Worker     let _u = record(Stat::VcpuSetRegs);
1811*bb4ee6a4SAndroid Build Coastguard Worker     let this = &mut *this;
1812*bb4ee6a4SAndroid Build Coastguard Worker     this.regs.get = false;
1813*bb4ee6a4SAndroid Build Coastguard Worker     let regs = from_raw_parts(regs as *mut u8, size_of::<kvm_regs>());
1814*bb4ee6a4SAndroid Build Coastguard Worker     this.regs.set = true;
1815*bb4ee6a4SAndroid Build Coastguard Worker     this.regs.cache = regs.to_vec();
1816*bb4ee6a4SAndroid Build Coastguard Worker     0
1817*bb4ee6a4SAndroid Build Coastguard Worker }
1818*bb4ee6a4SAndroid Build Coastguard Worker 
1819*bb4ee6a4SAndroid Build Coastguard Worker #[no_mangle]
crosvm_vcpu_get_sregs( this: *mut crosvm_vcpu, sregs: *mut kvm_sregs, ) -> c_int1820*bb4ee6a4SAndroid Build Coastguard Worker pub unsafe extern "C" fn crosvm_vcpu_get_sregs(
1821*bb4ee6a4SAndroid Build Coastguard Worker     this: *mut crosvm_vcpu,
1822*bb4ee6a4SAndroid Build Coastguard Worker     sregs: *mut kvm_sregs,
1823*bb4ee6a4SAndroid Build Coastguard Worker ) -> c_int {
1824*bb4ee6a4SAndroid Build Coastguard Worker     let _u = record(Stat::VcpuGetSregs);
1825*bb4ee6a4SAndroid Build Coastguard Worker     let this = &mut *this;
1826*bb4ee6a4SAndroid Build Coastguard Worker     if this.sregs.set {
1827*bb4ee6a4SAndroid Build Coastguard Worker         if let Err(e) = this.set_state_from_cache(vcpu_request::StateSet::SREGS) {
1828*bb4ee6a4SAndroid Build Coastguard Worker             return -e;
1829*bb4ee6a4SAndroid Build Coastguard Worker         }
1830*bb4ee6a4SAndroid Build Coastguard Worker     }
1831*bb4ee6a4SAndroid Build Coastguard Worker     let sregs = from_raw_parts_mut(sregs as *mut u8, size_of::<kvm_sregs>());
1832*bb4ee6a4SAndroid Build Coastguard Worker     if this.sregs.get {
1833*bb4ee6a4SAndroid Build Coastguard Worker         sregs.copy_from_slice(&this.sregs.cache);
1834*bb4ee6a4SAndroid Build Coastguard Worker         0
1835*bb4ee6a4SAndroid Build Coastguard Worker     } else {
1836*bb4ee6a4SAndroid Build Coastguard Worker         let ret = this.get_state(vcpu_request::StateSet::SREGS, sregs);
1837*bb4ee6a4SAndroid Build Coastguard Worker         to_crosvm_rc(ret)
1838*bb4ee6a4SAndroid Build Coastguard Worker     }
1839*bb4ee6a4SAndroid Build Coastguard Worker }
1840*bb4ee6a4SAndroid Build Coastguard Worker 
1841*bb4ee6a4SAndroid Build Coastguard Worker #[no_mangle]
crosvm_vcpu_set_sregs( this: *mut crosvm_vcpu, sregs: *const kvm_sregs, ) -> c_int1842*bb4ee6a4SAndroid Build Coastguard Worker pub unsafe extern "C" fn crosvm_vcpu_set_sregs(
1843*bb4ee6a4SAndroid Build Coastguard Worker     this: *mut crosvm_vcpu,
1844*bb4ee6a4SAndroid Build Coastguard Worker     sregs: *const kvm_sregs,
1845*bb4ee6a4SAndroid Build Coastguard Worker ) -> c_int {
1846*bb4ee6a4SAndroid Build Coastguard Worker     let _u = record(Stat::VcpuSetSregs);
1847*bb4ee6a4SAndroid Build Coastguard Worker     let this = &mut *this;
1848*bb4ee6a4SAndroid Build Coastguard Worker     this.sregs.get = false;
1849*bb4ee6a4SAndroid Build Coastguard Worker     let sregs = from_raw_parts(sregs as *mut u8, size_of::<kvm_sregs>());
1850*bb4ee6a4SAndroid Build Coastguard Worker     this.sregs.set = true;
1851*bb4ee6a4SAndroid Build Coastguard Worker     this.sregs.cache = sregs.to_vec();
1852*bb4ee6a4SAndroid Build Coastguard Worker     0
1853*bb4ee6a4SAndroid Build Coastguard Worker }
1854*bb4ee6a4SAndroid Build Coastguard Worker 
1855*bb4ee6a4SAndroid Build Coastguard Worker #[no_mangle]
crosvm_vcpu_get_fpu(this: *mut crosvm_vcpu, fpu: *mut kvm_fpu) -> c_int1856*bb4ee6a4SAndroid Build Coastguard Worker pub unsafe extern "C" fn crosvm_vcpu_get_fpu(this: *mut crosvm_vcpu, fpu: *mut kvm_fpu) -> c_int {
1857*bb4ee6a4SAndroid Build Coastguard Worker     let _u = record(Stat::GetFpu);
1858*bb4ee6a4SAndroid Build Coastguard Worker     let this = &mut *this;
1859*bb4ee6a4SAndroid Build Coastguard Worker     let fpu = from_raw_parts_mut(fpu as *mut u8, size_of::<kvm_fpu>());
1860*bb4ee6a4SAndroid Build Coastguard Worker     let ret = this.get_state(vcpu_request::StateSet::FPU, fpu);
1861*bb4ee6a4SAndroid Build Coastguard Worker     to_crosvm_rc(ret)
1862*bb4ee6a4SAndroid Build Coastguard Worker }
1863*bb4ee6a4SAndroid Build Coastguard Worker 
1864*bb4ee6a4SAndroid Build Coastguard Worker #[no_mangle]
crosvm_vcpu_set_fpu(this: *mut crosvm_vcpu, fpu: *const kvm_fpu) -> c_int1865*bb4ee6a4SAndroid Build Coastguard Worker pub unsafe extern "C" fn crosvm_vcpu_set_fpu(this: *mut crosvm_vcpu, fpu: *const kvm_fpu) -> c_int {
1866*bb4ee6a4SAndroid Build Coastguard Worker     let _u = record(Stat::SetFpu);
1867*bb4ee6a4SAndroid Build Coastguard Worker     let this = &mut *this;
1868*bb4ee6a4SAndroid Build Coastguard Worker     let fpu = from_raw_parts(fpu as *mut u8, size_of::<kvm_fpu>());
1869*bb4ee6a4SAndroid Build Coastguard Worker     let ret = this.set_state(vcpu_request::StateSet::FPU, fpu);
1870*bb4ee6a4SAndroid Build Coastguard Worker     to_crosvm_rc(ret)
1871*bb4ee6a4SAndroid Build Coastguard Worker }
1872*bb4ee6a4SAndroid Build Coastguard Worker 
1873*bb4ee6a4SAndroid Build Coastguard Worker #[no_mangle]
crosvm_vcpu_get_debugregs( this: *mut crosvm_vcpu, dregs: *mut kvm_debugregs, ) -> c_int1874*bb4ee6a4SAndroid Build Coastguard Worker pub unsafe extern "C" fn crosvm_vcpu_get_debugregs(
1875*bb4ee6a4SAndroid Build Coastguard Worker     this: *mut crosvm_vcpu,
1876*bb4ee6a4SAndroid Build Coastguard Worker     dregs: *mut kvm_debugregs,
1877*bb4ee6a4SAndroid Build Coastguard Worker ) -> c_int {
1878*bb4ee6a4SAndroid Build Coastguard Worker     let _u = record(Stat::GetDebugRegs);
1879*bb4ee6a4SAndroid Build Coastguard Worker     let this = &mut *this;
1880*bb4ee6a4SAndroid Build Coastguard Worker     if this.debugregs.set {
1881*bb4ee6a4SAndroid Build Coastguard Worker         if let Err(e) = this.set_state_from_cache(vcpu_request::StateSet::DEBUGREGS) {
1882*bb4ee6a4SAndroid Build Coastguard Worker             return -e;
1883*bb4ee6a4SAndroid Build Coastguard Worker         }
1884*bb4ee6a4SAndroid Build Coastguard Worker     }
1885*bb4ee6a4SAndroid Build Coastguard Worker     let dregs = from_raw_parts_mut(dregs as *mut u8, size_of::<kvm_debugregs>());
1886*bb4ee6a4SAndroid Build Coastguard Worker     if this.debugregs.get {
1887*bb4ee6a4SAndroid Build Coastguard Worker         dregs.copy_from_slice(&this.debugregs.cache);
1888*bb4ee6a4SAndroid Build Coastguard Worker         0
1889*bb4ee6a4SAndroid Build Coastguard Worker     } else {
1890*bb4ee6a4SAndroid Build Coastguard Worker         let ret = this.get_state(vcpu_request::StateSet::DEBUGREGS, dregs);
1891*bb4ee6a4SAndroid Build Coastguard Worker         to_crosvm_rc(ret)
1892*bb4ee6a4SAndroid Build Coastguard Worker     }
1893*bb4ee6a4SAndroid Build Coastguard Worker }
1894*bb4ee6a4SAndroid Build Coastguard Worker 
1895*bb4ee6a4SAndroid Build Coastguard Worker #[no_mangle]
crosvm_vcpu_set_debugregs( this: *mut crosvm_vcpu, dregs: *const kvm_debugregs, ) -> c_int1896*bb4ee6a4SAndroid Build Coastguard Worker pub unsafe extern "C" fn crosvm_vcpu_set_debugregs(
1897*bb4ee6a4SAndroid Build Coastguard Worker     this: *mut crosvm_vcpu,
1898*bb4ee6a4SAndroid Build Coastguard Worker     dregs: *const kvm_debugregs,
1899*bb4ee6a4SAndroid Build Coastguard Worker ) -> c_int {
1900*bb4ee6a4SAndroid Build Coastguard Worker     let _u = record(Stat::SetDebugRegs);
1901*bb4ee6a4SAndroid Build Coastguard Worker     let this = &mut *this;
1902*bb4ee6a4SAndroid Build Coastguard Worker     this.debugregs.get = false;
1903*bb4ee6a4SAndroid Build Coastguard Worker     let dregs = from_raw_parts(dregs as *mut u8, size_of::<kvm_debugregs>());
1904*bb4ee6a4SAndroid Build Coastguard Worker     this.debugregs.set = true;
1905*bb4ee6a4SAndroid Build Coastguard Worker     this.debugregs.cache = dregs.to_vec();
1906*bb4ee6a4SAndroid Build Coastguard Worker     0
1907*bb4ee6a4SAndroid Build Coastguard Worker }
1908*bb4ee6a4SAndroid Build Coastguard Worker 
1909*bb4ee6a4SAndroid Build Coastguard Worker #[no_mangle]
crosvm_vcpu_get_xcrs( this: *mut crosvm_vcpu, xcrs: *mut kvm_xcrs, ) -> c_int1910*bb4ee6a4SAndroid Build Coastguard Worker pub unsafe extern "C" fn crosvm_vcpu_get_xcrs(
1911*bb4ee6a4SAndroid Build Coastguard Worker     this: *mut crosvm_vcpu,
1912*bb4ee6a4SAndroid Build Coastguard Worker     xcrs: *mut kvm_xcrs,
1913*bb4ee6a4SAndroid Build Coastguard Worker ) -> c_int {
1914*bb4ee6a4SAndroid Build Coastguard Worker     let _u = record(Stat::GetXCRegs);
1915*bb4ee6a4SAndroid Build Coastguard Worker     let this = &mut *this;
1916*bb4ee6a4SAndroid Build Coastguard Worker     let xcrs = from_raw_parts_mut(xcrs as *mut u8, size_of::<kvm_xcrs>());
1917*bb4ee6a4SAndroid Build Coastguard Worker     let ret = this.get_state(vcpu_request::StateSet::XCREGS, xcrs);
1918*bb4ee6a4SAndroid Build Coastguard Worker     to_crosvm_rc(ret)
1919*bb4ee6a4SAndroid Build Coastguard Worker }
1920*bb4ee6a4SAndroid Build Coastguard Worker 
1921*bb4ee6a4SAndroid Build Coastguard Worker #[no_mangle]
crosvm_vcpu_set_xcrs( this: *mut crosvm_vcpu, xcrs: *const kvm_xcrs, ) -> c_int1922*bb4ee6a4SAndroid Build Coastguard Worker pub unsafe extern "C" fn crosvm_vcpu_set_xcrs(
1923*bb4ee6a4SAndroid Build Coastguard Worker     this: *mut crosvm_vcpu,
1924*bb4ee6a4SAndroid Build Coastguard Worker     xcrs: *const kvm_xcrs,
1925*bb4ee6a4SAndroid Build Coastguard Worker ) -> c_int {
1926*bb4ee6a4SAndroid Build Coastguard Worker     let _u = record(Stat::SetXCRegs);
1927*bb4ee6a4SAndroid Build Coastguard Worker     let this = &mut *this;
1928*bb4ee6a4SAndroid Build Coastguard Worker     let xcrs = from_raw_parts(xcrs as *mut u8, size_of::<kvm_xcrs>());
1929*bb4ee6a4SAndroid Build Coastguard Worker     let ret = this.set_state(vcpu_request::StateSet::XCREGS, xcrs);
1930*bb4ee6a4SAndroid Build Coastguard Worker     to_crosvm_rc(ret)
1931*bb4ee6a4SAndroid Build Coastguard Worker }
1932*bb4ee6a4SAndroid Build Coastguard Worker 
1933*bb4ee6a4SAndroid Build Coastguard Worker #[no_mangle]
crosvm_get_hyperv_cpuid( this: *mut crosvm_vcpu, entry_count: u32, cpuid_entries: *mut kvm_cpuid_entry2, out_count: *mut u32, ) -> c_int1934*bb4ee6a4SAndroid Build Coastguard Worker pub unsafe extern "C" fn crosvm_get_hyperv_cpuid(
1935*bb4ee6a4SAndroid Build Coastguard Worker     this: *mut crosvm_vcpu,
1936*bb4ee6a4SAndroid Build Coastguard Worker     entry_count: u32,
1937*bb4ee6a4SAndroid Build Coastguard Worker     cpuid_entries: *mut kvm_cpuid_entry2,
1938*bb4ee6a4SAndroid Build Coastguard Worker     out_count: *mut u32,
1939*bb4ee6a4SAndroid Build Coastguard Worker ) -> c_int {
1940*bb4ee6a4SAndroid Build Coastguard Worker     let _u = record(Stat::GetHypervCpuid);
1941*bb4ee6a4SAndroid Build Coastguard Worker     let this = &mut *this;
1942*bb4ee6a4SAndroid Build Coastguard Worker     let cpuid_entries = from_raw_parts_mut(cpuid_entries, entry_count as usize);
1943*bb4ee6a4SAndroid Build Coastguard Worker     let mut cpuid_count: usize = 0;
1944*bb4ee6a4SAndroid Build Coastguard Worker     let ret = this.get_hyperv_cpuid(cpuid_entries, &mut cpuid_count);
1945*bb4ee6a4SAndroid Build Coastguard Worker     *out_count = cpuid_count as u32;
1946*bb4ee6a4SAndroid Build Coastguard Worker     to_crosvm_rc(ret)
1947*bb4ee6a4SAndroid Build Coastguard Worker }
1948*bb4ee6a4SAndroid Build Coastguard Worker 
1949*bb4ee6a4SAndroid Build Coastguard Worker #[no_mangle]
crosvm_vcpu_get_msrs( this: *mut crosvm_vcpu, msr_count: u32, msr_entries: *mut kvm_msr_entry, out_count: *mut u32, ) -> c_int1950*bb4ee6a4SAndroid Build Coastguard Worker pub unsafe extern "C" fn crosvm_vcpu_get_msrs(
1951*bb4ee6a4SAndroid Build Coastguard Worker     this: *mut crosvm_vcpu,
1952*bb4ee6a4SAndroid Build Coastguard Worker     msr_count: u32,
1953*bb4ee6a4SAndroid Build Coastguard Worker     msr_entries: *mut kvm_msr_entry,
1954*bb4ee6a4SAndroid Build Coastguard Worker     out_count: *mut u32,
1955*bb4ee6a4SAndroid Build Coastguard Worker ) -> c_int {
1956*bb4ee6a4SAndroid Build Coastguard Worker     let _u = record(Stat::VcpuGetMsrs);
1957*bb4ee6a4SAndroid Build Coastguard Worker     let this = &mut *this;
1958*bb4ee6a4SAndroid Build Coastguard Worker     let msr_entries = from_raw_parts_mut(msr_entries, msr_count as usize);
1959*bb4ee6a4SAndroid Build Coastguard Worker     let mut count: usize = 0;
1960*bb4ee6a4SAndroid Build Coastguard Worker     let ret = this.get_msrs(msr_entries, &mut count);
1961*bb4ee6a4SAndroid Build Coastguard Worker     *out_count = count as u32;
1962*bb4ee6a4SAndroid Build Coastguard Worker     to_crosvm_rc(ret)
1963*bb4ee6a4SAndroid Build Coastguard Worker }
1964*bb4ee6a4SAndroid Build Coastguard Worker 
1965*bb4ee6a4SAndroid Build Coastguard Worker #[no_mangle]
crosvm_vcpu_set_msrs( this: *mut crosvm_vcpu, msr_count: u32, msr_entries: *const kvm_msr_entry, ) -> c_int1966*bb4ee6a4SAndroid Build Coastguard Worker pub unsafe extern "C" fn crosvm_vcpu_set_msrs(
1967*bb4ee6a4SAndroid Build Coastguard Worker     this: *mut crosvm_vcpu,
1968*bb4ee6a4SAndroid Build Coastguard Worker     msr_count: u32,
1969*bb4ee6a4SAndroid Build Coastguard Worker     msr_entries: *const kvm_msr_entry,
1970*bb4ee6a4SAndroid Build Coastguard Worker ) -> c_int {
1971*bb4ee6a4SAndroid Build Coastguard Worker     let _u = record(Stat::VcpuSetMsrs);
1972*bb4ee6a4SAndroid Build Coastguard Worker     let this = &mut *this;
1973*bb4ee6a4SAndroid Build Coastguard Worker     let msr_entries = from_raw_parts(msr_entries, msr_count as usize);
1974*bb4ee6a4SAndroid Build Coastguard Worker     let ret = this.set_msrs(msr_entries);
1975*bb4ee6a4SAndroid Build Coastguard Worker     to_crosvm_rc(ret)
1976*bb4ee6a4SAndroid Build Coastguard Worker }
1977*bb4ee6a4SAndroid Build Coastguard Worker 
1978*bb4ee6a4SAndroid Build Coastguard Worker #[no_mangle]
crosvm_vcpu_set_cpuid( this: *mut crosvm_vcpu, cpuid_count: u32, cpuid_entries: *const kvm_cpuid_entry2, ) -> c_int1979*bb4ee6a4SAndroid Build Coastguard Worker pub unsafe extern "C" fn crosvm_vcpu_set_cpuid(
1980*bb4ee6a4SAndroid Build Coastguard Worker     this: *mut crosvm_vcpu,
1981*bb4ee6a4SAndroid Build Coastguard Worker     cpuid_count: u32,
1982*bb4ee6a4SAndroid Build Coastguard Worker     cpuid_entries: *const kvm_cpuid_entry2,
1983*bb4ee6a4SAndroid Build Coastguard Worker ) -> c_int {
1984*bb4ee6a4SAndroid Build Coastguard Worker     let _u = record(Stat::VcpuSetCpuid);
1985*bb4ee6a4SAndroid Build Coastguard Worker     let this = &mut *this;
1986*bb4ee6a4SAndroid Build Coastguard Worker     let cpuid_entries = from_raw_parts(cpuid_entries, cpuid_count as usize);
1987*bb4ee6a4SAndroid Build Coastguard Worker     let ret = this.set_cpuid(cpuid_entries);
1988*bb4ee6a4SAndroid Build Coastguard Worker     to_crosvm_rc(ret)
1989*bb4ee6a4SAndroid Build Coastguard Worker }
1990*bb4ee6a4SAndroid Build Coastguard Worker 
1991*bb4ee6a4SAndroid Build Coastguard Worker #[no_mangle]
crosvm_vcpu_enable_capability( this: *mut crosvm_vcpu, capability: u32, flags: u32, args: *const u64, ) -> c_int1992*bb4ee6a4SAndroid Build Coastguard Worker pub unsafe extern "C" fn crosvm_vcpu_enable_capability(
1993*bb4ee6a4SAndroid Build Coastguard Worker     this: *mut crosvm_vcpu,
1994*bb4ee6a4SAndroid Build Coastguard Worker     capability: u32,
1995*bb4ee6a4SAndroid Build Coastguard Worker     flags: u32,
1996*bb4ee6a4SAndroid Build Coastguard Worker     args: *const u64,
1997*bb4ee6a4SAndroid Build Coastguard Worker ) -> c_int {
1998*bb4ee6a4SAndroid Build Coastguard Worker     let _u = record(Stat::EnableVcpuCapability);
1999*bb4ee6a4SAndroid Build Coastguard Worker     let this = &mut *this;
2000*bb4ee6a4SAndroid Build Coastguard Worker     let args = slice::from_raw_parts(args, 4);
2001*bb4ee6a4SAndroid Build Coastguard Worker 
2002*bb4ee6a4SAndroid Build Coastguard Worker     if flags != 0 || args.iter().any(|v| *v != 0) {
2003*bb4ee6a4SAndroid Build Coastguard Worker         return -EINVAL;
2004*bb4ee6a4SAndroid Build Coastguard Worker     }
2005*bb4ee6a4SAndroid Build Coastguard Worker 
2006*bb4ee6a4SAndroid Build Coastguard Worker     let ret = this.enable_capability(capability);
2007*bb4ee6a4SAndroid Build Coastguard Worker     to_crosvm_rc(ret)
2008*bb4ee6a4SAndroid Build Coastguard Worker }
2009*bb4ee6a4SAndroid Build Coastguard Worker 
2010*bb4ee6a4SAndroid Build Coastguard Worker #[no_mangle]
crosvm_vcpu_get_lapic_state( this: *mut crosvm_vcpu, state: *mut kvm_lapic_state, ) -> c_int2011*bb4ee6a4SAndroid Build Coastguard Worker pub unsafe extern "C" fn crosvm_vcpu_get_lapic_state(
2012*bb4ee6a4SAndroid Build Coastguard Worker     this: *mut crosvm_vcpu,
2013*bb4ee6a4SAndroid Build Coastguard Worker     state: *mut kvm_lapic_state,
2014*bb4ee6a4SAndroid Build Coastguard Worker ) -> c_int {
2015*bb4ee6a4SAndroid Build Coastguard Worker     let _u = record(Stat::VcpuGetLapicState);
2016*bb4ee6a4SAndroid Build Coastguard Worker     let this = &mut *this;
2017*bb4ee6a4SAndroid Build Coastguard Worker     let state = from_raw_parts_mut(state as *mut u8, size_of::<kvm_lapic_state>());
2018*bb4ee6a4SAndroid Build Coastguard Worker     let ret = this.get_state(vcpu_request::StateSet::LAPIC, state);
2019*bb4ee6a4SAndroid Build Coastguard Worker     to_crosvm_rc(ret)
2020*bb4ee6a4SAndroid Build Coastguard Worker }
2021*bb4ee6a4SAndroid Build Coastguard Worker 
2022*bb4ee6a4SAndroid Build Coastguard Worker #[no_mangle]
crosvm_vcpu_set_lapic_state( this: *mut crosvm_vcpu, state: *const kvm_lapic_state, ) -> c_int2023*bb4ee6a4SAndroid Build Coastguard Worker pub unsafe extern "C" fn crosvm_vcpu_set_lapic_state(
2024*bb4ee6a4SAndroid Build Coastguard Worker     this: *mut crosvm_vcpu,
2025*bb4ee6a4SAndroid Build Coastguard Worker     state: *const kvm_lapic_state,
2026*bb4ee6a4SAndroid Build Coastguard Worker ) -> c_int {
2027*bb4ee6a4SAndroid Build Coastguard Worker     let _u = record(Stat::VcpuSetLapicState);
2028*bb4ee6a4SAndroid Build Coastguard Worker     let this = &mut *this;
2029*bb4ee6a4SAndroid Build Coastguard Worker     let state = from_raw_parts(state as *mut u8, size_of::<kvm_lapic_state>());
2030*bb4ee6a4SAndroid Build Coastguard Worker     let ret = this.set_state(vcpu_request::StateSet::LAPIC, state);
2031*bb4ee6a4SAndroid Build Coastguard Worker     to_crosvm_rc(ret)
2032*bb4ee6a4SAndroid Build Coastguard Worker }
2033*bb4ee6a4SAndroid Build Coastguard Worker 
2034*bb4ee6a4SAndroid Build Coastguard Worker #[no_mangle]
crosvm_vcpu_get_mp_state( this: *mut crosvm_vcpu, state: *mut kvm_mp_state, ) -> c_int2035*bb4ee6a4SAndroid Build Coastguard Worker pub unsafe extern "C" fn crosvm_vcpu_get_mp_state(
2036*bb4ee6a4SAndroid Build Coastguard Worker     this: *mut crosvm_vcpu,
2037*bb4ee6a4SAndroid Build Coastguard Worker     state: *mut kvm_mp_state,
2038*bb4ee6a4SAndroid Build Coastguard Worker ) -> c_int {
2039*bb4ee6a4SAndroid Build Coastguard Worker     let _u = record(Stat::VcpuGetMpState);
2040*bb4ee6a4SAndroid Build Coastguard Worker     let this = &mut *this;
2041*bb4ee6a4SAndroid Build Coastguard Worker     let state = from_raw_parts_mut(state as *mut u8, size_of::<kvm_mp_state>());
2042*bb4ee6a4SAndroid Build Coastguard Worker     let ret = this.get_state(vcpu_request::StateSet::MP, state);
2043*bb4ee6a4SAndroid Build Coastguard Worker     to_crosvm_rc(ret)
2044*bb4ee6a4SAndroid Build Coastguard Worker }
2045*bb4ee6a4SAndroid Build Coastguard Worker 
2046*bb4ee6a4SAndroid Build Coastguard Worker #[no_mangle]
crosvm_vcpu_set_mp_state( this: *mut crosvm_vcpu, state: *const kvm_mp_state, ) -> c_int2047*bb4ee6a4SAndroid Build Coastguard Worker pub unsafe extern "C" fn crosvm_vcpu_set_mp_state(
2048*bb4ee6a4SAndroid Build Coastguard Worker     this: *mut crosvm_vcpu,
2049*bb4ee6a4SAndroid Build Coastguard Worker     state: *const kvm_mp_state,
2050*bb4ee6a4SAndroid Build Coastguard Worker ) -> c_int {
2051*bb4ee6a4SAndroid Build Coastguard Worker     let _u = record(Stat::VcpuSetMpState);
2052*bb4ee6a4SAndroid Build Coastguard Worker     let this = &mut *this;
2053*bb4ee6a4SAndroid Build Coastguard Worker     let state = from_raw_parts(state as *mut u8, size_of::<kvm_mp_state>());
2054*bb4ee6a4SAndroid Build Coastguard Worker     let ret = this.set_state(vcpu_request::StateSet::MP, state);
2055*bb4ee6a4SAndroid Build Coastguard Worker     to_crosvm_rc(ret)
2056*bb4ee6a4SAndroid Build Coastguard Worker }
2057*bb4ee6a4SAndroid Build Coastguard Worker 
2058*bb4ee6a4SAndroid Build Coastguard Worker #[no_mangle]
crosvm_vcpu_get_vcpu_events( this: *mut crosvm_vcpu, events: *mut kvm_vcpu_events, ) -> c_int2059*bb4ee6a4SAndroid Build Coastguard Worker pub unsafe extern "C" fn crosvm_vcpu_get_vcpu_events(
2060*bb4ee6a4SAndroid Build Coastguard Worker     this: *mut crosvm_vcpu,
2061*bb4ee6a4SAndroid Build Coastguard Worker     events: *mut kvm_vcpu_events,
2062*bb4ee6a4SAndroid Build Coastguard Worker ) -> c_int {
2063*bb4ee6a4SAndroid Build Coastguard Worker     let _u = record(Stat::VcpuGetVcpuEvents);
2064*bb4ee6a4SAndroid Build Coastguard Worker     let this = &mut *this;
2065*bb4ee6a4SAndroid Build Coastguard Worker     let events = from_raw_parts_mut(events as *mut u8, size_of::<kvm_vcpu_events>());
2066*bb4ee6a4SAndroid Build Coastguard Worker     let ret = this.get_state(vcpu_request::StateSet::EVENTS, events);
2067*bb4ee6a4SAndroid Build Coastguard Worker     to_crosvm_rc(ret)
2068*bb4ee6a4SAndroid Build Coastguard Worker }
2069*bb4ee6a4SAndroid Build Coastguard Worker 
2070*bb4ee6a4SAndroid Build Coastguard Worker #[no_mangle]
crosvm_vcpu_set_vcpu_events( this: *mut crosvm_vcpu, events: *const kvm_vcpu_events, ) -> c_int2071*bb4ee6a4SAndroid Build Coastguard Worker pub unsafe extern "C" fn crosvm_vcpu_set_vcpu_events(
2072*bb4ee6a4SAndroid Build Coastguard Worker     this: *mut crosvm_vcpu,
2073*bb4ee6a4SAndroid Build Coastguard Worker     events: *const kvm_vcpu_events,
2074*bb4ee6a4SAndroid Build Coastguard Worker ) -> c_int {
2075*bb4ee6a4SAndroid Build Coastguard Worker     let _u = record(Stat::VcpuSetVcpuEvents);
2076*bb4ee6a4SAndroid Build Coastguard Worker     let this = &mut *this;
2077*bb4ee6a4SAndroid Build Coastguard Worker     let events = from_raw_parts(events as *mut u8, size_of::<kvm_vcpu_events>());
2078*bb4ee6a4SAndroid Build Coastguard Worker     let ret = this.set_state(vcpu_request::StateSet::EVENTS, events);
2079*bb4ee6a4SAndroid Build Coastguard Worker     to_crosvm_rc(ret)
2080*bb4ee6a4SAndroid Build Coastguard Worker }
2081