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