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