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