1 // SPDX-License-Identifier: LGPL-2.1
3 * Copyright (C) 2009, 2010 Red Hat Inc, Steven Rostedt <srostedt@redhat.com>
6 * The parts for function graph printing was taken and modified from the
7 * Linux Kernel that were written by
8 * - Copyright (C) 2009 Frederic Weisbecker,
9 * Frederic Weisbecker gave his permission to relicense the code to
10 * the Lesser General Public License.
21 #include <linux/time64.h>
23 #include <netinet/in.h>
24 #include "event-parse.h"
26 #include "event-parse-local.h"
27 #include "event-utils.h"
28 #include "trace-seq.h"
30 static const char *input_buf
;
31 static unsigned long long input_buf_ptr
;
32 static unsigned long long input_buf_siz
;
34 static int is_flag_field
;
35 static int is_symbolic_field
;
37 static int show_warning
= 1;
39 #define do_warning(fmt, ...) \
42 warning(fmt, ##__VA_ARGS__); \
45 #define do_warning_event(event, fmt, ...) \
51 warning("[%s:%s] " fmt, event->system, \
52 event->name, ##__VA_ARGS__); \
54 warning(fmt, ##__VA_ARGS__); \
57 static void init_input_buf(const char *buf
, unsigned long long size
)
64 const char *tep_get_input_buf(void)
69 unsigned long long tep_get_input_buf_ptr(void)
74 struct event_handler
{
75 struct event_handler
*next
;
78 const char *event_name
;
79 tep_event_handler_func func
;
84 struct func_params
*next
;
85 enum tep_func_arg_type type
;
88 struct tep_function_handler
{
89 struct tep_function_handler
*next
;
90 enum tep_func_arg_type ret_type
;
92 tep_func_handler func
;
93 struct func_params
*params
;
97 static unsigned long long
98 process_defined_func(struct trace_seq
*s
, void *data
, int size
,
99 struct tep_event
*event
, struct tep_print_arg
*arg
);
101 static void free_func_handle(struct tep_function_handler
*func
);
104 * tep_buffer_init - init buffer for parsing
105 * @buf: buffer to parse
106 * @size: the size of the buffer
108 * For use with tep_read_token(), this initializes the internal
109 * buffer that tep_read_token() will parse.
111 void tep_buffer_init(const char *buf
, unsigned long long size
)
113 init_input_buf(buf
, size
);
116 void breakpoint(void)
122 struct tep_print_arg
*alloc_arg(void)
124 return calloc(1, sizeof(struct tep_print_arg
));
132 static int cmdline_cmp(const void *a
, const void *b
)
134 const struct tep_cmdline
*ca
= a
;
135 const struct tep_cmdline
*cb
= b
;
137 if (ca
->pid
< cb
->pid
)
139 if (ca
->pid
> cb
->pid
)
145 /* Looking for where to place the key */
146 static int cmdline_slot_cmp(const void *a
, const void *b
)
148 const struct tep_cmdline
*ca
= a
;
149 const struct tep_cmdline
*cb
= b
;
150 const struct tep_cmdline
*cb1
= cb
+ 1;
152 if (ca
->pid
< cb
->pid
)
155 if (ca
->pid
> cb
->pid
) {
156 if (ca
->pid
<= cb1
->pid
)
164 struct cmdline_list
{
165 struct cmdline_list
*next
;
170 static int cmdline_init(struct tep_handle
*tep
)
172 struct cmdline_list
*cmdlist
= tep
->cmdlist
;
173 struct cmdline_list
*item
;
174 struct tep_cmdline
*cmdlines
;
177 cmdlines
= malloc(sizeof(*cmdlines
) * tep
->cmdline_count
);
183 cmdlines
[i
].pid
= cmdlist
->pid
;
184 cmdlines
[i
].comm
= cmdlist
->comm
;
187 cmdlist
= cmdlist
->next
;
191 qsort(cmdlines
, tep
->cmdline_count
, sizeof(*cmdlines
), cmdline_cmp
);
193 tep
->cmdlines
= cmdlines
;
199 static const char *find_cmdline(struct tep_handle
*tep
, int pid
)
201 const struct tep_cmdline
*comm
;
202 struct tep_cmdline key
;
207 if (!tep
->cmdlines
&& cmdline_init(tep
))
208 return "<not enough memory for cmdlines!>";
212 comm
= bsearch(&key
, tep
->cmdlines
, tep
->cmdline_count
,
213 sizeof(*tep
->cmdlines
), cmdline_cmp
);
221 * tep_is_pid_registered - return if a pid has a cmdline registered
222 * @tep: a handle to the trace event parser context
223 * @pid: The pid to check if it has a cmdline registered with.
225 * Returns true if the pid has a cmdline mapped to it
228 bool tep_is_pid_registered(struct tep_handle
*tep
, int pid
)
230 const struct tep_cmdline
*comm
;
231 struct tep_cmdline key
;
236 if (!tep
->cmdlines
&& cmdline_init(tep
))
241 comm
= bsearch(&key
, tep
->cmdlines
, tep
->cmdline_count
,
242 sizeof(*tep
->cmdlines
), cmdline_cmp
);
250 * If the command lines have been converted to an array, then
251 * we must add this pid. This is much slower than when cmdlines
252 * are added before the array is initialized.
254 static int add_new_comm(struct tep_handle
*tep
,
255 const char *comm
, int pid
, bool override
)
257 struct tep_cmdline
*cmdlines
= tep
->cmdlines
;
258 struct tep_cmdline
*cmdline
;
259 struct tep_cmdline key
;
266 /* avoid duplicates */
269 cmdline
= bsearch(&key
, tep
->cmdlines
, tep
->cmdline_count
,
270 sizeof(*tep
->cmdlines
), cmdline_cmp
);
276 new_comm
= strdup(comm
);
282 cmdline
->comm
= new_comm
;
287 cmdlines
= realloc(cmdlines
, sizeof(*cmdlines
) * (tep
->cmdline_count
+ 1));
292 tep
->cmdlines
= cmdlines
;
294 key
.comm
= strdup(comm
);
300 if (!tep
->cmdline_count
) {
302 tep
->cmdlines
[0] = key
;
303 tep
->cmdline_count
++;
307 /* Now find where we want to store the new cmdline */
308 cmdline
= bsearch(&key
, tep
->cmdlines
, tep
->cmdline_count
- 1,
309 sizeof(*tep
->cmdlines
), cmdline_slot_cmp
);
311 cnt
= tep
->cmdline_count
;
313 /* cmdline points to the one before the spot we want */
315 cnt
-= cmdline
- tep
->cmdlines
;
318 /* The new entry is either before or after the list */
319 if (key
.pid
> tep
->cmdlines
[tep
->cmdline_count
- 1].pid
) {
320 tep
->cmdlines
[tep
->cmdline_count
++] = key
;
323 cmdline
= &tep
->cmdlines
[0];
325 memmove(cmdline
+ 1, cmdline
, (cnt
* sizeof(*cmdline
)));
328 tep
->cmdline_count
++;
333 static int _tep_register_comm(struct tep_handle
*tep
,
334 const char *comm
, int pid
, bool override
)
336 struct cmdline_list
*item
;
339 return add_new_comm(tep
, comm
, pid
, override
);
341 item
= malloc(sizeof(*item
));
346 item
->comm
= strdup(comm
);
348 item
->comm
= strdup("<...>");
354 item
->next
= tep
->cmdlist
;
357 tep
->cmdline_count
++;
363 * tep_register_comm - register a pid / comm mapping
364 * @tep: a handle to the trace event parser context
365 * @comm: the command line to register
366 * @pid: the pid to map the command line to
368 * This adds a mapping to search for command line names with
369 * a given pid. The comm is duplicated. If a command with the same pid
370 * already exist, -1 is returned and errno is set to EEXIST
372 int tep_register_comm(struct tep_handle
*tep
, const char *comm
, int pid
)
374 return _tep_register_comm(tep
, comm
, pid
, false);
378 * tep_override_comm - register a pid / comm mapping
379 * @tep: a handle to the trace event parser context
380 * @comm: the command line to register
381 * @pid: the pid to map the command line to
383 * This adds a mapping to search for command line names with
384 * a given pid. The comm is duplicated. If a command with the same pid
385 * already exist, the command string is udapted with the new one
387 int tep_override_comm(struct tep_handle
*tep
, const char *comm
, int pid
)
389 if (!tep
->cmdlines
&& cmdline_init(tep
)) {
393 return _tep_register_comm(tep
, comm
, pid
, true);
397 unsigned long long addr
;
403 struct func_list
*next
;
404 unsigned long long addr
;
409 static int func_cmp(const void *a
, const void *b
)
411 const struct func_map
*fa
= a
;
412 const struct func_map
*fb
= b
;
414 if (fa
->addr
< fb
->addr
)
416 if (fa
->addr
> fb
->addr
)
423 * We are searching for a record in between, not an exact
426 static int func_bcmp(const void *a
, const void *b
)
428 const struct func_map
*fa
= a
;
429 const struct func_map
*fb
= b
;
431 if ((fa
->addr
== fb
->addr
) ||
433 (fa
->addr
> fb
->addr
&&
434 fa
->addr
< (fb
+1)->addr
))
437 if (fa
->addr
< fb
->addr
)
443 static int func_map_init(struct tep_handle
*tep
)
445 struct func_list
*funclist
;
446 struct func_list
*item
;
447 struct func_map
*func_map
;
450 func_map
= malloc(sizeof(*func_map
) * (tep
->func_count
+ 1));
454 funclist
= tep
->funclist
;
458 func_map
[i
].func
= funclist
->func
;
459 func_map
[i
].addr
= funclist
->addr
;
460 func_map
[i
].mod
= funclist
->mod
;
463 funclist
= funclist
->next
;
467 qsort(func_map
, tep
->func_count
, sizeof(*func_map
), func_cmp
);
470 * Add a special record at the end.
472 func_map
[tep
->func_count
].func
= NULL
;
473 func_map
[tep
->func_count
].addr
= 0;
474 func_map
[tep
->func_count
].mod
= NULL
;
476 tep
->func_map
= func_map
;
477 tep
->funclist
= NULL
;
482 static struct func_map
*
483 __find_func(struct tep_handle
*tep
, unsigned long long addr
)
485 struct func_map
*func
;
493 func
= bsearch(&key
, tep
->func_map
, tep
->func_count
,
494 sizeof(*tep
->func_map
), func_bcmp
);
499 struct func_resolver
{
500 tep_func_resolver_t
*func
;
506 * tep_set_function_resolver - set an alternative function resolver
507 * @tep: a handle to the trace event parser context
508 * @resolver: function to be used
509 * @priv: resolver function private state.
511 * Some tools may have already a way to resolve kernel functions, allow them to
512 * keep using it instead of duplicating all the entries inside tep->funclist.
514 int tep_set_function_resolver(struct tep_handle
*tep
,
515 tep_func_resolver_t
*func
, void *priv
)
517 struct func_resolver
*resolver
= malloc(sizeof(*resolver
));
519 if (resolver
== NULL
)
522 resolver
->func
= func
;
523 resolver
->priv
= priv
;
525 free(tep
->func_resolver
);
526 tep
->func_resolver
= resolver
;
532 * tep_reset_function_resolver - reset alternative function resolver
533 * @tep: a handle to the trace event parser context
535 * Stop using whatever alternative resolver was set, use the default
538 void tep_reset_function_resolver(struct tep_handle
*tep
)
540 free(tep
->func_resolver
);
541 tep
->func_resolver
= NULL
;
544 static struct func_map
*
545 find_func(struct tep_handle
*tep
, unsigned long long addr
)
547 struct func_map
*map
;
549 if (!tep
->func_resolver
)
550 return __find_func(tep
, addr
);
552 map
= &tep
->func_resolver
->map
;
555 map
->func
= tep
->func_resolver
->func(tep
->func_resolver
->priv
,
556 &map
->addr
, &map
->mod
);
557 if (map
->func
== NULL
)
564 * tep_find_function - find a function by a given address
565 * @tep: a handle to the trace event parser context
566 * @addr: the address to find the function with
568 * Returns a pointer to the function stored that has the given
569 * address. Note, the address does not have to be exact, it
570 * will select the function that would contain the address.
572 const char *tep_find_function(struct tep_handle
*tep
, unsigned long long addr
)
574 struct func_map
*map
;
576 map
= find_func(tep
, addr
);
584 * tep_find_function_address - find a function address by a given address
585 * @tep: a handle to the trace event parser context
586 * @addr: the address to find the function with
588 * Returns the address the function starts at. This can be used in
589 * conjunction with tep_find_function to print both the function
590 * name and the function offset.
593 tep_find_function_address(struct tep_handle
*tep
, unsigned long long addr
)
595 struct func_map
*map
;
597 map
= find_func(tep
, addr
);
605 * tep_register_function - register a function with a given address
606 * @tep: a handle to the trace event parser context
607 * @function: the function name to register
608 * @addr: the address the function starts at
609 * @mod: the kernel module the function may be in (NULL for none)
611 * This registers a function name with an address and module.
612 * The @func passed in is duplicated.
614 int tep_register_function(struct tep_handle
*tep
, char *func
,
615 unsigned long long addr
, char *mod
)
617 struct func_list
*item
= malloc(sizeof(*item
));
622 item
->next
= tep
->funclist
;
623 item
->func
= strdup(func
);
628 item
->mod
= strdup(mod
);
635 tep
->funclist
= item
;
650 * tep_print_funcs - print out the stored functions
651 * @tep: a handle to the trace event parser context
653 * This prints out the stored functions.
655 void tep_print_funcs(struct tep_handle
*tep
)
662 for (i
= 0; i
< (int)tep
->func_count
; i
++) {
664 tep
->func_map
[i
].addr
,
665 tep
->func_map
[i
].func
);
666 if (tep
->func_map
[i
].mod
)
667 printf(" [%s]\n", tep
->func_map
[i
].mod
);
674 unsigned long long addr
;
679 struct printk_list
*next
;
680 unsigned long long addr
;
684 static int printk_cmp(const void *a
, const void *b
)
686 const struct printk_map
*pa
= a
;
687 const struct printk_map
*pb
= b
;
689 if (pa
->addr
< pb
->addr
)
691 if (pa
->addr
> pb
->addr
)
697 static int printk_map_init(struct tep_handle
*tep
)
699 struct printk_list
*printklist
;
700 struct printk_list
*item
;
701 struct printk_map
*printk_map
;
704 printk_map
= malloc(sizeof(*printk_map
) * (tep
->printk_count
+ 1));
708 printklist
= tep
->printklist
;
712 printk_map
[i
].printk
= printklist
->printk
;
713 printk_map
[i
].addr
= printklist
->addr
;
716 printklist
= printklist
->next
;
720 qsort(printk_map
, tep
->printk_count
, sizeof(*printk_map
), printk_cmp
);
722 tep
->printk_map
= printk_map
;
723 tep
->printklist
= NULL
;
728 static struct printk_map
*
729 find_printk(struct tep_handle
*tep
, unsigned long long addr
)
731 struct printk_map
*printk
;
732 struct printk_map key
;
734 if (!tep
->printk_map
&& printk_map_init(tep
))
739 printk
= bsearch(&key
, tep
->printk_map
, tep
->printk_count
,
740 sizeof(*tep
->printk_map
), printk_cmp
);
746 * tep_register_print_string - register a string by its address
747 * @tep: a handle to the trace event parser context
748 * @fmt: the string format to register
749 * @addr: the address the string was located at
751 * This registers a string by the address it was stored in the kernel.
752 * The @fmt passed in is duplicated.
754 int tep_register_print_string(struct tep_handle
*tep
, const char *fmt
,
755 unsigned long long addr
)
757 struct printk_list
*item
= malloc(sizeof(*item
));
763 item
->next
= tep
->printklist
;
766 /* Strip off quotes and '\n' from the end */
769 item
->printk
= strdup(fmt
);
773 p
= item
->printk
+ strlen(item
->printk
) - 1;
778 if (strcmp(p
, "\\n") == 0)
781 tep
->printklist
= item
;
793 * tep_print_printk - print out the stored strings
794 * @tep: a handle to the trace event parser context
796 * This prints the string formats that were stored.
798 void tep_print_printk(struct tep_handle
*tep
)
802 if (!tep
->printk_map
)
803 printk_map_init(tep
);
805 for (i
= 0; i
< (int)tep
->printk_count
; i
++) {
806 printf("%016llx %s\n",
807 tep
->printk_map
[i
].addr
,
808 tep
->printk_map
[i
].printk
);
812 static struct tep_event
*alloc_event(void)
814 return calloc(1, sizeof(struct tep_event
));
817 static int add_event(struct tep_handle
*tep
, struct tep_event
*event
)
820 struct tep_event
**events
= realloc(tep
->events
, sizeof(event
) *
821 (tep
->nr_events
+ 1));
825 tep
->events
= events
;
827 for (i
= 0; i
< tep
->nr_events
; i
++) {
828 if (tep
->events
[i
]->id
> event
->id
)
831 if (i
< tep
->nr_events
)
832 memmove(&tep
->events
[i
+ 1],
834 sizeof(event
) * (tep
->nr_events
- i
));
836 tep
->events
[i
] = event
;
844 static int event_item_type(enum tep_event_type type
)
847 case TEP_EVENT_ITEM
... TEP_EVENT_SQUOTE
:
849 case TEP_EVENT_ERROR
... TEP_EVENT_DELIM
:
855 static void free_flag_sym(struct tep_print_flag_sym
*fsym
)
857 struct tep_print_flag_sym
*next
;
868 static void free_arg(struct tep_print_arg
*arg
)
870 struct tep_print_arg
*farg
;
877 free(arg
->atom
.atom
);
879 case TEP_PRINT_FIELD
:
880 free(arg
->field
.name
);
882 case TEP_PRINT_FLAGS
:
883 free_arg(arg
->flags
.field
);
884 free(arg
->flags
.delim
);
885 free_flag_sym(arg
->flags
.flags
);
887 case TEP_PRINT_SYMBOL
:
888 free_arg(arg
->symbol
.field
);
889 free_flag_sym(arg
->symbol
.symbols
);
892 case TEP_PRINT_HEX_STR
:
893 free_arg(arg
->hex
.field
);
894 free_arg(arg
->hex
.size
);
896 case TEP_PRINT_INT_ARRAY
:
897 free_arg(arg
->int_array
.field
);
898 free_arg(arg
->int_array
.count
);
899 free_arg(arg
->int_array
.el_size
);
902 free(arg
->typecast
.type
);
903 free_arg(arg
->typecast
.item
);
905 case TEP_PRINT_STRING
:
906 case TEP_PRINT_BSTRING
:
907 free(arg
->string
.string
);
909 case TEP_PRINT_BITMASK
:
910 free(arg
->bitmask
.bitmask
);
912 case TEP_PRINT_DYNAMIC_ARRAY
:
913 case TEP_PRINT_DYNAMIC_ARRAY_LEN
:
914 free(arg
->dynarray
.index
);
918 free_arg(arg
->op
.left
);
919 free_arg(arg
->op
.right
);
922 while (arg
->func
.args
) {
923 farg
= arg
->func
.args
;
924 arg
->func
.args
= farg
->next
;
937 static enum tep_event_type
get_type(int ch
)
940 return TEP_EVENT_NEWLINE
;
942 return TEP_EVENT_SPACE
;
943 if (isalnum(ch
) || ch
== '_')
944 return TEP_EVENT_ITEM
;
946 return TEP_EVENT_SQUOTE
;
948 return TEP_EVENT_DQUOTE
;
950 return TEP_EVENT_NONE
;
951 if (ch
== '(' || ch
== ')' || ch
== ',')
952 return TEP_EVENT_DELIM
;
957 static int __read_char(void)
959 if (input_buf_ptr
>= input_buf_siz
)
962 return input_buf
[input_buf_ptr
++];
965 static int __peek_char(void)
967 if (input_buf_ptr
>= input_buf_siz
)
970 return input_buf
[input_buf_ptr
];
974 * tep_peek_char - peek at the next character that will be read
976 * Returns the next character read, or -1 if end of buffer.
978 int tep_peek_char(void)
980 return __peek_char();
983 static int extend_token(char **tok
, char *buf
, int size
)
985 char *newtok
= realloc(*tok
, size
);
1002 static enum tep_event_type
force_token(const char *str
, char **tok
);
1004 static enum tep_event_type
__read_token(char **tok
)
1007 int ch
, last_ch
, quote_ch
, next_ch
;
1010 enum tep_event_type type
;
1017 return TEP_EVENT_NONE
;
1019 type
= get_type(ch
);
1020 if (type
== TEP_EVENT_NONE
)
1026 case TEP_EVENT_NEWLINE
:
1027 case TEP_EVENT_DELIM
:
1028 if (asprintf(tok
, "%c", ch
) < 0)
1029 return TEP_EVENT_ERROR
;
1036 next_ch
= __peek_char();
1037 if (next_ch
== '>') {
1038 buf
[i
++] = __read_char();
1051 buf
[i
++] = __read_char();
1063 default: /* what should we do instead? */
1073 buf
[i
++] = __read_char();
1076 case TEP_EVENT_DQUOTE
:
1077 case TEP_EVENT_SQUOTE
:
1078 /* don't keep quotes */
1084 if (i
== (BUFSIZ
- 1)) {
1088 if (extend_token(tok
, buf
, tok_size
) < 0)
1089 return TEP_EVENT_NONE
;
1095 /* the '\' '\' will cancel itself */
1096 if (ch
== '\\' && last_ch
== '\\')
1098 } while (ch
!= quote_ch
|| last_ch
== '\\');
1099 /* remove the last quote */
1103 * For strings (double quotes) check the next token.
1104 * If it is another string, concatinate the two.
1106 if (type
== TEP_EVENT_DQUOTE
) {
1107 unsigned long long save_input_buf_ptr
= input_buf_ptr
;
1111 } while (isspace(ch
));
1114 input_buf_ptr
= save_input_buf_ptr
;
1119 case TEP_EVENT_ERROR
... TEP_EVENT_SPACE
:
1120 case TEP_EVENT_ITEM
:
1125 while (get_type(__peek_char()) == type
) {
1126 if (i
== (BUFSIZ
- 1)) {
1130 if (extend_token(tok
, buf
, tok_size
) < 0)
1131 return TEP_EVENT_NONE
;
1140 if (extend_token(tok
, buf
, tok_size
+ i
+ 1) < 0)
1141 return TEP_EVENT_NONE
;
1143 if (type
== TEP_EVENT_ITEM
) {
1145 * Older versions of the kernel has a bug that
1146 * creates invalid symbols and will break the mac80211
1147 * parsing. This is a work around to that bug.
1149 * See Linux kernel commit:
1150 * 811cb50baf63461ce0bdb234927046131fc7fa8b
1152 if (strcmp(*tok
, "LOCAL_PR_FMT") == 0) {
1155 return force_token("\"%s\" ", tok
);
1156 } else if (strcmp(*tok
, "STA_PR_FMT") == 0) {
1159 return force_token("\" sta:%pM\" ", tok
);
1160 } else if (strcmp(*tok
, "VIF_PR_FMT") == 0) {
1163 return force_token("\" vif:%p(%d)\" ", tok
);
1170 static enum tep_event_type
force_token(const char *str
, char **tok
)
1172 const char *save_input_buf
;
1173 unsigned long long save_input_buf_ptr
;
1174 unsigned long long save_input_buf_siz
;
1175 enum tep_event_type type
;
1177 /* save off the current input pointers */
1178 save_input_buf
= input_buf
;
1179 save_input_buf_ptr
= input_buf_ptr
;
1180 save_input_buf_siz
= input_buf_siz
;
1182 init_input_buf(str
, strlen(str
));
1184 type
= __read_token(tok
);
1186 /* reset back to original token */
1187 input_buf
= save_input_buf
;
1188 input_buf_ptr
= save_input_buf_ptr
;
1189 input_buf_siz
= save_input_buf_siz
;
1194 static void free_token(char *tok
)
1200 static enum tep_event_type
read_token(char **tok
)
1202 enum tep_event_type type
;
1205 type
= __read_token(tok
);
1206 if (type
!= TEP_EVENT_SPACE
)
1214 return TEP_EVENT_NONE
;
1218 * tep_read_token - access to utilities to use the tep parser
1219 * @tok: The token to return
1221 * This will parse tokens from the string given by
1224 * Returns the token type.
1226 enum tep_event_type
tep_read_token(char **tok
)
1228 return read_token(tok
);
1232 * tep_free_token - free a token returned by tep_read_token
1233 * @token: the token to free
1235 void tep_free_token(char *token
)
1241 static enum tep_event_type
read_token_item(char **tok
)
1243 enum tep_event_type type
;
1246 type
= __read_token(tok
);
1247 if (type
!= TEP_EVENT_SPACE
&& type
!= TEP_EVENT_NEWLINE
)
1255 return TEP_EVENT_NONE
;
1258 static int test_type(enum tep_event_type type
, enum tep_event_type expect
)
1260 if (type
!= expect
) {
1261 do_warning("Error: expected type %d but read %d",
1268 static int test_type_token(enum tep_event_type type
, const char *token
,
1269 enum tep_event_type expect
, const char *expect_tok
)
1271 if (type
!= expect
) {
1272 do_warning("Error: expected type %d but read %d",
1277 if (strcmp(token
, expect_tok
) != 0) {
1278 do_warning("Error: expected '%s' but read '%s'",
1285 static int __read_expect_type(enum tep_event_type expect
, char **tok
, int newline_ok
)
1287 enum tep_event_type type
;
1290 type
= read_token(tok
);
1292 type
= read_token_item(tok
);
1293 return test_type(type
, expect
);
1296 static int read_expect_type(enum tep_event_type expect
, char **tok
)
1298 return __read_expect_type(expect
, tok
, 1);
1301 static int __read_expected(enum tep_event_type expect
, const char *str
,
1304 enum tep_event_type type
;
1309 type
= read_token(&token
);
1311 type
= read_token_item(&token
);
1313 ret
= test_type_token(type
, token
, expect
, str
);
1320 static int read_expected(enum tep_event_type expect
, const char *str
)
1322 return __read_expected(expect
, str
, 1);
1325 static int read_expected_item(enum tep_event_type expect
, const char *str
)
1327 return __read_expected(expect
, str
, 0);
1330 static char *event_read_name(void)
1334 if (read_expected(TEP_EVENT_ITEM
, "name") < 0)
1337 if (read_expected(TEP_EVENT_OP
, ":") < 0)
1340 if (read_expect_type(TEP_EVENT_ITEM
, &token
) < 0)
1350 static int event_read_id(void)
1355 if (read_expected_item(TEP_EVENT_ITEM
, "ID") < 0)
1358 if (read_expected(TEP_EVENT_OP
, ":") < 0)
1361 if (read_expect_type(TEP_EVENT_ITEM
, &token
) < 0)
1364 id
= strtoul(token
, NULL
, 0);
1373 static int field_is_string(struct tep_format_field
*field
)
1375 if ((field
->flags
& TEP_FIELD_IS_ARRAY
) &&
1376 (strstr(field
->type
, "char") || strstr(field
->type
, "u8") ||
1377 strstr(field
->type
, "s8")))
1383 static int field_is_dynamic(struct tep_format_field
*field
)
1385 if (strncmp(field
->type
, "__data_loc", 10) == 0)
1391 static int field_is_long(struct tep_format_field
*field
)
1393 /* includes long long */
1394 if (strstr(field
->type
, "long"))
1400 static unsigned int type_size(const char *name
)
1402 /* This covers all TEP_FIELD_IS_STRING types. */
1420 for (i
= 0; table
[i
].type
; i
++) {
1421 if (!strcmp(table
[i
].type
, name
))
1422 return table
[i
].size
;
1428 static int event_read_fields(struct tep_event
*event
, struct tep_format_field
**fields
)
1430 struct tep_format_field
*field
= NULL
;
1431 enum tep_event_type type
;
1437 unsigned int size_dynamic
= 0;
1439 type
= read_token(&token
);
1440 if (type
== TEP_EVENT_NEWLINE
) {
1447 if (test_type_token(type
, token
, TEP_EVENT_ITEM
, "field"))
1451 type
= read_token(&token
);
1453 * The ftrace fields may still use the "special" name.
1456 if (event
->flags
& TEP_EVENT_FL_ISFTRACE
&&
1457 type
== TEP_EVENT_ITEM
&& strcmp(token
, "special") == 0) {
1459 type
= read_token(&token
);
1462 if (test_type_token(type
, token
, TEP_EVENT_OP
, ":") < 0)
1466 if (read_expect_type(TEP_EVENT_ITEM
, &token
) < 0)
1471 field
= calloc(1, sizeof(*field
));
1475 field
->event
= event
;
1477 /* read the rest of the type */
1479 type
= read_token(&token
);
1480 if (type
== TEP_EVENT_ITEM
||
1481 (type
== TEP_EVENT_OP
&& strcmp(token
, "*") == 0) ||
1483 * Some of the ftrace fields are broken and have
1484 * an illegal "." in them.
1486 (event
->flags
& TEP_EVENT_FL_ISFTRACE
&&
1487 type
== TEP_EVENT_OP
&& strcmp(token
, ".") == 0)) {
1489 if (strcmp(token
, "*") == 0)
1490 field
->flags
|= TEP_FIELD_IS_POINTER
;
1494 new_type
= realloc(field
->type
,
1495 strlen(field
->type
) +
1496 strlen(last_token
) + 2);
1501 field
->type
= new_type
;
1502 strcat(field
->type
, " ");
1503 strcat(field
->type
, last_token
);
1506 field
->type
= last_token
;
1515 do_warning_event(event
, "%s: no type found", __func__
);
1518 field
->name
= field
->alias
= last_token
;
1520 if (test_type(type
, TEP_EVENT_OP
))
1523 if (strcmp(token
, "[") == 0) {
1524 enum tep_event_type last_type
= type
;
1525 char *brackets
= token
;
1529 field
->flags
|= TEP_FIELD_IS_ARRAY
;
1531 type
= read_token(&token
);
1533 if (type
== TEP_EVENT_ITEM
)
1534 field
->arraylen
= strtoul(token
, NULL
, 0);
1536 field
->arraylen
= 0;
1538 while (strcmp(token
, "]") != 0) {
1539 if (last_type
== TEP_EVENT_ITEM
&&
1540 type
== TEP_EVENT_ITEM
)
1546 new_brackets
= realloc(brackets
,
1548 strlen(token
) + len
);
1549 if (!new_brackets
) {
1553 brackets
= new_brackets
;
1555 strcat(brackets
, " ");
1556 strcat(brackets
, token
);
1557 /* We only care about the last token */
1558 field
->arraylen
= strtoul(token
, NULL
, 0);
1560 type
= read_token(&token
);
1561 if (type
== TEP_EVENT_NONE
) {
1562 do_warning_event(event
, "failed to find token");
1569 new_brackets
= realloc(brackets
, strlen(brackets
) + 2);
1570 if (!new_brackets
) {
1574 brackets
= new_brackets
;
1575 strcat(brackets
, "]");
1577 /* add brackets to type */
1579 type
= read_token(&token
);
1581 * If the next token is not an OP, then it is of
1582 * the format: type [] item;
1584 if (type
== TEP_EVENT_ITEM
) {
1586 new_type
= realloc(field
->type
,
1587 strlen(field
->type
) +
1588 strlen(field
->name
) +
1589 strlen(brackets
) + 2);
1594 field
->type
= new_type
;
1595 strcat(field
->type
, " ");
1596 strcat(field
->type
, field
->name
);
1597 size_dynamic
= type_size(field
->name
);
1598 free_token(field
->name
);
1599 strcat(field
->type
, brackets
);
1600 field
->name
= field
->alias
= token
;
1601 type
= read_token(&token
);
1604 new_type
= realloc(field
->type
,
1605 strlen(field
->type
) +
1606 strlen(brackets
) + 1);
1611 field
->type
= new_type
;
1612 strcat(field
->type
, brackets
);
1617 if (field_is_string(field
))
1618 field
->flags
|= TEP_FIELD_IS_STRING
;
1619 if (field_is_dynamic(field
))
1620 field
->flags
|= TEP_FIELD_IS_DYNAMIC
;
1621 if (field_is_long(field
))
1622 field
->flags
|= TEP_FIELD_IS_LONG
;
1624 if (test_type_token(type
, token
, TEP_EVENT_OP
, ";"))
1628 if (read_expected(TEP_EVENT_ITEM
, "offset") < 0)
1631 if (read_expected(TEP_EVENT_OP
, ":") < 0)
1634 if (read_expect_type(TEP_EVENT_ITEM
, &token
))
1636 field
->offset
= strtoul(token
, NULL
, 0);
1639 if (read_expected(TEP_EVENT_OP
, ";") < 0)
1642 if (read_expected(TEP_EVENT_ITEM
, "size") < 0)
1645 if (read_expected(TEP_EVENT_OP
, ":") < 0)
1648 if (read_expect_type(TEP_EVENT_ITEM
, &token
))
1650 field
->size
= strtoul(token
, NULL
, 0);
1653 if (read_expected(TEP_EVENT_OP
, ";") < 0)
1656 type
= read_token(&token
);
1657 if (type
!= TEP_EVENT_NEWLINE
) {
1658 /* newer versions of the kernel have a "signed" type */
1659 if (test_type_token(type
, token
, TEP_EVENT_ITEM
, "signed"))
1664 if (read_expected(TEP_EVENT_OP
, ":") < 0)
1667 if (read_expect_type(TEP_EVENT_ITEM
, &token
))
1670 if (strtoul(token
, NULL
, 0))
1671 field
->flags
|= TEP_FIELD_IS_SIGNED
;
1674 if (read_expected(TEP_EVENT_OP
, ";") < 0)
1677 if (read_expect_type(TEP_EVENT_NEWLINE
, &token
))
1683 if (field
->flags
& TEP_FIELD_IS_ARRAY
) {
1684 if (field
->arraylen
)
1685 field
->elementsize
= field
->size
/ field
->arraylen
;
1686 else if (field
->flags
& TEP_FIELD_IS_DYNAMIC
)
1687 field
->elementsize
= size_dynamic
;
1688 else if (field
->flags
& TEP_FIELD_IS_STRING
)
1689 field
->elementsize
= 1;
1690 else if (field
->flags
& TEP_FIELD_IS_LONG
)
1691 field
->elementsize
= event
->tep
?
1692 event
->tep
->long_size
:
1695 field
->elementsize
= field
->size
;
1698 fields
= &field
->next
;
1715 static int event_read_format(struct tep_event
*event
)
1720 if (read_expected_item(TEP_EVENT_ITEM
, "format") < 0)
1723 if (read_expected(TEP_EVENT_OP
, ":") < 0)
1726 if (read_expect_type(TEP_EVENT_NEWLINE
, &token
))
1730 ret
= event_read_fields(event
, &event
->format
.common_fields
);
1733 event
->format
.nr_common
= ret
;
1735 ret
= event_read_fields(event
, &event
->format
.fields
);
1738 event
->format
.nr_fields
= ret
;
1747 static enum tep_event_type
1748 process_arg_token(struct tep_event
*event
, struct tep_print_arg
*arg
,
1749 char **tok
, enum tep_event_type type
);
1751 static enum tep_event_type
1752 process_arg(struct tep_event
*event
, struct tep_print_arg
*arg
, char **tok
)
1754 enum tep_event_type type
;
1757 type
= read_token(&token
);
1760 return process_arg_token(event
, arg
, tok
, type
);
1763 static enum tep_event_type
1764 process_op(struct tep_event
*event
, struct tep_print_arg
*arg
, char **tok
);
1767 * For __print_symbolic() and __print_flags, we need to completely
1768 * evaluate the first argument, which defines what to print next.
1770 static enum tep_event_type
1771 process_field_arg(struct tep_event
*event
, struct tep_print_arg
*arg
, char **tok
)
1773 enum tep_event_type type
;
1775 type
= process_arg(event
, arg
, tok
);
1777 while (type
== TEP_EVENT_OP
) {
1778 type
= process_op(event
, arg
, tok
);
1784 static enum tep_event_type
1785 process_cond(struct tep_event
*event
, struct tep_print_arg
*top
, char **tok
)
1787 struct tep_print_arg
*arg
, *left
, *right
;
1788 enum tep_event_type type
;
1793 right
= alloc_arg();
1795 if (!arg
|| !left
|| !right
) {
1796 do_warning_event(event
, "%s: not enough memory!", __func__
);
1797 /* arg will be freed at out_free */
1803 arg
->type
= TEP_PRINT_OP
;
1804 arg
->op
.left
= left
;
1805 arg
->op
.right
= right
;
1808 type
= process_arg(event
, left
, &token
);
1811 if (type
== TEP_EVENT_ERROR
)
1814 /* Handle other operations in the arguments */
1815 if (type
== TEP_EVENT_OP
&& strcmp(token
, ":") != 0) {
1816 type
= process_op(event
, left
, &token
);
1820 if (test_type_token(type
, token
, TEP_EVENT_OP
, ":"))
1825 type
= process_arg(event
, right
, &token
);
1827 top
->op
.right
= arg
;
1833 /* Top may point to itself */
1834 top
->op
.right
= NULL
;
1837 return TEP_EVENT_ERROR
;
1840 static enum tep_event_type
1841 process_array(struct tep_event
*event
, struct tep_print_arg
*top
, char **tok
)
1843 struct tep_print_arg
*arg
;
1844 enum tep_event_type type
;
1849 do_warning_event(event
, "%s: not enough memory!", __func__
);
1850 /* '*tok' is set to top->op.op. No need to free. */
1852 return TEP_EVENT_ERROR
;
1856 type
= process_arg(event
, arg
, &token
);
1857 if (test_type_token(type
, token
, TEP_EVENT_OP
, "]"))
1860 top
->op
.right
= arg
;
1863 type
= read_token_item(&token
);
1871 return TEP_EVENT_ERROR
;
1874 static int get_op_prio(char *op
)
1888 /* '>>' and '<<' are 8 */
1892 /* '==' and '!=' are 10 */
1902 do_warning("unknown op '%c'", op
[0]);
1906 if (strcmp(op
, "++") == 0 ||
1907 strcmp(op
, "--") == 0) {
1909 } else if (strcmp(op
, ">>") == 0 ||
1910 strcmp(op
, "<<") == 0) {
1912 } else if (strcmp(op
, ">=") == 0 ||
1913 strcmp(op
, "<=") == 0) {
1915 } else if (strcmp(op
, "==") == 0 ||
1916 strcmp(op
, "!=") == 0) {
1918 } else if (strcmp(op
, "&&") == 0) {
1920 } else if (strcmp(op
, "||") == 0) {
1923 do_warning("unknown op '%s'", op
);
1929 static int set_op_prio(struct tep_print_arg
*arg
)
1932 /* single ops are the greatest */
1933 if (!arg
->op
.left
|| arg
->op
.left
->type
== TEP_PRINT_NULL
)
1936 arg
->op
.prio
= get_op_prio(arg
->op
.op
);
1938 return arg
->op
.prio
;
1941 /* Note, *tok does not get freed, but will most likely be saved */
1942 static enum tep_event_type
1943 process_op(struct tep_event
*event
, struct tep_print_arg
*arg
, char **tok
)
1945 struct tep_print_arg
*left
, *right
= NULL
;
1946 enum tep_event_type type
;
1949 /* the op is passed in via tok */
1952 if (arg
->type
== TEP_PRINT_OP
&& !arg
->op
.left
) {
1953 /* handle single op */
1955 do_warning_event(event
, "bad op token %s", token
);
1965 do_warning_event(event
, "bad op token %s", token
);
1970 /* make an empty left */
1975 left
->type
= TEP_PRINT_NULL
;
1976 arg
->op
.left
= left
;
1978 right
= alloc_arg();
1982 arg
->op
.right
= right
;
1984 /* do not free the token, it belongs to an op */
1986 type
= process_arg(event
, right
, tok
);
1988 } else if (strcmp(token
, "?") == 0) {
1994 /* copy the top arg to the left */
1997 arg
->type
= TEP_PRINT_OP
;
1999 arg
->op
.left
= left
;
2002 /* it will set arg->op.right */
2003 type
= process_cond(event
, arg
, tok
);
2005 } else if (strcmp(token
, ">>") == 0 ||
2006 strcmp(token
, "<<") == 0 ||
2007 strcmp(token
, "&") == 0 ||
2008 strcmp(token
, "|") == 0 ||
2009 strcmp(token
, "&&") == 0 ||
2010 strcmp(token
, "||") == 0 ||
2011 strcmp(token
, "-") == 0 ||
2012 strcmp(token
, "+") == 0 ||
2013 strcmp(token
, "*") == 0 ||
2014 strcmp(token
, "^") == 0 ||
2015 strcmp(token
, "/") == 0 ||
2016 strcmp(token
, "%") == 0 ||
2017 strcmp(token
, "<") == 0 ||
2018 strcmp(token
, ">") == 0 ||
2019 strcmp(token
, "<=") == 0 ||
2020 strcmp(token
, ">=") == 0 ||
2021 strcmp(token
, "==") == 0 ||
2022 strcmp(token
, "!=") == 0) {
2028 /* copy the top arg to the left */
2031 arg
->type
= TEP_PRINT_OP
;
2033 arg
->op
.left
= left
;
2034 arg
->op
.right
= NULL
;
2036 if (set_op_prio(arg
) == -1) {
2037 event
->flags
|= TEP_EVENT_FL_FAILED
;
2038 /* arg->op.op (= token) will be freed at out_free */
2043 type
= read_token_item(&token
);
2046 /* could just be a type pointer */
2047 if ((strcmp(arg
->op
.op
, "*") == 0) &&
2048 type
== TEP_EVENT_DELIM
&& (strcmp(token
, ")") == 0)) {
2051 if (left
->type
!= TEP_PRINT_ATOM
) {
2052 do_warning_event(event
, "bad pointer type");
2055 new_atom
= realloc(left
->atom
.atom
,
2056 strlen(left
->atom
.atom
) + 3);
2060 left
->atom
.atom
= new_atom
;
2061 strcat(left
->atom
.atom
, " *");
2069 right
= alloc_arg();
2073 type
= process_arg_token(event
, right
, tok
, type
);
2074 if (type
== TEP_EVENT_ERROR
) {
2076 /* token was freed in process_arg_token() via *tok */
2081 if (right
->type
== TEP_PRINT_OP
&&
2082 get_op_prio(arg
->op
.op
) < get_op_prio(right
->op
.op
)) {
2083 struct tep_print_arg tmp
;
2085 /* rotate ops according to the priority */
2086 arg
->op
.right
= right
->op
.left
;
2092 arg
->op
.left
= right
;
2094 arg
->op
.right
= right
;
2097 } else if (strcmp(token
, "[") == 0) {
2105 arg
->type
= TEP_PRINT_OP
;
2107 arg
->op
.left
= left
;
2111 /* it will set arg->op.right */
2112 type
= process_array(event
, arg
, tok
);
2115 do_warning_event(event
, "unknown op '%s'", token
);
2116 event
->flags
|= TEP_EVENT_FL_FAILED
;
2117 /* the arg is now the left side */
2121 if (type
== TEP_EVENT_OP
&& strcmp(*tok
, ":") != 0) {
2124 /* higher prios need to be closer to the root */
2125 prio
= get_op_prio(*tok
);
2127 if (prio
> arg
->op
.prio
)
2128 return process_op(event
, arg
, tok
);
2130 return process_op(event
, right
, tok
);
2136 do_warning_event(event
, "%s: not enough memory!", __func__
);
2140 return TEP_EVENT_ERROR
;
2143 static enum tep_event_type
2144 process_entry(struct tep_event
*event __maybe_unused
, struct tep_print_arg
*arg
,
2147 enum tep_event_type type
;
2151 if (read_expected(TEP_EVENT_OP
, "->") < 0)
2154 if (read_expect_type(TEP_EVENT_ITEM
, &token
) < 0)
2158 arg
->type
= TEP_PRINT_FIELD
;
2159 arg
->field
.name
= field
;
2161 if (is_flag_field
) {
2162 arg
->field
.field
= tep_find_any_field(event
, arg
->field
.name
);
2163 arg
->field
.field
->flags
|= TEP_FIELD_IS_FLAG
;
2165 } else if (is_symbolic_field
) {
2166 arg
->field
.field
= tep_find_any_field(event
, arg
->field
.name
);
2167 arg
->field
.field
->flags
|= TEP_FIELD_IS_SYMBOLIC
;
2168 is_symbolic_field
= 0;
2171 type
= read_token(&token
);
2180 return TEP_EVENT_ERROR
;
2183 static int alloc_and_process_delim(struct tep_event
*event
, char *next_token
,
2184 struct tep_print_arg
**print_arg
)
2186 struct tep_print_arg
*field
;
2187 enum tep_event_type type
;
2191 field
= alloc_arg();
2193 do_warning_event(event
, "%s: not enough memory!", __func__
);
2198 type
= process_arg(event
, field
, &token
);
2200 if (test_type_token(type
, token
, TEP_EVENT_DELIM
, next_token
)) {
2204 goto out_free_token
;
2215 static char *arg_eval (struct tep_print_arg
*arg
);
2217 static unsigned long long
2218 eval_type_str(unsigned long long val
, const char *type
, int pointer
)
2228 if (type
[len
-1] != '*') {
2229 do_warning("pointer expected with non pointer type");
2235 do_warning("%s: not enough memory!", __func__
);
2238 memcpy(ref
, type
, len
);
2240 /* chop off the " *" */
2243 val
= eval_type_str(val
, ref
, 0);
2248 /* check if this is a pointer */
2249 if (type
[len
- 1] == '*')
2252 /* Try to figure out the arg size*/
2253 if (strncmp(type
, "struct", 6) == 0)
2257 if (strcmp(type
, "u8") == 0)
2260 if (strcmp(type
, "u16") == 0)
2261 return val
& 0xffff;
2263 if (strcmp(type
, "u32") == 0)
2264 return val
& 0xffffffff;
2266 if (strcmp(type
, "u64") == 0 ||
2267 strcmp(type
, "s64") == 0)
2270 if (strcmp(type
, "s8") == 0)
2271 return (unsigned long long)(char)val
& 0xff;
2273 if (strcmp(type
, "s16") == 0)
2274 return (unsigned long long)(short)val
& 0xffff;
2276 if (strcmp(type
, "s32") == 0)
2277 return (unsigned long long)(int)val
& 0xffffffff;
2279 if (strncmp(type
, "unsigned ", 9) == 0) {
2284 if (strcmp(type
, "char") == 0) {
2286 return (unsigned long long)(char)val
& 0xff;
2291 if (strcmp(type
, "short") == 0) {
2293 return (unsigned long long)(short)val
& 0xffff;
2295 return val
& 0xffff;
2298 if (strcmp(type
, "int") == 0) {
2300 return (unsigned long long)(int)val
& 0xffffffff;
2302 return val
& 0xffffffff;
2309 * Try to figure out the type.
2311 static unsigned long long
2312 eval_type(unsigned long long val
, struct tep_print_arg
*arg
, int pointer
)
2314 if (arg
->type
!= TEP_PRINT_TYPE
) {
2315 do_warning("expected type argument");
2319 return eval_type_str(val
, arg
->typecast
.type
, pointer
);
2322 static int arg_num_eval(struct tep_print_arg
*arg
, long long *val
)
2324 long long left
, right
;
2327 switch (arg
->type
) {
2328 case TEP_PRINT_ATOM
:
2329 *val
= strtoll(arg
->atom
.atom
, NULL
, 0);
2331 case TEP_PRINT_TYPE
:
2332 ret
= arg_num_eval(arg
->typecast
.item
, val
);
2335 *val
= eval_type(*val
, arg
, 0);
2338 switch (arg
->op
.op
[0]) {
2340 ret
= arg_num_eval(arg
->op
.left
, &left
);
2343 ret
= arg_num_eval(arg
->op
.right
, &right
);
2347 *val
= left
|| right
;
2349 *val
= left
| right
;
2352 ret
= arg_num_eval(arg
->op
.left
, &left
);
2355 ret
= arg_num_eval(arg
->op
.right
, &right
);
2359 *val
= left
&& right
;
2361 *val
= left
& right
;
2364 ret
= arg_num_eval(arg
->op
.left
, &left
);
2367 ret
= arg_num_eval(arg
->op
.right
, &right
);
2370 switch (arg
->op
.op
[1]) {
2372 *val
= left
< right
;
2375 *val
= left
<< right
;
2378 *val
= left
<= right
;
2381 do_warning("unknown op '%s'", arg
->op
.op
);
2386 ret
= arg_num_eval(arg
->op
.left
, &left
);
2389 ret
= arg_num_eval(arg
->op
.right
, &right
);
2392 switch (arg
->op
.op
[1]) {
2394 *val
= left
> right
;
2397 *val
= left
>> right
;
2400 *val
= left
>= right
;
2403 do_warning("unknown op '%s'", arg
->op
.op
);
2408 ret
= arg_num_eval(arg
->op
.left
, &left
);
2411 ret
= arg_num_eval(arg
->op
.right
, &right
);
2415 if (arg
->op
.op
[1] != '=') {
2416 do_warning("unknown op '%s'", arg
->op
.op
);
2419 *val
= left
== right
;
2422 ret
= arg_num_eval(arg
->op
.left
, &left
);
2425 ret
= arg_num_eval(arg
->op
.right
, &right
);
2429 switch (arg
->op
.op
[1]) {
2431 *val
= left
!= right
;
2434 do_warning("unknown op '%s'", arg
->op
.op
);
2439 /* check for negative */
2440 if (arg
->op
.left
->type
== TEP_PRINT_NULL
)
2443 ret
= arg_num_eval(arg
->op
.left
, &left
);
2446 ret
= arg_num_eval(arg
->op
.right
, &right
);
2449 *val
= left
- right
;
2452 if (arg
->op
.left
->type
== TEP_PRINT_NULL
)
2455 ret
= arg_num_eval(arg
->op
.left
, &left
);
2458 ret
= arg_num_eval(arg
->op
.right
, &right
);
2461 *val
= left
+ right
;
2464 ret
= arg_num_eval(arg
->op
.right
, &right
);
2470 do_warning("unknown op '%s'", arg
->op
.op
);
2475 case TEP_PRINT_NULL
:
2476 case TEP_PRINT_FIELD
... TEP_PRINT_SYMBOL
:
2477 case TEP_PRINT_STRING
:
2478 case TEP_PRINT_BSTRING
:
2479 case TEP_PRINT_BITMASK
:
2481 do_warning("invalid eval type %d", arg
->type
);
2488 static char *arg_eval (struct tep_print_arg
*arg
)
2491 static char buf
[24];
2493 switch (arg
->type
) {
2494 case TEP_PRINT_ATOM
:
2495 return arg
->atom
.atom
;
2496 case TEP_PRINT_TYPE
:
2497 return arg_eval(arg
->typecast
.item
);
2499 if (!arg_num_eval(arg
, &val
))
2501 sprintf(buf
, "%lld", val
);
2504 case TEP_PRINT_NULL
:
2505 case TEP_PRINT_FIELD
... TEP_PRINT_SYMBOL
:
2506 case TEP_PRINT_STRING
:
2507 case TEP_PRINT_BSTRING
:
2508 case TEP_PRINT_BITMASK
:
2510 do_warning("invalid eval type %d", arg
->type
);
2517 static enum tep_event_type
2518 process_fields(struct tep_event
*event
, struct tep_print_flag_sym
**list
, char **tok
)
2520 enum tep_event_type type
;
2521 struct tep_print_arg
*arg
= NULL
;
2522 struct tep_print_flag_sym
*field
;
2528 type
= read_token_item(&token
);
2529 if (test_type_token(type
, token
, TEP_EVENT_OP
, "{"))
2537 type
= process_arg(event
, arg
, &token
);
2539 if (type
== TEP_EVENT_OP
)
2540 type
= process_op(event
, arg
, &token
);
2542 if (type
== TEP_EVENT_ERROR
)
2545 if (test_type_token(type
, token
, TEP_EVENT_DELIM
, ","))
2548 field
= calloc(1, sizeof(*field
));
2552 value
= arg_eval(arg
);
2554 goto out_free_field
;
2555 field
->value
= strdup(value
);
2556 if (field
->value
== NULL
)
2557 goto out_free_field
;
2565 type
= process_arg(event
, arg
, &token
);
2566 if (test_type_token(type
, token
, TEP_EVENT_OP
, "}"))
2567 goto out_free_field
;
2569 value
= arg_eval(arg
);
2571 goto out_free_field
;
2572 field
->str
= strdup(value
);
2573 if (field
->str
== NULL
)
2574 goto out_free_field
;
2579 list
= &field
->next
;
2582 type
= read_token_item(&token
);
2583 } while (type
== TEP_EVENT_DELIM
&& strcmp(token
, ",") == 0);
2589 free_flag_sym(field
);
2595 return TEP_EVENT_ERROR
;
2598 static enum tep_event_type
2599 process_flags(struct tep_event
*event
, struct tep_print_arg
*arg
, char **tok
)
2601 struct tep_print_arg
*field
;
2602 enum tep_event_type type
;
2605 memset(arg
, 0, sizeof(*arg
));
2606 arg
->type
= TEP_PRINT_FLAGS
;
2608 field
= alloc_arg();
2610 do_warning_event(event
, "%s: not enough memory!", __func__
);
2614 type
= process_field_arg(event
, field
, &token
);
2616 /* Handle operations in the first argument */
2617 while (type
== TEP_EVENT_OP
)
2618 type
= process_op(event
, field
, &token
);
2620 if (test_type_token(type
, token
, TEP_EVENT_DELIM
, ","))
2621 goto out_free_field
;
2624 arg
->flags
.field
= field
;
2626 type
= read_token_item(&token
);
2627 if (event_item_type(type
)) {
2628 arg
->flags
.delim
= token
;
2629 type
= read_token_item(&token
);
2632 if (test_type_token(type
, token
, TEP_EVENT_DELIM
, ","))
2635 type
= process_fields(event
, &arg
->flags
.flags
, &token
);
2636 if (test_type_token(type
, token
, TEP_EVENT_DELIM
, ")"))
2640 type
= read_token_item(tok
);
2648 return TEP_EVENT_ERROR
;
2651 static enum tep_event_type
2652 process_symbols(struct tep_event
*event
, struct tep_print_arg
*arg
, char **tok
)
2654 struct tep_print_arg
*field
;
2655 enum tep_event_type type
;
2658 memset(arg
, 0, sizeof(*arg
));
2659 arg
->type
= TEP_PRINT_SYMBOL
;
2661 field
= alloc_arg();
2663 do_warning_event(event
, "%s: not enough memory!", __func__
);
2667 type
= process_field_arg(event
, field
, &token
);
2669 if (test_type_token(type
, token
, TEP_EVENT_DELIM
, ","))
2670 goto out_free_field
;
2672 arg
->symbol
.field
= field
;
2674 type
= process_fields(event
, &arg
->symbol
.symbols
, &token
);
2675 if (test_type_token(type
, token
, TEP_EVENT_DELIM
, ")"))
2679 type
= read_token_item(tok
);
2687 return TEP_EVENT_ERROR
;
2690 static enum tep_event_type
2691 process_hex_common(struct tep_event
*event
, struct tep_print_arg
*arg
,
2692 char **tok
, enum tep_print_arg_type type
)
2694 memset(arg
, 0, sizeof(*arg
));
2697 if (alloc_and_process_delim(event
, ",", &arg
->hex
.field
))
2700 if (alloc_and_process_delim(event
, ")", &arg
->hex
.size
))
2703 return read_token_item(tok
);
2706 free_arg(arg
->hex
.field
);
2707 arg
->hex
.field
= NULL
;
2710 return TEP_EVENT_ERROR
;
2713 static enum tep_event_type
2714 process_hex(struct tep_event
*event
, struct tep_print_arg
*arg
, char **tok
)
2716 return process_hex_common(event
, arg
, tok
, TEP_PRINT_HEX
);
2719 static enum tep_event_type
2720 process_hex_str(struct tep_event
*event
, struct tep_print_arg
*arg
,
2723 return process_hex_common(event
, arg
, tok
, TEP_PRINT_HEX_STR
);
2726 static enum tep_event_type
2727 process_int_array(struct tep_event
*event
, struct tep_print_arg
*arg
, char **tok
)
2729 memset(arg
, 0, sizeof(*arg
));
2730 arg
->type
= TEP_PRINT_INT_ARRAY
;
2732 if (alloc_and_process_delim(event
, ",", &arg
->int_array
.field
))
2735 if (alloc_and_process_delim(event
, ",", &arg
->int_array
.count
))
2738 if (alloc_and_process_delim(event
, ")", &arg
->int_array
.el_size
))
2741 return read_token_item(tok
);
2744 free_arg(arg
->int_array
.count
);
2745 arg
->int_array
.count
= NULL
;
2747 free_arg(arg
->int_array
.field
);
2748 arg
->int_array
.field
= NULL
;
2751 return TEP_EVENT_ERROR
;
2754 static enum tep_event_type
2755 process_dynamic_array(struct tep_event
*event
, struct tep_print_arg
*arg
, char **tok
)
2757 struct tep_format_field
*field
;
2758 enum tep_event_type type
;
2761 memset(arg
, 0, sizeof(*arg
));
2762 arg
->type
= TEP_PRINT_DYNAMIC_ARRAY
;
2765 * The item within the parenthesis is another field that holds
2766 * the index into where the array starts.
2768 type
= read_token(&token
);
2770 if (type
!= TEP_EVENT_ITEM
)
2773 /* Find the field */
2775 field
= tep_find_field(event
, token
);
2779 arg
->dynarray
.field
= field
;
2780 arg
->dynarray
.index
= 0;
2782 if (read_expected(TEP_EVENT_DELIM
, ")") < 0)
2786 type
= read_token_item(&token
);
2788 if (type
!= TEP_EVENT_OP
|| strcmp(token
, "[") != 0)
2794 do_warning_event(event
, "%s: not enough memory!", __func__
);
2796 return TEP_EVENT_ERROR
;
2799 type
= process_arg(event
, arg
, &token
);
2800 if (type
== TEP_EVENT_ERROR
)
2803 if (!test_type_token(type
, token
, TEP_EVENT_OP
, "]"))
2807 type
= read_token_item(tok
);
2815 return TEP_EVENT_ERROR
;
2818 static enum tep_event_type
2819 process_dynamic_array_len(struct tep_event
*event
, struct tep_print_arg
*arg
,
2822 struct tep_format_field
*field
;
2823 enum tep_event_type type
;
2826 if (read_expect_type(TEP_EVENT_ITEM
, &token
) < 0)
2829 arg
->type
= TEP_PRINT_DYNAMIC_ARRAY_LEN
;
2831 /* Find the field */
2832 field
= tep_find_field(event
, token
);
2836 arg
->dynarray
.field
= field
;
2837 arg
->dynarray
.index
= 0;
2839 if (read_expected(TEP_EVENT_DELIM
, ")") < 0)
2842 type
= read_token(&token
);
2851 return TEP_EVENT_ERROR
;
2854 static enum tep_event_type
2855 process_paren(struct tep_event
*event
, struct tep_print_arg
*arg
, char **tok
)
2857 struct tep_print_arg
*item_arg
;
2858 enum tep_event_type type
;
2861 type
= process_arg(event
, arg
, &token
);
2863 if (type
== TEP_EVENT_ERROR
)
2866 if (type
== TEP_EVENT_OP
)
2867 type
= process_op(event
, arg
, &token
);
2869 if (type
== TEP_EVENT_ERROR
)
2872 if (test_type_token(type
, token
, TEP_EVENT_DELIM
, ")"))
2876 type
= read_token_item(&token
);
2879 * If the next token is an item or another open paren, then
2880 * this was a typecast.
2882 if (event_item_type(type
) ||
2883 (type
== TEP_EVENT_DELIM
&& strcmp(token
, "(") == 0)) {
2885 /* make this a typecast and contine */
2887 /* prevous must be an atom */
2888 if (arg
->type
!= TEP_PRINT_ATOM
) {
2889 do_warning_event(event
, "previous needed to be TEP_PRINT_ATOM");
2893 item_arg
= alloc_arg();
2895 do_warning_event(event
, "%s: not enough memory!",
2900 arg
->type
= TEP_PRINT_TYPE
;
2901 arg
->typecast
.type
= arg
->atom
.atom
;
2902 arg
->typecast
.item
= item_arg
;
2903 type
= process_arg_token(event
, item_arg
, &token
, type
);
2913 return TEP_EVENT_ERROR
;
2917 static enum tep_event_type
2918 process_str(struct tep_event
*event __maybe_unused
, struct tep_print_arg
*arg
,
2921 enum tep_event_type type
;
2924 if (read_expect_type(TEP_EVENT_ITEM
, &token
) < 0)
2927 arg
->type
= TEP_PRINT_STRING
;
2928 arg
->string
.string
= token
;
2929 arg
->string
.offset
= -1;
2931 if (read_expected(TEP_EVENT_DELIM
, ")") < 0)
2934 type
= read_token(&token
);
2943 return TEP_EVENT_ERROR
;
2946 static enum tep_event_type
2947 process_bitmask(struct tep_event
*event __maybe_unused
, struct tep_print_arg
*arg
,
2950 enum tep_event_type type
;
2953 if (read_expect_type(TEP_EVENT_ITEM
, &token
) < 0)
2956 arg
->type
= TEP_PRINT_BITMASK
;
2957 arg
->bitmask
.bitmask
= token
;
2958 arg
->bitmask
.offset
= -1;
2960 if (read_expected(TEP_EVENT_DELIM
, ")") < 0)
2963 type
= read_token(&token
);
2972 return TEP_EVENT_ERROR
;
2975 static struct tep_function_handler
*
2976 find_func_handler(struct tep_handle
*tep
, char *func_name
)
2978 struct tep_function_handler
*func
;
2983 for (func
= tep
->func_handlers
; func
; func
= func
->next
) {
2984 if (strcmp(func
->name
, func_name
) == 0)
2991 static void remove_func_handler(struct tep_handle
*tep
, char *func_name
)
2993 struct tep_function_handler
*func
;
2994 struct tep_function_handler
**next
;
2996 next
= &tep
->func_handlers
;
2997 while ((func
= *next
)) {
2998 if (strcmp(func
->name
, func_name
) == 0) {
3000 free_func_handle(func
);
3007 static enum tep_event_type
3008 process_func_handler(struct tep_event
*event
, struct tep_function_handler
*func
,
3009 struct tep_print_arg
*arg
, char **tok
)
3011 struct tep_print_arg
**next_arg
;
3012 struct tep_print_arg
*farg
;
3013 enum tep_event_type type
;
3017 arg
->type
= TEP_PRINT_FUNC
;
3018 arg
->func
.func
= func
;
3022 next_arg
= &(arg
->func
.args
);
3023 for (i
= 0; i
< func
->nr_args
; i
++) {
3026 do_warning_event(event
, "%s: not enough memory!",
3028 return TEP_EVENT_ERROR
;
3031 type
= process_arg(event
, farg
, &token
);
3032 if (i
< (func
->nr_args
- 1)) {
3033 if (type
!= TEP_EVENT_DELIM
|| strcmp(token
, ",") != 0) {
3034 do_warning_event(event
,
3035 "Error: function '%s()' expects %d arguments but event %s only uses %d",
3036 func
->name
, func
->nr_args
,
3037 event
->name
, i
+ 1);
3041 if (type
!= TEP_EVENT_DELIM
|| strcmp(token
, ")") != 0) {
3042 do_warning_event(event
,
3043 "Error: function '%s()' only expects %d arguments but event %s has more",
3044 func
->name
, func
->nr_args
, event
->name
);
3050 next_arg
= &(farg
->next
);
3054 type
= read_token(&token
);
3062 return TEP_EVENT_ERROR
;
3065 static enum tep_event_type
3066 process_function(struct tep_event
*event
, struct tep_print_arg
*arg
,
3067 char *token
, char **tok
)
3069 struct tep_function_handler
*func
;
3071 if (strcmp(token
, "__print_flags") == 0) {
3074 return process_flags(event
, arg
, tok
);
3076 if (strcmp(token
, "__print_symbolic") == 0) {
3078 is_symbolic_field
= 1;
3079 return process_symbols(event
, arg
, tok
);
3081 if (strcmp(token
, "__print_hex") == 0) {
3083 return process_hex(event
, arg
, tok
);
3085 if (strcmp(token
, "__print_hex_str") == 0) {
3087 return process_hex_str(event
, arg
, tok
);
3089 if (strcmp(token
, "__print_array") == 0) {
3091 return process_int_array(event
, arg
, tok
);
3093 if (strcmp(token
, "__get_str") == 0) {
3095 return process_str(event
, arg
, tok
);
3097 if (strcmp(token
, "__get_bitmask") == 0) {
3099 return process_bitmask(event
, arg
, tok
);
3101 if (strcmp(token
, "__get_dynamic_array") == 0) {
3103 return process_dynamic_array(event
, arg
, tok
);
3105 if (strcmp(token
, "__get_dynamic_array_len") == 0) {
3107 return process_dynamic_array_len(event
, arg
, tok
);
3110 func
= find_func_handler(event
->tep
, token
);
3113 return process_func_handler(event
, func
, arg
, tok
);
3116 do_warning_event(event
, "function %s not defined", token
);
3118 return TEP_EVENT_ERROR
;
3121 static enum tep_event_type
3122 process_arg_token(struct tep_event
*event
, struct tep_print_arg
*arg
,
3123 char **tok
, enum tep_event_type type
)
3131 case TEP_EVENT_ITEM
:
3132 if (strcmp(token
, "REC") == 0) {
3134 type
= process_entry(event
, arg
, &token
);
3138 /* test the next token */
3139 type
= read_token_item(&token
);
3142 * If the next token is a parenthesis, then this
3145 if (type
== TEP_EVENT_DELIM
&& strcmp(token
, "(") == 0) {
3148 /* this will free atom. */
3149 type
= process_function(event
, arg
, atom
, &token
);
3152 /* atoms can be more than one token long */
3153 while (type
== TEP_EVENT_ITEM
) {
3155 new_atom
= realloc(atom
,
3156 strlen(atom
) + strlen(token
) + 2);
3161 return TEP_EVENT_ERROR
;
3165 strcat(atom
, token
);
3167 type
= read_token_item(&token
);
3170 arg
->type
= TEP_PRINT_ATOM
;
3171 arg
->atom
.atom
= atom
;
3174 case TEP_EVENT_DQUOTE
:
3175 case TEP_EVENT_SQUOTE
:
3176 arg
->type
= TEP_PRINT_ATOM
;
3177 arg
->atom
.atom
= token
;
3178 type
= read_token_item(&token
);
3180 case TEP_EVENT_DELIM
:
3181 if (strcmp(token
, "(") == 0) {
3183 type
= process_paren(event
, arg
, &token
);
3187 /* handle single ops */
3188 arg
->type
= TEP_PRINT_OP
;
3190 arg
->op
.left
= NULL
;
3191 type
= process_op(event
, arg
, &token
);
3193 /* On error, the op is freed */
3194 if (type
== TEP_EVENT_ERROR
)
3197 /* return error type if errored */
3200 case TEP_EVENT_ERROR
... TEP_EVENT_NEWLINE
:
3202 do_warning_event(event
, "unexpected type %d", type
);
3203 return TEP_EVENT_ERROR
;
3210 static int event_read_print_args(struct tep_event
*event
, struct tep_print_arg
**list
)
3212 enum tep_event_type type
= TEP_EVENT_ERROR
;
3213 struct tep_print_arg
*arg
;
3218 if (type
== TEP_EVENT_NEWLINE
) {
3219 type
= read_token_item(&token
);
3225 do_warning_event(event
, "%s: not enough memory!",
3230 type
= process_arg(event
, arg
, &token
);
3232 if (type
== TEP_EVENT_ERROR
) {
3241 if (type
== TEP_EVENT_OP
) {
3242 type
= process_op(event
, arg
, &token
);
3244 if (type
== TEP_EVENT_ERROR
) {
3253 if (type
== TEP_EVENT_DELIM
&& strcmp(token
, ",") == 0) {
3260 } while (type
!= TEP_EVENT_NONE
);
3262 if (type
!= TEP_EVENT_NONE
&& type
!= TEP_EVENT_ERROR
)
3268 static int event_read_print(struct tep_event
*event
)
3270 enum tep_event_type type
;
3274 if (read_expected_item(TEP_EVENT_ITEM
, "print") < 0)
3277 if (read_expected(TEP_EVENT_ITEM
, "fmt") < 0)
3280 if (read_expected(TEP_EVENT_OP
, ":") < 0)
3283 if (read_expect_type(TEP_EVENT_DQUOTE
, &token
) < 0)
3287 event
->print_fmt
.format
= token
;
3288 event
->print_fmt
.args
= NULL
;
3290 /* ok to have no arg */
3291 type
= read_token_item(&token
);
3293 if (type
== TEP_EVENT_NONE
)
3296 /* Handle concatenation of print lines */
3297 if (type
== TEP_EVENT_DQUOTE
) {
3300 if (asprintf(&cat
, "%s%s", event
->print_fmt
.format
, token
) < 0)
3303 free_token(event
->print_fmt
.format
);
3304 event
->print_fmt
.format
= NULL
;
3309 if (test_type_token(type
, token
, TEP_EVENT_DELIM
, ","))
3314 ret
= event_read_print_args(event
, &event
->print_fmt
.args
);
3326 * tep_find_common_field - return a common field by event
3327 * @event: handle for the event
3328 * @name: the name of the common field to return
3330 * Returns a common field from the event by the given @name.
3331 * This only searches the common fields and not all field.
3333 struct tep_format_field
*
3334 tep_find_common_field(struct tep_event
*event
, const char *name
)
3336 struct tep_format_field
*format
;
3338 for (format
= event
->format
.common_fields
;
3339 format
; format
= format
->next
) {
3340 if (strcmp(format
->name
, name
) == 0)
3348 * tep_find_field - find a non-common field
3349 * @event: handle for the event
3350 * @name: the name of the non-common field
3352 * Returns a non-common field by the given @name.
3353 * This does not search common fields.
3355 struct tep_format_field
*
3356 tep_find_field(struct tep_event
*event
, const char *name
)
3358 struct tep_format_field
*format
;
3360 for (format
= event
->format
.fields
;
3361 format
; format
= format
->next
) {
3362 if (strcmp(format
->name
, name
) == 0)
3370 * tep_find_any_field - find any field by name
3371 * @event: handle for the event
3372 * @name: the name of the field
3374 * Returns a field by the given @name.
3375 * This searches the common field names first, then
3376 * the non-common ones if a common one was not found.
3378 struct tep_format_field
*
3379 tep_find_any_field(struct tep_event
*event
, const char *name
)
3381 struct tep_format_field
*format
;
3383 format
= tep_find_common_field(event
, name
);
3386 return tep_find_field(event
, name
);
3390 * tep_read_number - read a number from data
3391 * @tep: a handle to the trace event parser context
3392 * @ptr: the raw data
3393 * @size: the size of the data that holds the number
3395 * Returns the number (converted to host) from the
3398 unsigned long long tep_read_number(struct tep_handle
*tep
,
3399 const void *ptr
, int size
)
3401 unsigned long long val
;
3405 return *(unsigned char *)ptr
;
3407 return tep_data2host2(tep
, *(unsigned short *)ptr
);
3409 return tep_data2host4(tep
, *(unsigned int *)ptr
);
3411 memcpy(&val
, (ptr
), sizeof(unsigned long long));
3412 return tep_data2host8(tep
, val
);
3420 * tep_read_number_field - read a number from data
3421 * @field: a handle to the field
3422 * @data: the raw data to read
3423 * @value: the value to place the number in
3425 * Reads raw data according to a field offset and size,
3426 * and translates it into @value.
3428 * Returns 0 on success, -1 otherwise.
3430 int tep_read_number_field(struct tep_format_field
*field
, const void *data
,
3431 unsigned long long *value
)
3435 switch (field
->size
) {
3440 *value
= tep_read_number(field
->event
->tep
,
3441 data
+ field
->offset
, field
->size
);
3448 static int get_common_info(struct tep_handle
*tep
,
3449 const char *type
, int *offset
, int *size
)
3451 struct tep_event
*event
;
3452 struct tep_format_field
*field
;
3455 * All events should have the same common elements.
3456 * Pick any event to find where the type is;
3459 do_warning("no event_list!");
3463 event
= tep
->events
[0];
3464 field
= tep_find_common_field(event
, type
);
3468 *offset
= field
->offset
;
3469 *size
= field
->size
;
3474 static int __parse_common(struct tep_handle
*tep
, void *data
,
3475 int *size
, int *offset
, const char *name
)
3480 ret
= get_common_info(tep
, name
, offset
, size
);
3484 return tep_read_number(tep
, data
+ *offset
, *size
);
3487 static int trace_parse_common_type(struct tep_handle
*tep
, void *data
)
3489 return __parse_common(tep
, data
,
3490 &tep
->type_size
, &tep
->type_offset
,
3494 static int parse_common_pid(struct tep_handle
*tep
, void *data
)
3496 return __parse_common(tep
, data
,
3497 &tep
->pid_size
, &tep
->pid_offset
,
3501 static int parse_common_pc(struct tep_handle
*tep
, void *data
)
3503 return __parse_common(tep
, data
,
3504 &tep
->pc_size
, &tep
->pc_offset
,
3505 "common_preempt_count");
3508 static int parse_common_flags(struct tep_handle
*tep
, void *data
)
3510 return __parse_common(tep
, data
,
3511 &tep
->flags_size
, &tep
->flags_offset
,
3515 static int parse_common_lock_depth(struct tep_handle
*tep
, void *data
)
3517 return __parse_common(tep
, data
,
3518 &tep
->ld_size
, &tep
->ld_offset
,
3519 "common_lock_depth");
3522 static int parse_common_migrate_disable(struct tep_handle
*tep
, void *data
)
3524 return __parse_common(tep
, data
,
3525 &tep
->ld_size
, &tep
->ld_offset
,
3526 "common_migrate_disable");
3529 static int events_id_cmp(const void *a
, const void *b
);
3532 * tep_find_event - find an event by given id
3533 * @tep: a handle to the trace event parser context
3534 * @id: the id of the event
3536 * Returns an event that has a given @id.
3538 struct tep_event
*tep_find_event(struct tep_handle
*tep
, int id
)
3540 struct tep_event
**eventptr
;
3541 struct tep_event key
;
3542 struct tep_event
*pkey
= &key
;
3544 /* Check cache first */
3545 if (tep
->last_event
&& tep
->last_event
->id
== id
)
3546 return tep
->last_event
;
3550 eventptr
= bsearch(&pkey
, tep
->events
, tep
->nr_events
,
3551 sizeof(*tep
->events
), events_id_cmp
);
3554 tep
->last_event
= *eventptr
;
3562 * tep_find_event_by_name - find an event by given name
3563 * @tep: a handle to the trace event parser context
3564 * @sys: the system name to search for
3565 * @name: the name of the event to search for
3567 * This returns an event with a given @name and under the system
3568 * @sys. If @sys is NULL the first event with @name is returned.
3571 tep_find_event_by_name(struct tep_handle
*tep
,
3572 const char *sys
, const char *name
)
3574 struct tep_event
*event
= NULL
;
3577 if (tep
->last_event
&&
3578 strcmp(tep
->last_event
->name
, name
) == 0 &&
3579 (!sys
|| strcmp(tep
->last_event
->system
, sys
) == 0))
3580 return tep
->last_event
;
3582 for (i
= 0; i
< tep
->nr_events
; i
++) {
3583 event
= tep
->events
[i
];
3584 if (strcmp(event
->name
, name
) == 0) {
3587 if (strcmp(event
->system
, sys
) == 0)
3591 if (i
== tep
->nr_events
)
3594 tep
->last_event
= event
;
3598 static unsigned long long
3599 eval_num_arg(void *data
, int size
, struct tep_event
*event
, struct tep_print_arg
*arg
)
3601 struct tep_handle
*tep
= event
->tep
;
3602 unsigned long long val
= 0;
3603 unsigned long long left
, right
;
3604 struct tep_print_arg
*typearg
= NULL
;
3605 struct tep_print_arg
*larg
;
3606 unsigned long offset
;
3607 unsigned int field_size
;
3609 switch (arg
->type
) {
3610 case TEP_PRINT_NULL
:
3613 case TEP_PRINT_ATOM
:
3614 return strtoull(arg
->atom
.atom
, NULL
, 0);
3615 case TEP_PRINT_FIELD
:
3616 if (!arg
->field
.field
) {
3617 arg
->field
.field
= tep_find_any_field(event
, arg
->field
.name
);
3618 if (!arg
->field
.field
)
3619 goto out_warning_field
;
3622 /* must be a number */
3623 val
= tep_read_number(tep
, data
+ arg
->field
.field
->offset
,
3624 arg
->field
.field
->size
);
3626 case TEP_PRINT_FLAGS
:
3627 case TEP_PRINT_SYMBOL
:
3628 case TEP_PRINT_INT_ARRAY
:
3630 case TEP_PRINT_HEX_STR
:
3632 case TEP_PRINT_TYPE
:
3633 val
= eval_num_arg(data
, size
, event
, arg
->typecast
.item
);
3634 return eval_type(val
, arg
, 0);
3635 case TEP_PRINT_STRING
:
3636 case TEP_PRINT_BSTRING
:
3637 case TEP_PRINT_BITMASK
:
3639 case TEP_PRINT_FUNC
: {
3642 val
= process_defined_func(&s
, data
, size
, event
, arg
);
3643 trace_seq_destroy(&s
);
3647 if (strcmp(arg
->op
.op
, "[") == 0) {
3649 * Arrays are special, since we don't want
3650 * to read the arg as is.
3652 right
= eval_num_arg(data
, size
, event
, arg
->op
.right
);
3654 /* handle typecasts */
3655 larg
= arg
->op
.left
;
3656 while (larg
->type
== TEP_PRINT_TYPE
) {
3659 larg
= larg
->typecast
.item
;
3662 /* Default to long size */
3663 field_size
= tep
->long_size
;
3665 switch (larg
->type
) {
3666 case TEP_PRINT_DYNAMIC_ARRAY
:
3667 offset
= tep_read_number(tep
,
3668 data
+ larg
->dynarray
.field
->offset
,
3669 larg
->dynarray
.field
->size
);
3670 if (larg
->dynarray
.field
->elementsize
)
3671 field_size
= larg
->dynarray
.field
->elementsize
;
3673 * The actual length of the dynamic array is stored
3674 * in the top half of the field, and the offset
3675 * is in the bottom half of the 32 bit field.
3680 case TEP_PRINT_FIELD
:
3681 if (!larg
->field
.field
) {
3683 tep_find_any_field(event
, larg
->field
.name
);
3684 if (!larg
->field
.field
) {
3686 goto out_warning_field
;
3689 field_size
= larg
->field
.field
->elementsize
;
3690 offset
= larg
->field
.field
->offset
+
3691 right
* larg
->field
.field
->elementsize
;
3694 goto default_op
; /* oops, all bets off */
3696 val
= tep_read_number(tep
,
3697 data
+ offset
, field_size
);
3699 val
= eval_type(val
, typearg
, 1);
3701 } else if (strcmp(arg
->op
.op
, "?") == 0) {
3702 left
= eval_num_arg(data
, size
, event
, arg
->op
.left
);
3703 arg
= arg
->op
.right
;
3705 val
= eval_num_arg(data
, size
, event
, arg
->op
.left
);
3707 val
= eval_num_arg(data
, size
, event
, arg
->op
.right
);
3711 left
= eval_num_arg(data
, size
, event
, arg
->op
.left
);
3712 right
= eval_num_arg(data
, size
, event
, arg
->op
.right
);
3713 switch (arg
->op
.op
[0]) {
3715 switch (arg
->op
.op
[1]) {
3720 val
= left
!= right
;
3723 goto out_warning_op
;
3731 val
= left
|| right
;
3737 val
= left
&& right
;
3742 switch (arg
->op
.op
[1]) {
3747 val
= left
<< right
;
3750 val
= left
<= right
;
3753 goto out_warning_op
;
3757 switch (arg
->op
.op
[1]) {
3762 val
= left
>> right
;
3765 val
= left
>= right
;
3768 goto out_warning_op
;
3772 if (arg
->op
.op
[1] != '=')
3773 goto out_warning_op
;
3775 val
= left
== right
;
3793 goto out_warning_op
;
3796 case TEP_PRINT_DYNAMIC_ARRAY_LEN
:
3797 offset
= tep_read_number(tep
,
3798 data
+ arg
->dynarray
.field
->offset
,
3799 arg
->dynarray
.field
->size
);
3801 * The total allocated length of the dynamic array is
3802 * stored in the top half of the field, and the offset
3803 * is in the bottom half of the 32 bit field.
3805 val
= (unsigned long long)(offset
>> 16);
3807 case TEP_PRINT_DYNAMIC_ARRAY
:
3808 /* Without [], we pass the address to the dynamic data */
3809 offset
= tep_read_number(tep
,
3810 data
+ arg
->dynarray
.field
->offset
,
3811 arg
->dynarray
.field
->size
);
3813 * The total allocated length of the dynamic array is
3814 * stored in the top half of the field, and the offset
3815 * is in the bottom half of the 32 bit field.
3818 val
= (unsigned long long)((unsigned long)data
+ offset
);
3820 default: /* not sure what to do there */
3826 do_warning_event(event
, "%s: unknown op '%s'", __func__
, arg
->op
.op
);
3830 do_warning_event(event
, "%s: field %s not found",
3831 __func__
, arg
->field
.name
);
3837 unsigned long long value
;
3840 static const struct flag flags
[] = {
3841 { "HI_SOFTIRQ", 0 },
3842 { "TIMER_SOFTIRQ", 1 },
3843 { "NET_TX_SOFTIRQ", 2 },
3844 { "NET_RX_SOFTIRQ", 3 },
3845 { "BLOCK_SOFTIRQ", 4 },
3846 { "IRQ_POLL_SOFTIRQ", 5 },
3847 { "TASKLET_SOFTIRQ", 6 },
3848 { "SCHED_SOFTIRQ", 7 },
3849 { "HRTIMER_SOFTIRQ", 8 },
3850 { "RCU_SOFTIRQ", 9 },
3852 { "HRTIMER_NORESTART", 0 },
3853 { "HRTIMER_RESTART", 1 },
3856 static long long eval_flag(const char *flag
)
3861 * Some flags in the format files do not get converted.
3862 * If the flag is not numeric, see if it is something that
3863 * we already know about.
3865 if (isdigit(flag
[0]))
3866 return strtoull(flag
, NULL
, 0);
3868 for (i
= 0; i
< (int)(sizeof(flags
)/sizeof(flags
[0])); i
++)
3869 if (strcmp(flags
[i
].name
, flag
) == 0)
3870 return flags
[i
].value
;
3875 static void print_str_to_seq(struct trace_seq
*s
, const char *format
,
3876 int len_arg
, const char *str
)
3879 trace_seq_printf(s
, format
, len_arg
, str
);
3881 trace_seq_printf(s
, format
, str
);
3884 static void print_bitmask_to_seq(struct tep_handle
*tep
,
3885 struct trace_seq
*s
, const char *format
,
3886 int len_arg
, const void *data
, int size
)
3888 int nr_bits
= size
* 8;
3889 int str_size
= (nr_bits
+ 3) / 4;
3897 * The kernel likes to put in commas every 32 bits, we
3900 str_size
+= (nr_bits
- 1) / 32;
3902 str
= malloc(str_size
+ 1);
3904 do_warning("%s: not enough memory!", __func__
);
3909 /* Start out with -2 for the two chars per byte */
3910 for (i
= str_size
- 2; i
>= 0; i
-= 2) {
3912 * data points to a bit mask of size bytes.
3913 * In the kernel, this is an array of long words, thus
3914 * endianness is very important.
3916 if (tep
->file_bigendian
)
3917 index
= size
- (len
+ 1);
3921 snprintf(buf
, 3, "%02x", *((unsigned char *)data
+ index
));
3922 memcpy(str
+ i
, buf
, 2);
3924 if (!(len
& 3) && i
> 0) {
3931 trace_seq_printf(s
, format
, len_arg
, str
);
3933 trace_seq_printf(s
, format
, str
);
3938 static void print_str_arg(struct trace_seq
*s
, void *data
, int size
,
3939 struct tep_event
*event
, const char *format
,
3940 int len_arg
, struct tep_print_arg
*arg
)
3942 struct tep_handle
*tep
= event
->tep
;
3943 struct tep_print_flag_sym
*flag
;
3944 struct tep_format_field
*field
;
3945 struct printk_map
*printk
;
3946 long long val
, fval
;
3947 unsigned long long addr
;
3953 switch (arg
->type
) {
3954 case TEP_PRINT_NULL
:
3957 case TEP_PRINT_ATOM
:
3958 print_str_to_seq(s
, format
, len_arg
, arg
->atom
.atom
);
3960 case TEP_PRINT_FIELD
:
3961 field
= arg
->field
.field
;
3963 field
= tep_find_any_field(event
, arg
->field
.name
);
3965 str
= arg
->field
.name
;
3966 goto out_warning_field
;
3968 arg
->field
.field
= field
;
3970 /* Zero sized fields, mean the rest of the data */
3971 len
= field
->size
? : size
- field
->offset
;
3974 * Some events pass in pointers. If this is not an array
3975 * and the size is the same as long_size, assume that it
3978 if (!(field
->flags
& TEP_FIELD_IS_ARRAY
) &&
3979 field
->size
== tep
->long_size
) {
3981 /* Handle heterogeneous recording and processing
3985 * Traces recorded on 32-bit devices (32-bit
3986 * addressing) and processed on 64-bit devices:
3987 * In this case, only 32 bits should be read.
3990 * Traces recorded on 64 bit devices and processed
3991 * on 32-bit devices:
3992 * In this case, 64 bits must be read.
3994 addr
= (tep
->long_size
== 8) ?
3995 *(unsigned long long *)(data
+ field
->offset
) :
3996 (unsigned long long)*(unsigned int *)(data
+ field
->offset
);
3998 /* Check if it matches a print format */
3999 printk
= find_printk(tep
, addr
);
4001 trace_seq_puts(s
, printk
->printk
);
4003 trace_seq_printf(s
, "%llx", addr
);
4006 str
= malloc(len
+ 1);
4008 do_warning_event(event
, "%s: not enough memory!",
4012 memcpy(str
, data
+ field
->offset
, len
);
4014 print_str_to_seq(s
, format
, len_arg
, str
);
4017 case TEP_PRINT_FLAGS
:
4018 val
= eval_num_arg(data
, size
, event
, arg
->flags
.field
);
4020 for (flag
= arg
->flags
.flags
; flag
; flag
= flag
->next
) {
4021 fval
= eval_flag(flag
->value
);
4022 if (!val
&& fval
< 0) {
4023 print_str_to_seq(s
, format
, len_arg
, flag
->str
);
4026 if (fval
> 0 && (val
& fval
) == fval
) {
4027 if (print
&& arg
->flags
.delim
)
4028 trace_seq_puts(s
, arg
->flags
.delim
);
4029 print_str_to_seq(s
, format
, len_arg
, flag
->str
);
4035 if (print
&& arg
->flags
.delim
)
4036 trace_seq_puts(s
, arg
->flags
.delim
);
4037 trace_seq_printf(s
, "0x%llx", val
);
4040 case TEP_PRINT_SYMBOL
:
4041 val
= eval_num_arg(data
, size
, event
, arg
->symbol
.field
);
4042 for (flag
= arg
->symbol
.symbols
; flag
; flag
= flag
->next
) {
4043 fval
= eval_flag(flag
->value
);
4045 print_str_to_seq(s
, format
, len_arg
, flag
->str
);
4050 trace_seq_printf(s
, "0x%llx", val
);
4053 case TEP_PRINT_HEX_STR
:
4054 if (arg
->hex
.field
->type
== TEP_PRINT_DYNAMIC_ARRAY
) {
4055 unsigned long offset
;
4056 offset
= tep_read_number(tep
,
4057 data
+ arg
->hex
.field
->dynarray
.field
->offset
,
4058 arg
->hex
.field
->dynarray
.field
->size
);
4059 hex
= data
+ (offset
& 0xffff);
4061 field
= arg
->hex
.field
->field
.field
;
4063 str
= arg
->hex
.field
->field
.name
;
4064 field
= tep_find_any_field(event
, str
);
4066 goto out_warning_field
;
4067 arg
->hex
.field
->field
.field
= field
;
4069 hex
= data
+ field
->offset
;
4071 len
= eval_num_arg(data
, size
, event
, arg
->hex
.size
);
4072 for (i
= 0; i
< len
; i
++) {
4073 if (i
&& arg
->type
== TEP_PRINT_HEX
)
4074 trace_seq_putc(s
, ' ');
4075 trace_seq_printf(s
, "%02x", hex
[i
]);
4079 case TEP_PRINT_INT_ARRAY
: {
4083 if (arg
->int_array
.field
->type
== TEP_PRINT_DYNAMIC_ARRAY
) {
4084 unsigned long offset
;
4085 struct tep_format_field
*field
=
4086 arg
->int_array
.field
->dynarray
.field
;
4087 offset
= tep_read_number(tep
,
4088 data
+ field
->offset
,
4090 num
= data
+ (offset
& 0xffff);
4092 field
= arg
->int_array
.field
->field
.field
;
4094 str
= arg
->int_array
.field
->field
.name
;
4095 field
= tep_find_any_field(event
, str
);
4097 goto out_warning_field
;
4098 arg
->int_array
.field
->field
.field
= field
;
4100 num
= data
+ field
->offset
;
4102 len
= eval_num_arg(data
, size
, event
, arg
->int_array
.count
);
4103 el_size
= eval_num_arg(data
, size
, event
,
4104 arg
->int_array
.el_size
);
4105 for (i
= 0; i
< len
; i
++) {
4107 trace_seq_putc(s
, ' ');
4110 trace_seq_printf(s
, "%u", *(uint8_t *)num
);
4111 } else if (el_size
== 2) {
4112 trace_seq_printf(s
, "%u", *(uint16_t *)num
);
4113 } else if (el_size
== 4) {
4114 trace_seq_printf(s
, "%u", *(uint32_t *)num
);
4115 } else if (el_size
== 8) {
4116 trace_seq_printf(s
, "%"PRIu64
, *(uint64_t *)num
);
4118 trace_seq_printf(s
, "BAD SIZE:%d 0x%x",
4119 el_size
, *(uint8_t *)num
);
4127 case TEP_PRINT_TYPE
:
4129 case TEP_PRINT_STRING
: {
4132 if (arg
->string
.offset
== -1) {
4133 struct tep_format_field
*f
;
4135 f
= tep_find_any_field(event
, arg
->string
.string
);
4136 arg
->string
.offset
= f
->offset
;
4138 str_offset
= tep_data2host4(tep
, *(unsigned int *)(data
+ arg
->string
.offset
));
4139 str_offset
&= 0xffff;
4140 print_str_to_seq(s
, format
, len_arg
, ((char *)data
) + str_offset
);
4143 case TEP_PRINT_BSTRING
:
4144 print_str_to_seq(s
, format
, len_arg
, arg
->string
.string
);
4146 case TEP_PRINT_BITMASK
: {
4150 if (arg
->bitmask
.offset
== -1) {
4151 struct tep_format_field
*f
;
4153 f
= tep_find_any_field(event
, arg
->bitmask
.bitmask
);
4154 arg
->bitmask
.offset
= f
->offset
;
4156 bitmask_offset
= tep_data2host4(tep
, *(unsigned int *)(data
+ arg
->bitmask
.offset
));
4157 bitmask_size
= bitmask_offset
>> 16;
4158 bitmask_offset
&= 0xffff;
4159 print_bitmask_to_seq(tep
, s
, format
, len_arg
,
4160 data
+ bitmask_offset
, bitmask_size
);
4165 * The only op for string should be ? :
4167 if (arg
->op
.op
[0] != '?')
4169 val
= eval_num_arg(data
, size
, event
, arg
->op
.left
);
4171 print_str_arg(s
, data
, size
, event
,
4172 format
, len_arg
, arg
->op
.right
->op
.left
);
4174 print_str_arg(s
, data
, size
, event
,
4175 format
, len_arg
, arg
->op
.right
->op
.right
);
4177 case TEP_PRINT_FUNC
:
4178 process_defined_func(s
, data
, size
, event
, arg
);
4188 do_warning_event(event
, "%s: field %s not found",
4189 __func__
, arg
->field
.name
);
4192 static unsigned long long
4193 process_defined_func(struct trace_seq
*s
, void *data
, int size
,
4194 struct tep_event
*event
, struct tep_print_arg
*arg
)
4196 struct tep_function_handler
*func_handle
= arg
->func
.func
;
4197 struct func_params
*param
;
4198 unsigned long long *args
;
4199 unsigned long long ret
;
4200 struct tep_print_arg
*farg
;
4201 struct trace_seq str
;
4203 struct save_str
*next
;
4205 } *strings
= NULL
, *string
;
4208 if (!func_handle
->nr_args
) {
4209 ret
= (*func_handle
->func
)(s
, NULL
);
4213 farg
= arg
->func
.args
;
4214 param
= func_handle
->params
;
4217 args
= malloc(sizeof(*args
) * func_handle
->nr_args
);
4221 for (i
= 0; i
< func_handle
->nr_args
; i
++) {
4222 switch (param
->type
) {
4223 case TEP_FUNC_ARG_INT
:
4224 case TEP_FUNC_ARG_LONG
:
4225 case TEP_FUNC_ARG_PTR
:
4226 args
[i
] = eval_num_arg(data
, size
, event
, farg
);
4228 case TEP_FUNC_ARG_STRING
:
4229 trace_seq_init(&str
);
4230 print_str_arg(&str
, data
, size
, event
, "%s", -1, farg
);
4231 trace_seq_terminate(&str
);
4232 string
= malloc(sizeof(*string
));
4234 do_warning_event(event
, "%s(%d): malloc str",
4235 __func__
, __LINE__
);
4238 string
->next
= strings
;
4239 string
->str
= strdup(str
.buffer
);
4242 do_warning_event(event
, "%s(%d): malloc str",
4243 __func__
, __LINE__
);
4246 args
[i
] = (uintptr_t)string
->str
;
4248 trace_seq_destroy(&str
);
4252 * Something went totally wrong, this is not
4253 * an input error, something in this code broke.
4255 do_warning_event(event
, "Unexpected end of arguments\n");
4259 param
= param
->next
;
4262 ret
= (*func_handle
->func
)(s
, args
);
4267 strings
= string
->next
;
4273 /* TBD : handle return type here */
4277 static void free_args(struct tep_print_arg
*args
)
4279 struct tep_print_arg
*next
;
4289 static struct tep_print_arg
*make_bprint_args(char *fmt
, void *data
, int size
, struct tep_event
*event
)
4291 struct tep_handle
*tep
= event
->tep
;
4292 struct tep_format_field
*field
, *ip_field
;
4293 struct tep_print_arg
*args
, *arg
, **next
;
4294 unsigned long long ip
, val
;
4299 field
= tep
->bprint_buf_field
;
4300 ip_field
= tep
->bprint_ip_field
;
4303 field
= tep_find_field(event
, "buf");
4305 do_warning_event(event
, "can't find buffer field for binary printk");
4308 ip_field
= tep_find_field(event
, "ip");
4310 do_warning_event(event
, "can't find ip field for binary printk");
4313 tep
->bprint_buf_field
= field
;
4314 tep
->bprint_ip_field
= ip_field
;
4317 ip
= tep_read_number(tep
, data
+ ip_field
->offset
, ip_field
->size
);
4320 * The first arg is the IP pointer.
4324 do_warning_event(event
, "%s(%d): not enough memory!",
4325 __func__
, __LINE__
);
4332 arg
->type
= TEP_PRINT_ATOM
;
4334 if (asprintf(&arg
->atom
.atom
, "%lld", ip
) < 0)
4337 /* skip the first "%ps: " */
4338 for (ptr
= fmt
+ 5, bptr
= data
+ field
->offset
;
4339 bptr
< data
+ size
&& *ptr
; ptr
++) {
4364 if (isalnum(ptr
[1])) {
4366 /* Check for special pointers */
4375 * Pre-5.5 kernels use %pf and
4376 * %pF for printing symbols
4377 * while kernels since 5.5 use
4378 * %pfw for fwnodes. So check
4379 * %p[fF] isn't followed by 'w'.
4386 * Older kernels do not process
4387 * dereferenced pointers.
4388 * Only process if the pointer
4389 * value is a printable.
4391 if (isprint(*(char *)bptr
))
4392 goto process_string
;
4407 vsize
= tep
->long_size
;
4421 /* the pointers are always 4 bytes aligned */
4422 bptr
= (void *)(((unsigned long)bptr
+ 3) &
4424 val
= tep_read_number(tep
, bptr
, vsize
);
4428 do_warning_event(event
, "%s(%d): not enough memory!",
4429 __func__
, __LINE__
);
4433 arg
->type
= TEP_PRINT_ATOM
;
4434 if (asprintf(&arg
->atom
.atom
, "%lld", val
) < 0) {
4441 * The '*' case means that an arg is used as the length.
4442 * We need to continue to figure out for what.
4452 do_warning_event(event
, "%s(%d): not enough memory!",
4453 __func__
, __LINE__
);
4457 arg
->type
= TEP_PRINT_BSTRING
;
4458 arg
->string
.string
= strdup(bptr
);
4459 if (!arg
->string
.string
)
4461 bptr
+= strlen(bptr
) + 1;
4478 get_bprint_format(void *data
, int size __maybe_unused
,
4479 struct tep_event
*event
)
4481 struct tep_handle
*tep
= event
->tep
;
4482 unsigned long long addr
;
4483 struct tep_format_field
*field
;
4484 struct printk_map
*printk
;
4487 field
= tep
->bprint_fmt_field
;
4490 field
= tep_find_field(event
, "fmt");
4492 do_warning_event(event
, "can't find format field for binary printk");
4495 tep
->bprint_fmt_field
= field
;
4498 addr
= tep_read_number(tep
, data
+ field
->offset
, field
->size
);
4500 printk
= find_printk(tep
, addr
);
4502 if (asprintf(&format
, "%%ps: (NO FORMAT FOUND at %llx)\n", addr
) < 0)
4507 if (asprintf(&format
, "%s: %s", "%ps", printk
->printk
) < 0)
4513 static void print_mac_arg(struct trace_seq
*s
, int mac
, void *data
, int size
,
4514 struct tep_event
*event
, struct tep_print_arg
*arg
)
4517 const char *fmt
= "%.2x:%.2x:%.2x:%.2x:%.2x:%.2x";
4519 if (arg
->type
== TEP_PRINT_FUNC
) {
4520 process_defined_func(s
, data
, size
, event
, arg
);
4524 if (arg
->type
!= TEP_PRINT_FIELD
) {
4525 trace_seq_printf(s
, "ARG TYPE NOT FIELD BUT %d",
4531 fmt
= "%.2x%.2x%.2x%.2x%.2x%.2x";
4532 if (!arg
->field
.field
) {
4534 tep_find_any_field(event
, arg
->field
.name
);
4535 if (!arg
->field
.field
) {
4536 do_warning_event(event
, "%s: field %s not found",
4537 __func__
, arg
->field
.name
);
4541 if (arg
->field
.field
->size
!= 6) {
4542 trace_seq_printf(s
, "INVALIDMAC");
4545 buf
= data
+ arg
->field
.field
->offset
;
4546 trace_seq_printf(s
, fmt
, buf
[0], buf
[1], buf
[2], buf
[3], buf
[4], buf
[5]);
4549 static void print_ip4_addr(struct trace_seq
*s
, char i
, unsigned char *buf
)
4554 fmt
= "%03d.%03d.%03d.%03d";
4556 fmt
= "%d.%d.%d.%d";
4558 trace_seq_printf(s
, fmt
, buf
[0], buf
[1], buf
[2], buf
[3]);
4561 static inline bool ipv6_addr_v4mapped(const struct in6_addr
*a
)
4563 return ((unsigned long)(a
->s6_addr32
[0] | a
->s6_addr32
[1]) |
4564 (unsigned long)(a
->s6_addr32
[2] ^ htonl(0x0000ffff))) == 0UL;
4567 static inline bool ipv6_addr_is_isatap(const struct in6_addr
*addr
)
4569 return (addr
->s6_addr32
[2] | htonl(0x02000000)) == htonl(0x02005EFE);
4572 static void print_ip6c_addr(struct trace_seq
*s
, unsigned char *addr
)
4575 unsigned char zerolength
[8];
4580 bool needcolon
= false;
4582 struct in6_addr in6
;
4584 memcpy(&in6
, addr
, sizeof(struct in6_addr
));
4586 useIPv4
= ipv6_addr_v4mapped(&in6
) || ipv6_addr_is_isatap(&in6
);
4588 memset(zerolength
, 0, sizeof(zerolength
));
4595 /* find position of longest 0 run */
4596 for (i
= 0; i
< range
; i
++) {
4597 for (j
= i
; j
< range
; j
++) {
4598 if (in6
.s6_addr16
[j
] != 0)
4603 for (i
= 0; i
< range
; i
++) {
4604 if (zerolength
[i
] > longest
) {
4605 longest
= zerolength
[i
];
4609 if (longest
== 1) /* don't compress a single 0 */
4613 for (i
= 0; i
< range
; i
++) {
4614 if (i
== colonpos
) {
4615 if (needcolon
|| i
== 0)
4616 trace_seq_printf(s
, ":");
4617 trace_seq_printf(s
, ":");
4623 trace_seq_printf(s
, ":");
4626 /* hex u16 without leading 0s */
4627 word
= ntohs(in6
.s6_addr16
[i
]);
4631 trace_seq_printf(s
, "%x%02x", hi
, lo
);
4633 trace_seq_printf(s
, "%x", lo
);
4640 trace_seq_printf(s
, ":");
4641 print_ip4_addr(s
, 'I', &in6
.s6_addr
[12]);
4647 static void print_ip6_addr(struct trace_seq
*s
, char i
, unsigned char *buf
)
4651 for (j
= 0; j
< 16; j
+= 2) {
4652 trace_seq_printf(s
, "%02x%02x", buf
[j
], buf
[j
+1]);
4653 if (i
== 'I' && j
< 14)
4654 trace_seq_printf(s
, ":");
4659 * %pi4 print an IPv4 address with leading zeros
4660 * %pI4 print an IPv4 address without leading zeros
4661 * %pi6 print an IPv6 address without colons
4662 * %pI6 print an IPv6 address with colons
4663 * %pI6c print an IPv6 address in compressed form with colons
4664 * %pISpc print an IP address based on sockaddr; p adds port.
4666 static int print_ipv4_arg(struct trace_seq
*s
, const char *ptr
, char i
,
4667 void *data
, int size
, struct tep_event
*event
,
4668 struct tep_print_arg
*arg
)
4672 if (arg
->type
== TEP_PRINT_FUNC
) {
4673 process_defined_func(s
, data
, size
, event
, arg
);
4677 if (arg
->type
!= TEP_PRINT_FIELD
) {
4678 trace_seq_printf(s
, "ARG TYPE NOT FIELD BUT %d", arg
->type
);
4682 if (!arg
->field
.field
) {
4684 tep_find_any_field(event
, arg
->field
.name
);
4685 if (!arg
->field
.field
) {
4686 do_warning("%s: field %s not found",
4687 __func__
, arg
->field
.name
);
4692 buf
= data
+ arg
->field
.field
->offset
;
4694 if (arg
->field
.field
->size
!= 4) {
4695 trace_seq_printf(s
, "INVALIDIPv4");
4698 print_ip4_addr(s
, i
, buf
);
4703 static int print_ipv6_arg(struct trace_seq
*s
, const char *ptr
, char i
,
4704 void *data
, int size
, struct tep_event
*event
,
4705 struct tep_print_arg
*arg
)
4712 if (i
== 'I' && *ptr
== 'c') {
4718 if (arg
->type
== TEP_PRINT_FUNC
) {
4719 process_defined_func(s
, data
, size
, event
, arg
);
4723 if (arg
->type
!= TEP_PRINT_FIELD
) {
4724 trace_seq_printf(s
, "ARG TYPE NOT FIELD BUT %d", arg
->type
);
4728 if (!arg
->field
.field
) {
4730 tep_find_any_field(event
, arg
->field
.name
);
4731 if (!arg
->field
.field
) {
4732 do_warning("%s: field %s not found",
4733 __func__
, arg
->field
.name
);
4738 buf
= data
+ arg
->field
.field
->offset
;
4740 if (arg
->field
.field
->size
!= 16) {
4741 trace_seq_printf(s
, "INVALIDIPv6");
4746 print_ip6c_addr(s
, buf
);
4748 print_ip6_addr(s
, i
, buf
);
4753 static int print_ipsa_arg(struct trace_seq
*s
, const char *ptr
, char i
,
4754 void *data
, int size
, struct tep_event
*event
,
4755 struct tep_print_arg
*arg
)
4757 char have_c
= 0, have_p
= 0;
4759 struct sockaddr_storage
*sa
;
4776 if (arg
->type
== TEP_PRINT_FUNC
) {
4777 process_defined_func(s
, data
, size
, event
, arg
);
4781 if (arg
->type
!= TEP_PRINT_FIELD
) {
4782 trace_seq_printf(s
, "ARG TYPE NOT FIELD BUT %d", arg
->type
);
4786 if (!arg
->field
.field
) {
4788 tep_find_any_field(event
, arg
->field
.name
);
4789 if (!arg
->field
.field
) {
4790 do_warning("%s: field %s not found",
4791 __func__
, arg
->field
.name
);
4796 sa
= (struct sockaddr_storage
*) (data
+ arg
->field
.field
->offset
);
4798 if (sa
->ss_family
== AF_INET
) {
4799 struct sockaddr_in
*sa4
= (struct sockaddr_in
*) sa
;
4801 if (arg
->field
.field
->size
< sizeof(struct sockaddr_in
)) {
4802 trace_seq_printf(s
, "INVALIDIPv4");
4806 print_ip4_addr(s
, i
, (unsigned char *) &sa4
->sin_addr
);
4808 trace_seq_printf(s
, ":%d", ntohs(sa4
->sin_port
));
4811 } else if (sa
->ss_family
== AF_INET6
) {
4812 struct sockaddr_in6
*sa6
= (struct sockaddr_in6
*) sa
;
4814 if (arg
->field
.field
->size
< sizeof(struct sockaddr_in6
)) {
4815 trace_seq_printf(s
, "INVALIDIPv6");
4820 trace_seq_printf(s
, "[");
4822 buf
= (unsigned char *) &sa6
->sin6_addr
;
4824 print_ip6c_addr(s
, buf
);
4826 print_ip6_addr(s
, i
, buf
);
4829 trace_seq_printf(s
, "]:%d", ntohs(sa6
->sin6_port
));
4835 static int print_ip_arg(struct trace_seq
*s
, const char *ptr
,
4836 void *data
, int size
, struct tep_event
*event
,
4837 struct tep_print_arg
*arg
)
4839 char i
= *ptr
; /* 'i' or 'I' */
4852 rc
+= print_ipv4_arg(s
, ptr
, i
, data
, size
, event
, arg
);
4855 rc
+= print_ipv6_arg(s
, ptr
, i
, data
, size
, event
, arg
);
4858 rc
+= print_ipsa_arg(s
, ptr
, i
, data
, size
, event
, arg
);
4867 static int is_printable_array(char *p
, unsigned int len
)
4871 for (i
= 0; i
< len
&& p
[i
]; i
++)
4872 if (!isprint(p
[i
]) && !isspace(p
[i
]))
4877 void tep_print_field(struct trace_seq
*s
, void *data
,
4878 struct tep_format_field
*field
)
4880 unsigned long long val
;
4881 unsigned int offset
, len
, i
;
4882 struct tep_handle
*tep
= field
->event
->tep
;
4884 if (field
->flags
& TEP_FIELD_IS_ARRAY
) {
4885 offset
= field
->offset
;
4887 if (field
->flags
& TEP_FIELD_IS_DYNAMIC
) {
4888 val
= tep_read_number(tep
, data
+ offset
, len
);
4893 if (field
->flags
& TEP_FIELD_IS_STRING
&&
4894 is_printable_array(data
+ offset
, len
)) {
4895 trace_seq_printf(s
, "%s", (char *)data
+ offset
);
4897 trace_seq_puts(s
, "ARRAY[");
4898 for (i
= 0; i
< len
; i
++) {
4900 trace_seq_puts(s
, ", ");
4901 trace_seq_printf(s
, "%02x",
4902 *((unsigned char *)data
+ offset
+ i
));
4904 trace_seq_putc(s
, ']');
4905 field
->flags
&= ~TEP_FIELD_IS_STRING
;
4908 val
= tep_read_number(tep
, data
+ field
->offset
,
4910 if (field
->flags
& TEP_FIELD_IS_POINTER
) {
4911 trace_seq_printf(s
, "0x%llx", val
);
4912 } else if (field
->flags
& TEP_FIELD_IS_SIGNED
) {
4913 switch (field
->size
) {
4916 * If field is long then print it in hex.
4917 * A long usually stores pointers.
4919 if (field
->flags
& TEP_FIELD_IS_LONG
)
4920 trace_seq_printf(s
, "0x%x", (int)val
);
4922 trace_seq_printf(s
, "%d", (int)val
);
4925 trace_seq_printf(s
, "%2d", (short)val
);
4928 trace_seq_printf(s
, "%1d", (char)val
);
4931 trace_seq_printf(s
, "%lld", val
);
4934 if (field
->flags
& TEP_FIELD_IS_LONG
)
4935 trace_seq_printf(s
, "0x%llx", val
);
4937 trace_seq_printf(s
, "%llu", val
);
4942 void tep_print_fields(struct trace_seq
*s
, void *data
,
4943 int size __maybe_unused
, struct tep_event
*event
)
4945 struct tep_format_field
*field
;
4947 field
= event
->format
.fields
;
4949 trace_seq_printf(s
, " %s=", field
->name
);
4950 tep_print_field(s
, data
, field
);
4951 field
= field
->next
;
4955 static void pretty_print(struct trace_seq
*s
, void *data
, int size
, struct tep_event
*event
)
4957 struct tep_handle
*tep
= event
->tep
;
4958 struct tep_print_fmt
*print_fmt
= &event
->print_fmt
;
4959 struct tep_print_arg
*arg
= print_fmt
->args
;
4960 struct tep_print_arg
*args
= NULL
;
4961 const char *ptr
= print_fmt
->format
;
4962 unsigned long long val
;
4963 struct func_map
*func
;
4964 const char *saveptr
;
4966 char *bprint_fmt
= NULL
;
4974 if (event
->flags
& TEP_EVENT_FL_FAILED
) {
4975 trace_seq_printf(s
, "[FAILED TO PARSE]");
4976 tep_print_fields(s
, data
, size
, event
);
4980 if (event
->flags
& TEP_EVENT_FL_ISBPRINT
) {
4981 bprint_fmt
= get_bprint_format(data
, size
, event
);
4982 args
= make_bprint_args(bprint_fmt
, data
, size
, event
);
4987 for (; *ptr
; ptr
++) {
4993 trace_seq_putc(s
, '\n');
4996 trace_seq_putc(s
, '\t');
4999 trace_seq_putc(s
, '\r');
5002 trace_seq_putc(s
, '\\');
5005 trace_seq_putc(s
, *ptr
);
5009 } else if (*ptr
== '%') {
5017 trace_seq_putc(s
, '%');
5020 /* FIXME: need to handle properly */
5032 /* The argument is the length. */
5034 do_warning_event(event
, "no argument match");
5035 event
->flags
|= TEP_EVENT_FL_FAILED
;
5038 len_arg
= eval_num_arg(data
, size
, event
, arg
);
5049 if (tep
->long_size
== 4)
5054 if (isalnum(ptr
[1]))
5057 if (arg
->type
== TEP_PRINT_BSTRING
) {
5058 trace_seq_puts(s
, arg
->string
.string
);
5063 if (*ptr
== 'F' || *ptr
== 'f' ||
5064 *ptr
== 'S' || *ptr
== 's') {
5066 } else if (*ptr
== 'M' || *ptr
== 'm') {
5067 print_mac_arg(s
, *ptr
, data
, size
, event
, arg
);
5070 } else if (*ptr
== 'I' || *ptr
== 'i') {
5073 n
= print_ip_arg(s
, ptr
, data
, size
, event
, arg
);
5089 do_warning_event(event
, "no argument match");
5090 event
->flags
|= TEP_EVENT_FL_FAILED
;
5094 len
= ((unsigned long)ptr
+ 1) -
5095 (unsigned long)saveptr
;
5097 /* should never happen */
5099 do_warning_event(event
, "bad format!");
5100 event
->flags
|= TEP_EVENT_FL_FAILED
;
5104 memcpy(format
, saveptr
, len
);
5107 val
= eval_num_arg(data
, size
, event
, arg
);
5111 func
= find_func(tep
, val
);
5113 trace_seq_puts(s
, func
->func
);
5114 if (show_func
== 'F')
5121 if (tep
->long_size
== 8 && ls
== 1 &&
5122 sizeof(long) != 8) {
5125 /* make %l into %ll */
5126 if (ls
== 1 && (p
= strchr(format
, 'l')))
5127 memmove(p
+1, p
, strlen(p
)+1);
5128 else if (strcmp(format
, "%p") == 0)
5129 strcpy(format
, "0x%llx");
5135 trace_seq_printf(s
, format
, len_arg
, (char)val
);
5137 trace_seq_printf(s
, format
, (char)val
);
5141 trace_seq_printf(s
, format
, len_arg
, (short)val
);
5143 trace_seq_printf(s
, format
, (short)val
);
5147 trace_seq_printf(s
, format
, len_arg
, (int)val
);
5149 trace_seq_printf(s
, format
, (int)val
);
5153 trace_seq_printf(s
, format
, len_arg
, (long)val
);
5155 trace_seq_printf(s
, format
, (long)val
);
5159 trace_seq_printf(s
, format
, len_arg
,
5162 trace_seq_printf(s
, format
, (long long)val
);
5165 do_warning_event(event
, "bad count (%d)", ls
);
5166 event
->flags
|= TEP_EVENT_FL_FAILED
;
5171 do_warning_event(event
, "no matching argument");
5172 event
->flags
|= TEP_EVENT_FL_FAILED
;
5176 len
= ((unsigned long)ptr
+ 1) -
5177 (unsigned long)saveptr
;
5179 /* should never happen */
5181 do_warning_event(event
, "bad format!");
5182 event
->flags
|= TEP_EVENT_FL_FAILED
;
5186 memcpy(format
, saveptr
, len
);
5190 /* Use helper trace_seq */
5192 print_str_arg(&p
, data
, size
, event
,
5193 format
, len_arg
, arg
);
5194 trace_seq_terminate(&p
);
5195 trace_seq_puts(s
, p
.buffer
);
5196 trace_seq_destroy(&p
);
5200 trace_seq_printf(s
, ">%c<", *ptr
);
5204 trace_seq_putc(s
, *ptr
);
5207 if (event
->flags
& TEP_EVENT_FL_FAILED
) {
5209 trace_seq_printf(s
, "[FAILED TO PARSE]");
5219 * This parses out the Latency format (interrupts disabled,
5220 * need rescheduling, in hard/soft interrupt, preempt count
5221 * and lock depth) and places it into the trace_seq.
5223 static void data_latency_format(struct tep_handle
*tep
, struct trace_seq
*s
,
5224 char *format
, struct tep_record
*record
)
5226 static int check_lock_depth
= 1;
5227 static int check_migrate_disable
= 1;
5228 static int lock_depth_exists
;
5229 static int migrate_disable_exists
;
5230 unsigned int lat_flags
;
5231 struct trace_seq sq
;
5234 int migrate_disable
= 0;
5237 void *data
= record
->data
;
5239 trace_seq_init(&sq
);
5240 lat_flags
= parse_common_flags(tep
, data
);
5241 pc
= parse_common_pc(tep
, data
);
5242 /* lock_depth may not always exist */
5243 if (lock_depth_exists
)
5244 lock_depth
= parse_common_lock_depth(tep
, data
);
5245 else if (check_lock_depth
) {
5246 lock_depth
= parse_common_lock_depth(tep
, data
);
5248 check_lock_depth
= 0;
5250 lock_depth_exists
= 1;
5253 /* migrate_disable may not always exist */
5254 if (migrate_disable_exists
)
5255 migrate_disable
= parse_common_migrate_disable(tep
, data
);
5256 else if (check_migrate_disable
) {
5257 migrate_disable
= parse_common_migrate_disable(tep
, data
);
5258 if (migrate_disable
< 0)
5259 check_migrate_disable
= 0;
5261 migrate_disable_exists
= 1;
5264 hardirq
= lat_flags
& TRACE_FLAG_HARDIRQ
;
5265 softirq
= lat_flags
& TRACE_FLAG_SOFTIRQ
;
5267 trace_seq_printf(&sq
, "%c%c%c",
5268 (lat_flags
& TRACE_FLAG_IRQS_OFF
) ? 'd' :
5269 (lat_flags
& TRACE_FLAG_IRQS_NOSUPPORT
) ?
5271 (lat_flags
& TRACE_FLAG_NEED_RESCHED
) ?
5273 (hardirq
&& softirq
) ? 'H' :
5274 hardirq
? 'h' : softirq
? 's' : '.');
5277 trace_seq_printf(&sq
, "%x", pc
);
5279 trace_seq_printf(&sq
, ".");
5281 if (migrate_disable_exists
) {
5282 if (migrate_disable
< 0)
5283 trace_seq_printf(&sq
, ".");
5285 trace_seq_printf(&sq
, "%d", migrate_disable
);
5288 if (lock_depth_exists
) {
5290 trace_seq_printf(&sq
, ".");
5292 trace_seq_printf(&sq
, "%d", lock_depth
);
5295 if (sq
.state
== TRACE_SEQ__MEM_ALLOC_FAILED
) {
5296 s
->state
= TRACE_SEQ__MEM_ALLOC_FAILED
;
5300 trace_seq_terminate(&sq
);
5301 trace_seq_puts(s
, sq
.buffer
);
5302 trace_seq_destroy(&sq
);
5303 trace_seq_terminate(s
);
5307 * tep_data_type - parse out the given event type
5308 * @tep: a handle to the trace event parser context
5309 * @rec: the record to read from
5311 * This returns the event id from the @rec.
5313 int tep_data_type(struct tep_handle
*tep
, struct tep_record
*rec
)
5315 return trace_parse_common_type(tep
, rec
->data
);
5319 * tep_data_pid - parse the PID from record
5320 * @tep: a handle to the trace event parser context
5321 * @rec: the record to parse
5323 * This returns the PID from a record.
5325 int tep_data_pid(struct tep_handle
*tep
, struct tep_record
*rec
)
5327 return parse_common_pid(tep
, rec
->data
);
5331 * tep_data_preempt_count - parse the preempt count from the record
5332 * @tep: a handle to the trace event parser context
5333 * @rec: the record to parse
5335 * This returns the preempt count from a record.
5337 int tep_data_preempt_count(struct tep_handle
*tep
, struct tep_record
*rec
)
5339 return parse_common_pc(tep
, rec
->data
);
5343 * tep_data_flags - parse the latency flags from the record
5344 * @tep: a handle to the trace event parser context
5345 * @rec: the record to parse
5347 * This returns the latency flags from a record.
5349 * Use trace_flag_type enum for the flags (see event-parse.h).
5351 int tep_data_flags(struct tep_handle
*tep
, struct tep_record
*rec
)
5353 return parse_common_flags(tep
, rec
->data
);
5357 * tep_data_comm_from_pid - return the command line from PID
5358 * @tep: a handle to the trace event parser context
5359 * @pid: the PID of the task to search for
5361 * This returns a pointer to the command line that has the given
5364 const char *tep_data_comm_from_pid(struct tep_handle
*tep
, int pid
)
5368 comm
= find_cmdline(tep
, pid
);
5372 static struct tep_cmdline
*
5373 pid_from_cmdlist(struct tep_handle
*tep
, const char *comm
, struct tep_cmdline
*next
)
5375 struct cmdline_list
*cmdlist
= (struct cmdline_list
*)next
;
5378 cmdlist
= cmdlist
->next
;
5380 cmdlist
= tep
->cmdlist
;
5382 while (cmdlist
&& strcmp(cmdlist
->comm
, comm
) != 0)
5383 cmdlist
= cmdlist
->next
;
5385 return (struct tep_cmdline
*)cmdlist
;
5389 * tep_data_pid_from_comm - return the pid from a given comm
5390 * @tep: a handle to the trace event parser context
5391 * @comm: the cmdline to find the pid from
5392 * @next: the cmdline structure to find the next comm
5394 * This returns the cmdline structure that holds a pid for a given
5395 * comm, or NULL if none found. As there may be more than one pid for
5396 * a given comm, the result of this call can be passed back into
5397 * a recurring call in the @next parameter, and then it will find the
5399 * Also, it does a linear search, so it may be slow.
5401 struct tep_cmdline
*tep_data_pid_from_comm(struct tep_handle
*tep
, const char *comm
,
5402 struct tep_cmdline
*next
)
5404 struct tep_cmdline
*cmdline
;
5407 * If the cmdlines have not been converted yet, then use
5411 return pid_from_cmdlist(tep
, comm
, next
);
5415 * The next pointer could have been still from
5416 * a previous call before cmdlines were created
5418 if (next
< tep
->cmdlines
||
5419 next
>= tep
->cmdlines
+ tep
->cmdline_count
)
5426 cmdline
= tep
->cmdlines
;
5428 while (cmdline
< tep
->cmdlines
+ tep
->cmdline_count
) {
5429 if (strcmp(cmdline
->comm
, comm
) == 0)
5437 * tep_cmdline_pid - return the pid associated to a given cmdline
5438 * @tep: a handle to the trace event parser context
5439 * @cmdline: The cmdline structure to get the pid from
5441 * Returns the pid for a give cmdline. If @cmdline is NULL, then
5444 int tep_cmdline_pid(struct tep_handle
*tep
, struct tep_cmdline
*cmdline
)
5446 struct cmdline_list
*cmdlist
= (struct cmdline_list
*)cmdline
;
5452 * If cmdlines have not been created yet, or cmdline is
5453 * not part of the array, then treat it as a cmdlist instead.
5455 if (!tep
->cmdlines
||
5456 cmdline
< tep
->cmdlines
||
5457 cmdline
>= tep
->cmdlines
+ tep
->cmdline_count
)
5458 return cmdlist
->pid
;
5460 return cmdline
->pid
;
5464 * This parses the raw @data using the given @event information and
5465 * writes the print format into the trace_seq.
5467 static void print_event_info(struct trace_seq
*s
, char *format
, bool raw
,
5468 struct tep_event
*event
, struct tep_record
*record
)
5470 int print_pretty
= 1;
5472 if (raw
|| (event
->flags
& TEP_EVENT_FL_PRINTRAW
))
5473 tep_print_fields(s
, record
->data
, record
->size
, event
);
5476 if (event
->handler
&& !(event
->flags
& TEP_EVENT_FL_NOHANDLE
))
5477 print_pretty
= event
->handler(s
, record
, event
,
5481 pretty_print(s
, record
->data
, record
->size
, event
);
5484 trace_seq_terminate(s
);
5488 * tep_find_event_by_record - return the event from a given record
5489 * @tep: a handle to the trace event parser context
5490 * @record: The record to get the event from
5492 * Returns the associated event for a given record, or NULL if non is
5496 tep_find_event_by_record(struct tep_handle
*tep
, struct tep_record
*record
)
5500 if (record
->size
< 0) {
5501 do_warning("ug! negative record size %d", record
->size
);
5505 type
= trace_parse_common_type(tep
, record
->data
);
5507 return tep_find_event(tep
, type
);
5511 * Writes the timestamp of the record into @s. Time divisor and precision can be
5512 * specified as part of printf @format string. Example:
5513 * "%3.1000d" - divide the time by 1000 and print the first 3 digits
5514 * before the dot. Thus, the timestamp "123456000" will be printed as
5517 static void print_event_time(struct tep_handle
*tep
, struct trace_seq
*s
,
5518 char *format
, struct tep_event
*event
,
5519 struct tep_record
*record
)
5521 unsigned long long time
;
5527 if (isdigit(*(format
+ 1)))
5528 prec
= atoi(format
+ 1);
5529 divstr
= strchr(format
, '.');
5530 if (divstr
&& isdigit(*(divstr
+ 1)))
5531 div
= atoi(divstr
+ 1);
5541 if (p10
> 1 && p10
< time
)
5542 trace_seq_printf(s
, "%5llu.%0*llu", time
/ p10
, prec
, time
% p10
);
5544 trace_seq_printf(s
, "%12llu", time
);
5547 struct print_event_type
{
5556 static void print_string(struct tep_handle
*tep
, struct trace_seq
*s
,
5557 struct tep_record
*record
, struct tep_event
*event
,
5558 const char *arg
, struct print_event_type
*type
)
5563 if (strncmp(arg
, TEP_PRINT_LATENCY
, strlen(TEP_PRINT_LATENCY
)) == 0) {
5564 data_latency_format(tep
, s
, type
->format
, record
);
5565 } else if (strncmp(arg
, TEP_PRINT_COMM
, strlen(TEP_PRINT_COMM
)) == 0) {
5566 pid
= parse_common_pid(tep
, record
->data
);
5567 comm
= find_cmdline(tep
, pid
);
5568 trace_seq_printf(s
, type
->format
, comm
);
5569 } else if (strncmp(arg
, TEP_PRINT_INFO_RAW
, strlen(TEP_PRINT_INFO_RAW
)) == 0) {
5570 print_event_info(s
, type
->format
, true, event
, record
);
5571 } else if (strncmp(arg
, TEP_PRINT_INFO
, strlen(TEP_PRINT_INFO
)) == 0) {
5572 print_event_info(s
, type
->format
, false, event
, record
);
5573 } else if (strncmp(arg
, TEP_PRINT_NAME
, strlen(TEP_PRINT_NAME
)) == 0) {
5574 trace_seq_printf(s
, type
->format
, event
->name
);
5576 trace_seq_printf(s
, "[UNKNOWN TEP TYPE %s]", arg
);
5581 static void print_int(struct tep_handle
*tep
, struct trace_seq
*s
,
5582 struct tep_record
*record
, struct tep_event
*event
,
5583 int arg
, struct print_event_type
*type
)
5589 param
= record
->cpu
;
5592 param
= parse_common_pid(tep
, record
->data
);
5594 case TEP_PRINT_TIME
:
5595 return print_event_time(tep
, s
, type
->format
, event
, record
);
5599 trace_seq_printf(s
, type
->format
, param
);
5602 static int tep_print_event_param_type(char *format
,
5603 struct print_event_type
*type
)
5605 char *str
= format
+ 1;
5608 type
->type
= EVENT_TYPE_UNKNOWN
;
5617 type
->type
= EVENT_TYPE_INT
;
5620 type
->type
= EVENT_TYPE_STRING
;
5625 if (type
->type
!= EVENT_TYPE_UNKNOWN
)
5628 memset(type
->format
, 0, 32);
5629 memcpy(type
->format
, format
, i
< 32 ? i
: 31);
5634 * tep_print_event - Write various event information
5635 * @tep: a handle to the trace event parser context
5636 * @s: the trace_seq to write to
5637 * @record: The record to get the event from
5638 * @format: a printf format string. Supported event fileds:
5639 * TEP_PRINT_PID, "%d" - event PID
5640 * TEP_PRINT_CPU, "%d" - event CPU
5641 * TEP_PRINT_COMM, "%s" - event command string
5642 * TEP_PRINT_NAME, "%s" - event name
5643 * TEP_PRINT_LATENCY, "%s" - event latency
5644 * TEP_PRINT_TIME, %d - event time stamp. A divisor and precision
5645 * can be specified as part of this format string:
5646 * "%precision.divisord". Example:
5647 * "%3.1000d" - divide the time by 1000 and print the first
5648 * 3 digits before the dot. Thus, the time stamp
5649 * "123456000" will be printed as "123.456"
5650 * TEP_PRINT_INFO, "%s" - event information. If any width is specified in
5651 * the format string, the event information will be printed
5653 * Writes the specified event information into @s.
5655 void tep_print_event(struct tep_handle
*tep
, struct trace_seq
*s
,
5656 struct tep_record
*record
, const char *fmt
, ...)
5658 struct print_event_type type
;
5659 char *format
= strdup(fmt
);
5660 char *current
= format
;
5664 struct tep_event
*event
;
5669 event
= tep_find_event_by_record(tep
, record
);
5670 va_start(args
, fmt
);
5672 current
= strchr(str
, '%');
5674 trace_seq_puts(s
, str
);
5677 memset(&type
, 0, sizeof(type
));
5678 offset
= tep_print_event_param_type(current
, &type
);
5680 trace_seq_puts(s
, str
);
5682 switch (type
.type
) {
5683 case EVENT_TYPE_STRING
:
5684 print_string(tep
, s
, record
, event
,
5685 va_arg(args
, char*), &type
);
5687 case EVENT_TYPE_INT
:
5688 print_int(tep
, s
, record
, event
,
5689 va_arg(args
, int), &type
);
5691 case EVENT_TYPE_UNKNOWN
:
5693 trace_seq_printf(s
, "[UNKNOWN TYPE]");
5703 static int events_id_cmp(const void *a
, const void *b
)
5705 struct tep_event
* const * ea
= a
;
5706 struct tep_event
* const * eb
= b
;
5708 if ((*ea
)->id
< (*eb
)->id
)
5711 if ((*ea
)->id
> (*eb
)->id
)
5717 static int events_name_cmp(const void *a
, const void *b
)
5719 struct tep_event
* const * ea
= a
;
5720 struct tep_event
* const * eb
= b
;
5723 res
= strcmp((*ea
)->name
, (*eb
)->name
);
5727 res
= strcmp((*ea
)->system
, (*eb
)->system
);
5731 return events_id_cmp(a
, b
);
5734 static int events_system_cmp(const void *a
, const void *b
)
5736 struct tep_event
* const * ea
= a
;
5737 struct tep_event
* const * eb
= b
;
5740 res
= strcmp((*ea
)->system
, (*eb
)->system
);
5744 res
= strcmp((*ea
)->name
, (*eb
)->name
);
5748 return events_id_cmp(a
, b
);
5751 static struct tep_event
**list_events_copy(struct tep_handle
*tep
)
5753 struct tep_event
**events
;
5758 events
= malloc(sizeof(*events
) * (tep
->nr_events
+ 1));
5762 memcpy(events
, tep
->events
, sizeof(*events
) * tep
->nr_events
);
5763 events
[tep
->nr_events
] = NULL
;
5767 static void list_events_sort(struct tep_event
**events
, int nr_events
,
5768 enum tep_event_sort_type sort_type
)
5770 int (*sort
)(const void *a
, const void *b
);
5772 switch (sort_type
) {
5773 case TEP_EVENT_SORT_ID
:
5774 sort
= events_id_cmp
;
5776 case TEP_EVENT_SORT_NAME
:
5777 sort
= events_name_cmp
;
5779 case TEP_EVENT_SORT_SYSTEM
:
5780 sort
= events_system_cmp
;
5787 qsort(events
, nr_events
, sizeof(*events
), sort
);
5791 * tep_list_events - Get events, sorted by given criteria.
5792 * @tep: a handle to the tep context
5793 * @sort_type: desired sort order of the events in the array
5795 * Returns an array of pointers to all events, sorted by the given
5796 * @sort_type criteria. The last element of the array is NULL. The returned
5797 * memory must not be freed, it is managed by the library.
5798 * The function is not thread safe.
5800 struct tep_event
**tep_list_events(struct tep_handle
*tep
,
5801 enum tep_event_sort_type sort_type
)
5803 struct tep_event
**events
;
5808 events
= tep
->sort_events
;
5809 if (events
&& tep
->last_type
== sort_type
)
5813 events
= list_events_copy(tep
);
5817 tep
->sort_events
= events
;
5819 /* the internal events are sorted by id */
5820 if (sort_type
== TEP_EVENT_SORT_ID
) {
5821 tep
->last_type
= sort_type
;
5826 list_events_sort(events
, tep
->nr_events
, sort_type
);
5827 tep
->last_type
= sort_type
;
5834 * tep_list_events_copy - Thread safe version of tep_list_events()
5835 * @tep: a handle to the tep context
5836 * @sort_type: desired sort order of the events in the array
5838 * Returns an array of pointers to all events, sorted by the given
5839 * @sort_type criteria. The last element of the array is NULL. The returned
5840 * array is newly allocated inside the function and must be freed by the caller
5842 struct tep_event
**tep_list_events_copy(struct tep_handle
*tep
,
5843 enum tep_event_sort_type sort_type
)
5845 struct tep_event
**events
;
5850 events
= list_events_copy(tep
);
5854 /* the internal events are sorted by id */
5855 if (sort_type
== TEP_EVENT_SORT_ID
)
5858 list_events_sort(events
, tep
->nr_events
, sort_type
);
5863 static struct tep_format_field
**
5864 get_event_fields(const char *type
, const char *name
,
5865 int count
, struct tep_format_field
*list
)
5867 struct tep_format_field
**fields
;
5868 struct tep_format_field
*field
;
5871 fields
= malloc(sizeof(*fields
) * (count
+ 1));
5875 for (field
= list
; field
; field
= field
->next
) {
5876 fields
[i
++] = field
;
5877 if (i
== count
+ 1) {
5878 do_warning("event %s has more %s fields than specified",
5886 do_warning("event %s has less %s fields than specified",
5895 * tep_event_common_fields - return a list of common fields for an event
5896 * @event: the event to return the common fields of.
5898 * Returns an allocated array of fields. The last item in the array is NULL.
5899 * The array must be freed with free().
5901 struct tep_format_field
**tep_event_common_fields(struct tep_event
*event
)
5903 return get_event_fields("common", event
->name
,
5904 event
->format
.nr_common
,
5905 event
->format
.common_fields
);
5909 * tep_event_fields - return a list of event specific fields for an event
5910 * @event: the event to return the fields of.
5912 * Returns an allocated array of fields. The last item in the array is NULL.
5913 * The array must be freed with free().
5915 struct tep_format_field
**tep_event_fields(struct tep_event
*event
)
5917 return get_event_fields("event", event
->name
,
5918 event
->format
.nr_fields
,
5919 event
->format
.fields
);
5922 static void print_fields(struct trace_seq
*s
, struct tep_print_flag_sym
*field
)
5924 trace_seq_printf(s
, "{ %s, %s }", field
->value
, field
->str
);
5926 trace_seq_puts(s
, ", ");
5927 print_fields(s
, field
->next
);
5932 static void print_args(struct tep_print_arg
*args
)
5934 int print_paren
= 1;
5937 switch (args
->type
) {
5938 case TEP_PRINT_NULL
:
5941 case TEP_PRINT_ATOM
:
5942 printf("%s", args
->atom
.atom
);
5944 case TEP_PRINT_FIELD
:
5945 printf("REC->%s", args
->field
.name
);
5947 case TEP_PRINT_FLAGS
:
5948 printf("__print_flags(");
5949 print_args(args
->flags
.field
);
5950 printf(", %s, ", args
->flags
.delim
);
5952 print_fields(&s
, args
->flags
.flags
);
5953 trace_seq_do_printf(&s
);
5954 trace_seq_destroy(&s
);
5957 case TEP_PRINT_SYMBOL
:
5958 printf("__print_symbolic(");
5959 print_args(args
->symbol
.field
);
5962 print_fields(&s
, args
->symbol
.symbols
);
5963 trace_seq_do_printf(&s
);
5964 trace_seq_destroy(&s
);
5968 printf("__print_hex(");
5969 print_args(args
->hex
.field
);
5971 print_args(args
->hex
.size
);
5974 case TEP_PRINT_HEX_STR
:
5975 printf("__print_hex_str(");
5976 print_args(args
->hex
.field
);
5978 print_args(args
->hex
.size
);
5981 case TEP_PRINT_INT_ARRAY
:
5982 printf("__print_array(");
5983 print_args(args
->int_array
.field
);
5985 print_args(args
->int_array
.count
);
5987 print_args(args
->int_array
.el_size
);
5990 case TEP_PRINT_STRING
:
5991 case TEP_PRINT_BSTRING
:
5992 printf("__get_str(%s)", args
->string
.string
);
5994 case TEP_PRINT_BITMASK
:
5995 printf("__get_bitmask(%s)", args
->bitmask
.bitmask
);
5997 case TEP_PRINT_TYPE
:
5998 printf("(%s)", args
->typecast
.type
);
5999 print_args(args
->typecast
.item
);
6002 if (strcmp(args
->op
.op
, ":") == 0)
6006 print_args(args
->op
.left
);
6007 printf(" %s ", args
->op
.op
);
6008 print_args(args
->op
.right
);
6013 /* we should warn... */
6018 print_args(args
->next
);
6022 static void parse_header_field(const char *field
,
6023 int *offset
, int *size
, int mandatory
)
6025 unsigned long long save_input_buf_ptr
;
6026 unsigned long long save_input_buf_siz
;
6030 save_input_buf_ptr
= input_buf_ptr
;
6031 save_input_buf_siz
= input_buf_siz
;
6033 if (read_expected(TEP_EVENT_ITEM
, "field") < 0)
6035 if (read_expected(TEP_EVENT_OP
, ":") < 0)
6039 if (read_expect_type(TEP_EVENT_ITEM
, &token
) < 0)
6044 * If this is not a mandatory field, then test it first.
6047 if (read_expected(TEP_EVENT_ITEM
, field
) < 0)
6050 if (read_expect_type(TEP_EVENT_ITEM
, &token
) < 0)
6052 if (strcmp(token
, field
) != 0)
6057 if (read_expected(TEP_EVENT_OP
, ";") < 0)
6059 if (read_expected(TEP_EVENT_ITEM
, "offset") < 0)
6061 if (read_expected(TEP_EVENT_OP
, ":") < 0)
6063 if (read_expect_type(TEP_EVENT_ITEM
, &token
) < 0)
6065 *offset
= atoi(token
);
6067 if (read_expected(TEP_EVENT_OP
, ";") < 0)
6069 if (read_expected(TEP_EVENT_ITEM
, "size") < 0)
6071 if (read_expected(TEP_EVENT_OP
, ":") < 0)
6073 if (read_expect_type(TEP_EVENT_ITEM
, &token
) < 0)
6075 *size
= atoi(token
);
6077 if (read_expected(TEP_EVENT_OP
, ";") < 0)
6079 type
= read_token(&token
);
6080 if (type
!= TEP_EVENT_NEWLINE
) {
6081 /* newer versions of the kernel have a "signed" type */
6082 if (type
!= TEP_EVENT_ITEM
)
6085 if (strcmp(token
, "signed") != 0)
6090 if (read_expected(TEP_EVENT_OP
, ":") < 0)
6093 if (read_expect_type(TEP_EVENT_ITEM
, &token
))
6097 if (read_expected(TEP_EVENT_OP
, ";") < 0)
6100 if (read_expect_type(TEP_EVENT_NEWLINE
, &token
))
6108 input_buf_ptr
= save_input_buf_ptr
;
6109 input_buf_siz
= save_input_buf_siz
;
6116 * tep_parse_header_page - parse the data stored in the header page
6117 * @tep: a handle to the trace event parser context
6118 * @buf: the buffer storing the header page format string
6119 * @size: the size of @buf
6120 * @long_size: the long size to use if there is no header
6122 * This parses the header page format for information on the
6123 * ring buffer used. The @buf should be copied from
6125 * /sys/kernel/debug/tracing/events/header_page
6127 int tep_parse_header_page(struct tep_handle
*tep
, char *buf
, unsigned long size
,
6134 * Old kernels did not have header page info.
6135 * Sorry but we just use what we find here in user space.
6137 tep
->header_page_ts_size
= sizeof(long long);
6138 tep
->header_page_size_size
= long_size
;
6139 tep
->header_page_data_offset
= sizeof(long long) + long_size
;
6140 tep
->old_format
= 1;
6143 init_input_buf(buf
, size
);
6145 parse_header_field("timestamp", &tep
->header_page_ts_offset
,
6146 &tep
->header_page_ts_size
, 1);
6147 parse_header_field("commit", &tep
->header_page_size_offset
,
6148 &tep
->header_page_size_size
, 1);
6149 parse_header_field("overwrite", &tep
->header_page_overwrite
,
6151 parse_header_field("data", &tep
->header_page_data_offset
,
6152 &tep
->header_page_data_size
, 1);
6157 static int event_matches(struct tep_event
*event
,
6158 int id
, const char *sys_name
,
6159 const char *event_name
)
6161 if (id
>= 0 && id
!= event
->id
)
6164 if (event_name
&& (strcmp(event_name
, event
->name
) != 0))
6167 if (sys_name
&& (strcmp(sys_name
, event
->system
) != 0))
6173 static void free_handler(struct event_handler
*handle
)
6175 free((void *)handle
->sys_name
);
6176 free((void *)handle
->event_name
);
6180 static int find_event_handle(struct tep_handle
*tep
, struct tep_event
*event
)
6182 struct event_handler
*handle
, **next
;
6184 for (next
= &tep
->handlers
; *next
;
6185 next
= &(*next
)->next
) {
6187 if (event_matches(event
, handle
->id
,
6189 handle
->event_name
))
6196 pr_stat("overriding event (%d) %s:%s with new print handler",
6197 event
->id
, event
->system
, event
->name
);
6199 event
->handler
= handle
->func
;
6200 event
->context
= handle
->context
;
6202 *next
= handle
->next
;
6203 free_handler(handle
);
6209 * __tep_parse_format - parse the event format
6210 * @buf: the buffer storing the event format string
6211 * @size: the size of @buf
6212 * @sys: the system the event belongs to
6214 * This parses the event format and creates an event structure
6215 * to quickly parse raw data for a given event.
6217 * These files currently come from:
6219 * /sys/kernel/debug/tracing/events/.../.../format
6221 enum tep_errno
__tep_parse_format(struct tep_event
**eventp
,
6222 struct tep_handle
*tep
, const char *buf
,
6223 unsigned long size
, const char *sys
)
6225 struct tep_event
*event
;
6228 init_input_buf(buf
, size
);
6230 *eventp
= event
= alloc_event();
6232 return TEP_ERRNO__MEM_ALLOC_FAILED
;
6234 event
->name
= event_read_name();
6237 ret
= TEP_ERRNO__MEM_ALLOC_FAILED
;
6238 goto event_alloc_failed
;
6241 if (strcmp(sys
, "ftrace") == 0) {
6242 event
->flags
|= TEP_EVENT_FL_ISFTRACE
;
6244 if (strcmp(event
->name
, "bprint") == 0)
6245 event
->flags
|= TEP_EVENT_FL_ISBPRINT
;
6248 event
->id
= event_read_id();
6249 if (event
->id
< 0) {
6250 ret
= TEP_ERRNO__READ_ID_FAILED
;
6252 * This isn't an allocation error actually.
6253 * But as the ID is critical, just bail out.
6255 goto event_alloc_failed
;
6258 event
->system
= strdup(sys
);
6259 if (!event
->system
) {
6260 ret
= TEP_ERRNO__MEM_ALLOC_FAILED
;
6261 goto event_alloc_failed
;
6264 /* Add tep to event so that it can be referenced */
6267 ret
= event_read_format(event
);
6269 ret
= TEP_ERRNO__READ_FORMAT_FAILED
;
6270 goto event_parse_failed
;
6274 * If the event has an override, don't print warnings if the event
6275 * print format fails to parse.
6277 if (tep
&& find_event_handle(tep
, event
))
6280 ret
= event_read_print(event
);
6284 ret
= TEP_ERRNO__READ_PRINT_FAILED
;
6285 goto event_parse_failed
;
6288 if (!ret
&& (event
->flags
& TEP_EVENT_FL_ISFTRACE
)) {
6289 struct tep_format_field
*field
;
6290 struct tep_print_arg
*arg
, **list
;
6292 /* old ftrace had no args */
6293 list
= &event
->print_fmt
.args
;
6294 for (field
= event
->format
.fields
; field
; field
= field
->next
) {
6297 event
->flags
|= TEP_EVENT_FL_FAILED
;
6298 return TEP_ERRNO__OLD_FTRACE_ARG_FAILED
;
6300 arg
->type
= TEP_PRINT_FIELD
;
6301 arg
->field
.name
= strdup(field
->name
);
6302 if (!arg
->field
.name
) {
6303 event
->flags
|= TEP_EVENT_FL_FAILED
;
6305 return TEP_ERRNO__OLD_FTRACE_ARG_FAILED
;
6307 arg
->field
.field
= field
;
6317 event
->flags
|= TEP_EVENT_FL_FAILED
;
6321 free(event
->system
);
6328 static enum tep_errno
6329 __parse_event(struct tep_handle
*tep
,
6330 struct tep_event
**eventp
,
6331 const char *buf
, unsigned long size
,
6334 int ret
= __tep_parse_format(eventp
, tep
, buf
, size
, sys
);
6335 struct tep_event
*event
= *eventp
;
6340 if (tep
&& add_event(tep
, event
)) {
6341 ret
= TEP_ERRNO__MEM_ALLOC_FAILED
;
6342 goto event_add_failed
;
6345 #define PRINT_ARGS 0
6346 if (PRINT_ARGS
&& event
->print_fmt
.args
)
6347 print_args(event
->print_fmt
.args
);
6352 tep_free_event(event
);
6357 * tep_parse_format - parse the event format
6358 * @tep: a handle to the trace event parser context
6359 * @eventp: returned format
6360 * @buf: the buffer storing the event format string
6361 * @size: the size of @buf
6362 * @sys: the system the event belongs to
6364 * This parses the event format and creates an event structure
6365 * to quickly parse raw data for a given event.
6367 * These files currently come from:
6369 * /sys/kernel/debug/tracing/events/.../.../format
6371 enum tep_errno
tep_parse_format(struct tep_handle
*tep
,
6372 struct tep_event
**eventp
,
6374 unsigned long size
, const char *sys
)
6376 return __parse_event(tep
, eventp
, buf
, size
, sys
);
6380 * tep_parse_event - parse the event format
6381 * @tep: a handle to the trace event parser context
6382 * @buf: the buffer storing the event format string
6383 * @size: the size of @buf
6384 * @sys: the system the event belongs to
6386 * This parses the event format and creates an event structure
6387 * to quickly parse raw data for a given event.
6389 * These files currently come from:
6391 * /sys/kernel/debug/tracing/events/.../.../format
6393 enum tep_errno
tep_parse_event(struct tep_handle
*tep
, const char *buf
,
6394 unsigned long size
, const char *sys
)
6396 struct tep_event
*event
= NULL
;
6397 return __parse_event(tep
, &event
, buf
, size
, sys
);
6400 int get_field_val(struct trace_seq
*s
, struct tep_format_field
*field
,
6401 const char *name
, struct tep_record
*record
,
6402 unsigned long long *val
, int err
)
6406 trace_seq_printf(s
, "<CANT FIND FIELD %s>", name
);
6410 if (tep_read_number_field(field
, record
->data
, val
)) {
6412 trace_seq_printf(s
, " %s=INVALID", name
);
6420 * tep_get_field_raw - return the raw pointer into the data field
6421 * @s: The seq to print to on error
6422 * @event: the event that the field is for
6423 * @name: The name of the field
6424 * @record: The record with the field name.
6425 * @len: place to store the field length.
6426 * @err: print default error if failed.
6428 * Returns a pointer into record->data of the field and places
6429 * the length of the field in @len.
6431 * On failure, it returns NULL.
6433 void *tep_get_field_raw(struct trace_seq
*s
, struct tep_event
*event
,
6434 const char *name
, struct tep_record
*record
,
6437 struct tep_format_field
*field
;
6438 void *data
= record
->data
;
6445 field
= tep_find_field(event
, name
);
6449 trace_seq_printf(s
, "<CANT FIND FIELD %s>", name
);
6453 /* Allow @len to be NULL */
6457 offset
= field
->offset
;
6458 if (field
->flags
& TEP_FIELD_IS_DYNAMIC
) {
6459 offset
= tep_read_number(event
->tep
,
6460 data
+ offset
, field
->size
);
6461 *len
= offset
>> 16;
6466 return data
+ offset
;
6470 * tep_get_field_val - find a field and return its value
6471 * @s: The seq to print to on error
6472 * @event: the event that the field is for
6473 * @name: The name of the field
6474 * @record: The record with the field name.
6475 * @val: place to store the value of the field.
6476 * @err: print default error if failed.
6478 * Returns 0 on success -1 on field not found.
6480 int tep_get_field_val(struct trace_seq
*s
, struct tep_event
*event
,
6481 const char *name
, struct tep_record
*record
,
6482 unsigned long long *val
, int err
)
6484 struct tep_format_field
*field
;
6489 field
= tep_find_field(event
, name
);
6491 return get_field_val(s
, field
, name
, record
, val
, err
);
6495 * tep_get_common_field_val - find a common field and return its value
6496 * @s: The seq to print to on error
6497 * @event: the event that the field is for
6498 * @name: The name of the field
6499 * @record: The record with the field name.
6500 * @val: place to store the value of the field.
6501 * @err: print default error if failed.
6503 * Returns 0 on success -1 on field not found.
6505 int tep_get_common_field_val(struct trace_seq
*s
, struct tep_event
*event
,
6506 const char *name
, struct tep_record
*record
,
6507 unsigned long long *val
, int err
)
6509 struct tep_format_field
*field
;
6514 field
= tep_find_common_field(event
, name
);
6516 return get_field_val(s
, field
, name
, record
, val
, err
);
6520 * tep_get_any_field_val - find a any field and return its value
6521 * @s: The seq to print to on error
6522 * @event: the event that the field is for
6523 * @name: The name of the field
6524 * @record: The record with the field name.
6525 * @val: place to store the value of the field.
6526 * @err: print default error if failed.
6528 * Returns 0 on success -1 on field not found.
6530 int tep_get_any_field_val(struct trace_seq
*s
, struct tep_event
*event
,
6531 const char *name
, struct tep_record
*record
,
6532 unsigned long long *val
, int err
)
6534 struct tep_format_field
*field
;
6539 field
= tep_find_any_field(event
, name
);
6541 return get_field_val(s
, field
, name
, record
, val
, err
);
6545 * tep_print_num_field - print a field and a format
6546 * @s: The seq to print to
6547 * @fmt: The printf format to print the field with.
6548 * @event: the event that the field is for
6549 * @name: The name of the field
6550 * @record: The record with the field name.
6551 * @err: print default error if failed.
6553 * Returns positive value on success, negative in case of an error,
6554 * or 0 if buffer is full.
6556 int tep_print_num_field(struct trace_seq
*s
, const char *fmt
,
6557 struct tep_event
*event
, const char *name
,
6558 struct tep_record
*record
, int err
)
6560 struct tep_format_field
*field
= tep_find_field(event
, name
);
6561 unsigned long long val
;
6566 if (tep_read_number_field(field
, record
->data
, &val
))
6569 return trace_seq_printf(s
, fmt
, val
);
6573 trace_seq_printf(s
, "CAN'T FIND FIELD \"%s\"", name
);
6578 * tep_print_func_field - print a field and a format for function pointers
6579 * @s: The seq to print to
6580 * @fmt: The printf format to print the field with.
6581 * @event: the event that the field is for
6582 * @name: The name of the field
6583 * @record: The record with the field name.
6584 * @err: print default error if failed.
6586 * Returns positive value on success, negative in case of an error,
6587 * or 0 if buffer is full.
6589 int tep_print_func_field(struct trace_seq
*s
, const char *fmt
,
6590 struct tep_event
*event
, const char *name
,
6591 struct tep_record
*record
, int err
)
6593 struct tep_format_field
*field
= tep_find_field(event
, name
);
6594 struct tep_handle
*tep
= event
->tep
;
6595 unsigned long long val
;
6596 struct func_map
*func
;
6602 if (tep_read_number_field(field
, record
->data
, &val
))
6605 func
= find_func(tep
, val
);
6608 snprintf(tmp
, 128, "%s/0x%llx", func
->func
, func
->addr
- val
);
6610 sprintf(tmp
, "0x%08llx", val
);
6612 return trace_seq_printf(s
, fmt
, tmp
);
6616 trace_seq_printf(s
, "CAN'T FIND FIELD \"%s\"", name
);
6620 static void free_func_handle(struct tep_function_handler
*func
)
6622 struct func_params
*params
;
6626 while (func
->params
) {
6627 params
= func
->params
;
6628 func
->params
= params
->next
;
6636 * tep_register_print_function - register a helper function
6637 * @tep: a handle to the trace event parser context
6638 * @func: the function to process the helper function
6639 * @ret_type: the return type of the helper function
6640 * @name: the name of the helper function
6641 * @parameters: A list of enum tep_func_arg_type
6643 * Some events may have helper functions in the print format arguments.
6644 * This allows a plugin to dynamically create a way to process one
6645 * of these functions.
6647 * The @parameters is a variable list of tep_func_arg_type enums that
6648 * must end with TEP_FUNC_ARG_VOID.
6650 int tep_register_print_function(struct tep_handle
*tep
,
6651 tep_func_handler func
,
6652 enum tep_func_arg_type ret_type
,
6655 struct tep_function_handler
*func_handle
;
6656 struct func_params
**next_param
;
6657 struct func_params
*param
;
6658 enum tep_func_arg_type type
;
6662 func_handle
= find_func_handler(tep
, name
);
6665 * This is most like caused by the users own
6666 * plugins updating the function. This overrides the
6669 pr_stat("override of function helper '%s'", name
);
6670 remove_func_handler(tep
, name
);
6673 func_handle
= calloc(1, sizeof(*func_handle
));
6675 do_warning("Failed to allocate function handler");
6676 return TEP_ERRNO__MEM_ALLOC_FAILED
;
6679 func_handle
->ret_type
= ret_type
;
6680 func_handle
->name
= strdup(name
);
6681 func_handle
->func
= func
;
6682 if (!func_handle
->name
) {
6683 do_warning("Failed to allocate function name");
6685 return TEP_ERRNO__MEM_ALLOC_FAILED
;
6688 next_param
= &(func_handle
->params
);
6691 type
= va_arg(ap
, enum tep_func_arg_type
);
6692 if (type
== TEP_FUNC_ARG_VOID
)
6695 if (type
>= TEP_FUNC_ARG_MAX_TYPES
) {
6696 do_warning("Invalid argument type %d", type
);
6697 ret
= TEP_ERRNO__INVALID_ARG_TYPE
;
6701 param
= malloc(sizeof(*param
));
6703 do_warning("Failed to allocate function param");
6704 ret
= TEP_ERRNO__MEM_ALLOC_FAILED
;
6710 *next_param
= param
;
6711 next_param
= &(param
->next
);
6713 func_handle
->nr_args
++;
6717 func_handle
->next
= tep
->func_handlers
;
6718 tep
->func_handlers
= func_handle
;
6723 free_func_handle(func_handle
);
6728 * tep_unregister_print_function - unregister a helper function
6729 * @tep: a handle to the trace event parser context
6730 * @func: the function to process the helper function
6731 * @name: the name of the helper function
6733 * This function removes existing print handler for function @name.
6735 * Returns 0 if the handler was removed successully, -1 otherwise.
6737 int tep_unregister_print_function(struct tep_handle
*tep
,
6738 tep_func_handler func
, char *name
)
6740 struct tep_function_handler
*func_handle
;
6742 func_handle
= find_func_handler(tep
, name
);
6743 if (func_handle
&& func_handle
->func
== func
) {
6744 remove_func_handler(tep
, name
);
6750 static struct tep_event
*search_event(struct tep_handle
*tep
, int id
,
6751 const char *sys_name
,
6752 const char *event_name
)
6754 struct tep_event
*event
;
6758 event
= tep_find_event(tep
, id
);
6761 if (event_name
&& (strcmp(event_name
, event
->name
) != 0))
6763 if (sys_name
&& (strcmp(sys_name
, event
->system
) != 0))
6766 event
= tep_find_event_by_name(tep
, sys_name
, event_name
);
6774 * tep_register_event_handler - register a way to parse an event
6775 * @tep: a handle to the trace event parser context
6776 * @id: the id of the event to register
6777 * @sys_name: the system name the event belongs to
6778 * @event_name: the name of the event
6779 * @func: the function to call to parse the event information
6780 * @context: the data to be passed to @func
6782 * This function allows a developer to override the parsing of
6783 * a given event. If for some reason the default print format
6784 * is not sufficient, this function will register a function
6785 * for an event to be used to parse the data instead.
6787 * If @id is >= 0, then it is used to find the event.
6788 * else @sys_name and @event_name are used.
6791 * TEP_REGISTER_SUCCESS_OVERWRITE if an existing handler is overwritten
6792 * TEP_REGISTER_SUCCESS if a new handler is registered successfully
6793 * negative TEP_ERRNO_... in case of an error
6796 int tep_register_event_handler(struct tep_handle
*tep
, int id
,
6797 const char *sys_name
, const char *event_name
,
6798 tep_event_handler_func func
, void *context
)
6800 struct tep_event
*event
;
6801 struct event_handler
*handle
;
6803 event
= search_event(tep
, id
, sys_name
, event_name
);
6807 pr_stat("overriding event (%d) %s:%s with new print handler",
6808 event
->id
, event
->system
, event
->name
);
6810 event
->handler
= func
;
6811 event
->context
= context
;
6812 return TEP_REGISTER_SUCCESS_OVERWRITE
;
6815 /* Save for later use. */
6816 handle
= calloc(1, sizeof(*handle
));
6818 do_warning("Failed to allocate event handler");
6819 return TEP_ERRNO__MEM_ALLOC_FAILED
;
6824 handle
->event_name
= strdup(event_name
);
6826 handle
->sys_name
= strdup(sys_name
);
6828 if ((event_name
&& !handle
->event_name
) ||
6829 (sys_name
&& !handle
->sys_name
)) {
6830 do_warning("Failed to allocate event/sys name");
6831 free((void *)handle
->event_name
);
6832 free((void *)handle
->sys_name
);
6834 return TEP_ERRNO__MEM_ALLOC_FAILED
;
6837 handle
->func
= func
;
6838 handle
->next
= tep
->handlers
;
6839 tep
->handlers
= handle
;
6840 handle
->context
= context
;
6842 return TEP_REGISTER_SUCCESS
;
6845 static int handle_matches(struct event_handler
*handler
, int id
,
6846 const char *sys_name
, const char *event_name
,
6847 tep_event_handler_func func
, void *context
)
6849 if (id
>= 0 && id
!= handler
->id
)
6852 if (event_name
&& (strcmp(event_name
, handler
->event_name
) != 0))
6855 if (sys_name
&& (strcmp(sys_name
, handler
->sys_name
) != 0))
6858 if (func
!= handler
->func
|| context
!= handler
->context
)
6865 * tep_unregister_event_handler - unregister an existing event handler
6866 * @tep: a handle to the trace event parser context
6867 * @id: the id of the event to unregister
6868 * @sys_name: the system name the handler belongs to
6869 * @event_name: the name of the event handler
6870 * @func: the function to call to parse the event information
6871 * @context: the data to be passed to @func
6873 * This function removes existing event handler (parser).
6875 * If @id is >= 0, then it is used to find the event.
6876 * else @sys_name and @event_name are used.
6878 * Returns 0 if handler was removed successfully, -1 if event was not found.
6880 int tep_unregister_event_handler(struct tep_handle
*tep
, int id
,
6881 const char *sys_name
, const char *event_name
,
6882 tep_event_handler_func func
, void *context
)
6884 struct tep_event
*event
;
6885 struct event_handler
*handle
;
6886 struct event_handler
**next
;
6888 event
= search_event(tep
, id
, sys_name
, event_name
);
6892 if (event
->handler
== func
&& event
->context
== context
) {
6893 pr_stat("removing override handler for event (%d) %s:%s. Going back to default handler.",
6894 event
->id
, event
->system
, event
->name
);
6896 event
->handler
= NULL
;
6897 event
->context
= NULL
;
6902 for (next
= &tep
->handlers
; *next
; next
= &(*next
)->next
) {
6904 if (handle_matches(handle
, id
, sys_name
, event_name
,
6912 *next
= handle
->next
;
6913 free_handler(handle
);
6919 * tep_alloc - create a tep handle
6921 struct tep_handle
*tep_alloc(void)
6923 struct tep_handle
*tep
= calloc(1, sizeof(*tep
));
6927 tep
->host_bigendian
= tep_is_bigendian();
6933 void tep_ref(struct tep_handle
*tep
)
6938 int tep_get_ref(struct tep_handle
*tep
)
6941 return tep
->ref_count
;
6945 void tep_free_format_field(struct tep_format_field
*field
)
6948 if (field
->alias
!= field
->name
)
6954 static void free_format_fields(struct tep_format_field
*field
)
6956 struct tep_format_field
*next
;
6960 tep_free_format_field(field
);
6965 static void free_formats(struct tep_format
*format
)
6967 free_format_fields(format
->common_fields
);
6968 free_format_fields(format
->fields
);
6971 void tep_free_event(struct tep_event
*event
)
6974 free(event
->system
);
6976 free_formats(&event
->format
);
6978 free(event
->print_fmt
.format
);
6979 free_args(event
->print_fmt
.args
);
6985 * tep_free - free a tep handle
6986 * @tep: the tep handle to free
6988 void tep_free(struct tep_handle
*tep
)
6990 struct cmdline_list
*cmdlist
, *cmdnext
;
6991 struct func_list
*funclist
, *funcnext
;
6992 struct printk_list
*printklist
, *printknext
;
6993 struct tep_function_handler
*func_handler
;
6994 struct event_handler
*handle
;
7000 cmdlist
= tep
->cmdlist
;
7001 funclist
= tep
->funclist
;
7002 printklist
= tep
->printklist
;
7008 if (tep
->cmdlines
) {
7009 for (i
= 0; i
< tep
->cmdline_count
; i
++)
7010 free(tep
->cmdlines
[i
].comm
);
7011 free(tep
->cmdlines
);
7015 cmdnext
= cmdlist
->next
;
7016 free(cmdlist
->comm
);
7021 if (tep
->func_map
) {
7022 for (i
= 0; i
< (int)tep
->func_count
; i
++) {
7023 free(tep
->func_map
[i
].func
);
7024 free(tep
->func_map
[i
].mod
);
7026 free(tep
->func_map
);
7030 funcnext
= funclist
->next
;
7031 free(funclist
->func
);
7032 free(funclist
->mod
);
7034 funclist
= funcnext
;
7037 while (tep
->func_handlers
) {
7038 func_handler
= tep
->func_handlers
;
7039 tep
->func_handlers
= func_handler
->next
;
7040 free_func_handle(func_handler
);
7043 if (tep
->printk_map
) {
7044 for (i
= 0; i
< (int)tep
->printk_count
; i
++)
7045 free(tep
->printk_map
[i
].printk
);
7046 free(tep
->printk_map
);
7049 while (printklist
) {
7050 printknext
= printklist
->next
;
7051 free(printklist
->printk
);
7053 printklist
= printknext
;
7056 for (i
= 0; i
< tep
->nr_events
; i
++)
7057 tep_free_event(tep
->events
[i
]);
7059 while (tep
->handlers
) {
7060 handle
= tep
->handlers
;
7061 tep
->handlers
= handle
->next
;
7062 free_handler(handle
);
7066 free(tep
->sort_events
);
7067 free(tep
->func_resolver
);
7072 void tep_unref(struct tep_handle
*tep
)