#ifndef JAVA_SIGNAL_H
#define JAVA_SIGNAL_H 1
#include <signal.h>
#include <sys/syscall.h>
#define HANDLE_SEGV 1
#undef HANDLE_FPE
#define SIGNAL_HANDLER(_name) \
static void _Jv_##_name (int, siginfo_t *_sip, void *_p)
class java::lang::Throwable;
#ifdef __alpha__
#define MAKE_THROW_FRAME(_exception) \
do \
{ \
\
struct sigcontext *_sc = (struct sigcontext *)_p; \
_sc->sc_pc += 4; \
} \
while (0)
#elif defined(__ia64__)
#define MAKE_THROW_FRAME(_exception) \
do \
{ \
\
\
struct sigcontext *_sc = (struct sigcontext *)_p; \
_sc->sc_ip++; \
} \
while (0)
#elif defined(__sparc__)
#if !defined(__arch64__)
#define MAKE_THROW_FRAME(_exception) \
do \
{ \
\
struct sig_regs { \
unsigned int psr, pc, npc, y, u_regs[16]; \
} *regp; \
unsigned int insn; \
__asm__ __volatile__("ld [%%i7 + 8], %0" : "=r" (insn)); \
\
if (insn == 0x821020d8) \
regp = (struct sig_regs *) _sip; \
else \
\
regp = (struct sig_regs *) (_sip + 1); \
regp->pc = ((regp->pc + 4) - 8); \
} \
while (0)
#else
#define MAKE_THROW_FRAME(_exception) \
do \
{ \
\
struct pt_regs { \
unsigned long u_regs[16]; \
unsigned long tstate, tpc, tnpc; \
unsigned int y, fprs; \
} *regp = (struct pt_regs *) (_sip + 1); \
regp->tpc = ((regp->tpc + 4) - 8); \
} \
while (0)
#endif
#else
#define MAKE_THROW_FRAME(_exception) \
do \
{ \
(void)_p; \
} \
while (0)
#endif
#if defined(__sparc__)
#if defined(__arch64__)
extern "C" {
static void __rt_sigreturn_stub(void)
{
__asm__("mov %0, %%g1\n\t"
"ta 0x6d\n\t"
:
: "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 \
{ \
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 \
{ \
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
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; \
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 \
{ \
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 \
{ \
struct sigaction act; \
act.sa_sigaction = _Jv_catch_segv; \
sigemptyset (&act.sa_mask); \
act.sa_flags = SA_SIGINFO; \
syscall (SYS_sigaction, SIGSEGV, &act, NULL); \
} \
while (0)
#define INIT_FPE \
do \
{ \
struct sigaction act; \
act.sa_sigaction = _Jv_catch_fpe; \
sigemptyset (&act.sa_mask); \
act.sa_flags = SA_SIGINFO; \
syscall (SYS_sigaction, SIGFPE, &act, NULL); \
} \
while (0)
#else
#define INIT_SEGV \
do \
{ \
struct sigaction act; \
act.sa_sigaction = _Jv_catch_segv; \
sigemptyset (&act.sa_mask); \
act.sa_flags = SA_SIGINFO; \
sigaction (SIGSEGV, &act, NULL); \
} \
while (0)
#define INIT_FPE \
do \
{ \
struct sigaction act; \
act.sa_sigaction = _Jv_catch_fpe; \
sigemptyset (&act.sa_mask); \
act.sa_flags = SA_SIGINFO; \
sigaction (SIGFPE, &act, NULL); \
} \
while (0)
#endif
#endif