Hello, Sorry it took me long to manage to fine time to look at this...
Luca Dariz, le mer. 19 mars 2025 18:11:18 +0100, a ecrit: > diff --git a/sysdeps/mach/hurd/i386/sigreturn.c > b/sysdeps/mach/hurd/i386/sigreturn.c > index ce8df8d02b..618cb74196 100644 > --- a/sysdeps/mach/hurd/i386/sigreturn.c > +++ b/sysdeps/mach/hurd/i386/sigreturn.c > @@ -21,6 +21,8 @@ > #include <stdlib.h> > #include <string.h> > > +#include <cpuid.h> > + > /* This is run on the thread stack after restoring it, to be able to > unlock SS off sigstack. */ > static void > @@ -123,10 +125,27 @@ __sigreturn (struct sigcontext *scp) > if (scp->sc_onstack) > ss->sigaltstack.ss_flags &= ~SS_ONSTACK; > > - if (scp->sc_fpused) > - /* Restore the FPU state. Mach conveniently stores the state > - in the format the i387 `frstor' instruction uses to restore it. */ > - asm volatile ("frstor %0" : : "m" (scp->sc_fpsave)); > +#ifdef i386_XFLOAT_STATE > + if ((scp->xstate) && (scp->xstate->initialized)) else? > + { > + unsigned eax, ebx, ecx, edx; > + __cpuid_count(0xd, 0, eax, ebx, ecx, edx); > + switch (scp->xstate->fp_save_kind) > + { > + case 0: // FNSAVE > + asm volatile("frstor %0" : : "m" (scp->xstate->hw_state)); > + break; > + case 1: // FXSAVE > + asm volatile("fxrstor %0" : : "m" (scp->xstate->hw_state), \ > + "a" (eax), "d" (edx)); > + break; > + default: // XSAVE > + asm volatile("xrstor %0" : : "m" (scp->xstate->hw_state), \ > + "a" (eax), "d" (edx)); > + break; There is also FP_XSAVES which should use xrstors. Better also explicit FP_XSAVEOPT FP_XSAVEC as using xrstor too. (and similar in x86_64) > + } > + } > +#endif > > { > /* There are convenient instructions to pop state off the stack, so we > diff --git a/sysdeps/mach/hurd/x86/trampoline.c > b/sysdeps/mach/hurd/x86/trampoline.c > index 8e2890f8c5..c333d56022 100644 > --- a/sysdeps/mach/hurd/x86/trampoline.c > +++ b/sysdeps/mach/hurd/x86/trampoline.c > @@ -26,7 +26,11 @@ > #include "hurdfault.h" > #include <intr-msg.h> > #include <sys/ucontext.h> > - > +#ifdef __x86_64__ > +#include <mach/x86_64/mach_i386.h> > +#else > +#include <mach/i386/mach_i386.h> > +#endif > > /* Fill in a siginfo_t structure for SA_SIGINFO-enabled handlers. */ > static void fill_siginfo (siginfo_t *si, int signo, > @@ -93,7 +97,7 @@ static void fill_ucontext (ucontext_t *uc, const struct > sigcontext *sc) > /* XXX FPU state. */ > memset (&uc->uc_mcontext.fpregs, 0, sizeof (fpregset_t)); > } > - > +#include <stdio.h> Spurious change? Samuel