]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
x86/fpu/apx: Define APX state component
authorChang S. Bae <chang.seok.bae@intel.com>
Wed, 16 Apr 2025 02:16:52 +0000 (19:16 -0700)
committerIngo Molnar <mingo@kernel.org>
Wed, 16 Apr 2025 07:44:14 +0000 (09:44 +0200)
Advanced Performance Extensions (APX) is associated with a new state
component number 19. To support saving and restoring of the corresponding
registers via the XSAVE mechanism, introduce the component definition
along with the necessary sanity checks.

Define the new component number, state name, and those register data
type. Then, extend the size checker to validate the register data type
and explicitly list the APX feature flag as a dependency for the new
component in xsave_cpuid_features[].

Signed-off-by: Chang S. Bae <chang.seok.bae@intel.com>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Reviewed-by: Sohil Mehta <sohil.mehta@intel.com>
Cc: Andy Lutomirski <luto@kernel.org>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Oleg Nesterov <oleg@redhat.com>
Link: https://lore.kernel.org/r/20250416021720.12305-3-chang.seok.bae@intel.com
arch/x86/include/asm/fpu/types.h
arch/x86/kernel/fpu/xstate.c

index de16862bf230bc7db0fbe764872a06fec5af3d4d..97310df3ea13546edc17539d39b65ce17236111e 100644 (file)
@@ -125,6 +125,7 @@ enum xfeature {
        XFEATURE_RSRVD_COMP_16,
        XFEATURE_XTILE_CFG,
        XFEATURE_XTILE_DATA,
+       XFEATURE_APX,
 
        XFEATURE_MAX,
 };
@@ -145,6 +146,7 @@ enum xfeature {
 #define XFEATURE_MASK_LBR              (1 << XFEATURE_LBR)
 #define XFEATURE_MASK_XTILE_CFG                (1 << XFEATURE_XTILE_CFG)
 #define XFEATURE_MASK_XTILE_DATA       (1 << XFEATURE_XTILE_DATA)
+#define XFEATURE_MASK_APX              (1 << XFEATURE_APX)
 
 #define XFEATURE_MASK_FPSSE            (XFEATURE_MASK_FP | XFEATURE_MASK_SSE)
 #define XFEATURE_MASK_AVX512           (XFEATURE_MASK_OPMASK \
@@ -303,6 +305,13 @@ struct xtile_data {
        struct reg_1024_byte            tmm;
 } __packed;
 
+/*
+ * State component 19: 8B extended general purpose register.
+ */
+struct apx_state {
+       u64                             egpr[16];
+} __packed;
+
 /*
  * State component 10 is supervisor state used for context-switching the
  * PASID state.
index a288597065fd192b1c46d556b08c09253cfb4796..dfd07af1003742fa0aaee5308be94a96daf229df 100644 (file)
@@ -63,6 +63,7 @@ static const char *xfeature_names[] =
        "unknown xstate feature",
        "AMX Tile config",
        "AMX Tile data",
+       "APX registers",
        "unknown xstate feature",
 };
 
@@ -81,6 +82,7 @@ static unsigned short xsave_cpuid_features[] __initdata = {
        [XFEATURE_CET_USER]                     = X86_FEATURE_SHSTK,
        [XFEATURE_XTILE_CFG]                    = X86_FEATURE_AMX_TILE,
        [XFEATURE_XTILE_DATA]                   = X86_FEATURE_AMX_TILE,
+       [XFEATURE_APX]                          = X86_FEATURE_APX,
 };
 
 static unsigned int xstate_offsets[XFEATURE_MAX] __ro_after_init =
@@ -569,6 +571,7 @@ static bool __init check_xstate_against_struct(int nr)
        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_APX:        return XCHECK_SZ(sz, nr, struct apx_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);