linux64.h (MD_FALLBACK_FRAME_STATE_FOR): Don't bump retaddr here.
authorAlan Modra <amodra@bigpond.net.au>
Tue, 10 Feb 2004 13:27:43 +0000 (13:27 +0000)
committerAlan Modra <amodra@gcc.gnu.org>
Tue, 10 Feb 2004 13:27:43 +0000 (23:57 +1030)
* config/rs6000/linux64.h (MD_FALLBACK_FRAME_STATE_FOR): Don't
bump retaddr here.

* include/powerpc-signal.h: Revert 2004-01-21 change.
(INIT_SEGV, INIT_FPE): Provide powerpc64 versions.  Check return
from syscall for ppc32 versions.

From-SVN: r77601

gcc/ChangeLog
gcc/config/rs6000/linux64.h
libjava/ChangeLog
libjava/include/powerpc-signal.h

index babd5fdb47dd6d5bdb65e95ee7dce6c115a9a52b..1f6b7482152b5a7b2d6d37ab577ba5e14ef0766a 100644 (file)
@@ -1,3 +1,8 @@
+2004-02-10  Alan Modra  <amodra@bigpond.net.au>
+
+       * config/rs6000/linux64.h (MD_FALLBACK_FRAME_STATE_FOR): Don't
+       bump retaddr here.
+
 2004-02-10  Paolo Bonzini  <bonzini@gnu.org>
 
        * rtl.h (schedule_insns, schedule_ebbs, fix_sched_param,
index ae807ba3432600e1be599ab63c42a55c43ec2075..44f7cb72a558d4cbabd166de7de6c46cbf23b98e 100644 (file)
@@ -643,15 +643,9 @@ enum { SIGNAL_FRAMESIZE = 64 };
     (FS)->regs.reg[LINK_REGISTER_REGNUM].loc.offset                    \
       = (long)&(sc_->regs->link) - new_cfa_;                           \
                                                                        \
-    /* The unwinder expects the IP to point to the following insn,     \
-       whereas the kernel returns the address of the actual            \
-       faulting insn. We store NIP+4 in an unused register slot to     \
-       get the same result for multiple evaluation of the same signal  \
-       frame.  */                                                      \
-    sc_->regs->gpr[47] = sc_->regs->nip + 4;                           \
     (FS)->regs.reg[ARG_POINTER_REGNUM].how = REG_SAVED_OFFSET;         \
     (FS)->regs.reg[ARG_POINTER_REGNUM].loc.offset                      \
-      = (long)&(sc_->regs->gpr[47]) - new_cfa_;                                \
+      = (long)&(sc_->regs->nip) - new_cfa_;                            \
     (FS)->retaddr_column = ARG_POINTER_REGNUM;                         \
     goto SUCCESS;                                                      \
   } while (0)
index f3038dac87b1497769f06a27a549795f26c7b1ee..ec293183985ccd2995c56ba57d57af1b8532bf49 100644 (file)
@@ -1,3 +1,9 @@
+2004-02-10  Alan Modra  <amodra@bigpond.net.au>
+
+       * include/powerpc-signal.h: Revert 2004-01-21 change.
+       (INIT_SEGV, INIT_FPE): Provide powerpc64 versions.  Check return
+       from syscall for ppc32 versions.
+
 2004-02-08  Per Bothner  <per@bothner.com>
 
        * java/nio/ByteBuffer.java (shiftDown):  New helper method.
index 386fb18291a58d985e10c047ddc3dadbaa4949f2..0d5a6627fe7624d51db5514ea18abf2c18398d60 100644 (file)
@@ -11,17 +11,15 @@ details.  */
 
 
 #ifndef JAVA_SIGNAL_H
-# define JAVA_SIGNAL_H 1
+#define JAVA_SIGNAL_H 1
 
-# ifndef __powerpc64__
+#include <signal.h>
+#include <sys/syscall.h>
 
-#  include <signal.h>
-#  include <sys/syscall.h>
+#define HANDLE_SEGV 1
+#undef HANDLE_FPE
 
