OSDN Git Service

Merge tag 'x86_shstk_for_6.6-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git...
[tomoyo/tomoyo-test1.git] / arch / x86 / kernel / fpu / xstate.c
index 1afbc48..41dac93 100644 (file)
  */
 static const char *xfeature_names[] =
 {
-       "x87 floating point registers"  ,
-       "SSE registers"                 ,
-       "AVX registers"                 ,
-       "MPX bounds registers"          ,
-       "MPX CSR"                       ,
-       "AVX-512 opmask"                ,
-       "AVX-512 Hi256"                 ,
-       "AVX-512 ZMM_Hi256"             ,
-       "Processor Trace (unused)"      ,
+       "x87 floating point registers",
+       "SSE registers",
+       "AVX registers",
+       "MPX bounds registers",
+       "MPX CSR",
+       "AVX-512 opmask",
+       "AVX-512 Hi256",
+       "AVX-512 ZMM_Hi256",
+       "Processor Trace (unused)",
        "Protection Keys User registers",
        "PASID state",
-       "unknown xstate feature"        ,
-       "unknown xstate feature"        ,
-       "unknown xstate feature"        ,
-       "unknown xstate feature"        ,
-       "unknown xstate feature"        ,
-       "unknown xstate feature"        ,
-       "AMX Tile config"               ,
-       "AMX Tile data"                 ,
-       "unknown xstate feature"        ,
+       "Control-flow User registers",
+       "Control-flow Kernel registers (unused)",
+       "unknown xstate feature",
+       "unknown xstate feature",
+       "unknown xstate feature",
+       "unknown xstate feature",
+       "AMX Tile config",
+       "AMX Tile data",
+       "unknown xstate feature",
 };
 
 static unsigned short xsave_cpuid_features[] __initdata = {
@@ -73,6 +73,7 @@ static unsigned short xsave_cpuid_features[] __initdata = {
        [XFEATURE_PT_UNIMPLEMENTED_SO_FAR]      = X86_FEATURE_INTEL_PT,
        [XFEATURE_PKRU]                         = X86_FEATURE_PKU,
        [XFEATURE_PASID]                        = X86_FEATURE_ENQCMD,
+       [XFEATURE_CET_USER]                     = X86_FEATURE_SHSTK,
        [XFEATURE_XTILE_CFG]                    = X86_FEATURE_AMX_TILE,
        [XFEATURE_XTILE_DATA]                   = X86_FEATURE_AMX_TILE,
 };
@@ -276,6 +277,7 @@ static void __init print_xstate_features(void)
        print_xstate_feature(XFEATURE_MASK_Hi16_ZMM);
        print_xstate_feature(XFEATURE_MASK_PKRU);
        print_xstate_feature(XFEATURE_MASK_PASID);
+       print_xstate_feature(XFEATURE_MASK_CET_USER);
        print_xstate_feature(XFEATURE_MASK_XTILE_CFG);
        print_xstate_feature(XFEATURE_MASK_XTILE_DATA);
 }
@@ -344,6 +346,7 @@ static __init void os_xrstor_booting(struct xregs_state *xstate)
         XFEATURE_MASK_BNDREGS |                \
         XFEATURE_MASK_BNDCSR |                 \
         XFEATURE_MASK_PASID |                  \
