aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Haley <aph@redhat.com>2003-07-30 14:50:02 +0000
committerAndrew Haley <aph@gcc.gnu.org>2003-07-30 14:50:02 +0000
commitcf68fdb19bc8881ab06046f3fd8ac5da49770bc4 (patch)
tree9928a38a8f4b929addd89297adffc713f7faffce
parent48b3222dccc9ae95c9c7ae4ceae9b72e664e39a9 (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--libjava/include/i386-signal.h43
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 */