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 */
 |