xref: /aosp_15_r20/external/crosvm/protos/src/plugin.proto (revision bb4ee6a4ae7042d18b07a98463b9c8b875e44b39)
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