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