diff options
author | Ben Cheng <bccheng@google.com> | 2014-03-25 22:37:19 -0700 |
---|---|---|
committer | Ben Cheng <bccheng@google.com> | 2014-03-25 22:37:19 -0700 |
commit | 1bc5aee63eb72b341f506ad058502cd0361f0d10 (patch) | |
tree | c607e8252f3405424ff15bc2d00aa38dadbb2518 /gcc-4.9/libjava/include/powerpc-signal.h | |
parent | 283a0bf58fcf333c58a2a92c3ebbc41fb9eb1fdb (diff) | |
download | toolchain_gcc-1bc5aee63eb72b341f506ad058502cd0361f0d10.tar.gz toolchain_gcc-1bc5aee63eb72b341f506ad058502cd0361f0d10.tar.bz2 toolchain_gcc-1bc5aee63eb72b341f506ad058502cd0361f0d10.zip |
Initial checkin of GCC 4.9.0 from trunk (r208799).
Change-Id: I48a3c08bb98542aa215912a75f03c0890e497dba
Diffstat (limited to 'gcc-4.9/libjava/include/powerpc-signal.h')
-rw-r--r-- | gcc-4.9/libjava/include/powerpc-signal.h | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/gcc-4.9/libjava/include/powerpc-signal.h b/gcc-4.9/libjava/include/powerpc-signal.h new file mode 100644 index 000000000..9c6ddac37 --- /dev/null +++ b/gcc-4.9/libjava/include/powerpc-signal.h @@ -0,0 +1,113 @@ +// powerpc-signal.h - Catch runtime signals and turn them into exceptions +// on a powerpc based Linux system. + +/* Copyright (C) 2003, 2006 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) + +/* 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) + +/* 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. + 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. + + Note that we explicitly avoid the SA_SIGINFO flag in INIT_SEGV and + INIT_FPE below. Using the ucontext pointer passed as 3rd argument + of a SA_SIGINFO type handler would need complicated backwards + 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; + 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 = 0; \ + if (syscall (SYS_sigaction, SIGSEGV, &kact, NULL) != 0) \ + __asm__ __volatile__ (".long 0"); \ + } \ +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 = 0; \ + 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) + +#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 */ |