KVM: selftests: Add all known XFEATURE masks to common code
authorAaron Lewis <aaronlewis@google.com>
Wed, 5 Apr 2023 00:45:19 +0000 (17:45 -0700)
committerSean Christopherson <seanjc@google.com>
Tue, 11 Apr 2023 17:19:03 +0000 (10:19 -0700)
Add all known XFEATURE masks to processor.h to make them more broadly
available in KVM selftests.  Relocate and clean up the exiting AMX (XTILE)
defines in processor.h, e.g. drop the intermediate define and use BIT_ULL.

Signed-off-by: Aaron Lewis <aaronlewis@google.com>
Reviewed-by: Aaron Lewis <aaronlewis@google.com>
Tested-by: Aaron Lewis <aaronlewis@google.com>
Link: https://lore.kernel.org/r/20230405004520.421768-6-seanjc@google.com
Signed-off-by: Sean Christopherson <seanjc@google.com>
tools/testing/selftests/kvm/include/x86_64/processor.h
tools/testing/selftests/kvm/x86_64/amx_test.c

index 41d7983..187309f 100644 (file)
@@ -60,6 +60,23 @@ struct xstate {
        u8                              extended_state_area[0];
 } __attribute__ ((packed, aligned (64)));
 
+#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_XTILE_CFG                BIT_ULL(17)
+#define XFEATURE_MASK_XTILE_DATA       BIT_ULL(18)
+
+#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)
+
 /* Note, these are ordered alphabetically to match kvm_cpuid_entry2.  Eww. */
 enum cpuid_output_regs {
        KVM_CPUID_EAX,
@@ -1138,14 +1155,6 @@ void virt_map_level(struct kvm_vm *vm, uint64_t vaddr, uint64_t paddr,
 #define X86_CR0_CD          (1UL<<30) /* Cache Disable */
 #define X86_CR0_PG          (1UL<<31) /* Paging */
 
-#define XSTATE_XTILE_CFG_BIT           17
-#define XSTATE_XTILE_DATA_BIT          18
-
-#define XSTATE_XTILE_CFG_MASK          (1ULL << XSTATE_XTILE_CFG_BIT)
-#define XSTATE_XTILE_DATA_MASK         (1ULL << XSTATE_XTILE_DATA_BIT)
-#define XFEATURE_XTILE_MASK            (XSTATE_XTILE_CFG_MASK | \
-                                       XSTATE_XTILE_DATA_MASK)
-
 #define PFERR_PRESENT_BIT 0
 #define PFERR_WRITE_BIT 1
 #define PFERR_USER_BIT 2
index a0f74f5..11329e5 100644 (file)
 #define MAX_TILES                      16
 #define RESERVED_BYTES                 14
 
-#define XFEATURE_XTILECFG              17
-#define XFEATURE_XTILEDATA             18
-#define XFEATURE_MASK_XTILECFG         (1 << XFEATURE_XTILECFG)
-#define XFEATURE_MASK_XTILEDATA                (1 << XFEATURE_XTILEDATA)
-#define XFEATURE_MASK_XTILE            (XFEATURE_MASK_XTILECFG | XFEATURE_MASK_XTILEDATA)
-
 #define XSAVE_HDR_OFFSET               512
 
 struct tile_config {
@@ -172,25 +166,25 @@ static void __attribute__((__flatten__)) guest_code(struct tile_config *amx_cfg,
         * After XSAVEC, XTILEDATA is cleared in the xstate_bv but is set in
         * the xcomp_bv.
         */
-       xstate->header.xstate_bv = XFEATURE_MASK_XTILEDATA;
-       __xsavec(xstate, XFEATURE_MASK_XTILEDATA);
-       GUEST_ASSERT(!(xstate->header.xstate_bv & XFEATURE_MASK_XTILEDATA));
-       GUEST_ASSERT(xstate->header.xcomp_bv & XFEATURE_MASK_XTILEDATA);
+       xstate->header.xstate_bv = XFEATURE_MASK_XTILE_DATA;
+       __xsavec(xstate, XFEATURE_MASK_XTILE_DATA);
+       GUEST_ASSERT(!(xstate->header.xstate_bv & XFEATURE_MASK_XTILE_DATA));
+       GUEST_ASSERT(xstate->header.xcomp_bv & XFEATURE_MASK_XTILE_DATA);
 
        /* xfd=0x40000, disable amx tiledata */
-       wrmsr(MSR_IA32_XFD, XFEATURE_MASK_XTILEDATA);
+       wrmsr(MSR_IA32_XFD, XFEATURE_MASK_XTILE_DATA);
 
        /*
         * XTILEDATA is cleared in xstate_bv but set in xcomp_bv, this property
         * remains the same even when amx tiledata is disabled by IA32_XFD.
         */
-       xstate->header.xstate_bv = XFEATURE_MASK_XTILEDATA;
-       __xsavec(xstate, XFEATURE_MASK_XTILEDATA);
-       GUEST_ASSERT(!(xstate->header.xstate_bv & XFEATURE_MASK_XTILEDATA));
-       GUEST_ASSERT((xstate->header.xcomp_bv & XFEATURE_MASK_XTILEDATA));
+       xstate->header.xstate_bv = XFEATURE_MASK_XTILE_DATA;
+       __xsavec(xstate, XFEATURE_MASK_XTILE_DATA);
+       GUEST_ASSERT(!(xstate->header.xstate_bv & XFEATURE_MASK_XTILE_DATA));
+       GUEST_ASSERT((xstate->header.xcomp_bv & XFEATURE_MASK_XTILE_DATA));
 
        GUEST_SYNC(6);
-       GUEST_ASSERT(rdmsr(MSR_IA32_XFD) == XFEATURE_MASK_XTILEDATA);
+       GUEST_ASSERT(rdmsr(MSR_IA32_XFD) == XFEATURE_MASK_XTILE_DATA);
        set_tilecfg(amx_cfg);
        __ldtilecfg(amx_cfg);
        /* Trigger #NM exception */
@@ -202,14 +196,14 @@ static void __attribute__((__flatten__)) guest_code(struct tile_config *amx_cfg,
 
 void guest_nm_handler(struct ex_regs *regs)
 {
-       /* Check if #NM is triggered by XFEATURE_MASK_XTILEDATA */
+       /* Check if #NM is triggered by XFEATURE_MASK_XTILE_DATA */
        GUEST_SYNC(7);
        GUEST_ASSERT(!(get_cr0() & X86_CR0_TS));
-       GUEST_ASSERT(rdmsr(MSR_IA32_XFD_ERR) == XFEATURE_MASK_XTILEDATA);
-       GUEST_ASSERT(rdmsr(MSR_IA32_XFD) == XFEATURE_MASK_XTILEDATA);
+       GUEST_ASSERT(rdmsr(MSR_IA32_XFD_ERR) == XFEATURE_MASK_XTILE_DATA);
+       GUEST_ASSERT(rdmsr(MSR_IA32_XFD) == XFEATURE_MASK_XTILE_DATA);
        GUEST_SYNC(8);
-       GUEST_ASSERT(rdmsr(MSR_IA32_XFD_ERR) == XFEATURE_MASK_XTILEDATA);
-       GUEST_ASSERT(rdmsr(MSR_IA32_XFD) == XFEATURE_MASK_XTILEDATA);
+       GUEST_ASSERT(rdmsr(MSR_IA32_XFD_ERR) == XFEATURE_MASK_XTILE_DATA);
+       GUEST_ASSERT(rdmsr(MSR_IA32_XFD) == XFEATURE_MASK_XTILE_DATA);
        /* Clear xfd_err */
        wrmsr(MSR_IA32_XFD_ERR, 0);
        /* xfd=0, enable amx */
@@ -233,7 +227,7 @@ int main(int argc, char *argv[])
         * Note, all off-by-default features must be enabled before anything
         * caches KVM_GET_SUPPORTED_CPUID, e.g. before using kvm_cpu_has().
         */
-       vm_xsave_require_permission(XFEATURE_MASK_XTILEDATA);
+       vm_xsave_require_permission(XFEATURE_MASK_XTILE_DATA);
 
        TEST_REQUIRE(kvm_cpu_has(X86_FEATURE_XFD));
        TEST_REQUIRE(kvm_cpu_has(X86_FEATURE_XSAVE));