diff options
author | kkojima <kkojima@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-10-21 10:44:39 +0000 |
---|---|---|
committer | kkojima <kkojima@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-10-21 10:44:39 +0000 |
commit | e9a82df9b0ff6f58b78c2a2093fe1254b0a87467 (patch) | |
tree | b1ec917af2424cc72dd6332067c5e81ea53eb3d6 /libjava/include/sh-signal.h | |
parent | b217af0305d67309320d6d3bd951382af75dd061 (diff) | |
download | gcc-e9a82df9b0ff6f58b78c2a2093fe1254b0a87467.tar.gz |
* 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
Diffstat (limited to 'libjava/include/sh-signal.h')
-rw-r--r-- | libjava/include/sh-signal.h | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/libjava/include/sh-signal.h b/libjava/include/sh-signal.h new file mode 100644 index 00000000000..9c76b5716be --- /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 */ |