mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			114 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			114 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C
		
	
	
	
| // powerpc-signal.h - Catch runtime signals and turn them into exceptions
 | |
| // on a powerpc based Linux system.
 | |
| 
 | |
| /* Copyright (C) 2003, 2006  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 <sys/syscall.h>
 | |
| 
 | |
| #define HANDLE_SEGV 1
 | |
| #undef HANDLE_FPE
 | |
| 
 | |
| #define SIGNAL_HANDLER(_name)						\
 | |
|   static void _name (int /* _signal */, struct sigcontext *_sc)
 | |
| 
 | |
| /* MD_FALLBACK_FRAME_STATE_FOR takes care of special casing PC
 | |
|    before the faulting instruction, so we don't need to do anything
 | |
|    here.  */
 | |
| 
 | |
| #define MAKE_THROW_FRAME(_exception)
 | |
| 
 | |
| /* For an explanation why we cannot simply use sigaction to
 | |
|    install the handlers, see i386-signal.h.  */
 | |
| 
 | |
| /* We use kernel_old_sigaction here because we're calling the kernel
 | |
|    directly rather than via glibc. The sigaction structure that the
 | |
|    syscall uses is a different shape from the one in userland and not
 | |
|    visible to us in a header file so we define it here.
 | |
|    Additionally we want a proper prototype for the handler function
 | |
|    with the struct sigcontext pointer passed by the kernel as the 2nd
 | |
|    argument, which isn't there in userland headers.
 | |
| 
 | |
|    Note that we explicitly avoid the SA_SIGINFO flag in INIT_SEGV and
 | |
|    INIT_FPE below. Using the ucontext pointer passed as 3rd argument
 | |
|    of a SA_SIGINFO type handler would need complicated backwards
 | |
|    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;
 | |
|   unsigned long k_sa_flags;
 | |
|   void (*k_sa_restorer) (void);
 | |
| };
 | |
| 
 | |
| #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;						\
 | |
|     if (syscall (SYS_sigaction, SIGSEGV, &kact, NULL) != 0)		\
 | |
|       __asm__ __volatile__ (".long 0");					\
 | |
|   }									\
 | |
| while (0)  
 | |
| 
 | |
| #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;						\
 | |
|     if (syscall (SYS_sigaction, SIGFPE, &kact, NULL) != 0)		\
 | |
|       __asm__ __volatile__ (".long 0");					\
 | |
|   }									\
 | |
| while (0)
 | |
| 
 | |
| #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;
 | |
| };
 | |
| 
 | |
| #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_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 */
 |