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