Merge tag 'qcom-soc-for-3.16-2' of git://git.kernel.org/pub/scm/linux/kernel/git...
[pandora-kernel.git] / tools / lib / traceevent / event-parse.c
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
38 static const char *input_buf;
39 static unsigned long long input_buf_ptr;
40 static unsigned long long input_buf_siz;
41
42 static int is_flag_field;
43 static int is_symbolic_field;
44
45 static 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
65 static 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
72 const char *pevent_get_input_buf(void)
73 {
74         return input_buf;
75 }
76
77 unsigned long long pevent_get_input_buf_ptr(void)
78 {
79         return input_buf_ptr;
80 }
81
82 struct 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
91 struct pevent_func_params {
92         struct pevent_func_params       *next;
93         enum pevent_func_arg_type       type;
94 };
95
96 struct 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
105 static unsigned long long
106 process_defined_func(struct trace_seq *s, void *data, int size,
107                      struct event_format *event, struct print_arg *arg);
108
109 static 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  */
119 void pevent_buffer_init(const char *buf, unsigned long long size)
120 {
121         init_input_buf(buf, size);
122 }
123
124 void breakpoint(void)
125 {
126         static int x;
127         x++;
128 }
129
130 struct print_arg *alloc_arg(void)
131 {
132         return calloc(1, sizeof(struct print_arg));
133 }
134
135 struct cmdline {
136         char *comm;
137         int pid;
138 };
139
140 static 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
153 struct cmdline_list {
154         struct cmdline_list     *next;
155         char                    *comm;
156         int                     pid;
157 };
158
159 static 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
188 static 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  */
217 int 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  */
243 static 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  */
295 int 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
320 void pevent_register_trace_clock(struct pevent *pevent, char *trace_clock)
321 {
322         pevent->trace_clock = trace_clock;
323 }
324
325 struct func_map {
326         unsigned long long              addr;
327         char                            *func;
328         char                            *mod;
329 };
330
331 struct func_list {
332         struct func_list        *next;
333         unsigned long long      addr;
334         char                    *func;
335         char                    *mod;
336 };
337
338 static 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  */
355 static 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
372 static 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
411 static struct func_map *
412 find_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  */
437 const 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  */
457 unsigned long long
458 pevent_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  */
479 int 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
505 out_free_func:
506         free(item->func);
507         item->func = NULL;
508 out_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  */
520 void 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
538 struct printk_map {
539         unsigned long long              addr;
540         char                            *printk;
541 };
542
543 struct printk_list {
544         struct printk_list      *next;
545         unsigned long long      addr;
546         char                    *printk;
547 };
548
549 static 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
562 static 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
593 static struct printk_map *
594 find_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  */
619 int 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
651 out_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  */
663 void 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
677 static struct event_format *alloc_event(void)
678 {
679         return calloc(1, sizeof(struct event_format));
680 }
681
682 static 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
709 static 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
720 static 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
733 static 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
792 static 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
812 static 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
820 static 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  */
833 int pevent_peek_char(void)
834 {
835         return __peek_char();
836 }
837
838 static 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
857 static enum event_type force_token(const char *str, char **tok);
858
859 static 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
1025 static 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
1049 static void free_token(char *tok)
1050 {
1051         if (tok)
1052                 free(tok);
1053 }
1054
1055 static 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  */
1081 enum 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  */
1090 void pevent_free_token(char *token)
1091 {
1092         free_token(token);
1093 }
1094
1095 /* no newline */
1096 static 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
1113 static 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
1123 static 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
1140 static 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
1151 static int read_expect_type(enum event_type expect, char **tok)
1152 {
1153         return __read_expect_type(expect, tok, 1);
1154 }
1155
1156 static 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
1175 static int read_expected(enum event_type expect, const char *str)
1176 {
1177         return __read_expected(expect, str, 1);
1178 }
1179
1180 static int read_expected_item(enum event_type expect, const char *str)
1181 {
1182         return __read_expected(expect, str, 0);
1183 }
1184
1185 static 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
1205 static 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
1228 static 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
1238 static 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
1246 static 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
1255 static 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
1283 static 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
1559 fail:
1560         free_token(token);
1561 fail_expect:
1562         if (field) {
1563                 free(field->type);
1564                 free(field->name);
1565                 free(field);
1566         }
1567         return -1;
1568 }
1569
1570 static 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
1602 static enum event_type
1603 process_arg_token(struct event_format *event, struct print_arg *arg,
1604                   char **tok, enum event_type type);
1605
1606 static enum event_type
1607 process_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
1618 static enum event_type
1619 process_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  */
1625 static enum event_type
1626 process_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
1639 static enum event_type
1640 process_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
1684 out_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
1692 static enum event_type
1693 process_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
1720 out_free:
1721         free_token(token);
1722         free_arg(arg);
1723         return EVENT_ERROR;
1724 }
1725
1726 static 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
1781 static 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 */
1794 static enum event_type
1795 process_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
1965 out_warn_free:
1966         do_warning_event(event, "%s: not enough memory!", __func__);
1967 out_free:
1968         free_token(token);
1969         *tok = NULL;
1970         return EVENT_ERROR;
1971 }
1972
1973 static enum event_type
1974 process_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
2013 static char *arg_eval (struct print_arg *arg);
2014
2015 static unsigned long long
2016 eval_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  */
2109 static unsigned long long
2110 eval_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
2120 static 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
2279 static 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
2307 static enum event_type
2308 process_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
2378 out_free_field:
2379         free_flag_sym(field);
2380 out_free:
2381         free_arg(arg);
2382         free_token(token);
2383         *tok = NULL;
2384
2385         return EVENT_ERROR;
2386 }
2387
2388 static enum event_type
2389 process_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
2433 out_free_field:
2434         free_arg(field);
2435 out_free:
2436         free_token(token);
2437         *tok = NULL;
2438         return EVENT_ERROR;
2439 }
2440
2441 static enum event_type
2442 process_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
2472 out_free_field:
2473         free_arg(field);
2474 out_free:
2475         free_token(token);
2476         *tok = NULL;
2477         return EVENT_ERROR;
2478 }
2479
2480 static enum event_type
2481 process_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
2530 static enum event_type
2531 process_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
2594 static enum event_type
2595 process_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
2657 static enum event_type
2658 process_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
2686 static struct pevent_function_handler *
2687 find_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
2702 static 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
2718 static enum event_type
2719 process_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
2770 err:
2771         free_arg(farg);
2772         free_token(token);
2773         return EVENT_ERROR;
2774 }
2775
2776 static enum event_type
2777 process_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
2816 static enum event_type
2817 process_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
2905 static 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
2963 static 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  */
3028 struct format_field *
3029 pevent_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  */
3050 struct format_field *
3051 pevent_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  */
3073 struct format_field *
3074 pevent_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  */
3093 unsigned 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  */
3122 int 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
3140 static 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
3166 static 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
3179 static 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
3186 static 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
3193 static 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
3200 static 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
3207 static 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
3214 static 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
3221 static 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  */
3230 struct 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  */
3262 struct event_format *
3263 pevent_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
3290 static unsigned long long
3291 eval_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
3500 out_warning_op:
3501         do_warning_event(event, "%s: unknown op '%s'", __func__, arg->op.op);
3502         return 0;
3503
3504 out_warning_field:
3505         do_warning_event(event, "%s: field %s not found",
3506                          __func__, arg->field.name);
3507         return 0;
3508 }
3509
3510 struct flag {
3511         const char *name;
3512         unsigned long long value;
3513 };
3514
3515 static 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
3531 static 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
3550 static 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
3559 static 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
3718 out_warning_field:
3719         do_warning_event(event, "%s: field %s not found",
3720                          __func__, arg->field.name);
3721 }
3722
3723 static unsigned long long
3724 process_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);
3794 out_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
3808 static 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
3820 static 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
3965 out_free:
3966         free_args(args);
3967         return NULL;
3968 }
3969
3970 static char *
3971 get_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
4006 static 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
4042 static 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
4052 static 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
4123 static 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) {
4359 out_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  */
4379 void 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  */
4459 int 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  */
4471 struct 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  */
4483 int 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  */
4496 const 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  */
4513 void 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
4533 static 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
4546 void 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
4615 static 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
4629 static 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
4646 static 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
4663 struct 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
4710 static struct format_field **
4711 get_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  */
4748 struct 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  */
4762 struct 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
4769 static 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 */
4779 static 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
4850 static 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  */
4955 int 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
4985 static 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
5001 static 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
5008 static 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  */
5049 enum 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
5156 static 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
5179 event_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  */
5199 enum 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  */
5221 enum 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
5230 static const char * const pevent_error_str[] = {
5231         PEVENT_ERRORS
5232 };
5233 #undef _PE
5234
5235 int 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
5262 int 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  */
5295 void *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  */
5342 int 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  */
5367 int 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  */
5392 int 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  */
5417 int 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  */
5449 int 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
5480 static 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  */
5510 int 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  */
5597 int 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
5610 static 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  */
5650 int 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
5699 static 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  */
5734 int 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
5755 not_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  */
5775 struct 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
5785 void pevent_ref(struct pevent *pevent)
5786 {
5787         pevent->ref_count++;
5788 }
5789
5790 static 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
5803 static void free_formats(struct format *format)
5804 {
5805         free_format_fields(format->common_fields);
5806         free_format_fields(format->fields);
5807 }
5808
5809 void 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  */
5826 void 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
5909 void pevent_unref(struct pevent *pevent)
5910 {
5911         pevent_free(pevent);
5912 }