static int sched_wakeup_handler(struct trace_seq *s, struct tep_record *record, struct event_format *event, void *context) { struct format_field *field; unsigned long long val; if (tep_get_field_val(s, event, "pid", record, &val, 1)) return trace_seq_putc(s, '!'); field = tep_find_any_field(event, "comm"); if (field) { write_and_save_comm(field, record, s, val); trace_seq_putc(s, ':'); } trace_seq_printf(s, "%lld", val); if (tep_get_field_val(s, event, "prio", record, &val, 0) == 0) trace_seq_printf(s, " [%lld]", val); if (tep_get_field_val(s, event, "success", record, &val, 1) == 0) trace_seq_printf(s, " success=%lld", val); if (tep_get_field_val(s, event, "target_cpu", record, &val, 0) == 0) trace_seq_printf(s, " CPU:%03llu", val); return 0; }
static int sched_switch_handler(struct trace_seq *s, struct tep_record *record, struct event_format *event, void *context) { struct format_field *field; unsigned long long val; if (tep_get_field_val(s, event, "prev_pid", record, &val, 1)) return trace_seq_putc(s, '!'); field = tep_find_any_field(event, "prev_comm"); if (field) { write_and_save_comm(field, record, s, val); trace_seq_putc(s, ':'); } trace_seq_printf(s, "%lld ", val); if (tep_get_field_val(s, event, "prev_prio", record, &val, 0) == 0) trace_seq_printf(s, "[%d] ", (int) val); if (tep_get_field_val(s, event, "prev_state", record, &val, 0) == 0) write_state(s, val); trace_seq_puts(s, " ==> "); if (tep_get_field_val(s, event, "next_pid", record, &val, 1)) return trace_seq_putc(s, '!'); field = tep_find_any_field(event, "next_comm"); if (field) { write_and_save_comm(field, record, s, val); trace_seq_putc(s, ':'); } trace_seq_printf(s, "%lld", val); if (tep_get_field_val(s, event, "next_prio", record, &val, 0) == 0) trace_seq_printf(s, " [%d]", (int) val); return 0; }
unsigned long long raw_field_value(struct event_format *event, const char *name, void *data) { struct format_field *field; unsigned long long val; field = tep_find_any_field(event, name); if (!field) return 0ULL; tep_read_number_field(field, data, &val); return val; }
static int trace_stack_handler(struct trace_seq *s, struct tep_record *record, struct tep_event *event, void *context) { struct tracecmd_ftrace *finfo = context; struct tep_format_field *field; unsigned long long addr; const char *func; void *data = record->data; field = tep_find_any_field(event, "caller"); if (!field) { trace_seq_printf(s, "<CANT FIND FIELD %s>", "caller"); return 0; } trace_seq_puts(s, "<stack trace>\n"); long_size_check(finfo); for (data += field->offset; data < record->data + record->size; data += finfo->long_size) { addr = tep_read_number(event->tep, data, finfo->long_size); if ((finfo->long_size == 8 && addr == (unsigned long long)-1) || ((int)addr == -1)) break; func = tep_find_function(event->tep, addr); if (func) trace_seq_printf(s, "=> %s (%llx)\n", func, addr); else trace_seq_printf(s, "=> %llx\n", addr); } return 0; }