[PATCH v6 0/7] x86/fpu: Restore and reinforce signal frame portability

Andrei Vagin posted 7 patches 1 week, 1 day ago
There is a newer version of this series
Documentation/arch/x86/xstate.rst                  |  57 +++++
arch/x86/include/uapi/asm/sigcontext.h             |  15 ++
arch/x86/kernel/fpu/signal.c                       | 134 +++++++----
arch/x86/kernel/fpu/xstate.c                       |   9 +-
arch/x86/kernel/fpu/xstate.h                       |   2 +
tools/testing/selftests/x86/Makefile               |   5 +-
.../selftests/x86/sigframe_fpu_portability.c       | 245 +++++++++++++++++++++
tools/testing/selftests/x86/xstate.c               |  12 -
tools/testing/selftests/x86/xstate.h               |  20 ++
9 files changed, 437 insertions(+), 62 deletions(-)
create mode 100644 tools/testing/selftests/x86/sigframe_fpu_portability.c
[PATCH v6 0/7] x86/fpu: Restore and reinforce signal frame portability
Posted by Andrei Vagin 1 week, 1 day ago
The x86 signal frame is designed to be self-describing. The xstate_size
field in the software-reserved bytes indicates the actual size of the
xstate context and is used by the kernel to locate the FP_XSTATE_MAGIC2
marker during signal return.

This design is required to provide portability of signal frames across
different machines. For example, a process checkpointed on a system with
fewer xstate features and restored on a system with more features will
have a signal frame on its stack that is smaller than the destination
host's default. By relying on the frame's internal xstate_size, the
kernel can correctly validate and restore such frames.

This series restores and improves signal frame portability. The goal is
to allow process migration across CPUs with heterogeneous FPU
capabilities, as long as the process only uses features supported by
both systems. This version addresses the original issues by pre-faulting
only the required size of the xstate buffer (rather than the default
task size), and includes cleanups requested by Ingo Molnar.

v6:
  - Clarify struct _fpstate_32 layout and reformat documentation per
    Borislav comments.
  - Add Reviewed-by tags from Chang S. Bae.
v5: Address Chang's comments:
  - Documentation:
    - Expanded Documentation/arch/x86/xstate.rst with a dedicated
      section describing struct _fpx_sw_bytes, 32-bit vs 64-bit frame
      layout differences, and architectural portability constraints.
    - Trimmed the comment in <uapi/asm/sigcontext.h> and added a
      reference to xstate.rst.
  - x86/fpu core:
    - Renamed the 32-bit helper to restore_from_ia32_fxstate() and
      inlined the remaining native path directly into
      fpu__restore_sig().
  - Selftests:
    - Consolidated the shrunk-frame and insufficient-size test cases.
v4:
    - Update documentation to describe architectural XSAVE layout
      constraints and feature repurposing (e.g. MPX vs APX).
    - The patch "x86/fpu: Allow restoring signal frames with larger
      xstate_size" will be sent in a separate series.
    - Address sashiko comments.

v3:
    - Include cleanups and refactoring of signal frame handling code
      as requested by Ingo Molnar.
    - Fix potential underflow in xstate_calculate_size()

v2:
    - Address sashiko comments.
    - 44eeff9bc467 ("Revert "x86/fpu: Refine and simplify the magic
      number check during signal return"") has been merged.

Cc: Alexander Mikhalitsyn <alexander@mihalicyn.com>
Cc: Borislav Petkov <bp@alien8.de>
Cc: "Chang S. Bae" <chang.seok.bae@intel.com>
Cc: Dave Hansen <dave.hansen@linux.intel.com>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Thomas Gleixner <tglx@kernel.org>

Andrei Vagin (7):
  x86/fpu: Document signal frame layout and portability
  x86/fpu: Clean up and rename variables in signal frame handling
  x86/fpu: Extract restore_from_ia32_fxstate() and clean up
    fpu__restore_sig()
  x86/fpu: Document reasoning of FX-only fallback
  x86/fpu: Fix potential underflow in xstate_calculate_size()
  x86/fpu: Pre-fault only required size of xstate buffer
  selftests/x86: Add tests for signal frame FPU portability

 Documentation/arch/x86/xstate.rst                  |  57 +++++
 arch/x86/include/uapi/asm/sigcontext.h             |  15 ++
 arch/x86/kernel/fpu/signal.c                       | 134 +++++++----
 arch/x86/kernel/fpu/xstate.c                       |   9 +-
 arch/x86/kernel/fpu/xstate.h                       |   2 +
 tools/testing/selftests/x86/Makefile               |   5 +-
 .../selftests/x86/sigframe_fpu_portability.c       | 245 +++++++++++++++++++++
 tools/testing/selftests/x86/xstate.c               |  12 -
 tools/testing/selftests/x86/xstate.h               |  20 ++
 9 files changed, 437 insertions(+), 62 deletions(-)
 create mode 100644 tools/testing/selftests/x86/sigframe_fpu_portability.c

-- 
2.55.0.979.g7e5102b832-goog
Re: [PATCH v6 0/7] x86/fpu: Restore and reinforce signal frame portability
Posted by Andrei Vagin 6 days, 7 hours ago
On Wed, Sep 16, 2026 at 4:27 PM Andrei Vagin <avagin@google.com> wrote:
>
> The x86 signal frame is designed to be self-describing. The xstate_size
> field in the software-reserved bytes indicates the actual size of the
> xstate context and is used by the kernel to locate the FP_XSTATE_MAGIC2
> marker during signal return.
>
> This design is required to provide portability of signal frames across
> different machines. For example, a process checkpointed on a system with
> fewer xstate features and restored on a system with more features will
> have a signal frame on its stack that is smaller than the destination
> host's default. By relying on the frame's internal xstate_size, the
> kernel can correctly validate and restore such frames.
>
> This series restores and improves signal frame portability. The goal is
> to allow process migration across CPUs with heterogeneous FPU
> capabilities, as long as the process only uses features supported by
> both systems. This version addresses the original issues by pre-faulting
> only the required size of the xstate buffer (rather than the default
> task size), and includes cleanups requested by Ingo Molnar.
>
> v6:
>   - Clarify struct _fpstate_32 layout and reformat documentation per
>     Borislav comments.
>   - Add Reviewed-by tags from Chang S. Bae.

Sashiko reported no issues, all patches are green:
https://sashiko.dev/#/patchset/20260916232310.490786-1-avagin%40google.com

I think this series is ready to merge. Thanks to everyone involved.

Thanks,
Andrei