mirror of
https://github.com/torvalds/linux.git
synced 2026-05-24 15:12:13 +02:00
x86/fpu/xstate: Adjust XSAVE buffer size calculation
The current xstate size calculation assumes that the highest-numbered xstate feature has the highest offset in the buffer, determining the size based on the topmost bit in the feature mask. However, this assumption is not architecturally guaranteed -- higher-numbered features may have lower offsets. With the introduction of the xfeature order table and its helper macro, xstate components can now be traversed in their positional order. Update the non-compacted format handling to iterate through the table to determine the last-positioned feature. Then, set the offset accordingly. Since size calculation primarily occurs during initialization or in non-critical paths, looping to find the last feature is not expected to have a meaningful performance impact. 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-4-chang.seok.bae@intel.com
This commit is contained in:
parent
15d51a2f6f
commit
a758ae2885
|
|
@ -581,13 +581,20 @@ static bool __init check_xstate_against_struct(int nr)
|
|||
static unsigned int xstate_calculate_size(u64 xfeatures, bool compacted)
|
||||
{
|
||||
unsigned int topmost = fls64(xfeatures) - 1;
|
||||
unsigned int offset = xstate_offsets[topmost];
|
||||
unsigned int offset, i;
|
||||
|
||||
if (topmost <= XFEATURE_SSE)
|
||||
return sizeof(struct xregs_state);
|
||||
|
||||
if (compacted)
|
||||
if (compacted) {
|
||||
offset = xfeature_get_offset(xfeatures, topmost);
|
||||
} else {
|
||||
/* Walk through the xfeature order to pick the last */
|
||||
for_each_extended_xfeature_in_order(i, xfeatures)
|
||||
topmost = xfeature_uncompact_order[i];
|
||||
offset = xstate_offsets[topmost];
|
||||
}
|
||||
|
||||
return offset + xstate_sizes[topmost];
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user