+        XFEATURE_MASK_CET_USER |               \
         XFEATURE_MASK_XTILE)
 
 /*
@@ -446,14 +449,15 @@ static void __init __xstate_dump_leaves(void)
        }                                                                       \
 } while (0)
 
-#define XCHECK_SZ(sz, nr, nr_macro, __struct) do {                     \
-       if ((nr == nr_macro) &&                                         \
-           WARN_ONCE(sz != sizeof(__struct),                           \
-               "%s: struct is %zu bytes, cpu state %d bytes\n",        \
-               __stringify(nr_macro), sizeof(__struct), sz)) {         \
+#define XCHECK_SZ(sz, nr, __struct) ({                                 \
+       if (WARN_ONCE(sz != sizeof(__struct),                           \
+           "[%s]: struct is %zu bytes, cpu state %d bytes\n",          \
+           xfeature_names[nr], sizeof(__struct), sz)) {                \
                __xstate_dump_leaves();                                 \
        }                                                               \
-} while (0)
+       true;                                                           \
+})
+
 
 /**
  * check_xtile_data_against_struct - Check tile data state size.
@@ -527,36 +531,28 @@ static bool __init check_xstate_against_struct(int nr)
         * Ask the CPU for the size of the state.
         */
        int sz = xfeature_size(nr);
+
        /*
         * Match each CPU state with the corresponding software
         * structure.
         */
-       XCHECK_SZ(sz, nr, XFEATURE_YMM,       struct ymmh_struct);
-       XCHECK_SZ(sz, nr, XFEATURE_BNDREGS,   struct mpx_bndreg_state);
-       XCHECK_SZ(sz, nr, XFEATURE_BNDCSR,    struct mpx_bndcsr_state);
-       XCHECK_SZ(sz, nr, XFEATURE_OPMASK,    struct avx_512_opmask_state);
-       XCHECK_SZ(sz, nr, XFEATURE_ZMM_Hi256, struct avx_512_zmm_uppers_state);
-       XCHECK_SZ(sz, nr, XFEATURE_Hi16_ZMM,  struct avx_512_hi16_state);
-       XCHECK_SZ(sz, nr, XFEATURE_PKRU,      struct pkru_state);
-       XCHECK_SZ(sz, nr, XFEATURE_PASID,     struct ia32_pasid_state);
-       XCHECK_SZ(sz, nr, XFEATURE_XTILE_CFG, struct xtile_cfg);
-
-       /* The tile data size varies between implementations. */
-       if (nr == XFEATURE_XTILE_DATA)
-               check_xtile_data_against_struct(sz);
-
-       /*
-        * Make *SURE* to add any feature numbers in below if
-        * there are "holes" in the xsave state component
-        * numbers.
-        */
-       if ((nr < XFEATURE_YMM) ||
-           (nr >= XFEATURE_MAX) ||
-           (nr == XFEATURE_PT_UNIMPLEMENTED_SO_FAR) ||
-           ((nr >= XFEATURE_RSRVD_COMP_11) && (nr <= XFEATURE_RSRVD_COMP_16))) {
+       switch (nr) {
+       case XFEATURE_YMM:        return XCHECK_SZ(sz, nr, struct ymmh_struct);
+       case XFEATURE_BNDREGS:    return XCHECK_SZ(sz, nr, struct mpx_bndreg_state);
+       case XFEATURE_BNDCSR:     return XCHECK_SZ(sz, nr, struct mpx_bndcsr_state);
+       case XFEATURE_OPMASK:     return XCHECK_SZ(sz, nr, struct avx_512_opmask_state);
+       case XFEATURE_ZMM_Hi256:  return XCHECK_SZ(sz, nr, struct avx_512_zmm_uppers_state);
+       case XFEATURE_Hi16_ZMM:   return XCHECK_SZ(sz, nr, struct avx_512_hi16_state);
+       case XFEATURE_PKRU:       return XCHECK_SZ(sz, nr, struct pkru_state);
+       case XFEATURE_PASID:      return XCHECK_SZ(sz, nr, struct ia32_pasid_state);
+       case XFEATURE_XTILE_CFG:  return XCHECK_SZ(sz, nr, struct xtile_cfg);
+       case XFEATURE_CET_USER:   return XCHECK_SZ(sz, nr, struct cet_user_state);
+       case XFEATURE_XTILE_DATA: check_xtile_data_against_struct(sz); return true;
+       default:
                XSTATE_WARN_ON(1, "No structure for xstate: %d\n", nr);
                return false;
        }
+
        return true;
 }