Define all known XFEATURE_MASK_ bits in processor.h so that the macros are available to all tests, and to match the nomenclature used by the Linux kernel. No functional change intended. Signed-off-by: Sean Christopherson --- lib/x86/processor.h | 24 ++++++++++++++++++++++++ x86/xsave.c | 33 ++++++++++++++------------------- 2 files changed, 38 insertions(+), 19 deletions(-) diff --git a/lib/x86/processor.h b/lib/x86/processor.h index c3d3cacf..0e17ed70 100644 --- a/lib/x86/processor.h +++ b/lib/x86/processor.h @@ -182,6 +182,30 @@ static inline u64 get_non_canonical(u64 addr, u64 mask) #define X86_EFLAGS_ALU (X86_EFLAGS_CF | X86_EFLAGS_PF | X86_EFLAGS_AF | \ X86_EFLAGS_ZF | X86_EFLAGS_SF | X86_EFLAGS_OF) +#define XFEATURE_MASK_FP BIT_ULL(0) +#define XFEATURE_MASK_SSE BIT_ULL(1) +#define XFEATURE_MASK_YMM BIT_ULL(2) +#define XFEATURE_MASK_BNDREGS BIT_ULL(3) +#define XFEATURE_MASK_BNDCSR BIT_ULL(4) +#define XFEATURE_MASK_OPMASK BIT_ULL(5) +#define XFEATURE_MASK_ZMM_Hi256 BIT_ULL(6) +#define XFEATURE_MASK_Hi16_ZMM BIT_ULL(7) +#define XFEATURE_MASK_PT BIT_ULL(8) +#define XFEATURE_MASK_PKRU BIT_ULL(9) +#define XFEATURE_MASK_PASID BIT_ULL(10) +#define XFEATURE_MASK_CET_USER BIT_ULL(11) +#define XFEATURE_MASK_CET_KERNEL BIT_ULL(12) +#define XFEATURE_MASK_LBR BIT_ULL(15) +#define XFEATURE_MASK_XTILE_CFG BIT_ULL(17) +#define XFEATURE_MASK_XTILE_DATA BIT_ULL(18) + +#define XFEATURE_MASK_FP_SSE (XFEATURE_MASK_FP | XFEATURE_MASK_SSE) + +#define XFEATURE_MASK_AVX512 (XFEATURE_MASK_OPMASK | \ + XFEATURE_MASK_ZMM_Hi256 | \ + XFEATURE_MASK_Hi16_ZMM) +#define XFEATURE_MASK_XTILE (XFEATURE_MASK_XTILE_DATA | \ + XFEATURE_MASK_XTILE_CFG) /* * CPU features diff --git a/x86/xsave.c b/x86/xsave.c index a3645622..0113073f 100644 --- a/x86/xsave.c +++ b/x86/xsave.c @@ -2,10 +2,6 @@ #include "desc.h" #include "processor.h" -#define XSTATE_FP 0x1 -#define XSTATE_SSE 0x2 -#define XSTATE_YMM 0x4 - static void test_unsupported_xcrs(void) { u64 ign; @@ -17,10 +13,10 @@ static void test_unsupported_xcrs(void) report(xgetbv_safe(i, &ign) == GP_VECTOR, "XGETBV(%u) - expect #GP", i); - report(xsetbv_safe(i, XSTATE_FP) == GP_VECTOR, + report(xsetbv_safe(i, XFEATURE_MASK_FP) == GP_VECTOR, "XSETBV(%u, FP) - expect #GP", i); - report(xsetbv_safe(i, XSTATE_FP | XSTATE_SSE) == GP_VECTOR, + report(xsetbv_safe(i, XFEATURE_MASK_FP_SSE) == GP_VECTOR, "XSETBV(%u, FP|SSE) - expect #GP", i); /* @@ -33,17 +29,17 @@ static void test_unsupported_xcrs(void) report(xgetbv_safe(BIT(i), &ign) == GP_VECTOR, "XGETBV(0x%lx) - expect #GP", BIT(i)); - report(xsetbv_safe(BIT(i), XSTATE_FP) == GP_VECTOR, + report(xsetbv_safe(BIT(i), XFEATURE_MASK_FP) == GP_VECTOR, "XSETBV(0x%lx, FP) - expect #GP", BIT(i)); - report(xsetbv_safe(BIT(i), XSTATE_FP | XSTATE_SSE) == GP_VECTOR, + report(xsetbv_safe(BIT(i), XFEATURE_MASK_FP_SSE) == GP_VECTOR, "XSETBV(0x%lx, FP|SSE) - expect #GP", BIT(i)); } } static void test_xsave(void) { - u64 supported_xcr0, test_bits; + u64 supported_xcr0; unsigned long cr4; printf("Legal instruction testing:\n"); @@ -51,9 +47,8 @@ static void test_xsave(void) supported_xcr0 = this_cpu_supported_xcr0(); printf("Supported XCR0 bits: %#lx\n", supported_xcr0); - test_bits = XSTATE_FP | XSTATE_SSE; - report((supported_xcr0 & test_bits) == test_bits, - "Check minimal XSAVE required bits"); + report((supported_xcr0 & XFEATURE_MASK_FP_SSE) == XFEATURE_MASK_FP_SSE, + "FP and SSE should always be supported in XCR0"); cr4 = read_cr4(); write_cr4(cr4 | X86_CR4_OSXSAVE); @@ -62,22 +57,22 @@ static void test_xsave(void) "Check CPUID.1.ECX.OSXSAVE - expect 1"); printf("\tLegal tests\n"); - write_xcr0(XSTATE_FP); - write_xcr0(XSTATE_FP | XSTATE_SSE); + write_xcr0(XFEATURE_MASK_FP); + write_xcr0(XFEATURE_MASK_FP_SSE); (void)read_xcr0(); printf("\tIllegal tests\n"); report(write_xcr0_safe(0) == GP_VECTOR, "\t\tWrite XCR0 = 0 - expect #GP"); - report(write_xcr0_safe(XSTATE_SSE) == GP_VECTOR, + report(write_xcr0_safe(XFEATURE_MASK_SSE) == GP_VECTOR, "\t\tWrite XCR0 = SSE - expect #GP"); - if (supported_xcr0 & XSTATE_YMM) { - report(write_xcr0_safe(XSTATE_YMM) == GP_VECTOR, + if (supported_xcr0 & XFEATURE_MASK_YMM) { + report(write_xcr0_safe(XFEATURE_MASK_YMM) == GP_VECTOR, "\t\tWrite XCR0 = YMM - expect #GP"); - report(write_xcr0_safe(XSTATE_FP | XSTATE_YMM) == GP_VECTOR, + report(write_xcr0_safe(XFEATURE_MASK_FP | XFEATURE_MASK_YMM) == GP_VECTOR, "\t\tWrite XCR0 = (FP | YMM) - expect #GP"); } @@ -103,7 +98,7 @@ static void test_no_xsave(void) report(read_xcr0_safe(&xcr0) == UD_VECTOR, "Read XCR0 without OSXSAVE enabled - expect #UD"); - report(write_xcr0_safe(XSTATE_FP | XSTATE_SSE) == UD_VECTOR, + report(write_xcr0_safe(XFEATURE_MASK_FP_SSE) == UD_VECTOR, "Write XCR0=(FP|SSE) without XSAVE support - expect #UD"); if (cr4 & X86_CR4_OSXSAVE) -- 2.52.0.rc2.455.g230fcf2819-goog