Linux Audio

Check our new training course

Loading...
v4.6
 
  1/*
  2 * vmx.h: VMX Architecture related definitions
  3 * Copyright (c) 2004, Intel Corporation.
  4 *
  5 * This program is free software; you can redistribute it and/or modify it
  6 * under the terms and conditions of the GNU General Public License,
  7 * version 2, as published by the Free Software Foundation.
  8 *
  9 * This program is distributed in the hope it will be useful, but WITHOUT
 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 12 * more details.
 13 *
 14 * You should have received a copy of the GNU General Public License along with
 15 * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
 16 * Place - Suite 330, Boston, MA 02111-1307 USA.
 17 *
 18 * A few random additions are:
 19 * Copyright (C) 2006 Qumranet
 20 *    Avi Kivity <avi@qumranet.com>
 21 *    Yaniv Kamay <yaniv@qumranet.com>
 22 *
 23 */
 24#ifndef VMX_H
 25#define VMX_H
 26
 27
 
 
 28#include <linux/types.h>
 
 29#include <uapi/asm/vmx.h>
 
 
 
 30
 31/*
 32 * Definitions of Primary Processor-Based VM-Execution Controls.
 33 */
 34#define CPU_BASED_VIRTUAL_INTR_PENDING          0x00000004
 35#define CPU_BASED_USE_TSC_OFFSETING             0x00000008
 36#define CPU_BASED_HLT_EXITING                   0x00000080
 37#define CPU_BASED_INVLPG_EXITING                0x00000200
 38#define CPU_BASED_MWAIT_EXITING                 0x00000400
 39#define CPU_BASED_RDPMC_EXITING                 0x00000800
 40#define CPU_BASED_RDTSC_EXITING                 0x00001000
 41#define CPU_BASED_CR3_LOAD_EXITING		0x00008000
 42#define CPU_BASED_CR3_STORE_EXITING		0x00010000
 43#define CPU_BASED_CR8_LOAD_EXITING              0x00080000
 44#define CPU_BASED_CR8_STORE_EXITING             0x00100000
 45#define CPU_BASED_TPR_SHADOW                    0x00200000
 46#define CPU_BASED_VIRTUAL_NMI_PENDING		0x00400000
 47#define CPU_BASED_MOV_DR_EXITING                0x00800000
 48#define CPU_BASED_UNCOND_IO_EXITING             0x01000000
 49#define CPU_BASED_USE_IO_BITMAPS                0x02000000
 50#define CPU_BASED_MONITOR_TRAP_FLAG             0x08000000
 51#define CPU_BASED_USE_MSR_BITMAPS               0x10000000
 52#define CPU_BASED_MONITOR_EXITING               0x20000000
 53#define CPU_BASED_PAUSE_EXITING                 0x40000000
 54#define CPU_BASED_ACTIVATE_SECONDARY_CONTROLS   0x80000000
 
 55
 56#define CPU_BASED_ALWAYSON_WITHOUT_TRUE_MSR	0x0401e172
 57
 58/*
 59 * Definitions of Secondary Processor-Based VM-Execution Controls.
 60 */
 61#define SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES 0x00000001
 62#define SECONDARY_EXEC_ENABLE_EPT               0x00000002
 63#define SECONDARY_EXEC_RDTSCP			0x00000008
 64#define SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE   0x00000010
 65#define SECONDARY_EXEC_ENABLE_VPID              0x00000020
 66#define SECONDARY_EXEC_WBINVD_EXITING		0x00000040
 67#define SECONDARY_EXEC_UNRESTRICTED_GUEST	0x00000080
 68#define SECONDARY_EXEC_APIC_REGISTER_VIRT       0x00000100
 69#define SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY    0x00000200
 70#define SECONDARY_EXEC_PAUSE_LOOP_EXITING	0x00000400
 71#define SECONDARY_EXEC_ENABLE_INVPCID		0x00001000
 72#define SECONDARY_EXEC_SHADOW_VMCS              0x00004000
 73#define SECONDARY_EXEC_ENABLE_PML               0x00020000
 74#define SECONDARY_EXEC_XSAVES			0x00100000
 75#define SECONDARY_EXEC_PCOMMIT			0x00200000
 76#define SECONDARY_EXEC_TSC_SCALING              0x02000000
 77
 78#define PIN_BASED_EXT_INTR_MASK                 0x00000001
 79#define PIN_BASED_NMI_EXITING                   0x00000008
 80#define PIN_BASED_VIRTUAL_NMIS                  0x00000020
 81#define PIN_BASED_VMX_PREEMPTION_TIMER          0x00000040
 82#define PIN_BASED_POSTED_INTR                   0x00000080
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 83
 84#define PIN_BASED_ALWAYSON_WITHOUT_TRUE_MSR	0x00000016
 85
 86#define VM_EXIT_SAVE_DEBUG_CONTROLS             0x00000004
 87#define VM_EXIT_HOST_ADDR_SPACE_SIZE            0x00000200
 88#define VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL      0x00001000
 89#define VM_EXIT_ACK_INTR_ON_EXIT                0x00008000
 90#define VM_EXIT_SAVE_IA32_PAT			0x00040000
 91#define VM_EXIT_LOAD_IA32_PAT			0x00080000
 92#define VM_EXIT_SAVE_IA32_EFER                  0x00100000
 93#define VM_EXIT_LOAD_IA32_EFER                  0x00200000
 94#define VM_EXIT_SAVE_VMX_PREEMPTION_TIMER       0x00400000
 95#define VM_EXIT_CLEAR_BNDCFGS                   0x00800000
 
 
 96
 97#define VM_EXIT_ALWAYSON_WITHOUT_TRUE_MSR	0x00036dff
 98
 99#define VM_ENTRY_LOAD_DEBUG_CONTROLS            0x00000004
