java-interp.h (breakpoint_at): Declare.
[gcc.git] / libjava / include / powerpc-signal.h
index 00a5a6dfb8f5a7366de8fe0d4ace03ea64b9dba4..9c6ddac3700b782bbdf5c1c234fec4ffd05aa17d 100644 (file)
@@ -1,7 +1,7 @@
 // powerpc-signal.h - Catch runtime signals and turn them into exceptions
 // on a powerpc based Linux system.
 
-/* Copyright (C) 2003  Free Software Foundation
+/* Copyright (C) 2003, 2006  Free Software Foundation
 
    This file is part of libgcj.
 
@@ -11,29 +11,23 @@ details.  */
 
 
 #ifndef JAVA_SIGNAL_H
-# define JAVA_SIGNAL_H 1
+#define JAVA_SIGNAL_H 1
 
-# 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
-   following instruction, depending on the signal.  SEGV always does
-   the former, so we adjust the saved PC to point to the following
-   instruction. This is what the handler in libgcc expects.  */
+/* MD_FALLBACK_FRAME_STATE_FOR takes care of special casing PC
+   before the faulting instruction, so we don't need to do anything
+   here.  */
+
+#define MAKE_THROW_FRAME(_exception)
 
-# define MAKE_THROW_FRAME(_exception)                                  \
-do                                                                     \
-  {                                                                    \
-    _sc->regs->nip += 4;                                               \
-  }                                                                    \
-while (0)
-  
 /* For an explanation why we cannot simply use sigaction to
    install the handlers, see i386-signal.h.  */
 
@@ -51,6 +45,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;
@@ -58,30 +53,61 @@ struct kernel_old_sigaction {
   void (*k_sa_restorer) (void);
 };
 
-# define INIT_SEGV                                                     \
+#define INIT_SEGV                                                      \
 do                                                                     \
   {                                                                    \
-    nullp = new java::lang::NullPointerException ();                   \
     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                                                                     \
   {                                                                    \
-    arithexception = new java::lang::ArithmeticException               \
-      (JvNewStringLatin1 ("/ by zero"));                               \
     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 /* 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;
+};
+
+#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)  
 
-#endif /* JAVA_SIGNAL_H */
+#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 */