2009-09-12 19:17:15 -04:00
/*
* This file defines the trace event structures that go into the ring
* buffer directly . They are created via macros so that changes for them
* appear in the format file . Using macros will automate this process .
*
* The macro used to create a ftrace data structure is :
*
* FTRACE_ENTRY ( name , struct_name , id , structure , print )
*
* @ name : the name used the event name , as well as the name of
* the directory that holds the format file .
*
* @ struct_name : the name of the structure that is created .
*
* @ id : The event identifier that is used to detect what event
* this is from the ring buffer .
*
* @ structure : the structure layout
*
* - __field ( type , item )
* This is equivalent to declaring
* type item ;
* in the structure .
* - __array ( type , item , size )
* This is equivalent to declaring
* type item [ size ] ;
* in the structure .
*
2009-09-12 19:22:23 -04:00
* * for structures within structures , the format of the internal
2011-03-30 22:57:33 -03:00
* structure is laid out . This allows the internal structure
2009-09-12 19:22:23 -04:00
* to be deciphered for the format file . Although these macros
* may become out of sync with the internal structure , they
* will create a compile error if it happens . Since the
* internel structures are just tracing helpers , this is not
* an issue .
*
* When an internal structure is used , it should use :
*
* __field_struct ( type , item )
*
* instead of __field . This will prevent it from being shown in
* the output file . The fields in the structure should use .
*
* __field_desc ( type , container , item )
* __array_desc ( type , container , item , len )
*
* type , item and len are the same as __field and __array , but
* container is added . This is the name of the item in
* __field_struct that this is describing .
*
*
2009-09-12 19:17:15 -04:00
* @ print : the print format shown to users in the format file .
*/
/*
tree-wide: fix comment/printk typos
"gadget", "through", "command", "maintain", "maintain", "controller", "address",
"between", "initiali[zs]e", "instead", "function", "select", "already",
"equal", "access", "management", "hierarchy", "registration", "interest",
"relative", "memory", "offset", "already",
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
2010-11-01 15:38:34 -04:00
* Function trace entry - function address and parent function address :
2009-09-12 19:17:15 -04:00
*/
2012-02-15 15:51:52 +01:00
FTRACE_ENTRY_REG ( function , ftrace_entry ,
2009-09-12 19:17:15 -04:00
TRACE_FN ,
F_STRUCT (
__field ( unsigned long , ip )
__field ( unsigned long , parent_ip )
) ,
2012-02-15 15:51:52 +01:00
F_printk ( " %lx <-- %lx " , __entry - > ip , __entry - > parent_ip ) ,
2012-02-15 15:51:53 +01:00
FILTER_TRACE_FN ,
2012-02-15 15:51:52 +01:00
perf_ftrace_event_register
2009-09-12 19:17:15 -04:00
) ;
/* Function call entry */
2016-06-29 19:56:48 +09:00
FTRACE_ENTRY_PACKED ( funcgraph_entry , ftrace_graph_ent_entry ,
2009-09-12 19:17:15 -04:00
TRACE_GRAPH_ENT ,
F_STRUCT (
2009-09-12 19:22:23 -04:00
__field_struct ( struct ftrace_graph_ent , graph_ent )
__field_desc ( unsigned long , graph_ent , func )
__field_desc ( int , graph_ent , depth )
2009-09-12 19:17:15 -04:00
) ,
2012-02-15 15:51:53 +01:00
F_printk ( " --> %lx (%d) " , __entry - > func , __entry - > depth ) ,
FILTER_OTHER
2009-09-12 19:17:15 -04:00
) ;
/* Function return entry */
2016-06-29 19:56:48 +09:00
FTRACE_ENTRY_PACKED ( funcgraph_exit , ftrace_graph_ret_entry ,
2009-09-12 19:17:15 -04:00
TRACE_GRAPH_RET ,
F_STRUCT (
2009-09-12 19:22:23 -04:00
__field_struct ( struct ftrace_graph_ret , ret )
__field_desc ( unsigned long , ret , func )
__field_desc ( unsigned long long , ret , calltime )
__field_desc ( unsigned long long , ret , rettime )
__field_desc ( unsigned long , ret , overrun )
__field_desc ( int , ret , depth )
2009-09-12 19:17:15 -04:00
) ,
F_printk ( " <-- %lx (%d) (start: %llx end: %llx) over: %d " ,
__entry - > func , __entry - > depth ,
2009-09-14 15:51:39 +08:00
__entry - > calltime , __entry - > rettime ,
2012-02-15 15:51:53 +01:00
__entry - > depth ) ,
FILTER_OTHER
2009-09-12 19:17:15 -04:00
) ;
/*
* Context switch trace entry - which task ( and prio ) we switched from / to :
*
* This is used for both wakeup and context switches . We only want
* to create one structure , but we need two outputs for it .
*/
# define FTRACE_CTX_FIELDS \
__field ( unsigned int , prev_pid ) \
2010-12-03 16:13:19 -08:00
__field ( unsigned int , next_pid ) \
__field ( unsigned int , next_cpu ) \
2009-09-12 19:17:15 -04:00
__field ( unsigned char , prev_prio ) \
__field ( unsigned char , prev_state ) \
__field ( unsigned char , next_prio ) \
2010-12-03 16:13:19 -08:00
__field ( unsigned char , next_state )
2009-09-12 19:17:15 -04:00
FTRACE_ENTRY ( context_switch , ctx_switch_entry ,
TRACE_CTX ,
F_STRUCT (
FTRACE_CTX_FIELDS
) ,
2009-09-14 15:51:39 +08:00
F_printk ( " %u:%u:%u ==> %u:%u:%u [%03u] " ,
2009-09-12 19:17:15 -04:00
__entry - > prev_pid , __entry - > prev_prio , __entry - > prev_state ,
__entry - > next_pid , __entry - > next_prio , __entry - > next_state ,
2012-02-15 15:51:53 +01:00
__entry - > next_cpu ) ,
FILTER_OTHER
2009-09-12 19:17:15 -04:00
) ;
/*
* FTRACE_ENTRY_DUP only creates the format file , it will not
* create another structure .
*/
FTRACE_ENTRY_DUP ( wakeup , ctx_switch_entry ,
TRACE_WAKE ,
F_STRUCT (
FTRACE_CTX_FIELDS
) ,
F_printk ( " %u:%u:%u ==+ %u:%u:%u [%03u] " ,
__entry - > prev_pid , __entry - > prev_prio , __entry - > prev_state ,
__entry - > next_pid , __entry - > next_prio , __entry - > next_state ,
2012-02-15 15:51:53 +01:00
__entry - > next_cpu ) ,
FILTER_OTHER
2009-09-12 19:17:15 -04:00
) ;
/*
* Stack - trace entry :
*/
# define FTRACE_STACK_ENTRIES 8
2012-03-22 11:18:20 +01:00
# ifndef CONFIG_64BIT
# define IP_FMT "%08lx"
# else
# define IP_FMT "%016lx"
# endif
2009-09-12 19:17:15 -04:00
FTRACE_ENTRY ( kernel_stack , stack_entry ,
TRACE_STACK ,
F_STRUCT (
2011-07-14 16:36:53 -04:00
__field ( int , size )
__dynamic_array ( unsigned long , caller )
2009-09-12 19:17:15 -04:00
) ,
2012-03-22 11:18:20 +01:00
F_printk ( " \t => ( " IP_FMT " ) \n \t => ( " IP_FMT " ) \n \t => ( " IP_FMT " ) \n "
" \t => ( " IP_FMT " ) \n \t => ( " IP_FMT " ) \n \t => ( " IP_FMT " ) \n "
" \t => ( " IP_FMT " ) \n \t => ( " IP_FMT " ) \n " ,
2009-09-12 19:17:15 -04:00
__entry - > caller [ 0 ] , __entry - > caller [ 1 ] , __entry - > caller [ 2 ] ,
__entry - > caller [ 3 ] , __entry - > caller [ 4 ] , __entry - > caller [ 5 ] ,
2012-02-15 15:51:53 +01:00
__entry - > caller [ 6 ] , __entry - > caller [ 7 ] ) ,
FILTER_OTHER
2009-09-12 19:17:15 -04:00
) ;
FTRACE_ENTRY ( user_stack , userstack_entry ,
TRACE_USER_STACK ,
F_STRUCT (
__field ( unsigned int , tgid )
__array ( unsigned long , caller , FTRACE_STACK_ENTRIES )
) ,
2012-03-22 11:18:20 +01:00
F_printk ( " \t => ( " IP_FMT " ) \n \t => ( " IP_FMT " ) \n \t => ( " IP_FMT " ) \n "
" \t => ( " IP_FMT " ) \n \t => ( " IP_FMT " ) \n \t => ( " IP_FMT " ) \n "
" \t => ( " IP_FMT " ) \n \t => ( " IP_FMT " ) \n " ,
2009-09-12 19:17:15 -04:00
__entry - > caller [ 0 ] , __entry - > caller [ 1 ] , __entry - > caller [ 2 ] ,
__entry - > caller [ 3 ] , __entry - > caller [ 4 ] , __entry - > caller [ 5 ] ,
2012-02-15 15:51:53 +01:00
__entry - > caller [ 6 ] , __entry - > caller [ 7 ] ) ,
FILTER_OTHER
2009-09-12 19:17:15 -04:00
) ;
/*
* trace_printk entry :
*/
FTRACE_ENTRY ( bprint , bprint_entry ,
TRACE_BPRINT ,
F_STRUCT (
__field ( unsigned long , ip )
__field ( const char * , fmt )
__dynamic_array ( u32 , buf )
) ,
2015-03-11 22:13:57 -05:00
F_printk ( " %ps: %s " ,
2013-03-08 21:02:34 -05:00
( void * ) __entry - > ip , __entry - > fmt ) ,
2012-02-15 15:51:53 +01:00
FILTER_OTHER
2009-09-12 19:17:15 -04:00
) ;
FTRACE_ENTRY ( print , print_entry ,
TRACE_PRINT ,
F_STRUCT (
__field ( unsigned long , ip )
__dynamic_array ( char , buf )
) ,
2015-03-11 22:13:57 -05:00
F_printk ( " %ps: %s " ,
2013-03-08 21:02:34 -05:00
( void * ) __entry - > ip , __entry - > buf ) ,
FILTER_OTHER
) ;
2016-07-06 15:25:08 -04:00
FTRACE_ENTRY ( raw_data , raw_data_entry ,
TRACE_RAW_DATA ,
F_STRUCT (
__field ( unsigned int , id )
__dynamic_array ( char , buf )
) ,
F_printk ( " id:%04x %08x " ,
__entry - > id , ( int ) __entry - > buf [ 0 ] ) ,
FILTER_OTHER
) ;
2013-03-08 21:02:34 -05:00
FTRACE_ENTRY ( bputs , bputs_entry ,
TRACE_BPUTS ,
F_STRUCT (
__field ( unsigned long , ip )
__field ( const char * , str )
) ,
2015-03-11 22:13:57 -05:00
F_printk ( " %ps: %s " ,
2013-03-08 21:02:34 -05:00
( void * ) __entry - > ip , __entry - > str ) ,
2012-02-15 15:51:53 +01:00
FILTER_OTHER
2009-09-12 19:17:15 -04:00
) ;
FTRACE_ENTRY ( mmiotrace_rw , trace_mmiotrace_rw ,
TRACE_MMIO_RW ,
F_STRUCT (
2009-09-12 19:22:23 -04:00
__field_struct ( struct mmiotrace_rw , rw )
__field_desc ( resource_size_t , rw , phys )
__field_desc ( unsigned long , rw , value )
__field_desc ( unsigned long , rw , pc )
__field_desc ( int , rw , map_id )
__field_desc ( unsigned char , rw , opcode )
__field_desc ( unsigned char , rw , width )
2009-09-12 19:17:15 -04:00
) ,
2009-09-14 15:51:39 +08:00
F_printk ( " %lx %lx %lx %d %x %x " ,
( unsigned long ) __entry - > phys , __entry - > value , __entry - > pc ,
2012-02-15 15:51:53 +01:00
__entry - > map_id , __entry - > opcode , __entry - > width ) ,
FILTER_OTHER
2009-09-12 19:17:15 -04:00
) ;
FTRACE_ENTRY ( mmiotrace_map , trace_mmiotrace_map ,
TRACE_MMIO_MAP ,
F_STRUCT (
2009-09-12 19:22:23 -04:00
__field_struct ( struct mmiotrace_map , map )
__field_desc ( resource_size_t , map , phys )
__field_desc ( unsigned long , map , virt )
__field_desc ( unsigned long , map , len )
__field_desc ( int , map , map_id )
__field_desc ( unsigned char , map , opcode )
2009-09-12 19:17:15 -04:00
) ,
2009-09-14 15:51:39 +08:00
F_printk ( " %lx %lx %lx %d %x " ,
( unsigned long ) __entry - > phys , __entry - > virt , __entry - > len ,
2012-02-15 15:51:53 +01:00
__entry - > map_id , __entry - > opcode ) ,
FILTER_OTHER
2009-09-12 19:17:15 -04:00
) ;
# define TRACE_FUNC_SIZE 30
# define TRACE_FILE_SIZE 20
FTRACE_ENTRY ( branch , trace_branch ,
TRACE_BRANCH ,
F_STRUCT (
__field ( unsigned int , line )
__array ( char , func , TRACE_FUNC_SIZE + 1 )
__array ( char , file , TRACE_FILE_SIZE + 1 )
__field ( char , correct )
2017-01-19 08:57:41 -05:00
__field ( char , constant )
2009-09-12 19:17:15 -04:00
) ,
2017-01-19 08:57:41 -05:00
F_printk ( " %u:%s:%s (%u)%s " ,
2009-09-12 19:17:15 -04:00
__entry - > line ,
2017-01-19 08:57:41 -05:00
__entry - > func , __entry - > file , __entry - > correct ,
__entry - > constant ? " CONSTANT " : " " ) ,
2012-02-15 15:51:53 +01:00
FILTER_OTHER
2009-09-12 19:17:15 -04:00
) ;
2016-06-23 12:45:36 -04:00
FTRACE_ENTRY ( hwlat , hwlat_entry ,
TRACE_HWLAT ,
F_STRUCT (
__field ( u64 , duration )
__field ( u64 , outer_duration )
2016-08-04 12:49:53 -04:00
__field ( u64 , nmi_total_ts )
2017-05-08 15:59:13 -07:00
__field_struct ( struct timespec64 , timestamp )
__field_desc ( s64 , timestamp , tv_sec )
2016-06-23 12:45:36 -04:00
__field_desc ( long , timestamp , tv_nsec )
2016-08-04 12:49:53 -04:00
__field ( unsigned int , nmi_count )
2016-06-23 12:45:36 -04:00
__field ( unsigned int , seqnum )
) ,
2017-05-08 15:59:13 -07:00
F_printk ( " cnt:%u \t ts:%010llu.%010lu \t inner:%llu \t outer:%llunmi-ts:%llu \t nmi-count:%u \n " ,
2016-06-23 12:45:36 -04:00
__entry - > seqnum ,
__entry - > tv_sec ,
__entry - > tv_nsec ,
__entry - > duration ,
2016-08-04 12:49:53 -04:00
__entry - > outer_duration ,
__entry - > nmi_total_ts ,
__entry - > nmi_count ) ,
2016-06-23 12:45:36 -04:00
FILTER_OTHER
) ;