Forráskód Böngészése

+ darwin/arm signal handling support, except for the definition of the
signal context structure as the license of the original file isn't
100% clear yet

git-svn-id: trunk@12196 -

Jonas Maebe 16 éve
szülő
commit
bf7b6fd279
3 módosított fájl, 63 hozzáadás és 1 törlés
  1. 1 0
      .gitattributes
  2. 57 0
      rtl/darwin/arm/sighnd.inc
  3. 5 1
      rtl/darwin/extres_multiarch.inc

+ 1 - 0
.gitattributes

@@ -5106,6 +5106,7 @@ rtl/bsd/x86_64/syscall.inc svneol=native#text/plain
 rtl/bsd/x86_64/syscallh.inc svneol=native#text/plain
 rtl/darwin/Makefile svneol=native#text/plain
 rtl/darwin/Makefile.fpc svneol=native#text/plain
+rtl/darwin/arm/sighnd.inc svneol=native#text/plain
 rtl/darwin/console.pp svneol=native#text/plain
 rtl/darwin/errno.inc svneol=native#text/plain
 rtl/darwin/errnostr.inc -text

+ 57 - 0
rtl/darwin/arm/sighnd.inc

@@ -0,0 +1,57 @@
+{
+   This file is part of the Free Pascal run time library.
+   (c) 2008 by Jonas Maebe
+   member of the Free Pascal development team.
+
+   See the file COPYING.FPC, included in this distribution,
+   for details about the copyright.
+
+   Signalhandler for Darwin/arm
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY;without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+}
+
+procedure SignalToRunerror(Sig: cint; info : PSigInfo; SigContext:PSigContext); cdecl;
+
+var
+  res : word;
+
+begin
+  res:=0;
+  case sig of
+    SIGFPE :
+      begin
+        Case Info^.si_code Of
+          FPE_FLTDIV,
+          FPE_INTDIV : Res:=200;  { floating point divide by zero }
+          FPE_FLTOVF : Res:=205;  { floating point overflow }
+          FPE_FLTUND : Res:=206;  { floating point underflow }
+          FPE_FLTRES,             { floating point inexact result }
+          FPE_FLTINV : Res:=207;  { invalid floating point operation }
+          Else
+            Res:=207; {coprocessor error}
+        end;
+        SigContext^.uc_mcontext^.fs.__fpscr := SigContext^.uc_mcontext^.fs.__fpscr and not($1fff);
+      end;
+    SIGBUS:
+        res:=214;
+    SIGILL,
+    SIGSEGV :
+        res:=216;
+  end;
+  {$ifdef FPC_USE_SIGPROCMASK}
+   reenable_signal(sig);
+  {$endif }
+
+  { return to trampoline }
+  if res <> 0 then
+    begin
+      SigContext^.uc_mcontext^.ss.__r[0] := res;
+      SigContext^.uc_mcontext^.ss.__r[1] := SigContext^.uc_mcontext^.ss.__pc;
+      SigContext^.uc_mcontext^.ss.__r[2] := SigContext^.uc_mcontext^.ss.__sp;
+      pointer(SigContext^.uc_mcontext^.ss.__pc) := @HandleErrorAddrFrame;
+    end;
+end;
+

+ 5 - 1
rtl/darwin/extres_multiarch.inc

@@ -42,7 +42,11 @@ const
           {$IFDEF CPUPOWERPC64}
           '.powerpc64';
           {$ELSE}
-          '';
+            {$IFDEF CPUARM}
+            '.arm';
+            {$ELSE}
+              '';
+            {$ENDIF}
           {$ENDIF}
         {$ENDIF}
       {$ENDIF}