100#define VM_ENTRY_IA32E_MODE                     0x00000200
101#define VM_ENTRY_SMM                            0x00000400
102#define VM_ENTRY_DEACT_DUAL_MONITOR             0x00000800
103#define VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL     0x00002000
104#define VM_ENTRY_LOAD_IA32_PAT			0x00004000
105#define VM_ENTRY_LOAD_IA32_EFER                 0x00008000
106#define VM_ENTRY_LOAD_BNDCFGS                   0x00010000
 
 
107
108#define VM_ENTRY_ALWAYSON_WITHOUT_TRUE_MSR	0x000011ff
109
110#define VMX_MISC_PREEMPTION_TIMER_RATE_MASK	0x0000001f
111#define VMX_MISC_SAVE_EFER_LMA			0x00000020
112#define VMX_MISC_ACTIVITY_HLT			0x00000040
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
113
114/* VMCS Encodings */
115enum vmcs_field {
116	VIRTUAL_PROCESSOR_ID            = 0x00000000,
117	POSTED_INTR_NV                  = 0x00000002,
 
118	GUEST_ES_SELECTOR               = 0x00000800,
119	GUEST_CS_SELECTOR               = 0x00000802,
120	GUEST_SS_SELECTOR               = 0x00000804,
121	GUEST_DS_SELECTOR               = 0x00000806,
122	GUEST_FS_SELECTOR               = 0x00000808,
123	GUEST_GS_SELECTOR               = 0x0000080a,
124	GUEST_LDTR_SELECTOR             = 0x0000080c,
125	GUEST_TR_SELECTOR               = 0x0000080e,
126	GUEST_INTR_STATUS               = 0x00000810,
127	GUEST_PML_INDEX			= 0x00000812,
128	HOST_ES_SELECTOR                = 0x00000c00,
129	HOST_CS_SELECTOR                = 0x00000c02,
130	HOST_SS_SELECTOR                = 0x00000c04,
131	HOST_DS_SELECTOR                = 0x00000c06,
132	HOST_FS_SELECTOR                = 0x00000c08,
133	HOST_GS_SELECTOR                = 0x00000c0a,
134	HOST_TR_SELECTOR                = 0x00000c0c,
135	IO_BITMAP_A                     = 0x00002000,
136	IO_BITMAP_A_HIGH                = 0x00002001,
137	IO_BITMAP_B                     = 0x00002002,
138	IO_BITMAP_B_HIGH                = 0x00002003,
139	MSR_BITMAP                      = 0x00002004,
140	MSR_BITMAP_HIGH                 = 0x00002005,
141	VM_EXIT_MSR_STORE_ADDR          = 0x00002006,
142	VM_EXIT_MSR_STORE_ADDR_HIGH     = 0x00002007,
143	VM_EXIT_MSR_LOAD_ADDR           = 0x00002008,
144	VM_EXIT_MSR_LOAD_ADDR_HIGH      = 0x00002009,
145	VM_ENTRY_MSR_LOAD_ADDR          = 0x0000200a,
146	VM_ENTRY_MSR_LOAD_ADDR_HIGH     = 0x0000200b,
147	PML_ADDRESS			= 0x0000200e,
148	PML_ADDRESS_HIGH		= 0x0000200f,
149	TSC_OFFSET                      = 0x00002010,
150	TSC_OFFSET_HIGH                 = 0x00002011,
151	VIRTUAL_APIC_PAGE_ADDR          = 0x00002012,
152	VIRTUAL_APIC_PAGE_ADDR_HIGH     = 0x00002013,
153	APIC_ACCESS_ADDR		= 0x00002014,
154	APIC_ACCESS_ADDR_HIGH		= 0x00002015,
155	POSTED_INTR_DESC_ADDR           = 0x00002016,
156	POSTED_INTR_DESC_ADDR_HIGH      = 0x00002017,
 
 
157	EPT_POINTER                     = 0x0000201a,
158	EPT_POINTER_HIGH                = 0x0000201b,
159	EOI_EXIT_BITMAP0                = 0x0000201c,
160	EOI_EXIT_BITMAP0_HIGH           = 0x0000201d,
161	EOI_EXIT_BITMAP1                = 0x0000201e,
162	EOI_EXIT_BITMAP1_HIGH           = 0x0000201f,
163	EOI_EXIT_BITMAP2                = 0x00002020,
164	EOI_EXIT_BITMAP2_HIGH           = 0x00002021,
165	EOI_EXIT_BITMAP3                = 0x00002022,
166	EOI_EXIT_BITMAP3_HIGH           = 0x00002023,
 
 
167	VMREAD_BITMAP                   = 0x00002026,
 
168	VMWRITE_BITMAP                  = 0x00002028,
 
169	XSS_EXIT_BITMAP                 = 0x0000202C,
170	XSS_EXIT_BITMAP_HIGH            = 0x0000202D,
 
 
171	TSC_MULTIPLIER                  = 0x00002032,
172	TSC_MULTIPLIER_HIGH             = 0x00002033,
 
 
 
 
173	GUEST_PHYSICAL_ADDRESS          = 0x00002400,
174	GUEST_PHYSICAL_ADDRESS_HIGH     = 0x00002401,
175	VMCS_LINK_POINTER               = 0x00002800,
176	VMCS_LINK_POINTER_HIGH          = 0x00002801,
177	GUEST_IA32_DEBUGCTL             = 0x00002802,
178	GUEST_IA32_DEBUGCTL_HIGH        = 0x00002803,
179	GUEST_IA32_PAT			= 0x00002804,
180	GUEST_IA32_PAT_HIGH		= 0x00002805,
181	GUEST_IA32_EFER			= 0x00002806,
182	GUEST_IA32_EFER_HIGH		= 0x00002807,
183	GUEST_IA32_PERF_GLOBAL_CTRL	= 0x00002808,
184	GUEST_IA32_PERF_GLOBAL_CTRL_HIGH= 0x00002809,
185	GUEST_PDPTR0                    = 0x0000280a,
186	GUEST_PDPTR0_HIGH               = 0x0000280b,
187	GUEST_PDPTR1                    = 0x0000280c,
188	GUEST_PDPTR1_HIGH               = 0x0000280d,
189	GUEST_PDPTR2                    = 0x0000280e,
190	GUEST_PDPTR2_HIGH               = 0x0000280f,
191	GUEST_PDPTR3                    = 0x00002810,
192	GUEST_PDPTR3_HIGH               = 0x00002811,
193	GUEST_BNDCFGS                   = 0x00002812,
194	GUEST_BNDCFGS_HIGH              = 0x00002813,
 
 
195	HOST_IA32_PAT			= 0x00002c00,
196	HOST_IA32_PAT_HIGH		= 0x00002c01,
197	HOST_IA32_EFER			= 0x00002c02,
198	HOST_IA32_EFER_HIGH		= 0x00002c03,
199	HOST_IA32_PERF_GLOBAL_CTRL	= 0x00002c04,
200	HOST_IA32_PERF_GLOBAL_CTRL_HIGH	= 0x00002c05,
201	PIN_BASED_VM_EXEC_CONTROL       = 0x00004000,
202	CPU_BASED_VM_EXEC_CONTROL       = 0x00004002,
203	EXCEPTION_BITMAP                = 0x00004004,
204	PAGE_FAULT_ERROR_CODE_MASK      = 0x00004006,
205	PAGE_FAULT_ERROR_CODE_MATCH     = 0x00004008,
206	CR3_TARGET_COUNT                = 0x0000400a,
207	VM_EXIT_CONTROLS                = 0x0000400c,
208	VM_EXIT_MSR_STORE_COUNT         = 0x0000400e,
209	VM_EXIT_MSR_LOAD_COUNT          = 0x00004010,
210	VM_ENTRY_CONTROLS               = 0x00004012,
211	VM_ENTRY_MSR_LOAD_COUNT         = 0x00004014,
212	VM_ENTRY_INTR_INFO_FIELD        = 0x00004016,
213	VM_ENTRY_EXCEPTION_ERROR_CODE   = 0x00004018,
214	VM_ENTRY_INSTRUCTION_LEN        = 0x0000401a,
215	TPR_THRESHOLD                   = 0x0000401c,
216	SECONDARY_VM_EXEC_CONTROL       = 0x0000401e,
217	PLE_GAP                         = 0x00004020,
218	PLE_WINDOW                      = 0x00004022,
 
219	VM_INSTRUCTION_ERROR            = 0x00004400,
220	VM_EXIT_REASON                  = 0x00004402,
221	VM_EXIT_INTR_INFO               = 0x00004404,
222	VM_EXIT_INTR_ERROR_CODE         = 0x00004406,
223	IDT_VECTORING_INFO_FIELD        = 0x00004408,
224	IDT_VECTORING_ERROR_CODE        = 0x0000440a,
225	VM_EXIT_INSTRUCTION_LEN         = 0x0000440c,
226	VMX_INSTRUCTION_INFO            = 0x0000440e,
227	GUEST_ES_LIMIT                  = 0x00004800,
228	GUEST_CS_LIMIT                  = 0x00004802,
229	GUEST_SS_LIMIT                  = 0x00004804,
230	GUEST_DS_LIMIT                  = 0x00004806,
231	GUEST_FS_LIMIT                  = 0x00004808,
232	GUEST_GS_LIMIT                  = 0x0000480a,
233	GUEST_LDTR_LIMIT                = 0x0000480c,
234	GUEST_TR_LIMIT                  = 0x0000480e,
235	GUEST_GDTR_LIMIT                = 0x00004810,
236	GUEST_IDTR_LIMIT                = 0x00004812,
237	GUEST_ES_AR_BYTES               = 0x00004814,
238	GUEST_CS_AR_BYTES               = 0x00004816,
239	GUEST_SS_AR_BYTES               = 0x00004818,
240	GUEST_DS_AR_BYTES               = 0x0000481a,
241	GUEST_FS_AR_BYTES               = 0x0000481c,
242	GUEST_GS_AR_BYTES               = 0x0000481e,
243	GUEST_LDTR_AR_BYTES             = 0x00004820,
244	GUEST_TR_AR_BYTES               = 0x00004822,
245	GUEST_INTERRUPTIBILITY_INFO     = 0x00004824,
246	GUEST_ACTIVITY_STATE            = 0X00004826,
247	GUEST_SYSENTER_CS               = 0x0000482A,
248	VMX_PREEMPTION_TIMER_VALUE      = 0x0000482E,
249	HOST_IA32_SYSENTER_CS           = 0x00004c00,
250	CR0_GUEST_HOST_MASK             = 0x00006000,
251	CR4_GUEST_HOST_MASK             = 0x00006002,
252	CR0_READ_SHADOW                 = 0x00006004,
253	CR4_READ_SHADOW                 = 0x00006006,
254	CR3_TARGET_VALUE0               = 0x00006008,
255	CR3_TARGET_VALUE1               = 0x0000600a,
256	CR3_TARGET_VALUE2               = 0x0000600c,
257	CR3_TARGET_VALUE3               = 0x0000600e,
258	EXIT_QUALIFICATION              = 0x00006400,
259	GUEST_LINEAR_ADDRESS            = 0x0000640a,
260	GUEST_CR0                       = 0x00006800,
261	GUEST_CR3                       = 0x00006802,
262	GUEST_CR4                       = 0x00006804,
263	GUEST_ES_BASE                   = 0x00006806,
264	GUEST_CS_BASE                   = 0x00006808,
265	GUEST_SS_BASE                   = 0x0000680a,
266	GUEST_DS_BASE                   = 0x0000680c,
267	GUEST_FS_BASE                   = 0x0000680e,
268	GUEST_GS_BASE                   = 0x00006810,
269	GUEST_LDTR_BASE                 = 0x00006812,
270	GUEST_TR_BASE                   = 0x00006814,
271	GUEST_GDTR_BASE                 = 0x00006816,
272	GUEST_IDTR_BASE                 = 0x00006818,
273	GUEST_DR7                       = 0x0000681a,
274	GUEST_RSP                       = 0x0000681c,
275	GUEST_RIP                       = 0x0000681e,
276	GUEST_RFLAGS                    = 0x00006820,
277	GUEST_PENDING_DBG_EXCEPTIONS    = 0x00006822,
278	GUEST_SYSENTER_ESP              = 0x00006824,
279	GUEST_SYSENTER_EIP              = 0x00006826,
280	HOST_CR0                        = 0x00006c00,
281	HOST_CR3                        = 0x00006c02,
282	HOST_CR4                        = 0x00006c04,
283	HOST_FS_BASE                    = 0x00006c06,
284	HOST_GS_BASE                    = 0x00006c08,
285	HOST_TR_BASE                    = 0x00006c0a,
286	HOST_GDTR_BASE                  = 0x00006c0c,
287	HOST_IDTR_BASE                  = 0x00006c0e,
288	HOST_IA32_SYSENTER_ESP          = 0x00006c10,
289	HOST_IA32_SYSENTER_EIP          = 0x00006c12,
290	HOST_RSP                        = 0x00006c14,
291	HOST_RIP                        = 0x00006c16,
292};
293
294/*
295 * Interruption-information format
296 */
297#define INTR_INFO_VECTOR_MASK           0xff            /* 7:0 */
298#define INTR_INFO_INTR_TYPE_MASK        0x700           /* 10:8 */
299#define INTR_INFO_DELIVER_CODE_MASK     0x800           /* 11 */
300#define INTR_INFO_UNBLOCK_NMI		0x1000		/* 12 */
301#define INTR_INFO_VALID_MASK            0x80000000      /* 31 */
302#define INTR_INFO_RESVD_BITS_MASK       0x7ffff000
303
304#define VECTORING_INFO_VECTOR_MASK           	INTR_INFO_VECTOR_MASK
305#define VECTORING_INFO_TYPE_MASK        	INTR_INFO_INTR_TYPE_MASK
306#define VECTORING_INFO_DELIVER_CODE_MASK    	INTR_INFO_DELIVER_CODE_MASK
307#define VECTORING_INFO_VALID_MASK       	INTR_INFO_VALID_MASK
308
309#define INTR_TYPE_EXT_INTR              (0 << 8) /* external interrupt */
 
