Bläddra i källkod

* restore traps when returning with longjmp

peter 21 år sedan
förälder
incheckning
ac68641535
3 ändrade filer med 65 tillägg och 7 borttagningar
  1. 48 3
      rtl/sparc/setjump.inc
  2. 11 1
      rtl/sparc/setjumph.inc
  3. 6 3
      rtl/sparc/sparc.inc

+ 48 - 3
rtl/sparc/setjump.inc

@@ -18,6 +18,31 @@
 #define ST_FLUSH_WINDOWS 3
 #define RW_FP [%fp + 0x48]
 }
+
+{$ifdef linux}
+  {$define needsigprocmask}
+{$endif}
+
+{$ifdef needsigprocmask}
+const
+  JMPSIG_BLOCK   = 1;
+  JMPSIG_SETMASK = 4;
+
+function JmpSigProcMask(how:longint;nset : pjmpsigset;oset : pjmpsigset):longint; external name 'FPC_SYSC_SIGPROCMASK';
+
+procedure savesigmask(var s:jmp_buf);
+begin
+  jmpsigprocmask(JMPSIG_BLOCK,nil,@s.sigmask);
+end;
+
+procedure restoresigmask(var s:jmp_buf);
+begin
+  jmpsigprocmask(JMPSIG_SETMASK,@s.sigmask,nil);
+end;
+{$endif needsigprocmask}
+
+
+
 procedure longjmp(var s : jmp_buf;value:longint);assembler;nostackframe;[Public,alias:'FPC_LONGJMP'];
   asm
     // Store our arguments in global registers so we can still
@@ -57,10 +82,20 @@ procedure longjmp(var s : jmp_buf;value:longint);assembler;nostackframe;[Public,
     }
 
     ta      3
-    ld      [%g1+8], %o7    // Set return PC.
-    ld      [%g1], %fp      // Set saved SP on restore below.
+    mov     %g1,%o1         // use %o1, since %g1 will be destroyed by the call below
+    
+    ld      [%o1], %fp      // Set saved SP on restore below.
     sub     %fp, 64, %sp    // Allocate a register frame.
     st      %g3, [%fp+48]   // Set saved FP on restore below.
+
+{$ifdef needsigprocmask}
+    mov   %o1,%o0
+    call  restoresigmask
+    nop
+{$endif needsigprocmask}
+
+    ld      [%o1+8], %o7    // Set return PC.
+    
     retl
     restore %g2, 0, %o0     // Restore values from above register frame.
 
@@ -81,12 +116,22 @@ function setjmp(var S:jmp_buf):longint;assembler;nostackframe;[Public,alias:'FPC
     st      %o7, [%o0+8]
     st      %sp, [%o0]
     st      %fp, [%o0+4]
+
+{$ifdef needsigprocmask}
+    call   savesigmask
+    nop
+{$endif needsigprocmask}
+            
+    ld      [%o0+8], %o7
     mov     %g0, %o0
   end;
 
 {
   $Log$
-  Revision 1.8  2004-05-31 10:43:00  peter
+  Revision 1.9  2004-09-12 12:04:22  peter
+    * restore traps when returning with longjmp
+
+  Revision 1.8  2004/05/31 10:43:00  peter
     * don't create stackframes so we can retrieve the info from
       the caller
 

+ 11 - 1
rtl/sparc/setjumph.inc

@@ -36,7 +36,12 @@ Guardian:/usr/local/src/glibc-2.2.3/sysdeps/sparc/sparc32# more __longjmp.S
 
 ******************************************************************************}
 {@Define the machine-dependent type `jmp_buf'.  SPARC version.}
+const
+  jmpbufsigmaskwords = 128 div 32;
+  
 type
+  tjmpsigset=array[0..jmpbufsigmaskwords-1] of longint;
+  pjmpsigset=^tjmpsigset;
   jmp_buf=packed record
     {stack pointer}
     JB_SP,
@@ -44,13 +49,18 @@ type
     JB_FP,
     {program counter}
     JB_PV:Pointer;
+    
+    sigmask : tjmpsigset;
   end;
   Pjmp_buf=^jmp_buf;
 function setjmp(var S:jmp_buf):longint;
 procedure longjmp(var S:jmp_buf;value:longint);
 {
   $Log$
-  Revision 1.4  2003-01-05 21:32:35  mazen
+  Revision 1.5  2004-09-12 12:04:23  peter
+    * restore traps when returning with longjmp
+
+  Revision 1.4  2003/01/05 21:32:35  mazen
   * fixing several bugs compiling the RTL
 
   Revision 1.3  2003/01/01 18:24:41  mazen

+ 6 - 3
rtl/sparc/sparc.inc

@@ -20,12 +20,12 @@
 {****************************************************************************
                            SPARC specific stuff
 ****************************************************************************}
-function get_fsr : dword;assembler;
+function get_fsr : dword;assembler;nostackframe;
   var
     fsr : dword;
   asm
     st %fsr,fsr
-    ld fsr,%i0
+    ld fsr,%o0
   end;
 
 
@@ -84,7 +84,10 @@ function Sptr:Pointer;assembler;nostackframe;
 
 {
   $Log$
-  Revision 1.8  2004-08-04 19:27:10  florian
+  Revision 1.9  2004-09-12 12:04:23  peter
+    * restore traps when returning with longjmp
+
+  Revision 1.8  2004/08/04 19:27:10  florian
     * fixed floating point and integer exception handling on sparc/linux
 
   Revision 1.7  2004/05/30 20:03:05  florian