diff options
author | David Daney <ddaney@avtrex.com> | 2003-10-22 16:35:17 +0000 |
---|---|---|
committer | David Daney <daney@gcc.gnu.org> | 2003-10-22 16:35:17 +0000 |
commit | 1322946805597f3b80f585da69c3447a79a37de0 (patch) | |
tree | d171c045404a295d18ee746a18e6fc270c642ae0 /libjava/include/mips-signal.h | |
parent | b9404c99ecb25b028b14af481f19257d36b6d716 (diff) | |
download | gcc-1322946805597f3b80f585da69c3447a79a37de0.zip gcc-1322946805597f3b80f585da69c3447a79a37de0.tar.gz gcc-1322946805597f3b80f585da69c3447a79a37de0.tar.bz2 |
mips-signal.h: New file.
2003-10-22 David Daney <ddaney@avtrex.com)
* include/mips-signal.h: New file.
* sysdep/dwarf2-backtrace.cc: New file.
* sysdep/mips: New directory.
* sysdep/mips/locks.h: New file.
* Makefile.am(extra_cc_files): New, to allow extra c++ files to be
added to libgcj.
(extra_cc_source_files): Ditto.
* configure.host(disable_dladdr): New shell variable passed to
configure.
(mips*-*-linux*): sysdeps_dir=mips,
can_unwind_signal=yes, disable_dladdr=yes, use -mxgot.
(mipsel*-linux* | mipsisa32el*-linux*): Enable hash synchronization.
* configure.in:(mips*-*-linux*): Use sysdep/dwarf2-backtrace.cc to
generate backtrace, and include/mips-signal.h as SIGNAL_HANDLER
(HAVE_DLADDR): Make it depend on setting of disable_dladdr.
(EXTRA_CC_FILES): New, to support conditional addition of
sysdep/dwarf2-backtrace.cc.
* configure: Regenerated.
* Makefile.in: Regenerated.
* gcj/Makefile.in: Regenerated.
* include/config.h.in: Regenerated.
* include/Makefile.in: Regenerated.
* testsuite/Makefile.in: Regenerated.
From-SVN: r72808
Diffstat (limited to 'libjava/include/mips-signal.h')
-rw-r--r-- | libjava/include/mips-signal.h | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/libjava/include/mips-signal.h b/libjava/include/mips-signal.h new file mode 100644 index 0000000..6728197 --- /dev/null +++ b/libjava/include/mips-signal.h @@ -0,0 +1,89 @@ +// mips-signal.h - Catch runtime signals and turn them into exceptions +// on an mips based Linux system. + +/* Copyright (C) 1998, 1999, 2001, 2002, 2003 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. */ + +/* Adapted from sparc-signal.h and powerpc-signal.h + by David Daney <ddaney@avtrex.com> */ + +#ifndef JAVA_SIGNAL_H +#define JAVA_SIGNAL_H 1 + +#include <signal.h> +#include <unistd.h> +#include <sys/syscall.h> +/* #include <asm/ucontext.h> structures we use are here but clash with + sys/ucontext.h included by java-signal.h from prims.cc */ + +#define HANDLE_SEGV 1 +#undef HANDLE_FPE + +/* 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; + +/* We use 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. + Additionally we want a proper prototype for the handler function + with the struct sigcontext pointer passed by the kernel as the 2nd + argument, which isn't there in userland headers. */ + +struct kernel_sigaction { + unsigned int k_sa_flags; + void (*k_sa_handler) (int, siginfo_t *, sig_ucontext_t *); + sigset_t k_sa_mask; + void (*k_sa_restorer)(void); + int k_sa_resv[1]; /* reserved */ +}; + + + +#define SIGNAL_HANDLER(_name) \ +static void _name (int _dummy, siginfo_t *_info, sig_ucontext_t *_arg) + +/* + * MIPS leaves pc pointing at the faulting instruction, but the + * unwinder expects it to point to the following instruction + */ + +#define MAKE_THROW_FRAME(_exception) \ +do \ +{ \ + _arg->uc_mcontext.sc_pc += 4; \ + (void)_dummy; \ + (void)_info; \ +} \ +while (0) + +/* For an explanation why we cannot simply use sigaction to + install the handlers, see i386-signal.h. */ + +#define INIT_SEGV \ +do \ + { \ + struct kernel_sigaction kact; \ + kact.k_sa_handler = catch_segv; \ + kact.k_sa_flags = SA_SIGINFO | SA_NODEFER; \ + sigemptyset (&kact.k_sa_mask); \ + syscall (SYS_sigaction, SIGSEGV, &kact, NULL); \ + } \ +while (0) + + +#endif /* JAVA_SIGNAL_H */ + |