1 // sh-signal.h - Catch runtime signals and turn them into exceptions 2 // on a SuperH based Linux system. 3 4 /* Copyright (C) 2004, 2006 Free Software Foundation 5 6 This file is part of libgcj. 7 8 This software is copyrighted work licensed under the terms of the 9 Libgcj License. Please consult the file "LIBGCJ_LICENSE" for 10 details. */ 11 12 13 #ifndef JAVA_SIGNAL_H 14 #define JAVA_SIGNAL_H 1 15 16 #include <signal.h> 17 #include <sys/syscall.h> 18 19 #define HANDLE_SEGV 1 20 #define HANDLE_FPE 1 21 22 /* The third parameter to the signal handler points to something with 23 * this structure defined in asm/ucontext.h, but the name clashes with 24 * struct ucontext from sys/ucontext.h so this private copy is used. */ 25 typedef struct _sig_ucontext { 26 unsigned long uc_flags; 27 struct _sig_ucontext *uc_link; 28 stack_t uc_stack; 29 struct sigcontext uc_mcontext; 30 sigset_t uc_sigmask; 31 } sig_ucontext_t; 32 33 #define SIGNAL_HANDLER(_name) \ 34 static void _name (int , siginfo_t *, sig_ucontext_t *_uc) 35 36 #define MAKE_THROW_FRAME(_exception) 37 38 /* For an explanation why we cannot simply use sigaction to 39 install the handlers, see i386-signal.h. */ 40 41 /* We use kernel_old_sigaction here because we're calling the kernel 42 directly rather than via glibc. The sigaction structure that the 43 syscall uses is a different shape from the one in userland and not 44 visible to us in a header file so we define it here. */ 45 46 struct kernel_old_sigaction { 47 void (*k_sa_handler) (int, siginfo_t *, sig_ucontext_t *); 48 unsigned long k_sa_mask; 49 unsigned long k_sa_flags; 50 void (*k_sa_restorer) (void); 51 }; 52 53 #define INIT_SEGV \ 54 do \ 55 { \ 56 struct kernel_old_sigaction kact; \ 57 kact.k_sa_handler = catch_segv; \ 58 kact.k_sa_mask = 0; \ 59 kact.k_sa_flags = SA_SIGINFO | SA_NODEFER; \ 60 syscall (SYS_sigaction, SIGSEGV, &kact, NULL); \ 61 } \ 62 while (0) 63 64 #define INIT_FPE \ 65 do \ 66 { \ 67 struct kernel_old_sigaction kact; \ 68 kact.k_sa_handler = catch_fpe; \ 69 kact.k_sa_mask = 0; \ 70 kact.k_sa_flags = SA_SIGINFO | SA_NODEFER; \ 71 syscall (SYS_sigaction, SIGFPE, &kact, NULL); \ 72 } \ 73 while (0) 74 75 #endif /* JAVA_SIGNAL_H */ 76