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