mirror of
git://gcc.gnu.org/git/gcc.git
synced 2024-12-25 21:39:31 +08:00
3951562dfa
2000-05-15 Andrew Haley <aph@cygnus.com> * include/ppc-signal.h: New file. From-SVN: r33932
116 lines
3.2 KiB
C++
116 lines
3.2 KiB
C++
// ppc-signal.h - Catch runtime signals and turn them into exceptions.
|
|
|
|
/* Copyright (C) 2000 Free Software Foundation
|
|
|
|
This file is part of libgcj.
|
|
|
|
This software is copyrighted work licensed under the terms of the
|
|
Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
|
|
details. */
|
|
|
|
#ifndef JAVA_SIGNAL_H
|
|
#define JAVA_SIGNAL_H 1
|
|
|
|
#include <signal.h>
|
|
#include <ucontext.h>
|
|
|
|
#define HANDLE_SEGV 1
|
|
#undef HANDLE_FPE
|
|
|
|
#define SIGNAL_HANDLER(_name) \
|
|
__asm ("\t.section\t\".text\"\n" \
|
|
"\t.align 2\n" \
|
|
"_Jv_" #_name ":\n" \
|
|
"\tmr 3, 1\n" \
|
|
"\tb _Jv_stub_" #_name "\n"); \
|
|
extern "C" void _Jv_##_name (int _dummy); \
|
|
extern "C" void _Jv_stub_##_name (char *_sp) \
|
|
|
|
class java::lang::Throwable;
|
|
|
|
// Unwind the stack to the point at which the signal was generated and
|
|
// then throw an exception.
|
|
|
|
#define MAKE_THROW_FRAME(_exception) \
|
|
do \
|
|
{ \
|
|
struct sigcontext_struct *_context \
|
|
= (struct sigcontext_struct *)(_sp + __SIGNAL_FRAMESIZE); \
|
|
long int regs [34]; \
|
|
memcpy (regs, &_context->regs->gpr[0], 32 * sizeof (long int)); \
|
|
regs[32] = _context->regs->nip + sizeof (long int); \
|
|
regs[33] = _context->regs->link; \
|
|
\
|
|
__asm volatile ( \
|
|
"\tmr 31,%0\n" \
|
|
"\tmr 3,%1 # exception to throw\n" \
|
|
"\tlwz 0,128(31) # ip\n" \
|
|
"\tmtlr 0\n" \
|
|
"\tlwz 1,4(31) # previous r1\n" \
|
|
"\tlwz 0,132(31) # previous lr\n" \
|
|
"\tlwz 2,0(1) # previous previous r1\n" \
|
|
"\tstw 0,4(2) # save previous lr\n" \
|
|
"\tlwz 0,0(31)\n" \
|
|
"\tlwz 2,8(31)\n" \
|
|
"\tlwz 4,16(31)\n" \
|
|
"\tlwz 5,20(31)\n" \
|
|
"\tlwz 6,24(31)\n" \
|
|
"\tlwz 7,28(31)\n" \
|
|
"\tlwz 8,32(31)\n" \
|
|
"\tlwz 9,36(31)\n" \
|
|
"\tlwz 10,40(31)\n" \
|
|
"\tlwz 11,44(31)\n" \
|
|
"\tlwz 12,48(31)\n" \
|
|
"\tlwz 13,52(31)\n" \
|
|
"\tlwz 14,56(31)\n" \
|
|
"\tlwz 15,60(31)\n" \
|
|
"\tlwz 16,64(31)\n" \
|
|
"\tlwz 17,68(31)\n" \
|
|
"\tlwz 18,72(31)\n" \
|
|
"\tlwz 19,76(31)\n" \
|
|
"\tlwz 20,80(31)\n" \
|
|
"\tlwz 21,84(31)\n" \
|
|
"\tlwz 22,88(31)\n" \
|
|
"\tlwz 23,92(31)\n" \
|
|
"\tlwz 24,96(31)\n" \
|
|
"\tlwz 25,100(31)\n" \
|
|
"\tlwz 26,104(31)\n" \
|
|
"\tlwz 27,108(31)\n" \
|
|
"\tlwz 28,112(31)\n" \
|
|
"\tlwz 29,116(31)\n" \
|
|
"\tlwz 30,120(31)\n" \
|
|
"\tlwz 31,124(31)\n" \
|
|
"\tb _Jv_ThrowSignal\n" \
|
|
: : "r"(regs), "r"(_exception) \
|
|
: "r31", "r3"); \
|
|
} \
|
|
while (0)
|
|
|
|
|
|
#define INIT_SEGV \
|
|
do \
|
|
{ \
|
|
nullp = new java::lang::NullPointerException (); \
|
|
struct sigaction act; \
|
|
act.sa_handler = _Jv_catch_segv; \
|
|
sigemptyset (&act.sa_mask); \
|
|
act.sa_flags = 0; \
|
|
__sigaction (SIGSEGV, &act, NULL); \
|
|
} \
|
|
while (0)
|
|
|
|
#define INIT_FPE \
|
|
do \
|
|
{ \
|
|
arithexception = new java::lang::ArithmeticException \
|
|
(JvNewStringLatin1 ("/ by zero")); \
|
|
struct sigaction act; \
|
|
act.sa_handler = _Jv_catch_fpe; \
|
|
sigemptyset (&act.sa_mask); \
|
|
act.sa_flags = 0; \
|
|
__sigaction (SIGFPE, &act, NULL); \
|
|
} \
|
|
while (0)
|
|
|
|
#endif /* JAVA_SIGNAL_H */
|