310#define INTR_TYPE_NMI_INTR		(2 << 8) /* NMI */
311#define INTR_TYPE_HARD_EXCEPTION	(3 << 8) /* processor exception */
312#define INTR_TYPE_SOFT_INTR             (4 << 8) /* software interrupt */
 
313#define INTR_TYPE_SOFT_EXCEPTION	(6 << 8) /* software exception */
 
314
315/* GUEST_INTERRUPTIBILITY_INFO flags. */
316#define GUEST_INTR_STATE_STI		0x00000001
317#define GUEST_INTR_STATE_MOV_SS		0x00000002
318#define GUEST_INTR_STATE_SMI		0x00000004
319#define GUEST_INTR_STATE_NMI		0x00000008
 
320
321/* GUEST_ACTIVITY_STATE flags */
322#define GUEST_ACTIVITY_ACTIVE		0
323#define GUEST_ACTIVITY_HLT		1
324#define GUEST_ACTIVITY_SHUTDOWN		2
325#define GUEST_ACTIVITY_WAIT_SIPI	3
326
327/*
328 * Exit Qualifications for MOV for Control Register Access
329 */
330#define CONTROL_REG_ACCESS_NUM          0x7     /* 2:0, number of control reg.*/
331#define CONTROL_REG_ACCESS_TYPE         0x30    /* 5:4, access type */
332#define CONTROL_REG_ACCESS_REG          0xf00   /* 10:8, general purpose reg. */
333#define LMSW_SOURCE_DATA_SHIFT 16
334#define LMSW_SOURCE_DATA  (0xFFFF << LMSW_SOURCE_DATA_SHIFT) /* 16:31 lmsw source */
335#define REG_EAX                         (0 << 8)
336#define REG_ECX                         (1 << 8)
337#define REG_EDX                         (2 << 8)
338#define REG_EBX                         (3 << 8)
339#define REG_ESP                         (4 << 8)
340#define REG_EBP                         (5 << 8)
341#define REG_ESI                         (6 << 8)
342#define REG_EDI                         (7 << 8)
343#define REG_R8                         (8 << 8)
344#define REG_R9                         (9 << 8)
345#define REG_R10                        (10 << 8)
346#define REG_R11                        (11 << 8)
347#define REG_R12                        (12 << 8)
348#define REG_R13                        (13 << 8)
349#define REG_R14                        (14 << 8)
350#define REG_R15                        (15 << 8)
351
352/*
353 * Exit Qualifications for MOV for Debug Register Access
354 */
355#define DEBUG_REG_ACCESS_NUM            0x7     /* 2:0, number of debug reg. */
356#define DEBUG_REG_ACCESS_TYPE           0x10    /* 4, direction of access */
357#define TYPE_MOV_TO_DR                  (0 << 4)
358#define TYPE_MOV_FROM_DR                (1 << 4)
359#define DEBUG_REG_ACCESS_REG(eq)        (((eq) >> 8) & 0xf) /* 11:8, general purpose reg. */
360
361
362/*
363 * Exit Qualifications for APIC-Access
364 */
365#define APIC_ACCESS_OFFSET              0xfff   /* 11:0, offset within the APIC page */
366#define APIC_ACCESS_TYPE                0xf000  /* 15:12, access type */
367#define TYPE_LINEAR_APIC_INST_READ      (0 << 12)
368#define TYPE_LINEAR_APIC_INST_WRITE     (1 << 12)
369#define TYPE_LINEAR_APIC_INST_FETCH     (2 << 12)
370#define TYPE_LINEAR_APIC_EVENT          (3 << 12)
371#define TYPE_PHYSICAL_APIC_EVENT        (10 << 12)
372#define TYPE_PHYSICAL_APIC_INST         (15 << 12)
373
374/* segment AR in VMCS -- these are different from what LAR reports */
375#define VMX_SEGMENT_AR_L_MASK (1 << 13)
376
377#define VMX_AR_TYPE_ACCESSES_MASK 1
378#define VMX_AR_TYPE_READABLE_MASK (1 << 1)
379#define VMX_AR_TYPE_WRITEABLE_MASK (1 << 2)
380#define VMX_AR_TYPE_CODE_MASK (1 << 3)
381#define VMX_AR_TYPE_MASK 0x0f
382#define VMX_AR_TYPE_BUSY_64_TSS 11
383#define VMX_AR_TYPE_BUSY_32_TSS 11
384#define VMX_AR_TYPE_BUSY_16_TSS 3
385#define VMX_AR_TYPE_LDT 2
386
387#define VMX_AR_UNUSABLE_MASK (1 << 16)
388#define VMX_AR_S_MASK (1 << 4)
389#define VMX_AR_P_MASK (1 << 7)
390#define VMX_AR_L_MASK (1 << 13)
391#define VMX_AR_DB_MASK (1 << 14)
392#define VMX_AR_G_MASK (1 << 15)
393#define VMX_AR_DPL_SHIFT 5
394#define VMX_AR_DPL(ar) (((ar) >> VMX_AR_DPL_SHIFT) & 3)
395
396#define VMX_AR_RESERVD_MASK 0xfffe0f00
397
398#define TSS_PRIVATE_MEMSLOT			(KVM_USER_MEM_SLOTS + 0)
399#define APIC_ACCESS_PAGE_PRIVATE_MEMSLOT	(KVM_USER_MEM_SLOTS + 1)
400#define IDENTITY_PAGETABLE_PRIVATE_MEMSLOT	(KVM_USER_MEM_SLOTS + 2)
401
402#define VMX_NR_VPIDS				(1 << 16)
 
403#define VMX_VPID_EXTENT_SINGLE_CONTEXT		1
404#define VMX_VPID_EXTENT_ALL_CONTEXT		2
 
405
406#define VMX_EPT_EXTENT_INDIVIDUAL_ADDR		0
407#define VMX_EPT_EXTENT_CONTEXT			1
408#define VMX_EPT_EXTENT_GLOBAL			2
409#define VMX_EPT_EXTENT_SHIFT			24
410
411#define VMX_EPT_EXECUTE_ONLY_BIT		(1ull)
412#define VMX_EPT_PAGE_WALK_4_BIT			(1ull << 6)
 
413#define VMX_EPTP_UC_BIT				(1ull << 8)
414#define VMX_EPTP_WB_BIT				(1ull << 14)
415#define VMX_EPT_2MB_PAGE_BIT			(1ull << 16)
416#define VMX_EPT_1GB_PAGE_BIT			(1ull << 17)
417#define VMX_EPT_INVEPT_BIT			(1ull << 20)
418#define VMX_EPT_AD_BIT				    (1ull << 21)
419#define VMX_EPT_EXTENT_CONTEXT_BIT		(1ull << 25)
420#define VMX_EPT_EXTENT_GLOBAL_BIT		(1ull << 26)
421
422#define VMX_VPID_INVVPID_BIT                    (1ull << 0) /* (32 - 32) */
 
423#define VMX_VPID_EXTENT_SINGLE_CONTEXT_BIT      (1ull << 9) /* (41 - 32) */
424#define VMX_VPID_EXTENT_GLOBAL_CONTEXT_BIT      (1ull << 10) /* (42 - 32) */
 
