8 #include <linux/module.h>
15 #define EVENT_HASHSIZE 128
44 struct bprint_entry *
field;
60 struct print_entry *
field;
154 ret = bstr_printf(s->
buffer + s->
len, len, fmt, binary);
230 const unsigned char *
data =
mem;
237 for (i = 0, j = 0; i < len; i++) {
239 for (i = len-1, j = 0; i >= 0; i--) {
305 for (i = 0; flag_array[
i].
name &&
flags; i++) {
307 mask = flag_array[
i].
mask;
308 if ((flags & mask) != mask)
311 str = flag_array[
i].
name;
340 for (i = 0; symbol_array[
i].
name; i++) {
342 if (val != symbol_array[i].
mask)
349 if (ret == (
const char *)(p->
buffer + p->
len))
358 #if BITS_PER_LONG == 32
360 ftrace_print_symbols_seq_u64(
struct trace_seq *
p,
unsigned long long val,
366 for (i = 0; symbol_array[
i].
name; i++) {
368 if (val != symbol_array[i].
mask)
375 if (ret == (
const char *)(p->
buffer + p->
len))
391 for (i = 0; i < buf_len; i++)
400 #ifdef CONFIG_KRETPROBES
401 static inline const char *kretprobed(
const char *
name)
403 static const char tramp_name[] =
"kretprobe_trampoline";
404 int size =
sizeof(tramp_name);
406 if (
strncmp(tramp_name, name, size) == 0)
407 return "[unknown/kretprobe'd]";
411 static inline const char *kretprobed(
const char *name)
420 #ifdef CONFIG_KALLSYMS
426 name = kretprobed(str);
434 seq_print_sym_offset(
struct trace_seq *s,
const char *
fmt,
437 #ifdef CONFIG_KALLSYMS
442 name = kretprobed(str);
450 # define IP_FMT "%08lx"
452 # define IP_FMT "%016lx"
456 unsigned long ip,
unsigned long sym_flags)
459 unsigned long vmstart = 0;
489 unsigned long sym_flags)
509 unsigned long ip = entry->caller[
i];
543 ret = seq_print_sym_offset(s,
"%s", ip);
545 ret = seq_print_sym_short(s,
"%s", ip);
582 (hardirq && softirq) ?
'H' :
588 irqs_off, need_resched, hardsoft_irq))
607 comm, entry->
pid, cpu))
613 static unsigned long preempt_mark_thresh = 100;
617 unsigned long rel_usecs)
620 rel_usecs > preempt_mark_thresh ?
'!' :
621 rel_usecs > 1 ?
'+' :
' ');
630 unsigned long secs = (
unsigned long)t;
637 comm, entry->
pid, iter->
cpu);
662 unsigned long abs_usecs =
ns2usecs(iter->
ts - iter->
tr->time_start);
663 unsigned long rel_usecs;
678 " %ld.%03ldms (+%ld.%03ldms): ", comm,
684 rel_usecs / USEC_PER_MSEC,
685 rel_usecs % USEC_PER_MSEC);
687 ret = lat_print_generic(s, entry, iter->
cpu);
689 ret = lat_print_timestamp(s, abs_usecs, rel_usecs);
697 static int task_state_char(
unsigned long state)
699 int bit = state ?
__ffs(state) + 1 : 0;
701 return bit <
sizeof(state_to_char) - 1 ? state_to_char[bit] :
'?';
720 if (event->
type == type)
734 if (list_empty(&ftrace_event_list)) {
735 *list = &ftrace_event_list;
744 if (e->
type != last + 1)
795 INIT_LIST_HEAD(&event->
list);
802 event->type = trace_search_list(&list);
808 event->type = next_event_type++;
809 list = &ftrace_event_list;
838 hlist_add_head(&event->
node, &event_hash[key]);
853 hlist_del(&event->
node);
889 struct ftrace_entry *
field;
917 struct ftrace_entry *
field;
932 struct ftrace_entry *
field;
946 struct ftrace_entry *
field;
958 .trace = trace_fn_trace,
961 .binary = trace_fn_bin,
966 .funcs = &trace_fn_funcs,
973 struct ctx_switch_entry *
field;
980 T = task_state_char(field->next_state);
981 S = task_state_char(field->prev_state);
984 " %5d:%3d:%c %s [%03d] %5d:%3d:%c %s\n",
1000 return trace_ctxwake_print(iter,
"==>");
1006 return trace_ctxwake_print(iter,
" +");
1009 static int trace_ctxwake_raw(
struct trace_iterator *iter,
char S)
1011 struct ctx_switch_entry *
field;
1017 S = task_state_char(field->prev_state);
1018 T = task_state_char(field->next_state);
1035 return trace_ctxwake_raw(iter, 0);
1041 return trace_ctxwake_raw(iter,
'+');
1045 static int trace_ctxwake_hex(
struct trace_iterator *iter,
char S)
1047 struct ctx_switch_entry *
field;
1054 S = task_state_char(field->prev_state);
1055 T = task_state_char(field->next_state);
1071 return trace_ctxwake_hex(iter, 0);
1077 return trace_ctxwake_hex(iter,
'+');
1083 struct ctx_switch_entry *
field;
1099 .trace = trace_ctx_print,
1100 .raw = trace_ctx_raw,
1101 .hex = trace_ctx_hex,
1102 .binary = trace_ctxwake_bin,
1107 .funcs = &trace_ctx_funcs,
1111 .trace = trace_wake_print,
1112 .raw = trace_wake_raw,
1113 .hex = trace_wake_hex,
1114 .binary = trace_ctxwake_bin,
1119 .funcs = &trace_wake_funcs,
1127 struct stack_entry *
field;
1133 end = (
unsigned long *)((
long)iter->
ent + iter->
ent_size);
1138 for (p = field->caller; p && *p !=
ULONG_MAX && p < end; p++) {
1155 .trace = trace_stack_print,
1160 .funcs = &trace_stack_funcs,
1167 struct userstack_entry *
field;
1185 .trace = trace_user_stack_print,
1188 static struct trace_event trace_user_stack_event = {
1190 .funcs = &trace_user_stack_funcs,
1200 struct bprint_entry *
field;
1224 struct bprint_entry *
field;
1242 .trace = trace_bprint_print,
1243 .raw = trace_bprint_raw,
1248 .funcs = &trace_bprint_funcs,
1255 struct print_entry *
field;
1275 struct print_entry *
field;
1289 .trace = trace_print_print,
1290 .raw = trace_print_raw,
1295 .funcs = &trace_print_funcs,
1304 &trace_user_stack_event,
1305 &trace_bprint_event,
1310 __init static int init_events(
void)