aboutsummaryrefslogtreecommitdiff
path: root/libjava/include
diff options
context:
space:
mode:
authordavem <davem@138bc75d-0d04-0410-961f-82ee72b054a4>2002-05-02 17:54:24 +0000
committerdavem <davem@138bc75d-0d04-0410-961f-82ee72b054a4>2002-05-02 17:54:24 +0000
commit3a0bf03e10d692dab13d087a51de948bd2dccb00 (patch)
tree6683db6eb0c740b683fcbfbbd4357eaf26089098 /libjava/include
parent27bcd4c149c032fdb87f1763f590177c1e6e73ec (diff)
2002-05-02 David S. Miller <davem@redhat.com>
PR bootstrap/6525 * include/dwarf2-signal.h (INIT_SEGV, INIT_FPE): Don't use __libc_sigaction on Sparc. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@53055 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libjava/include')
-rw-r--r--libjava/include/dwarf2-signal.h90
1 files changed, 88 insertions, 2 deletions
diff --git a/libjava/include/dwarf2-signal.h b/libjava/include/dwarf2-signal.h
index b7530b2cbf3..21decd5c668 100644
--- a/libjava/include/dwarf2-signal.h
+++ b/libjava/include/dwarf2-signal.h
@@ -122,7 +122,93 @@ do \
while (0)
#endif
-#if !(defined(__ia64__) || defined(__sparc__))
+#if defined(__sparc__)
+#if defined(__arch64__)
+extern "C" {
+ static void __rt_sigreturn_stub(void)
+ {
+ __asm__("mov %0, %%g1\n\t"
+ "ta 0x6d\n\t"
+ : /* no outputs */
+ : "i" (__NR_rt_sigreturn));
+ }
+ struct kernel_sigaction
+ {
+ void (*k_sa_sigaction)(int,siginfo_t *,void *);
+ unsigned long k_sa_flags;
+ void (*k_sa_restorer)(void);
+ sigset_t k_sa_mask;
+ };
+}
+#define INIT_SEGV \
+do \
+ { \
+ nullp = new java::lang::NullPointerException (); \
+ struct kernel_sigaction act; \
+ unsigned long stub = ((unsigned long)&__rt_sigreturn_stub); \
+ act.k_sa_sigaction = _Jv_catch_segv; \
+ sigemptyset (&act.k_sa_mask); \
+ act.k_sa_flags = SA_SIGINFO; \
+ act.k_sa_restorer = NULL; \
+ syscall (SYS_rt_sigaction, SIGSEGV, &act, NULL, \
+ stub - 8, _NSIG / 8); \
+ } \
+while (0)
+
+#define INIT_FPE \
+do \
+ { \
+ arithexception = new java::lang::ArithmeticException \
+ (JvNewStringLatin1 ("/ by zero")); \
+ struct kernel_sigaction act; \
+ unsigned long stub = ((unsigned long)&__rt_sigreturn_stub); \
+ act.k_sa_sigaction = _Jv_catch_fpe; \
+ sigemptyset (&act.k_sa_mask); \
+ act.k_sa_flags = SA_SIGINFO; \
+ act.k_sa_restorer = NULL; \
+ syscall (SYS_rt_sigaction, SIGFPE, &act, NULL, \
+ stub - 8, _NSIG / 8); \
+ } \
+while (0)
+#else /* __arch64__ */
+
+extern "C" {
+ struct kernel_sigaction
+ {
+ void (*k_sa_sigaction)(int,siginfo_t *,void *);
+ unsigned long k_sa_mask, k_sa_flags;
+ void (*k_sa_restorer)(void);
+ };
+}
+
+#define INIT_SEGV \
+do \
+ { \
+ struct kernel_sigaction act; \
+ nullp = new java::lang::NullPointerException (); \
+ act.k_sa_sigaction = _Jv_catch_segv; \
+ act.k_sa_mask = 0; \
+ act.k_sa_flags = SA_SIGINFO; \
+ act.k_sa_restorer = NULL; \
+ syscall (SYS_sigaction, -SIGSEGV, &act, NULL); \
+ } \
+while (0)
+
+#define INIT_FPE \
+do \
+ { \
+ arithexception = new java::lang::ArithmeticException \
+ (JvNewStringLatin1 ("/ by zero")); \
+ struct kernel_sigaction act; \
+ act.k_sa_sigaction = _Jv_catch_fpe; \
+ act.k_sa_mask = 0; \
+ act.k_sa_flags = SA_SIGINFO; \
+ act.k_sa_restorer = NULL; \
+ syscall (SYS_sigaction, -SIGFPE, &act, NULL); \
+ } \
+while (0)
+#endif
+#elif !defined(__ia64__)
#define INIT_SEGV \
do \
{ \
@@ -155,7 +241,7 @@ while (0)
* go away once all systems have pthreads libraries that are
* compiled with full unwind info. */
-#else /* __ia64__ || __sparc__ */
+#else /* __ia64__ */
// FIXME: We shouldn't be using libc_sigaction here, since it should
// be glibc private. But using syscall here would mean translating to