Message ID | 20221010142127.295676-2-pbonzini@redhat.com |
---|---|
State | New |
Headers | show |
Series | linux-user: i386/signal: support XSAVE/XRSTOR for signal frame fpstate | expand |
On 10/10/22 07:21, Paolo Bonzini wrote: > Recent versions of Linux moved the 32-bit fpstate towards the end of the > frame, so that the variable-sized xsave data does not overwrite the > (ABI-defined) extramask[] field. Follow suit in QEMU. > > Signed-off-by: Paolo Bonzini<pbonzini@redhat.com> > --- > linux-user/i386/signal.c | 11 +++++++++-- > 1 file changed, 9 insertions(+), 2 deletions(-) Reviewed-by: Richard Henderson <richard.henderson@linaro.org> r~
diff --git a/linux-user/i386/signal.c b/linux-user/i386/signal.c index 4372621a4d..76317a3d16 100644 --- a/linux-user/i386/signal.c +++ b/linux-user/i386/signal.c @@ -163,9 +163,16 @@ struct sigframe { abi_ulong pretcode; int sig; struct target_sigcontext sc; - struct target_fpstate fpstate; + /* + * The actual fpstate is placed after retcode[] below, to make + * room for the variable-sized xsave data. The older unused fpstate + * has to be kept to avoid changing the offset of extramask[], which + * is part of the ABI. + */ + struct target_fpstate fpstate_unused; abi_ulong extramask[TARGET_NSIG_WORDS-1]; char retcode[8]; + struct target_fpstate fpstate; }; struct rt_sigframe { @@ -175,8 +182,8 @@ struct rt_sigframe { abi_ulong puc; struct target_siginfo info; struct target_ucontext uc; - struct target_fpstate fpstate; char retcode[8]; + struct target_fpstate fpstate; }; #else
Recent versions of Linux moved the 32-bit fpstate towards the end of the frame, so that the variable-sized xsave data does not overwrite the (ABI-defined) extramask[] field. Follow suit in QEMU. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> --- linux-user/i386/signal.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)