mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			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 */
 |