1/*
2   This file is part of Valgrind, a dynamic binary instrumentation
3   framework.
4
5   Copyright (C) 2012-2017 Citrix
6
7   This program is free software; you can redistribute it and/or
8   modify it under the terms of the GNU General Public License as
9   published by the Free Software Foundation; either version 2 of the
10   License, or (at your option) any later version.
11
12   This program is distributed in the hope that it will be useful, but
13   WITHOUT ANY WARRANTY; without even the implied warranty of
14   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15   General Public License for more details.
16
17   You should have received a copy of the GNU General Public License
18   along with this program; if not, write to the Free Software
19   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
20   02111-1307, USA.
21
22   The GNU General Public License is contained in the file COPYING.
23*/
24
25/* Contributed by Andrew Cooper <andrew.cooper3@citrix.com>
26   and Ian Campbell <ian.campbell@citrix.com> */
27
28#ifndef __VKI_XEN_DOMCTL_H
29#define __VKI_XEN_DOMCTL_H
30
31/*
32 * The domctl interface is versioned via the interface_version
33 * field. This structures in this header supports domctl interfaces:
34 *
35 * - 0x00000007: Xen 4.1
36 * - 0x00000008: Xen 4.2
37 * - 0x00000009: Xen 4.3 & 4.4
38 * - 0x0000000a: Xen 4.5
39 * - 0x0000000b: Xen 4.6
40 * - 0x0000000c: Xen 4.7
41 *
42 * When adding a new subop be sure to include the variants used by all
43 * of the above, both here and in syswrap-xen.c
44 *
45 * Structs which are identical in all supported versions have no
46 * version suffix. Structs which do differ are defined multiple times
47 * and use the suffix of the latest version to contain that particular
48 * variant.
49 */
50
51#define VKI_XEN_DOMCTL_createdomain                   1
52#define VKI_XEN_DOMCTL_destroydomain                  2
53#define VKI_XEN_DOMCTL_pausedomain                    3
54#define VKI_XEN_DOMCTL_unpausedomain                  4
55#define VKI_XEN_DOMCTL_getdomaininfo                  5
56#define VKI_XEN_DOMCTL_getmemlist                     6
57#define VKI_XEN_DOMCTL_getpageframeinfo               7
58#define VKI_XEN_DOMCTL_getpageframeinfo2              8
59#define VKI_XEN_DOMCTL_setvcpuaffinity                9
60#define VKI_XEN_DOMCTL_shadow_op                     10
61#define VKI_XEN_DOMCTL_max_mem                       11
62#define VKI_XEN_DOMCTL_setvcpucontext                12
63#define VKI_XEN_DOMCTL_getvcpucontext                13
64#define VKI_XEN_DOMCTL_getvcpuinfo                   14
65#define VKI_XEN_DOMCTL_max_vcpus                     15
66#define VKI_XEN_DOMCTL_scheduler_op                  16
67#define VKI_XEN_DOMCTL_setdomainhandle               17
68#define VKI_XEN_DOMCTL_setdebugging                  18
69#define VKI_XEN_DOMCTL_irq_permission                19
70#define VKI_XEN_DOMCTL_iomem_permission              20
71#define VKI_XEN_DOMCTL_ioport_permission             21
72#define VKI_XEN_DOMCTL_hypercall_init                22
73#define VKI_XEN_DOMCTL_arch_setup                    23
74#define VKI_XEN_DOMCTL_settimeoffset                 24
75#define VKI_XEN_DOMCTL_getvcpuaffinity               25
76#define VKI_XEN_DOMCTL_real_mode_area                26
77#define VKI_XEN_DOMCTL_resumedomain                  27
78#define VKI_XEN_DOMCTL_sendtrigger                   28
79#define VKI_XEN_DOMCTL_subscribe                     29
80#define VKI_XEN_DOMCTL_gethvmcontext                 33
81#define VKI_XEN_DOMCTL_sethvmcontext                 34
82#define VKI_XEN_DOMCTL_set_address_size              35
83#define VKI_XEN_DOMCTL_get_address_size              36
84#define VKI_XEN_DOMCTL_assign_device                 37
85#define VKI_XEN_DOMCTL_bind_pt_irq                   38
86#define VKI_XEN_DOMCTL_memory_mapping                39
87#define VKI_XEN_DOMCTL_ioport_mapping                40
88#define VKI_XEN_DOMCTL_pin_mem_cacheattr             41
89#define VKI_XEN_DOMCTL_set_ext_vcpucontext           42
90#define VKI_XEN_DOMCTL_get_ext_vcpucontext           43
91#define VKI_XEN_DOMCTL_set_opt_feature               44 /*Obsolete IA64 only */
92#define VKI_XEN_DOMCTL_test_assign_device            45
93#define VKI_XEN_DOMCTL_set_target                    46
94#define VKI_XEN_DOMCTL_deassign_device               47
95#define VKI_XEN_DOMCTL_unbind_pt_irq                 48
96#define VKI_XEN_DOMCTL_set_cpuid                     49
97#define VKI_XEN_DOMCTL_get_device_group              50
98#define VKI_XEN_DOMCTL_set_machine_address_size      51
99#define VKI_XEN_DOMCTL_get_machine_address_size      52
100#define VKI_XEN_DOMCTL_suppress_spurious_page_faults 53
101#define VKI_XEN_DOMCTL_debug_op                      54
102#define VKI_XEN_DOMCTL_gethvmcontext_partial         55
103#define VKI_XEN_DOMCTL_mem_event_op                  56
104#define VKI_XEN_DOMCTL_vm_event_op                   56 /* name change in 4.6 */
105#define VKI_XEN_DOMCTL_mem_sharing_op                57
106#define VKI_XEN_DOMCTL_disable_migrate               58
107#define VKI_XEN_DOMCTL_gettscinfo                    59
108#define VKI_XEN_DOMCTL_settscinfo                    60
109#define VKI_XEN_DOMCTL_getpageframeinfo3             61
110#define VKI_XEN_DOMCTL_setvcpuextstate               62
111#define VKI_XEN_DOMCTL_getvcpuextstate               63
112#define VKI_XEN_DOMCTL_set_access_required           64
113#define VKI_XEN_DOMCTL_audit_p2m                     65
114#define VKI_XEN_DOMCTL_set_virq_handler              66
115#define VKI_XEN_DOMCTL_set_broken_page_p2m           67
116#define VKI_XEN_DOMCTL_setnodeaffinity               68
117#define VKI_XEN_DOMCTL_getnodeaffinity               69
118#define VKI_XEN_DOMCTL_set_max_evtchn                70
119#define VKI_XEN_DOMCTL_cacheflush                    71
120#define VKI_XEN_DOMCTL_get_vcpu_msrs                 72
121#define VKI_XEN_DOMCTL_set_vcpu_msrs                 73
122#define VKI_XEN_DOMCTL_monitor_op                    77 /* new in 4.6 */
123#define VKI_XEN_DOMCTL_gdbsx_guestmemio            1000
124#define VKI_XEN_DOMCTL_gdbsx_pausevcpu             1001
125#define VKI_XEN_DOMCTL_gdbsx_unpausevcpu           1002
126#define VKI_XEN_DOMCTL_gdbsx_domstatus             1003
127
128struct vki_xen_domctl_createdomain {
129    /* IN parameters */
130    vki_uint32_t ssidref;
131    vki_xen_domain_handle_t handle;
132    vki_uint32_t flags;
133};
134
135struct vki_xen_domctl_getdomaininfo_00000007 {
136    /* OUT variables. */
137    vki_xen_domid_t  domain;
138    vki_uint32_t flags;
139    vki_xen_uint64_aligned_t tot_pages;
140    vki_xen_uint64_aligned_t max_pages;
141    vki_xen_uint64_aligned_t shr_pages;
142    vki_xen_uint64_aligned_t paged_pages;
143    vki_xen_uint64_aligned_t shared_info_frame;
144    vki_xen_uint64_aligned_t cpu_time;
145    vki_uint32_t nr_online_vcpus;
146    vki_uint32_t max_vcpu_id;
147    vki_uint32_t ssidref;
148    vki_xen_domain_handle_t handle;
149    vki_uint32_t cpupool;
150};
151typedef struct vki_xen_domctl_getdomaininfo_00000007 vki_xen_domctl_getdomaininfo_00000007_t;
152DEFINE_VKI_XEN_GUEST_HANDLE(vki_xen_domctl_getdomaininfo_00000007_t);
153
154struct vki_xen_domctl_getdomaininfo_00000008 {
155    /* OUT variables. */
156    vki_xen_domid_t  domain;
157    vki_uint32_t flags;
158    vki_xen_uint64_aligned_t tot_pages;
159    vki_xen_uint64_aligned_t max_pages;
160    vki_xen_uint64_aligned_t shr_pages;
161    vki_xen_uint64_aligned_t paged_pages;
162    vki_xen_uint64_aligned_t shared_info_frame;
163    vki_xen_uint64_aligned_t cpu_time;
164    vki_uint32_t nr_online_vcpus;
165    vki_uint32_t max_vcpu_id;
166    vki_uint32_t ssidref;
167    vki_xen_domain_handle_t handle;
168    vki_uint32_t cpupool;
169};
170typedef struct vki_xen_domctl_getdomaininfo_00000008 vki_xen_domctl_getdomaininfo_00000008_t;
171DEFINE_VKI_XEN_GUEST_HANDLE(vki_xen_domctl_getdomaininfo_00000008_t);
172
173struct vki_xen_domctl_getdomaininfo_00000009 {
174    /* OUT variables. */
175    vki_xen_domid_t  domain;
176    vki_uint32_t flags;
177    vki_xen_uint64_aligned_t tot_pages;
178    vki_xen_uint64_aligned_t max_pages;
179    vki_xen_uint64_aligned_t outstanding_pages;
180    vki_xen_uint64_aligned_t shr_pages;
181    vki_xen_uint64_aligned_t paged_pages;
182    vki_xen_uint64_aligned_t shared_info_frame;
183    vki_xen_uint64_aligned_t cpu_time;
184    vki_uint32_t nr_online_vcpus;
185    vki_uint32_t max_vcpu_id;
186    vki_uint32_t ssidref;
187    vki_xen_domain_handle_t handle;
188    vki_uint32_t cpupool;
189};
190typedef struct vki_xen_domctl_getdomaininfo_00000009 vki_xen_domctl_getdomaininfo_00000009_t;
191DEFINE_VKI_XEN_GUEST_HANDLE(vki_xen_domctl_getdomaininfo_00000009_t);
192
193/* vki_xen_domctl_getdomaininfo_0000000a is the same as 00000009 */
194
195/* Get/set the NUMA node(s) with which the guest has affinity with. */
196/* XEN_DOMCTL_setnodeaffinity */
197/* XEN_DOMCTL_getnodeaffinity */
198struct vki_xen_domctl_nodeaffinity {
199    struct vki_xenctl_bitmap nodemap;/* IN */
200};
201typedef struct vki_xen_domctl_nodeaffinity vki_xen_domctl_nodeaffinity_t;
202DEFINE_VKI_XEN_GUEST_HANDLE(vki_xen_domctl_nodeaffinity_t);
203
204struct vki_xen_domctl_getpageframeinfo3 {
205    vki_xen_uint64_aligned_t num; /* IN */
206    VKI_XEN_GUEST_HANDLE_64(vki_xen_pfn_t) array; /* IN/OUT */
207};
208
209struct vki_xen_domctl_vcpuaffinity_00000009 {
210    vki_uint32_t  vcpu;              /* IN */
211    struct vki_xenctl_bitmap cpumap; /* IN/OUT */
212};
213
214struct vki_xen_domctl_vcpuaffinity_0000000a {
215    vki_uint32_t  vcpu;              /* IN */
216#define VKI_XEN_VCPUAFFINITY_HARD   (1U<<0)
217#define VKI_XEN_VCPUAFFINITY_SOFT   (1U<<1)
218    vki_uint32_t  flags;              /* IN */
219    struct vki_xenctl_bitmap cpumap_hard; /* IN/OUT */
220    struct vki_xenctl_bitmap cpumap_soft; /* IN/OUT */
221};
222
223struct vki_xen_domctl_shadow_op_stats {
224    vki_uint32_t fault_count;
225    vki_uint32_t dirty_count;
226};
227
228/* vki_xen_domctl_shadow_op.op is an utter mess for compatibily reasons. */
229
230struct vki_xen_domctl_shadow_op {
231    vki_uint32_t op; /* IN */
232
233#define VKI_XEN_DOMCTL_SHADOW_OP_OFF               0
234#define VKI_XEN_DOMCTL_SHADOW_OP_ENABLE           32
235#define VKI_XEN_DOMCTL_SHADOW_OP_CLEAN            11
236#define VKI_XEN_DOMCTL_SHADOW_OP_PEEK             12
237#define VKI_XEN_DOMCTL_SHADOW_OP_GET_ALLOCATION   30
238#define VKI_XEN_DOMCTL_SHADOW_OP_SET_ALLOCATION   31
239
240#define VKI_XEN_DOMCTL_SHADOW_OP_ENABLE_TEST       1
241#define VKI_XEN_DOMCTL_SHADOW_OP_ENABLE_LOGDIRTY   2
242#define VKI_XEN_DOMCTL_SHADOW_OP_ENABLE_TRANSLATE  3
243
244    vki_uint32_t mode;
245
246#define XEN_DOMCTL_SHADOW_ENABLE_REFCOUNT  (1 << 1)
247#define XEN_DOMCTL_SHADOW_ENABLE_LOG_DIRTY (1 << 2)
248#define XEN_DOMCTL_SHADOW_ENABLE_TRANSLATE (1 << 3)
249#define XEN_DOMCTL_SHADOW_ENABLE_EXTERNAL  (1 << 4)
250
251    vki_uint32_t mb;
252    VKI_XEN_GUEST_HANDLE_64(vki_uint8) dirty_bitmap;
253    vki_xen_uint64_aligned_t pages;
254    struct vki_xen_domctl_shadow_op_stats stats;
255};
256
257struct vki_xen_domctl_max_mem {
258    /* IN variables. */
259    vki_xen_uint64_aligned_t max_memkb;
260};
261
262struct vki_xen_domctl_vcpucontext {
263    vki_uint32_t              vcpu;                  /* IN */
264    VKI_XEN_GUEST_HANDLE_64(vki_xen_vcpu_guest_context_t) ctxt; /* IN/OUT */
265};
266
267struct vki_xen_domctl_getvcpuinfo {
268    /* IN variables. */
269    vki_uint32_t vcpu;
270    /* OUT variables. */
271    vki_uint8_t  online;              /* currently online (not hotplugged)? */
272    vki_uint8_t  blocked;             /* blocked waiting for an event? */
273    vki_uint8_t  running;             /* currently scheduled on its CPU? */
274    vki_xen_uint64_aligned_t cpu_time;/* total cpu time consumed (ns) */
275    vki_uint32_t cpu;                 /* current mapping   */
276};
277
278struct vki_xen_domctl_scheduler_op {
279    vki_uint32_t sched_id;  /* VKI_XEN_SCHEDULER_* */
280#define VKI_XEN_SCHEDULER_SEDF     4
281#define VKI_XEN_SCHEDULER_CREDIT   5
282#define VKI_XEN_SCHEDULER_CREDIT2  6
283#define VKI_XEN_SCHEDULER_ARINC653 7
284#define VKI_XEN_SCHEDULER_RTDS     8
285    vki_uint32_t cmd;       /* VKI_XEN_DOMCTL_SCHEDOP_* */
286#define VKI_XEN_DOMCTL_SCHEDOP_putinfo 0
287#define VKI_XEN_DOMCTL_SCHEDOP_getinfo 1
288    union {
289        struct xen_domctl_sched_sedf {
290            vki_xen_uint64_aligned_t period;
291            vki_xen_uint64_aligned_t slice;
292            vki_xen_uint64_aligned_t latency;
293            vki_uint32_t extratime;
294            vki_uint32_t weight;
295        } sedf;
296        struct xen_domctl_sched_credit {
297            vki_uint16_t weight;
298            vki_uint16_t cap;
299        } credit;
300        struct xen_domctl_sched_credit2 {
301            vki_uint16_t weight;
302        } credit2;
303        struct xen_domctl_sched_rtds {
304            vki_uint32_t period;
305            vki_uint32_t budget;
306        } rtds;
307    } u;
308};
309
310struct vki_xen_domctl_max_vcpus {
311    vki_uint32_t max;           /* maximum number of vcpus */
312};
313
314/* XEN_DOMCTL_irq_permission */
315struct vki_xen_domctl_irq_permission {
316    vki_uint8_t pirq;
317    vki_uint8_t allow_access;    /* flag to specify enable/disable of IRQ access */
318};
319
320struct vki_xen_domctl_iomem_permission {
321    vki_xen_uint64_aligned_t first_mfn;/* first page (physical page number) in range */
322    vki_xen_uint64_aligned_t nr_mfns;  /* number of pages in range (>0) */
323    vki_uint8_t  allow_access;     /* allow (!0) or deny (0) access to range? */
324};
325
326struct vki_xen_domctl_ioport_permission {
327    vki_uint32_t first_port;              /* IN */
328    vki_uint32_t nr_ports;                /* IN */
329    vki_uint8_t  allow_access;            /* IN */
330};
331
332struct vki_xen_domctl_hypercall_init {
333    vki_xen_uint64_aligned_t  gmfn;           /* GMFN to be initialised */
334};
335
336struct vki_xen_domctl_settimeoffset {
337    vki_int32_t time_offset_seconds;
338};
339
340struct vki_xen_domctl_cpuid {
341  vki_uint32_t input[2];
342  vki_uint32_t eax;
343  vki_uint32_t ebx;
344  vki_uint32_t ecx;
345  vki_uint32_t edx;
346};
347
348struct vki_xen_guest_tsc_info {
349    vki_uint32_t tsc_mode;
350    vki_uint32_t gtsc_khz;
351    vki_uint32_t incarnation;
352    vki_uint32_t pad;
353    vki_xen_uint64_aligned_t elapsed_nsec;
354};
355typedef struct vki_xen_guest_tsc_info vki_xen_guest_tsc_info_t;
356DEFINE_VKI_XEN_GUEST_HANDLE(vki_xen_guest_tsc_info_t);
357
358struct vki_xen_domctl_tsc_info_00000007 {
359    VKI_XEN_GUEST_HANDLE_64(vki_xen_guest_tsc_info_t) out_info; /* OUT */
360    vki_xen_guest_tsc_info_t info; /* IN */
361};
362
363/* 4.6 removed the output pointer */
364struct vki_xen_domctl_tsc_info_0000000b {
365    /* IN/OUT */
366    vki_uint32_t tsc_mode;
367    vki_uint32_t gtsc_khz;
368    vki_uint32_t incarnation;
369    vki_uint32_t pad;
370    vki_xen_uint64_aligned_t elapsed_nsec;
371};
372
373
374struct vki_xen_domctl_hvmcontext {
375    vki_uint32_t size; /* IN/OUT size of buffer */
376    VKI_XEN_GUEST_HANDLE_64(vki_uint8) buffer; /* IN/OUT */
377};
378typedef struct vki_xen_domctl_hvmcontext vki_xen_domctl_hvmcontext_t;
379DEFINE_VKI_XEN_GUEST_HANDLE(vki_xen_domctl_hvmcontext_t);
380
381struct vki_xen_domctl_hvmcontext_partial {
382    vki_uint32_t type; /* IN */
383    vki_uint32_t instance; /* IN */
384    VKI_XEN_GUEST_HANDLE_64(vki_uint8) buffer; /* IN/OUT buffer */
385};
386typedef struct vki_xen_domctl_hvmcontext_partial vki_xen_domctl_hvmcontext_partial_t;
387DEFINE_VKI_XEN_GUEST_HANDLE(vki_xen_domctl_hvmcontext_partial_t);
388
389
390struct vki_xen_domctl_pin_mem_cacheattr {
391    vki_xen_uint64_aligned_t start, end; /* IN */
392    vki_uint32_t type;                   /* IN */
393};
394
395struct vki_xen_domctl_ext_vcpucontext_00000008 {
396    vki_uint32_t             vcpu; /* IN */
397
398    /* IN  for XEN_DOMCTL_set_ext_vcpucontext
399     * OUT for XEN_DOMCTL_get_ext_vcpucontext */
400    vki_uint32_t             size;
401#if defined(__i386__) || defined(__x86_64__)
402    vki_xen_uint64_aligned_t syscall32_callback_eip;
403    vki_xen_uint64_aligned_t sysenter_callback_eip;
404    vki_uint16_t             syscall32_callback_cs;
405    vki_uint16_t             sysenter_callback_cs;
406    vki_uint8_t              syscall32_disables_events;
407    vki_uint8_t              sysenter_disables_events;
408    vki_xen_uint64_aligned_t mcg_cap;
409#endif
410};
411
412struct vki_xen_domctl_ext_vcpucontext_00000009 {
413    vki_uint32_t             vcpu; /* IN */
414
415    /* IN  for XEN_DOMCTL_set_ext_vcpucontext
416     * OUT for XEN_DOMCTL_get_ext_vcpucontext */
417    vki_uint32_t             size;
418#if defined(__i386__) || defined(__x86_64__)
419    vki_xen_uint64_aligned_t syscall32_callback_eip;
420    vki_xen_uint64_aligned_t sysenter_callback_eip;
421    vki_uint16_t             syscall32_callback_cs;
422    vki_uint16_t             sysenter_callback_cs;
423    vki_uint8_t              syscall32_disables_events;
424    vki_uint8_t              sysenter_disables_events;
425    vki_uint64_t             caps;
426    vki_uint64_t             mci_ctl2_bank0;
427    vki_uint64_t             mci_ctl2_bank1;
428#endif
429};
430
431/* vki_xen_domctl_ext_vcpucontext_0000000a is the same as 00000009 */
432
433struct vki_xen_domctl_vcpuextstate {
434    vki_uint32_t         vcpu;
435    vki_xen_uint64_aligned_t         xfeature_mask;
436    vki_xen_uint64_aligned_t         size;
437    VKI_XEN_GUEST_HANDLE_64(vki_uint64) buffer;
438};
439
440struct vki_xen_domctl_address_size {
441    vki_uint32_t size;
442};
443
444/* vki_xen_domctl_assign_device_00000007 is the same up to version 0x0000000b */
445struct vki_xen_domctl_assign_device_00000007 {
446    vki_uint32_t  machine_sbdf;   /* machine PCI ID of assigned device */
447};
448
449#define VKI_XEN_DOMCTL_DEV_PCI      0
450#define VKI_XEN_DOMCTL_DEV_DT       1
451struct vki_xen_domctl_assign_device_0000000b {
452    vki_uint32_t dev;   /* XEN_DOMCTL_DEV_* */
453    union {
454        struct {
455            vki_uint32_t machine_sbdf;   /* machine PCI ID of assigned device */
456        } pci;
457        struct {
458            vki_uint32_t size; /* Length of the path */
459            VKI_XEN_GUEST_HANDLE_64(vki_uint8) path; /* path to the device tree node */
460        } dt;
461    } u;
462    /* IN */
463//#define XEN_DOMCTL_DEV_RDM_RELAXED      1
464    vki_uint32_t  flag;   /* flag of assigned device */
465};
466
467struct vki_xen_domctl_debug_op {
468    vki_uint32_t op;   /* IN */
469    vki_uint32_t vcpu; /* IN */
470};
471typedef struct vki_xen_domctl_debug_op vki_xen_domctl_debug_op_t;
472
473struct vki_xen_domctl_mem_event_op_00000007 {
474    vki_uint32_t op; /* IN */
475    vki_uint32_t mode; /* IN */
476    vki_uint32_t port; /* OUT */
477};
478
479/* only a name change in 4.6 */
480typedef struct vki_xen_domctl_mem_event_op_00000007 vki_xen_domctl_vm_event_op_0000000b;
481
482struct vki_xen_domctl_set_access_required {
483    vki_uint8_t access_required; /* IN */
484};
485
486struct vki_xen_domctl_set_max_evtchn {
487    vki_uint32_t max_port;
488};
489
490struct vki_xen_domctl_cacheflush {
491    /* IN: page range to flush. */
492    vki_xen_pfn_t start_pfn, nr_pfns;
493};
494
495struct vki_xen_domctl_vcpu_msr {
496    vki_uint32_t             index;
497    vki_uint32_t             reserved;
498    vki_xen_uint64_aligned_t value;
499};
500typedef struct vki_xen_domctl_vcpu_msr vki_xen_domctl_vcpu_msr_t;
501DEFINE_VKI_XEN_GUEST_HANDLE(vki_xen_domctl_vcpu_msr_t);
502
503struct vki_xen_domctl_vcpu_msrs {
504    vki_uint32_t vcpu;
505    vki_uint32_t msr_count;
506    VKI_XEN_GUEST_HANDLE_64(vki_xen_domctl_vcpu_msr_t) msrs;
507};
508
509#define VKI_XEN_DOMCTL_MONITOR_OP_ENABLE            0
510#define VKI_XEN_DOMCTL_MONITOR_OP_DISABLE           1
511#define VKI_XEN_DOMCTL_MONITOR_OP_GET_CAPABILITIES  2
512
513#define VKI_XEN_DOMCTL_MONITOR_EVENT_WRITE_CTRLREG         0
514#define VKI_XEN_DOMCTL_MONITOR_EVENT_MOV_TO_MSR            1
515#define VKI_XEN_DOMCTL_MONITOR_EVENT_SINGLESTEP            2
516#define VKI_XEN_DOMCTL_MONITOR_EVENT_SOFTWARE_BREAKPOINT   3
517#define VKI_XEN_DOMCTL_MONITOR_EVENT_GUEST_REQUEST         4
518
519struct vki_xen_domctl_monitor_op_0000000b {
520    vki_uint32_t op; /* vki_xen_DOMCTL_MONITOR_OP_* */
521
522    /*
523     * When used with ENABLE/DISABLE this has to be set to
524     * the requested vki_xen_DOMCTL_MONITOR_EVENT_* value.
525     * With GET_CAPABILITIES this field returns a bitmap of
526     * events supported by the platform, in the format
527     * (1 << vki_xen_DOMCTL_MONITOR_EVENT_*).
528     */
529    vki_uint32_t event;
530
531    /*
532     * Further options when issuing vki_xen_DOMCTL_MONITOR_OP_ENABLE.
533     */
534    union {
535        struct {
536            /* Which control register */
537            vki_uint8_t index;
538            /* Pause vCPU until response */
539            vki_uint8_t sync;
540            /* Send event only on a change of value */
541            vki_uint8_t onchangeonly;
542        } mov_to_cr;
543
544        struct {
545            /* Enable the capture of an extended set of MSRs */
546            vki_uint8_t extended_capture;
547        } mov_to_msr;
548
549        struct {
550            /* Pause vCPU until response */
551            vki_uint8_t sync;
552        } guest_request;
553    } u;
554};
555
556
557struct vki_xen_domctl_monitor_op {
558    vki_uint32_t op;
559#define VKI_XEN_DOMCTL_MONITOR_OP_ENABLE            0
560#define VKI_XEN_DOMCTL_MONITOR_OP_DISABLE           1
561#define VKI_XEN_DOMCTL_MONITOR_OP_GET_CAPABILITIES  2
562#define VKI_XEN_DOMCTL_MONITOR_OP_EMULATE_EACH_REP  3
563    vki_uint32_t event;
564    union {
565        struct {
566            vki_uint8_t index;
567            vki_uint8_t sync;
568            vki_uint8_t onchangeonly;
569        } mov_to_cr;
570        struct {
571            vki_uint8_t extended_capture;
572        } mov_to_msr;
573        struct {
574            vki_uint8_t sync;
575        } guest_request;
576    } u;
577};
578
579struct vki_xen_domctl {
580    vki_uint32_t cmd;
581    vki_uint32_t interface_version; /* XEN_DOMCTL_INTERFACE_VERSION */
582    vki_xen_domid_t  domain;
583    union {
584        struct vki_xen_domctl_createdomain      createdomain;
585        struct vki_xen_domctl_getdomaininfo_00000007 getdomaininfo_00000007;
586        struct vki_xen_domctl_getdomaininfo_00000008 getdomaininfo_00000008;
587        struct vki_xen_domctl_getdomaininfo_00000009 getdomaininfo_00000009;
588        //struct vki_xen_domctl_getmemlist        getmemlist;
589        //struct vki_xen_domctl_getpageframeinfo  getpageframeinfo;
590        //struct vki_xen_domctl_getpageframeinfo2 getpageframeinfo2;
591        struct vki_xen_domctl_getpageframeinfo3 getpageframeinfo3;
592        struct vki_xen_domctl_nodeaffinity      nodeaffinity;
593        struct vki_xen_domctl_vcpuaffinity_00000009 vcpuaffinity_00000009;
594        struct vki_xen_domctl_vcpuaffinity_0000000a vcpuaffinity_0000000a;
595        struct vki_xen_domctl_shadow_op         shadow_op;
596        struct vki_xen_domctl_max_mem           max_mem;
597        struct vki_xen_domctl_vcpucontext       vcpucontext;
598        struct vki_xen_domctl_getvcpuinfo       getvcpuinfo;
599        struct vki_xen_domctl_max_vcpus         max_vcpus;
600        struct vki_xen_domctl_scheduler_op      scheduler_op;
601        //struct vki_xen_domctl_setdomainhandle   setdomainhandle;
602        //struct vki_xen_domctl_setdebugging      setdebugging;
603        struct vki_xen_domctl_irq_permission    irq_permission;
604        struct vki_xen_domctl_iomem_permission  iomem_permission;
605        struct vki_xen_domctl_ioport_permission ioport_permission;
606        struct vki_xen_domctl_hypercall_init    hypercall_init;
607        //struct vki_xen_domctl_arch_setup        arch_setup;
608        struct vki_xen_domctl_settimeoffset     settimeoffset;
609        //struct vki_xen_domctl_disable_migrate   disable_migrate;
610        struct vki_xen_domctl_tsc_info_00000007   tsc_info_00000007;
611        struct vki_xen_domctl_tsc_info_0000000b   tsc_info_0000000b;
612        //struct vki_xen_domctl_real_mode_area    real_mode_area;
613        struct vki_xen_domctl_hvmcontext        hvmcontext;
614        struct vki_xen_domctl_hvmcontext_partial hvmcontext_partial;
615        struct vki_xen_domctl_address_size      address_size;
616        //struct vki_xen_domctl_sendtrigger       sendtrigger;
617        //struct vki_xen_domctl_get_device_group  get_device_group;
618        struct vki_xen_domctl_assign_device_00000007 assign_device_00000007;
619        struct vki_xen_domctl_assign_device_0000000b assign_device_0000000b;
620        //struct vki_xen_domctl_bind_pt_irq       bind_pt_irq;
621        //struct vki_xen_domctl_memory_mapping    memory_mapping;
622        //struct vki_xen_domctl_ioport_mapping    ioport_mapping;
623        struct vki_xen_domctl_pin_mem_cacheattr pin_mem_cacheattr;
624        struct vki_xen_domctl_ext_vcpucontext_00000008 ext_vcpucontext_00000008;
625        struct vki_xen_domctl_ext_vcpucontext_00000009 ext_vcpucontext_00000009;
626        //struct vki_xen_domctl_set_target        set_target;
627        //struct vki_xen_domctl_subscribe         subscribe;
628        struct vki_xen_domctl_debug_op          debug_op;
629        struct vki_xen_domctl_mem_event_op_00000007 mem_event_op_00000007;
630        vki_xen_domctl_vm_event_op_0000000b vm_event_op_0000000b;
631        //struct vki_xen_domctl_mem_sharing_op    mem_sharing_op;
632#if defined(__i386__) || defined(__x86_64__)
633        struct vki_xen_domctl_cpuid             cpuid;
634        struct vki_xen_domctl_vcpuextstate      vcpuextstate;
635        struct vki_xen_domctl_vcpu_msrs         vcpu_msrs;
636#endif
637        struct vki_xen_domctl_set_access_required access_required;
638        //struct vki_xen_domctl_audit_p2m         audit_p2m;
639        //struct vki_xen_domctl_set_virq_handler  set_virq_handler;
640        struct vki_xen_domctl_set_max_evtchn    set_max_evtchn;
641        //struct vki_xen_domctl_gdbsx_memio       gdbsx_guest_memio;
642        //struct vki_xen_domctl_set_broken_page_p2m set_broken_page_p2m;
643        struct vki_xen_domctl_cacheflush        cacheflush;
644        //struct vki_xen_domctl_gdbsx_pauseunp_vcpu gdbsx_pauseunp_vcpu;
645        //struct vki_xen_domctl_gdbsx_domstatus   gdbsx_domstatus;
646        struct vki_xen_domctl_monitor_op_0000000b monitor_op_0000000b;
647        vki_uint8_t                         pad[128];
648    } u;
649};
650
651#endif // __VKI_XEN_DOMCTL_H
652
653/*--------------------------------------------------------------------*/
654/*--- end                                                          ---*/
655/*--------------------------------------------------------------------*/
656