1*0a1c49dbSSteven Rostedt /* 2*0a1c49dbSSteven Rostedt * This file defines the trace event structures that go into the ring 3*0a1c49dbSSteven Rostedt * buffer directly. They are created via macros so that changes for them 4*0a1c49dbSSteven Rostedt * appear in the format file. Using macros will automate this process. 5*0a1c49dbSSteven Rostedt * 6*0a1c49dbSSteven Rostedt * The macro used to create a ftrace data structure is: 7*0a1c49dbSSteven Rostedt * 8*0a1c49dbSSteven Rostedt * FTRACE_ENTRY( name, struct_name, id, structure, print ) 9*0a1c49dbSSteven Rostedt * 10*0a1c49dbSSteven Rostedt * @name: the name used the event name, as well as the name of 11*0a1c49dbSSteven Rostedt * the directory that holds the format file. 12*0a1c49dbSSteven Rostedt * 13*0a1c49dbSSteven Rostedt * @struct_name: the name of the structure that is created. 14*0a1c49dbSSteven Rostedt * 15*0a1c49dbSSteven Rostedt * @id: The event identifier that is used to detect what event 16*0a1c49dbSSteven Rostedt * this is from the ring buffer. 17*0a1c49dbSSteven Rostedt * 18*0a1c49dbSSteven Rostedt * @structure: the structure layout 19*0a1c49dbSSteven Rostedt * 20*0a1c49dbSSteven Rostedt * - __field( type, item ) 21*0a1c49dbSSteven Rostedt * This is equivalent to declaring 22*0a1c49dbSSteven Rostedt * type item; 23*0a1c49dbSSteven Rostedt * in the structure. 24*0a1c49dbSSteven Rostedt * - __array( type, item, size ) 25*0a1c49dbSSteven Rostedt * This is equivalent to declaring 26*0a1c49dbSSteven Rostedt * type item[size]; 27*0a1c49dbSSteven Rostedt * in the structure. 28*0a1c49dbSSteven Rostedt * 29*0a1c49dbSSteven Rostedt * @print: the print format shown to users in the format file. 30*0a1c49dbSSteven Rostedt */ 31*0a1c49dbSSteven Rostedt 32*0a1c49dbSSteven Rostedt /* 33*0a1c49dbSSteven Rostedt * Function trace entry - function address and parent function addres: 34*0a1c49dbSSteven Rostedt */ 35*0a1c49dbSSteven Rostedt FTRACE_ENTRY(function, ftrace_entry, 36*0a1c49dbSSteven Rostedt 37*0a1c49dbSSteven Rostedt TRACE_FN, 38*0a1c49dbSSteven Rostedt 39*0a1c49dbSSteven Rostedt F_STRUCT( 40*0a1c49dbSSteven Rostedt __field( unsigned long, ip ) 41*0a1c49dbSSteven Rostedt __field( unsigned long, parent_ip ) 42*0a1c49dbSSteven Rostedt ), 43*0a1c49dbSSteven Rostedt 44*0a1c49dbSSteven Rostedt F_printk(" %lx <-- %lx", __entry->ip, __entry->parent_ip) 45*0a1c49dbSSteven Rostedt ); 46*0a1c49dbSSteven Rostedt 47*0a1c49dbSSteven Rostedt /* Function call entry */ 48*0a1c49dbSSteven Rostedt FTRACE_ENTRY(funcgraph_entry, ftrace_graph_ent_entry, 49*0a1c49dbSSteven Rostedt 50*0a1c49dbSSteven Rostedt TRACE_GRAPH_ENT, 51*0a1c49dbSSteven Rostedt 52*0a1c49dbSSteven Rostedt F_STRUCT( 53*0a1c49dbSSteven Rostedt __field( struct ftrace_graph_ent, graph_ent ) 54*0a1c49dbSSteven Rostedt ), 55*0a1c49dbSSteven Rostedt 56*0a1c49dbSSteven Rostedt F_printk("--> %lx (%d)", __entry->graph_ent.func, __entry->depth) 57*0a1c49dbSSteven Rostedt ); 58*0a1c49dbSSteven Rostedt 59*0a1c49dbSSteven Rostedt /* Function return entry */ 60*0a1c49dbSSteven Rostedt FTRACE_ENTRY(funcgraph_exit, ftrace_graph_ret_entry, 61*0a1c49dbSSteven Rostedt 62*0a1c49dbSSteven Rostedt TRACE_GRAPH_RET, 63*0a1c49dbSSteven Rostedt 64*0a1c49dbSSteven Rostedt F_STRUCT( 65*0a1c49dbSSteven Rostedt __field( struct ftrace_graph_ret, ret ) 66*0a1c49dbSSteven Rostedt ), 67*0a1c49dbSSteven Rostedt 68*0a1c49dbSSteven Rostedt F_printk("<-- %lx (%d) (start: %llx end: %llx) over: %d", 69*0a1c49dbSSteven Rostedt __entry->func, __entry->depth, 70*0a1c49dbSSteven Rostedt __entry->calltime, __entry->rettim, 71*0a1c49dbSSteven Rostedt __entrty->depth) 72*0a1c49dbSSteven Rostedt ); 73*0a1c49dbSSteven Rostedt 74*0a1c49dbSSteven Rostedt /* 75*0a1c49dbSSteven Rostedt * Context switch trace entry - which task (and prio) we switched from/to: 76*0a1c49dbSSteven Rostedt * 77*0a1c49dbSSteven Rostedt * This is used for both wakeup and context switches. We only want 78*0a1c49dbSSteven Rostedt * to create one structure, but we need two outputs for it. 79*0a1c49dbSSteven Rostedt */ 80*0a1c49dbSSteven Rostedt #define FTRACE_CTX_FIELDS \ 81*0a1c49dbSSteven Rostedt __field( unsigned int, prev_pid ) \ 82*0a1c49dbSSteven Rostedt __field( unsigned char, prev_prio ) \ 83*0a1c49dbSSteven Rostedt __field( unsigned char, prev_state ) \ 84*0a1c49dbSSteven Rostedt __field( unsigned int, next_pid ) \ 85*0a1c49dbSSteven Rostedt __field( unsigned char, next_prio ) \ 86*0a1c49dbSSteven Rostedt __field( unsigned char, next_state ) \ 87*0a1c49dbSSteven Rostedt __field( unsigned int, next_cpu ) 88*0a1c49dbSSteven Rostedt 89*0a1c49dbSSteven Rostedt #if 0 90*0a1c49dbSSteven Rostedt FTRACE_ENTRY_STRUCT_ONLY(ctx_switch_entry, 91*0a1c49dbSSteven Rostedt 92*0a1c49dbSSteven Rostedt F_STRUCT( 93*0a1c49dbSSteven Rostedt FTRACE_CTX_FIELDS 94*0a1c49dbSSteven Rostedt ) 95*0a1c49dbSSteven Rostedt ); 96*0a1c49dbSSteven Rostedt #endif 97*0a1c49dbSSteven Rostedt 98*0a1c49dbSSteven Rostedt FTRACE_ENTRY(context_switch, ctx_switch_entry, 99*0a1c49dbSSteven Rostedt 100*0a1c49dbSSteven Rostedt TRACE_CTX, 101*0a1c49dbSSteven Rostedt 102*0a1c49dbSSteven Rostedt F_STRUCT( 103*0a1c49dbSSteven Rostedt FTRACE_CTX_FIELDS 104*0a1c49dbSSteven Rostedt ), 105*0a1c49dbSSteven Rostedt 106*0a1c49dbSSteven Rostedt F_printk(b"%u:%u:%u ==> %u:%u:%u [%03u]", 107*0a1c49dbSSteven Rostedt __entry->prev_pid, __entry->prev_prio, __entry->prev_state, 108*0a1c49dbSSteven Rostedt __entry->next_pid, __entry->next_prio, __entry->next_state, 109*0a1c49dbSSteven Rostedt __entry->next_cpu 110*0a1c49dbSSteven Rostedt ) 111*0a1c49dbSSteven Rostedt ); 112*0a1c49dbSSteven Rostedt 113*0a1c49dbSSteven Rostedt /* 114*0a1c49dbSSteven Rostedt * FTRACE_ENTRY_DUP only creates the format file, it will not 115*0a1c49dbSSteven Rostedt * create another structure. 116*0a1c49dbSSteven Rostedt */ 117*0a1c49dbSSteven Rostedt FTRACE_ENTRY_DUP(wakeup, ctx_switch_entry, 118*0a1c49dbSSteven Rostedt 119*0a1c49dbSSteven Rostedt TRACE_WAKE, 120*0a1c49dbSSteven Rostedt 121*0a1c49dbSSteven Rostedt F_STRUCT( 122*0a1c49dbSSteven Rostedt FTRACE_CTX_FIELDS 123*0a1c49dbSSteven Rostedt ), 124*0a1c49dbSSteven Rostedt 125*0a1c49dbSSteven Rostedt F_printk("%u:%u:%u ==+ %u:%u:%u [%03u]", 126*0a1c49dbSSteven Rostedt __entry->prev_pid, __entry->prev_prio, __entry->prev_state, 127*0a1c49dbSSteven Rostedt __entry->next_pid, __entry->next_prio, __entry->next_state, 128*0a1c49dbSSteven Rostedt __entry->next_cpu 129*0a1c49dbSSteven Rostedt ) 130*0a1c49dbSSteven Rostedt ); 131*0a1c49dbSSteven Rostedt 132*0a1c49dbSSteven Rostedt /* 133*0a1c49dbSSteven Rostedt * Special (free-form) trace entry: 134*0a1c49dbSSteven Rostedt */ 135*0a1c49dbSSteven Rostedt FTRACE_ENTRY(special, special_entry, 136*0a1c49dbSSteven Rostedt 137*0a1c49dbSSteven Rostedt TRACE_SPECIAL, 138*0a1c49dbSSteven Rostedt 139*0a1c49dbSSteven Rostedt F_STRUCT( 140*0a1c49dbSSteven Rostedt __field( unsigned long, arg1 ) 141*0a1c49dbSSteven Rostedt __field( unsigned long, arg2 ) 142*0a1c49dbSSteven Rostedt __field( unsigned long, arg3 ) 143*0a1c49dbSSteven Rostedt ), 144*0a1c49dbSSteven Rostedt 145*0a1c49dbSSteven Rostedt F_printk("(%08lx) (%08lx) (%08lx)", 146*0a1c49dbSSteven Rostedt __entry->arg1, __entry->arg2, __entry->arg3) 147*0a1c49dbSSteven Rostedt ); 148*0a1c49dbSSteven Rostedt 149*0a1c49dbSSteven Rostedt /* 150*0a1c49dbSSteven Rostedt * Stack-trace entry: 151*0a1c49dbSSteven Rostedt */ 152*0a1c49dbSSteven Rostedt 153*0a1c49dbSSteven Rostedt #define FTRACE_STACK_ENTRIES 8 154*0a1c49dbSSteven Rostedt 155*0a1c49dbSSteven Rostedt FTRACE_ENTRY(kernel_stack, stack_entry, 156*0a1c49dbSSteven Rostedt 157*0a1c49dbSSteven Rostedt TRACE_STACK, 158*0a1c49dbSSteven Rostedt 159*0a1c49dbSSteven Rostedt F_STRUCT( 160*0a1c49dbSSteven Rostedt __array( unsigned long, caller, FTRACE_STACK_ENTRIES ) 161*0a1c49dbSSteven Rostedt ), 162*0a1c49dbSSteven Rostedt 163*0a1c49dbSSteven Rostedt F_printk("\t=> (%08lx)\n\t=> (%08lx)\n\t=> (%08lx)\n\t=> (%08lx)\n" 164*0a1c49dbSSteven Rostedt "\t=> (%08lx)\n\t=> (%08lx)\n\t=> (%08lx)\n\t=> (%08lx)\n", 165*0a1c49dbSSteven Rostedt __entry->caller[0], __entry->caller[1], __entry->caller[2], 166*0a1c49dbSSteven Rostedt __entry->caller[3], __entry->caller[4], __entry->caller[5], 167*0a1c49dbSSteven Rostedt __entry->caller[6], __entry->caller[7]) 168*0a1c49dbSSteven Rostedt ); 169*0a1c49dbSSteven Rostedt 170*0a1c49dbSSteven Rostedt FTRACE_ENTRY(user_stack, userstack_entry, 171*0a1c49dbSSteven Rostedt 172*0a1c49dbSSteven Rostedt TRACE_USER_STACK, 173*0a1c49dbSSteven Rostedt 174*0a1c49dbSSteven Rostedt F_STRUCT( 175*0a1c49dbSSteven Rostedt __field( unsigned int, tgid ) 176*0a1c49dbSSteven Rostedt __array( unsigned long, caller, FTRACE_STACK_ENTRIES ) 177*0a1c49dbSSteven Rostedt ), 178*0a1c49dbSSteven Rostedt 179*0a1c49dbSSteven Rostedt F_printk("\t=> (%08lx)\n\t=> (%08lx)\n\t=> (%08lx)\n\t=> (%08lx)\n" 180*0a1c49dbSSteven Rostedt "\t=> (%08lx)\n\t=> (%08lx)\n\t=> (%08lx)\n\t=> (%08lx)\n", 181*0a1c49dbSSteven Rostedt __entry->caller[0], __entry->caller[1], __entry->caller[2], 182*0a1c49dbSSteven Rostedt __entry->caller[3], __entry->caller[4], __entry->caller[5], 183*0a1c49dbSSteven Rostedt __entry->caller[6], __entry->caller[7]) 184*0a1c49dbSSteven Rostedt ); 185*0a1c49dbSSteven Rostedt 186*0a1c49dbSSteven Rostedt /* 187*0a1c49dbSSteven Rostedt * trace_printk entry: 188*0a1c49dbSSteven Rostedt */ 189*0a1c49dbSSteven Rostedt FTRACE_ENTRY(bprint, bprint_entry, 190*0a1c49dbSSteven Rostedt 191*0a1c49dbSSteven Rostedt TRACE_BPRINT, 192*0a1c49dbSSteven Rostedt 193*0a1c49dbSSteven Rostedt F_STRUCT( 194*0a1c49dbSSteven Rostedt __field( unsigned long, ip ) 195*0a1c49dbSSteven Rostedt __field( const char *, fmt ) 196*0a1c49dbSSteven Rostedt __dynamic_array( u32, buf ) 197*0a1c49dbSSteven Rostedt ), 198*0a1c49dbSSteven Rostedt 199*0a1c49dbSSteven Rostedt F_printk("%08lx fmt:%p", 200*0a1c49dbSSteven Rostedt __entry->ip, __entry->fmt) 201*0a1c49dbSSteven Rostedt ); 202*0a1c49dbSSteven Rostedt 203*0a1c49dbSSteven Rostedt FTRACE_ENTRY(print, print_entry, 204*0a1c49dbSSteven Rostedt 205*0a1c49dbSSteven Rostedt TRACE_PRINT, 206*0a1c49dbSSteven Rostedt 207*0a1c49dbSSteven Rostedt F_STRUCT( 208*0a1c49dbSSteven Rostedt __field( unsigned long, ip ) 209*0a1c49dbSSteven Rostedt __dynamic_array( char, buf ) 210*0a1c49dbSSteven Rostedt ), 211*0a1c49dbSSteven Rostedt 212*0a1c49dbSSteven Rostedt F_printk("%08lx %s", 213*0a1c49dbSSteven Rostedt __entry->ip, __entry->buf) 214*0a1c49dbSSteven Rostedt ); 215*0a1c49dbSSteven Rostedt 216*0a1c49dbSSteven Rostedt FTRACE_ENTRY(mmiotrace_rw, trace_mmiotrace_rw, 217*0a1c49dbSSteven Rostedt 218*0a1c49dbSSteven Rostedt TRACE_MMIO_RW, 219*0a1c49dbSSteven Rostedt 220*0a1c49dbSSteven Rostedt F_STRUCT( 221*0a1c49dbSSteven Rostedt __field( struct mmiotrace_rw, rw ) 222*0a1c49dbSSteven Rostedt ), 223*0a1c49dbSSteven Rostedt 224*0a1c49dbSSteven Rostedt F_printk("%lx %lx %lx %d %lx %lx", 225*0a1c49dbSSteven Rostedt __entry->phs, __entry->value, __entry->pc, 226*0a1c49dbSSteven Rostedt __entry->map_id, __entry->opcode, __entry->width) 227*0a1c49dbSSteven Rostedt ); 228*0a1c49dbSSteven Rostedt 229*0a1c49dbSSteven Rostedt FTRACE_ENTRY(mmiotrace_map, trace_mmiotrace_map, 230*0a1c49dbSSteven Rostedt 231*0a1c49dbSSteven Rostedt TRACE_MMIO_MAP, 232*0a1c49dbSSteven Rostedt 233*0a1c49dbSSteven Rostedt F_STRUCT( 234*0a1c49dbSSteven Rostedt __field( struct mmiotrace_map, map ) 235*0a1c49dbSSteven Rostedt ), 236*0a1c49dbSSteven Rostedt 237*0a1c49dbSSteven Rostedt F_printk("%lx %lx %lx %d %lx", 238*0a1c49dbSSteven Rostedt __entry->phs, __entry->virt, __entry->len, 239*0a1c49dbSSteven Rostedt __entry->map_id, __entry->opcode) 240*0a1c49dbSSteven Rostedt ); 241*0a1c49dbSSteven Rostedt 242*0a1c49dbSSteven Rostedt FTRACE_ENTRY(boot_call, trace_boot_call, 243*0a1c49dbSSteven Rostedt 244*0a1c49dbSSteven Rostedt TRACE_BOOT_CALL, 245*0a1c49dbSSteven Rostedt 246*0a1c49dbSSteven Rostedt F_STRUCT( 247*0a1c49dbSSteven Rostedt __field( struct boot_trace_call, boot_call ) 248*0a1c49dbSSteven Rostedt ), 249*0a1c49dbSSteven Rostedt 250*0a1c49dbSSteven Rostedt F_printk("%d %s", __entry->caller, __entry->func) 251*0a1c49dbSSteven Rostedt ); 252*0a1c49dbSSteven Rostedt 253*0a1c49dbSSteven Rostedt FTRACE_ENTRY(boot_ret, trace_boot_ret, 254*0a1c49dbSSteven Rostedt 255*0a1c49dbSSteven Rostedt TRACE_BOOT_RET, 256*0a1c49dbSSteven Rostedt 257*0a1c49dbSSteven Rostedt F_STRUCT( 258*0a1c49dbSSteven Rostedt __field( struct boot_trace_ret, boot_ret ) 259*0a1c49dbSSteven Rostedt ), 260*0a1c49dbSSteven Rostedt 261*0a1c49dbSSteven Rostedt F_printk("%s %d %lx", 262*0a1c49dbSSteven Rostedt __entry->func, __entry->result, __entry->duration) 263*0a1c49dbSSteven Rostedt ); 264*0a1c49dbSSteven Rostedt 265*0a1c49dbSSteven Rostedt #define TRACE_FUNC_SIZE 30 266*0a1c49dbSSteven Rostedt #define TRACE_FILE_SIZE 20 267*0a1c49dbSSteven Rostedt 268*0a1c49dbSSteven Rostedt FTRACE_ENTRY(branch, trace_branch, 269*0a1c49dbSSteven Rostedt 270*0a1c49dbSSteven Rostedt TRACE_BRANCH, 271*0a1c49dbSSteven Rostedt 272*0a1c49dbSSteven Rostedt F_STRUCT( 273*0a1c49dbSSteven Rostedt __field( unsigned int, line ) 274*0a1c49dbSSteven Rostedt __array( char, func, TRACE_FUNC_SIZE+1 ) 275*0a1c49dbSSteven Rostedt __array( char, file, TRACE_FILE_SIZE+1 ) 276*0a1c49dbSSteven Rostedt __field( char, correct ) 277*0a1c49dbSSteven Rostedt ), 278*0a1c49dbSSteven Rostedt 279*0a1c49dbSSteven Rostedt F_printk("%u:%s:%s (%u)", 280*0a1c49dbSSteven Rostedt __entry->line, 281*0a1c49dbSSteven Rostedt __entry->func, __entry->file, __entry->correct) 282*0a1c49dbSSteven Rostedt ); 283*0a1c49dbSSteven Rostedt 284*0a1c49dbSSteven Rostedt FTRACE_ENTRY(hw_branch, hw_branch_entry, 285*0a1c49dbSSteven Rostedt 286*0a1c49dbSSteven Rostedt TRACE_HW_BRANCHES, 287*0a1c49dbSSteven Rostedt 288*0a1c49dbSSteven Rostedt F_STRUCT( 289*0a1c49dbSSteven Rostedt __field( u64, from ) 290*0a1c49dbSSteven Rostedt __field( u64, to ) 291*0a1c49dbSSteven Rostedt ), 292*0a1c49dbSSteven Rostedt 293*0a1c49dbSSteven Rostedt F_printk("from: %llx to: %llx", __entry->from, __entry->to) 294*0a1c49dbSSteven Rostedt ); 295*0a1c49dbSSteven Rostedt 296*0a1c49dbSSteven Rostedt FTRACE_ENTRY(power, trace_power, 297*0a1c49dbSSteven Rostedt 298*0a1c49dbSSteven Rostedt TRACE_POWER, 299*0a1c49dbSSteven Rostedt 300*0a1c49dbSSteven Rostedt F_STRUCT( 301*0a1c49dbSSteven Rostedt __field( struct power_trace, state_data ) 302*0a1c49dbSSteven Rostedt ), 303*0a1c49dbSSteven Rostedt 304*0a1c49dbSSteven Rostedt F_printk("%llx->%llx type:%u state:%u", 305*0a1c49dbSSteven Rostedt __entry->stamp, __entry->end, 306*0a1c49dbSSteven Rostedt __entry->type, __entry->state) 307*0a1c49dbSSteven Rostedt ); 308*0a1c49dbSSteven Rostedt 309*0a1c49dbSSteven Rostedt FTRACE_ENTRY(kmem_alloc, kmemtrace_alloc_entry, 310*0a1c49dbSSteven Rostedt 311*0a1c49dbSSteven Rostedt TRACE_KMEM_ALLOC, 312*0a1c49dbSSteven Rostedt 313*0a1c49dbSSteven Rostedt F_STRUCT( 314*0a1c49dbSSteven Rostedt __field( enum kmemtrace_type_id, type_id ) 315*0a1c49dbSSteven Rostedt __field( unsigned long, call_site ) 316*0a1c49dbSSteven Rostedt __field( const void *, ptr ) 317*0a1c49dbSSteven Rostedt __field( size_t, bytes_req ) 318*0a1c49dbSSteven Rostedt __field( size_t, bytes_alloc ) 319*0a1c49dbSSteven Rostedt __field( gfp_t, gfp_flags ) 320*0a1c49dbSSteven Rostedt __field( int, node ) 321*0a1c49dbSSteven Rostedt ), 322*0a1c49dbSSteven Rostedt 323*0a1c49dbSSteven Rostedt F_printk("type:%u call_site:%lx ptr:%p req:%lu alloc:%lu" 324*0a1c49dbSSteven Rostedt " flags:%x node:%d", 325*0a1c49dbSSteven Rostedt __entry->type_id, __entry->call_site, __entry->ptr, 326*0a1c49dbSSteven Rostedt __entry->bytes_req, __entry->bytes_alloc, 327*0a1c49dbSSteven Rostedt __entry->gfp_flags, __entry->node) 328*0a1c49dbSSteven Rostedt ); 329*0a1c49dbSSteven Rostedt 330*0a1c49dbSSteven Rostedt FTRACE_ENTRY(kmem_free, kmemtrace_free_entry, 331*0a1c49dbSSteven Rostedt 332*0a1c49dbSSteven Rostedt TRACE_KMEM_FREE, 333*0a1c49dbSSteven Rostedt 334*0a1c49dbSSteven Rostedt F_STRUCT( 335*0a1c49dbSSteven Rostedt __field( enum kmemtrace_type_id, type_id ) 336*0a1c49dbSSteven Rostedt __field( unsigned long, call_site ) 337*0a1c49dbSSteven Rostedt __field( const void *, ptr ) 338*0a1c49dbSSteven Rostedt ), 339*0a1c49dbSSteven Rostedt 340*0a1c49dbSSteven Rostedt F_printk("type:%u call_site:%lx ptr:%p", 341*0a1c49dbSSteven Rostedt __entry->type_id, __entry->call_site, __entry->ptr) 342*0a1c49dbSSteven Rostedt ); 343