| 1 | /* SPDX-License-Identifier: MIT */ |
| 2 | /* |
| 3 | * Copyright (c) 2007, Keir Fraser |
| 4 | */ |
| 5 | |
| 6 | #ifndef __XEN_PUBLIC_HVM_HVM_OP_H__ |
| 7 | #define __XEN_PUBLIC_HVM_HVM_OP_H__ |
| 8 | |
| 9 | #include "../xen.h" |
| 10 | #include "../trace.h" |
| 11 | #include "../event_channel.h" |
| 12 | |
| 13 | /* Get/set subcommands: extra argument == pointer to xen_hvm_param struct. */ |
| 14 | #define HVMOP_set_param 0 |
| 15 | #define HVMOP_get_param 1 |
| 16 | struct xen_hvm_param { |
| 17 | domid_t domid; /* IN */ |
| 18 | uint16_t pad; |
| 19 | uint32_t index; /* IN */ |
| 20 | uint64_t value; /* IN/OUT */ |
| 21 | }; |
| 22 | typedef struct xen_hvm_param xen_hvm_param_t; |
| 23 | DEFINE_XEN_GUEST_HANDLE(xen_hvm_param_t); |
| 24 | |
| 25 | struct xen_hvm_altp2m_suppress_ve { |
| 26 | uint16_t view; |
| 27 | uint8_t suppress_ve; /* Boolean type. */ |
| 28 | uint8_t pad1; |
| 29 | uint32_t pad2; |
| 30 | uint64_t gfn; |
| 31 | }; |
| 32 | |
| 33 | struct xen_hvm_altp2m_suppress_ve_multi { |
| 34 | uint16_t view; |
| 35 | uint8_t suppress_ve; /* Boolean type. */ |
| 36 | uint8_t pad1; |
| 37 | int32_t first_error; /* Should be set to 0. */ |
| 38 | uint64_t first_gfn; /* Value may be updated. */ |
| 39 | uint64_t last_gfn; |
| 40 | uint64_t first_error_gfn; /* Gfn of the first error. */ |
| 41 | }; |
| 42 | |
| 43 | #if __XEN_INTERFACE_VERSION__ < 0x00040900 |
| 44 | |
| 45 | /* Set the logical level of one of a domain's PCI INTx wires. */ |
| 46 | #define HVMOP_set_pci_intx_level 2 |
| 47 | struct xen_hvm_set_pci_intx_level { |
| 48 | /* Domain to be updated. */ |
| 49 | domid_t domid; |
| 50 | /* PCI INTx identification in PCI topology (domain:bus:device:intx). */ |
| 51 | uint8_t domain, bus, device, intx; |
| 52 | /* Assertion level (0 = unasserted, 1 = asserted). */ |
| 53 | uint8_t level; |
| 54 | }; |
| 55 | typedef struct xen_hvm_set_pci_intx_level xen_hvm_set_pci_intx_level_t; |
| 56 | DEFINE_XEN_GUEST_HANDLE(xen_hvm_set_pci_intx_level_t); |
| 57 | |
| 58 | /* Set the logical level of one of a domain's ISA IRQ wires. */ |
| 59 | #define HVMOP_set_isa_irq_level 3 |
| 60 | struct xen_hvm_set_isa_irq_level { |
| 61 | /* Domain to be updated. */ |
| 62 | domid_t domid; |
| 63 | /* ISA device identification, by ISA IRQ (0-15). */ |
| 64 | uint8_t isa_irq; |
| 65 | /* Assertion level (0 = unasserted, 1 = asserted). */ |
| 66 | uint8_t level; |
| 67 | }; |
| 68 | typedef struct xen_hvm_set_isa_irq_level xen_hvm_set_isa_irq_level_t; |
| 69 | DEFINE_XEN_GUEST_HANDLE(xen_hvm_set_isa_irq_level_t); |
| 70 | |
| 71 | #define HVMOP_set_pci_link_route 4 |
| 72 | struct xen_hvm_set_pci_link_route { |
| 73 | /* Domain to be updated. */ |
| 74 | domid_t domid; |
| 75 | /* PCI link identifier (0-3). */ |
| 76 | uint8_t link; |
| 77 | /* ISA IRQ (1-15), or 0 (disable link). */ |
| 78 | uint8_t isa_irq; |
| 79 | }; |
| 80 | typedef struct xen_hvm_set_pci_link_route xen_hvm_set_pci_link_route_t; |
| 81 | DEFINE_XEN_GUEST_HANDLE(xen_hvm_set_pci_link_route_t); |
| 82 | |
| 83 | #endif /* __XEN_INTERFACE_VERSION__ < 0x00040900 */ |
| 84 | |
| 85 | /* Flushes all VCPU TLBs: @arg must be NULL. */ |
| 86 | #define HVMOP_flush_tlbs 5 |
| 87 | |
| 88 | /* |
| 89 | * hvmmem_type_t should not be defined when generating the corresponding |
| 90 | * compat header. This will ensure that the improperly named HVMMEM_(*) |
| 91 | * values are defined only once. |
| 92 | */ |
| 93 | #ifndef XEN_GENERATING_COMPAT_HEADERS |
| 94 | |
| 95 | typedef enum { |
| 96 | HVMMEM_ram_rw, /* Normal read/write guest RAM */ |
| 97 | HVMMEM_ram_ro, /* Read-only; writes are discarded */ |
| 98 | HVMMEM_mmio_dm, /* Reads and write go to the device model */ |
| 99 | #if __XEN_INTERFACE_VERSION__ < 0x00040700 |
| 100 | HVMMEM_mmio_write_dm, /* Read-only; writes go to the device model */ |
| 101 | #else |
| 102 | HVMMEM_unused, /* Placeholder; setting memory to this type |
| 103 | will fail for code after 4.7.0 */ |
| 104 | #endif |
| 105 | HVMMEM_ioreq_server /* Memory type claimed by an ioreq server; type |
| 106 | changes to this value are only allowed after |
| 107 | an ioreq server has claimed its ownership. |
| 108 | Only pages with HVMMEM_ram_rw are allowed to |
| 109 | change to this type; conversely, pages with |
| 110 | this type are only allowed to be changed back |
| 111 | to HVMMEM_ram_rw. */ |
| 112 | } hvmmem_type_t; |
| 113 | |
| 114 | #endif /* XEN_GENERATING_COMPAT_HEADERS */ |
| 115 | |
| 116 | /* Hint from PV drivers for pagetable destruction. */ |
| 117 | #define HVMOP_pagetable_dying 9 |
| 118 | struct xen_hvm_pagetable_dying { |
| 119 | /* Domain with a pagetable about to be destroyed. */ |
| 120 | domid_t domid; |
| 121 | uint16_t pad[3]; /* align next field on 8-byte boundary */ |
| 122 | /* guest physical address of the toplevel pagetable dying */ |
| 123 | uint64_t gpa; |
| 124 | }; |
| 125 | typedef struct xen_hvm_pagetable_dying xen_hvm_pagetable_dying_t; |
| 126 | DEFINE_XEN_GUEST_HANDLE(xen_hvm_pagetable_dying_t); |
| 127 | |
| 128 | /* Get the current Xen time, in nanoseconds since system boot. */ |
| 129 | #define HVMOP_get_time 10 |
| 130 | struct xen_hvm_get_time { |
| 131 | uint64_t now; /* OUT */ |
| 132 | }; |
| 133 | typedef struct xen_hvm_get_time xen_hvm_get_time_t; |
| 134 | DEFINE_XEN_GUEST_HANDLE(xen_hvm_get_time_t); |
| 135 | |
| 136 | #define HVMOP_xentrace 11 |
| 137 | struct xen_hvm_xentrace { |
| 138 | uint16_t event, extra_bytes; |
| 139 | uint8_t extra[TRACE_EXTRA_MAX * sizeof(uint32_t)]; |
| 140 | }; |
| 141 | typedef struct xen_hvm_xentrace xen_hvm_xentrace_t; |
| 142 | DEFINE_XEN_GUEST_HANDLE(xen_hvm_xentrace_t); |
| 143 | |
| 144 | /* Following tools-only interfaces may change in future. */ |
| 145 | #if defined(__XEN__) || defined(__XEN_TOOLS__) |
| 146 | |
| 147 | /* Deprecated by XENMEM_access_op_set_access */ |
| 148 | #define HVMOP_set_mem_access 12 |
| 149 | |
| 150 | /* Deprecated by XENMEM_access_op_get_access */ |
| 151 | #define HVMOP_get_mem_access 13 |
| 152 | |
| 153 | #endif /* defined(__XEN__) || defined(__XEN_TOOLS__) */ |
| 154 | |
| 155 | #define HVMOP_get_mem_type 15 |
| 156 | /* Return hvmmem_type_t for the specified pfn. */ |
| 157 | struct xen_hvm_get_mem_type { |
| 158 | /* Domain to be queried. */ |
| 159 | domid_t domid; |
| 160 | /* OUT variable. */ |
| 161 | uint16_t mem_type; |
| 162 | uint16_t pad[2]; /* align next field on 8-byte boundary */ |
| 163 | /* IN variable. */ |
| 164 | uint64_t pfn; |
| 165 | }; |
| 166 | typedef struct xen_hvm_get_mem_type xen_hvm_get_mem_type_t; |
| 167 | DEFINE_XEN_GUEST_HANDLE(xen_hvm_get_mem_type_t); |
| 168 | |
| 169 | /* Following tools-only interfaces may change in future. */ |
| 170 | #if defined(__XEN__) || defined(__XEN_TOOLS__) |
| 171 | |
| 172 | /* |
| 173 | * Definitions relating to DMOP_create_ioreq_server. (Defined here for |
| 174 | * backwards compatibility). |
| 175 | */ |
| 176 | |
| 177 | #define HVM_IOREQSRV_BUFIOREQ_OFF 0 |
| 178 | #define HVM_IOREQSRV_BUFIOREQ_LEGACY 1 |
| 179 | /* |
| 180 | * Use this when read_pointer gets updated atomically and |
| 181 | * the pointer pair gets read atomically: |
| 182 | */ |
| 183 | #define HVM_IOREQSRV_BUFIOREQ_ATOMIC 2 |
| 184 | |
| 185 | #endif /* defined(__XEN__) || defined(__XEN_TOOLS__) */ |
| 186 | |
| 187 | #if defined(__i386__) || defined(__x86_64__) |
| 188 | |
| 189 | /* |
| 190 | * HVMOP_set_evtchn_upcall_vector: Set a <vector> that should be used for event |
| 191 | * channel upcalls on the specified <vcpu>. If set, |
| 192 | * this vector will be used in preference to the |
| 193 | * domain global callback via (see |
| 194 | * HVM_PARAM_CALLBACK_IRQ). |
| 195 | */ |
| 196 | #define HVMOP_set_evtchn_upcall_vector 23 |
| 197 | struct xen_hvm_evtchn_upcall_vector { |
| 198 | uint32_t vcpu; |
| 199 | uint8_t vector; |
| 200 | }; |
| 201 | typedef struct xen_hvm_evtchn_upcall_vector xen_hvm_evtchn_upcall_vector_t; |
| 202 | DEFINE_XEN_GUEST_HANDLE(xen_hvm_evtchn_upcall_vector_t); |
| 203 | |
| 204 | #endif /* defined(__i386__) || defined(__x86_64__) */ |
| 205 | |
| 206 | #define HVMOP_guest_request_vm_event 24 |
| 207 | |
| 208 | /* HVMOP_altp2m: perform altp2m state operations */ |
| 209 | #define HVMOP_altp2m 25 |
| 210 | |
| 211 | #define HVMOP_ALTP2M_INTERFACE_VERSION 0x00000001 |
| 212 | |
| 213 | struct xen_hvm_altp2m_domain_state { |
| 214 | /* IN or OUT variable on/off */ |
| 215 | uint8_t state; |
| 216 | }; |
| 217 | typedef struct xen_hvm_altp2m_domain_state xen_hvm_altp2m_domain_state_t; |
| 218 | DEFINE_XEN_GUEST_HANDLE(xen_hvm_altp2m_domain_state_t); |
| 219 | |
| 220 | struct xen_hvm_altp2m_vcpu_enable_notify { |
| 221 | uint32_t vcpu_id; |
| 222 | uint32_t pad; |
| 223 | /* #VE info area gfn */ |
| 224 | uint64_t gfn; |
| 225 | }; |
| 226 | typedef struct xen_hvm_altp2m_vcpu_enable_notify xen_hvm_altp2m_vcpu_enable_notify_t; |
| 227 | DEFINE_XEN_GUEST_HANDLE(xen_hvm_altp2m_vcpu_enable_notify_t); |
| 228 | |
| 229 | struct xen_hvm_altp2m_vcpu_disable_notify { |
| 230 | uint32_t vcpu_id; |
| 231 | }; |
| 232 | typedef struct xen_hvm_altp2m_vcpu_disable_notify xen_hvm_altp2m_vcpu_disable_notify_t; |
| 233 | DEFINE_XEN_GUEST_HANDLE(xen_hvm_altp2m_vcpu_disable_notify_t); |
| 234 | |
| 235 | struct xen_hvm_altp2m_view { |
| 236 | /* IN/OUT variable */ |
| 237 | uint16_t view; |
| 238 | uint16_t hvmmem_default_access; /* xenmem_access_t */ |
| 239 | }; |
| 240 | typedef struct xen_hvm_altp2m_view xen_hvm_altp2m_view_t; |
| 241 | DEFINE_XEN_GUEST_HANDLE(xen_hvm_altp2m_view_t); |
| 242 | |
| 243 | #if __XEN_INTERFACE_VERSION__ < 0x00040a00 |
| 244 | struct xen_hvm_altp2m_set_mem_access { |
| 245 | /* view */ |
| 246 | uint16_t view; |
| 247 | /* Memory type */ |
| 248 | uint16_t access; /* xenmem_access_t */ |
| 249 | uint32_t pad; |
| 250 | /* gfn */ |
| 251 | uint64_t gfn; |
| 252 | }; |
| 253 | typedef struct xen_hvm_altp2m_set_mem_access xen_hvm_altp2m_set_mem_access_t; |
| 254 | DEFINE_XEN_GUEST_HANDLE(xen_hvm_altp2m_set_mem_access_t); |
| 255 | #endif /* __XEN_INTERFACE_VERSION__ < 0x00040a00 */ |
| 256 | |
| 257 | struct xen_hvm_altp2m_mem_access { |
| 258 | /* view */ |
| 259 | uint16_t view; |
| 260 | /* Memory type */ |
| 261 | uint16_t access; /* xenmem_access_t */ |
| 262 | uint32_t pad; |
| 263 | /* gfn */ |
| 264 | uint64_t gfn; |
| 265 | }; |
| 266 | typedef struct xen_hvm_altp2m_mem_access xen_hvm_altp2m_mem_access_t; |
| 267 | DEFINE_XEN_GUEST_HANDLE(xen_hvm_altp2m_mem_access_t); |
| 268 | |
| 269 | struct xen_hvm_altp2m_set_mem_access_multi { |
| 270 | /* view */ |
| 271 | uint16_t view; |
| 272 | uint16_t pad; |
| 273 | /* Number of pages */ |
| 274 | uint32_t nr; |
| 275 | /* |
| 276 | * Used for continuation purposes. |
| 277 | * Must be set to zero upon initial invocation. |
| 278 | */ |
| 279 | uint64_t opaque; |
| 280 | /* List of pfns to set access for */ |
| 281 | XEN_GUEST_HANDLE(const_uint64) pfn_list; |
| 282 | /* Corresponding list of access settings for pfn_list */ |
| 283 | XEN_GUEST_HANDLE(const_uint8) access_list; |
| 284 | }; |
| 285 | |
| 286 | struct xen_hvm_altp2m_change_gfn { |
| 287 | /* view */ |
| 288 | uint16_t view; |
| 289 | uint16_t pad1; |
| 290 | uint32_t pad2; |
| 291 | /* old gfn */ |
| 292 | uint64_t old_gfn; |
| 293 | /* new gfn, INVALID_GFN (~0UL) means revert */ |
| 294 | uint64_t new_gfn; |
| 295 | }; |
| 296 | typedef struct xen_hvm_altp2m_change_gfn xen_hvm_altp2m_change_gfn_t; |
| 297 | DEFINE_XEN_GUEST_HANDLE(xen_hvm_altp2m_change_gfn_t); |
| 298 | |
| 299 | struct xen_hvm_altp2m_get_vcpu_p2m_idx { |
| 300 | uint32_t vcpu_id; |
| 301 | uint16_t altp2m_idx; |
| 302 | }; |
| 303 | |
| 304 | struct xen_hvm_altp2m_set_visibility { |
| 305 | uint16_t altp2m_idx; |
| 306 | uint8_t visible; |
| 307 | uint8_t pad; |
| 308 | }; |
| 309 | |
| 310 | struct xen_hvm_altp2m_op { |
| 311 | uint32_t version; /* HVMOP_ALTP2M_INTERFACE_VERSION */ |
| 312 | uint32_t cmd; |
| 313 | /* Get/set the altp2m state for a domain */ |
| 314 | #define HVMOP_altp2m_get_domain_state 1 |
| 315 | #define HVMOP_altp2m_set_domain_state 2 |
| 316 | /* Set a given VCPU to receive altp2m event notifications */ |
| 317 | #define HVMOP_altp2m_vcpu_enable_notify 3 |
| 318 | /* Create a new view */ |
| 319 | #define HVMOP_altp2m_create_p2m 4 |
| 320 | /* Destroy a view */ |
| 321 | #define HVMOP_altp2m_destroy_p2m 5 |
| 322 | /* Switch view for an entire domain */ |
| 323 | #define HVMOP_altp2m_switch_p2m 6 |
| 324 | /* Notify that a page of memory is to have specific access types */ |
| 325 | #define HVMOP_altp2m_set_mem_access 7 |
| 326 | /* Change a p2m entry to have a different gfn->mfn mapping */ |
| 327 | #define HVMOP_altp2m_change_gfn 8 |
| 328 | /* Set access for an array of pages */ |
| 329 | #define HVMOP_altp2m_set_mem_access_multi 9 |
| 330 | /* Set the "Suppress #VE" bit on a page */ |
| 331 | #define HVMOP_altp2m_set_suppress_ve 10 |
| 332 | /* Get the "Suppress #VE" bit of a page */ |
| 333 | #define HVMOP_altp2m_get_suppress_ve 11 |
| 334 | /* Get the access of a page of memory from a certain view */ |
| 335 | #define HVMOP_altp2m_get_mem_access 12 |
| 336 | /* Disable altp2m event notifications for a given VCPU */ |
| 337 | #define HVMOP_altp2m_vcpu_disable_notify 13 |
| 338 | /* Get the active vcpu p2m index */ |
| 339 | #define HVMOP_altp2m_get_p2m_idx 14 |
| 340 | /* Set the "Supress #VE" bit for a range of pages */ |
| 341 | #define HVMOP_altp2m_set_suppress_ve_multi 15 |
| 342 | /* Set visibility for a given altp2m view */ |
| 343 | #define HVMOP_altp2m_set_visibility 16 |
| 344 | domid_t domain; |
| 345 | uint16_t pad1; |
| 346 | uint32_t pad2; |
| 347 | union { |
| 348 | struct xen_hvm_altp2m_domain_state domain_state; |
| 349 | struct xen_hvm_altp2m_vcpu_enable_notify enable_notify; |
| 350 | struct xen_hvm_altp2m_view view; |
| 351 | #if __XEN_INTERFACE_VERSION__ < 0x00040a00 |
| 352 | struct xen_hvm_altp2m_set_mem_access set_mem_access; |
| 353 | #endif /* __XEN_INTERFACE_VERSION__ < 0x00040a00 */ |
| 354 | struct xen_hvm_altp2m_mem_access mem_access; |
| 355 | struct xen_hvm_altp2m_change_gfn change_gfn; |
| 356 | struct xen_hvm_altp2m_set_mem_access_multi set_mem_access_multi; |
| 357 | struct xen_hvm_altp2m_suppress_ve suppress_ve; |
| 358 | struct xen_hvm_altp2m_suppress_ve_multi suppress_ve_multi; |
| 359 | struct xen_hvm_altp2m_vcpu_disable_notify disable_notify; |
| 360 | struct xen_hvm_altp2m_get_vcpu_p2m_idx get_vcpu_p2m_idx; |
| 361 | struct xen_hvm_altp2m_set_visibility set_visibility; |
| 362 | uint8_t pad[64]; |
| 363 | } u; |
| 364 | }; |
| 365 | typedef struct xen_hvm_altp2m_op xen_hvm_altp2m_op_t; |
| 366 | DEFINE_XEN_GUEST_HANDLE(xen_hvm_altp2m_op_t); |
| 367 | |
| 368 | #endif /* __XEN_PUBLIC_HVM_HVM_OP_H__ */ |
| 369 | |
| 370 | /* |
| 371 | * Local variables: |
| 372 | * mode: C |
| 373 | * c-file-style: "BSD" |
| 374 | * c-basic-offset: 4 |
| 375 | * tab-width: 4 |
| 376 | * indent-tabs-mode: nil |
| 377 | * End: |
| 378 | */ |