static int add_tracepoint_field_value(struct ctf_writer *cw, struct bt_ctf_event_class *event_class, struct bt_ctf_event *event, struct perf_sample *sample, struct tep_format_field *fmtf) { struct bt_ctf_field_type *type; struct bt_ctf_field *array_field; struct bt_ctf_field *field; const char *name = fmtf->name; void *data = sample->raw_data; unsigned long flags = fmtf->flags; unsigned int n_items; unsigned int i; unsigned int offset; unsigned int len; int ret; name = fmtf->alias; offset = fmtf->offset; len = fmtf->size; if (flags & TEP_FIELD_IS_STRING) flags &= ~TEP_FIELD_IS_ARRAY; if (flags & TEP_FIELD_IS_DYNAMIC) { unsigned long long tmp_val; tmp_val = tep_read_number(fmtf->event->pevent, data + offset, len); offset = tmp_val; len = offset >> 16; offset &= 0xffff; }
static int get_common_field(struct scripting_context *context, int *offset, int *size, const char *type) { struct tep_handle *pevent = context->pevent; struct event_format *event; struct format_field *field; if (!*size) { if (!pevent->events) return 0; event = pevent->events[0]; field = tep_find_common_field(event, type); if (!field) return 0; *offset = field->offset; *size = field->size; } return tep_read_number(pevent, context->event_data + *offset, *size); }
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; }
unsigned long long read_size(struct event_format *event, void *ptr, int size) { return tep_read_number(event->pevent, ptr, size); }