diff options
Diffstat (limited to 'arch/x86/include/asm/vmx.h')
| -rw-r--r-- | arch/x86/include/asm/vmx.h | 166 | 
1 files changed, 118 insertions, 48 deletions
diff --git a/arch/x86/include/asm/vmx.h b/arch/x86/include/asm/vmx.h index 9f0cbd987d5..7004d21e621 100644 --- a/arch/x86/include/asm/vmx.h +++ b/arch/x86/include/asm/vmx.h @@ -1,6 +1,3 @@ -#ifndef VMX_H -#define VMX_H -  /*   * vmx.h: VMX Architecture related definitions   * Copyright (c) 2004, Intel Corporation. @@ -24,8 +21,12 @@   *    Yaniv Kamay <yaniv@qumranet.com>   *   */ +#ifndef VMX_H +#define VMX_H +  #include <linux/types.h> +#include <uapi/asm/vmx.h>  /*   * Definitions of Primary Processor-Based VM-Execution Controls. @@ -56,29 +57,57 @@  #define SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES 0x00000001  #define SECONDARY_EXEC_ENABLE_EPT               0x00000002  #define SECONDARY_EXEC_RDTSCP			0x00000008 +#define SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE   0x00000010  #define SECONDARY_EXEC_ENABLE_VPID              0x00000020  #define SECONDARY_EXEC_WBINVD_EXITING		0x00000040  #define SECONDARY_EXEC_UNRESTRICTED_GUEST	0x00000080 +#define SECONDARY_EXEC_APIC_REGISTER_VIRT       0x00000100 +#define SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY    0x00000200  #define SECONDARY_EXEC_PAUSE_LOOP_EXITING	0x00000400 +#define SECONDARY_EXEC_ENABLE_INVPCID		0x00001000 +#define SECONDARY_EXEC_SHADOW_VMCS              0x00004000  #define PIN_BASED_EXT_INTR_MASK                 0x00000001  #define PIN_BASED_NMI_EXITING                   0x00000008  #define PIN_BASED_VIRTUAL_NMIS                  0x00000020 +#define PIN_BASED_VMX_PREEMPTION_TIMER          0x00000040 +#define PIN_BASED_POSTED_INTR                   0x00000080 +#define PIN_BASED_ALWAYSON_WITHOUT_TRUE_MSR	0x00000016 + +#define VM_EXIT_SAVE_DEBUG_CONTROLS             0x00000002  #define VM_EXIT_HOST_ADDR_SPACE_SIZE            0x00000200 +#define VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL      0x00001000  #define VM_EXIT_ACK_INTR_ON_EXIT                0x00008000  #define VM_EXIT_SAVE_IA32_PAT			0x00040000  #define VM_EXIT_LOAD_IA32_PAT			0x00080000 +#define VM_EXIT_SAVE_IA32_EFER                  0x00100000 +#define VM_EXIT_LOAD_IA32_EFER                  0x00200000 +#define VM_EXIT_SAVE_VMX_PREEMPTION_TIMER       0x00400000 +#define VM_EXIT_CLEAR_BNDCFGS                   0x00800000 + +#define VM_EXIT_ALWAYSON_WITHOUT_TRUE_MSR	0x00036dff +#define VM_ENTRY_LOAD_DEBUG_CONTROLS            0x00000002  #define VM_ENTRY_IA32E_MODE                     0x00000200  #define VM_ENTRY_SMM                            0x00000400  #define VM_ENTRY_DEACT_DUAL_MONITOR             0x00000800 +#define VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL     0x00002000  #define VM_ENTRY_LOAD_IA32_PAT			0x00004000 +#define VM_ENTRY_LOAD_IA32_EFER                 0x00008000 +#define VM_ENTRY_LOAD_BNDCFGS                   0x00010000 + +#define VM_ENTRY_ALWAYSON_WITHOUT_TRUE_MSR	0x000011ff + +#define VMX_MISC_PREEMPTION_TIMER_RATE_MASK	0x0000001f +#define VMX_MISC_SAVE_EFER_LMA			0x00000020 +#define VMX_MISC_ACTIVITY_HLT			0x00000040  /* VMCS Encodings */  enum vmcs_field {  	VIRTUAL_PROCESSOR_ID            = 0x00000000, +	POSTED_INTR_NV                  = 0x00000002,  	GUEST_ES_SELECTOR               = 0x00000800,  	GUEST_CS_SELECTOR               = 0x00000802,  	GUEST_SS_SELECTOR               = 0x00000804, @@ -87,6 +116,7 @@ enum vmcs_field {  	GUEST_GS_SELECTOR               = 0x0000080a,  	GUEST_LDTR_SELECTOR             = 0x0000080c,  	GUEST_TR_SELECTOR               = 0x0000080e, +	GUEST_INTR_STATUS               = 0x00000810,  	HOST_ES_SELECTOR                = 0x00000c00,  	HOST_CS_SELECTOR                = 0x00000c02,  	HOST_SS_SELECTOR                = 0x00000c04, @@ -112,8 +142,20 @@ enum vmcs_field {  	VIRTUAL_APIC_PAGE_ADDR_HIGH     = 0x00002013,  	APIC_ACCESS_ADDR		= 0x00002014,  	APIC_ACCESS_ADDR_HIGH		= 0x00002015, +	POSTED_INTR_DESC_ADDR           = 0x00002016, +	POSTED_INTR_DESC_ADDR_HIGH      = 0x00002017,  	EPT_POINTER                     = 0x0000201a,  	EPT_POINTER_HIGH                = 0x0000201b, +	EOI_EXIT_BITMAP0                = 0x0000201c, +	EOI_EXIT_BITMAP0_HIGH           = 0x0000201d, +	EOI_EXIT_BITMAP1                = 0x0000201e, +	EOI_EXIT_BITMAP1_HIGH           = 0x0000201f, +	EOI_EXIT_BITMAP2                = 0x00002020, +	EOI_EXIT_BITMAP2_HIGH           = 0x00002021, +	EOI_EXIT_BITMAP3                = 0x00002022, +	EOI_EXIT_BITMAP3_HIGH           = 0x00002023, +	VMREAD_BITMAP                   = 0x00002026, +	VMWRITE_BITMAP                  = 0x00002028,  	GUEST_PHYSICAL_ADDRESS          = 0x00002400,  	GUEST_PHYSICAL_ADDRESS_HIGH     = 0x00002401,  	VMCS_LINK_POINTER               = 0x00002800, @@ -124,6 +166,8 @@ enum vmcs_field {  	GUEST_IA32_PAT_HIGH		= 0x00002805,  	GUEST_IA32_EFER			= 0x00002806,  	GUEST_IA32_EFER_HIGH		= 0x00002807, +	GUEST_IA32_PERF_GLOBAL_CTRL	= 0x00002808, +	GUEST_IA32_PERF_GLOBAL_CTRL_HIGH= 0x00002809,  	GUEST_PDPTR0                    = 0x0000280a,  	GUEST_PDPTR0_HIGH               = 0x0000280b,  	GUEST_PDPTR1                    = 0x0000280c, @@ -132,10 +176,14 @@ enum vmcs_field {  	GUEST_PDPTR2_HIGH               = 0x0000280f,  	GUEST_PDPTR3                    = 0x00002810,  	GUEST_PDPTR3_HIGH               = 0x00002811, +	GUEST_BNDCFGS                   = 0x00002812, +	GUEST_BNDCFGS_HIGH              = 0x00002813,  	HOST_IA32_PAT			= 0x00002c00,  	HOST_IA32_PAT_HIGH		= 0x00002c01,  	HOST_IA32_EFER			= 0x00002c02,  	HOST_IA32_EFER_HIGH		= 0x00002c03, +	HOST_IA32_PERF_GLOBAL_CTRL	= 0x00002c04, +	HOST_IA32_PERF_GLOBAL_CTRL_HIGH	= 0x00002c05,  	PIN_BASED_VM_EXEC_CONTROL       = 0x00004000,  	CPU_BASED_VM_EXEC_CONTROL       = 0x00004002,  	EXCEPTION_BITMAP                = 0x00004004, @@ -183,6 +231,7 @@ enum vmcs_field {  	GUEST_INTERRUPTIBILITY_INFO     = 0x00004824,  	GUEST_ACTIVITY_STATE            = 0X00004826,  	GUEST_SYSENTER_CS               = 0x0000482A, +	VMX_PREEMPTION_TIMER_VALUE      = 0x0000482E,  	HOST_IA32_SYSENTER_CS           = 0x00004c00,  	CR0_GUEST_HOST_MASK             = 0x00006000,  	CR4_GUEST_HOST_MASK             = 0x00006002, @@ -228,47 +277,6 @@ enum vmcs_field {  	HOST_RIP                        = 0x00006c16,  }; -#define VMX_EXIT_REASONS_FAILED_VMENTRY         0x80000000 - -#define EXIT_REASON_EXCEPTION_NMI       0 -#define EXIT_REASON_EXTERNAL_INTERRUPT  1 -#define EXIT_REASON_TRIPLE_FAULT        2 - -#define EXIT_REASON_PENDING_INTERRUPT   7 -#define EXIT_REASON_NMI_WINDOW		8 -#define EXIT_REASON_TASK_SWITCH         9 -#define EXIT_REASON_CPUID               10 -#define EXIT_REASON_HLT                 12 -#define EXIT_REASON_INVLPG              14 -#define EXIT_REASON_RDPMC               15 -#define EXIT_REASON_RDTSC               16 -#define EXIT_REASON_VMCALL              18 -#define EXIT_REASON_VMCLEAR             19 -#define EXIT_REASON_VMLAUNCH            20 -#define EXIT_REASON_VMPTRLD             21 -#define EXIT_REASON_VMPTRST             22 -#define EXIT_REASON_VMREAD              23 -#define EXIT_REASON_VMRESUME            24 -#define EXIT_REASON_VMWRITE             25 -#define EXIT_REASON_VMOFF               26 -#define EXIT_REASON_VMON                27 -#define EXIT_REASON_CR_ACCESS           28 -#define EXIT_REASON_DR_ACCESS           29 -#define EXIT_REASON_IO_INSTRUCTION      30 -#define EXIT_REASON_MSR_READ            31 -#define EXIT_REASON_MSR_WRITE           32 -#define EXIT_REASON_INVALID_STATE	33 -#define EXIT_REASON_MWAIT_INSTRUCTION   36 -#define EXIT_REASON_MONITOR_INSTRUCTION 39 -#define EXIT_REASON_PAUSE_INSTRUCTION   40 -#define EXIT_REASON_MCE_DURING_VMENTRY	 41 -#define EXIT_REASON_TPR_BELOW_THRESHOLD 43 -#define EXIT_REASON_APIC_ACCESS         44 -#define EXIT_REASON_EPT_VIOLATION       48 -#define EXIT_REASON_EPT_MISCONFIG       49 -#define EXIT_REASON_WBINVD		54 -#define EXIT_REASON_XSETBV		55 -  /*   * Interruption-information format   */ @@ -296,6 +304,12 @@ enum vmcs_field {  #define GUEST_INTR_STATE_SMI		0x00000004  #define GUEST_INTR_STATE_NMI		0x00000008 +/* GUEST_ACTIVITY_STATE flags */ +#define GUEST_ACTIVITY_ACTIVE		0 +#define GUEST_ACTIVITY_HLT		1 +#define GUEST_ACTIVITY_SHUTDOWN		2 +#define GUEST_ACTIVITY_WAIT_SIPI	3 +  /*   * Exit Qualifications for MOV for Control Register Access   */ @@ -331,6 +345,18 @@ enum vmcs_field {  #define DEBUG_REG_ACCESS_REG(eq)        (((eq) >> 8) & 0xf) /* 11:8, general purpose reg. */ +/* + * Exit Qualifications for APIC-Access + */ +#define APIC_ACCESS_OFFSET              0xfff   /* 11:0, offset within the APIC page */ +#define APIC_ACCESS_TYPE                0xf000  /* 15:12, access type */ +#define TYPE_LINEAR_APIC_INST_READ      (0 << 12) +#define TYPE_LINEAR_APIC_INST_WRITE     (1 << 12) +#define TYPE_LINEAR_APIC_INST_FETCH     (2 << 12) +#define TYPE_LINEAR_APIC_EVENT          (3 << 12) +#define TYPE_PHYSICAL_APIC_EVENT        (10 << 12) +#define TYPE_PHYSICAL_APIC_INST         (15 << 12) +  /* segment AR */  #define SEGMENT_AR_L_MASK (1 << 13) @@ -355,9 +381,9 @@ enum vmcs_field {  #define AR_RESERVD_MASK 0xfffe0f00 -#define TSS_PRIVATE_MEMSLOT			(KVM_MEMORY_SLOTS + 0) -#define APIC_ACCESS_PAGE_PRIVATE_MEMSLOT	(KVM_MEMORY_SLOTS + 1) -#define IDENTITY_PAGETABLE_PRIVATE_MEMSLOT	(KVM_MEMORY_SLOTS + 2) +#define TSS_PRIVATE_MEMSLOT			(KVM_USER_MEM_SLOTS + 0) +#define APIC_ACCESS_PAGE_PRIVATE_MEMSLOT	(KVM_USER_MEM_SLOTS + 1) +#define IDENTITY_PAGETABLE_PRIVATE_MEMSLOT	(KVM_USER_MEM_SLOTS + 2)  #define VMX_NR_VPIDS				(1 << 16)  #define VMX_VPID_EXTENT_SINGLE_CONTEXT		1 @@ -366,6 +392,7 @@ enum vmcs_field {  #define VMX_EPT_EXTENT_INDIVIDUAL_ADDR		0  #define VMX_EPT_EXTENT_CONTEXT			1  #define VMX_EPT_EXTENT_GLOBAL			2 +#define VMX_EPT_EXTENT_SHIFT			24  #define VMX_EPT_EXECUTE_ONLY_BIT		(1ull)  #define VMX_EPT_PAGE_WALK_4_BIT			(1ull << 6) @@ -373,7 +400,8 @@ enum vmcs_field {  #define VMX_EPTP_WB_BIT				(1ull << 14)  #define VMX_EPT_2MB_PAGE_BIT			(1ull << 16)  #define VMX_EPT_1GB_PAGE_BIT			(1ull << 17) -#define VMX_EPT_EXTENT_INDIVIDUAL_BIT		(1ull << 24) +#define VMX_EPT_INVEPT_BIT			(1ull << 20) +#define VMX_EPT_AD_BIT				    (1ull << 21)  #define VMX_EPT_EXTENT_CONTEXT_BIT		(1ull << 25)  #define VMX_EPT_EXTENT_GLOBAL_BIT		(1ull << 26) @@ -384,11 +412,14 @@ enum vmcs_field {  #define VMX_EPT_MAX_GAW				0x4  #define VMX_EPT_MT_EPTE_SHIFT			3  #define VMX_EPT_GAW_EPTP_SHIFT			3 +#define VMX_EPT_AD_ENABLE_BIT			(1ull << 6)  #define VMX_EPT_DEFAULT_MT			0x6ull  #define VMX_EPT_READABLE_MASK			0x1ull  #define VMX_EPT_WRITABLE_MASK			0x2ull  #define VMX_EPT_EXECUTABLE_MASK			0x4ull  #define VMX_EPT_IPAT_BIT    			(1ull << 6) +#define VMX_EPT_ACCESS_BIT				(1ull << 8) +#define VMX_EPT_DIRTY_BIT				(1ull << 9)  #define VMX_EPT_IDENTITY_PAGETABLE_ADDR		0xfffbc000ul @@ -411,4 +442,43 @@ struct vmx_msr_entry {  	u64 value;  } __aligned(16); +/* + * Exit Qualifications for entry failure during or after loading guest state + */ +#define ENTRY_FAIL_DEFAULT		0 +#define ENTRY_FAIL_PDPTE		2 +#define ENTRY_FAIL_NMI			3 +#define ENTRY_FAIL_VMCS_LINK_PTR	4 + +/* + * VM-instruction error numbers + */ +enum vm_instruction_error_number { +	VMXERR_VMCALL_IN_VMX_ROOT_OPERATION = 1, +	VMXERR_VMCLEAR_INVALID_ADDRESS = 2, +	VMXERR_VMCLEAR_VMXON_POINTER = 3, +	VMXERR_VMLAUNCH_NONCLEAR_VMCS = 4, +	VMXERR_VMRESUME_NONLAUNCHED_VMCS = 5, +	VMXERR_VMRESUME_AFTER_VMXOFF = 6, +	VMXERR_ENTRY_INVALID_CONTROL_FIELD = 7, +	VMXERR_ENTRY_INVALID_HOST_STATE_FIELD = 8, +	VMXERR_VMPTRLD_INVALID_ADDRESS = 9, +	VMXERR_VMPTRLD_VMXON_POINTER = 10, +	VMXERR_VMPTRLD_INCORRECT_VMCS_REVISION_ID = 11, +	VMXERR_UNSUPPORTED_VMCS_COMPONENT = 12, +	VMXERR_VMWRITE_READ_ONLY_VMCS_COMPONENT = 13, +	VMXERR_VMXON_IN_VMX_ROOT_OPERATION = 15, +	VMXERR_ENTRY_INVALID_EXECUTIVE_VMCS_POINTER = 16, +	VMXERR_ENTRY_NONLAUNCHED_EXECUTIVE_VMCS = 17, +	VMXERR_ENTRY_EXECUTIVE_VMCS_POINTER_NOT_VMXON_POINTER = 18, +	VMXERR_VMCALL_NONCLEAR_VMCS = 19, +	VMXERR_VMCALL_INVALID_VM_EXIT_CONTROL_FIELDS = 20, +	VMXERR_VMCALL_INCORRECT_MSEG_REVISION_ID = 22, +	VMXERR_VMXOFF_UNDER_DUAL_MONITOR_TREATMENT_OF_SMIS_AND_SMM = 23, +	VMXERR_VMCALL_INVALID_SMM_MONITOR_FEATURES = 24, +	VMXERR_ENTRY_INVALID_VM_EXECUTION_CONTROL_FIELDS_IN_EXECUTIVE_VMCS = 25, +	VMXERR_ENTRY_EVENTS_BLOCKED_BY_MOV_SS = 26, +	VMXERR_INVALID_OPERAND_TO_INVEPT_INVVPID = 28, +}; +  #endif  | 
