vmm_dev.h revision 255751
1285970Sbdrewery/*- 2285970Sbdrewery * Copyright (c) 2011 NetApp, Inc. 3285970Sbdrewery * All rights reserved. 4285970Sbdrewery * 5285970Sbdrewery * Redistribution and use in source and binary forms, with or without 6285970Sbdrewery * modification, are permitted provided that the following conditions 7285970Sbdrewery * are met: 8285970Sbdrewery * 1. Redistributions of source code must retain the above copyright 9285970Sbdrewery * notice, this list of conditions and the following disclaimer. 10285970Sbdrewery * 2. Redistributions in binary form must reproduce the above copyright 11285970Sbdrewery * notice, this list of conditions and the following disclaimer in the 12285970Sbdrewery * documentation and/or other materials provided with the distribution. 13285970Sbdrewery * 14285970Sbdrewery * THIS SOFTWARE IS PROVIDED BY NETAPP, INC ``AS IS'' AND 15285970Sbdrewery * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16285970Sbdrewery * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17285970Sbdrewery * ARE DISCLAIMED. IN NO EVENT SHALL NETAPP, INC OR CONTRIBUTORS BE LIABLE 18285970Sbdrewery * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19285970Sbdrewery * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20285970Sbdrewery * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21285970Sbdrewery * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22285970Sbdrewery * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23285970Sbdrewery * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24285970Sbdrewery * SUCH DAMAGE. 25285970Sbdrewery * 26285970Sbdrewery * $FreeBSD: head/sys/amd64/include/vmm_dev.h 255751 2013-09-21 00:27:53Z grehan $ 27285970Sbdrewery */ 28285970Sbdrewery 29285970Sbdrewery#ifndef _VMM_DEV_H_ 30285970Sbdrewery#define _VMM_DEV_H_ 31285970Sbdrewery 32285970Sbdrewery#ifdef _KERNEL 33285970Sbdreweryvoid vmmdev_init(void); 34285970Sbdreweryint vmmdev_cleanup(void); 35285970Sbdrewery#endif 36285970Sbdrewery 37285970Sbdrewerystruct vm_memory_segment { 38285970Sbdrewery vm_paddr_t gpa; /* in */ 39285970Sbdrewery size_t len; /* in */ 40285970Sbdrewery}; 41285970Sbdrewery 42285970Sbdrewerystruct vm_register { 43285970Sbdrewery int cpuid; 44285970Sbdrewery int regnum; /* enum vm_reg_name */ 45285970Sbdrewery uint64_t regval; 46285970Sbdrewery}; 47285970Sbdrewery 48285970Sbdrewerystruct vm_seg_desc { /* data or code segment */ 49285970Sbdrewery int cpuid; 50285970Sbdrewery int regnum; /* enum vm_reg_name */ 51285970Sbdrewery struct seg_desc desc; 52285970Sbdrewery}; 53285970Sbdrewery 54285970Sbdrewerystruct vm_run { 55285970Sbdrewery int cpuid; 56285970Sbdrewery uint64_t rip; /* start running here */ 57285970Sbdrewery struct vm_exit vm_exit; 58285970Sbdrewery}; 59285970Sbdrewery 60285970Sbdrewerystruct vm_event { 61285970Sbdrewery int cpuid; 62285970Sbdrewery enum vm_event_type type; 63285970Sbdrewery int vector; 64285970Sbdrewery uint32_t error_code; 65285970Sbdrewery int error_code_valid; 66285970Sbdrewery}; 67285970Sbdrewery 68285970Sbdrewerystruct vm_lapic_irq { 69285970Sbdrewery int cpuid; 70285970Sbdrewery int vector; 71285970Sbdrewery}; 72285970Sbdrewery 73285970Sbdrewerystruct vm_capability { 74285970Sbdrewery int cpuid; 75285970Sbdrewery enum vm_cap_type captype; 76285970Sbdrewery int capval; 77285970Sbdrewery int allcpus; 78285970Sbdrewery}; 79285970Sbdrewery 80285970Sbdrewerystruct vm_pptdev { 81285970Sbdrewery int bus; 82285970Sbdrewery int slot; 83285970Sbdrewery int func; 84285970Sbdrewery}; 85285970Sbdrewery 86285970Sbdrewerystruct vm_pptdev_mmio { 87285970Sbdrewery int bus; 88285970Sbdrewery int slot; 89285970Sbdrewery int func; 90285970Sbdrewery vm_paddr_t gpa; 91285970Sbdrewery vm_paddr_t hpa; 92285970Sbdrewery size_t len; 93285970Sbdrewery}; 94285970Sbdrewery 95285970Sbdrewerystruct vm_pptdev_msi { 96285970Sbdrewery int vcpu; 97285970Sbdrewery int bus; 98285970Sbdrewery int slot; 99285970Sbdrewery int func; 100285970Sbdrewery int numvec; /* 0 means disabled */ 101285970Sbdrewery int vector; 102285970Sbdrewery int destcpu; 103285970Sbdrewery}; 104285970Sbdrewery 105285970Sbdrewerystruct vm_pptdev_msix { 106285970Sbdrewery int vcpu; 107285970Sbdrewery int bus; 108285970Sbdrewery int slot; 109285970Sbdrewery int func; 110285970Sbdrewery int idx; 111285970Sbdrewery uint32_t msg; 112285970Sbdrewery uint32_t vector_control; 113285970Sbdrewery uint64_t addr; 114285970Sbdrewery}; 115285970Sbdrewery 116285970Sbdrewerystruct vm_nmi { 117285970Sbdrewery int cpuid; 118285970Sbdrewery}; 119285970Sbdrewery 120#define MAX_VM_STATS 64 121struct vm_stats { 122 int cpuid; /* in */ 123 int num_entries; /* out */ 124 struct timeval tv; 125 uint64_t statbuf[MAX_VM_STATS]; 126}; 127 128struct vm_stat_desc { 129 int index; /* in */ 130 char desc[128]; /* out */ 131}; 132 133struct vm_x2apic { 134 int cpuid; 135 enum x2apic_state state; 136}; 137 138enum { 139 /* general routines */ 140 IOCNUM_ABIVERS = 0, 141 IOCNUM_RUN = 1, 142 IOCNUM_SET_CAPABILITY = 2, 143 IOCNUM_GET_CAPABILITY = 3, 144 145 /* memory apis */ 146 IOCNUM_MAP_MEMORY = 10, 147 IOCNUM_GET_MEMORY_SEG = 11, 148 149 /* register/state accessors */ 150 IOCNUM_SET_REGISTER = 20, 151 IOCNUM_GET_REGISTER = 21, 152 IOCNUM_SET_SEGMENT_DESCRIPTOR = 22, 153 IOCNUM_GET_SEGMENT_DESCRIPTOR = 23, 154 155 /* interrupt injection */ 156 IOCNUM_INJECT_EVENT = 30, 157 IOCNUM_LAPIC_IRQ = 31, 158 IOCNUM_INJECT_NMI = 32, 159 160 /* PCI pass-thru */ 161 IOCNUM_BIND_PPTDEV = 40, 162 IOCNUM_UNBIND_PPTDEV = 41, 163 IOCNUM_MAP_PPTDEV_MMIO = 42, 164 IOCNUM_PPTDEV_MSI = 43, 165 IOCNUM_PPTDEV_MSIX = 44, 166 167 /* statistics */ 168 IOCNUM_VM_STATS = 50, 169 IOCNUM_VM_STAT_DESC = 51, 170 171 /* kernel device state */ 172 IOCNUM_SET_X2APIC_STATE = 60, 173 IOCNUM_GET_X2APIC_STATE = 61, 174}; 175 176#define VM_RUN \ 177 _IOWR('v', IOCNUM_RUN, struct vm_run) 178#define VM_MAP_MEMORY \ 179 _IOWR('v', IOCNUM_MAP_MEMORY, struct vm_memory_segment) 180#define VM_GET_MEMORY_SEG \ 181 _IOWR('v', IOCNUM_GET_MEMORY_SEG, struct vm_memory_segment) 182#define VM_SET_REGISTER \ 183 _IOW('v', IOCNUM_SET_REGISTER, struct vm_register) 184#define VM_GET_REGISTER \ 185 _IOWR('v', IOCNUM_GET_REGISTER, struct vm_register) 186#define VM_SET_SEGMENT_DESCRIPTOR \ 187 _IOW('v', IOCNUM_SET_SEGMENT_DESCRIPTOR, struct vm_seg_desc) 188#define VM_GET_SEGMENT_DESCRIPTOR \ 189 _IOWR('v', IOCNUM_GET_SEGMENT_DESCRIPTOR, struct vm_seg_desc) 190#define VM_INJECT_EVENT \ 191 _IOW('v', IOCNUM_INJECT_EVENT, struct vm_event) 192#define VM_LAPIC_IRQ \ 193 _IOW('v', IOCNUM_LAPIC_IRQ, struct vm_lapic_irq) 194#define VM_SET_CAPABILITY \ 195 _IOW('v', IOCNUM_SET_CAPABILITY, struct vm_capability) 196#define VM_GET_CAPABILITY \ 197 _IOWR('v', IOCNUM_GET_CAPABILITY, struct vm_capability) 198#define VM_BIND_PPTDEV \ 199 _IOW('v', IOCNUM_BIND_PPTDEV, struct vm_pptdev) 200#define VM_UNBIND_PPTDEV \ 201 _IOW('v', IOCNUM_UNBIND_PPTDEV, struct vm_pptdev) 202#define VM_MAP_PPTDEV_MMIO \ 203 _IOW('v', IOCNUM_MAP_PPTDEV_MMIO, struct vm_pptdev_mmio) 204#define VM_PPTDEV_MSI \ 205 _IOW('v', IOCNUM_PPTDEV_MSI, struct vm_pptdev_msi) 206#define VM_PPTDEV_MSIX \ 207 _IOW('v', IOCNUM_PPTDEV_MSIX, struct vm_pptdev_msix) 208#define VM_INJECT_NMI \ 209 _IOW('v', IOCNUM_INJECT_NMI, struct vm_nmi) 210#define VM_STATS \ 211 _IOWR('v', IOCNUM_VM_STATS, struct vm_stats) 212#define VM_STAT_DESC \ 213 _IOWR('v', IOCNUM_VM_STAT_DESC, struct vm_stat_desc) 214#define VM_SET_X2APIC_STATE \ 215 _IOW('v', IOCNUM_SET_X2APIC_STATE, struct vm_x2apic) 216#define VM_GET_X2APIC_STATE \ 217 _IOWR('v', IOCNUM_GET_X2APIC_STATE, struct vm_x2apic) 218#endif 219