| /* | |
| * Copyright 2014, NICTA | |
| * | |
| * This software may be distributed and modified according to the terms of | |
| * the GNU General Public License version 2. Note that NO WARRANTY is provided. | |
| * See "LICENSE_GPLv2.txt" for details. | |
| * | |
| * @TAG(NICTA_GPL) | |
| */ | |
| /* This file contains definitions related with features in x86 platform | |
| * Authors: | |
| * Qian Ge | |
| */ | |
| #ifndef _LIB_VMM_PLATFEATURE_H_ | |
| #define _LIB_VMM_PLATFEATURE_H_ | |
| /* Exception vector. */ | |
| #define DE_VECTOR 0 | |
| #define DB_VECTOR 1 | |
| #define BP_VECTOR 3 | |
| #define OF_VECTOR 4 | |
| #define BR_VECTOR 5 | |
| #define UD_VECTOR 6 | |
| #define NM_VECTOR 7 | |
| #define DF_VECTOR 8 | |
| #define TS_VECTOR 10 | |
| #define NP_VECTOR 11 | |
| #define SS_VECTOR 12 | |
| #define GP_VECTOR 13 | |
| #define PF_VECTOR 14 | |
| #define MF_VECTOR 16 | |
| #define MC_VECTOR 18 | |
| /* Processor flags. */ | |
| /* | |
| * EFLAGS bits | |
| */ | |
| #define X86_EFLAGS_CF 0x00000001 /* Carry Flag */ | |
| #define X86_EFLAGS_BIT1 0x00000002 /* Bit 1 - always on */ | |
| #define X86_EFLAGS_PF 0x00000004 /* Parity Flag */ | |
| #define X86_EFLAGS_AF 0x00000010 /* Auxiliary carry Flag */ | |
| #define X86_EFLAGS_ZF 0x00000040 /* Zero Flag */ | |
| #define X86_EFLAGS_SF 0x00000080 /* Sign Flag */ | |
| #define X86_EFLAGS_TF 0x00000100 /* Trap Flag */ | |
| #define X86_EFLAGS_IF 0x00000200 /* Interrupt Flag */ | |
| #define X86_EFLAGS_DF 0x00000400 /* Direction Flag */ | |
| #define X86_EFLAGS_OF 0x00000800 /* Overflow Flag */ | |
| #define X86_EFLAGS_IOPL 0x00003000 /* IOPL mask */ | |
| #define X86_EFLAGS_NT 0x00004000 /* Nested Task */ | |
| #define X86_EFLAGS_RF 0x00010000 /* Resume Flag */ | |
| #define X86_EFLAGS_VM 0x00020000 /* Virtual Mode */ | |
| #define X86_EFLAGS_AC 0x00040000 /* Alignment Check */ | |
| #define X86_EFLAGS_VIF 0x00080000 /* Virtual Interrupt Flag */ | |
| #define X86_EFLAGS_VIP 0x00100000 /* Virtual Interrupt Pending */ | |
| #define X86_EFLAGS_ID 0x00200000 /* CPUID detection flag */ | |
| /* | |
| * Basic CPU control in CR0 | |
| */ | |
| #define X86_CR0_PE 0x00000001 /* Protection Enable */ | |
| #define X86_CR0_MP 0x00000002 /* Monitor Coprocessor */ | |
| #define X86_CR0_EM 0x00000004 /* Emulation */ | |
| #define X86_CR0_TS 0x00000008 /* Task Switched */ | |
| #define X86_CR0_ET 0x00000010 /* Extension Type */ | |
| #define X86_CR0_NE 0x00000020 /* Numeric Error */ | |
| #define X86_CR0_WP 0x00010000 /* Write Protect */ | |
| #define X86_CR0_AM 0x00040000 /* Alignment Mask */ | |
| #define X86_CR0_NW 0x20000000 /* Not Write-through */ | |
| #define X86_CR0_CD 0x40000000 /* Cache Disable */ | |
| #define X86_CR0_PG 0x80000000 /* Paging */ | |
| /* | |
| * Paging options in CR3 | |
| */ | |
| #define X86_CR3_PWT 0x00000008 /* Page Write Through */ | |
| #define X86_CR3_PCD 0x00000010 /* Page Cache Disable */ | |
| #define X86_CR3_PCID_MASK 0x00000fff /* PCID Mask */ | |
| /* | |
| * Intel CPU features in CR4 | |
| */ | |
| #define X86_CR4_VME 0x00000001 /* enable vm86 extensions */ | |
| #define X86_CR4_PVI 0x00000002 /* virtual interrupts flag enable */ | |
| #define X86_CR4_TSD 0x00000004 /* disable time stamp at ipl 3 */ | |
| #define X86_CR4_DE 0x00000008 /* enable debugging extensions */ | |
| #define X86_CR4_PSE 0x00000010 /* enable page size extensions */ | |
| #define X86_CR4_PAE 0x00000020 /* enable physical address extensions */ | |
| #define X86_CR4_MCE 0x00000040 /* Machine check enable */ | |
| #define X86_CR4_PGE 0x00000080 /* enable global pages */ | |
| #define X86_CR4_PCE 0x00000100 /* enable performance counters at ipl 3 */ | |
| #define X86_CR4_OSFXSR 0x00000200 /* enable fast FPU save and restore */ | |
| #define X86_CR4_OSXMMEXCPT 0x00000400 /* enable unmasked SSE exceptions */ | |
| #define X86_CR4_VMXE 0x00002000 /* enable VMX virtualization */ | |
| #define X86_CR4_RDWRGSFS 0x00010000 /* enable RDWRGSFS support */ | |
| #define X86_CR4_PCIDE 0x00020000 /* enable PCID support */ | |
| #define X86_CR4_OSXSAVE 0x00040000 /* enable xsave and xrestore */ | |
| #define X86_CR4_SMEP 0x00100000 /* enable SMEP support */ | |
| #define X86_CR4_SMAP 0x00200000 /* enable SMAP support */ | |
| /* | |
| * x86-64 Task Priority Register, CR8 | |
| */ | |
| #define X86_CR8_TPR 0x0000000F /* task priority register */ | |
| /* Reserved bits for CR registers. */ | |
| #define CR0_RESERVED_BITS \ | |
| (~(unsigned long)(X86_CR0_PE | X86_CR0_MP | X86_CR0_EM | X86_CR0_TS \ | |
| | X86_CR0_ET | X86_CR0_NE | X86_CR0_WP | X86_CR0_AM \ | |
| | X86_CR0_NW | X86_CR0_CD | X86_CR0_PG)) | |
| #define CR3_PAE_RESERVED_BITS ((X86_CR3_PWT | X86_CR3_PCD) - 1) | |
| #define CR3_NONPAE_RESERVED_BITS ((PAGE_SIZE-1) & ~(X86_CR3_PWT | X86_CR3_PCD)) | |
| #define CR3_PCID_ENABLED_RESERVED_BITS 0xFFFFFF0000000000ULL | |
| #define CR3_L_MODE_RESERVED_BITS (CR3_NONPAE_RESERVED_BITS | \ | |
| 0xFFFFFF0000000000ULL) | |
| #define CR4_RESERVED_BITS \ | |
| (~(unsigned long)(X86_CR4_VME | X86_CR4_PVI | X86_CR4_TSD | X86_CR4_DE\ | |
| | X86_CR4_PSE | X86_CR4_PAE | X86_CR4_MCE \ | |
| | X86_CR4_PGE | X86_CR4_PCE | X86_CR4_OSFXSR | X86_CR4_PCIDE \ | |
| | X86_CR4_OSXSAVE | X86_CR4_SMEP | X86_CR4_RDWRGSFS \ | |
| | X86_CR4_OSXMMEXCPT | X86_CR4_VMXE)) | |
| #define CR8_RESERVED_BITS (~(unsigned long)X86_CR8_TPR) | |
| /* | |
| * Definitions of Primary Processor-Based VM-Execution Controls. | |
| */ | |
| #define CPU_BASED_VIRTUAL_INTR_PENDING 0x00000004 | |
| #define CPU_BASED_USE_TSC_OFFSETING 0x00000008 | |
| #define CPU_BASED_HLT_EXITING 0x00000080 | |
| #define CPU_BASED_INVLPG_EXITING 0x00000200 | |
| #define CPU_BASED_MWAIT_EXITING 0x00000400 | |
| #define CPU_BASED_RDPMC_EXITING 0x00000800 | |
| #define CPU_BASED_RDTSC_EXITING 0x00001000 | |
| #define CPU_BASED_CR3_LOAD_EXITING 0x00008000 | |
| #define CPU_BASED_CR3_STORE_EXITING 0x00010000 | |
| #define CPU_BASED_CR8_LOAD_EXITING 0x00080000 | |
| #define CPU_BASED_CR8_STORE_EXITING 0x00100000 | |
| #define CPU_BASED_TPR_SHADOW 0x00200000 | |
| #define CPU_BASED_VIRTUAL_NMI_PENDING 0x00400000 | |
| #define CPU_BASED_MOV_DR_EXITING 0x00800000 | |
| #define CPU_BASED_UNCOND_IO_EXITING 0x01000000 | |
| #define CPU_BASED_USE_IO_BITMAPS 0x02000000 | |
| #define CPU_BASED_USE_MSR_BITMAPS 0x10000000 | |
| #define CPU_BASED_MONITOR_EXITING 0x20000000 | |
| #define CPU_BASED_PAUSE_EXITING 0x40000000 | |
| #define CPU_BASED_ACTIVATE_SECONDARY_CONTROLS 0x80000000 | |
| /* | |
| * Definitions of Secondary Processor-Based VM-Execution Controls. | |
| */ | |
| #define SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES 0x00000001 | |
| #define SECONDARY_EXEC_ENABLE_EPT 0x00000002 | |
| #define SECONDARY_EXEC_RDTSCP 0x00000008 | |
| #define SECONDARY_EXEC_ENABLE_VPID 0x00000020 | |
| #define SECONDARY_EXEC_WBINVD_EXITING 0x00000040 | |
| #define SECONDARY_EXEC_UNRESTRICTED_GUEST 0x00000080 | |
| #define SECONDARY_EXEC_PAUSE_LOOP_EXITING 0x00000400 | |
| #define SECONDARY_EXEC_ENABLE_INVPCID 0x00001000 | |
| #define PIN_BASED_EXT_INTR_MASK 0x00000001 | |
| #define PIN_BASED_NMI_EXITING 0x00000008 | |
| #define PIN_BASED_VIRTUAL_NMIS 0x00000020 | |
| #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_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 | |
| /* Interruption-information format. */ | |
| #define INTR_INFO_VECTOR_MASK 0xff /* 7:0 */ | |
| #define INTR_INFO_INTR_TYPE_MASK 0x700 /* 10:8 */ | |
| #define INTR_INFO_DELIVER_CODE_MASK 0x800 /* 11 */ | |
| #define INTR_INFO_UNBLOCK_NMI 0x1000 /* 12 */ | |
| #define INTR_INFO_VALID_MASK 0x80000000 /* 31 */ | |
| #define INTR_INFO_RESVD_BITS_MASK 0x7ffff000 | |
| #define VECTORING_INFO_VECTOR_MASK INTR_INFO_VECTOR_MASK | |
| #define VECTORING_INFO_TYPE_MASK INTR_INFO_INTR_TYPE_MASK | |
| #define VECTORING_INFO_DELIVER_CODE_MASK INTR_INFO_DELIVER_CODE_MASK | |
| #define VECTORING_INFO_VALID_MASK INTR_INFO_VALID_MASK | |
| #define INTR_TYPE_EXT_INTR (0 << 8) /* external interrupt */ | |
| #define INTR_TYPE_NMI_INTR (2 << 8) /* NMI */ | |
| #define INTR_TYPE_HARD_EXCEPTION (3 << 8) /* processor exception */ | |
| #define INTR_TYPE_SOFT_INTR (4 << 8) /* software interrupt */ | |
| #define INTR_TYPE_SOFT_EXCEPTION (6 << 8) /* software exception */ | |
| /* GUEST_INTERRUPTIBILITY_INFO flags. */ | |
| #define GUEST_INTR_STATE_STI 0x00000001 | |
| #define GUEST_INTR_STATE_MOV_SS 0x00000002 | |
| #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. */ | |
| #define CONTROL_REG_ACCESS_NUM 0x7 /* 2:0, number of control reg.*/ | |
| #define CONTROL_REG_ACCESS_TYPE 0x30 /* 5:4, access type */ | |
| #define CONTROL_REG_ACCESS_REG 0xf00 /* 10:8, general purpose reg. */ | |
| #define LMSW_SOURCE_DATA_SHIFT 16 | |
| #define LMSW_SOURCE_DATA (0xFFFF << LMSW_SOURCE_DATA_SHIFT) /* 16:31 lmsw source */ | |
| #define REG_EAX (0 << 8) | |
| #define REG_ECX (1 << 8) | |
| #define REG_EDX (2 << 8) | |
| #define REG_EBX (3 << 8) | |
| #define REG_ESP (4 << 8) | |
| #define REG_EBP (5 << 8) | |
| #define REG_ESI (6 << 8) | |
| #define REG_EDI (7 << 8) | |
| #define REG_R8 (8 << 8) | |
| #define REG_R9 (9 << 8) | |
| #define REG_R10 (10 << 8) | |
| #define REG_R11 (11 << 8) | |
| #define REG_R12 (12 << 8) | |
| #define REG_R13 (13 << 8) | |
| #define REG_R14 (14 << 8) | |
| #define REG_R15 (15 << 8) | |
| /* 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 /* _LIB_VMM_PLATFEATURE_H_ */ |