1181624Skmacy/* 2181624Skmacy * Permission is hereby granted, free of charge, to any person obtaining a copy 3181624Skmacy * of this software and associated documentation files (the "Software"), to 4181624Skmacy * deal in the Software without restriction, including without limitation the 5181624Skmacy * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 6181624Skmacy * sell copies of the Software, and to permit persons to whom the Software is 7181624Skmacy * furnished to do so, subject to the following conditions: 8181624Skmacy * 9181624Skmacy * The above copyright notice and this permission notice shall be included in 10181624Skmacy * all copies or substantial portions of the Software. 11181624Skmacy * 12181624Skmacy * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 13181624Skmacy * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 14181624Skmacy * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 15181624Skmacy * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 16181624Skmacy * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 17181624Skmacy * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 18181624Skmacy * DEALINGS IN THE SOFTWARE. 19181624Skmacy */ 20181624Skmacy 21181624Skmacy#ifndef __XEN_PUBLIC_HVM_HVM_OP_H__ 22181624Skmacy#define __XEN_PUBLIC_HVM_HVM_OP_H__ 23181624Skmacy 24251767Sgibbs#include "../xen.h" 25251767Sgibbs#include "../trace.h" 26251767Sgibbs 27181624Skmacy/* Get/set subcommands: extra argument == pointer to xen_hvm_param struct. */ 28181624Skmacy#define HVMOP_set_param 0 29181624Skmacy#define HVMOP_get_param 1 30181624Skmacystruct xen_hvm_param { 31181624Skmacy domid_t domid; /* IN */ 32181624Skmacy uint32_t index; /* IN */ 33181624Skmacy uint64_t value; /* IN/OUT */ 34181624Skmacy}; 35181624Skmacytypedef struct xen_hvm_param xen_hvm_param_t; 36181624SkmacyDEFINE_XEN_GUEST_HANDLE(xen_hvm_param_t); 37181624Skmacy 38181624Skmacy/* Set the logical level of one of a domain's PCI INTx wires. */ 39181624Skmacy#define HVMOP_set_pci_intx_level 2 40181624Skmacystruct xen_hvm_set_pci_intx_level { 41181624Skmacy /* Domain to be updated. */ 42181624Skmacy domid_t domid; 43181624Skmacy /* PCI INTx identification in PCI topology (domain:bus:device:intx). */ 44181624Skmacy uint8_t domain, bus, device, intx; 45181624Skmacy /* Assertion level (0 = unasserted, 1 = asserted). */ 46181624Skmacy uint8_t level; 47181624Skmacy}; 48181624Skmacytypedef struct xen_hvm_set_pci_intx_level xen_hvm_set_pci_intx_level_t; 49181624SkmacyDEFINE_XEN_GUEST_HANDLE(xen_hvm_set_pci_intx_level_t); 50181624Skmacy 51181624Skmacy/* Set the logical level of one of a domain's ISA IRQ wires. */ 52181624Skmacy#define HVMOP_set_isa_irq_level 3 53181624Skmacystruct xen_hvm_set_isa_irq_level { 54181624Skmacy /* Domain to be updated. */ 55181624Skmacy domid_t domid; 56181624Skmacy /* ISA device identification, by ISA IRQ (0-15). */ 57181624Skmacy uint8_t isa_irq; 58181624Skmacy /* Assertion level (0 = unasserted, 1 = asserted). */ 59181624Skmacy uint8_t level; 60181624Skmacy}; 61181624Skmacytypedef struct xen_hvm_set_isa_irq_level xen_hvm_set_isa_irq_level_t; 62181624SkmacyDEFINE_XEN_GUEST_HANDLE(xen_hvm_set_isa_irq_level_t); 63181624Skmacy 64181624Skmacy#define HVMOP_set_pci_link_route 4 65181624Skmacystruct xen_hvm_set_pci_link_route { 66181624Skmacy /* Domain to be updated. */ 67181624Skmacy domid_t domid; 68181624Skmacy /* PCI link identifier (0-3). */ 69181624Skmacy uint8_t link; 70181624Skmacy /* ISA IRQ (1-15), or 0 (disable link). */ 71181624Skmacy uint8_t isa_irq; 72181624Skmacy}; 73181624Skmacytypedef struct xen_hvm_set_pci_link_route xen_hvm_set_pci_link_route_t; 74181624SkmacyDEFINE_XEN_GUEST_HANDLE(xen_hvm_set_pci_link_route_t); 75181624Skmacy 76181624Skmacy/* Flushes all VCPU TLBs: @arg must be NULL. */ 77181624Skmacy#define HVMOP_flush_tlbs 5 78181624Skmacy 79251767Sgibbstypedef enum { 80251767Sgibbs HVMMEM_ram_rw, /* Normal read/write guest RAM */ 81251767Sgibbs HVMMEM_ram_ro, /* Read-only; writes are discarded */ 82251767Sgibbs HVMMEM_mmio_dm, /* Reads and write go to the device model */ 83251767Sgibbs} hvmmem_type_t; 84251767Sgibbs 85183375Skmacy/* Following tools-only interfaces may change in future. */ 86183375Skmacy#if defined(__XEN__) || defined(__XEN_TOOLS__) 87183375Skmacy 88183375Skmacy/* Track dirty VRAM. */ 89183375Skmacy#define HVMOP_track_dirty_vram 6 90183375Skmacystruct xen_hvm_track_dirty_vram { 91183375Skmacy /* Domain to be tracked. */ 92183375Skmacy domid_t domid; 93183375Skmacy /* First pfn to track. */ 94183375Skmacy uint64_aligned_t first_pfn; 95183375Skmacy /* Number of pages to track. */ 96183375Skmacy uint64_aligned_t nr; 97183375Skmacy /* OUT variable. */ 98183375Skmacy /* Dirty bitmap buffer. */ 99183375Skmacy XEN_GUEST_HANDLE_64(uint8) dirty_bitmap; 100183375Skmacy}; 101183375Skmacytypedef struct xen_hvm_track_dirty_vram xen_hvm_track_dirty_vram_t; 102183375SkmacyDEFINE_XEN_GUEST_HANDLE(xen_hvm_track_dirty_vram_t); 103183375Skmacy 104183375Skmacy/* Notify that some pages got modified by the Device Model. */ 105183375Skmacy#define HVMOP_modified_memory 7 106183375Skmacystruct xen_hvm_modified_memory { 107183375Skmacy /* Domain to be updated. */ 108183375Skmacy domid_t domid; 109183375Skmacy /* First pfn. */ 110183375Skmacy uint64_aligned_t first_pfn; 111183375Skmacy /* Number of pages. */ 112183375Skmacy uint64_aligned_t nr; 113183375Skmacy}; 114183375Skmacytypedef struct xen_hvm_modified_memory xen_hvm_modified_memory_t; 115183375SkmacyDEFINE_XEN_GUEST_HANDLE(xen_hvm_modified_memory_t); 116183375Skmacy 117183375Skmacy#define HVMOP_set_mem_type 8 118183375Skmacy/* Notify that a region of memory is to be treated in a specific way. */ 119183375Skmacystruct xen_hvm_set_mem_type { 120183375Skmacy /* Domain to be updated. */ 121183375Skmacy domid_t domid; 122183375Skmacy /* Memory type */ 123251767Sgibbs uint16_t hvmmem_type; 124251767Sgibbs /* Number of pages. */ 125251767Sgibbs uint32_t nr; 126183375Skmacy /* First pfn. */ 127183375Skmacy uint64_aligned_t first_pfn; 128183375Skmacy}; 129183375Skmacytypedef struct xen_hvm_set_mem_type xen_hvm_set_mem_type_t; 130183375SkmacyDEFINE_XEN_GUEST_HANDLE(xen_hvm_set_mem_type_t); 131183375Skmacy 132251767Sgibbs#endif /* defined(__XEN__) || defined(__XEN_TOOLS__) */ 133183375Skmacy 134251767Sgibbs/* Hint from PV drivers for pagetable destruction. */ 135251767Sgibbs#define HVMOP_pagetable_dying 9 136251767Sgibbsstruct xen_hvm_pagetable_dying { 137251767Sgibbs /* Domain with a pagetable about to be destroyed. */ 138251767Sgibbs domid_t domid; 139251767Sgibbs uint16_t pad[3]; /* align next field on 8-byte boundary */ 140251767Sgibbs /* guest physical address of the toplevel pagetable dying */ 141251767Sgibbs uint64_t gpa; 142251767Sgibbs}; 143251767Sgibbstypedef struct xen_hvm_pagetable_dying xen_hvm_pagetable_dying_t; 144251767SgibbsDEFINE_XEN_GUEST_HANDLE(xen_hvm_pagetable_dying_t); 145251767Sgibbs 146251767Sgibbs/* Get the current Xen time, in nanoseconds since system boot. */ 147251767Sgibbs#define HVMOP_get_time 10 148251767Sgibbsstruct xen_hvm_get_time { 149251767Sgibbs uint64_t now; /* OUT */ 150251767Sgibbs}; 151251767Sgibbstypedef struct xen_hvm_get_time xen_hvm_get_time_t; 152251767SgibbsDEFINE_XEN_GUEST_HANDLE(xen_hvm_get_time_t); 153251767Sgibbs 154251767Sgibbs#define HVMOP_xentrace 11 155251767Sgibbsstruct xen_hvm_xentrace { 156251767Sgibbs uint16_t event, extra_bytes; 157251767Sgibbs uint8_t extra[TRACE_EXTRA_MAX * sizeof(uint32_t)]; 158251767Sgibbs}; 159251767Sgibbstypedef struct xen_hvm_xentrace xen_hvm_xentrace_t; 160251767SgibbsDEFINE_XEN_GUEST_HANDLE(xen_hvm_xentrace_t); 161251767Sgibbs 162251767Sgibbs/* Following tools-only interfaces may change in future. */ 163251767Sgibbs#if defined(__XEN__) || defined(__XEN_TOOLS__) 164251767Sgibbs 165251767Sgibbs#define HVMOP_set_mem_access 12 166251767Sgibbstypedef enum { 167251767Sgibbs HVMMEM_access_n, 168251767Sgibbs HVMMEM_access_r, 169251767Sgibbs HVMMEM_access_w, 170251767Sgibbs HVMMEM_access_rw, 171251767Sgibbs HVMMEM_access_x, 172251767Sgibbs HVMMEM_access_rx, 173251767Sgibbs HVMMEM_access_wx, 174251767Sgibbs HVMMEM_access_rwx, 175251767Sgibbs HVMMEM_access_rx2rw, /* Page starts off as r-x, but automatically 176251767Sgibbs * change to r-w on a write */ 177251767Sgibbs HVMMEM_access_n2rwx, /* Log access: starts off as n, automatically 178251767Sgibbs * goes to rwx, generating an event without 179251767Sgibbs * pausing the vcpu */ 180251767Sgibbs HVMMEM_access_default /* Take the domain default */ 181251767Sgibbs} hvmmem_access_t; 182251767Sgibbs/* Notify that a region of memory is to have specific access types */ 183251767Sgibbsstruct xen_hvm_set_mem_access { 184251767Sgibbs /* Domain to be updated. */ 185251767Sgibbs domid_t domid; 186251767Sgibbs /* Memory type */ 187251767Sgibbs uint16_t hvmmem_access; /* hvm_access_t */ 188251767Sgibbs /* Number of pages, ignored on setting default access */ 189251767Sgibbs uint32_t nr; 190251767Sgibbs /* First pfn, or ~0ull to set the default access for new pages */ 191251767Sgibbs uint64_aligned_t first_pfn; 192251767Sgibbs}; 193251767Sgibbstypedef struct xen_hvm_set_mem_access xen_hvm_set_mem_access_t; 194251767SgibbsDEFINE_XEN_GUEST_HANDLE(xen_hvm_set_mem_access_t); 195251767Sgibbs 196251767Sgibbs#define HVMOP_get_mem_access 13 197251767Sgibbs/* Get the specific access type for that region of memory */ 198251767Sgibbsstruct xen_hvm_get_mem_access { 199251767Sgibbs /* Domain to be queried. */ 200251767Sgibbs domid_t domid; 201251767Sgibbs /* Memory type: OUT */ 202251767Sgibbs uint16_t hvmmem_access; /* hvm_access_t */ 203251767Sgibbs /* pfn, or ~0ull for default access for new pages. IN */ 204251767Sgibbs uint64_aligned_t pfn; 205251767Sgibbs}; 206251767Sgibbstypedef struct xen_hvm_get_mem_access xen_hvm_get_mem_access_t; 207251767SgibbsDEFINE_XEN_GUEST_HANDLE(xen_hvm_get_mem_access_t); 208251767Sgibbs 209251767Sgibbs#define HVMOP_inject_trap 14 210251767Sgibbs/* Inject a trap into a VCPU, which will get taken up on the next 211251767Sgibbs * scheduling of it. Note that the caller should know enough of the 212251767Sgibbs * state of the CPU before injecting, to know what the effect of 213251767Sgibbs * injecting the trap will be. 214251767Sgibbs */ 215251767Sgibbsstruct xen_hvm_inject_trap { 216251767Sgibbs /* Domain to be queried. */ 217251767Sgibbs domid_t domid; 218251767Sgibbs /* VCPU */ 219251767Sgibbs uint32_t vcpuid; 220251767Sgibbs /* Vector number */ 221251767Sgibbs uint32_t vector; 222251767Sgibbs /* Trap type (HVMOP_TRAP_*) */ 223251767Sgibbs uint32_t type; 224251767Sgibbs/* NB. This enumeration precisely matches hvm.h:X86_EVENTTYPE_* */ 225251767Sgibbs# define HVMOP_TRAP_ext_int 0 /* external interrupt */ 226251767Sgibbs# define HVMOP_TRAP_nmi 2 /* nmi */ 227251767Sgibbs# define HVMOP_TRAP_hw_exc 3 /* hardware exception */ 228251767Sgibbs# define HVMOP_TRAP_sw_int 4 /* software interrupt (CD nn) */ 229251767Sgibbs# define HVMOP_TRAP_pri_sw_exc 5 /* ICEBP (F1) */ 230251767Sgibbs# define HVMOP_TRAP_sw_exc 6 /* INT3 (CC), INTO (CE) */ 231251767Sgibbs /* Error code, or ~0u to skip */ 232251767Sgibbs uint32_t error_code; 233251767Sgibbs /* Intruction length */ 234251767Sgibbs uint32_t insn_len; 235251767Sgibbs /* CR2 for page faults */ 236251767Sgibbs uint64_aligned_t cr2; 237251767Sgibbs}; 238251767Sgibbstypedef struct xen_hvm_inject_trap xen_hvm_inject_trap_t; 239251767SgibbsDEFINE_XEN_GUEST_HANDLE(xen_hvm_inject_trap_t); 240251767Sgibbs 241183375Skmacy#endif /* defined(__XEN__) || defined(__XEN_TOOLS__) */ 242183375Skmacy 243251767Sgibbs#define HVMOP_get_mem_type 15 244251767Sgibbs/* Return hvmmem_type_t for the specified pfn. */ 245251767Sgibbsstruct xen_hvm_get_mem_type { 246251767Sgibbs /* Domain to be queried. */ 247251767Sgibbs domid_t domid; 248251767Sgibbs /* OUT variable. */ 249251767Sgibbs uint16_t mem_type; 250251767Sgibbs uint16_t pad[2]; /* align next field on 8-byte boundary */ 251251767Sgibbs /* IN variable. */ 252251767Sgibbs uint64_t pfn; 253251767Sgibbs}; 254251767Sgibbstypedef struct xen_hvm_get_mem_type xen_hvm_get_mem_type_t; 255251767SgibbsDEFINE_XEN_GUEST_HANDLE(xen_hvm_get_mem_type_t); 256251767Sgibbs 257251767Sgibbs/* Following tools-only interfaces may change in future. */ 258251767Sgibbs#if defined(__XEN__) || defined(__XEN_TOOLS__) 259251767Sgibbs 260251767Sgibbs/* MSI injection for emulated devices */ 261251767Sgibbs#define HVMOP_inject_msi 16 262251767Sgibbsstruct xen_hvm_inject_msi { 263251767Sgibbs /* Domain to be injected */ 264251767Sgibbs domid_t domid; 265251767Sgibbs /* Data -- lower 32 bits */ 266251767Sgibbs uint32_t data; 267251767Sgibbs /* Address (0xfeexxxxx) */ 268251767Sgibbs uint64_t addr; 269251767Sgibbs}; 270251767Sgibbstypedef struct xen_hvm_inject_msi xen_hvm_inject_msi_t; 271251767SgibbsDEFINE_XEN_GUEST_HANDLE(xen_hvm_inject_msi_t); 272251767Sgibbs 273251767Sgibbs#endif /* defined(__XEN__) || defined(__XEN_TOOLS__) */ 274251767Sgibbs 275181624Skmacy#endif /* __XEN_PUBLIC_HVM_HVM_OP_H__ */ 276