ad756a1603
This patch handles PCID/INVPCID for guests. Process-context identifiers (PCIDs) are a facility by which a logical processor may cache information for multiple linear-address spaces so that the processor may retain cached information when software switches to a different linear address space. Refer to section 4.10.1 in IA32 Intel Software Developer's Manual Volume 3A for details. For guests with EPT, the PCID feature is enabled and INVPCID behaves as running natively. For guests without EPT, the PCID feature is disabled and INVPCID triggers #UD. Signed-off-by: Junjie Mao <junjie.mao@intel.com> Signed-off-by: Avi Kivity <avi@redhat.com>
105 lines
3.7 KiB
C
105 lines
3.7 KiB
C
#ifndef _ASM_X86_PROCESSOR_FLAGS_H
|
|
#define _ASM_X86_PROCESSOR_FLAGS_H
|
|
/* Various flags defined: can be included from assembler. */
|
|
|
|
/*
|
|
* 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 */
|
|
|
|
/*
|
|
* x86-64 Task Priority Register, CR8
|
|
*/
|
|
#define X86_CR8_TPR 0x0000000F /* task priority register */
|
|
|
|
/*
|
|
* AMD and Transmeta use MSRs for configuration; see <asm/msr-index.h>
|
|
*/
|
|
|
|
/*
|
|
* NSC/Cyrix CPU configuration register indexes
|
|
*/
|
|
#define CX86_PCR0 0x20
|
|
#define CX86_GCR 0xb8
|
|
#define CX86_CCR0 0xc0
|
|
#define CX86_CCR1 0xc1
|
|
#define CX86_CCR2 0xc2
|
|
#define CX86_CCR3 0xc3
|
|
#define CX86_CCR4 0xe8
|
|
#define CX86_CCR5 0xe9
|
|
#define CX86_CCR6 0xea
|
|
#define CX86_CCR7 0xeb
|
|
#define CX86_PCR1 0xf0
|
|
#define CX86_DIR0 0xfe
|
|
#define CX86_DIR1 0xff
|
|
#define CX86_ARR_BASE 0xc4
|
|
#define CX86_RCR_BASE 0xdc
|
|
|
|
#ifdef __KERNEL__
|
|
#ifdef CONFIG_VM86
|
|
#define X86_VM_MASK X86_EFLAGS_VM
|
|
#else
|
|
#define X86_VM_MASK 0 /* No VM86 support */
|
|
#endif
|
|
#endif
|
|
|
|
#endif /* _ASM_X86_PROCESSOR_FLAGS_H */
|