From a22d8a7c38015d6180974bc0f9ea2464adc84da6 Mon Sep 17 00:00:00 2001 From: florian Date: Tue, 15 Sep 2020 20:35:15 +0000 Subject: [PATCH] * Aarch64-linux: return properly from the signal handler * Aarch64-linux: clear FPU exception flags before returning from the signal handler git-svn-id: trunk@46870 - --- rtl/linux/aarch64/sighnd.inc | 23 ++++++++++++++++++++--- rtl/linux/aarch64/sighndh.inc | 18 ++++++++++++++++-- 2 files changed, 36 insertions(+), 5 deletions(-) diff --git a/rtl/linux/aarch64/sighnd.inc b/rtl/linux/aarch64/sighnd.inc index 011b63a960..57f10c470b 100644 --- a/rtl/linux/aarch64/sighnd.inc +++ b/rtl/linux/aarch64/sighnd.inc @@ -15,6 +15,8 @@ **********************************************************************} +{$define SYSTEM_DEBUG} + procedure SignalToRunerror(Sig: longint; SigInfo: PSigInfo; UContext: PUContext); public name '_FPC_DEFAULTSIGHANDLER'; cdecl; var @@ -23,7 +25,19 @@ begin res:=0; case sig of SIGFPE: + begin res:=207; +{$ifdef SYSTEM_DEBUG} + writeln('magic of FPSIMD_Context: $',hexstr(uContext^.uc_mcontext.FPSIMD_Context.head.magic,8)); + writeln('size of FPSIMD_Context: $',hexstr(uContext^.uc_mcontext.FPSIMD_Context.head.size,8)); +{$endif SYSTEM_DEBUG} + if (uContext^.uc_mcontext.FPSIMD_Context.head.magic=$46508001) and + (uContext^.uc_mcontext.FPSIMD_Context.head.size=$210) then + begin + with uContext^.uc_mcontext.FPSIMD_Context do + fpsr:=fpsr and not(fpu_exception_mask shr fpu_exception_mask_to_status_mask_shift); + end; + end; SIGILL: res:=216; SIGSEGV : @@ -38,7 +52,10 @@ begin reenable_signal(sig); { give runtime error at the position where the signal was raised } if res<>0 then - HandleErrorAddrFrame(res, - pointer(uContext^.uc_mcontext.pc), - pointer(uContext^.uc_mcontext.regs[29])); + begin + uContext^.uc_mcontext.regs[0]:=res; + uContext^.uc_mcontext.regs[1]:=uContext^.uc_mcontext.pc; + uContext^.uc_mcontext.regs[2]:=uContext^.uc_mcontext.regs[29]; + pointer(uContext^.uc_mcontext.pc):=@HandleErrorAddrFrame; + end; end; diff --git a/rtl/linux/aarch64/sighndh.inc b/rtl/linux/aarch64/sighndh.inc index 937b8a4203..0ee6f31123 100644 --- a/rtl/linux/aarch64/sighndh.inc +++ b/rtl/linux/aarch64/sighndh.inc @@ -17,6 +17,18 @@ {$packrecords C} type + TAarch64_ctx = record + magic, + size : DWord + end; + + TFPSIMD_Context = record + head : TAarch64_ctx; + fpsr, + fpcr : DWord; + vregs : array[0..31] of array[0..7] of Byte; + end; + PSigContext = ^TSigContext; TSigContext = record fault_address : cULong; @@ -25,10 +37,12 @@ type pc : cULong; pstate : cULong; __pad : cULong; - { The following field should be 16-byte-aligned. Currently the + { The following fields should be 16-byte-aligned. Currently the directive for specifying alignment is buggy, so the preceding field was added so that the record has the right size. } - __reserved : array[0..4095] of cUChar; + case Byte of + 1: (__reserved : array[0..4095] of cUChar); + 2: (FPSIMD_Context : TFPSIMD_Context); end; stack_t = record