diff options
Diffstat (limited to 'libjava')
-rw-r--r-- | libjava/ChangeLog | 6 | ||||
-rw-r--r-- | libjava/include/powerpc-signal.h | 63 |
2 files changed, 50 insertions, 19 deletions
diff --git a/libjava/ChangeLog b/libjava/ChangeLog index f3038da..ec29318 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,9 @@ +2004-02-10 Alan Modra <amodra@bigpond.net.au> + + * include/powerpc-signal.h: Revert 2004-01-21 change. + (INIT_SEGV, INIT_FPE): Provide powerpc64 versions. Check return + from syscall for ppc32 versions. + 2004-02-08 Per Bothner <per@bothner.com> * java/nio/ByteBuffer.java (shiftDown): New helper method. diff --git a/libjava/include/powerpc-signal.h b/libjava/include/powerpc-signal.h index 386fb18..0d5a662 100644 --- a/libjava/include/powerpc-signal.h +++ b/libjava/include/powerpc-signal.h @@ -11,17 +11,15 @@ details. */ #ifndef JAVA_SIGNAL_H -# define JAVA_SIGNAL_H 1 +#define JAVA_SIGNAL_H 1 -# ifndef __powerpc64__ +#include <signal.h> +#include <sys/syscall.h> -# include <signal.h> -# include <sys/syscall.h> +#define HANDLE_SEGV 1 +#undef HANDLE_FPE -# define HANDLE_SEGV 1 -# undef HANDLE_FPE - -# define SIGNAL_HANDLER(_name) \ +#define SIGNAL_HANDLER(_name) \ static void _name (int /* _signal */, struct sigcontext *_sc) /* PPC either leaves PC pointing at a faulting instruction or the @@ -29,7 +27,7 @@ details. */ the former, so we adjust the saved PC to point to the following instruction. This is what the handler in libgcc expects. */ -# define MAKE_THROW_FRAME(_exception) \ +#define MAKE_THROW_FRAME(_exception) \ do \ { \ _sc->regs->nip += 4; \ @@ -53,6 +51,7 @@ while (0) compatibility hacks in MAKE_THROW_FRAME, as the ucontext layout on PPC changed during the 2.5 kernel series. */ +#ifndef __powerpc64__ struct kernel_old_sigaction { void (*k_sa_handler) (int, struct sigcontext *); unsigned long k_sa_mask; @@ -60,35 +59,61 @@ struct kernel_old_sigaction { void (*k_sa_restorer) (void); }; -# define INIT_SEGV \ +#define INIT_SEGV \ do \ { \ struct kernel_old_sigaction kact; \ kact.k_sa_handler = catch_segv; \ kact.k_sa_mask = 0; \ kact.k_sa_flags = 0; \ - syscall (SYS_sigaction, SIGSEGV, &kact, NULL); \ + if (syscall (SYS_sigaction, SIGSEGV, &kact, NULL) != 0) \ + __asm__ __volatile__ (".long 0"); \ } \ while (0) -# define INIT_FPE \ +#define INIT_FPE \ do \ { \ struct kernel_old_sigaction kact; \ kact.k_sa_handler = catch_fpe; \ kact.k_sa_mask = 0; \ kact.k_sa_flags = 0; \ - syscall (SYS_sigaction, SIGFPE, &kact, NULL); \ + if (syscall (SYS_sigaction, SIGFPE, &kact, NULL) != 0) \ + __asm__ __volatile__ (".long 0"); \ } \ while (0) -# else +#else /* powerpc64 */ + +struct kernel_sigaction +{ + void (*k_sa_handler) (int, struct sigcontext *); + unsigned long k_sa_flags; + void (*k_sa_restorer)(void); + unsigned long k_sa_mask; +}; -# undef HANDLE_SEGV -# undef HANDLE_FPE +#define INIT_SEGV \ +do \ + { \ + struct kernel_sigaction kact; \ + memset (&kact, 0, sizeof (kact)); \ + kact.k_sa_handler = catch_segv; \ + if (syscall (SYS_rt_sigaction, SIGSEGV, &kact, NULL, 8) != 0) \ + __asm__ __volatile__ (".long 0"); \ + } \ +while (0) -# define INIT_SEGV do {} while (0) -# define INIT_FPE do {} while (0) -# endif +#define INIT_FPE \ +do \ + { \ + struct kernel_sigaction kact; \ + memset (&kact, 0, sizeof (kact)); \ + kact.k_sa_handler = catch_fpe; \ + if (syscall (SYS_rt_sigaction, SIGFPE, &kact, NULL, 8) != 0) \ + __asm__ __volatile__ (".long 0"); \ + } \ +while (0) +#endif #endif /* JAVA_SIGNAL_H */ |