xref: /aosp_15_r20/external/crosvm/crosvm_plugin/crosvm.h (revision bb4ee6a4ae7042d18b07a98463b9c8b875e44b39)
1*bb4ee6a4SAndroid Build Coastguard Worker /*
2*bb4ee6a4SAndroid Build Coastguard Worker  * Copyright 2017 The ChromiumOS Authors
3*bb4ee6a4SAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license that can be
4*bb4ee6a4SAndroid Build Coastguard Worker  * found in the LICENSE file.
5*bb4ee6a4SAndroid Build Coastguard Worker  */
6*bb4ee6a4SAndroid Build Coastguard Worker 
7*bb4ee6a4SAndroid Build Coastguard Worker #ifndef __CROSVM_H__
8*bb4ee6a4SAndroid Build Coastguard Worker #define __CROSVM_H__
9*bb4ee6a4SAndroid Build Coastguard Worker 
10*bb4ee6a4SAndroid Build Coastguard Worker #include <assert.h>
11*bb4ee6a4SAndroid Build Coastguard Worker #include <stdint.h>
12*bb4ee6a4SAndroid Build Coastguard Worker #include <stdbool.h>
13*bb4ee6a4SAndroid Build Coastguard Worker 
14*bb4ee6a4SAndroid Build Coastguard Worker #include <linux/kvm.h>
15*bb4ee6a4SAndroid Build Coastguard Worker 
16*bb4ee6a4SAndroid Build Coastguard Worker #ifdef  __cplusplus
17*bb4ee6a4SAndroid Build Coastguard Worker extern "C" {
18*bb4ee6a4SAndroid Build Coastguard Worker #endif
19*bb4ee6a4SAndroid Build Coastguard Worker 
20*bb4ee6a4SAndroid Build Coastguard Worker /*
21*bb4ee6a4SAndroid Build Coastguard Worker  * This module is used to implement a plugin for crosvm.
22*bb4ee6a4SAndroid Build Coastguard Worker  *
23*bb4ee6a4SAndroid Build Coastguard Worker  * A plugin for crosvm interfaces with the virtual machine using the `struct
24*bb4ee6a4SAndroid Build Coastguard Worker  * crosvm` object and its child objects. A typical plugin is expected to call
25*bb4ee6a4SAndroid Build Coastguard Worker  * `crosvm_connect`, perform some amount of setup with the functions defined
26*bb4ee6a4SAndroid Build Coastguard Worker  * here, get a handle to every vcpu using `struct crosvm_vcpu` and then call
27*bb4ee6a4SAndroid Build Coastguard Worker  * `crosvm_start`. Each vcpu will then be waited on with `crosvm_vcpu_wait`,
28*bb4ee6a4SAndroid Build Coastguard Worker  * each event will be responded to by the plugin, and then the vcpu is resumed
29*bb4ee6a4SAndroid Build Coastguard Worker  * with `crosvm_vcpu_resume`. The vcpu state can only be examined and modified
30*bb4ee6a4SAndroid Build Coastguard Worker  * between the `crosvm_vcpu_wait` and `crosvm_vcpu_resume` calls. The crosvm
31*bb4ee6a4SAndroid Build Coastguard Worker  * connection can be used to modify global virtual machine state at any time,
32*bb4ee6a4SAndroid Build Coastguard Worker  * with some structural restrictions after `crosvm_start` is called.
33*bb4ee6a4SAndroid Build Coastguard Worker  *
34*bb4ee6a4SAndroid Build Coastguard Worker  * In general, functions that return an `int` return 0 on success or a non-
35*bb4ee6a4SAndroid Build Coastguard Worker  * negative file descriptor if one is expected. A negative return value is an
36*bb4ee6a4SAndroid Build Coastguard Worker  * errno and indicates error. Functions that take a pointer-to-pointer to an
37*bb4ee6a4SAndroid Build Coastguard Worker  * opaque structure either return a structure or delete and nullify that
38*bb4ee6a4SAndroid Build Coastguard Worker  * structure pointer.
39*bb4ee6a4SAndroid Build Coastguard Worker  */
40*bb4ee6a4SAndroid Build Coastguard Worker 
41*bb4ee6a4SAndroid Build Coastguard Worker /*
42*bb4ee6a4SAndroid Build Coastguard Worker  * We use Semantic Versioning (http://semver.org/) here, which means that as
43*bb4ee6a4SAndroid Build Coastguard Worker  * long as MAJOR is 0, breaking changes can occur, but once MAJOR is non-zero, a
44*bb4ee6a4SAndroid Build Coastguard Worker  * breaking change requires a MAJOR version bump. The MINOR number increases as
45*bb4ee6a4SAndroid Build Coastguard Worker  * backward compatible functionality is added. The PATCH number increases bug
46*bb4ee6a4SAndroid Build Coastguard Worker  * fixes are done. The version numbers indicate here are for the plugin API and
47*bb4ee6a4SAndroid Build Coastguard Worker  * do not indicate anything about what version of crosvm is running.
48*bb4ee6a4SAndroid Build Coastguard Worker  */
49*bb4ee6a4SAndroid Build Coastguard Worker #define CROSVM_API_MAJOR 0
50*bb4ee6a4SAndroid Build Coastguard Worker #define CROSVM_API_MINOR 22
51*bb4ee6a4SAndroid Build Coastguard Worker #define CROSVM_API_PATCH 0
52*bb4ee6a4SAndroid Build Coastguard Worker 
53*bb4ee6a4SAndroid Build Coastguard Worker enum crosvm_address_space {
54*bb4ee6a4SAndroid Build Coastguard Worker   /* I/O port */
55*bb4ee6a4SAndroid Build Coastguard Worker   CROSVM_ADDRESS_SPACE_IOPORT = 0,
56*bb4ee6a4SAndroid Build Coastguard Worker   /* physical memory space */
57*bb4ee6a4SAndroid Build Coastguard Worker   CROSVM_ADDRESS_SPACE_MMIO,
58*bb4ee6a4SAndroid Build Coastguard Worker };
59*bb4ee6a4SAndroid Build Coastguard Worker 
60*bb4ee6a4SAndroid Build Coastguard Worker /* Handle to the parent crosvm process. */
61*bb4ee6a4SAndroid Build Coastguard Worker struct crosvm;
62*bb4ee6a4SAndroid Build Coastguard Worker 
63*bb4ee6a4SAndroid Build Coastguard Worker /* Handle to a register ioeventfd. */
64*bb4ee6a4SAndroid Build Coastguard Worker struct crosvm_io;
65*bb4ee6a4SAndroid Build Coastguard Worker 
66*bb4ee6a4SAndroid Build Coastguard Worker /* Handle to a registered range of shared memory. */
67*bb4ee6a4SAndroid Build Coastguard Worker struct crosvm_memory;
68*bb4ee6a4SAndroid Build Coastguard Worker 
69*bb4ee6a4SAndroid Build Coastguard Worker /* Handle to a registered irqfd. */
70*bb4ee6a4SAndroid Build Coastguard Worker struct crosvm_irq;
71*bb4ee6a4SAndroid Build Coastguard Worker 
72*bb4ee6a4SAndroid Build Coastguard Worker /* Handle to one of the VM's VCPUs. */
73*bb4ee6a4SAndroid Build Coastguard Worker struct crosvm_vcpu;
74*bb4ee6a4SAndroid Build Coastguard Worker 
75*bb4ee6a4SAndroid Build Coastguard Worker /*
76*bb4ee6a4SAndroid Build Coastguard Worker  * Connects to the parent crosvm process and returns a new `struct crosvm`
77*bb4ee6a4SAndroid Build Coastguard Worker  * interface object.
78*bb4ee6a4SAndroid Build Coastguard Worker  *
79*bb4ee6a4SAndroid Build Coastguard Worker  * This is the entry point for interfacing with crosvm as a plugin. This should
80*bb4ee6a4SAndroid Build Coastguard Worker  * be called before any other function. The returned object is not-thread safe.
81*bb4ee6a4SAndroid Build Coastguard Worker  */
82*bb4ee6a4SAndroid Build Coastguard Worker int crosvm_connect(struct crosvm**);
83*bb4ee6a4SAndroid Build Coastguard Worker 
84*bb4ee6a4SAndroid Build Coastguard Worker /*
85*bb4ee6a4SAndroid Build Coastguard Worker  * Creates another connection for interfacing with crosvm concurrently.
86*bb4ee6a4SAndroid Build Coastguard Worker  *
87*bb4ee6a4SAndroid Build Coastguard Worker  * The new connection behaves exactly like the original `struct crosvm` but can
88*bb4ee6a4SAndroid Build Coastguard Worker  * be used concurrently on a different thread than the original. Actual
89*bb4ee6a4SAndroid Build Coastguard Worker  * execution order of the requests to crosvm is unspecified but every request is
90*bb4ee6a4SAndroid Build Coastguard Worker  * completed when the `crosvm_*` call returns.
91*bb4ee6a4SAndroid Build Coastguard Worker  *
92*bb4ee6a4SAndroid Build Coastguard Worker  * It is invalid to call this after `crosvm_start` is called on any `struct
93*bb4ee6a4SAndroid Build Coastguard Worker  * crosvm`.
94*bb4ee6a4SAndroid Build Coastguard Worker  */
95*bb4ee6a4SAndroid Build Coastguard Worker int crosvm_new_connection(struct crosvm*, struct crosvm**);
96*bb4ee6a4SAndroid Build Coastguard Worker 
97*bb4ee6a4SAndroid Build Coastguard Worker /*
98*bb4ee6a4SAndroid Build Coastguard Worker  * Destroys this connection and tells the parent crosvm process to stop
99*bb4ee6a4SAndroid Build Coastguard Worker  * listening for messages from it.
100*bb4ee6a4SAndroid Build Coastguard Worker  */
101*bb4ee6a4SAndroid Build Coastguard Worker int crosvm_destroy_connection(struct crosvm**);
102*bb4ee6a4SAndroid Build Coastguard Worker 
103*bb4ee6a4SAndroid Build Coastguard Worker /*
104*bb4ee6a4SAndroid Build Coastguard Worker  * Gets an eventfd that is triggered when this plugin should exit.
105*bb4ee6a4SAndroid Build Coastguard Worker  *
106*bb4ee6a4SAndroid Build Coastguard Worker  * The returned eventfd is owned by the caller but the underlying event is
107*bb4ee6a4SAndroid Build Coastguard Worker  * shared and will therefore only trigger once.
108*bb4ee6a4SAndroid Build Coastguard Worker  */
109*bb4ee6a4SAndroid Build Coastguard Worker int crosvm_get_shutdown_eventfd(struct crosvm*);
110*bb4ee6a4SAndroid Build Coastguard Worker 
111*bb4ee6a4SAndroid Build Coastguard Worker /*
112*bb4ee6a4SAndroid Build Coastguard Worker  * Gets a bool indicating if a KVM_CAP_* enum is supported on this VM
113*bb4ee6a4SAndroid Build Coastguard Worker  */
114*bb4ee6a4SAndroid Build Coastguard Worker int crosvm_check_extension(struct crosvm*, uint32_t __extension,
115*bb4ee6a4SAndroid Build Coastguard Worker                            bool *has_extension);
116*bb4ee6a4SAndroid Build Coastguard Worker 
117*bb4ee6a4SAndroid Build Coastguard Worker /*
118*bb4ee6a4SAndroid Build Coastguard Worker  * Enable an extended capability for the VM.  Currently |__flags| and
119*bb4ee6a4SAndroid Build Coastguard Worker  * |__args| must be zero.  No values for |__capability| are supported,
120*bb4ee6a4SAndroid Build Coastguard Worker  * so all calls will fail.
121*bb4ee6a4SAndroid Build Coastguard Worker  */
122*bb4ee6a4SAndroid Build Coastguard Worker int crosvm_enable_capability(struct crosvm*, uint32_t __capability,
123*bb4ee6a4SAndroid Build Coastguard Worker                              uint32_t __flags, uint64_t __args[4]);
124*bb4ee6a4SAndroid Build Coastguard Worker 
125*bb4ee6a4SAndroid Build Coastguard Worker /*
126*bb4ee6a4SAndroid Build Coastguard Worker  * Queries x86 cpuid features which are supported by the hardware and
127*bb4ee6a4SAndroid Build Coastguard Worker  * kvm.
128*bb4ee6a4SAndroid Build Coastguard Worker  */
129*bb4ee6a4SAndroid Build Coastguard Worker int crosvm_get_supported_cpuid(struct crosvm*, uint32_t __entry_count,
130*bb4ee6a4SAndroid Build Coastguard Worker                                struct kvm_cpuid_entry2 *__cpuid_entries,
131*bb4ee6a4SAndroid Build Coastguard Worker                                uint32_t *__out_count);
132*bb4ee6a4SAndroid Build Coastguard Worker 
133*bb4ee6a4SAndroid Build Coastguard Worker /*
134*bb4ee6a4SAndroid Build Coastguard Worker  * Queries x86 cpuid features which are emulated by kvm.
135*bb4ee6a4SAndroid Build Coastguard Worker  */
136*bb4ee6a4SAndroid Build Coastguard Worker int crosvm_get_emulated_cpuid(struct crosvm*, uint32_t __entry_count,
137*bb4ee6a4SAndroid Build Coastguard Worker                               struct kvm_cpuid_entry2 *__cpuid_entries,
138*bb4ee6a4SAndroid Build Coastguard Worker                               uint32_t *__out_count);
139*bb4ee6a4SAndroid Build Coastguard Worker 
140*bb4ee6a4SAndroid Build Coastguard Worker /*
141*bb4ee6a4SAndroid Build Coastguard Worker  * Queries x86 hyper-v cpuid features which are emulated by kvm.
142*bb4ee6a4SAndroid Build Coastguard Worker  */
143*bb4ee6a4SAndroid Build Coastguard Worker int crosvm_get_hyperv_cpuid(struct crosvm_vcpu*, uint32_t __entry_count,
144*bb4ee6a4SAndroid Build Coastguard Worker                             struct kvm_cpuid_entry2 *__cpuid_entries,
145*bb4ee6a4SAndroid Build Coastguard Worker                             uint32_t *__out_count);
146*bb4ee6a4SAndroid Build Coastguard Worker 
147*bb4ee6a4SAndroid Build Coastguard Worker /*
148*bb4ee6a4SAndroid Build Coastguard Worker  * Queries kvm for list of supported MSRs.
149*bb4ee6a4SAndroid Build Coastguard Worker  */
150*bb4ee6a4SAndroid Build Coastguard Worker int crosvm_get_msr_index_list(struct crosvm*, uint32_t __entry_count,
151*bb4ee6a4SAndroid Build Coastguard Worker                               uint32_t *__msr_indices,
152*bb4ee6a4SAndroid Build Coastguard Worker                               uint32_t *__out_count);
153*bb4ee6a4SAndroid Build Coastguard Worker 
154*bb4ee6a4SAndroid Build Coastguard Worker /*
155*bb4ee6a4SAndroid Build Coastguard Worker  * The network configuration for a crosvm instance.
156*bb4ee6a4SAndroid Build Coastguard Worker  */
157*bb4ee6a4SAndroid Build Coastguard Worker struct crosvm_net_config {
158*bb4ee6a4SAndroid Build Coastguard Worker   /*
159*bb4ee6a4SAndroid Build Coastguard Worker    * The tap device fd. This fd is owned by the caller, and should be closed
160*bb4ee6a4SAndroid Build Coastguard Worker    * by the caller when it is no longer in use.
161*bb4ee6a4SAndroid Build Coastguard Worker    */
162*bb4ee6a4SAndroid Build Coastguard Worker   int tap_fd;
163*bb4ee6a4SAndroid Build Coastguard Worker   /* The IPv4 address of the tap interface, in network (big-endian) format. */
164*bb4ee6a4SAndroid Build Coastguard Worker   uint32_t host_ip;
165*bb4ee6a4SAndroid Build Coastguard Worker   /* The netmask of the tap interface subnet, in network (big-endian) format. */
166*bb4ee6a4SAndroid Build Coastguard Worker   uint32_t netmask;
167*bb4ee6a4SAndroid Build Coastguard Worker   /* The mac address of the host side of the tap interface. */
168*bb4ee6a4SAndroid Build Coastguard Worker   uint8_t host_mac_address[6];
169*bb4ee6a4SAndroid Build Coastguard Worker   uint8_t _padding[2];
170*bb4ee6a4SAndroid Build Coastguard Worker };
171*bb4ee6a4SAndroid Build Coastguard Worker 
172*bb4ee6a4SAndroid Build Coastguard Worker #ifdef static_assert
173*bb4ee6a4SAndroid Build Coastguard Worker static_assert(sizeof(struct crosvm_net_config) == 20,
174*bb4ee6a4SAndroid Build Coastguard Worker               "extra padding in struct crosvm_net_config");
175*bb4ee6a4SAndroid Build Coastguard Worker #endif
176*bb4ee6a4SAndroid Build Coastguard Worker 
177*bb4ee6a4SAndroid Build Coastguard Worker /*
178*bb4ee6a4SAndroid Build Coastguard Worker  * Gets the network configuration.
179*bb4ee6a4SAndroid Build Coastguard Worker  */
180*bb4ee6a4SAndroid Build Coastguard Worker int crosvm_net_get_config(struct crosvm*, struct crosvm_net_config*);
181*bb4ee6a4SAndroid Build Coastguard Worker 
182*bb4ee6a4SAndroid Build Coastguard Worker /*
183*bb4ee6a4SAndroid Build Coastguard Worker  * Registers a range in the given address space that, when accessed, will block
184*bb4ee6a4SAndroid Build Coastguard Worker  * and wait for a crosvm_vcpu_resume call.
185*bb4ee6a4SAndroid Build Coastguard Worker  *
186*bb4ee6a4SAndroid Build Coastguard Worker  * To unreserve a range previously reserved by this function, pass the |__space|
187*bb4ee6a4SAndroid Build Coastguard Worker  * and |__start| of the old reservation with a 0 |__length|.
188*bb4ee6a4SAndroid Build Coastguard Worker  */
189*bb4ee6a4SAndroid Build Coastguard Worker int crosvm_reserve_range(struct crosvm*, uint32_t __space, uint64_t __start,
190*bb4ee6a4SAndroid Build Coastguard Worker                          uint64_t __length);
191*bb4ee6a4SAndroid Build Coastguard Worker 
192*bb4ee6a4SAndroid Build Coastguard Worker /*
193*bb4ee6a4SAndroid Build Coastguard Worker  * Registers a range in the given address space that, when accessed via write,
194*bb4ee6a4SAndroid Build Coastguard Worker  * will cause a notification in crosvm_vcpu_wait() but the VM will continue
195*bb4ee6a4SAndroid Build Coastguard Worker  * running.
196*bb4ee6a4SAndroid Build Coastguard Worker  * For this type of notification (where |no_resume| is set) the next call
197*bb4ee6a4SAndroid Build Coastguard Worker  * should be crosvm_vcpu_wait() (without an inbetween call to
198*bb4ee6a4SAndroid Build Coastguard Worker  * crosvm_vcpu_resume() ).
199*bb4ee6a4SAndroid Build Coastguard Worker  *
200*bb4ee6a4SAndroid Build Coastguard Worker  * The requested range must not overlap any prior (and currently active)
201*bb4ee6a4SAndroid Build Coastguard Worker  * reservation to crosvm_reserve_range() or crosvm_reserve_async_write_range().
202*bb4ee6a4SAndroid Build Coastguard Worker  *
203*bb4ee6a4SAndroid Build Coastguard Worker  * To unreserve a range previously reserved by this function, pass the |__space|
204*bb4ee6a4SAndroid Build Coastguard Worker  * and |__start| of the old reservation with a 0 |__length|.
205*bb4ee6a4SAndroid Build Coastguard Worker  */
206*bb4ee6a4SAndroid Build Coastguard Worker int crosvm_reserve_async_write_range(struct crosvm*, uint32_t __space,
207*bb4ee6a4SAndroid Build Coastguard Worker                                      uint64_t __start, uint64_t __length);
208*bb4ee6a4SAndroid Build Coastguard Worker 
209*bb4ee6a4SAndroid Build Coastguard Worker /*
210*bb4ee6a4SAndroid Build Coastguard Worker  * Sets the state of the given irq pin.
211*bb4ee6a4SAndroid Build Coastguard Worker  */
212*bb4ee6a4SAndroid Build Coastguard Worker int crosvm_set_irq(struct crosvm*, uint32_t __irq_id, bool __active);
213*bb4ee6a4SAndroid Build Coastguard Worker 
214*bb4ee6a4SAndroid Build Coastguard Worker enum crosvm_irq_route_kind {
215*bb4ee6a4SAndroid Build Coastguard Worker   /* IRQ pin to GSI route */
216*bb4ee6a4SAndroid Build Coastguard Worker   CROSVM_IRQ_ROUTE_IRQCHIP = 0,
217*bb4ee6a4SAndroid Build Coastguard Worker   /* MSI address and data to GSI route */
218*bb4ee6a4SAndroid Build Coastguard Worker   CROSVM_IRQ_ROUTE_MSI,
219*bb4ee6a4SAndroid Build Coastguard Worker };
220*bb4ee6a4SAndroid Build Coastguard Worker 
221*bb4ee6a4SAndroid Build Coastguard Worker /* One entry in the array of irq routing table */
222*bb4ee6a4SAndroid Build Coastguard Worker struct crosvm_irq_route {
223*bb4ee6a4SAndroid Build Coastguard Worker   /* The IRQ number to trigger. */
224*bb4ee6a4SAndroid Build Coastguard Worker   uint32_t irq_id;
225*bb4ee6a4SAndroid Build Coastguard Worker   /* A `crosvm_irq_route_kind` indicating which union member to use */
226*bb4ee6a4SAndroid Build Coastguard Worker   uint32_t kind;
227*bb4ee6a4SAndroid Build Coastguard Worker   union {
228*bb4ee6a4SAndroid Build Coastguard Worker     struct {
229*bb4ee6a4SAndroid Build Coastguard Worker       /*
230*bb4ee6a4SAndroid Build Coastguard Worker        * One of KVM_IRQCHIP_PIC_MASTER, KVM_IRQCHIP_PIC_SLAVE, or
231*bb4ee6a4SAndroid Build Coastguard Worker        * KVM_IRQCHIP_IOAPIC indicating which irqchip the indicated pin is on.
232*bb4ee6a4SAndroid Build Coastguard Worker        */
233*bb4ee6a4SAndroid Build Coastguard Worker       uint32_t irqchip;
234*bb4ee6a4SAndroid Build Coastguard Worker       /* The pin on the irqchip used to trigger the IRQ. */
235*bb4ee6a4SAndroid Build Coastguard Worker       uint32_t pin;
236*bb4ee6a4SAndroid Build Coastguard Worker     } irqchip;
237*bb4ee6a4SAndroid Build Coastguard Worker 
238*bb4ee6a4SAndroid Build Coastguard Worker     struct {
239*bb4ee6a4SAndroid Build Coastguard Worker       /* Address that triggers the irq. */
240*bb4ee6a4SAndroid Build Coastguard Worker       uint64_t address;
241*bb4ee6a4SAndroid Build Coastguard Worker       /* Data written to `address` that triggers the irq */
242*bb4ee6a4SAndroid Build Coastguard Worker       uint32_t data;
243*bb4ee6a4SAndroid Build Coastguard Worker 
244*bb4ee6a4SAndroid Build Coastguard Worker       uint8_t _reserved[4];
245*bb4ee6a4SAndroid Build Coastguard Worker     } msi;
246*bb4ee6a4SAndroid Build Coastguard Worker 
247*bb4ee6a4SAndroid Build Coastguard Worker     uint8_t _reserved[16];
248*bb4ee6a4SAndroid Build Coastguard Worker   };
249*bb4ee6a4SAndroid Build Coastguard Worker };
250*bb4ee6a4SAndroid Build Coastguard Worker 
251*bb4ee6a4SAndroid Build Coastguard Worker #ifdef static_assert
252*bb4ee6a4SAndroid Build Coastguard Worker static_assert(sizeof(struct crosvm_irq_route) == 24,
253*bb4ee6a4SAndroid Build Coastguard Worker               "extra padding in struct crosvm_irq_route");
254*bb4ee6a4SAndroid Build Coastguard Worker #endif
255*bb4ee6a4SAndroid Build Coastguard Worker 
256*bb4ee6a4SAndroid Build Coastguard Worker /*
257*bb4ee6a4SAndroid Build Coastguard Worker  * Sets all the gsi routing entries to those indicated by `routes`.
258*bb4ee6a4SAndroid Build Coastguard Worker  *
259*bb4ee6a4SAndroid Build Coastguard Worker  * To remove all routing entries, pass NULL for `routes` and 0 to route_count.
260*bb4ee6a4SAndroid Build Coastguard Worker  */
261*bb4ee6a4SAndroid Build Coastguard Worker int crosvm_set_irq_routing(struct crosvm*, uint32_t __route_count,
262*bb4ee6a4SAndroid Build Coastguard Worker                            const struct crosvm_irq_route* __routes);
263*bb4ee6a4SAndroid Build Coastguard Worker 
264*bb4ee6a4SAndroid Build Coastguard Worker /* Hint on what information is queried for a particular hypercall. */
265*bb4ee6a4SAndroid Build Coastguard Worker struct crosvm_hint_detail {
266*bb4ee6a4SAndroid Build Coastguard Worker   bool match_rax;
267*bb4ee6a4SAndroid Build Coastguard Worker   bool match_rbx;
268*bb4ee6a4SAndroid Build Coastguard Worker   bool match_rcx;
269*bb4ee6a4SAndroid Build Coastguard Worker   bool match_rdx;
270*bb4ee6a4SAndroid Build Coastguard Worker   uint8_t _reserved[4];
271*bb4ee6a4SAndroid Build Coastguard Worker   uint64_t rax;
272*bb4ee6a4SAndroid Build Coastguard Worker   uint64_t rbx;
273*bb4ee6a4SAndroid Build Coastguard Worker   uint64_t rcx;
274*bb4ee6a4SAndroid Build Coastguard Worker   uint64_t rdx;
275*bb4ee6a4SAndroid Build Coastguard Worker   bool send_sregs;
276*bb4ee6a4SAndroid Build Coastguard Worker   bool send_debugregs;
277*bb4ee6a4SAndroid Build Coastguard Worker   uint8_t _reserved2[6];
278*bb4ee6a4SAndroid Build Coastguard Worker };
279*bb4ee6a4SAndroid Build Coastguard Worker 
280*bb4ee6a4SAndroid Build Coastguard Worker #ifdef static_assert
281*bb4ee6a4SAndroid Build Coastguard Worker static_assert(sizeof(struct crosvm_hint_detail) == 48,
282*bb4ee6a4SAndroid Build Coastguard Worker               "extra padding in struct crosvm_hint_detail");
283*bb4ee6a4SAndroid Build Coastguard Worker #endif
284*bb4ee6a4SAndroid Build Coastguard Worker 
285*bb4ee6a4SAndroid Build Coastguard Worker /* Maximum # of hints that can be passed to crosvm_set_hypercall_hint(). */
286*bb4ee6a4SAndroid Build Coastguard Worker #define CROSVM_MAX_HINT_COUNT 1
287*bb4ee6a4SAndroid Build Coastguard Worker 
288*bb4ee6a4SAndroid Build Coastguard Worker /* Maximum # of hint details that can be provided for a hint. */
289*bb4ee6a4SAndroid Build Coastguard Worker #define CROSVM_MAX_HINT_DETAIL_COUNT 32
290*bb4ee6a4SAndroid Build Coastguard Worker 
291*bb4ee6a4SAndroid Build Coastguard Worker #define CROSVM_HINT_ON_WRITE 0x1
292*bb4ee6a4SAndroid Build Coastguard Worker 
293*bb4ee6a4SAndroid Build Coastguard Worker /* Hint on what information is queried for a particular hypercall. */
294*bb4ee6a4SAndroid Build Coastguard Worker struct crosvm_hint {
295*bb4ee6a4SAndroid Build Coastguard Worker   uint32_t hint_version;  /* For now only 0 is defined. */
296*bb4ee6a4SAndroid Build Coastguard Worker   uint32_t _reserved;     /* Must be zero. */
297*bb4ee6a4SAndroid Build Coastguard Worker   uint32_t address_space; /* Value from crosvm_address_space. */
298*bb4ee6a4SAndroid Build Coastguard Worker   uint16_t address_flags; /* 0: read/in; CROSVM_HINT_ON_WRITE: write/out. */
299*bb4ee6a4SAndroid Build Coastguard Worker   uint16_t details_count; /* # of elements in |details|. */
300*bb4ee6a4SAndroid Build Coastguard Worker   uint64_t address;
301*bb4ee6a4SAndroid Build Coastguard Worker   union {
302*bb4ee6a4SAndroid Build Coastguard Worker     struct crosvm_hint_detail *details;
303*bb4ee6a4SAndroid Build Coastguard Worker     uint64_t _reserved2; /* forcing pointer length to 64-bit */
304*bb4ee6a4SAndroid Build Coastguard Worker   };
305*bb4ee6a4SAndroid Build Coastguard Worker };
306*bb4ee6a4SAndroid Build Coastguard Worker 
307*bb4ee6a4SAndroid Build Coastguard Worker #ifdef static_assert
308*bb4ee6a4SAndroid Build Coastguard Worker static_assert(sizeof(struct crosvm_hint) == 32,
309*bb4ee6a4SAndroid Build Coastguard Worker               "extra padding in struct crosvm_hint");
310*bb4ee6a4SAndroid Build Coastguard Worker #endif
311*bb4ee6a4SAndroid Build Coastguard Worker 
312*bb4ee6a4SAndroid Build Coastguard Worker /*
313*bb4ee6a4SAndroid Build Coastguard Worker  * Sets performance hint(s) for a hypercall port.
314*bb4ee6a4SAndroid Build Coastguard Worker  *
315*bb4ee6a4SAndroid Build Coastguard Worker  * If a VM does an io access the specified |address_space|, |address|
316*bb4ee6a4SAndroid Build Coastguard Worker  * (|address| must be non-zero), and direction (|address_flags|), then
317*bb4ee6a4SAndroid Build Coastguard Worker  * crosvm will assume the plugin is likely to call crosvm_vcpu_get_regs()
318*bb4ee6a4SAndroid Build Coastguard Worker  * (and thus utilize a cache to improve performance).
319*bb4ee6a4SAndroid Build Coastguard Worker  *
320*bb4ee6a4SAndroid Build Coastguard Worker  * Additional hints can be provided via |details| (the element length of
321*bb4ee6a4SAndroid Build Coastguard Worker  * |details| is limited to CROSVM_MAX_HINT_DETAIL_COUNT) on when to also cache
322*bb4ee6a4SAndroid Build Coastguard Worker  * information for crosvm_vcpu_get_sregs() and crosvm_vcpu_get_debugregs()
323*bb4ee6a4SAndroid Build Coastguard Worker  * based on values in the vcpu registers.  |match_XXX| indicates which of
324*bb4ee6a4SAndroid Build Coastguard Worker  * 1 or more of |XXX| needs to be equal to the vcpu registers to be a match.
325*bb4ee6a4SAndroid Build Coastguard Worker  * On a match |send_sregs| and |send_debugregs| are used to determine what
326*bb4ee6a4SAndroid Build Coastguard Worker  * data to proactively cache for the plugin's use.  Once a match is found
327*bb4ee6a4SAndroid Build Coastguard Worker  * the remaining hints are not consulted.
328*bb4ee6a4SAndroid Build Coastguard Worker  *
329*bb4ee6a4SAndroid Build Coastguard Worker  * To remove all hints, pass 0 for |__hint_count|.  The value of
330*bb4ee6a4SAndroid Build Coastguard Worker  * |__hint_count| can be at most CROSVM_MAX_HINT_COUNT.  Currently the API
331*bb4ee6a4SAndroid Build Coastguard Worker  * is limited to 1 hint (i.e., |__hint_count| must be 0 or 1).  Each call
332*bb4ee6a4SAndroid Build Coastguard Worker  * to this API will replace the values specified by any prior call to this API.
333*bb4ee6a4SAndroid Build Coastguard Worker  */
334*bb4ee6a4SAndroid Build Coastguard Worker int crosvm_set_hypercall_hint(struct crosvm *, uint32_t __hints_count,
335*bb4ee6a4SAndroid Build Coastguard Worker                               const struct crosvm_hint* __hints);
336*bb4ee6a4SAndroid Build Coastguard Worker 
337*bb4ee6a4SAndroid Build Coastguard Worker /* Gets the state of interrupt controller in a VM. */
338*bb4ee6a4SAndroid Build Coastguard Worker int crosvm_get_pic_state(struct crosvm *, bool __primary,
339*bb4ee6a4SAndroid Build Coastguard Worker                          struct kvm_pic_state *__pic_state);
340*bb4ee6a4SAndroid Build Coastguard Worker 
341*bb4ee6a4SAndroid Build Coastguard Worker /* Sets the state of interrupt controller in a VM. */
342*bb4ee6a4SAndroid Build Coastguard Worker int crosvm_set_pic_state(struct crosvm *, bool __primary,
343*bb4ee6a4SAndroid Build Coastguard Worker                          const struct kvm_pic_state *__pic_state);
344*bb4ee6a4SAndroid Build Coastguard Worker 
345*bb4ee6a4SAndroid Build Coastguard Worker /* Gets the state of IOAPIC in a VM. */
346*bb4ee6a4SAndroid Build Coastguard Worker int crosvm_get_ioapic_state(struct crosvm *,
347*bb4ee6a4SAndroid Build Coastguard Worker                             struct kvm_ioapic_state *__ioapic_state);
348*bb4ee6a4SAndroid Build Coastguard Worker 
349*bb4ee6a4SAndroid Build Coastguard Worker /* Sets the state of IOAPIC in a VM. */
350*bb4ee6a4SAndroid Build Coastguard Worker int crosvm_set_ioapic_state(struct crosvm *,
351*bb4ee6a4SAndroid Build Coastguard Worker                             const struct kvm_ioapic_state *__ioapic_state);
352*bb4ee6a4SAndroid Build Coastguard Worker 
353*bb4ee6a4SAndroid Build Coastguard Worker /* Gets the state of interrupt controller in a VM. */
354*bb4ee6a4SAndroid Build Coastguard Worker int crosvm_get_pit_state(struct crosvm *, struct kvm_pit_state2 *__pit_state);
355*bb4ee6a4SAndroid Build Coastguard Worker 
356*bb4ee6a4SAndroid Build Coastguard Worker /* Sets the state of interrupt controller in a VM. */
357*bb4ee6a4SAndroid Build Coastguard Worker int crosvm_set_pit_state(struct crosvm *,
358*bb4ee6a4SAndroid Build Coastguard Worker                          const struct kvm_pit_state2 *__pit_state);
359*bb4ee6a4SAndroid Build Coastguard Worker 
360*bb4ee6a4SAndroid Build Coastguard Worker /* Gets the current timestamp of kvmclock as seen by the VM. */
361*bb4ee6a4SAndroid Build Coastguard Worker int crosvm_get_clock(struct crosvm *, struct kvm_clock_data *__clock_data);
362*bb4ee6a4SAndroid Build Coastguard Worker 
363*bb4ee6a4SAndroid Build Coastguard Worker /* Sets the current timestamp of kvmclock for the VM. */
364*bb4ee6a4SAndroid Build Coastguard Worker int crosvm_set_clock(struct crosvm *,
365*bb4ee6a4SAndroid Build Coastguard Worker                      const struct kvm_clock_data *__clock_data);
366*bb4ee6a4SAndroid Build Coastguard Worker 
367*bb4ee6a4SAndroid Build Coastguard Worker /* Sets the identity map address as in the KVM_SET_IDENTITY_MAP_ADDR ioctl. */
368*bb4ee6a4SAndroid Build Coastguard Worker int crosvm_set_identity_map_addr(struct crosvm*, uint32_t __addr);
369*bb4ee6a4SAndroid Build Coastguard Worker 
370*bb4ee6a4SAndroid Build Coastguard Worker /*
371*bb4ee6a4SAndroid Build Coastguard Worker  * Triggers a CROSVM_VCPU_EVENT_KIND_PAUSED event on each vcpu identified
372*bb4ee6a4SAndroid Build Coastguard Worker  * |__cpu_mask|.
373*bb4ee6a4SAndroid Build Coastguard Worker  *
374*bb4ee6a4SAndroid Build Coastguard Worker  * The `user` pointer will be given as the `user` pointer in the `struct
375*bb4ee6a4SAndroid Build Coastguard Worker  * crosvm_vcpu_event` returned by crosvm_vcpu_wait.
376*bb4ee6a4SAndroid Build Coastguard Worker  */
377*bb4ee6a4SAndroid Build Coastguard Worker int crosvm_pause_vcpus(struct crosvm*, uint64_t __cpu_mask, void* __user);
378*bb4ee6a4SAndroid Build Coastguard Worker 
379*bb4ee6a4SAndroid Build Coastguard Worker /*
380*bb4ee6a4SAndroid Build Coastguard Worker  * Call once initialization is done. This indicates that crosvm should proceed
381*bb4ee6a4SAndroid Build Coastguard Worker  * with running the VM.
382*bb4ee6a4SAndroid Build Coastguard Worker  *
383*bb4ee6a4SAndroid Build Coastguard Worker  * After this call, this function is no longer valid to call.
384*bb4ee6a4SAndroid Build Coastguard Worker  */
385*bb4ee6a4SAndroid Build Coastguard Worker int crosvm_start(struct crosvm*);
386*bb4ee6a4SAndroid Build Coastguard Worker 
387*bb4ee6a4SAndroid Build Coastguard Worker /*
388*bb4ee6a4SAndroid Build Coastguard Worker  * Allocates an eventfd that is triggered asynchronously on write in |__space|
389*bb4ee6a4SAndroid Build Coastguard Worker  * at the given |__addr|.
390*bb4ee6a4SAndroid Build Coastguard Worker  *
391*bb4ee6a4SAndroid Build Coastguard Worker  * If |__datamatch| is non-NULL, it must be contain |__length| bytes that will
392*bb4ee6a4SAndroid Build Coastguard Worker  * be compared to the bytes being written by the vcpu which will only trigger
393*bb4ee6a4SAndroid Build Coastguard Worker  * the eventfd if equal. If datamatch is NULL all writes to the address will
394*bb4ee6a4SAndroid Build Coastguard Worker  * trigger the eventfd.
395*bb4ee6a4SAndroid Build Coastguard Worker  *
396*bb4ee6a4SAndroid Build Coastguard Worker  * On successful allocation, returns a crosvm_io.  Obtain the actual fd
397*bb4ee6a4SAndroid Build Coastguard Worker  * by passing this result to crosvm_io_event_fd().
398*bb4ee6a4SAndroid Build Coastguard Worker  */
399*bb4ee6a4SAndroid Build Coastguard Worker int crosvm_create_io_event(struct crosvm*, uint32_t __space, uint64_t __addr,
400*bb4ee6a4SAndroid Build Coastguard Worker                            uint32_t __len, const uint8_t* __datamatch,
401*bb4ee6a4SAndroid Build Coastguard Worker                            struct crosvm_io**);
402*bb4ee6a4SAndroid Build Coastguard Worker 
403*bb4ee6a4SAndroid Build Coastguard Worker /*
404*bb4ee6a4SAndroid Build Coastguard Worker  * Destroys the given io event and unregisters it from the VM.
405*bb4ee6a4SAndroid Build Coastguard Worker  */
406*bb4ee6a4SAndroid Build Coastguard Worker int crosvm_destroy_io_event(struct crosvm*, struct crosvm_io**);
407*bb4ee6a4SAndroid Build Coastguard Worker 
408*bb4ee6a4SAndroid Build Coastguard Worker /*
409*bb4ee6a4SAndroid Build Coastguard Worker  * Gets the eventfd triggered by the given io event.
410*bb4ee6a4SAndroid Build Coastguard Worker  *
411*bb4ee6a4SAndroid Build Coastguard Worker  * The returned fd is owned by the given `struct crosvm_io` and has a lifetime
412*bb4ee6a4SAndroid Build Coastguard Worker  * equal to that handle.
413*bb4ee6a4SAndroid Build Coastguard Worker  */
414*bb4ee6a4SAndroid Build Coastguard Worker int crosvm_io_event_fd(struct crosvm_io*);
415*bb4ee6a4SAndroid Build Coastguard Worker 
416*bb4ee6a4SAndroid Build Coastguard Worker /*
417*bb4ee6a4SAndroid Build Coastguard Worker  * Creates a shared memory segment backed by a memfd.
418*bb4ee6a4SAndroid Build Coastguard Worker  *
419*bb4ee6a4SAndroid Build Coastguard Worker  * Inserts non-overlapping memory pages in the guest physical address range
420*bb4ee6a4SAndroid Build Coastguard Worker  * specified by |__start| address and |__length| bytes. The memory pages are
421*bb4ee6a4SAndroid Build Coastguard Worker  * backed by the memfd |__fd| and are taken starting at |__offset| bytes from
422*bb4ee6a4SAndroid Build Coastguard Worker  * the beginning of the memfd.
423*bb4ee6a4SAndroid Build Coastguard Worker  *
424*bb4ee6a4SAndroid Build Coastguard Worker  * The `memfd_create` syscall |__fd| must be used to create |__fd| and a shrink
425*bb4ee6a4SAndroid Build Coastguard Worker  * seal must have been added to |__fd|. The memfd must be at least
426*bb4ee6a4SAndroid Build Coastguard Worker  * `__length+__offset` bytes long.
427*bb4ee6a4SAndroid Build Coastguard Worker  *
428*bb4ee6a4SAndroid Build Coastguard Worker  * If |read_only| is true, attempts by the guest to write to this memory region
429*bb4ee6a4SAndroid Build Coastguard Worker  * will trigger an IO access exit.
430*bb4ee6a4SAndroid Build Coastguard Worker  *
431*bb4ee6a4SAndroid Build Coastguard Worker  * To use the `crosvm_memory_get_dirty_log` method with the returned object,
432*bb4ee6a4SAndroid Build Coastguard Worker  * |__dirty_log| must be true.
433*bb4ee6a4SAndroid Build Coastguard Worker  */
434*bb4ee6a4SAndroid Build Coastguard Worker int crosvm_create_memory(struct crosvm*, int __fd, uint64_t __offset,
435*bb4ee6a4SAndroid Build Coastguard Worker                          uint64_t __length, uint64_t __start,
436*bb4ee6a4SAndroid Build Coastguard Worker                          bool __read_only, bool __dirty_log,
437*bb4ee6a4SAndroid Build Coastguard Worker                          struct crosvm_memory**);
438*bb4ee6a4SAndroid Build Coastguard Worker 
439*bb4ee6a4SAndroid Build Coastguard Worker /*
440*bb4ee6a4SAndroid Build Coastguard Worker  * Destroys the given shared memory and unregisters it from guest physical
441*bb4ee6a4SAndroid Build Coastguard Worker  * address space.
442*bb4ee6a4SAndroid Build Coastguard Worker  */
443*bb4ee6a4SAndroid Build Coastguard Worker int crosvm_destroy_memory(struct crosvm*, struct crosvm_memory**);
444*bb4ee6a4SAndroid Build Coastguard Worker 
445*bb4ee6a4SAndroid Build Coastguard Worker /*
446*bb4ee6a4SAndroid Build Coastguard Worker  * For a given memory region returns a bitmap containing any pages
447*bb4ee6a4SAndroid Build Coastguard Worker  * dirtied since the last call to this function.
448*bb4ee6a4SAndroid Build Coastguard Worker  *
449*bb4ee6a4SAndroid Build Coastguard Worker  * The `log` array must have as many bits as the memory segment has pages.
450*bb4ee6a4SAndroid Build Coastguard Worker  */
451*bb4ee6a4SAndroid Build Coastguard Worker int crosvm_memory_get_dirty_log(struct crosvm*, struct crosvm_memory*,
452*bb4ee6a4SAndroid Build Coastguard Worker                                 uint8_t* __log);
453*bb4ee6a4SAndroid Build Coastguard Worker 
454*bb4ee6a4SAndroid Build Coastguard Worker /*
455*bb4ee6a4SAndroid Build Coastguard Worker  * Creates an irq eventfd that can be used to trigger an irq asynchronously.
456*bb4ee6a4SAndroid Build Coastguard Worker  *
457*bb4ee6a4SAndroid Build Coastguard Worker  * The irq that will be triggered is identified as pin |__irq_id|.
458*bb4ee6a4SAndroid Build Coastguard Worker  */
459*bb4ee6a4SAndroid Build Coastguard Worker int crosvm_create_irq_event(struct crosvm*, uint32_t __irq_id,
460*bb4ee6a4SAndroid Build Coastguard Worker                             struct crosvm_irq**);
461*bb4ee6a4SAndroid Build Coastguard Worker 
462*bb4ee6a4SAndroid Build Coastguard Worker /*
463*bb4ee6a4SAndroid Build Coastguard Worker  * Unregisters and destroys an irq eventfd.
464*bb4ee6a4SAndroid Build Coastguard Worker  */
465*bb4ee6a4SAndroid Build Coastguard Worker int crosvm_destroy_irq_event(struct crosvm*, struct crosvm_irq**);
466*bb4ee6a4SAndroid Build Coastguard Worker 
467*bb4ee6a4SAndroid Build Coastguard Worker /*
468*bb4ee6a4SAndroid Build Coastguard Worker  * Gets the eventfd used to trigger the irq
469*bb4ee6a4SAndroid Build Coastguard Worker  *
470*bb4ee6a4SAndroid Build Coastguard Worker  * The returned fd is owned by the given `struct crosvm_irq` and has a lifetime
471*bb4ee6a4SAndroid Build Coastguard Worker  * equal to that handle.
472*bb4ee6a4SAndroid Build Coastguard Worker  */
473*bb4ee6a4SAndroid Build Coastguard Worker int crosvm_irq_event_get_fd(const struct crosvm_irq*);
474*bb4ee6a4SAndroid Build Coastguard Worker 
475*bb4ee6a4SAndroid Build Coastguard Worker /*
476*bb4ee6a4SAndroid Build Coastguard Worker  * Gets the resample eventfd associated with the crosvm_irq object.
477*bb4ee6a4SAndroid Build Coastguard Worker  */
478*bb4ee6a4SAndroid Build Coastguard Worker int crosvm_irq_event_get_resample_fd(const struct crosvm_irq*);
479*bb4ee6a4SAndroid Build Coastguard Worker 
480*bb4ee6a4SAndroid Build Coastguard Worker enum crosvm_vcpu_event_kind {
481*bb4ee6a4SAndroid Build Coastguard Worker   /*
482*bb4ee6a4SAndroid Build Coastguard Worker    * The first event returned by crosvm_vcpu_wait, indicating the VCPU has been
483*bb4ee6a4SAndroid Build Coastguard Worker    * created but not yet started for the first time.
484*bb4ee6a4SAndroid Build Coastguard Worker    */
485*bb4ee6a4SAndroid Build Coastguard Worker   CROSVM_VCPU_EVENT_KIND_INIT = 0,
486*bb4ee6a4SAndroid Build Coastguard Worker 
487*bb4ee6a4SAndroid Build Coastguard Worker   /*
488*bb4ee6a4SAndroid Build Coastguard Worker    * Access to an address in a space previously reserved by
489*bb4ee6a4SAndroid Build Coastguard Worker    * crosvm_reserve_range.
490*bb4ee6a4SAndroid Build Coastguard Worker    */
491*bb4ee6a4SAndroid Build Coastguard Worker   CROSVM_VCPU_EVENT_KIND_IO_ACCESS,
492*bb4ee6a4SAndroid Build Coastguard Worker 
493*bb4ee6a4SAndroid Build Coastguard Worker   /*
494*bb4ee6a4SAndroid Build Coastguard Worker    * A pause on this vcpu (and possibly others) was requested by this plugin in
495*bb4ee6a4SAndroid Build Coastguard Worker    * a `crosvm_pause_vcpus` call.
496*bb4ee6a4SAndroid Build Coastguard Worker    */
497*bb4ee6a4SAndroid Build Coastguard Worker   CROSVM_VCPU_EVENT_KIND_PAUSED,
498*bb4ee6a4SAndroid Build Coastguard Worker 
499*bb4ee6a4SAndroid Build Coastguard Worker   /*
500*bb4ee6a4SAndroid Build Coastguard Worker    * Hyper-V hypercall.
501*bb4ee6a4SAndroid Build Coastguard Worker    */
502*bb4ee6a4SAndroid Build Coastguard Worker   CROSVM_VCPU_EVENT_KIND_HYPERV_HCALL,
503*bb4ee6a4SAndroid Build Coastguard Worker 
504*bb4ee6a4SAndroid Build Coastguard Worker   /*
505*bb4ee6a4SAndroid Build Coastguard Worker    * Hyper-V synic change.
506*bb4ee6a4SAndroid Build Coastguard Worker    */
507*bb4ee6a4SAndroid Build Coastguard Worker   CROSVM_VCPU_EVENT_KIND_HYPERV_SYNIC,
508*bb4ee6a4SAndroid Build Coastguard Worker };
509*bb4ee6a4SAndroid Build Coastguard Worker 
510*bb4ee6a4SAndroid Build Coastguard Worker struct crosvm_vcpu_event {
511*bb4ee6a4SAndroid Build Coastguard Worker   /* Indicates the kind of event and which union member is valid. */
512*bb4ee6a4SAndroid Build Coastguard Worker   uint32_t kind;
513*bb4ee6a4SAndroid Build Coastguard Worker 
514*bb4ee6a4SAndroid Build Coastguard Worker   uint8_t _padding[4];
515*bb4ee6a4SAndroid Build Coastguard Worker 
516*bb4ee6a4SAndroid Build Coastguard Worker   union {
517*bb4ee6a4SAndroid Build Coastguard Worker     /* CROSVM_VCPU_EVENT_KIND_IO_ACCESS */
518*bb4ee6a4SAndroid Build Coastguard Worker     struct {
519*bb4ee6a4SAndroid Build Coastguard Worker       /*
520*bb4ee6a4SAndroid Build Coastguard Worker        * One of `enum crosvm_address_space` indicating which address space the
521*bb4ee6a4SAndroid Build Coastguard Worker        * access occurred in.
522*bb4ee6a4SAndroid Build Coastguard Worker        */
523*bb4ee6a4SAndroid Build Coastguard Worker       uint32_t address_space;
524*bb4ee6a4SAndroid Build Coastguard Worker 
525*bb4ee6a4SAndroid Build Coastguard Worker       uint8_t _padding[4];
526*bb4ee6a4SAndroid Build Coastguard Worker 
527*bb4ee6a4SAndroid Build Coastguard Worker       /* The address that the access occurred at. */
528*bb4ee6a4SAndroid Build Coastguard Worker       uint64_t address;
529*bb4ee6a4SAndroid Build Coastguard Worker 
530*bb4ee6a4SAndroid Build Coastguard Worker       /*
531*bb4ee6a4SAndroid Build Coastguard Worker        * In the case that `is_write` is true, the first `length` bytes are the
532*bb4ee6a4SAndroid Build Coastguard Worker        * data being written by the vcpu.
533*bb4ee6a4SAndroid Build Coastguard Worker        */
534*bb4ee6a4SAndroid Build Coastguard Worker       uint8_t *data;
535*bb4ee6a4SAndroid Build Coastguard Worker 
536*bb4ee6a4SAndroid Build Coastguard Worker       /*
537*bb4ee6a4SAndroid Build Coastguard Worker        * Number of bytes in the access. In the case that the access is larger
538*bb4ee6a4SAndroid Build Coastguard Worker        * than 8 bytes, such as by AVX-512 instructions, multiple vcpu access
539*bb4ee6a4SAndroid Build Coastguard Worker        * events are generated serially to cover each 8 byte fragment of the
540*bb4ee6a4SAndroid Build Coastguard Worker        * access.
541*bb4ee6a4SAndroid Build Coastguard Worker        *
542*bb4ee6a4SAndroid Build Coastguard Worker        * Larger I/O accesses are possible.  "rep in" can generate I/Os larger
543*bb4ee6a4SAndroid Build Coastguard Worker        * than 8 bytes, though such accesses can also be split into multiple
544*bb4ee6a4SAndroid Build Coastguard Worker        * events.  Currently kvm doesn't seem to batch "rep out" I/Os.
545*bb4ee6a4SAndroid Build Coastguard Worker        */
546*bb4ee6a4SAndroid Build Coastguard Worker       uint32_t length;
547*bb4ee6a4SAndroid Build Coastguard Worker 
548*bb4ee6a4SAndroid Build Coastguard Worker       /*
549*bb4ee6a4SAndroid Build Coastguard Worker        * True if the vcpu was attempting to write, false in case of an attempt
550*bb4ee6a4SAndroid Build Coastguard Worker        * to read.
551*bb4ee6a4SAndroid Build Coastguard Worker        */
552*bb4ee6a4SAndroid Build Coastguard Worker       uint8_t is_write;
553*bb4ee6a4SAndroid Build Coastguard Worker 
554*bb4ee6a4SAndroid Build Coastguard Worker       /*
555*bb4ee6a4SAndroid Build Coastguard Worker        * Valid when |is_write| is true -- indicates that VM has continued
556*bb4ee6a4SAndroid Build Coastguard Worker        * to run.  The only next valid call for the vcpu is crosvm_vcpu_wait().
557*bb4ee6a4SAndroid Build Coastguard Worker        */
558*bb4ee6a4SAndroid Build Coastguard Worker       uint8_t no_resume;
559*bb4ee6a4SAndroid Build Coastguard Worker 
560*bb4ee6a4SAndroid Build Coastguard Worker       uint8_t _reserved[2];
561*bb4ee6a4SAndroid Build Coastguard Worker     } io_access;
562*bb4ee6a4SAndroid Build Coastguard Worker 
563*bb4ee6a4SAndroid Build Coastguard Worker     /* CROSVM_VCPU_EVENT_KIND_PAUSED */
564*bb4ee6a4SAndroid Build Coastguard Worker     void *user;
565*bb4ee6a4SAndroid Build Coastguard Worker 
566*bb4ee6a4SAndroid Build Coastguard Worker     /* CROSVM_VCPU_EVENT_KIND_HYPERV_HCALL */
567*bb4ee6a4SAndroid Build Coastguard Worker     struct {
568*bb4ee6a4SAndroid Build Coastguard Worker       /*
569*bb4ee6a4SAndroid Build Coastguard Worker        * The |input| and |params| members are populated for the plugin to use.
570*bb4ee6a4SAndroid Build Coastguard Worker        * The |result| member is populated by the API to point to a uint64_t
571*bb4ee6a4SAndroid Build Coastguard Worker        * that the plugin should update before resuming.
572*bb4ee6a4SAndroid Build Coastguard Worker        */
573*bb4ee6a4SAndroid Build Coastguard Worker       uint64_t input;
574*bb4ee6a4SAndroid Build Coastguard Worker       uint64_t *result;
575*bb4ee6a4SAndroid Build Coastguard Worker       uint64_t params[2];
576*bb4ee6a4SAndroid Build Coastguard Worker     } hyperv_call;
577*bb4ee6a4SAndroid Build Coastguard Worker 
578*bb4ee6a4SAndroid Build Coastguard Worker     /* CROSVM_VCPU_EVENT_KIND_HYPERV_SYNIC */
579*bb4ee6a4SAndroid Build Coastguard Worker     struct {
580*bb4ee6a4SAndroid Build Coastguard Worker       /*
581*bb4ee6a4SAndroid Build Coastguard Worker        * The |msr|, |control|, |evt_page|, and |msg_page| fields are populated
582*bb4ee6a4SAndroid Build Coastguard Worker        * for the plugin to use.
583*bb4ee6a4SAndroid Build Coastguard Worker        */
584*bb4ee6a4SAndroid Build Coastguard Worker       uint32_t msr;
585*bb4ee6a4SAndroid Build Coastguard Worker       uint32_t _reserved;
586*bb4ee6a4SAndroid Build Coastguard Worker       uint64_t control;
587*bb4ee6a4SAndroid Build Coastguard Worker       uint64_t evt_page;
588*bb4ee6a4SAndroid Build Coastguard Worker       uint64_t msg_page;
589*bb4ee6a4SAndroid Build Coastguard Worker     } hyperv_synic;
590*bb4ee6a4SAndroid Build Coastguard Worker 
591*bb4ee6a4SAndroid Build Coastguard Worker     uint8_t _reserved[64];
592*bb4ee6a4SAndroid Build Coastguard Worker   };
593*bb4ee6a4SAndroid Build Coastguard Worker };
594*bb4ee6a4SAndroid Build Coastguard Worker 
595*bb4ee6a4SAndroid Build Coastguard Worker #ifdef static_assert
596*bb4ee6a4SAndroid Build Coastguard Worker static_assert(sizeof(struct crosvm_vcpu_event) == 72,
597*bb4ee6a4SAndroid Build Coastguard Worker               "extra padding in struct crosvm_vcpu_event");
598*bb4ee6a4SAndroid Build Coastguard Worker #endif
599*bb4ee6a4SAndroid Build Coastguard Worker 
600*bb4ee6a4SAndroid Build Coastguard Worker /*
601*bb4ee6a4SAndroid Build Coastguard Worker  * Gets the vcpu object for the given |__cpu_id|.
602*bb4ee6a4SAndroid Build Coastguard Worker  *
603*bb4ee6a4SAndroid Build Coastguard Worker  *
604*bb4ee6a4SAndroid Build Coastguard Worker  * The `struct crosvm_vcpu` is owned by `struct crosvm`. Each call with the same
605*bb4ee6a4SAndroid Build Coastguard Worker  * `crosvm` and |__cpu_id| will yield the same pointer. The `crosvm_vcpu` does
606*bb4ee6a4SAndroid Build Coastguard Worker  * not need to be destroyed or created explicitly.
607*bb4ee6a4SAndroid Build Coastguard Worker  *
608*bb4ee6a4SAndroid Build Coastguard Worker  * The range of valid |__cpu_id|s is 0 to the number of vcpus - 1. To get every
609*bb4ee6a4SAndroid Build Coastguard Worker  * `crosvm_vcpu`, simply call this function iteratively with increasing
610*bb4ee6a4SAndroid Build Coastguard Worker  * |__cpu_id| until `-ENOENT` is returned.
611*bb4ee6a4SAndroid Build Coastguard Worker  *
612*bb4ee6a4SAndroid Build Coastguard Worker  */
613*bb4ee6a4SAndroid Build Coastguard Worker int crosvm_get_vcpu(struct crosvm*, uint32_t __cpu_id, struct crosvm_vcpu**);
614*bb4ee6a4SAndroid Build Coastguard Worker 
615*bb4ee6a4SAndroid Build Coastguard Worker /*
616*bb4ee6a4SAndroid Build Coastguard Worker  * Blocks until a vcpu event happens that requires a response.
617*bb4ee6a4SAndroid Build Coastguard Worker  *
618*bb4ee6a4SAndroid Build Coastguard Worker  * When crosvm_vcpu_wait returns successfully, the event structure is filled
619*bb4ee6a4SAndroid Build Coastguard Worker  * with the description of the event that occurred. The vcpu will suspend
620*bb4ee6a4SAndroid Build Coastguard Worker  * execution until a matching call to `crosvm_vcpu_resume` is made. Until such a
621*bb4ee6a4SAndroid Build Coastguard Worker  * call is made, the vcpu's run structure can be read and written using any
622*bb4ee6a4SAndroid Build Coastguard Worker  * `crosvm_vcpu_get` or `crosvm_vcpu_set` function.
623*bb4ee6a4SAndroid Build Coastguard Worker  */
624*bb4ee6a4SAndroid Build Coastguard Worker int crosvm_vcpu_wait(struct crosvm_vcpu*, struct crosvm_vcpu_event*);
625*bb4ee6a4SAndroid Build Coastguard Worker 
626*bb4ee6a4SAndroid Build Coastguard Worker /*
627*bb4ee6a4SAndroid Build Coastguard Worker  * Resumes execution of a vcpu after a call to `crosvm_vcpu_wait` returns.
628*bb4ee6a4SAndroid Build Coastguard Worker  *
629*bb4ee6a4SAndroid Build Coastguard Worker  * In the case that the event was a read operation, `data` indicates what the
630*bb4ee6a4SAndroid Build Coastguard Worker  * result of that read operation should be. If the read operation was larger
631*bb4ee6a4SAndroid Build Coastguard Worker  * than 8 bytes, such as by AVX-512 instructions, this will not actually resume
632*bb4ee6a4SAndroid Build Coastguard Worker  * the vcpu, but instead generate another vcpu access event of the next fragment
633*bb4ee6a4SAndroid Build Coastguard Worker  * of the read, which can be handled by the next `crosvm_vcpu_wait` call.
634*bb4ee6a4SAndroid Build Coastguard Worker  *
635*bb4ee6a4SAndroid Build Coastguard Worker  * Once the vcpu event has been responded to sufficiently enough to resume
636*bb4ee6a4SAndroid Build Coastguard Worker  * execution, `crosvm_vcpu_resume` should be called. After `crosvm_vcpu_resume`
637*bb4ee6a4SAndroid Build Coastguard Worker  * is called, none of the vcpu state operations are valid until the next time
638*bb4ee6a4SAndroid Build Coastguard Worker  * `crosvm_vcpu_wait` returns.
639*bb4ee6a4SAndroid Build Coastguard Worker  */
640*bb4ee6a4SAndroid Build Coastguard Worker int crosvm_vcpu_resume(struct crosvm_vcpu*);
641*bb4ee6a4SAndroid Build Coastguard Worker 
642*bb4ee6a4SAndroid Build Coastguard Worker /* Gets the state of the vcpu's registers. */
643*bb4ee6a4SAndroid Build Coastguard Worker int crosvm_vcpu_get_regs(struct crosvm_vcpu*, struct kvm_regs*);
644*bb4ee6a4SAndroid Build Coastguard Worker /* Sets the state of the vcpu's registers. */
645*bb4ee6a4SAndroid Build Coastguard Worker int crosvm_vcpu_set_regs(struct crosvm_vcpu*, const struct kvm_regs*);
646*bb4ee6a4SAndroid Build Coastguard Worker 
647*bb4ee6a4SAndroid Build Coastguard Worker /* Gets the state of the vcpu's special registers. */
648*bb4ee6a4SAndroid Build Coastguard Worker int crosvm_vcpu_get_sregs(struct crosvm_vcpu*, struct kvm_sregs*);
649*bb4ee6a4SAndroid Build Coastguard Worker /* Sets the state of the vcpu's special registers. */
650*bb4ee6a4SAndroid Build Coastguard Worker int crosvm_vcpu_set_sregs(struct crosvm_vcpu*, const struct kvm_sregs*);
651*bb4ee6a4SAndroid Build Coastguard Worker 
652*bb4ee6a4SAndroid Build Coastguard Worker /* Gets the state of the vcpu's floating point unint. */
653*bb4ee6a4SAndroid Build Coastguard Worker int crosvm_vcpu_get_fpu(struct crosvm_vcpu*, struct kvm_fpu*);
654*bb4ee6a4SAndroid Build Coastguard Worker /* Sets the state of the vcpu's floating point unint. */
655*bb4ee6a4SAndroid Build Coastguard Worker int crosvm_vcpu_set_fpu(struct crosvm_vcpu*, const struct kvm_fpu*);
656*bb4ee6a4SAndroid Build Coastguard Worker 
657*bb4ee6a4SAndroid Build Coastguard Worker /* Gets the state of the vcpu's debug registers. */
658*bb4ee6a4SAndroid Build Coastguard Worker int crosvm_vcpu_get_debugregs(struct crosvm_vcpu*, struct kvm_debugregs*);
659*bb4ee6a4SAndroid Build Coastguard Worker /* Sets the state of the vcpu's debug registers */
660*bb4ee6a4SAndroid Build Coastguard Worker int crosvm_vcpu_set_debugregs(struct crosvm_vcpu*, const struct kvm_debugregs*);
661*bb4ee6a4SAndroid Build Coastguard Worker 
662*bb4ee6a4SAndroid Build Coastguard Worker /* Gets the state of the vcpu's xcr registers. */
663*bb4ee6a4SAndroid Build Coastguard Worker int crosvm_vcpu_get_xcrs(struct crosvm_vcpu*, struct kvm_xcrs*);
664*bb4ee6a4SAndroid Build Coastguard Worker /* Sets the state of the vcpu's xcr registers. */
665*bb4ee6a4SAndroid Build Coastguard Worker int crosvm_vcpu_set_xcrs(struct crosvm_vcpu*, const struct kvm_xcrs*);
666*bb4ee6a4SAndroid Build Coastguard Worker 
667*bb4ee6a4SAndroid Build Coastguard Worker /* Gets the MSRs of the vcpu indicated by the index field of each entry. */
668*bb4ee6a4SAndroid Build Coastguard Worker int crosvm_vcpu_get_msrs(struct crosvm_vcpu*, uint32_t __msr_count,
669*bb4ee6a4SAndroid Build Coastguard Worker                          struct kvm_msr_entry *__msr_entries,
670*bb4ee6a4SAndroid Build Coastguard Worker                          uint32_t *__out_count);
671*bb4ee6a4SAndroid Build Coastguard Worker /* Sets the MSRs of the vcpu indicated by the index field of each entry. */
672*bb4ee6a4SAndroid Build Coastguard Worker int crosvm_vcpu_set_msrs(struct crosvm_vcpu*, uint32_t __msr_count,
673*bb4ee6a4SAndroid Build Coastguard Worker                          const struct kvm_msr_entry *__msr_entries);
674*bb4ee6a4SAndroid Build Coastguard Worker 
675*bb4ee6a4SAndroid Build Coastguard Worker /* Sets the responses to the cpuid instructions executed on this vcpu, */
676*bb4ee6a4SAndroid Build Coastguard Worker int crosvm_vcpu_set_cpuid(struct crosvm_vcpu*, uint32_t __cpuid_count,
677*bb4ee6a4SAndroid Build Coastguard Worker                           const struct kvm_cpuid_entry2 *__cpuid_entries);
678*bb4ee6a4SAndroid Build Coastguard Worker 
679*bb4ee6a4SAndroid Build Coastguard Worker /*
680*bb4ee6a4SAndroid Build Coastguard Worker  * Enable an extended capability for a vcpu.  Currently |__flags| and
681*bb4ee6a4SAndroid Build Coastguard Worker  * |__args| must be zero.  The only permitted values for |__capability|
682*bb4ee6a4SAndroid Build Coastguard Worker  * are KVM_CAP_HYPERV_SYNIC or KVM_CAP_HYPERV_SYNIC2, though the latter
683*bb4ee6a4SAndroid Build Coastguard Worker  * also depends on kernel support.
684*bb4ee6a4SAndroid Build Coastguard Worker  */
685*bb4ee6a4SAndroid Build Coastguard Worker int crosvm_vcpu_enable_capability(struct crosvm_vcpu*, uint32_t __capability,
686*bb4ee6a4SAndroid Build Coastguard Worker                                   uint32_t __flags, uint64_t __args[4]);
687*bb4ee6a4SAndroid Build Coastguard Worker 
688*bb4ee6a4SAndroid Build Coastguard Worker /* Gets state of LAPIC of the VCPU. */
689*bb4ee6a4SAndroid Build Coastguard Worker int crosvm_vcpu_get_lapic_state(struct crosvm_vcpu *,
690*bb4ee6a4SAndroid Build Coastguard Worker                                 struct kvm_lapic_state *__lapic_state);
691*bb4ee6a4SAndroid Build Coastguard Worker /* Sets state of LAPIC of the VCPU. */
692*bb4ee6a4SAndroid Build Coastguard Worker int crosvm_vcpu_set_lapic_state(struct crosvm_vcpu *,
693*bb4ee6a4SAndroid Build Coastguard Worker                                 const struct kvm_lapic_state *__lapic_state);
694*bb4ee6a4SAndroid Build Coastguard Worker 
695*bb4ee6a4SAndroid Build Coastguard Worker /* Gets the "multiprocessor state" of given VCPU. */
696*bb4ee6a4SAndroid Build Coastguard Worker int crosvm_vcpu_get_mp_state(struct crosvm_vcpu *,
697*bb4ee6a4SAndroid Build Coastguard Worker                              struct kvm_mp_state *__mp_state);
698*bb4ee6a4SAndroid Build Coastguard Worker /* Sets the "multiprocessor state" of given VCPU. */
699*bb4ee6a4SAndroid Build Coastguard Worker int crosvm_vcpu_set_mp_state(struct crosvm_vcpu *,
700*bb4ee6a4SAndroid Build Coastguard Worker                              const struct kvm_mp_state *__mp_state);
701*bb4ee6a4SAndroid Build Coastguard Worker 
702*bb4ee6a4SAndroid Build Coastguard Worker /* Gets currently pending exceptions, interrupts, NMIs, etc for VCPU. */
703*bb4ee6a4SAndroid Build Coastguard Worker int crosvm_vcpu_get_vcpu_events(struct crosvm_vcpu *,
704*bb4ee6a4SAndroid Build Coastguard Worker                                 struct kvm_vcpu_events *);
705*bb4ee6a4SAndroid Build Coastguard Worker 
706*bb4ee6a4SAndroid Build Coastguard Worker /* Sets currently pending exceptions, interrupts, NMIs, etc for VCPU. */
707*bb4ee6a4SAndroid Build Coastguard Worker int crosvm_vcpu_set_vcpu_events(struct crosvm_vcpu *,
708*bb4ee6a4SAndroid Build Coastguard Worker                                 const struct kvm_vcpu_events *);
709*bb4ee6a4SAndroid Build Coastguard Worker 
710*bb4ee6a4SAndroid Build Coastguard Worker #ifdef  __cplusplus
711*bb4ee6a4SAndroid Build Coastguard Worker }
712*bb4ee6a4SAndroid Build Coastguard Worker #endif
713*bb4ee6a4SAndroid Build Coastguard Worker 
714*bb4ee6a4SAndroid Build Coastguard Worker #endif
715