1 // s390-signal.h - Catch runtime signals and turn them into exceptions 2 // on an s390 based Linux system. 3 4 /* Copyright (C) 2002 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 #undef HANDLE_FPE 21 22 #define SIGNAL_HANDLER(_name) \ 23 static void _name (int /* _signal */, struct sigcontext _sc) 24 25 #define MAKE_THROW_FRAME(_exception) \ 26 do \ 27 { \ 28 /* Advance the program counter so that it is after the start of the \ 29 instruction: the s390 exception handler expects the PSW to point \ 30 to the instruction after a call. */ \ 31 _sc.sregs->regs.psw.addr += 2; \ 32 \ 33 } \ 34 while (0) 35 36 37 /* For an explanation why we cannot simply use sigaction to 38 install the handlers, see i386-signal.h. */ 39 40 /* We use old_kernel_sigaction here because we're calling the kernel 41 directly rather than via glibc. The sigaction structure that the 42 syscall uses is a different shape from the one in userland and not 43 visible to us in a header file so we define it here. */ 44 45 struct old_s390_kernel_sigaction { 46 void (*k_sa_handler) (int, struct sigcontext); 47 unsigned long k_sa_mask; 48 unsigned long k_sa_flags; 49 void (*sa_restorer) (void); 50 }; 51 52 #define INIT_SEGV \ 53 do \ 54 { \ 55 struct old_s390_kernel_sigaction kact; \ 56 kact.k_sa_handler = catch_segv; \ 57 kact.k_sa_mask = 0; \ 58 kact.k_sa_flags = 0; \ 59 syscall (SYS_sigaction, SIGSEGV, &kact, NULL); \ 60 } \ 61 while (0) 62 63 #define INIT_FPE \ 64 do \ 65 { \ 66 struct old_s390_kernel_sigaction kact; \ 67 kact.k_sa_handler = catch_fpe; \ 68 kact.k_sa_mask = 0; \ 69 kact.k_sa_flags = 0; \ 70 syscall (SYS_sigaction, SIGFPE, &kact, NULL); \ 71 } \ 72 while (0) 73 74 #endif /* JAVA_SIGNAL_H */ 75 76