-#  define HANDLE_SEGV 1
-#  undef HANDLE_FPE
-
-#  define SIGNAL_HANDLER(_name)                                                \
+#define SIGNAL_HANDLER(_name)                                          \
   static void _name (int /* _signal */, struct sigcontext *_sc)
 
 /* PPC either leaves PC pointing at a faulting instruction or the
@@ -29,7 +27,7 @@ details.  */
    the former, so we adjust the saved PC to point to the following
    instruction. This is what the handler in libgcc expects.  */
 
-#  define MAKE_THROW_FRAME(_exception)                                 \
+#define MAKE_THROW_FRAME(_exception)                                   \
 do                                                                     \
   {                                                                    \
     _sc->regs->nip += 4;                                               \
@@ -53,6 +51,7 @@ while (0)
    compatibility hacks in MAKE_THROW_FRAME, as the ucontext layout
    on PPC changed during the 2.5 kernel series.  */
 
+#ifndef __powerpc64__
 struct kernel_old_sigaction {
   void (*k_sa_handler) (int, struct sigcontext *);
   unsigned long k_sa_mask;
@@ -60,35 +59,61 @@ struct kernel_old_sigaction {
   void (*k_sa_restorer) (void);
 };
 
-#  define INIT_SEGV                                                    \
+#define INIT_SEGV                                                      \
 do                                                                     \
   {                                                                    \
     struct kernel_old_sigaction kact;                                  \
     kact.k_sa_handler = catch_segv;                                    \
     kact.k_sa_mask = 0;                                                        \
     kact.k_sa_flags = 0;                                               \
-    syscall (SYS_sigaction, SIGSEGV, &kact, NULL);                     \
+    if (syscall (SYS_sigaction, SIGSEGV, &kact, NULL) != 0)            \
+      __asm__ __volatile__ (".long 0");                                        \
   }                                                                    \
 while (0)  
 
-#  define INIT_FPE                                                     \
+#define INIT_FPE                                                       \
 do                                                                     \
   {                                                                    \
     struct kernel_old_sigaction kact;                                  \
     kact.k_sa_handler = catch_fpe;                                     \
     kact.k_sa_mask = 0;                                                        \
     kact.k_sa_flags = 0;                                               \
-    syscall (SYS_sigaction, SIGFPE, &kact, NULL);                      \
+    if (syscall (SYS_sigaction, SIGFPE, &kact, NULL) != 0)             \
+      __asm__ __volatile__ (".long 0");                                        \
   }                                                                    \
 while (0)
 
-# else
+#else /* powerpc64 */
+
+struct kernel_sigaction
+{
+  void (*k_sa_handler) (int, struct sigcontext *);
+  unsigned long k_sa_flags;
+  void (*k_sa_restorer)(void);
+  unsigned long k_sa_mask;
+};
 
-#  undef HANDLE_SEGV
-#  undef HANDLE_FPE
+#define INIT_SEGV                                                      \
+do                                                                     \
+  {                                                                    \
+    struct kernel_sigaction kact;                                      \
+    memset (&kact, 0, sizeof (kact));                                  \
+    kact.k_sa_handler = catch_segv;                                    \
+    if (syscall (SYS_rt_sigaction, SIGSEGV, &kact, NULL, 8) != 0)      \
+      __asm__ __volatile__ (".long 0");                                        \
+  }                                                                    \
+while (0)  
 
-#  define INIT_SEGV   do {} while (0)
-#  define INIT_FPE   do {} while (0)
-# endif
+#define INIT_FPE                                                       \
+do                                                                     \
+  {                                                                    \
+    struct kernel_sigaction kact;                                      \
+    memset (&kact, 0, sizeof (kact));                                  \
+    kact.k_sa_handler = catch_fpe;                                     \
+    if (syscall (SYS_rt_sigaction, SIGFPE, &kact, NULL, 8) != 0)       \
+      __asm__ __volatile__ (".long 0");                                        \
+  }                                                                    \
+while (0)
+#endif
 
 #endif /* JAVA_SIGNAL_H */