425
426#define VMX_EPT_DEFAULT_GAW			3
427#define VMX_EPT_MAX_GAW				0x4
428#define VMX_EPT_MT_EPTE_SHIFT			3
429#define VMX_EPT_GAW_EPTP_SHIFT			3
430#define VMX_EPT_AD_ENABLE_BIT			(1ull << 6)
431#define VMX_EPT_DEFAULT_MT			0x6ull
 
 
 
 
432#define VMX_EPT_READABLE_MASK			0x1ull
433#define VMX_EPT_WRITABLE_MASK			0x2ull
434#define VMX_EPT_EXECUTABLE_MASK			0x4ull
435#define VMX_EPT_IPAT_BIT    			(1ull << 6)
436#define VMX_EPT_ACCESS_BIT				(1ull << 8)
437#define VMX_EPT_DIRTY_BIT				(1ull << 9)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
438
439#define VMX_EPT_IDENTITY_PAGETABLE_ADDR		0xfffbc000ul
440
441
442#define ASM_VMX_VMCLEAR_RAX       ".byte 0x66, 0x0f, 0xc7, 0x30"
443#define ASM_VMX_VMLAUNCH          ".byte 0x0f, 0x01, 0xc2"
444#define ASM_VMX_VMRESUME          ".byte 0x0f, 0x01, 0xc3"
445#define ASM_VMX_VMPTRLD_RAX       ".byte 0x0f, 0xc7, 0x30"
446#define ASM_VMX_VMREAD_RDX_RAX    ".byte 0x0f, 0x78, 0xd0"
447#define ASM_VMX_VMWRITE_RAX_RDX   ".byte 0x0f, 0x79, 0xd0"
448#define ASM_VMX_VMWRITE_RSP_RDX   ".byte 0x0f, 0x79, 0xd4"
449#define ASM_VMX_VMXOFF            ".byte 0x0f, 0x01, 0xc4"
450#define ASM_VMX_VMXON_RAX         ".byte 0xf3, 0x0f, 0xc7, 0x30"
451#define ASM_VMX_INVEPT		  ".byte 0x66, 0x0f, 0x38, 0x80, 0x08"
452#define ASM_VMX_INVVPID		  ".byte 0x66, 0x0f, 0x38, 0x81, 0x08"
453
454struct vmx_msr_entry {
455	u32 index;
456	u32 reserved;
457	u64 value;
458} __aligned(16);
459
460/*
461 * Exit Qualifications for entry failure during or after loading guest state
462 */
463#define ENTRY_FAIL_DEFAULT		0
464#define ENTRY_FAIL_PDPTE		2
465#define ENTRY_FAIL_NMI			3
466#define ENTRY_FAIL_VMCS_LINK_PTR	4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
467
468/*
469 * VM-instruction error numbers
470 */
471enum vm_instruction_error_number {
472	VMXERR_VMCALL_IN_VMX_ROOT_OPERATION = 1,
473	VMXERR_VMCLEAR_INVALID_ADDRESS = 2,
474	VMXERR_VMCLEAR_VMXON_POINTER = 3,
475	VMXERR_VMLAUNCH_NONCLEAR_VMCS = 4,
476	VMXERR_VMRESUME_NONLAUNCHED_VMCS = 5,
477	VMXERR_VMRESUME_AFTER_VMXOFF = 6,
478	VMXERR_ENTRY_INVALID_CONTROL_FIELD = 7,
479	VMXERR_ENTRY_INVALID_HOST_STATE_FIELD = 8,
480	VMXERR_VMPTRLD_INVALID_ADDRESS = 9,
481	VMXERR_VMPTRLD_VMXON_POINTER = 10,
482	VMXERR_VMPTRLD_INCORRECT_VMCS_REVISION_ID = 11,
483	VMXERR_UNSUPPORTED_VMCS_COMPONENT = 12,
484	VMXERR_VMWRITE_READ_ONLY_VMCS_COMPONENT = 13,
485	VMXERR_VMXON_IN_VMX_ROOT_OPERATION = 15,
486	VMXERR_ENTRY_INVALID_EXECUTIVE_VMCS_POINTER = 16,
487	VMXERR_ENTRY_NONLAUNCHED_EXECUTIVE_VMCS = 17,
488	VMXERR_ENTRY_EXECUTIVE_VMCS_POINTER_NOT_VMXON_POINTER = 18,
489	VMXERR_VMCALL_NONCLEAR_VMCS = 19,
490	VMXERR_VMCALL_INVALID_VM_EXIT_CONTROL_FIELDS = 20,
491	VMXERR_VMCALL_INCORRECT_MSEG_REVISION_ID = 22,
492	VMXERR_VMXOFF_UNDER_DUAL_MONITOR_TREATMENT_OF_SMIS_AND_SMM = 23,
493	VMXERR_VMCALL_INVALID_SMM_MONITOR_FEATURES = 24,
494	VMXERR_ENTRY_INVALID_VM_EXECUTION_CONTROL_FIELDS_IN_EXECUTIVE_VMCS = 25,
495	VMXERR_ENTRY_EVENTS_BLOCKED_BY_MOV_SS = 26,
496	VMXERR_INVALID_OPERAND_TO_INVEPT_INVVPID = 28,
497};
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
498
499#endif
v6.8
  1/* SPDX-License-Identifier: GPL-2.0-only */
  2/*
  3 * vmx.h: VMX Architecture related definitions
  4 * Copyright (c) 2004, Intel Corporation.
  5 *
 
 
 
 
 
 
 
 
 
 
 
 
 
  6 * A few random additions are:
  7 * Copyright (C) 2006 Qumranet
  8 *    Avi Kivity <avi@qumranet.com>
  9 *    Yaniv Kamay <yaniv@qumranet.com>
 
 10 */
 11#ifndef VMX_H
 12#define VMX_H
 13
 14
 15#include <linux/bitops.h>
 16#include <linux/bug.h>
 17#include <linux/types.h>
 18
 19#include <uapi/asm/vmx.h>
 20#include <asm/vmxfeatures.h>
 21
 22#define VMCS_CONTROL_BIT(x)	BIT(VMX_FEATURE_##x & 0x1f)
 23
 24/*
 25 * Definitions of Primary Processor-Based VM-Execution Controls.
 26 */
 27#define CPU_BASED_INTR_WINDOW_EXITING           VMCS_CONTROL_BIT(INTR_WINDOW_EXITING)
 28#define CPU_BASED_USE_TSC_OFFSETTING            VMCS_CONTROL_BIT(USE_TSC_OFFSETTING)
 29#define CPU_BASED_HLT_EXITING                   VMCS_CONTROL_BIT(HLT_EXITING)
 30#define CPU_BASED_INVLPG_EXITING                VMCS_CONTROL_BIT(INVLPG_EXITING)
 31#define CPU_BASED_MWAIT_EXITING                 VMCS_CONTROL_BIT(MWAIT_EXITING)
 32#define CPU_BASED_RDPMC_EXITING                 VMCS_CONTROL_BIT(RDPMC_EXITING)
 33#define CPU_BASED_RDTSC_EXITING                 VMCS_CONTROL_BIT(RDTSC_EXITING)
 34#define CPU_BASED_CR3_LOAD_EXITING		VMCS_CONTROL_BIT(CR3_LOAD_EXITING)
 35#define CPU_BASED_CR3_STORE_EXITING		VMCS_CONTROL_BIT(CR3_STORE_EXITING)
 36#define CPU_BASED_ACTIVATE_TERTIARY_CONTROLS	VMCS_CONTROL_BIT(TERTIARY_CONTROLS)
 37#define CPU_BASED_CR8_LOAD_EXITING              VMCS_CONTROL_BIT(CR8_LOAD_EXITING)
 38#define CPU_BASED_CR8_STORE_EXITING             VMCS_CONTROL_BIT(CR8_STORE_EXITING)
 39#define CPU_BASED_TPR_SHADOW                    VMCS_CONTROL_BIT(VIRTUAL_TPR)
 40#define CPU_BASED_NMI_WINDOW_EXITING		VMCS_CONTROL_BIT(NMI_WINDOW_EXITING)
 41#define CPU_BASED_MOV_DR_EXITING                VMCS_CONTROL_BIT(MOV_DR_EXITING)
 42#define CPU_BASED_UNCOND_IO_EXITING             VMCS_CONTROL_BIT(UNCOND_IO_EXITING)
 43#define CPU_BASED_USE_IO_BITMAPS                VMCS_CONTROL_BIT(USE_IO_BITMAPS)
 44#define CPU_BASED_MONITOR_TRAP_FLAG             VMCS_CONTROL_BIT(MONITOR_TRAP_FLAG)
 45#define CPU_BASED_USE_MSR_BITMAPS               VMCS_CONTROL_BIT(USE_MSR_BITMAPS)
 46#define CPU_BASED_MONITOR_EXITING               VMCS_CONTROL_BIT(MONITOR_EXITING)
 47#define CPU_BASED_PAUSE_EXITING                 VMCS_CONTROL_BIT(PAUSE_EXITING)
 48#define CPU_BASED_ACTIVATE_SECONDARY_CONTROLS   VMCS_CONTROL_BIT(SEC_CONTROLS)
 49
 50#define CPU_BASED_ALWAYSON_WITHOUT_TRUE_MSR	0x0401e172
 51
 52/*
 53 * Definitions of Secondary Processor-Based VM-Execution Controls.
 54 */
 55#define SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES VMCS_CONTROL_BIT(VIRT_APIC_ACCESSES)
 56#define SECONDARY_EXEC_ENABLE_EPT               VMCS_CONTROL_BIT(EPT)
 57#define SECONDARY_EXEC_DESC			VMCS_CONTROL_BIT(DESC_EXITING)
 58#define SECONDARY_EXEC_ENABLE_RDTSCP		VMCS_CONTROL_BIT(RDTSCP)
 59#define SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE   VMCS_CONTROL_BIT(VIRTUAL_X2APIC)
 60#define SECONDARY_EXEC_ENABLE_VPID              VMCS_CONTROL_BIT(VPID)
 61#define SECONDARY_EXEC_WBINVD_EXITING		VMCS_CONTROL_BIT(WBINVD_EXITING)
 62#define SECONDARY_EXEC_UNRESTRICTED_GUEST	VMCS_CONTROL_BIT(UNRESTRICTED_GUEST)
 63#define SECONDARY_EXEC_APIC_REGISTER_VIRT       VMCS_CONTROL_BIT(APIC_REGISTER_VIRT)
 64#define SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY    VMCS_CONTROL_BIT(VIRT_INTR_DELIVERY)
 65#define SECONDARY_EXEC_PAUSE_LOOP_EXITING	VMCS_CONTROL_BIT(PAUSE_LOOP_EXITING)
 66#define SECONDARY_EXEC_RDRAND_EXITING		VMCS_CONTROL_BIT(RDRAND_EXITING)
 67#define SECONDARY_EXEC_ENABLE_INVPCID		VMCS_CONTROL_BIT(INVPCID)
 68#define SECONDARY_EXEC_ENABLE_VMFUNC            VMCS_CONTROL_BIT(VMFUNC)
 69#define SECONDARY_EXEC_SHADOW_VMCS              VMCS_CONTROL_BIT(SHADOW_VMCS)
 70#define SECONDARY_EXEC_ENCLS_EXITING		VMCS_CONTROL_BIT(ENCLS_EXITING)
 71#define SECONDARY_EXEC_RDSEED_EXITING		VMCS_CONTROL_BIT(RDSEED_EXITING)
 72#define SECONDARY_EXEC_ENABLE_PML               VMCS_CONTROL_BIT(PAGE_MOD_LOGGING)
 73#define SECONDARY_EXEC_PT_CONCEAL_VMX		VMCS_CONTROL_BIT(PT_CONCEAL_VMX)
 74#define SECONDARY_EXEC_ENABLE_XSAVES		VMCS_CONTROL_BIT(XSAVES)
 75#define SECONDARY_EXEC_MODE_BASED_EPT_EXEC	VMCS_CONTROL_BIT(MODE_BASED_EPT_EXEC)
 76#define SECONDARY_EXEC_PT_USE_GPA		VMCS_CONTROL_BIT(PT_USE_GPA)
 77#define SECONDARY_EXEC_TSC_SCALING              VMCS_CONTROL_BIT(TSC_SCALING)
 78#define SECONDARY_EXEC_ENABLE_USR_WAIT_PAUSE	VMCS_CONTROL_BIT(USR_WAIT_PAUSE)
 79#define SECONDARY_EXEC_BUS_LOCK_DETECTION	VMCS_CONTROL_BIT(BUS_LOCK_DETECTION)
 80#define SECONDARY_EXEC_NOTIFY_VM_EXITING	VMCS_CONTROL_BIT(NOTIFY_VM_EXITING)
 81
 82/*
 83 * Definitions of Tertiary Processor-Based VM-Execution Controls.
 84 */
 85#define TERTIARY_EXEC_IPI_VIRT			VMCS_CONTROL_BIT(IPI_VIRT)
 86
 87#define PIN_BASED_EXT_INTR_MASK                 VMCS_CONTROL_BIT(INTR_EXITING)
 88#define PIN_BASED_NMI_EXITING                   VMCS_CONTROL_BIT(NMI_EXITING)
 89#define PIN_BASED_VIRTUAL_NMIS                  VMCS_CONTROL_BIT(VIRTUAL_NMIS)
 90#define PIN_BASED_VMX_PREEMPTION_TIMER          VMCS_CONTROL_BIT(PREEMPTION_TIMER)
 91#define PIN_BASED_POSTED_INTR                   VMCS_CONTROL_BIT(POSTED_INTR)
 92
 93#define PIN_BASED_ALWAYSON_WITHOUT_TRUE_MSR	0x00000016
 94
 95#define VM_EXIT_SAVE_DEBUG_CONTROLS             0x00000004
 96#define VM_EXIT_HOST_ADDR_SPACE_SIZE            0x00000200
 97#define VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL      0x00001000
 98#define VM_EXIT_ACK_INTR_ON_EXIT                0x00008000
 99#define VM_EXIT_SAVE_IA32_PAT			0x00040000
