From e9a82df9b0ff6f58b78c2a2093fe1254b0a87467 Mon Sep 17 00:00:00 2001
From: kkojima <kkojima@138bc75d-0d04-0410-961f-82ee72b054a4>
Date: Thu, 21 Oct 2004 10:44:39 +0000
Subject: [PATCH] 	* configure.ac (SIGNAL_HANDLER): Set to
 include/sh-signal.h 	for all sh*-*-linux* targets. 	* configure:
 Regenerate. 	* include/sh-signal.h: New file.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@89368 138bc75d-0d04-0410-961f-82ee72b054a4
---
 libjava/ChangeLog           |  7 +++
 libjava/configure           |  4 +-
 libjava/configure.ac        |  4 +-
 libjava/include/sh-signal.h | 96 +++++++++++++++++++++++++++++++++++++
 4 files changed, 107 insertions(+), 4 deletions(-)
 create mode 100644 libjava/include/sh-signal.h

diff --git a/libjava/ChangeLog b/libjava/ChangeLog
index 6feb54e0ff1c..2bad1d497502 100644
--- a/libjava/ChangeLog
+++ b/libjava/ChangeLog
@@ -1,3 +1,10 @@
+2004-10-21  Kaz Kojima  <kkojima@gcc.gnu.org>
+
+	* configure.ac (SIGNAL_HANDLER): Set to include/sh-signal.h
+	for all sh*-*-linux* targets.
+	* configure: Regenerate.
+	* include/sh-signal.h: New file.
+
 2004-10-21  Kazuhiro Inaoka  <inaoka.kazuhiro@renesas.com>
 
 	* java/lang/ieeefp.h: Add m32r support.
diff --git a/libjava/configure b/libjava/configure
index 050c5281a71c..d3ce0509d0fb 100755
--- a/libjava/configure
+++ b/libjava/configure
@@ -16211,8 +16211,8 @@ case "${host}" in
  sparc*-*-linux*)
     SIGNAL_HANDLER=include/dwarf2-signal.h
     ;;
- sh-*-linux* | sh[34]*-*-linux*)
-    SIGNAL_HANDLER=include/dwarf2-signal.h
+ sh*-*-linux*)
+    SIGNAL_HANDLER=include/sh-signal.h
     ;;
  *mingw*)
     SIGNAL_HANDLER=include/win32-signal.h
diff --git a/libjava/configure.ac b/libjava/configure.ac
index c0282afda5ba..80775ab6219a 100644
--- a/libjava/configure.ac
+++ b/libjava/configure.ac
@@ -1310,8 +1310,8 @@ case "${host}" in
  sparc*-*-linux*)
     SIGNAL_HANDLER=include/dwarf2-signal.h
     ;;
- sh-*-linux* | sh[[34]]*-*-linux*)
-    SIGNAL_HANDLER=include/dwarf2-signal.h
+ sh*-*-linux*)
+    SIGNAL_HANDLER=include/sh-signal.h
     ;;
  *mingw*)
     SIGNAL_HANDLER=include/win32-signal.h
diff --git a/libjava/include/sh-signal.h b/libjava/include/sh-signal.h
new file mode 100644
index 000000000000..9c76b5716beb
--- /dev/null
+++ b/libjava/include/sh-signal.h
@@ -0,0 +1,96 @@
+// sh-signal.h - Catch runtime signals and turn them into exceptions
+// on a SuperH based Linux system.
+
+/* Copyright (C) 2004  Free Software Foundation
+
+   This file is part of libgcj.
+
+This software is copyrighted work licensed under the terms of the
+Libgcj License.  Please consult the file "LIBGCJ_LICENSE" for
+details.  */
+
+
+#ifndef JAVA_SIGNAL_H
+#define JAVA_SIGNAL_H 1
+
+#include <signal.h>
+#include <sys/syscall.h>
+
+#define HANDLE_SEGV 1
+#define HANDLE_FPE 1
+
+/* The third parameter to the signal handler points to something with
+ * this structure defined in asm/ucontext.h, but the name clashes with
+ * struct ucontext from sys/ucontext.h so this private copy is used.  */
+typedef struct _sig_ucontext {
+  unsigned long uc_flags;
+  struct _sig_ucontext *uc_link;
+  stack_t uc_stack;
+  struct sigcontext uc_mcontext;
+  sigset_t uc_sigmask;
+} sig_ucontext_t;
+
+#define SIGNAL_HANDLER(_name)						\
+  static void _name (int , siginfo_t *, sig_ucontext_t *_uc)
+
+/* SH 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.  */
+
+#ifdef __SH5__
+#define MAKE_THROW_FRAME(_exception)					\
+do									\
+  {									\
+    volatile struct sigcontext *_sc = &_uc->uc_mcontext;		\ 
+    _sc->sc_pc += 4;							\
+  }									\
+while (0)
+#else
+#define MAKE_THROW_FRAME(_exception)					\
+do									\
+  {									\
+    volatile struct sigcontext *_sc = &_uc->uc_mcontext;		\ 
+    _sc->sc_pc += 2;							\
+  }									\
+while (0)
+#endif
+
+/* For an explanation why we cannot simply use sigaction to
+   install the handlers, see i386-signal.h.  */
+
+/* We use kernel_old_sigaction here because we're calling the kernel
+   directly rather than via glibc.  The sigaction structure that the
+   syscall uses is a different shape from the one in userland and not
+   visible to us in a header file so we define it here.  */
+
+struct kernel_old_sigaction {
+  void (*k_sa_handler) (int, siginfo_t *, sig_ucontext_t *);
+  unsigned long k_sa_mask;
+  unsigned long k_sa_flags;
+  void (*k_sa_restorer) (void);
+};
+
+#define INIT_SEGV							\
+do									\
+  {									\
+    struct kernel_old_sigaction kact;					\
+    kact.k_sa_handler = catch_segv;					\
+    kact.k_sa_mask = 0;							\
+    kact.k_sa_flags = SA_SIGINFO | SA_NODEFER;				\
+    syscall (SYS_sigaction, SIGSEGV, &kact, NULL);			\
+  }									\
+while (0)  
+
+#define INIT_FPE							\
+do									\
+  {									\
+    struct kernel_old_sigaction kact;					\
+    kact.k_sa_handler = catch_fpe;					\
+    kact.k_sa_mask = 0;							\
+    kact.k_sa_flags = SA_SIGINFO | SA_NODEFER;				\
+    syscall (SYS_sigaction, SIGFPE, &kact, NULL);			\
+  }									\
+while (0)
+
+#endif /* JAVA_SIGNAL_H */
-- 
GitLab