diff options
author | Ulrich Weigand <uweigand@de.ibm.com> | 2002-05-29 18:36:50 +0000 |
---|---|---|
committer | Ulrich Weigand <uweigand@gcc.gnu.org> | 2002-05-29 18:36:50 +0000 |
commit | e793a7140efe7b31614a89f234952ee2e9d23dfc (patch) | |
tree | 7ec728ce21a5f3efd1c4b0acd1f3f695fb6522d9 /libjava/include | |
parent | 2274b31a3c8fb6629a53482962239caf91418e83 (diff) | |
download | gcc-e793a7140efe7b31614a89f234952ee2e9d23dfc.zip gcc-e793a7140efe7b31614a89f234952ee2e9d23dfc.tar.gz gcc-e793a7140efe7b31614a89f234952ee2e9d23dfc.tar.bz2 |
configure.host [...]: Set can_unwind_signal=yes.
* configure.host [s390*-linux*]: Set can_unwind_signal=yes.
* configure.in [s390*-*-linux*]: Do not define HAVE_BACKTRACE.
Set SIGNAL_HANDLER=include/s390-linux.h.
* configure: Regenerate.
* include/s390-linux.h: New file.
From-SVN: r54012
Diffstat (limited to 'libjava/include')
-rw-r--r-- | libjava/include/s390-signal.h | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/libjava/include/s390-signal.h b/libjava/include/s390-signal.h new file mode 100644 index 0000000..44777c0 --- /dev/null +++ b/libjava/include/s390-signal.h @@ -0,0 +1,78 @@ +// s390-signal.h - Catch runtime signals and turn them into exceptions +// on an s390 based Linux system. + +/* Copyright (C) 2002 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 +#undef HANDLE_FPE + +#define SIGNAL_HANDLER(_name) \ +static void _name (int /* _signal */, struct sigcontext _sc) + +#define MAKE_THROW_FRAME(_exception) \ +do \ +{ \ + /* Advance the program counter so that it is after the start of the \ + instruction: the s390 exception handler expects the PSW to point \ + to the instruction after a call. */ \ + _sc.sregs->regs.psw.addr += 2; \ + \ +} \ +while (0) + + +/* For an explanation why we cannot simply use sigaction to + install the handlers, see i386-signal.h. */ + +/* We use old_kernel_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 old_s390_kernel_sigaction { + void (*k_sa_handler) (int, struct sigcontext); + unsigned long k_sa_mask; + unsigned long k_sa_flags; + void (*sa_restorer) (void); +}; + +#define INIT_SEGV \ +do \ + { \ + nullp = new java::lang::NullPointerException (); \ + struct old_s390_kernel_sigaction kact; \ + kact.k_sa_handler = catch_segv; \ + kact.k_sa_mask = 0; \ + kact.k_sa_flags = 0; \ + syscall (SYS_sigaction, SIGSEGV, &kact, NULL); \ + } \ +while (0) + +#define INIT_FPE \ +do \ + { \ + arithexception = new java::lang::ArithmeticException \ + (JvNewStringLatin1 ("/ by zero")); \ + struct old_s390_kernel_sigaction kact; \ + kact.k_sa_handler = catch_fpe; \ + kact.k_sa_mask = 0; \ + kact.k_sa_flags = 0; \ + syscall (SYS_sigaction, SIGFPE, &kact, NULL); \ + } \ +while (0) + +#endif /* JAVA_SIGNAL_H */ + |