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