mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 10:11:27 +01:00
x86: invpcid support
Provide the functions needed for different modes. Add cpu_has_invpcid. Signed-off-by: Wei Liu <wei.liu2@citrix.com> Reviewed-by: Juergen Gross <jgross@suse.com> Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
This commit is contained in:
1 parent
43c54ac605
commit
63dc135aea
3 files changed
+72
No files matched your search
@@ -23,6 +23,7 @@ $(call as-option-add,CFLAGS,CC,"rdseed %eax",-DHAVE_GAS_RDSEED)
|
||||
$(call as-option-add,CFLAGS,CC,".equ \"x\"$$(comma)1", \
|
||||
-U__OBJECT_LABEL__ -DHAVE_GAS_QUOTED_SYM \
|
||||
'-D__OBJECT_LABEL__=$(subst $(BASEDIR)/,,$(CURDIR))/$$@')
|
||||
$(call as-option-add,CFLAGS,CC,"invpcid (%rax)$$(comma)%rax",-DHAVE_AS_INVPCID)
|
||||
|
||||
CFLAGS += -mno-red-zone -fpic -fno-asynchronous-unwind-tables
|
||||
|
||||
|
||||
@@ -93,6 +93,7 @@
|
||||
#define cpu_has_avx2 boot_cpu_has(X86_FEATURE_AVX2)
|
||||
#define cpu_has_smep boot_cpu_has(X86_FEATURE_SMEP)
|
||||
#define cpu_has_bmi2 boot_cpu_has(X86_FEATURE_BMI2)
|
||||
#define cpu_has_invpcid boot_cpu_has(X86_FEATURE_INVPCID)
|
||||
#define cpu_has_rtm boot_cpu_has(X86_FEATURE_RTM)
|
||||
#define cpu_has_fpu_sel (!boot_cpu_has(X86_FEATURE_NO_FPU_SEL))
|
||||
#define cpu_has_mpx boot_cpu_has(X86_FEATURE_MPX)
|
||||
|
||||
@@ -0,0 +1,70 @@
|
||||
#ifndef _ASM_X86_INVPCID_H_
|
||||
#define _ASM_X86_INVPCID_H_
|
||||
|
||||
#include <xen/types.h>
|
||||
|
||||
#define INVPCID_TYPE_INDIV_ADDR 0
|
||||
#define INVPCID_TYPE_SINGLE_CTXT 1
|
||||
#define INVPCID_TYPE_ALL_INCL_GLOBAL 2
|
||||
#define INVPCID_TYPE_ALL_NON_GLOBAL 3
|
||||
|
||||
#define INVPCID_OPCODE ".byte 0x66, 0x0f, 0x38, 0x82\n"
|
||||
#define MODRM_ECX_01 ".byte 0x01\n"
|
||||
|
||||
static inline void invpcid(unsigned int pcid, unsigned long addr,
|
||||
unsigned int type)
|
||||
{
|
||||
struct {
|
||||
uint64_t pcid:12;
|
||||
uint64_t reserved:52;
|
||||
uint64_t addr;
|
||||
} desc = { .pcid = pcid, .addr = addr };
|
||||
|
||||
asm volatile (
|
||||
#ifdef HAVE_AS_INVPCID
|
||||
"invpcid %[desc], %q[type]"
|
||||
: /* No output */
|
||||
: [desc] "m" (desc), [type] "r" (type)
|
||||
#else
|
||||
INVPCID_OPCODE MODRM_ECX_01
|
||||
: /* No output */
|
||||
: "a" (type), "c" (&desc)
|
||||
#endif
|
||||
: "memory" );
|
||||
}
|
||||
|
||||
/* Flush all mappings for a given PCID and addr, not including globals */
|
||||
static inline void invpcid_flush_one(unsigned int pcid, unsigned long addr)
|
||||
{
|
||||
invpcid(pcid, addr, INVPCID_TYPE_INDIV_ADDR);
|
||||
}
|
||||
|
||||
/* Flush all mappings for a given PCID, not including globals */
|
||||
static inline void invpcid_flush_single_context(unsigned int pcid)
|
||||
{
|
||||
invpcid(pcid, 0, INVPCID_TYPE_SINGLE_CTXT);
|
||||
}
|
||||
|
||||
/* Flush all mappings, including globals, for all PCIDs */
|
||||
static inline void invpcid_flush_all(void)
|
||||
{
|
||||
invpcid(0, 0, INVPCID_TYPE_ALL_INCL_GLOBAL);
|
||||
}
|
||||
|
||||
/* Flush all mappings for all PCIDs, excluding globals */
|
||||
static inline void invpcid_flush_all_nonglobals(void)
|
||||
{
|
||||
invpcid(0, 0, INVPCID_TYPE_ALL_NON_GLOBAL);
|
||||
}
|
||||
|
||||
#endif /* _ASM_X86_INVPCID_H_ */
|
||||
|
||||
/*
|
||||
* Local variables:
|
||||
* mode: C
|
||||
* c-file-style: "BSD"
|
||||
* c-basic-offset: 4
|
||||
* tab-width: 4
|
||||
* indent-tabs-mode: nil
|
||||
* End:
|
||||
*/
|
||||