100#define VM_EXIT_LOAD_IA32_PAT			0x00080000
101#define VM_EXIT_SAVE_IA32_EFER                  0x00100000
102#define VM_EXIT_LOAD_IA32_EFER                  0x00200000
103#define VM_EXIT_SAVE_VMX_PREEMPTION_TIMER       0x00400000
104#define VM_EXIT_CLEAR_BNDCFGS                   0x00800000
105#define VM_EXIT_PT_CONCEAL_PIP			0x01000000
106#define VM_EXIT_CLEAR_IA32_RTIT_CTL		0x02000000
107
108#define VM_EXIT_ALWAYSON_WITHOUT_TRUE_MSR	0x00036dff
109
110#define VM_ENTRY_LOAD_DEBUG_CONTROLS            0x00000004
111#define VM_ENTRY_IA32E_MODE                     0x00000200
112#define VM_ENTRY_SMM                            0x00000400
113#define VM_ENTRY_DEACT_DUAL_MONITOR             0x00000800
114#define VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL     0x00002000
115#define VM_ENTRY_LOAD_IA32_PAT			0x00004000
116#define VM_ENTRY_LOAD_IA32_EFER                 0x00008000
117#define VM_ENTRY_LOAD_BNDCFGS                   0x00010000
118#define VM_ENTRY_PT_CONCEAL_PIP			0x00020000
119#define VM_ENTRY_LOAD_IA32_RTIT_CTL		0x00040000
120
121#define VM_ENTRY_ALWAYSON_WITHOUT_TRUE_MSR	0x000011ff
122
123#define VMX_MISC_PREEMPTION_TIMER_RATE_MASK	0x0000001f
124#define VMX_MISC_SAVE_EFER_LMA			0x00000020
125#define VMX_MISC_ACTIVITY_HLT			0x00000040
126#define VMX_MISC_ACTIVITY_WAIT_SIPI		0x00000100
127#define VMX_MISC_ZERO_LEN_INS			0x40000000
128#define VMX_MISC_MSR_LIST_MULTIPLIER		512
129
130/* VMFUNC functions */
131#define VMFUNC_CONTROL_BIT(x)	BIT((VMX_FEATURE_##x & 0x1f) - 28)
132
133#define VMX_VMFUNC_EPTP_SWITCHING               VMFUNC_CONTROL_BIT(EPTP_SWITCHING)
134#define VMFUNC_EPTP_ENTRIES  512
135
136static inline u32 vmx_basic_vmcs_revision_id(u64 vmx_basic)
137{
138	return vmx_basic & GENMASK_ULL(30, 0);
139}
140
141static inline u32 vmx_basic_vmcs_size(u64 vmx_basic)
142{
143	return (vmx_basic & GENMASK_ULL(44, 32)) >> 32;
144}
145
146static inline int vmx_misc_preemption_timer_rate(u64 vmx_misc)
147{
148	return vmx_misc & VMX_MISC_PREEMPTION_TIMER_RATE_MASK;
149}
150
151static inline int vmx_misc_cr3_count(u64 vmx_misc)
152{
153	return (vmx_misc & GENMASK_ULL(24, 16)) >> 16;
154}
155
156static inline int vmx_misc_max_msr(u64 vmx_misc)
157{
158	return (vmx_misc & GENMASK_ULL(27, 25)) >> 25;
159}
160
161static inline int vmx_misc_mseg_revid(u64 vmx_misc)
162{
163	return (vmx_misc & GENMASK_ULL(63, 32)) >> 32;
164}
165
166/* VMCS Encodings */
167enum vmcs_field {
168	VIRTUAL_PROCESSOR_ID            = 0x00000000,
169	POSTED_INTR_NV                  = 0x00000002,
170	LAST_PID_POINTER_INDEX		= 0x00000008,
171	GUEST_ES_SELECTOR               = 0x00000800,
172	GUEST_CS_SELECTOR               = 0x00000802,
173	GUEST_SS_SELECTOR               = 0x00000804,
174	GUEST_DS_SELECTOR               = 0x00000806,
175	GUEST_FS_SELECTOR               = 0x00000808,
176	GUEST_GS_SELECTOR               = 0x0000080a,
177	GUEST_LDTR_SELECTOR             = 0x0000080c,
178	GUEST_TR_SELECTOR               = 0x0000080e,
179	GUEST_INTR_STATUS               = 0x00000810,
180	GUEST_PML_INDEX			= 0x00000812,
181	HOST_ES_SELECTOR                = 0x00000c00,
182	HOST_CS_SELECTOR                = 0x00000c02,
183	HOST_SS_SELECTOR                = 0x00000c04,
184	HOST_DS_SELECTOR                = 0x00000c06,
185	HOST_FS_SELECTOR                = 0x00000c08,
186	HOST_GS_SELECTOR                = 0x00000c0a,
187	HOST_TR_SELECTOR                = 0x00000c0c,
188	IO_BITMAP_A                     = 0x00002000,
189	IO_BITMAP_A_HIGH                = 0x00002001,
190	IO_BITMAP_B                     = 0x00002002,
191	IO_BITMAP_B_HIGH                = 0x00002003,
192	MSR_BITMAP                      = 0x00002004,
193	MSR_BITMAP_HIGH                 = 0x00002005,
194	VM_EXIT_MSR_STORE_ADDR          = 0x00002006,
195	VM_EXIT_MSR_STORE_ADDR_HIGH     = 0x00002007,
196	VM_EXIT_MSR_LOAD_ADDR           = 0x00002008,
197	VM_EXIT_MSR_LOAD_ADDR_HIGH      = 0x00002009,
198	VM_ENTRY_MSR_LOAD_ADDR          = 0x0000200a,
199	VM_ENTRY_MSR_LOAD_ADDR_HIGH     = 0x0000200b,
200	PML_ADDRESS			= 0x0000200e,
201	PML_ADDRESS_HIGH		= 0x0000200f,
202	TSC_OFFSET                      = 0x00002010,
203	TSC_OFFSET_HIGH                 = 0x00002011,
204	VIRTUAL_APIC_PAGE_ADDR          = 0x00002012,
205	VIRTUAL_APIC_PAGE_ADDR_HIGH     = 0x00002013,
206	APIC_ACCESS_ADDR		= 0x00002014,
207	APIC_ACCESS_ADDR_HIGH		= 0x00002015,
208	POSTED_INTR_DESC_ADDR           = 0x00002016,
209	POSTED_INTR_DESC_ADDR_HIGH      = 0x00002017,
210	VM_FUNCTION_CONTROL             = 0x00002018,
211	VM_FUNCTION_CONTROL_HIGH        = 0x00002019,
212	EPT_POINTER                     = 0x0000201a,
213	EPT_POINTER_HIGH                = 0x0000201b,
214	EOI_EXIT_BITMAP0                = 0x0000201c,
215	EOI_EXIT_BITMAP0_HIGH           = 0x0000201d,
216	EOI_EXIT_BITMAP1                = 0x0000201e,
217	EOI_EXIT_BITMAP1_HIGH           = 0x0000201f,
218	EOI_EXIT_BITMAP2                = 0x00002020,
219	EOI_EXIT_BITMAP2_HIGH           = 0x00002021,
220	EOI_EXIT_BITMAP3                = 0x00002022,
221	EOI_EXIT_BITMAP3_HIGH           = 0x00002023,
222	EPTP_LIST_ADDRESS               = 0x00002024,
223	EPTP_LIST_ADDRESS_HIGH          = 0x00002025,
224	VMREAD_BITMAP                   = 0x00002026,
225	VMREAD_BITMAP_HIGH              = 0x00002027,
226	VMWRITE_BITMAP                  = 0x00002028,
227	VMWRITE_BITMAP_HIGH             = 0x00002029,
228	XSS_EXIT_BITMAP                 = 0x0000202C,
229	XSS_EXIT_BITMAP_HIGH            = 0x0000202D,
230	ENCLS_EXITING_BITMAP		= 0x0000202E,
231	ENCLS_EXITING_BITMAP_HIGH	= 0x0000202F,
232	TSC_MULTIPLIER                  = 0x00002032,
233	TSC_MULTIPLIER_HIGH             = 0x00002033,
234	TERTIARY_VM_EXEC_CONTROL	= 0x00002034,
235	TERTIARY_VM_EXEC_CONTROL_HIGH	= 0x00002035,
236	PID_POINTER_TABLE		= 0x00002042,
237	PID_POINTER_TABLE_HIGH		= 0x00002043,
238	GUEST_PHYSICAL_ADDRESS          = 0x00002400,
239	GUEST_PHYSICAL_ADDRESS_HIGH     = 0x00002401,
240	VMCS_LINK_POINTER               = 0x00002800,
241	VMCS_LINK_POINTER_HIGH          = 0x00002801,
242	GUEST_IA32_DEBUGCTL             = 0x00002802,
243	GUEST_IA32_DEBUGCTL_HIGH        = 0x00002803,
244	GUEST_IA32_PAT			= 0x00002804,
245	GUEST_IA32_PAT_HIGH		= 0x00002805,
246	GUEST_IA32_EFER			= 0x00002806,
247	GUEST_IA32_EFER_HIGH		= 0x00002807,
248	GUEST_IA32_PERF_GLOBAL_CTRL	= 0x00002808,
249	GUEST_IA32_PERF_GLOBAL_CTRL_HIGH= 0x00002809,
250	GUEST_PDPTR0                    = 0x0000280a,
251	GUEST_PDPTR0_HIGH               = 0x0000280b,
252	GUEST_PDPTR1                    = 0x0000280c,
253	GUEST_PDPTR1_HIGH               = 0x0000280d,
254	GUEST_PDPTR2                    = 0x0000280e,
255	GUEST_PDPTR2_HIGH               = 0x0000280f,
256	GUEST_PDPTR3                    = 0x00002810,
257	GUEST_PDPTR3_HIGH               = 0x00002811,
258	GUEST_BNDCFGS                   = 0x00002812,
259	GUEST_BNDCFGS_HIGH              = 0x00002813,
260	GUEST_IA32_RTIT_CTL		= 0x00002814,
261	GUEST_IA32_RTIT_CTL_HIGH	= 0x00002815,
262	HOST_IA32_PAT			= 0x00002c00,
263	HOST_IA32_PAT_HIGH		= 0x00002c01,
264	HOST_IA32_EFER			= 0x00002c02,
265	HOST_IA32_EFER_HIGH		= 0x00002c03,
266	HOST_IA32_PERF_GLOBAL_CTRL	= 0x00002c04,
267	HOST_IA32_PERF_GLOBAL_CTRL_HIGH	= 0x00002c05,
268	PIN_BASED_VM_EXEC_CONTROL       = 0x00004000,
269	CPU_BASED_VM_EXEC_CONTROL       = 0x00004002,
270	EXCEPTION_BITMAP                = 0x00004004,
271	PAGE_FAULT_ERROR_CODE_MASK      = 0x00004006,
272	PAGE_FAULT_ERROR_CODE_MATCH     = 0x00004008,
273	CR3_TARGET_COUNT                = 0x0000400a,
274	VM_EXIT_CONTROLS                = 0x0000400c,
275	VM_EXIT_MSR_STORE_COUNT         = 0x0000400e,
276	VM_EXIT_MSR_LOAD_COUNT          = 0x00004010,
277	VM_ENTRY_CONTROLS               = 0x00004012,
278	VM_ENTRY_MSR_LOAD_COUNT         = 0x00004014,
279	VM_ENTRY_INTR_INFO_FIELD        = 0x00004016,
280	VM_ENTRY_EXCEPTION_ERROR_CODE   = 0x00004018,
281	VM_ENTRY_INSTRUCTION_LEN        = 0x0000401a,
282	TPR_THRESHOLD                   = 0x0000401c,
283	SECONDARY_VM_EXEC_CONTROL       = 0x0000401e,
284	PLE_GAP                         = 0x00004020,
285	PLE_WINDOW                      = 0x00004022,
286	NOTIFY_WINDOW                   = 0x00004024,
287	VM_INSTRUCTION_ERROR            = 0x00004400,
288	VM_EXIT_REASON                  = 0x00004402,
289	VM_EXIT_INTR_INFO               = 0x00004404,
290	VM_EXIT_INTR_ERROR_CODE         = 0x00004406,
291	IDT_VECTORING_INFO_FIELD        = 0x00004408,
292	IDT_VECTORING_ERROR_CODE        = 0x0000440a,
293	VM_EXIT_INSTRUCTION_LEN         = 0x0000440c,
294	VMX_INSTRUCTION_INFO            = 0x0000440e,
295	GUEST_ES_LIMIT                  = 0x00004800,
296	GUEST_CS_LIMIT                  = 0x00004802,
297	GUEST_SS_LIMIT                  = 0x00004804,
298	GUEST_DS_LIMIT                  = 0x00004806,
299	GUEST_FS_LIMIT                  = 0x00004808,
300	GUEST_GS_LIMIT                  = 0x0000480a,
301	GUEST_LDTR_LIMIT                = 0x0000480c,
302	GUEST_TR_LIMIT                  = 0x0000480e,
303	GUEST_GDTR_LIMIT                = 0x00004810,
304	GUEST_IDTR_LIMIT                = 0x00004812,
305	GUEST_ES_AR_BYTES               = 0x00004814,
306	GUEST_CS_AR_BYTES               = 0x00004816,
307	GUEST_SS_AR_BYTES               = 0x00004818,
308	GUEST_DS_AR_BYTES               = 0x0000481a,
309	GUEST_FS_AR_BYTES               = 0x0000481c,
310	GUEST_GS_AR_BYTES               = 0x0000481e,
311	GUEST_LDTR_AR_BYTES             = 0x00004820,
312	GUEST_TR_AR_BYTES               = 0x00004822,
313	GUEST_INTERRUPTIBILITY_INFO     = 0x00004824,
314	GUEST_ACTIVITY_STATE            = 0x00004826,
315	GUEST_SYSENTER_CS               = 0x0000482A,
316	VMX_PREEMPTION_TIMER_VALUE      = 0x0000482E,
317	HOST_IA32_SYSENTER_CS           = 0x00004c00,
318	CR0_GUEST_HOST_MASK             = 0x00006000,
319	CR4_GUEST_HOST_MASK             = 0x00006002,
320	CR0_READ_SHADOW                 = 0x00006004,
321	CR4_READ_SHADOW                 = 0x00006006,
322	CR3_TARGET_VALUE0               = 0x00006008,
323	CR3_TARGET_VALUE1               = 0x0000600a,
324	CR3_TARGET_VALUE2               = 0x0000600c,
325	CR3_TARGET_VALUE3               = 0x0000600e,
326	EXIT_QUALIFICATION              = 0x00006400,
327	GUEST_LINEAR_ADDRESS            = 0x0000640a,
328	GUEST_CR0                       = 0x00006800,
329	GUEST_CR3                       = 0x00006802,
330	GUEST_CR4                       = 0x00006804,
331	GUEST_ES_BASE                   = 0x00006806,
332	GUEST_CS_BASE                   = 0x00006808,
333	GUEST_SS_BASE                   = 0x0000680a,
334	GUEST_DS_BASE                   = 0x0000680c,
335	GUEST_FS_BASE                   = 0x0000680e,
336	GUEST_GS_BASE                   = 0x00006810,
337	GUEST_LDTR_BASE                 = 0x00006812,
338	GUEST_TR_BASE                   = 0x00006814,
339	GUEST_GDTR_BASE                 = 0x00006816,
340	GUEST_IDTR_BASE                 = 0x00006818,
341	GUEST_DR7                       = 0x0000681a,
342	GUEST_RSP                       = 0x0000681c,
343	GUEST_RIP                       = 0x0000681e,
344	GUEST_RFLAGS                    = 0x00006820,
345	GUEST_PENDING_DBG_EXCEPTIONS    = 0x00006822,
346	GUEST_SYSENTER_ESP              = 0x00006824,
347	GUEST_SYSENTER_EIP              = 0x00006826,
348	HOST_CR0                        = 0x00006c00,
349	HOST_CR3                        = 0x00006c02,
350	HOST_CR4                        = 0x00006c04,
351	HOST_FS_BASE                    = 0x00006c06,
352	HOST_GS_BASE                    = 0x00006c08,
353	HOST_TR_BASE                    = 0x00006c0a,
354	HOST_GDTR_BASE                  = 0x00006c0c,
355	HOST_IDTR_BASE                  = 0x00006c0e,
356	HOST_IA32_SYSENTER_ESP          = 0x00006c10,
357	HOST_IA32_SYSENTER_EIP          = 0x00006c12,
358	HOST_RSP                        = 0x00006c14,
359	HOST_RIP                        = 0x00006c16,
360};
361
362/*
363 * Interruption-information format
364 */
365#define INTR_INFO_VECTOR_MASK           0xff            /* 7:0 */
366#define INTR_INFO_INTR_TYPE_MASK        0x700           /* 10:8 */
367#define INTR_INFO_DELIVER_CODE_MASK     0x800           /* 11 */
368#define INTR_INFO_UNBLOCK_NMI		0x1000		/* 12 */
369#define INTR_INFO_VALID_MASK            0x80000000      /* 31 */
370#define INTR_INFO_RESVD_BITS_MASK       0x7ffff000
371
372#define VECTORING_INFO_VECTOR_MASK           	INTR_INFO_VECTOR_MASK
373#define VECTORING_INFO_TYPE_MASK        	INTR_INFO_INTR_TYPE_MASK
374#define VECTORING_INFO_DELIVER_CODE_MASK    	INTR_INFO_DELIVER_CODE_MASK
375#define VECTORING_INFO_VALID_MASK       	INTR_INFO_VALID_MASK
376
377#define INTR_TYPE_EXT_INTR              (0 << 8) /* external interrupt */
378#define INTR_TYPE_RESERVED              (1 << 8) /* reserved */
379#define INTR_TYPE_NMI_INTR		(2 << 8) /* NMI */
380#define INTR_TYPE_HARD_EXCEPTION	(3 << 8) /* processor exception */
381#define INTR_TYPE_SOFT_INTR             (4 << 8) /* software interrupt */
382#define INTR_TYPE_PRIV_SW_EXCEPTION	(5 << 8) /* ICE breakpoint - undocumented */
383#define INTR_TYPE_SOFT_EXCEPTION	(6 << 8) /* software exception */
384#define INTR_TYPE_OTHER_EVENT           (7 << 8) /* other event */
385
386/* GUEST_INTERRUPTIBILITY_INFO flags. */
387#define GUEST_INTR_STATE_STI		0x00000001
388#define GUEST_INTR_STATE_MOV_SS		0x00000002
389#define GUEST_INTR_STATE_SMI		0x00000004
390#define GUEST_INTR_STATE_NMI		0x00000008
391#define GUEST_INTR_STATE_ENCLAVE_INTR	0x00000010
392
393/* GUEST_ACTIVITY_STATE flags */
394#define GUEST_ACTIVITY_ACTIVE		0
395#define GUEST_ACTIVITY_HLT		1
396#define GUEST_ACTIVITY_SHUTDOWN		2
397#define GUEST_ACTIVITY_WAIT_SIPI	3
398
399/*
400 * Exit Qualifications for MOV for Control Register Access
401 */
402#define CONTROL_REG_ACCESS_NUM          0x7     /* 2:0, number of control reg.*/
403#define CONTROL_REG_ACCESS_TYPE         0x30    /* 5:4, access type */
404#define CONTROL_REG_ACCESS_REG          0xf00   /* 10:8, general purpose reg. */
405#define LMSW_SOURCE_DATA_SHIFT 16
406#define LMSW_SOURCE_DATA  (0xFFFF << LMSW_SOURCE_DATA_SHIFT) /* 16:31 lmsw source */
407#define REG_EAX                         (0 << 8)
408#define REG_ECX                         (1 << 8)
409#define REG_EDX                         (2 << 8)
410#define REG_EBX                         (3 << 8)
411#define REG_ESP                         (4 << 8)
412#define REG_EBP                         (5 << 8)
413#define REG_ESI                         (6 << 8)
414#define REG_EDI                         (7 << 8)
415#define REG_R8                         (8 << 8)
416#define REG_R9                         (9 << 8)
417#define REG_R10                        (10 << 8)
418#define REG_R11                        (11 << 8)
419#define REG_R12                        (12 << 8)
420#define REG_R13                        (13 << 8)
421#define REG_R14                        (14 << 8)
422#define REG_R15                        (15 << 8)
423
424/*
425 * Exit Qualifications for MOV for Debug Register Access
426 */
427#define DEBUG_REG_ACCESS_NUM            0x7     /* 2:0, number of debug reg. */
428#define DEBUG_REG_ACCESS_TYPE           0x10    /* 4, direction of access */
429#define TYPE_MOV_TO_DR                  (0 << 4)
430#define TYPE_MOV_FROM_DR                (1 << 4)
431#define DEBUG_REG_ACCESS_REG(eq)        (((eq) >> 8) & 0xf) /* 11:8, general purpose reg. */
432
433
434/*
435 * Exit Qualifications for APIC-Access
436 */
437#define APIC_ACCESS_OFFSET              0xfff   /* 11:0, offset within the APIC page */
438#define APIC_ACCESS_TYPE                0xf000  /* 15:12, access type */
439#define TYPE_LINEAR_APIC_INST_READ      (0 << 12)
440#define TYPE_LINEAR_APIC_INST_WRITE     (1 << 12)
441#define TYPE_LINEAR_APIC_INST_FETCH     (2 << 12)
442#define TYPE_LINEAR_APIC_EVENT          (3 << 12)
443#define TYPE_PHYSICAL_APIC_EVENT        (10 << 12)
444#define TYPE_PHYSICAL_APIC_INST         (15 << 12)
445
446/* segment AR in VMCS -- these are different from what LAR reports */
447#define VMX_SEGMENT_AR_L_MASK (1 << 13)
448
449#define VMX_AR_TYPE_ACCESSES_MASK 1
450#define VMX_AR_TYPE_READABLE_MASK (1 << 1)
451#define VMX_AR_TYPE_WRITEABLE_MASK (1 << 2)
452#define VMX_AR_TYPE_CODE_MASK (1 << 3)
453#define VMX_AR_TYPE_MASK 0x0f
454#define VMX_AR_TYPE_BUSY_64_TSS 11
455#define VMX_AR_TYPE_BUSY_32_TSS 11
456#define VMX_AR_TYPE_BUSY_16_TSS 3
457#define VMX_AR_TYPE_LDT 2
458
459#define VMX_AR_UNUSABLE_MASK (1 << 16)
460#define VMX_AR_S_MASK (1 << 4)
461#define VMX_AR_P_MASK (1 << 7)
462#define VMX_AR_L_MASK (1 << 13)
463#define VMX_AR_DB_MASK (1 << 14)
464#define VMX_AR_G_MASK (1 << 15)
465#define VMX_AR_DPL_SHIFT 5
466#define VMX_AR_DPL(ar) (((ar) >> VMX_AR_DPL_SHIFT) & 3)
467
468#define VMX_AR_RESERVD_MASK 0xfffe0f00
469
470#define TSS_PRIVATE_MEMSLOT			(KVM_USER_MEM_SLOTS + 0)
471#define APIC_ACCESS_PAGE_PRIVATE_MEMSLOT	(KVM_USER_MEM_SLOTS + 1)
472#define IDENTITY_PAGETABLE_PRIVATE_MEMSLOT	(KVM_USER_MEM_SLOTS + 2)
473
474#define VMX_NR_VPIDS				(1 << 16)
475#define VMX_VPID_EXTENT_INDIVIDUAL_ADDR		0
476#define VMX_VPID_EXTENT_SINGLE_CONTEXT		1
477#define VMX_VPID_EXTENT_ALL_CONTEXT		2
478#define VMX_VPID_EXTENT_SINGLE_NON_GLOBAL	3
479
 
