mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +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
6678f08755
commit
fb665b3c2a
3 files changed
+72
No files matched your search
@@ -17,6 +17,7 @@ $(call as-insn-check,CFLAGS,CC,"rdfsbase %rax",-DHAVE_GAS_FSGSBASE)
|
||||
$(call as-insn-check,CFLAGS,CC,".equ \"x\"$$(comma)1", \
|
||||
-U__OBJECT_LABEL__ -DHAVE_GAS_QUOTED_SYM \
|
||||
'-D__OBJECT_LABEL__=$(subst $(BASEDIR)/,,$(CURDIR))/$$@')
|
||||
$(call as-insn-check,CFLAGS,CC,"invpcid (%rax)$$(comma)%rax",-DHAVE_AS_INVPCID)
|
||||
|
||||
CFLAGS += -mno-red-zone -mno-sse -fpic
|
||||
CFLAGS += -fno-asynchronous-unwind-tables
|
||||
|
||||
@@ -75,6 +75,7 @@
|
||||
#define cpu_has_fsgsbase boot_cpu_has(X86_FEATURE_FSGSBASE)
|
||||
#define cpu_has_aperfmperf boot_cpu_has(X86_FEATURE_APERFMPERF)
|
||||
#define cpu_has_smep boot_cpu_has(X86_FEATURE_SMEP)
|
||||
#define cpu_has_invpcid boot_cpu_has(X86_FEATURE_INVPCID)
|
||||
#define cpu_has_smap boot_cpu_has(X86_FEATURE_SMAP)
|
||||
#define cpu_has_fpu_sel (!boot_cpu_has(X86_FEATURE_NO_FPU_SEL))
|
||||
#define cpu_has_ffxsr ((boot_cpu_data.x86_vendor == X86_VENDOR_AMD) \
|
||||
|
||||
@@ -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:
|
||||
*/
|
||||