1a576ab5bSrab /*
2a576ab5bSrab  * Permission is hereby granted, free of charge, to any person obtaining a copy
3a576ab5bSrab  * of this software and associated documentation files (the "Software"), to
4a576ab5bSrab  * deal in the Software without restriction, including without limitation the
5a576ab5bSrab  * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
6a576ab5bSrab  * sell copies of the Software, and to permit persons to whom the Software is
7a576ab5bSrab  * furnished to do so, subject to the following conditions:
8a576ab5bSrab  *
9a576ab5bSrab  * The above copyright notice and this permission notice shall be included in
10a576ab5bSrab  * all copies or substantial portions of the Software.
11a576ab5bSrab  *
12a576ab5bSrab  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
13a576ab5bSrab  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
14a576ab5bSrab  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
15a576ab5bSrab  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
16a576ab5bSrab  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
17a576ab5bSrab  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
18a576ab5bSrab  * DEALINGS IN THE SOFTWARE.
19a576ab5bSrab  */
20a576ab5bSrab 
21843e1988Sjohnlev #ifndef __XEN_PUBLIC_HVM_HVM_OP_H__
22843e1988Sjohnlev #define __XEN_PUBLIC_HVM_HVM_OP_H__
23843e1988Sjohnlev 
24843e1988Sjohnlev /* Get/set subcommands: extra argument == pointer to xen_hvm_param struct. */
25843e1988Sjohnlev #define HVMOP_set_param           0
26843e1988Sjohnlev #define HVMOP_get_param           1
27843e1988Sjohnlev struct xen_hvm_param {
28843e1988Sjohnlev     domid_t  domid;    /* IN */
29843e1988Sjohnlev     uint32_t index;    /* IN */
30843e1988Sjohnlev     uint64_t value;    /* IN/OUT */
31843e1988Sjohnlev };
32843e1988Sjohnlev typedef struct xen_hvm_param xen_hvm_param_t;
33843e1988Sjohnlev DEFINE_XEN_GUEST_HANDLE(xen_hvm_param_t);
34843e1988Sjohnlev 
35843e1988Sjohnlev /* Set the logical level of one of a domain's PCI INTx wires. */
36843e1988Sjohnlev #define HVMOP_set_pci_intx_level  2
37843e1988Sjohnlev struct xen_hvm_set_pci_intx_level {
38843e1988Sjohnlev     /* Domain to be updated. */
39843e1988Sjohnlev     domid_t  domid;
40843e1988Sjohnlev     /* PCI INTx identification in PCI topology (domain:bus:device:intx). */
41843e1988Sjohnlev     uint8_t  domain, bus, device, intx;
42843e1988Sjohnlev     /* Assertion level (0 = unasserted, 1 = asserted). */
43843e1988Sjohnlev     uint8_t  level;
44843e1988Sjohnlev };
45843e1988Sjohnlev typedef struct xen_hvm_set_pci_intx_level xen_hvm_set_pci_intx_level_t;
46843e1988Sjohnlev DEFINE_XEN_GUEST_HANDLE(xen_hvm_set_pci_intx_level_t);
47843e1988Sjohnlev 
48843e1988Sjohnlev /* Set the logical level of one of a domain's ISA IRQ wires. */
49843e1988Sjohnlev #define HVMOP_set_isa_irq_level   3
50843e1988Sjohnlev struct xen_hvm_set_isa_irq_level {
51843e1988Sjohnlev     /* Domain to be updated. */
52843e1988Sjohnlev     domid_t  domid;
53843e1988Sjohnlev     /* ISA device identification, by ISA IRQ (0-15). */
54843e1988Sjohnlev     uint8_t  isa_irq;
55843e1988Sjohnlev     /* Assertion level (0 = unasserted, 1 = asserted). */
56843e1988Sjohnlev     uint8_t  level;
57843e1988Sjohnlev };
58843e1988Sjohnlev typedef struct xen_hvm_set_isa_irq_level xen_hvm_set_isa_irq_level_t;
59843e1988Sjohnlev DEFINE_XEN_GUEST_HANDLE(xen_hvm_set_isa_irq_level_t);
60843e1988Sjohnlev 
61843e1988Sjohnlev #define HVMOP_set_pci_link_route  4
62843e1988Sjohnlev struct xen_hvm_set_pci_link_route {
63843e1988Sjohnlev     /* Domain to be updated. */
64843e1988Sjohnlev     domid_t  domid;
65843e1988Sjohnlev     /* PCI link identifier (0-3). */
66843e1988Sjohnlev     uint8_t  link;
67843e1988Sjohnlev     /* ISA IRQ (1-15), or 0 (disable link). */
68843e1988Sjohnlev     uint8_t  isa_irq;
69843e1988Sjohnlev };
70843e1988Sjohnlev typedef struct xen_hvm_set_pci_link_route xen_hvm_set_pci_link_route_t;
71843e1988Sjohnlev DEFINE_XEN_GUEST_HANDLE(xen_hvm_set_pci_link_route_t);
72843e1988Sjohnlev 
73a576ab5bSrab /* Flushes all VCPU TLBs: @arg must be NULL. */
74a576ab5bSrab #define HVMOP_flush_tlbs          5
75a576ab5bSrab 
76*349b53ddSStuart Maybee /* Following tools-only interfaces may change in future. */
77*349b53ddSStuart Maybee #if defined(__XEN__) || defined(__XEN_TOOLS__)
78*349b53ddSStuart Maybee 
79*349b53ddSStuart Maybee /* Track dirty VRAM. */
80*349b53ddSStuart Maybee #define HVMOP_track_dirty_vram    6
81*349b53ddSStuart Maybee struct xen_hvm_track_dirty_vram {
82*349b53ddSStuart Maybee     /* Domain to be tracked. */
83*349b53ddSStuart Maybee     domid_t  domid;
84*349b53ddSStuart Maybee     /* First pfn to track. */
85*349b53ddSStuart Maybee     uint64_aligned_t first_pfn;
86*349b53ddSStuart Maybee     /* Number of pages to track. */
87*349b53ddSStuart Maybee     uint64_aligned_t nr;
88*349b53ddSStuart Maybee     /* OUT variable. */
89*349b53ddSStuart Maybee     /* Dirty bitmap buffer. */
90*349b53ddSStuart Maybee     XEN_GUEST_HANDLE_64(uint8) dirty_bitmap;
91*349b53ddSStuart Maybee };
92*349b53ddSStuart Maybee typedef struct xen_hvm_track_dirty_vram xen_hvm_track_dirty_vram_t;
93*349b53ddSStuart Maybee DEFINE_XEN_GUEST_HANDLE(xen_hvm_track_dirty_vram_t);
94*349b53ddSStuart Maybee 
95*349b53ddSStuart Maybee /* Notify that some pages got modified by the Device Model. */
96*349b53ddSStuart Maybee #define HVMOP_modified_memory    7
97*349b53ddSStuart Maybee struct xen_hvm_modified_memory {
98*349b53ddSStuart Maybee     /* Domain to be updated. */
99*349b53ddSStuart Maybee     domid_t  domid;
100*349b53ddSStuart Maybee     /* First pfn. */
101*349b53ddSStuart Maybee     uint64_aligned_t first_pfn;
102*349b53ddSStuart Maybee     /* Number of pages. */
103*349b53ddSStuart Maybee     uint64_aligned_t nr;
104*349b53ddSStuart Maybee };
105*349b53ddSStuart Maybee typedef struct xen_hvm_modified_memory xen_hvm_modified_memory_t;
106*349b53ddSStuart Maybee DEFINE_XEN_GUEST_HANDLE(xen_hvm_modified_memory_t);
107*349b53ddSStuart Maybee 
108*349b53ddSStuart Maybee #define HVMOP_set_mem_type    8
109*349b53ddSStuart Maybee typedef enum {
110*349b53ddSStuart Maybee     HVMMEM_ram_rw,             /* Normal read/write guest RAM */
111*349b53ddSStuart Maybee     HVMMEM_ram_ro,             /* Read-only; writes are discarded */
112*349b53ddSStuart Maybee     HVMMEM_mmio_dm,            /* Reads and write go to the device model */
113*349b53ddSStuart Maybee } hvmmem_type_t;
114*349b53ddSStuart Maybee /* Notify that a region of memory is to be treated in a specific way. */
115*349b53ddSStuart Maybee struct xen_hvm_set_mem_type {
116*349b53ddSStuart Maybee     /* Domain to be updated. */
117*349b53ddSStuart Maybee     domid_t domid;
118*349b53ddSStuart Maybee     /* Memory type */
119*349b53ddSStuart Maybee     hvmmem_type_t hvmmem_type;
120*349b53ddSStuart Maybee     /* First pfn. */
121*349b53ddSStuart Maybee     uint64_aligned_t first_pfn;
122*349b53ddSStuart Maybee     /* Number of pages. */
123*349b53ddSStuart Maybee     uint64_aligned_t nr;
124*349b53ddSStuart Maybee };
125*349b53ddSStuart Maybee typedef struct xen_hvm_set_mem_type xen_hvm_set_mem_type_t;
126*349b53ddSStuart Maybee DEFINE_XEN_GUEST_HANDLE(xen_hvm_set_mem_type_t);
127*349b53ddSStuart Maybee 
128*349b53ddSStuart Maybee 
129*349b53ddSStuart Maybee #endif /* defined(__XEN__) || defined(__XEN_TOOLS__) */
130*349b53ddSStuart Maybee 
131843e1988Sjohnlev #endif /* __XEN_PUBLIC_HVM_HVM_OP_H__ */
132