480#define VMX_EPT_EXTENT_CONTEXT			1
481#define VMX_EPT_EXTENT_GLOBAL			2
482#define VMX_EPT_EXTENT_SHIFT			24
483
484#define VMX_EPT_EXECUTE_ONLY_BIT		(1ull)
485#define VMX_EPT_PAGE_WALK_4_BIT			(1ull << 6)
486#define VMX_EPT_PAGE_WALK_5_BIT			(1ull << 7)
487#define VMX_EPTP_UC_BIT				(1ull << 8)
488#define VMX_EPTP_WB_BIT				(1ull << 14)
489#define VMX_EPT_2MB_PAGE_BIT			(1ull << 16)
490#define VMX_EPT_1GB_PAGE_BIT			(1ull << 17)
491#define VMX_EPT_INVEPT_BIT			(1ull << 20)
492#define VMX_EPT_AD_BIT				    (1ull << 21)
493#define VMX_EPT_EXTENT_CONTEXT_BIT		(1ull << 25)
494#define VMX_EPT_EXTENT_GLOBAL_BIT		(1ull << 26)
495
496#define VMX_VPID_INVVPID_BIT                    (1ull << 0) /* (32 - 32) */
497#define VMX_VPID_EXTENT_INDIVIDUAL_ADDR_BIT     (1ull << 8) /* (40 - 32) */
498#define VMX_VPID_EXTENT_SINGLE_CONTEXT_BIT      (1ull << 9) /* (41 - 32) */
499#define VMX_VPID_EXTENT_GLOBAL_CONTEXT_BIT      (1ull << 10) /* (42 - 32) */
500#define VMX_VPID_EXTENT_SINGLE_NON_GLOBAL_BIT   (1ull << 11) /* (43 - 32) */
501
 
 
502#define VMX_EPT_MT_EPTE_SHIFT			3
503#define VMX_EPTP_PWL_MASK			0x38ull
504#define VMX_EPTP_PWL_4				0x18ull
505#define VMX_EPTP_PWL_5				0x20ull
506#define VMX_EPTP_AD_ENABLE_BIT			(1ull << 6)
507#define VMX_EPTP_MT_MASK			0x7ull
508#define VMX_EPTP_MT_WB				0x6ull
509#define VMX_EPTP_MT_UC				0x0ull
510#define VMX_EPT_READABLE_MASK			0x1ull
511#define VMX_EPT_WRITABLE_MASK			0x2ull
512#define VMX_EPT_EXECUTABLE_MASK			0x4ull
513#define VMX_EPT_IPAT_BIT    			(1ull << 6)
514#define VMX_EPT_ACCESS_BIT			(1ull << 8)
515#define VMX_EPT_DIRTY_BIT			(1ull << 9)
516#define VMX_EPT_RWX_MASK                        (VMX_EPT_READABLE_MASK |       \
517						 VMX_EPT_WRITABLE_MASK |       \
518						 VMX_EPT_EXECUTABLE_MASK)
519#define VMX_EPT_MT_MASK				(7ull << VMX_EPT_MT_EPTE_SHIFT)
520
521static inline u8 vmx_eptp_page_walk_level(u64 eptp)
522{
523	u64 encoded_level = eptp & VMX_EPTP_PWL_MASK;
524
525	if (encoded_level == VMX_EPTP_PWL_5)
526		return 5;
527
528	/* @eptp must be pre-validated by the caller. */
529	WARN_ON_ONCE(encoded_level != VMX_EPTP_PWL_4);
530	return 4;
531}
532
533/* The mask to use to trigger an EPT Misconfiguration in order to track MMIO */
534#define VMX_EPT_MISCONFIG_WX_VALUE		(VMX_EPT_WRITABLE_MASK |       \
535						 VMX_EPT_EXECUTABLE_MASK)
536
537#define VMX_EPT_IDENTITY_PAGETABLE_ADDR		0xfffbc000ul
538
 
 
 
 
 
 
 
 
 
 
 
 
 
