Loading...
1/*
2 * Copyright (C) 2009, 2010 Red Hat Inc, Steven Rostedt <srostedt@redhat.com>
3 *
4 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation;
8 * version 2.1 of the License (not later!)
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU Lesser General Public License for more details.
14 *
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this program; if not, see <http://www.gnu.org/licenses>
17 *
18 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
19 *
20 * The parts for function graph printing was taken and modified from the
21 * Linux Kernel that were written by
22 * - Copyright (C) 2009 Frederic Weisbecker,
23 * Frederic Weisbecker gave his permission to relicense the code to
24 * the Lesser General Public License.
25 */
26#include <stdio.h>
27#include <stdlib.h>
28#include <string.h>
29#include <stdarg.h>
30#include <ctype.h>
31#include <errno.h>
32#include <stdint.h>
33#include <limits.h>
34
35#include "event-parse.h"
36#include "event-utils.h"
37
38static const char *input_buf;
39static unsigned long long input_buf_ptr;
40static unsigned long long input_buf_siz;
41
42static int is_flag_field;
43static int is_symbolic_field;
44
45static int show_warning = 1;
46
47#define do_warning(fmt, ...) \
48 do { \
49 if (show_warning) \
50 warning(fmt, ##__VA_ARGS__); \
51 } while (0)
52
53#define do_warning_event(event, fmt, ...) \
54 do { \
55 if (!show_warning) \
56 continue; \
57 \
58 if (event) \
59 warning("[%s:%s] " fmt, event->system, \
60 event->name, ##__VA_ARGS__); \
61 else \
62 warning(fmt, ##__VA_ARGS__); \
63 } while (0)
64
65static void init_input_buf(const char *buf, unsigned long long size)
66{
67 input_buf = buf;
68 input_buf_siz = size;
69 input_buf_ptr = 0;
70}
71
72const char *pevent_get_input_buf(void)
73{
74 return input_buf;
75}
76
77unsigned long long pevent_get_input_buf_ptr(void)
78{
79 return input_buf_ptr;
80}
81
82struct event_handler {
83 struct event_handler *next;
84 int id;
85 const char *sys_name;
86 const char *event_name;
87 pevent_event_handler_func func;
88 void *context;
89};
90
91struct pevent_func_params {
92 struct pevent_func_params *next;
93 enum pevent_func_arg_type type;
94};
95
96struct pevent_function_handler {
97 struct pevent_function_handler *next;
98 enum pevent_func_arg_type ret_type;
99 char *name;
100 pevent_func_handler func;
101 struct pevent_func_params *params;
102 int nr_args;
103};
104
105static unsigned long long
106process_defined_func(struct trace_seq *s, void *data, int size,
107 struct event_format *event, struct print_arg *arg);
108
109static void free_func_handle(struct pevent_function_handler *func);
110
111/**
112 * pevent_buffer_init - init buffer for parsing
113 * @buf: buffer to parse
114 * @size: the size of the buffer
115 *
116 * For use with pevent_read_token(), this initializes the internal
117 * buffer that pevent_read_token() will parse.
118 */
119void pevent_buffer_init(const char *buf, unsigned long long size)
120{
121 init_input_buf(buf, size);
122}
123
124void breakpoint(void)
125{
126 static int x;
127 x++;
128}
129
130struct print_arg *alloc_arg(void)
131{
132 return calloc(1, sizeof(struct print_arg));
133}
134
135struct cmdline {
136 char *comm;
137 int pid;
138};
139
140static int cmdline_cmp(const void *a, const void *b)
141{
142 const struct cmdline *ca = a;
143 const struct cmdline *cb = b;
144
145 if (ca->pid < cb->pid)
146 return -1;
147 if (ca->pid > cb->pid)
148 return 1;
149
150 return 0;
151}
152
153struct cmdline_list {
154 struct cmdline_list *next;
155 char *comm;
156 int pid;
157};
158
159static int cmdline_init(struct pevent *pevent)
160{
161 struct cmdline_list *cmdlist = pevent->cmdlist;
162 struct cmdline_list *item;
163 struct cmdline *cmdlines;
164 int i;
165
166 cmdlines = malloc(sizeof(*cmdlines) * pevent->cmdline_count);
167 if (!cmdlines)
168 return -1;
169
170 i = 0;
171 while (cmdlist) {
172 cmdlines[i].pid = cmdlist->pid;
173 cmdlines[i].comm = cmdlist->comm;
174 i++;
175 item = cmdlist;
176 cmdlist = cmdlist->next;
177 free(item);
178 }
179
180 qsort(cmdlines, pevent->cmdline_count, sizeof(*cmdlines), cmdline_cmp);
181
182 pevent->cmdlines = cmdlines;
183 pevent->cmdlist = NULL;
184
185 return 0;
186}
187
188static const char *find_cmdline(struct pevent *pevent, int pid)
189{
190 const struct cmdline *comm;
191 struct cmdline key;
192
193 if (!pid)
194 return "<idle>";
195
196 if (!pevent->cmdlines && cmdline_init(pevent))
197 return "<not enough memory for cmdlines!>";
198
199 key.pid = pid;
200
201 comm = bsearch(&key, pevent->cmdlines, pevent->cmdline_count,
202 sizeof(*pevent->cmdlines), cmdline_cmp);
203
204 if (comm)
205 return comm->comm;
206 return "<...>";
207}
208
209/**
210 * pevent_pid_is_registered - return if a pid has a cmdline registered
211 * @pevent: handle for the pevent
212 * @pid: The pid to check if it has a cmdline registered with.
213 *
214 * Returns 1 if the pid has a cmdline mapped to it
215 * 0 otherwise.
216 */
217int pevent_pid_is_registered(struct pevent *pevent, int pid)
218{
219 const struct cmdline *comm;
220 struct cmdline key;
221
222 if (!pid)
223 return 1;
224
225 if (!pevent->cmdlines && cmdline_init(pevent))
226 return 0;
227
228 key.pid = pid;
229
230 comm = bsearch(&key, pevent->cmdlines, pevent->cmdline_count,
231 sizeof(*pevent->cmdlines), cmdline_cmp);
232
233 if (comm)
234 return 1;
235 return 0;
236}
237
238/*
239 * If the command lines have been converted to an array, then
240 * we must add this pid. This is much slower than when cmdlines
241 * are added before the array is initialized.
242 */
243static int add_new_comm(struct pevent *pevent, const char *comm, int pid)
244{
245 struct cmdline *cmdlines = pevent->cmdlines;
246 const struct cmdline *cmdline;
247 struct cmdline key;
248
249 if (!pid)
250 return 0;
251
252 /* avoid duplicates */
253 key.pid = pid;
254
255 cmdline = bsearch(&key, pevent->cmdlines, pevent->cmdline_count,
256 sizeof(*pevent->cmdlines), cmdline_cmp);
257 if (cmdline) {
258 errno = EEXIST;
259 return -1;
260 }
261
262 cmdlines = realloc(cmdlines, sizeof(*cmdlines) * (pevent->cmdline_count + 1));
263 if (!cmdlines) {
264 errno = ENOMEM;
265 return -1;
266 }
267
268 cmdlines[pevent->cmdline_count].comm = strdup(comm);
269 if (!cmdlines[pevent->cmdline_count].comm) {
270 free(cmdlines);
271 errno = ENOMEM;
272 return -1;
273 }
274
275 cmdlines[pevent->cmdline_count].pid = pid;
276
277 if (cmdlines[pevent->cmdline_count].comm)
278 pevent->cmdline_count++;
279
280 qsort(cmdlines, pevent->cmdline_count, sizeof(*cmdlines), cmdline_cmp);
281 pevent->cmdlines = cmdlines;
282
283 return 0;
284}
285
286/**
287 * pevent_register_comm - register a pid / comm mapping
288 * @pevent: handle for the pevent
289 * @comm: the command line to register
290 * @pid: the pid to map the command line to
291 *
292 * This adds a mapping to search for command line names with
293 * a given pid. The comm is duplicated.
294 */
295int pevent_register_comm(struct pevent *pevent, const char *comm, int pid)
296{
297 struct cmdline_list *item;
298
299 if (pevent->cmdlines)
300 return add_new_comm(pevent, comm, pid);
301
302 item = malloc(sizeof(*item));
303 if (!item)
304 return -1;
305
306 item->comm = strdup(comm);
307 if (!item->comm) {
308 free(item);
309 return -1;
310 }
311 item->pid = pid;
312 item->next = pevent->cmdlist;
313
314 pevent->cmdlist = item;
315 pevent->cmdline_count++;
316
317 return 0;
318}
319
320void pevent_register_trace_clock(struct pevent *pevent, char *trace_clock)
321{
322 pevent->trace_clock = trace_clock;
323}
324
325struct func_map {
326 unsigned long long addr;
327 char *func;
328 char *mod;
329};
330
331struct func_list {
332 struct func_list *next;
333 unsigned long long addr;
334 char *func;
335 char *mod;
336};
337
338static int func_cmp(const void *a, const void *b)
339{
340 const struct func_map *fa = a;
341 const struct func_map *fb = b;
342
343 if (fa->addr < fb->addr)
344 return -1;
345 if (fa->addr > fb->addr)
346 return 1;
347
348 return 0;
349}
350
351/*
352 * We are searching for a record in between, not an exact
353 * match.
354 */
355static int func_bcmp(const void *a, const void *b)
356{
357 const struct func_map *fa = a;
358 const struct func_map *fb = b;
359
360 if ((fa->addr == fb->addr) ||
361
362 (fa->addr > fb->addr &&
363 fa->addr < (fb+1)->addr))
364 return 0;
365
366 if (fa->addr < fb->addr)
367 return -1;
368
369 return 1;
370}
371
372static int func_map_init(struct pevent *pevent)
373{
374 struct func_list *funclist;
375 struct func_list *item;
376 struct func_map *func_map;
377 int i;
378
379 func_map = malloc(sizeof(*func_map) * (pevent->func_count + 1));
380 if (!func_map)
381 return -1;
382
383 funclist = pevent->funclist;
384
385 i = 0;
386 while (funclist) {
387 func_map[i].func = funclist->func;
388 func_map[i].addr = funclist->addr;
389 func_map[i].mod = funclist->mod;
390 i++;
391 item = funclist;
392 funclist = funclist->next;
393 free(item);
394 }
395
396 qsort(func_map, pevent->func_count, sizeof(*func_map), func_cmp);
397
398 /*
399 * Add a special record at the end.
400 */
401 func_map[pevent->func_count].func = NULL;
402 func_map[pevent->func_count].addr = 0;
403 func_map[pevent->func_count].mod = NULL;
404
405 pevent->func_map = func_map;
406 pevent->funclist = NULL;
407
408 return 0;
409}
410
411static struct func_map *
412find_func(struct pevent *pevent, unsigned long long addr)
413{
414 struct func_map *func;
415 struct func_map key;
416
417 if (!pevent->func_map)
418 func_map_init(pevent);
419
420 key.addr = addr;
421
422 func = bsearch(&key, pevent->func_map, pevent->func_count,
423 sizeof(*pevent->func_map), func_bcmp);
424
425 return func;
426}
427
428/**
429 * pevent_find_function - find a function by a given address
430 * @pevent: handle for the pevent
431 * @addr: the address to find the function with
432 *
433 * Returns a pointer to the function stored that has the given
434 * address. Note, the address does not have to be exact, it
435 * will select the function that would contain the address.
436 */
437const char *pevent_find_function(struct pevent *pevent, unsigned long long addr)
438{
439 struct func_map *map;
440
441 map = find_func(pevent, addr);
442 if (!map)
443 return NULL;
444
445 return map->func;
446}
447
448/**
449 * pevent_find_function_address - find a function address by a given address
450 * @pevent: handle for the pevent
451 * @addr: the address to find the function with
452 *
453 * Returns the address the function starts at. This can be used in
454 * conjunction with pevent_find_function to print both the function
455 * name and the function offset.
456 */
457unsigned long long
458pevent_find_function_address(struct pevent *pevent, unsigned long long addr)
459{
460 struct func_map *map;
461
462 map = find_func(pevent, addr);
463 if (!map)
464 return 0;
465
466 return map->addr;
467}
468
469/**
470 * pevent_register_function - register a function with a given address
471 * @pevent: handle for the pevent
472 * @function: the function name to register
473 * @addr: the address the function starts at
474 * @mod: the kernel module the function may be in (NULL for none)
475 *
476 * This registers a function name with an address and module.
477 * The @func passed in is duplicated.
478 */
479int pevent_register_function(struct pevent *pevent, char *func,
480 unsigned long long addr, char *mod)
481{
482 struct func_list *item = malloc(sizeof(*item));
483
484 if (!item)
485 return -1;
486
487 item->next = pevent->funclist;
488 item->func = strdup(func);
489 if (!item->func)
490 goto out_free;
491
492 if (mod) {
493 item->mod = strdup(mod);
494 if (!item->mod)
495 goto out_free_func;
496 } else
497 item->mod = NULL;
498 item->addr = addr;
499
500 pevent->funclist = item;
501 pevent->func_count++;
502
503 return 0;
504
505out_free_func:
506 free(item->func);
507 item->func = NULL;
508out_free:
509 free(item);
510 errno = ENOMEM;
511 return -1;
512}
513
514/**
515 * pevent_print_funcs - print out the stored functions
516 * @pevent: handle for the pevent
517 *
518 * This prints out the stored functions.
519 */
520void pevent_print_funcs(struct pevent *pevent)
521{
522 int i;
523
524 if (!pevent->func_map)
525 func_map_init(pevent);
526
527 for (i = 0; i < (int)pevent->func_count; i++) {
528 printf("%016llx %s",
529 pevent->func_map[i].addr,
530 pevent->func_map[i].func);
531 if (pevent->func_map[i].mod)
532 printf(" [%s]\n", pevent->func_map[i].mod);
533 else
534 printf("\n");
535 }
536}
537
538struct printk_map {
539 unsigned long long addr;
540 char *printk;
541};
542
543struct printk_list {
544 struct printk_list *next;
545 unsigned long long addr;
546 char *printk;
547};
548
549static int printk_cmp(const void *a, const void *b)
550{
551 const struct printk_map *pa = a;
552 const struct printk_map *pb = b;
553
554 if (pa->addr < pb->addr)
555 return -1;
556 if (pa->addr > pb->addr)
557 return 1;
558
559 return 0;
560}
561
562static int printk_map_init(struct pevent *pevent)
563{
564 struct printk_list *printklist;
565 struct printk_list *item;
566 struct printk_map *printk_map;
567 int i;
568
569 printk_map = malloc(sizeof(*printk_map) * (pevent->printk_count + 1));
570 if (!printk_map)
571 return -1;
572
573 printklist = pevent->printklist;
574
575 i = 0;
576 while (printklist) {
577 printk_map[i].printk = printklist->printk;
578 printk_map[i].addr = printklist->addr;
579 i++;
580 item = printklist;
581 printklist = printklist->next;
582 free(item);
583 }
584
585 qsort(printk_map, pevent->printk_count, sizeof(*printk_map), printk_cmp);
586
587 pevent->printk_map = printk_map;
588 pevent->printklist = NULL;
589
590 return 0;
591}
592
593static struct printk_map *
594find_printk(struct pevent *pevent, unsigned long long addr)
595{
596 struct printk_map *printk;
597 struct printk_map key;
598
599 if (!pevent->printk_map && printk_map_init(pevent))
600 return NULL;
601
602 key.addr = addr;
603
604 printk = bsearch(&key, pevent->printk_map, pevent->printk_count,
605 sizeof(*pevent->printk_map), printk_cmp);
606
607 return printk;
608}
609
610/**
611 * pevent_register_print_string - register a string by its address
612 * @pevent: handle for the pevent
613 * @fmt: the string format to register
614 * @addr: the address the string was located at
615 *
616 * This registers a string by the address it was stored in the kernel.
617 * The @fmt passed in is duplicated.
618 */
619int pevent_register_print_string(struct pevent *pevent, const char *fmt,
620 unsigned long long addr)
621{
622 struct printk_list *item = malloc(sizeof(*item));
623 char *p;
624
625 if (!item)
626 return -1;
627
628 item->next = pevent->printklist;
629 item->addr = addr;
630
631 /* Strip off quotes and '\n' from the end */
632 if (fmt[0] == '"')
633 fmt++;
634 item->printk = strdup(fmt);
635 if (!item->printk)
636 goto out_free;
637
638 p = item->printk + strlen(item->printk) - 1;
639 if (*p == '"')
640 *p = 0;
641
642 p -= 2;
643 if (strcmp(p, "\\n") == 0)
644 *p = 0;
645
646 pevent->printklist = item;
647 pevent->printk_count++;
648
649 return 0;
650
651out_free:
652 free(item);
653 errno = ENOMEM;
654 return -1;
655}
656
657/**
658 * pevent_print_printk - print out the stored strings
659 * @pevent: handle for the pevent
660 *
661 * This prints the string formats that were stored.
662 */
663void pevent_print_printk(struct pevent *pevent)
664{
665 int i;
666
667 if (!pevent->printk_map)
668 printk_map_init(pevent);
669
670 for (i = 0; i < (int)pevent->printk_count; i++) {
671 printf("%016llx %s\n",
672 pevent->printk_map[i].addr,
673 pevent->printk_map[i].printk);
674 }
675}
676
677static struct event_format *alloc_event(void)
678{
679 return calloc(1, sizeof(struct event_format));
680}
681
682static int add_event(struct pevent *pevent, struct event_format *event)
683{
684 int i;
685 struct event_format **events = realloc(pevent->events, sizeof(event) *
686 (pevent->nr_events + 1));
687 if (!events)
688 return -1;
689
690 pevent->events = events;
691
692 for (i = 0; i < pevent->nr_events; i++) {
693 if (pevent->events[i]->id > event->id)
694 break;
695 }
696 if (i < pevent->nr_events)
697 memmove(&pevent->events[i + 1],
698 &pevent->events[i],
699 sizeof(event) * (pevent->nr_events - i));
700
701 pevent->events[i] = event;
702 pevent->nr_events++;
703
704 event->pevent = pevent;
705
706 return 0;
707}
708
709static int event_item_type(enum event_type type)
710{
711 switch (type) {
712 case EVENT_ITEM ... EVENT_SQUOTE:
713 return 1;
714 case EVENT_ERROR ... EVENT_DELIM:
715 default:
716 return 0;
717 }
718}
719
720static void free_flag_sym(struct print_flag_sym *fsym)
721{
722 struct print_flag_sym *next;
723
724 while (fsym) {
725 next = fsym->next;
726 free(fsym->value);
727 free(fsym->str);
728 free(fsym);
729 fsym = next;
730 }
731}
732
733static void free_arg(struct print_arg *arg)
734{
735 struct print_arg *farg;
736
737 if (!arg)
738 return;
739
740 switch (arg->type) {
741 case PRINT_ATOM:
742 free(arg->atom.atom);
743 break;
744 case PRINT_FIELD:
745 free(arg->field.name);
746 break;
747 case PRINT_FLAGS:
748 free_arg(arg->flags.field);
749 free(arg->flags.delim);
750 free_flag_sym(arg->flags.flags);
751 break;
752 case PRINT_SYMBOL:
753 free_arg(arg->symbol.field);
754 free_flag_sym(arg->symbol.symbols);
755 break;
756 case PRINT_HEX:
757 free_arg(arg->hex.field);
758 free_arg(arg->hex.size);
759 break;
760 case PRINT_TYPE:
761 free(arg->typecast.type);
762 free_arg(arg->typecast.item);
763 break;
764 case PRINT_STRING:
765 case PRINT_BSTRING:
766 free(arg->string.string);
767 break;
768 case PRINT_DYNAMIC_ARRAY:
769 free(arg->dynarray.index);
770 break;
771 case PRINT_OP:
772 free(arg->op.op);
773 free_arg(arg->op.left);
774 free_arg(arg->op.right);
775 break;
776 case PRINT_FUNC:
777 while (arg->func.args) {
778 farg = arg->func.args;
779 arg->func.args = farg->next;
780 free_arg(farg);
781 }
782 break;
783
784 case PRINT_NULL:
785 default:
786 break;
787 }
788
789 free(arg);
790}
791
792static enum event_type get_type(int ch)
793{
794 if (ch == '\n')
795 return EVENT_NEWLINE;
796 if (isspace(ch))
797 return EVENT_SPACE;
798 if (isalnum(ch) || ch == '_')
799 return EVENT_ITEM;
800 if (ch == '\'')
801 return EVENT_SQUOTE;
802 if (ch == '"')
803 return EVENT_DQUOTE;
804 if (!isprint(ch))
805 return EVENT_NONE;
806 if (ch == '(' || ch == ')' || ch == ',')
807 return EVENT_DELIM;
808
809 return EVENT_OP;
810}
811
812static int __read_char(void)
813{
814 if (input_buf_ptr >= input_buf_siz)
815 return -1;
816
817 return input_buf[input_buf_ptr++];
818}
819
820static int __peek_char(void)
821{
822 if (input_buf_ptr >= input_buf_siz)
823 return -1;
824
825 return input_buf[input_buf_ptr];
826}
827
828/**
829 * pevent_peek_char - peek at the next character that will be read
830 *
831 * Returns the next character read, or -1 if end of buffer.
832 */
833int pevent_peek_char(void)
834{
835 return __peek_char();
836}
837
838static int extend_token(char **tok, char *buf, int size)
839{
840 char *newtok = realloc(*tok, size);
841
842 if (!newtok) {
843 free(*tok);
844 *tok = NULL;
845 return -1;
846 }
847
848 if (!*tok)
849 strcpy(newtok, buf);
850 else
851 strcat(newtok, buf);
852 *tok = newtok;
853
854 return 0;
855}
856
857static enum event_type force_token(const char *str, char **tok);
858
859static enum event_type __read_token(char **tok)
860{
861 char buf[BUFSIZ];
862 int ch, last_ch, quote_ch, next_ch;
863 int i = 0;
864 int tok_size = 0;
865 enum event_type type;
866
867 *tok = NULL;
868
869
870 ch = __read_char();
871 if (ch < 0)
872 return EVENT_NONE;
873
874 type = get_type(ch);
875 if (type == EVENT_NONE)
876 return type;
877
878 buf[i++] = ch;
879
880 switch (type) {
881 case EVENT_NEWLINE:
882 case EVENT_DELIM:
883 if (asprintf(tok, "%c", ch) < 0)
884 return EVENT_ERROR;
885
886 return type;
887
888 case EVENT_OP:
889 switch (ch) {
890 case '-':
891 next_ch = __peek_char();
892 if (next_ch == '>') {
893 buf[i++] = __read_char();
894 break;
895 }
896 /* fall through */
897 case '+':
898 case '|':
899 case '&':
900 case '>':
901 case '<':
902 last_ch = ch;
903 ch = __peek_char();
904 if (ch != last_ch)
905 goto test_equal;
906 buf[i++] = __read_char();
907 switch (last_ch) {
908 case '>':
909 case '<':
910 goto test_equal;
911 default:
912 break;
913 }
914 break;
915 case '!':
916 case '=':
917 goto test_equal;
918 default: /* what should we do instead? */
919 break;
920 }
921 buf[i] = 0;
922 *tok = strdup(buf);
923 return type;
924
925 test_equal:
926 ch = __peek_char();
927 if (ch == '=')
928 buf[i++] = __read_char();
929 goto out;
930
931 case EVENT_DQUOTE:
932 case EVENT_SQUOTE:
933 /* don't keep quotes */
934 i--;
935 quote_ch = ch;
936 last_ch = 0;
937 concat:
938 do {
939 if (i == (BUFSIZ - 1)) {
940 buf[i] = 0;
941 tok_size += BUFSIZ;
942
943 if (extend_token(tok, buf, tok_size) < 0)
944 return EVENT_NONE;
945 i = 0;
946 }
947 last_ch = ch;
948 ch = __read_char();
949 buf[i++] = ch;
950 /* the '\' '\' will cancel itself */
951 if (ch == '\\' && last_ch == '\\')
952 last_ch = 0;
953 } while (ch != quote_ch || last_ch == '\\');
954 /* remove the last quote */
955 i--;
956
957 /*
958 * For strings (double quotes) check the next token.
959 * If it is another string, concatinate the two.
960 */
961 if (type == EVENT_DQUOTE) {
962 unsigned long long save_input_buf_ptr = input_buf_ptr;
963
964 do {
965 ch = __read_char();
966 } while (isspace(ch));
967 if (ch == '"')
968 goto concat;
969 input_buf_ptr = save_input_buf_ptr;
970 }
971
972 goto out;
973
974 case EVENT_ERROR ... EVENT_SPACE:
975 case EVENT_ITEM:
976 default:
977 break;
978 }
979
980 while (get_type(__peek_char()) == type) {
981 if (i == (BUFSIZ - 1)) {
982 buf[i] = 0;
983 tok_size += BUFSIZ;
984
985 if (extend_token(tok, buf, tok_size) < 0)
986 return EVENT_NONE;
987 i = 0;
988 }
989 ch = __read_char();
990 buf[i++] = ch;
991 }
992
993 out:
994 buf[i] = 0;
995 if (extend_token(tok, buf, tok_size + i + 1) < 0)
996 return EVENT_NONE;
997
998 if (type == EVENT_ITEM) {
999 /*
1000 * Older versions of the kernel has a bug that
1001 * creates invalid symbols and will break the mac80211
1002 * parsing. This is a work around to that bug.
1003 *
1004 * See Linux kernel commit:
1005 * 811cb50baf63461ce0bdb234927046131fc7fa8b
1006 */
1007 if (strcmp(*tok, "LOCAL_PR_FMT") == 0) {
1008 free(*tok);
1009 *tok = NULL;
1010 return force_token("\"\%s\" ", tok);
1011 } else if (strcmp(*tok, "STA_PR_FMT") == 0) {
1012 free(*tok);
1013 *tok = NULL;
1014 return force_token("\" sta:%pM\" ", tok);
1015 } else if (strcmp(*tok, "VIF_PR_FMT") == 0) {
1016 free(*tok);
1017 *tok = NULL;
1018 return force_token("\" vif:%p(%d)\" ", tok);
1019 }
1020 }
1021
1022 return type;
1023}
1024
1025static enum event_type force_token(const char *str, char **tok)
1026{
1027 const char *save_input_buf;
1028 unsigned long long save_input_buf_ptr;
1029 unsigned long long save_input_buf_siz;
1030 enum event_type type;
1031
1032 /* save off the current input pointers */
1033 save_input_buf = input_buf;
1034 save_input_buf_ptr = input_buf_ptr;
1035 save_input_buf_siz = input_buf_siz;
1036
1037 init_input_buf(str, strlen(str));
1038
1039 type = __read_token(tok);
1040
1041 /* reset back to original token */
1042 input_buf = save_input_buf;
1043 input_buf_ptr = save_input_buf_ptr;
1044 input_buf_siz = save_input_buf_siz;
1045
1046 return type;
1047}
1048
1049static void free_token(char *tok)
1050{
1051 if (tok)
1052 free(tok);
1053}
1054
1055static enum event_type read_token(char **tok)
1056{
1057 enum event_type type;
1058
1059 for (;;) {
1060 type = __read_token(tok);
1061 if (type != EVENT_SPACE)
1062 return type;
1063
1064 free_token(*tok);
1065 }
1066
1067 /* not reached */
1068 *tok = NULL;
1069 return EVENT_NONE;
1070}
1071
1072/**
1073 * pevent_read_token - access to utilites to use the pevent parser
1074 * @tok: The token to return
1075 *
1076 * This will parse tokens from the string given by
1077 * pevent_init_data().
1078 *
1079 * Returns the token type.
1080 */
1081enum event_type pevent_read_token(char **tok)
1082{
1083 return read_token(tok);
1084}
1085
1086/**
1087 * pevent_free_token - free a token returned by pevent_read_token
1088 * @token: the token to free
1089 */
1090void pevent_free_token(char *token)
1091{
1092 free_token(token);
1093}
1094
1095/* no newline */
1096static enum event_type read_token_item(char **tok)
1097{
1098 enum event_type type;
1099
1100 for (;;) {
1101 type = __read_token(tok);
1102 if (type != EVENT_SPACE && type != EVENT_NEWLINE)
1103 return type;
1104 free_token(*tok);
1105 *tok = NULL;
1106 }
1107
1108 /* not reached */
1109 *tok = NULL;
1110 return EVENT_NONE;
1111}
1112
1113static int test_type(enum event_type type, enum event_type expect)
1114{
1115 if (type != expect) {
1116 do_warning("Error: expected type %d but read %d",
1117 expect, type);
1118 return -1;
1119 }
1120 return 0;
1121}
1122
1123static int test_type_token(enum event_type type, const char *token,
1124 enum event_type expect, const char *expect_tok)
1125{
1126 if (type != expect) {
1127 do_warning("Error: expected type %d but read %d",
1128 expect, type);
1129 return -1;
1130 }
1131
1132 if (strcmp(token, expect_tok) != 0) {
1133 do_warning("Error: expected '%s' but read '%s'",
1134 expect_tok, token);
1135 return -1;
1136 }
1137 return 0;
1138}
1139
1140static int __read_expect_type(enum event_type expect, char **tok, int newline_ok)
1141{
1142 enum event_type type;
1143
1144 if (newline_ok)
1145 type = read_token(tok);
1146 else
1147 type = read_token_item(tok);
1148 return test_type(type, expect);
1149}
1150
1151static int read_expect_type(enum event_type expect, char **tok)
1152{
1153 return __read_expect_type(expect, tok, 1);
1154}
1155
1156static int __read_expected(enum event_type expect, const char *str,
1157 int newline_ok)
1158{
1159 enum event_type type;
1160 char *token;
1161 int ret;
1162
1163 if (newline_ok)
1164 type = read_token(&token);
1165 else
1166 type = read_token_item(&token);
1167
1168 ret = test_type_token(type, token, expect, str);
1169
1170 free_token(token);
1171
1172 return ret;
1173}
1174
1175static int read_expected(enum event_type expect, const char *str)
1176{
1177 return __read_expected(expect, str, 1);
1178}
1179
1180static int read_expected_item(enum event_type expect, const char *str)
1181{
1182 return __read_expected(expect, str, 0);
1183}
1184
1185static char *event_read_name(void)
1186{
1187 char *token;
1188
1189 if (read_expected(EVENT_ITEM, "name") < 0)
1190 return NULL;
1191
1192 if (read_expected(EVENT_OP, ":") < 0)
1193 return NULL;
1194
1195 if (read_expect_type(EVENT_ITEM, &token) < 0)
1196 goto fail;
1197
1198 return token;
1199
1200 fail:
1201 free_token(token);
1202 return NULL;
1203}
1204
1205static int event_read_id(void)
1206{
1207 char *token;
1208 int id;
1209
1210 if (read_expected_item(EVENT_ITEM, "ID") < 0)
1211 return -1;
1212
1213 if (read_expected(EVENT_OP, ":") < 0)
1214 return -1;
1215
1216 if (read_expect_type(EVENT_ITEM, &token) < 0)
1217 goto fail;
1218
1219 id = strtoul(token, NULL, 0);
1220 free_token(token);
1221 return id;
1222
1223 fail:
1224 free_token(token);
1225 return -1;
1226}
1227
1228static int field_is_string(struct format_field *field)
1229{
1230 if ((field->flags & FIELD_IS_ARRAY) &&
1231 (strstr(field->type, "char") || strstr(field->type, "u8") ||
1232 strstr(field->type, "s8")))
1233 return 1;
1234
1235 return 0;
1236}
1237
1238static int field_is_dynamic(struct format_field *field)
1239{
1240 if (strncmp(field->type, "__data_loc", 10) == 0)
1241 return 1;
1242
1243 return 0;
1244}
1245
1246static int field_is_long(struct format_field *field)
1247{
1248 /* includes long long */
1249 if (strstr(field->type, "long"))
1250 return 1;
1251
1252 return 0;
1253}
1254
1255static unsigned int type_size(const char *name)
1256{
1257 /* This covers all FIELD_IS_STRING types. */
1258 static struct {
1259 const char *type;
1260 unsigned int size;
1261 } table[] = {
1262 { "u8", 1 },
1263 { "u16", 2 },
1264 { "u32", 4 },
1265 { "u64", 8 },
1266 { "s8", 1 },
1267 { "s16", 2 },
1268 { "s32", 4 },
1269 { "s64", 8 },
1270 { "char", 1 },
1271 { },
1272 };
1273 int i;
1274
1275 for (i = 0; table[i].type; i++) {
1276 if (!strcmp(table[i].type, name))
1277 return table[i].size;
1278 }
1279
1280 return 0;
1281}
1282
1283static int event_read_fields(struct event_format *event, struct format_field **fields)
1284{
1285 struct format_field *field = NULL;
1286 enum event_type type;
1287 char *token;
1288 char *last_token;
1289 int count = 0;
1290
1291 do {
1292 unsigned int size_dynamic = 0;
1293
1294 type = read_token(&token);
1295 if (type == EVENT_NEWLINE) {
1296 free_token(token);
1297 return count;
1298 }
1299
1300 count++;
1301
1302 if (test_type_token(type, token, EVENT_ITEM, "field"))
1303 goto fail;
1304 free_token(token);
1305
1306 type = read_token(&token);
1307 /*
1308 * The ftrace fields may still use the "special" name.
1309 * Just ignore it.
1310 */
1311 if (event->flags & EVENT_FL_ISFTRACE &&
1312 type == EVENT_ITEM && strcmp(token, "special") == 0) {
1313 free_token(token);
1314 type = read_token(&token);
1315 }
1316
1317 if (test_type_token(type, token, EVENT_OP, ":") < 0)
1318 goto fail;
1319
1320 free_token(token);
1321 if (read_expect_type(EVENT_ITEM, &token) < 0)
1322 goto fail;
1323
1324 last_token = token;
1325
1326 field = calloc(1, sizeof(*field));
1327 if (!field)
1328 goto fail;
1329
1330 field->event = event;
1331
1332 /* read the rest of the type */
1333 for (;;) {
1334 type = read_token(&token);
1335 if (type == EVENT_ITEM ||
1336 (type == EVENT_OP && strcmp(token, "*") == 0) ||
1337 /*
1338 * Some of the ftrace fields are broken and have
1339 * an illegal "." in them.
1340 */
1341 (event->flags & EVENT_FL_ISFTRACE &&
1342 type == EVENT_OP && strcmp(token, ".") == 0)) {
1343
1344 if (strcmp(token, "*") == 0)
1345 field->flags |= FIELD_IS_POINTER;
1346
1347 if (field->type) {
1348 char *new_type;
1349 new_type = realloc(field->type,
1350 strlen(field->type) +
1351 strlen(last_token) + 2);
1352 if (!new_type) {
1353 free(last_token);
1354 goto fail;
1355 }
1356 field->type = new_type;
1357 strcat(field->type, " ");
1358 strcat(field->type, last_token);
1359 free(last_token);
1360 } else
1361 field->type = last_token;
1362 last_token = token;
1363 continue;
1364 }
1365
1366 break;
1367 }
1368
1369 if (!field->type) {
1370 do_warning_event(event, "%s: no type found", __func__);
1371 goto fail;
1372 }
1373 field->name = last_token;
1374
1375 if (test_type(type, EVENT_OP))
1376 goto fail;
1377
1378 if (strcmp(token, "[") == 0) {
1379 enum event_type last_type = type;
1380 char *brackets = token;
1381 char *new_brackets;
1382 int len;
1383
1384 field->flags |= FIELD_IS_ARRAY;
1385
1386 type = read_token(&token);
1387
1388 if (type == EVENT_ITEM)
1389 field->arraylen = strtoul(token, NULL, 0);
1390 else
1391 field->arraylen = 0;
1392
1393 while (strcmp(token, "]") != 0) {
1394 if (last_type == EVENT_ITEM &&
1395 type == EVENT_ITEM)
1396 len = 2;
1397 else
1398 len = 1;
1399 last_type = type;
1400
1401 new_brackets = realloc(brackets,
1402 strlen(brackets) +
1403 strlen(token) + len);
1404 if (!new_brackets) {
1405 free(brackets);
1406 goto fail;
1407 }
1408 brackets = new_brackets;
1409 if (len == 2)
1410 strcat(brackets, " ");
1411 strcat(brackets, token);
1412 /* We only care about the last token */
1413 field->arraylen = strtoul(token, NULL, 0);
1414 free_token(token);
1415 type = read_token(&token);
1416 if (type == EVENT_NONE) {
1417 do_warning_event(event, "failed to find token");
1418 goto fail;
1419 }
1420 }
1421
1422 free_token(token);
1423
1424 new_brackets = realloc(brackets, strlen(brackets) + 2);
1425 if (!new_brackets) {
1426 free(brackets);
1427 goto fail;
1428 }
1429 brackets = new_brackets;
1430 strcat(brackets, "]");
1431
1432 /* add brackets to type */
1433
1434 type = read_token(&token);
1435 /*
1436 * If the next token is not an OP, then it is of
1437 * the format: type [] item;
1438 */
1439 if (type == EVENT_ITEM) {
1440 char *new_type;
1441 new_type = realloc(field->type,
1442 strlen(field->type) +
1443 strlen(field->name) +
1444 strlen(brackets) + 2);
1445 if (!new_type) {
1446 free(brackets);
1447 goto fail;
1448 }
1449 field->type = new_type;
1450 strcat(field->type, " ");
1451 strcat(field->type, field->name);
1452 size_dynamic = type_size(field->name);
1453 free_token(field->name);
1454 strcat(field->type, brackets);
1455 field->name = token;
1456 type = read_token(&token);
1457 } else {
1458 char *new_type;
1459 new_type = realloc(field->type,
1460 strlen(field->type) +
1461 strlen(brackets) + 1);
1462 if (!new_type) {
1463 free(brackets);
1464 goto fail;
1465 }
1466 field->type = new_type;
1467 strcat(field->type, brackets);
1468 }
1469 free(brackets);
1470 }
1471
1472 if (field_is_string(field))
1473 field->flags |= FIELD_IS_STRING;
1474 if (field_is_dynamic(field))
1475 field->flags |= FIELD_IS_DYNAMIC;
1476 if (field_is_long(field))
1477 field->flags |= FIELD_IS_LONG;
1478
1479 if (test_type_token(type, token, EVENT_OP, ";"))
1480 goto fail;
1481 free_token(token);
1482
1483 if (read_expected(EVENT_ITEM, "offset") < 0)
1484 goto fail_expect;
1485
1486 if (read_expected(EVENT_OP, ":") < 0)
1487 goto fail_expect;
1488
1489 if (read_expect_type(EVENT_ITEM, &token))
1490 goto fail;
1491 field->offset = strtoul(token, NULL, 0);
1492 free_token(token);
1493
1494 if (read_expected(EVENT_OP, ";") < 0)
1495 goto fail_expect;
1496
1497 if (read_expected(EVENT_ITEM, "size") < 0)
1498 goto fail_expect;
1499
1500 if (read_expected(EVENT_OP, ":") < 0)
1501 goto fail_expect;
1502
1503 if (read_expect_type(EVENT_ITEM, &token))
1504 goto fail;
1505 field->size = strtoul(token, NULL, 0);
1506 free_token(token);
1507
1508 if (read_expected(EVENT_OP, ";") < 0)
1509 goto fail_expect;
1510
1511 type = read_token(&token);
1512 if (type != EVENT_NEWLINE) {
1513 /* newer versions of the kernel have a "signed" type */
1514 if (test_type_token(type, token, EVENT_ITEM, "signed"))
1515 goto fail;
1516
1517 free_token(token);
1518
1519 if (read_expected(EVENT_OP, ":") < 0)
1520 goto fail_expect;
1521
1522 if (read_expect_type(EVENT_ITEM, &token))
1523 goto fail;
1524
1525 if (strtoul(token, NULL, 0))
1526 field->flags |= FIELD_IS_SIGNED;
1527
1528 free_token(token);
1529 if (read_expected(EVENT_OP, ";") < 0)
1530 goto fail_expect;
1531
1532 if (read_expect_type(EVENT_NEWLINE, &token))
1533 goto fail;
1534 }
1535
1536 free_token(token);
1537
1538 if (field->flags & FIELD_IS_ARRAY) {
1539 if (field->arraylen)
1540 field->elementsize = field->size / field->arraylen;
1541 else if (field->flags & FIELD_IS_DYNAMIC)
1542 field->elementsize = size_dynamic;
1543 else if (field->flags & FIELD_IS_STRING)
1544 field->elementsize = 1;
1545 else if (field->flags & FIELD_IS_LONG)
1546 field->elementsize = event->pevent ?
1547 event->pevent->long_size :
1548 sizeof(long);
1549 } else
1550 field->elementsize = field->size;
1551
1552 *fields = field;
1553 fields = &field->next;
1554
1555 } while (1);
1556
1557 return 0;
1558
1559fail:
1560 free_token(token);
1561fail_expect:
1562 if (field) {
1563 free(field->type);
1564 free(field->name);
1565 free(field);
1566 }
1567 return -1;
1568}
1569
1570static int event_read_format(struct event_format *event)
1571{
1572 char *token;
1573 int ret;
1574
1575 if (read_expected_item(EVENT_ITEM, "format") < 0)
1576 return -1;
1577
1578 if (read_expected(EVENT_OP, ":") < 0)
1579 return -1;
1580
1581 if (read_expect_type(EVENT_NEWLINE, &token))
1582 goto fail;
1583 free_token(token);
1584
1585 ret = event_read_fields(event, &event->format.common_fields);
1586 if (ret < 0)
1587 return ret;
1588 event->format.nr_common = ret;
1589
1590 ret = event_read_fields(event, &event->format.fields);
1591 if (ret < 0)
1592 return ret;
1593 event->format.nr_fields = ret;
1594
1595 return 0;
1596
1597 fail:
1598 free_token(token);
1599 return -1;
1600}
1601
1602static enum event_type
1603process_arg_token(struct event_format *event, struct print_arg *arg,
1604 char **tok, enum event_type type);
1605
1606static enum event_type
1607process_arg(struct event_format *event, struct print_arg *arg, char **tok)
1608{
1609 enum event_type type;
1610 char *token;
1611
1612 type = read_token(&token);
1613 *tok = token;
1614
1615 return process_arg_token(event, arg, tok, type);
1616}
1617
1618static enum event_type
1619process_op(struct event_format *event, struct print_arg *arg, char **tok);
1620
1621/*
1622 * For __print_symbolic() and __print_flags, we need to completely
1623 * evaluate the first argument, which defines what to print next.
1624 */
1625static enum event_type
1626process_field_arg(struct event_format *event, struct print_arg *arg, char **tok)
1627{
1628 enum event_type type;
1629
1630 type = process_arg(event, arg, tok);
1631
1632 while (type == EVENT_OP) {
1633 type = process_op(event, arg, tok);
1634 }
1635
1636 return type;
1637}
1638
1639static enum event_type
1640process_cond(struct event_format *event, struct print_arg *top, char **tok)
1641{
1642 struct print_arg *arg, *left, *right;
1643 enum event_type type;
1644 char *token = NULL;
1645
1646 arg = alloc_arg();
1647 left = alloc_arg();
1648 right = alloc_arg();
1649
1650 if (!arg || !left || !right) {
1651 do_warning_event(event, "%s: not enough memory!", __func__);
1652 /* arg will be freed at out_free */
1653 free_arg(left);
1654 free_arg(right);
1655 goto out_free;
1656 }
1657
1658 arg->type = PRINT_OP;
1659 arg->op.left = left;
1660 arg->op.right = right;
1661
1662 *tok = NULL;
1663 type = process_arg(event, left, &token);
1664
1665 again:
1666 /* Handle other operations in the arguments */
1667 if (type == EVENT_OP && strcmp(token, ":") != 0) {
1668 type = process_op(event, left, &token);
1669 goto again;
1670 }
1671
1672 if (test_type_token(type, token, EVENT_OP, ":"))
1673 goto out_free;
1674
1675 arg->op.op = token;
1676
1677 type = process_arg(event, right, &token);
1678
1679 top->op.right = arg;
1680
1681 *tok = token;
1682 return type;
1683
1684out_free:
1685 /* Top may point to itself */
1686 top->op.right = NULL;
1687 free_token(token);
1688 free_arg(arg);
1689 return EVENT_ERROR;
1690}
1691
1692static enum event_type
1693process_array(struct event_format *event, struct print_arg *top, char **tok)
1694{
1695 struct print_arg *arg;
1696 enum event_type type;
1697 char *token = NULL;
1698
1699 arg = alloc_arg();
1700 if (!arg) {
1701 do_warning_event(event, "%s: not enough memory!", __func__);
1702 /* '*tok' is set to top->op.op. No need to free. */
1703 *tok = NULL;
1704 return EVENT_ERROR;
1705 }
1706
1707 *tok = NULL;
1708 type = process_arg(event, arg, &token);
1709 if (test_type_token(type, token, EVENT_OP, "]"))
1710 goto out_free;
1711
1712 top->op.right = arg;
1713
1714 free_token(token);
1715 type = read_token_item(&token);
1716 *tok = token;
1717
1718 return type;
1719
1720out_free:
1721 free_token(token);
1722 free_arg(arg);
1723 return EVENT_ERROR;
1724}
1725
1726static int get_op_prio(char *op)
1727{
1728 if (!op[1]) {
1729 switch (op[0]) {
1730 case '~':
1731 case '!':
1732 return 4;
1733 case '*':
1734 case '/':
1735 case '%':
1736 return 6;
1737 case '+':
1738 case '-':
1739 return 7;
1740 /* '>>' and '<<' are 8 */
1741 case '<':
1742 case '>':
1743 return 9;
1744 /* '==' and '!=' are 10 */
1745 case '&':
1746 return 11;
1747 case '^':
1748 return 12;
1749 case '|':
1750 return 13;
1751 case '?':
1752 return 16;
1753 default:
1754 do_warning("unknown op '%c'", op[0]);
1755 return -1;
1756 }
1757 } else {
1758 if (strcmp(op, "++") == 0 ||
1759 strcmp(op, "--") == 0) {
1760 return 3;
1761 } else if (strcmp(op, ">>") == 0 ||
1762 strcmp(op, "<<") == 0) {
1763 return 8;
1764 } else if (strcmp(op, ">=") == 0 ||
1765 strcmp(op, "<=") == 0) {
1766 return 9;
1767 } else if (strcmp(op, "==") == 0 ||
1768 strcmp(op, "!=") == 0) {
1769 return 10;
1770 } else if (strcmp(op, "&&") == 0) {
1771 return 14;
1772 } else if (strcmp(op, "||") == 0) {
1773 return 15;
1774 } else {
1775 do_warning("unknown op '%s'", op);
1776 return -1;
1777 }
1778 }
1779}
1780
1781static int set_op_prio(struct print_arg *arg)
1782{
1783
1784 /* single ops are the greatest */
1785 if (!arg->op.left || arg->op.left->type == PRINT_NULL)
1786 arg->op.prio = 0;
1787 else
1788 arg->op.prio = get_op_prio(arg->op.op);
1789
1790 return arg->op.prio;
1791}
1792
1793/* Note, *tok does not get freed, but will most likely be saved */
1794static enum event_type
1795process_op(struct event_format *event, struct print_arg *arg, char **tok)
1796{
1797 struct print_arg *left, *right = NULL;
1798 enum event_type type;
1799 char *token;
1800
1801 /* the op is passed in via tok */
1802 token = *tok;
1803
1804 if (arg->type == PRINT_OP && !arg->op.left) {
1805 /* handle single op */
1806 if (token[1]) {
1807 do_warning_event(event, "bad op token %s", token);
1808 goto out_free;
1809 }
1810 switch (token[0]) {
1811 case '~':
1812 case '!':
1813 case '+':
1814 case '-':
1815 break;
1816 default:
1817 do_warning_event(event, "bad op token %s", token);
1818 goto out_free;
1819
1820 }
1821
1822 /* make an empty left */
1823 left = alloc_arg();
1824 if (!left)
1825 goto out_warn_free;
1826
1827 left->type = PRINT_NULL;
1828 arg->op.left = left;
1829
1830 right = alloc_arg();
1831 if (!right)
1832 goto out_warn_free;
1833
1834 arg->op.right = right;
1835
1836 /* do not free the token, it belongs to an op */
1837 *tok = NULL;
1838 type = process_arg(event, right, tok);
1839
1840 } else if (strcmp(token, "?") == 0) {
1841
1842 left = alloc_arg();
1843 if (!left)
1844 goto out_warn_free;
1845
1846 /* copy the top arg to the left */
1847 *left = *arg;
1848
1849 arg->type = PRINT_OP;
1850 arg->op.op = token;
1851 arg->op.left = left;
1852 arg->op.prio = 0;
1853
1854 /* it will set arg->op.right */
1855 type = process_cond(event, arg, tok);
1856
1857 } else if (strcmp(token, ">>") == 0 ||
1858 strcmp(token, "<<") == 0 ||
1859 strcmp(token, "&") == 0 ||
1860 strcmp(token, "|") == 0 ||
1861 strcmp(token, "&&") == 0 ||
1862 strcmp(token, "||") == 0 ||
1863 strcmp(token, "-") == 0 ||
1864 strcmp(token, "+") == 0 ||
1865 strcmp(token, "*") == 0 ||
1866 strcmp(token, "^") == 0 ||
1867 strcmp(token, "/") == 0 ||
1868 strcmp(token, "<") == 0 ||
1869 strcmp(token, ">") == 0 ||
1870 strcmp(token, "<=") == 0 ||
1871 strcmp(token, ">=") == 0 ||
1872 strcmp(token, "==") == 0 ||
1873 strcmp(token, "!=") == 0) {
1874
1875 left = alloc_arg();
1876 if (!left)
1877 goto out_warn_free;
1878
1879 /* copy the top arg to the left */
1880 *left = *arg;
1881
1882 arg->type = PRINT_OP;
1883 arg->op.op = token;
1884 arg->op.left = left;
1885 arg->op.right = NULL;
1886
1887 if (set_op_prio(arg) == -1) {
1888 event->flags |= EVENT_FL_FAILED;
1889 /* arg->op.op (= token) will be freed at out_free */
1890 arg->op.op = NULL;
1891 goto out_free;
1892 }
1893
1894 type = read_token_item(&token);
1895 *tok = token;
1896
1897 /* could just be a type pointer */
1898 if ((strcmp(arg->op.op, "*") == 0) &&
1899 type == EVENT_DELIM && (strcmp(token, ")") == 0)) {
1900 char *new_atom;
1901
1902 if (left->type != PRINT_ATOM) {
1903 do_warning_event(event, "bad pointer type");
1904 goto out_free;
1905 }
1906 new_atom = realloc(left->atom.atom,
1907 strlen(left->atom.atom) + 3);
1908 if (!new_atom)
1909 goto out_warn_free;
1910
1911 left->atom.atom = new_atom;
1912 strcat(left->atom.atom, " *");
1913 free(arg->op.op);
1914 *arg = *left;
1915 free(left);
1916
1917 return type;
1918 }
1919
1920 right = alloc_arg();
1921 if (!right)
1922 goto out_warn_free;
1923
1924 type = process_arg_token(event, right, tok, type);
1925 arg->op.right = right;
1926
1927 } else if (strcmp(token, "[") == 0) {
1928
1929 left = alloc_arg();
1930 if (!left)
1931 goto out_warn_free;
1932
1933 *left = *arg;
1934
1935 arg->type = PRINT_OP;
1936 arg->op.op = token;
1937 arg->op.left = left;
1938
1939 arg->op.prio = 0;
1940
1941 /* it will set arg->op.right */
1942 type = process_array(event, arg, tok);
1943
1944 } else {
1945 do_warning_event(event, "unknown op '%s'", token);
1946 event->flags |= EVENT_FL_FAILED;
1947 /* the arg is now the left side */
1948 goto out_free;
1949 }
1950
1951 if (type == EVENT_OP && strcmp(*tok, ":") != 0) {
1952 int prio;
1953
1954 /* higher prios need to be closer to the root */
1955 prio = get_op_prio(*tok);
1956
1957 if (prio > arg->op.prio)
1958 return process_op(event, arg, tok);
1959
1960 return process_op(event, right, tok);
1961 }
1962
1963 return type;
1964
1965out_warn_free:
1966 do_warning_event(event, "%s: not enough memory!", __func__);
1967out_free:
1968 free_token(token);
1969 *tok = NULL;
1970 return EVENT_ERROR;
1971}
1972
1973static enum event_type
1974process_entry(struct event_format *event __maybe_unused, struct print_arg *arg,
1975 char **tok)
1976{
1977 enum event_type type;
1978 char *field;
1979 char *token;
1980
1981 if (read_expected(EVENT_OP, "->") < 0)
1982 goto out_err;
1983
1984 if (read_expect_type(EVENT_ITEM, &token) < 0)
1985 goto out_free;
1986 field = token;
1987
1988 arg->type = PRINT_FIELD;
1989 arg->field.name = field;
1990
1991 if (is_flag_field) {
1992 arg->field.field = pevent_find_any_field(event, arg->field.name);
1993 arg->field.field->flags |= FIELD_IS_FLAG;
1994 is_flag_field = 0;
1995 } else if (is_symbolic_field) {
1996 arg->field.field = pevent_find_any_field(event, arg->field.name);
1997 arg->field.field->flags |= FIELD_IS_SYMBOLIC;
1998 is_symbolic_field = 0;
1999 }
2000
2001 type = read_token(&token);
2002 *tok = token;
2003
2004 return type;
2005
2006 out_free:
2007 free_token(token);
2008 out_err:
2009 *tok = NULL;
2010 return EVENT_ERROR;
2011}
2012
2013static char *arg_eval (struct print_arg *arg);
2014
2015static unsigned long long
2016eval_type_str(unsigned long long val, const char *type, int pointer)
2017{
2018 int sign = 0;
2019 char *ref;
2020 int len;
2021
2022 len = strlen(type);
2023
2024 if (pointer) {
2025
2026 if (type[len-1] != '*') {
2027 do_warning("pointer expected with non pointer type");
2028 return val;
2029 }
2030
2031 ref = malloc(len);
2032 if (!ref) {
2033 do_warning("%s: not enough memory!", __func__);
2034 return val;
2035 }
2036 memcpy(ref, type, len);
2037
2038 /* chop off the " *" */
2039 ref[len - 2] = 0;
2040
2041 val = eval_type_str(val, ref, 0);
2042 free(ref);
2043 return val;
2044 }
2045
2046 /* check if this is a pointer */
2047 if (type[len - 1] == '*')
2048 return val;
2049
2050 /* Try to figure out the arg size*/
2051 if (strncmp(type, "struct", 6) == 0)
2052 /* all bets off */
2053 return val;
2054
2055 if (strcmp(type, "u8") == 0)
2056 return val & 0xff;
2057
2058 if (strcmp(type, "u16") == 0)
2059 return val & 0xffff;
2060
2061 if (strcmp(type, "u32") == 0)
2062 return val & 0xffffffff;
2063
2064 if (strcmp(type, "u64") == 0 ||
2065 strcmp(type, "s64"))
2066 return val;
2067
2068 if (strcmp(type, "s8") == 0)
2069 return (unsigned long long)(char)val & 0xff;
2070
2071 if (strcmp(type, "s16") == 0)
2072 return (unsigned long long)(short)val & 0xffff;
2073
2074 if (strcmp(type, "s32") == 0)
2075 return (unsigned long long)(int)val & 0xffffffff;
2076
2077 if (strncmp(type, "unsigned ", 9) == 0) {
2078 sign = 0;
2079 type += 9;
2080 }
2081
2082 if (strcmp(type, "char") == 0) {
2083 if (sign)
2084 return (unsigned long long)(char)val & 0xff;
2085 else
2086 return val & 0xff;
2087 }
2088
2089 if (strcmp(type, "short") == 0) {
2090 if (sign)
2091 return (unsigned long long)(short)val & 0xffff;
2092 else
2093 return val & 0xffff;
2094 }
2095
2096 if (strcmp(type, "int") == 0) {
2097 if (sign)
2098 return (unsigned long long)(int)val & 0xffffffff;
2099 else
2100 return val & 0xffffffff;
2101 }
2102
2103 return val;
2104}
2105
2106/*
2107 * Try to figure out the type.
2108 */
2109static unsigned long long
2110eval_type(unsigned long long val, struct print_arg *arg, int pointer)
2111{
2112 if (arg->type != PRINT_TYPE) {
2113 do_warning("expected type argument");
2114 return 0;
2115 }
2116
2117 return eval_type_str(val, arg->typecast.type, pointer);
2118}
2119
2120static int arg_num_eval(struct print_arg *arg, long long *val)
2121{
2122 long long left, right;
2123 int ret = 1;
2124
2125 switch (arg->type) {
2126 case PRINT_ATOM:
2127 *val = strtoll(arg->atom.atom, NULL, 0);
2128 break;
2129 case PRINT_TYPE:
2130 ret = arg_num_eval(arg->typecast.item, val);
2131 if (!ret)
2132 break;
2133 *val = eval_type(*val, arg, 0);
2134 break;
2135 case PRINT_OP:
2136 switch (arg->op.op[0]) {
2137 case '|':
2138 ret = arg_num_eval(arg->op.left, &left);
2139 if (!ret)
2140 break;
2141 ret = arg_num_eval(arg->op.right, &right);
2142 if (!ret)
2143 break;
2144 if (arg->op.op[1])
2145 *val = left || right;
2146 else
2147 *val = left | right;
2148 break;
2149 case '&':
2150 ret = arg_num_eval(arg->op.left, &left);
2151 if (!ret)
2152 break;
2153 ret = arg_num_eval(arg->op.right, &right);
2154 if (!ret)
2155 break;
2156 if (arg->op.op[1])
2157 *val = left && right;
2158 else
2159 *val = left & right;
2160 break;
2161 case '<':
2162 ret = arg_num_eval(arg->op.left, &left);
2163 if (!ret)
2164 break;
2165 ret = arg_num_eval(arg->op.right, &right);
2166 if (!ret)
2167 break;
2168 switch (arg->op.op[1]) {
2169 case 0:
2170 *val = left < right;
2171 break;
2172 case '<':
2173 *val = left << right;
2174 break;
2175 case '=':
2176 *val = left <= right;
2177 break;
2178 default:
2179 do_warning("unknown op '%s'", arg->op.op);
2180 ret = 0;
2181 }
2182 break;
2183 case '>':
2184 ret = arg_num_eval(arg->op.left, &left);
2185 if (!ret)
2186 break;
2187 ret = arg_num_eval(arg->op.right, &right);
2188 if (!ret)
2189 break;
2190 switch (arg->op.op[1]) {
2191 case 0:
2192 *val = left > right;
2193 break;
2194 case '>':
2195 *val = left >> right;
2196 break;
2197 case '=':
2198 *val = left >= right;
2199 break;
2200 default:
2201 do_warning("unknown op '%s'", arg->op.op);
2202 ret = 0;
2203 }
2204 break;
2205 case '=':
2206 ret = arg_num_eval(arg->op.left, &left);
2207 if (!ret)
2208 break;
2209 ret = arg_num_eval(arg->op.right, &right);
2210 if (!ret)
2211 break;
2212
2213 if (arg->op.op[1] != '=') {
2214 do_warning("unknown op '%s'", arg->op.op);
2215 ret = 0;
2216 } else
2217 *val = left == right;
2218 break;
2219 case '!':
2220 ret = arg_num_eval(arg->op.left, &left);
2221 if (!ret)
2222 break;
2223 ret = arg_num_eval(arg->op.right, &right);
2224 if (!ret)
2225 break;
2226
2227 switch (arg->op.op[1]) {
2228 case '=':
2229 *val = left != right;
2230 break;
2231 default:
2232 do_warning("unknown op '%s'", arg->op.op);
2233 ret = 0;
2234 }
2235 break;
2236 case '-':
2237 /* check for negative */
2238 if (arg->op.left->type == PRINT_NULL)
2239 left = 0;
2240 else
2241 ret = arg_num_eval(arg->op.left, &left);
2242 if (!ret)
2243 break;
2244 ret = arg_num_eval(arg->op.right, &right);
2245 if (!ret)
2246 break;
2247 *val = left - right;
2248 break;
2249 case '+':
2250 if (arg->op.left->type == PRINT_NULL)
2251 left = 0;
2252 else
2253 ret = arg_num_eval(arg->op.left, &left);
2254 if (!ret)
2255 break;
2256 ret = arg_num_eval(arg->op.right, &right);
2257 if (!ret)
2258 break;
2259 *val = left + right;
2260 break;
2261 default:
2262 do_warning("unknown op '%s'", arg->op.op);
2263 ret = 0;
2264 }
2265 break;
2266
2267 case PRINT_NULL:
2268 case PRINT_FIELD ... PRINT_SYMBOL:
2269 case PRINT_STRING:
2270 case PRINT_BSTRING:
2271 default:
2272 do_warning("invalid eval type %d", arg->type);
2273 ret = 0;
2274
2275 }
2276 return ret;
2277}
2278
2279static char *arg_eval (struct print_arg *arg)
2280{
2281 long long val;
2282 static char buf[20];
2283
2284 switch (arg->type) {
2285 case PRINT_ATOM:
2286 return arg->atom.atom;
2287 case PRINT_TYPE:
2288 return arg_eval(arg->typecast.item);
2289 case PRINT_OP:
2290 if (!arg_num_eval(arg, &val))
2291 break;
2292 sprintf(buf, "%lld", val);
2293 return buf;
2294
2295 case PRINT_NULL:
2296 case PRINT_FIELD ... PRINT_SYMBOL:
2297 case PRINT_STRING:
2298 case PRINT_BSTRING:
2299 default:
2300 do_warning("invalid eval type %d", arg->type);
2301 break;
2302 }
2303
2304 return NULL;
2305}
2306
2307static enum event_type
2308process_fields(struct event_format *event, struct print_flag_sym **list, char **tok)
2309{
2310 enum event_type type;
2311 struct print_arg *arg = NULL;
2312 struct print_flag_sym *field;
2313 char *token = *tok;
2314 char *value;
2315
2316 do {
2317 free_token(token);
2318 type = read_token_item(&token);
2319 if (test_type_token(type, token, EVENT_OP, "{"))
2320 break;
2321
2322 arg = alloc_arg();
2323 if (!arg)
2324 goto out_free;
2325
2326 free_token(token);
2327 type = process_arg(event, arg, &token);
2328
2329 if (type == EVENT_OP)
2330 type = process_op(event, arg, &token);
2331
2332 if (type == EVENT_ERROR)
2333 goto out_free;
2334
2335 if (test_type_token(type, token, EVENT_DELIM, ","))
2336 goto out_free;
2337
2338 field = calloc(1, sizeof(*field));
2339 if (!field)
2340 goto out_free;
2341
2342 value = arg_eval(arg);
2343 if (value == NULL)
2344 goto out_free_field;
2345 field->value = strdup(value);
2346 if (field->value == NULL)
2347 goto out_free_field;
2348
2349 free_arg(arg);
2350 arg = alloc_arg();
2351 if (!arg)
2352 goto out_free;
2353
2354 free_token(token);
2355 type = process_arg(event, arg, &token);
2356 if (test_type_token(type, token, EVENT_OP, "}"))
2357 goto out_free_field;
2358
2359 value = arg_eval(arg);
2360 if (value == NULL)
2361 goto out_free_field;
2362 field->str = strdup(value);
2363 if (field->str == NULL)
2364 goto out_free_field;
2365 free_arg(arg);
2366 arg = NULL;
2367
2368 *list = field;
2369 list = &field->next;
2370
2371 free_token(token);
2372 type = read_token_item(&token);
2373 } while (type == EVENT_DELIM && strcmp(token, ",") == 0);
2374
2375 *tok = token;
2376 return type;
2377
2378out_free_field:
2379 free_flag_sym(field);
2380out_free:
2381 free_arg(arg);
2382 free_token(token);
2383 *tok = NULL;
2384
2385 return EVENT_ERROR;
2386}
2387
2388static enum event_type
2389process_flags(struct event_format *event, struct print_arg *arg, char **tok)
2390{
2391 struct print_arg *field;
2392 enum event_type type;
2393 char *token;
2394
2395 memset(arg, 0, sizeof(*arg));
2396 arg->type = PRINT_FLAGS;
2397
2398 field = alloc_arg();
2399 if (!field) {
2400 do_warning_event(event, "%s: not enough memory!", __func__);
2401 goto out_free;
2402 }
2403
2404 type = process_field_arg(event, field, &token);
2405
2406 /* Handle operations in the first argument */
2407 while (type == EVENT_OP)
2408 type = process_op(event, field, &token);
2409
2410 if (test_type_token(type, token, EVENT_DELIM, ","))
2411 goto out_free_field;
2412 free_token(token);
2413
2414 arg->flags.field = field;
2415
2416 type = read_token_item(&token);
2417 if (event_item_type(type)) {
2418 arg->flags.delim = token;
2419 type = read_token_item(&token);
2420 }
2421
2422 if (test_type_token(type, token, EVENT_DELIM, ","))
2423 goto out_free;
2424
2425 type = process_fields(event, &arg->flags.flags, &token);
2426 if (test_type_token(type, token, EVENT_DELIM, ")"))
2427 goto out_free;
2428
2429 free_token(token);
2430 type = read_token_item(tok);
2431 return type;
2432
2433out_free_field:
2434 free_arg(field);
2435out_free:
2436 free_token(token);
2437 *tok = NULL;
2438 return EVENT_ERROR;
2439}
2440
2441static enum event_type
2442process_symbols(struct event_format *event, struct print_arg *arg, char **tok)
2443{
2444 struct print_arg *field;
2445 enum event_type type;
2446 char *token;
2447
2448 memset(arg, 0, sizeof(*arg));
2449 arg->type = PRINT_SYMBOL;
2450
2451 field = alloc_arg();
2452 if (!field) {
2453 do_warning_event(event, "%s: not enough memory!", __func__);
2454 goto out_free;
2455 }
2456
2457 type = process_field_arg(event, field, &token);
2458
2459 if (test_type_token(type, token, EVENT_DELIM, ","))
2460 goto out_free_field;
2461
2462 arg->symbol.field = field;
2463
2464 type = process_fields(event, &arg->symbol.symbols, &token);
2465 if (test_type_token(type, token, EVENT_DELIM, ")"))
2466 goto out_free;
2467
2468 free_token(token);
2469 type = read_token_item(tok);
2470 return type;
2471
2472out_free_field:
2473 free_arg(field);
2474out_free:
2475 free_token(token);
2476 *tok = NULL;
2477 return EVENT_ERROR;
2478}
2479
2480static enum event_type
2481process_hex(struct event_format *event, struct print_arg *arg, char **tok)
2482{
2483 struct print_arg *field;
2484 enum event_type type;
2485 char *token;
2486
2487 memset(arg, 0, sizeof(*arg));
2488 arg->type = PRINT_HEX;
2489
2490 field = alloc_arg();
2491 if (!field) {
2492 do_warning_event(event, "%s: not enough memory!", __func__);
2493 goto out_free;
2494 }
2495
2496 type = process_arg(event, field, &token);
2497
2498 if (test_type_token(type, token, EVENT_DELIM, ","))
2499 goto out_free;
2500
2501 arg->hex.field = field;
2502
2503 free_token(token);
2504
2505 field = alloc_arg();
2506 if (!field) {
2507 do_warning_event(event, "%s: not enough memory!", __func__);
2508 *tok = NULL;
2509 return EVENT_ERROR;
2510 }
2511
2512 type = process_arg(event, field, &token);
2513
2514 if (test_type_token(type, token, EVENT_DELIM, ")"))
2515 goto out_free;
2516
2517 arg->hex.size = field;
2518
2519 free_token(token);
2520 type = read_token_item(tok);
2521 return type;
2522
2523 out_free:
2524 free_arg(field);
2525 free_token(token);
2526 *tok = NULL;
2527 return EVENT_ERROR;
2528}
2529
2530static enum event_type
2531process_dynamic_array(struct event_format *event, struct print_arg *arg, char **tok)
2532{
2533 struct format_field *field;
2534 enum event_type type;
2535 char *token;
2536
2537 memset(arg, 0, sizeof(*arg));
2538 arg->type = PRINT_DYNAMIC_ARRAY;
2539
2540 /*
2541 * The item within the parenthesis is another field that holds
2542 * the index into where the array starts.
2543 */
2544 type = read_token(&token);
2545 *tok = token;
2546 if (type != EVENT_ITEM)
2547 goto out_free;
2548
2549 /* Find the field */
2550
2551 field = pevent_find_field(event, token);
2552 if (!field)
2553 goto out_free;
2554
2555 arg->dynarray.field = field;
2556 arg->dynarray.index = 0;
2557
2558 if (read_expected(EVENT_DELIM, ")") < 0)
2559 goto out_free;
2560
2561 free_token(token);
2562 type = read_token_item(&token);
2563 *tok = token;
2564 if (type != EVENT_OP || strcmp(token, "[") != 0)
2565 return type;
2566
2567 free_token(token);
2568 arg = alloc_arg();
2569 if (!arg) {
2570 do_warning_event(event, "%s: not enough memory!", __func__);
2571 *tok = NULL;
2572 return EVENT_ERROR;
2573 }
2574
2575 type = process_arg(event, arg, &token);
2576 if (type == EVENT_ERROR)
2577 goto out_free_arg;
2578
2579 if (!test_type_token(type, token, EVENT_OP, "]"))
2580 goto out_free_arg;
2581
2582 free_token(token);
2583 type = read_token_item(tok);
2584 return type;
2585
2586 out_free_arg:
2587 free_arg(arg);
2588 out_free:
2589 free_token(token);
2590 *tok = NULL;
2591 return EVENT_ERROR;
2592}
2593
2594static enum event_type
2595process_paren(struct event_format *event, struct print_arg *arg, char **tok)
2596{
2597 struct print_arg *item_arg;
2598 enum event_type type;
2599 char *token;
2600
2601 type = process_arg(event, arg, &token);
2602
2603 if (type == EVENT_ERROR)
2604 goto out_free;
2605
2606 if (type == EVENT_OP)
2607 type = process_op(event, arg, &token);
2608
2609 if (type == EVENT_ERROR)
2610 goto out_free;
2611
2612 if (test_type_token(type, token, EVENT_DELIM, ")"))
2613 goto out_free;
2614
2615 free_token(token);
2616 type = read_token_item(&token);
2617
2618 /*
2619 * If the next token is an item or another open paren, then
2620 * this was a typecast.
2621 */
2622 if (event_item_type(type) ||
2623 (type == EVENT_DELIM && strcmp(token, "(") == 0)) {
2624
2625 /* make this a typecast and contine */
2626
2627 /* prevous must be an atom */
2628 if (arg->type != PRINT_ATOM) {
2629 do_warning_event(event, "previous needed to be PRINT_ATOM");
2630 goto out_free;
2631 }
2632
2633 item_arg = alloc_arg();
2634 if (!item_arg) {
2635 do_warning_event(event, "%s: not enough memory!",
2636 __func__);
2637 goto out_free;
2638 }
2639
2640 arg->type = PRINT_TYPE;
2641 arg->typecast.type = arg->atom.atom;
2642 arg->typecast.item = item_arg;
2643 type = process_arg_token(event, item_arg, &token, type);
2644
2645 }
2646
2647 *tok = token;
2648 return type;
2649
2650 out_free:
2651 free_token(token);
2652 *tok = NULL;
2653 return EVENT_ERROR;
2654}
2655
2656
2657static enum event_type
2658process_str(struct event_format *event __maybe_unused, struct print_arg *arg,
2659 char **tok)
2660{
2661 enum event_type type;
2662 char *token;
2663
2664 if (read_expect_type(EVENT_ITEM, &token) < 0)
2665 goto out_free;
2666
2667 arg->type = PRINT_STRING;
2668 arg->string.string = token;
2669 arg->string.offset = -1;
2670
2671 if (read_expected(EVENT_DELIM, ")") < 0)
2672 goto out_err;
2673
2674 type = read_token(&token);
2675 *tok = token;
2676
2677 return type;
2678
2679 out_free:
2680 free_token(token);
2681 out_err:
2682 *tok = NULL;
2683 return EVENT_ERROR;
2684}
2685
2686static struct pevent_function_handler *
2687find_func_handler(struct pevent *pevent, char *func_name)
2688{
2689 struct pevent_function_handler *func;
2690
2691 if (!pevent)
2692 return NULL;
2693
2694 for (func = pevent->func_handlers; func; func = func->next) {
2695 if (strcmp(func->name, func_name) == 0)
2696 break;
2697 }
2698
2699 return func;
2700}
2701
2702static void remove_func_handler(struct pevent *pevent, char *func_name)
2703{
2704 struct pevent_function_handler *func;
2705 struct pevent_function_handler **next;
2706
2707 next = &pevent->func_handlers;
2708 while ((func = *next)) {
2709 if (strcmp(func->name, func_name) == 0) {
2710 *next = func->next;
2711 free_func_handle(func);
2712 break;
2713 }
2714 next = &func->next;
2715 }
2716}
2717
2718static enum event_type
2719process_func_handler(struct event_format *event, struct pevent_function_handler *func,
2720 struct print_arg *arg, char **tok)
2721{
2722 struct print_arg **next_arg;
2723 struct print_arg *farg;
2724 enum event_type type;
2725 char *token;
2726 int i;
2727
2728 arg->type = PRINT_FUNC;
2729 arg->func.func = func;
2730
2731 *tok = NULL;
2732
2733 next_arg = &(arg->func.args);
2734 for (i = 0; i < func->nr_args; i++) {
2735 farg = alloc_arg();
2736 if (!farg) {
2737 do_warning_event(event, "%s: not enough memory!",
2738 __func__);
2739 return EVENT_ERROR;
2740 }
2741
2742 type = process_arg(event, farg, &token);
2743 if (i < (func->nr_args - 1)) {
2744 if (type != EVENT_DELIM || strcmp(token, ",") != 0) {
2745 do_warning_event(event,
2746 "Error: function '%s()' expects %d arguments but event %s only uses %d",
2747 func->name, func->nr_args,
2748 event->name, i + 1);
2749 goto err;
2750 }
2751 } else {
2752 if (type != EVENT_DELIM || strcmp(token, ")") != 0) {
2753 do_warning_event(event,
2754 "Error: function '%s()' only expects %d arguments but event %s has more",
2755 func->name, func->nr_args, event->name);
2756 goto err;
2757 }
2758 }
2759
2760 *next_arg = farg;
2761 next_arg = &(farg->next);
2762 free_token(token);
2763 }
2764
2765 type = read_token(&token);
2766 *tok = token;
2767
2768 return type;
2769
2770err:
2771 free_arg(farg);
2772 free_token(token);
2773 return EVENT_ERROR;
2774}
2775
2776static enum event_type
2777process_function(struct event_format *event, struct print_arg *arg,
2778 char *token, char **tok)
2779{
2780 struct pevent_function_handler *func;
2781
2782 if (strcmp(token, "__print_flags") == 0) {
2783 free_token(token);
2784 is_flag_field = 1;
2785 return process_flags(event, arg, tok);
2786 }
2787 if (strcmp(token, "__print_symbolic") == 0) {
2788 free_token(token);
2789 is_symbolic_field = 1;
2790 return process_symbols(event, arg, tok);
2791 }
2792 if (strcmp(token, "__print_hex") == 0) {
2793 free_token(token);
2794 return process_hex(event, arg, tok);
2795 }
2796 if (strcmp(token, "__get_str") == 0) {
2797 free_token(token);
2798 return process_str(event, arg, tok);
2799 }
2800 if (strcmp(token, "__get_dynamic_array") == 0) {
2801 free_token(token);
2802 return process_dynamic_array(event, arg, tok);
2803 }
2804
2805 func = find_func_handler(event->pevent, token);
2806 if (func) {
2807 free_token(token);
2808 return process_func_handler(event, func, arg, tok);
2809 }
2810
2811 do_warning_event(event, "function %s not defined", token);
2812 free_token(token);
2813 return EVENT_ERROR;
2814}
2815
2816static enum event_type
2817process_arg_token(struct event_format *event, struct print_arg *arg,
2818 char **tok, enum event_type type)
2819{
2820 char *token;
2821 char *atom;
2822
2823 token = *tok;
2824
2825 switch (type) {
2826 case EVENT_ITEM:
2827 if (strcmp(token, "REC") == 0) {
2828 free_token(token);
2829 type = process_entry(event, arg, &token);
2830 break;
2831 }
2832 atom = token;
2833 /* test the next token */
2834 type = read_token_item(&token);
2835
2836 /*
2837 * If the next token is a parenthesis, then this
2838 * is a function.
2839 */
2840 if (type == EVENT_DELIM && strcmp(token, "(") == 0) {
2841 free_token(token);
2842 token = NULL;
2843 /* this will free atom. */
2844 type = process_function(event, arg, atom, &token);
2845 break;
2846 }
2847 /* atoms can be more than one token long */
2848 while (type == EVENT_ITEM) {
2849 char *new_atom;
2850 new_atom = realloc(atom,
2851 strlen(atom) + strlen(token) + 2);
2852 if (!new_atom) {
2853 free(atom);
2854 *tok = NULL;
2855 free_token(token);
2856 return EVENT_ERROR;
2857 }
2858 atom = new_atom;
2859 strcat(atom, " ");
2860 strcat(atom, token);
2861 free_token(token);
2862 type = read_token_item(&token);
2863 }
2864
2865 arg->type = PRINT_ATOM;
2866 arg->atom.atom = atom;
2867 break;
2868
2869 case EVENT_DQUOTE:
2870 case EVENT_SQUOTE:
2871 arg->type = PRINT_ATOM;
2872 arg->atom.atom = token;
2873 type = read_token_item(&token);
2874 break;
2875 case EVENT_DELIM:
2876 if (strcmp(token, "(") == 0) {
2877 free_token(token);
2878 type = process_paren(event, arg, &token);
2879 break;
2880 }
2881 case EVENT_OP:
2882 /* handle single ops */
2883 arg->type = PRINT_OP;
2884 arg->op.op = token;
2885 arg->op.left = NULL;
2886 type = process_op(event, arg, &token);
2887
2888 /* On error, the op is freed */
2889 if (type == EVENT_ERROR)
2890 arg->op.op = NULL;
2891
2892 /* return error type if errored */
2893 break;
2894
2895 case EVENT_ERROR ... EVENT_NEWLINE:
2896 default:
2897 do_warning_event(event, "unexpected type %d", type);
2898 return EVENT_ERROR;
2899 }
2900 *tok = token;
2901
2902 return type;
2903}
2904
2905static int event_read_print_args(struct event_format *event, struct print_arg **list)
2906{
2907 enum event_type type = EVENT_ERROR;
2908 struct print_arg *arg;
2909 char *token;
2910 int args = 0;
2911
2912 do {
2913 if (type == EVENT_NEWLINE) {
2914 type = read_token_item(&token);
2915 continue;
2916 }
2917
2918 arg = alloc_arg();
2919 if (!arg) {
2920 do_warning_event(event, "%s: not enough memory!",
2921 __func__);
2922 return -1;
2923 }
2924
2925 type = process_arg(event, arg, &token);
2926
2927 if (type == EVENT_ERROR) {
2928 free_token(token);
2929 free_arg(arg);
2930 return -1;
2931 }
2932
2933 *list = arg;
2934 args++;
2935
2936 if (type == EVENT_OP) {
2937 type = process_op(event, arg, &token);
2938 free_token(token);
2939 if (type == EVENT_ERROR) {
2940 *list = NULL;
2941 free_arg(arg);
2942 return -1;
2943 }
2944 list = &arg->next;
2945 continue;
2946 }
2947
2948 if (type == EVENT_DELIM && strcmp(token, ",") == 0) {
2949 free_token(token);
2950 *list = arg;
2951 list = &arg->next;
2952 continue;
2953 }
2954 break;
2955 } while (type != EVENT_NONE);
2956
2957 if (type != EVENT_NONE && type != EVENT_ERROR)
2958 free_token(token);
2959
2960 return args;
2961}
2962
2963static int event_read_print(struct event_format *event)
2964{
2965 enum event_type type;
2966 char *token;
2967 int ret;
2968
2969 if (read_expected_item(EVENT_ITEM, "print") < 0)
2970 return -1;
2971
2972 if (read_expected(EVENT_ITEM, "fmt") < 0)
2973 return -1;
2974
2975 if (read_expected(EVENT_OP, ":") < 0)
2976 return -1;
2977
2978 if (read_expect_type(EVENT_DQUOTE, &token) < 0)
2979 goto fail;
2980
2981 concat:
2982 event->print_fmt.format = token;
2983 event->print_fmt.args = NULL;
2984
2985 /* ok to have no arg */
2986 type = read_token_item(&token);
2987
2988 if (type == EVENT_NONE)
2989 return 0;
2990
2991 /* Handle concatenation of print lines */
2992 if (type == EVENT_DQUOTE) {
2993 char *cat;
2994
2995 if (asprintf(&cat, "%s%s", event->print_fmt.format, token) < 0)
2996 goto fail;
2997 free_token(token);
2998 free_token(event->print_fmt.format);
2999 event->print_fmt.format = NULL;
3000 token = cat;
3001 goto concat;
3002 }
3003
3004 if (test_type_token(type, token, EVENT_DELIM, ","))
3005 goto fail;
3006
3007 free_token(token);
3008
3009 ret = event_read_print_args(event, &event->print_fmt.args);
3010 if (ret < 0)
3011 return -1;
3012
3013 return ret;
3014
3015 fail:
3016 free_token(token);
3017 return -1;
3018}
3019
3020/**
3021 * pevent_find_common_field - return a common field by event
3022 * @event: handle for the event
3023 * @name: the name of the common field to return
3024 *
3025 * Returns a common field from the event by the given @name.
3026 * This only searchs the common fields and not all field.
3027 */
3028struct format_field *
3029pevent_find_common_field(struct event_format *event, const char *name)
3030{
3031 struct format_field *format;
3032
3033 for (format = event->format.common_fields;
3034 format; format = format->next) {
3035 if (strcmp(format->name, name) == 0)
3036 break;
3037 }
3038
3039 return format;
3040}
3041
3042/**
3043 * pevent_find_field - find a non-common field
3044 * @event: handle for the event
3045 * @name: the name of the non-common field
3046 *
3047 * Returns a non-common field by the given @name.
3048 * This does not search common fields.
3049 */
3050struct format_field *
3051pevent_find_field(struct event_format *event, const char *name)
3052{
3053 struct format_field *format;
3054
3055 for (format = event->format.fields;
3056 format; format = format->next) {
3057 if (strcmp(format->name, name) == 0)
3058 break;
3059 }
3060
3061 return format;
3062}
3063
3064/**
3065 * pevent_find_any_field - find any field by name
3066 * @event: handle for the event
3067 * @name: the name of the field
3068 *
3069 * Returns a field by the given @name.
3070 * This searchs the common field names first, then
3071 * the non-common ones if a common one was not found.
3072 */
3073struct format_field *
3074pevent_find_any_field(struct event_format *event, const char *name)
3075{
3076 struct format_field *format;
3077
3078 format = pevent_find_common_field(event, name);
3079 if (format)
3080 return format;
3081 return pevent_find_field(event, name);
3082}
3083
3084/**
3085 * pevent_read_number - read a number from data
3086 * @pevent: handle for the pevent
3087 * @ptr: the raw data
3088 * @size: the size of the data that holds the number
3089 *
3090 * Returns the number (converted to host) from the
3091 * raw data.
3092 */
3093unsigned long long pevent_read_number(struct pevent *pevent,
3094 const void *ptr, int size)
3095{
3096 switch (size) {
3097 case 1:
3098 return *(unsigned char *)ptr;
3099 case 2:
3100 return data2host2(pevent, ptr);
3101 case 4:
3102 return data2host4(pevent, ptr);
3103 case 8:
3104 return data2host8(pevent, ptr);
3105 default:
3106 /* BUG! */
3107 return 0;
3108 }
3109}
3110
3111/**
3112 * pevent_read_number_field - read a number from data
3113 * @field: a handle to the field
3114 * @data: the raw data to read
3115 * @value: the value to place the number in
3116 *
3117 * Reads raw data according to a field offset and size,
3118 * and translates it into @value.
3119 *
3120 * Returns 0 on success, -1 otherwise.
3121 */
3122int pevent_read_number_field(struct format_field *field, const void *data,
3123 unsigned long long *value)
3124{
3125 if (!field)
3126 return -1;
3127 switch (field->size) {
3128 case 1:
3129 case 2:
3130 case 4:
3131 case 8:
3132 *value = pevent_read_number(field->event->pevent,
3133 data + field->offset, field->size);
3134 return 0;
3135 default:
3136 return -1;
3137 }
3138}
3139
3140static int get_common_info(struct pevent *pevent,
3141 const char *type, int *offset, int *size)
3142{
3143 struct event_format *event;
3144 struct format_field *field;
3145
3146 /*
3147 * All events should have the same common elements.
3148 * Pick any event to find where the type is;
3149 */
3150 if (!pevent->events) {
3151 do_warning("no event_list!");
3152 return -1;
3153 }
3154
3155 event = pevent->events[0];
3156 field = pevent_find_common_field(event, type);
3157 if (!field)
3158 return -1;
3159
3160 *offset = field->offset;
3161 *size = field->size;
3162
3163 return 0;
3164}
3165
3166static int __parse_common(struct pevent *pevent, void *data,
3167 int *size, int *offset, const char *name)
3168{
3169 int ret;
3170
3171 if (!*size) {
3172 ret = get_common_info(pevent, name, offset, size);
3173 if (ret < 0)
3174 return ret;
3175 }
3176 return pevent_read_number(pevent, data + *offset, *size);
3177}
3178
3179static int trace_parse_common_type(struct pevent *pevent, void *data)
3180{
3181 return __parse_common(pevent, data,
3182 &pevent->type_size, &pevent->type_offset,
3183 "common_type");
3184}
3185
3186static int parse_common_pid(struct pevent *pevent, void *data)
3187{
3188 return __parse_common(pevent, data,
3189 &pevent->pid_size, &pevent->pid_offset,
3190 "common_pid");
3191}
3192
3193static int parse_common_pc(struct pevent *pevent, void *data)
3194{
3195 return __parse_common(pevent, data,
3196 &pevent->pc_size, &pevent->pc_offset,
3197 "common_preempt_count");
3198}
3199
3200static int parse_common_flags(struct pevent *pevent, void *data)
3201{
3202 return __parse_common(pevent, data,
3203 &pevent->flags_size, &pevent->flags_offset,
3204 "common_flags");
3205}
3206
3207static int parse_common_lock_depth(struct pevent *pevent, void *data)
3208{
3209 return __parse_common(pevent, data,
3210 &pevent->ld_size, &pevent->ld_offset,
3211 "common_lock_depth");
3212}
3213
3214static int parse_common_migrate_disable(struct pevent *pevent, void *data)
3215{
3216 return __parse_common(pevent, data,
3217 &pevent->ld_size, &pevent->ld_offset,
3218 "common_migrate_disable");
3219}
3220
3221static int events_id_cmp(const void *a, const void *b);
3222
3223/**
3224 * pevent_find_event - find an event by given id
3225 * @pevent: a handle to the pevent
3226 * @id: the id of the event
3227 *
3228 * Returns an event that has a given @id.
3229 */
3230struct event_format *pevent_find_event(struct pevent *pevent, int id)
3231{
3232 struct event_format **eventptr;
3233 struct event_format key;
3234 struct event_format *pkey = &key;
3235
3236 /* Check cache first */
3237 if (pevent->last_event && pevent->last_event->id == id)
3238 return pevent->last_event;
3239
3240 key.id = id;
3241
3242 eventptr = bsearch(&pkey, pevent->events, pevent->nr_events,
3243 sizeof(*pevent->events), events_id_cmp);
3244
3245 if (eventptr) {
3246 pevent->last_event = *eventptr;
3247 return *eventptr;
3248 }
3249
3250 return NULL;
3251}
3252
3253/**
3254 * pevent_find_event_by_name - find an event by given name
3255 * @pevent: a handle to the pevent
3256 * @sys: the system name to search for
3257 * @name: the name of the event to search for
3258 *
3259 * This returns an event with a given @name and under the system
3260 * @sys. If @sys is NULL the first event with @name is returned.
3261 */
3262struct event_format *
3263pevent_find_event_by_name(struct pevent *pevent,
3264 const char *sys, const char *name)
3265{
3266 struct event_format *event;
3267 int i;
3268
3269 if (pevent->last_event &&
3270 strcmp(pevent->last_event->name, name) == 0 &&
3271 (!sys || strcmp(pevent->last_event->system, sys) == 0))
3272 return pevent->last_event;
3273
3274 for (i = 0; i < pevent->nr_events; i++) {
3275 event = pevent->events[i];
3276 if (strcmp(event->name, name) == 0) {
3277 if (!sys)
3278 break;
3279 if (strcmp(event->system, sys) == 0)
3280 break;
3281 }
3282 }
3283 if (i == pevent->nr_events)
3284 event = NULL;
3285
3286 pevent->last_event = event;
3287 return event;
3288}
3289
3290static unsigned long long
3291eval_num_arg(void *data, int size, struct event_format *event, struct print_arg *arg)
3292{
3293 struct pevent *pevent = event->pevent;
3294 unsigned long long val = 0;
3295 unsigned long long left, right;
3296 struct print_arg *typearg = NULL;
3297 struct print_arg *larg;
3298 unsigned long offset;
3299 unsigned int field_size;
3300
3301 switch (arg->type) {
3302 case PRINT_NULL:
3303 /* ?? */
3304 return 0;
3305 case PRINT_ATOM:
3306 return strtoull(arg->atom.atom, NULL, 0);
3307 case PRINT_FIELD:
3308 if (!arg->field.field) {
3309 arg->field.field = pevent_find_any_field(event, arg->field.name);
3310 if (!arg->field.field)
3311 goto out_warning_field;
3312
3313 }
3314 /* must be a number */
3315 val = pevent_read_number(pevent, data + arg->field.field->offset,
3316 arg->field.field->size);
3317 break;
3318 case PRINT_FLAGS:
3319 case PRINT_SYMBOL:
3320 case PRINT_HEX:
3321 break;
3322 case PRINT_TYPE:
3323 val = eval_num_arg(data, size, event, arg->typecast.item);
3324 return eval_type(val, arg, 0);
3325 case PRINT_STRING:
3326 case PRINT_BSTRING:
3327 return 0;
3328 case PRINT_FUNC: {
3329 struct trace_seq s;
3330 trace_seq_init(&s);
3331 val = process_defined_func(&s, data, size, event, arg);
3332 trace_seq_destroy(&s);
3333 return val;
3334 }
3335 case PRINT_OP:
3336 if (strcmp(arg->op.op, "[") == 0) {
3337 /*
3338 * Arrays are special, since we don't want
3339 * to read the arg as is.
3340 */
3341 right = eval_num_arg(data, size, event, arg->op.right);
3342
3343 /* handle typecasts */
3344 larg = arg->op.left;
3345 while (larg->type == PRINT_TYPE) {
3346 if (!typearg)
3347 typearg = larg;
3348 larg = larg->typecast.item;
3349 }
3350
3351 /* Default to long size */
3352 field_size = pevent->long_size;
3353
3354 switch (larg->type) {
3355 case PRINT_DYNAMIC_ARRAY:
3356 offset = pevent_read_number(pevent,
3357 data + larg->dynarray.field->offset,
3358 larg->dynarray.field->size);
3359 if (larg->dynarray.field->elementsize)
3360 field_size = larg->dynarray.field->elementsize;
3361 /*
3362 * The actual length of the dynamic array is stored
3363 * in the top half of the field, and the offset
3364 * is in the bottom half of the 32 bit field.
3365 */
3366 offset &= 0xffff;
3367 offset += right;
3368 break;
3369 case PRINT_FIELD:
3370 if (!larg->field.field) {
3371 larg->field.field =
3372 pevent_find_any_field(event, larg->field.name);
3373 if (!larg->field.field) {
3374 arg = larg;
3375 goto out_warning_field;
3376 }
3377 }
3378 field_size = larg->field.field->elementsize;
3379 offset = larg->field.field->offset +
3380 right * larg->field.field->elementsize;
3381 break;
3382 default:
3383 goto default_op; /* oops, all bets off */
3384 }
3385 val = pevent_read_number(pevent,
3386 data + offset, field_size);
3387 if (typearg)
3388 val = eval_type(val, typearg, 1);
3389 break;
3390 } else if (strcmp(arg->op.op, "?") == 0) {
3391 left = eval_num_arg(data, size, event, arg->op.left);
3392 arg = arg->op.right;
3393 if (left)
3394 val = eval_num_arg(data, size, event, arg->op.left);
3395 else
3396 val = eval_num_arg(data, size, event, arg->op.right);
3397 break;
3398 }
3399 default_op:
3400 left = eval_num_arg(data, size, event, arg->op.left);
3401 right = eval_num_arg(data, size, event, arg->op.right);
3402 switch (arg->op.op[0]) {
3403 case '!':
3404 switch (arg->op.op[1]) {
3405 case 0:
3406 val = !right;
3407 break;
3408 case '=':
3409 val = left != right;
3410 break;
3411 default:
3412 goto out_warning_op;
3413 }
3414 break;
3415 case '~':
3416 val = ~right;
3417 break;
3418 case '|':
3419 if (arg->op.op[1])
3420 val = left || right;
3421 else
3422 val = left | right;
3423 break;
3424 case '&':
3425 if (arg->op.op[1])
3426 val = left && right;
3427 else
3428 val = left & right;
3429 break;
3430 case '<':
3431 switch (arg->op.op[1]) {
3432 case 0:
3433 val = left < right;
3434 break;
3435 case '<':
3436 val = left << right;
3437 break;
3438 case '=':
3439 val = left <= right;
3440 break;
3441 default:
3442 goto out_warning_op;
3443 }
3444 break;
3445 case '>':
3446 switch (arg->op.op[1]) {
3447 case 0:
3448 val = left > right;
3449 break;
3450 case '>':
3451 val = left >> right;
3452 break;
3453 case '=':
3454 val = left >= right;
3455 break;
3456 default:
3457 goto out_warning_op;
3458 }
3459 break;
3460 case '=':
3461 if (arg->op.op[1] != '=')
3462 goto out_warning_op;
3463
3464 val = left == right;
3465 break;
3466 case '-':
3467 val = left - right;
3468 break;
3469 case '+':
3470 val = left + right;
3471 break;
3472 case '/':
3473 val = left / right;
3474 break;
3475 case '*':
3476 val = left * right;
3477 break;
3478 default:
3479 goto out_warning_op;
3480 }
3481 break;
3482 case PRINT_DYNAMIC_ARRAY:
3483 /* Without [], we pass the address to the dynamic data */
3484 offset = pevent_read_number(pevent,
3485 data + arg->dynarray.field->offset,
3486 arg->dynarray.field->size);
3487 /*
3488 * The actual length of the dynamic array is stored
3489 * in the top half of the field, and the offset
3490 * is in the bottom half of the 32 bit field.
3491 */
3492 offset &= 0xffff;
3493 val = (unsigned long long)((unsigned long)data + offset);
3494 break;
3495 default: /* not sure what to do there */
3496 return 0;
3497 }
3498 return val;
3499
3500out_warning_op:
3501 do_warning_event(event, "%s: unknown op '%s'", __func__, arg->op.op);
3502 return 0;
3503
3504out_warning_field:
3505 do_warning_event(event, "%s: field %s not found",
3506 __func__, arg->field.name);
3507 return 0;
3508}
3509
3510struct flag {
3511 const char *name;
3512 unsigned long long value;
3513};
3514
3515static const struct flag flags[] = {
3516 { "HI_SOFTIRQ", 0 },
3517 { "TIMER_SOFTIRQ", 1 },
3518 { "NET_TX_SOFTIRQ", 2 },
3519 { "NET_RX_SOFTIRQ", 3 },
3520 { "BLOCK_SOFTIRQ", 4 },
3521 { "BLOCK_IOPOLL_SOFTIRQ", 5 },
3522 { "TASKLET_SOFTIRQ", 6 },
3523 { "SCHED_SOFTIRQ", 7 },
3524 { "HRTIMER_SOFTIRQ", 8 },
3525 { "RCU_SOFTIRQ", 9 },
3526
3527 { "HRTIMER_NORESTART", 0 },
3528 { "HRTIMER_RESTART", 1 },
3529};
3530
3531static unsigned long long eval_flag(const char *flag)
3532{
3533 int i;
3534
3535 /*
3536 * Some flags in the format files do not get converted.
3537 * If the flag is not numeric, see if it is something that
3538 * we already know about.
3539 */
3540 if (isdigit(flag[0]))
3541 return strtoull(flag, NULL, 0);
3542
3543 for (i = 0; i < (int)(sizeof(flags)/sizeof(flags[0])); i++)
3544 if (strcmp(flags[i].name, flag) == 0)
3545 return flags[i].value;
3546
3547 return 0;
3548}
3549
3550static void print_str_to_seq(struct trace_seq *s, const char *format,
3551 int len_arg, const char *str)
3552{
3553 if (len_arg >= 0)
3554 trace_seq_printf(s, format, len_arg, str);
3555 else
3556 trace_seq_printf(s, format, str);
3557}
3558
3559static void print_str_arg(struct trace_seq *s, void *data, int size,
3560 struct event_format *event, const char *format,
3561 int len_arg, struct print_arg *arg)
3562{
3563 struct pevent *pevent = event->pevent;
3564 struct print_flag_sym *flag;
3565 struct format_field *field;
3566 struct printk_map *printk;
3567 unsigned long long val, fval;
3568 unsigned long addr;
3569 char *str;
3570 unsigned char *hex;
3571 int print;
3572 int i, len;
3573
3574 switch (arg->type) {
3575 case PRINT_NULL:
3576 /* ?? */
3577 return;
3578 case PRINT_ATOM:
3579 print_str_to_seq(s, format, len_arg, arg->atom.atom);
3580 return;
3581 case PRINT_FIELD:
3582 field = arg->field.field;
3583 if (!field) {
3584 field = pevent_find_any_field(event, arg->field.name);
3585 if (!field) {
3586 str = arg->field.name;
3587 goto out_warning_field;
3588 }
3589 arg->field.field = field;
3590 }
3591 /* Zero sized fields, mean the rest of the data */
3592 len = field->size ? : size - field->offset;
3593
3594 /*
3595 * Some events pass in pointers. If this is not an array
3596 * and the size is the same as long_size, assume that it
3597 * is a pointer.
3598 */
3599 if (!(field->flags & FIELD_IS_ARRAY) &&
3600 field->size == pevent->long_size) {
3601 addr = *(unsigned long *)(data + field->offset);
3602 /* Check if it matches a print format */
3603 printk = find_printk(pevent, addr);
3604 if (printk)
3605 trace_seq_puts(s, printk->printk);
3606 else
3607 trace_seq_printf(s, "%lx", addr);
3608 break;
3609 }
3610 str = malloc(len + 1);
3611 if (!str) {
3612 do_warning_event(event, "%s: not enough memory!",
3613 __func__);
3614 return;
3615 }
3616 memcpy(str, data + field->offset, len);
3617 str[len] = 0;
3618 print_str_to_seq(s, format, len_arg, str);
3619 free(str);
3620 break;
3621 case PRINT_FLAGS:
3622 val = eval_num_arg(data, size, event, arg->flags.field);
3623 print = 0;
3624 for (flag = arg->flags.flags; flag; flag = flag->next) {
3625 fval = eval_flag(flag->value);
3626 if (!val && !fval) {
3627 print_str_to_seq(s, format, len_arg, flag->str);
3628 break;
3629 }
3630 if (fval && (val & fval) == fval) {
3631 if (print && arg->flags.delim)
3632 trace_seq_puts(s, arg->flags.delim);
3633 print_str_to_seq(s, format, len_arg, flag->str);
3634 print = 1;
3635 val &= ~fval;
3636 }
3637 }
3638 break;
3639 case PRINT_SYMBOL:
3640 val = eval_num_arg(data, size, event, arg->symbol.field);
3641 for (flag = arg->symbol.symbols; flag; flag = flag->next) {
3642 fval = eval_flag(flag->value);
3643 if (val == fval) {
3644 print_str_to_seq(s, format, len_arg, flag->str);
3645 break;
3646 }
3647 }
3648 break;
3649 case PRINT_HEX:
3650 if (arg->hex.field->type == PRINT_DYNAMIC_ARRAY) {
3651 unsigned long offset;
3652 offset = pevent_read_number(pevent,
3653 data + arg->hex.field->dynarray.field->offset,
3654 arg->hex.field->dynarray.field->size);
3655 hex = data + (offset & 0xffff);
3656 } else {
3657 field = arg->hex.field->field.field;
3658 if (!field) {
3659 str = arg->hex.field->field.name;
3660 field = pevent_find_any_field(event, str);
3661 if (!field)
3662 goto out_warning_field;
3663 arg->hex.field->field.field = field;
3664 }
3665 hex = data + field->offset;
3666 }
3667 len = eval_num_arg(data, size, event, arg->hex.size);
3668 for (i = 0; i < len; i++) {
3669 if (i)
3670 trace_seq_putc(s, ' ');
3671 trace_seq_printf(s, "%02x", hex[i]);
3672 }
3673 break;
3674
3675 case PRINT_TYPE:
3676 break;
3677 case PRINT_STRING: {
3678 int str_offset;
3679
3680 if (arg->string.offset == -1) {
3681 struct format_field *f;
3682
3683 f = pevent_find_any_field(event, arg->string.string);
3684 arg->string.offset = f->offset;
3685 }
3686 str_offset = data2host4(pevent, data + arg->string.offset);
3687 str_offset &= 0xffff;
3688 print_str_to_seq(s, format, len_arg, ((char *)data) + str_offset);
3689 break;
3690 }
3691 case PRINT_BSTRING:
3692 print_str_to_seq(s, format, len_arg, arg->string.string);
3693 break;
3694 case PRINT_OP:
3695 /*
3696 * The only op for string should be ? :
3697 */
3698 if (arg->op.op[0] != '?')
3699 return;
3700 val = eval_num_arg(data, size, event, arg->op.left);
3701 if (val)
3702 print_str_arg(s, data, size, event,
3703 format, len_arg, arg->op.right->op.left);
3704 else
3705 print_str_arg(s, data, size, event,
3706 format, len_arg, arg->op.right->op.right);
3707 break;
3708 case PRINT_FUNC:
3709 process_defined_func(s, data, size, event, arg);
3710 break;
3711 default:
3712 /* well... */
3713 break;
3714 }
3715
3716 return;
3717
3718out_warning_field:
3719 do_warning_event(event, "%s: field %s not found",
3720 __func__, arg->field.name);
3721}
3722
3723static unsigned long long
3724process_defined_func(struct trace_seq *s, void *data, int size,
3725 struct event_format *event, struct print_arg *arg)
3726{
3727 struct pevent_function_handler *func_handle = arg->func.func;
3728 struct pevent_func_params *param;
3729 unsigned long long *args;
3730 unsigned long long ret;
3731 struct print_arg *farg;
3732 struct trace_seq str;
3733 struct save_str {
3734 struct save_str *next;
3735 char *str;
3736 } *strings = NULL, *string;
3737 int i;
3738
3739 if (!func_handle->nr_args) {
3740 ret = (*func_handle->func)(s, NULL);
3741 goto out;
3742 }
3743
3744 farg = arg->func.args;
3745 param = func_handle->params;
3746
3747 ret = ULLONG_MAX;
3748 args = malloc(sizeof(*args) * func_handle->nr_args);
3749 if (!args)
3750 goto out;
3751
3752 for (i = 0; i < func_handle->nr_args; i++) {
3753 switch (param->type) {
3754 case PEVENT_FUNC_ARG_INT:
3755 case PEVENT_FUNC_ARG_LONG:
3756 case PEVENT_FUNC_ARG_PTR:
3757 args[i] = eval_num_arg(data, size, event, farg);
3758 break;
3759 case PEVENT_FUNC_ARG_STRING:
3760 trace_seq_init(&str);
3761 print_str_arg(&str, data, size, event, "%s", -1, farg);
3762 trace_seq_terminate(&str);
3763 string = malloc(sizeof(*string));
3764 if (!string) {
3765 do_warning_event(event, "%s(%d): malloc str",
3766 __func__, __LINE__);
3767 goto out_free;
3768 }
3769 string->next = strings;
3770 string->str = strdup(str.buffer);
3771 if (!string->str) {
3772 free(string);
3773 do_warning_event(event, "%s(%d): malloc str",
3774 __func__, __LINE__);
3775 goto out_free;
3776 }
3777 args[i] = (uintptr_t)string->str;
3778 strings = string;
3779 trace_seq_destroy(&str);
3780 break;
3781 default:
3782 /*
3783 * Something went totally wrong, this is not
3784 * an input error, something in this code broke.
3785 */
3786 do_warning_event(event, "Unexpected end of arguments\n");
3787 goto out_free;
3788 }
3789 farg = farg->next;
3790 param = param->next;
3791 }
3792
3793 ret = (*func_handle->func)(s, args);
3794out_free:
3795 free(args);
3796 while (strings) {
3797 string = strings;
3798 strings = string->next;
3799 free(string->str);
3800 free(string);
3801 }
3802
3803 out:
3804 /* TBD : handle return type here */
3805 return ret;
3806}
3807
3808static void free_args(struct print_arg *args)
3809{
3810 struct print_arg *next;
3811
3812 while (args) {
3813 next = args->next;
3814
3815 free_arg(args);
3816 args = next;
3817 }
3818}
3819
3820static struct print_arg *make_bprint_args(char *fmt, void *data, int size, struct event_format *event)
3821{
3822 struct pevent *pevent = event->pevent;
3823 struct format_field *field, *ip_field;
3824 struct print_arg *args, *arg, **next;
3825 unsigned long long ip, val;
3826 char *ptr;
3827 void *bptr;
3828 int vsize;
3829
3830 field = pevent->bprint_buf_field;
3831 ip_field = pevent->bprint_ip_field;
3832
3833 if (!field) {
3834 field = pevent_find_field(event, "buf");
3835 if (!field) {
3836 do_warning_event(event, "can't find buffer field for binary printk");
3837 return NULL;
3838 }
3839 ip_field = pevent_find_field(event, "ip");
3840 if (!ip_field) {
3841 do_warning_event(event, "can't find ip field for binary printk");
3842 return NULL;
3843 }
3844 pevent->bprint_buf_field = field;
3845 pevent->bprint_ip_field = ip_field;
3846 }
3847
3848 ip = pevent_read_number(pevent, data + ip_field->offset, ip_field->size);
3849
3850 /*
3851 * The first arg is the IP pointer.
3852 */
3853 args = alloc_arg();
3854 if (!args) {
3855 do_warning_event(event, "%s(%d): not enough memory!",
3856 __func__, __LINE__);
3857 return NULL;
3858 }
3859 arg = args;
3860 arg->next = NULL;
3861 next = &arg->next;
3862
3863 arg->type = PRINT_ATOM;
3864
3865 if (asprintf(&arg->atom.atom, "%lld", ip) < 0)
3866 goto out_free;
3867
3868 /* skip the first "%pf: " */
3869 for (ptr = fmt + 5, bptr = data + field->offset;
3870 bptr < data + size && *ptr; ptr++) {
3871 int ls = 0;
3872
3873 if (*ptr == '%') {
3874 process_again:
3875 ptr++;
3876 switch (*ptr) {
3877 case '%':
3878 break;
3879 case 'l':
3880 ls++;
3881 goto process_again;
3882 case 'L':
3883 ls = 2;
3884 goto process_again;
3885 case '0' ... '9':
3886 goto process_again;
3887 case '.':
3888 goto process_again;
3889 case 'p':
3890 ls = 1;
3891 /* fall through */
3892 case 'd':
3893 case 'u':
3894 case 'x':
3895 case 'i':
3896 switch (ls) {
3897 case 0:
3898 vsize = 4;
3899 break;
3900 case 1:
3901 vsize = pevent->long_size;
3902 break;
3903 case 2:
3904 vsize = 8;
3905 break;
3906 default:
3907 vsize = ls; /* ? */
3908 break;
3909 }
3910 /* fall through */
3911 case '*':
3912 if (*ptr == '*')
3913 vsize = 4;
3914
3915 /* the pointers are always 4 bytes aligned */
3916 bptr = (void *)(((unsigned long)bptr + 3) &
3917 ~3);
3918 val = pevent_read_number(pevent, bptr, vsize);
3919 bptr += vsize;
3920 arg = alloc_arg();
3921 if (!arg) {
3922 do_warning_event(event, "%s(%d): not enough memory!",
3923 __func__, __LINE__);
3924 goto out_free;
3925 }
3926 arg->next = NULL;
3927 arg->type = PRINT_ATOM;
3928 if (asprintf(&arg->atom.atom, "%lld", val) < 0) {
3929 free(arg);
3930 goto out_free;
3931 }
3932 *next = arg;
3933 next = &arg->next;
3934 /*
3935 * The '*' case means that an arg is used as the length.
3936 * We need to continue to figure out for what.
3937 */
3938 if (*ptr == '*')
3939 goto process_again;
3940
3941 break;
3942 case 's':
3943 arg = alloc_arg();
3944 if (!arg) {
3945 do_warning_event(event, "%s(%d): not enough memory!",
3946 __func__, __LINE__);
3947 goto out_free;
3948 }
3949 arg->next = NULL;
3950 arg->type = PRINT_BSTRING;
3951 arg->string.string = strdup(bptr);
3952 if (!arg->string.string)
3953 goto out_free;
3954 bptr += strlen(bptr) + 1;
3955 *next = arg;
3956 next = &arg->next;
3957 default:
3958 break;
3959 }
3960 }
3961 }
3962
3963 return args;
3964
3965out_free:
3966 free_args(args);
3967 return NULL;
3968}
3969
3970static char *
3971get_bprint_format(void *data, int size __maybe_unused,
3972 struct event_format *event)
3973{
3974 struct pevent *pevent = event->pevent;
3975 unsigned long long addr;
3976 struct format_field *field;
3977 struct printk_map *printk;
3978 char *format;
3979
3980 field = pevent->bprint_fmt_field;
3981
3982 if (!field) {
3983 field = pevent_find_field(event, "fmt");
3984 if (!field) {
3985 do_warning_event(event, "can't find format field for binary printk");
3986 return NULL;
3987 }
3988 pevent->bprint_fmt_field = field;
3989 }
3990
3991 addr = pevent_read_number(pevent, data + field->offset, field->size);
3992
3993 printk = find_printk(pevent, addr);
3994 if (!printk) {
3995 if (asprintf(&format, "%%pf: (NO FORMAT FOUND at %llx)\n", addr) < 0)
3996 return NULL;
3997 return format;
3998 }
3999
4000 if (asprintf(&format, "%s: %s", "%pf", printk->printk) < 0)
4001 return NULL;
4002
4003 return format;
4004}
4005
4006static void print_mac_arg(struct trace_seq *s, int mac, void *data, int size,
4007 struct event_format *event, struct print_arg *arg)
4008{
4009 unsigned char *buf;
4010 const char *fmt = "%.2x:%.2x:%.2x:%.2x:%.2x:%.2x";
4011
4012 if (arg->type == PRINT_FUNC) {
4013 process_defined_func(s, data, size, event, arg);
4014 return;
4015 }
4016
4017 if (arg->type != PRINT_FIELD) {
4018 trace_seq_printf(s, "ARG TYPE NOT FIELD BUT %d",
4019 arg->type);
4020 return;
4021 }
4022
4023 if (mac == 'm')
4024 fmt = "%.2x%.2x%.2x%.2x%.2x%.2x";
4025 if (!arg->field.field) {
4026 arg->field.field =
4027 pevent_find_any_field(event, arg->field.name);
4028 if (!arg->field.field) {
4029 do_warning_event(event, "%s: field %s not found",
4030 __func__, arg->field.name);
4031 return;
4032 }
4033 }
4034 if (arg->field.field->size != 6) {
4035 trace_seq_printf(s, "INVALIDMAC");
4036 return;
4037 }
4038 buf = data + arg->field.field->offset;
4039 trace_seq_printf(s, fmt, buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]);
4040}
4041
4042static int is_printable_array(char *p, unsigned int len)
4043{
4044 unsigned int i;
4045
4046 for (i = 0; i < len && p[i]; i++)
4047 if (!isprint(p[i]) && !isspace(p[i]))
4048 return 0;
4049 return 1;
4050}
4051
4052static void print_event_fields(struct trace_seq *s, void *data,
4053 int size __maybe_unused,
4054 struct event_format *event)
4055{
4056 struct format_field *field;
4057 unsigned long long val;
4058 unsigned int offset, len, i;
4059
4060 field = event->format.fields;
4061 while (field) {
4062 trace_seq_printf(s, " %s=", field->name);
4063 if (field->flags & FIELD_IS_ARRAY) {
4064 offset = field->offset;
4065 len = field->size;
4066 if (field->flags & FIELD_IS_DYNAMIC) {
4067 val = pevent_read_number(event->pevent, data + offset, len);
4068 offset = val;
4069 len = offset >> 16;
4070 offset &= 0xffff;
4071 }
4072 if (field->flags & FIELD_IS_STRING &&
4073 is_printable_array(data + offset, len)) {
4074 trace_seq_printf(s, "%s", (char *)data + offset);
4075 } else {
4076 trace_seq_puts(s, "ARRAY[");
4077 for (i = 0; i < len; i++) {
4078 if (i)
4079 trace_seq_puts(s, ", ");
4080 trace_seq_printf(s, "%02x",
4081 *((unsigned char *)data + offset + i));
4082 }
4083 trace_seq_putc(s, ']');
4084 field->flags &= ~FIELD_IS_STRING;
4085 }
4086 } else {
4087 val = pevent_read_number(event->pevent, data + field->offset,
4088 field->size);
4089 if (field->flags & FIELD_IS_POINTER) {
4090 trace_seq_printf(s, "0x%llx", val);
4091 } else if (field->flags & FIELD_IS_SIGNED) {
4092 switch (field->size) {
4093 case 4:
4094 /*
4095 * If field is long then print it in hex.
4096 * A long usually stores pointers.
4097 */
4098 if (field->flags & FIELD_IS_LONG)
4099 trace_seq_printf(s, "0x%x", (int)val);
4100 else
4101 trace_seq_printf(s, "%d", (int)val);
4102 break;
4103 case 2:
4104 trace_seq_printf(s, "%2d", (short)val);
4105 break;
4106 case 1:
4107 trace_seq_printf(s, "%1d", (char)val);
4108 break;
4109 default:
4110 trace_seq_printf(s, "%lld", val);
4111 }
4112 } else {
4113 if (field->flags & FIELD_IS_LONG)
4114 trace_seq_printf(s, "0x%llx", val);
4115 else
4116 trace_seq_printf(s, "%llu", val);
4117 }
4118 }
4119 field = field->next;
4120 }
4121}
4122
4123static void pretty_print(struct trace_seq *s, void *data, int size, struct event_format *event)
4124{
4125 struct pevent *pevent = event->pevent;
4126 struct print_fmt *print_fmt = &event->print_fmt;
4127 struct print_arg *arg = print_fmt->args;
4128 struct print_arg *args = NULL;
4129 const char *ptr = print_fmt->format;
4130 unsigned long long val;
4131 struct func_map *func;
4132 const char *saveptr;
4133 struct trace_seq p;
4134 char *bprint_fmt = NULL;
4135 char format[32];
4136 int show_func;
4137 int len_as_arg;
4138 int len_arg;
4139 int len;
4140 int ls;
4141
4142 if (event->flags & EVENT_FL_FAILED) {
4143 trace_seq_printf(s, "[FAILED TO PARSE]");
4144 print_event_fields(s, data, size, event);
4145 return;
4146 }
4147
4148 if (event->flags & EVENT_FL_ISBPRINT) {
4149 bprint_fmt = get_bprint_format(data, size, event);
4150 args = make_bprint_args(bprint_fmt, data, size, event);
4151 arg = args;
4152 ptr = bprint_fmt;
4153 }
4154
4155 for (; *ptr; ptr++) {
4156 ls = 0;
4157 if (*ptr == '\\') {
4158 ptr++;
4159 switch (*ptr) {
4160 case 'n':
4161 trace_seq_putc(s, '\n');
4162 break;
4163 case 't':
4164 trace_seq_putc(s, '\t');
4165 break;
4166 case 'r':
4167 trace_seq_putc(s, '\r');
4168 break;
4169 case '\\':
4170 trace_seq_putc(s, '\\');
4171 break;
4172 default:
4173 trace_seq_putc(s, *ptr);
4174 break;
4175 }
4176
4177 } else if (*ptr == '%') {
4178 saveptr = ptr;
4179 show_func = 0;
4180 len_as_arg = 0;
4181 cont_process:
4182 ptr++;
4183 switch (*ptr) {
4184 case '%':
4185 trace_seq_putc(s, '%');
4186 break;
4187 case '#':
4188 /* FIXME: need to handle properly */
4189 goto cont_process;
4190 case 'h':
4191 ls--;
4192 goto cont_process;
4193 case 'l':
4194 ls++;
4195 goto cont_process;
4196 case 'L':
4197 ls = 2;
4198 goto cont_process;
4199 case '*':
4200 /* The argument is the length. */
4201 if (!arg) {
4202 do_warning_event(event, "no argument match");
4203 event->flags |= EVENT_FL_FAILED;
4204 goto out_failed;
4205 }
4206 len_arg = eval_num_arg(data, size, event, arg);
4207 len_as_arg = 1;
4208 arg = arg->next;
4209 goto cont_process;
4210 case '.':
4211 case 'z':
4212 case 'Z':
4213 case '0' ... '9':
4214 goto cont_process;
4215 case 'p':
4216 if (pevent->long_size == 4)
4217 ls = 1;
4218 else
4219 ls = 2;
4220
4221 if (*(ptr+1) == 'F' ||
4222 *(ptr+1) == 'f') {
4223 ptr++;
4224 show_func = *ptr;
4225 } else if (*(ptr+1) == 'M' || *(ptr+1) == 'm') {
4226 print_mac_arg(s, *(ptr+1), data, size, event, arg);
4227 ptr++;
4228 arg = arg->next;
4229 break;
4230 }
4231
4232 /* fall through */
4233 case 'd':
4234 case 'i':
4235 case 'x':
4236 case 'X':
4237 case 'u':
4238 if (!arg) {
4239 do_warning_event(event, "no argument match");
4240 event->flags |= EVENT_FL_FAILED;
4241 goto out_failed;
4242 }
4243
4244 len = ((unsigned long)ptr + 1) -
4245 (unsigned long)saveptr;
4246
4247 /* should never happen */
4248 if (len > 31) {
4249 do_warning_event(event, "bad format!");
4250 event->flags |= EVENT_FL_FAILED;
4251 len = 31;
4252 }
4253
4254 memcpy(format, saveptr, len);
4255 format[len] = 0;
4256
4257 val = eval_num_arg(data, size, event, arg);
4258 arg = arg->next;
4259
4260 if (show_func) {
4261 func = find_func(pevent, val);
4262 if (func) {
4263 trace_seq_puts(s, func->func);
4264 if (show_func == 'F')
4265 trace_seq_printf(s,
4266 "+0x%llx",
4267 val - func->addr);
4268 break;
4269 }
4270 }
4271 if (pevent->long_size == 8 && ls &&
4272 sizeof(long) != 8) {
4273 char *p;
4274
4275 ls = 2;
4276 /* make %l into %ll */
4277 p = strchr(format, 'l');
4278 if (p)
4279 memmove(p+1, p, strlen(p)+1);
4280 else if (strcmp(format, "%p") == 0)
4281 strcpy(format, "0x%llx");
4282 }
4283 switch (ls) {
4284 case -2:
4285 if (len_as_arg)
4286 trace_seq_printf(s, format, len_arg, (char)val);
4287 else
4288 trace_seq_printf(s, format, (char)val);
4289 break;
4290 case -1:
4291 if (len_as_arg)
4292 trace_seq_printf(s, format, len_arg, (short)val);
4293 else
4294 trace_seq_printf(s, format, (short)val);
4295 break;
4296 case 0:
4297 if (len_as_arg)
4298 trace_seq_printf(s, format, len_arg, (int)val);
4299 else
4300 trace_seq_printf(s, format, (int)val);
4301 break;
4302 case 1:
4303 if (len_as_arg)
4304 trace_seq_printf(s, format, len_arg, (long)val);
4305 else
4306 trace_seq_printf(s, format, (long)val);
4307 break;
4308 case 2:
4309 if (len_as_arg)
4310 trace_seq_printf(s, format, len_arg,
4311 (long long)val);
4312 else
4313 trace_seq_printf(s, format, (long long)val);
4314 break;
4315 default:
4316 do_warning_event(event, "bad count (%d)", ls);
4317 event->flags |= EVENT_FL_FAILED;
4318 }
4319 break;
4320 case 's':
4321 if (!arg) {
4322 do_warning_event(event, "no matching argument");
4323 event->flags |= EVENT_FL_FAILED;
4324 goto out_failed;
4325 }
4326
4327 len = ((unsigned long)ptr + 1) -
4328 (unsigned long)saveptr;
4329
4330 /* should never happen */
4331 if (len > 31) {
4332 do_warning_event(event, "bad format!");
4333 event->flags |= EVENT_FL_FAILED;
4334 len = 31;
4335 }
4336
4337 memcpy(format, saveptr, len);
4338 format[len] = 0;
4339 if (!len_as_arg)
4340 len_arg = -1;
4341 /* Use helper trace_seq */
4342 trace_seq_init(&p);
4343 print_str_arg(&p, data, size, event,
4344 format, len_arg, arg);
4345 trace_seq_terminate(&p);
4346 trace_seq_puts(s, p.buffer);
4347 trace_seq_destroy(&p);
4348 arg = arg->next;
4349 break;
4350 default:
4351 trace_seq_printf(s, ">%c<", *ptr);
4352
4353 }
4354 } else
4355 trace_seq_putc(s, *ptr);
4356 }
4357
4358 if (event->flags & EVENT_FL_FAILED) {
4359out_failed:
4360 trace_seq_printf(s, "[FAILED TO PARSE]");
4361 }
4362
4363 if (args) {
4364 free_args(args);
4365 free(bprint_fmt);
4366 }
4367}
4368
4369/**
4370 * pevent_data_lat_fmt - parse the data for the latency format
4371 * @pevent: a handle to the pevent
4372 * @s: the trace_seq to write to
4373 * @record: the record to read from
4374 *
4375 * This parses out the Latency format (interrupts disabled,
4376 * need rescheduling, in hard/soft interrupt, preempt count
4377 * and lock depth) and places it into the trace_seq.
4378 */
4379void pevent_data_lat_fmt(struct pevent *pevent,
4380 struct trace_seq *s, struct pevent_record *record)
4381{
4382 static int check_lock_depth = 1;
4383 static int check_migrate_disable = 1;
4384 static int lock_depth_exists;
4385 static int migrate_disable_exists;
4386 unsigned int lat_flags;
4387 unsigned int pc;
4388 int lock_depth;
4389 int migrate_disable;
4390 int hardirq;
4391 int softirq;
4392 void *data = record->data;
4393
4394 lat_flags = parse_common_flags(pevent, data);
4395 pc = parse_common_pc(pevent, data);
4396 /* lock_depth may not always exist */
4397 if (lock_depth_exists)
4398 lock_depth = parse_common_lock_depth(pevent, data);
4399 else if (check_lock_depth) {
4400 lock_depth = parse_common_lock_depth(pevent, data);
4401 if (lock_depth < 0)
4402 check_lock_depth = 0;
4403 else
4404 lock_depth_exists = 1;
4405 }
4406
4407 /* migrate_disable may not always exist */
4408 if (migrate_disable_exists)
4409 migrate_disable = parse_common_migrate_disable(pevent, data);
4410 else if (check_migrate_disable) {
4411 migrate_disable = parse_common_migrate_disable(pevent, data);
4412 if (migrate_disable < 0)
4413 check_migrate_disable = 0;
4414 else
4415 migrate_disable_exists = 1;
4416 }
4417
4418 hardirq = lat_flags & TRACE_FLAG_HARDIRQ;
4419 softirq = lat_flags & TRACE_FLAG_SOFTIRQ;
4420
4421 trace_seq_printf(s, "%c%c%c",
4422 (lat_flags & TRACE_FLAG_IRQS_OFF) ? 'd' :
4423 (lat_flags & TRACE_FLAG_IRQS_NOSUPPORT) ?
4424 'X' : '.',
4425 (lat_flags & TRACE_FLAG_NEED_RESCHED) ?
4426 'N' : '.',
4427 (hardirq && softirq) ? 'H' :
4428 hardirq ? 'h' : softirq ? 's' : '.');
4429
4430 if (pc)
4431 trace_seq_printf(s, "%x", pc);
4432 else
4433 trace_seq_putc(s, '.');
4434
4435 if (migrate_disable_exists) {
4436 if (migrate_disable < 0)
4437 trace_seq_putc(s, '.');
4438 else
4439 trace_seq_printf(s, "%d", migrate_disable);
4440 }
4441
4442 if (lock_depth_exists) {
4443 if (lock_depth < 0)
4444 trace_seq_putc(s, '.');
4445 else
4446 trace_seq_printf(s, "%d", lock_depth);
4447 }
4448
4449 trace_seq_terminate(s);
4450}
4451
4452/**
4453 * pevent_data_type - parse out the given event type
4454 * @pevent: a handle to the pevent
4455 * @rec: the record to read from
4456 *
4457 * This returns the event id from the @rec.
4458 */
4459int pevent_data_type(struct pevent *pevent, struct pevent_record *rec)
4460{
4461 return trace_parse_common_type(pevent, rec->data);
4462}
4463
4464/**
4465 * pevent_data_event_from_type - find the event by a given type
4466 * @pevent: a handle to the pevent
4467 * @type: the type of the event.
4468 *
4469 * This returns the event form a given @type;
4470 */
4471struct event_format *pevent_data_event_from_type(struct pevent *pevent, int type)
4472{
4473 return pevent_find_event(pevent, type);
4474}
4475
4476/**
4477 * pevent_data_pid - parse the PID from raw data
4478 * @pevent: a handle to the pevent
4479 * @rec: the record to parse
4480 *
4481 * This returns the PID from a raw data.
4482 */
4483int pevent_data_pid(struct pevent *pevent, struct pevent_record *rec)
4484{
4485 return parse_common_pid(pevent, rec->data);
4486}
4487
4488/**
4489 * pevent_data_comm_from_pid - return the command line from PID
4490 * @pevent: a handle to the pevent
4491 * @pid: the PID of the task to search for
4492 *
4493 * This returns a pointer to the command line that has the given
4494 * @pid.
4495 */
4496const char *pevent_data_comm_from_pid(struct pevent *pevent, int pid)
4497{
4498 const char *comm;
4499
4500 comm = find_cmdline(pevent, pid);
4501 return comm;
4502}
4503
4504/**
4505 * pevent_data_comm_from_pid - parse the data into the print format
4506 * @s: the trace_seq to write to
4507 * @event: the handle to the event
4508 * @record: the record to read from
4509 *
4510 * This parses the raw @data using the given @event information and
4511 * writes the print format into the trace_seq.
4512 */
4513void pevent_event_info(struct trace_seq *s, struct event_format *event,
4514 struct pevent_record *record)
4515{
4516 int print_pretty = 1;
4517
4518 if (event->pevent->print_raw || (event->flags & EVENT_FL_PRINTRAW))
4519 print_event_fields(s, record->data, record->size, event);
4520 else {
4521
4522 if (event->handler && !(event->flags & EVENT_FL_NOHANDLE))
4523 print_pretty = event->handler(s, record, event,
4524 event->context);
4525
4526 if (print_pretty)
4527 pretty_print(s, record->data, record->size, event);
4528 }
4529
4530 trace_seq_terminate(s);
4531}
4532
4533static bool is_timestamp_in_us(char *trace_clock, bool use_trace_clock)
4534{
4535 if (!use_trace_clock)
4536 return true;
4537
4538 if (!strcmp(trace_clock, "local") || !strcmp(trace_clock, "global")
4539 || !strcmp(trace_clock, "uptime") || !strcmp(trace_clock, "perf"))
4540 return true;
4541
4542 /* trace_clock is setting in tsc or counter mode */
4543 return false;
4544}
4545
4546void pevent_print_event(struct pevent *pevent, struct trace_seq *s,
4547 struct pevent_record *record, bool use_trace_clock)
4548{
4549 static const char *spaces = " "; /* 20 spaces */
4550 struct event_format *event;
4551 unsigned long secs;
4552 unsigned long usecs;
4553 unsigned long nsecs;
4554 const char *comm;
4555 void *data = record->data;
4556 int type;
4557 int pid;
4558 int len;
4559 int p;
4560 bool use_usec_format;
4561
4562 use_usec_format = is_timestamp_in_us(pevent->trace_clock,
4563 use_trace_clock);
4564 if (use_usec_format) {
4565 secs = record->ts / NSECS_PER_SEC;
4566 nsecs = record->ts - secs * NSECS_PER_SEC;
4567 }
4568
4569 if (record->size < 0) {
4570 do_warning("ug! negative record size %d", record->size);
4571 return;
4572 }
4573
4574 type = trace_parse_common_type(pevent, data);
4575
4576 event = pevent_find_event(pevent, type);
4577 if (!event) {
4578 do_warning("ug! no event found for type %d", type);
4579 return;
4580 }
4581
4582 pid = parse_common_pid(pevent, data);
4583 comm = find_cmdline(pevent, pid);
4584
4585 if (pevent->latency_format) {
4586 trace_seq_printf(s, "%8.8s-%-5d %3d",
4587 comm, pid, record->cpu);
4588 pevent_data_lat_fmt(pevent, s, record);
4589 } else
4590 trace_seq_printf(s, "%16s-%-5d [%03d]", comm, pid, record->cpu);
4591
4592 if (use_usec_format) {
4593 if (pevent->flags & PEVENT_NSEC_OUTPUT) {
4594 usecs = nsecs;
4595 p = 9;
4596 } else {
4597 usecs = (nsecs + 500) / NSECS_PER_USEC;
4598 p = 6;
4599 }
4600
4601 trace_seq_printf(s, " %5lu.%0*lu: %s: ",
4602 secs, p, usecs, event->name);
4603 } else
4604 trace_seq_printf(s, " %12llu: %s: ",
4605 record->ts, event->name);
4606
4607 /* Space out the event names evenly. */
4608 len = strlen(event->name);
4609 if (len < 20)
4610 trace_seq_printf(s, "%.*s", 20 - len, spaces);
4611
4612 pevent_event_info(s, event, record);
4613}
4614
4615static int events_id_cmp(const void *a, const void *b)
4616{
4617 struct event_format * const * ea = a;
4618 struct event_format * const * eb = b;
4619
4620 if ((*ea)->id < (*eb)->id)
4621 return -1;
4622
4623 if ((*ea)->id > (*eb)->id)
4624 return 1;
4625
4626 return 0;
4627}
4628
4629static int events_name_cmp(const void *a, const void *b)
4630{
4631 struct event_format * const * ea = a;
4632 struct event_format * const * eb = b;
4633 int res;
4634
4635 res = strcmp((*ea)->name, (*eb)->name);
4636 if (res)
4637 return res;
4638
4639 res = strcmp((*ea)->system, (*eb)->system);
4640 if (res)
4641 return res;
4642
4643 return events_id_cmp(a, b);
4644}
4645
4646static int events_system_cmp(const void *a, const void *b)
4647{
4648 struct event_format * const * ea = a;
4649 struct event_format * const * eb = b;
4650 int res;
4651
4652 res = strcmp((*ea)->system, (*eb)->system);
4653 if (res)
4654 return res;
4655
4656 res = strcmp((*ea)->name, (*eb)->name);
4657 if (res)
4658 return res;
4659
4660 return events_id_cmp(a, b);
4661}
4662
4663struct event_format **pevent_list_events(struct pevent *pevent, enum event_sort_type sort_type)
4664{
4665 struct event_format **events;
4666 int (*sort)(const void *a, const void *b);
4667
4668 events = pevent->sort_events;
4669
4670 if (events && pevent->last_type == sort_type)
4671 return events;
4672
4673 if (!events) {
4674 events = malloc(sizeof(*events) * (pevent->nr_events + 1));
4675 if (!events)
4676 return NULL;
4677
4678 memcpy(events, pevent->events, sizeof(*events) * pevent->nr_events);
4679 events[pevent->nr_events] = NULL;
4680
4681 pevent->sort_events = events;
4682
4683 /* the internal events are sorted by id */
4684 if (sort_type == EVENT_SORT_ID) {
4685 pevent->last_type = sort_type;
4686 return events;
4687 }
4688 }
4689
4690 switch (sort_type) {
4691 case EVENT_SORT_ID:
4692 sort = events_id_cmp;
4693 break;
4694 case EVENT_SORT_NAME:
4695 sort = events_name_cmp;
4696 break;
4697 case EVENT_SORT_SYSTEM:
4698 sort = events_system_cmp;
4699 break;
4700 default:
4701 return events;
4702 }
4703
4704 qsort(events, pevent->nr_events, sizeof(*events), sort);
4705 pevent->last_type = sort_type;
4706
4707 return events;
4708}
4709
4710static struct format_field **
4711get_event_fields(const char *type, const char *name,
4712 int count, struct format_field *list)
4713{
4714 struct format_field **fields;
4715 struct format_field *field;
4716 int i = 0;
4717
4718 fields = malloc(sizeof(*fields) * (count + 1));
4719 if (!fields)
4720 return NULL;
4721
4722 for (field = list; field; field = field->next) {
4723 fields[i++] = field;
4724 if (i == count + 1) {
4725 do_warning("event %s has more %s fields than specified",
4726 name, type);
4727 i--;
4728 break;
4729 }
4730 }
4731
4732 if (i != count)
4733 do_warning("event %s has less %s fields than specified",
4734 name, type);
4735
4736 fields[i] = NULL;
4737
4738 return fields;
4739}
4740
4741/**
4742 * pevent_event_common_fields - return a list of common fields for an event
4743 * @event: the event to return the common fields of.
4744 *
4745 * Returns an allocated array of fields. The last item in the array is NULL.
4746 * The array must be freed with free().
4747 */
4748struct format_field **pevent_event_common_fields(struct event_format *event)
4749{
4750 return get_event_fields("common", event->name,
4751 event->format.nr_common,
4752 event->format.common_fields);
4753}
4754
4755/**
4756 * pevent_event_fields - return a list of event specific fields for an event
4757 * @event: the event to return the fields of.
4758 *
4759 * Returns an allocated array of fields. The last item in the array is NULL.
4760 * The array must be freed with free().
4761 */
4762struct format_field **pevent_event_fields(struct event_format *event)
4763{
4764 return get_event_fields("event", event->name,
4765 event->format.nr_fields,
4766 event->format.fields);
4767}
4768
4769static void print_fields(struct trace_seq *s, struct print_flag_sym *field)
4770{
4771 trace_seq_printf(s, "{ %s, %s }", field->value, field->str);
4772 if (field->next) {
4773 trace_seq_puts(s, ", ");
4774 print_fields(s, field->next);
4775 }
4776}
4777
4778/* for debugging */
4779static void print_args(struct print_arg *args)
4780{
4781 int print_paren = 1;
4782 struct trace_seq s;
4783
4784 switch (args->type) {
4785 case PRINT_NULL:
4786 printf("null");
4787 break;
4788 case PRINT_ATOM:
4789 printf("%s", args->atom.atom);
4790 break;
4791 case PRINT_FIELD:
4792 printf("REC->%s", args->field.name);
4793 break;
4794 case PRINT_FLAGS:
4795 printf("__print_flags(");
4796 print_args(args->flags.field);
4797 printf(", %s, ", args->flags.delim);
4798 trace_seq_init(&s);
4799 print_fields(&s, args->flags.flags);
4800 trace_seq_do_printf(&s);
4801 trace_seq_destroy(&s);
4802 printf(")");
4803 break;
4804 case PRINT_SYMBOL:
4805 printf("__print_symbolic(");
4806 print_args(args->symbol.field);
4807 printf(", ");
4808 trace_seq_init(&s);
4809 print_fields(&s, args->symbol.symbols);
4810 trace_seq_do_printf(&s);
4811 trace_seq_destroy(&s);
4812 printf(")");
4813 break;
4814 case PRINT_HEX:
4815 printf("__print_hex(");
4816 print_args(args->hex.field);
4817 printf(", ");
4818 print_args(args->hex.size);
4819 printf(")");
4820 break;
4821 case PRINT_STRING:
4822 case PRINT_BSTRING:
4823 printf("__get_str(%s)", args->string.string);
4824 break;
4825 case PRINT_TYPE:
4826 printf("(%s)", args->typecast.type);
4827 print_args(args->typecast.item);
4828 break;
4829 case PRINT_OP:
4830 if (strcmp(args->op.op, ":") == 0)
4831 print_paren = 0;
4832 if (print_paren)
4833 printf("(");
4834 print_args(args->op.left);
4835 printf(" %s ", args->op.op);
4836 print_args(args->op.right);
4837 if (print_paren)
4838 printf(")");
4839 break;
4840 default:
4841 /* we should warn... */
4842 return;
4843 }
4844 if (args->next) {
4845 printf("\n");
4846 print_args(args->next);
4847 }
4848}
4849
4850static void parse_header_field(const char *field,
4851 int *offset, int *size, int mandatory)
4852{
4853 unsigned long long save_input_buf_ptr;
4854 unsigned long long save_input_buf_siz;
4855 char *token;
4856 int type;
4857
4858 save_input_buf_ptr = input_buf_ptr;
4859 save_input_buf_siz = input_buf_siz;
4860
4861 if (read_expected(EVENT_ITEM, "field") < 0)
4862 return;
4863 if (read_expected(EVENT_OP, ":") < 0)
4864 return;
4865
4866 /* type */
4867 if (read_expect_type(EVENT_ITEM, &token) < 0)
4868 goto fail;
4869 free_token(token);
4870
4871 /*
4872 * If this is not a mandatory field, then test it first.
4873 */
4874 if (mandatory) {
4875 if (read_expected(EVENT_ITEM, field) < 0)
4876 return;
4877 } else {
4878 if (read_expect_type(EVENT_ITEM, &token) < 0)
4879 goto fail;
4880 if (strcmp(token, field) != 0)
4881 goto discard;
4882 free_token(token);
4883 }
4884
4885 if (read_expected(EVENT_OP, ";") < 0)
4886 return;
4887 if (read_expected(EVENT_ITEM, "offset") < 0)
4888 return;
4889 if (read_expected(EVENT_OP, ":") < 0)
4890 return;
4891 if (read_expect_type(EVENT_ITEM, &token) < 0)
4892 goto fail;
4893 *offset = atoi(token);
4894 free_token(token);
4895 if (read_expected(EVENT_OP, ";") < 0)
4896 return;
4897 if (read_expected(EVENT_ITEM, "size") < 0)
4898 return;
4899 if (read_expected(EVENT_OP, ":") < 0)
4900 return;
4901 if (read_expect_type(EVENT_ITEM, &token) < 0)
4902 goto fail;
4903 *size = atoi(token);
4904 free_token(token);
4905 if (read_expected(EVENT_OP, ";") < 0)
4906 return;
4907 type = read_token(&token);
4908 if (type != EVENT_NEWLINE) {
4909 /* newer versions of the kernel have a "signed" type */
4910 if (type != EVENT_ITEM)
4911 goto fail;
4912
4913 if (strcmp(token, "signed") != 0)
4914 goto fail;
4915
4916 free_token(token);
4917
4918 if (read_expected(EVENT_OP, ":") < 0)
4919 return;
4920
4921 if (read_expect_type(EVENT_ITEM, &token))
4922 goto fail;
4923
4924 free_token(token);
4925 if (read_expected(EVENT_OP, ";") < 0)
4926 return;
4927
4928 if (read_expect_type(EVENT_NEWLINE, &token))
4929 goto fail;
4930 }
4931 fail:
4932 free_token(token);
4933 return;
4934
4935 discard:
4936 input_buf_ptr = save_input_buf_ptr;
4937 input_buf_siz = save_input_buf_siz;
4938 *offset = 0;
4939 *size = 0;
4940 free_token(token);
4941}
4942
4943/**
4944 * pevent_parse_header_page - parse the data stored in the header page
4945 * @pevent: the handle to the pevent
4946 * @buf: the buffer storing the header page format string
4947 * @size: the size of @buf
4948 * @long_size: the long size to use if there is no header
4949 *
4950 * This parses the header page format for information on the
4951 * ring buffer used. The @buf should be copied from
4952 *
4953 * /sys/kernel/debug/tracing/events/header_page
4954 */
4955int pevent_parse_header_page(struct pevent *pevent, char *buf, unsigned long size,
4956 int long_size)
4957{
4958 int ignore;
4959
4960 if (!size) {
4961 /*
4962 * Old kernels did not have header page info.
4963 * Sorry but we just use what we find here in user space.
4964 */
4965 pevent->header_page_ts_size = sizeof(long long);
4966 pevent->header_page_size_size = long_size;
4967 pevent->header_page_data_offset = sizeof(long long) + long_size;
4968 pevent->old_format = 1;
4969 return -1;
4970 }
4971 init_input_buf(buf, size);
4972
4973 parse_header_field("timestamp", &pevent->header_page_ts_offset,
4974 &pevent->header_page_ts_size, 1);
4975 parse_header_field("commit", &pevent->header_page_size_offset,
4976 &pevent->header_page_size_size, 1);
4977 parse_header_field("overwrite", &pevent->header_page_overwrite,
4978 &ignore, 0);
4979 parse_header_field("data", &pevent->header_page_data_offset,
4980 &pevent->header_page_data_size, 1);
4981
4982 return 0;
4983}
4984
4985static int event_matches(struct event_format *event,
4986 int id, const char *sys_name,
4987 const char *event_name)
4988{
4989 if (id >= 0 && id != event->id)
4990 return 0;
4991
4992 if (event_name && (strcmp(event_name, event->name) != 0))
4993 return 0;
4994
4995 if (sys_name && (strcmp(sys_name, event->system) != 0))
4996 return 0;
4997
4998 return 1;
4999}
5000
5001static void free_handler(struct event_handler *handle)
5002{
5003 free((void *)handle->sys_name);
5004 free((void *)handle->event_name);
5005 free(handle);
5006}
5007
5008static int find_event_handle(struct pevent *pevent, struct event_format *event)
5009{
5010 struct event_handler *handle, **next;
5011
5012 for (next = &pevent->handlers; *next;
5013 next = &(*next)->next) {
5014 handle = *next;
5015 if (event_matches(event, handle->id,
5016 handle->sys_name,
5017 handle->event_name))
5018 break;
5019 }
5020
5021 if (!(*next))
5022 return 0;
5023
5024 pr_stat("overriding event (%d) %s:%s with new print handler",
5025 event->id, event->system, event->name);
5026
5027 event->handler = handle->func;
5028 event->context = handle->context;
5029
5030 *next = handle->next;
5031 free_handler(handle);
5032
5033 return 1;
5034}
5035
5036/**
5037 * __pevent_parse_format - parse the event format
5038 * @buf: the buffer storing the event format string
5039 * @size: the size of @buf
5040 * @sys: the system the event belongs to
5041 *
5042 * This parses the event format and creates an event structure
5043 * to quickly parse raw data for a given event.
5044 *
5045 * These files currently come from:
5046 *
5047 * /sys/kernel/debug/tracing/events/.../.../format
5048 */
5049enum pevent_errno __pevent_parse_format(struct event_format **eventp,
5050 struct pevent *pevent, const char *buf,
5051 unsigned long size, const char *sys)
5052{
5053 struct event_format *event;
5054 int ret;
5055
5056 init_input_buf(buf, size);
5057
5058 *eventp = event = alloc_event();
5059 if (!event)
5060 return PEVENT_ERRNO__MEM_ALLOC_FAILED;
5061
5062 event->name = event_read_name();
5063 if (!event->name) {
5064 /* Bad event? */
5065 ret = PEVENT_ERRNO__MEM_ALLOC_FAILED;
5066 goto event_alloc_failed;
5067 }
5068
5069 if (strcmp(sys, "ftrace") == 0) {
5070 event->flags |= EVENT_FL_ISFTRACE;
5071
5072 if (strcmp(event->name, "bprint") == 0)
5073 event->flags |= EVENT_FL_ISBPRINT;
5074 }
5075
5076 event->id = event_read_id();
5077 if (event->id < 0) {
5078 ret = PEVENT_ERRNO__READ_ID_FAILED;
5079 /*
5080 * This isn't an allocation error actually.
5081 * But as the ID is critical, just bail out.
5082 */
5083 goto event_alloc_failed;
5084 }
5085
5086 event->system = strdup(sys);
5087 if (!event->system) {
5088 ret = PEVENT_ERRNO__MEM_ALLOC_FAILED;
5089 goto event_alloc_failed;
5090 }
5091
5092 /* Add pevent to event so that it can be referenced */
5093 event->pevent = pevent;
5094
5095 ret = event_read_format(event);
5096 if (ret < 0) {
5097 ret = PEVENT_ERRNO__READ_FORMAT_FAILED;
5098 goto event_parse_failed;
5099 }
5100
5101 /*
5102 * If the event has an override, don't print warnings if the event
5103 * print format fails to parse.
5104 */
5105 if (pevent && find_event_handle(pevent, event))
5106 show_warning = 0;
5107
5108 ret = event_read_print(event);
5109 show_warning = 1;
5110
5111 if (ret < 0) {
5112 ret = PEVENT_ERRNO__READ_PRINT_FAILED;
5113 goto event_parse_failed;
5114 }
5115
5116 if (!ret && (event->flags & EVENT_FL_ISFTRACE)) {
5117 struct format_field *field;
5118 struct print_arg *arg, **list;
5119
5120 /* old ftrace had no args */
5121 list = &event->print_fmt.args;
5122 for (field = event->format.fields; field; field = field->next) {
5123 arg = alloc_arg();
5124 if (!arg) {
5125 event->flags |= EVENT_FL_FAILED;
5126 return PEVENT_ERRNO__OLD_FTRACE_ARG_FAILED;
5127 }
5128 arg->type = PRINT_FIELD;
5129 arg->field.name = strdup(field->name);
5130 if (!arg->field.name) {
5131 event->flags |= EVENT_FL_FAILED;
5132 free_arg(arg);
5133 return PEVENT_ERRNO__OLD_FTRACE_ARG_FAILED;
5134 }
5135 arg->field.field = field;
5136 *list = arg;
5137 list = &arg->next;
5138 }
5139 return 0;
5140 }
5141
5142 return 0;
5143
5144 event_parse_failed:
5145 event->flags |= EVENT_FL_FAILED;
5146 return ret;
5147
5148 event_alloc_failed:
5149 free(event->system);
5150 free(event->name);
5151 free(event);
5152 *eventp = NULL;
5153 return ret;
5154}
5155
5156static enum pevent_errno
5157__pevent_parse_event(struct pevent *pevent,
5158 struct event_format **eventp,
5159 const char *buf, unsigned long size,
5160 const char *sys)
5161{
5162 int ret = __pevent_parse_format(eventp, pevent, buf, size, sys);
5163 struct event_format *event = *eventp;
5164
5165 if (event == NULL)
5166 return ret;
5167
5168 if (pevent && add_event(pevent, event)) {
5169 ret = PEVENT_ERRNO__MEM_ALLOC_FAILED;
5170 goto event_add_failed;
5171 }
5172
5173#define PRINT_ARGS 0
5174 if (PRINT_ARGS && event->print_fmt.args)
5175 print_args(event->print_fmt.args);
5176
5177 return 0;
5178
5179event_add_failed:
5180 pevent_free_format(event);
5181 return ret;
5182}
5183
5184/**
5185 * pevent_parse_format - parse the event format
5186 * @pevent: the handle to the pevent
5187 * @eventp: returned format
5188 * @buf: the buffer storing the event format string
5189 * @size: the size of @buf
5190 * @sys: the system the event belongs to
5191 *
5192 * This parses the event format and creates an event structure
5193 * to quickly parse raw data for a given event.
5194 *
5195 * These files currently come from:
5196 *
5197 * /sys/kernel/debug/tracing/events/.../.../format
5198 */
5199enum pevent_errno pevent_parse_format(struct pevent *pevent,
5200 struct event_format **eventp,
5201 const char *buf,
5202 unsigned long size, const char *sys)
5203{
5204 return __pevent_parse_event(pevent, eventp, buf, size, sys);
5205}
5206
5207/**
5208 * pevent_parse_event - parse the event format
5209 * @pevent: the handle to the pevent
5210 * @buf: the buffer storing the event format string
5211 * @size: the size of @buf
5212 * @sys: the system the event belongs to
5213 *
5214 * This parses the event format and creates an event structure
5215 * to quickly parse raw data for a given event.
5216 *
5217 * These files currently come from:
5218 *
5219 * /sys/kernel/debug/tracing/events/.../.../format
5220 */
5221enum pevent_errno pevent_parse_event(struct pevent *pevent, const char *buf,
5222 unsigned long size, const char *sys)
5223{
5224 struct event_format *event = NULL;
5225 return __pevent_parse_event(pevent, &event, buf, size, sys);
5226}
5227
5228#undef _PE
5229#define _PE(code, str) str
5230static const char * const pevent_error_str[] = {
5231 PEVENT_ERRORS
5232};
5233#undef _PE
5234
5235int pevent_strerror(struct pevent *pevent __maybe_unused,
5236 enum pevent_errno errnum, char *buf, size_t buflen)
5237{
5238 int idx;
5239 const char *msg;
5240
5241 if (errnum >= 0) {
5242 msg = strerror_r(errnum, buf, buflen);
5243 if (msg != buf) {
5244 size_t len = strlen(msg);
5245 memcpy(buf, msg, min(buflen - 1, len));
5246 *(buf + min(buflen - 1, len)) = '\0';
5247 }
5248 return 0;
5249 }
5250
5251 if (errnum <= __PEVENT_ERRNO__START ||
5252 errnum >= __PEVENT_ERRNO__END)
5253 return -1;
5254
5255 idx = errnum - __PEVENT_ERRNO__START - 1;
5256 msg = pevent_error_str[idx];
5257 snprintf(buf, buflen, "%s", msg);
5258
5259 return 0;
5260}
5261
5262int get_field_val(struct trace_seq *s, struct format_field *field,
5263 const char *name, struct pevent_record *record,
5264 unsigned long long *val, int err)
5265{
5266 if (!field) {
5267 if (err)
5268 trace_seq_printf(s, "<CANT FIND FIELD %s>", name);
5269 return -1;
5270 }
5271
5272 if (pevent_read_number_field(field, record->data, val)) {
5273 if (err)
5274 trace_seq_printf(s, " %s=INVALID", name);
5275 return -1;
5276 }
5277
5278 return 0;
5279}
5280
5281/**
5282 * pevent_get_field_raw - return the raw pointer into the data field
5283 * @s: The seq to print to on error
5284 * @event: the event that the field is for
5285 * @name: The name of the field
5286 * @record: The record with the field name.
5287 * @len: place to store the field length.
5288 * @err: print default error if failed.
5289 *
5290 * Returns a pointer into record->data of the field and places
5291 * the length of the field in @len.
5292 *
5293 * On failure, it returns NULL.
5294 */
5295void *pevent_get_field_raw(struct trace_seq *s, struct event_format *event,
5296 const char *name, struct pevent_record *record,
5297 int *len, int err)
5298{
5299 struct format_field *field;
5300 void *data = record->data;
5301 unsigned offset;
5302 int dummy;
5303
5304 if (!event)
5305 return NULL;
5306
5307 field = pevent_find_field(event, name);
5308
5309 if (!field) {
5310 if (err)
5311 trace_seq_printf(s, "<CANT FIND FIELD %s>", name);
5312 return NULL;
5313 }
5314
5315 /* Allow @len to be NULL */
5316 if (!len)
5317 len = &dummy;
5318
5319 offset = field->offset;
5320 if (field->flags & FIELD_IS_DYNAMIC) {
5321 offset = pevent_read_number(event->pevent,
5322 data + offset, field->size);
5323 *len = offset >> 16;
5324 offset &= 0xffff;
5325 } else
5326 *len = field->size;
5327
5328 return data + offset;
5329}
5330
5331/**
5332 * pevent_get_field_val - find a field and return its value
5333 * @s: The seq to print to on error
5334 * @event: the event that the field is for
5335 * @name: The name of the field
5336 * @record: The record with the field name.
5337 * @val: place to store the value of the field.
5338 * @err: print default error if failed.
5339 *
5340 * Returns 0 on success -1 on field not found.
5341 */
5342int pevent_get_field_val(struct trace_seq *s, struct event_format *event,
5343 const char *name, struct pevent_record *record,
5344 unsigned long long *val, int err)
5345{
5346 struct format_field *field;
5347
5348 if (!event)
5349 return -1;
5350
5351 field = pevent_find_field(event, name);
5352
5353 return get_field_val(s, field, name, record, val, err);
5354}
5355
5356/**
5357 * pevent_get_common_field_val - find a common field and return its value
5358 * @s: The seq to print to on error
5359 * @event: the event that the field is for
5360 * @name: The name of the field
5361 * @record: The record with the field name.
5362 * @val: place to store the value of the field.
5363 * @err: print default error if failed.
5364 *
5365 * Returns 0 on success -1 on field not found.
5366 */
5367int pevent_get_common_field_val(struct trace_seq *s, struct event_format *event,
5368 const char *name, struct pevent_record *record,
5369 unsigned long long *val, int err)
5370{
5371 struct format_field *field;
5372
5373 if (!event)
5374 return -1;
5375
5376 field = pevent_find_common_field(event, name);
5377
5378 return get_field_val(s, field, name, record, val, err);
5379}
5380
5381/**
5382 * pevent_get_any_field_val - find a any field and return its value
5383 * @s: The seq to print to on error
5384 * @event: the event that the field is for
5385 * @name: The name of the field
5386 * @record: The record with the field name.
5387 * @val: place to store the value of the field.
5388 * @err: print default error if failed.
5389 *
5390 * Returns 0 on success -1 on field not found.
5391 */
5392int pevent_get_any_field_val(struct trace_seq *s, struct event_format *event,
5393 const char *name, struct pevent_record *record,
5394 unsigned long long *val, int err)
5395{
5396 struct format_field *field;
5397
5398 if (!event)
5399 return -1;
5400
5401 field = pevent_find_any_field(event, name);
5402
5403 return get_field_val(s, field, name, record, val, err);
5404}
5405
5406/**
5407 * pevent_print_num_field - print a field and a format
5408 * @s: The seq to print to
5409 * @fmt: The printf format to print the field with.
5410 * @event: the event that the field is for
5411 * @name: The name of the field
5412 * @record: The record with the field name.
5413 * @err: print default error if failed.
5414 *
5415 * Returns: 0 on success, -1 field not found, or 1 if buffer is full.
5416 */
5417int pevent_print_num_field(struct trace_seq *s, const char *fmt,
5418 struct event_format *event, const char *name,
5419 struct pevent_record *record, int err)
5420{
5421 struct format_field *field = pevent_find_field(event, name);
5422 unsigned long long val;
5423
5424 if (!field)
5425 goto failed;
5426
5427 if (pevent_read_number_field(field, record->data, &val))
5428 goto failed;
5429
5430 return trace_seq_printf(s, fmt, val);
5431
5432 failed:
5433 if (err)
5434 trace_seq_printf(s, "CAN'T FIND FIELD \"%s\"", name);
5435 return -1;
5436}
5437
5438/**
5439 * pevent_print_func_field - print a field and a format for function pointers
5440 * @s: The seq to print to
5441 * @fmt: The printf format to print the field with.
5442 * @event: the event that the field is for
5443 * @name: The name of the field
5444 * @record: The record with the field name.
5445 * @err: print default error if failed.
5446 *
5447 * Returns: 0 on success, -1 field not found, or 1 if buffer is full.
5448 */
5449int pevent_print_func_field(struct trace_seq *s, const char *fmt,
5450 struct event_format *event, const char *name,
5451 struct pevent_record *record, int err)
5452{
5453 struct format_field *field = pevent_find_field(event, name);
5454 struct pevent *pevent = event->pevent;
5455 unsigned long long val;
5456 struct func_map *func;
5457 char tmp[128];
5458
5459 if (!field)
5460 goto failed;
5461
5462 if (pevent_read_number_field(field, record->data, &val))
5463 goto failed;
5464
5465 func = find_func(pevent, val);
5466
5467 if (func)
5468 snprintf(tmp, 128, "%s/0x%llx", func->func, func->addr - val);
5469 else
5470 sprintf(tmp, "0x%08llx", val);
5471
5472 return trace_seq_printf(s, fmt, tmp);
5473
5474 failed:
5475 if (err)
5476 trace_seq_printf(s, "CAN'T FIND FIELD \"%s\"", name);
5477 return -1;
5478}
5479
5480static void free_func_handle(struct pevent_function_handler *func)
5481{
5482 struct pevent_func_params *params;
5483
5484 free(func->name);
5485
5486 while (func->params) {
5487 params = func->params;
5488 func->params = params->next;
5489 free(params);
5490 }
5491
5492 free(func);
5493}
5494
5495/**
5496 * pevent_register_print_function - register a helper function
5497 * @pevent: the handle to the pevent
5498 * @func: the function to process the helper function
5499 * @ret_type: the return type of the helper function
5500 * @name: the name of the helper function
5501 * @parameters: A list of enum pevent_func_arg_type
5502 *
5503 * Some events may have helper functions in the print format arguments.
5504 * This allows a plugin to dynamically create a way to process one
5505 * of these functions.
5506 *
5507 * The @parameters is a variable list of pevent_func_arg_type enums that
5508 * must end with PEVENT_FUNC_ARG_VOID.
5509 */
5510int pevent_register_print_function(struct pevent *pevent,
5511 pevent_func_handler func,
5512 enum pevent_func_arg_type ret_type,
5513 char *name, ...)
5514{
5515 struct pevent_function_handler *func_handle;
5516 struct pevent_func_params **next_param;
5517 struct pevent_func_params *param;
5518 enum pevent_func_arg_type type;
5519 va_list ap;
5520 int ret;
5521
5522 func_handle = find_func_handler(pevent, name);
5523 if (func_handle) {
5524 /*
5525 * This is most like caused by the users own
5526 * plugins updating the function. This overrides the
5527 * system defaults.
5528 */
5529 pr_stat("override of function helper '%s'", name);
5530 remove_func_handler(pevent, name);
5531 }
5532
5533 func_handle = calloc(1, sizeof(*func_handle));
5534 if (!func_handle) {
5535 do_warning("Failed to allocate function handler");
5536 return PEVENT_ERRNO__MEM_ALLOC_FAILED;
5537 }
5538
5539 func_handle->ret_type = ret_type;
5540 func_handle->name = strdup(name);
5541 func_handle->func = func;
5542 if (!func_handle->name) {
5543 do_warning("Failed to allocate function name");
5544 free(func_handle);
5545 return PEVENT_ERRNO__MEM_ALLOC_FAILED;
5546 }
5547
5548 next_param = &(func_handle->params);
5549 va_start(ap, name);
5550 for (;;) {
5551 type = va_arg(ap, enum pevent_func_arg_type);
5552 if (type == PEVENT_FUNC_ARG_VOID)
5553 break;
5554
5555 if (type >= PEVENT_FUNC_ARG_MAX_TYPES) {
5556 do_warning("Invalid argument type %d", type);
5557 ret = PEVENT_ERRNO__INVALID_ARG_TYPE;
5558 goto out_free;
5559 }
5560
5561 param = malloc(sizeof(*param));
5562 if (!param) {
5563 do_warning("Failed to allocate function param");
5564 ret = PEVENT_ERRNO__MEM_ALLOC_FAILED;
5565 goto out_free;
5566 }
5567 param->type = type;
5568 param->next = NULL;
5569
5570 *next_param = param;
5571 next_param = &(param->next);
5572
5573 func_handle->nr_args++;
5574 }
5575 va_end(ap);
5576
5577 func_handle->next = pevent->func_handlers;
5578 pevent->func_handlers = func_handle;
5579
5580 return 0;
5581 out_free:
5582 va_end(ap);
5583 free_func_handle(func_handle);
5584 return ret;
5585}
5586
5587/**
5588 * pevent_unregister_print_function - unregister a helper function
5589 * @pevent: the handle to the pevent
5590 * @func: the function to process the helper function
5591 * @name: the name of the helper function
5592 *
5593 * This function removes existing print handler for function @name.
5594 *
5595 * Returns 0 if the handler was removed successully, -1 otherwise.
5596 */
5597int pevent_unregister_print_function(struct pevent *pevent,
5598 pevent_func_handler func, char *name)
5599{
5600 struct pevent_function_handler *func_handle;
5601
5602 func_handle = find_func_handler(pevent, name);
5603 if (func_handle && func_handle->func == func) {
5604 remove_func_handler(pevent, name);
5605 return 0;
5606 }
5607 return -1;
5608}
5609
5610static struct event_format *pevent_search_event(struct pevent *pevent, int id,
5611 const char *sys_name,
5612 const char *event_name)
5613{
5614 struct event_format *event;
5615
5616 if (id >= 0) {
5617 /* search by id */
5618 event = pevent_find_event(pevent, id);
5619 if (!event)
5620 return NULL;
5621 if (event_name && (strcmp(event_name, event->name) != 0))
5622 return NULL;
5623 if (sys_name && (strcmp(sys_name, event->system) != 0))
5624 return NULL;
5625 } else {
5626 event = pevent_find_event_by_name(pevent, sys_name, event_name);
5627 if (!event)
5628 return NULL;
5629 }
5630 return event;
5631}
5632
5633/**
5634 * pevent_register_event_handler - register a way to parse an event
5635 * @pevent: the handle to the pevent
5636 * @id: the id of the event to register
5637 * @sys_name: the system name the event belongs to
5638 * @event_name: the name of the event
5639 * @func: the function to call to parse the event information
5640 * @context: the data to be passed to @func
5641 *
5642 * This function allows a developer to override the parsing of
5643 * a given event. If for some reason the default print format
5644 * is not sufficient, this function will register a function
5645 * for an event to be used to parse the data instead.
5646 *
5647 * If @id is >= 0, then it is used to find the event.
5648 * else @sys_name and @event_name are used.
5649 */
5650int pevent_register_event_handler(struct pevent *pevent, int id,
5651 const char *sys_name, const char *event_name,
5652 pevent_event_handler_func func, void *context)
5653{
5654 struct event_format *event;
5655 struct event_handler *handle;
5656
5657 event = pevent_search_event(pevent, id, sys_name, event_name);
5658 if (event == NULL)
5659 goto not_found;
5660
5661 pr_stat("overriding event (%d) %s:%s with new print handler",
5662 event->id, event->system, event->name);
5663
5664 event->handler = func;
5665 event->context = context;
5666 return 0;
5667
5668 not_found:
5669 /* Save for later use. */
5670 handle = calloc(1, sizeof(*handle));
5671 if (!handle) {
5672 do_warning("Failed to allocate event handler");
5673 return PEVENT_ERRNO__MEM_ALLOC_FAILED;
5674 }
5675
5676 handle->id = id;
5677 if (event_name)
5678 handle->event_name = strdup(event_name);
5679 if (sys_name)
5680 handle->sys_name = strdup(sys_name);
5681
5682 if ((event_name && !handle->event_name) ||
5683 (sys_name && !handle->sys_name)) {
5684 do_warning("Failed to allocate event/sys name");
5685 free((void *)handle->event_name);
5686 free((void *)handle->sys_name);
5687 free(handle);
5688 return PEVENT_ERRNO__MEM_ALLOC_FAILED;
5689 }
5690
5691 handle->func = func;
5692 handle->next = pevent->handlers;
5693 pevent->handlers = handle;
5694 handle->context = context;
5695
5696 return -1;
5697}
5698
5699static int handle_matches(struct event_handler *handler, int id,
5700 const char *sys_name, const char *event_name,
5701 pevent_event_handler_func func, void *context)
5702{
5703 if (id >= 0 && id != handler->id)
5704 return 0;
5705
5706 if (event_name && (strcmp(event_name, handler->event_name) != 0))
5707 return 0;
5708
5709 if (sys_name && (strcmp(sys_name, handler->sys_name) != 0))
5710 return 0;
5711
5712 if (func != handler->func || context != handler->context)
5713 return 0;
5714
5715 return 1;
5716}
5717
5718/**
5719 * pevent_unregister_event_handler - unregister an existing event handler
5720 * @pevent: the handle to the pevent
5721 * @id: the id of the event to unregister
5722 * @sys_name: the system name the handler belongs to
5723 * @event_name: the name of the event handler
5724 * @func: the function to call to parse the event information
5725 * @context: the data to be passed to @func
5726 *
5727 * This function removes existing event handler (parser).
5728 *
5729 * If @id is >= 0, then it is used to find the event.
5730 * else @sys_name and @event_name are used.
5731 *
5732 * Returns 0 if handler was removed successfully, -1 if event was not found.
5733 */
5734int pevent_unregister_event_handler(struct pevent *pevent, int id,
5735 const char *sys_name, const char *event_name,
5736 pevent_event_handler_func func, void *context)
5737{
5738 struct event_format *event;
5739 struct event_handler *handle;
5740 struct event_handler **next;
5741
5742 event = pevent_search_event(pevent, id, sys_name, event_name);
5743 if (event == NULL)
5744 goto not_found;
5745
5746 if (event->handler == func && event->context == context) {
5747 pr_stat("removing override handler for event (%d) %s:%s. Going back to default handler.",
5748 event->id, event->system, event->name);
5749
5750 event->handler = NULL;
5751 event->context = NULL;
5752 return 0;
5753 }
5754
5755not_found:
5756 for (next = &pevent->handlers; *next; next = &(*next)->next) {
5757 handle = *next;
5758 if (handle_matches(handle, id, sys_name, event_name,
5759 func, context))
5760 break;
5761 }
5762
5763 if (!(*next))
5764 return -1;
5765
5766 *next = handle->next;
5767 free_handler(handle);
5768
5769 return 0;
5770}
5771
5772/**
5773 * pevent_alloc - create a pevent handle
5774 */
5775struct pevent *pevent_alloc(void)
5776{
5777 struct pevent *pevent = calloc(1, sizeof(*pevent));
5778
5779 if (pevent)
5780 pevent->ref_count = 1;
5781
5782 return pevent;
5783}
5784
5785void pevent_ref(struct pevent *pevent)
5786{
5787 pevent->ref_count++;
5788}
5789
5790static void free_format_fields(struct format_field *field)
5791{
5792 struct format_field *next;
5793
5794 while (field) {
5795 next = field->next;
5796 free(field->type);
5797 free(field->name);
5798 free(field);
5799 field = next;
5800 }
5801}
5802
5803static void free_formats(struct format *format)
5804{
5805 free_format_fields(format->common_fields);
5806 free_format_fields(format->fields);
5807}
5808
5809void pevent_free_format(struct event_format *event)
5810{
5811 free(event->name);
5812 free(event->system);
5813
5814 free_formats(&event->format);
5815
5816 free(event->print_fmt.format);
5817 free_args(event->print_fmt.args);
5818
5819 free(event);
5820}
5821
5822/**
5823 * pevent_free - free a pevent handle
5824 * @pevent: the pevent handle to free
5825 */
5826void pevent_free(struct pevent *pevent)
5827{
5828 struct cmdline_list *cmdlist, *cmdnext;
5829 struct func_list *funclist, *funcnext;
5830 struct printk_list *printklist, *printknext;
5831 struct pevent_function_handler *func_handler;
5832 struct event_handler *handle;
5833 int i;
5834
5835 if (!pevent)
5836 return;
5837
5838 cmdlist = pevent->cmdlist;
5839 funclist = pevent->funclist;
5840 printklist = pevent->printklist;
5841
5842 pevent->ref_count--;
5843 if (pevent->ref_count)
5844 return;
5845
5846 if (pevent->cmdlines) {
5847 for (i = 0; i < pevent->cmdline_count; i++)
5848 free(pevent->cmdlines[i].comm);
5849 free(pevent->cmdlines);
5850 }
5851
5852 while (cmdlist) {
5853 cmdnext = cmdlist->next;
5854 free(cmdlist->comm);
5855 free(cmdlist);
5856 cmdlist = cmdnext;
5857 }
5858
5859 if (pevent->func_map) {
5860 for (i = 0; i < (int)pevent->func_count; i++) {
5861 free(pevent->func_map[i].func);
5862 free(pevent->func_map[i].mod);
5863 }
5864 free(pevent->func_map);
5865 }
5866
5867 while (funclist) {
5868 funcnext = funclist->next;
5869 free(funclist->func);
5870 free(funclist->mod);
5871 free(funclist);
5872 funclist = funcnext;
5873 }
5874
5875 while (pevent->func_handlers) {
5876 func_handler = pevent->func_handlers;
5877 pevent->func_handlers = func_handler->next;
5878 free_func_handle(func_handler);
5879 }
5880
5881 if (pevent->printk_map) {
5882 for (i = 0; i < (int)pevent->printk_count; i++)
5883 free(pevent->printk_map[i].printk);
5884 free(pevent->printk_map);
5885 }
5886
5887 while (printklist) {
5888 printknext = printklist->next;
5889 free(printklist->printk);
5890 free(printklist);
5891 printklist = printknext;
5892 }
5893
5894 for (i = 0; i < pevent->nr_events; i++)
5895 pevent_free_format(pevent->events[i]);
5896
5897 while (pevent->handlers) {
5898 handle = pevent->handlers;
5899 pevent->handlers = handle->next;
5900 free_handler(handle);
5901 }
5902
5903 free(pevent->events);
5904 free(pevent->sort_events);
5905
5906 free(pevent);
5907}
5908
5909void pevent_unref(struct pevent *pevent)
5910{
5911 pevent_free(pevent);
5912}
1// SPDX-License-Identifier: LGPL-2.1
2/*
3 * Copyright (C) 2009, 2010 Red Hat Inc, Steven Rostedt <srostedt@redhat.com>
4 *
5 *
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.
11 */
12#include <inttypes.h>
13#include <stdio.h>
14#include <stdlib.h>
15#include <string.h>
16#include <stdarg.h>
17#include <ctype.h>
18#include <errno.h>
19#include <stdint.h>
20#include <limits.h>
21#include <linux/time64.h>
22
23#include <netinet/in.h>
24#include "event-parse.h"
25
26#include "event-parse-local.h"
27#include "event-utils.h"
28#include "trace-seq.h"
29
30static const char *input_buf;
31static unsigned long long input_buf_ptr;
32static unsigned long long input_buf_siz;
33
34static int is_flag_field;
35static int is_symbolic_field;
36
37static int show_warning = 1;
38
39#define do_warning(fmt, ...) \
40 do { \
41 if (show_warning) \
42 warning(fmt, ##__VA_ARGS__); \
43 } while (0)
44
45#define do_warning_event(event, fmt, ...) \
46 do { \
47 if (!show_warning) \
48 continue; \
49 \
50 if (event) \
51 warning("[%s:%s] " fmt, event->system, \
52 event->name, ##__VA_ARGS__); \
53 else \
54 warning(fmt, ##__VA_ARGS__); \
55 } while (0)
56
57static void init_input_buf(const char *buf, unsigned long long size)
58{
59 input_buf = buf;
60 input_buf_siz = size;
61 input_buf_ptr = 0;
62}
63
64const char *tep_get_input_buf(void)
65{
66 return input_buf;
67}
68
69unsigned long long tep_get_input_buf_ptr(void)
70{
71 return input_buf_ptr;
72}
73
74struct event_handler {
75 struct event_handler *next;
76 int id;
77 const char *sys_name;
78 const char *event_name;
79 tep_event_handler_func func;
80 void *context;
81};
82
83struct func_params {
84 struct func_params *next;
85 enum tep_func_arg_type type;
86};
87
88struct tep_function_handler {
89 struct tep_function_handler *next;
90 enum tep_func_arg_type ret_type;
91 char *name;
92 tep_func_handler func;
93 struct func_params *params;
94 int nr_args;
95};
96
97static unsigned long long
98process_defined_func(struct trace_seq *s, void *data, int size,
99 struct tep_event *event, struct tep_print_arg *arg);
100
101static void free_func_handle(struct tep_function_handler *func);
102
103/**
104 * tep_buffer_init - init buffer for parsing
105 * @buf: buffer to parse
106 * @size: the size of the buffer
107 *
108 * For use with tep_read_token(), this initializes the internal
109 * buffer that tep_read_token() will parse.
110 */
111void tep_buffer_init(const char *buf, unsigned long long size)
112{
113 init_input_buf(buf, size);
114}
115
116void breakpoint(void)
117{
118 static int x;
119 x++;
120}
121
122struct tep_print_arg *alloc_arg(void)
123{
124 return calloc(1, sizeof(struct tep_print_arg));
125}
126
127struct tep_cmdline {
128 char *comm;
129 int pid;
130};
131
132static int cmdline_cmp(const void *a, const void *b)
133{
134 const struct tep_cmdline *ca = a;
135 const struct tep_cmdline *cb = b;
136
137 if (ca->pid < cb->pid)
138 return -1;
139 if (ca->pid > cb->pid)
140 return 1;
141
142 return 0;
143}
144
145/* Looking for where to place the key */
146static int cmdline_slot_cmp(const void *a, const void *b)
147{
148 const struct tep_cmdline *ca = a;
149 const struct tep_cmdline *cb = b;
150 const struct tep_cmdline *cb1 = cb + 1;
151
152 if (ca->pid < cb->pid)
153 return -1;
154
155 if (ca->pid > cb->pid) {
156 if (ca->pid <= cb1->pid)
157 return 0;
158 return 1;
159 }
160
161 return 0;
162}
163
164struct cmdline_list {
165 struct cmdline_list *next;
166 char *comm;
167 int pid;
168};
169
170static int cmdline_init(struct tep_handle *tep)
171{
172 struct cmdline_list *cmdlist = tep->cmdlist;
173 struct cmdline_list *item;
174 struct tep_cmdline *cmdlines;
175 int i;
176
177 cmdlines = malloc(sizeof(*cmdlines) * tep->cmdline_count);
178 if (!cmdlines)
179 return -1;
180
181 i = 0;
182 while (cmdlist) {
183 cmdlines[i].pid = cmdlist->pid;
184 cmdlines[i].comm = cmdlist->comm;
185 i++;
186 item = cmdlist;
187 cmdlist = cmdlist->next;
188 free(item);
189 }
190
191 qsort(cmdlines, tep->cmdline_count, sizeof(*cmdlines), cmdline_cmp);
192
193 tep->cmdlines = cmdlines;
194 tep->cmdlist = NULL;
195
196 return 0;
197}
198
199static const char *find_cmdline(struct tep_handle *tep, int pid)
200{
201 const struct tep_cmdline *comm;
202 struct tep_cmdline key;
203
204 if (!pid)
205 return "<idle>";
206
207 if (!tep->cmdlines && cmdline_init(tep))
208 return "<not enough memory for cmdlines!>";
209
210 key.pid = pid;
211
212 comm = bsearch(&key, tep->cmdlines, tep->cmdline_count,
213 sizeof(*tep->cmdlines), cmdline_cmp);
214
215 if (comm)
216 return comm->comm;
217 return "<...>";
218}
219
220/**
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.
224 *
225 * Returns true if the pid has a cmdline mapped to it
226 * false otherwise.
227 */
228bool tep_is_pid_registered(struct tep_handle *tep, int pid)
229{
230 const struct tep_cmdline *comm;
231 struct tep_cmdline key;
232
233 if (!pid)
234 return true;
235
236 if (!tep->cmdlines && cmdline_init(tep))
237 return false;
238
239 key.pid = pid;
240
241 comm = bsearch(&key, tep->cmdlines, tep->cmdline_count,
242 sizeof(*tep->cmdlines), cmdline_cmp);
243
244 if (comm)
245 return true;
246 return false;
247}
248
249/*
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.
253 */
254static int add_new_comm(struct tep_handle *tep,
255 const char *comm, int pid, bool override)
256{
257 struct tep_cmdline *cmdlines = tep->cmdlines;
258 struct tep_cmdline *cmdline;
259 struct tep_cmdline key;
260 char *new_comm;
261 int cnt;
262
263 if (!pid)
264 return 0;
265
266 /* avoid duplicates */
267 key.pid = pid;
268
269 cmdline = bsearch(&key, tep->cmdlines, tep->cmdline_count,
270 sizeof(*tep->cmdlines), cmdline_cmp);
271 if (cmdline) {
272 if (!override) {
273 errno = EEXIST;
274 return -1;
275 }
276 new_comm = strdup(comm);
277 if (!new_comm) {
278 errno = ENOMEM;
279 return -1;
280 }
281 free(cmdline->comm);
282 cmdline->comm = new_comm;
283
284 return 0;
285 }
286
287 cmdlines = realloc(cmdlines, sizeof(*cmdlines) * (tep->cmdline_count + 1));
288 if (!cmdlines) {
289 errno = ENOMEM;
290 return -1;
291 }
292 tep->cmdlines = cmdlines;
293
294 key.comm = strdup(comm);
295 if (!key.comm) {
296 errno = ENOMEM;
297 return -1;
298 }
299
300 if (!tep->cmdline_count) {
301 /* no entries yet */
302 tep->cmdlines[0] = key;
303 tep->cmdline_count++;
304 return 0;
305 }
306
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);
310
311 cnt = tep->cmdline_count;
312 if (cmdline) {
313 /* cmdline points to the one before the spot we want */
314 cmdline++;
315 cnt -= cmdline - tep->cmdlines;
316
317 } else {
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;
321 return 0;
322 }
323 cmdline = &tep->cmdlines[0];
324 }
325 memmove(cmdline + 1, cmdline, (cnt * sizeof(*cmdline)));
326 *cmdline = key;
327
328 tep->cmdline_count++;
329
330 return 0;
331}
332
333static int _tep_register_comm(struct tep_handle *tep,
334 const char *comm, int pid, bool override)
335{
336 struct cmdline_list *item;
337
338 if (tep->cmdlines)
339 return add_new_comm(tep, comm, pid, override);
340
341 item = malloc(sizeof(*item));
342 if (!item)
343 return -1;
344
345 if (comm)
346 item->comm = strdup(comm);
347 else
348 item->comm = strdup("<...>");
349 if (!item->comm) {
350 free(item);
351 return -1;
352 }
353 item->pid = pid;
354 item->next = tep->cmdlist;
355
356 tep->cmdlist = item;
357 tep->cmdline_count++;
358
359 return 0;
360}
361
362/**
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
367 *
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
371 */
372int tep_register_comm(struct tep_handle *tep, const char *comm, int pid)
373{
374 return _tep_register_comm(tep, comm, pid, false);
375}
376
377/**
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
382 *
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
386 */
387int tep_override_comm(struct tep_handle *tep, const char *comm, int pid)
388{
389 if (!tep->cmdlines && cmdline_init(tep)) {
390 errno = ENOMEM;
391 return -1;
392 }
393 return _tep_register_comm(tep, comm, pid, true);
394}
395
396struct func_map {
397 unsigned long long addr;
398 char *func;
399 char *mod;
400};
401
402struct func_list {
403 struct func_list *next;
404 unsigned long long addr;
405 char *func;
406 char *mod;
407};
408
409static int func_cmp(const void *a, const void *b)
410{
411 const struct func_map *fa = a;
412 const struct func_map *fb = b;
413
414 if (fa->addr < fb->addr)
415 return -1;
416 if (fa->addr > fb->addr)
417 return 1;
418
419 return 0;
420}
421
422/*
423 * We are searching for a record in between, not an exact
424 * match.
425 */
426static int func_bcmp(const void *a, const void *b)
427{
428 const struct func_map *fa = a;
429 const struct func_map *fb = b;
430
431 if ((fa->addr == fb->addr) ||
432
433 (fa->addr > fb->addr &&
434 fa->addr < (fb+1)->addr))
435 return 0;
436
437 if (fa->addr < fb->addr)
438 return -1;
439
440 return 1;
441}
442
443static int func_map_init(struct tep_handle *tep)
444{
445 struct func_list *funclist;
446 struct func_list *item;
447 struct func_map *func_map;
448 int i;
449
450 func_map = malloc(sizeof(*func_map) * (tep->func_count + 1));
451 if (!func_map)
452 return -1;
453
454 funclist = tep->funclist;
455
456 i = 0;
457 while (funclist) {
458 func_map[i].func = funclist->func;
459 func_map[i].addr = funclist->addr;
460 func_map[i].mod = funclist->mod;
461 i++;
462 item = funclist;
463 funclist = funclist->next;
464 free(item);
465 }
466
467 qsort(func_map, tep->func_count, sizeof(*func_map), func_cmp);
468
469 /*
470 * Add a special record at the end.
471 */
472 func_map[tep->func_count].func = NULL;
473 func_map[tep->func_count].addr = 0;
474 func_map[tep->func_count].mod = NULL;
475
476 tep->func_map = func_map;
477 tep->funclist = NULL;
478
479 return 0;
480}
481
482static struct func_map *
483__find_func(struct tep_handle *tep, unsigned long long addr)
484{
485 struct func_map *func;
486 struct func_map key;
487
488 if (!tep->func_map)
489 func_map_init(tep);
490
491 key.addr = addr;
492
493 func = bsearch(&key, tep->func_map, tep->func_count,
494 sizeof(*tep->func_map), func_bcmp);
495
496 return func;
497}
498
499struct func_resolver {
500 tep_func_resolver_t *func;
501 void *priv;
502 struct func_map map;
503};
504
505/**
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.
510 *
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.
513 */
514int tep_set_function_resolver(struct tep_handle *tep,
515 tep_func_resolver_t *func, void *priv)
516{
517 struct func_resolver *resolver = malloc(sizeof(*resolver));
518
519 if (resolver == NULL)
520 return -1;
521
522 resolver->func = func;
523 resolver->priv = priv;
524
525 free(tep->func_resolver);
526 tep->func_resolver = resolver;
527
528 return 0;
529}
530
531/**
532 * tep_reset_function_resolver - reset alternative function resolver
533 * @tep: a handle to the trace event parser context
534 *
535 * Stop using whatever alternative resolver was set, use the default
536 * one instead.
537 */
538void tep_reset_function_resolver(struct tep_handle *tep)
539{
540 free(tep->func_resolver);
541 tep->func_resolver = NULL;
542}
543
544static struct func_map *
545find_func(struct tep_handle *tep, unsigned long long addr)
546{
547 struct func_map *map;
548
549 if (!tep->func_resolver)
550 return __find_func(tep, addr);
551
552 map = &tep->func_resolver->map;
553 map->mod = NULL;
554 map->addr = addr;
555 map->func = tep->func_resolver->func(tep->func_resolver->priv,
556 &map->addr, &map->mod);
557 if (map->func == NULL)
558 return NULL;
559
560 return map;
561}
562
563/**
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
567 *
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.
571 */
572const char *tep_find_function(struct tep_handle *tep, unsigned long long addr)
573{
574 struct func_map *map;
575
576 map = find_func(tep, addr);
577 if (!map)
578 return NULL;
579
580 return map->func;
581}
582
583/**
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
587 *
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.
591 */
592unsigned long long
593tep_find_function_address(struct tep_handle *tep, unsigned long long addr)
594{
595 struct func_map *map;
596
597 map = find_func(tep, addr);
598 if (!map)
599 return 0;
600
601 return map->addr;
602}
603
604/**
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)
610 *
611 * This registers a function name with an address and module.
612 * The @func passed in is duplicated.
613 */
614int tep_register_function(struct tep_handle *tep, char *func,
615 unsigned long long addr, char *mod)
616{
617 struct func_list *item = malloc(sizeof(*item));
618
619 if (!item)
620 return -1;
621
622 item->next = tep->funclist;
623 item->func = strdup(func);
624 if (!item->func)
625 goto out_free;
626
627 if (mod) {
628 item->mod = strdup(mod);
629 if (!item->mod)
630 goto out_free_func;
631 } else
632 item->mod = NULL;
633 item->addr = addr;
634
635 tep->funclist = item;
636 tep->func_count++;
637
638 return 0;
639
640out_free_func:
641 free(item->func);
642 item->func = NULL;
643out_free:
644 free(item);
645 errno = ENOMEM;
646 return -1;
647}
648
649/**
650 * tep_print_funcs - print out the stored functions
651 * @tep: a handle to the trace event parser context
652 *
653 * This prints out the stored functions.
654 */
655void tep_print_funcs(struct tep_handle *tep)
656{
657 int i;
658
659 if (!tep->func_map)
660 func_map_init(tep);
661
662 for (i = 0; i < (int)tep->func_count; i++) {
663 printf("%016llx %s",
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);
668 else
669 printf("\n");
670 }
671}
672
673struct printk_map {
674 unsigned long long addr;
675 char *printk;
676};
677
678struct printk_list {
679 struct printk_list *next;
680 unsigned long long addr;
681 char *printk;
682};
683
684static int printk_cmp(const void *a, const void *b)
685{
686 const struct printk_map *pa = a;
687 const struct printk_map *pb = b;
688
689 if (pa->addr < pb->addr)
690 return -1;
691 if (pa->addr > pb->addr)
692 return 1;
693
694 return 0;
695}
696
697static int printk_map_init(struct tep_handle *tep)
698{
699 struct printk_list *printklist;
700 struct printk_list *item;
701 struct printk_map *printk_map;
702 int i;
703
704 printk_map = malloc(sizeof(*printk_map) * (tep->printk_count + 1));
705 if (!printk_map)
706 return -1;
707
708 printklist = tep->printklist;
709
710 i = 0;
711 while (printklist) {
712 printk_map[i].printk = printklist->printk;
713 printk_map[i].addr = printklist->addr;
714 i++;
715 item = printklist;
716 printklist = printklist->next;
717 free(item);
718 }
719
720 qsort(printk_map, tep->printk_count, sizeof(*printk_map), printk_cmp);
721
722 tep->printk_map = printk_map;
723 tep->printklist = NULL;
724
725 return 0;
726}
727
728static struct printk_map *
729find_printk(struct tep_handle *tep, unsigned long long addr)
730{
731 struct printk_map *printk;
732 struct printk_map key;
733
734 if (!tep->printk_map && printk_map_init(tep))
735 return NULL;
736
737 key.addr = addr;
738
739 printk = bsearch(&key, tep->printk_map, tep->printk_count,
740 sizeof(*tep->printk_map), printk_cmp);
741
742 return printk;
743}
744
745/**
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
750 *
751 * This registers a string by the address it was stored in the kernel.
752 * The @fmt passed in is duplicated.
753 */
754int tep_register_print_string(struct tep_handle *tep, const char *fmt,
755 unsigned long long addr)
756{
757 struct printk_list *item = malloc(sizeof(*item));
758 char *p;
759
760 if (!item)
761 return -1;
762
763 item->next = tep->printklist;
764 item->addr = addr;
765
766 /* Strip off quotes and '\n' from the end */
767 if (fmt[0] == '"')
768 fmt++;
769 item->printk = strdup(fmt);
770 if (!item->printk)
771 goto out_free;
772
773 p = item->printk + strlen(item->printk) - 1;
774 if (*p == '"')
775 *p = 0;
776
777 p -= 2;
778 if (strcmp(p, "\\n") == 0)
779 *p = 0;
780
781 tep->printklist = item;
782 tep->printk_count++;
783
784 return 0;
785
786out_free:
787 free(item);
788 errno = ENOMEM;
789 return -1;
790}
791
792/**
793 * tep_print_printk - print out the stored strings
794 * @tep: a handle to the trace event parser context
795 *
796 * This prints the string formats that were stored.
797 */
798void tep_print_printk(struct tep_handle *tep)
799{
800 int i;
801
802 if (!tep->printk_map)
803 printk_map_init(tep);
804
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);
809 }
810}
811
812static struct tep_event *alloc_event(void)
813{
814 return calloc(1, sizeof(struct tep_event));
815}
816
817static int add_event(struct tep_handle *tep, struct tep_event *event)
818{
819 int i;
820 struct tep_event **events = realloc(tep->events, sizeof(event) *
821 (tep->nr_events + 1));
822 if (!events)
823 return -1;
824
825 tep->events = events;
826
827 for (i = 0; i < tep->nr_events; i++) {
828 if (tep->events[i]->id > event->id)
829 break;
830 }
831 if (i < tep->nr_events)
832 memmove(&tep->events[i + 1],
833 &tep->events[i],
834 sizeof(event) * (tep->nr_events - i));
835
836 tep->events[i] = event;
837 tep->nr_events++;
838
839 event->tep = tep;
840
841 return 0;
842}
843
844static int event_item_type(enum tep_event_type type)
845{
846 switch (type) {
847 case TEP_EVENT_ITEM ... TEP_EVENT_SQUOTE:
848 return 1;
849 case TEP_EVENT_ERROR ... TEP_EVENT_DELIM:
850 default:
851 return 0;
852 }
853}
854
855static void free_flag_sym(struct tep_print_flag_sym *fsym)
856{
857 struct tep_print_flag_sym *next;
858
859 while (fsym) {
860 next = fsym->next;
861 free(fsym->value);
862 free(fsym->str);
863 free(fsym);
864 fsym = next;
865 }
866}
867
868static void free_arg(struct tep_print_arg *arg)
869{
870 struct tep_print_arg *farg;
871
872 if (!arg)
873 return;
874
875 switch (arg->type) {
876 case TEP_PRINT_ATOM:
877 free(arg->atom.atom);
878 break;
879 case TEP_PRINT_FIELD:
880 free(arg->field.name);
881 break;
882 case TEP_PRINT_FLAGS:
883 free_arg(arg->flags.field);
884 free(arg->flags.delim);
885 free_flag_sym(arg->flags.flags);
886 break;
887 case TEP_PRINT_SYMBOL:
888 free_arg(arg->symbol.field);
889 free_flag_sym(arg->symbol.symbols);
890 break;
891 case TEP_PRINT_HEX:
892 case TEP_PRINT_HEX_STR:
893 free_arg(arg->hex.field);
894 free_arg(arg->hex.size);
895 break;
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);
900 break;
901 case TEP_PRINT_TYPE:
902 free(arg->typecast.type);
903 free_arg(arg->typecast.item);
904 break;
905 case TEP_PRINT_STRING:
906 case TEP_PRINT_BSTRING:
907 free(arg->string.string);
908 break;
909 case TEP_PRINT_BITMASK:
910 free(arg->bitmask.bitmask);
911 break;
912 case TEP_PRINT_DYNAMIC_ARRAY:
913 case TEP_PRINT_DYNAMIC_ARRAY_LEN:
914 free(arg->dynarray.index);
915 break;
916 case TEP_PRINT_OP:
917 free(arg->op.op);
918 free_arg(arg->op.left);
919 free_arg(arg->op.right);
920 break;
921 case TEP_PRINT_FUNC:
922 while (arg->func.args) {
923 farg = arg->func.args;
924 arg->func.args = farg->next;
925 free_arg(farg);
926 }
927 break;
928
929 case TEP_PRINT_NULL:
930 default:
931 break;
932 }
933
934 free(arg);
935}
936
937static enum tep_event_type get_type(int ch)
938{
939 if (ch == '\n')
940 return TEP_EVENT_NEWLINE;
941 if (isspace(ch))
942 return TEP_EVENT_SPACE;
943 if (isalnum(ch) || ch == '_')
944 return TEP_EVENT_ITEM;
945 if (ch == '\'')
946 return TEP_EVENT_SQUOTE;
947 if (ch == '"')
948 return TEP_EVENT_DQUOTE;
949 if (!isprint(ch))
950 return TEP_EVENT_NONE;
951 if (ch == '(' || ch == ')' || ch == ',')
952 return TEP_EVENT_DELIM;
953
954 return TEP_EVENT_OP;
955}
956
957static int __read_char(void)
958{
959 if (input_buf_ptr >= input_buf_siz)
960 return -1;
961
962 return input_buf[input_buf_ptr++];
963}
964
965static int __peek_char(void)
966{
967 if (input_buf_ptr >= input_buf_siz)
968 return -1;
969
970 return input_buf[input_buf_ptr];
971}
972
973/**
974 * tep_peek_char - peek at the next character that will be read
975 *
976 * Returns the next character read, or -1 if end of buffer.
977 */
978int tep_peek_char(void)
979{
980 return __peek_char();
981}
982
983static int extend_token(char **tok, char *buf, int size)
984{
985 char *newtok = realloc(*tok, size);
986
987 if (!newtok) {
988 free(*tok);
989 *tok = NULL;
990 return -1;
991 }
992
993 if (!*tok)
994 strcpy(newtok, buf);
995 else
996 strcat(newtok, buf);
997 *tok = newtok;
998
999 return 0;
1000}
1001
1002static enum tep_event_type force_token(const char *str, char **tok);
1003
1004static enum tep_event_type __read_token(char **tok)
1005{
1006 char buf[BUFSIZ];
1007 int ch, last_ch, quote_ch, next_ch;
1008 int i = 0;
1009 int tok_size = 0;
1010 enum tep_event_type type;
1011
1012 *tok = NULL;
1013
1014
1015 ch = __read_char();
1016 if (ch < 0)
1017 return TEP_EVENT_NONE;
1018
1019 type = get_type(ch);
1020 if (type == TEP_EVENT_NONE)
1021 return type;
1022
1023 buf[i++] = ch;
1024
1025 switch (type) {
1026 case TEP_EVENT_NEWLINE:
1027 case TEP_EVENT_DELIM:
1028 if (asprintf(tok, "%c", ch) < 0)
1029 return TEP_EVENT_ERROR;
1030
1031 return type;
1032
1033 case TEP_EVENT_OP:
1034 switch (ch) {
1035 case '-':
1036 next_ch = __peek_char();
1037 if (next_ch == '>') {
1038 buf[i++] = __read_char();
1039 break;
1040 }
1041 /* fall through */
1042 case '+':
1043 case '|':
1044 case '&':
1045 case '>':
1046 case '<':
1047 last_ch = ch;
1048 ch = __peek_char();
1049 if (ch != last_ch)
1050 goto test_equal;
1051 buf[i++] = __read_char();
1052 switch (last_ch) {
1053 case '>':
1054 case '<':
1055 goto test_equal;
1056 default:
1057 break;
1058 }
1059 break;
1060 case '!':
1061 case '=':
1062 goto test_equal;
1063 default: /* what should we do instead? */
1064 break;
1065 }
1066 buf[i] = 0;
1067 *tok = strdup(buf);
1068 return type;
1069
1070 test_equal:
1071 ch = __peek_char();
1072 if (ch == '=')
1073 buf[i++] = __read_char();
1074 goto out;
1075
1076 case TEP_EVENT_DQUOTE:
1077 case TEP_EVENT_SQUOTE:
1078 /* don't keep quotes */
1079 i--;
1080 quote_ch = ch;
1081 last_ch = 0;
1082 concat:
1083 do {
1084 if (i == (BUFSIZ - 1)) {
1085 buf[i] = 0;
1086 tok_size += BUFSIZ;
1087
1088 if (extend_token(tok, buf, tok_size) < 0)
1089 return TEP_EVENT_NONE;
1090 i = 0;
1091 }
1092 last_ch = ch;
1093 ch = __read_char();
1094 buf[i++] = ch;
1095 /* the '\' '\' will cancel itself */
1096 if (ch == '\\' && last_ch == '\\')
1097 last_ch = 0;
1098 } while (ch != quote_ch || last_ch == '\\');
1099 /* remove the last quote */
1100 i--;
1101
1102 /*
1103 * For strings (double quotes) check the next token.
1104 * If it is another string, concatinate the two.
1105 */
1106 if (type == TEP_EVENT_DQUOTE) {
1107 unsigned long long save_input_buf_ptr = input_buf_ptr;
1108
1109 do {
1110 ch = __read_char();
1111 } while (isspace(ch));
1112 if (ch == '"')
1113 goto concat;
1114 input_buf_ptr = save_input_buf_ptr;
1115 }
1116
1117 goto out;
1118
1119 case TEP_EVENT_ERROR ... TEP_EVENT_SPACE:
1120 case TEP_EVENT_ITEM:
1121 default:
1122 break;
1123 }
1124
1125 while (get_type(__peek_char()) == type) {
1126 if (i == (BUFSIZ - 1)) {
1127 buf[i] = 0;
1128 tok_size += BUFSIZ;
1129
1130 if (extend_token(tok, buf, tok_size) < 0)
1131 return TEP_EVENT_NONE;
1132 i = 0;
1133 }
1134 ch = __read_char();
1135 buf[i++] = ch;
1136 }
1137
1138 out:
1139 buf[i] = 0;
1140 if (extend_token(tok, buf, tok_size + i + 1) < 0)
1141 return TEP_EVENT_NONE;
1142
1143 if (type == TEP_EVENT_ITEM) {
1144 /*
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.
1148 *
1149 * See Linux kernel commit:
1150 * 811cb50baf63461ce0bdb234927046131fc7fa8b
1151 */
1152 if (strcmp(*tok, "LOCAL_PR_FMT") == 0) {
1153 free(*tok);
1154 *tok = NULL;
1155 return force_token("\"%s\" ", tok);
1156 } else if (strcmp(*tok, "STA_PR_FMT") == 0) {
1157 free(*tok);
1158 *tok = NULL;
1159 return force_token("\" sta:%pM\" ", tok);
1160 } else if (strcmp(*tok, "VIF_PR_FMT") == 0) {
1161 free(*tok);
1162 *tok = NULL;
1163 return force_token("\" vif:%p(%d)\" ", tok);
1164 }
1165 }
1166
1167 return type;
1168}
1169
1170static enum tep_event_type force_token(const char *str, char **tok)
1171{
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;
1176
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;
1181
1182 init_input_buf(str, strlen(str));
1183
1184 type = __read_token(tok);
1185
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;
1190
1191 return type;
1192}
1193
1194static void free_token(char *tok)
1195{
1196 if (tok)
1197 free(tok);
1198}
1199
1200static enum tep_event_type read_token(char **tok)
1201{
1202 enum tep_event_type type;
1203
1204 for (;;) {
1205 type = __read_token(tok);
1206 if (type != TEP_EVENT_SPACE)
1207 return type;
1208
1209 free_token(*tok);
1210 }
1211
1212 /* not reached */
1213 *tok = NULL;
1214 return TEP_EVENT_NONE;
1215}
1216
1217/**
1218 * tep_read_token - access to utilities to use the tep parser
1219 * @tok: The token to return
1220 *
1221 * This will parse tokens from the string given by
1222 * tep_init_data().
1223 *
1224 * Returns the token type.
1225 */
1226enum tep_event_type tep_read_token(char **tok)
1227{
1228 return read_token(tok);
1229}
1230
1231/**
1232 * tep_free_token - free a token returned by tep_read_token
1233 * @token: the token to free
1234 */
1235void tep_free_token(char *token)
1236{
1237 free_token(token);
1238}
1239
1240/* no newline */
1241static enum tep_event_type read_token_item(char **tok)
1242{
1243 enum tep_event_type type;
1244
1245 for (;;) {
1246 type = __read_token(tok);
1247 if (type != TEP_EVENT_SPACE && type != TEP_EVENT_NEWLINE)
1248 return type;
1249 free_token(*tok);
1250 *tok = NULL;
1251 }
1252
1253 /* not reached */
1254 *tok = NULL;
1255 return TEP_EVENT_NONE;
1256}
1257
1258static int test_type(enum tep_event_type type, enum tep_event_type expect)
1259{
1260 if (type != expect) {
1261 do_warning("Error: expected type %d but read %d",
1262 expect, type);
1263 return -1;
1264 }
1265 return 0;
1266}
1267
1268static int test_type_token(enum tep_event_type type, const char *token,
1269 enum tep_event_type expect, const char *expect_tok)
1270{
1271 if (type != expect) {
1272 do_warning("Error: expected type %d but read %d",
1273 expect, type);
1274 return -1;
1275 }
1276
1277 if (strcmp(token, expect_tok) != 0) {
1278 do_warning("Error: expected '%s' but read '%s'",
1279 expect_tok, token);
1280 return -1;
1281 }
1282 return 0;
1283}
1284
1285static int __read_expect_type(enum tep_event_type expect, char **tok, int newline_ok)
1286{
1287 enum tep_event_type type;
1288
1289 if (newline_ok)
1290 type = read_token(tok);
1291 else
1292 type = read_token_item(tok);
1293 return test_type(type, expect);
1294}
1295
1296static int read_expect_type(enum tep_event_type expect, char **tok)
1297{
1298 return __read_expect_type(expect, tok, 1);
1299}
1300
1301static int __read_expected(enum tep_event_type expect, const char *str,
1302 int newline_ok)
1303{
1304 enum tep_event_type type;
1305 char *token;
1306 int ret;
1307
1308 if (newline_ok)
1309 type = read_token(&token);
1310 else
1311 type = read_token_item(&token);
1312
1313 ret = test_type_token(type, token, expect, str);
1314
1315 free_token(token);
1316
1317 return ret;
1318}
1319
1320static int read_expected(enum tep_event_type expect, const char *str)
1321{
1322 return __read_expected(expect, str, 1);
1323}
1324
1325static int read_expected_item(enum tep_event_type expect, const char *str)
1326{
1327 return __read_expected(expect, str, 0);
1328}
1329
1330static char *event_read_name(void)
1331{
1332 char *token;
1333
1334 if (read_expected(TEP_EVENT_ITEM, "name") < 0)
1335 return NULL;
1336
1337 if (read_expected(TEP_EVENT_OP, ":") < 0)
1338 return NULL;
1339
1340 if (read_expect_type(TEP_EVENT_ITEM, &token) < 0)
1341 goto fail;
1342
1343 return token;
1344
1345 fail:
1346 free_token(token);
1347 return NULL;
1348}
1349
1350static int event_read_id(void)
1351{
1352 char *token;
1353 int id;
1354
1355 if (read_expected_item(TEP_EVENT_ITEM, "ID") < 0)
1356 return -1;
1357
1358 if (read_expected(TEP_EVENT_OP, ":") < 0)
1359 return -1;
1360
1361 if (read_expect_type(TEP_EVENT_ITEM, &token) < 0)
1362 goto fail;
1363
1364 id = strtoul(token, NULL, 0);
1365 free_token(token);
1366 return id;
1367
1368 fail:
1369 free_token(token);
1370 return -1;
1371}
1372
1373static int field_is_string(struct tep_format_field *field)
1374{
1375 if ((field->flags & TEP_FIELD_IS_ARRAY) &&
1376 (strstr(field->type, "char") || strstr(field->type, "u8") ||
1377 strstr(field->type, "s8")))
1378 return 1;
1379
1380 return 0;
1381}
1382
1383static int field_is_dynamic(struct tep_format_field *field)
1384{
1385 if (strncmp(field->type, "__data_loc", 10) == 0)
1386 return 1;
1387
1388 return 0;
1389}
1390
1391static int field_is_long(struct tep_format_field *field)
1392{
1393 /* includes long long */
1394 if (strstr(field->type, "long"))
1395 return 1;
1396
1397 return 0;
1398}
1399
1400static unsigned int type_size(const char *name)
1401{
1402 /* This covers all TEP_FIELD_IS_STRING types. */
1403 static struct {
1404 const char *type;
1405 unsigned int size;
1406 } table[] = {
1407 { "u8", 1 },
1408 { "u16", 2 },
1409 { "u32", 4 },
1410 { "u64", 8 },
1411 { "s8", 1 },
1412 { "s16", 2 },
1413 { "s32", 4 },
1414 { "s64", 8 },
1415 { "char", 1 },
1416 { },
1417 };
1418 int i;
1419
1420 for (i = 0; table[i].type; i++) {
1421 if (!strcmp(table[i].type, name))
1422 return table[i].size;
1423 }
1424
1425 return 0;
1426}
1427
1428static int event_read_fields(struct tep_event *event, struct tep_format_field **fields)
1429{
1430 struct tep_format_field *field = NULL;
1431 enum tep_event_type type;
1432 char *token;
1433 char *last_token;
1434 int count = 0;
1435
1436 do {
1437 unsigned int size_dynamic = 0;
1438
1439 type = read_token(&token);
1440 if (type == TEP_EVENT_NEWLINE) {
1441 free_token(token);
1442 return count;
1443 }
1444
1445 count++;
1446
1447 if (test_type_token(type, token, TEP_EVENT_ITEM, "field"))
1448 goto fail;
1449 free_token(token);
1450
1451 type = read_token(&token);
1452 /*
1453 * The ftrace fields may still use the "special" name.
1454 * Just ignore it.
1455 */
1456 if (event->flags & TEP_EVENT_FL_ISFTRACE &&
1457 type == TEP_EVENT_ITEM && strcmp(token, "special") == 0) {
1458 free_token(token);
1459 type = read_token(&token);
1460 }
1461
1462 if (test_type_token(type, token, TEP_EVENT_OP, ":") < 0)
1463 goto fail;
1464
1465 free_token(token);
1466 if (read_expect_type(TEP_EVENT_ITEM, &token) < 0)
1467 goto fail;
1468
1469 last_token = token;
1470
1471 field = calloc(1, sizeof(*field));
1472 if (!field)
1473 goto fail;
1474
1475 field->event = event;
1476
1477 /* read the rest of the type */
1478 for (;;) {
1479 type = read_token(&token);
1480 if (type == TEP_EVENT_ITEM ||
1481 (type == TEP_EVENT_OP && strcmp(token, "*") == 0) ||
1482 /*
1483 * Some of the ftrace fields are broken and have
1484 * an illegal "." in them.
1485 */
1486 (event->flags & TEP_EVENT_FL_ISFTRACE &&
1487 type == TEP_EVENT_OP && strcmp(token, ".") == 0)) {
1488
1489 if (strcmp(token, "*") == 0)
1490 field->flags |= TEP_FIELD_IS_POINTER;
1491
1492 if (field->type) {
1493 char *new_type;
1494 new_type = realloc(field->type,
1495 strlen(field->type) +
1496 strlen(last_token) + 2);
1497 if (!new_type) {
1498 free(last_token);
1499 goto fail;
1500 }
1501 field->type = new_type;
1502 strcat(field->type, " ");
1503 strcat(field->type, last_token);
1504 free(last_token);
1505 } else
1506 field->type = last_token;
1507 last_token = token;
1508 continue;
1509 }
1510
1511 break;
1512 }
1513
1514 if (!field->type) {
1515 do_warning_event(event, "%s: no type found", __func__);
1516 goto fail;
1517 }
1518 field->name = field->alias = last_token;
1519
1520 if (test_type(type, TEP_EVENT_OP))
1521 goto fail;
1522
1523 if (strcmp(token, "[") == 0) {
1524 enum tep_event_type last_type = type;
1525 char *brackets = token;
1526 char *new_brackets;
1527 int len;
1528
1529 field->flags |= TEP_FIELD_IS_ARRAY;
1530
1531 type = read_token(&token);
1532
1533 if (type == TEP_EVENT_ITEM)
1534 field->arraylen = strtoul(token, NULL, 0);
1535 else
1536 field->arraylen = 0;
1537
1538 while (strcmp(token, "]") != 0) {
1539 if (last_type == TEP_EVENT_ITEM &&
1540 type == TEP_EVENT_ITEM)
1541 len = 2;
1542 else
1543 len = 1;
1544 last_type = type;
1545
1546 new_brackets = realloc(brackets,
1547 strlen(brackets) +
1548 strlen(token) + len);
1549 if (!new_brackets) {
1550 free(brackets);
1551 goto fail;
1552 }
1553 brackets = new_brackets;
1554 if (len == 2)
1555 strcat(brackets, " ");
1556 strcat(brackets, token);
1557 /* We only care about the last token */
1558 field->arraylen = strtoul(token, NULL, 0);
1559 free_token(token);
1560 type = read_token(&token);
1561 if (type == TEP_EVENT_NONE) {
1562 do_warning_event(event, "failed to find token");
1563 goto fail;
1564 }
1565 }
1566
1567 free_token(token);
1568
1569 new_brackets = realloc(brackets, strlen(brackets) + 2);
1570 if (!new_brackets) {
1571 free(brackets);
1572 goto fail;
1573 }
1574 brackets = new_brackets;
1575 strcat(brackets, "]");
1576
1577 /* add brackets to type */
1578
1579 type = read_token(&token);
1580 /*
1581 * If the next token is not an OP, then it is of
1582 * the format: type [] item;
1583 */
1584 if (type == TEP_EVENT_ITEM) {
1585 char *new_type;
1586 new_type = realloc(field->type,
1587 strlen(field->type) +
1588 strlen(field->name) +
1589 strlen(brackets) + 2);
1590 if (!new_type) {
1591 free(brackets);
1592 goto fail;
1593 }
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);
1602 } else {
1603 char *new_type;
1604 new_type = realloc(field->type,
1605 strlen(field->type) +
1606 strlen(brackets) + 1);
1607 if (!new_type) {
1608 free(brackets);
1609 goto fail;
1610 }
1611 field->type = new_type;
1612 strcat(field->type, brackets);
1613 }
1614 free(brackets);
1615 }
1616
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;
1623
1624 if (test_type_token(type, token, TEP_EVENT_OP, ";"))
1625 goto fail;
1626 free_token(token);
1627
1628 if (read_expected(TEP_EVENT_ITEM, "offset") < 0)
1629 goto fail_expect;
1630
1631 if (read_expected(TEP_EVENT_OP, ":") < 0)
1632 goto fail_expect;
1633
1634 if (read_expect_type(TEP_EVENT_ITEM, &token))
1635 goto fail;
1636 field->offset = strtoul(token, NULL, 0);
1637 free_token(token);
1638
1639 if (read_expected(TEP_EVENT_OP, ";") < 0)
1640 goto fail_expect;
1641
1642 if (read_expected(TEP_EVENT_ITEM, "size") < 0)
1643 goto fail_expect;
1644
1645 if (read_expected(TEP_EVENT_OP, ":") < 0)
1646 goto fail_expect;
1647
1648 if (read_expect_type(TEP_EVENT_ITEM, &token))
1649 goto fail;
1650 field->size = strtoul(token, NULL, 0);
1651 free_token(token);
1652
1653 if (read_expected(TEP_EVENT_OP, ";") < 0)
1654 goto fail_expect;
1655
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"))
1660 goto fail;
1661
1662 free_token(token);
1663
1664 if (read_expected(TEP_EVENT_OP, ":") < 0)
1665 goto fail_expect;
1666
1667 if (read_expect_type(TEP_EVENT_ITEM, &token))
1668 goto fail;
1669
1670 if (strtoul(token, NULL, 0))
1671 field->flags |= TEP_FIELD_IS_SIGNED;
1672
1673 free_token(token);
1674 if (read_expected(TEP_EVENT_OP, ";") < 0)
1675 goto fail_expect;
1676
1677 if (read_expect_type(TEP_EVENT_NEWLINE, &token))
1678 goto fail;
1679 }
1680
1681 free_token(token);
1682
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 :
1693 sizeof(long);
1694 } else
1695 field->elementsize = field->size;
1696
1697 *fields = field;
1698 fields = &field->next;
1699
1700 } while (1);
1701
1702 return 0;
1703
1704fail:
1705 free_token(token);
1706fail_expect:
1707 if (field) {
1708 free(field->type);
1709 free(field->name);
1710 free(field);
1711 }
1712 return -1;
1713}
1714
1715static int event_read_format(struct tep_event *event)
1716{
1717 char *token;
1718 int ret;
1719
1720 if (read_expected_item(TEP_EVENT_ITEM, "format") < 0)
1721 return -1;
1722
1723 if (read_expected(TEP_EVENT_OP, ":") < 0)
1724 return -1;
1725
1726 if (read_expect_type(TEP_EVENT_NEWLINE, &token))
1727 goto fail;
1728 free_token(token);
1729
1730 ret = event_read_fields(event, &event->format.common_fields);
1731 if (ret < 0)
1732 return ret;
1733 event->format.nr_common = ret;
1734
1735 ret = event_read_fields(event, &event->format.fields);
1736 if (ret < 0)
1737 return ret;
1738 event->format.nr_fields = ret;
1739
1740 return 0;
1741
1742 fail:
1743 free_token(token);
1744 return -1;
1745}
1746
1747static enum tep_event_type
1748process_arg_token(struct tep_event *event, struct tep_print_arg *arg,
1749 char **tok, enum tep_event_type type);
1750
1751static enum tep_event_type
1752process_arg(struct tep_event *event, struct tep_print_arg *arg, char **tok)
1753{
1754 enum tep_event_type type;
1755 char *token;
1756
1757 type = read_token(&token);
1758 *tok = token;
1759
1760 return process_arg_token(event, arg, tok, type);
1761}
1762
1763static enum tep_event_type
1764process_op(struct tep_event *event, struct tep_print_arg *arg, char **tok);
1765
1766/*
1767 * For __print_symbolic() and __print_flags, we need to completely
1768 * evaluate the first argument, which defines what to print next.
1769 */
1770static enum tep_event_type
1771process_field_arg(struct tep_event *event, struct tep_print_arg *arg, char **tok)
1772{
1773 enum tep_event_type type;
1774
1775 type = process_arg(event, arg, tok);
1776
1777 while (type == TEP_EVENT_OP) {
1778 type = process_op(event, arg, tok);
1779 }
1780
1781 return type;
1782}
1783
1784static enum tep_event_type
1785process_cond(struct tep_event *event, struct tep_print_arg *top, char **tok)
1786{
1787 struct tep_print_arg *arg, *left, *right;
1788 enum tep_event_type type;
1789 char *token = NULL;
1790
1791 arg = alloc_arg();
1792 left = alloc_arg();
1793 right = alloc_arg();
1794
1795 if (!arg || !left || !right) {
1796 do_warning_event(event, "%s: not enough memory!", __func__);
1797 /* arg will be freed at out_free */
1798 free_arg(left);
1799 free_arg(right);
1800 goto out_free;
1801 }
1802
1803 arg->type = TEP_PRINT_OP;
1804 arg->op.left = left;
1805 arg->op.right = right;
1806
1807 *tok = NULL;
1808 type = process_arg(event, left, &token);
1809
1810 again:
1811 if (type == TEP_EVENT_ERROR)
1812 goto out_free;
1813
1814 /* Handle other operations in the arguments */
1815 if (type == TEP_EVENT_OP && strcmp(token, ":") != 0) {
1816 type = process_op(event, left, &token);
1817 goto again;
1818 }
1819
1820 if (test_type_token(type, token, TEP_EVENT_OP, ":"))
1821 goto out_free;
1822
1823 arg->op.op = token;
1824
1825 type = process_arg(event, right, &token);
1826
1827 top->op.right = arg;
1828
1829 *tok = token;
1830 return type;
1831
1832out_free:
1833 /* Top may point to itself */
1834 top->op.right = NULL;
1835 free_token(token);
1836 free_arg(arg);
1837 return TEP_EVENT_ERROR;
1838}
1839
1840static enum tep_event_type
1841process_array(struct tep_event *event, struct tep_print_arg *top, char **tok)
1842{
1843 struct tep_print_arg *arg;
1844 enum tep_event_type type;
1845 char *token = NULL;
1846
1847 arg = alloc_arg();
1848 if (!arg) {
1849 do_warning_event(event, "%s: not enough memory!", __func__);
1850 /* '*tok' is set to top->op.op. No need to free. */
1851 *tok = NULL;
1852 return TEP_EVENT_ERROR;
1853 }
1854
1855 *tok = NULL;
1856 type = process_arg(event, arg, &token);
1857 if (test_type_token(type, token, TEP_EVENT_OP, "]"))
1858 goto out_free;
1859
1860 top->op.right = arg;
1861
1862 free_token(token);
1863 type = read_token_item(&token);
1864 *tok = token;
1865
1866 return type;
1867
1868out_free:
1869 free_token(token);
1870 free_arg(arg);
1871 return TEP_EVENT_ERROR;
1872}
1873
1874static int get_op_prio(char *op)
1875{
1876 if (!op[1]) {
1877 switch (op[0]) {
1878 case '~':
1879 case '!':
1880 return 4;
1881 case '*':
1882 case '/':
1883 case '%':
1884 return 6;
1885 case '+':
1886 case '-':
1887 return 7;
1888 /* '>>' and '<<' are 8 */
1889 case '<':
1890 case '>':
1891 return 9;
1892 /* '==' and '!=' are 10 */
1893 case '&':
1894 return 11;
1895 case '^':
1896 return 12;
1897 case '|':
1898 return 13;
1899 case '?':
1900 return 16;
1901 default:
1902 do_warning("unknown op '%c'", op[0]);
1903 return -1;
1904 }
1905 } else {
1906 if (strcmp(op, "++") == 0 ||
1907 strcmp(op, "--") == 0) {
1908 return 3;
1909 } else if (strcmp(op, ">>") == 0 ||
1910 strcmp(op, "<<") == 0) {
1911 return 8;
1912 } else if (strcmp(op, ">=") == 0 ||
1913 strcmp(op, "<=") == 0) {
1914 return 9;
1915 } else if (strcmp(op, "==") == 0 ||
1916 strcmp(op, "!=") == 0) {
1917 return 10;
1918 } else if (strcmp(op, "&&") == 0) {
1919 return 14;
1920 } else if (strcmp(op, "||") == 0) {
1921 return 15;
1922 } else {
1923 do_warning("unknown op '%s'", op);
1924 return -1;
1925 }
1926 }
1927}
1928
1929static int set_op_prio(struct tep_print_arg *arg)
1930{
1931
1932 /* single ops are the greatest */
1933 if (!arg->op.left || arg->op.left->type == TEP_PRINT_NULL)
1934 arg->op.prio = 0;
1935 else
1936 arg->op.prio = get_op_prio(arg->op.op);
1937
1938 return arg->op.prio;
1939}
1940
1941/* Note, *tok does not get freed, but will most likely be saved */
1942static enum tep_event_type
1943process_op(struct tep_event *event, struct tep_print_arg *arg, char **tok)
1944{
1945 struct tep_print_arg *left, *right = NULL;
1946 enum tep_event_type type;
1947 char *token;
1948
1949 /* the op is passed in via tok */
1950 token = *tok;
1951
1952 if (arg->type == TEP_PRINT_OP && !arg->op.left) {
1953 /* handle single op */
1954 if (token[1]) {
1955 do_warning_event(event, "bad op token %s", token);
1956 goto out_free;
1957 }
1958 switch (token[0]) {
1959 case '~':
1960 case '!':
1961 case '+':
1962 case '-':
1963 break;
1964 default:
1965 do_warning_event(event, "bad op token %s", token);
1966 goto out_free;
1967
1968 }
1969
1970 /* make an empty left */
1971 left = alloc_arg();
1972 if (!left)
1973 goto out_warn_free;
1974
1975 left->type = TEP_PRINT_NULL;
1976 arg->op.left = left;
1977
1978 right = alloc_arg();
1979 if (!right)
1980 goto out_warn_free;
1981
1982 arg->op.right = right;
1983
1984 /* do not free the token, it belongs to an op */
1985 *tok = NULL;
1986 type = process_arg(event, right, tok);
1987
1988 } else if (strcmp(token, "?") == 0) {
1989
1990 left = alloc_arg();
1991 if (!left)
1992 goto out_warn_free;
1993
1994 /* copy the top arg to the left */
1995 *left = *arg;
1996
1997 arg->type = TEP_PRINT_OP;
1998 arg->op.op = token;
1999 arg->op.left = left;
2000 arg->op.prio = 0;
2001
2002 /* it will set arg->op.right */
2003 type = process_cond(event, arg, tok);
2004
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) {
2023
2024 left = alloc_arg();
2025 if (!left)
2026 goto out_warn_free;
2027
2028 /* copy the top arg to the left */
2029 *left = *arg;
2030
2031 arg->type = TEP_PRINT_OP;
2032 arg->op.op = token;
2033 arg->op.left = left;
2034 arg->op.right = NULL;
2035
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 */
2039 arg->op.op = NULL;
2040 goto out_free;
2041 }
2042
2043 type = read_token_item(&token);
2044 *tok = token;
2045
2046 /* could just be a type pointer */
2047 if ((strcmp(arg->op.op, "*") == 0) &&
2048 type == TEP_EVENT_DELIM && (strcmp(token, ")") == 0)) {
2049 char *new_atom;
2050
2051 if (left->type != TEP_PRINT_ATOM) {
2052 do_warning_event(event, "bad pointer type");
2053 goto out_free;
2054 }
2055 new_atom = realloc(left->atom.atom,
2056 strlen(left->atom.atom) + 3);
2057 if (!new_atom)
2058 goto out_warn_free;
2059
2060 left->atom.atom = new_atom;
2061 strcat(left->atom.atom, " *");
2062 free(arg->op.op);
2063 *arg = *left;
2064 free(left);
2065
2066 return type;
2067 }
2068
2069 right = alloc_arg();
2070 if (!right)
2071 goto out_warn_free;
2072
2073 type = process_arg_token(event, right, tok, type);
2074 if (type == TEP_EVENT_ERROR) {
2075 free_arg(right);
2076 /* token was freed in process_arg_token() via *tok */
2077 token = NULL;
2078 goto out_free;
2079 }
2080
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;
2084
2085 /* rotate ops according to the priority */
2086 arg->op.right = right->op.left;
2087
2088 tmp = *arg;
2089 *arg = *right;
2090 *right = tmp;
2091
2092 arg->op.left = right;
2093 } else {
2094 arg->op.right = right;
2095 }
2096
2097 } else if (strcmp(token, "[") == 0) {
2098
2099 left = alloc_arg();
2100 if (!left)
2101 goto out_warn_free;
2102
2103 *left = *arg;
2104
2105 arg->type = TEP_PRINT_OP;
2106 arg->op.op = token;
2107 arg->op.left = left;
2108
2109 arg->op.prio = 0;
2110
2111 /* it will set arg->op.right */
2112 type = process_array(event, arg, tok);
2113
2114 } else {
2115 do_warning_event(event, "unknown op '%s'", token);
2116 event->flags |= TEP_EVENT_FL_FAILED;
2117 /* the arg is now the left side */
2118 goto out_free;
2119 }
2120
2121 if (type == TEP_EVENT_OP && strcmp(*tok, ":") != 0) {
2122 int prio;
2123
2124 /* higher prios need to be closer to the root */
2125 prio = get_op_prio(*tok);
2126
2127 if (prio > arg->op.prio)
2128 return process_op(event, arg, tok);
2129
2130 return process_op(event, right, tok);
2131 }
2132
2133 return type;
2134
2135out_warn_free:
2136 do_warning_event(event, "%s: not enough memory!", __func__);
2137out_free:
2138 free_token(token);
2139 *tok = NULL;
2140 return TEP_EVENT_ERROR;
2141}
2142
2143static enum tep_event_type
2144process_entry(struct tep_event *event __maybe_unused, struct tep_print_arg *arg,
2145 char **tok)
2146{
2147 enum tep_event_type type;
2148 char *field;
2149 char *token;
2150
2151 if (read_expected(TEP_EVENT_OP, "->") < 0)
2152 goto out_err;
2153
2154 if (read_expect_type(TEP_EVENT_ITEM, &token) < 0)
2155 goto out_free;
2156 field = token;
2157
2158 arg->type = TEP_PRINT_FIELD;
2159 arg->field.name = field;
2160
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;
2164 is_flag_field = 0;
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;
2169 }
2170
2171 type = read_token(&token);
2172 *tok = token;
2173
2174 return type;
2175
2176 out_free:
2177 free_token(token);
2178 out_err:
2179 *tok = NULL;
2180 return TEP_EVENT_ERROR;
2181}
2182
2183static int alloc_and_process_delim(struct tep_event *event, char *next_token,
2184 struct tep_print_arg **print_arg)
2185{
2186 struct tep_print_arg *field;
2187 enum tep_event_type type;
2188 char *token;
2189 int ret = 0;
2190
2191 field = alloc_arg();
2192 if (!field) {
2193 do_warning_event(event, "%s: not enough memory!", __func__);
2194 errno = ENOMEM;
2195 return -1;
2196 }
2197
2198 type = process_arg(event, field, &token);
2199
2200 if (test_type_token(type, token, TEP_EVENT_DELIM, next_token)) {
2201 errno = EINVAL;
2202 ret = -1;
2203 free_arg(field);
2204 goto out_free_token;
2205 }
2206
2207 *print_arg = field;
2208
2209out_free_token:
2210 free_token(token);
2211
2212 return ret;
2213}
2214
2215static char *arg_eval (struct tep_print_arg *arg);
2216
2217static unsigned long long
2218eval_type_str(unsigned long long val, const char *type, int pointer)
2219{
2220 int sign = 0;
2221 char *ref;
2222 int len;
2223
2224 len = strlen(type);
2225
2226 if (pointer) {
2227
2228 if (type[len-1] != '*') {
2229 do_warning("pointer expected with non pointer type");
2230 return val;
2231 }
2232
2233 ref = malloc(len);
2234 if (!ref) {
2235 do_warning("%s: not enough memory!", __func__);
2236 return val;
2237 }
2238 memcpy(ref, type, len);
2239
2240 /* chop off the " *" */
2241 ref[len - 2] = 0;
2242
2243 val = eval_type_str(val, ref, 0);
2244 free(ref);
2245 return val;
2246 }
2247
2248 /* check if this is a pointer */
2249 if (type[len - 1] == '*')
2250 return val;
2251
2252 /* Try to figure out the arg size*/
2253 if (strncmp(type, "struct", 6) == 0)
2254 /* all bets off */
2255 return val;
2256
2257 if (strcmp(type, "u8") == 0)
2258 return val & 0xff;
2259
2260 if (strcmp(type, "u16") == 0)
2261 return val & 0xffff;
2262
2263 if (strcmp(type, "u32") == 0)
2264 return val & 0xffffffff;
2265
2266 if (strcmp(type, "u64") == 0 ||
2267 strcmp(type, "s64") == 0)
2268 return val;
2269
2270 if (strcmp(type, "s8") == 0)
2271 return (unsigned long long)(char)val & 0xff;
2272
2273 if (strcmp(type, "s16") == 0)
2274 return (unsigned long long)(short)val & 0xffff;
2275
2276 if (strcmp(type, "s32") == 0)
2277 return (unsigned long long)(int)val & 0xffffffff;
2278
2279 if (strncmp(type, "unsigned ", 9) == 0) {
2280 sign = 0;
2281 type += 9;
2282 }
2283
2284 if (strcmp(type, "char") == 0) {
2285 if (sign)
2286 return (unsigned long long)(char)val & 0xff;
2287 else
2288 return val & 0xff;
2289 }
2290
2291 if (strcmp(type, "short") == 0) {
2292 if (sign)
2293 return (unsigned long long)(short)val & 0xffff;
2294 else
2295 return val & 0xffff;
2296 }
2297
2298 if (strcmp(type, "int") == 0) {
2299 if (sign)
2300 return (unsigned long long)(int)val & 0xffffffff;
2301 else
2302 return val & 0xffffffff;
2303 }
2304
2305 return val;
2306}
2307
2308/*
2309 * Try to figure out the type.
2310 */
2311static unsigned long long
2312eval_type(unsigned long long val, struct tep_print_arg *arg, int pointer)
2313{
2314 if (arg->type != TEP_PRINT_TYPE) {
2315 do_warning("expected type argument");
2316 return 0;
2317 }
2318
2319 return eval_type_str(val, arg->typecast.type, pointer);
2320}
2321
2322static int arg_num_eval(struct tep_print_arg *arg, long long *val)
2323{
2324 long long left, right;
2325 int ret = 1;
2326
2327 switch (arg->type) {
2328 case TEP_PRINT_ATOM:
2329 *val = strtoll(arg->atom.atom, NULL, 0);
2330 break;
2331 case TEP_PRINT_TYPE:
2332 ret = arg_num_eval(arg->typecast.item, val);
2333 if (!ret)
2334 break;
2335 *val = eval_type(*val, arg, 0);
2336 break;
2337 case TEP_PRINT_OP:
2338 switch (arg->op.op[0]) {
2339 case '|':
2340 ret = arg_num_eval(arg->op.left, &left);
2341 if (!ret)
2342 break;
2343 ret = arg_num_eval(arg->op.right, &right);
2344 if (!ret)
2345 break;
2346 if (arg->op.op[1])
2347 *val = left || right;
2348 else
2349 *val = left | right;
2350 break;
2351 case '&':
2352 ret = arg_num_eval(arg->op.left, &left);
2353 if (!ret)
2354 break;
2355 ret = arg_num_eval(arg->op.right, &right);
2356 if (!ret)
2357 break;
2358 if (arg->op.op[1])
2359 *val = left && right;
2360 else
2361 *val = left & right;
2362 break;
2363 case '<':
2364 ret = arg_num_eval(arg->op.left, &left);
2365 if (!ret)
2366 break;
2367 ret = arg_num_eval(arg->op.right, &right);
2368 if (!ret)
2369 break;
2370 switch (arg->op.op[1]) {
2371 case 0:
2372 *val = left < right;
2373 break;
2374 case '<':
2375 *val = left << right;
2376 break;
2377 case '=':
2378 *val = left <= right;
2379 break;
2380 default:
2381 do_warning("unknown op '%s'", arg->op.op);
2382 ret = 0;
2383 }
2384 break;
2385 case '>':
2386 ret = arg_num_eval(arg->op.left, &left);
2387 if (!ret)
2388 break;
2389 ret = arg_num_eval(arg->op.right, &right);
2390 if (!ret)
2391 break;
2392 switch (arg->op.op[1]) {
2393 case 0:
2394 *val = left > right;
2395 break;
2396 case '>':
2397 *val = left >> right;
2398 break;
2399 case '=':
2400 *val = left >= right;
2401 break;
2402 default:
2403 do_warning("unknown op '%s'", arg->op.op);
2404 ret = 0;
2405 }
2406 break;
2407 case '=':
2408 ret = arg_num_eval(arg->op.left, &left);
2409 if (!ret)
2410 break;
2411 ret = arg_num_eval(arg->op.right, &right);
2412 if (!ret)
2413 break;
2414
2415 if (arg->op.op[1] != '=') {
2416 do_warning("unknown op '%s'", arg->op.op);
2417 ret = 0;
2418 } else
2419 *val = left == right;
2420 break;
2421 case '!':
2422 ret = arg_num_eval(arg->op.left, &left);
2423 if (!ret)
2424 break;
2425 ret = arg_num_eval(arg->op.right, &right);
2426 if (!ret)
2427 break;
2428
2429 switch (arg->op.op[1]) {
2430 case '=':
2431 *val = left != right;
2432 break;
2433 default:
2434 do_warning("unknown op '%s'", arg->op.op);
2435 ret = 0;
2436 }
2437 break;
2438 case '-':
2439 /* check for negative */
2440 if (arg->op.left->type == TEP_PRINT_NULL)
2441 left = 0;
2442 else
2443 ret = arg_num_eval(arg->op.left, &left);
2444 if (!ret)
2445 break;
2446 ret = arg_num_eval(arg->op.right, &right);
2447 if (!ret)
2448 break;
2449 *val = left - right;
2450 break;
2451 case '+':
2452 if (arg->op.left->type == TEP_PRINT_NULL)
2453 left = 0;
2454 else
2455 ret = arg_num_eval(arg->op.left, &left);
2456 if (!ret)
2457 break;
2458 ret = arg_num_eval(arg->op.right, &right);
2459 if (!ret)
2460 break;
2461 *val = left + right;
2462 break;
2463 case '~':
2464 ret = arg_num_eval(arg->op.right, &right);
2465 if (!ret)
2466 break;
2467 *val = ~right;
2468 break;
2469 default:
2470 do_warning("unknown op '%s'", arg->op.op);
2471 ret = 0;
2472 }
2473 break;
2474
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:
2480 default:
2481 do_warning("invalid eval type %d", arg->type);
2482 ret = 0;
2483
2484 }
2485 return ret;
2486}
2487
2488static char *arg_eval (struct tep_print_arg *arg)
2489{
2490 long long val;
2491 static char buf[24];
2492
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);
2498 case TEP_PRINT_OP:
2499 if (!arg_num_eval(arg, &val))
2500 break;
2501 sprintf(buf, "%lld", val);
2502 return buf;
2503
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:
2509 default:
2510 do_warning("invalid eval type %d", arg->type);
2511 break;
2512 }
2513
2514 return NULL;
2515}
2516
2517static enum tep_event_type
2518process_fields(struct tep_event *event, struct tep_print_flag_sym **list, char **tok)
2519{
2520 enum tep_event_type type;
2521 struct tep_print_arg *arg = NULL;
2522 struct tep_print_flag_sym *field;
2523 char *token = *tok;
2524 char *value;
2525
2526 do {
2527 free_token(token);
2528 type = read_token_item(&token);
2529 if (test_type_token(type, token, TEP_EVENT_OP, "{"))
2530 break;
2531
2532 arg = alloc_arg();
2533 if (!arg)
2534 goto out_free;
2535
2536 free_token(token);
2537 type = process_arg(event, arg, &token);
2538
2539 if (type == TEP_EVENT_OP)
2540 type = process_op(event, arg, &token);
2541
2542 if (type == TEP_EVENT_ERROR)
2543 goto out_free;
2544
2545 if (test_type_token(type, token, TEP_EVENT_DELIM, ","))
2546 goto out_free;
2547
2548 field = calloc(1, sizeof(*field));
2549 if (!field)
2550 goto out_free;
2551
2552 value = arg_eval(arg);
2553 if (value == NULL)
2554 goto out_free_field;
2555 field->value = strdup(value);
2556 if (field->value == NULL)
2557 goto out_free_field;
2558
2559 free_arg(arg);
2560 arg = alloc_arg();
2561 if (!arg)
2562 goto out_free;
2563
2564 free_token(token);
2565 type = process_arg(event, arg, &token);
2566 if (test_type_token(type, token, TEP_EVENT_OP, "}"))
2567 goto out_free_field;
2568
2569 value = arg_eval(arg);
2570 if (value == NULL)
2571 goto out_free_field;
2572 field->str = strdup(value);
2573 if (field->str == NULL)
2574 goto out_free_field;
2575 free_arg(arg);
2576 arg = NULL;
2577
2578 *list = field;
2579 list = &field->next;
2580
2581 free_token(token);
2582 type = read_token_item(&token);
2583 } while (type == TEP_EVENT_DELIM && strcmp(token, ",") == 0);
2584
2585 *tok = token;
2586 return type;
2587
2588out_free_field:
2589 free_flag_sym(field);
2590out_free:
2591 free_arg(arg);
2592 free_token(token);
2593 *tok = NULL;
2594
2595 return TEP_EVENT_ERROR;
2596}
2597
2598static enum tep_event_type
2599process_flags(struct tep_event *event, struct tep_print_arg *arg, char **tok)
2600{
2601 struct tep_print_arg *field;
2602 enum tep_event_type type;
2603 char *token = NULL;
2604
2605 memset(arg, 0, sizeof(*arg));
2606 arg->type = TEP_PRINT_FLAGS;
2607
2608 field = alloc_arg();
2609 if (!field) {
2610 do_warning_event(event, "%s: not enough memory!", __func__);
2611 goto out_free;
2612 }
2613
2614 type = process_field_arg(event, field, &token);
2615
2616 /* Handle operations in the first argument */
2617 while (type == TEP_EVENT_OP)
2618 type = process_op(event, field, &token);
2619
2620 if (test_type_token(type, token, TEP_EVENT_DELIM, ","))
2621 goto out_free_field;
2622 free_token(token);
2623
2624 arg->flags.field = field;
2625
2626 type = read_token_item(&token);
2627 if (event_item_type(type)) {
2628 arg->flags.delim = token;
2629 type = read_token_item(&token);
2630 }
2631
2632 if (test_type_token(type, token, TEP_EVENT_DELIM, ","))
2633 goto out_free;
2634
2635 type = process_fields(event, &arg->flags.flags, &token);
2636 if (test_type_token(type, token, TEP_EVENT_DELIM, ")"))
2637 goto out_free;
2638
2639 free_token(token);
2640 type = read_token_item(tok);
2641 return type;
2642
2643out_free_field:
2644 free_arg(field);
2645out_free:
2646 free_token(token);
2647 *tok = NULL;
2648 return TEP_EVENT_ERROR;
2649}
2650
2651static enum tep_event_type
2652process_symbols(struct tep_event *event, struct tep_print_arg *arg, char **tok)
2653{
2654 struct tep_print_arg *field;
2655 enum tep_event_type type;
2656 char *token = NULL;
2657
2658 memset(arg, 0, sizeof(*arg));
2659 arg->type = TEP_PRINT_SYMBOL;
2660
2661 field = alloc_arg();
2662 if (!field) {
2663 do_warning_event(event, "%s: not enough memory!", __func__);
2664 goto out_free;
2665 }
2666
2667 type = process_field_arg(event, field, &token);
2668
2669 if (test_type_token(type, token, TEP_EVENT_DELIM, ","))
2670 goto out_free_field;
2671
2672 arg->symbol.field = field;
2673
2674 type = process_fields(event, &arg->symbol.symbols, &token);
2675 if (test_type_token(type, token, TEP_EVENT_DELIM, ")"))
2676 goto out_free;
2677
2678 free_token(token);
2679 type = read_token_item(tok);
2680 return type;
2681
2682out_free_field:
2683 free_arg(field);
2684out_free:
2685 free_token(token);
2686 *tok = NULL;
2687 return TEP_EVENT_ERROR;
2688}
2689
2690static enum tep_event_type
2691process_hex_common(struct tep_event *event, struct tep_print_arg *arg,
2692 char **tok, enum tep_print_arg_type type)
2693{
2694 memset(arg, 0, sizeof(*arg));
2695 arg->type = type;
2696
2697 if (alloc_and_process_delim(event, ",", &arg->hex.field))
2698 goto out;
2699
2700 if (alloc_and_process_delim(event, ")", &arg->hex.size))
2701 goto free_field;
2702
2703 return read_token_item(tok);
2704
2705free_field:
2706 free_arg(arg->hex.field);
2707 arg->hex.field = NULL;
2708out:
2709 *tok = NULL;
2710 return TEP_EVENT_ERROR;
2711}
2712
2713static enum tep_event_type
2714process_hex(struct tep_event *event, struct tep_print_arg *arg, char **tok)
2715{
2716 return process_hex_common(event, arg, tok, TEP_PRINT_HEX);
2717}
2718
2719static enum tep_event_type
2720process_hex_str(struct tep_event *event, struct tep_print_arg *arg,
2721 char **tok)
2722{
2723 return process_hex_common(event, arg, tok, TEP_PRINT_HEX_STR);
2724}
2725
2726static enum tep_event_type
2727process_int_array(struct tep_event *event, struct tep_print_arg *arg, char **tok)
2728{
2729 memset(arg, 0, sizeof(*arg));
2730 arg->type = TEP_PRINT_INT_ARRAY;
2731
2732 if (alloc_and_process_delim(event, ",", &arg->int_array.field))
2733 goto out;
2734
2735 if (alloc_and_process_delim(event, ",", &arg->int_array.count))
2736 goto free_field;
2737
2738 if (alloc_and_process_delim(event, ")", &arg->int_array.el_size))
2739 goto free_size;
2740
2741 return read_token_item(tok);
2742
2743free_size:
2744 free_arg(arg->int_array.count);
2745 arg->int_array.count = NULL;
2746free_field:
2747 free_arg(arg->int_array.field);
2748 arg->int_array.field = NULL;
2749out:
2750 *tok = NULL;
2751 return TEP_EVENT_ERROR;
2752}
2753
2754static enum tep_event_type
2755process_dynamic_array(struct tep_event *event, struct tep_print_arg *arg, char **tok)
2756{
2757 struct tep_format_field *field;
2758 enum tep_event_type type;
2759 char *token;
2760
2761 memset(arg, 0, sizeof(*arg));
2762 arg->type = TEP_PRINT_DYNAMIC_ARRAY;
2763
2764 /*
2765 * The item within the parenthesis is another field that holds
2766 * the index into where the array starts.
2767 */
2768 type = read_token(&token);
2769 *tok = token;
2770 if (type != TEP_EVENT_ITEM)
2771 goto out_free;
2772
2773 /* Find the field */
2774
2775 field = tep_find_field(event, token);
2776 if (!field)
2777 goto out_free;
2778
2779 arg->dynarray.field = field;
2780 arg->dynarray.index = 0;
2781
2782 if (read_expected(TEP_EVENT_DELIM, ")") < 0)
2783 goto out_free;
2784
2785 free_token(token);
2786 type = read_token_item(&token);
2787 *tok = token;
2788 if (type != TEP_EVENT_OP || strcmp(token, "[") != 0)
2789 return type;
2790
2791 free_token(token);
2792 arg = alloc_arg();
2793 if (!arg) {
2794 do_warning_event(event, "%s: not enough memory!", __func__);
2795 *tok = NULL;
2796 return TEP_EVENT_ERROR;
2797 }
2798
2799 type = process_arg(event, arg, &token);
2800 if (type == TEP_EVENT_ERROR)
2801 goto out_free_arg;
2802
2803 if (!test_type_token(type, token, TEP_EVENT_OP, "]"))
2804 goto out_free_arg;
2805
2806 free_token(token);
2807 type = read_token_item(tok);
2808 return type;
2809
2810 out_free_arg:
2811 free_arg(arg);
2812 out_free:
2813 free_token(token);
2814 *tok = NULL;
2815 return TEP_EVENT_ERROR;
2816}
2817
2818static enum tep_event_type
2819process_dynamic_array_len(struct tep_event *event, struct tep_print_arg *arg,
2820 char **tok)
2821{
2822 struct tep_format_field *field;
2823 enum tep_event_type type;
2824 char *token;
2825
2826 if (read_expect_type(TEP_EVENT_ITEM, &token) < 0)
2827 goto out_free;
2828
2829 arg->type = TEP_PRINT_DYNAMIC_ARRAY_LEN;
2830
2831 /* Find the field */
2832 field = tep_find_field(event, token);
2833 if (!field)
2834 goto out_free;
2835
2836 arg->dynarray.field = field;
2837 arg->dynarray.index = 0;
2838
2839 if (read_expected(TEP_EVENT_DELIM, ")") < 0)
2840 goto out_err;
2841
2842 type = read_token(&token);
2843 *tok = token;
2844
2845 return type;
2846
2847 out_free:
2848 free_token(token);
2849 out_err:
2850 *tok = NULL;
2851 return TEP_EVENT_ERROR;
2852}
2853
2854static enum tep_event_type
2855process_paren(struct tep_event *event, struct tep_print_arg *arg, char **tok)
2856{
2857 struct tep_print_arg *item_arg;
2858 enum tep_event_type type;
2859 char *token;
2860
2861 type = process_arg(event, arg, &token);
2862
2863 if (type == TEP_EVENT_ERROR)
2864 goto out_free;
2865
2866 if (type == TEP_EVENT_OP)
2867 type = process_op(event, arg, &token);
2868
2869 if (type == TEP_EVENT_ERROR)
2870 goto out_free;
2871
2872 if (test_type_token(type, token, TEP_EVENT_DELIM, ")"))
2873 goto out_free;
2874
2875 free_token(token);
2876 type = read_token_item(&token);
2877
2878 /*
2879 * If the next token is an item or another open paren, then
2880 * this was a typecast.
2881 */
2882 if (event_item_type(type) ||
2883 (type == TEP_EVENT_DELIM && strcmp(token, "(") == 0)) {
2884
2885 /* make this a typecast and contine */
2886
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");
2890 goto out_free;
2891 }
2892
2893 item_arg = alloc_arg();
2894 if (!item_arg) {
2895 do_warning_event(event, "%s: not enough memory!",
2896 __func__);
2897 goto out_free;
2898 }
2899
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);
2904
2905 }
2906
2907 *tok = token;
2908 return type;
2909
2910 out_free:
2911 free_token(token);
2912 *tok = NULL;
2913 return TEP_EVENT_ERROR;
2914}
2915
2916
2917static enum tep_event_type
2918process_str(struct tep_event *event __maybe_unused, struct tep_print_arg *arg,
2919 char **tok)
2920{
2921 enum tep_event_type type;
2922 char *token;
2923
2924 if (read_expect_type(TEP_EVENT_ITEM, &token) < 0)
2925 goto out_free;
2926
2927 arg->type = TEP_PRINT_STRING;
2928 arg->string.string = token;
2929 arg->string.offset = -1;
2930
2931 if (read_expected(TEP_EVENT_DELIM, ")") < 0)
2932 goto out_err;
2933
2934 type = read_token(&token);
2935 *tok = token;
2936
2937 return type;
2938
2939 out_free:
2940 free_token(token);
2941 out_err:
2942 *tok = NULL;
2943 return TEP_EVENT_ERROR;
2944}
2945
2946static enum tep_event_type
2947process_bitmask(struct tep_event *event __maybe_unused, struct tep_print_arg *arg,
2948 char **tok)
2949{
2950 enum tep_event_type type;
2951 char *token;
2952
2953 if (read_expect_type(TEP_EVENT_ITEM, &token) < 0)
2954 goto out_free;
2955
2956 arg->type = TEP_PRINT_BITMASK;
2957 arg->bitmask.bitmask = token;
2958 arg->bitmask.offset = -1;
2959
2960 if (read_expected(TEP_EVENT_DELIM, ")") < 0)
2961 goto out_err;
2962
2963 type = read_token(&token);
2964 *tok = token;
2965
2966 return type;
2967
2968 out_free:
2969 free_token(token);
2970 out_err:
2971 *tok = NULL;
2972 return TEP_EVENT_ERROR;
2973}
2974
2975static struct tep_function_handler *
2976find_func_handler(struct tep_handle *tep, char *func_name)
2977{
2978 struct tep_function_handler *func;
2979
2980 if (!tep)
2981 return NULL;
2982
2983 for (func = tep->func_handlers; func; func = func->next) {
2984 if (strcmp(func->name, func_name) == 0)
2985 break;
2986 }
2987
2988 return func;
2989}
2990
2991static void remove_func_handler(struct tep_handle *tep, char *func_name)
2992{
2993 struct tep_function_handler *func;
2994 struct tep_function_handler **next;
2995
2996 next = &tep->func_handlers;
2997 while ((func = *next)) {
2998 if (strcmp(func->name, func_name) == 0) {
2999 *next = func->next;
3000 free_func_handle(func);
3001 break;
3002 }
3003 next = &func->next;
3004 }
3005}
3006
3007static enum tep_event_type
3008process_func_handler(struct tep_event *event, struct tep_function_handler *func,
3009 struct tep_print_arg *arg, char **tok)
3010{
3011 struct tep_print_arg **next_arg;
3012 struct tep_print_arg *farg;
3013 enum tep_event_type type;
3014 char *token;
3015 int i;
3016
3017 arg->type = TEP_PRINT_FUNC;
3018 arg->func.func = func;
3019
3020 *tok = NULL;
3021
3022 next_arg = &(arg->func.args);
3023 for (i = 0; i < func->nr_args; i++) {
3024 farg = alloc_arg();
3025 if (!farg) {
3026 do_warning_event(event, "%s: not enough memory!",
3027 __func__);
3028 return TEP_EVENT_ERROR;
3029 }
3030
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);
3038 goto err;
3039 }
3040 } else {
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);
3045 goto err;
3046 }
3047 }
3048
3049 *next_arg = farg;
3050 next_arg = &(farg->next);
3051 free_token(token);
3052 }
3053
3054 type = read_token(&token);
3055 *tok = token;
3056
3057 return type;
3058
3059err:
3060 free_arg(farg);
3061 free_token(token);
3062 return TEP_EVENT_ERROR;
3063}
3064
3065static enum tep_event_type
3066process_function(struct tep_event *event, struct tep_print_arg *arg,
3067 char *token, char **tok)
3068{
3069 struct tep_function_handler *func;
3070
3071 if (strcmp(token, "__print_flags") == 0) {
3072 free_token(token);
3073 is_flag_field = 1;
3074 return process_flags(event, arg, tok);
3075 }
3076 if (strcmp(token, "__print_symbolic") == 0) {
3077 free_token(token);
3078 is_symbolic_field = 1;
3079 return process_symbols(event, arg, tok);
3080 }
3081 if (strcmp(token, "__print_hex") == 0) {
3082 free_token(token);
3083 return process_hex(event, arg, tok);
3084 }
3085 if (strcmp(token, "__print_hex_str") == 0) {
3086 free_token(token);
3087 return process_hex_str(event, arg, tok);
3088 }
3089 if (strcmp(token, "__print_array") == 0) {
3090 free_token(token);
3091 return process_int_array(event, arg, tok);
3092 }
3093 if (strcmp(token, "__get_str") == 0) {
3094 free_token(token);
3095 return process_str(event, arg, tok);
3096 }
3097 if (strcmp(token, "__get_bitmask") == 0) {
3098 free_token(token);
3099 return process_bitmask(event, arg, tok);
3100 }
3101 if (strcmp(token, "__get_dynamic_array") == 0) {
3102 free_token(token);
3103 return process_dynamic_array(event, arg, tok);
3104 }
3105 if (strcmp(token, "__get_dynamic_array_len") == 0) {
3106 free_token(token);
3107 return process_dynamic_array_len(event, arg, tok);
3108 }
3109
3110 func = find_func_handler(event->tep, token);
3111 if (func) {
3112 free_token(token);
3113 return process_func_handler(event, func, arg, tok);
3114 }
3115
3116 do_warning_event(event, "function %s not defined", token);
3117 free_token(token);
3118 return TEP_EVENT_ERROR;
3119}
3120
3121static enum tep_event_type
3122process_arg_token(struct tep_event *event, struct tep_print_arg *arg,
3123 char **tok, enum tep_event_type type)
3124{
3125 char *token;
3126 char *atom;
3127
3128 token = *tok;
3129
3130 switch (type) {
3131 case TEP_EVENT_ITEM:
3132 if (strcmp(token, "REC") == 0) {
3133 free_token(token);
3134 type = process_entry(event, arg, &token);
3135 break;
3136 }
3137 atom = token;
3138 /* test the next token */
3139 type = read_token_item(&token);
3140
3141 /*
3142 * If the next token is a parenthesis, then this
3143 * is a function.
3144 */
3145 if (type == TEP_EVENT_DELIM && strcmp(token, "(") == 0) {
3146 free_token(token);
3147 token = NULL;
3148 /* this will free atom. */
3149 type = process_function(event, arg, atom, &token);
3150 break;
3151 }
3152 /* atoms can be more than one token long */
3153 while (type == TEP_EVENT_ITEM) {
3154 char *new_atom;
3155 new_atom = realloc(atom,
3156 strlen(atom) + strlen(token) + 2);
3157 if (!new_atom) {
3158 free(atom);
3159 *tok = NULL;
3160 free_token(token);
3161 return TEP_EVENT_ERROR;
3162 }
3163 atom = new_atom;
3164 strcat(atom, " ");
3165 strcat(atom, token);
3166 free_token(token);
3167 type = read_token_item(&token);
3168 }
3169
3170 arg->type = TEP_PRINT_ATOM;
3171 arg->atom.atom = atom;
3172 break;
3173
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);
3179 break;
3180 case TEP_EVENT_DELIM:
3181 if (strcmp(token, "(") == 0) {
3182 free_token(token);
3183 type = process_paren(event, arg, &token);
3184 break;
3185 }
3186 case TEP_EVENT_OP:
3187 /* handle single ops */
3188 arg->type = TEP_PRINT_OP;
3189 arg->op.op = token;
3190 arg->op.left = NULL;
3191 type = process_op(event, arg, &token);
3192
3193 /* On error, the op is freed */
3194 if (type == TEP_EVENT_ERROR)
3195 arg->op.op = NULL;
3196
3197 /* return error type if errored */
3198 break;
3199
3200 case TEP_EVENT_ERROR ... TEP_EVENT_NEWLINE:
3201 default:
3202 do_warning_event(event, "unexpected type %d", type);
3203 return TEP_EVENT_ERROR;
3204 }
3205 *tok = token;
3206
3207 return type;
3208}
3209
3210static int event_read_print_args(struct tep_event *event, struct tep_print_arg **list)
3211{
3212 enum tep_event_type type = TEP_EVENT_ERROR;
3213 struct tep_print_arg *arg;
3214 char *token;
3215 int args = 0;
3216
3217 do {
3218 if (type == TEP_EVENT_NEWLINE) {
3219 type = read_token_item(&token);
3220 continue;
3221 }
3222
3223 arg = alloc_arg();
3224 if (!arg) {
3225 do_warning_event(event, "%s: not enough memory!",
3226 __func__);
3227 return -1;
3228 }
3229
3230 type = process_arg(event, arg, &token);
3231
3232 if (type == TEP_EVENT_ERROR) {
3233 free_token(token);
3234 free_arg(arg);
3235 return -1;
3236 }
3237
3238 *list = arg;
3239 args++;
3240
3241 if (type == TEP_EVENT_OP) {
3242 type = process_op(event, arg, &token);
3243 free_token(token);
3244 if (type == TEP_EVENT_ERROR) {
3245 *list = NULL;
3246 free_arg(arg);
3247 return -1;
3248 }
3249 list = &arg->next;
3250 continue;
3251 }
3252
3253 if (type == TEP_EVENT_DELIM && strcmp(token, ",") == 0) {
3254 free_token(token);
3255 *list = arg;
3256 list = &arg->next;
3257 continue;
3258 }
3259 break;
3260 } while (type != TEP_EVENT_NONE);
3261
3262 if (type != TEP_EVENT_NONE && type != TEP_EVENT_ERROR)
3263 free_token(token);
3264
3265 return args;
3266}
3267
3268static int event_read_print(struct tep_event *event)
3269{
3270 enum tep_event_type type;
3271 char *token;
3272 int ret;
3273
3274 if (read_expected_item(TEP_EVENT_ITEM, "print") < 0)
3275 return -1;
3276
3277 if (read_expected(TEP_EVENT_ITEM, "fmt") < 0)
3278 return -1;
3279
3280 if (read_expected(TEP_EVENT_OP, ":") < 0)
3281 return -1;
3282
3283 if (read_expect_type(TEP_EVENT_DQUOTE, &token) < 0)
3284 goto fail;
3285
3286 concat:
3287 event->print_fmt.format = token;
3288 event->print_fmt.args = NULL;
3289
3290 /* ok to have no arg */
3291 type = read_token_item(&token);
3292
3293 if (type == TEP_EVENT_NONE)
3294 return 0;
3295
3296 /* Handle concatenation of print lines */
3297 if (type == TEP_EVENT_DQUOTE) {
3298 char *cat;
3299
3300 if (asprintf(&cat, "%s%s", event->print_fmt.format, token) < 0)
3301 goto fail;
3302 free_token(token);
3303 free_token(event->print_fmt.format);
3304 event->print_fmt.format = NULL;
3305 token = cat;
3306 goto concat;
3307 }
3308
3309 if (test_type_token(type, token, TEP_EVENT_DELIM, ","))
3310 goto fail;
3311
3312 free_token(token);
3313
3314 ret = event_read_print_args(event, &event->print_fmt.args);
3315 if (ret < 0)
3316 return -1;
3317
3318 return ret;
3319
3320 fail:
3321 free_token(token);
3322 return -1;
3323}
3324
3325/**
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
3329 *
3330 * Returns a common field from the event by the given @name.
3331 * This only searches the common fields and not all field.
3332 */
3333struct tep_format_field *
3334tep_find_common_field(struct tep_event *event, const char *name)
3335{
3336 struct tep_format_field *format;
3337
3338 for (format = event->format.common_fields;
3339 format; format = format->next) {
3340 if (strcmp(format->name, name) == 0)
3341 break;
3342 }
3343
3344 return format;
3345}
3346
3347/**
3348 * tep_find_field - find a non-common field
3349 * @event: handle for the event
3350 * @name: the name of the non-common field
3351 *
3352 * Returns a non-common field by the given @name.
3353 * This does not search common fields.
3354 */
3355struct tep_format_field *
3356tep_find_field(struct tep_event *event, const char *name)
3357{
3358 struct tep_format_field *format;
3359
3360 for (format = event->format.fields;
3361 format; format = format->next) {
3362 if (strcmp(format->name, name) == 0)
3363 break;
3364 }
3365
3366 return format;
3367}
3368
3369/**
3370 * tep_find_any_field - find any field by name
3371 * @event: handle for the event
3372 * @name: the name of the field
3373 *
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.
3377 */
3378struct tep_format_field *
3379tep_find_any_field(struct tep_event *event, const char *name)
3380{
3381 struct tep_format_field *format;
3382
3383 format = tep_find_common_field(event, name);
3384 if (format)
3385 return format;
3386 return tep_find_field(event, name);
3387}
3388
3389/**
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
3394 *
3395 * Returns the number (converted to host) from the
3396 * raw data.
3397 */
3398unsigned long long tep_read_number(struct tep_handle *tep,
3399 const void *ptr, int size)
3400{
3401 unsigned long long val;
3402
3403 switch (size) {
3404 case 1:
3405 return *(unsigned char *)ptr;
3406 case 2:
3407 return tep_data2host2(tep, *(unsigned short *)ptr);
3408 case 4:
3409 return tep_data2host4(tep, *(unsigned int *)ptr);
3410 case 8:
3411 memcpy(&val, (ptr), sizeof(unsigned long long));
3412 return tep_data2host8(tep, val);
3413 default:
3414 /* BUG! */
3415 return 0;
3416 }
3417}
3418
3419/**
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
3424 *
3425 * Reads raw data according to a field offset and size,
3426 * and translates it into @value.
3427 *
3428 * Returns 0 on success, -1 otherwise.
3429 */
3430int tep_read_number_field(struct tep_format_field *field, const void *data,
3431 unsigned long long *value)
3432{
3433 if (!field)
3434 return -1;
3435 switch (field->size) {
3436 case 1:
3437 case 2:
3438 case 4:
3439 case 8:
3440 *value = tep_read_number(field->event->tep,
3441 data + field->offset, field->size);
3442 return 0;
3443 default:
3444 return -1;
3445 }
3446}
3447
3448static int get_common_info(struct tep_handle *tep,
3449 const char *type, int *offset, int *size)
3450{
3451 struct tep_event *event;
3452 struct tep_format_field *field;
3453
3454 /*
3455 * All events should have the same common elements.
3456 * Pick any event to find where the type is;
3457 */
3458 if (!tep->events) {
3459 do_warning("no event_list!");
3460 return -1;
3461 }
3462
3463 event = tep->events[0];
3464 field = tep_find_common_field(event, type);
3465 if (!field)
3466 return -1;
3467
3468 *offset = field->offset;
3469 *size = field->size;
3470
3471 return 0;
3472}
3473
3474static int __parse_common(struct tep_handle *tep, void *data,
3475 int *size, int *offset, const char *name)
3476{
3477 int ret;
3478
3479 if (!*size) {
3480 ret = get_common_info(tep, name, offset, size);
3481 if (ret < 0)
3482 return ret;
3483 }
3484 return tep_read_number(tep, data + *offset, *size);
3485}
3486
3487static int trace_parse_common_type(struct tep_handle *tep, void *data)
3488{
3489 return __parse_common(tep, data,
3490 &tep->type_size, &tep->type_offset,
3491 "common_type");
3492}
3493
3494static int parse_common_pid(struct tep_handle *tep, void *data)
3495{
3496 return __parse_common(tep, data,
3497 &tep->pid_size, &tep->pid_offset,
3498 "common_pid");
3499}
3500
3501static int parse_common_pc(struct tep_handle *tep, void *data)
3502{
3503 return __parse_common(tep, data,
3504 &tep->pc_size, &tep->pc_offset,
3505 "common_preempt_count");
3506}
3507
3508static int parse_common_flags(struct tep_handle *tep, void *data)
3509{
3510 return __parse_common(tep, data,
3511 &tep->flags_size, &tep->flags_offset,
3512 "common_flags");
3513}
3514
3515static int parse_common_lock_depth(struct tep_handle *tep, void *data)
3516{
3517 return __parse_common(tep, data,
3518 &tep->ld_size, &tep->ld_offset,
3519 "common_lock_depth");
3520}
3521
3522static int parse_common_migrate_disable(struct tep_handle *tep, void *data)
3523{
3524 return __parse_common(tep, data,
3525 &tep->ld_size, &tep->ld_offset,
3526 "common_migrate_disable");
3527}
3528
3529static int events_id_cmp(const void *a, const void *b);
3530
3531/**
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
3535 *
3536 * Returns an event that has a given @id.
3537 */
3538struct tep_event *tep_find_event(struct tep_handle *tep, int id)
3539{
3540 struct tep_event **eventptr;
3541 struct tep_event key;
3542 struct tep_event *pkey = &key;
3543
3544 /* Check cache first */
3545 if (tep->last_event && tep->last_event->id == id)
3546 return tep->last_event;
3547
3548 key.id = id;
3549
3550 eventptr = bsearch(&pkey, tep->events, tep->nr_events,
3551 sizeof(*tep->events), events_id_cmp);
3552
3553 if (eventptr) {
3554 tep->last_event = *eventptr;
3555 return *eventptr;
3556 }
3557
3558 return NULL;
3559}
3560
3561/**
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
3566 *
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.
3569 */
3570struct tep_event *
3571tep_find_event_by_name(struct tep_handle *tep,
3572 const char *sys, const char *name)
3573{
3574 struct tep_event *event = NULL;
3575 int i;
3576
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;
3581
3582 for (i = 0; i < tep->nr_events; i++) {
3583 event = tep->events[i];
3584 if (strcmp(event->name, name) == 0) {
3585 if (!sys)
3586 break;
3587 if (strcmp(event->system, sys) == 0)
3588 break;
3589 }
3590 }
3591 if (i == tep->nr_events)
3592 event = NULL;
3593
3594 tep->last_event = event;
3595 return event;
3596}
3597
3598static unsigned long long
3599eval_num_arg(void *data, int size, struct tep_event *event, struct tep_print_arg *arg)
3600{
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;
3608
3609 switch (arg->type) {
3610 case TEP_PRINT_NULL:
3611 /* ?? */
3612 return 0;
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;
3620
3621 }
3622 /* must be a number */
3623 val = tep_read_number(tep, data + arg->field.field->offset,
3624 arg->field.field->size);
3625 break;
3626 case TEP_PRINT_FLAGS:
3627 case TEP_PRINT_SYMBOL:
3628 case TEP_PRINT_INT_ARRAY:
3629 case TEP_PRINT_HEX:
3630 case TEP_PRINT_HEX_STR:
3631 break;
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:
3638 return 0;
3639 case TEP_PRINT_FUNC: {
3640 struct trace_seq s;
3641 trace_seq_init(&s);
3642 val = process_defined_func(&s, data, size, event, arg);
3643 trace_seq_destroy(&s);
3644 return val;
3645 }
3646 case TEP_PRINT_OP:
3647 if (strcmp(arg->op.op, "[") == 0) {
3648 /*
3649 * Arrays are special, since we don't want
3650 * to read the arg as is.
3651 */
3652 right = eval_num_arg(data, size, event, arg->op.right);
3653
3654 /* handle typecasts */
3655 larg = arg->op.left;
3656 while (larg->type == TEP_PRINT_TYPE) {
3657 if (!typearg)
3658 typearg = larg;
3659 larg = larg->typecast.item;
3660 }
3661
3662 /* Default to long size */
3663 field_size = tep->long_size;
3664
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;
3672 /*
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.
3676 */
3677 offset &= 0xffff;
3678 offset += right;
3679 break;
3680 case TEP_PRINT_FIELD:
3681 if (!larg->field.field) {
3682 larg->field.field =
3683 tep_find_any_field(event, larg->field.name);
3684 if (!larg->field.field) {
3685 arg = larg;
3686 goto out_warning_field;
3687 }
3688 }
3689 field_size = larg->field.field->elementsize;
3690 offset = larg->field.field->offset +
3691 right * larg->field.field->elementsize;
3692 break;
3693 default:
3694 goto default_op; /* oops, all bets off */
3695 }
3696 val = tep_read_number(tep,
3697 data + offset, field_size);
3698 if (typearg)
3699 val = eval_type(val, typearg, 1);
3700 break;
3701 } else if (strcmp(arg->op.op, "?") == 0) {
3702 left = eval_num_arg(data, size, event, arg->op.left);
3703 arg = arg->op.right;
3704 if (left)
3705 val = eval_num_arg(data, size, event, arg->op.left);
3706 else
3707 val = eval_num_arg(data, size, event, arg->op.right);
3708 break;
3709 }
3710 default_op:
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]) {
3714 case '!':
3715 switch (arg->op.op[1]) {
3716 case 0:
3717 val = !right;
3718 break;
3719 case '=':
3720 val = left != right;
3721 break;
3722 default:
3723 goto out_warning_op;
3724 }
3725 break;
3726 case '~':
3727 val = ~right;
3728 break;
3729 case '|':
3730 if (arg->op.op[1])
3731 val = left || right;
3732 else
3733 val = left | right;
3734 break;
3735 case '&':
3736 if (arg->op.op[1])
3737 val = left && right;
3738 else
3739 val = left & right;
3740 break;
3741 case '<':
3742 switch (arg->op.op[1]) {
3743 case 0:
3744 val = left < right;
3745 break;
3746 case '<':
3747 val = left << right;
3748 break;
3749 case '=':
3750 val = left <= right;
3751 break;
3752 default:
3753 goto out_warning_op;
3754 }
3755 break;
3756 case '>':
3757 switch (arg->op.op[1]) {
3758 case 0:
3759 val = left > right;
3760 break;
3761 case '>':
3762 val = left >> right;
3763 break;
3764 case '=':
3765 val = left >= right;
3766 break;
3767 default:
3768 goto out_warning_op;
3769 }
3770 break;
3771 case '=':
3772 if (arg->op.op[1] != '=')
3773 goto out_warning_op;
3774
3775 val = left == right;
3776 break;
3777 case '-':
3778 val = left - right;
3779 break;
3780 case '+':
3781 val = left + right;
3782 break;
3783 case '/':
3784 val = left / right;
3785 break;
3786 case '%':
3787 val = left % right;
3788 break;
3789 case '*':
3790 val = left * right;
3791 break;
3792 default:
3793 goto out_warning_op;
3794 }
3795 break;
3796 case TEP_PRINT_DYNAMIC_ARRAY_LEN:
3797 offset = tep_read_number(tep,
3798 data + arg->dynarray.field->offset,
3799 arg->dynarray.field->size);
3800 /*
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.
3804 */
3805 val = (unsigned long long)(offset >> 16);
3806 break;
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);
3812 /*
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.
3816 */
3817 offset &= 0xffff;
3818 val = (unsigned long long)((unsigned long)data + offset);
3819 break;
3820 default: /* not sure what to do there */
3821 return 0;
3822 }
3823 return val;
3824
3825out_warning_op:
3826 do_warning_event(event, "%s: unknown op '%s'", __func__, arg->op.op);
3827 return 0;
3828
3829out_warning_field:
3830 do_warning_event(event, "%s: field %s not found",
3831 __func__, arg->field.name);
3832 return 0;
3833}
3834
3835struct flag {
3836 const char *name;
3837 unsigned long long value;
3838};
3839
3840static 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 },
3851
3852 { "HRTIMER_NORESTART", 0 },
3853 { "HRTIMER_RESTART", 1 },
3854};
3855
3856static long long eval_flag(const char *flag)
3857{
3858 int i;
3859
3860 /*
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.
3864 */
3865 if (isdigit(flag[0]))
3866 return strtoull(flag, NULL, 0);
3867
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;
3871
3872 return -1LL;
3873}
3874
3875static void print_str_to_seq(struct trace_seq *s, const char *format,
3876 int len_arg, const char *str)
3877{
3878 if (len_arg >= 0)
3879 trace_seq_printf(s, format, len_arg, str);
3880 else
3881 trace_seq_printf(s, format, str);
3882}
3883
3884static 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)
3887{
3888 int nr_bits = size * 8;
3889 int str_size = (nr_bits + 3) / 4;
3890 int len = 0;
3891 char buf[3];
3892 char *str;
3893 int index;
3894 int i;
3895
3896 /*
3897 * The kernel likes to put in commas every 32 bits, we
3898 * can do the same.
3899 */
3900 str_size += (nr_bits - 1) / 32;
3901
3902 str = malloc(str_size + 1);
3903 if (!str) {
3904 do_warning("%s: not enough memory!", __func__);
3905 return;
3906 }
3907 str[str_size] = 0;
3908
3909 /* Start out with -2 for the two chars per byte */
3910 for (i = str_size - 2; i >= 0; i -= 2) {
3911 /*
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.
3915 */
3916 if (tep->file_bigendian)
3917 index = size - (len + 1);
3918 else
3919 index = len;
3920
3921 snprintf(buf, 3, "%02x", *((unsigned char *)data + index));
3922 memcpy(str + i, buf, 2);
3923 len++;
3924 if (!(len & 3) && i > 0) {
3925 i--;
3926 str[i] = ',';
3927 }
3928 }
3929
3930 if (len_arg >= 0)
3931 trace_seq_printf(s, format, len_arg, str);
3932 else
3933 trace_seq_printf(s, format, str);
3934
3935 free(str);
3936}
3937
3938static 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)
3941{
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;
3948 char *str;
3949 unsigned char *hex;
3950 int print;
3951 int i, len;
3952
3953 switch (arg->type) {
3954 case TEP_PRINT_NULL:
3955 /* ?? */
3956 return;
3957 case TEP_PRINT_ATOM:
3958 print_str_to_seq(s, format, len_arg, arg->atom.atom);
3959 return;
3960 case TEP_PRINT_FIELD:
3961 field = arg->field.field;
3962 if (!field) {
3963 field = tep_find_any_field(event, arg->field.name);
3964 if (!field) {
3965 str = arg->field.name;
3966 goto out_warning_field;
3967 }
3968 arg->field.field = field;
3969 }
3970 /* Zero sized fields, mean the rest of the data */
3971 len = field->size ? : size - field->offset;
3972
3973 /*
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
3976 * is a pointer.
3977 */
3978 if (!(field->flags & TEP_FIELD_IS_ARRAY) &&
3979 field->size == tep->long_size) {
3980
3981 /* Handle heterogeneous recording and processing
3982 * architectures
3983 *
3984 * CASE I:
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.
3988 *
3989 * CASE II:
3990 * Traces recorded on 64 bit devices and processed
3991 * on 32-bit devices:
3992 * In this case, 64 bits must be read.
3993 */
3994 addr = (tep->long_size == 8) ?
3995 *(unsigned long long *)(data + field->offset) :
3996 (unsigned long long)*(unsigned int *)(data + field->offset);
3997
3998 /* Check if it matches a print format */
3999 printk = find_printk(tep, addr);
4000 if (printk)
4001 trace_seq_puts(s, printk->printk);
4002 else
4003 trace_seq_printf(s, "%llx", addr);
4004 break;
4005 }
4006 str = malloc(len + 1);
4007 if (!str) {
4008 do_warning_event(event, "%s: not enough memory!",
4009 __func__);
4010 return;
4011 }
4012 memcpy(str, data + field->offset, len);
4013 str[len] = 0;
4014 print_str_to_seq(s, format, len_arg, str);
4015 free(str);
4016 break;
4017 case TEP_PRINT_FLAGS:
4018 val = eval_num_arg(data, size, event, arg->flags.field);
4019 print = 0;
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);
4024 break;
4025 }
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);
4030 print = 1;
4031 val &= ~fval;
4032 }
4033 }
4034 if (val) {
4035 if (print && arg->flags.delim)
4036 trace_seq_puts(s, arg->flags.delim);
4037 trace_seq_printf(s, "0x%llx", val);
4038 }
4039 break;
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);
4044 if (val == fval) {
4045 print_str_to_seq(s, format, len_arg, flag->str);
4046 break;
4047 }
4048 }
4049 if (!flag)
4050 trace_seq_printf(s, "0x%llx", val);
4051 break;
4052 case TEP_PRINT_HEX:
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);
4060 } else {
4061 field = arg->hex.field->field.field;
4062 if (!field) {
4063 str = arg->hex.field->field.name;
4064 field = tep_find_any_field(event, str);
4065 if (!field)
4066 goto out_warning_field;
4067 arg->hex.field->field.field = field;
4068 }
4069 hex = data + field->offset;
4070 }
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]);
4076 }
4077 break;
4078
4079 case TEP_PRINT_INT_ARRAY: {
4080 void *num;
4081 int el_size;
4082
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,
4089 field->size);
4090 num = data + (offset & 0xffff);
4091 } else {
4092 field = arg->int_array.field->field.field;
4093 if (!field) {
4094 str = arg->int_array.field->field.name;
4095 field = tep_find_any_field(event, str);
4096 if (!field)
4097 goto out_warning_field;
4098 arg->int_array.field->field.field = field;
4099 }
4100 num = data + field->offset;
4101 }
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++) {
4106 if (i)
4107 trace_seq_putc(s, ' ');
4108
4109 if (el_size == 1) {
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);
4117 } else {
4118 trace_seq_printf(s, "BAD SIZE:%d 0x%x",
4119 el_size, *(uint8_t *)num);
4120 el_size = 1;
4121 }
4122
4123 num += el_size;
4124 }
4125 break;
4126 }
4127 case TEP_PRINT_TYPE:
4128 break;
4129 case TEP_PRINT_STRING: {
4130 int str_offset;
4131
4132 if (arg->string.offset == -1) {
4133 struct tep_format_field *f;
4134
4135 f = tep_find_any_field(event, arg->string.string);
4136 arg->string.offset = f->offset;
4137 }
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);
4141 break;
4142 }
4143 case TEP_PRINT_BSTRING:
4144 print_str_to_seq(s, format, len_arg, arg->string.string);
4145 break;
4146 case TEP_PRINT_BITMASK: {
4147 int bitmask_offset;
4148 int bitmask_size;
4149
4150 if (arg->bitmask.offset == -1) {
4151 struct tep_format_field *f;
4152
4153 f = tep_find_any_field(event, arg->bitmask.bitmask);
4154 arg->bitmask.offset = f->offset;
4155 }
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);
4161 break;
4162 }
4163 case TEP_PRINT_OP:
4164 /*
4165 * The only op for string should be ? :
4166 */
4167 if (arg->op.op[0] != '?')
4168 return;
4169 val = eval_num_arg(data, size, event, arg->op.left);
4170 if (val)
4171 print_str_arg(s, data, size, event,
4172 format, len_arg, arg->op.right->op.left);
4173 else
4174 print_str_arg(s, data, size, event,
4175 format, len_arg, arg->op.right->op.right);
4176 break;
4177 case TEP_PRINT_FUNC:
4178 process_defined_func(s, data, size, event, arg);
4179 break;
4180 default:
4181 /* well... */
4182 break;
4183 }
4184
4185 return;
4186
4187out_warning_field:
4188 do_warning_event(event, "%s: field %s not found",
4189 __func__, arg->field.name);
4190}
4191
4192static unsigned long long
4193process_defined_func(struct trace_seq *s, void *data, int size,
4194 struct tep_event *event, struct tep_print_arg *arg)
4195{
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;
4202 struct save_str {
4203 struct save_str *next;
4204 char *str;
4205 } *strings = NULL, *string;
4206 int i;
4207
4208 if (!func_handle->nr_args) {
4209 ret = (*func_handle->func)(s, NULL);
4210 goto out;
4211 }
4212
4213 farg = arg->func.args;
4214 param = func_handle->params;
4215
4216 ret = ULLONG_MAX;
4217 args = malloc(sizeof(*args) * func_handle->nr_args);
4218 if (!args)
4219 goto out;
4220
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);
4227 break;
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));
4233 if (!string) {
4234 do_warning_event(event, "%s(%d): malloc str",
4235 __func__, __LINE__);
4236 goto out_free;
4237 }
4238 string->next = strings;
4239 string->str = strdup(str.buffer);
4240 if (!string->str) {
4241 free(string);
4242 do_warning_event(event, "%s(%d): malloc str",
4243 __func__, __LINE__);
4244 goto out_free;
4245 }
4246 args[i] = (uintptr_t)string->str;
4247 strings = string;
4248 trace_seq_destroy(&str);
4249 break;
4250 default:
4251 /*
4252 * Something went totally wrong, this is not
4253 * an input error, something in this code broke.
4254 */
4255 do_warning_event(event, "Unexpected end of arguments\n");
4256 goto out_free;
4257 }
4258 farg = farg->next;
4259 param = param->next;
4260 }
4261
4262 ret = (*func_handle->func)(s, args);
4263out_free:
4264 free(args);
4265 while (strings) {
4266 string = strings;
4267 strings = string->next;
4268 free(string->str);
4269 free(string);
4270 }
4271
4272 out:
4273 /* TBD : handle return type here */
4274 return ret;
4275}
4276
4277static void free_args(struct tep_print_arg *args)
4278{
4279 struct tep_print_arg *next;
4280
4281 while (args) {
4282 next = args->next;
4283
4284 free_arg(args);
4285 args = next;
4286 }
4287}
4288
4289static struct tep_print_arg *make_bprint_args(char *fmt, void *data, int size, struct tep_event *event)
4290{
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;
4295 char *ptr;
4296 void *bptr;
4297 int vsize = 0;
4298
4299 field = tep->bprint_buf_field;
4300 ip_field = tep->bprint_ip_field;
4301
4302 if (!field) {
4303 field = tep_find_field(event, "buf");
4304 if (!field) {
4305 do_warning_event(event, "can't find buffer field for binary printk");
4306 return NULL;
4307 }
4308 ip_field = tep_find_field(event, "ip");
4309 if (!ip_field) {
4310 do_warning_event(event, "can't find ip field for binary printk");
4311 return NULL;
4312 }
4313 tep->bprint_buf_field = field;
4314 tep->bprint_ip_field = ip_field;
4315 }
4316
4317 ip = tep_read_number(tep, data + ip_field->offset, ip_field->size);
4318
4319 /*
4320 * The first arg is the IP pointer.
4321 */
4322 args = alloc_arg();
4323 if (!args) {
4324 do_warning_event(event, "%s(%d): not enough memory!",
4325 __func__, __LINE__);
4326 return NULL;
4327 }
4328 arg = args;
4329 arg->next = NULL;
4330 next = &arg->next;
4331
4332 arg->type = TEP_PRINT_ATOM;
4333
4334 if (asprintf(&arg->atom.atom, "%lld", ip) < 0)
4335 goto out_free;
4336
4337 /* skip the first "%ps: " */
4338 for (ptr = fmt + 5, bptr = data + field->offset;
4339 bptr < data + size && *ptr; ptr++) {
4340 int ls = 0;
4341
4342 if (*ptr == '%') {
4343 process_again:
4344 ptr++;
4345 switch (*ptr) {
4346 case '%':
4347 break;
4348 case 'l':
4349 ls++;
4350 goto process_again;
4351 case 'L':
4352 ls = 2;
4353 goto process_again;
4354 case '0' ... '9':
4355 goto process_again;
4356 case '.':
4357 goto process_again;
4358 case 'z':
4359 case 'Z':
4360 ls = 1;
4361 goto process_again;
4362 case 'p':
4363 ls = 1;
4364 if (isalnum(ptr[1])) {
4365 ptr++;
4366 /* Check for special pointers */
4367 switch (*ptr) {
4368 case 's':
4369 case 'S':
4370 case 'x':
4371 break;
4372 case 'f':
4373 case 'F':
4374 /*
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'.
4380 */
4381 if (ptr[1] != 'w')
4382 break;
4383 /* fall through */
4384 default:
4385 /*
4386 * Older kernels do not process
4387 * dereferenced pointers.
4388 * Only process if the pointer
4389 * value is a printable.
4390 */
4391 if (isprint(*(char *)bptr))
4392 goto process_string;
4393 }
4394 }
4395 /* fall through */
4396 case 'd':
4397 case 'u':
4398 case 'x':
4399 case 'i':
4400 switch (ls) {
4401 case 0:
4402 vsize = 4;
4403 break;
4404 case 1:
4405 vsize = tep->long_size;
4406 break;
4407 case 2:
4408 vsize = 8;
4409 break;
4410 default:
4411 vsize = ls; /* ? */
4412 break;
4413 }
4414 /* fall through */
4415 case '*':
4416 if (*ptr == '*')
4417 vsize = 4;
4418
4419 /* the pointers are always 4 bytes aligned */
4420 bptr = (void *)(((unsigned long)bptr + 3) &
4421 ~3);
4422 val = tep_read_number(tep, bptr, vsize);
4423 bptr += vsize;
4424 arg = alloc_arg();
4425 if (!arg) {
4426 do_warning_event(event, "%s(%d): not enough memory!",
4427 __func__, __LINE__);
4428 goto out_free;
4429 }
4430 arg->next = NULL;
4431 arg->type = TEP_PRINT_ATOM;
4432 if (asprintf(&arg->atom.atom, "%lld", val) < 0) {
4433 free(arg);
4434 goto out_free;
4435 }
4436 *next = arg;
4437 next = &arg->next;
4438 /*
4439 * The '*' case means that an arg is used as the length.
4440 * We need to continue to figure out for what.
4441 */
4442 if (*ptr == '*')
4443 goto process_again;
4444
4445 break;
4446 case 's':
4447 process_string:
4448 arg = alloc_arg();
4449 if (!arg) {
4450 do_warning_event(event, "%s(%d): not enough memory!",
4451 __func__, __LINE__);
4452 goto out_free;
4453 }
4454 arg->next = NULL;
4455 arg->type = TEP_PRINT_BSTRING;
4456 arg->string.string = strdup(bptr);
4457 if (!arg->string.string)
4458 goto out_free;
4459 bptr += strlen(bptr) + 1;
4460 *next = arg;
4461 next = &arg->next;
4462 default:
4463 break;
4464 }
4465 }
4466 }
4467
4468 return args;
4469
4470out_free:
4471 free_args(args);
4472 return NULL;
4473}
4474
4475static char *
4476get_bprint_format(void *data, int size __maybe_unused,
4477 struct tep_event *event)
4478{
4479 struct tep_handle *tep = event->tep;
4480 unsigned long long addr;
4481 struct tep_format_field *field;
4482 struct printk_map *printk;
4483 char *format;
4484
4485 field = tep->bprint_fmt_field;
4486
4487 if (!field) {
4488 field = tep_find_field(event, "fmt");
4489 if (!field) {
4490 do_warning_event(event, "can't find format field for binary printk");
4491 return NULL;
4492 }
4493 tep->bprint_fmt_field = field;
4494 }
4495
4496 addr = tep_read_number(tep, data + field->offset, field->size);
4497
4498 printk = find_printk(tep, addr);
4499 if (!printk) {
4500 if (asprintf(&format, "%%ps: (NO FORMAT FOUND at %llx)\n", addr) < 0)
4501 return NULL;
4502 return format;
4503 }
4504
4505 if (asprintf(&format, "%s: %s", "%ps", printk->printk) < 0)
4506 return NULL;
4507
4508 return format;
4509}
4510
4511static void print_mac_arg(struct trace_seq *s, int mac, void *data, int size,
4512 struct tep_event *event, struct tep_print_arg *arg)
4513{
4514 unsigned char *buf;
4515 const char *fmt = "%.2x:%.2x:%.2x:%.2x:%.2x:%.2x";
4516
4517 if (arg->type == TEP_PRINT_FUNC) {
4518 process_defined_func(s, data, size, event, arg);
4519 return;
4520 }
4521
4522 if (arg->type != TEP_PRINT_FIELD) {
4523 trace_seq_printf(s, "ARG TYPE NOT FIELD BUT %d",
4524 arg->type);
4525 return;
4526 }
4527
4528 if (mac == 'm')
4529 fmt = "%.2x%.2x%.2x%.2x%.2x%.2x";
4530 if (!arg->field.field) {
4531 arg->field.field =
4532 tep_find_any_field(event, arg->field.name);
4533 if (!arg->field.field) {
4534 do_warning_event(event, "%s: field %s not found",
4535 __func__, arg->field.name);
4536 return;
4537 }
4538 }
4539 if (arg->field.field->size != 6) {
4540 trace_seq_printf(s, "INVALIDMAC");
4541 return;
4542 }
4543 buf = data + arg->field.field->offset;
4544 trace_seq_printf(s, fmt, buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]);
4545}
4546
4547static void print_ip4_addr(struct trace_seq *s, char i, unsigned char *buf)
4548{
4549 const char *fmt;
4550
4551 if (i == 'i')
4552 fmt = "%03d.%03d.%03d.%03d";
4553 else
4554 fmt = "%d.%d.%d.%d";
4555
4556 trace_seq_printf(s, fmt, buf[0], buf[1], buf[2], buf[3]);
4557}
4558
4559static inline bool ipv6_addr_v4mapped(const struct in6_addr *a)
4560{
4561 return ((unsigned long)(a->s6_addr32[0] | a->s6_addr32[1]) |
4562 (unsigned long)(a->s6_addr32[2] ^ htonl(0x0000ffff))) == 0UL;
4563}
4564
4565static inline bool ipv6_addr_is_isatap(const struct in6_addr *addr)
4566{
4567 return (addr->s6_addr32[2] | htonl(0x02000000)) == htonl(0x02005EFE);
4568}
4569
4570static void print_ip6c_addr(struct trace_seq *s, unsigned char *addr)
4571{
4572 int i, j, range;
4573 unsigned char zerolength[8];
4574 int longest = 1;
4575 int colonpos = -1;
4576 uint16_t word;
4577 uint8_t hi, lo;
4578 bool needcolon = false;
4579 bool useIPv4;
4580 struct in6_addr in6;
4581
4582 memcpy(&in6, addr, sizeof(struct in6_addr));
4583
4584 useIPv4 = ipv6_addr_v4mapped(&in6) || ipv6_addr_is_isatap(&in6);
4585
4586 memset(zerolength, 0, sizeof(zerolength));
4587
4588 if (useIPv4)
4589 range = 6;
4590 else
4591 range = 8;
4592
4593 /* find position of longest 0 run */
4594 for (i = 0; i < range; i++) {
4595 for (j = i; j < range; j++) {
4596 if (in6.s6_addr16[j] != 0)
4597 break;
4598 zerolength[i]++;
4599 }
4600 }
4601 for (i = 0; i < range; i++) {
4602 if (zerolength[i] > longest) {
4603 longest = zerolength[i];
4604 colonpos = i;
4605 }
4606 }
4607 if (longest == 1) /* don't compress a single 0 */
4608 colonpos = -1;
4609
4610 /* emit address */
4611 for (i = 0; i < range; i++) {
4612 if (i == colonpos) {
4613 if (needcolon || i == 0)
4614 trace_seq_printf(s, ":");
4615 trace_seq_printf(s, ":");
4616 needcolon = false;
4617 i += longest - 1;
4618 continue;
4619 }
4620 if (needcolon) {
4621 trace_seq_printf(s, ":");
4622 needcolon = false;
4623 }
4624 /* hex u16 without leading 0s */
4625 word = ntohs(in6.s6_addr16[i]);
4626 hi = word >> 8;
4627 lo = word & 0xff;
4628 if (hi)
4629 trace_seq_printf(s, "%x%02x", hi, lo);
4630 else
4631 trace_seq_printf(s, "%x", lo);
4632
4633 needcolon = true;
4634 }
4635
4636 if (useIPv4) {
4637 if (needcolon)
4638 trace_seq_printf(s, ":");
4639 print_ip4_addr(s, 'I', &in6.s6_addr[12]);
4640 }
4641
4642 return;
4643}
4644
4645static void print_ip6_addr(struct trace_seq *s, char i, unsigned char *buf)
4646{
4647 int j;
4648
4649 for (j = 0; j < 16; j += 2) {
4650 trace_seq_printf(s, "%02x%02x", buf[j], buf[j+1]);
4651 if (i == 'I' && j < 14)
4652 trace_seq_printf(s, ":");
4653 }
4654}
4655
4656/*
4657 * %pi4 print an IPv4 address with leading zeros
4658 * %pI4 print an IPv4 address without leading zeros
4659 * %pi6 print an IPv6 address without colons
4660 * %pI6 print an IPv6 address with colons
4661 * %pI6c print an IPv6 address in compressed form with colons
4662 * %pISpc print an IP address based on sockaddr; p adds port.
4663 */
4664static int print_ipv4_arg(struct trace_seq *s, const char *ptr, char i,
4665 void *data, int size, struct tep_event *event,
4666 struct tep_print_arg *arg)
4667{
4668 unsigned char *buf;
4669
4670 if (arg->type == TEP_PRINT_FUNC) {
4671 process_defined_func(s, data, size, event, arg);
4672 return 0;
4673 }
4674
4675 if (arg->type != TEP_PRINT_FIELD) {
4676 trace_seq_printf(s, "ARG TYPE NOT FIELD BUT %d", arg->type);
4677 return 0;
4678 }
4679
4680 if (!arg->field.field) {
4681 arg->field.field =
4682 tep_find_any_field(event, arg->field.name);
4683 if (!arg->field.field) {
4684 do_warning("%s: field %s not found",
4685 __func__, arg->field.name);
4686 return 0;
4687 }
4688 }
4689
4690 buf = data + arg->field.field->offset;
4691
4692 if (arg->field.field->size != 4) {
4693 trace_seq_printf(s, "INVALIDIPv4");
4694 return 0;
4695 }
4696 print_ip4_addr(s, i, buf);
4697
4698 return 0;
4699}
4700
4701static int print_ipv6_arg(struct trace_seq *s, const char *ptr, char i,
4702 void *data, int size, struct tep_event *event,
4703 struct tep_print_arg *arg)
4704{
4705 char have_c = 0;
4706 unsigned char *buf;
4707 int rc = 0;
4708
4709 /* pI6c */
4710 if (i == 'I' && *ptr == 'c') {
4711 have_c = 1;
4712 ptr++;
4713 rc++;
4714 }
4715
4716 if (arg->type == TEP_PRINT_FUNC) {
4717 process_defined_func(s, data, size, event, arg);
4718 return rc;
4719 }
4720
4721 if (arg->type != TEP_PRINT_FIELD) {
4722 trace_seq_printf(s, "ARG TYPE NOT FIELD BUT %d", arg->type);
4723 return rc;
4724 }
4725
4726 if (!arg->field.field) {
4727 arg->field.field =
4728 tep_find_any_field(event, arg->field.name);
4729 if (!arg->field.field) {
4730 do_warning("%s: field %s not found",
4731 __func__, arg->field.name);
4732 return rc;
4733 }
4734 }
4735
4736 buf = data + arg->field.field->offset;
4737
4738 if (arg->field.field->size != 16) {
4739 trace_seq_printf(s, "INVALIDIPv6");
4740 return rc;
4741 }
4742
4743 if (have_c)
4744 print_ip6c_addr(s, buf);
4745 else
4746 print_ip6_addr(s, i, buf);
4747
4748 return rc;
4749}
4750
4751static int print_ipsa_arg(struct trace_seq *s, const char *ptr, char i,
4752 void *data, int size, struct tep_event *event,
4753 struct tep_print_arg *arg)
4754{
4755 char have_c = 0, have_p = 0;
4756 unsigned char *buf;
4757 struct sockaddr_storage *sa;
4758 int rc = 0;
4759
4760 /* pISpc */
4761 if (i == 'I') {
4762 if (*ptr == 'p') {
4763 have_p = 1;
4764 ptr++;
4765 rc++;
4766 }
4767 if (*ptr == 'c') {
4768 have_c = 1;
4769 ptr++;
4770 rc++;
4771 }
4772 }
4773
4774 if (arg->type == TEP_PRINT_FUNC) {
4775 process_defined_func(s, data, size, event, arg);
4776 return rc;
4777 }
4778
4779 if (arg->type != TEP_PRINT_FIELD) {
4780 trace_seq_printf(s, "ARG TYPE NOT FIELD BUT %d", arg->type);
4781 return rc;
4782 }
4783
4784 if (!arg->field.field) {
4785 arg->field.field =
4786 tep_find_any_field(event, arg->field.name);
4787 if (!arg->field.field) {
4788 do_warning("%s: field %s not found",
4789 __func__, arg->field.name);
4790 return rc;
4791 }
4792 }
4793
4794 sa = (struct sockaddr_storage *) (data + arg->field.field->offset);
4795
4796 if (sa->ss_family == AF_INET) {
4797 struct sockaddr_in *sa4 = (struct sockaddr_in *) sa;
4798
4799 if (arg->field.field->size < sizeof(struct sockaddr_in)) {
4800 trace_seq_printf(s, "INVALIDIPv4");
4801 return rc;
4802 }
4803
4804 print_ip4_addr(s, i, (unsigned char *) &sa4->sin_addr);
4805 if (have_p)
4806 trace_seq_printf(s, ":%d", ntohs(sa4->sin_port));
4807
4808
4809 } else if (sa->ss_family == AF_INET6) {
4810 struct sockaddr_in6 *sa6 = (struct sockaddr_in6 *) sa;
4811
4812 if (arg->field.field->size < sizeof(struct sockaddr_in6)) {
4813 trace_seq_printf(s, "INVALIDIPv6");
4814 return rc;
4815 }
4816
4817 if (have_p)
4818 trace_seq_printf(s, "[");
4819
4820 buf = (unsigned char *) &sa6->sin6_addr;
4821 if (have_c)
4822 print_ip6c_addr(s, buf);
4823 else
4824 print_ip6_addr(s, i, buf);
4825
4826 if (have_p)
4827 trace_seq_printf(s, "]:%d", ntohs(sa6->sin6_port));
4828 }
4829
4830 return rc;
4831}
4832
4833static int print_ip_arg(struct trace_seq *s, const char *ptr,
4834 void *data, int size, struct tep_event *event,
4835 struct tep_print_arg *arg)
4836{
4837 char i = *ptr; /* 'i' or 'I' */
4838 char ver;
4839 int rc = 0;
4840
4841 ptr++;
4842 rc++;
4843
4844 ver = *ptr;
4845 ptr++;
4846 rc++;
4847
4848 switch (ver) {
4849 case '4':
4850 rc += print_ipv4_arg(s, ptr, i, data, size, event, arg);
4851 break;
4852 case '6':
4853 rc += print_ipv6_arg(s, ptr, i, data, size, event, arg);
4854 break;
4855 case 'S':
4856 rc += print_ipsa_arg(s, ptr, i, data, size, event, arg);
4857 break;
4858 default:
4859 return 0;
4860 }
4861
4862 return rc;
4863}
4864
4865static int is_printable_array(char *p, unsigned int len)
4866{
4867 unsigned int i;
4868
4869 for (i = 0; i < len && p[i]; i++)
4870 if (!isprint(p[i]) && !isspace(p[i]))
4871 return 0;
4872 return 1;
4873}
4874
4875void tep_print_field(struct trace_seq *s, void *data,
4876 struct tep_format_field *field)
4877{
4878 unsigned long long val;
4879 unsigned int offset, len, i;
4880 struct tep_handle *tep = field->event->tep;
4881
4882 if (field->flags & TEP_FIELD_IS_ARRAY) {
4883 offset = field->offset;
4884 len = field->size;
4885 if (field->flags & TEP_FIELD_IS_DYNAMIC) {
4886 val = tep_read_number(tep, data + offset, len);
4887 offset = val;
4888 len = offset >> 16;
4889 offset &= 0xffff;
4890 }
4891 if (field->flags & TEP_FIELD_IS_STRING &&
4892 is_printable_array(data + offset, len)) {
4893 trace_seq_printf(s, "%s", (char *)data + offset);
4894 } else {
4895 trace_seq_puts(s, "ARRAY[");
4896 for (i = 0; i < len; i++) {
4897 if (i)
4898 trace_seq_puts(s, ", ");
4899 trace_seq_printf(s, "%02x",
4900 *((unsigned char *)data + offset + i));
4901 }
4902 trace_seq_putc(s, ']');
4903 field->flags &= ~TEP_FIELD_IS_STRING;
4904 }
4905 } else {
4906 val = tep_read_number(tep, data + field->offset,
4907 field->size);
4908 if (field->flags & TEP_FIELD_IS_POINTER) {
4909 trace_seq_printf(s, "0x%llx", val);
4910 } else if (field->flags & TEP_FIELD_IS_SIGNED) {
4911 switch (field->size) {
4912 case 4:
4913 /*
4914 * If field is long then print it in hex.
4915 * A long usually stores pointers.
4916 */
4917 if (field->flags & TEP_FIELD_IS_LONG)
4918 trace_seq_printf(s, "0x%x", (int)val);
4919 else
4920 trace_seq_printf(s, "%d", (int)val);
4921 break;
4922 case 2:
4923 trace_seq_printf(s, "%2d", (short)val);
4924 break;
4925 case 1:
4926 trace_seq_printf(s, "%1d", (char)val);
4927 break;
4928 default:
4929 trace_seq_printf(s, "%lld", val);
4930 }
4931 } else {
4932 if (field->flags & TEP_FIELD_IS_LONG)
4933 trace_seq_printf(s, "0x%llx", val);
4934 else
4935 trace_seq_printf(s, "%llu", val);
4936 }
4937 }
4938}
4939
4940void tep_print_fields(struct trace_seq *s, void *data,
4941 int size __maybe_unused, struct tep_event *event)
4942{
4943 struct tep_format_field *field;
4944
4945 field = event->format.fields;
4946 while (field) {
4947 trace_seq_printf(s, " %s=", field->name);
4948 tep_print_field(s, data, field);
4949 field = field->next;
4950 }
4951}
4952
4953static void pretty_print(struct trace_seq *s, void *data, int size, struct tep_event *event)
4954{
4955 struct tep_handle *tep = event->tep;
4956 struct tep_print_fmt *print_fmt = &event->print_fmt;
4957 struct tep_print_arg *arg = print_fmt->args;
4958 struct tep_print_arg *args = NULL;
4959 const char *ptr = print_fmt->format;
4960 unsigned long long val;
4961 struct func_map *func;
4962 const char *saveptr;
4963 struct trace_seq p;
4964 char *bprint_fmt = NULL;
4965 char format[32];
4966 int show_func;
4967 int len_as_arg;
4968 int len_arg = 0;
4969 int len;
4970 int ls;
4971
4972 if (event->flags & TEP_EVENT_FL_FAILED) {
4973 trace_seq_printf(s, "[FAILED TO PARSE]");
4974 tep_print_fields(s, data, size, event);
4975 return;
4976 }
4977
4978 if (event->flags & TEP_EVENT_FL_ISBPRINT) {
4979 bprint_fmt = get_bprint_format(data, size, event);
4980 args = make_bprint_args(bprint_fmt, data, size, event);
4981 arg = args;
4982 ptr = bprint_fmt;
4983 }
4984
4985 for (; *ptr; ptr++) {
4986 ls = 0;
4987 if (*ptr == '\\') {
4988 ptr++;
4989 switch (*ptr) {
4990 case 'n':
4991 trace_seq_putc(s, '\n');
4992 break;
4993 case 't':
4994 trace_seq_putc(s, '\t');
4995 break;
4996 case 'r':
4997 trace_seq_putc(s, '\r');
4998 break;
4999 case '\\':
5000 trace_seq_putc(s, '\\');
5001 break;
5002 default:
5003 trace_seq_putc(s, *ptr);
5004 break;
5005 }
5006
5007 } else if (*ptr == '%') {
5008 saveptr = ptr;
5009 show_func = 0;
5010 len_as_arg = 0;
5011 cont_process:
5012 ptr++;
5013 switch (*ptr) {
5014 case '%':
5015 trace_seq_putc(s, '%');
5016 break;
5017 case '#':
5018 /* FIXME: need to handle properly */
5019 goto cont_process;
5020 case 'h':
5021 ls--;
5022 goto cont_process;
5023 case 'l':
5024 ls++;
5025 goto cont_process;
5026 case 'L':
5027 ls = 2;
5028 goto cont_process;
5029 case '*':
5030 /* The argument is the length. */
5031 if (!arg) {
5032 do_warning_event(event, "no argument match");
5033 event->flags |= TEP_EVENT_FL_FAILED;
5034 goto out_failed;
5035 }
5036 len_arg = eval_num_arg(data, size, event, arg);
5037 len_as_arg = 1;
5038 arg = arg->next;
5039 goto cont_process;
5040 case '.':
5041 case 'z':
5042 case 'Z':
5043 case '0' ... '9':
5044 case '-':
5045 goto cont_process;
5046 case 'p':
5047 if (tep->long_size == 4)
5048 ls = 1;
5049 else
5050 ls = 2;
5051
5052 if (isalnum(ptr[1]))
5053 ptr++;
5054
5055 if (arg->type == TEP_PRINT_BSTRING) {
5056 trace_seq_puts(s, arg->string.string);
5057 arg = arg->next;
5058 break;
5059 }
5060
5061 if (*ptr == 'F' || *ptr == 'f' ||
5062 *ptr == 'S' || *ptr == 's') {
5063 show_func = *ptr;
5064 } else if (*ptr == 'M' || *ptr == 'm') {
5065 print_mac_arg(s, *ptr, data, size, event, arg);
5066 arg = arg->next;
5067 break;
5068 } else if (*ptr == 'I' || *ptr == 'i') {
5069 int n;
5070
5071 n = print_ip_arg(s, ptr, data, size, event, arg);
5072 if (n > 0) {
5073 ptr += n - 1;
5074 arg = arg->next;
5075 break;
5076 }
5077 }
5078
5079 /* fall through */
5080 case 'd':
5081 case 'i':
5082 case 'x':
5083 case 'X':
5084 case 'u':
5085 if (!arg) {
5086 do_warning_event(event, "no argument match");
5087 event->flags |= TEP_EVENT_FL_FAILED;
5088 goto out_failed;
5089 }
5090
5091 len = ((unsigned long)ptr + 1) -
5092 (unsigned long)saveptr;
5093
5094 /* should never happen */
5095 if (len > 31) {
5096 do_warning_event(event, "bad format!");
5097 event->flags |= TEP_EVENT_FL_FAILED;
5098 len = 31;
5099 }
5100
5101 memcpy(format, saveptr, len);
5102 format[len] = 0;
5103
5104 val = eval_num_arg(data, size, event, arg);
5105 arg = arg->next;
5106
5107 if (show_func) {
5108 func = find_func(tep, val);
5109 if (func) {
5110 trace_seq_puts(s, func->func);
5111 if (show_func == 'F')
5112 trace_seq_printf(s,
5113 "+0x%llx",
5114 val - func->addr);
5115 break;
5116 }
5117 }
5118 if (tep->long_size == 8 && ls == 1 &&
5119 sizeof(long) != 8) {
5120 char *p;
5121
5122 /* make %l into %ll */
5123 if (ls == 1 && (p = strchr(format, 'l')))
5124 memmove(p+1, p, strlen(p)+1);
5125 else if (strcmp(format, "%p") == 0)
5126 strcpy(format, "0x%llx");
5127 ls = 2;
5128 }
5129 switch (ls) {
5130 case -2:
5131 if (len_as_arg)
5132 trace_seq_printf(s, format, len_arg, (char)val);
5133 else
5134 trace_seq_printf(s, format, (char)val);
5135 break;
5136 case -1:
5137 if (len_as_arg)
5138 trace_seq_printf(s, format, len_arg, (short)val);
5139 else
5140 trace_seq_printf(s, format, (short)val);
5141 break;
5142 case 0:
5143 if (len_as_arg)
5144 trace_seq_printf(s, format, len_arg, (int)val);
5145 else
5146 trace_seq_printf(s, format, (int)val);
5147 break;
5148 case 1:
5149 if (len_as_arg)
5150 trace_seq_printf(s, format, len_arg, (long)val);
5151 else
5152 trace_seq_printf(s, format, (long)val);
5153 break;
5154 case 2:
5155 if (len_as_arg)
5156 trace_seq_printf(s, format, len_arg,
5157 (long long)val);
5158 else
5159 trace_seq_printf(s, format, (long long)val);
5160 break;
5161 default:
5162 do_warning_event(event, "bad count (%d)", ls);
5163 event->flags |= TEP_EVENT_FL_FAILED;
5164 }
5165 break;
5166 case 's':
5167 if (!arg) {
5168 do_warning_event(event, "no matching argument");
5169 event->flags |= TEP_EVENT_FL_FAILED;
5170 goto out_failed;
5171 }
5172
5173 len = ((unsigned long)ptr + 1) -
5174 (unsigned long)saveptr;
5175
5176 /* should never happen */
5177 if (len > 31) {
5178 do_warning_event(event, "bad format!");
5179 event->flags |= TEP_EVENT_FL_FAILED;
5180 len = 31;
5181 }
5182
5183 memcpy(format, saveptr, len);
5184 format[len] = 0;
5185 if (!len_as_arg)
5186 len_arg = -1;
5187 /* Use helper trace_seq */
5188 trace_seq_init(&p);
5189 print_str_arg(&p, data, size, event,
5190 format, len_arg, arg);
5191 trace_seq_terminate(&p);
5192 trace_seq_puts(s, p.buffer);
5193 trace_seq_destroy(&p);
5194 arg = arg->next;
5195 break;
5196 default:
5197 trace_seq_printf(s, ">%c<", *ptr);
5198
5199 }
5200 } else
5201 trace_seq_putc(s, *ptr);
5202 }
5203
5204 if (event->flags & TEP_EVENT_FL_FAILED) {
5205out_failed:
5206 trace_seq_printf(s, "[FAILED TO PARSE]");
5207 }
5208
5209 if (args) {
5210 free_args(args);
5211 free(bprint_fmt);
5212 }
5213}
5214
5215/*
5216 * This parses out the Latency format (interrupts disabled,
5217 * need rescheduling, in hard/soft interrupt, preempt count
5218 * and lock depth) and places it into the trace_seq.
5219 */
5220static void data_latency_format(struct tep_handle *tep, struct trace_seq *s,
5221 char *format, struct tep_record *record)
5222{
5223 static int check_lock_depth = 1;
5224 static int check_migrate_disable = 1;
5225 static int lock_depth_exists;
5226 static int migrate_disable_exists;
5227 unsigned int lat_flags;
5228 struct trace_seq sq;
5229 unsigned int pc;
5230 int lock_depth = 0;
5231 int migrate_disable = 0;
5232 int hardirq;
5233 int softirq;
5234 void *data = record->data;
5235
5236 trace_seq_init(&sq);
5237 lat_flags = parse_common_flags(tep, data);
5238 pc = parse_common_pc(tep, data);
5239 /* lock_depth may not always exist */
5240 if (lock_depth_exists)
5241 lock_depth = parse_common_lock_depth(tep, data);
5242 else if (check_lock_depth) {
5243 lock_depth = parse_common_lock_depth(tep, data);
5244 if (lock_depth < 0)
5245 check_lock_depth = 0;
5246 else
5247 lock_depth_exists = 1;
5248 }
5249
5250 /* migrate_disable may not always exist */
5251 if (migrate_disable_exists)
5252 migrate_disable = parse_common_migrate_disable(tep, data);
5253 else if (check_migrate_disable) {
5254 migrate_disable = parse_common_migrate_disable(tep, data);
5255 if (migrate_disable < 0)
5256 check_migrate_disable = 0;
5257 else
5258 migrate_disable_exists = 1;
5259 }
5260
5261 hardirq = lat_flags & TRACE_FLAG_HARDIRQ;
5262 softirq = lat_flags & TRACE_FLAG_SOFTIRQ;
5263
5264 trace_seq_printf(&sq, "%c%c%c",
5265 (lat_flags & TRACE_FLAG_IRQS_OFF) ? 'd' :
5266 (lat_flags & TRACE_FLAG_IRQS_NOSUPPORT) ?
5267 'X' : '.',
5268 (lat_flags & TRACE_FLAG_NEED_RESCHED) ?
5269 'N' : '.',
5270 (hardirq && softirq) ? 'H' :
5271 hardirq ? 'h' : softirq ? 's' : '.');
5272
5273 if (pc)
5274 trace_seq_printf(&sq, "%x", pc);
5275 else
5276 trace_seq_printf(&sq, ".");
5277
5278 if (migrate_disable_exists) {
5279 if (migrate_disable < 0)
5280 trace_seq_printf(&sq, ".");
5281 else
5282 trace_seq_printf(&sq, "%d", migrate_disable);
5283 }
5284
5285 if (lock_depth_exists) {
5286 if (lock_depth < 0)
5287 trace_seq_printf(&sq, ".");
5288 else
5289 trace_seq_printf(&sq, "%d", lock_depth);
5290 }
5291
5292 if (sq.state == TRACE_SEQ__MEM_ALLOC_FAILED) {
5293 s->state = TRACE_SEQ__MEM_ALLOC_FAILED;
5294 return;
5295 }
5296
5297 trace_seq_terminate(&sq);
5298 trace_seq_puts(s, sq.buffer);
5299 trace_seq_destroy(&sq);
5300 trace_seq_terminate(s);
5301}
5302
5303/**
5304 * tep_data_type - parse out the given event type
5305 * @tep: a handle to the trace event parser context
5306 * @rec: the record to read from
5307 *
5308 * This returns the event id from the @rec.
5309 */
5310int tep_data_type(struct tep_handle *tep, struct tep_record *rec)
5311{
5312 return trace_parse_common_type(tep, rec->data);
5313}
5314
5315/**
5316 * tep_data_pid - parse the PID from record
5317 * @tep: a handle to the trace event parser context
5318 * @rec: the record to parse
5319 *
5320 * This returns the PID from a record.
5321 */
5322int tep_data_pid(struct tep_handle *tep, struct tep_record *rec)
5323{
5324 return parse_common_pid(tep, rec->data);
5325}
5326
5327/**
5328 * tep_data_preempt_count - parse the preempt count from the record
5329 * @tep: a handle to the trace event parser context
5330 * @rec: the record to parse
5331 *
5332 * This returns the preempt count from a record.
5333 */
5334int tep_data_preempt_count(struct tep_handle *tep, struct tep_record *rec)
5335{
5336 return parse_common_pc(tep, rec->data);
5337}
5338
5339/**
5340 * tep_data_flags - parse the latency flags from the record
5341 * @tep: a handle to the trace event parser context
5342 * @rec: the record to parse
5343 *
5344 * This returns the latency flags from a record.
5345 *
5346 * Use trace_flag_type enum for the flags (see event-parse.h).
5347 */
5348int tep_data_flags(struct tep_handle *tep, struct tep_record *rec)
5349{
5350 return parse_common_flags(tep, rec->data);
5351}
5352
5353/**
5354 * tep_data_comm_from_pid - return the command line from PID
5355 * @tep: a handle to the trace event parser context
5356 * @pid: the PID of the task to search for
5357 *
5358 * This returns a pointer to the command line that has the given
5359 * @pid.
5360 */
5361const char *tep_data_comm_from_pid(struct tep_handle *tep, int pid)
5362{
5363 const char *comm;
5364
5365 comm = find_cmdline(tep, pid);
5366 return comm;
5367}
5368
5369static struct tep_cmdline *
5370pid_from_cmdlist(struct tep_handle *tep, const char *comm, struct tep_cmdline *next)
5371{
5372 struct cmdline_list *cmdlist = (struct cmdline_list *)next;
5373
5374 if (cmdlist)
5375 cmdlist = cmdlist->next;
5376 else
5377 cmdlist = tep->cmdlist;
5378
5379 while (cmdlist && strcmp(cmdlist->comm, comm) != 0)
5380 cmdlist = cmdlist->next;
5381
5382 return (struct tep_cmdline *)cmdlist;
5383}
5384
5385/**
5386 * tep_data_pid_from_comm - return the pid from a given comm
5387 * @tep: a handle to the trace event parser context
5388 * @comm: the cmdline to find the pid from
5389 * @next: the cmdline structure to find the next comm
5390 *
5391 * This returns the cmdline structure that holds a pid for a given
5392 * comm, or NULL if none found. As there may be more than one pid for
5393 * a given comm, the result of this call can be passed back into
5394 * a recurring call in the @next parameter, and then it will find the
5395 * next pid.
5396 * Also, it does a linear search, so it may be slow.
5397 */
5398struct tep_cmdline *tep_data_pid_from_comm(struct tep_handle *tep, const char *comm,
5399 struct tep_cmdline *next)
5400{
5401 struct tep_cmdline *cmdline;
5402
5403 /*
5404 * If the cmdlines have not been converted yet, then use
5405 * the list.
5406 */
5407 if (!tep->cmdlines)
5408 return pid_from_cmdlist(tep, comm, next);
5409
5410 if (next) {
5411 /*
5412 * The next pointer could have been still from
5413 * a previous call before cmdlines were created
5414 */
5415 if (next < tep->cmdlines ||
5416 next >= tep->cmdlines + tep->cmdline_count)
5417 next = NULL;
5418 else
5419 cmdline = next++;
5420 }
5421
5422 if (!next)
5423 cmdline = tep->cmdlines;
5424
5425 while (cmdline < tep->cmdlines + tep->cmdline_count) {
5426 if (strcmp(cmdline->comm, comm) == 0)
5427 return cmdline;
5428 cmdline++;
5429 }
5430 return NULL;
5431}
5432
5433/**
5434 * tep_cmdline_pid - return the pid associated to a given cmdline
5435 * @tep: a handle to the trace event parser context
5436 * @cmdline: The cmdline structure to get the pid from
5437 *
5438 * Returns the pid for a give cmdline. If @cmdline is NULL, then
5439 * -1 is returned.
5440 */
5441int tep_cmdline_pid(struct tep_handle *tep, struct tep_cmdline *cmdline)
5442{
5443 struct cmdline_list *cmdlist = (struct cmdline_list *)cmdline;
5444
5445 if (!cmdline)
5446 return -1;
5447
5448 /*
5449 * If cmdlines have not been created yet, or cmdline is
5450 * not part of the array, then treat it as a cmdlist instead.
5451 */
5452 if (!tep->cmdlines ||
5453 cmdline < tep->cmdlines ||
5454 cmdline >= tep->cmdlines + tep->cmdline_count)
5455 return cmdlist->pid;
5456
5457 return cmdline->pid;
5458}
5459
5460/*
5461 * This parses the raw @data using the given @event information and
5462 * writes the print format into the trace_seq.
5463 */
5464static void print_event_info(struct trace_seq *s, char *format, bool raw,
5465 struct tep_event *event, struct tep_record *record)
5466{
5467 int print_pretty = 1;
5468
5469 if (raw || (event->flags & TEP_EVENT_FL_PRINTRAW))
5470 tep_print_fields(s, record->data, record->size, event);
5471 else {
5472
5473 if (event->handler && !(event->flags & TEP_EVENT_FL_NOHANDLE))
5474 print_pretty = event->handler(s, record, event,
5475 event->context);
5476
5477 if (print_pretty)
5478 pretty_print(s, record->data, record->size, event);
5479 }
5480
5481 trace_seq_terminate(s);
5482}
5483
5484/**
5485 * tep_find_event_by_record - return the event from a given record
5486 * @tep: a handle to the trace event parser context
5487 * @record: The record to get the event from
5488 *
5489 * Returns the associated event for a given record, or NULL if non is
5490 * is found.
5491 */
5492struct tep_event *
5493tep_find_event_by_record(struct tep_handle *tep, struct tep_record *record)
5494{
5495 int type;
5496
5497 if (record->size < 0) {
5498 do_warning("ug! negative record size %d", record->size);
5499 return NULL;
5500 }
5501
5502 type = trace_parse_common_type(tep, record->data);
5503
5504 return tep_find_event(tep, type);
5505}
5506
5507/*
5508 * Writes the timestamp of the record into @s. Time divisor and precision can be
5509 * specified as part of printf @format string. Example:
5510 * "%3.1000d" - divide the time by 1000 and print the first 3 digits
5511 * before the dot. Thus, the timestamp "123456000" will be printed as
5512 * "123.456"
5513 */
5514static void print_event_time(struct tep_handle *tep, struct trace_seq *s,
5515 char *format, struct tep_event *event,
5516 struct tep_record *record)
5517{
5518 unsigned long long time;
5519 char *divstr;
5520 int prec = 0, pr;
5521 int div = 0;
5522 int p10 = 1;
5523
5524 if (isdigit(*(format + 1)))
5525 prec = atoi(format + 1);
5526 divstr = strchr(format, '.');
5527 if (divstr && isdigit(*(divstr + 1)))
5528 div = atoi(divstr + 1);
5529 time = record->ts;
5530 if (div) {
5531 time += div / 2;
5532 time /= div;
5533 }
5534 pr = prec;
5535 while (pr--)
5536 p10 *= 10;
5537
5538 if (p10 > 1 && p10 < time)
5539 trace_seq_printf(s, "%5llu.%0*llu", time / p10, prec, time % p10);
5540 else
5541 trace_seq_printf(s, "%12llu\n", time);
5542}
5543
5544struct print_event_type {
5545 enum {
5546 EVENT_TYPE_INT = 1,
5547 EVENT_TYPE_STRING,
5548 EVENT_TYPE_UNKNOWN,
5549 } type;
5550 char format[32];
5551};
5552
5553static void print_string(struct tep_handle *tep, struct trace_seq *s,
5554 struct tep_record *record, struct tep_event *event,
5555 const char *arg, struct print_event_type *type)
5556{
5557 const char *comm;
5558 int pid;
5559
5560 if (strncmp(arg, TEP_PRINT_LATENCY, strlen(TEP_PRINT_LATENCY)) == 0) {
5561 data_latency_format(tep, s, type->format, record);
5562 } else if (strncmp(arg, TEP_PRINT_COMM, strlen(TEP_PRINT_COMM)) == 0) {
5563 pid = parse_common_pid(tep, record->data);
5564 comm = find_cmdline(tep, pid);
5565 trace_seq_printf(s, type->format, comm);
5566 } else if (strncmp(arg, TEP_PRINT_INFO_RAW, strlen(TEP_PRINT_INFO_RAW)) == 0) {
5567 print_event_info(s, type->format, true, event, record);
5568 } else if (strncmp(arg, TEP_PRINT_INFO, strlen(TEP_PRINT_INFO)) == 0) {
5569 print_event_info(s, type->format, false, event, record);
5570 } else if (strncmp(arg, TEP_PRINT_NAME, strlen(TEP_PRINT_NAME)) == 0) {
5571 trace_seq_printf(s, type->format, event->name);
5572 } else {
5573 trace_seq_printf(s, "[UNKNOWN TEP TYPE %s]", arg);
5574 }
5575
5576}
5577
5578static void print_int(struct tep_handle *tep, struct trace_seq *s,
5579 struct tep_record *record, struct tep_event *event,
5580 int arg, struct print_event_type *type)
5581{
5582 int param;
5583
5584 switch (arg) {
5585 case TEP_PRINT_CPU:
5586 param = record->cpu;
5587 break;
5588 case TEP_PRINT_PID:
5589 param = parse_common_pid(tep, record->data);
5590 break;
5591 case TEP_PRINT_TIME:
5592 return print_event_time(tep, s, type->format, event, record);
5593 default:
5594 return;
5595 }
5596 trace_seq_printf(s, type->format, param);
5597}
5598
5599static int tep_print_event_param_type(char *format,
5600 struct print_event_type *type)
5601{
5602 char *str = format + 1;
5603 int i = 1;
5604
5605 type->type = EVENT_TYPE_UNKNOWN;
5606 while (*str) {
5607 switch (*str) {
5608 case 'd':
5609 case 'u':
5610 case 'i':
5611 case 'x':
5612 case 'X':
5613 case 'o':
5614 type->type = EVENT_TYPE_INT;
5615 break;
5616 case 's':
5617 type->type = EVENT_TYPE_STRING;
5618 break;
5619 }
5620 str++;
5621 i++;
5622 if (type->type != EVENT_TYPE_UNKNOWN)
5623 break;
5624 }
5625 memset(type->format, 0, 32);
5626 memcpy(type->format, format, i < 32 ? i : 31);
5627 return i;
5628}
5629
5630/**
5631 * tep_print_event - Write various event information
5632 * @tep: a handle to the trace event parser context
5633 * @s: the trace_seq to write to
5634 * @record: The record to get the event from
5635 * @format: a printf format string. Supported event fileds:
5636 * TEP_PRINT_PID, "%d" - event PID
5637 * TEP_PRINT_CPU, "%d" - event CPU
5638 * TEP_PRINT_COMM, "%s" - event command string
5639 * TEP_PRINT_NAME, "%s" - event name
5640 * TEP_PRINT_LATENCY, "%s" - event latency
5641 * TEP_PRINT_TIME, %d - event time stamp. A divisor and precision
5642 * can be specified as part of this format string:
5643 * "%precision.divisord". Example:
5644 * "%3.1000d" - divide the time by 1000 and print the first
5645 * 3 digits before the dot. Thus, the time stamp
5646 * "123456000" will be printed as "123.456"
5647 * TEP_PRINT_INFO, "%s" - event information. If any width is specified in
5648 * the format string, the event information will be printed
5649 * in raw format.
5650 * Writes the specified event information into @s.
5651 */
5652void tep_print_event(struct tep_handle *tep, struct trace_seq *s,
5653 struct tep_record *record, const char *fmt, ...)
5654{
5655 struct print_event_type type;
5656 char *format = strdup(fmt);
5657 char *current = format;
5658 char *str = format;
5659 int offset;
5660 va_list args;
5661 struct tep_event *event;
5662
5663 if (!format)
5664 return;
5665
5666 event = tep_find_event_by_record(tep, record);
5667 va_start(args, fmt);
5668 while (*current) {
5669 current = strchr(str, '%');
5670 if (!current) {
5671 trace_seq_puts(s, str);
5672 break;
5673 }
5674 memset(&type, 0, sizeof(type));
5675 offset = tep_print_event_param_type(current, &type);
5676 *current = '\0';
5677 trace_seq_puts(s, str);
5678 current += offset;
5679 switch (type.type) {
5680 case EVENT_TYPE_STRING:
5681 print_string(tep, s, record, event,
5682 va_arg(args, char*), &type);
5683 break;
5684 case EVENT_TYPE_INT:
5685 print_int(tep, s, record, event,
5686 va_arg(args, int), &type);
5687 break;
5688 case EVENT_TYPE_UNKNOWN:
5689 default:
5690 trace_seq_printf(s, "[UNKNOWN TYPE]");
5691 break;
5692 }
5693 str = current;
5694
5695 }
5696 va_end(args);
5697 free(format);
5698}
5699
5700static int events_id_cmp(const void *a, const void *b)
5701{
5702 struct tep_event * const * ea = a;
5703 struct tep_event * const * eb = b;
5704
5705 if ((*ea)->id < (*eb)->id)
5706 return -1;
5707
5708 if ((*ea)->id > (*eb)->id)
5709 return 1;
5710
5711 return 0;
5712}
5713
5714static int events_name_cmp(const void *a, const void *b)
5715{
5716 struct tep_event * const * ea = a;
5717 struct tep_event * const * eb = b;
5718 int res;
5719
5720 res = strcmp((*ea)->name, (*eb)->name);
5721 if (res)
5722 return res;
5723
5724 res = strcmp((*ea)->system, (*eb)->system);
5725 if (res)
5726 return res;
5727
5728 return events_id_cmp(a, b);
5729}
5730
5731static int events_system_cmp(const void *a, const void *b)
5732{
5733 struct tep_event * const * ea = a;
5734 struct tep_event * const * eb = b;
5735 int res;
5736
5737 res = strcmp((*ea)->system, (*eb)->system);
5738 if (res)
5739 return res;
5740
5741 res = strcmp((*ea)->name, (*eb)->name);
5742 if (res)
5743 return res;
5744
5745 return events_id_cmp(a, b);
5746}
5747
5748static struct tep_event **list_events_copy(struct tep_handle *tep)
5749{
5750 struct tep_event **events;
5751
5752 if (!tep)
5753 return NULL;
5754
5755 events = malloc(sizeof(*events) * (tep->nr_events + 1));
5756 if (!events)
5757 return NULL;
5758
5759 memcpy(events, tep->events, sizeof(*events) * tep->nr_events);
5760 events[tep->nr_events] = NULL;
5761 return events;
5762}
5763
5764static void list_events_sort(struct tep_event **events, int nr_events,
5765 enum tep_event_sort_type sort_type)
5766{
5767 int (*sort)(const void *a, const void *b);
5768
5769 switch (sort_type) {
5770 case TEP_EVENT_SORT_ID:
5771 sort = events_id_cmp;
5772 break;
5773 case TEP_EVENT_SORT_NAME:
5774 sort = events_name_cmp;
5775 break;
5776 case TEP_EVENT_SORT_SYSTEM:
5777 sort = events_system_cmp;
5778 break;
5779 default:
5780 sort = NULL;
5781 }
5782
5783 if (sort)
5784 qsort(events, nr_events, sizeof(*events), sort);
5785}
5786
5787/**
5788 * tep_list_events - Get events, sorted by given criteria.
5789 * @tep: a handle to the tep context
5790 * @sort_type: desired sort order of the events in the array
5791 *
5792 * Returns an array of pointers to all events, sorted by the given
5793 * @sort_type criteria. The last element of the array is NULL. The returned
5794 * memory must not be freed, it is managed by the library.
5795 * The function is not thread safe.
5796 */
5797struct tep_event **tep_list_events(struct tep_handle *tep,
5798 enum tep_event_sort_type sort_type)
5799{
5800 struct tep_event **events;
5801
5802 if (!tep)
5803 return NULL;
5804
5805 events = tep->sort_events;
5806 if (events && tep->last_type == sort_type)
5807 return events;
5808
5809 if (!events) {
5810 events = list_events_copy(tep);
5811 if (!events)
5812 return NULL;
5813
5814 tep->sort_events = events;
5815
5816 /* the internal events are sorted by id */
5817 if (sort_type == TEP_EVENT_SORT_ID) {
5818 tep->last_type = sort_type;
5819 return events;
5820 }
5821 }
5822
5823 list_events_sort(events, tep->nr_events, sort_type);
5824 tep->last_type = sort_type;
5825
5826 return events;
5827}
5828
5829
5830/**
5831 * tep_list_events_copy - Thread safe version of tep_list_events()
5832 * @tep: a handle to the tep context
5833 * @sort_type: desired sort order of the events in the array
5834 *
5835 * Returns an array of pointers to all events, sorted by the given
5836 * @sort_type criteria. The last element of the array is NULL. The returned
5837 * array is newly allocated inside the function and must be freed by the caller
5838 */
5839struct tep_event **tep_list_events_copy(struct tep_handle *tep,
5840 enum tep_event_sort_type sort_type)
5841{
5842 struct tep_event **events;
5843
5844 if (!tep)
5845 return NULL;
5846
5847 events = list_events_copy(tep);
5848 if (!events)
5849 return NULL;
5850
5851 /* the internal events are sorted by id */
5852 if (sort_type == TEP_EVENT_SORT_ID)
5853 return events;
5854
5855 list_events_sort(events, tep->nr_events, sort_type);
5856
5857 return events;
5858}
5859
5860static struct tep_format_field **
5861get_event_fields(const char *type, const char *name,
5862 int count, struct tep_format_field *list)
5863{
5864 struct tep_format_field **fields;
5865 struct tep_format_field *field;
5866 int i = 0;
5867
5868 fields = malloc(sizeof(*fields) * (count + 1));
5869 if (!fields)
5870 return NULL;
5871
5872 for (field = list; field; field = field->next) {
5873 fields[i++] = field;
5874 if (i == count + 1) {
5875 do_warning("event %s has more %s fields than specified",
5876 name, type);
5877 i--;
5878 break;
5879 }
5880 }
5881
5882 if (i != count)
5883 do_warning("event %s has less %s fields than specified",
5884 name, type);
5885
5886 fields[i] = NULL;
5887
5888 return fields;
5889}
5890
5891/**
5892 * tep_event_common_fields - return a list of common fields for an event
5893 * @event: the event to return the common fields of.
5894 *
5895 * Returns an allocated array of fields. The last item in the array is NULL.
5896 * The array must be freed with free().
5897 */
5898struct tep_format_field **tep_event_common_fields(struct tep_event *event)
5899{
5900 return get_event_fields("common", event->name,
5901 event->format.nr_common,
5902 event->format.common_fields);
5903}
5904
5905/**
5906 * tep_event_fields - return a list of event specific fields for an event
5907 * @event: the event to return the fields of.
5908 *
5909 * Returns an allocated array of fields. The last item in the array is NULL.
5910 * The array must be freed with free().
5911 */
5912struct tep_format_field **tep_event_fields(struct tep_event *event)
5913{
5914 return get_event_fields("event", event->name,
5915 event->format.nr_fields,
5916 event->format.fields);
5917}
5918
5919static void print_fields(struct trace_seq *s, struct tep_print_flag_sym *field)
5920{
5921 trace_seq_printf(s, "{ %s, %s }", field->value, field->str);
5922 if (field->next) {
5923 trace_seq_puts(s, ", ");
5924 print_fields(s, field->next);
5925 }
5926}
5927
5928/* for debugging */
5929static void print_args(struct tep_print_arg *args)
5930{
5931 int print_paren = 1;
5932 struct trace_seq s;
5933
5934 switch (args->type) {
5935 case TEP_PRINT_NULL:
5936 printf("null");
5937 break;
5938 case TEP_PRINT_ATOM:
5939 printf("%s", args->atom.atom);
5940 break;
5941 case TEP_PRINT_FIELD:
5942 printf("REC->%s", args->field.name);
5943 break;
5944 case TEP_PRINT_FLAGS:
5945 printf("__print_flags(");
5946 print_args(args->flags.field);
5947 printf(", %s, ", args->flags.delim);
5948 trace_seq_init(&s);
5949 print_fields(&s, args->flags.flags);
5950 trace_seq_do_printf(&s);
5951 trace_seq_destroy(&s);
5952 printf(")");
5953 break;
5954 case TEP_PRINT_SYMBOL:
5955 printf("__print_symbolic(");
5956 print_args(args->symbol.field);
5957 printf(", ");
5958 trace_seq_init(&s);
5959 print_fields(&s, args->symbol.symbols);
5960 trace_seq_do_printf(&s);
5961 trace_seq_destroy(&s);
5962 printf(")");
5963 break;
5964 case TEP_PRINT_HEX:
5965 printf("__print_hex(");
5966 print_args(args->hex.field);
5967 printf(", ");
5968 print_args(args->hex.size);
5969 printf(")");
5970 break;
5971 case TEP_PRINT_HEX_STR:
5972 printf("__print_hex_str(");
5973 print_args(args->hex.field);
5974 printf(", ");
5975 print_args(args->hex.size);
5976 printf(")");
5977 break;
5978 case TEP_PRINT_INT_ARRAY:
5979 printf("__print_array(");
5980 print_args(args->int_array.field);
5981 printf(", ");
5982 print_args(args->int_array.count);
5983 printf(", ");
5984 print_args(args->int_array.el_size);
5985 printf(")");
5986 break;
5987 case TEP_PRINT_STRING:
5988 case TEP_PRINT_BSTRING:
5989 printf("__get_str(%s)", args->string.string);
5990 break;
5991 case TEP_PRINT_BITMASK:
5992 printf("__get_bitmask(%s)", args->bitmask.bitmask);
5993 break;
5994 case TEP_PRINT_TYPE:
5995 printf("(%s)", args->typecast.type);
5996 print_args(args->typecast.item);
5997 break;
5998 case TEP_PRINT_OP:
5999 if (strcmp(args->op.op, ":") == 0)
6000 print_paren = 0;
6001 if (print_paren)
6002 printf("(");
6003 print_args(args->op.left);
6004 printf(" %s ", args->op.op);
6005 print_args(args->op.right);
6006 if (print_paren)
6007 printf(")");
6008 break;
6009 default:
6010 /* we should warn... */
6011 return;
6012 }
6013 if (args->next) {
6014 printf("\n");
6015 print_args(args->next);
6016 }
6017}
6018
6019static void parse_header_field(const char *field,
6020 int *offset, int *size, int mandatory)
6021{
6022 unsigned long long save_input_buf_ptr;
6023 unsigned long long save_input_buf_siz;
6024 char *token;
6025 int type;
6026
6027 save_input_buf_ptr = input_buf_ptr;
6028 save_input_buf_siz = input_buf_siz;
6029
6030 if (read_expected(TEP_EVENT_ITEM, "field") < 0)
6031 return;
6032 if (read_expected(TEP_EVENT_OP, ":") < 0)
6033 return;
6034
6035 /* type */
6036 if (read_expect_type(TEP_EVENT_ITEM, &token) < 0)
6037 goto fail;
6038 free_token(token);
6039
6040 /*
6041 * If this is not a mandatory field, then test it first.
6042 */
6043 if (mandatory) {
6044 if (read_expected(TEP_EVENT_ITEM, field) < 0)
6045 return;
6046 } else {
6047 if (read_expect_type(TEP_EVENT_ITEM, &token) < 0)
6048 goto fail;
6049 if (strcmp(token, field) != 0)
6050 goto discard;
6051 free_token(token);
6052 }
6053
6054 if (read_expected(TEP_EVENT_OP, ";") < 0)
6055 return;
6056 if (read_expected(TEP_EVENT_ITEM, "offset") < 0)
6057 return;
6058 if (read_expected(TEP_EVENT_OP, ":") < 0)
6059 return;
6060 if (read_expect_type(TEP_EVENT_ITEM, &token) < 0)
6061 goto fail;
6062 *offset = atoi(token);
6063 free_token(token);
6064 if (read_expected(TEP_EVENT_OP, ";") < 0)
6065 return;
6066 if (read_expected(TEP_EVENT_ITEM, "size") < 0)
6067 return;
6068 if (read_expected(TEP_EVENT_OP, ":") < 0)
6069 return;
6070 if (read_expect_type(TEP_EVENT_ITEM, &token) < 0)
6071 goto fail;
6072 *size = atoi(token);
6073 free_token(token);
6074 if (read_expected(TEP_EVENT_OP, ";") < 0)
6075 return;
6076 type = read_token(&token);
6077 if (type != TEP_EVENT_NEWLINE) {
6078 /* newer versions of the kernel have a "signed" type */
6079 if (type != TEP_EVENT_ITEM)
6080 goto fail;
6081
6082 if (strcmp(token, "signed") != 0)
6083 goto fail;
6084
6085 free_token(token);
6086
6087 if (read_expected(TEP_EVENT_OP, ":") < 0)
6088 return;
6089
6090 if (read_expect_type(TEP_EVENT_ITEM, &token))
6091 goto fail;
6092
6093 free_token(token);
6094 if (read_expected(TEP_EVENT_OP, ";") < 0)
6095 return;
6096
6097 if (read_expect_type(TEP_EVENT_NEWLINE, &token))
6098 goto fail;
6099 }
6100 fail:
6101 free_token(token);
6102 return;
6103
6104 discard:
6105 input_buf_ptr = save_input_buf_ptr;
6106 input_buf_siz = save_input_buf_siz;
6107 *offset = 0;
6108 *size = 0;
6109 free_token(token);
6110}
6111
6112/**
6113 * tep_parse_header_page - parse the data stored in the header page
6114 * @tep: a handle to the trace event parser context
6115 * @buf: the buffer storing the header page format string
6116 * @size: the size of @buf
6117 * @long_size: the long size to use if there is no header
6118 *
6119 * This parses the header page format for information on the
6120 * ring buffer used. The @buf should be copied from
6121 *
6122 * /sys/kernel/debug/tracing/events/header_page
6123 */
6124int tep_parse_header_page(struct tep_handle *tep, char *buf, unsigned long size,
6125 int long_size)
6126{
6127 int ignore;
6128
6129 if (!size) {
6130 /*
6131 * Old kernels did not have header page info.
6132 * Sorry but we just use what we find here in user space.
6133 */
6134 tep->header_page_ts_size = sizeof(long long);
6135 tep->header_page_size_size = long_size;
6136 tep->header_page_data_offset = sizeof(long long) + long_size;
6137 tep->old_format = 1;
6138 return -1;
6139 }
6140 init_input_buf(buf, size);
6141
6142 parse_header_field("timestamp", &tep->header_page_ts_offset,
6143 &tep->header_page_ts_size, 1);
6144 parse_header_field("commit", &tep->header_page_size_offset,
6145 &tep->header_page_size_size, 1);
6146 parse_header_field("overwrite", &tep->header_page_overwrite,
6147 &ignore, 0);
6148 parse_header_field("data", &tep->header_page_data_offset,
6149 &tep->header_page_data_size, 1);
6150
6151 return 0;
6152}
6153
6154static int event_matches(struct tep_event *event,
6155 int id, const char *sys_name,
6156 const char *event_name)
6157{
6158 if (id >= 0 && id != event->id)
6159 return 0;
6160
6161 if (event_name && (strcmp(event_name, event->name) != 0))
6162 return 0;
6163
6164 if (sys_name && (strcmp(sys_name, event->system) != 0))
6165 return 0;
6166
6167 return 1;
6168}
6169
6170static void free_handler(struct event_handler *handle)
6171{
6172 free((void *)handle->sys_name);
6173 free((void *)handle->event_name);
6174 free(handle);
6175}
6176
6177static int find_event_handle(struct tep_handle *tep, struct tep_event *event)
6178{
6179 struct event_handler *handle, **next;
6180
6181 for (next = &tep->handlers; *next;
6182 next = &(*next)->next) {
6183 handle = *next;
6184 if (event_matches(event, handle->id,
6185 handle->sys_name,
6186 handle->event_name))
6187 break;
6188 }
6189
6190 if (!(*next))
6191 return 0;
6192
6193 pr_stat("overriding event (%d) %s:%s with new print handler",
6194 event->id, event->system, event->name);
6195
6196 event->handler = handle->func;
6197 event->context = handle->context;
6198
6199 *next = handle->next;
6200 free_handler(handle);
6201
6202 return 1;
6203}
6204
6205/**
6206 * __tep_parse_format - parse the event format
6207 * @buf: the buffer storing the event format string
6208 * @size: the size of @buf
6209 * @sys: the system the event belongs to
6210 *
6211 * This parses the event format and creates an event structure
6212 * to quickly parse raw data for a given event.
6213 *
6214 * These files currently come from:
6215 *
6216 * /sys/kernel/debug/tracing/events/.../.../format
6217 */
6218enum tep_errno __tep_parse_format(struct tep_event **eventp,
6219 struct tep_handle *tep, const char *buf,
6220 unsigned long size, const char *sys)
6221{
6222 struct tep_event *event;
6223 int ret;
6224
6225 init_input_buf(buf, size);
6226
6227 *eventp = event = alloc_event();
6228 if (!event)
6229 return TEP_ERRNO__MEM_ALLOC_FAILED;
6230
6231 event->name = event_read_name();
6232 if (!event->name) {
6233 /* Bad event? */
6234 ret = TEP_ERRNO__MEM_ALLOC_FAILED;
6235 goto event_alloc_failed;
6236 }
6237
6238 if (strcmp(sys, "ftrace") == 0) {
6239 event->flags |= TEP_EVENT_FL_ISFTRACE;
6240
6241 if (strcmp(event->name, "bprint") == 0)
6242 event->flags |= TEP_EVENT_FL_ISBPRINT;
6243 }
6244
6245 event->id = event_read_id();
6246 if (event->id < 0) {
6247 ret = TEP_ERRNO__READ_ID_FAILED;
6248 /*
6249 * This isn't an allocation error actually.
6250 * But as the ID is critical, just bail out.
6251 */
6252 goto event_alloc_failed;
6253 }
6254
6255 event->system = strdup(sys);
6256 if (!event->system) {
6257 ret = TEP_ERRNO__MEM_ALLOC_FAILED;
6258 goto event_alloc_failed;
6259 }
6260
6261 /* Add tep to event so that it can be referenced */
6262 event->tep = tep;
6263
6264 ret = event_read_format(event);
6265 if (ret < 0) {
6266 ret = TEP_ERRNO__READ_FORMAT_FAILED;
6267 goto event_parse_failed;
6268 }
6269
6270 /*
6271 * If the event has an override, don't print warnings if the event
6272 * print format fails to parse.
6273 */
6274 if (tep && find_event_handle(tep, event))
6275 show_warning = 0;
6276
6277 ret = event_read_print(event);
6278 show_warning = 1;
6279
6280 if (ret < 0) {
6281 ret = TEP_ERRNO__READ_PRINT_FAILED;
6282 goto event_parse_failed;
6283 }
6284
6285 if (!ret && (event->flags & TEP_EVENT_FL_ISFTRACE)) {
6286 struct tep_format_field *field;
6287 struct tep_print_arg *arg, **list;
6288
6289 /* old ftrace had no args */
6290 list = &event->print_fmt.args;
6291 for (field = event->format.fields; field; field = field->next) {
6292 arg = alloc_arg();
6293 if (!arg) {
6294 event->flags |= TEP_EVENT_FL_FAILED;
6295 return TEP_ERRNO__OLD_FTRACE_ARG_FAILED;
6296 }
6297 arg->type = TEP_PRINT_FIELD;
6298 arg->field.name = strdup(field->name);
6299 if (!arg->field.name) {
6300 event->flags |= TEP_EVENT_FL_FAILED;
6301 free_arg(arg);
6302 return TEP_ERRNO__OLD_FTRACE_ARG_FAILED;
6303 }
6304 arg->field.field = field;
6305 *list = arg;
6306 list = &arg->next;
6307 }
6308 return 0;
6309 }
6310
6311 return 0;
6312
6313 event_parse_failed:
6314 event->flags |= TEP_EVENT_FL_FAILED;
6315 return ret;
6316
6317 event_alloc_failed:
6318 free(event->system);
6319 free(event->name);
6320 free(event);
6321 *eventp = NULL;
6322 return ret;
6323}
6324
6325static enum tep_errno
6326__parse_event(struct tep_handle *tep,
6327 struct tep_event **eventp,
6328 const char *buf, unsigned long size,
6329 const char *sys)
6330{
6331 int ret = __tep_parse_format(eventp, tep, buf, size, sys);
6332 struct tep_event *event = *eventp;
6333
6334 if (event == NULL)
6335 return ret;
6336
6337 if (tep && add_event(tep, event)) {
6338 ret = TEP_ERRNO__MEM_ALLOC_FAILED;
6339 goto event_add_failed;
6340 }
6341
6342#define PRINT_ARGS 0
6343 if (PRINT_ARGS && event->print_fmt.args)
6344 print_args(event->print_fmt.args);
6345
6346 return 0;
6347
6348event_add_failed:
6349 tep_free_event(event);
6350 return ret;
6351}
6352
6353/**
6354 * tep_parse_format - parse the event format
6355 * @tep: a handle to the trace event parser context
6356 * @eventp: returned format
6357 * @buf: the buffer storing the event format string
6358 * @size: the size of @buf
6359 * @sys: the system the event belongs to
6360 *
6361 * This parses the event format and creates an event structure
6362 * to quickly parse raw data for a given event.
6363 *
6364 * These files currently come from:
6365 *
6366 * /sys/kernel/debug/tracing/events/.../.../format
6367 */
6368enum tep_errno tep_parse_format(struct tep_handle *tep,
6369 struct tep_event **eventp,
6370 const char *buf,
6371 unsigned long size, const char *sys)
6372{
6373 return __parse_event(tep, eventp, buf, size, sys);
6374}
6375
6376/**
6377 * tep_parse_event - parse the event format
6378 * @tep: a handle to the trace event parser context
6379 * @buf: the buffer storing the event format string
6380 * @size: the size of @buf
6381 * @sys: the system the event belongs to
6382 *
6383 * This parses the event format and creates an event structure
6384 * to quickly parse raw data for a given event.
6385 *
6386 * These files currently come from:
6387 *
6388 * /sys/kernel/debug/tracing/events/.../.../format
6389 */
6390enum tep_errno tep_parse_event(struct tep_handle *tep, const char *buf,
6391 unsigned long size, const char *sys)
6392{
6393 struct tep_event *event = NULL;
6394 return __parse_event(tep, &event, buf, size, sys);
6395}
6396
6397int get_field_val(struct trace_seq *s, struct tep_format_field *field,
6398 const char *name, struct tep_record *record,
6399 unsigned long long *val, int err)
6400{
6401 if (!field) {
6402 if (err)
6403 trace_seq_printf(s, "<CANT FIND FIELD %s>", name);
6404 return -1;
6405 }
6406
6407 if (tep_read_number_field(field, record->data, val)) {
6408 if (err)
6409 trace_seq_printf(s, " %s=INVALID", name);
6410 return -1;
6411 }
6412
6413 return 0;
6414}
6415
6416/**
6417 * tep_get_field_raw - return the raw pointer into the data field
6418 * @s: The seq to print to on error
6419 * @event: the event that the field is for
6420 * @name: The name of the field
6421 * @record: The record with the field name.
6422 * @len: place to store the field length.
6423 * @err: print default error if failed.
6424 *
6425 * Returns a pointer into record->data of the field and places
6426 * the length of the field in @len.
6427 *
6428 * On failure, it returns NULL.
6429 */
6430void *tep_get_field_raw(struct trace_seq *s, struct tep_event *event,
6431 const char *name, struct tep_record *record,
6432 int *len, int err)
6433{
6434 struct tep_format_field *field;
6435 void *data = record->data;
6436 unsigned offset;
6437 int dummy;
6438
6439 if (!event)
6440 return NULL;
6441
6442 field = tep_find_field(event, name);
6443
6444 if (!field) {
6445 if (err)
6446 trace_seq_printf(s, "<CANT FIND FIELD %s>", name);
6447 return NULL;
6448 }
6449
6450 /* Allow @len to be NULL */
6451 if (!len)
6452 len = &dummy;
6453
6454 offset = field->offset;
6455 if (field->flags & TEP_FIELD_IS_DYNAMIC) {
6456 offset = tep_read_number(event->tep,
6457 data + offset, field->size);
6458 *len = offset >> 16;
6459 offset &= 0xffff;
6460 } else
6461 *len = field->size;
6462
6463 return data + offset;
6464}
6465
6466/**
6467 * tep_get_field_val - find a field and return its value
6468 * @s: The seq to print to on error
6469 * @event: the event that the field is for
6470 * @name: The name of the field
6471 * @record: The record with the field name.
6472 * @val: place to store the value of the field.
6473 * @err: print default error if failed.
6474 *
6475 * Returns 0 on success -1 on field not found.
6476 */
6477int tep_get_field_val(struct trace_seq *s, struct tep_event *event,
6478 const char *name, struct tep_record *record,
6479 unsigned long long *val, int err)
6480{
6481 struct tep_format_field *field;
6482
6483 if (!event)
6484 return -1;
6485
6486 field = tep_find_field(event, name);
6487
6488 return get_field_val(s, field, name, record, val, err);
6489}
6490
6491/**
6492 * tep_get_common_field_val - find a common field and return its value
6493 * @s: The seq to print to on error
6494 * @event: the event that the field is for
6495 * @name: The name of the field
6496 * @record: The record with the field name.
6497 * @val: place to store the value of the field.
6498 * @err: print default error if failed.
6499 *
6500 * Returns 0 on success -1 on field not found.
6501 */
6502int tep_get_common_field_val(struct trace_seq *s, struct tep_event *event,
6503 const char *name, struct tep_record *record,
6504 unsigned long long *val, int err)
6505{
6506 struct tep_format_field *field;
6507
6508 if (!event)
6509 return -1;
6510
6511 field = tep_find_common_field(event, name);
6512
6513 return get_field_val(s, field, name, record, val, err);
6514}
6515
6516/**
6517 * tep_get_any_field_val - find a any field and return its value
6518 * @s: The seq to print to on error
6519 * @event: the event that the field is for
6520 * @name: The name of the field
6521 * @record: The record with the field name.
6522 * @val: place to store the value of the field.
6523 * @err: print default error if failed.
6524 *
6525 * Returns 0 on success -1 on field not found.
6526 */
6527int tep_get_any_field_val(struct trace_seq *s, struct tep_event *event,
6528 const char *name, struct tep_record *record,
6529 unsigned long long *val, int err)
6530{
6531 struct tep_format_field *field;
6532
6533 if (!event)
6534 return -1;
6535
6536 field = tep_find_any_field(event, name);
6537
6538 return get_field_val(s, field, name, record, val, err);
6539}
6540
6541/**
6542 * tep_print_num_field - print a field and a format
6543 * @s: The seq to print to
6544 * @fmt: The printf format to print the field with.
6545 * @event: the event that the field is for
6546 * @name: The name of the field
6547 * @record: The record with the field name.
6548 * @err: print default error if failed.
6549 *
6550 * Returns positive value on success, negative in case of an error,
6551 * or 0 if buffer is full.
6552 */
6553int tep_print_num_field(struct trace_seq *s, const char *fmt,
6554 struct tep_event *event, const char *name,
6555 struct tep_record *record, int err)
6556{
6557 struct tep_format_field *field = tep_find_field(event, name);
6558 unsigned long long val;
6559
6560 if (!field)
6561 goto failed;
6562
6563 if (tep_read_number_field(field, record->data, &val))
6564 goto failed;
6565
6566 return trace_seq_printf(s, fmt, val);
6567
6568 failed:
6569 if (err)
6570 trace_seq_printf(s, "CAN'T FIND FIELD \"%s\"", name);
6571 return -1;
6572}
6573
6574/**
6575 * tep_print_func_field - print a field and a format for function pointers
6576 * @s: The seq to print to
6577 * @fmt: The printf format to print the field with.
6578 * @event: the event that the field is for
6579 * @name: The name of the field
6580 * @record: The record with the field name.
6581 * @err: print default error if failed.
6582 *
6583 * Returns positive value on success, negative in case of an error,
6584 * or 0 if buffer is full.
6585 */
6586int tep_print_func_field(struct trace_seq *s, const char *fmt,
6587 struct tep_event *event, const char *name,
6588 struct tep_record *record, int err)
6589{
6590 struct tep_format_field *field = tep_find_field(event, name);
6591 struct tep_handle *tep = event->tep;
6592 unsigned long long val;
6593 struct func_map *func;
6594 char tmp[128];
6595
6596 if (!field)
6597 goto failed;
6598
6599 if (tep_read_number_field(field, record->data, &val))
6600 goto failed;
6601
6602 func = find_func(tep, val);
6603
6604 if (func)
6605 snprintf(tmp, 128, "%s/0x%llx", func->func, func->addr - val);
6606 else
6607 sprintf(tmp, "0x%08llx", val);
6608
6609 return trace_seq_printf(s, fmt, tmp);
6610
6611 failed:
6612 if (err)
6613 trace_seq_printf(s, "CAN'T FIND FIELD \"%s\"", name);
6614 return -1;
6615}
6616
6617static void free_func_handle(struct tep_function_handler *func)
6618{
6619 struct func_params *params;
6620
6621 free(func->name);
6622
6623 while (func->params) {
6624 params = func->params;
6625 func->params = params->next;
6626 free(params);
6627 }
6628
6629 free(func);
6630}
6631
6632/**
6633 * tep_register_print_function - register a helper function
6634 * @tep: a handle to the trace event parser context
6635 * @func: the function to process the helper function
6636 * @ret_type: the return type of the helper function
6637 * @name: the name of the helper function
6638 * @parameters: A list of enum tep_func_arg_type
6639 *
6640 * Some events may have helper functions in the print format arguments.
6641 * This allows a plugin to dynamically create a way to process one
6642 * of these functions.
6643 *
6644 * The @parameters is a variable list of tep_func_arg_type enums that
6645 * must end with TEP_FUNC_ARG_VOID.
6646 */
6647int tep_register_print_function(struct tep_handle *tep,
6648 tep_func_handler func,
6649 enum tep_func_arg_type ret_type,
6650 char *name, ...)
6651{
6652 struct tep_function_handler *func_handle;
6653 struct func_params **next_param;
6654 struct func_params *param;
6655 enum tep_func_arg_type type;
6656 va_list ap;
6657 int ret;
6658
6659 func_handle = find_func_handler(tep, name);
6660 if (func_handle) {
6661 /*
6662 * This is most like caused by the users own
6663 * plugins updating the function. This overrides the
6664 * system defaults.
6665 */
6666 pr_stat("override of function helper '%s'", name);
6667 remove_func_handler(tep, name);
6668 }
6669
6670 func_handle = calloc(1, sizeof(*func_handle));
6671 if (!func_handle) {
6672 do_warning("Failed to allocate function handler");
6673 return TEP_ERRNO__MEM_ALLOC_FAILED;
6674 }
6675
6676 func_handle->ret_type = ret_type;
6677 func_handle->name = strdup(name);
6678 func_handle->func = func;
6679 if (!func_handle->name) {
6680 do_warning("Failed to allocate function name");
6681 free(func_handle);
6682 return TEP_ERRNO__MEM_ALLOC_FAILED;
6683 }
6684
6685 next_param = &(func_handle->params);
6686 va_start(ap, name);
6687 for (;;) {
6688 type = va_arg(ap, enum tep_func_arg_type);
6689 if (type == TEP_FUNC_ARG_VOID)
6690 break;
6691
6692 if (type >= TEP_FUNC_ARG_MAX_TYPES) {
6693 do_warning("Invalid argument type %d", type);
6694 ret = TEP_ERRNO__INVALID_ARG_TYPE;
6695 goto out_free;
6696 }
6697
6698 param = malloc(sizeof(*param));
6699 if (!param) {
6700 do_warning("Failed to allocate function param");
6701 ret = TEP_ERRNO__MEM_ALLOC_FAILED;
6702 goto out_free;
6703 }
6704 param->type = type;
6705 param->next = NULL;
6706
6707 *next_param = param;
6708 next_param = &(param->next);
6709
6710 func_handle->nr_args++;
6711 }
6712 va_end(ap);
6713
6714 func_handle->next = tep->func_handlers;
6715 tep->func_handlers = func_handle;
6716
6717 return 0;
6718 out_free:
6719 va_end(ap);
6720 free_func_handle(func_handle);
6721 return ret;
6722}
6723
6724/**
6725 * tep_unregister_print_function - unregister a helper function
6726 * @tep: a handle to the trace event parser context
6727 * @func: the function to process the helper function
6728 * @name: the name of the helper function
6729 *
6730 * This function removes existing print handler for function @name.
6731 *
6732 * Returns 0 if the handler was removed successully, -1 otherwise.
6733 */
6734int tep_unregister_print_function(struct tep_handle *tep,
6735 tep_func_handler func, char *name)
6736{
6737 struct tep_function_handler *func_handle;
6738
6739 func_handle = find_func_handler(tep, name);
6740 if (func_handle && func_handle->func == func) {
6741 remove_func_handler(tep, name);
6742 return 0;
6743 }
6744 return -1;
6745}
6746
6747static struct tep_event *search_event(struct tep_handle *tep, int id,
6748 const char *sys_name,
6749 const char *event_name)
6750{
6751 struct tep_event *event;
6752
6753 if (id >= 0) {
6754 /* search by id */
6755 event = tep_find_event(tep, id);
6756 if (!event)
6757 return NULL;
6758 if (event_name && (strcmp(event_name, event->name) != 0))
6759 return NULL;
6760 if (sys_name && (strcmp(sys_name, event->system) != 0))
6761 return NULL;
6762 } else {
6763 event = tep_find_event_by_name(tep, sys_name, event_name);
6764 if (!event)
6765 return NULL;
6766 }
6767 return event;
6768}
6769
6770/**
6771 * tep_register_event_handler - register a way to parse an event
6772 * @tep: a handle to the trace event parser context
6773 * @id: the id of the event to register
6774 * @sys_name: the system name the event belongs to
6775 * @event_name: the name of the event
6776 * @func: the function to call to parse the event information
6777 * @context: the data to be passed to @func
6778 *
6779 * This function allows a developer to override the parsing of
6780 * a given event. If for some reason the default print format
6781 * is not sufficient, this function will register a function
6782 * for an event to be used to parse the data instead.
6783 *
6784 * If @id is >= 0, then it is used to find the event.
6785 * else @sys_name and @event_name are used.
6786 *
6787 * Returns:
6788 * TEP_REGISTER_SUCCESS_OVERWRITE if an existing handler is overwritten
6789 * TEP_REGISTER_SUCCESS if a new handler is registered successfully
6790 * negative TEP_ERRNO_... in case of an error
6791 *
6792 */
6793int tep_register_event_handler(struct tep_handle *tep, int id,
6794 const char *sys_name, const char *event_name,
6795 tep_event_handler_func func, void *context)
6796{
6797 struct tep_event *event;
6798 struct event_handler *handle;
6799
6800 event = search_event(tep, id, sys_name, event_name);
6801 if (event == NULL)
6802 goto not_found;
6803
6804 pr_stat("overriding event (%d) %s:%s with new print handler",
6805 event->id, event->system, event->name);
6806
6807 event->handler = func;
6808 event->context = context;
6809 return TEP_REGISTER_SUCCESS_OVERWRITE;
6810
6811 not_found:
6812 /* Save for later use. */
6813 handle = calloc(1, sizeof(*handle));
6814 if (!handle) {
6815 do_warning("Failed to allocate event handler");
6816 return TEP_ERRNO__MEM_ALLOC_FAILED;
6817 }
6818
6819 handle->id = id;
6820 if (event_name)
6821 handle->event_name = strdup(event_name);
6822 if (sys_name)
6823 handle->sys_name = strdup(sys_name);
6824
6825 if ((event_name && !handle->event_name) ||
6826 (sys_name && !handle->sys_name)) {
6827 do_warning("Failed to allocate event/sys name");
6828 free((void *)handle->event_name);
6829 free((void *)handle->sys_name);
6830 free(handle);
6831 return TEP_ERRNO__MEM_ALLOC_FAILED;
6832 }
6833
6834 handle->func = func;
6835 handle->next = tep->handlers;
6836 tep->handlers = handle;
6837 handle->context = context;
6838
6839 return TEP_REGISTER_SUCCESS;
6840}
6841
6842static int handle_matches(struct event_handler *handler, int id,
6843 const char *sys_name, const char *event_name,
6844 tep_event_handler_func func, void *context)
6845{
6846 if (id >= 0 && id != handler->id)
6847 return 0;
6848
6849 if (event_name && (strcmp(event_name, handler->event_name) != 0))
6850 return 0;
6851
6852 if (sys_name && (strcmp(sys_name, handler->sys_name) != 0))
6853 return 0;
6854
6855 if (func != handler->func || context != handler->context)
6856 return 0;
6857
6858 return 1;
6859}
6860
6861/**
6862 * tep_unregister_event_handler - unregister an existing event handler
6863 * @tep: a handle to the trace event parser context
6864 * @id: the id of the event to unregister
6865 * @sys_name: the system name the handler belongs to
6866 * @event_name: the name of the event handler
6867 * @func: the function to call to parse the event information
6868 * @context: the data to be passed to @func
6869 *
6870 * This function removes existing event handler (parser).
6871 *
6872 * If @id is >= 0, then it is used to find the event.
6873 * else @sys_name and @event_name are used.
6874 *
6875 * Returns 0 if handler was removed successfully, -1 if event was not found.
6876 */
6877int tep_unregister_event_handler(struct tep_handle *tep, int id,
6878 const char *sys_name, const char *event_name,
6879 tep_event_handler_func func, void *context)
6880{
6881 struct tep_event *event;
6882 struct event_handler *handle;
6883 struct event_handler **next;
6884
6885 event = search_event(tep, id, sys_name, event_name);
6886 if (event == NULL)
6887 goto not_found;
6888
6889 if (event->handler == func && event->context == context) {
6890 pr_stat("removing override handler for event (%d) %s:%s. Going back to default handler.",
6891 event->id, event->system, event->name);
6892
6893 event->handler = NULL;
6894 event->context = NULL;
6895 return 0;
6896 }
6897
6898not_found:
6899 for (next = &tep->handlers; *next; next = &(*next)->next) {
6900 handle = *next;
6901 if (handle_matches(handle, id, sys_name, event_name,
6902 func, context))
6903 break;
6904 }
6905
6906 if (!(*next))
6907 return -1;
6908
6909 *next = handle->next;
6910 free_handler(handle);
6911
6912 return 0;
6913}
6914
6915/**
6916 * tep_alloc - create a tep handle
6917 */
6918struct tep_handle *tep_alloc(void)
6919{
6920 struct tep_handle *tep = calloc(1, sizeof(*tep));
6921
6922 if (tep) {
6923 tep->ref_count = 1;
6924 tep->host_bigendian = tep_is_bigendian();
6925 }
6926
6927 return tep;
6928}
6929
6930void tep_ref(struct tep_handle *tep)
6931{
6932 tep->ref_count++;
6933}
6934
6935int tep_get_ref(struct tep_handle *tep)
6936{
6937 if (tep)
6938 return tep->ref_count;
6939 return 0;
6940}
6941
6942void tep_free_format_field(struct tep_format_field *field)
6943{
6944 free(field->type);
6945 if (field->alias != field->name)
6946 free(field->alias);
6947 free(field->name);
6948 free(field);
6949}
6950
6951static void free_format_fields(struct tep_format_field *field)
6952{
6953 struct tep_format_field *next;
6954
6955 while (field) {
6956 next = field->next;
6957 tep_free_format_field(field);
6958 field = next;
6959 }
6960}
6961
6962static void free_formats(struct tep_format *format)
6963{
6964 free_format_fields(format->common_fields);
6965 free_format_fields(format->fields);
6966}
6967
6968void tep_free_event(struct tep_event *event)
6969{
6970 free(event->name);
6971 free(event->system);
6972
6973 free_formats(&event->format);
6974
6975 free(event->print_fmt.format);
6976 free_args(event->print_fmt.args);
6977
6978 free(event);
6979}
6980
6981/**
6982 * tep_free - free a tep handle
6983 * @tep: the tep handle to free
6984 */
6985void tep_free(struct tep_handle *tep)
6986{
6987 struct cmdline_list *cmdlist, *cmdnext;
6988 struct func_list *funclist, *funcnext;
6989 struct printk_list *printklist, *printknext;
6990 struct tep_function_handler *func_handler;
6991 struct event_handler *handle;
6992 int i;
6993
6994 if (!tep)
6995 return;
6996
6997 cmdlist = tep->cmdlist;
6998 funclist = tep->funclist;
6999 printklist = tep->printklist;
7000
7001 tep->ref_count--;
7002 if (tep->ref_count)
7003 return;
7004
7005 if (tep->cmdlines) {
7006 for (i = 0; i < tep->cmdline_count; i++)
7007 free(tep->cmdlines[i].comm);
7008 free(tep->cmdlines);
7009 }
7010
7011 while (cmdlist) {
7012 cmdnext = cmdlist->next;
7013 free(cmdlist->comm);
7014 free(cmdlist);
7015 cmdlist = cmdnext;
7016 }
7017
7018 if (tep->func_map) {
7019 for (i = 0; i < (int)tep->func_count; i++) {
7020 free(tep->func_map[i].func);
7021 free(tep->func_map[i].mod);
7022 }
7023 free(tep->func_map);
7024 }
7025
7026 while (funclist) {
7027 funcnext = funclist->next;
7028 free(funclist->func);
7029 free(funclist->mod);
7030 free(funclist);
7031 funclist = funcnext;
7032 }
7033
7034 while (tep->func_handlers) {
7035 func_handler = tep->func_handlers;
7036 tep->func_handlers = func_handler->next;
7037 free_func_handle(func_handler);
7038 }
7039
7040 if (tep->printk_map) {
7041 for (i = 0; i < (int)tep->printk_count; i++)
7042 free(tep->printk_map[i].printk);
7043 free(tep->printk_map);
7044 }
7045
7046 while (printklist) {
7047 printknext = printklist->next;
7048 free(printklist->printk);
7049 free(printklist);
7050 printklist = printknext;
7051 }
7052
7053 for (i = 0; i < tep->nr_events; i++)
7054 tep_free_event(tep->events[i]);
7055
7056 while (tep->handlers) {
7057 handle = tep->handlers;
7058 tep->handlers = handle->next;
7059 free_handler(handle);
7060 }
7061
7062 free(tep->events);
7063 free(tep->sort_events);
7064 free(tep->func_resolver);
7065
7066 free(tep);
7067}
7068
7069void tep_unref(struct tep_handle *tep)
7070{
7071 tep_free(tep);
7072}