parse-events: Allow '*' and '/' operations in TP_printk
[profile/ivi/kernel-adaptation-intel-automotive.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, write to the Free Software
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18  *
19  * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
20  *
21  *  The parts for function graph printing was taken and modified from the
22  *  Linux Kernel that were written by
23  *    - Copyright (C) 2009  Frederic Weisbecker,
24  *  Frederic Weisbecker gave his permission to relicense the code to
25  *  the Lesser General Public License.
26  */
27 #define _GNU_SOURCE
28 #include <stdio.h>
29 #include <stdlib.h>
30 #include <string.h>
31 #include <stdarg.h>
32 #include <ctype.h>
33 #include <errno.h>
34
35 #include "event-parse.h"
36 #include "event-utils.h"
37
38 static const char *input_buf;
39 static unsigned long long input_buf_ptr;
40 static unsigned long long input_buf_siz;
41
42 static int is_flag_field;
43 static int is_symbolic_field;
44
45 static int show_warning = 1;
46
47 #define do_warning(fmt, ...)                            \
48         do {                                            \
49                 if (show_warning)                       \
50                         warning(fmt, ##__VA_ARGS__);    \
51         } while (0)
52
53 static void init_input_buf(const char *buf, unsigned long long size)
54 {
55         input_buf = buf;
56         input_buf_siz = size;
57         input_buf_ptr = 0;
58 }
59
60 const char *pevent_get_input_buf(void)
61 {
62         return input_buf;
63 }
64
65 unsigned long long pevent_get_input_buf_ptr(void)
66 {
67         return input_buf_ptr;
68 }
69
70 struct event_handler {
71         struct event_handler            *next;
72         int                             id;
73         const char                      *sys_name;
74         const char                      *event_name;
75         pevent_event_handler_func       func;
76         void                            *context;
77 };
78
79 struct pevent_func_params {
80         struct pevent_func_params       *next;
81         enum pevent_func_arg_type       type;
82 };
83
84 struct pevent_function_handler {
85         struct pevent_function_handler  *next;
86         enum pevent_func_arg_type       ret_type;
87         char                            *name;
88         pevent_func_handler             func;
89         struct pevent_func_params       *params;
90         int                             nr_args;
91 };
92
93 static unsigned long long
94 process_defined_func(struct trace_seq *s, void *data, int size,
95                      struct event_format *event, struct print_arg *arg);
96
97 static void free_func_handle(struct pevent_function_handler *func);
98
99 /**
100  * pevent_buffer_init - init buffer for parsing
101  * @buf: buffer to parse
102  * @size: the size of the buffer
103  *
104  * For use with pevent_read_token(), this initializes the internal
105  * buffer that pevent_read_token() will parse.
106  */
107 void pevent_buffer_init(const char *buf, unsigned long long size)
108 {
109         init_input_buf(buf, size);
110 }
111
112 void breakpoint(void)
113 {
114         static int x;
115         x++;
116 }
117
118 struct print_arg *alloc_arg(void)
119 {
120         struct print_arg *arg;
121
122         arg = malloc_or_die(sizeof(*arg));
123         if (!arg)
124                 return NULL;
125         memset(arg, 0, sizeof(*arg));
126
127         return arg;
128 }
129
130 struct cmdline {
131         char *comm;
132         int pid;
133 };
134
135 static int cmdline_cmp(const void *a, const void *b)
136 {
137         const struct cmdline *ca = a;
138         const struct cmdline *cb = b;
139
140         if (ca->pid < cb->pid)
141                 return -1;
142         if (ca->pid > cb->pid)
143                 return 1;
144
145         return 0;
146 }
147
148 struct cmdline_list {
149         struct cmdline_list     *next;
150         char                    *comm;
151         int                     pid;
152 };
153
154 static int cmdline_init(struct pevent *pevent)
155 {
156         struct cmdline_list *cmdlist = pevent->cmdlist;
157         struct cmdline_list *item;
158         struct cmdline *cmdlines;
159         int i;
160
161         cmdlines = malloc_or_die(sizeof(*cmdlines) * pevent->cmdline_count);
162
163         i = 0;
164         while (cmdlist) {
165                 cmdlines[i].pid = cmdlist->pid;
166                 cmdlines[i].comm = cmdlist->comm;
167                 i++;
168                 item = cmdlist;
169                 cmdlist = cmdlist->next;
170                 free(item);
171         }
172
173         qsort(cmdlines, pevent->cmdline_count, sizeof(*cmdlines), cmdline_cmp);
174
175         pevent->cmdlines = cmdlines;
176         pevent->cmdlist = NULL;
177
178         return 0;
179 }
180
181 static char *find_cmdline(struct pevent *pevent, int pid)
182 {
183         const struct cmdline *comm;
184         struct cmdline key;
185
186         if (!pid)
187                 return "<idle>";
188
189         if (!pevent->cmdlines)
190                 cmdline_init(pevent);
191
192         key.pid = pid;
193
194         comm = bsearch(&key, pevent->cmdlines, pevent->cmdline_count,
195                        sizeof(*pevent->cmdlines), cmdline_cmp);
196
197         if (comm)
198                 return comm->comm;
199         return "<...>";
200 }
201
202 /**
203  * pevent_pid_is_registered - return if a pid has a cmdline registered
204  * @pevent: handle for the pevent
205  * @pid: The pid to check if it has a cmdline registered with.
206  *
207  * Returns 1 if the pid has a cmdline mapped to it
208  * 0 otherwise.
209  */
210 int pevent_pid_is_registered(struct pevent *pevent, int pid)
211 {
212         const struct cmdline *comm;
213         struct cmdline key;
214
215         if (!pid)
216                 return 1;
217
218         if (!pevent->cmdlines)
219                 cmdline_init(pevent);
220
221         key.pid = pid;
222
223         comm = bsearch(&key, pevent->cmdlines, pevent->cmdline_count,
224                        sizeof(*pevent->cmdlines), cmdline_cmp);
225
226         if (comm)
227                 return 1;
228         return 0;
229 }
230
231 /*
232  * If the command lines have been converted to an array, then
233  * we must add this pid. This is much slower than when cmdlines
234  * are added before the array is initialized.
235  */
236 static int add_new_comm(struct pevent *pevent, const char *comm, int pid)
237 {
238         struct cmdline *cmdlines = pevent->cmdlines;
239         const struct cmdline *cmdline;
240         struct cmdline key;
241
242         if (!pid)
243                 return 0;
244
245         /* avoid duplicates */
246         key.pid = pid;
247
248         cmdline = bsearch(&key, pevent->cmdlines, pevent->cmdline_count,
249                        sizeof(*pevent->cmdlines), cmdline_cmp);
250         if (cmdline) {
251                 errno = EEXIST;
252                 return -1;
253         }
254
255         cmdlines = realloc(cmdlines, sizeof(*cmdlines) * (pevent->cmdline_count + 1));
256         if (!cmdlines) {
257                 errno = ENOMEM;
258                 return -1;
259         }
260
261         cmdlines[pevent->cmdline_count].pid = pid;
262         cmdlines[pevent->cmdline_count].comm = strdup(comm);
263         if (!cmdlines[pevent->cmdline_count].comm)
264                 die("malloc comm");
265                 
266         if (cmdlines[pevent->cmdline_count].comm)
267                 pevent->cmdline_count++;
268
269         qsort(cmdlines, pevent->cmdline_count, sizeof(*cmdlines), cmdline_cmp);
270         pevent->cmdlines = cmdlines;
271
272         return 0;
273 }
274
275 /**
276  * pevent_register_comm - register a pid / comm mapping
277  * @pevent: handle for the pevent
278  * @comm: the command line to register
279  * @pid: the pid to map the command line to
280  *
281  * This adds a mapping to search for command line names with
282  * a given pid. The comm is duplicated.
283  */
284 int pevent_register_comm(struct pevent *pevent, const char *comm, int pid)
285 {
286         struct cmdline_list *item;
287
288         if (pevent->cmdlines)
289                 return add_new_comm(pevent, comm, pid);
290
291         item = malloc_or_die(sizeof(*item));
292         item->comm = strdup(comm);
293         if (!item->comm)
294                 die("malloc comm");
295         item->pid = pid;
296         item->next = pevent->cmdlist;
297
298         pevent->cmdlist = item;
299         pevent->cmdline_count++;
300
301         return 0;
302 }
303
304 struct func_map {
305         unsigned long long              addr;
306         char                            *func;
307         char                            *mod;
308 };
309
310 struct func_list {
311         struct func_list        *next;
312         unsigned long long      addr;
313         char                    *func;
314         char                    *mod;
315 };
316
317 static int func_cmp(const void *a, const void *b)
318 {
319         const struct func_map *fa = a;
320         const struct func_map *fb = b;
321
322         if (fa->addr < fb->addr)
323                 return -1;
324         if (fa->addr > fb->addr)
325                 return 1;
326
327         return 0;
328 }
329
330 /*
331  * We are searching for a record in between, not an exact
332  * match.
333  */
334 static int func_bcmp(const void *a, const void *b)
335 {
336         const struct func_map *fa = a;
337         const struct func_map *fb = b;
338
339         if ((fa->addr == fb->addr) ||
340
341             (fa->addr > fb->addr &&
342              fa->addr < (fb+1)->addr))
343                 return 0;
344
345         if (fa->addr < fb->addr)
346                 return -1;
347
348         return 1;
349 }
350
351 static int func_map_init(struct pevent *pevent)
352 {
353         struct func_list *funclist;
354         struct func_list *item;
355         struct func_map *func_map;
356         int i;
357
358         func_map = malloc_or_die(sizeof(*func_map) * (pevent->func_count + 1));
359         funclist = pevent->funclist;
360
361         i = 0;
362         while (funclist) {
363                 func_map[i].func = funclist->func;
364                 func_map[i].addr = funclist->addr;
365                 func_map[i].mod = funclist->mod;
366                 i++;
367                 item = funclist;
368                 funclist = funclist->next;
369                 free(item);
370         }
371
372         qsort(func_map, pevent->func_count, sizeof(*func_map), func_cmp);
373
374         /*
375          * Add a special record at the end.
376          */
377         func_map[pevent->func_count].func = NULL;
378         func_map[pevent->func_count].addr = 0;
379         func_map[pevent->func_count].mod = NULL;
380
381         pevent->func_map = func_map;
382         pevent->funclist = NULL;
383
384         return 0;
385 }
386
387 static struct func_map *
388 find_func(struct pevent *pevent, unsigned long long addr)
389 {
390         struct func_map *func;
391         struct func_map key;
392
393         if (!pevent->func_map)
394                 func_map_init(pevent);
395
396         key.addr = addr;
397
398         func = bsearch(&key, pevent->func_map, pevent->func_count,
399                        sizeof(*pevent->func_map), func_bcmp);
400
401         return func;
402 }
403
404 /**
405  * pevent_find_function - find a function by a given address
406  * @pevent: handle for the pevent
407  * @addr: the address to find the function with
408  *
409  * Returns a pointer to the function stored that has the given
410  * address. Note, the address does not have to be exact, it
411  * will select the function that would contain the address.
412  */
413 const char *pevent_find_function(struct pevent *pevent, unsigned long long addr)
414 {
415         struct func_map *map;
416
417         map = find_func(pevent, addr);
418         if (!map)
419                 return NULL;
420
421         return map->func;
422 }
423
424 /**
425  * pevent_find_function_address - find a function address by a given address
426  * @pevent: handle for the pevent
427  * @addr: the address to find the function with
428  *
429  * Returns the address the function starts at. This can be used in
430  * conjunction with pevent_find_function to print both the function
431  * name and the function offset.
432  */
433 unsigned long long
434 pevent_find_function_address(struct pevent *pevent, unsigned long long addr)
435 {
436         struct func_map *map;
437
438         map = find_func(pevent, addr);
439         if (!map)
440                 return 0;
441
442         return map->addr;
443 }
444
445 /**
446  * pevent_register_function - register a function with a given address
447  * @pevent: handle for the pevent
448  * @function: the function name to register
449  * @addr: the address the function starts at
450  * @mod: the kernel module the function may be in (NULL for none)
451  *
452  * This registers a function name with an address and module.
453  * The @func passed in is duplicated.
454  */
455 int pevent_register_function(struct pevent *pevent, char *func,
456                              unsigned long long addr, char *mod)
457 {
458         struct func_list *item;
459
460         item = malloc_or_die(sizeof(*item));
461
462         item->next = pevent->funclist;
463         item->func = strdup(func);
464         if (mod)
465                 item->mod = strdup(mod);
466         else
467                 item->mod = NULL;
468         item->addr = addr;
469
470         pevent->funclist = item;
471
472         pevent->func_count++;
473
474         return 0;
475 }
476
477 /**
478  * pevent_print_funcs - print out the stored functions
479  * @pevent: handle for the pevent
480  *
481  * This prints out the stored functions.
482  */
483 void pevent_print_funcs(struct pevent *pevent)
484 {
485         int i;
486
487         if (!pevent->func_map)
488                 func_map_init(pevent);
489
490         for (i = 0; i < (int)pevent->func_count; i++) {
491                 printf("%016llx %s",
492                        pevent->func_map[i].addr,
493                        pevent->func_map[i].func);
494                 if (pevent->func_map[i].mod)
495                         printf(" [%s]\n", pevent->func_map[i].mod);
496                 else
497                         printf("\n");
498         }
499 }
500
501 struct printk_map {
502         unsigned long long              addr;
503         char                            *printk;
504 };
505
506 struct printk_list {
507         struct printk_list      *next;
508         unsigned long long      addr;
509         char                    *printk;
510 };
511
512 static int printk_cmp(const void *a, const void *b)
513 {
514         const struct func_map *fa = a;
515         const struct func_map *fb = b;
516
517         if (fa->addr < fb->addr)
518                 return -1;
519         if (fa->addr > fb->addr)
520                 return 1;
521
522         return 0;
523 }
524
525 static void printk_map_init(struct pevent *pevent)
526 {
527         struct printk_list *printklist;
528         struct printk_list *item;
529         struct printk_map *printk_map;
530         int i;
531
532         printk_map = malloc_or_die(sizeof(*printk_map) * (pevent->printk_count + 1));
533
534         printklist = pevent->printklist;
535
536         i = 0;
537         while (printklist) {
538                 printk_map[i].printk = printklist->printk;
539                 printk_map[i].addr = printklist->addr;
540                 i++;
541                 item = printklist;
542                 printklist = printklist->next;
543                 free(item);
544         }
545
546         qsort(printk_map, pevent->printk_count, sizeof(*printk_map), printk_cmp);
547
548         pevent->printk_map = printk_map;
549         pevent->printklist = NULL;
550 }
551
552 static struct printk_map *
553 find_printk(struct pevent *pevent, unsigned long long addr)
554 {
555         struct printk_map *printk;
556         struct printk_map key;
557
558         if (!pevent->printk_map)
559                 printk_map_init(pevent);
560
561         key.addr = addr;
562
563         printk = bsearch(&key, pevent->printk_map, pevent->printk_count,
564                          sizeof(*pevent->printk_map), printk_cmp);
565
566         return printk;
567 }
568
569 /**
570  * pevent_register_print_string - register a string by its address
571  * @pevent: handle for the pevent
572  * @fmt: the string format to register
573  * @addr: the address the string was located at
574  *
575  * This registers a string by the address it was stored in the kernel.
576  * The @fmt passed in is duplicated.
577  */
578 int pevent_register_print_string(struct pevent *pevent, char *fmt,
579                                  unsigned long long addr)
580 {
581         struct printk_list *item;
582
583         item = malloc_or_die(sizeof(*item));
584
585         item->next = pevent->printklist;
586         pevent->printklist = item;
587         item->printk = strdup(fmt);
588         item->addr = addr;
589
590         pevent->printk_count++;
591
592         return 0;
593 }
594
595 /**
596  * pevent_print_printk - print out the stored strings
597  * @pevent: handle for the pevent
598  *
599  * This prints the string formats that were stored.
600  */
601 void pevent_print_printk(struct pevent *pevent)
602 {
603         int i;
604
605         if (!pevent->printk_map)
606                 printk_map_init(pevent);
607
608         for (i = 0; i < (int)pevent->printk_count; i++) {
609                 printf("%016llx %s\n",
610                        pevent->printk_map[i].addr,
611                        pevent->printk_map[i].printk);
612         }
613 }
614
615 static struct event_format *alloc_event(void)
616 {
617         struct event_format *event;
618
619         event = malloc_or_die(sizeof(*event));
620         memset(event, 0, sizeof(*event));
621
622         return event;
623 }
624
625 static void add_event(struct pevent *pevent, struct event_format *event)
626 {
627         int i;
628
629         if (!pevent->events)
630                 pevent->events = malloc_or_die(sizeof(event));
631         else
632                 pevent->events =
633                         realloc(pevent->events, sizeof(event) *
634                                 (pevent->nr_events + 1));
635         if (!pevent->events)
636                 die("Can not allocate events");
637
638         for (i = 0; i < pevent->nr_events; i++) {
639                 if (pevent->events[i]->id > event->id)
640                         break;
641         }
642         if (i < pevent->nr_events)
643                 memmove(&pevent->events[i + 1],
644                         &pevent->events[i],
645                         sizeof(event) * (pevent->nr_events - i));
646
647         pevent->events[i] = event;
648         pevent->nr_events++;
649
650         event->pevent = pevent;
651 }
652
653 static int event_item_type(enum event_type type)
654 {
655         switch (type) {
656         case EVENT_ITEM ... EVENT_SQUOTE:
657                 return 1;
658         case EVENT_ERROR ... EVENT_DELIM:
659         default:
660                 return 0;
661         }
662 }
663
664 static void free_flag_sym(struct print_flag_sym *fsym)
665 {
666         struct print_flag_sym *next;
667
668         while (fsym) {
669                 next = fsym->next;
670                 free(fsym->value);
671                 free(fsym->str);
672                 free(fsym);
673                 fsym = next;
674         }
675 }
676
677 static void free_arg(struct print_arg *arg)
678 {
679         struct print_arg *farg;
680
681         if (!arg)
682                 return;
683
684         switch (arg->type) {
685         case PRINT_ATOM:
686                 free(arg->atom.atom);
687                 break;
688         case PRINT_FIELD:
689                 free(arg->field.name);
690                 break;
691         case PRINT_FLAGS:
692                 free_arg(arg->flags.field);
693                 free(arg->flags.delim);
694                 free_flag_sym(arg->flags.flags);
695                 break;
696         case PRINT_SYMBOL:
697                 free_arg(arg->symbol.field);
698                 free_flag_sym(arg->symbol.symbols);
699                 break;
700         case PRINT_TYPE:
701                 free(arg->typecast.type);
702                 free_arg(arg->typecast.item);
703                 break;
704         case PRINT_STRING:
705         case PRINT_BSTRING:
706                 free(arg->string.string);
707                 break;
708         case PRINT_DYNAMIC_ARRAY:
709                 free(arg->dynarray.index);
710                 break;
711         case PRINT_OP:
712                 free(arg->op.op);
713                 free_arg(arg->op.left);
714                 free_arg(arg->op.right);
715                 break;
716         case PRINT_FUNC:
717                 while (arg->func.args) {
718                         farg = arg->func.args;
719                         arg->func.args = farg->next;
720                         free_arg(farg);
721                 }
722                 break;
723
724         case PRINT_NULL:
725         default:
726                 break;
727         }
728
729         free(arg);
730 }
731
732 static enum event_type get_type(int ch)
733 {
734         if (ch == '\n')
735                 return EVENT_NEWLINE;
736         if (isspace(ch))
737                 return EVENT_SPACE;
738         if (isalnum(ch) || ch == '_')
739                 return EVENT_ITEM;
740         if (ch == '\'')
741                 return EVENT_SQUOTE;
742         if (ch == '"')
743                 return EVENT_DQUOTE;
744         if (!isprint(ch))
745                 return EVENT_NONE;
746         if (ch == '(' || ch == ')' || ch == ',')
747                 return EVENT_DELIM;
748
749         return EVENT_OP;
750 }
751
752 static int __read_char(void)
753 {
754         if (input_buf_ptr >= input_buf_siz)
755                 return -1;
756
757         return input_buf[input_buf_ptr++];
758 }
759
760 static int __peek_char(void)
761 {
762         if (input_buf_ptr >= input_buf_siz)
763                 return -1;
764
765         return input_buf[input_buf_ptr];
766 }
767
768 /**
769  * pevent_peek_char - peek at the next character that will be read
770  *
771  * Returns the next character read, or -1 if end of buffer.
772  */
773 int pevent_peek_char(void)
774 {
775         return __peek_char();
776 }
777
778 static enum event_type force_token(const char *str, char **tok);
779
780 static enum event_type __read_token(char **tok)
781 {
782         char buf[BUFSIZ];
783         int ch, last_ch, quote_ch, next_ch;
784         int i = 0;
785         int tok_size = 0;
786         enum event_type type;
787
788         *tok = NULL;
789
790
791         ch = __read_char();
792         if (ch < 0)
793                 return EVENT_NONE;
794
795         type = get_type(ch);
796         if (type == EVENT_NONE)
797                 return type;
798
799         buf[i++] = ch;
800
801         switch (type) {
802         case EVENT_NEWLINE:
803         case EVENT_DELIM:
804                 *tok = malloc_or_die(2);
805                 (*tok)[0] = ch;
806                 (*tok)[1] = 0;
807                 return type;
808
809         case EVENT_OP:
810                 switch (ch) {
811                 case '-':
812                         next_ch = __peek_char();
813                         if (next_ch == '>') {
814                                 buf[i++] = __read_char();
815                                 break;
816                         }
817                         /* fall through */
818                 case '+':
819                 case '|':
820                 case '&':
821                 case '>':
822                 case '<':
823                         last_ch = ch;
824                         ch = __peek_char();
825                         if (ch != last_ch)
826                                 goto test_equal;
827                         buf[i++] = __read_char();
828                         switch (last_ch) {
829                         case '>':
830                         case '<':
831                                 goto test_equal;
832                         default:
833                                 break;
834                         }
835                         break;
836                 case '!':
837                 case '=':
838                         goto test_equal;
839                 default: /* what should we do instead? */
840                         break;
841                 }
842                 buf[i] = 0;
843                 *tok = strdup(buf);
844                 return type;
845
846  test_equal:
847                 ch = __peek_char();
848                 if (ch == '=')
849                         buf[i++] = __read_char();
850                 goto out;
851
852         case EVENT_DQUOTE:
853         case EVENT_SQUOTE:
854                 /* don't keep quotes */
855                 i--;
856                 quote_ch = ch;
857                 last_ch = 0;
858  concat:
859                 do {
860                         if (i == (BUFSIZ - 1)) {
861                                 buf[i] = 0;
862                                 if (*tok) {
863                                         *tok = realloc(*tok, tok_size + BUFSIZ);
864                                         if (!*tok)
865                                                 return EVENT_NONE;
866                                         strcat(*tok, buf);
867                                 } else
868                                         *tok = strdup(buf);
869
870                                 if (!*tok)
871                                         return EVENT_NONE;
872                                 tok_size += BUFSIZ;
873                                 i = 0;
874                         }
875                         last_ch = ch;
876                         ch = __read_char();
877                         buf[i++] = ch;
878                         /* the '\' '\' will cancel itself */
879                         if (ch == '\\' && last_ch == '\\')
880                                 last_ch = 0;
881                 } while (ch != quote_ch || last_ch == '\\');
882                 /* remove the last quote */
883                 i--;
884
885                 /*
886                  * For strings (double quotes) check the next token.
887                  * If it is another string, concatinate the two.
888                  */
889                 if (type == EVENT_DQUOTE) {
890                         unsigned long long save_input_buf_ptr = input_buf_ptr;
891
892                         do {
893                                 ch = __read_char();
894                         } while (isspace(ch));
895                         if (ch == '"')
896                                 goto concat;
897                         input_buf_ptr = save_input_buf_ptr;
898                 }
899
900                 goto out;
901
902         case EVENT_ERROR ... EVENT_SPACE:
903         case EVENT_ITEM:
904         default:
905                 break;
906         }
907
908         while (get_type(__peek_char()) == type) {
909                 if (i == (BUFSIZ - 1)) {
910                         buf[i] = 0;
911                         if (*tok) {
912                                 *tok = realloc(*tok, tok_size + BUFSIZ);
913                                 if (!*tok)
914                                         return EVENT_NONE;
915                                 strcat(*tok, buf);
916                         } else
917                                 *tok = strdup(buf);
918
919                         if (!*tok)
920                                 return EVENT_NONE;
921                         tok_size += BUFSIZ;
922                         i = 0;
923                 }
924                 ch = __read_char();
925                 buf[i++] = ch;
926         }
927
928  out:
929         buf[i] = 0;
930         if (*tok) {
931                 *tok = realloc(*tok, tok_size + i);
932                 if (!*tok)
933                         return EVENT_NONE;
934                 strcat(*tok, buf);
935         } else
936                 *tok = strdup(buf);
937         if (!*tok)
938                 return EVENT_NONE;
939
940         if (type == EVENT_ITEM) {
941                 /*
942                  * Older versions of the kernel has a bug that
943                  * creates invalid symbols and will break the mac80211
944                  * parsing. This is a work around to that bug.
945                  *
946                  * See Linux kernel commit:
947                  *  811cb50baf63461ce0bdb234927046131fc7fa8b
948                  */
949                 if (strcmp(*tok, "LOCAL_PR_FMT") == 0) {
950                         free(*tok);
951                         *tok = NULL;
952                         return force_token("\"\%s\" ", tok);
953                 } else if (strcmp(*tok, "STA_PR_FMT") == 0) {
954                         free(*tok);
955                         *tok = NULL;
956                         return force_token("\" sta:%pM\" ", tok);
957                 } else if (strcmp(*tok, "VIF_PR_FMT") == 0) {
958                         free(*tok);
959                         *tok = NULL;
960                         return force_token("\" vif:%p(%d)\" ", tok);
961                 }
962         }
963
964         return type;
965 }
966
967 static enum event_type force_token(const char *str, char **tok)
968 {
969         const char *save_input_buf;
970         unsigned long long save_input_buf_ptr;
971         unsigned long long save_input_buf_siz;
972         enum event_type type;
973         
974         /* save off the current input pointers */
975         save_input_buf = input_buf;
976         save_input_buf_ptr = input_buf_ptr;
977         save_input_buf_siz = input_buf_siz;
978
979         init_input_buf(str, strlen(str));
980
981         type = __read_token(tok);
982
983         /* reset back to original token */
984         input_buf = save_input_buf;
985         input_buf_ptr = save_input_buf_ptr;
986         input_buf_siz = save_input_buf_siz;
987
988         return type;
989 }
990
991 static void free_token(char *tok)
992 {
993         if (tok)
994                 free(tok);
995 }
996
997 static enum event_type read_token(char **tok)
998 {
999         enum event_type type;
1000
1001         for (;;) {
1002                 type = __read_token(tok);
1003                 if (type != EVENT_SPACE)
1004                         return type;
1005
1006                 free_token(*tok);
1007         }
1008
1009         /* not reached */
1010         *tok = NULL;
1011         return EVENT_NONE;
1012 }
1013
1014 /**
1015  * pevent_read_token - access to utilites to use the pevent parser
1016  * @tok: The token to return
1017  *
1018  * This will parse tokens from the string given by
1019  * pevent_init_data().
1020  *
1021  * Returns the token type.
1022  */
1023 enum event_type pevent_read_token(char **tok)
1024 {
1025         return read_token(tok);
1026 }
1027
1028 /**
1029  * pevent_free_token - free a token returned by pevent_read_token
1030  * @token: the token to free
1031  */
1032 void pevent_free_token(char *token)
1033 {
1034         free_token(token);
1035 }
1036
1037 /* no newline */
1038 static enum event_type read_token_item(char **tok)
1039 {
1040         enum event_type type;
1041
1042         for (;;) {
1043                 type = __read_token(tok);
1044                 if (type != EVENT_SPACE && type != EVENT_NEWLINE)
1045                         return type;
1046                 free_token(*tok);
1047                 *tok = NULL;
1048         }
1049
1050         /* not reached */
1051         *tok = NULL;
1052         return EVENT_NONE;
1053 }
1054
1055 static int test_type(enum event_type type, enum event_type expect)
1056 {
1057         if (type != expect) {
1058                 do_warning("Error: expected type %d but read %d",
1059                     expect, type);
1060                 return -1;
1061         }
1062         return 0;
1063 }
1064
1065 static int test_type_token(enum event_type type, const char *token,
1066                     enum event_type expect, const char *expect_tok)
1067 {
1068         if (type != expect) {
1069                 do_warning("Error: expected type %d but read %d",
1070                     expect, type);
1071                 return -1;
1072         }
1073
1074         if (strcmp(token, expect_tok) != 0) {
1075                 do_warning("Error: expected '%s' but read '%s'",
1076                     expect_tok, token);
1077                 return -1;
1078         }
1079         return 0;
1080 }
1081
1082 static int __read_expect_type(enum event_type expect, char **tok, int newline_ok)
1083 {
1084         enum event_type type;
1085
1086         if (newline_ok)
1087                 type = read_token(tok);
1088         else
1089                 type = read_token_item(tok);
1090         return test_type(type, expect);
1091 }
1092
1093 static int read_expect_type(enum event_type expect, char **tok)
1094 {
1095         return __read_expect_type(expect, tok, 1);
1096 }
1097
1098 static int __read_expected(enum event_type expect, const char *str,
1099                            int newline_ok)
1100 {
1101         enum event_type type;
1102         char *token;
1103         int ret;
1104
1105         if (newline_ok)
1106                 type = read_token(&token);
1107         else
1108                 type = read_token_item(&token);
1109
1110         ret = test_type_token(type, token, expect, str);
1111
1112         free_token(token);
1113
1114         return ret;
1115 }
1116
1117 static int read_expected(enum event_type expect, const char *str)
1118 {
1119         return __read_expected(expect, str, 1);
1120 }
1121
1122 static int read_expected_item(enum event_type expect, const char *str)
1123 {
1124         return __read_expected(expect, str, 0);
1125 }
1126
1127 static char *event_read_name(void)
1128 {
1129         char *token;
1130
1131         if (read_expected(EVENT_ITEM, "name") < 0)
1132                 return NULL;
1133
1134         if (read_expected(EVENT_OP, ":") < 0)
1135                 return NULL;
1136
1137         if (read_expect_type(EVENT_ITEM, &token) < 0)
1138                 goto fail;
1139
1140         return token;
1141
1142  fail:
1143         free_token(token);
1144         return NULL;
1145 }
1146
1147 static int event_read_id(void)
1148 {
1149         char *token;
1150         int id;
1151
1152         if (read_expected_item(EVENT_ITEM, "ID") < 0)
1153                 return -1;
1154
1155         if (read_expected(EVENT_OP, ":") < 0)
1156                 return -1;
1157
1158         if (read_expect_type(EVENT_ITEM, &token) < 0)
1159                 goto fail;
1160
1161         id = strtoul(token, NULL, 0);
1162         free_token(token);
1163         return id;
1164
1165  fail:
1166         free_token(token);
1167         return -1;
1168 }
1169
1170 static int field_is_string(struct format_field *field)
1171 {
1172         if ((field->flags & FIELD_IS_ARRAY) &&
1173             (strstr(field->type, "char") || strstr(field->type, "u8") ||
1174              strstr(field->type, "s8")))
1175                 return 1;
1176
1177         return 0;
1178 }
1179
1180 static int field_is_dynamic(struct format_field *field)
1181 {
1182         if (strncmp(field->type, "__data_loc", 10) == 0)
1183                 return 1;
1184
1185         return 0;
1186 }
1187
1188 static int field_is_long(struct format_field *field)
1189 {
1190         /* includes long long */
1191         if (strstr(field->type, "long"))
1192                 return 1;
1193
1194         return 0;
1195 }
1196
1197 static int event_read_fields(struct event_format *event, struct format_field **fields)
1198 {
1199         struct format_field *field = NULL;
1200         enum event_type type;
1201         char *token;
1202         char *last_token;
1203         int count = 0;
1204
1205         do {
1206                 type = read_token(&token);
1207                 if (type == EVENT_NEWLINE) {
1208                         free_token(token);
1209                         return count;
1210                 }
1211
1212                 count++;
1213
1214                 if (test_type_token(type, token, EVENT_ITEM, "field"))
1215                         goto fail;
1216                 free_token(token);
1217
1218                 type = read_token(&token);
1219                 /*
1220                  * The ftrace fields may still use the "special" name.
1221                  * Just ignore it.
1222                  */
1223                 if (event->flags & EVENT_FL_ISFTRACE &&
1224                     type == EVENT_ITEM && strcmp(token, "special") == 0) {
1225                         free_token(token);
1226                         type = read_token(&token);
1227                 }
1228
1229                 if (test_type_token(type, token, EVENT_OP, ":") < 0)
1230                         goto fail;
1231
1232                 free_token(token);
1233                 if (read_expect_type(EVENT_ITEM, &token) < 0)
1234                         goto fail;
1235
1236                 last_token = token;
1237
1238                 field = malloc_or_die(sizeof(*field));
1239                 memset(field, 0, sizeof(*field));
1240                 field->event = event;
1241
1242                 /* read the rest of the type */
1243                 for (;;) {
1244                         type = read_token(&token);
1245                         if (type == EVENT_ITEM ||
1246                             (type == EVENT_OP && strcmp(token, "*") == 0) ||
1247                             /*
1248                              * Some of the ftrace fields are broken and have
1249                              * an illegal "." in them.
1250                              */
1251                             (event->flags & EVENT_FL_ISFTRACE &&
1252                              type == EVENT_OP && strcmp(token, ".") == 0)) {
1253
1254                                 if (strcmp(token, "*") == 0)
1255                                         field->flags |= FIELD_IS_POINTER;
1256
1257                                 if (field->type) {
1258                                         field->type = realloc(field->type,
1259                                                               strlen(field->type) +
1260                                                               strlen(last_token) + 2);
1261                                         strcat(field->type, " ");
1262                                         strcat(field->type, last_token);
1263                                         free(last_token);
1264                                 } else
1265                                         field->type = last_token;
1266                                 last_token = token;
1267                                 continue;
1268                         }
1269
1270                         break;
1271                 }
1272
1273                 if (!field->type) {
1274                         die("no type found");
1275                         goto fail;
1276                 }
1277                 field->name = last_token;
1278
1279                 if (test_type(type, EVENT_OP))
1280                         goto fail;
1281
1282                 if (strcmp(token, "[") == 0) {
1283                         enum event_type last_type = type;
1284                         char *brackets = token;
1285                         int len;
1286
1287                         field->flags |= FIELD_IS_ARRAY;
1288
1289                         type = read_token(&token);
1290
1291                         if (type == EVENT_ITEM)
1292                                 field->arraylen = strtoul(token, NULL, 0);
1293                         else
1294                                 field->arraylen = 0;
1295
1296                         while (strcmp(token, "]") != 0) {
1297                                 if (last_type == EVENT_ITEM &&
1298                                     type == EVENT_ITEM)
1299                                         len = 2;
1300                                 else
1301                                         len = 1;
1302                                 last_type = type;
1303
1304                                 brackets = realloc(brackets,
1305                                                    strlen(brackets) +
1306                                                    strlen(token) + len);
1307                                 if (len == 2)
1308                                         strcat(brackets, " ");
1309                                 strcat(brackets, token);
1310                                 /* We only care about the last token */
1311                                 field->arraylen = strtoul(token, NULL, 0);
1312                                 free_token(token);
1313                                 type = read_token(&token);
1314                                 if (type == EVENT_NONE) {
1315                                         die("failed to find token");
1316                                         goto fail;
1317                                 }
1318                         }
1319
1320                         free_token(token);
1321
1322                         brackets = realloc(brackets, strlen(brackets) + 2);
1323                         strcat(brackets, "]");
1324
1325                         /* add brackets to type */
1326
1327                         type = read_token(&token);
1328                         /*
1329                          * If the next token is not an OP, then it is of
1330                          * the format: type [] item;
1331                          */
1332                         if (type == EVENT_ITEM) {
1333                                 field->type = realloc(field->type,
1334                                                       strlen(field->type) +
1335                                                       strlen(field->name) +
1336                                                       strlen(brackets) + 2);
1337                                 strcat(field->type, " ");
1338                                 strcat(field->type, field->name);
1339                                 free_token(field->name);
1340                                 strcat(field->type, brackets);
1341                                 field->name = token;
1342                                 type = read_token(&token);
1343                         } else {
1344                                 field->type = realloc(field->type,
1345                                                       strlen(field->type) +
1346                                                       strlen(brackets) + 1);
1347                                 strcat(field->type, brackets);
1348                         }
1349                         free(brackets);
1350                 }
1351
1352                 if (field_is_string(field))
1353                         field->flags |= FIELD_IS_STRING;
1354                 if (field_is_dynamic(field))
1355                         field->flags |= FIELD_IS_DYNAMIC;
1356                 if (field_is_long(field))
1357                         field->flags |= FIELD_IS_LONG;
1358
1359                 if (test_type_token(type, token,  EVENT_OP, ";"))
1360                         goto fail;
1361                 free_token(token);
1362
1363                 if (read_expected(EVENT_ITEM, "offset") < 0)
1364                         goto fail_expect;
1365
1366                 if (read_expected(EVENT_OP, ":") < 0)
1367                         goto fail_expect;
1368
1369                 if (read_expect_type(EVENT_ITEM, &token))
1370                         goto fail;
1371                 field->offset = strtoul(token, NULL, 0);
1372                 free_token(token);
1373
1374                 if (read_expected(EVENT_OP, ";") < 0)
1375                         goto fail_expect;
1376
1377                 if (read_expected(EVENT_ITEM, "size") < 0)
1378                         goto fail_expect;
1379
1380                 if (read_expected(EVENT_OP, ":") < 0)
1381                         goto fail_expect;
1382
1383                 if (read_expect_type(EVENT_ITEM, &token))
1384                         goto fail;
1385                 field->size = strtoul(token, NULL, 0);
1386                 free_token(token);
1387
1388                 if (read_expected(EVENT_OP, ";") < 0)
1389                         goto fail_expect;
1390
1391                 type = read_token(&token);
1392                 if (type != EVENT_NEWLINE) {
1393                         /* newer versions of the kernel have a "signed" type */
1394                         if (test_type_token(type, token, EVENT_ITEM, "signed"))
1395                                 goto fail;
1396
1397                         free_token(token);
1398
1399                         if (read_expected(EVENT_OP, ":") < 0)
1400                                 goto fail_expect;
1401
1402                         if (read_expect_type(EVENT_ITEM, &token))
1403                                 goto fail;
1404
1405                         /* add signed type */
1406
1407                         free_token(token);
1408                         if (read_expected(EVENT_OP, ";") < 0)
1409                                 goto fail_expect;
1410
1411                         if (read_expect_type(EVENT_NEWLINE, &token))
1412                                 goto fail;
1413                 }
1414
1415                 free_token(token);
1416
1417                 if (field->flags & FIELD_IS_ARRAY) {
1418                         if (field->arraylen)
1419                                 field->elementsize = field->size / field->arraylen;
1420                         else if (field->flags & FIELD_IS_STRING)
1421                                 field->elementsize = 1;
1422                         else
1423                                 field->elementsize = event->pevent->long_size;
1424                 } else
1425                         field->elementsize = field->size;
1426
1427                 *fields = field;
1428                 fields = &field->next;
1429
1430         } while (1);
1431
1432         return 0;
1433
1434 fail:
1435         free_token(token);
1436 fail_expect:
1437         if (field)
1438                 free(field);
1439         return -1;
1440 }
1441
1442 static int event_read_format(struct event_format *event)
1443 {
1444         char *token;
1445         int ret;
1446
1447         if (read_expected_item(EVENT_ITEM, "format") < 0)
1448                 return -1;
1449
1450         if (read_expected(EVENT_OP, ":") < 0)
1451                 return -1;
1452
1453         if (read_expect_type(EVENT_NEWLINE, &token))
1454                 goto fail;
1455         free_token(token);
1456
1457         ret = event_read_fields(event, &event->format.common_fields);
1458         if (ret < 0)
1459                 return ret;
1460         event->format.nr_common = ret;
1461
1462         ret = event_read_fields(event, &event->format.fields);
1463         if (ret < 0)
1464                 return ret;
1465         event->format.nr_fields = ret;
1466
1467         return 0;
1468
1469  fail:
1470         free_token(token);
1471         return -1;
1472 }
1473
1474 static enum event_type
1475 process_arg_token(struct event_format *event, struct print_arg *arg,
1476                   char **tok, enum event_type type);
1477
1478 static enum event_type
1479 process_arg(struct event_format *event, struct print_arg *arg, char **tok)
1480 {
1481         enum event_type type;
1482         char *token;
1483
1484         type = read_token(&token);
1485         *tok = token;
1486
1487         return process_arg_token(event, arg, tok, type);
1488 }
1489
1490 static enum event_type
1491 process_op(struct event_format *event, struct print_arg *arg, char **tok);
1492
1493 static enum event_type
1494 process_cond(struct event_format *event, struct print_arg *top, char **tok)
1495 {
1496         struct print_arg *arg, *left, *right;
1497         enum event_type type;
1498         char *token = NULL;
1499
1500         arg = alloc_arg();
1501         left = alloc_arg();
1502         right = alloc_arg();
1503
1504         arg->type = PRINT_OP;
1505         arg->op.left = left;
1506         arg->op.right = right;
1507
1508         *tok = NULL;
1509         type = process_arg(event, left, &token);
1510
1511  again:
1512         /* Handle other operations in the arguments */
1513         if (type == EVENT_OP && strcmp(token, ":") != 0) {
1514                 type = process_op(event, left, &token);
1515                 goto again;
1516         }
1517
1518         if (test_type_token(type, token, EVENT_OP, ":"))
1519                 goto out_free;
1520
1521         arg->op.op = token;
1522
1523         type = process_arg(event, right, &token);
1524
1525         top->op.right = arg;
1526
1527         *tok = token;
1528         return type;
1529
1530 out_free:
1531         /* Top may point to itself */
1532         top->op.right = NULL;
1533         free_token(token);
1534         free_arg(arg);
1535         return EVENT_ERROR;
1536 }
1537
1538 static enum event_type
1539 process_array(struct event_format *event, struct print_arg *top, char **tok)
1540 {
1541         struct print_arg *arg;
1542         enum event_type type;
1543         char *token = NULL;
1544
1545         arg = alloc_arg();
1546
1547         *tok = NULL;
1548         type = process_arg(event, arg, &token);
1549         if (test_type_token(type, token, EVENT_OP, "]"))
1550                 goto out_free;
1551
1552         top->op.right = arg;
1553
1554         free_token(token);
1555         type = read_token_item(&token);
1556         *tok = token;
1557
1558         return type;
1559
1560 out_free:
1561         free_token(*tok);
1562         *tok = NULL;
1563         free_arg(arg);
1564         return EVENT_ERROR;
1565 }
1566
1567 static int get_op_prio(char *op)
1568 {
1569         if (!op[1]) {
1570                 switch (op[0]) {
1571                 case '~':
1572                 case '!':
1573                         return 4;
1574                 case '*':
1575                 case '/':
1576                 case '%':
1577                         return 6;
1578                 case '+':
1579                 case '-':
1580                         return 7;
1581                         /* '>>' and '<<' are 8 */
1582                 case '<':
1583                 case '>':
1584                         return 9;
1585                         /* '==' and '!=' are 10 */
1586                 case '&':
1587                         return 11;
1588                 case '^':
1589                         return 12;
1590                 case '|':
1591                         return 13;
1592                 case '?':
1593                         return 16;
1594                 default:
1595                         do_warning("unknown op '%c'", op[0]);
1596                         return -1;
1597                 }
1598         } else {
1599                 if (strcmp(op, "++") == 0 ||
1600                     strcmp(op, "--") == 0) {
1601                         return 3;
1602                 } else if (strcmp(op, ">>") == 0 ||
1603                            strcmp(op, "<<") == 0) {
1604                         return 8;
1605                 } else if (strcmp(op, ">=") == 0 ||
1606                            strcmp(op, "<=") == 0) {
1607                         return 9;
1608                 } else if (strcmp(op, "==") == 0 ||
1609                            strcmp(op, "!=") == 0) {
1610                         return 10;
1611                 } else if (strcmp(op, "&&") == 0) {
1612                         return 14;
1613                 } else if (strcmp(op, "||") == 0) {
1614                         return 15;
1615                 } else {
1616                         do_warning("unknown op '%s'", op);
1617                         return -1;
1618                 }
1619         }
1620 }
1621
1622 static int set_op_prio(struct print_arg *arg)
1623 {
1624
1625         /* single ops are the greatest */
1626         if (!arg->op.left || arg->op.left->type == PRINT_NULL)
1627                 arg->op.prio = 0;
1628         else
1629                 arg->op.prio = get_op_prio(arg->op.op);
1630
1631         return arg->op.prio;
1632 }
1633
1634 /* Note, *tok does not get freed, but will most likely be saved */
1635 static enum event_type
1636 process_op(struct event_format *event, struct print_arg *arg, char **tok)
1637 {
1638         struct print_arg *left, *right = NULL;
1639         enum event_type type;
1640         char *token;
1641
1642         /* the op is passed in via tok */
1643         token = *tok;
1644
1645         if (arg->type == PRINT_OP && !arg->op.left) {
1646                 /* handle single op */
1647                 if (token[1]) {
1648                         die("bad op token %s", token);
1649                         goto out_free;
1650                 }
1651                 switch (token[0]) {
1652                 case '~':
1653                 case '!':
1654                 case '+':
1655                 case '-':
1656                         break;
1657                 default:
1658                         do_warning("bad op token %s", token);
1659                         goto out_free;
1660
1661                 }
1662
1663                 /* make an empty left */
1664                 left = alloc_arg();
1665                 left->type = PRINT_NULL;
1666                 arg->op.left = left;
1667
1668                 right = alloc_arg();
1669                 arg->op.right = right;
1670
1671                 /* do not free the token, it belongs to an op */
1672                 *tok = NULL;
1673                 type = process_arg(event, right, tok);
1674
1675         } else if (strcmp(token, "?") == 0) {
1676
1677                 left = alloc_arg();
1678                 /* copy the top arg to the left */
1679                 *left = *arg;
1680
1681                 arg->type = PRINT_OP;
1682                 arg->op.op = token;
1683                 arg->op.left = left;
1684                 arg->op.prio = 0;
1685
1686                 type = process_cond(event, arg, tok);
1687
1688         } else if (strcmp(token, ">>") == 0 ||
1689                    strcmp(token, "<<") == 0 ||
1690                    strcmp(token, "&") == 0 ||
1691                    strcmp(token, "|") == 0 ||
1692                    strcmp(token, "&&") == 0 ||
1693                    strcmp(token, "||") == 0 ||
1694                    strcmp(token, "-") == 0 ||
1695                    strcmp(token, "+") == 0 ||
1696                    strcmp(token, "*") == 0 ||
1697                    strcmp(token, "^") == 0 ||
1698                    strcmp(token, "/") == 0 ||
1699                    strcmp(token, "<") == 0 ||
1700                    strcmp(token, ">") == 0 ||
1701                    strcmp(token, "==") == 0 ||
1702                    strcmp(token, "!=") == 0) {
1703
1704                 left = alloc_arg();
1705
1706                 /* copy the top arg to the left */
1707                 *left = *arg;
1708
1709                 arg->type = PRINT_OP;
1710                 arg->op.op = token;
1711                 arg->op.left = left;
1712
1713                 if (set_op_prio(arg) == -1) {
1714                         event->flags |= EVENT_FL_FAILED;
1715                         goto out_free;
1716                 }
1717
1718                 type = read_token_item(&token);
1719                 *tok = token;
1720
1721                 /* could just be a type pointer */
1722                 if ((strcmp(arg->op.op, "*") == 0) &&
1723                     type == EVENT_DELIM && (strcmp(token, ")") == 0)) {
1724                         if (left->type != PRINT_ATOM)
1725                                 die("bad pointer type");
1726                         left->atom.atom = realloc(left->atom.atom,
1727                                             strlen(left->atom.atom) + 3);
1728                         strcat(left->atom.atom, " *");
1729                         free(arg->op.op);
1730                         *arg = *left;
1731                         free(left);
1732
1733                         return type;
1734                 }
1735
1736                 right = alloc_arg();
1737                 type = process_arg_token(event, right, tok, type);
1738                 arg->op.right = right;
1739
1740         } else if (strcmp(token, "[") == 0) {
1741
1742                 left = alloc_arg();
1743                 *left = *arg;
1744
1745                 arg->type = PRINT_OP;
1746                 arg->op.op = token;
1747                 arg->op.left = left;
1748
1749                 arg->op.prio = 0;
1750
1751                 type = process_array(event, arg, tok);
1752
1753         } else {
1754                 do_warning("unknown op '%s'", token);
1755                 event->flags |= EVENT_FL_FAILED;
1756                 /* the arg is now the left side */
1757                 goto out_free;
1758         }
1759
1760         if (type == EVENT_OP && strcmp(*tok, ":") != 0) {
1761                 int prio;
1762
1763                 /* higher prios need to be closer to the root */
1764                 prio = get_op_prio(*tok);
1765
1766                 if (prio > arg->op.prio)
1767                         return process_op(event, arg, tok);
1768
1769                 return process_op(event, right, tok);
1770         }
1771
1772         return type;
1773
1774  out_free:
1775         free_token(token);
1776         *tok = NULL;
1777         return EVENT_ERROR;
1778 }
1779
1780 static enum event_type
1781 process_entry(struct event_format *event __unused, struct print_arg *arg,
1782               char **tok)
1783 {
1784         enum event_type type;
1785         char *field;
1786         char *token;
1787
1788         if (read_expected(EVENT_OP, "->") < 0)
1789                 goto out_err;
1790
1791         if (read_expect_type(EVENT_ITEM, &token) < 0)
1792                 goto out_free;
1793         field = token;
1794
1795         arg->type = PRINT_FIELD;
1796         arg->field.name = field;
1797
1798         if (is_flag_field) {
1799                 arg->field.field = pevent_find_any_field(event, arg->field.name);
1800                 arg->field.field->flags |= FIELD_IS_FLAG;
1801                 is_flag_field = 0;
1802         } else if (is_symbolic_field) {
1803                 arg->field.field = pevent_find_any_field(event, arg->field.name);
1804                 arg->field.field->flags |= FIELD_IS_SYMBOLIC;
1805                 is_symbolic_field = 0;
1806         }
1807
1808         type = read_token(&token);
1809         *tok = token;
1810
1811         return type;
1812
1813  out_free:
1814         free_token(token);
1815  out_err:
1816         *tok = NULL;
1817         return EVENT_ERROR;
1818 }
1819
1820 static char *arg_eval (struct print_arg *arg);
1821
1822 static unsigned long long
1823 eval_type_str(unsigned long long val, const char *type, int pointer)
1824 {
1825         int sign = 0;
1826         char *ref;
1827         int len;
1828
1829         len = strlen(type);
1830
1831         if (pointer) {
1832
1833                 if (type[len-1] != '*') {
1834                         do_warning("pointer expected with non pointer type");
1835                         return val;
1836                 }
1837
1838                 ref = malloc_or_die(len);
1839                 memcpy(ref, type, len);
1840
1841                 /* chop off the " *" */
1842                 ref[len - 2] = 0;
1843
1844                 val = eval_type_str(val, ref, 0);
1845                 free(ref);
1846                 return val;
1847         }
1848
1849         /* check if this is a pointer */
1850         if (type[len - 1] == '*')
1851                 return val;
1852
1853         /* Try to figure out the arg size*/
1854         if (strncmp(type, "struct", 6) == 0)
1855                 /* all bets off */
1856                 return val;
1857
1858         if (strcmp(type, "u8") == 0)
1859                 return val & 0xff;
1860
1861         if (strcmp(type, "u16") == 0)
1862                 return val & 0xffff;
1863
1864         if (strcmp(type, "u32") == 0)
1865                 return val & 0xffffffff;
1866
1867         if (strcmp(type, "u64") == 0 ||
1868             strcmp(type, "s64"))
1869                 return val;
1870
1871         if (strcmp(type, "s8") == 0)
1872                 return (unsigned long long)(char)val & 0xff;
1873
1874         if (strcmp(type, "s16") == 0)
1875                 return (unsigned long long)(short)val & 0xffff;
1876
1877         if (strcmp(type, "s32") == 0)
1878                 return (unsigned long long)(int)val & 0xffffffff;
1879
1880         if (strncmp(type, "unsigned ", 9) == 0) {
1881                 sign = 0;
1882                 type += 9;
1883         }
1884
1885         if (strcmp(type, "char") == 0) {
1886                 if (sign)
1887                         return (unsigned long long)(char)val & 0xff;
1888                 else
1889                         return val & 0xff;
1890         }
1891
1892         if (strcmp(type, "short") == 0) {
1893                 if (sign)
1894                         return (unsigned long long)(short)val & 0xffff;
1895                 else
1896                         return val & 0xffff;
1897         }
1898
1899         if (strcmp(type, "int") == 0) {
1900                 if (sign)
1901                         return (unsigned long long)(int)val & 0xffffffff;
1902                 else
1903                         return val & 0xffffffff;
1904         }
1905
1906         return val;
1907 }
1908
1909 /*
1910  * Try to figure out the type.
1911  */
1912 static unsigned long long
1913 eval_type(unsigned long long val, struct print_arg *arg, int pointer)
1914 {
1915         if (arg->type != PRINT_TYPE)
1916                 die("expected type argument");
1917
1918         return eval_type_str(val, arg->typecast.type, pointer);
1919 }
1920
1921 static int arg_num_eval(struct print_arg *arg, long long *val)
1922 {
1923         long long left, right;
1924         int ret = 1;
1925
1926         switch (arg->type) {
1927         case PRINT_ATOM:
1928                 *val = strtoll(arg->atom.atom, NULL, 0);
1929                 break;
1930         case PRINT_TYPE:
1931                 ret = arg_num_eval(arg->typecast.item, val);
1932                 if (!ret)
1933                         break;
1934                 *val = eval_type(*val, arg, 0);
1935                 break;
1936         case PRINT_OP:
1937                 switch (arg->op.op[0]) {
1938                 case '|':
1939                         ret = arg_num_eval(arg->op.left, &left);
1940                         if (!ret)
1941                                 break;
1942                         ret = arg_num_eval(arg->op.right, &right);
1943                         if (!ret)
1944                                 break;
1945                         if (arg->op.op[1])
1946                                 *val = left || right;
1947                         else
1948                                 *val = left | right;
1949                         break;
1950                 case '&':
1951                         ret = arg_num_eval(arg->op.left, &left);
1952                         if (!ret)
1953                                 break;
1954                         ret = arg_num_eval(arg->op.right, &right);
1955                         if (!ret)
1956                                 break;
1957                         if (arg->op.op[1])
1958                                 *val = left && right;
1959                         else
1960                                 *val = left & right;
1961                         break;
1962                 case '<':
1963                         ret = arg_num_eval(arg->op.left, &left);
1964                         if (!ret)
1965                                 break;
1966                         ret = arg_num_eval(arg->op.right, &right);
1967                         if (!ret)
1968                                 break;
1969                         switch (arg->op.op[1]) {
1970                         case 0:
1971                                 *val = left < right;
1972                                 break;
1973                         case '<':
1974                                 *val = left << right;
1975                                 break;
1976                         case '=':
1977                                 *val = left <= right;
1978                                 break;
1979                         default:
1980                                 do_warning("unknown op '%s'", arg->op.op);
1981                                 ret = 0;
1982                         }
1983                         break;
1984                 case '>':
1985                         ret = arg_num_eval(arg->op.left, &left);
1986                         if (!ret)
1987                                 break;
1988                         ret = arg_num_eval(arg->op.right, &right);
1989                         if (!ret)
1990                                 break;
1991                         switch (arg->op.op[1]) {
1992                         case 0:
1993                                 *val = left > right;
1994                                 break;
1995                         case '>':
1996                                 *val = left >> right;
1997                                 break;
1998                         case '=':
1999                                 *val = left >= right;
2000                                 break;
2001                         default:
2002                                 do_warning("unknown op '%s'", arg->op.op);
2003                                 ret = 0;
2004                         }
2005                         break;
2006                 case '=':
2007                         ret = arg_num_eval(arg->op.left, &left);
2008                         if (!ret)
2009                                 break;
2010                         ret = arg_num_eval(arg->op.right, &right);
2011                         if (!ret)
2012                                 break;
2013
2014                         if (arg->op.op[1] != '=') {
2015                                 do_warning("unknown op '%s'", arg->op.op);
2016                                 ret = 0;
2017                         } else
2018                                 *val = left == right;
2019                         break;
2020                 case '!':
2021                         ret = arg_num_eval(arg->op.left, &left);
2022                         if (!ret)
2023                                 break;
2024                         ret = arg_num_eval(arg->op.right, &right);
2025                         if (!ret)
2026                                 break;
2027
2028                         switch (arg->op.op[1]) {
2029                         case '=':
2030                                 *val = left != right;
2031                                 break;
2032                         default:
2033                                 do_warning("unknown op '%s'", arg->op.op);
2034                                 ret = 0;
2035                         }
2036                         break;
2037                 case '-':
2038                         /* check for negative */
2039                         if (arg->op.left->type == PRINT_NULL)
2040                                 left = 0;
2041                         else
2042                                 ret = arg_num_eval(arg->op.left, &left);
2043                         if (!ret)
2044                                 break;
2045                         ret = arg_num_eval(arg->op.right, &right);
2046                         if (!ret)
2047                                 break;
2048                         *val = left - right;
2049                         break;
2050                 case '+':
2051                         if (arg->op.left->type == PRINT_NULL)
2052                                 left = 0;
2053                         else
2054                                 ret = arg_num_eval(arg->op.left, &left);
2055                         if (!ret)
2056                                 break;
2057                         ret = arg_num_eval(arg->op.right, &right);
2058                         if (!ret)
2059                                 break;
2060                         *val = left + right;
2061                         break;
2062                 default:
2063                         do_warning("unknown op '%s'", arg->op.op);
2064                         ret = 0;
2065                 }
2066                 break;
2067
2068         case PRINT_NULL:
2069         case PRINT_FIELD ... PRINT_SYMBOL:
2070         case PRINT_STRING:
2071         case PRINT_BSTRING:
2072         default:
2073                 do_warning("invalid eval type %d", arg->type);
2074                 ret = 0;
2075
2076         }
2077         return ret;
2078 }
2079
2080 static char *arg_eval (struct print_arg *arg)
2081 {
2082         long long val;
2083         static char buf[20];
2084
2085         switch (arg->type) {
2086         case PRINT_ATOM:
2087                 return arg->atom.atom;
2088         case PRINT_TYPE:
2089                 return arg_eval(arg->typecast.item);
2090         case PRINT_OP:
2091                 if (!arg_num_eval(arg, &val))
2092                         break;
2093                 sprintf(buf, "%lld", val);
2094                 return buf;
2095
2096         case PRINT_NULL:
2097         case PRINT_FIELD ... PRINT_SYMBOL:
2098         case PRINT_STRING:
2099         case PRINT_BSTRING:
2100         default:
2101                 die("invalid eval type %d", arg->type);
2102                 break;
2103         }
2104
2105         return NULL;
2106 }
2107
2108 static enum event_type
2109 process_fields(struct event_format *event, struct print_flag_sym **list, char **tok)
2110 {
2111         enum event_type type;
2112         struct print_arg *arg = NULL;
2113         struct print_flag_sym *field;
2114         char *token = *tok;
2115         char *value;
2116
2117         do {
2118                 free_token(token);
2119                 type = read_token_item(&token);
2120                 if (test_type_token(type, token, EVENT_OP, "{"))
2121                         break;
2122
2123                 arg = alloc_arg();
2124
2125                 free_token(token);
2126                 type = process_arg(event, arg, &token);
2127                 if (test_type_token(type, token, EVENT_DELIM, ","))
2128                         goto out_free;
2129
2130                 field = malloc_or_die(sizeof(*field));
2131                 memset(field, 0, sizeof(*field));
2132
2133                 value = arg_eval(arg);
2134                 if (value == NULL)
2135                         goto out_free;
2136                 field->value = strdup(value);
2137
2138                 free_arg(arg);
2139                 arg = alloc_arg();
2140
2141                 free_token(token);
2142                 type = process_arg(event, arg, &token);
2143                 if (test_type_token(type, token, EVENT_OP, "}"))
2144                         goto out_free;
2145
2146                 value = arg_eval(arg);
2147                 if (value == NULL)
2148                         goto out_free;
2149                 field->str = strdup(value);
2150                 free_arg(arg);
2151                 arg = NULL;
2152
2153                 *list = field;
2154                 list = &field->next;
2155
2156                 free_token(token);
2157                 type = read_token_item(&token);
2158         } while (type == EVENT_DELIM && strcmp(token, ",") == 0);
2159
2160         *tok = token;
2161         return type;
2162
2163 out_free:
2164         free_arg(arg);
2165         free_token(token);
2166         *tok = NULL;
2167
2168         return EVENT_ERROR;
2169 }
2170
2171 static enum event_type
2172 process_flags(struct event_format *event, struct print_arg *arg, char **tok)
2173 {
2174         struct print_arg *field;
2175         enum event_type type;
2176         char *token;
2177
2178         memset(arg, 0, sizeof(*arg));
2179         arg->type = PRINT_FLAGS;
2180
2181         field = alloc_arg();
2182
2183         type = process_arg(event, field, &token);
2184
2185         /* Handle operations in the first argument */
2186         while (type == EVENT_OP)
2187                 type = process_op(event, field, &token);
2188
2189         if (test_type_token(type, token, EVENT_DELIM, ","))
2190                 goto out_free;
2191         free_token(token);
2192
2193         arg->flags.field = field;
2194
2195         type = read_token_item(&token);
2196         if (event_item_type(type)) {
2197                 arg->flags.delim = token;
2198                 type = read_token_item(&token);
2199         }
2200
2201         if (test_type_token(type, token, EVENT_DELIM, ","))
2202                 goto out_free;
2203
2204         type = process_fields(event, &arg->flags.flags, &token);
2205         if (test_type_token(type, token, EVENT_DELIM, ")"))
2206                 goto out_free;
2207
2208         free_token(token);
2209         type = read_token_item(tok);
2210         return type;
2211
2212  out_free:
2213         free_token(token);
2214         *tok = NULL;
2215         return EVENT_ERROR;
2216 }
2217
2218 static enum event_type
2219 process_symbols(struct event_format *event, struct print_arg *arg, char **tok)
2220 {
2221         struct print_arg *field;
2222         enum event_type type;
2223         char *token;
2224
2225         memset(arg, 0, sizeof(*arg));
2226         arg->type = PRINT_SYMBOL;
2227
2228         field = alloc_arg();
2229
2230         type = process_arg(event, field, &token);
2231         if (test_type_token(type, token, EVENT_DELIM, ","))
2232                 goto out_free;
2233
2234         arg->symbol.field = field;
2235
2236         type = process_fields(event, &arg->symbol.symbols, &token);
2237         if (test_type_token(type, token, EVENT_DELIM, ")"))
2238                 goto out_free;
2239
2240         free_token(token);
2241         type = read_token_item(tok);
2242         return type;
2243
2244  out_free:
2245         free_token(token);
2246         *tok = NULL;
2247         return EVENT_ERROR;
2248 }
2249
2250 static enum event_type
2251 process_dynamic_array(struct event_format *event, struct print_arg *arg, char **tok)
2252 {
2253         struct format_field *field;
2254         enum event_type type;
2255         char *token;
2256
2257         memset(arg, 0, sizeof(*arg));
2258         arg->type = PRINT_DYNAMIC_ARRAY;
2259
2260         /*
2261          * The item within the parenthesis is another field that holds
2262          * the index into where the array starts.
2263          */
2264         type = read_token(&token);
2265         *tok = token;
2266         if (type != EVENT_ITEM)
2267                 goto out_free;
2268
2269         /* Find the field */
2270
2271         field = pevent_find_field(event, token);
2272         if (!field)
2273                 goto out_free;
2274
2275         arg->dynarray.field = field;
2276         arg->dynarray.index = 0;
2277
2278         if (read_expected(EVENT_DELIM, ")") < 0)
2279                 goto out_free;
2280
2281         free_token(token);
2282         type = read_token_item(&token);
2283         *tok = token;
2284         if (type != EVENT_OP || strcmp(token, "[") != 0)
2285                 return type;
2286
2287         free_token(token);
2288         arg = alloc_arg();
2289         type = process_arg(event, arg, &token);
2290         if (type == EVENT_ERROR)
2291                 goto out_free;
2292
2293         if (!test_type_token(type, token, EVENT_OP, "]"))
2294                 goto out_free;
2295
2296         free_token(token);
2297         type = read_token_item(tok);
2298         return type;
2299
2300  out_free:
2301         free(arg);
2302         free_token(token);
2303         *tok = NULL;
2304         return EVENT_ERROR;
2305 }
2306
2307 static enum event_type
2308 process_paren(struct event_format *event, struct print_arg *arg, char **tok)
2309 {
2310         struct print_arg *item_arg;
2311         enum event_type type;
2312         char *token;
2313
2314         type = process_arg(event, arg, &token);
2315
2316         if (type == EVENT_ERROR)
2317                 goto out_free;
2318
2319         if (type == EVENT_OP)
2320                 type = process_op(event, arg, &token);
2321
2322         if (type == EVENT_ERROR)
2323                 goto out_free;
2324
2325         if (test_type_token(type, token, EVENT_DELIM, ")"))
2326                 goto out_free;
2327
2328         free_token(token);
2329         type = read_token_item(&token);
2330
2331         /*
2332          * If the next token is an item or another open paren, then
2333          * this was a typecast.
2334          */
2335         if (event_item_type(type) ||
2336             (type == EVENT_DELIM && strcmp(token, "(") == 0)) {
2337
2338                 /* make this a typecast and contine */
2339
2340                 /* prevous must be an atom */
2341                 if (arg->type != PRINT_ATOM)
2342                         die("previous needed to be PRINT_ATOM");
2343
2344                 item_arg = alloc_arg();
2345
2346                 arg->type = PRINT_TYPE;
2347                 arg->typecast.type = arg->atom.atom;
2348                 arg->typecast.item = item_arg;
2349                 type = process_arg_token(event, item_arg, &token, type);
2350
2351         }
2352
2353         *tok = token;
2354         return type;
2355
2356  out_free:
2357         free_token(token);
2358         *tok = NULL;
2359         return EVENT_ERROR;
2360 }
2361
2362
2363 static enum event_type
2364 process_str(struct event_format *event __unused, struct print_arg *arg, char **tok)
2365 {
2366         enum event_type type;
2367         char *token;
2368
2369         if (read_expect_type(EVENT_ITEM, &token) < 0)
2370                 goto out_free;
2371
2372         arg->type = PRINT_STRING;
2373         arg->string.string = token;
2374         arg->string.offset = -1;
2375
2376         if (read_expected(EVENT_DELIM, ")") < 0)
2377                 goto out_err;
2378
2379         type = read_token(&token);
2380         *tok = token;
2381
2382         return type;
2383
2384  out_free:
2385         free_token(token);
2386  out_err:
2387         *tok = NULL;
2388         return EVENT_ERROR;
2389 }
2390
2391 static struct pevent_function_handler *
2392 find_func_handler(struct pevent *pevent, char *func_name)
2393 {
2394         struct pevent_function_handler *func;
2395
2396         for (func = pevent->func_handlers; func; func = func->next) {
2397                 if (strcmp(func->name, func_name) == 0)
2398                         break;
2399         }
2400
2401         return func;
2402 }
2403
2404 static void remove_func_handler(struct pevent *pevent, char *func_name)
2405 {
2406         struct pevent_function_handler *func;
2407         struct pevent_function_handler **next;
2408
2409         next = &pevent->func_handlers;
2410         while ((func = *next)) {
2411                 if (strcmp(func->name, func_name) == 0) {
2412                         *next = func->next;
2413                         free_func_handle(func);
2414                         break;
2415                 }
2416                 next = &func->next;
2417         }
2418 }
2419
2420 static enum event_type
2421 process_func_handler(struct event_format *event, struct pevent_function_handler *func,
2422                      struct print_arg *arg, char **tok)
2423 {
2424         struct print_arg **next_arg;
2425         struct print_arg *farg;
2426         enum event_type type;
2427         char *token;
2428         char *test;
2429         int i;
2430
2431         arg->type = PRINT_FUNC;
2432         arg->func.func = func;
2433
2434         *tok = NULL;
2435
2436         next_arg = &(arg->func.args);
2437         for (i = 0; i < func->nr_args; i++) {
2438                 farg = alloc_arg();
2439                 type = process_arg(event, farg, &token);
2440                 if (i < (func->nr_args - 1))
2441                         test = ",";
2442                 else
2443                         test = ")";
2444
2445                 if (test_type_token(type, token, EVENT_DELIM, test)) {
2446                         free_arg(farg);
2447                         free_token(token);
2448                         return EVENT_ERROR;
2449                 }
2450
2451                 *next_arg = farg;
2452                 next_arg = &(farg->next);
2453                 free_token(token);
2454         }
2455
2456         type = read_token(&token);
2457         *tok = token;
2458
2459         return type;
2460 }
2461
2462 static enum event_type
2463 process_function(struct event_format *event, struct print_arg *arg,
2464                  char *token, char **tok)
2465 {
2466         struct pevent_function_handler *func;
2467
2468         if (strcmp(token, "__print_flags") == 0) {
2469                 free_token(token);
2470                 is_flag_field = 1;
2471                 return process_flags(event, arg, tok);
2472         }
2473         if (strcmp(token, "__print_symbolic") == 0) {
2474                 free_token(token);
2475                 is_symbolic_field = 1;
2476                 return process_symbols(event, arg, tok);
2477         }
2478         if (strcmp(token, "__get_str") == 0) {
2479                 free_token(token);
2480                 return process_str(event, arg, tok);
2481         }
2482         if (strcmp(token, "__get_dynamic_array") == 0) {
2483                 free_token(token);
2484                 return process_dynamic_array(event, arg, tok);
2485         }
2486
2487         func = find_func_handler(event->pevent, token);
2488         if (func) {
2489                 free_token(token);
2490                 return process_func_handler(event, func, arg, tok);
2491         }
2492
2493         do_warning("function %s not defined", token);
2494         free_token(token);
2495         return EVENT_ERROR;
2496 }
2497
2498 static enum event_type
2499 process_arg_token(struct event_format *event, struct print_arg *arg,
2500                   char **tok, enum event_type type)
2501 {
2502         char *token;
2503         char *atom;
2504
2505         token = *tok;
2506
2507         switch (type) {
2508         case EVENT_ITEM:
2509                 if (strcmp(token, "REC") == 0) {
2510                         free_token(token);
2511                         type = process_entry(event, arg, &token);
2512                         break;
2513                 }
2514                 atom = token;
2515                 /* test the next token */
2516                 type = read_token_item(&token);
2517
2518                 /*
2519                  * If the next token is a parenthesis, then this
2520                  * is a function.
2521                  */
2522                 if (type == EVENT_DELIM && strcmp(token, "(") == 0) {
2523                         free_token(token);
2524                         token = NULL;
2525                         /* this will free atom. */
2526                         type = process_function(event, arg, atom, &token);
2527                         break;
2528                 }
2529                 /* atoms can be more than one token long */
2530                 while (type == EVENT_ITEM) {
2531                         atom = realloc(atom, strlen(atom) + strlen(token) + 2);
2532                         strcat(atom, " ");
2533                         strcat(atom, token);
2534                         free_token(token);
2535                         type = read_token_item(&token);
2536                 }
2537
2538                 arg->type = PRINT_ATOM;
2539                 arg->atom.atom = atom;
2540                 break;
2541
2542         case EVENT_DQUOTE:
2543         case EVENT_SQUOTE:
2544                 arg->type = PRINT_ATOM;
2545                 arg->atom.atom = token;
2546                 type = read_token_item(&token);
2547                 break;
2548         case EVENT_DELIM:
2549                 if (strcmp(token, "(") == 0) {
2550                         free_token(token);
2551                         type = process_paren(event, arg, &token);
2552                         break;
2553                 }
2554         case EVENT_OP:
2555                 /* handle single ops */
2556                 arg->type = PRINT_OP;
2557                 arg->op.op = token;
2558                 arg->op.left = NULL;
2559                 type = process_op(event, arg, &token);
2560
2561                 /* On error, the op is freed */
2562                 if (type == EVENT_ERROR)
2563                         arg->op.op = NULL;
2564
2565                 /* return error type if errored */
2566                 break;
2567
2568         case EVENT_ERROR ... EVENT_NEWLINE:
2569         default:
2570                 die("unexpected type %d", type);
2571         }
2572         *tok = token;
2573
2574         return type;
2575 }
2576
2577 static int event_read_print_args(struct event_format *event, struct print_arg **list)
2578 {
2579         enum event_type type = EVENT_ERROR;
2580         struct print_arg *arg;
2581         char *token;
2582         int args = 0;
2583
2584         do {
2585                 if (type == EVENT_NEWLINE) {
2586                         type = read_token_item(&token);
2587                         continue;
2588                 }
2589
2590                 arg = alloc_arg();
2591
2592                 type = process_arg(event, arg, &token);
2593
2594                 if (type == EVENT_ERROR) {
2595                         free_token(token);
2596                         free_arg(arg);
2597                         return -1;
2598                 }
2599
2600                 *list = arg;
2601                 args++;
2602
2603                 if (type == EVENT_OP) {
2604                         type = process_op(event, arg, &token);
2605                         free_token(token);
2606                         if (type == EVENT_ERROR) {
2607                                 *list = NULL;
2608                                 free_arg(arg);
2609                                 return -1;
2610                         }
2611                         list = &arg->next;
2612                         continue;
2613                 }
2614
2615                 if (type == EVENT_DELIM && strcmp(token, ",") == 0) {
2616                         free_token(token);
2617                         *list = arg;
2618                         list = &arg->next;
2619                         continue;
2620                 }
2621                 break;
2622         } while (type != EVENT_NONE);
2623
2624         if (type != EVENT_NONE && type != EVENT_ERROR)
2625                 free_token(token);
2626
2627         return args;
2628 }
2629
2630 static int event_read_print(struct event_format *event)
2631 {
2632         enum event_type type;
2633         char *token;
2634         int ret;
2635
2636         if (read_expected_item(EVENT_ITEM, "print") < 0)
2637                 return -1;
2638
2639         if (read_expected(EVENT_ITEM, "fmt") < 0)
2640                 return -1;
2641
2642         if (read_expected(EVENT_OP, ":") < 0)
2643                 return -1;
2644
2645         if (read_expect_type(EVENT_DQUOTE, &token) < 0)
2646                 goto fail;
2647
2648  concat:
2649         event->print_fmt.format = token;
2650         event->print_fmt.args = NULL;
2651
2652         /* ok to have no arg */
2653         type = read_token_item(&token);
2654
2655         if (type == EVENT_NONE)
2656                 return 0;
2657
2658         /* Handle concatenation of print lines */
2659         if (type == EVENT_DQUOTE) {
2660                 char *cat;
2661
2662                 cat = malloc_or_die(strlen(event->print_fmt.format) +
2663                                     strlen(token) + 1);
2664                 strcpy(cat, event->print_fmt.format);
2665                 strcat(cat, token);
2666                 free_token(token);
2667                 free_token(event->print_fmt.format);
2668                 event->print_fmt.format = NULL;
2669                 token = cat;
2670                 goto concat;
2671         }
2672                              
2673         if (test_type_token(type, token, EVENT_DELIM, ","))
2674                 goto fail;
2675
2676         free_token(token);
2677
2678         ret = event_read_print_args(event, &event->print_fmt.args);
2679         if (ret < 0)
2680                 return -1;
2681
2682         return ret;
2683
2684  fail:
2685         free_token(token);
2686         return -1;
2687 }
2688
2689 /**
2690  * pevent_find_common_field - return a common field by event
2691  * @event: handle for the event
2692  * @name: the name of the common field to return
2693  *
2694  * Returns a common field from the event by the given @name.
2695  * This only searchs the common fields and not all field.
2696  */
2697 struct format_field *
2698 pevent_find_common_field(struct event_format *event, const char *name)
2699 {
2700         struct format_field *format;
2701
2702         for (format = event->format.common_fields;
2703              format; format = format->next) {
2704                 if (strcmp(format->name, name) == 0)
2705                         break;
2706         }
2707
2708         return format;
2709 }
2710
2711 /**
2712  * pevent_find_field - find a non-common field
2713  * @event: handle for the event
2714  * @name: the name of the non-common field
2715  *
2716  * Returns a non-common field by the given @name.
2717  * This does not search common fields.
2718  */
2719 struct format_field *
2720 pevent_find_field(struct event_format *event, const char *name)
2721 {
2722         struct format_field *format;
2723
2724         for (format = event->format.fields;
2725              format; format = format->next) {
2726                 if (strcmp(format->name, name) == 0)
2727                         break;
2728         }
2729
2730         return format;
2731 }
2732
2733 /**
2734  * pevent_find_any_field - find any field by name
2735  * @event: handle for the event
2736  * @name: the name of the field
2737  *
2738  * Returns a field by the given @name.
2739  * This searchs the common field names first, then
2740  * the non-common ones if a common one was not found.
2741  */
2742 struct format_field *
2743 pevent_find_any_field(struct event_format *event, const char *name)
2744 {
2745         struct format_field *format;
2746
2747         format = pevent_find_common_field(event, name);
2748         if (format)
2749                 return format;
2750         return pevent_find_field(event, name);
2751 }
2752
2753 /**
2754  * pevent_read_number - read a number from data
2755  * @pevent: handle for the pevent
2756  * @ptr: the raw data
2757  * @size: the size of the data that holds the number
2758  *
2759  * Returns the number (converted to host) from the
2760  * raw data.
2761  */
2762 unsigned long long pevent_read_number(struct pevent *pevent,
2763                                       const void *ptr, int size)
2764 {
2765         switch (size) {
2766         case 1:
2767                 return *(unsigned char *)ptr;
2768         case 2:
2769                 return data2host2(pevent, ptr);
2770         case 4:
2771                 return data2host4(pevent, ptr);
2772         case 8:
2773                 return data2host8(pevent, ptr);
2774         default:
2775                 /* BUG! */
2776                 return 0;
2777         }
2778 }
2779
2780 /**
2781  * pevent_read_number_field - read a number from data
2782  * @field: a handle to the field
2783  * @data: the raw data to read
2784  * @value: the value to place the number in
2785  *
2786  * Reads raw data according to a field offset and size,
2787  * and translates it into @value.
2788  *
2789  * Returns 0 on success, -1 otherwise.
2790  */
2791 int pevent_read_number_field(struct format_field *field, const void *data,
2792                              unsigned long long *value)
2793 {
2794         if (!field)
2795                 return -1;
2796         switch (field->size) {
2797         case 1:
2798         case 2:
2799         case 4:
2800         case 8:
2801                 *value = pevent_read_number(field->event->pevent,
2802                                             data + field->offset, field->size);
2803                 return 0;
2804         default:
2805                 return -1;
2806         }
2807 }
2808
2809 static int get_common_info(struct pevent *pevent,
2810                            const char *type, int *offset, int *size)
2811 {
2812         struct event_format *event;
2813         struct format_field *field;
2814
2815         /*
2816          * All events should have the same common elements.
2817          * Pick any event to find where the type is;
2818          */
2819         if (!pevent->events)
2820                 die("no event_list!");
2821
2822         event = pevent->events[0];
2823         field = pevent_find_common_field(event, type);
2824         if (!field)
2825                 die("field '%s' not found", type);
2826
2827         *offset = field->offset;
2828         *size = field->size;
2829
2830         return 0;
2831 }
2832
2833 static int __parse_common(struct pevent *pevent, void *data,
2834                           int *size, int *offset, const char *name)
2835 {
2836         int ret;
2837
2838         if (!*size) {
2839                 ret = get_common_info(pevent, name, offset, size);
2840                 if (ret < 0)
2841                         return ret;
2842         }
2843         return pevent_read_number(pevent, data + *offset, *size);
2844 }
2845
2846 static int trace_parse_common_type(struct pevent *pevent, void *data)
2847 {
2848         return __parse_common(pevent, data,
2849                               &pevent->type_size, &pevent->type_offset,
2850                               "common_type");
2851 }
2852
2853 static int parse_common_pid(struct pevent *pevent, void *data)
2854 {
2855         return __parse_common(pevent, data,
2856                               &pevent->pid_size, &pevent->pid_offset,
2857                               "common_pid");
2858 }
2859
2860 static int parse_common_pc(struct pevent *pevent, void *data)
2861 {
2862         return __parse_common(pevent, data,
2863                               &pevent->pc_size, &pevent->pc_offset,
2864                               "common_preempt_count");
2865 }
2866
2867 static int parse_common_flags(struct pevent *pevent, void *data)
2868 {
2869         return __parse_common(pevent, data,
2870                               &pevent->flags_size, &pevent->flags_offset,
2871                               "common_flags");
2872 }
2873
2874 static int parse_common_lock_depth(struct pevent *pevent, void *data)
2875 {
2876         int ret;
2877
2878         ret = __parse_common(pevent, data,
2879                              &pevent->ld_size, &pevent->ld_offset,
2880                              "common_lock_depth");
2881         if (ret < 0)
2882                 return -1;
2883
2884         return ret;
2885 }
2886
2887 static int events_id_cmp(const void *a, const void *b);
2888
2889 /**
2890  * pevent_find_event - find an event by given id
2891  * @pevent: a handle to the pevent
2892  * @id: the id of the event
2893  *
2894  * Returns an event that has a given @id.
2895  */
2896 struct event_format *pevent_find_event(struct pevent *pevent, int id)
2897 {
2898         struct event_format **eventptr;
2899         struct event_format key;
2900         struct event_format *pkey = &key;
2901
2902         /* Check cache first */
2903         if (pevent->last_event && pevent->last_event->id == id)
2904                 return pevent->last_event;
2905
2906         key.id = id;
2907
2908         eventptr = bsearch(&pkey, pevent->events, pevent->nr_events,
2909                            sizeof(*pevent->events), events_id_cmp);
2910
2911         if (eventptr) {
2912                 pevent->last_event = *eventptr;
2913                 return *eventptr;
2914         }
2915
2916         return NULL;
2917 }
2918
2919 /**
2920  * pevent_find_event_by_name - find an event by given name
2921  * @pevent: a handle to the pevent
2922  * @sys: the system name to search for
2923  * @name: the name of the event to search for
2924  *
2925  * This returns an event with a given @name and under the system
2926  * @sys. If @sys is NULL the first event with @name is returned.
2927  */
2928 struct event_format *
2929 pevent_find_event_by_name(struct pevent *pevent,
2930                           const char *sys, const char *name)
2931 {
2932         struct event_format *event;
2933         int i;
2934
2935         if (pevent->last_event &&
2936             strcmp(pevent->last_event->name, name) == 0 &&
2937             (!sys || strcmp(pevent->last_event->system, sys) == 0))
2938                 return pevent->last_event;
2939
2940         for (i = 0; i < pevent->nr_events; i++) {
2941                 event = pevent->events[i];
2942                 if (strcmp(event->name, name) == 0) {
2943                         if (!sys)
2944                                 break;
2945                         if (strcmp(event->system, sys) == 0)
2946                                 break;
2947                 }
2948         }
2949         if (i == pevent->nr_events)
2950                 event = NULL;
2951
2952         pevent->last_event = event;
2953         return event;
2954 }
2955
2956 static unsigned long long
2957 eval_num_arg(void *data, int size, struct event_format *event, struct print_arg *arg)
2958 {
2959         struct pevent *pevent = event->pevent;
2960         unsigned long long val = 0;
2961         unsigned long long left, right;
2962         struct print_arg *typearg = NULL;
2963         struct print_arg *larg;
2964         unsigned long offset;
2965         unsigned int field_size;
2966
2967         switch (arg->type) {
2968         case PRINT_NULL:
2969                 /* ?? */
2970                 return 0;
2971         case PRINT_ATOM:
2972                 return strtoull(arg->atom.atom, NULL, 0);
2973         case PRINT_FIELD:
2974                 if (!arg->field.field) {
2975                         arg->field.field = pevent_find_any_field(event, arg->field.name);
2976                         if (!arg->field.field)
2977                                 die("field %s not found", arg->field.name);
2978                 }
2979                 /* must be a number */
2980                 val = pevent_read_number(pevent, data + arg->field.field->offset,
2981                                 arg->field.field->size);
2982                 break;
2983         case PRINT_FLAGS:
2984         case PRINT_SYMBOL:
2985                 break;
2986         case PRINT_TYPE:
2987                 val = eval_num_arg(data, size, event, arg->typecast.item);
2988                 return eval_type(val, arg, 0);
2989         case PRINT_STRING:
2990         case PRINT_BSTRING:
2991                 return 0;
2992         case PRINT_FUNC: {
2993                 struct trace_seq s;
2994                 trace_seq_init(&s);
2995                 val = process_defined_func(&s, data, size, event, arg);
2996                 trace_seq_destroy(&s);
2997                 return val;
2998         }
2999         case PRINT_OP:
3000                 if (strcmp(arg->op.op, "[") == 0) {
3001                         /*
3002                          * Arrays are special, since we don't want
3003                          * to read the arg as is.
3004                          */
3005                         right = eval_num_arg(data, size, event, arg->op.right);
3006
3007                         /* handle typecasts */
3008                         larg = arg->op.left;
3009                         while (larg->type == PRINT_TYPE) {
3010                                 if (!typearg)
3011                                         typearg = larg;
3012                                 larg = larg->typecast.item;
3013                         }
3014
3015                         /* Default to long size */
3016                         field_size = pevent->long_size;
3017
3018                         switch (larg->type) {
3019                         case PRINT_DYNAMIC_ARRAY:
3020                                 offset = pevent_read_number(pevent,
3021                                                    data + larg->dynarray.field->offset,
3022                                                    larg->dynarray.field->size);
3023                                 if (larg->dynarray.field->elementsize)
3024                                         field_size = larg->dynarray.field->elementsize;
3025                                 /*
3026                                  * The actual length of the dynamic array is stored
3027                                  * in the top half of the field, and the offset
3028                                  * is in the bottom half of the 32 bit field.
3029                                  */
3030                                 offset &= 0xffff;
3031                                 offset += right;
3032                                 break;
3033                         case PRINT_FIELD:
3034                                 if (!larg->field.field) {
3035                                         larg->field.field =
3036                                                 pevent_find_any_field(event, larg->field.name);
3037                                         if (!larg->field.field)
3038                                                 die("field %s not found", larg->field.name);
3039                                 }
3040                                 field_size = larg->field.field->elementsize;
3041                                 offset = larg->field.field->offset +
3042                                         right * larg->field.field->elementsize;
3043                                 break;
3044                         default:
3045                                 goto default_op; /* oops, all bets off */
3046                         }
3047                         val = pevent_read_number(pevent,
3048                                                  data + offset, field_size);
3049                         if (typearg)
3050                                 val = eval_type(val, typearg, 1);
3051                         break;
3052                 } else if (strcmp(arg->op.op, "?") == 0) {
3053                         left = eval_num_arg(data, size, event, arg->op.left);
3054                         arg = arg->op.right;
3055                         if (left)
3056                                 val = eval_num_arg(data, size, event, arg->op.left);
3057                         else
3058                                 val = eval_num_arg(data, size, event, arg->op.right);
3059                         break;
3060                 }
3061  default_op:
3062                 left = eval_num_arg(data, size, event, arg->op.left);
3063                 right = eval_num_arg(data, size, event, arg->op.right);
3064                 switch (arg->op.op[0]) {
3065                 case '!':
3066                         switch (arg->op.op[1]) {
3067                         case 0:
3068                                 val = !right;
3069                                 break;
3070                         case '=':
3071                                 val = left != right;
3072                                 break;
3073                         default:
3074                                 die("unknown op '%s'", arg->op.op);
3075                         }
3076                         break;
3077                 case '~':
3078                         val = ~right;
3079                         break;
3080                 case '|':
3081                         if (arg->op.op[1])
3082                                 val = left || right;
3083                         else
3084                                 val = left | right;
3085                         break;
3086                 case '&':
3087                         if (arg->op.op[1])
3088                                 val = left && right;
3089                         else
3090                                 val = left & right;
3091                         break;
3092                 case '<':
3093                         switch (arg->op.op[1]) {
3094                         case 0:
3095                                 val = left < right;
3096                                 break;
3097                         case '<':
3098                                 val = left << right;
3099                                 break;
3100                         case '=':
3101                                 val = left <= right;
3102                                 break;
3103                         default:
3104                                 die("unknown op '%s'", arg->op.op);
3105                         }
3106                         break;
3107                 case '>':
3108                         switch (arg->op.op[1]) {
3109                         case 0:
3110                                 val = left > right;
3111                                 break;
3112                         case '>':
3113                                 val = left >> right;
3114                                 break;
3115                         case '=':
3116                                 val = left >= right;
3117                                 break;
3118                         default:
3119                                 die("unknown op '%s'", arg->op.op);
3120                         }
3121                         break;
3122                 case '=':
3123                         if (arg->op.op[1] != '=')
3124                                 die("unknown op '%s'", arg->op.op);
3125                         val = left == right;
3126                         break;
3127                 case '-':
3128                         val = left - right;
3129                         break;
3130                 case '+':
3131                         val = left + right;
3132                         break;
3133                 case '/':
3134                         val = left / right;
3135                         break;
3136                 case '*':
3137                         val = left * right;
3138                         break;
3139                 default:
3140                         die("unknown op '%s'", arg->op.op);
3141                 }
3142                 break;
3143         default: /* not sure what to do there */
3144                 return 0;
3145         }
3146         return val;
3147 }
3148
3149 struct flag {
3150         const char *name;
3151         unsigned long long value;
3152 };
3153
3154 static const struct flag flags[] = {
3155         { "HI_SOFTIRQ", 0 },
3156         { "TIMER_SOFTIRQ", 1 },
3157         { "NET_TX_SOFTIRQ", 2 },
3158         { "NET_RX_SOFTIRQ", 3 },
3159         { "BLOCK_SOFTIRQ", 4 },
3160         { "BLOCK_IOPOLL_SOFTIRQ", 5 },
3161         { "TASKLET_SOFTIRQ", 6 },
3162         { "SCHED_SOFTIRQ", 7 },
3163         { "HRTIMER_SOFTIRQ", 8 },
3164         { "RCU_SOFTIRQ", 9 },
3165
3166         { "HRTIMER_NORESTART", 0 },
3167         { "HRTIMER_RESTART", 1 },
3168 };
3169
3170 static unsigned long long eval_flag(const char *flag)
3171 {
3172         int i;
3173
3174         /*
3175          * Some flags in the format files do not get converted.
3176          * If the flag is not numeric, see if it is something that
3177          * we already know about.
3178          */
3179         if (isdigit(flag[0]))
3180                 return strtoull(flag, NULL, 0);
3181
3182         for (i = 0; i < (int)(sizeof(flags)/sizeof(flags[0])); i++)
3183                 if (strcmp(flags[i].name, flag) == 0)
3184                         return flags[i].value;
3185
3186         return 0;
3187 }
3188
3189 static void print_str_to_seq(struct trace_seq *s, const char *format,
3190                              int len_arg, const char *str)
3191 {
3192         if (len_arg >= 0)
3193                 trace_seq_printf(s, format, len_arg, str);
3194         else
3195                 trace_seq_printf(s, format, str);
3196 }
3197
3198 static void print_str_arg(struct trace_seq *s, void *data, int size,
3199                           struct event_format *event, const char *format,
3200                           int len_arg, struct print_arg *arg)
3201 {
3202         struct pevent *pevent = event->pevent;
3203         struct print_flag_sym *flag;
3204         unsigned long long val, fval;
3205         unsigned long addr;
3206         char *str;
3207         int print;
3208         int len;
3209
3210         switch (arg->type) {
3211         case PRINT_NULL:
3212                 /* ?? */
3213                 return;
3214         case PRINT_ATOM:
3215                 print_str_to_seq(s, format, len_arg, arg->atom.atom);
3216                 return;
3217         case PRINT_FIELD:
3218                 if (!arg->field.field) {
3219                         arg->field.field = pevent_find_any_field(event, arg->field.name);
3220                         if (!arg->field.field)
3221                                 die("field %s not found", arg->field.name);
3222                 }
3223                 /* Zero sized fields, mean the rest of the data */
3224                 len = arg->field.field->size ? : size - arg->field.field->offset;
3225
3226                 /*
3227                  * Some events pass in pointers. If this is not an array
3228                  * and the size is the same as long_size, assume that it
3229                  * is a pointer.
3230                  */
3231                 if (!(arg->field.field->flags & FIELD_IS_ARRAY) &&
3232                     arg->field.field->size == pevent->long_size) {
3233                         addr = *(unsigned long *)(data + arg->field.field->offset);
3234                         trace_seq_printf(s, "%lx", addr);
3235                         break;
3236                 }
3237                 str = malloc_or_die(len + 1);
3238                 memcpy(str, data + arg->field.field->offset, len);
3239                 str[len] = 0;
3240                 print_str_to_seq(s, format, len_arg, str);
3241                 free(str);
3242                 break;
3243         case PRINT_FLAGS:
3244                 val = eval_num_arg(data, size, event, arg->flags.field);
3245                 print = 0;
3246                 for (flag = arg->flags.flags; flag; flag = flag->next) {
3247                         fval = eval_flag(flag->value);
3248                         if (!val && !fval) {
3249                                 print_str_to_seq(s, format, len_arg, flag->str);
3250                                 break;
3251                         }
3252                         if (fval && (val & fval) == fval) {
3253                                 if (print && arg->flags.delim)
3254                                         trace_seq_puts(s, arg->flags.delim);
3255                                 print_str_to_seq(s, format, len_arg, flag->str);
3256                                 print = 1;
3257                                 val &= ~fval;
3258                         }
3259                 }
3260                 break;
3261         case PRINT_SYMBOL:
3262                 val = eval_num_arg(data, size, event, arg->symbol.field);
3263                 for (flag = arg->symbol.symbols; flag; flag = flag->next) {
3264                         fval = eval_flag(flag->value);
3265                         if (val == fval) {
3266                                 print_str_to_seq(s, format, len_arg, flag->str);
3267                                 break;
3268                         }
3269                 }
3270                 break;
3271
3272         case PRINT_TYPE:
3273                 break;
3274         case PRINT_STRING: {
3275                 int str_offset;
3276
3277                 if (arg->string.offset == -1) {
3278                         struct format_field *f;
3279
3280                         f = pevent_find_any_field(event, arg->string.string);
3281                         arg->string.offset = f->offset;
3282                 }
3283                 str_offset = data2host4(pevent, data + arg->string.offset);
3284                 str_offset &= 0xffff;
3285                 print_str_to_seq(s, format, len_arg, ((char *)data) + str_offset);
3286                 break;
3287         }
3288         case PRINT_BSTRING:
3289                 trace_seq_printf(s, format, arg->string.string);
3290                 break;
3291         case PRINT_OP:
3292                 /*
3293                  * The only op for string should be ? :
3294                  */
3295                 if (arg->op.op[0] != '?')
3296                         return;
3297                 val = eval_num_arg(data, size, event, arg->op.left);
3298                 if (val)
3299                         print_str_arg(s, data, size, event,
3300                                       format, len_arg, arg->op.right->op.left);
3301                 else
3302                         print_str_arg(s, data, size, event,
3303                                       format, len_arg, arg->op.right->op.right);
3304                 break;
3305         case PRINT_FUNC:
3306                 process_defined_func(s, data, size, event, arg);
3307                 break;
3308         default:
3309                 /* well... */
3310                 break;
3311         }
3312 }
3313
3314 static unsigned long long
3315 process_defined_func(struct trace_seq *s, void *data, int size,
3316                      struct event_format *event, struct print_arg *arg)
3317 {
3318         struct pevent_function_handler *func_handle = arg->func.func;
3319         struct pevent_func_params *param;
3320         unsigned long long *args;
3321         unsigned long long ret;
3322         struct print_arg *farg;
3323         struct trace_seq str;
3324         struct save_str {
3325                 struct save_str *next;
3326                 char *str;
3327         } *strings = NULL, *string;
3328         int i;
3329
3330         if (!func_handle->nr_args) {
3331                 ret = (*func_handle->func)(s, NULL);
3332                 goto out;
3333         }
3334
3335         farg = arg->func.args;
3336         param = func_handle->params;
3337
3338         args = malloc_or_die(sizeof(*args) * func_handle->nr_args);
3339         for (i = 0; i < func_handle->nr_args; i++) {
3340                 switch (param->type) {
3341                 case PEVENT_FUNC_ARG_INT:
3342                 case PEVENT_FUNC_ARG_LONG:
3343                 case PEVENT_FUNC_ARG_PTR:
3344                         args[i] = eval_num_arg(data, size, event, farg);
3345                         break;
3346                 case PEVENT_FUNC_ARG_STRING:
3347                         trace_seq_init(&str);
3348                         print_str_arg(&str, data, size, event, "%s", -1, farg);
3349                         trace_seq_terminate(&str);
3350                         string = malloc_or_die(sizeof(*string));
3351                         string->next = strings;
3352                         string->str = strdup(str.buffer);
3353                         strings = string;
3354                         trace_seq_destroy(&str);
3355                         break;
3356                 default:
3357                         /*
3358                          * Something went totally wrong, this is not
3359                          * an input error, something in this code broke.
3360                          */
3361                         die("Unexpected end of arguments\n");
3362                         break;
3363                 }
3364                 farg = farg->next;
3365         }
3366
3367         ret = (*func_handle->func)(s, args);
3368         free(args);
3369         while (strings) {
3370                 string = strings;
3371                 strings = string->next;
3372                 free(string->str);
3373                 free(string);
3374         }
3375
3376  out:
3377         /* TBD : handle return type here */
3378         return ret;
3379 }
3380
3381 static struct print_arg *make_bprint_args(char *fmt, void *data, int size, struct event_format *event)
3382 {
3383         struct pevent *pevent = event->pevent;
3384         struct format_field *field, *ip_field;
3385         struct print_arg *args, *arg, **next;
3386         unsigned long long ip, val;
3387         char *ptr;
3388         void *bptr;
3389
3390         field = pevent->bprint_buf_field;
3391         ip_field = pevent->bprint_ip_field;
3392
3393         if (!field) {
3394                 field = pevent_find_field(event, "buf");
3395                 if (!field)
3396                         die("can't find buffer field for binary printk");
3397                 ip_field = pevent_find_field(event, "ip");
3398                 if (!ip_field)
3399                         die("can't find ip field for binary printk");
3400                 pevent->bprint_buf_field = field;
3401                 pevent->bprint_ip_field = ip_field;
3402         }
3403
3404         ip = pevent_read_number(pevent, data + ip_field->offset, ip_field->size);
3405
3406         /*
3407          * The first arg is the IP pointer.
3408          */
3409         args = alloc_arg();
3410         arg = args;
3411         arg->next = NULL;
3412         next = &arg->next;
3413
3414         arg->type = PRINT_ATOM;
3415         arg->atom.atom = malloc_or_die(32);
3416         sprintf(arg->atom.atom, "%lld", ip);
3417
3418         /* skip the first "%pf : " */
3419         for (ptr = fmt + 6, bptr = data + field->offset;
3420              bptr < data + size && *ptr; ptr++) {
3421                 int ls = 0;
3422
3423                 if (*ptr == '%') {
3424  process_again:
3425                         ptr++;
3426                         switch (*ptr) {
3427                         case '%':
3428                                 break;
3429                         case 'l':
3430                                 ls++;
3431                                 goto process_again;
3432                         case 'L':
3433                                 ls = 2;
3434                                 goto process_again;
3435                         case '0' ... '9':
3436                                 goto process_again;
3437                         case 'p':
3438                                 ls = 1;
3439                                 /* fall through */
3440                         case 'd':
3441                         case 'u':
3442                         case 'x':
3443                         case 'i':
3444                                 /* the pointers are always 4 bytes aligned */
3445                                 bptr = (void *)(((unsigned long)bptr + 3) &
3446                                                 ~3);
3447                                 switch (ls) {
3448                                 case 0:
3449                                         ls = 4;
3450                                         break;
3451                                 case 1:
3452                                         ls = pevent->long_size;
3453                                         break;
3454                                 case 2:
3455                                         ls = 8;
3456                                 default:
3457                                         break;
3458                                 }
3459                                 val = pevent_read_number(pevent, bptr, ls);
3460                                 bptr += ls;
3461                                 arg = alloc_arg();
3462                                 arg->next = NULL;
3463                                 arg->type = PRINT_ATOM;
3464                                 arg->atom.atom = malloc_or_die(32);
3465                                 sprintf(arg->atom.atom, "%lld", val);
3466                                 *next = arg;
3467                                 next = &arg->next;
3468                                 break;
3469                         case 's':
3470                                 arg = alloc_arg();
3471                                 arg->next = NULL;
3472                                 arg->type = PRINT_BSTRING;
3473                                 arg->string.string = strdup(bptr);
3474                                 bptr += strlen(bptr) + 1;
3475                                 *next = arg;
3476                                 next = &arg->next;
3477                         default:
3478                                 break;
3479                         }
3480                 }
3481         }
3482
3483         return args;
3484 }
3485
3486 static void free_args(struct print_arg *args)
3487 {
3488         struct print_arg *next;
3489
3490         while (args) {
3491                 next = args->next;
3492
3493                 free_arg(args);
3494                 args = next;
3495         }
3496 }
3497
3498 static char *
3499 get_bprint_format(void *data, int size __unused, struct event_format *event)
3500 {
3501         struct pevent *pevent = event->pevent;
3502         unsigned long long addr;
3503         struct format_field *field;
3504         struct printk_map *printk;
3505         char *format;
3506         char *p;
3507
3508         field = pevent->bprint_fmt_field;
3509
3510         if (!field) {
3511                 field = pevent_find_field(event, "fmt");
3512                 if (!field)
3513                         die("can't find format field for binary printk");
3514                 pevent->bprint_fmt_field = field;
3515         }
3516
3517         addr = pevent_read_number(pevent, data + field->offset, field->size);
3518
3519         printk = find_printk(pevent, addr);
3520         if (!printk) {
3521                 format = malloc_or_die(45);
3522                 sprintf(format, "%%pf : (NO FORMAT FOUND at %llx)\n",
3523                         addr);
3524                 return format;
3525         }
3526
3527         p = printk->printk;
3528         /* Remove any quotes. */
3529         if (*p == '"')
3530                 p++;
3531         format = malloc_or_die(strlen(p) + 10);
3532         sprintf(format, "%s : %s", "%pf", p);
3533         /* remove ending quotes and new line since we will add one too */
3534         p = format + strlen(format) - 1;
3535         if (*p == '"')
3536                 *p = 0;
3537
3538         p -= 2;
3539         if (strcmp(p, "\\n") == 0)
3540                 *p = 0;
3541
3542         return format;
3543 }
3544
3545 static void print_mac_arg(struct trace_seq *s, int mac, void *data, int size,
3546                           struct event_format *event, struct print_arg *arg)
3547 {
3548         unsigned char *buf;
3549         char *fmt = "%.2x:%.2x:%.2x:%.2x:%.2x:%.2x";
3550
3551         if (arg->type == PRINT_FUNC) {
3552                 process_defined_func(s, data, size, event, arg);
3553                 return;
3554         }
3555
3556         if (arg->type != PRINT_FIELD) {
3557                 trace_seq_printf(s, "ARG TYPE NOT FIELD BUT %d",
3558                                  arg->type);
3559                 return;
3560         }
3561
3562         if (mac == 'm')
3563                 fmt = "%.2x%.2x%.2x%.2x%.2x%.2x";
3564         if (!arg->field.field) {
3565                 arg->field.field =
3566                         pevent_find_any_field(event, arg->field.name);
3567                 if (!arg->field.field)
3568                         die("field %s not found", arg->field.name);
3569         }
3570         if (arg->field.field->size != 6) {
3571                 trace_seq_printf(s, "INVALIDMAC");
3572                 return;
3573         }
3574         buf = data + arg->field.field->offset;
3575         trace_seq_printf(s, fmt, buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]);
3576 }
3577
3578 static void print_event_fields(struct trace_seq *s, void *data, int size,
3579                                struct event_format *event)
3580 {
3581         struct format_field *field;
3582         unsigned long long val;
3583         unsigned int offset, len, i;
3584
3585         field = event->format.fields;
3586         while (field) {
3587                 trace_seq_printf(s, " %s=", field->name);
3588                 if (field->flags & FIELD_IS_ARRAY) {
3589                         offset = field->offset;
3590                         len = field->size;
3591                         if (field->flags & FIELD_IS_DYNAMIC) {
3592                                 val = pevent_read_number(event->pevent, data + offset, len);
3593                                 offset = val;
3594                                 len = offset >> 16;
3595                                 offset &= 0xffff;
3596                         }
3597                         if (field->flags & FIELD_IS_STRING) {
3598                                 trace_seq_printf(s, "%s", (char *)data + offset);
3599                         } else {
3600                                 trace_seq_puts(s, "ARRAY[");
3601                                 for (i = 0; i < len; i++) {
3602                                         if (i)
3603                                                 trace_seq_puts(s, ", ");
3604                                         trace_seq_printf(s, "%02x",
3605                                                          *((unsigned char *)data + offset + i));
3606                                 }
3607                                 trace_seq_putc(s, ']');
3608                         }
3609                 } else {
3610                         val = pevent_read_number(event->pevent, data + field->offset,
3611                                                  field->size);
3612                         if (field->flags & FIELD_IS_POINTER) {
3613                                 trace_seq_printf(s, "0x%llx", val);
3614                         } else if (field->flags & FIELD_IS_SIGNED) {
3615                                 switch (field->size) {
3616                                 case 4:
3617                                         /*
3618                                          * If field is long then print it in hex.
3619                                          * A long usually stores pointers.
3620                                          */
3621                                         if (field->flags & FIELD_IS_LONG)
3622                                                 trace_seq_printf(s, "0x%x", (int)val);
3623                                         else
3624                                                 trace_seq_printf(s, "%d", (int)val);
3625                                         break;
3626                                 case 2:
3627                                         trace_seq_printf(s, "%2d", (short)val);
3628                                         break;
3629                                 case 1:
3630                                         trace_seq_printf(s, "%1d", (char)val);
3631                                         break;
3632                                 default:
3633                                         trace_seq_printf(s, "%lld", val);
3634                                 }
3635                         } else {
3636                                 if (field->flags & FIELD_IS_LONG)
3637                                         trace_seq_printf(s, "0x%llx", val);
3638                                 else
3639                                         trace_seq_printf(s, "%llu", val);
3640                         }
3641                 }
3642                 field = field->next;
3643         }
3644 }
3645
3646 static void pretty_print(struct trace_seq *s, void *data, int size, struct event_format *event)
3647 {
3648         struct pevent *pevent = event->pevent;
3649         struct print_fmt *print_fmt = &event->print_fmt;
3650         struct print_arg *arg = print_fmt->args;
3651         struct print_arg *args = NULL;
3652         const char *ptr = print_fmt->format;
3653         unsigned long long val;
3654         struct func_map *func;
3655         const char *saveptr;
3656         char *bprint_fmt = NULL;
3657         char format[32];
3658         int show_func;
3659         int len_as_arg;
3660         int len_arg;
3661         int len;
3662         int ls;
3663
3664         if (event->flags & EVENT_FL_FAILED) {
3665                 trace_seq_printf(s, "[FAILED TO PARSE]");
3666                 print_event_fields(s, data, size, event);
3667                 return;
3668         }
3669
3670         if (event->flags & EVENT_FL_ISBPRINT) {
3671                 bprint_fmt = get_bprint_format(data, size, event);
3672                 args = make_bprint_args(bprint_fmt, data, size, event);
3673                 arg = args;
3674                 ptr = bprint_fmt;
3675         }
3676
3677         for (; *ptr; ptr++) {
3678                 ls = 0;
3679                 if (*ptr == '\\') {
3680                         ptr++;
3681                         switch (*ptr) {
3682                         case 'n':
3683                                 trace_seq_putc(s, '\n');
3684                                 break;
3685                         case 't':
3686                                 trace_seq_putc(s, '\t');
3687                                 break;
3688                         case 'r':
3689                                 trace_seq_putc(s, '\r');
3690                                 break;
3691                         case '\\':
3692                                 trace_seq_putc(s, '\\');
3693                                 break;
3694                         default:
3695                                 trace_seq_putc(s, *ptr);
3696                                 break;
3697                         }
3698
3699                 } else if (*ptr == '%') {
3700                         saveptr = ptr;
3701                         show_func = 0;
3702                         len_as_arg = 0;
3703  cont_process:
3704                         ptr++;
3705                         switch (*ptr) {
3706                         case '%':
3707                                 trace_seq_putc(s, '%');
3708                                 break;
3709                         case '#':
3710                                 /* FIXME: need to handle properly */
3711                                 goto cont_process;
3712                         case 'h':
3713                                 ls--;
3714                                 goto cont_process;
3715                         case 'l':
3716                                 ls++;
3717                                 goto cont_process;
3718                         case 'L':
3719                                 ls = 2;
3720                                 goto cont_process;
3721                         case '*':
3722                                 /* The argument is the length. */
3723                                 if (!arg)
3724                                         die("no argument match");
3725                                 len_arg = eval_num_arg(data, size, event, arg);
3726                                 len_as_arg = 1;
3727                                 arg = arg->next;
3728                                 goto cont_process;
3729                         case '.':
3730                         case 'z':
3731                         case 'Z':
3732                         case '0' ... '9':
3733                                 goto cont_process;
3734                         case 'p':
3735                                 if (pevent->long_size == 4)
3736                                         ls = 1;
3737                                 else
3738                                         ls = 2;
3739
3740                                 if (*(ptr+1) == 'F' ||
3741                                     *(ptr+1) == 'f') {
3742                                         ptr++;
3743                                         show_func = *ptr;
3744                                 } else if (*(ptr+1) == 'M' || *(ptr+1) == 'm') {
3745                                         print_mac_arg(s, *(ptr+1), data, size, event, arg);
3746                                         ptr++;
3747                                         break;
3748                                 }
3749
3750                                 /* fall through */
3751                         case 'd':
3752                         case 'i':
3753                         case 'x':
3754                         case 'X':
3755                         case 'u':
3756                                 if (!arg)
3757                                         die("no argument match");
3758
3759                                 len = ((unsigned long)ptr + 1) -
3760                                         (unsigned long)saveptr;
3761
3762                                 /* should never happen */
3763                                 if (len > 31)
3764                                         die("bad format!");
3765
3766                                 memcpy(format, saveptr, len);
3767                                 format[len] = 0;
3768
3769                                 val = eval_num_arg(data, size, event, arg);
3770                                 arg = arg->next;
3771
3772                                 if (show_func) {
3773                                         func = find_func(pevent, val);
3774                                         if (func) {
3775                                                 trace_seq_puts(s, func->func);
3776                                                 if (show_func == 'F')
3777                                                         trace_seq_printf(s,
3778                                                                "+0x%llx",
3779                                                                val - func->addr);
3780                                                 break;
3781                                         }
3782                                 }
3783                                 if (pevent->long_size == 8 && ls) {
3784                                         char *p;
3785
3786                                         ls = 2;
3787                                         /* make %l into %ll */
3788                                         p = strchr(format, 'l');
3789                                         if (p)
3790                                                 memmove(p, p+1, strlen(p)+1);
3791                                         else if (strcmp(format, "%p") == 0)
3792                                                 strcpy(format, "0x%llx");
3793                                 }
3794                                 switch (ls) {
3795                                 case -2:
3796                                         if (len_as_arg)
3797                                                 trace_seq_printf(s, format, len_arg, (char)val);
3798                                         else
3799                                                 trace_seq_printf(s, format, (char)val);
3800                                         break;
3801                                 case -1:
3802                                         if (len_as_arg)
3803                                                 trace_seq_printf(s, format, len_arg, (short)val);
3804                                         else
3805                                                 trace_seq_printf(s, format, (short)val);
3806                                         break;
3807                                 case 0:
3808                                         if (len_as_arg)
3809                                                 trace_seq_printf(s, format, len_arg, (int)val);
3810                                         else
3811                                                 trace_seq_printf(s, format, (int)val);
3812                                         break;
3813                                 case 1:
3814                                         if (len_as_arg)
3815                                                 trace_seq_printf(s, format, len_arg, (long)val);
3816                                         else
3817                                                 trace_seq_printf(s, format, (long)val);
3818                                         break;
3819                                 case 2:
3820                                         if (len_as_arg)
3821                                                 trace_seq_printf(s, format, len_arg,
3822                                                                  (long long)val);
3823                                         else
3824                                                 trace_seq_printf(s, format, (long long)val);
3825                                         break;
3826                                 default:
3827                                         die("bad count (%d)", ls);
3828                                 }
3829                                 break;
3830                         case 's':
3831                                 if (!arg)
3832                                         die("no matching argument");
3833
3834                                 len = ((unsigned long)ptr + 1) -
3835                                         (unsigned long)saveptr;
3836
3837                                 /* should never happen */
3838                                 if (len > 31)
3839                                         die("bad format!");
3840
3841                                 memcpy(format, saveptr, len);
3842                                 format[len] = 0;
3843                                 if (!len_as_arg)
3844                                         len_arg = -1;
3845                                 print_str_arg(s, data, size, event,
3846                                               format, len_arg, arg);
3847                                 arg = arg->next;
3848                                 break;
3849                         default:
3850                                 trace_seq_printf(s, ">%c<", *ptr);
3851
3852                         }
3853                 } else
3854                         trace_seq_putc(s, *ptr);
3855         }
3856
3857         if (args) {
3858                 free_args(args);
3859                 free(bprint_fmt);
3860         }
3861 }
3862
3863 /**
3864  * pevent_data_lat_fmt - parse the data for the latency format
3865  * @pevent: a handle to the pevent
3866  * @s: the trace_seq to write to
3867  * @data: the raw data to read from
3868  * @size: currently unused.
3869  *
3870  * This parses out the Latency format (interrupts disabled,
3871  * need rescheduling, in hard/soft interrupt, preempt count
3872  * and lock depth) and places it into the trace_seq.
3873  */
3874 void pevent_data_lat_fmt(struct pevent *pevent,
3875                          struct trace_seq *s, struct record *record)
3876 {
3877         static int check_lock_depth = 1;
3878         static int lock_depth_exists;
3879         unsigned int lat_flags;
3880         unsigned int pc;
3881         int lock_depth;
3882         int hardirq;
3883         int softirq;
3884         void *data = record->data;
3885
3886         lat_flags = parse_common_flags(pevent, data);
3887         pc = parse_common_pc(pevent, data);
3888         /* lock_depth may not always exist */
3889         if (check_lock_depth) {
3890                 struct format_field *field;
3891                 struct event_format *event;
3892
3893                 check_lock_depth = 0;
3894                 event = pevent->events[0];
3895                 field = pevent_find_common_field(event, "common_lock_depth");
3896                 if (field)
3897                         lock_depth_exists = 1;
3898         }
3899         if (lock_depth_exists)
3900                 lock_depth = parse_common_lock_depth(pevent, data);
3901
3902         hardirq = lat_flags & TRACE_FLAG_HARDIRQ;
3903         softirq = lat_flags & TRACE_FLAG_SOFTIRQ;
3904
3905         trace_seq_printf(s, "%c%c%c",
3906                (lat_flags & TRACE_FLAG_IRQS_OFF) ? 'd' :
3907                (lat_flags & TRACE_FLAG_IRQS_NOSUPPORT) ?
3908                'X' : '.',
3909                (lat_flags & TRACE_FLAG_NEED_RESCHED) ?
3910                'N' : '.',
3911                (hardirq && softirq) ? 'H' :
3912                hardirq ? 'h' : softirq ? 's' : '.');
3913
3914         if (pc)
3915                 trace_seq_printf(s, "%x", pc);
3916         else
3917                 trace_seq_putc(s, '.');
3918
3919         if (lock_depth_exists) {
3920                 if (lock_depth < 0)
3921                         trace_seq_putc(s, '.');
3922                 else
3923                         trace_seq_printf(s, "%d", lock_depth);
3924         }
3925
3926         trace_seq_terminate(s);
3927 }
3928
3929 /**
3930  * pevent_data_type - parse out the given event type
3931  * @pevent: a handle to the pevent
3932  * @rec: the record to read from
3933  *
3934  * This returns the event id from the @rec.
3935  */
3936 int pevent_data_type(struct pevent *pevent, struct record *rec)
3937 {
3938         return trace_parse_common_type(pevent, rec->data);
3939 }
3940
3941 /**
3942  * pevent_data_event_from_type - find the event by a given type
3943  * @pevent: a handle to the pevent
3944  * @type: the type of the event.
3945  *
3946  * This returns the event form a given @type;
3947  */
3948 struct event_format *pevent_data_event_from_type(struct pevent *pevent, int type)
3949 {
3950         return pevent_find_event(pevent, type);
3951 }
3952
3953 /**
3954  * pevent_data_pid - parse the PID from raw data
3955  * @pevent: a handle to the pevent
3956  * @rec: the record to parse
3957  *
3958  * This returns the PID from a raw data.
3959  */
3960 int pevent_data_pid(struct pevent *pevent, struct record *rec)
3961 {
3962         return parse_common_pid(pevent, rec->data);
3963 }
3964
3965 /**
3966  * pevent_data_comm_from_pid - return the command line from PID
3967  * @pevent: a handle to the pevent
3968  * @pid: the PID of the task to search for
3969  *
3970  * This returns a pointer to the command line that has the given
3971  * @pid.
3972  */
3973 const char *pevent_data_comm_from_pid(struct pevent *pevent, int pid)
3974 {
3975         const char *comm;
3976
3977         comm = find_cmdline(pevent, pid);
3978         return comm;
3979 }
3980
3981 /**
3982  * pevent_data_comm_from_pid - parse the data into the print format
3983  * @s: the trace_seq to write to
3984  * @event: the handle to the event
3985  * @cpu: the cpu the event was recorded on
3986  * @data: the raw data
3987  * @size: the size of the raw data
3988  * @nsecs: the timestamp of the event
3989  *
3990  * This parses the raw @data using the given @event information and
3991  * writes the print format into the trace_seq.
3992  */
3993 void pevent_event_info(struct trace_seq *s, struct event_format *event,
3994                        struct record *record)
3995 {
3996         int print_pretty = 1;
3997
3998         if (event->pevent->print_raw)
3999                 print_event_fields(s, record->data, record->size, event);
4000         else {
4001
4002                 if (event->handler)
4003                         print_pretty = event->handler(s, record, event,
4004                                                       event->context);
4005
4006                 if (print_pretty)
4007                         pretty_print(s, record->data, record->size, event);
4008         }
4009
4010         trace_seq_terminate(s);
4011 }
4012
4013 void pevent_print_event(struct pevent *pevent, struct trace_seq *s,
4014                         struct record *record)
4015 {
4016         static char *spaces = "                    "; /* 20 spaces */
4017         struct event_format *event;
4018         unsigned long secs;
4019         unsigned long usecs;
4020         unsigned long nsecs;
4021         const char *comm;
4022         void *data = record->data;
4023         int type;
4024         int pid;
4025         int len;
4026         int p;
4027
4028         secs = record->ts / NSECS_PER_SEC;
4029         nsecs = record->ts - secs * NSECS_PER_SEC;
4030
4031         if (record->size < 0) {
4032                 do_warning("ug! negative record size %d", record->size);
4033                 return;
4034         }
4035
4036         type = trace_parse_common_type(pevent, data);
4037
4038         event = pevent_find_event(pevent, type);
4039         if (!event) {
4040                 do_warning("ug! no event found for type %d", type);
4041                 return;
4042         }
4043
4044         pid = parse_common_pid(pevent, data);
4045         comm = find_cmdline(pevent, pid);
4046
4047         if (pevent->latency_format) {
4048                 trace_seq_printf(s, "%8.8s-%-5d %3d",
4049                        comm, pid, record->cpu);
4050                 pevent_data_lat_fmt(pevent, s, record);
4051         } else
4052                 trace_seq_printf(s, "%16s-%-5d [%03d]", comm, pid, record->cpu);
4053
4054         if (pevent->flags & PEVENT_NSEC_OUTPUT) {
4055                 usecs = nsecs;
4056                 p = 9;
4057         } else {
4058                 usecs = (nsecs + 500) / NSECS_PER_USEC;
4059                 p = 6;
4060         }
4061
4062         trace_seq_printf(s, " %5lu.%0*lu: %s: ", secs, p, usecs, event->name);
4063
4064         /* Space out the event names evenly. */
4065         len = strlen(event->name);
4066         if (len < 20)
4067                 trace_seq_printf(s, "%.*s", 20 - len, spaces);
4068
4069         pevent_event_info(s, event, record);
4070 }
4071
4072 static int events_id_cmp(const void *a, const void *b)
4073 {
4074         struct event_format * const * ea = a;
4075         struct event_format * const * eb = b;
4076
4077         if ((*ea)->id < (*eb)->id)
4078                 return -1;
4079
4080         if ((*ea)->id > (*eb)->id)
4081                 return 1;
4082
4083         return 0;
4084 }
4085
4086 static int events_name_cmp(const void *a, const void *b)
4087 {
4088         struct event_format * const * ea = a;
4089         struct event_format * const * eb = b;
4090         int res;
4091
4092         res = strcmp((*ea)->name, (*eb)->name);
4093         if (res)
4094                 return res;
4095
4096         res = strcmp((*ea)->system, (*eb)->system);
4097         if (res)
4098                 return res;
4099
4100         return events_id_cmp(a, b);
4101 }
4102
4103 static int events_system_cmp(const void *a, const void *b)
4104 {
4105         struct event_format * const * ea = a;
4106         struct event_format * const * eb = b;
4107         int res;
4108
4109         res = strcmp((*ea)->system, (*eb)->system);
4110         if (res)
4111                 return res;
4112
4113         res = strcmp((*ea)->name, (*eb)->name);
4114         if (res)
4115                 return res;
4116
4117         return events_id_cmp(a, b);
4118 }
4119
4120 struct event_format **pevent_list_events(struct pevent *pevent, enum event_sort_type sort_type)
4121 {
4122         struct event_format **events;
4123         int (*sort)(const void *a, const void *b);
4124
4125         events = pevent->sort_events;
4126
4127         if (events && pevent->last_type == sort_type)
4128                 return events;
4129
4130         if (!events) {
4131                 events = malloc(sizeof(*events) * (pevent->nr_events + 1));
4132                 if (!events)
4133                         return NULL;
4134
4135                 memcpy(events, pevent->events, sizeof(*events) * pevent->nr_events);
4136                 events[pevent->nr_events] = NULL;
4137
4138                 pevent->sort_events = events;
4139
4140                 /* the internal events are sorted by id */
4141                 if (sort_type == EVENT_SORT_ID) {
4142                         pevent->last_type = sort_type;
4143                         return events;
4144                 }
4145         }
4146
4147         switch (sort_type) {
4148         case EVENT_SORT_ID:
4149                 sort = events_id_cmp;
4150                 break;
4151         case EVENT_SORT_NAME:
4152                 sort = events_name_cmp;
4153                 break;
4154         case EVENT_SORT_SYSTEM:
4155                 sort = events_system_cmp;
4156                 break;
4157         default:
4158                 return events;
4159         }
4160
4161         qsort(events, pevent->nr_events, sizeof(*events), sort);
4162         pevent->last_type = sort_type;
4163
4164         return events;
4165 }
4166
4167 static struct format_field **
4168 get_event_fields(const char *type, const char *name,
4169                  int count, struct format_field *list)
4170 {
4171         struct format_field **fields;
4172         struct format_field *field;
4173         int i = 0;
4174
4175         fields = malloc_or_die(sizeof(*fields) * (count + 1));
4176         for (field = list; field; field = field->next) {
4177                 fields[i++] = field;
4178                 if (i == count + 1) {
4179                         do_warning("event %s has more %s fields than specified",
4180                                 name, type);
4181                         i--;
4182                         break;
4183                 }
4184         }
4185
4186         if (i != count)
4187                 do_warning("event %s has less %s fields than specified",
4188                         name, type);
4189
4190         fields[i] = NULL;
4191
4192         return fields;
4193 }
4194
4195 /**
4196  * pevent_event_common_fields - return a list of common fields for an event
4197  * @event: the event to return the common fields of.
4198  *
4199  * Returns an allocated array of fields. The last item in the array is NULL.
4200  * The array must be freed with free().
4201  */
4202 struct format_field **pevent_event_common_fields(struct event_format *event)
4203 {
4204         return get_event_fields("common", event->name,
4205                                 event->format.nr_common,
4206                                 event->format.common_fields);
4207 }
4208
4209 /**
4210  * pevent_event_fields - return a list of event specific fields for an event
4211  * @event: the event to return the fields of.
4212  *
4213  * Returns an allocated array of fields. The last item in the array is NULL.
4214  * The array must be freed with free().
4215  */
4216 struct format_field **pevent_event_fields(struct event_format *event)
4217 {
4218         return get_event_fields("event", event->name,
4219                                 event->format.nr_fields,
4220                                 event->format.fields);
4221 }
4222
4223 static void print_fields(struct trace_seq *s, struct print_flag_sym *field)
4224 {
4225         trace_seq_printf(s, "{ %s, %s }", field->value, field->str);
4226         if (field->next) {
4227                 trace_seq_puts(s, ", ");
4228                 print_fields(s, field->next);
4229         }
4230 }
4231
4232 /* for debugging */
4233 static void print_args(struct print_arg *args)
4234 {
4235         int print_paren = 1;
4236         struct trace_seq s;
4237
4238         switch (args->type) {
4239         case PRINT_NULL:
4240                 printf("null");
4241                 break;
4242         case PRINT_ATOM:
4243                 printf("%s", args->atom.atom);
4244                 break;
4245         case PRINT_FIELD:
4246                 printf("REC->%s", args->field.name);
4247                 break;
4248         case PRINT_FLAGS:
4249                 printf("__print_flags(");
4250                 print_args(args->flags.field);
4251                 printf(", %s, ", args->flags.delim);
4252                 trace_seq_init(&s);
4253                 print_fields(&s, args->flags.flags);
4254                 trace_seq_do_printf(&s);
4255                 trace_seq_destroy(&s);
4256                 printf(")");
4257                 break;
4258         case PRINT_SYMBOL:
4259                 printf("__print_symbolic(");
4260                 print_args(args->symbol.field);
4261                 printf(", ");
4262                 trace_seq_init(&s);
4263                 print_fields(&s, args->symbol.symbols);
4264                 trace_seq_do_printf(&s);
4265                 trace_seq_destroy(&s);
4266                 printf(")");
4267                 break;
4268         case PRINT_STRING:
4269         case PRINT_BSTRING:
4270                 printf("__get_str(%s)", args->string.string);
4271                 break;
4272         case PRINT_TYPE:
4273                 printf("(%s)", args->typecast.type);
4274                 print_args(args->typecast.item);
4275                 break;
4276         case PRINT_OP:
4277                 if (strcmp(args->op.op, ":") == 0)
4278                         print_paren = 0;
4279                 if (print_paren)
4280                         printf("(");
4281                 print_args(args->op.left);
4282                 printf(" %s ", args->op.op);
4283                 print_args(args->op.right);
4284                 if (print_paren)
4285                         printf(")");
4286                 break;
4287         default:
4288                 /* we should warn... */
4289                 return;
4290         }
4291         if (args->next) {
4292                 printf("\n");
4293                 print_args(args->next);
4294         }
4295 }
4296
4297 static void parse_header_field(const char *field,
4298                                int *offset, int *size, int mandatory)
4299 {
4300         unsigned long long save_input_buf_ptr;
4301         unsigned long long save_input_buf_siz;
4302         char *token;
4303         int type;
4304
4305         save_input_buf_ptr = input_buf_ptr;
4306         save_input_buf_siz = input_buf_siz;
4307
4308         if (read_expected(EVENT_ITEM, "field") < 0)
4309                 return;
4310         if (read_expected(EVENT_OP, ":") < 0)
4311                 return;
4312
4313         /* type */
4314         if (read_expect_type(EVENT_ITEM, &token) < 0)
4315                 goto fail;
4316         free_token(token);
4317
4318         /*
4319          * If this is not a mandatory field, then test it first.
4320          */
4321         if (mandatory) {
4322                 if (read_expected(EVENT_ITEM, field) < 0)
4323                         return;
4324         } else {
4325                 if (read_expect_type(EVENT_ITEM, &token) < 0)
4326                         goto fail;
4327                 if (strcmp(token, field) != 0)
4328                         goto discard;
4329                 free_token(token);
4330         }
4331
4332         if (read_expected(EVENT_OP, ";") < 0)
4333                 return;
4334         if (read_expected(EVENT_ITEM, "offset") < 0)
4335                 return;
4336         if (read_expected(EVENT_OP, ":") < 0)
4337                 return;
4338         if (read_expect_type(EVENT_ITEM, &token) < 0)
4339                 goto fail;
4340         *offset = atoi(token);
4341         free_token(token);
4342         if (read_expected(EVENT_OP, ";") < 0)
4343                 return;
4344         if (read_expected(EVENT_ITEM, "size") < 0)
4345                 return;
4346         if (read_expected(EVENT_OP, ":") < 0)
4347                 return;
4348         if (read_expect_type(EVENT_ITEM, &token) < 0)
4349                 goto fail;
4350         *size = atoi(token);
4351         free_token(token);
4352         if (read_expected(EVENT_OP, ";") < 0)
4353                 return;
4354         type = read_token(&token);
4355         if (type != EVENT_NEWLINE) {
4356                 /* newer versions of the kernel have a "signed" type */
4357                 if (type != EVENT_ITEM)
4358                         goto fail;
4359
4360                 if (strcmp(token, "signed") != 0)
4361                         goto fail;
4362
4363                 free_token(token);
4364
4365                 if (read_expected(EVENT_OP, ":") < 0)
4366                         return;
4367
4368                 if (read_expect_type(EVENT_ITEM, &token))
4369                         goto fail;
4370
4371                 free_token(token);
4372                 if (read_expected(EVENT_OP, ";") < 0)
4373                         return;
4374
4375                 if (read_expect_type(EVENT_NEWLINE, &token))
4376                         goto fail;
4377         }
4378  fail:
4379         free_token(token);
4380         return;
4381
4382  discard:
4383         input_buf_ptr = save_input_buf_ptr;
4384         input_buf_siz = save_input_buf_siz;
4385         *offset = 0;
4386         *size = 0;
4387         free_token(token);
4388 }
4389
4390 /**
4391  * pevent_parse_header_page - parse the data stored in the header page
4392  * @pevent: the handle to the pevent
4393  * @buf: the buffer storing the header page format string
4394  * @size: the size of @buf
4395  * @long_size: the long size to use if there is no header
4396  *
4397  * This parses the header page format for information on the
4398  * ring buffer used. The @buf should be copied from
4399  *
4400  * /sys/kernel/debug/tracing/events/header_page
4401  */
4402 int pevent_parse_header_page(struct pevent *pevent, char *buf, unsigned long size,
4403                              int long_size)
4404 {
4405         int ignore;
4406
4407         if (!size) {
4408                 /*
4409                  * Old kernels did not have header page info.
4410                  * Sorry but we just use what we find here in user space.
4411                  */
4412                 pevent->header_page_ts_size = sizeof(long long);
4413                 pevent->header_page_size_size = long_size;
4414                 pevent->header_page_data_offset = sizeof(long long) + long_size;
4415                 pevent->old_format = 1;
4416                 return -1;
4417         }
4418         init_input_buf(buf, size);
4419
4420         parse_header_field("timestamp", &pevent->header_page_ts_offset,
4421                            &pevent->header_page_ts_size, 1);
4422         parse_header_field("commit", &pevent->header_page_size_offset,
4423                            &pevent->header_page_size_size, 1);
4424         parse_header_field("overwrite", &pevent->header_page_overwrite,
4425                            &ignore, 0);
4426         parse_header_field("data", &pevent->header_page_data_offset,
4427                            &pevent->header_page_data_size, 1);
4428
4429         return 0;
4430 }
4431
4432 static int event_matches(struct event_format *event,
4433                          int id, const char *sys_name,
4434                          const char *event_name)
4435 {
4436         if (id >= 0 && id != event->id)
4437                 return 0;
4438
4439         if (event_name && (strcmp(event_name, event->name) != 0))
4440                 return 0;
4441
4442         if (sys_name && (strcmp(sys_name, event->system) != 0))
4443                 return 0;
4444
4445         return 1;
4446 }
4447
4448 static void free_handler(struct event_handler *handle)
4449 {
4450         free((void *)handle->sys_name);
4451         free((void *)handle->event_name);
4452         free(handle);
4453 }
4454
4455 static int find_event_handle(struct pevent *pevent, struct event_format *event)
4456 {
4457         struct event_handler *handle, **next;
4458
4459         for (next = &pevent->handlers; *next;
4460              next = &(*next)->next) {
4461                 handle = *next;
4462                 if (event_matches(event, handle->id,
4463                                   handle->sys_name,
4464                                   handle->event_name))
4465                         break;
4466         }
4467
4468         if (!(*next))
4469                 return 0;
4470
4471         pr_stat("overriding event (%d) %s:%s with new print handler",
4472                 event->id, event->system, event->name);
4473
4474         event->handler = handle->func;
4475         event->context = handle->context;
4476
4477         *next = handle->next;
4478         free_handler(handle);
4479
4480         return 1;
4481 }
4482
4483 /**
4484  * pevent_parse_event - parse the event format
4485  * @pevent: the handle to the pevent
4486  * @buf: the buffer storing the event format string
4487  * @size: the size of @buf
4488  * @sys: the system the event belongs to
4489  *
4490  * This parses the event format and creates an event structure
4491  * to quickly parse raw data for a given event.
4492  *
4493  * These files currently come from:
4494  *
4495  * /sys/kernel/debug/tracing/events/.../.../format
4496  */
4497 int pevent_parse_event(struct pevent *pevent,
4498                        const char *buf, unsigned long size,
4499                        const char *sys)
4500 {
4501         struct event_format *event;
4502         int ret;
4503
4504         init_input_buf(buf, size);
4505
4506         event = alloc_event();
4507         if (!event)
4508                 return -ENOMEM;
4509
4510         event->name = event_read_name();
4511         if (!event->name) {
4512                 /* Bad event? */
4513                 free(event);
4514                 return -1;
4515         }
4516
4517         if (strcmp(sys, "ftrace") == 0) {
4518
4519                 event->flags |= EVENT_FL_ISFTRACE;
4520
4521                 if (strcmp(event->name, "bprint") == 0)
4522                         event->flags |= EVENT_FL_ISBPRINT;
4523         }
4524                 
4525         event->id = event_read_id();
4526         if (event->id < 0)
4527                 die("failed to read event id");
4528
4529         event->system = strdup(sys);
4530
4531         /* Add pevent to event so that it can be referenced */
4532         event->pevent = pevent;
4533
4534         ret = event_read_format(event);
4535         if (ret < 0) {
4536                 do_warning("failed to read event format for %s", event->name);
4537                 goto event_failed;
4538         }
4539
4540         /*
4541          * If the event has an override, don't print warnings if the event
4542          * print format fails to parse.
4543          */
4544         if (find_event_handle(pevent, event))
4545                 show_warning = 0;
4546
4547         ret = event_read_print(event);
4548         if (ret < 0) {
4549                 do_warning("failed to read event print fmt for %s",
4550                            event->name);
4551                 show_warning = 1;
4552                 goto event_failed;
4553         }
4554         show_warning = 1;
4555
4556         add_event(pevent, event);
4557
4558         if (!ret && (event->flags & EVENT_FL_ISFTRACE)) {
4559                 struct format_field *field;
4560                 struct print_arg *arg, **list;
4561
4562                 /* old ftrace had no args */
4563
4564                 list = &event->print_fmt.args;
4565                 for (field = event->format.fields; field; field = field->next) {
4566                         arg = alloc_arg();
4567                         *list = arg;
4568                         list = &arg->next;
4569                         arg->type = PRINT_FIELD;
4570                         arg->field.name = strdup(field->name);
4571                         arg->field.field = field;
4572                 }
4573                 return 0;
4574         }
4575
4576 #define PRINT_ARGS 0
4577         if (PRINT_ARGS && event->print_fmt.args)
4578                 print_args(event->print_fmt.args);
4579
4580         return 0;
4581
4582  event_failed:
4583         event->flags |= EVENT_FL_FAILED;
4584         /* still add it even if it failed */
4585         add_event(pevent, event);
4586         return -1;
4587 }
4588
4589 int get_field_val(struct trace_seq *s, struct format_field *field,
4590                   const char *name, struct record *record,
4591                   unsigned long long *val, int err)
4592 {
4593         if (!field) {
4594                 if (err)
4595                         trace_seq_printf(s, "<CANT FIND FIELD %s>", name);
4596                 return -1;
4597         }
4598
4599         if (pevent_read_number_field(field, record->data, val)) {
4600                 if (err)
4601                         trace_seq_printf(s, " %s=INVALID", name);
4602                 return -1;
4603         }
4604
4605         return 0;
4606 }
4607
4608 /**
4609  * pevent_get_field_raw - return the raw pointer into the data field
4610  * @s: The seq to print to on error
4611  * @event: the event that the field is for
4612  * @name: The name of the field
4613  * @record: The record with the field name.
4614  * @len: place to store the field length.
4615  * @err: print default error if failed.
4616  *
4617  * Returns a pointer into record->data of the field and places
4618  * the length of the field in @len.
4619  *
4620  * On failure, it returns NULL.
4621  */
4622 void *pevent_get_field_raw(struct trace_seq *s, struct event_format *event,
4623                            const char *name, struct record *record,
4624                            int *len, int err)
4625 {
4626         struct format_field *field;
4627         void *data = record->data;
4628         unsigned offset;
4629         int dummy;
4630
4631         if (!event)
4632                 return NULL;
4633
4634         field = pevent_find_field(event, name);
4635
4636         if (!field) {
4637                 if (err)
4638                         trace_seq_printf(s, "<CANT FIND FIELD %s>", name);
4639                 return NULL;
4640         }
4641
4642         /* Allow @len to be NULL */
4643         if (!len)
4644                 len = &dummy;
4645
4646         offset = field->offset;
4647         if (field->flags & FIELD_IS_DYNAMIC) {
4648                 offset = pevent_read_number(event->pevent,
4649                                             data + offset, field->size);
4650                 *len = offset >> 16;
4651                 offset &= 0xffff;
4652         } else
4653                 *len = field->size;
4654
4655         return data + offset;
4656 }
4657
4658 /**
4659  * pevent_get_field_val - find a field and return its value
4660  * @s: The seq to print to on error
4661  * @event: the event that the field is for
4662  * @name: The name of the field
4663  * @record: The record with the field name.
4664  * @val: place to store the value of the field.
4665  * @err: print default error if failed.
4666  *
4667  * Returns 0 on success -1 on field not found.
4668  */
4669 int pevent_get_field_val(struct trace_seq *s, struct event_format *event,
4670                          const char *name, struct record *record,
4671                          unsigned long long *val, int err)
4672 {
4673         struct format_field *field;
4674
4675         if (!event)
4676                 return -1;
4677
4678         field = pevent_find_field(event, name);
4679
4680         return get_field_val(s, field, name, record, val, err);
4681 }
4682
4683 /**
4684  * pevent_get_common_field_val - find a common field and return its value
4685  * @s: The seq to print to on error
4686  * @event: the event that the field is for
4687  * @name: The name of the field
4688  * @record: The record with the field name.
4689  * @val: place to store the value of the field.
4690  * @err: print default error if failed.
4691  *
4692  * Returns 0 on success -1 on field not found.
4693  */
4694 int pevent_get_common_field_val(struct trace_seq *s, struct event_format *event,
4695                                 const char *name, struct record *record,
4696                                 unsigned long long *val, int err)
4697 {
4698         struct format_field *field;
4699
4700         if (!event)
4701                 return -1;
4702
4703         field = pevent_find_common_field(event, name);
4704
4705         return get_field_val(s, field, name, record, val, err);
4706 }
4707
4708 /**
4709  * pevent_get_any_field_val - find a any field and return its value
4710  * @s: The seq to print to on error
4711  * @event: the event that the field is for
4712  * @name: The name of the field
4713  * @record: The record with the field name.
4714  * @val: place to store the value of the field.
4715  * @err: print default error if failed.
4716  *
4717  * Returns 0 on success -1 on field not found.
4718  */
4719 int pevent_get_any_field_val(struct trace_seq *s, struct event_format *event,
4720                              const char *name, struct record *record,
4721                              unsigned long long *val, int err)
4722 {
4723         struct format_field *field;
4724
4725         if (!event)
4726                 return -1;
4727
4728         field = pevent_find_any_field(event, name);
4729
4730         return get_field_val(s, field, name, record, val, err);
4731 }
4732
4733 /**
4734  * pevent_print_num_field - print a field and a format
4735  * @s: The seq to print to
4736  * @fmt: The printf format to print the field with.
4737  * @event: the event that the field is for
4738  * @name: The name of the field
4739  * @record: The record with the field name.
4740  * @err: print default error if failed.
4741  *
4742  * Returns: 0 on success, -1 field not fould, or 1 if buffer is full.
4743  */
4744 int pevent_print_num_field(struct trace_seq *s, const char *fmt,
4745                            struct event_format *event, const char *name,
4746                            struct record *record, int err)
4747 {
4748         struct format_field *field = pevent_find_field(event, name);
4749         unsigned long long val;
4750
4751         if (!field)
4752                 goto failed;
4753
4754         if (pevent_read_number_field(field, record->data, &val))
4755                 goto failed;
4756
4757         return trace_seq_printf(s, fmt, val);
4758
4759  failed:
4760         if (err)
4761                 trace_seq_printf(s, "CAN'T FIND FIELD \"%s\"", name);
4762         return -1;
4763 }
4764
4765 static void free_func_handle(struct pevent_function_handler *func)
4766 {
4767         struct pevent_func_params *params;
4768
4769         free(func->name);
4770
4771         while (func->params) {
4772                 params = func->params;
4773                 func->params = params->next;
4774                 free(params);
4775         }
4776
4777         free(func);
4778 }
4779
4780 /**
4781  * pevent_register_print_function - register a helper function
4782  * @pevent: the handle to the pevent
4783  * @func: the function to process the helper function
4784  * @name: the name of the helper function
4785  * @parameters: A list of enum pevent_func_arg_type
4786  *
4787  * Some events may have helper functions in the print format arguments.
4788  * This allows a plugin to dynmically create a way to process one
4789  * of these functions.
4790  *
4791  * The @parameters is a variable list of pevent_func_arg_type enums that
4792  * must end with PEVENT_FUNC_ARG_VOID.
4793  */
4794 int pevent_register_print_function(struct pevent *pevent,
4795                                    pevent_func_handler func,
4796                                    enum pevent_func_arg_type ret_type,
4797                                    char *name, ...)
4798 {
4799         struct pevent_function_handler *func_handle;
4800         struct pevent_func_params **next_param;
4801         struct pevent_func_params *param;
4802         enum pevent_func_arg_type type;
4803         va_list ap;
4804
4805         func_handle = find_func_handler(pevent, name);
4806         if (func_handle) {
4807                 /*
4808                  * This is most like caused by the users own
4809                  * plugins updating the function. This overrides the
4810                  * system defaults.
4811                  */
4812                 pr_stat("override of function helper '%s'", name);
4813                 remove_func_handler(pevent, name);
4814         }
4815
4816         func_handle = malloc_or_die(sizeof(*func_handle));
4817         memset(func_handle, 0, sizeof(*func_handle));
4818
4819         func_handle->ret_type = ret_type;
4820         func_handle->name = strdup(name);
4821         func_handle->func = func;
4822         if (!func_handle->name)
4823                 die("Failed to allocate function name");
4824
4825         next_param = &(func_handle->params);
4826         va_start(ap, name);
4827         for (;;) {
4828                 type = va_arg(ap, enum pevent_func_arg_type);
4829                 if (type == PEVENT_FUNC_ARG_VOID)
4830                         break;
4831
4832                 if (type < 0 || type >= PEVENT_FUNC_ARG_MAX_TYPES) {
4833                         warning("Invalid argument type %d", type);
4834                         goto out_free;
4835                 }
4836
4837                 param = malloc_or_die(sizeof(*param));
4838                 param->type = type;
4839                 param->next = NULL;
4840
4841                 *next_param = param;
4842                 next_param = &(param->next);
4843
4844                 func_handle->nr_args++;
4845         }
4846         va_end(ap);
4847
4848         func_handle->next = pevent->func_handlers;
4849         pevent->func_handlers = func_handle;
4850
4851         return 0;
4852  out_free:
4853         va_end(ap);
4854         free_func_handle(func_handle);
4855         return -1;
4856 }
4857
4858 /**
4859  * pevent_register_event_handle - register a way to parse an event
4860  * @pevent: the handle to the pevent
4861  * @id: the id of the event to register
4862  * @sys_name: the system name the event belongs to
4863  * @event_name: the name of the event
4864  * @func: the function to call to parse the event information
4865  *
4866  * This function allows a developer to override the parsing of
4867  * a given event. If for some reason the default print format
4868  * is not sufficient, this function will register a function
4869  * for an event to be used to parse the data instead.
4870  *
4871  * If @id is >= 0, then it is used to find the event.
4872  * else @sys_name and @event_name are used.
4873  */
4874 int pevent_register_event_handler(struct pevent *pevent,
4875                                   int id, char *sys_name, char *event_name,
4876                                   pevent_event_handler_func func,
4877                                   void *context)
4878 {
4879         struct event_format *event;
4880         struct event_handler *handle;
4881
4882         if (id >= 0) {
4883                 /* search by id */
4884                 event = pevent_find_event(pevent, id);
4885                 if (!event)
4886                         goto not_found;
4887                 if (event_name && (strcmp(event_name, event->name) != 0))
4888                         goto not_found;
4889                 if (sys_name && (strcmp(sys_name, event->system) != 0))
4890                         goto not_found;
4891         } else {
4892                 event = pevent_find_event_by_name(pevent, sys_name, event_name);
4893                 if (!event)
4894                         goto not_found;
4895         }
4896
4897         pr_stat("overriding event (%d) %s:%s with new print handler",
4898                 event->id, event->system, event->name);
4899
4900         event->handler = func;
4901         event->context = context;
4902         return 0;
4903
4904  not_found:
4905         /* Save for later use. */
4906         handle = malloc_or_die(sizeof(*handle));
4907         memset(handle, 0, sizeof(handle));
4908         handle->id = id;
4909         if (event_name)
4910                 handle->event_name = strdup(event_name);
4911         if (sys_name)
4912                 handle->sys_name = strdup(sys_name);
4913
4914         handle->func = func;
4915         handle->next = pevent->handlers;
4916         pevent->handlers = handle;
4917         handle->context = context;
4918
4919         return -1;
4920 }
4921
4922 /**
4923  * pevent_alloc - create a pevent handle
4924  */
4925 struct pevent *pevent_alloc(void)
4926 {
4927         struct pevent *pevent;
4928
4929         pevent = malloc(sizeof(*pevent));
4930         if (!pevent)
4931                 return NULL;
4932         memset(pevent, 0, sizeof(*pevent));
4933         pevent->ref_count = 1;
4934
4935         return pevent;
4936 }
4937
4938 void pevent_ref(struct pevent *pevent)
4939 {
4940         pevent->ref_count++;
4941 }
4942
4943 static void free_format_fields(struct format_field *field)
4944 {
4945         struct format_field *next;
4946
4947         while (field) {
4948                 next = field->next;
4949                 free(field->type);
4950                 free(field->name);
4951                 free(field);
4952                 field = next;
4953         }
4954 }
4955
4956 static void free_formats(struct format *format)
4957 {
4958         free_format_fields(format->common_fields);
4959         free_format_fields(format->fields);
4960 }
4961
4962 static void free_event(struct event_format *event)
4963 {
4964         free(event->name);
4965         free(event->system);
4966
4967         free_formats(&event->format);
4968
4969         free(event->print_fmt.format);
4970         free_args(event->print_fmt.args);
4971
4972         free(event);
4973 }
4974
4975 /**
4976  * pevent_free - free a pevent handle
4977  * @pevent: the pevent handle to free
4978  */
4979 void pevent_free(struct pevent *pevent)
4980 {
4981         struct cmdline_list *cmdlist, *cmdnext;
4982         struct func_list *funclist, *funcnext;
4983         struct printk_list *printklist, *printknext;
4984         struct pevent_function_handler *func_handler;
4985         struct event_handler *handle;
4986         int i;
4987
4988         if (!pevent)
4989                 return;
4990
4991         cmdlist = pevent->cmdlist;
4992         funclist = pevent->funclist;
4993         printklist = pevent->printklist;
4994
4995         pevent->ref_count--;
4996         if (pevent->ref_count)
4997                 return;
4998
4999         if (pevent->cmdlines) {
5000                 for (i = 0; i < pevent->cmdline_count; i++)
5001                         free(pevent->cmdlines[i].comm);
5002                 free(pevent->cmdlines);
5003         }
5004
5005         while (cmdlist) {
5006                 cmdnext = cmdlist->next;
5007                 free(cmdlist->comm);
5008                 free(cmdlist);
5009                 cmdlist = cmdnext;
5010         }
5011
5012         if (pevent->func_map) {
5013                 for (i = 0; i < pevent->func_count; i++) {
5014                         free(pevent->func_map[i].func);
5015                         free(pevent->func_map[i].mod);
5016                 }
5017                 free(pevent->func_map);
5018         }
5019
5020         while (funclist) {
5021                 funcnext = funclist->next;
5022                 free(funclist->func);
5023                 free(funclist->mod);
5024                 free(funclist);
5025                 funclist = funcnext;
5026         }
5027
5028         while (pevent->func_handlers) {
5029                 func_handler = pevent->func_handlers;
5030                 pevent->func_handlers = func_handler->next;
5031                 free_func_handle(func_handler);
5032         }
5033
5034         if (pevent->printk_map) {
5035                 for (i = 0; i < pevent->printk_count; i++)
5036                         free(pevent->printk_map[i].printk);
5037                 free(pevent->printk_map);
5038         }
5039
5040         while (printklist) {
5041                 printknext = printklist->next;
5042                 free(printklist->printk);
5043                 free(printklist);
5044                 printklist = printknext;
5045         }
5046
5047         for (i = 0; i < pevent->nr_events; i++)
5048                 free_event(pevent->events[i]);
5049
5050         while (pevent->handlers) {
5051                 handle = pevent->handlers;
5052                 pevent->handlers = handle->next;
5053                 free_handler(handle);
5054         }
5055
5056         free(pevent->events);
5057         free(pevent->sort_events);
5058
5059         free(pevent);
5060 }
5061
5062 void pevent_unref(struct pevent *pevent)
5063 {
5064         pevent_free(pevent);
5065 }