539struct vmx_msr_entry {
540	u32 index;
541	u32 reserved;
542	u64 value;
543} __aligned(16);
544
545/*
546 * Exit Qualifications for entry failure during or after loading guest state
547 */
548enum vm_entry_failure_code {
549	ENTRY_FAIL_DEFAULT		= 0,
550	ENTRY_FAIL_PDPTE		= 2,
551	ENTRY_FAIL_NMI			= 3,
552	ENTRY_FAIL_VMCS_LINK_PTR	= 4,
553};
554
555/*
556 * Exit Qualifications for EPT Violations
557 */
558#define EPT_VIOLATION_ACC_READ_BIT	0
559#define EPT_VIOLATION_ACC_WRITE_BIT	1
560#define EPT_VIOLATION_ACC_INSTR_BIT	2
561#define EPT_VIOLATION_RWX_SHIFT		3
562#define EPT_VIOLATION_GVA_IS_VALID_BIT	7
563#define EPT_VIOLATION_GVA_TRANSLATED_BIT 8
564#define EPT_VIOLATION_ACC_READ		(1 << EPT_VIOLATION_ACC_READ_BIT)
565#define EPT_VIOLATION_ACC_WRITE		(1 << EPT_VIOLATION_ACC_WRITE_BIT)
566#define EPT_VIOLATION_ACC_INSTR		(1 << EPT_VIOLATION_ACC_INSTR_BIT)
567#define EPT_VIOLATION_RWX_MASK		(VMX_EPT_RWX_MASK << EPT_VIOLATION_RWX_SHIFT)
568#define EPT_VIOLATION_GVA_IS_VALID	(1 << EPT_VIOLATION_GVA_IS_VALID_BIT)
569#define EPT_VIOLATION_GVA_TRANSLATED	(1 << EPT_VIOLATION_GVA_TRANSLATED_BIT)
570
571/*
572 * Exit Qualifications for NOTIFY VM EXIT
573 */
574#define NOTIFY_VM_CONTEXT_INVALID     BIT(0)
575
576/*
577 * VM-instruction error numbers
578 */
579enum vm_instruction_error_number {
580	VMXERR_VMCALL_IN_VMX_ROOT_OPERATION = 1,
581	VMXERR_VMCLEAR_INVALID_ADDRESS = 2,
582	VMXERR_VMCLEAR_VMXON_POINTER = 3,
583	VMXERR_VMLAUNCH_NONCLEAR_VMCS = 4,
584	VMXERR_VMRESUME_NONLAUNCHED_VMCS = 5,
585	VMXERR_VMRESUME_AFTER_VMXOFF = 6,
586	VMXERR_ENTRY_INVALID_CONTROL_FIELD = 7,
587	VMXERR_ENTRY_INVALID_HOST_STATE_FIELD = 8,
588	VMXERR_VMPTRLD_INVALID_ADDRESS = 9,
589	VMXERR_VMPTRLD_VMXON_POINTER = 10,
590	VMXERR_VMPTRLD_INCORRECT_VMCS_REVISION_ID = 11,
591	VMXERR_UNSUPPORTED_VMCS_COMPONENT = 12,
592	VMXERR_VMWRITE_READ_ONLY_VMCS_COMPONENT = 13,
593	VMXERR_VMXON_IN_VMX_ROOT_OPERATION = 15,
594	VMXERR_ENTRY_INVALID_EXECUTIVE_VMCS_POINTER = 16,
595	VMXERR_ENTRY_NONLAUNCHED_EXECUTIVE_VMCS = 17,
596	VMXERR_ENTRY_EXECUTIVE_VMCS_POINTER_NOT_VMXON_POINTER = 18,
597	VMXERR_VMCALL_NONCLEAR_VMCS = 19,
598	VMXERR_VMCALL_INVALID_VM_EXIT_CONTROL_FIELDS = 20,
599	VMXERR_VMCALL_INCORRECT_MSEG_REVISION_ID = 22,
600	VMXERR_VMXOFF_UNDER_DUAL_MONITOR_TREATMENT_OF_SMIS_AND_SMM = 23,
601	VMXERR_VMCALL_INVALID_SMM_MONITOR_FEATURES = 24,
602	VMXERR_ENTRY_INVALID_VM_EXECUTION_CONTROL_FIELDS_IN_EXECUTIVE_VMCS = 25,
603	VMXERR_ENTRY_EVENTS_BLOCKED_BY_MOV_SS = 26,
604	VMXERR_INVALID_OPERAND_TO_INVEPT_INVVPID = 28,
605};
606
607/*
608 * VM-instruction errors that can be encountered on VM-Enter, used to trace
609 * nested VM-Enter failures reported by hardware.  Errors unique to VM-Enter
610 * from a SMI Transfer Monitor are not included as things have gone seriously
611 * sideways if we get one of those...
612 */
613#define VMX_VMENTER_INSTRUCTION_ERRORS \
614	{ VMXERR_VMLAUNCH_NONCLEAR_VMCS,		"VMLAUNCH_NONCLEAR_VMCS" }, \
615	{ VMXERR_VMRESUME_NONLAUNCHED_VMCS,		"VMRESUME_NONLAUNCHED_VMCS" }, \
616	{ VMXERR_VMRESUME_AFTER_VMXOFF,			"VMRESUME_AFTER_VMXOFF" }, \
617	{ VMXERR_ENTRY_INVALID_CONTROL_FIELD,		"VMENTRY_INVALID_CONTROL_FIELD" }, \
618	{ VMXERR_ENTRY_INVALID_HOST_STATE_FIELD,	"VMENTRY_INVALID_HOST_STATE_FIELD" }, \
619	{ VMXERR_ENTRY_EVENTS_BLOCKED_BY_MOV_SS,	"VMENTRY_EVENTS_BLOCKED_BY_MOV_SS" }
620
621enum vmx_l1d_flush_state {
622	VMENTER_L1D_FLUSH_AUTO,
623	VMENTER_L1D_FLUSH_NEVER,
624	VMENTER_L1D_FLUSH_COND,
625	VMENTER_L1D_FLUSH_ALWAYS,
626	VMENTER_L1D_FLUSH_EPT_DISABLED,
627	VMENTER_L1D_FLUSH_NOT_REQUIRED,
628};
629
630extern enum vmx_l1d_flush_state l1tf_vmx_mitigation;
631
632#endif