From cf68fdb19bc8881ab06046f3fd8ac5da49770bc4 Mon Sep 17 00:00:00 2001 From: Andrew Haley Date: Wed, 30 Jul 2003 14:50:02 +0000 Subject: [PATCH] i386-signal.h (RESTORE): New. 2003-07-08 Andrew Haley * include/i386-signal.h (RESTORE): New. (INIT_SEGV): Set restorer. (INIT_FPE): Likewise. From-SVN: r69957 --- libjava/ChangeLog | 6 +++++ libjava/include/i386-signal.h | 43 +++++++++++++++++++++++------------ 2 files changed, 35 insertions(+), 14 deletions(-) diff --git a/libjava/ChangeLog b/libjava/ChangeLog index 51626bd0cbb..97ebc3797f0 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,9 @@ +2003-07-08 Andrew Haley + + * include/i386-signal.h (RESTORE): New. + (INIT_SEGV): Set restorer. + (INIT_FPE): Likewise. + 2003-07-29 Thomas Fitzsimmons * gnu/java/awt/peer/gtk/GtkButtonPeer.java: Call getName rather diff --git a/libjava/include/i386-signal.h b/libjava/include/i386-signal.h index 869a928332c..280b72e5586 100644 --- a/libjava/include/i386-signal.h +++ b/libjava/include/i386-signal.h @@ -108,26 +108,44 @@ struct old_i386_kernel_sigaction { void (*sa_restorer) (void); }; +#define RESTORE(name, syscall) RESTORE2 (name, syscall) +# define RESTORE2(name, syscall) \ +asm \ + ( \ + ".text\n" \ + ".byte 0 # Yes, this really is necessary\n" \ + " .align 8\n" \ + "__" #name ":\n" \ + " popl %eax\n" \ + " movl $" #syscall ", %eax\n" \ + " int $0x80" \ + ); + +RESTORE (restore, __NR_sigreturn) +static void restore (void) asm ("__restore"); + #define INIT_SEGV \ do \ { \ struct old_i386_kernel_sigaction kact; \ kact.k_sa_handler = catch_segv; \ kact.k_sa_mask = 0; \ - kact.k_sa_flags = 0; \ + kact.k_sa_flags = 0x4000000; \ + kact.sa_restorer = restore; \ syscall (SYS_sigaction, SIGSEGV, &kact, NULL); \ } \ while (0) -#define INIT_FPE \ -do \ - { \ - struct old_i386_kernel_sigaction kact; \ - kact.k_sa_handler = catch_fpe; \ - kact.k_sa_mask = 0; \ - kact.k_sa_flags = 0; \ - syscall (SYS_sigaction, SIGFPE, &kact, NULL); \ - } \ +#define INIT_FPE \ +do \ + { \ + struct old_i386_kernel_sigaction kact; \ + kact.k_sa_handler = catch_fpe; \ + kact.k_sa_mask = 0; \ + kact.k_sa_flags = 0x4000000; \ + kact.sa_restorer = restore; \ + syscall (SYS_sigaction, SIGFPE, &kact, NULL); \ + } \ while (0) /* You might wonder why we use syscall(SYS_sigaction) in INIT_FPE @@ -144,10 +162,7 @@ while (0) * Also, there is at the present time no unwind info in the * linuxthreads library's signal handlers and so we can't unwind - * through them anyway. - - * Finally, the code that glibc uses to return from a signal handler - * is subject to change. */ + * through them anyway. */ #endif /* JAVA_SIGNAL_H */