diff options
author | Andrew Haley <aph@redhat.com> | 2003-07-30 14:50:02 +0000 |
---|---|---|
committer | Andrew Haley <aph@gcc.gnu.org> | 2003-07-30 14:50:02 +0000 |
commit | cf68fdb19bc8881ab06046f3fd8ac5da49770bc4 (patch) | |
tree | 9928a38a8f4b929addd89297adffc713f7faffce | |
parent | 48b3222dccc9ae95c9c7ae4ceae9b72e664e39a9 (diff) | |
download | gcc-cf68fdb19bc8881ab06046f3fd8ac5da49770bc4.zip gcc-cf68fdb19bc8881ab06046f3fd8ac5da49770bc4.tar.gz gcc-cf68fdb19bc8881ab06046f3fd8ac5da49770bc4.tar.bz2 |
i386-signal.h (RESTORE): New.
2003-07-08 Andrew Haley <aph@redhat.com>
* include/i386-signal.h (RESTORE): New.
(INIT_SEGV): Set restorer.
(INIT_FPE): Likewise.
From-SVN: r69957
-rw-r--r-- | libjava/ChangeLog | 6 | ||||
-rw-r--r-- | libjava/include/i386-signal.h | 43 |
2 files changed, 35 insertions, 14 deletions
diff --git a/libjava/ChangeLog b/libjava/ChangeLog index 51626bd..97ebc37 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,9 @@ +2003-07-08 Andrew Haley <aph@redhat.com> + + * include/i386-signal.h (RESTORE): New. + (INIT_SEGV): Set restorer. + (INIT_FPE): Likewise. + 2003-07-29 Thomas Fitzsimmons <fitzsim@redhat.com> * 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 869a928..280b72e 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 */ |