diff options
author | amodra <amodra@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-02-10 13:27:43 +0000 |
---|---|---|
committer | amodra <amodra@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-02-10 13:27:43 +0000 |
commit | 39d21acd0ed3610567de0e46023ee2b9ad58b148 (patch) | |
tree | 9cbd974e4e220d597f62a4a13f920675f34ef268 | |
parent | 3bb41885ada059987ab4ca46e9f552324fff8bd8 (diff) | |
download | gcc-39d21acd0ed3610567de0e46023ee2b9ad58b148.tar.gz |
* config/rs6000/linux64.h (MD_FALLBACK_FRAME_STATE_FOR): Don't
bump retaddr here.
* include/powerpc-signal.h: Revert 2004-01-21 change.
(INIT_SEGV, INIT_FPE): Provide powerpc64 versions. Check return
from syscall for ppc32 versions.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@77601 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/config/rs6000/linux64.h | 8 | ||||
-rw-r--r-- | libjava/ChangeLog | 6 | ||||
-rw-r--r-- | libjava/include/powerpc-signal.h | 63 |
4 files changed, 56 insertions, 26 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index babd5fdb47d..1f6b7482152 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2004-02-10 Alan Modra <amodra@bigpond.net.au> + + * config/rs6000/linux64.h (MD_FALLBACK_FRAME_STATE_FOR): Don't + bump retaddr here. + 2004-02-10 Paolo Bonzini <bonzini@gnu.org> * rtl.h (schedule_insns, schedule_ebbs, fix_sched_param, diff --git a/gcc/config/rs6000/linux64.h b/gcc/config/rs6000/linux64.h index ae807ba3432..44f7cb72a55 100644 --- a/gcc/config/rs6000/linux64.h +++ b/gcc/config/rs6000/linux64.h @@ -643,15 +643,9 @@ enum { SIGNAL_FRAMESIZE = 64 }; (FS)->regs.reg[LINK_REGISTER_REGNUM].loc.offset \ = (long)&(sc_->regs->link) - new_cfa_; \ \ - /* The unwinder expects the IP to point to the following insn, \ - whereas the kernel returns the address of the actual \ - faulting insn. We store NIP+4 in an unused register slot to \ - get the same result for multiple evaluation of the same signal \ - frame. */ \ - sc_->regs->gpr[47] = sc_->regs->nip + 4; \ (FS)->regs.reg[ARG_POINTER_REGNUM].how = REG_SAVED_OFFSET; \ (FS)->regs.reg[ARG_POINTER_REGNUM].loc.offset \ - = (long)&(sc_->regs->gpr[47]) - new_cfa_; \ + = (long)&(sc_->regs->nip) - new_cfa_; \ (FS)->retaddr_column = ARG_POINTER_REGNUM; \ goto SUCCESS; \ } while (0) diff --git a/libjava/ChangeLog b/libjava/ChangeLog index f3038dac87b..ec293183985 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 386fb18291a..0d5a6627fe7 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 */ |