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