1*bb4ee6a4SAndroid Build Coastguard Workersyntax = "proto3"; 2*bb4ee6a4SAndroid Build Coastguard Worker 3*bb4ee6a4SAndroid Build Coastguard Worker// The protocol defined here is actually two sub-protocols, one protocol for control of the main 4*bb4ee6a4SAndroid Build Coastguard Worker// process (MainRequest/MainResponse), and one for control of each VCPU thread 5*bb4ee6a4SAndroid Build Coastguard Worker// (VcpuRequest/VcpuResponse). Each protocol works the same: the client creates a protobuf of either 6*bb4ee6a4SAndroid Build Coastguard Worker// a MainRequest or VcpuRequest, sends it encoded over the main socket or one of the vcpu sockets, 7*bb4ee6a4SAndroid Build Coastguard Worker// reads the the MainResponse or VcpuResponse over the same socket and decodes it as a protobuf. For 8*bb4ee6a4SAndroid Build Coastguard Worker// specific information on the purpose of each request, see the C API in crosvm.h. Most requests 9*bb4ee6a4SAndroid Build Coastguard Worker// here map 1:1 to a function in that API. Only the intricacies unique to the wire protocol are 10*bb4ee6a4SAndroid Build Coastguard Worker// commented on here. 11*bb4ee6a4SAndroid Build Coastguard Worker 12*bb4ee6a4SAndroid Build Coastguard Workerenum AddressSpace { 13*bb4ee6a4SAndroid Build Coastguard Worker IOPORT = 0; 14*bb4ee6a4SAndroid Build Coastguard Worker MMIO = 1; 15*bb4ee6a4SAndroid Build Coastguard Worker } 16*bb4ee6a4SAndroid Build Coastguard Worker 17*bb4ee6a4SAndroid Build Coastguard Workermessage CpuidEntry { 18*bb4ee6a4SAndroid Build Coastguard Worker uint32 function = 1; 19*bb4ee6a4SAndroid Build Coastguard Worker bool has_index = 3; 20*bb4ee6a4SAndroid Build Coastguard Worker uint32 index = 4; 21*bb4ee6a4SAndroid Build Coastguard Worker uint32 eax = 5; 22*bb4ee6a4SAndroid Build Coastguard Worker uint32 ebx = 6; 23*bb4ee6a4SAndroid Build Coastguard Worker uint32 ecx = 7; 24*bb4ee6a4SAndroid Build Coastguard Worker uint32 edx = 8; 25*bb4ee6a4SAndroid Build Coastguard Worker} 26*bb4ee6a4SAndroid Build Coastguard Worker 27*bb4ee6a4SAndroid Build Coastguard Worker// A request made to the crosvm main process that affects the global aspects of the VM. 28*bb4ee6a4SAndroid Build Coastguard Workermessage MainRequest { 29*bb4ee6a4SAndroid Build Coastguard Worker // Every message under the Create namespace will instantiate an object with the given ID. The 30*bb4ee6a4SAndroid Build Coastguard Worker // type of object is determined by the oneof constructor field. 31*bb4ee6a4SAndroid Build Coastguard Worker message Create { 32*bb4ee6a4SAndroid Build Coastguard Worker message IoEvent { 33*bb4ee6a4SAndroid Build Coastguard Worker AddressSpace space = 1; 34*bb4ee6a4SAndroid Build Coastguard Worker uint64 address = 2; 35*bb4ee6a4SAndroid Build Coastguard Worker uint32 length = 3; 36*bb4ee6a4SAndroid Build Coastguard Worker uint64 datamatch = 4; 37*bb4ee6a4SAndroid Build Coastguard Worker } 38*bb4ee6a4SAndroid Build Coastguard Worker 39*bb4ee6a4SAndroid Build Coastguard Worker message Memory { 40*bb4ee6a4SAndroid Build Coastguard Worker uint64 offset = 1; 41*bb4ee6a4SAndroid Build Coastguard Worker uint64 start = 2; 42*bb4ee6a4SAndroid Build Coastguard Worker uint64 length = 3; 43*bb4ee6a4SAndroid Build Coastguard Worker bool read_only = 4; 44*bb4ee6a4SAndroid Build Coastguard Worker // Must be true for the MemoryDirtyLog method to work on this object. 45*bb4ee6a4SAndroid Build Coastguard Worker bool dirty_log = 5; 46*bb4ee6a4SAndroid Build Coastguard Worker } 47*bb4ee6a4SAndroid Build Coastguard Worker 48*bb4ee6a4SAndroid Build Coastguard Worker message IrqEvent { 49*bb4ee6a4SAndroid Build Coastguard Worker uint32 irq_id = 1; 50*bb4ee6a4SAndroid Build Coastguard Worker bool resample = 2; 51*bb4ee6a4SAndroid Build Coastguard Worker } 52*bb4ee6a4SAndroid Build Coastguard Worker 53*bb4ee6a4SAndroid Build Coastguard Worker uint32 id = 1; 54*bb4ee6a4SAndroid Build Coastguard Worker oneof constructor { 55*bb4ee6a4SAndroid Build Coastguard Worker IoEvent io_event = 2; 56*bb4ee6a4SAndroid Build Coastguard Worker // This message also requires a memfd sent over the socket. 57*bb4ee6a4SAndroid Build Coastguard Worker Memory memory = 3; 58*bb4ee6a4SAndroid Build Coastguard Worker IrqEvent irq_event = 4; 59*bb4ee6a4SAndroid Build Coastguard Worker } 60*bb4ee6a4SAndroid Build Coastguard Worker } 61*bb4ee6a4SAndroid Build Coastguard Worker 62*bb4ee6a4SAndroid Build Coastguard Worker // No matter what the type an object is, it can be destroyed using this common method. 63*bb4ee6a4SAndroid Build Coastguard Worker message Destroy { 64*bb4ee6a4SAndroid Build Coastguard Worker uint32 id = 1; 65*bb4ee6a4SAndroid Build Coastguard Worker } 66*bb4ee6a4SAndroid Build Coastguard Worker 67*bb4ee6a4SAndroid Build Coastguard Worker message NewConnection {} 68*bb4ee6a4SAndroid Build Coastguard Worker 69*bb4ee6a4SAndroid Build Coastguard Worker message GetShutdownEventfd {} 70*bb4ee6a4SAndroid Build Coastguard Worker 71*bb4ee6a4SAndroid Build Coastguard Worker message CheckExtension { 72*bb4ee6a4SAndroid Build Coastguard Worker uint32 extension = 1; 73*bb4ee6a4SAndroid Build Coastguard Worker } 74*bb4ee6a4SAndroid Build Coastguard Worker 75*bb4ee6a4SAndroid Build Coastguard Worker message CpuidRequest { 76*bb4ee6a4SAndroid Build Coastguard Worker } 77*bb4ee6a4SAndroid Build Coastguard Worker 78*bb4ee6a4SAndroid Build Coastguard Worker message MsrListRequest { 79*bb4ee6a4SAndroid Build Coastguard Worker } 80*bb4ee6a4SAndroid Build Coastguard Worker 81*bb4ee6a4SAndroid Build Coastguard Worker message GetNetConfig {} 82*bb4ee6a4SAndroid Build Coastguard Worker 83*bb4ee6a4SAndroid Build Coastguard Worker message ReserveRange { 84*bb4ee6a4SAndroid Build Coastguard Worker AddressSpace space = 1; 85*bb4ee6a4SAndroid Build Coastguard Worker uint64 start = 2; 86*bb4ee6a4SAndroid Build Coastguard Worker uint64 length = 3; 87*bb4ee6a4SAndroid Build Coastguard Worker bool async_write = 4; 88*bb4ee6a4SAndroid Build Coastguard Worker } 89*bb4ee6a4SAndroid Build Coastguard Worker 90*bb4ee6a4SAndroid Build Coastguard Worker message SetIrq { 91*bb4ee6a4SAndroid Build Coastguard Worker uint32 irq_id = 1; 92*bb4ee6a4SAndroid Build Coastguard Worker bool active = 2; 93*bb4ee6a4SAndroid Build Coastguard Worker } 94*bb4ee6a4SAndroid Build Coastguard Worker 95*bb4ee6a4SAndroid Build Coastguard Worker message SetIrqRouting { 96*bb4ee6a4SAndroid Build Coastguard Worker message Route { 97*bb4ee6a4SAndroid Build Coastguard Worker message Irqchip { 98*bb4ee6a4SAndroid Build Coastguard Worker uint32 irqchip = 1; 99*bb4ee6a4SAndroid Build Coastguard Worker uint32 pin = 2; 100*bb4ee6a4SAndroid Build Coastguard Worker } 101*bb4ee6a4SAndroid Build Coastguard Worker 102*bb4ee6a4SAndroid Build Coastguard Worker message Msi { 103*bb4ee6a4SAndroid Build Coastguard Worker uint64 address = 1; 104*bb4ee6a4SAndroid Build Coastguard Worker uint32 data = 2; 105*bb4ee6a4SAndroid Build Coastguard Worker } 106*bb4ee6a4SAndroid Build Coastguard Worker 107*bb4ee6a4SAndroid Build Coastguard Worker uint32 irq_id = 1; 108*bb4ee6a4SAndroid Build Coastguard Worker oneof route { 109*bb4ee6a4SAndroid Build Coastguard Worker Irqchip irqchip = 2; 110*bb4ee6a4SAndroid Build Coastguard Worker Msi msi = 3; 111*bb4ee6a4SAndroid Build Coastguard Worker } 112*bb4ee6a4SAndroid Build Coastguard Worker } 113*bb4ee6a4SAndroid Build Coastguard Worker 114*bb4ee6a4SAndroid Build Coastguard Worker repeated Route routes = 1; 115*bb4ee6a4SAndroid Build Coastguard Worker } 116*bb4ee6a4SAndroid Build Coastguard Worker 117*bb4ee6a4SAndroid Build Coastguard Worker // Each type refers to certain piece of VM state (such as PIT state). 118*bb4ee6a4SAndroid Build Coastguard Worker // The structure of the data corresponds to the kvm structure. 119*bb4ee6a4SAndroid Build Coastguard Worker enum StateSet { 120*bb4ee6a4SAndroid Build Coastguard Worker // struct kvm_pic_state 121*bb4ee6a4SAndroid Build Coastguard Worker PIC0 = 0; 122*bb4ee6a4SAndroid Build Coastguard Worker // struct kvm_pic_state 123*bb4ee6a4SAndroid Build Coastguard Worker PIC1 = 1; 124*bb4ee6a4SAndroid Build Coastguard Worker // struct kvm_ioapic_state 125*bb4ee6a4SAndroid Build Coastguard Worker IOAPIC = 2; 126*bb4ee6a4SAndroid Build Coastguard Worker // struct kvm_pit_state2 127*bb4ee6a4SAndroid Build Coastguard Worker PIT = 3; 128*bb4ee6a4SAndroid Build Coastguard Worker // struct kvm_clock_data 129*bb4ee6a4SAndroid Build Coastguard Worker CLOCK = 4; 130*bb4ee6a4SAndroid Build Coastguard Worker } 131*bb4ee6a4SAndroid Build Coastguard Worker 132*bb4ee6a4SAndroid Build Coastguard Worker message GetState { 133*bb4ee6a4SAndroid Build Coastguard Worker StateSet set = 1; 134*bb4ee6a4SAndroid Build Coastguard Worker } 135*bb4ee6a4SAndroid Build Coastguard Worker 136*bb4ee6a4SAndroid Build Coastguard Worker message SetState { 137*bb4ee6a4SAndroid Build Coastguard Worker StateSet set = 1; 138*bb4ee6a4SAndroid Build Coastguard Worker // The in memory representation of certain state, depending on the value 139*bb4ee6a4SAndroid Build Coastguard Worker // of the StateSet. 140*bb4ee6a4SAndroid Build Coastguard Worker bytes state = 2; 141*bb4ee6a4SAndroid Build Coastguard Worker } 142*bb4ee6a4SAndroid Build Coastguard Worker 143*bb4ee6a4SAndroid Build Coastguard Worker message SetIdentityMapAddr { 144*bb4ee6a4SAndroid Build Coastguard Worker uint32 address = 1; 145*bb4ee6a4SAndroid Build Coastguard Worker } 146*bb4ee6a4SAndroid Build Coastguard Worker 147*bb4ee6a4SAndroid Build Coastguard Worker message PauseVcpus { 148*bb4ee6a4SAndroid Build Coastguard Worker uint64 cpu_mask = 1; 149*bb4ee6a4SAndroid Build Coastguard Worker uint64 user = 2; 150*bb4ee6a4SAndroid Build Coastguard Worker } 151*bb4ee6a4SAndroid Build Coastguard Worker 152*bb4ee6a4SAndroid Build Coastguard Worker message GetVcpus {} 153*bb4ee6a4SAndroid Build Coastguard Worker message Start {} 154*bb4ee6a4SAndroid Build Coastguard Worker 155*bb4ee6a4SAndroid Build Coastguard Worker message SetCallHint { 156*bb4ee6a4SAndroid Build Coastguard Worker message RegHint { 157*bb4ee6a4SAndroid Build Coastguard Worker bool match_rax = 1; 158*bb4ee6a4SAndroid Build Coastguard Worker bool match_rbx = 2; 159*bb4ee6a4SAndroid Build Coastguard Worker bool match_rcx = 3; 160*bb4ee6a4SAndroid Build Coastguard Worker bool match_rdx = 4; 161*bb4ee6a4SAndroid Build Coastguard Worker uint64 rax = 5; 162*bb4ee6a4SAndroid Build Coastguard Worker uint64 rbx = 6; 163*bb4ee6a4SAndroid Build Coastguard Worker uint64 rcx = 7; 164*bb4ee6a4SAndroid Build Coastguard Worker uint64 rdx = 8; 165*bb4ee6a4SAndroid Build Coastguard Worker bool send_sregs = 9; 166*bb4ee6a4SAndroid Build Coastguard Worker bool send_debugregs = 10; 167*bb4ee6a4SAndroid Build Coastguard Worker } 168*bb4ee6a4SAndroid Build Coastguard Worker 169*bb4ee6a4SAndroid Build Coastguard Worker AddressSpace space = 1; 170*bb4ee6a4SAndroid Build Coastguard Worker uint64 address = 2; 171*bb4ee6a4SAndroid Build Coastguard Worker bool on_write = 3; 172*bb4ee6a4SAndroid Build Coastguard Worker 173*bb4ee6a4SAndroid Build Coastguard Worker repeated RegHint hints = 4; 174*bb4ee6a4SAndroid Build Coastguard Worker } 175*bb4ee6a4SAndroid Build Coastguard Worker 176*bb4ee6a4SAndroid Build Coastguard Worker message MemoryDirtyLog { 177*bb4ee6a4SAndroid Build Coastguard Worker uint32 id = 1; 178*bb4ee6a4SAndroid Build Coastguard Worker } 179*bb4ee6a4SAndroid Build Coastguard Worker 180*bb4ee6a4SAndroid Build Coastguard Worker // The type of the message is determined by which of these oneof fields is present in the 181*bb4ee6a4SAndroid Build Coastguard Worker // protobuf. 182*bb4ee6a4SAndroid Build Coastguard Worker oneof message { 183*bb4ee6a4SAndroid Build Coastguard Worker // Common method for instantiating a new object of any type. 184*bb4ee6a4SAndroid Build Coastguard Worker Create create = 1; 185*bb4ee6a4SAndroid Build Coastguard Worker // Common method for destroying an object of any type. 186*bb4ee6a4SAndroid Build Coastguard Worker Destroy destroy = 2; 187*bb4ee6a4SAndroid Build Coastguard Worker NewConnection new_connection = 3; 188*bb4ee6a4SAndroid Build Coastguard Worker GetShutdownEventfd get_shutdown_eventfd = 4; 189*bb4ee6a4SAndroid Build Coastguard Worker CheckExtension check_extension = 5; 190*bb4ee6a4SAndroid Build Coastguard Worker CpuidRequest get_supported_cpuid = 6; 191*bb4ee6a4SAndroid Build Coastguard Worker CpuidRequest get_emulated_cpuid = 7; 192*bb4ee6a4SAndroid Build Coastguard Worker MsrListRequest get_msr_index_list = 8; 193*bb4ee6a4SAndroid Build Coastguard Worker GetNetConfig get_net_config = 9; 194*bb4ee6a4SAndroid Build Coastguard Worker ReserveRange reserve_range = 10; 195*bb4ee6a4SAndroid Build Coastguard Worker SetIrq set_irq = 11; 196*bb4ee6a4SAndroid Build Coastguard Worker SetIrqRouting set_irq_routing = 12; 197*bb4ee6a4SAndroid Build Coastguard Worker GetState get_state = 13; 198*bb4ee6a4SAndroid Build Coastguard Worker SetState set_state = 14; 199*bb4ee6a4SAndroid Build Coastguard Worker SetIdentityMapAddr set_identity_map_addr = 15; 200*bb4ee6a4SAndroid Build Coastguard Worker PauseVcpus pause_vcpus = 16; 201*bb4ee6a4SAndroid Build Coastguard Worker GetVcpus get_vcpus = 17; 202*bb4ee6a4SAndroid Build Coastguard Worker Start start = 18; 203*bb4ee6a4SAndroid Build Coastguard Worker SetCallHint set_call_hint = 19; 204*bb4ee6a4SAndroid Build Coastguard Worker // Method for a Memory type object for retrieving the dirty bitmap. Only valid if the memory 205*bb4ee6a4SAndroid Build Coastguard Worker // object was created with dirty_log set. 206*bb4ee6a4SAndroid Build Coastguard Worker MemoryDirtyLog dirty_log = 101; 207*bb4ee6a4SAndroid Build Coastguard Worker } 208*bb4ee6a4SAndroid Build Coastguard Worker} 209*bb4ee6a4SAndroid Build Coastguard Worker 210*bb4ee6a4SAndroid Build Coastguard Workermessage MainResponse { 211*bb4ee6a4SAndroid Build Coastguard Worker // Depending on the object that was created, an fd might also come from the socket. 212*bb4ee6a4SAndroid Build Coastguard Worker message Create {} 213*bb4ee6a4SAndroid Build Coastguard Worker message Destroy {} 214*bb4ee6a4SAndroid Build Coastguard Worker // NewMessage receives a socket fd along with the data from reading this socket. 215*bb4ee6a4SAndroid Build Coastguard Worker // The returned socket can be used totally independently of the original socket, and can perform 216*bb4ee6a4SAndroid Build Coastguard Worker // requests and responses independent of the other sockets. 217*bb4ee6a4SAndroid Build Coastguard Worker message NewConnection {} 218*bb4ee6a4SAndroid Build Coastguard Worker message GetShutdownEventfd {} 219*bb4ee6a4SAndroid Build Coastguard Worker message CheckExtension { 220*bb4ee6a4SAndroid Build Coastguard Worker bool has_extension = 1; 221*bb4ee6a4SAndroid Build Coastguard Worker } 222*bb4ee6a4SAndroid Build Coastguard Worker message CpuidResponse { 223*bb4ee6a4SAndroid Build Coastguard Worker repeated CpuidEntry entries = 1; 224*bb4ee6a4SAndroid Build Coastguard Worker } 225*bb4ee6a4SAndroid Build Coastguard Worker message MsrListResponse { 226*bb4ee6a4SAndroid Build Coastguard Worker repeated uint32 indices = 1; 227*bb4ee6a4SAndroid Build Coastguard Worker } 228*bb4ee6a4SAndroid Build Coastguard Worker 229*bb4ee6a4SAndroid Build Coastguard Worker // GetNetConfig messages also return a file descriptor for the tap device. 230*bb4ee6a4SAndroid Build Coastguard Worker message GetNetConfig { 231*bb4ee6a4SAndroid Build Coastguard Worker bytes host_mac_address = 1; 232*bb4ee6a4SAndroid Build Coastguard Worker fixed32 host_ipv4_address = 2; 233*bb4ee6a4SAndroid Build Coastguard Worker fixed32 netmask = 3; 234*bb4ee6a4SAndroid Build Coastguard Worker } 235*bb4ee6a4SAndroid Build Coastguard Worker 236*bb4ee6a4SAndroid Build Coastguard Worker message ReserveRange {} 237*bb4ee6a4SAndroid Build Coastguard Worker message SetIrq {} 238*bb4ee6a4SAndroid Build Coastguard Worker message SetIrqRouting {} 239*bb4ee6a4SAndroid Build Coastguard Worker message GetState { 240*bb4ee6a4SAndroid Build Coastguard Worker // The in memory representation of a state, depending on what StateSet was 241*bb4ee6a4SAndroid Build Coastguard Worker // requested in GetState. 242*bb4ee6a4SAndroid Build Coastguard Worker bytes state = 1; 243*bb4ee6a4SAndroid Build Coastguard Worker } 244*bb4ee6a4SAndroid Build Coastguard Worker message SetState {} 245*bb4ee6a4SAndroid Build Coastguard Worker message SetIdentityMapAddr {} 246*bb4ee6a4SAndroid Build Coastguard Worker message PauseVcpus {} 247*bb4ee6a4SAndroid Build Coastguard Worker // This message should also receive a socket fd per VCPU along with the data from reading this 248*bb4ee6a4SAndroid Build Coastguard Worker // socket. The VcpuRequest/VcpuResponse protocol is run over each of the returned fds. 249*bb4ee6a4SAndroid Build Coastguard Worker message GetVcpus {} 250*bb4ee6a4SAndroid Build Coastguard Worker message Start {} 251*bb4ee6a4SAndroid Build Coastguard Worker message SetCallHint {} 252*bb4ee6a4SAndroid Build Coastguard Worker message MemoryDirtyLog { 253*bb4ee6a4SAndroid Build Coastguard Worker bytes bitmap = 1; 254*bb4ee6a4SAndroid Build Coastguard Worker } 255*bb4ee6a4SAndroid Build Coastguard Worker 256*bb4ee6a4SAndroid Build Coastguard Worker // This is zero on success, and a negative integer on failure. 257*bb4ee6a4SAndroid Build Coastguard Worker sint32 errno = 1; 258*bb4ee6a4SAndroid Build Coastguard Worker // The field present here is always the same as the one present in the corresponding 259*bb4ee6a4SAndroid Build Coastguard Worker // MainRequest. 260*bb4ee6a4SAndroid Build Coastguard Worker oneof message { 261*bb4ee6a4SAndroid Build Coastguard Worker Create create = 2; 262*bb4ee6a4SAndroid Build Coastguard Worker Destroy destroy = 3; 263*bb4ee6a4SAndroid Build Coastguard Worker NewConnection new_connection = 4; 264*bb4ee6a4SAndroid Build Coastguard Worker GetShutdownEventfd get_shutdown_eventfd = 5; 265*bb4ee6a4SAndroid Build Coastguard Worker CheckExtension check_extension = 6; 266*bb4ee6a4SAndroid Build Coastguard Worker CpuidResponse get_supported_cpuid = 7; 267*bb4ee6a4SAndroid Build Coastguard Worker CpuidResponse get_emulated_cpuid = 8; 268*bb4ee6a4SAndroid Build Coastguard Worker MsrListResponse get_msr_index_list = 9; 269*bb4ee6a4SAndroid Build Coastguard Worker GetNetConfig get_net_config = 10; 270*bb4ee6a4SAndroid Build Coastguard Worker ReserveRange reserve_range = 11; 271*bb4ee6a4SAndroid Build Coastguard Worker SetIrq set_irq = 12; 272*bb4ee6a4SAndroid Build Coastguard Worker SetIrqRouting set_irq_routing = 13; 273*bb4ee6a4SAndroid Build Coastguard Worker GetState get_state = 14; 274*bb4ee6a4SAndroid Build Coastguard Worker SetState set_state = 15; 275*bb4ee6a4SAndroid Build Coastguard Worker SetIdentityMapAddr set_identity_map_addr = 16; 276*bb4ee6a4SAndroid Build Coastguard Worker PauseVcpus pause_vcpus = 17; 277*bb4ee6a4SAndroid Build Coastguard Worker GetVcpus get_vcpus = 18; 278*bb4ee6a4SAndroid Build Coastguard Worker Start start = 19; 279*bb4ee6a4SAndroid Build Coastguard Worker SetCallHint set_call_hint = 20; 280*bb4ee6a4SAndroid Build Coastguard Worker MemoryDirtyLog dirty_log = 101; 281*bb4ee6a4SAndroid Build Coastguard Worker } 282*bb4ee6a4SAndroid Build Coastguard Worker} 283*bb4ee6a4SAndroid Build Coastguard Worker 284*bb4ee6a4SAndroid Build Coastguard Worker// A request made for a specific VCPU. These requests are sent over the sockets returned from the 285*bb4ee6a4SAndroid Build Coastguard Worker// GetVcpu MainRequest. 286*bb4ee6a4SAndroid Build Coastguard Workermessage VcpuRequest { 287*bb4ee6a4SAndroid Build Coastguard Worker // This message will block until a non-empty response can be sent. The first response will 288*bb4ee6a4SAndroid Build Coastguard Worker // always be an Init wait reason. 289*bb4ee6a4SAndroid Build Coastguard Worker message Wait { 290*bb4ee6a4SAndroid Build Coastguard Worker } 291*bb4ee6a4SAndroid Build Coastguard Worker 292*bb4ee6a4SAndroid Build Coastguard Worker message Resume { 293*bb4ee6a4SAndroid Build Coastguard Worker // The data is only necessary for non-write (read) I/O accesses. In all other cases, data is 294*bb4ee6a4SAndroid Build Coastguard Worker // ignored. 295*bb4ee6a4SAndroid Build Coastguard Worker bytes data = 1; 296*bb4ee6a4SAndroid Build Coastguard Worker 297*bb4ee6a4SAndroid Build Coastguard Worker // The following tracks what deferred set calls to apply. 298*bb4ee6a4SAndroid Build Coastguard Worker bytes regs = 2; 299*bb4ee6a4SAndroid Build Coastguard Worker bytes sregs = 3; 300*bb4ee6a4SAndroid Build Coastguard Worker bytes debugregs = 4; 301*bb4ee6a4SAndroid Build Coastguard Worker } 302*bb4ee6a4SAndroid Build Coastguard Worker 303*bb4ee6a4SAndroid Build Coastguard Worker // Each type refers to certain piece of VCPU state (a set registers, or something else). 304*bb4ee6a4SAndroid Build Coastguard Worker // The structure of the data corresponds to the kvm structure. 305*bb4ee6a4SAndroid Build Coastguard Worker enum StateSet { 306*bb4ee6a4SAndroid Build Coastguard Worker // struct kvm_regs 307*bb4ee6a4SAndroid Build Coastguard Worker REGS = 0; 308*bb4ee6a4SAndroid Build Coastguard Worker // struct kvm_sregs 309*bb4ee6a4SAndroid Build Coastguard Worker SREGS = 1; 310*bb4ee6a4SAndroid Build Coastguard Worker // struct kvm_fpu 311*bb4ee6a4SAndroid Build Coastguard Worker FPU = 2; 312*bb4ee6a4SAndroid Build Coastguard Worker // struct kvm_debugregs 313*bb4ee6a4SAndroid Build Coastguard Worker DEBUGREGS = 3; 314*bb4ee6a4SAndroid Build Coastguard Worker // struct kvm_lapic_state 315*bb4ee6a4SAndroid Build Coastguard Worker LAPIC = 4; 316*bb4ee6a4SAndroid Build Coastguard Worker // struct kvm_mp_state 317*bb4ee6a4SAndroid Build Coastguard Worker MP = 5; 318*bb4ee6a4SAndroid Build Coastguard Worker // struct kvm_xcrs 319*bb4ee6a4SAndroid Build Coastguard Worker XCREGS = 6; 320*bb4ee6a4SAndroid Build Coastguard Worker // struct kvm_vcpu_events 321*bb4ee6a4SAndroid Build Coastguard Worker EVENTS = 7; 322*bb4ee6a4SAndroid Build Coastguard Worker } 323*bb4ee6a4SAndroid Build Coastguard Worker 324*bb4ee6a4SAndroid Build Coastguard Worker message GetState { 325*bb4ee6a4SAndroid Build Coastguard Worker StateSet set = 1; 326*bb4ee6a4SAndroid Build Coastguard Worker } 327*bb4ee6a4SAndroid Build Coastguard Worker 328*bb4ee6a4SAndroid Build Coastguard Worker message SetState { 329*bb4ee6a4SAndroid Build Coastguard Worker StateSet set = 1; 330*bb4ee6a4SAndroid Build Coastguard Worker // The in memory representation of a struct kvm_regs, struct kvm_sregs, 331*bb4ee6a4SAndroid Build Coastguard Worker // struct kvm_fpu, struct kvm_debugregs, struct kvm_lapic_state, 332*bb4ee6a4SAndroid Build Coastguard Worker // struct kvm_mp_state, struct kvm_xcrs or struct kvm_vcpu_events 333*bb4ee6a4SAndroid Build Coastguard Worker // depending on the value of the StateSet. 334*bb4ee6a4SAndroid Build Coastguard Worker bytes state = 2; 335*bb4ee6a4SAndroid Build Coastguard Worker } 336*bb4ee6a4SAndroid Build Coastguard Worker 337*bb4ee6a4SAndroid Build Coastguard Worker message CpuidRequest { 338*bb4ee6a4SAndroid Build Coastguard Worker } 339*bb4ee6a4SAndroid Build Coastguard Worker 340*bb4ee6a4SAndroid Build Coastguard Worker message GetMsrs { 341*bb4ee6a4SAndroid Build Coastguard Worker // The entry data will be returned in the same order as this in the 342*bb4ee6a4SAndroid Build Coastguard Worker // VcpuResponse::GetMsrs::entry_data array. 343*bb4ee6a4SAndroid Build Coastguard Worker repeated uint32 entry_indices = 1; 344*bb4ee6a4SAndroid Build Coastguard Worker } 345*bb4ee6a4SAndroid Build Coastguard Worker 346*bb4ee6a4SAndroid Build Coastguard Worker message MsrEntry { 347*bb4ee6a4SAndroid Build Coastguard Worker uint32 index = 1; 348*bb4ee6a4SAndroid Build Coastguard Worker uint64 data = 2; 349*bb4ee6a4SAndroid Build Coastguard Worker } 350*bb4ee6a4SAndroid Build Coastguard Worker 351*bb4ee6a4SAndroid Build Coastguard Worker message SetMsrs { 352*bb4ee6a4SAndroid Build Coastguard Worker repeated MsrEntry entries = 1; 353*bb4ee6a4SAndroid Build Coastguard Worker } 354*bb4ee6a4SAndroid Build Coastguard Worker 355*bb4ee6a4SAndroid Build Coastguard Worker message SetCpuid { 356*bb4ee6a4SAndroid Build Coastguard Worker repeated CpuidEntry entries = 1; 357*bb4ee6a4SAndroid Build Coastguard Worker } 358*bb4ee6a4SAndroid Build Coastguard Worker 359*bb4ee6a4SAndroid Build Coastguard Worker message Shutdown { 360*bb4ee6a4SAndroid Build Coastguard Worker } 361*bb4ee6a4SAndroid Build Coastguard Worker 362*bb4ee6a4SAndroid Build Coastguard Worker message EnableCapability { 363*bb4ee6a4SAndroid Build Coastguard Worker uint32 capability = 1; 364*bb4ee6a4SAndroid Build Coastguard Worker } 365*bb4ee6a4SAndroid Build Coastguard Worker 366*bb4ee6a4SAndroid Build Coastguard Worker // The type of the message is determined by which of these oneof fields is present in the 367*bb4ee6a4SAndroid Build Coastguard Worker // protobuf. 368*bb4ee6a4SAndroid Build Coastguard Worker oneof message { 369*bb4ee6a4SAndroid Build Coastguard Worker Wait wait = 1; 370*bb4ee6a4SAndroid Build Coastguard Worker Resume resume = 2; 371*bb4ee6a4SAndroid Build Coastguard Worker GetState get_state = 3; 372*bb4ee6a4SAndroid Build Coastguard Worker SetState set_state = 4; 373*bb4ee6a4SAndroid Build Coastguard Worker GetMsrs get_msrs = 5; 374*bb4ee6a4SAndroid Build Coastguard Worker SetMsrs set_msrs = 6; 375*bb4ee6a4SAndroid Build Coastguard Worker SetCpuid set_cpuid = 7; 376*bb4ee6a4SAndroid Build Coastguard Worker Shutdown shutdown = 8; 377*bb4ee6a4SAndroid Build Coastguard Worker CpuidRequest get_hyperv_cpuid = 9; 378*bb4ee6a4SAndroid Build Coastguard Worker EnableCapability enable_capability = 10; 379*bb4ee6a4SAndroid Build Coastguard Worker } 380*bb4ee6a4SAndroid Build Coastguard Worker} 381*bb4ee6a4SAndroid Build Coastguard Worker 382*bb4ee6a4SAndroid Build Coastguard Worker 383*bb4ee6a4SAndroid Build Coastguard Workermessage VcpuResponse { 384*bb4ee6a4SAndroid Build Coastguard Worker // Depending on the reason a VCPU has exited, the Wait request will unblock and return a field 385*bb4ee6a4SAndroid Build Coastguard Worker // in the oneof exit. This is called the "wait reason." 386*bb4ee6a4SAndroid Build Coastguard Worker message Wait { 387*bb4ee6a4SAndroid Build Coastguard Worker // This request will always be the first wait reason returend by the first wait request. 388*bb4ee6a4SAndroid Build Coastguard Worker message Init { 389*bb4ee6a4SAndroid Build Coastguard Worker } 390*bb4ee6a4SAndroid Build Coastguard Worker 391*bb4ee6a4SAndroid Build Coastguard Worker // This type of wait reason is only generated if the access occurred on this VCPU on an 392*bb4ee6a4SAndroid Build Coastguard Worker // address previously reserved by a ReserveRange main request. 393*bb4ee6a4SAndroid Build Coastguard Worker message Io { 394*bb4ee6a4SAndroid Build Coastguard Worker AddressSpace space = 1; 395*bb4ee6a4SAndroid Build Coastguard Worker uint64 address = 2; 396*bb4ee6a4SAndroid Build Coastguard Worker bool is_write = 3; 397*bb4ee6a4SAndroid Build Coastguard Worker bool no_resume = 4; 398*bb4ee6a4SAndroid Build Coastguard Worker bytes data = 5; 399*bb4ee6a4SAndroid Build Coastguard Worker 400*bb4ee6a4SAndroid Build Coastguard Worker // The following can be eagerly provided. 401*bb4ee6a4SAndroid Build Coastguard Worker bytes regs = 6; 402*bb4ee6a4SAndroid Build Coastguard Worker bytes sregs = 7; 403*bb4ee6a4SAndroid Build Coastguard Worker bytes debugregs = 8; 404*bb4ee6a4SAndroid Build Coastguard Worker } 405*bb4ee6a4SAndroid Build Coastguard Worker 406*bb4ee6a4SAndroid Build Coastguard Worker // This type of wait reason is only generated after a PauseVcpus request on this VCPU. 407*bb4ee6a4SAndroid Build Coastguard Worker message User { 408*bb4ee6a4SAndroid Build Coastguard Worker uint64 user = 1; 409*bb4ee6a4SAndroid Build Coastguard Worker } 410*bb4ee6a4SAndroid Build Coastguard Worker 411*bb4ee6a4SAndroid Build Coastguard Worker message HypervCall { 412*bb4ee6a4SAndroid Build Coastguard Worker uint64 input = 1; 413*bb4ee6a4SAndroid Build Coastguard Worker uint64 params0 = 2; 414*bb4ee6a4SAndroid Build Coastguard Worker uint64 params1 = 3; 415*bb4ee6a4SAndroid Build Coastguard Worker } 416*bb4ee6a4SAndroid Build Coastguard Worker 417*bb4ee6a4SAndroid Build Coastguard Worker message HypervSynic { 418*bb4ee6a4SAndroid Build Coastguard Worker uint32 msr = 1; 419*bb4ee6a4SAndroid Build Coastguard Worker uint64 control = 2; 420*bb4ee6a4SAndroid Build Coastguard Worker uint64 evt_page = 3; 421*bb4ee6a4SAndroid Build Coastguard Worker uint64 msg_page = 4; 422*bb4ee6a4SAndroid Build Coastguard Worker } 423*bb4ee6a4SAndroid Build Coastguard Worker 424*bb4ee6a4SAndroid Build Coastguard Worker oneof exit { 425*bb4ee6a4SAndroid Build Coastguard Worker Init init = 1; 426*bb4ee6a4SAndroid Build Coastguard Worker Io io = 2; 427*bb4ee6a4SAndroid Build Coastguard Worker User user = 3; 428*bb4ee6a4SAndroid Build Coastguard Worker HypervCall hyperv_call = 4; 429*bb4ee6a4SAndroid Build Coastguard Worker HypervSynic hyperv_synic = 5; 430*bb4ee6a4SAndroid Build Coastguard Worker } 431*bb4ee6a4SAndroid Build Coastguard Worker } 432*bb4ee6a4SAndroid Build Coastguard Worker 433*bb4ee6a4SAndroid Build Coastguard Worker message GetState { 434*bb4ee6a4SAndroid Build Coastguard Worker // The in memory representation of a struct kvm_regs, struct kvm_sregs, 435*bb4ee6a4SAndroid Build Coastguard Worker // struct kvm_fpu, struct kvm_debugregs, struct kvm_lapic_state, 436*bb4ee6a4SAndroid Build Coastguard Worker // struct kvm_mp_state, struct kvm_xcrs or struct kvm_vcpu_events 437*bb4ee6a4SAndroid Build Coastguard Worker // depending on the value of the StateSet. 438*bb4ee6a4SAndroid Build Coastguard Worker bytes state = 1; 439*bb4ee6a4SAndroid Build Coastguard Worker } 440*bb4ee6a4SAndroid Build Coastguard Worker 441*bb4ee6a4SAndroid Build Coastguard Worker message SetState { 442*bb4ee6a4SAndroid Build Coastguard Worker } 443*bb4ee6a4SAndroid Build Coastguard Worker 444*bb4ee6a4SAndroid Build Coastguard Worker message CpuidResponse { 445*bb4ee6a4SAndroid Build Coastguard Worker repeated CpuidEntry entries = 1; 446*bb4ee6a4SAndroid Build Coastguard Worker } 447*bb4ee6a4SAndroid Build Coastguard Worker 448*bb4ee6a4SAndroid Build Coastguard Worker message GetMsrs { 449*bb4ee6a4SAndroid Build Coastguard Worker // The order of the entry_data values is the same order as the array of indices given in the 450*bb4ee6a4SAndroid Build Coastguard Worker // corresponding request. 451*bb4ee6a4SAndroid Build Coastguard Worker repeated uint64 entry_data = 1; 452*bb4ee6a4SAndroid Build Coastguard Worker } 453*bb4ee6a4SAndroid Build Coastguard Worker 454*bb4ee6a4SAndroid Build Coastguard Worker message SetMsrs {} 455*bb4ee6a4SAndroid Build Coastguard Worker 456*bb4ee6a4SAndroid Build Coastguard Worker message SetCpuid {} 457*bb4ee6a4SAndroid Build Coastguard Worker 458*bb4ee6a4SAndroid Build Coastguard Worker message EnableCapability {} 459*bb4ee6a4SAndroid Build Coastguard Worker 460*bb4ee6a4SAndroid Build Coastguard Worker // This is zero on success, and a negative integer on failure. 461*bb4ee6a4SAndroid Build Coastguard Worker sint32 errno = 1; 462*bb4ee6a4SAndroid Build Coastguard Worker // The field present here is always the same as the one present in the corresponding 463*bb4ee6a4SAndroid Build Coastguard Worker // VcpuRequest. 464*bb4ee6a4SAndroid Build Coastguard Worker oneof message { 465*bb4ee6a4SAndroid Build Coastguard Worker Wait wait = 2; 466*bb4ee6a4SAndroid Build Coastguard Worker // resume was 3 but no longer gets a reply. 467*bb4ee6a4SAndroid Build Coastguard Worker GetState get_state = 4; 468*bb4ee6a4SAndroid Build Coastguard Worker SetState set_state = 5; 469*bb4ee6a4SAndroid Build Coastguard Worker GetMsrs get_msrs = 6; 470*bb4ee6a4SAndroid Build Coastguard Worker SetMsrs set_msrs = 7; 471*bb4ee6a4SAndroid Build Coastguard Worker SetCpuid set_cpuid = 8; 472*bb4ee6a4SAndroid Build Coastguard Worker CpuidResponse get_hyperv_cpuid = 9; 473*bb4ee6a4SAndroid Build Coastguard Worker EnableCapability enable_capability = 10; 474*bb4ee6a4SAndroid Build Coastguard Worker } 475*bb4ee6a4SAndroid Build Coastguard Worker} 476