Lines Matching +full:event +full:- +full:name

1 // SPDX-License-Identifier: LGPL-2.1
8 * - Copyright (C) 2009 Frederic Weisbecker,
24 #include "event-parse.h"
26 #include "event-parse-local.h"
27 #include "event-utils.h"
28 #include "trace-seq.h"
45 #define do_warning_event(event, fmt, ...) \ argument
50 if (event) \
51 warning("[%s:%s] " fmt, event->system, \
52 event->name, ##__VA_ARGS__); \
58 * init_input_buf - init buffer for parsing
98 char *name; member
106 struct tep_event *event, struct tep_print_arg *arg);
131 if (ca->pid < cb->pid) in cmdline_cmp()
132 return -1; in cmdline_cmp()
133 if (ca->pid > cb->pid) in cmdline_cmp()
146 if (ca->pid < cb->pid) in cmdline_slot_cmp()
147 return -1; in cmdline_slot_cmp()
149 if (ca->pid > cb->pid) { in cmdline_slot_cmp()
150 if (ca->pid <= cb1->pid) in cmdline_slot_cmp()
166 struct cmdline_list *cmdlist = tep->cmdlist; in cmdline_init()
171 cmdlines = malloc(sizeof(*cmdlines) * tep->cmdline_count); in cmdline_init()
173 return -1; in cmdline_init()
177 cmdlines[i].pid = cmdlist->pid; in cmdline_init()
178 cmdlines[i].comm = cmdlist->comm; in cmdline_init()
181 cmdlist = cmdlist->next; in cmdline_init()
185 qsort(cmdlines, tep->cmdline_count, sizeof(*cmdlines), cmdline_cmp); in cmdline_init()
187 tep->cmdlines = cmdlines; in cmdline_init()
188 tep->cmdlist = NULL; in cmdline_init()
201 if (!tep->cmdlines && cmdline_init(tep)) in find_cmdline()
206 comm = bsearch(&key, tep->cmdlines, tep->cmdline_count, in find_cmdline()
207 sizeof(*tep->cmdlines), cmdline_cmp); in find_cmdline()
210 return comm->comm; in find_cmdline()
215 * tep_is_pid_registered - return if a pid has a cmdline registered
216 * @tep: a handle to the trace event parser context
230 if (!tep->cmdlines && cmdline_init(tep)) in tep_is_pid_registered()
235 comm = bsearch(&key, tep->cmdlines, tep->cmdline_count, in tep_is_pid_registered()
236 sizeof(*tep->cmdlines), cmdline_cmp); in tep_is_pid_registered()
251 struct tep_cmdline *cmdlines = tep->cmdlines; in add_new_comm()
263 cmdline = bsearch(&key, tep->cmdlines, tep->cmdline_count, in add_new_comm()
264 sizeof(*tep->cmdlines), cmdline_cmp); in add_new_comm()
268 return -1; in add_new_comm()
273 return -1; in add_new_comm()
275 free(cmdline->comm); in add_new_comm()
276 cmdline->comm = new_comm; in add_new_comm()
281 cmdlines = realloc(cmdlines, sizeof(*cmdlines) * (tep->cmdline_count + 1)); in add_new_comm()
284 return -1; in add_new_comm()
286 tep->cmdlines = cmdlines; in add_new_comm()
291 return -1; in add_new_comm()
294 if (!tep->cmdline_count) { in add_new_comm()
296 tep->cmdlines[0] = key; in add_new_comm()
297 tep->cmdline_count++; in add_new_comm()
302 cmdline = bsearch(&key, tep->cmdlines, tep->cmdline_count - 1, in add_new_comm()
303 sizeof(*tep->cmdlines), cmdline_slot_cmp); in add_new_comm()
305 cnt = tep->cmdline_count; in add_new_comm()
309 cnt -= cmdline - tep->cmdlines; in add_new_comm()
313 if (key.pid > tep->cmdlines[tep->cmdline_count - 1].pid) { in add_new_comm()
314 tep->cmdlines[tep->cmdline_count++] = key; in add_new_comm()
317 cmdline = &tep->cmdlines[0]; in add_new_comm()
322 tep->cmdline_count++; in add_new_comm()
332 if (tep->cmdlines) in _tep_register_comm()
337 return -1; in _tep_register_comm()
340 item->comm = strdup(comm); in _tep_register_comm()
342 item->comm = strdup("<...>"); in _tep_register_comm()
343 if (!item->comm) { in _tep_register_comm()
345 return -1; in _tep_register_comm()
347 item->pid = pid; in _tep_register_comm()
348 item->next = tep->cmdlist; in _tep_register_comm()
350 tep->cmdlist = item; in _tep_register_comm()
351 tep->cmdline_count++; in _tep_register_comm()
357 * tep_register_comm - register a pid / comm mapping
358 * @tep: a handle to the trace event parser context
364 * already exist, -1 is returned and errno is set to EEXIST
372 * tep_override_comm - register a pid / comm mapping
373 * @tep: a handle to the trace event parser context
383 if (!tep->cmdlines && cmdline_init(tep)) { in tep_override_comm()
385 return -1; in tep_override_comm()
408 if (fa->addr < fb->addr) in func_cmp()
409 return -1; in func_cmp()
410 if (fa->addr > fb->addr) in func_cmp()
425 if ((fa->addr == fb->addr) || in func_bcmp()
427 (fa->addr > fb->addr && in func_bcmp()
428 fa->addr < (fb+1)->addr)) in func_bcmp()
431 if (fa->addr < fb->addr) in func_bcmp()
432 return -1; in func_bcmp()
444 func_map = malloc(sizeof(*func_map) * (tep->func_count + 1)); in func_map_init()
446 return -1; in func_map_init()
448 funclist = tep->funclist; in func_map_init()
452 func_map[i].func = funclist->func; in func_map_init()
453 func_map[i].addr = funclist->addr; in func_map_init()
454 func_map[i].mod = funclist->mod; in func_map_init()
457 funclist = funclist->next; in func_map_init()
461 qsort(func_map, tep->func_count, sizeof(*func_map), func_cmp); in func_map_init()
466 func_map[tep->func_count].func = NULL; in func_map_init()
467 func_map[tep->func_count].addr = 0; in func_map_init()
468 func_map[tep->func_count].mod = NULL; in func_map_init()
470 tep->func_map = func_map; in func_map_init()
471 tep->funclist = NULL; in func_map_init()
482 if (!tep->func_map) in __find_func()
487 func = bsearch(&key, tep->func_map, tep->func_count, in __find_func()
488 sizeof(*tep->func_map), func_bcmp); in __find_func()
500 * tep_set_function_resolver - set an alternative function resolver
501 * @tep: a handle to the trace event parser context
506 * keep using it instead of duplicating all the entries inside tep->funclist.
514 return -1; in tep_set_function_resolver()
516 resolver->func = func; in tep_set_function_resolver()
517 resolver->priv = priv; in tep_set_function_resolver()
519 free(tep->func_resolver); in tep_set_function_resolver()
520 tep->func_resolver = resolver; in tep_set_function_resolver()
526 * tep_reset_function_resolver - reset alternative function resolver
527 * @tep: a handle to the trace event parser context
534 free(tep->func_resolver); in tep_reset_function_resolver()
535 tep->func_resolver = NULL; in tep_reset_function_resolver()
543 if (!tep->func_resolver) in find_func()
546 map = &tep->func_resolver->map; in find_func()
547 map->mod = NULL; in find_func()
548 map->addr = addr; in find_func()
549 map->func = tep->func_resolver->func(tep->func_resolver->priv, in find_func()
550 &map->addr, &map->mod); in find_func()
551 if (map->func == NULL) in find_func()
558 * tep_find_function - find a function by a given address
559 * @tep: a handle to the trace event parser context
574 return map->func; in tep_find_function()
578 * tep_find_function_address - find a function address by a given address
579 * @tep: a handle to the trace event parser context
584 * name and the function offset.
595 return map->addr; in tep_find_function_address()
599 * tep_register_function - register a function with a given address
600 * @tep: a handle to the trace event parser context
601 * @function: the function name to register
605 * This registers a function name with an address and module.
614 return -1; in tep_register_function()
616 item->next = tep->funclist; in tep_register_function()
617 item->func = strdup(func); in tep_register_function()
618 if (!item->func) in tep_register_function()
622 item->mod = strdup(mod); in tep_register_function()
623 if (!item->mod) in tep_register_function()
626 item->mod = NULL; in tep_register_function()
627 item->addr = addr; in tep_register_function()
629 tep->funclist = item; in tep_register_function()
630 tep->func_count++; in tep_register_function()
635 free(item->func); in tep_register_function()
636 item->func = NULL; in tep_register_function()
640 return -1; in tep_register_function()
644 * tep_print_funcs - print out the stored functions
645 * @tep: a handle to the trace event parser context
653 if (!tep->func_map) in tep_print_funcs()
656 for (i = 0; i < (int)tep->func_count; i++) { in tep_print_funcs()
658 tep->func_map[i].addr, in tep_print_funcs()
659 tep->func_map[i].func); in tep_print_funcs()
660 if (tep->func_map[i].mod) in tep_print_funcs()
661 printf(" [%s]\n", tep->func_map[i].mod); in tep_print_funcs()
683 if (pa->addr < pb->addr) in printk_cmp()
684 return -1; in printk_cmp()
685 if (pa->addr > pb->addr) in printk_cmp()
698 printk_map = malloc(sizeof(*printk_map) * (tep->printk_count + 1)); in printk_map_init()
700 return -1; in printk_map_init()
702 printklist = tep->printklist; in printk_map_init()
706 printk_map[i].printk = printklist->printk; in printk_map_init()
707 printk_map[i].addr = printklist->addr; in printk_map_init()
710 printklist = printklist->next; in printk_map_init()
714 qsort(printk_map, tep->printk_count, sizeof(*printk_map), printk_cmp); in printk_map_init()
716 tep->printk_map = printk_map; in printk_map_init()
717 tep->printklist = NULL; in printk_map_init()
728 if (!tep->printk_map && printk_map_init(tep)) in find_printk()
733 printk = bsearch(&key, tep->printk_map, tep->printk_count, in find_printk()
734 sizeof(*tep->printk_map), printk_cmp); in find_printk()
740 * tep_register_print_string - register a string by its address
741 * @tep: a handle to the trace event parser context
755 return -1; in tep_register_print_string()
757 item->next = tep->printklist; in tep_register_print_string()
758 item->addr = addr; in tep_register_print_string()
763 item->printk = strdup(fmt); in tep_register_print_string()
764 if (!item->printk) in tep_register_print_string()
767 p = item->printk + strlen(item->printk) - 1; in tep_register_print_string()
771 p -= 2; in tep_register_print_string()
775 tep->printklist = item; in tep_register_print_string()
776 tep->printk_count++; in tep_register_print_string()
783 return -1; in tep_register_print_string()
787 * tep_print_printk - print out the stored strings
788 * @tep: a handle to the trace event parser context
796 if (!tep->printk_map) in tep_print_printk()
799 for (i = 0; i < (int)tep->printk_count; i++) { in tep_print_printk()
801 tep->printk_map[i].addr, in tep_print_printk()
802 tep->printk_map[i].printk); in tep_print_printk()
811 static int add_event(struct tep_handle *tep, struct tep_event *event) in add_event() argument
814 struct tep_event **events = realloc(tep->events, sizeof(event) * in add_event()
815 (tep->nr_events + 1)); in add_event()
817 return -1; in add_event()
819 tep->events = events; in add_event()
821 for (i = 0; i < tep->nr_events; i++) { in add_event()
822 if (tep->events[i]->id > event->id) in add_event()
825 if (i < tep->nr_events) in add_event()
826 memmove(&tep->events[i + 1], in add_event()
827 &tep->events[i], in add_event()
828 sizeof(event) * (tep->nr_events - i)); in add_event()
830 tep->events[i] = event; in add_event()
831 tep->nr_events++; in add_event()
833 event->tep = tep; in add_event()
854 next = fsym->next; in free_flag_sym()
855 free(fsym->value); in free_flag_sym()
856 free(fsym->str); in free_flag_sym()
869 switch (arg->type) { in free_arg()
871 free(arg->atom.atom); in free_arg()
874 free(arg->field.name); in free_arg()
877 free_arg(arg->flags.field); in free_arg()
878 free(arg->flags.delim); in free_arg()
879 free_flag_sym(arg->flags.flags); in free_arg()
882 free_arg(arg->symbol.field); in free_arg()
883 free_flag_sym(arg->symbol.symbols); in free_arg()
887 free_arg(arg->hex.field); in free_arg()
888 free_arg(arg->hex.size); in free_arg()
891 free_arg(arg->int_array.field); in free_arg()
892 free_arg(arg->int_array.count); in free_arg()
893 free_arg(arg->int_array.el_size); in free_arg()
896 free(arg->typecast.type); in free_arg()
897 free_arg(arg->typecast.item); in free_arg()
901 free(arg->string.string); in free_arg()
904 free(arg->bitmask.bitmask); in free_arg()
908 free(arg->dynarray.index); in free_arg()
911 free(arg->op.op); in free_arg()
912 free_arg(arg->op.left); in free_arg()
913 free_arg(arg->op.right); in free_arg()
916 while (arg->func.args) { in free_arg()
917 farg = arg->func.args; in free_arg()
918 arg->func.args = farg->next; in free_arg()
954 return -1; in __read_char()
960 * peek_char - peek at the next character that will be read
962 * Returns the next character read, or -1 if end of buffer.
967 return -1; in peek_char()
979 return -1; in extend_token()
1024 case '-': in __read_token()
1068 i--; in __read_token()
1073 if (i == (BUFSIZ - 1)) { in __read_token()
1089 i--; in __read_token()
1115 if (i == (BUFSIZ - 1)) { in __read_token()
1184 * free_token - free a token returned by tep_read_token
1194 * read_token - access to utilities to use the tep parser
1242 return -1; in test_type()
1253 return -1; in test_type_token()
1259 return -1; in test_type_token()
1313 if (read_expected(TEP_EVENT_ITEM, "name") < 0) in event_read_name()
1335 return -1; in event_read_id()
1338 return -1; in event_read_id()
1349 return -1; in event_read_id()
1354 if ((field->flags & TEP_FIELD_IS_ARRAY) && in field_is_string()
1355 (strstr(field->type, "char") || strstr(field->type, "u8") || in field_is_string()
1356 strstr(field->type, "s8"))) in field_is_string()
1364 if (strncmp(field->type, "__data_loc", 10) == 0) in field_is_dynamic()
1373 if (strstr(field->type, "long")) in field_is_long()
1379 static unsigned int type_size(const char *name) in type_size() argument
1400 if (!strcmp(table[i].type, name)) in type_size()
1413 return -1; in append()
1420 static int event_read_fields(struct tep_event *event, struct tep_format_field **fields) in event_read_fields() argument
1447 * The ftrace fields may still use the "special" name. in event_read_fields()
1450 if (event->flags & TEP_EVENT_FL_ISFTRACE && in event_read_fields()
1469 field->event = event; in event_read_fields()
1480 (event->flags & TEP_EVENT_FL_ISFTRACE && in event_read_fields()
1484 field->flags |= TEP_FIELD_IS_POINTER; in event_read_fields()
1486 if (field->type) { in event_read_fields()
1487 ret = append(&field->type, delim, last_token); in event_read_fields()
1492 field->type = last_token; in event_read_fields()
1505 ret = append(&field->type, " ", last_token); in event_read_fields()
1506 ret |= append(&field->type, "", "("); in event_read_fields()
1516 depth--; in event_read_fields()
1519 ret = append(&field->type, "", token); in event_read_fields()
1522 ret = append(&field->type, delim, token); in event_read_fields()
1535 if (!field->type) { in event_read_fields()
1536 do_warning_event(event, "%s: no type found", __func__); in event_read_fields()
1539 field->name = field->alias = last_token; in event_read_fields()
1548 field->flags |= TEP_FIELD_IS_ARRAY; in event_read_fields()
1553 field->arraylen = strtoul(token, NULL, 0); in event_read_fields()
1555 field->arraylen = 0; in event_read_fields()
1574 field->arraylen = strtoul(token, NULL, 0); in event_read_fields()
1579 do_warning_event(event, "failed to find token"); in event_read_fields()
1600 ret = append(&field->type, " ", field->name); in event_read_fields()
1605 ret = append(&field->type, "", brackets); in event_read_fields()
1607 size_dynamic = type_size(field->name); in event_read_fields()
1608 free_token(field->name); in event_read_fields()
1609 field->name = field->alias = token; in event_read_fields()
1612 ret = append(&field->type, "", brackets); in event_read_fields()
1622 field->flags |= TEP_FIELD_IS_STRING; in event_read_fields()
1624 field->flags |= TEP_FIELD_IS_DYNAMIC; in event_read_fields()
1626 field->flags |= TEP_FIELD_IS_LONG; in event_read_fields()
1640 field->offset = strtoul(token, NULL, 0); in event_read_fields()
1654 field->size = strtoul(token, NULL, 0); in event_read_fields()
1675 field->flags |= TEP_FIELD_IS_SIGNED; in event_read_fields()
1687 if (field->flags & TEP_FIELD_IS_ARRAY) { in event_read_fields()
1688 if (field->arraylen) in event_read_fields()
1689 field->elementsize = field->size / field->arraylen; in event_read_fields()
1690 else if (field->flags & TEP_FIELD_IS_DYNAMIC) in event_read_fields()
1691 field->elementsize = size_dynamic; in event_read_fields()
1692 else if (field->flags & TEP_FIELD_IS_STRING) in event_read_fields()
1693 field->elementsize = 1; in event_read_fields()
1694 else if (field->flags & TEP_FIELD_IS_LONG) in event_read_fields()
1695 field->elementsize = event->tep ? in event_read_fields()
1696 event->tep->long_size : in event_read_fields()
1699 field->elementsize = field->size; in event_read_fields()
1702 fields = &field->next; in event_read_fields()
1712 free(field->type); in event_read_fields()
1713 free(field->name); in event_read_fields()
1716 return -1; in event_read_fields()
1719 static int event_read_format(struct tep_event *event) in event_read_format() argument
1725 return -1; in event_read_format()
1728 return -1; in event_read_format()
1734 ret = event_read_fields(event, &event->format.common_fields); in event_read_format()
1737 event->format.nr_common = ret; in event_read_format()
1739 ret = event_read_fields(event, &event->format.fields); in event_read_format()
1742 event->format.nr_fields = ret; in event_read_format()
1748 return -1; in event_read_format()
1752 process_arg_token(struct tep_event *event, struct tep_print_arg *arg,
1756 process_arg(struct tep_event *event, struct tep_print_arg *arg, char **tok) in process_arg() argument
1764 return process_arg_token(event, arg, tok, type); in process_arg()
1768 process_op(struct tep_event *event, struct tep_print_arg *arg, char **tok);
1775 process_field_arg(struct tep_event *event, struct tep_print_arg *arg, char **tok) in process_field_arg() argument
1779 type = process_arg(event, arg, tok); in process_field_arg()
1782 type = process_op(event, arg, tok); in process_field_arg()
1789 process_cond(struct tep_event *event, struct tep_print_arg *top, char **tok) in process_cond() argument
1800 do_warning_event(event, "%s: not enough memory!", __func__); in process_cond()
1807 arg->type = TEP_PRINT_OP; in process_cond()
1808 arg->op.left = left; in process_cond()
1809 arg->op.right = right; in process_cond()
1812 type = process_arg(event, left, &token); in process_cond()
1820 type = process_op(event, left, &token); in process_cond()
1827 arg->op.op = token; in process_cond()
1829 type = process_arg(event, right, &token); in process_cond()
1831 top->op.right = arg; in process_cond()
1838 top->op.right = NULL; in process_cond()
1845 process_array(struct tep_event *event, struct tep_print_arg *top, char **tok) in process_array() argument
1853 do_warning_event(event, "%s: not enough memory!", __func__); in process_array()
1854 /* '*tok' is set to top->op.op. No need to free. */ in process_array()
1860 type = process_arg(event, arg, &token); in process_array()
1864 top->op.right = arg; in process_array()
1890 case '-': in get_op_prio()
1907 return -1; in get_op_prio()
1911 strcmp(op, "--") == 0) { in get_op_prio()
1928 return -1; in get_op_prio()
1937 if (!arg->op.left || arg->op.left->type == TEP_PRINT_NULL) in set_op_prio()
1938 arg->op.prio = 0; in set_op_prio()
1940 arg->op.prio = get_op_prio(arg->op.op); in set_op_prio()
1942 return arg->op.prio; in set_op_prio()
1947 process_op(struct tep_event *event, struct tep_print_arg *arg, char **tok) in process_op() argument
1956 if (arg->type == TEP_PRINT_OP && !arg->op.left) { in process_op()
1959 do_warning_event(event, "bad op token %s", token); in process_op()
1966 case '-': in process_op()
1969 do_warning_event(event, "bad op token %s", token); in process_op()
1979 left->type = TEP_PRINT_NULL; in process_op()
1980 arg->op.left = left; in process_op()
1986 arg->op.right = right; in process_op()
1990 type = process_arg(event, right, tok); in process_op()
2001 arg->type = TEP_PRINT_OP; in process_op()
2002 arg->op.op = token; in process_op()
2003 arg->op.left = left; in process_op()
2004 arg->op.prio = 0; in process_op()
2006 /* it will set arg->op.right */ in process_op()
2007 type = process_cond(event, arg, tok); in process_op()
2015 strcmp(token, "-") == 0 || in process_op()
2035 arg->type = TEP_PRINT_OP; in process_op()
2036 arg->op.op = token; in process_op()
2037 arg->op.left = left; in process_op()
2038 arg->op.right = NULL; in process_op()
2040 if (set_op_prio(arg) == -1) { in process_op()
2041 event->flags |= TEP_EVENT_FL_FAILED; in process_op()
2042 /* arg->op.op (= token) will be freed at out_free */ in process_op()
2043 arg->op.op = NULL; in process_op()
2051 if ((strcmp(arg->op.op, "*") == 0) && in process_op()
2055 if (left->type != TEP_PRINT_ATOM) { in process_op()
2056 do_warning_event(event, "bad pointer type"); in process_op()
2059 ret = append(&left->atom.atom, " ", "*"); in process_op()
2063 free(arg->op.op); in process_op()
2074 type = process_arg_token(event, right, tok, type); in process_op()
2082 if (right->type == TEP_PRINT_OP && in process_op()
2083 get_op_prio(arg->op.op) < get_op_prio(right->op.op)) { in process_op()
2087 arg->op.right = right->op.left; in process_op()
2093 arg->op.left = right; in process_op()
2095 arg->op.right = right; in process_op()
2106 arg->type = TEP_PRINT_OP; in process_op()
2107 arg->op.op = token; in process_op()
2108 arg->op.left = left; in process_op()
2110 arg->op.prio = 0; in process_op()
2112 /* it will set arg->op.right */ in process_op()
2113 type = process_array(event, arg, tok); in process_op()
2116 do_warning_event(event, "unknown op '%s'", token); in process_op()
2117 event->flags |= TEP_EVENT_FL_FAILED; in process_op()
2128 if (prio > arg->op.prio) in process_op()
2129 return process_op(event, arg, tok); in process_op()
2131 return process_op(event, right, tok); in process_op()
2137 do_warning_event(event, "%s: not enough memory!", __func__); in process_op()
2145 process_entry(struct tep_event *event __maybe_unused, struct tep_print_arg *arg, in process_entry()
2152 if (read_expected(TEP_EVENT_OP, "->") < 0) in process_entry()
2159 arg->type = TEP_PRINT_FIELD; in process_entry()
2160 arg->field.name = field; in process_entry()
2163 arg->field.field = tep_find_any_field(event, arg->field.name); in process_entry()
2164 arg->field.field->flags |= TEP_FIELD_IS_FLAG; in process_entry()
2167 arg->field.field = tep_find_any_field(event, arg->field.name); in process_entry()
2168 arg->field.field->flags |= TEP_FIELD_IS_SYMBOLIC; in process_entry()
2184 static int alloc_and_process_delim(struct tep_event *event, char *next_token, in alloc_and_process_delim() argument
2194 do_warning_event(event, "%s: not enough memory!", __func__); in alloc_and_process_delim()
2196 return -1; in alloc_and_process_delim()
2199 type = process_arg(event, field, &token); in alloc_and_process_delim()
2203 ret = -1; in alloc_and_process_delim()
2229 if (type[len-1] != '*') { in eval_type_str()
2242 ref[len - 2] = 0; in eval_type_str()
2250 if (type[len - 1] == '*') in eval_type_str()
2315 if (arg->type != TEP_PRINT_TYPE) { in eval_type()
2320 return eval_type_str(val, arg->typecast.type, pointer); in eval_type()
2328 switch (arg->type) { in arg_num_eval()
2330 *val = strtoll(arg->atom.atom, NULL, 0); in arg_num_eval()
2333 ret = arg_num_eval(arg->typecast.item, val); in arg_num_eval()
2339 switch (arg->op.op[0]) { in arg_num_eval()
2341 ret = arg_num_eval(arg->op.left, &left); in arg_num_eval()
2344 ret = arg_num_eval(arg->op.right, &right); in arg_num_eval()
2347 if (arg->op.op[1]) in arg_num_eval()
2353 ret = arg_num_eval(arg->op.left, &left); in arg_num_eval()
2356 ret = arg_num_eval(arg->op.right, &right); in arg_num_eval()
2359 if (arg->op.op[1]) in arg_num_eval()
2365 ret = arg_num_eval(arg->op.left, &left); in arg_num_eval()
2368 ret = arg_num_eval(arg->op.right, &right); in arg_num_eval()
2371 switch (arg->op.op[1]) { in arg_num_eval()
2382 do_warning("unknown op '%s'", arg->op.op); in arg_num_eval()
2387 ret = arg_num_eval(arg->op.left, &left); in arg_num_eval()
2390 ret = arg_num_eval(arg->op.right, &right); in arg_num_eval()
2393 switch (arg->op.op[1]) { in arg_num_eval()
2404 do_warning("unknown op '%s'", arg->op.op); in arg_num_eval()
2409 ret = arg_num_eval(arg->op.left, &left); in arg_num_eval()
2412 ret = arg_num_eval(arg->op.right, &right); in arg_num_eval()
2416 if (arg->op.op[1] != '=') { in arg_num_eval()
2417 do_warning("unknown op '%s'", arg->op.op); in arg_num_eval()
2423 ret = arg_num_eval(arg->op.left, &left); in arg_num_eval()
2426 ret = arg_num_eval(arg->op.right, &right); in arg_num_eval()
2430 switch (arg->op.op[1]) { in arg_num_eval()
2435 do_warning("unknown op '%s'", arg->op.op); in arg_num_eval()
2439 case '-': in arg_num_eval()
2441 if (arg->op.left->type == TEP_PRINT_NULL) in arg_num_eval()
2444 ret = arg_num_eval(arg->op.left, &left); in arg_num_eval()
2447 ret = arg_num_eval(arg->op.right, &right); in arg_num_eval()
2450 *val = left - right; in arg_num_eval()
2453 if (arg->op.left->type == TEP_PRINT_NULL) in arg_num_eval()
2456 ret = arg_num_eval(arg->op.left, &left); in arg_num_eval()
2459 ret = arg_num_eval(arg->op.right, &right); in arg_num_eval()
2465 ret = arg_num_eval(arg->op.right, &right); in arg_num_eval()
2471 do_warning("unknown op '%s'", arg->op.op); in arg_num_eval()
2482 do_warning("invalid eval type %d", arg->type); in arg_num_eval()
2494 switch (arg->type) { in arg_eval()
2496 return arg->atom.atom; in arg_eval()
2498 return arg_eval(arg->typecast.item); in arg_eval()
2511 do_warning("invalid eval type %d", arg->type); in arg_eval()
2519 process_fields(struct tep_event *event, struct tep_print_flag_sym **list, char **tok) in process_fields() argument
2538 type = process_arg(event, arg, &token); in process_fields()
2541 type = process_op(event, arg, &token); in process_fields()
2556 field->value = strdup(value); in process_fields()
2557 if (field->value == NULL) in process_fields()
2566 type = process_arg(event, arg, &token); in process_fields()
2573 field->str = strdup(value); in process_fields()
2574 if (field->str == NULL) in process_fields()
2580 list = &field->next; in process_fields()
2600 process_flags(struct tep_event *event, struct tep_print_arg *arg, char **tok) in process_flags() argument
2607 arg->type = TEP_PRINT_FLAGS; in process_flags()
2611 do_warning_event(event, "%s: not enough memory!", __func__); in process_flags()
2615 type = process_field_arg(event, field, &token); in process_flags()
2619 type = process_op(event, field, &token); in process_flags()
2625 arg->flags.field = field; in process_flags()
2629 arg->flags.delim = token; in process_flags()
2636 type = process_fields(event, &arg->flags.flags, &token); in process_flags()
2653 process_symbols(struct tep_event *event, struct tep_print_arg *arg, char **tok) in process_symbols() argument
2660 arg->type = TEP_PRINT_SYMBOL; in process_symbols()
2664 do_warning_event(event, "%s: not enough memory!", __func__); in process_symbols()
2668 type = process_field_arg(event, field, &token); in process_symbols()
2673 arg->symbol.field = field; in process_symbols()
2675 type = process_fields(event, &arg->symbol.symbols, &token); in process_symbols()
2692 process_hex_common(struct tep_event *event, struct tep_print_arg *arg, in process_hex_common() argument
2696 arg->type = type; in process_hex_common()
2698 if (alloc_and_process_delim(event, ",", &arg->hex.field)) in process_hex_common()
2701 if (alloc_and_process_delim(event, ")", &arg->hex.size)) in process_hex_common()
2707 free_arg(arg->hex.field); in process_hex_common()
2708 arg->hex.field = NULL; in process_hex_common()
2715 process_hex(struct tep_event *event, struct tep_print_arg *arg, char **tok) in process_hex() argument
2717 return process_hex_common(event, arg, tok, TEP_PRINT_HEX); in process_hex()
2721 process_hex_str(struct tep_event *event, struct tep_print_arg *arg, in process_hex_str() argument
2724 return process_hex_common(event, arg, tok, TEP_PRINT_HEX_STR); in process_hex_str()
2728 process_int_array(struct tep_event *event, struct tep_print_arg *arg, char **tok) in process_int_array() argument
2731 arg->type = TEP_PRINT_INT_ARRAY; in process_int_array()
2733 if (alloc_and_process_delim(event, ",", &arg->int_array.field)) in process_int_array()
2736 if (alloc_and_process_delim(event, ",", &arg->int_array.count)) in process_int_array()
2739 if (alloc_and_process_delim(event, ")", &arg->int_array.el_size)) in process_int_array()
2745 free_arg(arg->int_array.count); in process_int_array()
2746 arg->int_array.count = NULL; in process_int_array()
2748 free_arg(arg->int_array.field); in process_int_array()
2749 arg->int_array.field = NULL; in process_int_array()
2756 process_dynamic_array(struct tep_event *event, struct tep_print_arg *arg, char **tok) in process_dynamic_array() argument
2763 arg->type = TEP_PRINT_DYNAMIC_ARRAY; in process_dynamic_array()
2776 field = tep_find_field(event, token); in process_dynamic_array()
2780 arg->dynarray.field = field; in process_dynamic_array()
2781 arg->dynarray.index = 0; in process_dynamic_array()
2795 do_warning_event(event, "%s: not enough memory!", __func__); in process_dynamic_array()
2800 type = process_arg(event, arg, &token); in process_dynamic_array()
2820 process_dynamic_array_len(struct tep_event *event, struct tep_print_arg *arg, in process_dynamic_array_len() argument
2830 arg->type = TEP_PRINT_DYNAMIC_ARRAY_LEN; in process_dynamic_array_len()
2833 field = tep_find_field(event, token); in process_dynamic_array_len()
2837 arg->dynarray.field = field; in process_dynamic_array_len()
2838 arg->dynarray.index = 0; in process_dynamic_array_len()
2857 process_paren(struct tep_event *event, struct tep_print_arg *arg, char **tok) in process_paren() argument
2863 type = process_arg(event, arg, &token); in process_paren()
2869 type = process_op(event, arg, &token); in process_paren()
2890 if (arg->type != TEP_PRINT_ATOM) { in process_paren()
2891 do_warning_event(event, "previous needed to be TEP_PRINT_ATOM"); in process_paren()
2897 do_warning_event(event, "%s: not enough memory!", in process_paren()
2902 arg->type = TEP_PRINT_TYPE; in process_paren()
2903 arg->typecast.type = arg->atom.atom; in process_paren()
2904 arg->typecast.item = item_arg; in process_paren()
2905 type = process_arg_token(event, item_arg, &token, type); in process_paren()
2920 process_str(struct tep_event *event __maybe_unused, struct tep_print_arg *arg, in process_str()
2929 arg->type = TEP_PRINT_STRING; in process_str()
2930 arg->string.string = token; in process_str()
2931 arg->string.offset = -1; in process_str()
2949 process_bitmask(struct tep_event *event __maybe_unused, struct tep_print_arg *arg, in process_bitmask()
2958 arg->type = TEP_PRINT_BITMASK; in process_bitmask()
2959 arg->bitmask.bitmask = token; in process_bitmask()
2960 arg->bitmask.offset = -1; in process_bitmask()
2985 for (func = tep->func_handlers; func; func = func->next) { in find_func_handler()
2986 if (strcmp(func->name, func_name) == 0) in find_func_handler()
2998 next = &tep->func_handlers; in remove_func_handler()
3000 if (strcmp(func->name, func_name) == 0) { in remove_func_handler()
3001 *next = func->next; in remove_func_handler()
3005 next = &func->next; in remove_func_handler()
3010 process_func_handler(struct tep_event *event, struct tep_function_handler *func, in process_func_handler() argument
3019 arg->type = TEP_PRINT_FUNC; in process_func_handler()
3020 arg->func.func = func; in process_func_handler()
3024 next_arg = &(arg->func.args); in process_func_handler()
3025 for (i = 0; i < func->nr_args; i++) { in process_func_handler()
3028 do_warning_event(event, "%s: not enough memory!", in process_func_handler()
3033 type = process_arg(event, farg, &token); in process_func_handler()
3034 if (i < (func->nr_args - 1)) { in process_func_handler()
3036 do_warning_event(event, in process_func_handler()
3037 "Error: function '%s()' expects %d arguments but event %s only uses %d", in process_func_handler()
3038 func->name, func->nr_args, in process_func_handler()
3039 event->name, i + 1); in process_func_handler()
3044 do_warning_event(event, in process_func_handler()
3045 "Error: function '%s()' only expects %d arguments but event %s has more", in process_func_handler()
3046 func->name, func->nr_args, event->name); in process_func_handler()
3052 next_arg = &(farg->next); in process_func_handler()
3068 process_builtin_expect(struct tep_event *event, struct tep_print_arg *arg, char **tok) in process_builtin_expect() argument
3074 type = process_arg(event, arg, &token); in process_builtin_expect()
3099 process_function(struct tep_event *event, struct tep_print_arg *arg, in process_function() argument
3107 return process_flags(event, arg, tok); in process_function()
3112 return process_symbols(event, arg, tok); in process_function()
3116 return process_hex(event, arg, tok); in process_function()
3120 return process_hex_str(event, arg, tok); in process_function()
3124 return process_int_array(event, arg, tok); in process_function()
3128 return process_str(event, arg, tok); in process_function()
3132 return process_bitmask(event, arg, tok); in process_function()
3136 return process_dynamic_array(event, arg, tok); in process_function()
3140 return process_dynamic_array_len(event, arg, tok); in process_function()
3144 return process_builtin_expect(event, arg, tok); in process_function()
3147 func = find_func_handler(event->tep, token); in process_function()
3150 return process_func_handler(event, func, arg, tok); in process_function()
3153 do_warning_event(event, "function %s not defined", token); in process_function()
3159 process_arg_token(struct tep_event *event, struct tep_print_arg *arg, in process_arg_token() argument
3171 type = process_entry(event, arg, &token); in process_arg_token()
3186 type = process_function(event, arg, atom, &token); in process_arg_token()
3204 arg->type = TEP_PRINT_ATOM; in process_arg_token()
3205 arg->atom.atom = atom; in process_arg_token()
3210 arg->type = TEP_PRINT_ATOM; in process_arg_token()
3211 arg->atom.atom = token; in process_arg_token()
3217 type = process_paren(event, arg, &token); in process_arg_token()
3222 arg->type = TEP_PRINT_OP; in process_arg_token()
3223 arg->op.op = token; in process_arg_token()
3224 arg->op.left = NULL; in process_arg_token()
3225 type = process_op(event, arg, &token); in process_arg_token()
3229 arg->op.op = NULL; in process_arg_token()
3236 do_warning_event(event, "unexpected type %d", type); in process_arg_token()
3244 static int event_read_print_args(struct tep_event *event, struct tep_print_arg **list) in event_read_print_args() argument
3259 do_warning_event(event, "%s: not enough memory!", in event_read_print_args()
3261 return -1; in event_read_print_args()
3264 type = process_arg(event, arg, &token); in event_read_print_args()
3269 return -1; in event_read_print_args()
3276 type = process_op(event, arg, &token); in event_read_print_args()
3281 return -1; in event_read_print_args()
3283 list = &arg->next; in event_read_print_args()
3290 list = &arg->next; in event_read_print_args()
3302 static int event_read_print(struct tep_event *event) in event_read_print() argument
3309 return -1; in event_read_print()
3312 return -1; in event_read_print()
3315 return -1; in event_read_print()
3321 event->print_fmt.format = token; in event_read_print()
3322 event->print_fmt.args = NULL; in event_read_print()
3334 if (asprintf(&cat, "%s%s", event->print_fmt.format, token) < 0) in event_read_print()
3337 free_token(event->print_fmt.format); in event_read_print()
3338 event->print_fmt.format = NULL; in event_read_print()
3348 ret = event_read_print_args(event, &event->print_fmt.args); in event_read_print()
3350 return -1; in event_read_print()
3356 return -1; in event_read_print()
3360 * tep_find_common_field - return a common field by event
3361 * @event: handle for the event
3362 * @name: the name of the common field to return
3364 * Returns a common field from the event by the given @name.
3368 tep_find_common_field(struct tep_event *event, const char *name) in tep_find_common_field() argument
3372 for (format = event->format.common_fields; in tep_find_common_field()
3373 format; format = format->next) { in tep_find_common_field()
3374 if (strcmp(format->name, name) == 0) in tep_find_common_field()
3382 * tep_find_field - find a non-common field
3383 * @event: handle for the event
3384 * @name: the name of the non-common field
3386 * Returns a non-common field by the given @name.
3390 tep_find_field(struct tep_event *event, const char *name) in tep_find_field() argument
3394 for (format = event->format.fields; in tep_find_field()
3395 format; format = format->next) { in tep_find_field()
3396 if (strcmp(format->name, name) == 0) in tep_find_field()
3404 * tep_find_any_field - find any field by name
3405 * @event: handle for the event
3406 * @name: the name of the field
3408 * Returns a field by the given @name.
3410 * the non-common ones if a common one was not found.
3413 tep_find_any_field(struct tep_event *event, const char *name) in tep_find_any_field() argument
3417 format = tep_find_common_field(event, name); in tep_find_any_field()
3420 return tep_find_field(event, name); in tep_find_any_field()
3424 * tep_read_number - read a number from data
3425 * @tep: a handle to the trace event parser context
3454 * tep_read_number_field - read a number from data
3462 * Returns 0 on success, -1 otherwise.
3468 return -1; in tep_read_number_field()
3469 switch (field->size) { in tep_read_number_field()
3474 *value = tep_read_number(field->event->tep, in tep_read_number_field()
3475 data + field->offset, field->size); in tep_read_number_field()
3478 return -1; in tep_read_number_field()
3485 struct tep_event *event; in get_common_info() local
3490 * Pick any event to find where the type is; in get_common_info()
3492 if (!tep->events) { in get_common_info()
3494 return -1; in get_common_info()
3497 event = tep->events[0]; in get_common_info()
3498 field = tep_find_common_field(event, type); in get_common_info()
3500 return -1; in get_common_info()
3502 *offset = field->offset; in get_common_info()
3503 *size = field->size; in get_common_info()
3509 int *size, int *offset, const char *name) in __parse_common() argument
3514 ret = get_common_info(tep, name, offset, size); in __parse_common()
3524 &tep->type_size, &tep->type_offset, in trace_parse_common_type()
3531 &tep->pid_size, &tep->pid_offset, in parse_common_pid()
3538 &tep->pc_size, &tep->pc_offset, in parse_common_pc()
3545 &tep->flags_size, &tep->flags_offset, in parse_common_flags()
3552 &tep->ld_size, &tep->ld_offset, in parse_common_lock_depth()
3559 &tep->ld_size, &tep->ld_offset, in parse_common_migrate_disable()
3566 * tep_find_event - find an event by given id
3567 * @tep: a handle to the trace event parser context
3568 * @id: the id of the event
3570 * Returns an event that has a given @id.
3579 if (tep->last_event && tep->last_event->id == id) in tep_find_event()
3580 return tep->last_event; in tep_find_event()
3584 eventptr = bsearch(&pkey, tep->events, tep->nr_events, in tep_find_event()
3585 sizeof(*tep->events), events_id_cmp); in tep_find_event()
3588 tep->last_event = *eventptr; in tep_find_event()
3596 * tep_find_event_by_name - find an event by given name
3597 * @tep: a handle to the trace event parser context
3598 * @sys: the system name to search for
3599 * @name: the name of the event to search for
3601 * This returns an event with a given @name and under the system
3602 * @sys. If @sys is NULL the first event with @name is returned.
3606 const char *sys, const char *name) in tep_find_event_by_name() argument
3608 struct tep_event *event = NULL; in tep_find_event_by_name() local
3611 if (tep->last_event && in tep_find_event_by_name()
3612 strcmp(tep->last_event->name, name) == 0 && in tep_find_event_by_name()
3613 (!sys || strcmp(tep->last_event->system, sys) == 0)) in tep_find_event_by_name()
3614 return tep->last_event; in tep_find_event_by_name()
3616 for (i = 0; i < tep->nr_events; i++) { in tep_find_event_by_name()
3617 event = tep->events[i]; in tep_find_event_by_name()
3618 if (strcmp(event->name, name) == 0) { in tep_find_event_by_name()
3621 if (strcmp(event->system, sys) == 0) in tep_find_event_by_name()
3625 if (i == tep->nr_events) in tep_find_event_by_name()
3626 event = NULL; in tep_find_event_by_name()
3628 tep->last_event = event; in tep_find_event_by_name()
3629 return event; in tep_find_event_by_name()
3633 eval_num_arg(void *data, int size, struct tep_event *event, struct tep_print_arg *arg) in eval_num_arg() argument
3635 struct tep_handle *tep = event->tep; in eval_num_arg()
3643 switch (arg->type) { in eval_num_arg()
3648 return strtoull(arg->atom.atom, NULL, 0); in eval_num_arg()
3650 if (!arg->field.field) { in eval_num_arg()
3651 arg->field.field = tep_find_any_field(event, arg->field.name); in eval_num_arg()
3652 if (!arg->field.field) in eval_num_arg()
3657 val = tep_read_number(tep, data + arg->field.field->offset, in eval_num_arg()
3658 arg->field.field->size); in eval_num_arg()
3667 val = eval_num_arg(data, size, event, arg->typecast.item); in eval_num_arg()
3676 val = process_defined_func(&s, data, size, event, arg); in eval_num_arg()
3681 if (strcmp(arg->op.op, "[") == 0) { in eval_num_arg()
3686 right = eval_num_arg(data, size, event, arg->op.right); in eval_num_arg()
3689 larg = arg->op.left; in eval_num_arg()
3690 while (larg->type == TEP_PRINT_TYPE) { in eval_num_arg()
3693 larg = larg->typecast.item; in eval_num_arg()
3697 field_size = tep->long_size; in eval_num_arg()
3699 switch (larg->type) { in eval_num_arg()
3702 data + larg->dynarray.field->offset, in eval_num_arg()
3703 larg->dynarray.field->size); in eval_num_arg()
3704 if (larg->dynarray.field->elementsize) in eval_num_arg()
3705 field_size = larg->dynarray.field->elementsize; in eval_num_arg()
3715 if (!larg->field.field) { in eval_num_arg()
3716 larg->field.field = in eval_num_arg()
3717 tep_find_any_field(event, larg->field.name); in eval_num_arg()
3718 if (!larg->field.field) { in eval_num_arg()
3723 field_size = larg->field.field->elementsize; in eval_num_arg()
3724 offset = larg->field.field->offset + in eval_num_arg()
3725 right * larg->field.field->elementsize; in eval_num_arg()
3735 } else if (strcmp(arg->op.op, "?") == 0) { in eval_num_arg()
3736 left = eval_num_arg(data, size, event, arg->op.left); in eval_num_arg()
3737 arg = arg->op.right; in eval_num_arg()
3739 val = eval_num_arg(data, size, event, arg->op.left); in eval_num_arg()
3741 val = eval_num_arg(data, size, event, arg->op.right); in eval_num_arg()
3745 left = eval_num_arg(data, size, event, arg->op.left); in eval_num_arg()
3746 right = eval_num_arg(data, size, event, arg->op.right); in eval_num_arg()
3747 switch (arg->op.op[0]) { in eval_num_arg()
3749 switch (arg->op.op[1]) { in eval_num_arg()
3764 if (arg->op.op[1]) in eval_num_arg()
3770 if (arg->op.op[1]) in eval_num_arg()
3776 switch (arg->op.op[1]) { in eval_num_arg()
3791 switch (arg->op.op[1]) { in eval_num_arg()
3806 if (arg->op.op[1] != '=') in eval_num_arg()
3811 case '-': in eval_num_arg()
3812 val = left - right; in eval_num_arg()
3832 data + arg->dynarray.field->offset, in eval_num_arg()
3833 arg->dynarray.field->size); in eval_num_arg()
3844 data + arg->dynarray.field->offset, in eval_num_arg()
3845 arg->dynarray.field->size); in eval_num_arg()
3860 do_warning_event(event, "%s: unknown op '%s'", __func__, arg->op.op); in eval_num_arg()
3864 do_warning_event(event, "%s: field %s not found", in eval_num_arg()
3865 __func__, arg->field.name); in eval_num_arg()
3870 const char *name; member
3903 if (strcmp(flags[i].name, flag) == 0) in eval_flag()
3906 return -1LL; in eval_flag()
3934 str_size += (nr_bits - 1) / 32; in print_bitmask_to_seq()
3943 /* Start out with -2 for the two chars per byte */ in print_bitmask_to_seq()
3944 for (i = str_size - 2; i >= 0; i -= 2) { in print_bitmask_to_seq()
3950 if (tep->file_bigendian) in print_bitmask_to_seq()
3951 index = size - (len + 1); in print_bitmask_to_seq()
3959 i--; in print_bitmask_to_seq()
3973 struct tep_event *event, const char *format, in print_str_arg() argument
3976 struct tep_handle *tep = event->tep; in print_str_arg()
3987 switch (arg->type) { in print_str_arg()
3992 print_str_to_seq(s, format, len_arg, arg->atom.atom); in print_str_arg()
3995 field = arg->field.field; in print_str_arg()
3997 field = tep_find_any_field(event, arg->field.name); in print_str_arg()
3999 str = arg->field.name; in print_str_arg()
4002 arg->field.field = field; in print_str_arg()
4005 len = field->size ? : size - field->offset; in print_str_arg()
4012 if (!(field->flags & TEP_FIELD_IS_ARRAY) && in print_str_arg()
4013 field->size == tep->long_size) { in print_str_arg()
4019 * Traces recorded on 32-bit devices (32-bit in print_str_arg()
4020 * addressing) and processed on 64-bit devices: in print_str_arg()
4025 * on 32-bit devices: in print_str_arg()
4028 addr = (tep->long_size == 8) ? in print_str_arg()
4029 *(unsigned long long *)(data + field->offset) : in print_str_arg()
4030 (unsigned long long)*(unsigned int *)(data + field->offset); in print_str_arg()
4035 trace_seq_puts(s, printk->printk); in print_str_arg()
4042 do_warning_event(event, "%s: not enough memory!", in print_str_arg()
4046 memcpy(str, data + field->offset, len); in print_str_arg()
4052 val = eval_num_arg(data, size, event, arg->flags.field); in print_str_arg()
4054 for (flag = arg->flags.flags; flag; flag = flag->next) { in print_str_arg()
4055 fval = eval_flag(flag->value); in print_str_arg()
4057 print_str_to_seq(s, format, len_arg, flag->str); in print_str_arg()
4061 if (print && arg->flags.delim) in print_str_arg()
4062 trace_seq_puts(s, arg->flags.delim); in print_str_arg()
4063 print_str_to_seq(s, format, len_arg, flag->str); in print_str_arg()
4069 if (print && arg->flags.delim) in print_str_arg()
4070 trace_seq_puts(s, arg->flags.delim); in print_str_arg()
4075 val = eval_num_arg(data, size, event, arg->symbol.field); in print_str_arg()
4076 for (flag = arg->symbol.symbols; flag; flag = flag->next) { in print_str_arg()
4077 fval = eval_flag(flag->value); in print_str_arg()
4079 print_str_to_seq(s, format, len_arg, flag->str); in print_str_arg()
4088 if (arg->hex.field->type == TEP_PRINT_DYNAMIC_ARRAY) { in print_str_arg()
4091 data + arg->hex.field->dynarray.field->offset, in print_str_arg()
4092 arg->hex.field->dynarray.field->size); in print_str_arg()
4095 field = arg->hex.field->field.field; in print_str_arg()
4097 str = arg->hex.field->field.name; in print_str_arg()
4098 field = tep_find_any_field(event, str); in print_str_arg()
4101 arg->hex.field->field.field = field; in print_str_arg()
4103 hex = data + field->offset; in print_str_arg()
4105 len = eval_num_arg(data, size, event, arg->hex.size); in print_str_arg()
4107 if (i && arg->type == TEP_PRINT_HEX) in print_str_arg()
4117 if (arg->int_array.field->type == TEP_PRINT_DYNAMIC_ARRAY) { in print_str_arg()
4120 arg->int_array.field->dynarray.field; in print_str_arg()
4122 data + field->offset, in print_str_arg()
4123 field->size); in print_str_arg()
4126 field = arg->int_array.field->field.field; in print_str_arg()
4128 str = arg->int_array.field->field.name; in print_str_arg()
4129 field = tep_find_any_field(event, str); in print_str_arg()
4132 arg->int_array.field->field.field = field; in print_str_arg()
4134 num = data + field->offset; in print_str_arg()
4136 len = eval_num_arg(data, size, event, arg->int_array.count); in print_str_arg()
4137 el_size = eval_num_arg(data, size, event, in print_str_arg()
4138 arg->int_array.el_size); in print_str_arg()
4166 if (arg->string.offset == -1) { in print_str_arg()
4169 f = tep_find_any_field(event, arg->string.string); in print_str_arg()
4170 arg->string.offset = f->offset; in print_str_arg()
4172 str_offset = data2host4(tep, *(unsigned int *)(data + arg->string.offset)); in print_str_arg()
4178 print_str_to_seq(s, format, len_arg, arg->string.string); in print_str_arg()
4184 if (arg->bitmask.offset == -1) { in print_str_arg()
4187 f = tep_find_any_field(event, arg->bitmask.bitmask); in print_str_arg()
4188 arg->bitmask.offset = f->offset; in print_str_arg()
4190 bitmask_offset = data2host4(tep, *(unsigned int *)(data + arg->bitmask.offset)); in print_str_arg()
4201 if (arg->op.op[0] != '?') in print_str_arg()
4203 val = eval_num_arg(data, size, event, arg->op.left); in print_str_arg()
4205 print_str_arg(s, data, size, event, in print_str_arg()
4206 format, len_arg, arg->op.right->op.left); in print_str_arg()
4208 print_str_arg(s, data, size, event, in print_str_arg()
4209 format, len_arg, arg->op.right->op.right); in print_str_arg()
4212 process_defined_func(s, data, size, event, arg); in print_str_arg()
4222 do_warning_event(event, "%s: field %s not found", in print_str_arg()
4223 __func__, arg->field.name); in print_str_arg()
4228 struct tep_event *event, struct tep_print_arg *arg) in process_defined_func() argument
4230 struct tep_function_handler *func_handle = arg->func.func; in process_defined_func()
4242 if (!func_handle->nr_args) { in process_defined_func()
4243 ret = (*func_handle->func)(s, NULL); in process_defined_func()
4247 farg = arg->func.args; in process_defined_func()
4248 param = func_handle->params; in process_defined_func()
4251 args = malloc(sizeof(*args) * func_handle->nr_args); in process_defined_func()
4255 for (i = 0; i < func_handle->nr_args; i++) { in process_defined_func()
4256 switch (param->type) { in process_defined_func()
4260 args[i] = eval_num_arg(data, size, event, farg); in process_defined_func()
4264 print_str_arg(&str, data, size, event, "%s", -1, farg); in process_defined_func()
4268 do_warning_event(event, "%s(%d): malloc str", in process_defined_func()
4272 string->next = strings; in process_defined_func()
4273 string->str = strdup(str.buffer); in process_defined_func()
4274 if (!string->str) { in process_defined_func()
4276 do_warning_event(event, "%s(%d): malloc str", in process_defined_func()
4280 args[i] = (uintptr_t)string->str; in process_defined_func()
4289 do_warning_event(event, "Unexpected end of arguments\n"); in process_defined_func()
4292 farg = farg->next; in process_defined_func()
4293 param = param->next; in process_defined_func()
4296 ret = (*func_handle->func)(s, args); in process_defined_func()
4301 strings = string->next; in process_defined_func()
4302 free(string->str); in process_defined_func()
4316 next = args->next; in free_args()
4323 …ic struct tep_print_arg *make_bprint_args(char *fmt, void *data, int size, struct tep_event *event) in make_bprint_args() argument
4325 struct tep_handle *tep = event->tep; in make_bprint_args()
4333 field = tep->bprint_buf_field; in make_bprint_args()
4334 ip_field = tep->bprint_ip_field; in make_bprint_args()
4337 field = tep_find_field(event, "buf"); in make_bprint_args()
4339 do_warning_event(event, "can't find buffer field for binary printk"); in make_bprint_args()
4342 ip_field = tep_find_field(event, "ip"); in make_bprint_args()
4344 do_warning_event(event, "can't find ip field for binary printk"); in make_bprint_args()
4347 tep->bprint_buf_field = field; in make_bprint_args()
4348 tep->bprint_ip_field = ip_field; in make_bprint_args()
4351 ip = tep_read_number(tep, data + ip_field->offset, ip_field->size); in make_bprint_args()
4358 do_warning_event(event, "%s(%d): not enough memory!", in make_bprint_args()
4363 arg->next = NULL; in make_bprint_args()
4364 next = &arg->next; in make_bprint_args()
4366 arg->type = TEP_PRINT_ATOM; in make_bprint_args()
4368 if (asprintf(&arg->atom.atom, "%lld", ip) < 0) in make_bprint_args()
4372 for (ptr = fmt + 5, bptr = data + field->offset; in make_bprint_args()
4409 * Pre-5.5 kernels use %pf and in make_bprint_args()
4441 vsize = tep->long_size; in make_bprint_args()
4462 do_warning_event(event, "%s(%d): not enough memory!", in make_bprint_args()
4466 arg->next = NULL; in make_bprint_args()
4467 arg->type = TEP_PRINT_ATOM; in make_bprint_args()
4468 if (asprintf(&arg->atom.atom, "%lld", val) < 0) { in make_bprint_args()
4473 next = &arg->next; in make_bprint_args()
4486 do_warning_event(event, "%s(%d): not enough memory!", in make_bprint_args()
4490 arg->next = NULL; in make_bprint_args()
4491 arg->type = TEP_PRINT_BSTRING; in make_bprint_args()
4492 arg->string.string = strdup(bptr); in make_bprint_args()
4493 if (!arg->string.string) in make_bprint_args()
4497 next = &arg->next; in make_bprint_args()
4513 struct tep_event *event) in get_bprint_format() argument
4515 struct tep_handle *tep = event->tep; in get_bprint_format()
4521 field = tep->bprint_fmt_field; in get_bprint_format()
4524 field = tep_find_field(event, "fmt"); in get_bprint_format()
4526 do_warning_event(event, "can't find format field for binary printk"); in get_bprint_format()
4529 tep->bprint_fmt_field = field; in get_bprint_format()
4532 addr = tep_read_number(tep, data + field->offset, field->size); in get_bprint_format()
4541 if (asprintf(&format, "%s: %s", "%ps", printk->printk) < 0) in get_bprint_format()
4548 void *data, int size, struct tep_event *event, in print_mac_arg() argument
4556 if (arg->type == TEP_PRINT_FUNC) { in print_mac_arg()
4557 process_defined_func(s, data, size, event, arg); in print_mac_arg()
4561 if (arg->type != TEP_PRINT_FIELD) { in print_mac_arg()
4563 arg->type); in print_mac_arg()
4570 fmt = "%.2x-%.2x-%.2x-%.2x-%.2x-%.2x"; in print_mac_arg()
4578 if (!arg->field.field) { in print_mac_arg()
4579 arg->field.field = in print_mac_arg()
4580 tep_find_any_field(event, arg->field.name); in print_mac_arg()
4581 if (!arg->field.field) { in print_mac_arg()
4582 do_warning_event(event, "%s: field %s not found", in print_mac_arg()
4583 __func__, arg->field.name); in print_mac_arg()
4587 if (arg->field.field->size != 6) { in print_mac_arg()
4592 buf = data + arg->field.field->offset; in print_mac_arg()
4611 if (tep->file_bigendian) in parse_ip4_print_args()
4651 return ((unsigned long)(a->s6_addr32[0] | a->s6_addr32[1]) | in ipv6_addr_v4mapped()
4652 (unsigned long)(a->s6_addr32[2] ^ htonl(0x0000ffff))) == 0UL; in ipv6_addr_v4mapped()
4657 return (addr->s6_addr32[2] | htonl(0x02000000)) == htonl(0x02005EFE); in ipv6_addr_is_isatap()
4665 int colonpos = -1; in print_ip6c_addr()
4698 colonpos = -1; in print_ip6c_addr()
4707 i += longest - 1; in print_ip6c_addr()
4755 void *data, int size, struct tep_event *event, in print_ipv4_arg() argument
4762 ret = parse_ip4_print_args(event->tep, ptr, &reverse); in print_ipv4_arg()
4764 if (arg->type == TEP_PRINT_FUNC) { in print_ipv4_arg()
4765 process_defined_func(s, data, size, event, arg); in print_ipv4_arg()
4769 if (arg->type != TEP_PRINT_FIELD) { in print_ipv4_arg()
4770 trace_seq_printf(s, "ARG TYPE NOT FIELD BUT %d", arg->type); in print_ipv4_arg()
4774 if (!arg->field.field) { in print_ipv4_arg()
4775 arg->field.field = in print_ipv4_arg()
4776 tep_find_any_field(event, arg->field.name); in print_ipv4_arg()
4777 if (!arg->field.field) { in print_ipv4_arg()
4779 __func__, arg->field.name); in print_ipv4_arg()
4784 buf = data + arg->field.field->offset; in print_ipv4_arg()
4786 if (arg->field.field->size != 4) { in print_ipv4_arg()
4797 void *data, int size, struct tep_event *event, in print_ipv6_arg() argument
4811 if (arg->type == TEP_PRINT_FUNC) { in print_ipv6_arg()
4812 process_defined_func(s, data, size, event, arg); in print_ipv6_arg()
4816 if (arg->type != TEP_PRINT_FIELD) { in print_ipv6_arg()
4817 trace_seq_printf(s, "ARG TYPE NOT FIELD BUT %d", arg->type); in print_ipv6_arg()
4821 if (!arg->field.field) { in print_ipv6_arg()
4822 arg->field.field = in print_ipv6_arg()
4823 tep_find_any_field(event, arg->field.name); in print_ipv6_arg()
4824 if (!arg->field.field) { in print_ipv6_arg()
4826 __func__, arg->field.name); in print_ipv6_arg()
4831 buf = data + arg->field.field->offset; in print_ipv6_arg()
4833 if (arg->field.field->size != 16) { in print_ipv6_arg()
4847 void *data, int size, struct tep_event *event, in print_ipsa_arg() argument
4870 ret = parse_ip4_print_args(event->tep, ptr, &reverse); in print_ipsa_arg()
4874 if (arg->type == TEP_PRINT_FUNC) { in print_ipsa_arg()
4875 process_defined_func(s, data, size, event, arg); in print_ipsa_arg()
4879 if (arg->type != TEP_PRINT_FIELD) { in print_ipsa_arg()
4880 trace_seq_printf(s, "ARG TYPE NOT FIELD BUT %d", arg->type); in print_ipsa_arg()
4884 if (!arg->field.field) { in print_ipsa_arg()
4885 arg->field.field = in print_ipsa_arg()
4886 tep_find_any_field(event, arg->field.name); in print_ipsa_arg()
4887 if (!arg->field.field) { in print_ipsa_arg()
4889 __func__, arg->field.name); in print_ipsa_arg()
4894 sa = (struct sockaddr_storage *) (data + arg->field.field->offset); in print_ipsa_arg()
4896 if (sa->ss_family == AF_INET) { in print_ipsa_arg()
4899 if (arg->field.field->size < sizeof(struct sockaddr_in)) { in print_ipsa_arg()
4904 print_ip4_addr(s, i, reverse, (unsigned char *) &sa4->sin_addr); in print_ipsa_arg()
4906 trace_seq_printf(s, ":%d", ntohs(sa4->sin_port)); in print_ipsa_arg()
4909 } else if (sa->ss_family == AF_INET6) { in print_ipsa_arg()
4912 if (arg->field.field->size < sizeof(struct sockaddr_in6)) { in print_ipsa_arg()
4920 buf = (unsigned char *) &sa6->sin6_addr; in print_ipsa_arg()
4927 trace_seq_printf(s, "]:%d", ntohs(sa6->sin6_port)); in print_ipsa_arg()
4934 void *data, int size, struct tep_event *event, in print_ip_arg() argument
4945 rc += print_ipv4_arg(s, ptr + 1, i, data, size, event, arg); in print_ip_arg()
4948 rc += print_ipv6_arg(s, ptr + 1, i, data, size, event, arg); in print_ip_arg()
4951 rc += print_ipsa_arg(s, ptr + 1, i, data, size, event, arg); in print_ip_arg()
4964 void *data, int size, struct tep_event *event, in print_uuid_arg() argument
4989 if (arg->type == TEP_PRINT_FUNC) { in print_uuid_arg()
4990 process_defined_func(s, data, size, event, arg); in print_uuid_arg()
4994 if (arg->type != TEP_PRINT_FIELD) { in print_uuid_arg()
4995 trace_seq_printf(s, "ARG TYPE NOT FIELD BUT %d", arg->type); in print_uuid_arg()
4999 if (!arg->field.field) { in print_uuid_arg()
5000 arg->field.field = in print_uuid_arg()
5001 tep_find_any_field(event, arg->field.name); in print_uuid_arg()
5002 if (!arg->field.field) { in print_uuid_arg()
5004 __func__, arg->field.name); in print_uuid_arg()
5009 if (arg->field.field->size != 16) { in print_uuid_arg()
5014 buf = data + arg->field.field->offset; in print_uuid_arg()
5023 trace_seq_printf(s, "-"); in print_uuid_arg()
5032 void *data, int size, struct tep_event *event, in print_raw_buff_arg() argument
5049 delim = "-"; in print_raw_buff_arg()
5058 if (arg->type == TEP_PRINT_FUNC) { in print_raw_buff_arg()
5059 process_defined_func(s, data, size, event, arg); in print_raw_buff_arg()
5063 if (arg->type != TEP_PRINT_DYNAMIC_ARRAY) { in print_raw_buff_arg()
5064 trace_seq_printf(s, "ARG TYPE NOT FIELD BUT %d", arg->type); in print_raw_buff_arg()
5068 offset = tep_read_number(event->tep, in print_raw_buff_arg()
5069 data + arg->dynarray.field->offset, in print_raw_buff_arg()
5070 arg->dynarray.field->size); in print_raw_buff_arg()
5102 struct tep_handle *tep = field->event->tep; in tep_print_field()
5104 if (field->flags & TEP_FIELD_IS_ARRAY) { in tep_print_field()
5105 offset = field->offset; in tep_print_field()
5106 len = field->size; in tep_print_field()
5107 if (field->flags & TEP_FIELD_IS_DYNAMIC) { in tep_print_field()
5113 if (field->flags & TEP_FIELD_IS_STRING && in tep_print_field()
5125 field->flags &= ~TEP_FIELD_IS_STRING; in tep_print_field()
5128 val = tep_read_number(tep, data + field->offset, in tep_print_field()
5129 field->size); in tep_print_field()
5130 if (field->flags & TEP_FIELD_IS_POINTER) { in tep_print_field()
5132 } else if (field->flags & TEP_FIELD_IS_SIGNED) { in tep_print_field()
5133 switch (field->size) { in tep_print_field()
5139 if (field->flags & TEP_FIELD_IS_LONG) in tep_print_field()
5154 if (field->flags & TEP_FIELD_IS_LONG) in tep_print_field()
5163 int size __maybe_unused, struct tep_event *event) in tep_print_fields() argument
5167 field = event->format.fields; in tep_print_fields()
5169 trace_seq_printf(s, " %s=", field->name); in tep_print_fields()
5171 field = field->next; in tep_print_fields()
5176 void *data, int size, struct tep_event *event, in print_function() argument
5182 val = eval_num_arg(data, size, event, arg); in print_function()
5183 func = find_func(event->tep, val); in print_function()
5185 trace_seq_puts(s, func->func); in print_function()
5187 trace_seq_printf(s, "+0x%llx", val - func->addr); in print_function()
5189 if (event->tep->long_size == 4) in print_function()
5200 struct tep_event *event, struct tep_print_arg *arg) in print_arg_pointer() argument
5205 if (arg->type == TEP_PRINT_BSTRING) { in print_arg_pointer()
5206 trace_seq_puts(s, arg->string.string); in print_arg_pointer()
5222 ret += print_function(s, format, data, size, event, arg); in print_arg_pointer()
5226 ret += print_mac_arg(s, format, data, size, event, arg); in print_arg_pointer()
5230 ret += print_ip_arg(s, format, data, size, event, arg); in print_arg_pointer()
5233 ret += print_uuid_arg(s, format, data, size, event, arg); in print_arg_pointer()
5236 ret += print_raw_buff_arg(s, format, data, size, event, arg, plen); in print_arg_pointer()
5240 val = eval_num_arg(data, size, event, arg); in print_arg_pointer()
5251 struct tep_event *event, struct tep_print_arg *arg) in print_arg_number() argument
5255 val = eval_num_arg(data, size, event, arg); in print_arg_number()
5258 case -2: in print_arg_number()
5264 case -1: in print_arg_number()
5289 do_warning_event(event, "bad count (%d)", ls); in print_arg_number()
5290 event->flags |= TEP_EVENT_FL_FAILED; in print_arg_number()
5298 struct tep_event *event, struct tep_print_arg *arg) in print_arg_string() argument
5304 print_str_arg(&p, data, size, event, in print_arg_string()
5415 arg = del->next; in free_parse_args()
5416 free(del->format); in free_parse_args()
5432 parg->format = strdup(format); in parse_arg_add()
5433 if (!parg->format) in parse_arg_add()
5435 parg->type = type; in parse_arg_add()
5436 parg->arg = arg; in parse_arg_add()
5437 parg->len_as_arg = len_as_arg; in parse_arg_add()
5438 parg->ls = ls; in parse_arg_add()
5443 free(parg->format); in parse_arg_add()
5446 return -1; in parse_arg_add()
5450 struct tep_event *event, in parse_arg_format() argument
5469 ls--; in parse_arg_format()
5481 case '-': in parse_arg_format()
5486 do_warning_event(event, "no argument match"); in parse_arg_format()
5487 event->flags |= TEP_EVENT_FL_FAILED; in parse_arg_format()
5491 do_warning_event(event, "argument already matched"); in parse_arg_format()
5492 event->flags |= TEP_EVENT_FL_FAILED; in parse_arg_format()
5496 *arg = (*arg)->next; in parse_arg_format()
5500 do_warning_event(event, "no argument match"); in parse_arg_format()
5501 event->flags |= TEP_EVENT_FL_FAILED; in parse_arg_format()
5509 len = ((unsigned long)format + 1) - in parse_arg_format()
5513 do_warning_event(event, "bad format!"); in parse_arg_format()
5514 event->flags |= TEP_EVENT_FL_FAILED; in parse_arg_format()
5522 *arg = (*arg)->next; in parse_arg_format()
5532 do_warning_event(event, "no argument match"); in parse_arg_format()
5533 event->flags |= TEP_EVENT_FL_FAILED; in parse_arg_format()
5537 len = ((unsigned long)format + 1) - in parse_arg_format()
5542 do_warning_event(event, "bad format!"); in parse_arg_format()
5543 event->flags |= TEP_EVENT_FL_FAILED; in parse_arg_format()
5549 if (event->tep->long_size == 8 && ls == 1 && in parse_arg_format()
5558 if (ls < -2 || ls > 2) { in parse_arg_format()
5559 do_warning_event(event, "bad count (%d)", ls); in parse_arg_format()
5560 event->flags |= TEP_EVENT_FL_FAILED; in parse_arg_format()
5564 *arg = (*arg)->next; in parse_arg_format()
5569 do_warning_event(event, "no matching argument"); in parse_arg_format()
5570 event->flags |= TEP_EVENT_FL_FAILED; in parse_arg_format()
5574 len = ((unsigned long)format + 1) - in parse_arg_format()
5579 do_warning_event(event, "bad format!"); in parse_arg_format()
5580 event->flags |= TEP_EVENT_FL_FAILED; in parse_arg_format()
5589 *arg = (*arg)->next; in parse_arg_format()
5654 parse_args(struct tep_event *event, const char *format, struct tep_print_arg *arg) in parse_args() argument
5666 ret = parse_arg_format(parse, event, format, &arg); in parse_args()
5670 parse = &((*parse)->next); in parse_args()
5672 len -= ret; in parse_args()
5682 void *data, int size, struct tep_event *event) in print_event_cache() argument
5687 if (parse->len_as_arg) in print_event_cache()
5688 len_arg = eval_num_arg(data, size, event, parse->len_as_arg); in print_event_cache()
5689 switch (parse->type) { in print_event_cache()
5691 print_arg_number(s, parse->format, in print_event_cache()
5692 parse->len_as_arg ? len_arg : -1, data, in print_event_cache()
5693 size, parse->ls, event, parse->arg); in print_event_cache()
5696 print_arg_pointer(s, parse->format, in print_event_cache()
5697 parse->len_as_arg ? len_arg : 1, in print_event_cache()
5698 data, size, event, parse->arg); in print_event_cache()
5701 print_arg_string(s, parse->format, in print_event_cache()
5702 parse->len_as_arg ? len_arg : -1, in print_event_cache()
5703 data, size, event, parse->arg); in print_event_cache()
5707 trace_seq_printf(s, "%s", parse->format); in print_event_cache()
5710 parse = parse->next; in print_event_cache()
5714 static void pretty_print(struct trace_seq *s, void *data, int size, struct tep_event *event) in pretty_print() argument
5716 struct tep_print_parse *parse = event->print_fmt.print_cache; in pretty_print()
5720 if (event->flags & TEP_EVENT_FL_FAILED) { in pretty_print()
5722 tep_print_fields(s, data, size, event); in pretty_print()
5726 if (event->flags & TEP_EVENT_FL_ISBPRINT) { in pretty_print()
5727 bprint_fmt = get_bprint_format(data, size, event); in pretty_print()
5728 args = make_bprint_args(bprint_fmt, data, size, event); in pretty_print()
5729 parse = parse_args(event, bprint_fmt, args); in pretty_print()
5732 print_event_cache(parse, s, data, size, event); in pretty_print()
5734 if (event->flags & TEP_EVENT_FL_ISBPRINT) { in pretty_print()
5760 void *data = record->data; in data_latency_format()
5819 s->state = TRACE_SEQ__MEM_ALLOC_FAILED; in data_latency_format()
5830 * tep_data_type - parse out the given event type
5831 * @tep: a handle to the trace event parser context
5834 * This returns the event id from the @rec.
5838 return trace_parse_common_type(tep, rec->data); in tep_data_type()
5842 * tep_data_pid - parse the PID from record
5843 * @tep: a handle to the trace event parser context
5850 return parse_common_pid(tep, rec->data); in tep_data_pid()
5854 * tep_data_preempt_count - parse the preempt count from the record
5855 * @tep: a handle to the trace event parser context
5862 return parse_common_pc(tep, rec->data); in tep_data_preempt_count()
5866 * tep_data_flags - parse the latency flags from the record
5867 * @tep: a handle to the trace event parser context
5872 * Use trace_flag_type enum for the flags (see event-parse.h).
5876 return parse_common_flags(tep, rec->data); in tep_data_flags()
5880 * tep_data_comm_from_pid - return the command line from PID
5881 * @tep: a handle to the trace event parser context
5901 cmdlist = cmdlist->next; in pid_from_cmdlist()
5903 cmdlist = tep->cmdlist; in pid_from_cmdlist()
5905 while (cmdlist && strcmp(cmdlist->comm, comm) != 0) in pid_from_cmdlist()
5906 cmdlist = cmdlist->next; in pid_from_cmdlist()
5912 * tep_data_pid_from_comm - return the pid from a given comm
5913 * @tep: a handle to the trace event parser context
5933 if (!tep->cmdlines) in tep_data_pid_from_comm()
5941 if (next < tep->cmdlines || in tep_data_pid_from_comm()
5942 next >= tep->cmdlines + tep->cmdline_count) in tep_data_pid_from_comm()
5949 cmdline = tep->cmdlines; in tep_data_pid_from_comm()
5951 while (cmdline < tep->cmdlines + tep->cmdline_count) { in tep_data_pid_from_comm()
5952 if (strcmp(cmdline->comm, comm) == 0) in tep_data_pid_from_comm()
5960 * tep_cmdline_pid - return the pid associated to a given cmdline
5961 * @tep: a handle to the trace event parser context
5965 * -1 is returned.
5972 return -1; in tep_cmdline_pid()
5978 if (!tep->cmdlines || in tep_cmdline_pid()
5979 cmdline < tep->cmdlines || in tep_cmdline_pid()
5980 cmdline >= tep->cmdlines + tep->cmdline_count) in tep_cmdline_pid()
5981 return cmdlist->pid; in tep_cmdline_pid()
5983 return cmdline->pid; in tep_cmdline_pid()
5987 * This parses the raw @data using the given @event information and
5991 struct tep_event *event, struct tep_record *record) in print_event_info() argument
5995 if (raw || (event->flags & TEP_EVENT_FL_PRINTRAW)) in print_event_info()
5996 tep_print_fields(s, record->data, record->size, event); in print_event_info()
5999 if (event->handler && !(event->flags & TEP_EVENT_FL_NOHANDLE)) in print_event_info()
6000 print_pretty = event->handler(s, record, event, in print_event_info()
6001 event->context); in print_event_info()
6004 pretty_print(s, record->data, record->size, event); in print_event_info()
6011 * tep_find_event_by_record - return the event from a given record
6012 * @tep: a handle to the trace event parser context
6013 * @record: The record to get the event from
6015 * Returns the associated event for a given record, or NULL if non is
6023 if (record->size < 0) { in tep_find_event_by_record()
6024 do_warning("ug! negative record size %d", record->size); in tep_find_event_by_record()
6028 type = trace_parse_common_type(tep, record->data); in tep_find_event_by_record()
6036 * "%3.1000d" - divide the time by 1000 and print the first 3 digits
6041 char *format, struct tep_event *event, in print_event_time() argument
6055 time = record->ts; in print_event_time()
6061 while (pr--) in print_event_time()
6080 struct tep_record *record, struct tep_event *event, in print_string() argument
6087 data_latency_format(tep, s, type->format, record); in print_string()
6089 pid = parse_common_pid(tep, record->data); in print_string()
6091 trace_seq_printf(s, type->format, comm); in print_string()
6093 print_event_info(s, type->format, true, event, record); in print_string()
6095 print_event_info(s, type->format, false, event, record); in print_string()
6097 trace_seq_printf(s, type->format, event->name); in print_string()
6105 struct tep_record *record, struct tep_event *event, in print_int() argument
6112 param = record->cpu; in print_int()
6115 param = parse_common_pid(tep, record->data); in print_int()
6118 return print_event_time(tep, s, type->format, event, record); in print_int()
6122 trace_seq_printf(s, type->format, param); in print_int()
6131 type->type = EVENT_TYPE_UNKNOWN; in tep_print_event_param_type()
6140 type->type = EVENT_TYPE_INT; in tep_print_event_param_type()
6143 type->type = EVENT_TYPE_STRING; in tep_print_event_param_type()
6148 if (type->type != EVENT_TYPE_UNKNOWN) in tep_print_event_param_type()
6151 memset(type->format, 0, 32); in tep_print_event_param_type()
6152 memcpy(type->format, format, i < 32 ? i : 31); in tep_print_event_param_type()
6157 * tep_print_event - Write various event information
6158 * @tep: a handle to the trace event parser context
6160 * @record: The record to get the event from
6161 * @format: a printf format string. Supported event fileds:
6162 * TEP_PRINT_PID, "%d" - event PID
6163 * TEP_PRINT_CPU, "%d" - event CPU
6164 * TEP_PRINT_COMM, "%s" - event command string
6165 * TEP_PRINT_NAME, "%s" - event name
6166 * TEP_PRINT_LATENCY, "%s" - event latency
6167 * TEP_PRINT_TIME, %d - event time stamp. A divisor and precision
6170 * "%3.1000d" - divide the time by 1000 and print the first
6173 * TEP_PRINT_INFO, "%s" - event information. If any width is specified in
6174 * the format string, the event information will be printed
6176 * Writes the specified event information into @s.
6187 struct tep_event *event; in tep_print_event() local
6192 event = tep_find_event_by_record(tep, record); in tep_print_event()
6207 print_string(tep, s, record, event, in tep_print_event()
6211 print_int(tep, s, record, event, in tep_print_event()
6231 if ((*ea)->id < (*eb)->id) in events_id_cmp()
6232 return -1; in events_id_cmp()
6234 if ((*ea)->id > (*eb)->id) in events_id_cmp()
6246 res = strcmp((*ea)->name, (*eb)->name); in events_name_cmp()
6250 res = strcmp((*ea)->system, (*eb)->system); in events_name_cmp()
6263 res = strcmp((*ea)->system, (*eb)->system); in events_system_cmp()
6267 res = strcmp((*ea)->name, (*eb)->name); in events_system_cmp()
6281 events = malloc(sizeof(*events) * (tep->nr_events + 1)); in list_events_copy()
6285 memcpy(events, tep->events, sizeof(*events) * tep->nr_events); in list_events_copy()
6286 events[tep->nr_events] = NULL; in list_events_copy()
6314 * tep_list_events - Get events, sorted by given criteria.
6331 events = tep->sort_events; in tep_list_events()
6332 if (events && tep->last_type == sort_type) in tep_list_events()
6340 tep->sort_events = events; in tep_list_events()
6344 tep->last_type = sort_type; in tep_list_events()
6349 list_events_sort(events, tep->nr_events, sort_type); in tep_list_events()
6350 tep->last_type = sort_type; in tep_list_events()
6357 * tep_list_events_copy - Thread safe version of tep_list_events()
6381 list_events_sort(events, tep->nr_events, sort_type); in tep_list_events_copy()
6387 get_event_fields(const char *type, const char *name, in get_event_fields() argument
6398 for (field = list; field; field = field->next) { in get_event_fields()
6401 do_warning("event %s has more %s fields than specified", in get_event_fields()
6402 name, type); in get_event_fields()
6403 i--; in get_event_fields()
6409 do_warning("event %s has less %s fields than specified", in get_event_fields()
6410 name, type); in get_event_fields()
6418 * tep_event_common_fields - return a list of common fields for an event
6419 * @event: the event to return the common fields of.
6424 struct tep_format_field **tep_event_common_fields(struct tep_event *event) in tep_event_common_fields() argument
6426 return get_event_fields("common", event->name, in tep_event_common_fields()
6427 event->format.nr_common, in tep_event_common_fields()
6428 event->format.common_fields); in tep_event_common_fields()
6432 * tep_event_fields - return a list of event specific fields for an event
6433 * @event: the event to return the fields of.
6438 struct tep_format_field **tep_event_fields(struct tep_event *event) in tep_event_fields() argument
6440 return get_event_fields("event", event->name, in tep_event_fields()
6441 event->format.nr_fields, in tep_event_fields()
6442 event->format.fields); in tep_event_fields()
6447 trace_seq_printf(s, "{ %s, %s }", field->value, field->str); in print_fields()
6448 if (field->next) { in print_fields()
6450 print_fields(s, field->next); in print_fields()
6460 switch (args->type) { in print_args()
6465 printf("%s", args->atom.atom); in print_args()
6468 printf("REC->%s", args->field.name); in print_args()
6472 print_args(args->flags.field); in print_args()
6473 printf(", %s, ", args->flags.delim); in print_args()
6475 print_fields(&s, args->flags.flags); in print_args()
6482 print_args(args->symbol.field); in print_args()
6485 print_fields(&s, args->symbol.symbols); in print_args()
6492 print_args(args->hex.field); in print_args()
6494 print_args(args->hex.size); in print_args()
6499 print_args(args->hex.field); in print_args()
6501 print_args(args->hex.size); in print_args()
6506 print_args(args->int_array.field); in print_args()
6508 print_args(args->int_array.count); in print_args()
6510 print_args(args->int_array.el_size); in print_args()
6515 printf("__get_str(%s)", args->string.string); in print_args()
6518 printf("__get_bitmask(%s)", args->bitmask.bitmask); in print_args()
6521 printf("(%s)", args->typecast.type); in print_args()
6522 print_args(args->typecast.item); in print_args()
6525 if (strcmp(args->op.op, ":") == 0) in print_args()
6529 print_args(args->op.left); in print_args()
6530 printf(" %s ", args->op.op); in print_args()
6531 print_args(args->op.right); in print_args()
6539 if (args->next) { in print_args()
6541 print_args(args->next); in print_args()
6639 * tep_parse_header_page - parse the data stored in the header page
6640 * @tep: a handle to the trace event parser context
6660 tep->header_page_ts_size = sizeof(long long); in tep_parse_header_page()
6661 tep->header_page_size_size = long_size; in tep_parse_header_page()
6662 tep->header_page_data_offset = sizeof(long long) + long_size; in tep_parse_header_page()
6663 tep->old_format = 1; in tep_parse_header_page()
6664 return -1; in tep_parse_header_page()
6668 parse_header_field("timestamp", &tep->header_page_ts_offset, in tep_parse_header_page()
6669 &tep->header_page_ts_size, 1); in tep_parse_header_page()
6670 parse_header_field("commit", &tep->header_page_size_offset, in tep_parse_header_page()
6671 &tep->header_page_size_size, 1); in tep_parse_header_page()
6672 parse_header_field("overwrite", &tep->header_page_overwrite, in tep_parse_header_page()
6674 parse_header_field("data", &tep->header_page_data_offset, in tep_parse_header_page()
6675 &tep->header_page_data_size, 1); in tep_parse_header_page()
6680 static int event_matches(struct tep_event *event, in event_matches() argument
6684 if (id >= 0 && id != event->id) in event_matches()
6687 if (event_name && (strcmp(event_name, event->name) != 0)) in event_matches()
6690 if (sys_name && (strcmp(sys_name, event->system) != 0)) in event_matches()
6698 free((void *)handle->sys_name); in free_handler()
6699 free((void *)handle->event_name); in free_handler()
6703 static int find_event_handle(struct tep_handle *tep, struct tep_event *event) in find_event_handle() argument
6707 for (next = &tep->handlers; *next; in find_event_handle()
6708 next = &(*next)->next) { in find_event_handle()
6710 if (event_matches(event, handle->id, in find_event_handle()
6711 handle->sys_name, in find_event_handle()
6712 handle->event_name)) in find_event_handle()
6719 pr_stat("overriding event (%d) %s:%s with new print handler", in find_event_handle()
6720 event->id, event->system, event->name); in find_event_handle()
6722 event->handler = handle->func; in find_event_handle()
6723 event->context = handle->context; in find_event_handle()
6725 *next = handle->next; in find_event_handle()
6732 * parse_format - parse the event format
6733 * @buf: the buffer storing the event format string
6735 * @sys: the system the event belongs to
6737 * This parses the event format and creates an event structure
6738 * to quickly parse raw data for a given event.
6748 struct tep_event *event; in parse_format() local
6753 *eventp = event = alloc_event(); in parse_format()
6754 if (!event) in parse_format()
6757 event->name = event_read_name(); in parse_format()
6758 if (!event->name) { in parse_format()
6759 /* Bad event? */ in parse_format()
6765 event->flags |= TEP_EVENT_FL_ISFTRACE; in parse_format()
6767 if (strcmp(event->name, "bprint") == 0) in parse_format()
6768 event->flags |= TEP_EVENT_FL_ISBPRINT; in parse_format()
6771 event->id = event_read_id(); in parse_format()
6772 if (event->id < 0) { in parse_format()
6781 event->system = strdup(sys); in parse_format()
6782 if (!event->system) { in parse_format()
6787 /* Add tep to event so that it can be referenced */ in parse_format()
6788 event->tep = tep; in parse_format()
6790 ret = event_read_format(event); in parse_format()
6797 * If the event has an override, don't print warnings if the event in parse_format()
6800 if (tep && find_event_handle(tep, event)) in parse_format()
6803 ret = event_read_print(event); in parse_format()
6811 if (!ret && (event->flags & TEP_EVENT_FL_ISFTRACE)) { in parse_format()
6816 list = &event->print_fmt.args; in parse_format()
6817 for (field = event->format.fields; field; field = field->next) { in parse_format()
6820 event->flags |= TEP_EVENT_FL_FAILED; in parse_format()
6823 arg->type = TEP_PRINT_FIELD; in parse_format()
6824 arg->field.name = strdup(field->name); in parse_format()
6825 if (!arg->field.name) { in parse_format()
6826 event->flags |= TEP_EVENT_FL_FAILED; in parse_format()
6830 arg->field.field = field; in parse_format()
6832 list = &arg->next; in parse_format()
6836 if (!(event->flags & TEP_EVENT_FL_ISBPRINT)) in parse_format()
6837 event->print_fmt.print_cache = parse_args(event, in parse_format()
6838 event->print_fmt.format, in parse_format()
6839 event->print_fmt.args); in parse_format()
6844 event->flags |= TEP_EVENT_FL_FAILED; in parse_format()
6848 free(event->system); in parse_format()
6849 free(event->name); in parse_format()
6850 free(event); in parse_format()
6862 struct tep_event *event = *eventp; in __parse_event() local
6864 if (event == NULL) in __parse_event()
6867 if (tep && add_event(tep, event)) { in __parse_event()
6873 if (PRINT_ARGS && event->print_fmt.args) in __parse_event()
6874 print_args(event->print_fmt.args); in __parse_event()
6879 free_tep_event(event); in __parse_event()
6884 * tep_parse_format - parse the event format
6885 * @tep: a handle to the trace event parser context
6887 * @buf: the buffer storing the event format string
6889 * @sys: the system the event belongs to
6891 * This parses the event format and creates an event structure
6892 * to quickly parse raw data for a given event.
6907 * tep_parse_event - parse the event format
6908 * @tep: a handle to the trace event parser context
6909 * @buf: the buffer storing the event format string
6911 * @sys: the system the event belongs to
6913 * This parses the event format and creates an event structure
6914 * to quickly parse raw data for a given event.
6923 struct tep_event *event = NULL; in tep_parse_event() local
6924 return __parse_event(tep, &event, buf, size, sys); in tep_parse_event()
6928 const char *name, struct tep_record *record, in get_field_val() argument
6933 trace_seq_printf(s, "<CANT FIND FIELD %s>", name); in get_field_val()
6934 return -1; in get_field_val()
6937 if (tep_read_number_field(field, record->data, val)) { in get_field_val()
6939 trace_seq_printf(s, " %s=INVALID", name); in get_field_val()
6940 return -1; in get_field_val()
6947 * tep_get_field_raw - return the raw pointer into the data field
6949 * @event: the event that the field is for
6950 * @name: The name of the field
6951 * @record: The record with the field name.
6955 * Returns a pointer into record->data of the field and places
6960 void *tep_get_field_raw(struct trace_seq *s, struct tep_event *event, in tep_get_field_raw() argument
6961 const char *name, struct tep_record *record, in tep_get_field_raw() argument
6965 void *data = record->data; in tep_get_field_raw()
6969 if (!event) in tep_get_field_raw()
6972 field = tep_find_field(event, name); in tep_get_field_raw()
6976 trace_seq_printf(s, "<CANT FIND FIELD %s>", name); in tep_get_field_raw()
6984 offset = field->offset; in tep_get_field_raw()
6985 if (field->flags & TEP_FIELD_IS_DYNAMIC) { in tep_get_field_raw()
6986 offset = tep_read_number(event->tep, in tep_get_field_raw()
6987 data + offset, field->size); in tep_get_field_raw()
6991 *len = field->size; in tep_get_field_raw()
6997 * tep_get_field_val - find a field and return its value
6999 * @event: the event that the field is for
7000 * @name: The name of the field
7001 * @record: The record with the field name.
7005 * Returns 0 on success -1 on field not found.
7007 int tep_get_field_val(struct trace_seq *s, struct tep_event *event, in tep_get_field_val() argument
7008 const char *name, struct tep_record *record, in tep_get_field_val() argument
7013 if (!event) in tep_get_field_val()
7014 return -1; in tep_get_field_val()
7016 field = tep_find_field(event, name); in tep_get_field_val()
7018 return get_field_val(s, field, name, record, val, err); in tep_get_field_val()
7022 * tep_get_common_field_val - find a common field and return its value
7024 * @event: the event that the field is for
7025 * @name: The name of the field
7026 * @record: The record with the field name.
7030 * Returns 0 on success -1 on field not found.
7032 int tep_get_common_field_val(struct trace_seq *s, struct tep_event *event, in tep_get_common_field_val() argument
7033 const char *name, struct tep_record *record, in tep_get_common_field_val() argument
7038 if (!event) in tep_get_common_field_val()
7039 return -1; in tep_get_common_field_val()
7041 field = tep_find_common_field(event, name); in tep_get_common_field_val()
7043 return get_field_val(s, field, name, record, val, err); in tep_get_common_field_val()
7047 * tep_get_any_field_val - find a any field and return its value
7049 * @event: the event that the field is for
7050 * @name: The name of the field
7051 * @record: The record with the field name.
7055 * Returns 0 on success -1 on field not found.
7057 int tep_get_any_field_val(struct trace_seq *s, struct tep_event *event, in tep_get_any_field_val() argument
7058 const char *name, struct tep_record *record, in tep_get_any_field_val() argument
7063 if (!event) in tep_get_any_field_val()
7064 return -1; in tep_get_any_field_val()
7066 field = tep_find_any_field(event, name); in tep_get_any_field_val()
7068 return get_field_val(s, field, name, record, val, err); in tep_get_any_field_val()
7072 * tep_print_num_field - print a field and a format
7075 * @event: the event that the field is for
7076 * @name: The name of the field
7077 * @record: The record with the field name.
7084 struct tep_event *event, const char *name, in tep_print_num_field() argument
7087 struct tep_format_field *field = tep_find_field(event, name); in tep_print_num_field()
7093 if (tep_read_number_field(field, record->data, &val)) in tep_print_num_field()
7100 trace_seq_printf(s, "CAN'T FIND FIELD \"%s\"", name); in tep_print_num_field()
7101 return -1; in tep_print_num_field()
7105 * tep_print_func_field - print a field and a format for function pointers
7108 * @event: the event that the field is for
7109 * @name: The name of the field
7110 * @record: The record with the field name.
7117 struct tep_event *event, const char *name, in tep_print_func_field() argument
7120 struct tep_format_field *field = tep_find_field(event, name); in tep_print_func_field()
7121 struct tep_handle *tep = event->tep; in tep_print_func_field()
7129 if (tep_read_number_field(field, record->data, &val)) in tep_print_func_field()
7135 snprintf(tmp, 128, "%s/0x%llx", func->func, func->addr - val); in tep_print_func_field()
7143 trace_seq_printf(s, "CAN'T FIND FIELD \"%s\"", name); in tep_print_func_field()
7144 return -1; in tep_print_func_field()
7151 free(func->name); in free_func_handle()
7153 while (func->params) { in free_func_handle()
7154 params = func->params; in free_func_handle()
7155 func->params = params->next; in free_func_handle()
7163 * tep_register_print_function - register a helper function
7164 * @tep: a handle to the trace event parser context
7167 * @name: the name of the helper function
7180 char *name, ...) in tep_register_print_function() argument
7189 func_handle = find_func_handler(tep, name); in tep_register_print_function()
7196 pr_stat("override of function helper '%s'", name); in tep_register_print_function()
7197 remove_func_handler(tep, name); in tep_register_print_function()
7206 func_handle->ret_type = ret_type; in tep_register_print_function()
7207 func_handle->name = strdup(name); in tep_register_print_function()
7208 func_handle->func = func; in tep_register_print_function()
7209 if (!func_handle->name) { in tep_register_print_function()
7210 do_warning("Failed to allocate function name"); in tep_register_print_function()
7215 next_param = &(func_handle->params); in tep_register_print_function()
7216 va_start(ap, name); in tep_register_print_function()
7234 param->type = type; in tep_register_print_function()
7235 param->next = NULL; in tep_register_print_function()
7238 next_param = &(param->next); in tep_register_print_function()
7240 func_handle->nr_args++; in tep_register_print_function()
7244 func_handle->next = tep->func_handlers; in tep_register_print_function()
7245 tep->func_handlers = func_handle; in tep_register_print_function()
7255 * tep_unregister_print_function - unregister a helper function
7256 * @tep: a handle to the trace event parser context
7258 * @name: the name of the helper function
7260 * This function removes existing print handler for function @name.
7262 * Returns 0 if the handler was removed successully, -1 otherwise.
7265 tep_func_handler func, char *name) in tep_unregister_print_function() argument
7269 func_handle = find_func_handler(tep, name); in tep_unregister_print_function()
7270 if (func_handle && func_handle->func == func) { in tep_unregister_print_function()
7271 remove_func_handler(tep, name); in tep_unregister_print_function()
7274 return -1; in tep_unregister_print_function()
7281 struct tep_event *event; in search_event() local
7285 event = tep_find_event(tep, id); in search_event()
7286 if (!event) in search_event()
7288 if (event_name && (strcmp(event_name, event->name) != 0)) in search_event()
7290 if (sys_name && (strcmp(sys_name, event->system) != 0)) in search_event()
7293 event = tep_find_event_by_name(tep, sys_name, event_name); in search_event()
7294 if (!event) in search_event()
7297 return event; in search_event()
7301 * tep_register_event_handler - register a way to parse an event
7302 * @tep: a handle to the trace event parser context
7303 * @id: the id of the event to register
7304 * @sys_name: the system name the event belongs to
7305 * @event_name: the name of the event
7306 * @func: the function to call to parse the event information
7310 * a given event. If for some reason the default print format
7312 * for an event to be used to parse the data instead.
7314 * If @id is >= 0, then it is used to find the event.
7327 struct tep_event *event; in tep_register_event_handler() local
7330 event = search_event(tep, id, sys_name, event_name); in tep_register_event_handler()
7331 if (event == NULL) in tep_register_event_handler()
7334 pr_stat("overriding event (%d) %s:%s with new print handler", in tep_register_event_handler()
7335 event->id, event->system, event->name); in tep_register_event_handler()
7337 event->handler = func; in tep_register_event_handler()
7338 event->context = context; in tep_register_event_handler()
7345 do_warning("Failed to allocate event handler"); in tep_register_event_handler()
7349 handle->id = id; in tep_register_event_handler()
7351 handle->event_name = strdup(event_name); in tep_register_event_handler()
7353 handle->sys_name = strdup(sys_name); in tep_register_event_handler()
7355 if ((event_name && !handle->event_name) || in tep_register_event_handler()
7356 (sys_name && !handle->sys_name)) { in tep_register_event_handler()
7357 do_warning("Failed to allocate event/sys name"); in tep_register_event_handler()
7358 free((void *)handle->event_name); in tep_register_event_handler()
7359 free((void *)handle->sys_name); in tep_register_event_handler()
7364 handle->func = func; in tep_register_event_handler()
7365 handle->next = tep->handlers; in tep_register_event_handler()
7366 tep->handlers = handle; in tep_register_event_handler()
7367 handle->context = context; in tep_register_event_handler()
7376 if (id >= 0 && id != handler->id) in handle_matches()
7379 if (event_name && (strcmp(event_name, handler->event_name) != 0)) in handle_matches()
7382 if (sys_name && (strcmp(sys_name, handler->sys_name) != 0)) in handle_matches()
7385 if (func != handler->func || context != handler->context) in handle_matches()
7392 * tep_unregister_event_handler - unregister an existing event handler
7393 * @tep: a handle to the trace event parser context
7394 * @id: the id of the event to unregister
7395 * @sys_name: the system name the handler belongs to
7396 * @event_name: the name of the event handler
7397 * @func: the function to call to parse the event information
7400 * This function removes existing event handler (parser).
7402 * If @id is >= 0, then it is used to find the event.
7405 * Returns 0 if handler was removed successfully, -1 if event was not found.
7411 struct tep_event *event; in tep_unregister_event_handler() local
7415 event = search_event(tep, id, sys_name, event_name); in tep_unregister_event_handler()
7416 if (event == NULL) in tep_unregister_event_handler()
7419 if (event->handler == func && event->context == context) { in tep_unregister_event_handler()
7420 pr_stat("removing override handler for event (%d) %s:%s. Going back to default handler.", in tep_unregister_event_handler()
7421 event->id, event->system, event->name); in tep_unregister_event_handler()
7423 event->handler = NULL; in tep_unregister_event_handler()
7424 event->context = NULL; in tep_unregister_event_handler()
7429 for (next = &tep->handlers; *next; next = &(*next)->next) { in tep_unregister_event_handler()
7437 return -1; in tep_unregister_event_handler()
7439 *next = handle->next; in tep_unregister_event_handler()
7446 * tep_alloc - create a tep handle
7453 tep->ref_count = 1; in tep_alloc()
7454 tep->host_bigendian = tep_is_bigendian(); in tep_alloc()
7462 tep->ref_count++; in tep_ref()
7468 return tep->ref_count; in tep_get_ref()
7474 free(field->type); in free_tep_format_field()
7475 if (field->alias != field->name) in free_tep_format_field()
7476 free(field->alias); in free_tep_format_field()
7477 free(field->name); in free_tep_format_field()
7486 next = field->next; in free_format_fields()
7494 free_format_fields(format->common_fields); in free_formats()
7495 free_format_fields(format->fields); in free_formats()
7498 __hidden void free_tep_event(struct tep_event *event) in free_tep_event() argument
7500 free(event->name); in free_tep_event()
7501 free(event->system); in free_tep_event()
7503 free_formats(&event->format); in free_tep_event()
7505 free(event->print_fmt.format); in free_tep_event()
7506 free_args(event->print_fmt.args); in free_tep_event()
7507 free_parse_args(event->print_fmt.print_cache); in free_tep_event()
7508 free(event); in free_tep_event()
7512 * tep_free - free a tep handle
7527 cmdlist = tep->cmdlist; in tep_free()
7528 funclist = tep->funclist; in tep_free()
7529 printklist = tep->printklist; in tep_free()
7531 tep->ref_count--; in tep_free()
7532 if (tep->ref_count) in tep_free()
7535 if (tep->cmdlines) { in tep_free()
7536 for (i = 0; i < tep->cmdline_count; i++) in tep_free()
7537 free(tep->cmdlines[i].comm); in tep_free()
7538 free(tep->cmdlines); in tep_free()
7542 cmdnext = cmdlist->next; in tep_free()
7543 free(cmdlist->comm); in tep_free()
7548 if (tep->func_map) { in tep_free()
7549 for (i = 0; i < (int)tep->func_count; i++) { in tep_free()
7550 free(tep->func_map[i].func); in tep_free()
7551 free(tep->func_map[i].mod); in tep_free()
7553 free(tep->func_map); in tep_free()
7557 funcnext = funclist->next; in tep_free()
7558 free(funclist->func); in tep_free()
7559 free(funclist->mod); in tep_free()
7564 while (tep->func_handlers) { in tep_free()
7565 func_handler = tep->func_handlers; in tep_free()
7566 tep->func_handlers = func_handler->next; in tep_free()
7570 if (tep->printk_map) { in tep_free()
7571 for (i = 0; i < (int)tep->printk_count; i++) in tep_free()
7572 free(tep->printk_map[i].printk); in tep_free()
7573 free(tep->printk_map); in tep_free()
7577 printknext = printklist->next; in tep_free()
7578 free(printklist->printk); in tep_free()
7583 for (i = 0; i < tep->nr_events; i++) in tep_free()
7584 free_tep_event(tep->events[i]); in tep_free()
7586 while (tep->handlers) { in tep_free()
7587 handle = tep->handlers; in tep_free()
7588 tep->handlers = handle->next; in tep_free()
7592 free(tep->events); in tep_free()
7593 free(tep->sort_events); in tep_free()
7594 free(tep->func_resolver); in tep_free()