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