@ -31,6 +31,24 @@ int do_strace;
/*
* Utility functions
*/
static const char *
get_comma ( int last )
{
return ( last ) ? " " : " , " ;
}
/*
* Prints out raw parameter using given format . Caller needs
* to do byte swapping if needed .
*/
static void
print_raw_param ( const char * fmt , abi_long param , int last )
{
char format [ 64 ] ;
( void ) snprintf ( format , sizeof ( format ) , " %s%s " , fmt , get_comma ( last ) ) ;
gemu_log ( format , param ) ;
}
static void print_sysctl ( const struct syscallname * name , abi_long arg1 ,
abi_long arg2 , abi_long arg3 , abi_long arg4 , abi_long arg5 ,
@ -239,3 +257,82 @@ void print_openbsd_syscall_ret(int num, abi_long ret)
print_syscall_ret ( num , ret , openbsd_scnames , ARRAY_SIZE ( openbsd_scnames ) ) ;
}
static void
print_signal ( abi_ulong arg , int last )
{
const char * signal_name = NULL ;
switch ( arg ) {
case TARGET_SIGHUP :
signal_name = " SIGHUP " ;
break ;
case TARGET_SIGINT :
signal_name = " SIGINT " ;
break ;
case TARGET_SIGQUIT :
signal_name = " SIGQUIT " ;
break ;
case TARGET_SIGILL :
signal_name = " SIGILL " ;
break ;
case TARGET_SIGABRT :
signal_name = " SIGABRT " ;
break ;
case TARGET_SIGFPE :
signal_name = " SIGFPE " ;
break ;
case TARGET_SIGKILL :
signal_name = " SIGKILL " ;
break ;
case TARGET_SIGSEGV :
signal_name = " SIGSEGV " ;
break ;
case TARGET_SIGPIPE :
signal_name = " SIGPIPE " ;
break ;
case TARGET_SIGALRM :
signal_name = " SIGALRM " ;
break ;
case TARGET_SIGTERM :
signal_name = " SIGTERM " ;
break ;
case TARGET_SIGUSR1 :
signal_name = " SIGUSR1 " ;
break ;
case TARGET_SIGUSR2 :
signal_name = " SIGUSR2 " ;
break ;
case TARGET_SIGCHLD :
signal_name = " SIGCHLD " ;
break ;
case TARGET_SIGCONT :
signal_name = " SIGCONT " ;
break ;
case TARGET_SIGSTOP :
signal_name = " SIGSTOP " ;
break ;
case TARGET_SIGTTIN :
signal_name = " SIGTTIN " ;
break ;
case TARGET_SIGTTOU :
signal_name = " SIGTTOU " ;
break ;
}
if ( signal_name = = NULL ) {
print_raw_param ( " %ld " , arg , last ) ;
return ;
}
gemu_log ( " %s%s " , signal_name , get_comma ( last ) ) ;
}
void print_taken_signal ( int target_signum , const target_siginfo_t * tinfo )
{
/*
* Print the strace output for a signal being taken :
* - - - SIGSEGV { si_signo = SIGSEGV , si_code = SI_KERNEL , si_addr = 0 } - - -
*/
gemu_log ( " %d " , getpid ( ) ) ;
gemu_log ( " --- " ) ;
print_signal ( target_signum , 1 ) ;
gemu_log ( " --- \n " ) ;
}