]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
x86/fpu/xstate: Remove xstate offset check
authorChang S. Bae <chang.seok.bae@intel.com>
Thu, 20 Mar 2025 23:42:52 +0000 (16:42 -0700)
committerIngo Molnar <mingo@kernel.org>
Mon, 14 Apr 2025 06:18:29 +0000 (08:18 +0200)
Traditionally, new xstate components have been assigned sequentially,
aligning feature numbers with their offsets in the XSAVE buffer. However,
this ordering is not architecturally mandated in the non-compacted
format, where a component's offset may not correspond to its feature
number.

The kernel caches CPUID-reported xstate component details, including size
and offset in the non-compacted format. As part of this process, a sanity
check is also conducted to ensure alignment between feature numbers and
offsets.

This check was likely intended as a general guideline rather than a
strict requirement. Upcoming changes will support out-of-order offsets.
Remove the check as becoming obsolete.

Signed-off-by: Chang S. Bae <chang.seok.bae@intel.com>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
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/20250320234301.8342-2-chang.seok.bae@intel.com
arch/x86/kernel/fpu/xstate.c

index 6a41d1610d8bc84c55e5c9eb61035645efae959f..542c6981180d7647725c8f525bc39f301bf146e4 100644 (file)
@@ -216,9 +216,6 @@ static bool xfeature_enabled(enum xfeature xfeature)
 static void __init setup_xstate_cache(void)
 {
        u32 eax, ebx, ecx, edx, i;
-       /* start at the beginning of the "extended state" */
-       unsigned int last_good_offset = offsetof(struct xregs_state,
-                                                extended_state_area);
        /*
         * The FP xstates and SSE xstates are legacy states. They are always
         * in the fixed offsets in the xsave area in either compacted form
@@ -246,16 +243,6 @@ static void __init setup_xstate_cache(void)
                        continue;
 
                xstate_offsets[i] = ebx;
-
-               /*
-                * In our xstate size checks, we assume that the highest-numbered
-                * xstate feature has the highest offset in the buffer.  Ensure
-                * it does.
-                */
-               WARN_ONCE(last_good_offset > xstate_offsets[i],
-                         "x86/fpu: misordered xstate at %d\n", last_good_offset);
-
-               last_good_offset = xstate_offsets[i];
        }
 }