1221828Sgrehan/*-
2221828Sgrehan * Copyright (c) 2011 NetApp, Inc.
3221828Sgrehan * All rights reserved.
4221828Sgrehan *
5221828Sgrehan * Redistribution and use in source and binary forms, with or without
6221828Sgrehan * modification, are permitted provided that the following conditions
7221828Sgrehan * are met:
8221828Sgrehan * 1. Redistributions of source code must retain the above copyright
9221828Sgrehan *    notice, this list of conditions and the following disclaimer.
10221828Sgrehan * 2. Redistributions in binary form must reproduce the above copyright
11221828Sgrehan *    notice, this list of conditions and the following disclaimer in the
12221828Sgrehan *    documentation and/or other materials provided with the distribution.
13221828Sgrehan *
14221828Sgrehan * THIS SOFTWARE IS PROVIDED BY NETAPP, INC ``AS IS'' AND
15221828Sgrehan * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16221828Sgrehan * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17221828Sgrehan * ARE DISCLAIMED.  IN NO EVENT SHALL NETAPP, INC OR CONTRIBUTORS BE LIABLE
18221828Sgrehan * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19221828Sgrehan * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20221828Sgrehan * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21221828Sgrehan * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22221828Sgrehan * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23221828Sgrehan * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24221828Sgrehan * SUCH DAMAGE.
25221828Sgrehan *
26221828Sgrehan * $FreeBSD$
27221828Sgrehan */
28221828Sgrehan
29221828Sgrehan#ifndef _VMCS_H_
30221828Sgrehan#define	_VMCS_H_
31221828Sgrehan
32221828Sgrehan#ifdef _KERNEL
33221828Sgrehanstruct vmcs {
34221828Sgrehan	uint32_t	identifier;
35221828Sgrehan	uint32_t	abort_code;
36221828Sgrehan	char		_impl_specific[PAGE_SIZE - sizeof(uint32_t) * 2];
37221828Sgrehan};
38221828SgrehanCTASSERT(sizeof(struct vmcs) == PAGE_SIZE);
39221828Sgrehan
40221828Sgrehan/* MSR save region is composed of an array of 'struct msr_entry' */
41221828Sgrehanstruct msr_entry {
42221828Sgrehan	uint32_t	index;
43221828Sgrehan	uint32_t	reserved;
44221828Sgrehan	uint64_t	val;
45221828Sgrehan
46221828Sgrehan};
47221828Sgrehan
48221828Sgrehanint vmcs_set_msr_save(struct vmcs *vmcs, u_long g_area, u_int g_count);
49221828Sgrehanint	vmcs_set_defaults(struct vmcs *vmcs, u_long host_rip, u_long host_rsp,
50256072Sneel			  uint64_t eptp,
51221828Sgrehan			  uint32_t pinbased_ctls, uint32_t procbased_ctls,
52221828Sgrehan			  uint32_t procbased_ctls2, uint32_t exit_ctls,
53221828Sgrehan			  uint32_t entry_ctls, u_long msr_bitmap,
54221828Sgrehan			  uint16_t vpid);
55249879Sgrehanint	vmcs_getreg(struct vmcs *vmcs, int running, int ident, uint64_t *rv);
56249879Sgrehanint	vmcs_setreg(struct vmcs *vmcs, int running, int ident, uint64_t val);
57221828Sgrehanint	vmcs_getdesc(struct vmcs *vmcs, int ident,
58221828Sgrehan		     struct seg_desc *desc);
59221828Sgrehanint	vmcs_setdesc(struct vmcs *vmcs, int ident,
60221828Sgrehan		     struct seg_desc *desc);
61221828Sgrehanuint64_t vmcs_read(uint32_t encoding);
62221828Sgrehan
63221828Sgrehan#define	vmexit_instruction_length()	vmcs_read(VMCS_EXIT_INSTRUCTION_LENGTH)
64221828Sgrehan#define	vmcs_guest_rip()		vmcs_read(VMCS_GUEST_RIP)
65221828Sgrehan#define	vmcs_instruction_error()	vmcs_read(VMCS_INSTRUCTION_ERROR)
66221828Sgrehan#define	vmcs_exit_reason()		(vmcs_read(VMCS_EXIT_REASON) & 0xffff)
67221828Sgrehan#define	vmcs_exit_qualification()	vmcs_read(VMCS_EXIT_QUALIFICATION)
68234761Sgrehan#define	vmcs_guest_cr3()		vmcs_read(VMCS_GUEST_CR3)
69240941Sneel#define	vmcs_gpa()			vmcs_read(VMCS_GUEST_PHYSICAL_ADDRESS)
70243640Sneel#define	vmcs_gla()			vmcs_read(VMCS_GUEST_LINEAR_ADDRESS)
71256072Sneel#define	vmcs_idt_vectoring_info()	vmcs_read(VMCS_IDT_VECTORING_INFO)
72256072Sneel#define	vmcs_idt_vectoring_err()	vmcs_read(VMCS_IDT_VECTORING_ERROR)
73221828Sgrehan
74221828Sgrehan#endif	/* _KERNEL */
75221828Sgrehan
76222605Sjhb#define	VMCS_INITIAL			0xffffffffffffffff
77222605Sjhb
78221828Sgrehan#define	VMCS_IDENT(encoding)		((encoding) | 0x80000000)
79221828Sgrehan/*
80221828Sgrehan * VMCS field encodings from Appendix H, Intel Architecture Manual Vol3B.
81221828Sgrehan */
82221828Sgrehan#define	VMCS_INVALID_ENCODING		0xffffffff
83221828Sgrehan
84221828Sgrehan/* 16-bit control fields */
85221828Sgrehan#define	VMCS_VPID			0x00000000
86221828Sgrehan
87221828Sgrehan/* 16-bit guest-state fields */
88221828Sgrehan#define	VMCS_GUEST_ES_SELECTOR		0x00000800
89221828Sgrehan#define	VMCS_GUEST_CS_SELECTOR		0x00000802
90221828Sgrehan#define	VMCS_GUEST_SS_SELECTOR		0x00000804
91221828Sgrehan#define	VMCS_GUEST_DS_SELECTOR		0x00000806
92221828Sgrehan#define	VMCS_GUEST_FS_SELECTOR		0x00000808
93221828Sgrehan#define	VMCS_GUEST_GS_SELECTOR		0x0000080A
94221828Sgrehan#define	VMCS_GUEST_LDTR_SELECTOR	0x0000080C
95221828Sgrehan#define	VMCS_GUEST_TR_SELECTOR		0x0000080E
96221828Sgrehan
97221828Sgrehan/* 16-bit host-state fields */
98221828Sgrehan#define	VMCS_HOST_ES_SELECTOR		0x00000C00
99221828Sgrehan#define	VMCS_HOST_CS_SELECTOR		0x00000C02
100221828Sgrehan#define	VMCS_HOST_SS_SELECTOR		0x00000C04
101221828Sgrehan#define	VMCS_HOST_DS_SELECTOR		0x00000C06
102221828Sgrehan#define	VMCS_HOST_FS_SELECTOR		0x00000C08
103221828Sgrehan#define	VMCS_HOST_GS_SELECTOR		0x00000C0A
104221828Sgrehan#define	VMCS_HOST_TR_SELECTOR		0x00000C0C
105221828Sgrehan
106221828Sgrehan/* 64-bit control fields */
107221828Sgrehan#define	VMCS_IO_BITMAP_A		0x00002000
108221828Sgrehan#define	VMCS_IO_BITMAP_B		0x00002002
109221828Sgrehan#define	VMCS_MSR_BITMAP			0x00002004
110221828Sgrehan#define	VMCS_EXIT_MSR_STORE		0x00002006
111221828Sgrehan#define	VMCS_EXIT_MSR_LOAD		0x00002008
112221828Sgrehan#define	VMCS_ENTRY_MSR_LOAD		0x0000200A
113221828Sgrehan#define	VMCS_EXECUTIVE_VMCS		0x0000200C
114221828Sgrehan#define	VMCS_TSC_OFFSET			0x00002010
115221828Sgrehan#define	VMCS_VIRTUAL_APIC		0x00002012
116221828Sgrehan#define	VMCS_APIC_ACCESS		0x00002014
117221828Sgrehan#define	VMCS_EPTP			0x0000201A
118221828Sgrehan
119221828Sgrehan/* 64-bit read-only fields */
120221828Sgrehan#define	VMCS_GUEST_PHYSICAL_ADDRESS	0x00002400
121221828Sgrehan
122221828Sgrehan/* 64-bit guest-state fields */
123221828Sgrehan#define	VMCS_LINK_POINTER		0x00002800
124221828Sgrehan#define	VMCS_GUEST_IA32_DEBUGCTL	0x00002802
125221828Sgrehan#define	VMCS_GUEST_IA32_PAT		0x00002804
126221828Sgrehan#define	VMCS_GUEST_IA32_EFER		0x00002806
127221828Sgrehan#define	VMCS_GUEST_IA32_PERF_GLOBAL_CTRL 0x00002808
128221828Sgrehan#define	VMCS_GUEST_PDPTE0		0x0000280A
129221828Sgrehan#define	VMCS_GUEST_PDPTE1		0x0000280C
130221828Sgrehan#define	VMCS_GUEST_PDPTE2		0x0000280E
131221828Sgrehan#define	VMCS_GUEST_PDPTE3		0x00002810
132221828Sgrehan
133221828Sgrehan/* 64-bit host-state fields */
134221828Sgrehan#define	VMCS_HOST_IA32_PAT		0x00002C00
135221828Sgrehan#define	VMCS_HOST_IA32_EFER		0x00002C02
136221828Sgrehan#define	VMCS_HOST_IA32_PERF_GLOBAL_CTRL	0x00002C04
137221828Sgrehan
138221828Sgrehan/* 32-bit control fields */
139221828Sgrehan#define	VMCS_PIN_BASED_CTLS		0x00004000
140221828Sgrehan#define	VMCS_PRI_PROC_BASED_CTLS	0x00004002
141221828Sgrehan#define	VMCS_EXCEPTION_BITMAP		0x00004004
142221828Sgrehan#define	VMCS_PF_ERROR_MASK		0x00004006
143221828Sgrehan#define	VMCS_PF_ERROR_MATCH		0x00004008
144221828Sgrehan#define	VMCS_CR3_TARGET_COUNT		0x0000400A
145221828Sgrehan#define	VMCS_EXIT_CTLS			0x0000400C
146221828Sgrehan#define	VMCS_EXIT_MSR_STORE_COUNT	0x0000400E
147221828Sgrehan#define	VMCS_EXIT_MSR_LOAD_COUNT	0x00004010
148221828Sgrehan#define	VMCS_ENTRY_CTLS			0x00004012
149221828Sgrehan#define	VMCS_ENTRY_MSR_LOAD_COUNT	0x00004014
150221828Sgrehan#define	VMCS_ENTRY_INTR_INFO		0x00004016
151221828Sgrehan#define	VMCS_ENTRY_EXCEPTION_ERROR	0x00004018
152221828Sgrehan#define	VMCS_ENTRY_INST_LENGTH		0x0000401A
153221828Sgrehan#define	VMCS_TPR_THRESHOLD		0x0000401C
154221828Sgrehan#define	VMCS_SEC_PROC_BASED_CTLS	0x0000401E
155221828Sgrehan#define	VMCS_PLE_GAP			0x00004020
156221828Sgrehan#define	VMCS_PLE_WINDOW			0x00004022
157221828Sgrehan
158221828Sgrehan/* 32-bit read-only data fields */
159221828Sgrehan#define	VMCS_INSTRUCTION_ERROR		0x00004400
160221828Sgrehan#define	VMCS_EXIT_REASON		0x00004402
161221828Sgrehan#define	VMCS_EXIT_INTERRUPTION_INFO	0x00004404
162221828Sgrehan#define	VMCS_EXIT_INTERRUPTION_ERROR	0x00004406
163221828Sgrehan#define	VMCS_IDT_VECTORING_INFO		0x00004408
164221828Sgrehan#define	VMCS_IDT_VECTORING_ERROR	0x0000440A
165221828Sgrehan#define	VMCS_EXIT_INSTRUCTION_LENGTH	0x0000440C
166221828Sgrehan#define	VMCS_EXIT_INSTRUCTION_INFO	0x0000440E
167221828Sgrehan
168221828Sgrehan/* 32-bit guest-state fields */
169221828Sgrehan#define	VMCS_GUEST_ES_LIMIT		0x00004800
170221828Sgrehan#define	VMCS_GUEST_CS_LIMIT		0x00004802
171221828Sgrehan#define	VMCS_GUEST_SS_LIMIT		0x00004804
172221828Sgrehan#define	VMCS_GUEST_DS_LIMIT		0x00004806
173221828Sgrehan#define	VMCS_GUEST_FS_LIMIT		0x00004808
174221828Sgrehan#define	VMCS_GUEST_GS_LIMIT		0x0000480A
175221828Sgrehan#define	VMCS_GUEST_LDTR_LIMIT		0x0000480C
176221828Sgrehan#define	VMCS_GUEST_TR_LIMIT		0x0000480E
177221828Sgrehan#define	VMCS_GUEST_GDTR_LIMIT		0x00004810
178221828Sgrehan#define	VMCS_GUEST_IDTR_LIMIT		0x00004812
179221828Sgrehan#define	VMCS_GUEST_ES_ACCESS_RIGHTS	0x00004814
180221828Sgrehan#define	VMCS_GUEST_CS_ACCESS_RIGHTS	0x00004816
181221828Sgrehan#define	VMCS_GUEST_SS_ACCESS_RIGHTS	0x00004818
182221828Sgrehan#define	VMCS_GUEST_DS_ACCESS_RIGHTS	0x0000481A
183221828Sgrehan#define	VMCS_GUEST_FS_ACCESS_RIGHTS	0x0000481C
184221828Sgrehan#define	VMCS_GUEST_GS_ACCESS_RIGHTS	0x0000481E
185221828Sgrehan#define	VMCS_GUEST_LDTR_ACCESS_RIGHTS	0x00004820
186221828Sgrehan#define	VMCS_GUEST_TR_ACCESS_RIGHTS	0x00004822
187221828Sgrehan#define	VMCS_GUEST_INTERRUPTIBILITY	0x00004824
188221828Sgrehan#define	VMCS_GUEST_ACTIVITY		0x00004826
189221828Sgrehan#define VMCS_GUEST_SMBASE		0x00004828
190221828Sgrehan#define	VMCS_GUEST_IA32_SYSENTER_CS	0x0000482A
191221828Sgrehan#define	VMCS_PREEMPTION_TIMER_VALUE	0x0000482E
192221828Sgrehan
193221828Sgrehan/* 32-bit host state fields */
194221828Sgrehan#define	VMCS_HOST_IA32_SYSENTER_CS	0x00004C00
195221828Sgrehan
196221828Sgrehan/* Natural Width control fields */
197221828Sgrehan#define	VMCS_CR0_MASK			0x00006000
198221828Sgrehan#define	VMCS_CR4_MASK			0x00006002
199221828Sgrehan#define	VMCS_CR0_SHADOW			0x00006004
200221828Sgrehan#define	VMCS_CR4_SHADOW			0x00006006
201221828Sgrehan#define	VMCS_CR3_TARGET0		0x00006008
202221828Sgrehan#define	VMCS_CR3_TARGET1		0x0000600A
203221828Sgrehan#define	VMCS_CR3_TARGET2		0x0000600C
204221828Sgrehan#define	VMCS_CR3_TARGET3		0x0000600E
205221828Sgrehan
206221828Sgrehan/* Natural Width read-only fields */
207221828Sgrehan#define	VMCS_EXIT_QUALIFICATION		0x00006400
208221828Sgrehan#define	VMCS_IO_RCX			0x00006402
209221828Sgrehan#define	VMCS_IO_RSI			0x00006404
210221828Sgrehan#define	VMCS_IO_RDI			0x00006406
211221828Sgrehan#define	VMCS_IO_RIP			0x00006408
212221828Sgrehan#define	VMCS_GUEST_LINEAR_ADDRESS	0x0000640A
213221828Sgrehan
214221828Sgrehan/* Natural Width guest-state fields */
215221828Sgrehan#define	VMCS_GUEST_CR0			0x00006800
216221828Sgrehan#define	VMCS_GUEST_CR3			0x00006802
217221828Sgrehan#define	VMCS_GUEST_CR4			0x00006804
218221828Sgrehan#define	VMCS_GUEST_ES_BASE		0x00006806
219221828Sgrehan#define	VMCS_GUEST_CS_BASE		0x00006808
220221828Sgrehan#define	VMCS_GUEST_SS_BASE		0x0000680A
221221828Sgrehan#define	VMCS_GUEST_DS_BASE		0x0000680C
222221828Sgrehan#define	VMCS_GUEST_FS_BASE		0x0000680E
223221828Sgrehan#define	VMCS_GUEST_GS_BASE		0x00006810
224221828Sgrehan#define	VMCS_GUEST_LDTR_BASE		0x00006812
225221828Sgrehan#define	VMCS_GUEST_TR_BASE		0x00006814
226221828Sgrehan#define	VMCS_GUEST_GDTR_BASE		0x00006816
227221828Sgrehan#define	VMCS_GUEST_IDTR_BASE		0x00006818
228221828Sgrehan#define	VMCS_GUEST_DR7			0x0000681A
229221828Sgrehan#define	VMCS_GUEST_RSP			0x0000681C
230221828Sgrehan#define	VMCS_GUEST_RIP			0x0000681E
231221828Sgrehan#define	VMCS_GUEST_RFLAGS		0x00006820
232221828Sgrehan#define	VMCS_GUEST_PENDING_DBG_EXCEPTIONS 0x00006822
233221828Sgrehan#define	VMCS_GUEST_IA32_SYSENTER_ESP	0x00006824
234221828Sgrehan#define	VMCS_GUEST_IA32_SYSENTER_EIP	0x00006826
235221828Sgrehan
236221828Sgrehan/* Natural Width host-state fields */
237221828Sgrehan#define	VMCS_HOST_CR0			0x00006C00
238221828Sgrehan#define	VMCS_HOST_CR3			0x00006C02
239221828Sgrehan#define	VMCS_HOST_CR4			0x00006C04
240221828Sgrehan#define	VMCS_HOST_FS_BASE		0x00006C06
241221828Sgrehan#define	VMCS_HOST_GS_BASE		0x00006C08
242221828Sgrehan#define	VMCS_HOST_TR_BASE		0x00006C0A
243221828Sgrehan#define	VMCS_HOST_GDTR_BASE		0x00006C0C
244221828Sgrehan#define	VMCS_HOST_IDTR_BASE		0x00006C0E
245221828Sgrehan#define	VMCS_HOST_IA32_SYSENTER_ESP	0x00006C10
246221828Sgrehan#define	VMCS_HOST_IA32_SYSENTER_EIP	0x00006C12
247221828Sgrehan#define	VMCS_HOST_RSP			0x00006C14
248221828Sgrehan#define	VMCS_HOST_RIP			0x00006c16
249221828Sgrehan
250221828Sgrehan/*
251221828Sgrehan * VM instruction error numbers
252221828Sgrehan */
253221828Sgrehan#define	VMRESUME_WITH_NON_LAUNCHED_VMCS	5
254221828Sgrehan
255221828Sgrehan/*
256221828Sgrehan * VMCS exit reasons
257221828Sgrehan */
258221828Sgrehan#define EXIT_REASON_EXCEPTION		0
259221828Sgrehan#define EXIT_REASON_EXT_INTR		1
260221828Sgrehan#define EXIT_REASON_TRIPLE_FAULT	2
261221828Sgrehan#define EXIT_REASON_INIT		3
262221828Sgrehan#define EXIT_REASON_SIPI		4
263221828Sgrehan#define EXIT_REASON_IO_SMI		5
264221828Sgrehan#define EXIT_REASON_SMI			6
265221828Sgrehan#define EXIT_REASON_INTR_WINDOW		7
266221828Sgrehan#define EXIT_REASON_NMI_WINDOW		8
267221828Sgrehan#define EXIT_REASON_TASK_SWITCH		9
268221828Sgrehan#define EXIT_REASON_CPUID		10
269221828Sgrehan#define EXIT_REASON_GETSEC		11
270221828Sgrehan#define EXIT_REASON_HLT			12
271221828Sgrehan#define EXIT_REASON_INVD		13
272221828Sgrehan#define EXIT_REASON_INVLPG		14
273221828Sgrehan#define EXIT_REASON_RDPMC		15
274221828Sgrehan#define EXIT_REASON_RDTSC		16
275221828Sgrehan#define EXIT_REASON_RSM			17
276221828Sgrehan#define EXIT_REASON_VMCALL		18
277221828Sgrehan#define EXIT_REASON_VMCLEAR		19
278221828Sgrehan#define EXIT_REASON_VMLAUNCH		20
279221828Sgrehan#define EXIT_REASON_VMPTRLD		21
280221828Sgrehan#define EXIT_REASON_VMPTRST		22
281221828Sgrehan#define EXIT_REASON_VMREAD		23
282221828Sgrehan#define EXIT_REASON_VMRESUME		24
283221828Sgrehan#define EXIT_REASON_VMWRITE		25
284221828Sgrehan#define EXIT_REASON_VMXOFF		26
285221828Sgrehan#define EXIT_REASON_VMXON		27
286221828Sgrehan#define EXIT_REASON_CR_ACCESS		28
287221828Sgrehan#define EXIT_REASON_DR_ACCESS		29
288221828Sgrehan#define EXIT_REASON_INOUT		30
289221828Sgrehan#define EXIT_REASON_RDMSR		31
290221828Sgrehan#define EXIT_REASON_WRMSR		32
291221828Sgrehan#define EXIT_REASON_INVAL_VMCS		33
292221828Sgrehan#define EXIT_REASON_INVAL_MSR		34
293221828Sgrehan#define EXIT_REASON_MWAIT		36
294221828Sgrehan#define EXIT_REASON_MTF			37
295221828Sgrehan#define EXIT_REASON_MONITOR		39
296221828Sgrehan#define EXIT_REASON_PAUSE		40
297221828Sgrehan#define EXIT_REASON_MCE			41
298221828Sgrehan#define EXIT_REASON_TPR			43
299221828Sgrehan#define EXIT_REASON_APIC		44
300221828Sgrehan#define EXIT_REASON_GDTR_IDTR		46
301221828Sgrehan#define EXIT_REASON_LDTR_TR		47
302221828Sgrehan#define EXIT_REASON_EPT_FAULT		48
303221828Sgrehan#define EXIT_REASON_EPT_MISCONFIG	49
304221828Sgrehan#define EXIT_REASON_INVEPT		50
305221828Sgrehan#define EXIT_REASON_RDTSCP		51
306221828Sgrehan#define EXIT_REASON_VMX_PREEMPT		52
307221828Sgrehan#define EXIT_REASON_INVVPID		53
308221828Sgrehan#define EXIT_REASON_WBINVD		54
309221828Sgrehan#define EXIT_REASON_XSETBV		55
310221828Sgrehan
311221828Sgrehan/*
312221828Sgrehan * VMCS interrupt information fields
313221828Sgrehan */
314222111Sneel#define	VMCS_INTERRUPTION_INFO_VALID	(1U << 31)
315221828Sgrehan#define	VMCS_INTERRUPTION_INFO_HW_INTR	(0 << 8)
316221828Sgrehan#define	VMCS_INTERRUPTION_INFO_NMI	(2 << 8)
317221828Sgrehan
318221828Sgrehan/*
319256072Sneel * VMCS IDT-Vectoring information fields
320256072Sneel */
321256072Sneel#define	VMCS_IDT_VEC_VALID		(1 << 31)
322256072Sneel#define	VMCS_IDT_VEC_ERRCODE_VALID	(1 << 11)
323256072Sneel
324256072Sneel/*
325221828Sgrehan * VMCS Guest interruptibility field
326221828Sgrehan */
327221828Sgrehan#define	VMCS_INTERRUPTIBILITY_STI_BLOCKING	(1 << 0)
328221828Sgrehan#define	VMCS_INTERRUPTIBILITY_MOVSS_BLOCKING	(1 << 1)
329221828Sgrehan#define	VMCS_INTERRUPTIBILITY_SMI_BLOCKING	(1 << 2)
330221828Sgrehan#define	VMCS_INTERRUPTIBILITY_NMI_BLOCKING	(1 << 3)
331221828Sgrehan
332221828Sgrehan/*
333221828Sgrehan * Exit qualification for EXIT_REASON_INVAL_VMCS
334221828Sgrehan */
335221828Sgrehan#define	EXIT_QUAL_NMI_WHILE_STI_BLOCKING	3
336221828Sgrehan
337240941Sneel/*
338240941Sneel * Exit qualification for EPT violation
339240941Sneel */
340240941Sneel#define	EPT_VIOLATION_DATA_READ		(1UL << 0)
341240941Sneel#define	EPT_VIOLATION_DATA_WRITE	(1UL << 1)
342240941Sneel#define	EPT_VIOLATION_INST_FETCH	(1UL << 2)
343256072Sneel#define	EPT_VIOLATION_GPA_READABLE	(1UL << 3)
344256072Sneel#define	EPT_VIOLATION_GPA_WRITEABLE	(1UL << 4)
345256072Sneel#define	EPT_VIOLATION_GPA_EXECUTABLE	(1UL << 5)
346240941Sneel#define	EPT_VIOLATION_GLA_VALID		(1UL << 7)
347240941Sneel#define	EPT_VIOLATION_XLAT_VALID	(1UL << 8)
348240941Sneel
349221828Sgrehan#endif
350