From: Tim Clem tclem@codeweavers.com
--- dlls/ntdll/unix/signal_x86_64.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/dlls/ntdll/unix/signal_x86_64.c b/dlls/ntdll/unix/signal_x86_64.c index 6f05212c32d..d8bb659f3cc 100644 --- a/dlls/ntdll/unix/signal_x86_64.c +++ b/dlls/ntdll/unix/signal_x86_64.c @@ -2381,7 +2381,9 @@ static void trap_handler( int signal, siginfo_t *siginfo, void *sigcontext ) static void fpe_handler( int signal, siginfo_t *siginfo, void *sigcontext ) { ucontext_t *ucontext = init_handler( sigcontext ); - EXCEPTION_RECORD rec = { 0 }; + EXCEPTION_RECORD rec = { .ExceptionAddress = (void *)RIP_sig(ucontext) }; + struct xcontext context; + save_context( &context, sigcontext );
switch (siginfo->si_code) { @@ -2408,7 +2410,7 @@ static void fpe_handler( int signal, siginfo_t *siginfo, void *sigcontext ) break; case FPE_FLTINV: default: - if (FPU_sig(ucontext) && FPU_sig(ucontext)->StatusWord & 0x40) + if (context.c.FltSave.StatusWord & 0x40) rec.ExceptionCode = EXCEPTION_FLT_STACK_CHECK; else rec.ExceptionCode = EXCEPTION_FLT_INVALID_OPERATION; @@ -2419,10 +2421,10 @@ static void fpe_handler( int signal, siginfo_t *siginfo, void *sigcontext ) { rec.NumberParameters = 2; rec.ExceptionInformation[0] = 0; - rec.ExceptionInformation[1] = FPU_sig(ucontext) ? FPU_sig(ucontext)->MxCsr : 0; + rec.ExceptionInformation[1] = context.c.FltSave.MxCsr; if (CS_sig(ucontext) != cs64_sel) rec.ExceptionCode = STATUS_FLOAT_MULTIPLE_TRAPS; } - setup_exception( ucontext, &rec ); + setup_raise_exception( sigcontext, &rec, &context ); }