2009-11-24 16:56:45 -05:00
# undef TRACE_SYSTEM
# define TRACE_SYSTEM signal
# if !defined(_TRACE_SIGNAL_H) || defined(TRACE_HEADER_MULTI_READ)
# define _TRACE_SIGNAL_H
# include <linux/signal.h>
# include <linux/sched.h>
# include <linux/tracepoint.h>
# define TP_STORE_SIGINFO(__entry, info) \
do { \
2010-06-03 23:34:09 +02:00
if ( info = = SEND_SIG_NOINFO | | \
info = = SEND_SIG_FORCED ) { \
2009-11-24 16:56:45 -05:00
__entry - > errno = 0 ; \
__entry - > code = SI_USER ; \
} else if ( info = = SEND_SIG_PRIV ) { \
__entry - > errno = 0 ; \
__entry - > code = SI_KERNEL ; \
} else { \
__entry - > errno = info - > si_errno ; \
__entry - > code = info - > si_code ; \
} \
} while ( 0 )
2011-11-22 21:13:48 +01:00
# ifndef TRACE_HEADER_MULTI_READ
enum {
TRACE_SIGNAL_DELIVERED ,
TRACE_SIGNAL_IGNORED ,
TRACE_SIGNAL_ALREADY_PENDING ,
TRACE_SIGNAL_OVERFLOW_FAIL ,
TRACE_SIGNAL_LOSE_INFO ,
} ;
# endif
2009-11-24 16:56:45 -05:00
/**
* signal_generate - called when a signal is generated
* @ sig : signal number
* @ info : pointer to struct siginfo
* @ task : pointer to struct task_struct
2011-11-22 21:13:48 +01:00
* @ group : shared or private
* @ result : TRACE_SIGNAL_ *
2009-11-24 16:56:45 -05:00
*
* Current process sends a ' sig ' signal to ' task ' process with
* ' info ' siginfo . If ' info ' is SEND_SIG_NOINFO or SEND_SIG_PRIV ,
* ' info ' is not a pointer and you can ' t access its field . Instead ,
* SEND_SIG_NOINFO means that si_code is SI_USER , and SEND_SIG_PRIV
* means that si_code is SI_KERNEL .
*/
TRACE_EVENT ( signal_generate ,
2011-11-22 21:13:48 +01:00
TP_PROTO ( int sig , struct siginfo * info , struct task_struct * task ,
int group , int result ) ,
2009-11-24 16:56:45 -05:00
2011-11-22 21:13:48 +01:00
TP_ARGS ( sig , info , task , group , result ) ,
2009-11-24 16:56:45 -05:00
TP_STRUCT__entry (
__field ( int , sig )
__field ( int , errno )
__field ( int , code )
__array ( char , comm , TASK_COMM_LEN )
__field ( pid_t , pid )
2011-11-22 21:13:48 +01:00
__field ( int , group )
__field ( int , result )
2009-11-24 16:56:45 -05:00
) ,
TP_fast_assign (
__entry - > sig = sig ;
TP_STORE_SIGINFO ( __entry , info ) ;
memcpy ( __entry - > comm , task - > comm , TASK_COMM_LEN ) ;
__entry - > pid = task - > pid ;
2011-11-22 21:13:48 +01:00
__entry - > group = group ;
__entry - > result = result ;
2009-11-24 16:56:45 -05:00
) ,
2011-11-22 21:13:48 +01:00
TP_printk ( " sig=%d errno=%d code=%d comm=%s pid=%d grp=%d res=%d " ,
2009-11-24 16:56:45 -05:00
__entry - > sig , __entry - > errno , __entry - > code ,
2011-11-22 21:13:48 +01:00
__entry - > comm , __entry - > pid , __entry - > group ,
__entry - > result )
2009-11-24 16:56:45 -05:00
) ;
2009-11-24 16:56:51 -05:00
/**
* signal_deliver - called when a signal is delivered
* @ sig : signal number
* @ info : pointer to struct siginfo
* @ ka : pointer to struct k_sigaction
*
* A ' sig ' signal is delivered to current process with ' info ' siginfo ,
* and it will be handled by ' ka ' . ka - > sa . sa_handler can be SIG_IGN or
* SIG_DFL .
* Note that some signals reported by signal_generate tracepoint can be
* lost , ignored or modified ( by debugger ) before hitting this tracepoint .
* This means , this can show which signals are actually delivered , but
* matching generated signals and delivered signals may not be correct .
*/
TRACE_EVENT ( signal_deliver ,
TP_PROTO ( int sig , struct siginfo * info , struct k_sigaction * ka ) ,
TP_ARGS ( sig , info , ka ) ,
TP_STRUCT__entry (
__field ( int , sig )
__field ( int , errno )
__field ( int , code )
__field ( unsigned long , sa_handler )
__field ( unsigned long , sa_flags )
) ,
TP_fast_assign (
__entry - > sig = sig ;
TP_STORE_SIGINFO ( __entry , info ) ;
__entry - > sa_handler = ( unsigned long ) ka - > sa . sa_handler ;
__entry - > sa_flags = ka - > sa . sa_flags ;
) ,
TP_printk ( " sig=%d errno=%d code=%d sa_handler=%lx sa_flags=%lx " ,
__entry - > sig , __entry - > errno , __entry - > code ,
__entry - > sa_handler , __entry - > sa_flags )
) ;
2009-11-24 16:56:58 -05:00
2009-11-24 16:56:45 -05:00
# endif /* _TRACE_SIGNAL_H */
/* This part must be outside protection */
# include <trace/define_trace.h>