event-parse.c 149.7 KB
Newer Older
1
// SPDX-License-Identifier: LGPL-2.1
2 3 4 5 6 7 8 9 10 11
/*
 * Copyright (C) 2009, 2010 Red Hat Inc, Steven Rostedt <srostedt@redhat.com>
 *
 *
 *  The parts for function graph printing was taken and modified from the
 *  Linux Kernel that were written by
 *    - Copyright (C) 2009  Frederic Weisbecker,
 *  Frederic Weisbecker gave his permission to relicense the code to
 *  the Lesser General Public License.
 */
12
#include <inttypes.h>
13 14 15 16 17 18
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include <ctype.h>
#include <errno.h>
19
#include <stdint.h>
20
#include <limits.h>
21
#include <linux/time64.h>
22

23
#include <netinet/in.h>
24
#include "event-parse.h"
25 26

#include "event-parse-local.h"
27
#include "event-utils.h"
28
#include "trace-seq.h"
29 30 31 32 33

static const char *input_buf;
static unsigned long long input_buf_ptr;
static unsigned long long input_buf_siz;

34 35 36
static int is_flag_field;
static int is_symbolic_field;

37 38 39 40 41 42 43 44
static int show_warning = 1;

#define do_warning(fmt, ...)				\
	do {						\
		if (show_warning)			\
			warning(fmt, ##__VA_ARGS__);	\
	} while (0)

45 46 47 48 49 50 51 52 53 54 55 56
#define do_warning_event(event, fmt, ...)			\
	do {							\
		if (!show_warning)				\
			continue;				\
								\
		if (event)					\
			warning("[%s:%s] " fmt, event->system,	\
				event->name, ##__VA_ARGS__);	\
		else						\
			warning(fmt, ##__VA_ARGS__);		\
	} while (0)

57 58 59 60 61 62 63
static void init_input_buf(const char *buf, unsigned long long size)
{
	input_buf = buf;
	input_buf_siz = size;
	input_buf_ptr = 0;
}

64
const char *tep_get_input_buf(void)
65 66 67 68
{
	return input_buf;
}

69
unsigned long long tep_get_input_buf_ptr(void)
70 71 72 73 74 75 76 77 78
{
	return input_buf_ptr;
}

struct event_handler {
	struct event_handler		*next;
	int				id;
	const char			*sys_name;
	const char			*event_name;
79
	tep_event_handler_func		func;
80 81 82
	void				*context;
};

83 84 85
struct func_params {
	struct func_params	*next;
	enum tep_func_arg_type	type;
86 87
};

88 89 90
struct tep_function_handler {
	struct tep_function_handler	*next;
	enum tep_func_arg_type		ret_type;
91
	char				*name;
92
	tep_func_handler		func;
93
	struct func_params		*params;
94 95 96 97 98
	int				nr_args;
};

static unsigned long long
process_defined_func(struct trace_seq *s, void *data, int size,
99
		     struct tep_event *event, struct tep_print_arg *arg);
100

101
static void free_func_handle(struct tep_function_handler *func);
102 103

/**
104
 * tep_buffer_init - init buffer for parsing
105 106 107
 * @buf: buffer to parse
 * @size: the size of the buffer
 *
108 109
 * For use with tep_read_token(), this initializes the internal
 * buffer that tep_read_token() will parse.
110
 */
111
void tep_buffer_init(const char *buf, unsigned long long size)
112 113 114 115 116 117 118 119 120 121
{
	init_input_buf(buf, size);
}

void breakpoint(void)
{
	static int x;
	x++;
}

122
struct tep_print_arg *alloc_arg(void)
123
{
124
	return calloc(1, sizeof(struct tep_print_arg));
125 126
}

127
struct tep_cmdline {
128 129 130 131 132 133
	char *comm;
	int pid;
};

static int cmdline_cmp(const void *a, const void *b)
{
134 135
	const struct tep_cmdline *ca = a;
	const struct tep_cmdline *cb = b;
136 137 138 139 140 141 142 143 144 145 146 147 148 149 150

	if (ca->pid < cb->pid)
		return -1;
	if (ca->pid > cb->pid)
		return 1;

	return 0;
}

struct cmdline_list {
	struct cmdline_list	*next;
	char			*comm;
	int			pid;
};

151
static int cmdline_init(struct tep_handle *pevent)
152 153 154
{
	struct cmdline_list *cmdlist = pevent->cmdlist;
	struct cmdline_list *item;
155
	struct tep_cmdline *cmdlines;
156 157
	int i;

158 159 160
	cmdlines = malloc(sizeof(*cmdlines) * pevent->cmdline_count);
	if (!cmdlines)
		return -1;
161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179

	i = 0;
	while (cmdlist) {
		cmdlines[i].pid = cmdlist->pid;
		cmdlines[i].comm = cmdlist->comm;
		i++;
		item = cmdlist;
		cmdlist = cmdlist->next;
		free(item);
	}

	qsort(cmdlines, pevent->cmdline_count, sizeof(*cmdlines), cmdline_cmp);

	pevent->cmdlines = cmdlines;
	pevent->cmdlist = NULL;

	return 0;
}

180
static const char *find_cmdline(struct tep_handle *pevent, int pid)
181
{
182 183
	const struct tep_cmdline *comm;
	struct tep_cmdline key;
184 185 186 187

	if (!pid)
		return "<idle>";

188 189
	if (!pevent->cmdlines && cmdline_init(pevent))
		return "<not enough memory for cmdlines!>";
190 191 192 193 194 195 196 197 198 199 200 201

	key.pid = pid;

	comm = bsearch(&key, pevent->cmdlines, pevent->cmdline_count,
		       sizeof(*pevent->cmdlines), cmdline_cmp);

	if (comm)
		return comm->comm;
	return "<...>";
}

/**
202
 * tep_pid_is_registered - return if a pid has a cmdline registered
203 204 205 206 207 208
 * @pevent: handle for the pevent
 * @pid: The pid to check if it has a cmdline registered with.
 *
 * Returns 1 if the pid has a cmdline mapped to it
 * 0 otherwise.
 */
209
int tep_pid_is_registered(struct tep_handle *pevent, int pid)
210
{
211 212
	const struct tep_cmdline *comm;
	struct tep_cmdline key;
213 214 215 216

	if (!pid)
		return 1;

217 218
	if (!pevent->cmdlines && cmdline_init(pevent))
		return 0;
219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234

	key.pid = pid;

	comm = bsearch(&key, pevent->cmdlines, pevent->cmdline_count,
		       sizeof(*pevent->cmdlines), cmdline_cmp);

	if (comm)
		return 1;
	return 0;
}

/*
 * If the command lines have been converted to an array, then
 * we must add this pid. This is much slower than when cmdlines
 * are added before the array is initialized.
 */
235 236
static int add_new_comm(struct tep_handle *pevent,
			const char *comm, int pid, bool override)
237
{
238 239 240
	struct tep_cmdline *cmdlines = pevent->cmdlines;
	struct tep_cmdline *cmdline;
	struct tep_cmdline key;
241
	char *new_comm;
242 243 244 245 246 247 248 249 250 251

	if (!pid)
		return 0;

	/* avoid duplicates */
	key.pid = pid;

	cmdline = bsearch(&key, pevent->cmdlines, pevent->cmdline_count,
		       sizeof(*pevent->cmdlines), cmdline_cmp);
	if (cmdline) {
252 253 254 255 256 257 258 259 260 261 262 263 264
		if (!override) {
			errno = EEXIST;
			return -1;
		}
		new_comm = strdup(comm);
		if (!new_comm) {
			errno = ENOMEM;
			return -1;
		}
		free(cmdline->comm);
		cmdline->comm = new_comm;

		return 0;
265 266 267 268 269 270 271 272 273
	}

	cmdlines = realloc(cmdlines, sizeof(*cmdlines) * (pevent->cmdline_count + 1));
	if (!cmdlines) {
		errno = ENOMEM;
		return -1;
	}

	cmdlines[pevent->cmdline_count].comm = strdup(comm);
274 275 276 277 278 279 280
	if (!cmdlines[pevent->cmdline_count].comm) {
		free(cmdlines);
		errno = ENOMEM;
		return -1;
	}

	cmdlines[pevent->cmdline_count].pid = pid;
281 282 283 284 285 286 287 288 289 290
		
	if (cmdlines[pevent->cmdline_count].comm)
		pevent->cmdline_count++;

	qsort(cmdlines, pevent->cmdline_count, sizeof(*cmdlines), cmdline_cmp);
	pevent->cmdlines = cmdlines;

	return 0;
}

291 292
static int _tep_register_comm(struct tep_handle *pevent,
			      const char *comm, int pid, bool override)
293 294 295 296
{
	struct cmdline_list *item;

	if (pevent->cmdlines)
297
		return add_new_comm(pevent, comm, pid, override);
298

299 300 301 302
	item = malloc(sizeof(*item));
	if (!item)
		return -1;

303 304 305 306
	if (comm)
		item->comm = strdup(comm);
	else
		item->comm = strdup("<...>");
307 308 309 310
	if (!item->comm) {
		free(item);
		return -1;
	}
311 312 313 314 315 316 317 318 319
	item->pid = pid;
	item->next = pevent->cmdlist;

	pevent->cmdlist = item;
	pevent->cmdline_count++;

	return 0;
}

320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353
/**
 * tep_register_comm - register a pid / comm mapping
 * @pevent: handle for the pevent
 * @comm: the command line to register
 * @pid: the pid to map the command line to
 *
 * This adds a mapping to search for command line names with
 * a given pid. The comm is duplicated. If a command with the same pid
 * already exist, -1 is returned and errno is set to EEXIST
 */
int tep_register_comm(struct tep_handle *pevent, const char *comm, int pid)
{
	return _tep_register_comm(pevent, comm, pid, false);
}

/**
 * tep_override_comm - register a pid / comm mapping
 * @pevent: handle for the pevent
 * @comm: the command line to register
 * @pid: the pid to map the command line to
 *
 * This adds a mapping to search for command line names with
 * a given pid. The comm is duplicated. If a command with the same pid
 * already exist, the command string is udapted with the new one
 */
int tep_override_comm(struct tep_handle *pevent, const char *comm, int pid)
{
	if (!pevent->cmdlines && cmdline_init(pevent)) {
		errno = ENOMEM;
		return -1;
	}
	return _tep_register_comm(pevent, comm, pid, true);
}

354
int tep_register_trace_clock(struct tep_handle *pevent, const char *trace_clock)
355
{
356 357 358 359 360 361
	pevent->trace_clock = strdup(trace_clock);
	if (!pevent->trace_clock) {
		errno = ENOMEM;
		return -1;
	}
	return 0;
362 363
}

364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410
struct func_map {
	unsigned long long		addr;
	char				*func;
	char				*mod;
};

struct func_list {
	struct func_list	*next;
	unsigned long long	addr;
	char			*func;
	char			*mod;
};

static int func_cmp(const void *a, const void *b)
{
	const struct func_map *fa = a;
	const struct func_map *fb = b;

	if (fa->addr < fb->addr)
		return -1;
	if (fa->addr > fb->addr)
		return 1;

	return 0;
}

/*
 * We are searching for a record in between, not an exact
 * match.
 */
static int func_bcmp(const void *a, const void *b)
{
	const struct func_map *fa = a;
	const struct func_map *fb = b;

	if ((fa->addr == fb->addr) ||

	    (fa->addr > fb->addr &&
	     fa->addr < (fb+1)->addr))
		return 0;

	if (fa->addr < fb->addr)
		return -1;

	return 1;
}

411
static int func_map_init(struct tep_handle *pevent)
412 413 414 415 416 417
{
	struct func_list *funclist;
	struct func_list *item;
	struct func_map *func_map;
	int i;

418 419 420 421
	func_map = malloc(sizeof(*func_map) * (pevent->func_count + 1));
	if (!func_map)
		return -1;

422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450
	funclist = pevent->funclist;

	i = 0;
	while (funclist) {
		func_map[i].func = funclist->func;
		func_map[i].addr = funclist->addr;
		func_map[i].mod = funclist->mod;
		i++;
		item = funclist;
		funclist = funclist->next;
		free(item);
	}

	qsort(func_map, pevent->func_count, sizeof(*func_map), func_cmp);

	/*
	 * Add a special record at the end.
	 */
	func_map[pevent->func_count].func = NULL;
	func_map[pevent->func_count].addr = 0;
	func_map[pevent->func_count].mod = NULL;

	pevent->func_map = func_map;
	pevent->funclist = NULL;

	return 0;
}

static struct func_map *
451
__find_func(struct tep_handle *pevent, unsigned long long addr)
452 453 454 455 456 457 458 459 460 461 462 463 464 465 466
{
	struct func_map *func;
	struct func_map key;

	if (!pevent->func_map)
		func_map_init(pevent);

	key.addr = addr;

	func = bsearch(&key, pevent->func_map, pevent->func_count,
		       sizeof(*pevent->func_map), func_bcmp);

	return func;
}

467
struct func_resolver {
468 469 470
	tep_func_resolver_t	*func;
	void			*priv;
	struct func_map		map;
471 472 473
};

/**
474
 * tep_set_function_resolver - set an alternative function resolver
475 476 477 478 479 480 481 482
 * @pevent: handle for the pevent
 * @resolver: function to be used
 * @priv: resolver function private state.
 *
 * Some tools may have already a way to resolve kernel functions, allow them to
 * keep using it instead of duplicating all the entries inside
 * pevent->funclist.
 */
483 484
int tep_set_function_resolver(struct tep_handle *pevent,
			      tep_func_resolver_t *func, void *priv)
485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500
{
	struct func_resolver *resolver = malloc(sizeof(*resolver));

	if (resolver == NULL)
		return -1;

	resolver->func = func;
	resolver->priv = priv;

	free(pevent->func_resolver);
	pevent->func_resolver = resolver;

	return 0;
}

/**
501
 * tep_reset_function_resolver - reset alternative function resolver
502 503 504 505 506
 * @pevent: handle for the pevent
 *
 * Stop using whatever alternative resolver was set, use the default
 * one instead.
 */
507
void tep_reset_function_resolver(struct tep_handle *pevent)
508 509 510 511 512 513
{
	free(pevent->func_resolver);
	pevent->func_resolver = NULL;
}

static struct func_map *
514
find_func(struct tep_handle *pevent, unsigned long long addr)
515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531
{
	struct func_map *map;

	if (!pevent->func_resolver)
		return __find_func(pevent, addr);

	map = &pevent->func_resolver->map;
	map->mod  = NULL;
	map->addr = addr;
	map->func = pevent->func_resolver->func(pevent->func_resolver->priv,
						&map->addr, &map->mod);
	if (map->func == NULL)
		return NULL;

	return map;
}

532
/**
533
 * tep_find_function - find a function by a given address
534 535 536 537 538 539 540
 * @pevent: handle for the pevent
 * @addr: the address to find the function with
 *
 * Returns a pointer to the function stored that has the given
 * address. Note, the address does not have to be exact, it
 * will select the function that would contain the address.
 */
541
const char *tep_find_function(struct tep_handle *pevent, unsigned long long addr)
542 543 544 545 546 547 548 549 550 551 552
{
	struct func_map *map;

	map = find_func(pevent, addr);
	if (!map)
		return NULL;

	return map->func;
}

/**
553
 * tep_find_function_address - find a function address by a given address
554 555 556 557
 * @pevent: handle for the pevent
 * @addr: the address to find the function with
 *
 * Returns the address the function starts at. This can be used in
558
 * conjunction with tep_find_function to print both the function
559 560 561
 * name and the function offset.
 */
unsigned long long
562
tep_find_function_address(struct tep_handle *pevent, unsigned long long addr)
563 564 565 566 567 568 569 570 571 572 573
{
	struct func_map *map;

	map = find_func(pevent, addr);
	if (!map)
		return 0;

	return map->addr;
}

/**
574
 * tep_register_function - register a function with a given address
575 576 577 578 579 580 581 582
 * @pevent: handle for the pevent
 * @function: the function name to register
 * @addr: the address the function starts at
 * @mod: the kernel module the function may be in (NULL for none)
 *
 * This registers a function name with an address and module.
 * The @func passed in is duplicated.
 */
583 584
int tep_register_function(struct tep_handle *pevent, char *func,
			  unsigned long long addr, char *mod)
585
{
586
	struct func_list *item = malloc(sizeof(*item));
587

588 589
	if (!item)
		return -1;
590 591 592

	item->next = pevent->funclist;
	item->func = strdup(func);
593 594 595 596
	if (!item->func)
		goto out_free;

	if (mod) {
597
		item->mod = strdup(mod);
598 599 600
		if (!item->mod)
			goto out_free_func;
	} else
601 602 603
		item->mod = NULL;
	item->addr = addr;

604
	pevent->funclist = item;
605 606 607
	pevent->func_count++;

	return 0;
608 609 610 611 612 613 614 615

out_free_func:
	free(item->func);
	item->func = NULL;
out_free:
	free(item);
	errno = ENOMEM;
	return -1;
616 617 618
}

/**
619
 * tep_print_funcs - print out the stored functions
620 621 622 623
 * @pevent: handle for the pevent
 *
 * This prints out the stored functions.
 */
624
void tep_print_funcs(struct tep_handle *pevent)
625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654
{
	int i;

	if (!pevent->func_map)
		func_map_init(pevent);

	for (i = 0; i < (int)pevent->func_count; i++) {
		printf("%016llx %s",
		       pevent->func_map[i].addr,
		       pevent->func_map[i].func);
		if (pevent->func_map[i].mod)
			printf(" [%s]\n", pevent->func_map[i].mod);
		else
			printf("\n");
	}
}

struct printk_map {
	unsigned long long		addr;
	char				*printk;
};

struct printk_list {
	struct printk_list	*next;
	unsigned long long	addr;
	char			*printk;
};

static int printk_cmp(const void *a, const void *b)
{
655 656
	const struct printk_map *pa = a;
	const struct printk_map *pb = b;
657

658
	if (pa->addr < pb->addr)
659
		return -1;
660
	if (pa->addr > pb->addr)
661 662 663 664 665
		return 1;

	return 0;
}

666
static int printk_map_init(struct tep_handle *pevent)
667 668 669 670 671 672
{
	struct printk_list *printklist;
	struct printk_list *item;
	struct printk_map *printk_map;
	int i;

673 674 675
	printk_map = malloc(sizeof(*printk_map) * (pevent->printk_count + 1));
	if (!printk_map)
		return -1;
676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692

	printklist = pevent->printklist;

	i = 0;
	while (printklist) {
		printk_map[i].printk = printklist->printk;
		printk_map[i].addr = printklist->addr;
		i++;
		item = printklist;
		printklist = printklist->next;
		free(item);
	}

	qsort(printk_map, pevent->printk_count, sizeof(*printk_map), printk_cmp);

	pevent->printk_map = printk_map;
	pevent->printklist = NULL;
693 694

	return 0;
695 696 697
}

static struct printk_map *
698
find_printk(struct tep_handle *pevent, unsigned long long addr)
699 700 701 702
{
	struct printk_map *printk;
	struct printk_map key;

703 704
	if (!pevent->printk_map && printk_map_init(pevent))
		return NULL;
705 706 707 708 709 710 711 712 713 714

	key.addr = addr;

	printk = bsearch(&key, pevent->printk_map, pevent->printk_count,
			 sizeof(*pevent->printk_map), printk_cmp);

	return printk;
}

/**
715
 * tep_register_print_string - register a string by its address
716 717 718 719 720 721 722
 * @pevent: handle for the pevent
 * @fmt: the string format to register
 * @addr: the address the string was located at
 *
 * This registers a string by the address it was stored in the kernel.
 * The @fmt passed in is duplicated.
 */
723 724
int tep_register_print_string(struct tep_handle *pevent, const char *fmt,
			      unsigned long long addr)
725
{
726
	struct printk_list *item = malloc(sizeof(*item));
727
	char *p;
728

729 730
	if (!item)
		return -1;
731 732 733 734

	item->next = pevent->printklist;
	item->addr = addr;

735 736 737
	/* Strip off quotes and '\n' from the end */
	if (fmt[0] == '"')
		fmt++;
738
	item->printk = strdup(fmt);
739
	if (!item->printk)
740
		goto out_free;
741

742 743 744 745 746 747 748 749
	p = item->printk + strlen(item->printk) - 1;
	if (*p == '"')
		*p = 0;

	p -= 2;
	if (strcmp(p, "\\n") == 0)
		*p = 0;

750
	pevent->printklist = item;
751 752 753
	pevent->printk_count++;

	return 0;
754 755 756 757 758

out_free:
	free(item);
	errno = ENOMEM;
	return -1;
759 760 761
}

/**
762
 * tep_print_printk - print out the stored strings
763 764 765 766
 * @pevent: handle for the pevent
 *
 * This prints the string formats that were stored.
 */
767
void tep_print_printk(struct tep_handle *pevent)
768 769 770 771 772 773 774 775 776 777 778 779 780
{
	int i;

	if (!pevent->printk_map)
		printk_map_init(pevent);

	for (i = 0; i < (int)pevent->printk_count; i++) {
		printf("%016llx %s\n",
		       pevent->printk_map[i].addr,
		       pevent->printk_map[i].printk);
	}
}

781
static struct tep_event *alloc_event(void)
782
{
783
	return calloc(1, sizeof(struct tep_event));
784 785
}

786
static int add_event(struct tep_handle *pevent, struct tep_event *event)
787 788
{
	int i;
789 790
	struct tep_event **events = realloc(pevent->events, sizeof(event) *
					    (pevent->nr_events + 1));
791 792
	if (!events)
		return -1;
793

794
	pevent->events = events;
795 796 797 798 799 800 801 802 803 804 805 806 807 808

	for (i = 0; i < pevent->nr_events; i++) {
		if (pevent->events[i]->id > event->id)
			break;
	}
	if (i < pevent->nr_events)
		memmove(&pevent->events[i + 1],
			&pevent->events[i],
			sizeof(event) * (pevent->nr_events - i));

	pevent->events[i] = event;
	pevent->nr_events++;

	event->pevent = pevent;
809 810

	return 0;
811 812
}

813
static int event_item_type(enum tep_event_type type)
814 815
{
	switch (type) {
816
	case TEP_EVENT_ITEM ... TEP_EVENT_SQUOTE:
817
		return 1;
818
	case TEP_EVENT_ERROR ... TEP_EVENT_DELIM:
819 820 821 822 823
	default:
		return 0;
	}
}

824
static void free_flag_sym(struct tep_print_flag_sym *fsym)
825
{
826
	struct tep_print_flag_sym *next;
827 828 829 830 831 832 833 834 835 836

	while (fsym) {
		next = fsym->next;
		free(fsym->value);
		free(fsym->str);
		free(fsym);
		fsym = next;
	}
}

837
static void free_arg(struct tep_print_arg *arg)
838
{
839
	struct tep_print_arg *farg;
840 841 842 843 844

	if (!arg)
		return;

	switch (arg->type) {
845
	case TEP_PRINT_ATOM:
846 847
		free(arg->atom.atom);
		break;
848
	case TEP_PRINT_FIELD:
849 850
		free(arg->field.name);
		break;
851
	case TEP_PRINT_FLAGS:
852 853 854 855
		free_arg(arg->flags.field);
		free(arg->flags.delim);
		free_flag_sym(arg->flags.flags);
		break;
856
	case TEP_PRINT_SYMBOL:
857 858 859
		free_arg(arg->symbol.field);
		free_flag_sym(arg->symbol.symbols);
		break;
860 861
	case TEP_PRINT_HEX:
	case TEP_PRINT_HEX_STR:
862 863 864
		free_arg(arg->hex.field);
		free_arg(arg->hex.size);
		break;
865
	case TEP_PRINT_INT_ARRAY:
866 867 868 869
		free_arg(arg->int_array.field);
		free_arg(arg->int_array.count);
		free_arg(arg->int_array.el_size);
		break;
870
	case TEP_PRINT_TYPE:
871 872 873
		free(arg->typecast.type);
		free_arg(arg->typecast.item);
		break;
874 875
	case TEP_PRINT_STRING:
	case TEP_PRINT_BSTRING:
876 877
		free(arg->string.string);
		break;
878
	case TEP_PRINT_BITMASK:
879 880
		free(arg->bitmask.bitmask);
		break;
881 882
	case TEP_PRINT_DYNAMIC_ARRAY:
	case TEP_PRINT_DYNAMIC_ARRAY_LEN:
883 884
		free(arg->dynarray.index);
		break;
885
	case TEP_PRINT_OP:
886 887 888 889
		free(arg->op.op);
		free_arg(arg->op.left);
		free_arg(arg->op.right);
		break;
890
	case TEP_PRINT_FUNC:
891 892 893 894 895 896 897
		while (arg->func.args) {
			farg = arg->func.args;
			arg->func.args = farg->next;
			free_arg(farg);
		}
		break;

898
	case TEP_PRINT_NULL:
899 900 901 902 903 904 905
	default:
		break;
	}

	free(arg);
}

906
static enum tep_event_type get_type(int ch)
907 908
{
	if (ch == '\n')
909
		return TEP_EVENT_NEWLINE;
910
	if (isspace(ch))
911
		return TEP_EVENT_SPACE;
912
	if (isalnum(ch) || ch == '_')
913
		return TEP_EVENT_ITEM;
914
	if (ch == '\'')
915
		return TEP_EVENT_SQUOTE;
916
	if (ch == '"')
917
		return TEP_EVENT_DQUOTE;
918
	if (!isprint(ch))
919
		return TEP_EVENT_NONE;
920
	if (ch == '(' || ch == ')' || ch == ',')
921
		return TEP_EVENT_DELIM;
922

923
	return TEP_EVENT_OP;
924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942
}

static int __read_char(void)
{
	if (input_buf_ptr >= input_buf_siz)
		return -1;

	return input_buf[input_buf_ptr++];
}

static int __peek_char(void)
{
	if (input_buf_ptr >= input_buf_siz)
		return -1;

	return input_buf[input_buf_ptr];
}

/**
943
 * tep_peek_char - peek at the next character that will be read
944 945 946
 *
 * Returns the next character read, or -1 if end of buffer.
 */
947
int tep_peek_char(void)
948 949 950 951
{
	return __peek_char();
}

952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970
static int extend_token(char **tok, char *buf, int size)
{
	char *newtok = realloc(*tok, size);

	if (!newtok) {
		free(*tok);
		*tok = NULL;
		return -1;
	}

	if (!*tok)
		strcpy(newtok, buf);
	else
		strcat(newtok, buf);
	*tok = newtok;

	return 0;
}

971
static enum tep_event_type force_token(const char *str, char **tok);
972

973
static enum tep_event_type __read_token(char **tok)
974 975 976 977 978
{
	char buf[BUFSIZ];
	int ch, last_ch, quote_ch, next_ch;
	int i = 0;
	int tok_size = 0;
979
	enum tep_event_type type;
980 981 982 983 984 985

	*tok = NULL;


	ch = __read_char();
	if (ch < 0)
986
		return TEP_EVENT_NONE;
987 988

	type = get_type(ch);
989
	if (type == TEP_EVENT_NONE)
990 991 992 993 994
		return type;

	buf[i++] = ch;

	switch (type) {
995 996
	case TEP_EVENT_NEWLINE:
	case TEP_EVENT_DELIM:
997
		if (asprintf(tok, "%c", ch) < 0)
998
			return TEP_EVENT_ERROR;
999

1000 1001
		return type;

1002
	case TEP_EVENT_OP:
1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044
		switch (ch) {
		case '-':
			next_ch = __peek_char();
			if (next_ch == '>') {
				buf[i++] = __read_char();
				break;
			}
			/* fall through */
		case '+':
		case '|':
		case '&':
		case '>':
		case '<':
			last_ch = ch;
			ch = __peek_char();
			if (ch != last_ch)
				goto test_equal;
			buf[i++] = __read_char();
			switch (last_ch) {
			case '>':
			case '<':
				goto test_equal;
			default:
				break;
			}
			break;
		case '!':
		case '=':
			goto test_equal;
		default: /* what should we do instead? */
			break;
		}
		buf[i] = 0;
		*tok = strdup(buf);
		return type;

 test_equal:
		ch = __peek_char();
		if (ch == '=')
			buf[i++] = __read_char();
		goto out;

1045 1046
	case TEP_EVENT_DQUOTE:
	case TEP_EVENT_SQUOTE:
1047 1048 1049 1050 1051 1052 1053 1054 1055
		/* don't keep quotes */
		i--;
		quote_ch = ch;
		last_ch = 0;
 concat:
		do {
			if (i == (BUFSIZ - 1)) {
				buf[i] = 0;
				tok_size += BUFSIZ;
1056 1057

				if (extend_token(tok, buf, tok_size) < 0)
1058
					return TEP_EVENT_NONE;
1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074
				i = 0;
			}
			last_ch = ch;
			ch = __read_char();
			buf[i++] = ch;
			/* the '\' '\' will cancel itself */
			if (ch == '\\' && last_ch == '\\')
				last_ch = 0;
		} while (ch != quote_ch || last_ch == '\\');
		/* remove the last quote */
		i--;

		/*
		 * For strings (double quotes) check the next token.
		 * If it is another string, concatinate the two.
		 */
1075
		if (type == TEP_EVENT_DQUOTE) {
1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087
			unsigned long long save_input_buf_ptr = input_buf_ptr;

			do {
				ch = __read_char();
			} while (isspace(ch));
			if (ch == '"')
				goto concat;
			input_buf_ptr = save_input_buf_ptr;
		}

		goto out;

1088 1089
	case TEP_EVENT_ERROR ... TEP_EVENT_SPACE:
	case TEP_EVENT_ITEM:
1090 1091 1092 1093 1094 1095 1096
	default:
		break;
	}

	while (get_type(__peek_char()) == type) {
		if (i == (BUFSIZ - 1)) {
			buf[i] = 0;
1097
			tok_size += BUFSIZ;
1098

1099
			if (extend_token(tok, buf, tok_size) < 0)
1100
				return TEP_EVENT_NONE;
1101 1102 1103 1104 1105 1106 1107 1108
			i = 0;
		}
		ch = __read_char();
		buf[i++] = ch;
	}

 out:
	buf[i] = 0;
1109
	if (extend_token(tok, buf, tok_size + i + 1) < 0)
1110
		return TEP_EVENT_NONE;
1111

1112
	if (type == TEP_EVENT_ITEM) {
1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123
		/*
		 * Older versions of the kernel has a bug that
		 * creates invalid symbols and will break the mac80211
		 * parsing. This is a work around to that bug.
		 *
		 * See Linux kernel commit:
		 *  811cb50baf63461ce0bdb234927046131fc7fa8b
		 */
		if (strcmp(*tok, "LOCAL_PR_FMT") == 0) {
			free(*tok);
			*tok = NULL;
1124
			return force_token("\"%s\" ", tok);
1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138
		} else if (strcmp(*tok, "STA_PR_FMT") == 0) {
			free(*tok);
			*tok = NULL;
			return force_token("\" sta:%pM\" ", tok);
		} else if (strcmp(*tok, "VIF_PR_FMT") == 0) {
			free(*tok);
			*tok = NULL;
			return force_token("\" vif:%p(%d)\" ", tok);
		}
	}

	return type;
}

1139
static enum tep_event_type force_token(const char *str, char **tok)
1140 1141 1142 1143
{
	const char *save_input_buf;
	unsigned long long save_input_buf_ptr;
	unsigned long long save_input_buf_siz;
1144
	enum tep_event_type type;
1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168
	
	/* save off the current input pointers */
	save_input_buf = input_buf;
	save_input_buf_ptr = input_buf_ptr;
	save_input_buf_siz = input_buf_siz;

	init_input_buf(str, strlen(str));

	type = __read_token(tok);

	/* reset back to original token */
	input_buf = save_input_buf;
	input_buf_ptr = save_input_buf_ptr;
	input_buf_siz = save_input_buf_siz;

	return type;
}

static void free_token(char *tok)
{
	if (tok)
		free(tok);
}

1169
static enum tep_event_type read_token(char **tok)
1170
{
1171
	enum tep_event_type type;
1172 1173 1174

	for (;;) {
		type = __read_token(tok);
1175
		if (type != TEP_EVENT_SPACE)
1176 1177 1178 1179 1180 1181 1182
			return type;

		free_token(*tok);
	}

	/* not reached */
	*tok = NULL;
1183
	return TEP_EVENT_NONE;
1184 1185 1186
}

/**
1187
 * tep_read_token - access to utilities to use the pevent parser
1188 1189 1190
 * @tok: The token to return
 *
 * This will parse tokens from the string given by
1191
 * tep_init_data().
1192 1193 1194
 *
 * Returns the token type.
 */
1195
enum tep_event_type tep_read_token(char **tok)
1196 1197 1198 1199 1200
{
	return read_token(tok);
}

/**
1201
 * tep_free_token - free a token returned by tep_read_token
1202 1203
 * @token: the token to free
 */
1204
void tep_free_token(char *token)
1205 1206 1207 1208 1209
{
	free_token(token);
}

/* no newline */
1210
static enum tep_event_type read_token_item(char **tok)
1211
{
1212
	enum tep_event_type type;
1213 1214 1215

	for (;;) {
		type = __read_token(tok);
1216
		if (type != TEP_EVENT_SPACE && type != TEP_EVENT_NEWLINE)
1217 1218 1219 1220 1221 1222 1223
			return type;
		free_token(*tok);
		*tok = NULL;
	}

	/* not reached */
	*tok = NULL;
1224
	return TEP_EVENT_NONE;
1225 1226
}

1227
static int test_type(enum tep_event_type type, enum tep_event_type expect)
1228 1229 1230 1231 1232 1233 1234 1235 1236
{
	if (type != expect) {
		do_warning("Error: expected type %d but read %d",
		    expect, type);
		return -1;
	}
	return 0;
}

1237 1238
static int test_type_token(enum tep_event_type type, const char *token,
		    enum tep_event_type expect, const char *expect_tok)
1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253
{
	if (type != expect) {
		do_warning("Error: expected type %d but read %d",
		    expect, type);
		return -1;
	}

	if (strcmp(token, expect_tok) != 0) {
		do_warning("Error: expected '%s' but read '%s'",
		    expect_tok, token);
		return -1;
	}
	return 0;
}

1254
static int __read_expect_type(enum tep_event_type expect, char **tok, int newline_ok)
1255
{
1256
	enum tep_event_type type;
1257 1258 1259 1260 1261 1262 1263 1264

	if (newline_ok)
		type = read_token(tok);
	else
		type = read_token_item(tok);
	return test_type(type, expect);
}

1265
static int read_expect_type(enum tep_event_type expect, char **tok)
1266 1267 1268 1269
{
	return __read_expect_type(expect, tok, 1);
}

1270
static int __read_expected(enum tep_event_type expect, const char *str,
1271 1272
			   int newline_ok)
{
1273
	enum tep_event_type type;
1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288
	char *token;
	int ret;

	if (newline_ok)
		type = read_token(&token);
	else
		type = read_token_item(&token);

	ret = test_type_token(type, token, expect, str);

	free_token(token);

	return ret;
}

1289
static int read_expected(enum tep_event_type expect, const char *str)
1290 1291 1292 1293
{
	return __read_expected(expect, str, 1);
}

1294
static int read_expected_item(enum tep_event_type expect, const char *str)
1295 1296 1297 1298 1299 1300 1301 1302
{
	return __read_expected(expect, str, 0);
}

static char *event_read_name(void)
{
	char *token;

1303
	if (read_expected(TEP_EVENT_ITEM, "name") < 0)
1304 1305
		return NULL;

1306
	if (read_expected(TEP_EVENT_OP, ":") < 0)
1307 1308
		return NULL;

1309
	if (read_expect_type(TEP_EVENT_ITEM, &token) < 0)
1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323
		goto fail;

	return token;

 fail:
	free_token(token);
	return NULL;
}

static int event_read_id(void)
{
	char *token;
	int id;

1324
	if (read_expected_item(TEP_EVENT_ITEM, "ID") < 0)
1325 1326
		return -1;

1327
	if (read_expected(TEP_EVENT_OP, ":") < 0)
1328 1329
		return -1;

1330
	if (read_expect_type(TEP_EVENT_ITEM, &token) < 0)
1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341
		goto fail;

	id = strtoul(token, NULL, 0);
	free_token(token);
	return id;

 fail:
	free_token(token);
	return -1;
}

1342
static int field_is_string(struct tep_format_field *field)
1343
{
1344
	if ((field->flags & TEP_FIELD_IS_ARRAY) &&
1345 1346 1347 1348 1349 1350 1351
	    (strstr(field->type, "char") || strstr(field->type, "u8") ||
	     strstr(field->type, "s8")))
		return 1;

	return 0;
}

1352
static int field_is_dynamic(struct tep_format_field *field)
1353 1354 1355 1356 1357 1358 1359
{
	if (strncmp(field->type, "__data_loc", 10) == 0)
		return 1;

	return 0;
}

1360
static int field_is_long(struct tep_format_field *field)
1361 1362 1363 1364 1365 1366 1367 1368
{
	/* includes long long */
	if (strstr(field->type, "long"))
		return 1;

	return 0;
}

1369 1370
static unsigned int type_size(const char *name)
{
1371
	/* This covers all TEP_FIELD_IS_STRING types. */
1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396
	static struct {
		const char *type;
		unsigned int size;
	} table[] = {
		{ "u8",   1 },
		{ "u16",  2 },
		{ "u32",  4 },
		{ "u64",  8 },
		{ "s8",   1 },
		{ "s16",  2 },
		{ "s32",  4 },
		{ "s64",  8 },
		{ "char", 1 },
		{ },
	};
	int i;

	for (i = 0; table[i].type; i++) {
		if (!strcmp(table[i].type, name))
			return table[i].size;
	}

	return 0;
}

1397
static int event_read_fields(struct tep_event *event, struct tep_format_field **fields)
1398
{
1399
	struct tep_format_field *field = NULL;
1400
	enum tep_event_type type;
1401 1402 1403 1404 1405
	char *token;
	char *last_token;
	int count = 0;

	do {
1406 1407
		unsigned int size_dynamic = 0;

1408
		type = read_token(&token);
1409
		if (type == TEP_EVENT_NEWLINE) {
1410 1411 1412 1413 1414 1415
			free_token(token);
			return count;
		}

		count++;

1416
		if (test_type_token(type, token, TEP_EVENT_ITEM, "field"))
1417 1418 1419 1420 1421 1422 1423 1424
			goto fail;
		free_token(token);

		type = read_token(&token);
		/*
		 * The ftrace fields may still use the "special" name.
		 * Just ignore it.
		 */
1425
		if (event->flags & TEP_EVENT_FL_ISFTRACE &&
1426
		    type == TEP_EVENT_ITEM && strcmp(token, "special") == 0) {
1427 1428 1429 1430
			free_token(token);
			type = read_token(&token);
		}

1431
		if (test_type_token(type, token, TEP_EVENT_OP, ":") < 0)
1432 1433 1434
			goto fail;

		free_token(token);
1435
		if (read_expect_type(TEP_EVENT_ITEM, &token) < 0)
1436 1437 1438 1439
			goto fail;

		last_token = token;

1440 1441 1442 1443
		field = calloc(1, sizeof(*field));
		if (!field)
			goto fail;

1444 1445 1446 1447 1448
		field->event = event;

		/* read the rest of the type */
		for (;;) {
			type = read_token(&token);
1449 1450
			if (type == TEP_EVENT_ITEM ||
			    (type == TEP_EVENT_OP && strcmp(token, "*") == 0) ||
1451 1452 1453 1454
			    /*
			     * Some of the ftrace fields are broken and have
			     * an illegal "." in them.
			     */
1455
			    (event->flags & TEP_EVENT_FL_ISFTRACE &&
1456
			     type == TEP_EVENT_OP && strcmp(token, ".") == 0)) {
1457 1458

				if (strcmp(token, "*") == 0)
1459
					field->flags |= TEP_FIELD_IS_POINTER;
1460 1461

				if (field->type) {
1462 1463 1464 1465 1466 1467 1468 1469 1470
					char *new_type;
					new_type = realloc(field->type,
							   strlen(field->type) +
							   strlen(last_token) + 2);
					if (!new_type) {
						free(last_token);
						goto fail;
					}
					field->type = new_type;
1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483
					strcat(field->type, " ");
					strcat(field->type, last_token);
					free(last_token);
				} else
					field->type = last_token;
				last_token = token;
				continue;
			}

			break;
		}

		if (!field->type) {
1484
			do_warning_event(event, "%s: no type found", __func__);
1485 1486
			goto fail;
		}
1487
		field->name = field->alias = last_token;
1488

1489
		if (test_type(type, TEP_EVENT_OP))
1490 1491 1492
			goto fail;

		if (strcmp(token, "[") == 0) {
1493
			enum tep_event_type last_type = type;
1494
			char *brackets = token;
1495
			char *new_brackets;
1496 1497
			int len;

1498
			field->flags |= TEP_FIELD_IS_ARRAY;
1499 1500 1501

			type = read_token(&token);

1502
			if (type == TEP_EVENT_ITEM)
1503 1504 1505 1506 1507
				field->arraylen = strtoul(token, NULL, 0);
			else
				field->arraylen = 0;

		        while (strcmp(token, "]") != 0) {
1508 1509
				if (last_type == TEP_EVENT_ITEM &&
				    type == TEP_EVENT_ITEM)
1510 1511 1512 1513 1514
					len = 2;
				else
					len = 1;
				last_type = type;

1515 1516 1517 1518 1519 1520 1521 1522
				new_brackets = realloc(brackets,
						       strlen(brackets) +
						       strlen(token) + len);
				if (!new_brackets) {
					free(brackets);
					goto fail;
				}
				brackets = new_brackets;
1523 1524 1525 1526 1527 1528 1529
				if (len == 2)
					strcat(brackets, " ");
				strcat(brackets, token);
				/* We only care about the last token */
				field->arraylen = strtoul(token, NULL, 0);
				free_token(token);
				type = read_token(&token);
1530
				if (type == TEP_EVENT_NONE) {
1531
					do_warning_event(event, "failed to find token");
1532 1533 1534 1535 1536 1537
					goto fail;
				}
			}

			free_token(token);

1538 1539 1540 1541 1542 1543
			new_brackets = realloc(brackets, strlen(brackets) + 2);
			if (!new_brackets) {
				free(brackets);
				goto fail;
			}
			brackets = new_brackets;
1544 1545 1546 1547 1548 1549 1550 1551 1552
			strcat(brackets, "]");

			/* add brackets to type */

			type = read_token(&token);
			/*
			 * If the next token is not an OP, then it is of
			 * the format: type [] item;
			 */
1553
			if (type == TEP_EVENT_ITEM) {
1554 1555 1556 1557 1558 1559 1560 1561 1562 1563
				char *new_type;
				new_type = realloc(field->type,
						   strlen(field->type) +
						   strlen(field->name) +
						   strlen(brackets) + 2);
				if (!new_type) {
					free(brackets);
					goto fail;
				}
				field->type = new_type;
1564 1565
				strcat(field->type, " ");
				strcat(field->type, field->name);
1566
				size_dynamic = type_size(field->name);
1567 1568
				free_token(field->name);
				strcat(field->type, brackets);
1569
				field->name = field->alias = token;
1570 1571
				type = read_token(&token);
			} else {
1572 1573 1574 1575 1576 1577 1578 1579 1580
				char *new_type;
				new_type = realloc(field->type,
						   strlen(field->type) +
						   strlen(brackets) + 1);
				if (!new_type) {
					free(brackets);
					goto fail;
				}
				field->type = new_type;
1581 1582 1583 1584 1585 1586
				strcat(field->type, brackets);
			}
			free(brackets);
		}

		if (field_is_string(field))
1587
			field->flags |= TEP_FIELD_IS_STRING;
1588
		if (field_is_dynamic(field))
1589
			field->flags |= TEP_FIELD_IS_DYNAMIC;
1590
		if (field_is_long(field))
1591
			field->flags |= TEP_FIELD_IS_LONG;
1592

1593
		if (test_type_token(type, token,  TEP_EVENT_OP, ";"))
1594 1595 1596
			goto fail;
		free_token(token);

1597
		if (read_expected(TEP_EVENT_ITEM, "offset") < 0)
1598 1599
			goto fail_expect;

1600
		if (read_expected(TEP_EVENT_OP, ":") < 0)
1601 1602
			goto fail_expect;

1603
		if (read_expect_type(TEP_EVENT_ITEM, &token))
1604 1605 1606 1607
			goto fail;
		field->offset = strtoul(token, NULL, 0);
		free_token(token);

1608
		if (read_expected(TEP_EVENT_OP, ";") < 0)
1609 1610
			goto fail_expect;

1611
		if (read_expected(TEP_EVENT_ITEM, "size") < 0)
1612 1613
			goto fail_expect;

1614
		if (read_expected(TEP_EVENT_OP, ":") < 0)
1615 1616
			goto fail_expect;

1617
		if (read_expect_type(TEP_EVENT_ITEM, &token))
1618 1619 1620 1621
			goto fail;
		field->size = strtoul(token, NULL, 0);
		free_token(token);

1622
		if (read_expected(TEP_EVENT_OP, ";") < 0)
1623 1624 1625
			goto fail_expect;

		type = read_token(&token);
1626
		if (type != TEP_EVENT_NEWLINE) {
1627
			/* newer versions of the kernel have a "signed" type */
1628
			if (test_type_token(type, token, TEP_EVENT_ITEM, "signed"))
1629 1630 1631 1632
				goto fail;

			free_token(token);

1633
			if (read_expected(TEP_EVENT_OP, ":") < 0)
1634 1635
				goto fail_expect;

1636
			if (read_expect_type(TEP_EVENT_ITEM, &token))
1637 1638
				goto fail;

1639
			if (strtoul(token, NULL, 0))
1640
				field->flags |= TEP_FIELD_IS_SIGNED;
1641 1642

			free_token(token);
1643
			if (read_expected(TEP_EVENT_OP, ";") < 0)
1644 1645
				goto fail_expect;

1646
			if (read_expect_type(TEP_EVENT_NEWLINE, &token))
1647 1648 1649 1650 1651
				goto fail;
		}

		free_token(token);

1652
		if (field->flags & TEP_FIELD_IS_ARRAY) {
1653 1654
			if (field->arraylen)
				field->elementsize = field->size / field->arraylen;
1655
			else if (field->flags & TEP_FIELD_IS_DYNAMIC)
1656
				field->elementsize = size_dynamic;
1657
			else if (field->flags & TEP_FIELD_IS_STRING)
1658
				field->elementsize = 1;
1659
			else if (field->flags & TEP_FIELD_IS_LONG)
1660 1661 1662
				field->elementsize = event->pevent ?
						     event->pevent->long_size :
						     sizeof(long);
1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675
		} else
			field->elementsize = field->size;

		*fields = field;
		fields = &field->next;

	} while (1);

	return 0;

fail:
	free_token(token);
fail_expect:
1676 1677 1678
	if (field) {
		free(field->type);
		free(field->name);
1679
		free(field);
1680
	}
1681 1682 1683
	return -1;
}

1684
static int event_read_format(struct tep_event *event)
1685 1686 1687 1688
{
	char *token;
	int ret;

1689
	if (read_expected_item(TEP_EVENT_ITEM, "format") < 0)
1690 1691
		return -1;

1692
	if (read_expected(TEP_EVENT_OP, ":") < 0)
1693 1694
		return -1;

1695
	if (read_expect_type(TEP_EVENT_NEWLINE, &token))
1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715
		goto fail;
	free_token(token);

	ret = event_read_fields(event, &event->format.common_fields);
	if (ret < 0)
		return ret;
	event->format.nr_common = ret;

	ret = event_read_fields(event, &event->format.fields);
	if (ret < 0)
		return ret;
	event->format.nr_fields = ret;

	return 0;

 fail:
	free_token(token);
	return -1;
}

1716
static enum tep_event_type
1717
process_arg_token(struct tep_event *event, struct tep_print_arg *arg,
1718
		  char **tok, enum tep_event_type type);
1719

1720
static enum tep_event_type
1721
process_arg(struct tep_event *event, struct tep_print_arg *arg, char **tok)
1722
{
1723
	enum tep_event_type type;
1724 1725 1726 1727 1728 1729 1730 1731
	char *token;

	type = read_token(&token);
	*tok = token;

	return process_arg_token(event, arg, tok, type);
}

1732
static enum tep_event_type
1733
process_op(struct tep_event *event, struct tep_print_arg *arg, char **tok);
1734

1735 1736 1737 1738
/*
 * For __print_symbolic() and __print_flags, we need to completely
 * evaluate the first argument, which defines what to print next.
 */
1739
static enum tep_event_type
1740
process_field_arg(struct tep_event *event, struct tep_print_arg *arg, char **tok)
1741
{
1742
	enum tep_event_type type;
1743 1744 1745

	type = process_arg(event, arg, tok);

1746
	while (type == TEP_EVENT_OP) {
1747 1748 1749 1750 1751 1752
		type = process_op(event, arg, tok);
	}

	return type;
}

1753
static enum tep_event_type
1754
process_cond(struct tep_event *event, struct tep_print_arg *top, char **tok)
1755
{
1756
	struct tep_print_arg *arg, *left, *right;
1757
	enum tep_event_type type;
1758 1759 1760 1761 1762 1763
	char *token = NULL;

	arg = alloc_arg();
	left = alloc_arg();
	right = alloc_arg();

1764
	if (!arg || !left || !right) {
1765
		do_warning_event(event, "%s: not enough memory!", __func__);
1766 1767 1768 1769 1770 1771
		/* arg will be freed at out_free */
		free_arg(left);
		free_arg(right);
		goto out_free;
	}

1772
	arg->type = TEP_PRINT_OP;
1773 1774 1775 1776 1777 1778 1779
	arg->op.left = left;
	arg->op.right = right;

	*tok = NULL;
	type = process_arg(event, left, &token);

 again:
1780
	if (type == TEP_EVENT_ERROR)
1781 1782
		goto out_free;

1783
	/* Handle other operations in the arguments */
1784
	if (type == TEP_EVENT_OP && strcmp(token, ":") != 0) {
1785 1786 1787 1788
		type = process_op(event, left, &token);
		goto again;
	}

1789
	if (test_type_token(type, token, TEP_EVENT_OP, ":"))
1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805
		goto out_free;

	arg->op.op = token;

	type = process_arg(event, right, &token);

	top->op.right = arg;

	*tok = token;
	return type;

out_free:
	/* Top may point to itself */
	top->op.right = NULL;
	free_token(token);
	free_arg(arg);
1806
	return TEP_EVENT_ERROR;
1807 1808
}

1809
static enum tep_event_type
1810
process_array(struct tep_event *event, struct tep_print_arg *top, char **tok)
1811
{
1812
	struct tep_print_arg *arg;
1813
	enum tep_event_type type;
1814 1815 1816
	char *token = NULL;

	arg = alloc_arg();
1817
	if (!arg) {
1818
		do_warning_event(event, "%s: not enough memory!", __func__);
1819 1820
		/* '*tok' is set to top->op.op.  No need to free. */
		*tok = NULL;
1821
		return TEP_EVENT_ERROR;
1822
	}
1823 1824 1825

	*tok = NULL;
	type = process_arg(event, arg, &token);
1826
	if (test_type_token(type, token, TEP_EVENT_OP, "]"))
1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837
		goto out_free;

	top->op.right = arg;

	free_token(token);
	type = read_token_item(&token);
	*tok = token;

	return type;

out_free:
1838
	free_token(token);
1839
	free_arg(arg);
1840
	return TEP_EVENT_ERROR;
1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870
}

static int get_op_prio(char *op)
{
	if (!op[1]) {
		switch (op[0]) {
		case '~':
		case '!':
			return 4;
		case '*':
		case '/':
		case '%':
			return 6;
		case '+':
		case '-':
			return 7;
			/* '>>' and '<<' are 8 */
		case '<':
		case '>':
			return 9;
			/* '==' and '!=' are 10 */
		case '&':
			return 11;
		case '^':
			return 12;
		case '|':
			return 13;
		case '?':
			return 16;
		default:
1871
			do_warning("unknown op '%c'", op[0]);
1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891
			return -1;
		}
	} else {
		if (strcmp(op, "++") == 0 ||
		    strcmp(op, "--") == 0) {
			return 3;
		} else if (strcmp(op, ">>") == 0 ||
			   strcmp(op, "<<") == 0) {
			return 8;
		} else if (strcmp(op, ">=") == 0 ||
			   strcmp(op, "<=") == 0) {
			return 9;
		} else if (strcmp(op, "==") == 0 ||
			   strcmp(op, "!=") == 0) {
			return 10;
		} else if (strcmp(op, "&&") == 0) {
			return 14;
		} else if (strcmp(op, "||") == 0) {
			return 15;
		} else {
1892
			do_warning("unknown op '%s'", op);
1893 1894 1895 1896 1897
			return -1;
		}
	}
}

1898
static int set_op_prio(struct tep_print_arg *arg)
1899 1900 1901
{

	/* single ops are the greatest */
1902
	if (!arg->op.left || arg->op.left->type == TEP_PRINT_NULL)
1903
		arg->op.prio = 0;
1904 1905
	else
		arg->op.prio = get_op_prio(arg->op.op);
1906

1907
	return arg->op.prio;
1908 1909 1910
}

/* Note, *tok does not get freed, but will most likely be saved */
1911
static enum tep_event_type
1912
process_op(struct tep_event *event, struct tep_print_arg *arg, char **tok)
1913
{
1914
	struct tep_print_arg *left, *right = NULL;
1915
	enum tep_event_type type;
1916 1917 1918 1919 1920
	char *token;

	/* the op is passed in via tok */
	token = *tok;

1921
	if (arg->type == TEP_PRINT_OP && !arg->op.left) {
1922 1923
		/* handle single op */
		if (token[1]) {
1924
			do_warning_event(event, "bad op token %s", token);
1925 1926 1927 1928 1929 1930 1931 1932 1933
			goto out_free;
		}
		switch (token[0]) {
		case '~':
		case '!':
		case '+':
		case '-':
			break;
		default:
1934
			do_warning_event(event, "bad op token %s", token);
1935 1936 1937 1938 1939 1940
			goto out_free;

		}

		/* make an empty left */
		left = alloc_arg();
1941 1942 1943
		if (!left)
			goto out_warn_free;

1944
		left->type = TEP_PRINT_NULL;
1945 1946 1947
		arg->op.left = left;

		right = alloc_arg();
1948 1949 1950
		if (!right)
			goto out_warn_free;

1951 1952 1953 1954 1955 1956 1957 1958 1959
		arg->op.right = right;

		/* do not free the token, it belongs to an op */
		*tok = NULL;
		type = process_arg(event, right, tok);

	} else if (strcmp(token, "?") == 0) {

		left = alloc_arg();
1960 1961 1962
		if (!left)
			goto out_warn_free;

1963 1964 1965
		/* copy the top arg to the left */
		*left = *arg;

1966
		arg->type = TEP_PRINT_OP;
1967 1968 1969 1970
		arg->op.op = token;
		arg->op.left = left;
		arg->op.prio = 0;

1971
		/* it will set arg->op.right */
1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984
		type = process_cond(event, arg, tok);

	} else if (strcmp(token, ">>") == 0 ||
		   strcmp(token, "<<") == 0 ||
		   strcmp(token, "&") == 0 ||
		   strcmp(token, "|") == 0 ||
		   strcmp(token, "&&") == 0 ||
		   strcmp(token, "||") == 0 ||
		   strcmp(token, "-") == 0 ||
		   strcmp(token, "+") == 0 ||
		   strcmp(token, "*") == 0 ||
		   strcmp(token, "^") == 0 ||
		   strcmp(token, "/") == 0 ||
1985
		   strcmp(token, "%") == 0 ||
1986 1987
		   strcmp(token, "<") == 0 ||
		   strcmp(token, ">") == 0 ||
1988 1989
		   strcmp(token, "<=") == 0 ||
		   strcmp(token, ">=") == 0 ||
1990 1991 1992 1993
		   strcmp(token, "==") == 0 ||
		   strcmp(token, "!=") == 0) {

		left = alloc_arg();
1994 1995
		if (!left)
			goto out_warn_free;
1996 1997 1998 1999

		/* copy the top arg to the left */
		*left = *arg;

2000
		arg->type = TEP_PRINT_OP;
2001 2002
		arg->op.op = token;
		arg->op.left = left;
2003
		arg->op.right = NULL;
2004

2005
		if (set_op_prio(arg) == -1) {
2006
			event->flags |= TEP_EVENT_FL_FAILED;
2007 2008
			/* arg->op.op (= token) will be freed at out_free */
			arg->op.op = NULL;
2009 2010
			goto out_free;
		}
2011 2012 2013 2014 2015 2016

		type = read_token_item(&token);
		*tok = token;

		/* could just be a type pointer */
		if ((strcmp(arg->op.op, "*") == 0) &&
2017
		    type == TEP_EVENT_DELIM && (strcmp(token, ")") == 0)) {
2018 2019
			char *new_atom;

2020
			if (left->type != TEP_PRINT_ATOM) {
2021
				do_warning_event(event, "bad pointer type");
2022 2023
				goto out_free;
			}
2024
			new_atom = realloc(left->atom.atom,
2025
					    strlen(left->atom.atom) + 3);
2026
			if (!new_atom)
2027
				goto out_warn_free;
2028 2029

			left->atom.atom = new_atom;
2030 2031 2032 2033 2034 2035 2036 2037 2038
			strcat(left->atom.atom, " *");
			free(arg->op.op);
			*arg = *left;
			free(left);

			return type;
		}

		right = alloc_arg();
2039 2040 2041
		if (!right)
			goto out_warn_free;

2042
		type = process_arg_token(event, right, tok, type);
2043
		if (type == TEP_EVENT_ERROR) {
2044 2045 2046 2047 2048
			free_arg(right);
			/* token was freed in process_arg_token() via *tok */
			token = NULL;
			goto out_free;
		}
2049

2050
		if (right->type == TEP_PRINT_OP &&
2051
		    get_op_prio(arg->op.op) < get_op_prio(right->op.op)) {
2052
			struct tep_print_arg tmp;
2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064

			/* rotate ops according to the priority */
			arg->op.right = right->op.left;

			tmp = *arg;
			*arg = *right;
			*right = tmp;

			arg->op.left = right;
		} else {
			arg->op.right = right;
		}
2065 2066 2067 2068

	} else if (strcmp(token, "[") == 0) {

		left = alloc_arg();
2069 2070 2071
		if (!left)
			goto out_warn_free;

2072 2073
		*left = *arg;

2074
		arg->type = TEP_PRINT_OP;
2075 2076 2077 2078 2079
		arg->op.op = token;
		arg->op.left = left;

		arg->op.prio = 0;

2080
		/* it will set arg->op.right */
2081 2082 2083
		type = process_array(event, arg, tok);

	} else {
2084
		do_warning_event(event, "unknown op '%s'", token);
2085
		event->flags |= TEP_EVENT_FL_FAILED;
2086 2087 2088 2089
		/* the arg is now the left side */
		goto out_free;
	}

2090
	if (type == TEP_EVENT_OP && strcmp(*tok, ":") != 0) {
2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103
		int prio;

		/* higher prios need to be closer to the root */
		prio = get_op_prio(*tok);

		if (prio > arg->op.prio)
			return process_op(event, arg, tok);

		return process_op(event, right, tok);
	}

	return type;

2104
out_warn_free:
2105
	do_warning_event(event, "%s: not enough memory!", __func__);
2106
out_free:
2107 2108
	free_token(token);
	*tok = NULL;
2109
	return TEP_EVENT_ERROR;
2110 2111
}

2112
static enum tep_event_type
2113
process_entry(struct tep_event *event __maybe_unused, struct tep_print_arg *arg,
2114 2115
	      char **tok)
{
2116
	enum tep_event_type type;
2117 2118 2119
	char *field;
	char *token;

2120
	if (read_expected(TEP_EVENT_OP, "->") < 0)
2121 2122
		goto out_err;

2123
	if (read_expect_type(TEP_EVENT_ITEM, &token) < 0)
2124 2125 2126
		goto out_free;
	field = token;

2127
	arg->type = TEP_PRINT_FIELD;
2128 2129
	arg->field.name = field;

2130
	if (is_flag_field) {
2131
		arg->field.field = tep_find_any_field(event, arg->field.name);
2132
		arg->field.field->flags |= TEP_FIELD_IS_FLAG;
2133 2134
		is_flag_field = 0;
	} else if (is_symbolic_field) {
2135
		arg->field.field = tep_find_any_field(event, arg->field.name);
2136
		arg->field.field->flags |= TEP_FIELD_IS_SYMBOLIC;
2137 2138 2139
		is_symbolic_field = 0;
	}

2140 2141 2142 2143 2144 2145 2146 2147 2148
	type = read_token(&token);
	*tok = token;

	return type;

 out_free:
	free_token(token);
 out_err:
	*tok = NULL;
2149
	return TEP_EVENT_ERROR;
2150 2151
}

2152
static int alloc_and_process_delim(struct tep_event *event, char *next_token,
2153
				   struct tep_print_arg **print_arg)
2154
{
2155
	struct tep_print_arg *field;
2156
	enum tep_event_type type;
2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168
	char *token;
	int ret = 0;

	field = alloc_arg();
	if (!field) {
		do_warning_event(event, "%s: not enough memory!", __func__);
		errno = ENOMEM;
		return -1;
	}

	type = process_arg(event, field, &token);

2169
	if (test_type_token(type, token, TEP_EVENT_DELIM, next_token)) {
2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183
		errno = EINVAL;
		ret = -1;
		free_arg(field);
		goto out_free_token;
	}

	*print_arg = field;

out_free_token:
	free_token(token);

	return ret;
}

2184
static char *arg_eval (struct tep_print_arg *arg);
2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201

static unsigned long long
eval_type_str(unsigned long long val, const char *type, int pointer)
{
	int sign = 0;
	char *ref;
	int len;

	len = strlen(type);

	if (pointer) {

		if (type[len-1] != '*') {
			do_warning("pointer expected with non pointer type");
			return val;
		}

2202 2203 2204 2205 2206
		ref = malloc(len);
		if (!ref) {
			do_warning("%s: not enough memory!", __func__);
			return val;
		}
2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235
		memcpy(ref, type, len);

		/* chop off the " *" */
		ref[len - 2] = 0;

		val = eval_type_str(val, ref, 0);
		free(ref);
		return val;
	}

	/* check if this is a pointer */
	if (type[len - 1] == '*')
		return val;

	/* Try to figure out the arg size*/
	if (strncmp(type, "struct", 6) == 0)
		/* all bets off */
		return val;

	if (strcmp(type, "u8") == 0)
		return val & 0xff;

	if (strcmp(type, "u16") == 0)
		return val & 0xffff;

	if (strcmp(type, "u32") == 0)
		return val & 0xffffffff;

	if (strcmp(type, "u64") == 0 ||
2236
	    strcmp(type, "s64") == 0)
2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280
		return val;

	if (strcmp(type, "s8") == 0)
		return (unsigned long long)(char)val & 0xff;

	if (strcmp(type, "s16") == 0)
		return (unsigned long long)(short)val & 0xffff;

	if (strcmp(type, "s32") == 0)
		return (unsigned long long)(int)val & 0xffffffff;

	if (strncmp(type, "unsigned ", 9) == 0) {
		sign = 0;
		type += 9;
	}

	if (strcmp(type, "char") == 0) {
		if (sign)
			return (unsigned long long)(char)val & 0xff;
		else
			return val & 0xff;
	}

	if (strcmp(type, "short") == 0) {
		if (sign)
			return (unsigned long long)(short)val & 0xffff;
		else
			return val & 0xffff;
	}

	if (strcmp(type, "int") == 0) {
		if (sign)
			return (unsigned long long)(int)val & 0xffffffff;
		else
			return val & 0xffffffff;
	}

	return val;
}

/*
 * Try to figure out the type.
 */
static unsigned long long
2281
eval_type(unsigned long long val, struct tep_print_arg *arg, int pointer)
2282
{
2283
	if (arg->type != TEP_PRINT_TYPE) {
2284 2285 2286
		do_warning("expected type argument");
		return 0;
	}
2287 2288 2289 2290

	return eval_type_str(val, arg->typecast.type, pointer);
}

2291
static int arg_num_eval(struct tep_print_arg *arg, long long *val)
2292 2293
{
	long long left, right;
2294
	int ret = 1;
2295 2296

	switch (arg->type) {
2297
	case TEP_PRINT_ATOM:
2298
		*val = strtoll(arg->atom.atom, NULL, 0);
2299
		break;
2300
	case TEP_PRINT_TYPE:
2301 2302 2303 2304
		ret = arg_num_eval(arg->typecast.item, val);
		if (!ret)
			break;
		*val = eval_type(*val, arg, 0);
2305
		break;
2306
	case TEP_PRINT_OP:
2307 2308
		switch (arg->op.op[0]) {
		case '|':
2309 2310 2311 2312 2313 2314
			ret = arg_num_eval(arg->op.left, &left);
			if (!ret)
				break;
			ret = arg_num_eval(arg->op.right, &right);
			if (!ret)
				break;
2315
			if (arg->op.op[1])
2316
				*val = left || right;
2317
			else
2318
				*val = left | right;
2319 2320
			break;
		case '&':
2321 2322 2323 2324 2325 2326
			ret = arg_num_eval(arg->op.left, &left);
			if (!ret)
				break;
			ret = arg_num_eval(arg->op.right, &right);
			if (!ret)
				break;
2327
			if (arg->op.op[1])
2328
				*val = left && right;
2329
			else
2330
				*val = left & right;
2331 2332
			break;
		case '<':
2333 2334 2335 2336 2337 2338
			ret = arg_num_eval(arg->op.left, &left);
			if (!ret)
				break;
			ret = arg_num_eval(arg->op.right, &right);
			if (!ret)
				break;
2339 2340
			switch (arg->op.op[1]) {
			case 0:
2341
				*val = left < right;
2342 2343
				break;
			case '<':
2344
				*val = left << right;
2345 2346
				break;
			case '=':
2347
				*val = left <= right;
2348 2349
				break;
			default:
2350 2351
				do_warning("unknown op '%s'", arg->op.op);
				ret = 0;
2352 2353 2354
			}
			break;
		case '>':
2355 2356 2357 2358 2359 2360
			ret = arg_num_eval(arg->op.left, &left);
			if (!ret)
				break;
			ret = arg_num_eval(arg->op.right, &right);
			if (!ret)
				break;
2361 2362
			switch (arg->op.op[1]) {
			case 0:
2363
				*val = left > right;
2364 2365
				break;
			case '>':
2366
				*val = left >> right;
2367 2368
				break;
			case '=':
2369
				*val = left >= right;
2370 2371
				break;
			default:
2372 2373
				do_warning("unknown op '%s'", arg->op.op);
				ret = 0;
2374 2375 2376
			}
			break;
		case '=':
2377 2378 2379 2380 2381 2382
			ret = arg_num_eval(arg->op.left, &left);
			if (!ret)
				break;
			ret = arg_num_eval(arg->op.right, &right);
			if (!ret)
				break;
2383

2384 2385 2386 2387 2388
			if (arg->op.op[1] != '=') {
				do_warning("unknown op '%s'", arg->op.op);
				ret = 0;
			} else
				*val = left == right;
2389 2390
			break;
		case '!':
2391 2392 2393 2394 2395 2396
			ret = arg_num_eval(arg->op.left, &left);
			if (!ret)
				break;
			ret = arg_num_eval(arg->op.right, &right);
			if (!ret)
				break;
2397 2398 2399

			switch (arg->op.op[1]) {
			case '=':
2400
				*val = left != right;
2401 2402
				break;
			default:
2403 2404
				do_warning("unknown op '%s'", arg->op.op);
				ret = 0;
2405 2406 2407 2408
			}
			break;
		case '-':
			/* check for negative */
2409
			if (arg->op.left->type == TEP_PRINT_NULL)
2410 2411
				left = 0;
			else
2412 2413 2414 2415 2416 2417 2418
				ret = arg_num_eval(arg->op.left, &left);
			if (!ret)
				break;
			ret = arg_num_eval(arg->op.right, &right);
			if (!ret)
				break;
			*val = left - right;
2419
			break;
2420
		case '+':
2421
			if (arg->op.left->type == TEP_PRINT_NULL)
2422 2423 2424 2425 2426 2427 2428 2429 2430 2431
				left = 0;
			else
				ret = arg_num_eval(arg->op.left, &left);
			if (!ret)
				break;
			ret = arg_num_eval(arg->op.right, &right);
			if (!ret)
				break;
			*val = left + right;
			break;
2432 2433 2434 2435 2436 2437
		case '~':
			ret = arg_num_eval(arg->op.right, &right);
			if (!ret)
				break;
			*val = ~right;
			break;
2438
		default:
2439 2440
			do_warning("unknown op '%s'", arg->op.op);
			ret = 0;
2441 2442 2443
		}
		break;

2444 2445 2446 2447 2448
	case TEP_PRINT_NULL:
	case TEP_PRINT_FIELD ... TEP_PRINT_SYMBOL:
	case TEP_PRINT_STRING:
	case TEP_PRINT_BSTRING:
	case TEP_PRINT_BITMASK:
2449
	default:
2450 2451
		do_warning("invalid eval type %d", arg->type);
		ret = 0;
2452 2453

	}
2454
	return ret;
2455 2456
}

2457
static char *arg_eval (struct tep_print_arg *arg)
2458 2459
{
	long long val;
2460
	static char buf[24];
2461 2462

	switch (arg->type) {
2463
	case TEP_PRINT_ATOM:
2464
		return arg->atom.atom;
2465
	case TEP_PRINT_TYPE:
2466
		return arg_eval(arg->typecast.item);
2467
	case TEP_PRINT_OP:
2468 2469
		if (!arg_num_eval(arg, &val))
			break;
2470 2471 2472
		sprintf(buf, "%lld", val);
		return buf;

2473 2474 2475 2476 2477
	case TEP_PRINT_NULL:
	case TEP_PRINT_FIELD ... TEP_PRINT_SYMBOL:
	case TEP_PRINT_STRING:
	case TEP_PRINT_BSTRING:
	case TEP_PRINT_BITMASK:
2478
	default:
2479
		do_warning("invalid eval type %d", arg->type);
2480 2481 2482 2483 2484 2485
		break;
	}

	return NULL;
}

2486
static enum tep_event_type
2487
process_fields(struct tep_event *event, struct tep_print_flag_sym **list, char **tok)
2488
{
2489
	enum tep_event_type type;
2490 2491
	struct tep_print_arg *arg = NULL;
	struct tep_print_flag_sym *field;
2492 2493 2494 2495 2496 2497
	char *token = *tok;
	char *value;

	do {
		free_token(token);
		type = read_token_item(&token);
2498
		if (test_type_token(type, token, TEP_EVENT_OP, "{"))
2499 2500 2501
			break;

		arg = alloc_arg();
2502 2503
		if (!arg)
			goto out_free;
2504 2505 2506

		free_token(token);
		type = process_arg(event, arg, &token);
2507

2508
		if (type == TEP_EVENT_OP)
2509 2510
			type = process_op(event, arg, &token);

2511
		if (type == TEP_EVENT_ERROR)
2512 2513
			goto out_free;

2514
		if (test_type_token(type, token, TEP_EVENT_DELIM, ","))
2515 2516
			goto out_free;

2517 2518 2519
		field = calloc(1, sizeof(*field));
		if (!field)
			goto out_free;
2520 2521

		value = arg_eval(arg);
2522
		if (value == NULL)
2523
			goto out_free_field;
2524
		field->value = strdup(value);
2525
		if (field->value == NULL)
2526
			goto out_free_field;
2527 2528 2529

		free_arg(arg);
		arg = alloc_arg();
2530 2531
		if (!arg)
			goto out_free;
2532 2533 2534

		free_token(token);
		type = process_arg(event, arg, &token);
2535
		if (test_type_token(type, token, TEP_EVENT_OP, "}"))
2536
			goto out_free_field;
2537 2538

		value = arg_eval(arg);
2539
		if (value == NULL)
2540
			goto out_free_field;
2541
		field->str = strdup(value);
2542
		if (field->str == NULL)
2543
			goto out_free_field;
2544 2545 2546 2547 2548 2549 2550 2551
		free_arg(arg);
		arg = NULL;

		*list = field;
		list = &field->next;

		free_token(token);
		type = read_token_item(&token);
2552
	} while (type == TEP_EVENT_DELIM && strcmp(token, ",") == 0);
2553 2554 2555 2556

	*tok = token;
	return type;

2557 2558
out_free_field:
	free_flag_sym(field);
2559 2560 2561 2562 2563
out_free:
	free_arg(arg);
	free_token(token);
	*tok = NULL;

2564
	return TEP_EVENT_ERROR;
2565 2566
}

2567
static enum tep_event_type
2568
process_flags(struct tep_event *event, struct tep_print_arg *arg, char **tok)
2569
{
2570
	struct tep_print_arg *field;
2571
	enum tep_event_type type;
2572
	char *token = NULL;
2573 2574

	memset(arg, 0, sizeof(*arg));
2575
	arg->type = TEP_PRINT_FLAGS;
2576 2577

	field = alloc_arg();
2578
	if (!field) {
2579
		do_warning_event(event, "%s: not enough memory!", __func__);
2580 2581
		goto out_free;
	}
2582

2583
	type = process_field_arg(event, field, &token);
2584 2585

	/* Handle operations in the first argument */
2586
	while (type == TEP_EVENT_OP)
2587 2588
		type = process_op(event, field, &token);

2589
	if (test_type_token(type, token, TEP_EVENT_DELIM, ","))
2590
		goto out_free_field;
2591 2592 2593 2594 2595 2596 2597 2598 2599 2600
	free_token(token);

	arg->flags.field = field;

	type = read_token_item(&token);
	if (event_item_type(type)) {
		arg->flags.delim = token;
		type = read_token_item(&token);
	}

2601
	if (test_type_token(type, token, TEP_EVENT_DELIM, ","))
2602 2603 2604
		goto out_free;

	type = process_fields(event, &arg->flags.flags, &token);
2605
	if (test_type_token(type, token, TEP_EVENT_DELIM, ")"))
2606 2607 2608 2609 2610 2611
		goto out_free;

	free_token(token);
	type = read_token_item(tok);
	return type;

2612 2613 2614
out_free_field:
	free_arg(field);
out_free:
2615 2616
	free_token(token);
	*tok = NULL;
2617
	return TEP_EVENT_ERROR;
2618 2619
}

2620
static enum tep_event_type
2621
process_symbols(struct tep_event *event, struct tep_print_arg *arg, char **tok)
2622
{
2623
	struct tep_print_arg *field;
2624
	enum tep_event_type type;
2625
	char *token = NULL;
2626 2627

	memset(arg, 0, sizeof(*arg));
2628
	arg->type = TEP_PRINT_SYMBOL;
2629 2630

	field = alloc_arg();
2631
	if (!field) {
2632
		do_warning_event(event, "%s: not enough memory!", __func__);
2633 2634
		goto out_free;
	}
2635

2636 2637
	type = process_field_arg(event, field, &token);

2638
	if (test_type_token(type, token, TEP_EVENT_DELIM, ","))
2639
		goto out_free_field;
2640 2641 2642 2643

	arg->symbol.field = field;

	type = process_fields(event, &arg->symbol.symbols, &token);
2644
	if (test_type_token(type, token, TEP_EVENT_DELIM, ")"))
2645 2646 2647 2648 2649 2650
		goto out_free;

	free_token(token);
	type = read_token_item(tok);
	return type;

2651 2652 2653
out_free_field:
	free_arg(field);
out_free:
2654 2655
	free_token(token);
	*tok = NULL;
2656
	return TEP_EVENT_ERROR;
2657 2658
}

2659
static enum tep_event_type
2660
process_hex_common(struct tep_event *event, struct tep_print_arg *arg,
2661
		   char **tok, enum tep_print_arg_type type)
2662 2663
{
	memset(arg, 0, sizeof(*arg));
2664
	arg->type = type;
2665

2666 2667
	if (alloc_and_process_delim(event, ",", &arg->hex.field))
		goto out;
2668

2669 2670
	if (alloc_and_process_delim(event, ")", &arg->hex.size))
		goto free_field;
2671

2672
	return read_token_item(tok);
2673

2674 2675
free_field:
	free_arg(arg->hex.field);
2676
	arg->hex.field = NULL;
2677
out:
2678
	*tok = NULL;
2679
	return TEP_EVENT_ERROR;
2680 2681
}

2682
static enum tep_event_type
2683
process_hex(struct tep_event *event, struct tep_print_arg *arg, char **tok)
2684
{
2685
	return process_hex_common(event, arg, tok, TEP_PRINT_HEX);
2686 2687
}

2688
static enum tep_event_type
2689
process_hex_str(struct tep_event *event, struct tep_print_arg *arg,
2690 2691
		char **tok)
{
2692
	return process_hex_common(event, arg, tok, TEP_PRINT_HEX_STR);
2693 2694
}

2695
static enum tep_event_type
2696
process_int_array(struct tep_event *event, struct tep_print_arg *arg, char **tok)
2697 2698
{
	memset(arg, 0, sizeof(*arg));
2699
	arg->type = TEP_PRINT_INT_ARRAY;
2700

2701 2702
	if (alloc_and_process_delim(event, ",", &arg->int_array.field))
		goto out;
2703

2704 2705
	if (alloc_and_process_delim(event, ",", &arg->int_array.count))
		goto free_field;
2706

2707 2708
	if (alloc_and_process_delim(event, ")", &arg->int_array.el_size))
		goto free_size;
2709

2710
	return read_token_item(tok);
2711

2712 2713
free_size:
	free_arg(arg->int_array.count);
2714
	arg->int_array.count = NULL;
2715 2716
free_field:
	free_arg(arg->int_array.field);
2717
	arg->int_array.field = NULL;
2718
out:
2719
	*tok = NULL;
2720
	return TEP_EVENT_ERROR;
2721 2722
}

2723
static enum tep_event_type
2724
process_dynamic_array(struct tep_event *event, struct tep_print_arg *arg, char **tok)
2725
{
2726
	struct tep_format_field *field;
2727
	enum tep_event_type type;
2728 2729 2730
	char *token;

	memset(arg, 0, sizeof(*arg));
2731
	arg->type = TEP_PRINT_DYNAMIC_ARRAY;
2732 2733 2734 2735 2736 2737 2738

	/*
	 * The item within the parenthesis is another field that holds
	 * the index into where the array starts.
	 */
	type = read_token(&token);
	*tok = token;
2739
	if (type != TEP_EVENT_ITEM)
2740 2741 2742 2743
		goto out_free;

	/* Find the field */

2744
	field = tep_find_field(event, token);
2745 2746 2747 2748 2749 2750
	if (!field)
		goto out_free;

	arg->dynarray.field = field;
	arg->dynarray.index = 0;

2751
	if (read_expected(TEP_EVENT_DELIM, ")") < 0)
2752 2753 2754 2755 2756
		goto out_free;

	free_token(token);
	type = read_token_item(&token);
	*tok = token;
2757
	if (type != TEP_EVENT_OP || strcmp(token, "[") != 0)
2758 2759 2760 2761
		return type;

	free_token(token);
	arg = alloc_arg();
2762
	if (!arg) {
2763
		do_warning_event(event, "%s: not enough memory!", __func__);
2764
		*tok = NULL;
2765
		return TEP_EVENT_ERROR;
2766 2767
	}

2768
	type = process_arg(event, arg, &token);
2769
	if (type == TEP_EVENT_ERROR)
2770
		goto out_free_arg;
2771

2772
	if (!test_type_token(type, token, TEP_EVENT_OP, "]"))
2773
		goto out_free_arg;
2774 2775 2776 2777 2778

	free_token(token);
	type = read_token_item(tok);
	return type;

2779 2780
 out_free_arg:
	free_arg(arg);
2781 2782 2783
 out_free:
	free_token(token);
	*tok = NULL;
2784
	return TEP_EVENT_ERROR;
2785 2786
}

2787
static enum tep_event_type
2788
process_dynamic_array_len(struct tep_event *event, struct tep_print_arg *arg,
2789 2790
			  char **tok)
{
2791
	struct tep_format_field *field;
2792
	enum tep_event_type type;
2793 2794
	char *token;

2795
	if (read_expect_type(TEP_EVENT_ITEM, &token) < 0)
2796 2797
		goto out_free;

2798
	arg->type = TEP_PRINT_DYNAMIC_ARRAY_LEN;
2799 2800

	/* Find the field */
2801
	field = tep_find_field(event, token);
2802 2803 2804 2805 2806 2807
	if (!field)
		goto out_free;

	arg->dynarray.field = field;
	arg->dynarray.index = 0;

2808
	if (read_expected(TEP_EVENT_DELIM, ")") < 0)
2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819
		goto out_err;

	type = read_token(&token);
	*tok = token;

	return type;

 out_free:
	free_token(token);
 out_err:
	*tok = NULL;
2820
	return TEP_EVENT_ERROR;
2821 2822
}

2823
static enum tep_event_type
2824
process_paren(struct tep_event *event, struct tep_print_arg *arg, char **tok)
2825
{
2826
	struct tep_print_arg *item_arg;
2827
	enum tep_event_type type;
2828 2829 2830 2831
	char *token;

	type = process_arg(event, arg, &token);

2832
	if (type == TEP_EVENT_ERROR)
2833 2834
		goto out_free;

2835
	if (type == TEP_EVENT_OP)
2836 2837
		type = process_op(event, arg, &token);

2838
	if (type == TEP_EVENT_ERROR)
2839 2840
		goto out_free;

2841
	if (test_type_token(type, token, TEP_EVENT_DELIM, ")"))
2842 2843 2844 2845 2846 2847 2848 2849 2850 2851
		goto out_free;

	free_token(token);
	type = read_token_item(&token);

	/*
	 * If the next token is an item or another open paren, then
	 * this was a typecast.
	 */
	if (event_item_type(type) ||
2852
	    (type == TEP_EVENT_DELIM && strcmp(token, "(") == 0)) {
2853 2854 2855 2856

		/* make this a typecast and contine */

		/* prevous must be an atom */
2857 2858
		if (arg->type != TEP_PRINT_ATOM) {
			do_warning_event(event, "previous needed to be TEP_PRINT_ATOM");
2859 2860
			goto out_free;
		}
2861 2862

		item_arg = alloc_arg();
2863
		if (!item_arg) {
2864 2865
			do_warning_event(event, "%s: not enough memory!",
					 __func__);
2866 2867
			goto out_free;
		}
2868

2869
		arg->type = TEP_PRINT_TYPE;
2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881
		arg->typecast.type = arg->atom.atom;
		arg->typecast.item = item_arg;
		type = process_arg_token(event, item_arg, &token, type);

	}

	*tok = token;
	return type;

 out_free:
	free_token(token);
	*tok = NULL;
2882
	return TEP_EVENT_ERROR;
2883 2884 2885
}


2886
static enum tep_event_type
2887
process_str(struct tep_event *event __maybe_unused, struct tep_print_arg *arg,
2888
	    char **tok)
2889
{
2890
	enum tep_event_type type;
2891 2892
	char *token;

2893
	if (read_expect_type(TEP_EVENT_ITEM, &token) < 0)
2894 2895
		goto out_free;

2896
	arg->type = TEP_PRINT_STRING;
2897 2898 2899
	arg->string.string = token;
	arg->string.offset = -1;

2900
	if (read_expected(TEP_EVENT_DELIM, ")") < 0)
2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911
		goto out_err;

	type = read_token(&token);
	*tok = token;

	return type;

 out_free:
	free_token(token);
 out_err:
	*tok = NULL;
2912
	return TEP_EVENT_ERROR;
2913 2914
}

2915
static enum tep_event_type
2916
process_bitmask(struct tep_event *event __maybe_unused, struct tep_print_arg *arg,
2917
		char **tok)
2918
{
2919
	enum tep_event_type type;
2920 2921
	char *token;

2922
	if (read_expect_type(TEP_EVENT_ITEM, &token) < 0)
2923 2924
		goto out_free;

2925
	arg->type = TEP_PRINT_BITMASK;
2926 2927 2928
	arg->bitmask.bitmask = token;
	arg->bitmask.offset = -1;

2929
	if (read_expected(TEP_EVENT_DELIM, ")") < 0)
2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940
		goto out_err;

	type = read_token(&token);
	*tok = token;

	return type;

 out_free:
	free_token(token);
 out_err:
	*tok = NULL;
2941
	return TEP_EVENT_ERROR;
2942 2943
}

2944
static struct tep_function_handler *
2945
find_func_handler(struct tep_handle *pevent, char *func_name)
2946
{
2947
	struct tep_function_handler *func;
2948

2949 2950 2951
	if (!pevent)
		return NULL;

2952 2953 2954 2955 2956 2957 2958 2959
	for (func = pevent->func_handlers; func; func = func->next) {
		if (strcmp(func->name, func_name) == 0)
			break;
	}

	return func;
}

2960
static void remove_func_handler(struct tep_handle *pevent, char *func_name)
2961
{
2962 2963
	struct tep_function_handler *func;
	struct tep_function_handler **next;
2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975

	next = &pevent->func_handlers;
	while ((func = *next)) {
		if (strcmp(func->name, func_name) == 0) {
			*next = func->next;
			free_func_handle(func);
			break;
		}
		next = &func->next;
	}
}

2976
static enum tep_event_type
2977
process_func_handler(struct tep_event *event, struct tep_function_handler *func,
2978
		     struct tep_print_arg *arg, char **tok)
2979
{
2980 2981
	struct tep_print_arg **next_arg;
	struct tep_print_arg *farg;
2982
	enum tep_event_type type;
2983 2984 2985
	char *token;
	int i;

2986
	arg->type = TEP_PRINT_FUNC;
2987 2988 2989 2990 2991 2992 2993
	arg->func.func = func;

	*tok = NULL;

	next_arg = &(arg->func.args);
	for (i = 0; i < func->nr_args; i++) {
		farg = alloc_arg();
2994
		if (!farg) {
2995 2996
			do_warning_event(event, "%s: not enough memory!",
					 __func__);
2997
			return TEP_EVENT_ERROR;
2998 2999
		}

3000
		type = process_arg(event, farg, &token);
3001
		if (i < (func->nr_args - 1)) {
3002
			if (type != TEP_EVENT_DELIM || strcmp(token, ",") != 0) {
3003 3004
				do_warning_event(event,
					"Error: function '%s()' expects %d arguments but event %s only uses %d",
3005 3006 3007 3008 3009
					func->name, func->nr_args,
					event->name, i + 1);
				goto err;
			}
		} else {
3010
			if (type != TEP_EVENT_DELIM || strcmp(token, ")") != 0) {
3011 3012
				do_warning_event(event,
					"Error: function '%s()' only expects %d arguments but event %s has more",
3013 3014 3015
					func->name, func->nr_args, event->name);
				goto err;
			}
3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026
		}

		*next_arg = farg;
		next_arg = &(farg->next);
		free_token(token);
	}

	type = read_token(&token);
	*tok = token;

	return type;
3027 3028 3029 3030

err:
	free_arg(farg);
	free_token(token);
3031
	return TEP_EVENT_ERROR;
3032 3033
}

3034
static enum tep_event_type
3035
process_function(struct tep_event *event, struct tep_print_arg *arg,
3036 3037
		 char *token, char **tok)
{
3038
	struct tep_function_handler *func;
3039 3040 3041

	if (strcmp(token, "__print_flags") == 0) {
		free_token(token);
3042
		is_flag_field = 1;
3043 3044 3045 3046
		return process_flags(event, arg, tok);
	}
	if (strcmp(token, "__print_symbolic") == 0) {
		free_token(token);
3047
		is_symbolic_field = 1;
3048 3049
		return process_symbols(event, arg, tok);
	}
3050 3051 3052 3053
	if (strcmp(token, "__print_hex") == 0) {
		free_token(token);
		return process_hex(event, arg, tok);
	}
3054 3055 3056 3057
	if (strcmp(token, "__print_hex_str") == 0) {
		free_token(token);
		return process_hex_str(event, arg, tok);
	}
3058 3059 3060 3061
	if (strcmp(token, "__print_array") == 0) {
		free_token(token);
		return process_int_array(event, arg, tok);
	}
3062 3063 3064 3065
	if (strcmp(token, "__get_str") == 0) {
		free_token(token);
		return process_str(event, arg, tok);
	}
3066 3067 3068 3069
	if (strcmp(token, "__get_bitmask") == 0) {
		free_token(token);
		return process_bitmask(event, arg, tok);
	}
3070 3071 3072 3073
	if (strcmp(token, "__get_dynamic_array") == 0) {
		free_token(token);
		return process_dynamic_array(event, arg, tok);
	}
3074 3075 3076 3077
	if (strcmp(token, "__get_dynamic_array_len") == 0) {
		free_token(token);
		return process_dynamic_array_len(event, arg, tok);
	}
3078 3079 3080 3081 3082 3083 3084

	func = find_func_handler(event->pevent, token);
	if (func) {
		free_token(token);
		return process_func_handler(event, func, arg, tok);
	}

3085
	do_warning_event(event, "function %s not defined", token);
3086
	free_token(token);
3087
	return TEP_EVENT_ERROR;
3088 3089
}

3090
static enum tep_event_type
3091
process_arg_token(struct tep_event *event, struct tep_print_arg *arg,
3092
		  char **tok, enum tep_event_type type)
3093 3094 3095 3096 3097 3098 3099
{
	char *token;
	char *atom;

	token = *tok;

	switch (type) {
3100
	case TEP_EVENT_ITEM:
3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113
		if (strcmp(token, "REC") == 0) {
			free_token(token);
			type = process_entry(event, arg, &token);
			break;
		}
		atom = token;
		/* test the next token */
		type = read_token_item(&token);

		/*
		 * If the next token is a parenthesis, then this
		 * is a function.
		 */
3114
		if (type == TEP_EVENT_DELIM && strcmp(token, "(") == 0) {
3115 3116 3117 3118 3119 3120 3121
			free_token(token);
			token = NULL;
			/* this will free atom. */
			type = process_function(event, arg, atom, &token);
			break;
		}
		/* atoms can be more than one token long */
3122
		while (type == TEP_EVENT_ITEM) {
3123 3124 3125 3126 3127 3128 3129
			char *new_atom;
			new_atom = realloc(atom,
					   strlen(atom) + strlen(token) + 2);
			if (!new_atom) {
				free(atom);
				*tok = NULL;
				free_token(token);
3130
				return TEP_EVENT_ERROR;
3131 3132
			}
			atom = new_atom;
3133 3134 3135 3136 3137 3138
			strcat(atom, " ");
			strcat(atom, token);
			free_token(token);
			type = read_token_item(&token);
		}

3139
		arg->type = TEP_PRINT_ATOM;
3140 3141 3142
		arg->atom.atom = atom;
		break;

3143 3144
	case TEP_EVENT_DQUOTE:
	case TEP_EVENT_SQUOTE:
3145
		arg->type = TEP_PRINT_ATOM;
3146 3147 3148
		arg->atom.atom = token;
		type = read_token_item(&token);
		break;
3149
	case TEP_EVENT_DELIM:
3150 3151 3152 3153 3154
		if (strcmp(token, "(") == 0) {
			free_token(token);
			type = process_paren(event, arg, &token);
			break;
		}
3155
	case TEP_EVENT_OP:
3156
		/* handle single ops */
3157
		arg->type = TEP_PRINT_OP;
3158 3159 3160 3161 3162
		arg->op.op = token;
		arg->op.left = NULL;
		type = process_op(event, arg, &token);

		/* On error, the op is freed */
3163
		if (type == TEP_EVENT_ERROR)
3164 3165 3166 3167 3168
			arg->op.op = NULL;

		/* return error type if errored */
		break;

3169
	case TEP_EVENT_ERROR ... TEP_EVENT_NEWLINE:
3170
	default:
3171
		do_warning_event(event, "unexpected type %d", type);
3172
		return TEP_EVENT_ERROR;
3173 3174 3175 3176 3177 3178
	}
	*tok = token;

	return type;
}

3179
static int event_read_print_args(struct tep_event *event, struct tep_print_arg **list)
3180
{
3181
	enum tep_event_type type = TEP_EVENT_ERROR;
3182
	struct tep_print_arg *arg;
3183 3184 3185 3186
	char *token;
	int args = 0;

	do {
3187
		if (type == TEP_EVENT_NEWLINE) {
3188 3189 3190 3191 3192
			type = read_token_item(&token);
			continue;
		}

		arg = alloc_arg();
3193
		if (!arg) {
3194 3195
			do_warning_event(event, "%s: not enough memory!",
					 __func__);
3196 3197
			return -1;
		}
3198 3199 3200

		type = process_arg(event, arg, &token);

3201
		if (type == TEP_EVENT_ERROR) {
3202 3203 3204 3205 3206 3207 3208 3209
			free_token(token);
			free_arg(arg);
			return -1;
		}

		*list = arg;
		args++;

3210
		if (type == TEP_EVENT_OP) {
3211 3212
			type = process_op(event, arg, &token);
			free_token(token);
3213
			if (type == TEP_EVENT_ERROR) {
3214 3215 3216 3217 3218 3219 3220 3221
				*list = NULL;
				free_arg(arg);
				return -1;
			}
			list = &arg->next;
			continue;
		}

3222
		if (type == TEP_EVENT_DELIM && strcmp(token, ",") == 0) {
3223 3224 3225 3226 3227 3228
			free_token(token);
			*list = arg;
			list = &arg->next;
			continue;
		}
		break;
3229
	} while (type != TEP_EVENT_NONE);
3230

3231
	if (type != TEP_EVENT_NONE && type != TEP_EVENT_ERROR)
3232 3233 3234 3235 3236
		free_token(token);

	return args;
}

3237
static int event_read_print(struct tep_event *event)
3238
{
3239
	enum tep_event_type type;
3240 3241 3242
	char *token;
	int ret;

3243
	if (read_expected_item(TEP_EVENT_ITEM, "print") < 0)
3244 3245
		return -1;

3246
	if (read_expected(TEP_EVENT_ITEM, "fmt") < 0)
3247 3248
		return -1;

3249
	if (read_expected(TEP_EVENT_OP, ":") < 0)
3250 3251
		return -1;

3252
	if (read_expect_type(TEP_EVENT_DQUOTE, &token) < 0)
3253 3254 3255 3256 3257 3258 3259 3260 3261
		goto fail;

 concat:
	event->print_fmt.format = token;
	event->print_fmt.args = NULL;

	/* ok to have no arg */
	type = read_token_item(&token);

3262
	if (type == TEP_EVENT_NONE)
3263 3264 3265
		return 0;

	/* Handle concatenation of print lines */
3266
	if (type == TEP_EVENT_DQUOTE) {
3267 3268
		char *cat;

3269 3270
		if (asprintf(&cat, "%s%s", event->print_fmt.format, token) < 0)
			goto fail;
3271 3272 3273 3274 3275 3276 3277
		free_token(token);
		free_token(event->print_fmt.format);
		event->print_fmt.format = NULL;
		token = cat;
		goto concat;
	}
			     
3278
	if (test_type_token(type, token, TEP_EVENT_DELIM, ","))
3279 3280 3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294
		goto fail;

	free_token(token);

	ret = event_read_print_args(event, &event->print_fmt.args);
	if (ret < 0)
		return -1;

	return ret;

 fail:
	free_token(token);
	return -1;
}

/**
3295
 * tep_find_common_field - return a common field by event
3296 3297 3298 3299
 * @event: handle for the event
 * @name: the name of the common field to return
 *
 * Returns a common field from the event by the given @name.
3300
 * This only searches the common fields and not all field.
3301
 */
3302
struct tep_format_field *
3303
tep_find_common_field(struct tep_event *event, const char *name)
3304
{
3305
	struct tep_format_field *format;
3306 3307 3308 3309 3310 3311 3312 3313 3314 3315 3316

	for (format = event->format.common_fields;
	     format; format = format->next) {
		if (strcmp(format->name, name) == 0)
			break;
	}

	return format;
}

/**
3317
 * tep_find_field - find a non-common field
3318 3319 3320 3321 3322 3323
 * @event: handle for the event
 * @name: the name of the non-common field
 *
 * Returns a non-common field by the given @name.
 * This does not search common fields.
 */
3324
struct tep_format_field *
3325
tep_find_field(struct tep_event *event, const char *name)
3326
{
3327
	struct tep_format_field *format;
3328 3329 3330 3331 3332 3333 3334 3335 3336 3337 3338

	for (format = event->format.fields;
	     format; format = format->next) {
		if (strcmp(format->name, name) == 0)
			break;
	}

	return format;
}

/**
3339
 * tep_find_any_field - find any field by name
3340 3341 3342 3343
 * @event: handle for the event
 * @name: the name of the field
 *
 * Returns a field by the given @name.
3344
 * This searches the common field names first, then
3345 3346
 * the non-common ones if a common one was not found.
 */
3347
struct tep_format_field *
3348
tep_find_any_field(struct tep_event *event, const char *name)
3349
{
3350
	struct tep_format_field *format;
3351

3352
	format = tep_find_common_field(event, name);
3353 3354
	if (format)
		return format;
3355
	return tep_find_field(event, name);
3356 3357 3358
}

/**
3359
 * tep_read_number - read a number from data
3360 3361 3362 3363 3364 3365 3366
 * @pevent: handle for the pevent
 * @ptr: the raw data
 * @size: the size of the data that holds the number
 *
 * Returns the number (converted to host) from the
 * raw data.
 */
3367 3368
unsigned long long tep_read_number(struct tep_handle *pevent,
				   const void *ptr, int size)
3369
{
3370 3371
	unsigned long long val;

3372 3373 3374 3375
	switch (size) {
	case 1:
		return *(unsigned char *)ptr;
	case 2:
3376
		return tep_data2host2(pevent, *(unsigned short *)ptr);
3377
	case 4:
3378
		return tep_data2host4(pevent, *(unsigned int *)ptr);
3379
	case 8:
3380 3381
		memcpy(&val, (ptr), sizeof(unsigned long long));
		return tep_data2host8(pevent, val);
3382 3383 3384 3385 3386 3387 3388
	default:
		/* BUG! */
		return 0;
	}
}

/**
3389
 * tep_read_number_field - read a number from data
3390 3391 3392 3393 3394 3395 3396 3397 3398
 * @field: a handle to the field
 * @data: the raw data to read
 * @value: the value to place the number in
 *
 * Reads raw data according to a field offset and size,
 * and translates it into @value.
 *
 * Returns 0 on success, -1 otherwise.
 */
3399
int tep_read_number_field(struct tep_format_field *field, const void *data,
3400
			  unsigned long long *value)
3401 3402 3403 3404 3405 3406 3407 3408
{
	if (!field)
		return -1;
	switch (field->size) {
	case 1:
	case 2:
	case 4:
	case 8:
3409 3410
		*value = tep_read_number(field->event->pevent,
					 data + field->offset, field->size);
3411 3412 3413 3414 3415 3416
		return 0;
	default:
		return -1;
	}
}

3417
static int get_common_info(struct tep_handle *pevent,
3418 3419
			   const char *type, int *offset, int *size)
{
3420
	struct tep_event *event;
3421
	struct tep_format_field *field;
3422 3423 3424 3425 3426

	/*
	 * All events should have the same common elements.
	 * Pick any event to find where the type is;
	 */
3427 3428 3429 3430
	if (!pevent->events) {
		do_warning("no event_list!");
		return -1;
	}
3431 3432

	event = pevent->events[0];
3433
	field = tep_find_common_field(event, type);
3434
	if (!field)
3435
		return -1;
3436 3437 3438 3439 3440 3441 3442

	*offset = field->offset;
	*size = field->size;

	return 0;
}

3443
static int __parse_common(struct tep_handle *pevent, void *data,
3444 3445 3446 3447 3448 3449 3450 3451 3452
			  int *size, int *offset, const char *name)
{
	int ret;

	if (!*size) {
		ret = get_common_info(pevent, name, offset, size);
		if (ret < 0)
			return ret;
	}
3453
	return tep_read_number(pevent, data + *offset, *size);
3454 3455
}

3456
static int trace_parse_common_type(struct tep_handle *pevent, void *data)
3457 3458 3459 3460 3461 3462
{
	return __parse_common(pevent, data,
			      &pevent->type_size, &pevent->type_offset,
			      "common_type");
}

3463
static int parse_common_pid(struct tep_handle *pevent, void *data)
3464 3465 3466 3467 3468 3469
{
	return __parse_common(pevent, data,
			      &pevent->pid_size, &pevent->pid_offset,
			      "common_pid");
}

3470
static int parse_common_pc(struct tep_handle *pevent, void *data)
3471 3472 3473 3474 3475 3476
{
	return __parse_common(pevent, data,
			      &pevent->pc_size, &pevent->pc_offset,
			      "common_preempt_count");
}

3477
static int parse_common_flags(struct tep_handle *pevent, void *data)
3478 3479 3480 3481 3482 3483
{
	return __parse_common(pevent, data,
			      &pevent->flags_size, &pevent->flags_offset,
			      "common_flags");
}

3484
static int parse_common_lock_depth(struct tep_handle *pevent, void *data)
3485
{
3486 3487 3488 3489
	return __parse_common(pevent, data,
			      &pevent->ld_size, &pevent->ld_offset,
			      "common_lock_depth");
}
3490

3491
static int parse_common_migrate_disable(struct tep_handle *pevent, void *data)
3492 3493 3494 3495
{
	return __parse_common(pevent, data,
			      &pevent->ld_size, &pevent->ld_offset,
			      "common_migrate_disable");
3496 3497 3498 3499 3500
}

static int events_id_cmp(const void *a, const void *b);

/**
3501
 * tep_find_event - find an event by given id
3502 3503 3504 3505 3506
 * @pevent: a handle to the pevent
 * @id: the id of the event
 *
 * Returns an event that has a given @id.
 */
3507
struct tep_event *tep_find_event(struct tep_handle *pevent, int id)
3508
{
3509 3510 3511
	struct tep_event **eventptr;
	struct tep_event key;
	struct tep_event *pkey = &key;
3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530

	/* Check cache first */
	if (pevent->last_event && pevent->last_event->id == id)
		return pevent->last_event;

	key.id = id;

	eventptr = bsearch(&pkey, pevent->events, pevent->nr_events,
			   sizeof(*pevent->events), events_id_cmp);

	if (eventptr) {
		pevent->last_event = *eventptr;
		return *eventptr;
	}

	return NULL;
}

/**
3531
 * tep_find_event_by_name - find an event by given name
3532 3533 3534 3535 3536 3537 3538
 * @pevent: a handle to the pevent
 * @sys: the system name to search for
 * @name: the name of the event to search for
 *
 * This returns an event with a given @name and under the system
 * @sys. If @sys is NULL the first event with @name is returned.
 */
3539
struct tep_event *
3540 3541
tep_find_event_by_name(struct tep_handle *pevent,
		       const char *sys, const char *name)
3542
{
3543
	struct tep_event *event = NULL;
3544 3545 3546 3547 3548 3549 3550 3551 3552 3553 3554 3555 3556 3557 3558 3559 3560 3561 3562 3563 3564 3565 3566 3567
	int i;

	if (pevent->last_event &&
	    strcmp(pevent->last_event->name, name) == 0 &&
	    (!sys || strcmp(pevent->last_event->system, sys) == 0))
		return pevent->last_event;

	for (i = 0; i < pevent->nr_events; i++) {
		event = pevent->events[i];
		if (strcmp(event->name, name) == 0) {
			if (!sys)
				break;
			if (strcmp(event->system, sys) == 0)
				break;
		}
	}
	if (i == pevent->nr_events)
		event = NULL;

	pevent->last_event = event;
	return event;
}

static unsigned long long
3568
eval_num_arg(void *data, int size, struct tep_event *event, struct tep_print_arg *arg)
3569
{
3570
	struct tep_handle *pevent = event->pevent;
3571 3572
	unsigned long long val = 0;
	unsigned long long left, right;
3573 3574
	struct tep_print_arg *typearg = NULL;
	struct tep_print_arg *larg;
3575 3576 3577 3578
	unsigned long offset;
	unsigned int field_size;

	switch (arg->type) {
3579
	case TEP_PRINT_NULL:
3580 3581
		/* ?? */
		return 0;
3582
	case TEP_PRINT_ATOM:
3583
		return strtoull(arg->atom.atom, NULL, 0);
3584
	case TEP_PRINT_FIELD:
3585
		if (!arg->field.field) {
3586
			arg->field.field = tep_find_any_field(event, arg->field.name);
3587
			if (!arg->field.field)
3588 3589
				goto out_warning_field;
			
3590 3591
		}
		/* must be a number */
3592 3593
		val = tep_read_number(pevent, data + arg->field.field->offset,
				      arg->field.field->size);
3594
		break;
3595 3596 3597 3598 3599
	case TEP_PRINT_FLAGS:
	case TEP_PRINT_SYMBOL:
	case TEP_PRINT_INT_ARRAY:
	case TEP_PRINT_HEX:
	case TEP_PRINT_HEX_STR:
3600
		break;
3601
	case TEP_PRINT_TYPE:
3602 3603
		val = eval_num_arg(data, size, event, arg->typecast.item);
		return eval_type(val, arg, 0);
3604 3605 3606
	case TEP_PRINT_STRING:
	case TEP_PRINT_BSTRING:
	case TEP_PRINT_BITMASK:
3607
		return 0;
3608
	case TEP_PRINT_FUNC: {
3609 3610 3611 3612 3613 3614
		struct trace_seq s;
		trace_seq_init(&s);
		val = process_defined_func(&s, data, size, event, arg);
		trace_seq_destroy(&s);
		return val;
	}
3615
	case TEP_PRINT_OP:
3616 3617 3618 3619 3620 3621 3622 3623 3624
		if (strcmp(arg->op.op, "[") == 0) {
			/*
			 * Arrays are special, since we don't want
			 * to read the arg as is.
			 */
			right = eval_num_arg(data, size, event, arg->op.right);

			/* handle typecasts */
			larg = arg->op.left;
3625
			while (larg->type == TEP_PRINT_TYPE) {
3626 3627 3628 3629 3630 3631 3632 3633 3634
				if (!typearg)
					typearg = larg;
				larg = larg->typecast.item;
			}

			/* Default to long size */
			field_size = pevent->long_size;

			switch (larg->type) {
3635
			case TEP_PRINT_DYNAMIC_ARRAY:
3636
				offset = tep_read_number(pevent,
3637 3638 3639 3640 3641 3642 3643 3644 3645 3646 3647 3648
						   data + larg->dynarray.field->offset,
						   larg->dynarray.field->size);
				if (larg->dynarray.field->elementsize)
					field_size = larg->dynarray.field->elementsize;
				/*
				 * The actual length of the dynamic array is stored
				 * in the top half of the field, and the offset
				 * is in the bottom half of the 32 bit field.
				 */
				offset &= 0xffff;
				offset += right;
				break;
3649
			case TEP_PRINT_FIELD:
3650 3651
				if (!larg->field.field) {
					larg->field.field =
3652
						tep_find_any_field(event, larg->field.name);
3653 3654 3655 3656
					if (!larg->field.field) {
						arg = larg;
						goto out_warning_field;
					}
3657 3658 3659 3660 3661 3662 3663 3664
				}
				field_size = larg->field.field->elementsize;
				offset = larg->field.field->offset +
					right * larg->field.field->elementsize;
				break;
			default:
				goto default_op; /* oops, all bets off */
			}
3665 3666
			val = tep_read_number(pevent,
					      data + offset, field_size);
3667 3668 3669 3670 3671 3672 3673 3674 3675 3676 3677 3678 3679 3680 3681 3682 3683 3684 3685 3686 3687 3688 3689 3690 3691
			if (typearg)
				val = eval_type(val, typearg, 1);
			break;
		} else if (strcmp(arg->op.op, "?") == 0) {
			left = eval_num_arg(data, size, event, arg->op.left);
			arg = arg->op.right;
			if (left)
				val = eval_num_arg(data, size, event, arg->op.left);
			else
				val = eval_num_arg(data, size, event, arg->op.right);
			break;
		}
 default_op:
		left = eval_num_arg(data, size, event, arg->op.left);
		right = eval_num_arg(data, size, event, arg->op.right);
		switch (arg->op.op[0]) {
		case '!':
			switch (arg->op.op[1]) {
			case 0:
				val = !right;
				break;
			case '=':
				val = left != right;
				break;
			default:
3692
				goto out_warning_op;
3693 3694 3695 3696 3697 3698 3699 3700 3701 3702 3703 3704 3705 3706 3707 3708 3709 3710 3711 3712 3713 3714 3715 3716 3717 3718 3719 3720 3721
			}
			break;
		case '~':
			val = ~right;
			break;
		case '|':
			if (arg->op.op[1])
				val = left || right;
			else
				val = left | right;
			break;
		case '&':
			if (arg->op.op[1])
				val = left && right;
			else
				val = left & right;
			break;
		case '<':
			switch (arg->op.op[1]) {
			case 0:
				val = left < right;
				break;
			case '<':
				val = left << right;
				break;
			case '=':
				val = left <= right;
				break;
			default:
3722
				goto out_warning_op;
3723 3724 3725 3726 3727 3728 3729 3730 3731 3732 3733 3734 3735 3736
			}
			break;
		case '>':
			switch (arg->op.op[1]) {
			case 0:
				val = left > right;
				break;
			case '>':
				val = left >> right;
				break;
			case '=':
				val = left >= right;
				break;
			default:
3737
				goto out_warning_op;
3738 3739 3740 3741
			}
			break;
		case '=':
			if (arg->op.op[1] != '=')
3742 3743
				goto out_warning_op;

3744 3745 3746 3747 3748 3749 3750 3751
			val = left == right;
			break;
		case '-':
			val = left - right;
			break;
		case '+':
			val = left + right;
			break;
3752 3753 3754
		case '/':
			val = left / right;
			break;
3755 3756 3757
		case '%':
			val = left % right;
			break;
3758 3759 3760
		case '*':
			val = left * right;
			break;
3761
		default:
3762
			goto out_warning_op;
3763 3764
		}
		break;
3765
	case TEP_PRINT_DYNAMIC_ARRAY_LEN:
3766 3767 3768
		offset = tep_read_number(pevent,
					 data + arg->dynarray.field->offset,
					 arg->dynarray.field->size);
3769 3770 3771 3772 3773 3774 3775
		/*
		 * The total allocated length of the dynamic array is
		 * stored in the top half of the field, and the offset
		 * is in the bottom half of the 32 bit field.
		 */
		val = (unsigned long long)(offset >> 16);
		break;
3776
	case TEP_PRINT_DYNAMIC_ARRAY:
3777
		/* Without [], we pass the address to the dynamic data */
3778 3779 3780
		offset = tep_read_number(pevent,
					 data + arg->dynarray.field->offset,
					 arg->dynarray.field->size);
3781
		/*
3782 3783
		 * The total allocated length of the dynamic array is
		 * stored in the top half of the field, and the offset
3784 3785 3786
		 * is in the bottom half of the 32 bit field.
		 */
		offset &= 0xffff;
3787
		val = (unsigned long long)((unsigned long)data + offset);
3788
		break;
3789 3790 3791 3792
	default: /* not sure what to do there */
		return 0;
	}
	return val;
3793 3794

out_warning_op:
3795
	do_warning_event(event, "%s: unknown op '%s'", __func__, arg->op.op);
3796 3797 3798
	return 0;

out_warning_field:
3799 3800
	do_warning_event(event, "%s: field %s not found",
			 __func__, arg->field.name);
3801
	return 0;
3802 3803 3804 3805 3806 3807 3808 3809 3810 3811 3812 3813 3814
}

struct flag {
	const char *name;
	unsigned long long value;
};

static const struct flag flags[] = {
	{ "HI_SOFTIRQ", 0 },
	{ "TIMER_SOFTIRQ", 1 },
	{ "NET_TX_SOFTIRQ", 2 },
	{ "NET_RX_SOFTIRQ", 3 },
	{ "BLOCK_SOFTIRQ", 4 },
3815
	{ "IRQ_POLL_SOFTIRQ", 5 },
3816 3817 3818 3819 3820 3821 3822 3823 3824
	{ "TASKLET_SOFTIRQ", 6 },
	{ "SCHED_SOFTIRQ", 7 },
	{ "HRTIMER_SOFTIRQ", 8 },
	{ "RCU_SOFTIRQ", 9 },

	{ "HRTIMER_NORESTART", 0 },
	{ "HRTIMER_RESTART", 1 },
};

3825
static long long eval_flag(const char *flag)
3826 3827 3828 3829 3830 3831 3832 3833 3834 3835 3836 3837 3838 3839 3840
{
	int i;

	/*
	 * Some flags in the format files do not get converted.
	 * If the flag is not numeric, see if it is something that
	 * we already know about.
	 */
	if (isdigit(flag[0]))
		return strtoull(flag, NULL, 0);

	for (i = 0; i < (int)(sizeof(flags)/sizeof(flags[0])); i++)
		if (strcmp(flags[i].name, flag) == 0)
			return flags[i].value;

3841
	return -1LL;
3842 3843 3844 3845 3846 3847 3848 3849 3850 3851 3852
}

static void print_str_to_seq(struct trace_seq *s, const char *format,
			     int len_arg, const char *str)
{
	if (len_arg >= 0)
		trace_seq_printf(s, format, len_arg, str);
	else
		trace_seq_printf(s, format, str);
}

3853
static void print_bitmask_to_seq(struct tep_handle *pevent,
3854 3855 3856 3857 3858 3859 3860 3861 3862 3863 3864 3865 3866 3867 3868 3869 3870 3871 3872 3873 3874 3875 3876 3877 3878 3879 3880 3881 3882
				 struct trace_seq *s, const char *format,
				 int len_arg, const void *data, int size)
{
	int nr_bits = size * 8;
	int str_size = (nr_bits + 3) / 4;
	int len = 0;
	char buf[3];
	char *str;
	int index;
	int i;

	/*
	 * The kernel likes to put in commas every 32 bits, we
	 * can do the same.
	 */
	str_size += (nr_bits - 1) / 32;

	str = malloc(str_size + 1);
	if (!str) {
		do_warning("%s: not enough memory!", __func__);
		return;
	}
	str[str_size] = 0;

	/* Start out with -2 for the two chars per byte */
	for (i = str_size - 2; i >= 0; i -= 2) {
		/*
		 * data points to a bit mask of size bytes.
		 * In the kernel, this is an array of long words, thus
3883
		 * endianness is very important.
3884 3885 3886 3887 3888 3889 3890 3891 3892 3893 3894 3895 3896 3897 3898 3899 3900 3901 3902 3903 3904 3905 3906
		 */
		if (pevent->file_bigendian)
			index = size - (len + 1);
		else
			index = len;

		snprintf(buf, 3, "%02x", *((unsigned char *)data + index));
		memcpy(str + i, buf, 2);
		len++;
		if (!(len & 3) && i > 0) {
			i--;
			str[i] = ',';
		}
	}

	if (len_arg >= 0)
		trace_seq_printf(s, format, len_arg, str);
	else
		trace_seq_printf(s, format, str);

	free(str);
}

3907
static void print_str_arg(struct trace_seq *s, void *data, int size,
3908
			  struct tep_event *event, const char *format,
3909
			  int len_arg, struct tep_print_arg *arg)
3910
{
3911
	struct tep_handle *pevent = event->pevent;
3912
	struct tep_print_flag_sym *flag;
3913
	struct tep_format_field *field;
3914
	struct printk_map *printk;
3915
	long long val, fval;
3916
	unsigned long long addr;
3917
	char *str;
3918
	unsigned char *hex;
3919
	int print;
3920
	int i, len;
3921 3922

	switch (arg->type) {
3923
	case TEP_PRINT_NULL:
3924 3925
		/* ?? */
		return;
3926
	case TEP_PRINT_ATOM:
3927 3928
		print_str_to_seq(s, format, len_arg, arg->atom.atom);
		return;
3929
	case TEP_PRINT_FIELD:
3930 3931
		field = arg->field.field;
		if (!field) {
3932
			field = tep_find_any_field(event, arg->field.name);
3933 3934 3935 3936
			if (!field) {
				str = arg->field.name;
				goto out_warning_field;
			}
3937
			arg->field.field = field;
3938 3939
		}
		/* Zero sized fields, mean the rest of the data */
3940
		len = field->size ? : size - field->offset;
3941 3942 3943 3944 3945 3946

		/*
		 * Some events pass in pointers. If this is not an array
		 * and the size is the same as long_size, assume that it
		 * is a pointer.
		 */
3947
		if (!(field->flags & TEP_FIELD_IS_ARRAY) &&
3948
		    field->size == pevent->long_size) {
3949 3950 3951 3952 3953 3954 3955 3956 3957 3958 3959 3960 3961 3962 3963 3964 3965 3966

			/* Handle heterogeneous recording and processing
			 * architectures
			 *
			 * CASE I:
			 * Traces recorded on 32-bit devices (32-bit
			 * addressing) and processed on 64-bit devices:
			 * In this case, only 32 bits should be read.
			 *
			 * CASE II:
			 * Traces recorded on 64 bit devices and processed
			 * on 32-bit devices:
			 * In this case, 64 bits must be read.
			 */
			addr = (pevent->long_size == 8) ?
				*(unsigned long long *)(data + field->offset) :
				(unsigned long long)*(unsigned int *)(data + field->offset);

3967 3968 3969 3970 3971
			/* Check if it matches a print format */
			printk = find_printk(pevent, addr);
			if (printk)
				trace_seq_puts(s, printk->printk);
			else
3972
				trace_seq_printf(s, "%llx", addr);
3973 3974
			break;
		}
3975 3976
		str = malloc(len + 1);
		if (!str) {
3977 3978
			do_warning_event(event, "%s: not enough memory!",
					 __func__);
3979 3980
			return;
		}
3981
		memcpy(str, data + field->offset, len);
3982 3983 3984 3985
		str[len] = 0;
		print_str_to_seq(s, format, len_arg, str);
		free(str);
		break;
3986
	case TEP_PRINT_FLAGS:
3987 3988 3989 3990
		val = eval_num_arg(data, size, event, arg->flags.field);
		print = 0;
		for (flag = arg->flags.flags; flag; flag = flag->next) {
			fval = eval_flag(flag->value);
3991
			if (!val && fval < 0) {
3992 3993 3994
				print_str_to_seq(s, format, len_arg, flag->str);
				break;
			}
3995
			if (fval > 0 && (val & fval) == fval) {
3996 3997 3998 3999 4000 4001 4002
				if (print && arg->flags.delim)
					trace_seq_puts(s, arg->flags.delim);
				print_str_to_seq(s, format, len_arg, flag->str);
				print = 1;
				val &= ~fval;
			}
		}
4003 4004 4005 4006 4007
		if (val) {
			if (print && arg->flags.delim)
				trace_seq_puts(s, arg->flags.delim);
			trace_seq_printf(s, "0x%llx", val);
		}
4008
		break;
4009
	case TEP_PRINT_SYMBOL:
4010 4011 4012 4013 4014 4015 4016 4017
		val = eval_num_arg(data, size, event, arg->symbol.field);
		for (flag = arg->symbol.symbols; flag; flag = flag->next) {
			fval = eval_flag(flag->value);
			if (val == fval) {
				print_str_to_seq(s, format, len_arg, flag->str);
				break;
			}
		}
4018 4019
		if (!flag)
			trace_seq_printf(s, "0x%llx", val);
4020
		break;
4021 4022 4023
	case TEP_PRINT_HEX:
	case TEP_PRINT_HEX_STR:
		if (arg->hex.field->type == TEP_PRINT_DYNAMIC_ARRAY) {
4024
			unsigned long offset;
4025
			offset = tep_read_number(pevent,
4026 4027 4028 4029 4030 4031 4032
				data + arg->hex.field->dynarray.field->offset,
				arg->hex.field->dynarray.field->size);
			hex = data + (offset & 0xffff);
		} else {
			field = arg->hex.field->field.field;
			if (!field) {
				str = arg->hex.field->field.name;
4033
				field = tep_find_any_field(event, str);
4034 4035 4036 4037 4038
				if (!field)
					goto out_warning_field;
				arg->hex.field->field.field = field;
			}
			hex = data + field->offset;
4039 4040 4041
		}
		len = eval_num_arg(data, size, event, arg->hex.size);
		for (i = 0; i < len; i++) {
4042
			if (i && arg->type == TEP_PRINT_HEX)
4043 4044 4045 4046
				trace_seq_putc(s, ' ');
			trace_seq_printf(s, "%02x", hex[i]);
		}
		break;
4047

4048
	case TEP_PRINT_INT_ARRAY: {
4049 4050 4051
		void *num;
		int el_size;

4052
		if (arg->int_array.field->type == TEP_PRINT_DYNAMIC_ARRAY) {
4053
			unsigned long offset;
4054
			struct tep_format_field *field =
4055
				arg->int_array.field->dynarray.field;
4056 4057 4058
			offset = tep_read_number(pevent,
						 data + field->offset,
						 field->size);
4059 4060 4061 4062 4063
			num = data + (offset & 0xffff);
		} else {
			field = arg->int_array.field->field.field;
			if (!field) {
				str = arg->int_array.field->field.name;
4064
				field = tep_find_any_field(event, str);
4065 4066 4067 4068 4069 4070 4071 4072 4073 4074 4075 4076 4077 4078 4079 4080 4081 4082 4083 4084
				if (!field)
					goto out_warning_field;
				arg->int_array.field->field.field = field;
			}
			num = data + field->offset;
		}
		len = eval_num_arg(data, size, event, arg->int_array.count);
		el_size = eval_num_arg(data, size, event,
				       arg->int_array.el_size);
		for (i = 0; i < len; i++) {
			if (i)
				trace_seq_putc(s, ' ');

			if (el_size == 1) {
				trace_seq_printf(s, "%u", *(uint8_t *)num);
			} else if (el_size == 2) {
				trace_seq_printf(s, "%u", *(uint16_t *)num);
			} else if (el_size == 4) {
				trace_seq_printf(s, "%u", *(uint32_t *)num);
			} else if (el_size == 8) {
4085
				trace_seq_printf(s, "%"PRIu64, *(uint64_t *)num);
4086 4087 4088 4089 4090 4091 4092 4093 4094 4095
			} else {
				trace_seq_printf(s, "BAD SIZE:%d 0x%x",
						 el_size, *(uint8_t *)num);
				el_size = 1;
			}

			num += el_size;
		}
		break;
	}
4096
	case TEP_PRINT_TYPE:
4097
		break;
4098
	case TEP_PRINT_STRING: {
4099 4100 4101
		int str_offset;

		if (arg->string.offset == -1) {
4102
			struct tep_format_field *f;
4103

4104
			f = tep_find_any_field(event, arg->string.string);
4105 4106
			arg->string.offset = f->offset;
		}
4107
		str_offset = tep_data2host4(pevent, *(unsigned int *)(data + arg->string.offset));
4108 4109 4110 4111
		str_offset &= 0xffff;
		print_str_to_seq(s, format, len_arg, ((char *)data) + str_offset);
		break;
	}
4112
	case TEP_PRINT_BSTRING:
4113
		print_str_to_seq(s, format, len_arg, arg->string.string);
4114
		break;
4115
	case TEP_PRINT_BITMASK: {
4116 4117 4118 4119
		int bitmask_offset;
		int bitmask_size;

		if (arg->bitmask.offset == -1) {
4120
			struct tep_format_field *f;
4121

4122
			f = tep_find_any_field(event, arg->bitmask.bitmask);
4123 4124
			arg->bitmask.offset = f->offset;
		}
4125
		bitmask_offset = tep_data2host4(pevent, *(unsigned int *)(data + arg->bitmask.offset));
4126 4127 4128 4129 4130 4131
		bitmask_size = bitmask_offset >> 16;
		bitmask_offset &= 0xffff;
		print_bitmask_to_seq(pevent, s, format, len_arg,
				     data + bitmask_offset, bitmask_size);
		break;
	}
4132
	case TEP_PRINT_OP:
4133 4134 4135 4136 4137 4138 4139 4140 4141 4142 4143 4144 4145
		/*
		 * The only op for string should be ? :
		 */
		if (arg->op.op[0] != '?')
			return;
		val = eval_num_arg(data, size, event, arg->op.left);
		if (val)
			print_str_arg(s, data, size, event,
				      format, len_arg, arg->op.right->op.left);
		else
			print_str_arg(s, data, size, event,
				      format, len_arg, arg->op.right->op.right);
		break;
4146
	case TEP_PRINT_FUNC:
4147 4148 4149 4150 4151 4152
		process_defined_func(s, data, size, event, arg);
		break;
	default:
		/* well... */
		break;
	}
4153 4154 4155 4156

	return;

out_warning_field:
4157 4158
	do_warning_event(event, "%s: field %s not found",
			 __func__, arg->field.name);
4159 4160 4161 4162
}

static unsigned long long
process_defined_func(struct trace_seq *s, void *data, int size,
4163
		     struct tep_event *event, struct tep_print_arg *arg)
4164
{
4165
	struct tep_function_handler *func_handle = arg->func.func;
4166
	struct func_params *param;
4167 4168
	unsigned long long *args;
	unsigned long long ret;
4169
	struct tep_print_arg *farg;
4170 4171 4172 4173 4174 4175 4176 4177 4178 4179 4180 4181 4182 4183 4184
	struct trace_seq str;
	struct save_str {
		struct save_str *next;
		char *str;
	} *strings = NULL, *string;
	int i;

	if (!func_handle->nr_args) {
		ret = (*func_handle->func)(s, NULL);
		goto out;
	}

	farg = arg->func.args;
	param = func_handle->params;

4185 4186 4187 4188 4189
	ret = ULLONG_MAX;
	args = malloc(sizeof(*args) * func_handle->nr_args);
	if (!args)
		goto out;

4190 4191
	for (i = 0; i < func_handle->nr_args; i++) {
		switch (param->type) {
4192 4193 4194
		case TEP_FUNC_ARG_INT:
		case TEP_FUNC_ARG_LONG:
		case TEP_FUNC_ARG_PTR:
4195 4196
			args[i] = eval_num_arg(data, size, event, farg);
			break;
4197
		case TEP_FUNC_ARG_STRING:
4198 4199 4200
			trace_seq_init(&str);
			print_str_arg(&str, data, size, event, "%s", -1, farg);
			trace_seq_terminate(&str);
4201 4202
			string = malloc(sizeof(*string));
			if (!string) {
4203 4204
				do_warning_event(event, "%s(%d): malloc str",
						 __func__, __LINE__);
4205 4206
				goto out_free;
			}
4207 4208
			string->next = strings;
			string->str = strdup(str.buffer);
4209 4210
			if (!string->str) {
				free(string);
4211 4212
				do_warning_event(event, "%s(%d): malloc str",
						 __func__, __LINE__);
4213 4214
				goto out_free;
			}
4215
			args[i] = (uintptr_t)string->str;
4216 4217 4218 4219 4220 4221 4222 4223
			strings = string;
			trace_seq_destroy(&str);
			break;
		default:
			/*
			 * Something went totally wrong, this is not
			 * an input error, something in this code broke.
			 */
4224
			do_warning_event(event, "Unexpected end of arguments\n");
4225
			goto out_free;
4226 4227
		}
		farg = farg->next;
4228
		param = param->next;
4229 4230 4231
	}

	ret = (*func_handle->func)(s, args);
4232
out_free:
4233 4234 4235 4236 4237 4238 4239 4240 4241 4242 4243 4244 4245
	free(args);
	while (strings) {
		string = strings;
		strings = string->next;
		free(string->str);
		free(string);
	}

 out:
	/* TBD : handle return type here */
	return ret;
}

4246
static void free_args(struct tep_print_arg *args)
4247
{
4248
	struct tep_print_arg *next;
4249 4250 4251 4252 4253 4254 4255 4256 4257

	while (args) {
		next = args->next;

		free_arg(args);
		args = next;
	}
}

4258
static struct tep_print_arg *make_bprint_args(char *fmt, void *data, int size, struct tep_event *event)
4259
{
4260
	struct tep_handle *pevent = event->pevent;
4261
	struct tep_format_field *field, *ip_field;
4262
	struct tep_print_arg *args, *arg, **next;
4263 4264 4265
	unsigned long long ip, val;
	char *ptr;
	void *bptr;
4266
	int vsize = 0;
4267 4268 4269 4270 4271

	field = pevent->bprint_buf_field;
	ip_field = pevent->bprint_ip_field;

	if (!field) {
4272
		field = tep_find_field(event, "buf");
4273
		if (!field) {
4274
			do_warning_event(event, "can't find buffer field for binary printk");
4275 4276
			return NULL;
		}
4277
		ip_field = tep_find_field(event, "ip");
4278
		if (!ip_field) {
4279
			do_warning_event(event, "can't find ip field for binary printk");
4280 4281
			return NULL;
		}
4282 4283 4284 4285
		pevent->bprint_buf_field = field;
		pevent->bprint_ip_field = ip_field;
	}

4286
	ip = tep_read_number(pevent, data + ip_field->offset, ip_field->size);
4287 4288 4289 4290 4291

	/*
	 * The first arg is the IP pointer.
	 */
	args = alloc_arg();
4292
	if (!args) {
4293 4294
		do_warning_event(event, "%s(%d): not enough memory!",
				 __func__, __LINE__);
4295 4296
		return NULL;
	}
4297 4298 4299 4300
	arg = args;
	arg->next = NULL;
	next = &arg->next;

4301
	arg->type = TEP_PRINT_ATOM;
4302 4303 4304
		
	if (asprintf(&arg->atom.atom, "%lld", ip) < 0)
		goto out_free;
4305

4306
	/* skip the first "%ps: " */
4307
	for (ptr = fmt + 5, bptr = data + field->offset;
4308 4309 4310 4311 4312 4313 4314 4315 4316 4317 4318 4319 4320 4321 4322 4323 4324
	     bptr < data + size && *ptr; ptr++) {
		int ls = 0;

		if (*ptr == '%') {
 process_again:
			ptr++;
			switch (*ptr) {
			case '%':
				break;
			case 'l':
				ls++;
				goto process_again;
			case 'L':
				ls = 2;
				goto process_again;
			case '0' ... '9':
				goto process_again;
4325 4326
			case '.':
				goto process_again;
4327 4328 4329 4330
			case 'z':
			case 'Z':
				ls = 1;
				goto process_again;
4331 4332
			case 'p':
				ls = 1;
4333 4334 4335 4336 4337 4338 4339 4340 4341 4342 4343 4344 4345 4346 4347 4348 4349 4350 4351 4352
				if (isalnum(ptr[1])) {
					ptr++;
					/* Check for special pointers */
					switch (*ptr) {
					case 's':
					case 'S':
					case 'f':
					case 'F':
						break;
					default:
						/*
						 * Older kernels do not process
						 * dereferenced pointers.
						 * Only process if the pointer
						 * value is a printable.
						 */
						if (isprint(*(char *)bptr))
							goto process_string;
					}
				}
4353 4354 4355 4356 4357 4358 4359
				/* fall through */
			case 'd':
			case 'u':
			case 'x':
			case 'i':
				switch (ls) {
				case 0:
4360
					vsize = 4;
4361 4362
					break;
				case 1:
4363
					vsize = pevent->long_size;
4364 4365
					break;
				case 2:
4366
					vsize = 8;
4367
					break;
4368
				default:
4369
					vsize = ls; /* ? */
4370 4371
					break;
				}
4372 4373 4374 4375 4376 4377 4378 4379
			/* fall through */
			case '*':
				if (*ptr == '*')
					vsize = 4;

				/* the pointers are always 4 bytes aligned */
				bptr = (void *)(((unsigned long)bptr + 3) &
						~3);
4380
				val = tep_read_number(pevent, bptr, vsize);
4381
				bptr += vsize;
4382
				arg = alloc_arg();
4383
				if (!arg) {
4384
					do_warning_event(event, "%s(%d): not enough memory!",
4385 4386 4387
						   __func__, __LINE__);
					goto out_free;
				}
4388
				arg->next = NULL;
4389
				arg->type = TEP_PRINT_ATOM;
4390 4391 4392 4393
				if (asprintf(&arg->atom.atom, "%lld", val) < 0) {
					free(arg);
					goto out_free;
				}
4394 4395
				*next = arg;
				next = &arg->next;
4396 4397 4398 4399 4400 4401 4402
				/*
				 * The '*' case means that an arg is used as the length.
				 * We need to continue to figure out for what.
				 */
				if (*ptr == '*')
					goto process_again;

4403 4404
				break;
			case 's':
4405
 process_string:
4406
				arg = alloc_arg();
4407
				if (!arg) {
4408
					do_warning_event(event, "%s(%d): not enough memory!",
4409 4410 4411
						   __func__, __LINE__);
					goto out_free;
				}
4412
				arg->next = NULL;
4413
				arg->type = TEP_PRINT_BSTRING;
4414
				arg->string.string = strdup(bptr);
4415
				if (!arg->string.string)
4416
					goto out_free;
4417 4418 4419 4420 4421 4422 4423 4424 4425 4426 4427
				bptr += strlen(bptr) + 1;
				*next = arg;
				next = &arg->next;
			default:
				break;
			}
		}
	}

	return args;

4428 4429 4430
out_free:
	free_args(args);
	return NULL;
4431 4432 4433
}

static char *
4434
get_bprint_format(void *data, int size __maybe_unused,
4435
		  struct tep_event *event)
4436
{
4437
	struct tep_handle *pevent = event->pevent;
4438
	unsigned long long addr;
4439
	struct tep_format_field *field;
4440 4441 4442 4443 4444 4445
	struct printk_map *printk;
	char *format;

	field = pevent->bprint_fmt_field;

	if (!field) {
4446
		field = tep_find_field(event, "fmt");
4447
		if (!field) {
4448
			do_warning_event(event, "can't find format field for binary printk");
4449 4450
			return NULL;
		}
4451 4452 4453
		pevent->bprint_fmt_field = field;
	}

4454
	addr = tep_read_number(pevent, data + field->offset, field->size);
4455 4456 4457

	printk = find_printk(pevent, addr);
	if (!printk) {
4458
		if (asprintf(&format, "%%pf: (NO FORMAT FOUND at %llx)\n", addr) < 0)
4459
			return NULL;
4460 4461 4462
		return format;
	}

4463
	if (asprintf(&format, "%s: %s", "%pf", printk->printk) < 0)
4464
		return NULL;
4465 4466 4467 4468 4469

	return format;
}

static void print_mac_arg(struct trace_seq *s, int mac, void *data, int size,
4470
			  struct tep_event *event, struct tep_print_arg *arg)
4471 4472
{
	unsigned char *buf;
4473
	const char *fmt = "%.2x:%.2x:%.2x:%.2x:%.2x:%.2x";
4474

4475
	if (arg->type == TEP_PRINT_FUNC) {
4476 4477 4478 4479
		process_defined_func(s, data, size, event, arg);
		return;
	}

4480
	if (arg->type != TEP_PRINT_FIELD) {
4481 4482 4483 4484 4485 4486 4487 4488 4489
		trace_seq_printf(s, "ARG TYPE NOT FIELD BUT %d",
				 arg->type);
		return;
	}

	if (mac == 'm')
		fmt = "%.2x%.2x%.2x%.2x%.2x%.2x";
	if (!arg->field.field) {
		arg->field.field =
4490
			tep_find_any_field(event, arg->field.name);
4491
		if (!arg->field.field) {
4492 4493
			do_warning_event(event, "%s: field %s not found",
					 __func__, arg->field.name);
4494 4495
			return;
		}
4496 4497 4498 4499 4500 4501 4502 4503 4504
	}
	if (arg->field.field->size != 6) {
		trace_seq_printf(s, "INVALIDMAC");
		return;
	}
	buf = data + arg->field.field->offset;
	trace_seq_printf(s, fmt, buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]);
}

4505 4506 4507 4508 4509 4510 4511 4512 4513 4514 4515 4516 4517 4518 4519 4520 4521 4522 4523 4524 4525 4526 4527 4528 4529 4530 4531 4532 4533 4534 4535 4536 4537 4538 4539 4540 4541 4542 4543 4544 4545 4546 4547 4548 4549 4550 4551 4552 4553 4554 4555 4556 4557 4558 4559 4560 4561 4562 4563 4564 4565 4566 4567 4568 4569 4570 4571 4572 4573 4574 4575 4576 4577 4578 4579 4580 4581 4582 4583 4584 4585 4586 4587 4588 4589 4590 4591 4592 4593 4594 4595 4596 4597 4598 4599 4600 4601 4602 4603 4604 4605 4606 4607 4608 4609 4610 4611 4612 4613 4614 4615 4616 4617 4618 4619 4620 4621 4622
static void print_ip4_addr(struct trace_seq *s, char i, unsigned char *buf)
{
	const char *fmt;

	if (i == 'i')
		fmt = "%03d.%03d.%03d.%03d";
	else
		fmt = "%d.%d.%d.%d";

	trace_seq_printf(s, fmt, buf[0], buf[1], buf[2], buf[3]);
}

static inline bool ipv6_addr_v4mapped(const struct in6_addr *a)
{
	return ((unsigned long)(a->s6_addr32[0] | a->s6_addr32[1]) |
		(unsigned long)(a->s6_addr32[2] ^ htonl(0x0000ffff))) == 0UL;
}

static inline bool ipv6_addr_is_isatap(const struct in6_addr *addr)
{
	return (addr->s6_addr32[2] | htonl(0x02000000)) == htonl(0x02005EFE);
}

static void print_ip6c_addr(struct trace_seq *s, unsigned char *addr)
{
	int i, j, range;
	unsigned char zerolength[8];
	int longest = 1;
	int colonpos = -1;
	uint16_t word;
	uint8_t hi, lo;
	bool needcolon = false;
	bool useIPv4;
	struct in6_addr in6;

	memcpy(&in6, addr, sizeof(struct in6_addr));

	useIPv4 = ipv6_addr_v4mapped(&in6) || ipv6_addr_is_isatap(&in6);

	memset(zerolength, 0, sizeof(zerolength));

	if (useIPv4)
		range = 6;
	else
		range = 8;

	/* find position of longest 0 run */
	for (i = 0; i < range; i++) {
		for (j = i; j < range; j++) {
			if (in6.s6_addr16[j] != 0)
				break;
			zerolength[i]++;
		}
	}
	for (i = 0; i < range; i++) {
		if (zerolength[i] > longest) {
			longest = zerolength[i];
			colonpos = i;
		}
	}
	if (longest == 1)		/* don't compress a single 0 */
		colonpos = -1;

	/* emit address */
	for (i = 0; i < range; i++) {
		if (i == colonpos) {
			if (needcolon || i == 0)
				trace_seq_printf(s, ":");
			trace_seq_printf(s, ":");
			needcolon = false;
			i += longest - 1;
			continue;
		}
		if (needcolon) {
			trace_seq_printf(s, ":");
			needcolon = false;
		}
		/* hex u16 without leading 0s */
		word = ntohs(in6.s6_addr16[i]);
		hi = word >> 8;
		lo = word & 0xff;
		if (hi)
			trace_seq_printf(s, "%x%02x", hi, lo);
		else
			trace_seq_printf(s, "%x", lo);

		needcolon = true;
	}

	if (useIPv4) {
		if (needcolon)
			trace_seq_printf(s, ":");
		print_ip4_addr(s, 'I', &in6.s6_addr[12]);
	}

	return;
}

static void print_ip6_addr(struct trace_seq *s, char i, unsigned char *buf)
{
	int j;

	for (j = 0; j < 16; j += 2) {
		trace_seq_printf(s, "%02x%02x", buf[j], buf[j+1]);
		if (i == 'I' && j < 14)
			trace_seq_printf(s, ":");
	}
}

/*
 * %pi4   print an IPv4 address with leading zeros
 * %pI4   print an IPv4 address without leading zeros
 * %pi6   print an IPv6 address without colons
 * %pI6   print an IPv6 address with colons
 * %pI6c  print an IPv6 address in compressed form with colons
 * %pISpc print an IP address based on sockaddr; p adds port.
 */
static int print_ipv4_arg(struct trace_seq *s, const char *ptr, char i,
4623
			  void *data, int size, struct tep_event *event,
4624
			  struct tep_print_arg *arg)
4625 4626 4627
{
	unsigned char *buf;

4628
	if (arg->type == TEP_PRINT_FUNC) {
4629 4630 4631 4632
		process_defined_func(s, data, size, event, arg);
		return 0;
	}

4633
	if (arg->type != TEP_PRINT_FIELD) {
4634 4635 4636 4637 4638 4639
		trace_seq_printf(s, "ARG TYPE NOT FIELD BUT %d", arg->type);
		return 0;
	}

	if (!arg->field.field) {
		arg->field.field =
4640
			tep_find_any_field(event, arg->field.name);
4641 4642 4643 4644 4645 4646 4647 4648 4649 4650 4651 4652 4653 4654 4655 4656 4657 4658 4659
		if (!arg->field.field) {
			do_warning("%s: field %s not found",
				   __func__, arg->field.name);
			return 0;
		}
	}

	buf = data + arg->field.field->offset;

	if (arg->field.field->size != 4) {
		trace_seq_printf(s, "INVALIDIPv4");
		return 0;
	}
	print_ip4_addr(s, i, buf);

	return 0;
}

static int print_ipv6_arg(struct trace_seq *s, const char *ptr, char i,
4660
			  void *data, int size, struct tep_event *event,
4661
			  struct tep_print_arg *arg)
4662 4663 4664 4665 4666 4667 4668 4669 4670 4671 4672 4673
{
	char have_c = 0;
	unsigned char *buf;
	int rc = 0;

	/* pI6c */
	if (i == 'I' && *ptr == 'c') {
		have_c = 1;
		ptr++;
		rc++;
	}

4674
	if (arg->type == TEP_PRINT_FUNC) {
4675 4676 4677 4678
		process_defined_func(s, data, size, event, arg);
		return rc;
	}

4679
	if (arg->type != TEP_PRINT_FIELD) {
4680 4681 4682 4683 4684 4685
		trace_seq_printf(s, "ARG TYPE NOT FIELD BUT %d", arg->type);
		return rc;
	}

	if (!arg->field.field) {
		arg->field.field =
4686
			tep_find_any_field(event, arg->field.name);
4687 4688 4689 4690 4691 4692 4693 4694 4695 4696 4697 4698 4699 4700 4701 4702 4703 4704 4705 4706 4707 4708 4709
		if (!arg->field.field) {
			do_warning("%s: field %s not found",
				   __func__, arg->field.name);
			return rc;
		}
	}

	buf = data + arg->field.field->offset;

	if (arg->field.field->size != 16) {
		trace_seq_printf(s, "INVALIDIPv6");
		return rc;
	}

	if (have_c)
		print_ip6c_addr(s, buf);
	else
		print_ip6_addr(s, i, buf);

	return rc;
}

static int print_ipsa_arg(struct trace_seq *s, const char *ptr, char i,
4710
			  void *data, int size, struct tep_event *event,
4711
			  struct tep_print_arg *arg)
4712 4713 4714 4715 4716 4717 4718 4719 4720 4721 4722 4723 4724 4725 4726 4727 4728 4729 4730 4731
{
	char have_c = 0, have_p = 0;
	unsigned char *buf;
	struct sockaddr_storage *sa;
	int rc = 0;

	/* pISpc */
	if (i == 'I') {
		if (*ptr == 'p') {
			have_p = 1;
			ptr++;
			rc++;
		}
		if (*ptr == 'c') {
			have_c = 1;
			ptr++;
			rc++;
		}
	}

4732
	if (arg->type == TEP_PRINT_FUNC) {
4733 4734 4735 4736
		process_defined_func(s, data, size, event, arg);
		return rc;
	}

4737
	if (arg->type != TEP_PRINT_FIELD) {
4738 4739 4740 4741 4742 4743
		trace_seq_printf(s, "ARG TYPE NOT FIELD BUT %d", arg->type);
		return rc;
	}

	if (!arg->field.field) {
		arg->field.field =
4744
			tep_find_any_field(event, arg->field.name);
4745 4746 4747 4748 4749 4750 4751 4752 4753 4754 4755 4756 4757 4758 4759 4760 4761 4762 4763 4764 4765 4766 4767 4768 4769 4770 4771 4772 4773 4774 4775 4776 4777 4778 4779 4780 4781 4782 4783 4784 4785 4786 4787 4788 4789 4790 4791
		if (!arg->field.field) {
			do_warning("%s: field %s not found",
				   __func__, arg->field.name);
			return rc;
		}
	}

	sa = (struct sockaddr_storage *) (data + arg->field.field->offset);

	if (sa->ss_family == AF_INET) {
		struct sockaddr_in *sa4 = (struct sockaddr_in *) sa;

		if (arg->field.field->size < sizeof(struct sockaddr_in)) {
			trace_seq_printf(s, "INVALIDIPv4");
			return rc;
		}

		print_ip4_addr(s, i, (unsigned char *) &sa4->sin_addr);
		if (have_p)
			trace_seq_printf(s, ":%d", ntohs(sa4->sin_port));


	} else if (sa->ss_family == AF_INET6) {
		struct sockaddr_in6 *sa6 = (struct sockaddr_in6 *) sa;

		if (arg->field.field->size < sizeof(struct sockaddr_in6)) {
			trace_seq_printf(s, "INVALIDIPv6");
			return rc;
		}

		if (have_p)
			trace_seq_printf(s, "[");

		buf = (unsigned char *) &sa6->sin6_addr;
		if (have_c)
			print_ip6c_addr(s, buf);
		else
			print_ip6_addr(s, i, buf);

		if (have_p)
			trace_seq_printf(s, "]:%d", ntohs(sa6->sin6_port));
	}

	return rc;
}

static int print_ip_arg(struct trace_seq *s, const char *ptr,
4792
			void *data, int size, struct tep_event *event,
4793
			struct tep_print_arg *arg)
4794 4795 4796 4797 4798 4799 4800 4801 4802 4803 4804 4805 4806 4807 4808 4809 4810 4811 4812 4813 4814 4815 4816 4817 4818 4819 4820 4821 4822
{
	char i = *ptr;  /* 'i' or 'I' */
	char ver;
	int rc = 0;

	ptr++;
	rc++;

	ver = *ptr;
	ptr++;
	rc++;

	switch (ver) {
	case '4':
		rc += print_ipv4_arg(s, ptr, i, data, size, event, arg);
		break;
	case '6':
		rc += print_ipv6_arg(s, ptr, i, data, size, event, arg);
		break;
	case 'S':
		rc += print_ipsa_arg(s, ptr, i, data, size, event, arg);
		break;
	default:
		return 0;
	}

	return rc;
}

4823 4824 4825 4826 4827
static int is_printable_array(char *p, unsigned int len)
{
	unsigned int i;

	for (i = 0; i < len && p[i]; i++)
4828
		if (!isprint(p[i]) && !isspace(p[i]))
4829 4830 4831 4832
		    return 0;
	return 1;
}

4833
void tep_print_field(struct trace_seq *s, void *data,
4834
		     struct tep_format_field *field)
4835 4836 4837
{
	unsigned long long val;
	unsigned int offset, len, i;
4838
	struct tep_handle *pevent = field->event->pevent;
4839

4840
	if (field->flags & TEP_FIELD_IS_ARRAY) {
4841 4842
		offset = field->offset;
		len = field->size;
4843
		if (field->flags & TEP_FIELD_IS_DYNAMIC) {
4844
			val = tep_read_number(pevent, data + offset, len);
4845 4846 4847 4848
			offset = val;
			len = offset >> 16;
			offset &= 0xffff;
		}
4849
		if (field->flags & TEP_FIELD_IS_STRING &&
4850 4851
		    is_printable_array(data + offset, len)) {
			trace_seq_printf(s, "%s", (char *)data + offset);
4852
		} else {
4853 4854 4855 4856 4857 4858 4859 4860
			trace_seq_puts(s, "ARRAY[");
			for (i = 0; i < len; i++) {
				if (i)
					trace_seq_puts(s, ", ");
				trace_seq_printf(s, "%02x",
						 *((unsigned char *)data + offset + i));
			}
			trace_seq_putc(s, ']');
4861
			field->flags &= ~TEP_FIELD_IS_STRING;
4862 4863
		}
	} else {
4864 4865
		val = tep_read_number(pevent, data + field->offset,
				      field->size);
4866
		if (field->flags & TEP_FIELD_IS_POINTER) {
4867
			trace_seq_printf(s, "0x%llx", val);
4868
		} else if (field->flags & TEP_FIELD_IS_SIGNED) {
4869 4870 4871 4872 4873 4874
			switch (field->size) {
			case 4:
				/*
				 * If field is long then print it in hex.
				 * A long usually stores pointers.
				 */
4875
				if (field->flags & TEP_FIELD_IS_LONG)
4876
					trace_seq_printf(s, "0x%x", (int)val);
4877
				else
4878 4879 4880 4881 4882 4883 4884 4885 4886 4887
					trace_seq_printf(s, "%d", (int)val);
				break;
			case 2:
				trace_seq_printf(s, "%2d", (short)val);
				break;
			case 1:
				trace_seq_printf(s, "%1d", (char)val);
				break;
			default:
				trace_seq_printf(s, "%lld", val);
4888
			}
4889
		} else {
4890
			if (field->flags & TEP_FIELD_IS_LONG)
4891 4892 4893
				trace_seq_printf(s, "0x%llx", val);
			else
				trace_seq_printf(s, "%llu", val);
4894
		}
4895 4896 4897
	}
}

4898
void tep_print_fields(struct trace_seq *s, void *data,
4899
		      int size __maybe_unused, struct tep_event *event)
4900
{
4901
	struct tep_format_field *field;
4902 4903 4904 4905

	field = event->format.fields;
	while (field) {
		trace_seq_printf(s, " %s=", field->name);
4906
		tep_print_field(s, data, field);
4907 4908 4909 4910
		field = field->next;
	}
}

4911
static void pretty_print(struct trace_seq *s, void *data, int size, struct tep_event *event)
4912
{
4913
	struct tep_handle *pevent = event->pevent;
4914 4915 4916
	struct tep_print_fmt *print_fmt = &event->print_fmt;
	struct tep_print_arg *arg = print_fmt->args;
	struct tep_print_arg *args = NULL;
4917 4918 4919 4920
	const char *ptr = print_fmt->format;
	unsigned long long val;
	struct func_map *func;
	const char *saveptr;
4921
	struct trace_seq p;
4922 4923 4924 4925
	char *bprint_fmt = NULL;
	char format[32];
	int show_func;
	int len_as_arg;
4926
	int len_arg = 0;
4927 4928 4929
	int len;
	int ls;

4930
	if (event->flags & TEP_EVENT_FL_FAILED) {
4931
		trace_seq_printf(s, "[FAILED TO PARSE]");
4932
		tep_print_fields(s, data, size, event);
4933 4934 4935
		return;
	}

4936
	if (event->flags & TEP_EVENT_FL_ISBPRINT) {
4937 4938 4939 4940 4941 4942 4943 4944 4945 4946 4947 4948 4949 4950 4951 4952 4953 4954 4955 4956 4957 4958 4959 4960 4961 4962 4963 4964 4965 4966 4967 4968 4969 4970 4971 4972 4973 4974 4975 4976 4977 4978 4979 4980 4981 4982 4983 4984 4985 4986 4987 4988
		bprint_fmt = get_bprint_format(data, size, event);
		args = make_bprint_args(bprint_fmt, data, size, event);
		arg = args;
		ptr = bprint_fmt;
	}

	for (; *ptr; ptr++) {
		ls = 0;
		if (*ptr == '\\') {
			ptr++;
			switch (*ptr) {
			case 'n':
				trace_seq_putc(s, '\n');
				break;
			case 't':
				trace_seq_putc(s, '\t');
				break;
			case 'r':
				trace_seq_putc(s, '\r');
				break;
			case '\\':
				trace_seq_putc(s, '\\');
				break;
			default:
				trace_seq_putc(s, *ptr);
				break;
			}

		} else if (*ptr == '%') {
			saveptr = ptr;
			show_func = 0;
			len_as_arg = 0;
 cont_process:
			ptr++;
			switch (*ptr) {
			case '%':
				trace_seq_putc(s, '%');
				break;
			case '#':
				/* FIXME: need to handle properly */
				goto cont_process;
			case 'h':
				ls--;
				goto cont_process;
			case 'l':
				ls++;
				goto cont_process;
			case 'L':
				ls = 2;
				goto cont_process;
			case '*':
				/* The argument is the length. */
4989
				if (!arg) {
4990
					do_warning_event(event, "no argument match");
4991
					event->flags |= TEP_EVENT_FL_FAILED;
4992 4993
					goto out_failed;
				}
4994 4995 4996 4997 4998 4999 5000 5001
				len_arg = eval_num_arg(data, size, event, arg);
				len_as_arg = 1;
				arg = arg->next;
				goto cont_process;
			case '.':
			case 'z':
			case 'Z':
			case '0' ... '9':
5002
			case '-':
5003 5004 5005 5006 5007 5008 5009
				goto cont_process;
			case 'p':
				if (pevent->long_size == 4)
					ls = 1;
				else
					ls = 2;

5010
				if (isalnum(ptr[1]))
5011
					ptr++;
5012

5013
				if (arg->type == TEP_PRINT_BSTRING) {
5014
					trace_seq_puts(s, arg->string.string);
5015
					arg = arg->next;
5016 5017 5018
					break;
				}

5019 5020
				if (*ptr == 'F' || *ptr == 'f' ||
				    *ptr == 'S' || *ptr == 's') {
5021
					show_func = *ptr;
5022 5023
				} else if (*ptr == 'M' || *ptr == 'm') {
					print_mac_arg(s, *ptr, data, size, event, arg);
5024
					arg = arg->next;
5025
					break;
5026
				} else if (*ptr == 'I' || *ptr == 'i') {
5027 5028
					int n;

5029
					n = print_ip_arg(s, ptr, data, size, event, arg);
5030
					if (n > 0) {
5031
						ptr += n - 1;
5032 5033 5034
						arg = arg->next;
						break;
					}
5035 5036 5037 5038 5039 5040 5041 5042
				}

				/* fall through */
			case 'd':
			case 'i':
			case 'x':
			case 'X':
			case 'u':
5043
				if (!arg) {
5044
					do_warning_event(event, "no argument match");
5045
					event->flags |= TEP_EVENT_FL_FAILED;
5046 5047
					goto out_failed;
				}
5048 5049 5050 5051 5052

				len = ((unsigned long)ptr + 1) -
					(unsigned long)saveptr;

				/* should never happen */
5053
				if (len > 31) {
5054
					do_warning_event(event, "bad format!");
5055
					event->flags |= TEP_EVENT_FL_FAILED;
5056 5057
					len = 31;
				}
5058 5059 5060 5061 5062 5063 5064 5065 5066 5067 5068 5069 5070 5071 5072 5073 5074 5075

				memcpy(format, saveptr, len);
				format[len] = 0;

				val = eval_num_arg(data, size, event, arg);
				arg = arg->next;

				if (show_func) {
					func = find_func(pevent, val);
					if (func) {
						trace_seq_puts(s, func->func);
						if (show_func == 'F')
							trace_seq_printf(s,
							       "+0x%llx",
							       val - func->addr);
						break;
					}
				}
5076
				if (pevent->long_size == 8 && ls == 1 &&
5077
				    sizeof(long) != 8) {
5078 5079 5080
					char *p;

					/* make %l into %ll */
5081
					if (ls == 1 && (p = strchr(format, 'l')))
5082
						memmove(p+1, p, strlen(p)+1);
5083 5084
					else if (strcmp(format, "%p") == 0)
						strcpy(format, "0x%llx");
5085
					ls = 2;
5086 5087 5088 5089 5090 5091 5092 5093 5094 5095 5096 5097 5098 5099 5100 5101 5102 5103 5104 5105 5106 5107 5108 5109 5110 5111 5112 5113 5114 5115 5116 5117 5118 5119
				}
				switch (ls) {
				case -2:
					if (len_as_arg)
						trace_seq_printf(s, format, len_arg, (char)val);
					else
						trace_seq_printf(s, format, (char)val);
					break;
				case -1:
					if (len_as_arg)
						trace_seq_printf(s, format, len_arg, (short)val);
					else
						trace_seq_printf(s, format, (short)val);
					break;
				case 0:
					if (len_as_arg)
						trace_seq_printf(s, format, len_arg, (int)val);
					else
						trace_seq_printf(s, format, (int)val);
					break;
				case 1:
					if (len_as_arg)
						trace_seq_printf(s, format, len_arg, (long)val);
					else
						trace_seq_printf(s, format, (long)val);
					break;
				case 2:
					if (len_as_arg)
						trace_seq_printf(s, format, len_arg,
								 (long long)val);
					else
						trace_seq_printf(s, format, (long long)val);
					break;
				default:
5120
					do_warning_event(event, "bad count (%d)", ls);
5121
					event->flags |= TEP_EVENT_FL_FAILED;
5122 5123 5124
				}
				break;
			case 's':
5125
				if (!arg) {
5126
					do_warning_event(event, "no matching argument");
5127
					event->flags |= TEP_EVENT_FL_FAILED;
5128 5129
					goto out_failed;
				}
5130 5131 5132 5133 5134

				len = ((unsigned long)ptr + 1) -
					(unsigned long)saveptr;

				/* should never happen */
5135
				if (len > 31) {
5136
					do_warning_event(event, "bad format!");
5137
					event->flags |= TEP_EVENT_FL_FAILED;
5138 5139
					len = 31;
				}
5140 5141 5142 5143 5144

				memcpy(format, saveptr, len);
				format[len] = 0;
				if (!len_as_arg)
					len_arg = -1;
5145 5146 5147
				/* Use helper trace_seq */
				trace_seq_init(&p);
				print_str_arg(&p, data, size, event,
5148
					      format, len_arg, arg);
5149 5150
				trace_seq_terminate(&p);
				trace_seq_puts(s, p.buffer);
5151
				trace_seq_destroy(&p);
5152 5153 5154 5155 5156 5157 5158 5159 5160 5161
				arg = arg->next;
				break;
			default:
				trace_seq_printf(s, ">%c<", *ptr);

			}
		} else
			trace_seq_putc(s, *ptr);
	}

5162
	if (event->flags & TEP_EVENT_FL_FAILED) {
5163 5164 5165 5166
out_failed:
		trace_seq_printf(s, "[FAILED TO PARSE]");
	}

5167 5168 5169 5170 5171 5172 5173
	if (args) {
		free_args(args);
		free(bprint_fmt);
	}
}

/**
5174
 * tep_data_lat_fmt - parse the data for the latency format
5175 5176
 * @pevent: a handle to the pevent
 * @s: the trace_seq to write to
5177
 * @record: the record to read from
5178 5179 5180 5181 5182
 *
 * This parses out the Latency format (interrupts disabled,
 * need rescheduling, in hard/soft interrupt, preempt count
 * and lock depth) and places it into the trace_seq.
 */
5183 5184
void tep_data_lat_fmt(struct tep_handle *pevent,
		      struct trace_seq *s, struct tep_record *record)
5185 5186
{
	static int check_lock_depth = 1;
5187
	static int check_migrate_disable = 1;
5188
	static int lock_depth_exists;
5189
	static int migrate_disable_exists;
5190 5191
	unsigned int lat_flags;
	unsigned int pc;
5192 5193
	int lock_depth = 0;
	int migrate_disable = 0;
5194 5195 5196 5197 5198 5199 5200 5201 5202
	int hardirq;
	int softirq;
	void *data = record->data;

	lat_flags = parse_common_flags(pevent, data);
	pc = parse_common_pc(pevent, data);
	/* lock_depth may not always exist */
	if (lock_depth_exists)
		lock_depth = parse_common_lock_depth(pevent, data);
5203 5204 5205 5206 5207 5208 5209 5210 5211 5212 5213 5214 5215 5216 5217 5218 5219 5220
	else if (check_lock_depth) {
		lock_depth = parse_common_lock_depth(pevent, data);
		if (lock_depth < 0)
			check_lock_depth = 0;
		else
			lock_depth_exists = 1;
	}

	/* migrate_disable may not always exist */
	if (migrate_disable_exists)
		migrate_disable = parse_common_migrate_disable(pevent, data);
	else if (check_migrate_disable) {
		migrate_disable = parse_common_migrate_disable(pevent, data);
		if (migrate_disable < 0)
			check_migrate_disable = 0;
		else
			migrate_disable_exists = 1;
	}
5221 5222 5223 5224 5225 5226 5227 5228 5229 5230 5231 5232 5233 5234 5235 5236 5237 5238

	hardirq = lat_flags & TRACE_FLAG_HARDIRQ;
	softirq = lat_flags & TRACE_FLAG_SOFTIRQ;

	trace_seq_printf(s, "%c%c%c",
	       (lat_flags & TRACE_FLAG_IRQS_OFF) ? 'd' :
	       (lat_flags & TRACE_FLAG_IRQS_NOSUPPORT) ?
	       'X' : '.',
	       (lat_flags & TRACE_FLAG_NEED_RESCHED) ?
	       'N' : '.',
	       (hardirq && softirq) ? 'H' :
	       hardirq ? 'h' : softirq ? 's' : '.');

	if (pc)
		trace_seq_printf(s, "%x", pc);
	else
		trace_seq_putc(s, '.');

5239 5240 5241 5242 5243 5244 5245
	if (migrate_disable_exists) {
		if (migrate_disable < 0)
			trace_seq_putc(s, '.');
		else
			trace_seq_printf(s, "%d", migrate_disable);
	}

5246 5247 5248 5249 5250 5251 5252 5253 5254 5255 5256
	if (lock_depth_exists) {
		if (lock_depth < 0)
			trace_seq_putc(s, '.');
		else
			trace_seq_printf(s, "%d", lock_depth);
	}

	trace_seq_terminate(s);
}

/**
5257
 * tep_data_type - parse out the given event type
5258 5259 5260 5261 5262
 * @pevent: a handle to the pevent
 * @rec: the record to read from
 *
 * This returns the event id from the @rec.
 */
5263
int tep_data_type(struct tep_handle *pevent, struct tep_record *rec)
5264 5265 5266 5267 5268
{
	return trace_parse_common_type(pevent, rec->data);
}

/**
5269
 * tep_data_pid - parse the PID from record
5270 5271 5272
 * @pevent: a handle to the pevent
 * @rec: the record to parse
 *
5273
 * This returns the PID from a record.
5274
 */
5275
int tep_data_pid(struct tep_handle *pevent, struct tep_record *rec)
5276 5277 5278 5279
{
	return parse_common_pid(pevent, rec->data);
}

5280
/**
5281
 * tep_data_preempt_count - parse the preempt count from the record
5282 5283 5284 5285 5286
 * @pevent: a handle to the pevent
 * @rec: the record to parse
 *
 * This returns the preempt count from a record.
 */
5287
int tep_data_preempt_count(struct tep_handle *pevent, struct tep_record *rec)
5288 5289 5290 5291 5292
{
	return parse_common_pc(pevent, rec->data);
}

/**
5293
 * tep_data_flags - parse the latency flags from the record
5294 5295 5296 5297 5298 5299 5300
 * @pevent: a handle to the pevent
 * @rec: the record to parse
 *
 * This returns the latency flags from a record.
 *
 *  Use trace_flag_type enum for the flags (see event-parse.h).
 */
5301
int tep_data_flags(struct tep_handle *pevent, struct tep_record *rec)
5302 5303 5304 5305
{
	return parse_common_flags(pevent, rec->data);
}

5306
/**
5307
 * tep_data_comm_from_pid - return the command line from PID
5308 5309 5310 5311 5312 5313
 * @pevent: a handle to the pevent
 * @pid: the PID of the task to search for
 *
 * This returns a pointer to the command line that has the given
 * @pid.
 */
5314
const char *tep_data_comm_from_pid(struct tep_handle *pevent, int pid)
5315 5316 5317 5318 5319 5320 5321
{
	const char *comm;

	comm = find_cmdline(pevent, pid);
	return comm;
}

5322 5323
static struct tep_cmdline *
pid_from_cmdlist(struct tep_handle *pevent, const char *comm, struct tep_cmdline *next)
5324 5325 5326 5327 5328 5329 5330 5331 5332 5333 5334
{
	struct cmdline_list *cmdlist = (struct cmdline_list *)next;

	if (cmdlist)
		cmdlist = cmdlist->next;
	else
		cmdlist = pevent->cmdlist;

	while (cmdlist && strcmp(cmdlist->comm, comm) != 0)
		cmdlist = cmdlist->next;

5335
	return (struct tep_cmdline *)cmdlist;
5336 5337 5338
}

/**
5339
 * tep_data_pid_from_comm - return the pid from a given comm
5340 5341 5342 5343 5344 5345 5346
 * @pevent: a handle to the pevent
 * @comm: the cmdline to find the pid from
 * @next: the cmdline structure to find the next comm
 *
 * This returns the cmdline structure that holds a pid for a given
 * comm, or NULL if none found. As there may be more than one pid for
 * a given comm, the result of this call can be passed back into
5347
 * a recurring call in the @next parameter, and then it will find the
5348
 * next pid.
5349
 * Also, it does a linear search, so it may be slow.
5350
 */
5351 5352
struct tep_cmdline *tep_data_pid_from_comm(struct tep_handle *pevent, const char *comm,
					   struct tep_cmdline *next)
5353
{
5354
	struct tep_cmdline *cmdline;
5355 5356 5357 5358 5359 5360 5361 5362 5363 5364 5365 5366 5367 5368 5369 5370 5371 5372 5373 5374 5375 5376 5377 5378 5379 5380 5381 5382 5383 5384 5385 5386

	/*
	 * If the cmdlines have not been converted yet, then use
	 * the list.
	 */
	if (!pevent->cmdlines)
		return pid_from_cmdlist(pevent, comm, next);

	if (next) {
		/*
		 * The next pointer could have been still from
		 * a previous call before cmdlines were created
		 */
		if (next < pevent->cmdlines ||
		    next >= pevent->cmdlines + pevent->cmdline_count)
			next = NULL;
		else
			cmdline  = next++;
	}

	if (!next)
		cmdline = pevent->cmdlines;

	while (cmdline < pevent->cmdlines + pevent->cmdline_count) {
		if (strcmp(cmdline->comm, comm) == 0)
			return cmdline;
		cmdline++;
	}
	return NULL;
}

/**
5387
 * tep_cmdline_pid - return the pid associated to a given cmdline
5388 5389 5390 5391 5392
 * @cmdline: The cmdline structure to get the pid from
 *
 * Returns the pid for a give cmdline. If @cmdline is NULL, then
 * -1 is returned.
 */
5393
int tep_cmdline_pid(struct tep_handle *pevent, struct tep_cmdline *cmdline)
5394 5395 5396 5397 5398 5399 5400 5401 5402 5403 5404 5405 5406 5407 5408 5409 5410 5411
{
	struct cmdline_list *cmdlist = (struct cmdline_list *)cmdline;

	if (!cmdline)
		return -1;

	/*
	 * If cmdlines have not been created yet, or cmdline is
	 * not part of the array, then treat it as a cmdlist instead.
	 */
	if (!pevent->cmdlines ||
	    cmdline < pevent->cmdlines ||
	    cmdline >= pevent->cmdlines + pevent->cmdline_count)
		return cmdlist->pid;

	return cmdline->pid;
}

5412
/**
5413
 * tep_event_info - parse the data into the print format
5414 5415
 * @s: the trace_seq to write to
 * @event: the handle to the event
5416
 * @record: the record to read from
5417 5418 5419 5420
 *
 * This parses the raw @data using the given @event information and
 * writes the print format into the trace_seq.
 */
5421
void tep_event_info(struct trace_seq *s, struct tep_event *event,
5422
		    struct tep_record *record)
5423 5424 5425
{
	int print_pretty = 1;

5426
	if (event->pevent->print_raw || (event->flags & TEP_EVENT_FL_PRINTRAW))
5427
		tep_print_fields(s, record->data, record->size, event);
5428 5429
	else {

5430
		if (event->handler && !(event->flags & TEP_EVENT_FL_NOHANDLE))
5431 5432 5433 5434 5435 5436 5437 5438 5439 5440
			print_pretty = event->handler(s, record, event,
						      event->context);

		if (print_pretty)
			pretty_print(s, record->data, record->size, event);
	}

	trace_seq_terminate(s);
}

5441 5442
static bool is_timestamp_in_us(char *trace_clock, bool use_trace_clock)
{
5443
	if (!trace_clock || !use_trace_clock)
5444 5445 5446 5447 5448 5449 5450 5451 5452 5453
		return true;

	if (!strcmp(trace_clock, "local") || !strcmp(trace_clock, "global")
	    || !strcmp(trace_clock, "uptime") || !strcmp(trace_clock, "perf"))
		return true;

	/* trace_clock is setting in tsc or counter mode */
	return false;
}

5454
/**
5455
 * tep_find_event_by_record - return the event from a given record
5456 5457 5458 5459 5460 5461
 * @pevent: a handle to the pevent
 * @record: The record to get the event from
 *
 * Returns the associated event for a given record, or NULL if non is
 * is found.
 */
5462
struct tep_event *
5463
tep_find_event_by_record(struct tep_handle *pevent, struct tep_record *record)
5464 5465 5466 5467 5468
{
	int type;

	if (record->size < 0) {
		do_warning("ug! negative record size %d", record->size);
5469
		return NULL;
5470 5471
	}

5472
	type = trace_parse_common_type(pevent, record->data);
5473

5474
	return tep_find_event(pevent, type);
5475 5476 5477
}

/**
5478
 * tep_print_event_task - Write the event task comm, pid and CPU
5479 5480 5481 5482 5483 5484 5485
 * @pevent: a handle to the pevent
 * @s: the trace_seq to write to
 * @event: the handle to the record's event
 * @record: The record to get the event from
 *
 * Writes the tasks comm, pid and CPU to @s.
 */
5486
void tep_print_event_task(struct tep_handle *pevent, struct trace_seq *s,
5487
			  struct tep_event *event,
5488
			  struct tep_record *record)
5489 5490 5491 5492
{
	void *data = record->data;
	const char *comm;
	int pid;
5493 5494 5495 5496 5497 5498 5499 5500 5501

	pid = parse_common_pid(pevent, data);
	comm = find_cmdline(pevent, pid);

	if (pevent->latency_format) {
		trace_seq_printf(s, "%8.8s-%-5d %3d",
		       comm, pid, record->cpu);
	} else
		trace_seq_printf(s, "%16s-%-5d [%03d]", comm, pid, record->cpu);
5502 5503 5504
}

/**
5505
 * tep_print_event_time - Write the event timestamp
5506 5507 5508 5509 5510 5511 5512 5513
 * @pevent: a handle to the pevent
 * @s: the trace_seq to write to
 * @event: the handle to the record's event
 * @record: The record to get the event from
 * @use_trace_clock: Set to parse according to the @pevent->trace_clock
 *
 * Writes the timestamp of the record into @s.
 */
5514
void tep_print_event_time(struct tep_handle *pevent, struct trace_seq *s,
5515
			  struct tep_event *event,
5516 5517
			  struct tep_record *record,
			  bool use_trace_clock)
5518 5519 5520 5521 5522 5523 5524 5525 5526 5527
{
	unsigned long secs;
	unsigned long usecs;
	unsigned long nsecs;
	int p;
	bool use_usec_format;

	use_usec_format = is_timestamp_in_us(pevent->trace_clock,
							use_trace_clock);
	if (use_usec_format) {
5528 5529
		secs = record->ts / NSEC_PER_SEC;
		nsecs = record->ts - secs * NSEC_PER_SEC;
5530 5531 5532
	}

	if (pevent->latency_format) {
5533
		tep_data_lat_fmt(pevent, s, record);
5534
	}
5535

5536
	if (use_usec_format) {
5537
		if (pevent->flags & TEP_NSEC_OUTPUT) {
5538 5539 5540
			usecs = nsecs;
			p = 9;
		} else {
5541
			usecs = (nsecs + 500) / NSEC_PER_USEC;
5542
			/* To avoid usecs larger than 1 sec */
5543 5544
			if (usecs >= USEC_PER_SEC) {
				usecs -= USEC_PER_SEC;
5545 5546
				secs++;
			}
5547 5548
			p = 6;
		}
5549

5550
		trace_seq_printf(s, " %5lu.%0*lu:", secs, p, usecs);
5551
	} else
5552 5553 5554 5555
		trace_seq_printf(s, " %12llu:", record->ts);
}

/**
5556
 * tep_print_event_data - Write the event data section
5557 5558 5559 5560 5561 5562 5563
 * @pevent: a handle to the pevent
 * @s: the trace_seq to write to
 * @event: the handle to the record's event
 * @record: The record to get the event from
 *
 * Writes the parsing of the record's data to @s.
 */
5564
void tep_print_event_data(struct tep_handle *pevent, struct trace_seq *s,
5565
			  struct tep_event *event,
5566
			  struct tep_record *record)
5567 5568 5569 5570 5571
{
	static const char *spaces = "                    "; /* 20 spaces */
	int len;

	trace_seq_printf(s, " %s: ", event->name);
5572 5573 5574 5575 5576 5577

	/* Space out the event names evenly. */
	len = strlen(event->name);
	if (len < 20)
		trace_seq_printf(s, "%.*s", 20 - len, spaces);

5578
	tep_event_info(s, event, record);
5579 5580
}

5581 5582
void tep_print_event(struct tep_handle *pevent, struct trace_seq *s,
		     struct tep_record *record, bool use_trace_clock)
5583
{
5584
	struct tep_event *event;
5585

5586
	event = tep_find_event_by_record(pevent, record);
5587
	if (!event) {
5588 5589 5590 5591 5592 5593 5594 5595
		int i;
		int type = trace_parse_common_type(pevent, record->data);

		do_warning("ug! no event found for type %d", type);
		trace_seq_printf(s, "[UNKNOWN TYPE %d]", type);
		for (i = 0; i < record->size; i++)
			trace_seq_printf(s, " %02x",
					 ((unsigned char *)record->data)[i]);
5596 5597 5598
		return;
	}

5599 5600 5601
	tep_print_event_task(pevent, s, event, record);
	tep_print_event_time(pevent, s, event, record, use_trace_clock);
	tep_print_event_data(pevent, s, event, record);
5602 5603
}

5604 5605
static int events_id_cmp(const void *a, const void *b)
{
5606 5607
	struct tep_event * const * ea = a;
	struct tep_event * const * eb = b;
5608 5609 5610 5611 5612 5613 5614 5615 5616 5617 5618 5619

	if ((*ea)->id < (*eb)->id)
		return -1;

	if ((*ea)->id > (*eb)->id)
		return 1;

	return 0;
}

static int events_name_cmp(const void *a, const void *b)
{
5620 5621
	struct tep_event * const * ea = a;
	struct tep_event * const * eb = b;
5622 5623 5624 5625 5626 5627 5628 5629 5630 5631 5632 5633 5634 5635 5636
	int res;

	res = strcmp((*ea)->name, (*eb)->name);
	if (res)
		return res;

	res = strcmp((*ea)->system, (*eb)->system);
	if (res)
		return res;

	return events_id_cmp(a, b);
}

static int events_system_cmp(const void *a, const void *b)
{
5637 5638
	struct tep_event * const * ea = a;
	struct tep_event * const * eb = b;
5639 5640 5641 5642 5643 5644 5645 5646 5647 5648 5649 5650 5651
	int res;

	res = strcmp((*ea)->system, (*eb)->system);
	if (res)
		return res;

	res = strcmp((*ea)->name, (*eb)->name);
	if (res)
		return res;

	return events_id_cmp(a, b);
}

5652
struct tep_event **tep_list_events(struct tep_handle *pevent, enum tep_event_sort_type sort_type)
5653
{
5654
	struct tep_event **events;
5655 5656 5657 5658 5659 5660 5661 5662 5663 5664 5665 5666 5667 5668 5669 5670 5671 5672
	int (*sort)(const void *a, const void *b);

	events = pevent->sort_events;

	if (events && pevent->last_type == sort_type)
		return events;

	if (!events) {
		events = malloc(sizeof(*events) * (pevent->nr_events + 1));
		if (!events)
			return NULL;

		memcpy(events, pevent->events, sizeof(*events) * pevent->nr_events);
		events[pevent->nr_events] = NULL;

		pevent->sort_events = events;

		/* the internal events are sorted by id */
5673
		if (sort_type == TEP_EVENT_SORT_ID) {
5674 5675 5676 5677 5678 5679
			pevent->last_type = sort_type;
			return events;
		}
	}

	switch (sort_type) {
5680
	case TEP_EVENT_SORT_ID:
5681 5682
		sort = events_id_cmp;
		break;
5683
	case TEP_EVENT_SORT_NAME:
5684 5685
		sort = events_name_cmp;
		break;
5686
	case TEP_EVENT_SORT_SYSTEM:
5687 5688 5689 5690 5691 5692 5693 5694 5695 5696 5697 5698
		sort = events_system_cmp;
		break;
	default:
		return events;
	}

	qsort(events, pevent->nr_events, sizeof(*events), sort);
	pevent->last_type = sort_type;

	return events;
}

5699
static struct tep_format_field **
5700
get_event_fields(const char *type, const char *name,
5701
		 int count, struct tep_format_field *list)
5702
{
5703 5704
	struct tep_format_field **fields;
	struct tep_format_field *field;
5705 5706
	int i = 0;

5707 5708 5709 5710
	fields = malloc(sizeof(*fields) * (count + 1));
	if (!fields)
		return NULL;

5711 5712 5713 5714 5715 5716 5717 5718 5719 5720 5721 5722 5723 5724 5725 5726 5727 5728 5729 5730
	for (field = list; field; field = field->next) {
		fields[i++] = field;
		if (i == count + 1) {
			do_warning("event %s has more %s fields than specified",
				name, type);
			i--;
			break;
		}
	}

	if (i != count)
		do_warning("event %s has less %s fields than specified",
			name, type);

	fields[i] = NULL;

	return fields;
}

/**
5731
 * tep_event_common_fields - return a list of common fields for an event
5732 5733 5734 5735 5736
 * @event: the event to return the common fields of.
 *
 * Returns an allocated array of fields. The last item in the array is NULL.
 * The array must be freed with free().
 */
5737
struct tep_format_field **tep_event_common_fields(struct tep_event *event)
5738 5739 5740 5741 5742 5743 5744
{
	return get_event_fields("common", event->name,
				event->format.nr_common,
				event->format.common_fields);
}

/**
5745
 * tep_event_fields - return a list of event specific fields for an event
5746 5747 5748 5749 5750
 * @event: the event to return the fields of.
 *
 * Returns an allocated array of fields. The last item in the array is NULL.
 * The array must be freed with free().
 */
5751
struct tep_format_field **tep_event_fields(struct tep_event *event)
5752 5753 5754 5755 5756 5757
{
	return get_event_fields("event", event->name,
				event->format.nr_fields,
				event->format.fields);
}

5758
static void print_fields(struct trace_seq *s, struct tep_print_flag_sym *field)
5759 5760 5761 5762 5763 5764 5765 5766 5767
{
	trace_seq_printf(s, "{ %s, %s }", field->value, field->str);
	if (field->next) {
		trace_seq_puts(s, ", ");
		print_fields(s, field->next);
	}
}

/* for debugging */
5768
static void print_args(struct tep_print_arg *args)
5769 5770 5771 5772 5773
{
	int print_paren = 1;
	struct trace_seq s;

	switch (args->type) {
5774
	case TEP_PRINT_NULL:
5775 5776
		printf("null");
		break;
5777
	case TEP_PRINT_ATOM:
5778 5779
		printf("%s", args->atom.atom);
		break;
5780
	case TEP_PRINT_FIELD:
5781 5782
		printf("REC->%s", args->field.name);
		break;
5783
	case TEP_PRINT_FLAGS:
5784 5785 5786 5787 5788 5789 5790 5791 5792
		printf("__print_flags(");
		print_args(args->flags.field);
		printf(", %s, ", args->flags.delim);
		trace_seq_init(&s);
		print_fields(&s, args->flags.flags);
		trace_seq_do_printf(&s);
		trace_seq_destroy(&s);
		printf(")");
		break;
5793
	case TEP_PRINT_SYMBOL:
5794 5795 5796 5797 5798 5799 5800 5801 5802
		printf("__print_symbolic(");
		print_args(args->symbol.field);
		printf(", ");
		trace_seq_init(&s);
		print_fields(&s, args->symbol.symbols);
		trace_seq_do_printf(&s);
		trace_seq_destroy(&s);
		printf(")");
		break;
5803
	case TEP_PRINT_HEX:
5804 5805 5806 5807 5808 5809
		printf("__print_hex(");
		print_args(args->hex.field);
		printf(", ");
		print_args(args->hex.size);
		printf(")");
		break;
5810
	case TEP_PRINT_HEX_STR:
5811 5812 5813 5814 5815 5816
		printf("__print_hex_str(");
		print_args(args->hex.field);
		printf(", ");
		print_args(args->hex.size);
		printf(")");
		break;
5817
	case TEP_PRINT_INT_ARRAY:
5818 5819 5820 5821 5822 5823 5824 5825
		printf("__print_array(");
		print_args(args->int_array.field);
		printf(", ");
		print_args(args->int_array.count);
		printf(", ");
		print_args(args->int_array.el_size);
		printf(")");
		break;
5826 5827
	case TEP_PRINT_STRING:
	case TEP_PRINT_BSTRING:
5828 5829
		printf("__get_str(%s)", args->string.string);
		break;
5830
	case TEP_PRINT_BITMASK:
5831 5832
		printf("__get_bitmask(%s)", args->bitmask.bitmask);
		break;
5833
	case TEP_PRINT_TYPE:
5834 5835 5836
		printf("(%s)", args->typecast.type);
		print_args(args->typecast.item);
		break;
5837
	case TEP_PRINT_OP:
5838 5839 5840 5841 5842 5843 5844 5845 5846 5847 5848 5849 5850 5851 5852 5853 5854 5855 5856 5857 5858 5859 5860 5861 5862 5863 5864 5865 5866 5867 5868
		if (strcmp(args->op.op, ":") == 0)
			print_paren = 0;
		if (print_paren)
			printf("(");
		print_args(args->op.left);
		printf(" %s ", args->op.op);
		print_args(args->op.right);
		if (print_paren)
			printf(")");
		break;
	default:
		/* we should warn... */
		return;
	}
	if (args->next) {
		printf("\n");
		print_args(args->next);
	}
}

static void parse_header_field(const char *field,
			       int *offset, int *size, int mandatory)
{
	unsigned long long save_input_buf_ptr;
	unsigned long long save_input_buf_siz;
	char *token;
	int type;

	save_input_buf_ptr = input_buf_ptr;
	save_input_buf_siz = input_buf_siz;

5869
	if (read_expected(TEP_EVENT_ITEM, "field") < 0)
5870
		return;
5871
	if (read_expected(TEP_EVENT_OP, ":") < 0)
5872 5873 5874
		return;

	/* type */
5875
	if (read_expect_type(TEP_EVENT_ITEM, &token) < 0)
5876 5877 5878 5879 5880 5881 5882
		goto fail;
	free_token(token);

	/*
	 * If this is not a mandatory field, then test it first.
	 */
	if (mandatory) {
5883
		if (read_expected(TEP_EVENT_ITEM, field) < 0)
5884 5885
			return;
	} else {
5886
		if (read_expect_type(TEP_EVENT_ITEM, &token) < 0)
5887 5888 5889 5890 5891 5892
			goto fail;
		if (strcmp(token, field) != 0)
			goto discard;
		free_token(token);
	}

5893
	if (read_expected(TEP_EVENT_OP, ";") < 0)
5894
		return;
5895
	if (read_expected(TEP_EVENT_ITEM, "offset") < 0)
5896
		return;
5897
	if (read_expected(TEP_EVENT_OP, ":") < 0)
5898
		return;
5899
	if (read_expect_type(TEP_EVENT_ITEM, &token) < 0)
5900 5901 5902
		goto fail;
	*offset = atoi(token);
	free_token(token);
5903
	if (read_expected(TEP_EVENT_OP, ";") < 0)
5904
		return;
5905
	if (read_expected(TEP_EVENT_ITEM, "size") < 0)
5906
		return;
5907
	if (read_expected(TEP_EVENT_OP, ":") < 0)
5908
		return;
5909
	if (read_expect_type(TEP_EVENT_ITEM, &token) < 0)
5910 5911 5912
		goto fail;
	*size = atoi(token);
	free_token(token);
5913
	if (read_expected(TEP_EVENT_OP, ";") < 0)
5914 5915
		return;
	type = read_token(&token);
5916
	if (type != TEP_EVENT_NEWLINE) {
5917
		/* newer versions of the kernel have a "signed" type */
5918
		if (type != TEP_EVENT_ITEM)
5919 5920 5921 5922 5923 5924 5925
			goto fail;

		if (strcmp(token, "signed") != 0)
			goto fail;

		free_token(token);

5926
		if (read_expected(TEP_EVENT_OP, ":") < 0)
5927 5928
			return;

5929
		if (read_expect_type(TEP_EVENT_ITEM, &token))
5930 5931 5932
			goto fail;

		free_token(token);
5933
		if (read_expected(TEP_EVENT_OP, ";") < 0)
5934 5935
			return;

5936
		if (read_expect_type(TEP_EVENT_NEWLINE, &token))
5937 5938 5939 5940 5941 5942 5943 5944 5945 5946 5947 5948 5949 5950 5951
			goto fail;
	}
 fail:
	free_token(token);
	return;

 discard:
	input_buf_ptr = save_input_buf_ptr;
	input_buf_siz = save_input_buf_siz;
	*offset = 0;
	*size = 0;
	free_token(token);
}

/**
5952
 * tep_parse_header_page - parse the data stored in the header page
5953 5954 5955 5956 5957 5958 5959 5960 5961 5962
 * @pevent: the handle to the pevent
 * @buf: the buffer storing the header page format string
 * @size: the size of @buf
 * @long_size: the long size to use if there is no header
 *
 * This parses the header page format for information on the
 * ring buffer used. The @buf should be copied from
 *
 * /sys/kernel/debug/tracing/events/header_page
 */
5963 5964
int tep_parse_header_page(struct tep_handle *pevent, char *buf, unsigned long size,
			  int long_size)
5965 5966 5967 5968 5969 5970 5971 5972 5973 5974 5975 5976 5977 5978 5979 5980 5981 5982 5983 5984 5985 5986 5987 5988 5989 5990 5991 5992
{
	int ignore;

	if (!size) {
		/*
		 * Old kernels did not have header page info.
		 * Sorry but we just use what we find here in user space.
		 */
		pevent->header_page_ts_size = sizeof(long long);
		pevent->header_page_size_size = long_size;
		pevent->header_page_data_offset = sizeof(long long) + long_size;
		pevent->old_format = 1;
		return -1;
	}
	init_input_buf(buf, size);

	parse_header_field("timestamp", &pevent->header_page_ts_offset,
			   &pevent->header_page_ts_size, 1);
	parse_header_field("commit", &pevent->header_page_size_offset,
			   &pevent->header_page_size_size, 1);
	parse_header_field("overwrite", &pevent->header_page_overwrite,
			   &ignore, 0);
	parse_header_field("data", &pevent->header_page_data_offset,
			   &pevent->header_page_data_size, 1);

	return 0;
}

5993
static int event_matches(struct tep_event *event,
5994 5995 5996 5997 5998 5999 6000 6001 6002 6003 6004 6005 6006 6007 6008 6009 6010 6011 6012 6013 6014 6015
			 int id, const char *sys_name,
			 const char *event_name)
{
	if (id >= 0 && id != event->id)
		return 0;

	if (event_name && (strcmp(event_name, event->name) != 0))
		return 0;

	if (sys_name && (strcmp(sys_name, event->system) != 0))
		return 0;

	return 1;
}

static void free_handler(struct event_handler *handle)
{
	free((void *)handle->sys_name);
	free((void *)handle->event_name);
	free(handle);
}

6016
static int find_event_handle(struct tep_handle *pevent, struct tep_event *event)
6017 6018 6019 6020 6021 6022 6023 6024 6025 6026 6027 6028 6029 6030 6031 6032 6033 6034 6035 6036 6037 6038 6039 6040 6041 6042 6043 6044
{
	struct event_handler *handle, **next;

	for (next = &pevent->handlers; *next;
	     next = &(*next)->next) {
		handle = *next;
		if (event_matches(event, handle->id,
				  handle->sys_name,
				  handle->event_name))
			break;
	}

	if (!(*next))
		return 0;

	pr_stat("overriding event (%d) %s:%s with new print handler",
		event->id, event->system, event->name);

	event->handler = handle->func;
	event->context = handle->context;

	*next = handle->next;
	free_handler(handle);

	return 1;
}

/**
6045
 * __tep_parse_format - parse the event format
6046 6047 6048 6049 6050 6051 6052 6053 6054 6055 6056
 * @buf: the buffer storing the event format string
 * @size: the size of @buf
 * @sys: the system the event belongs to
 *
 * This parses the event format and creates an event structure
 * to quickly parse raw data for a given event.
 *
 * These files currently come from:
 *
 * /sys/kernel/debug/tracing/events/.../.../format
 */
6057
enum tep_errno __tep_parse_format(struct tep_event **eventp,
6058 6059
				  struct tep_handle *pevent, const char *buf,
				  unsigned long size, const char *sys)
6060
{
6061
	struct tep_event *event;
6062 6063 6064 6065
	int ret;

	init_input_buf(buf, size);

6066
	*eventp = event = alloc_event();
6067
	if (!event)
6068
		return TEP_ERRNO__MEM_ALLOC_FAILED;
6069 6070 6071 6072

	event->name = event_read_name();
	if (!event->name) {
		/* Bad event? */
6073
		ret = TEP_ERRNO__MEM_ALLOC_FAILED;
6074
		goto event_alloc_failed;
6075 6076 6077
	}

	if (strcmp(sys, "ftrace") == 0) {
6078
		event->flags |= TEP_EVENT_FL_ISFTRACE;
6079 6080

		if (strcmp(event->name, "bprint") == 0)
6081
			event->flags |= TEP_EVENT_FL_ISBPRINT;
6082 6083 6084
	}
		
	event->id = event_read_id();
6085
	if (event->id < 0) {
6086
		ret = TEP_ERRNO__READ_ID_FAILED;
6087 6088 6089 6090 6091 6092
		/*
		 * This isn't an allocation error actually.
		 * But as the ID is critical, just bail out.
		 */
		goto event_alloc_failed;
	}
6093 6094

	event->system = strdup(sys);
6095
	if (!event->system) {
6096
		ret = TEP_ERRNO__MEM_ALLOC_FAILED;
6097 6098
		goto event_alloc_failed;
	}
6099

6100 6101 6102
	/* Add pevent to event so that it can be referenced */
	event->pevent = pevent;

6103 6104
	ret = event_read_format(event);
	if (ret < 0) {
6105
		ret = TEP_ERRNO__READ_FORMAT_FAILED;
6106
		goto event_parse_failed;
6107 6108 6109 6110 6111 6112
	}

	/*
	 * If the event has an override, don't print warnings if the event
	 * print format fails to parse.
	 */
6113
	if (pevent && find_event_handle(pevent, event))
6114 6115 6116
		show_warning = 0;

	ret = event_read_print(event);
6117 6118
	show_warning = 1;

6119
	if (ret < 0) {
6120
		ret = TEP_ERRNO__READ_PRINT_FAILED;
6121
		goto event_parse_failed;
6122 6123
	}

6124
	if (!ret && (event->flags & TEP_EVENT_FL_ISFTRACE)) {
6125
		struct tep_format_field *field;
6126
		struct tep_print_arg *arg, **list;
6127 6128 6129 6130 6131

		/* old ftrace had no args */
		list = &event->print_fmt.args;
		for (field = event->format.fields; field; field = field->next) {
			arg = alloc_arg();
6132
			if (!arg) {
6133
				event->flags |= TEP_EVENT_FL_FAILED;
6134
				return TEP_ERRNO__OLD_FTRACE_ARG_FAILED;
6135
			}
6136
			arg->type = TEP_PRINT_FIELD;
6137
			arg->field.name = strdup(field->name);
6138
			if (!arg->field.name) {
6139
				event->flags |= TEP_EVENT_FL_FAILED;
6140
				free_arg(arg);
6141
				return TEP_ERRNO__OLD_FTRACE_ARG_FAILED;
6142
			}
6143
			arg->field.field = field;
6144 6145
			*list = arg;
			list = &arg->next;
6146 6147 6148 6149 6150 6151
		}
		return 0;
	}

	return 0;

6152
 event_parse_failed:
6153
	event->flags |= TEP_EVENT_FL_FAILED;
6154 6155 6156
	return ret;

 event_alloc_failed:
6157 6158 6159 6160 6161 6162 6163
	free(event->system);
	free(event->name);
	free(event);
	*eventp = NULL;
	return ret;
}

6164
static enum tep_errno
6165
__parse_event(struct tep_handle *pevent,
6166
	      struct tep_event **eventp,
6167 6168
	      const char *buf, unsigned long size,
	      const char *sys)
6169
{
6170
	int ret = __tep_parse_format(eventp, pevent, buf, size, sys);
6171
	struct tep_event *event = *eventp;
6172 6173 6174 6175 6176

	if (event == NULL)
		return ret;

	if (pevent && add_event(pevent, event)) {
6177
		ret = TEP_ERRNO__MEM_ALLOC_FAILED;
6178 6179 6180 6181 6182 6183 6184 6185 6186 6187
		goto event_add_failed;
	}

#define PRINT_ARGS 0
	if (PRINT_ARGS && event->print_fmt.args)
		print_args(event->print_fmt.args);

	return 0;

event_add_failed:
6188
	tep_free_event(event);
6189 6190 6191
	return ret;
}

6192
/**
6193
 * tep_parse_format - parse the event format
6194 6195
 * @pevent: the handle to the pevent
 * @eventp: returned format
6196 6197 6198 6199 6200 6201 6202 6203 6204 6205 6206
 * @buf: the buffer storing the event format string
 * @size: the size of @buf
 * @sys: the system the event belongs to
 *
 * This parses the event format and creates an event structure
 * to quickly parse raw data for a given event.
 *
 * These files currently come from:
 *
 * /sys/kernel/debug/tracing/events/.../.../format
 */
6207
enum tep_errno tep_parse_format(struct tep_handle *pevent,
6208
				struct tep_event **eventp,
6209 6210
				const char *buf,
				unsigned long size, const char *sys)
6211
{
6212
	return __parse_event(pevent, eventp, buf, size, sys);
6213 6214 6215
}

/**
6216
 * tep_parse_event - parse the event format
6217 6218 6219 6220 6221 6222 6223 6224 6225 6226 6227 6228
 * @pevent: the handle to the pevent
 * @buf: the buffer storing the event format string
 * @size: the size of @buf
 * @sys: the system the event belongs to
 *
 * This parses the event format and creates an event structure
 * to quickly parse raw data for a given event.
 *
 * These files currently come from:
 *
 * /sys/kernel/debug/tracing/events/.../.../format
 */
6229 6230
enum tep_errno tep_parse_event(struct tep_handle *pevent, const char *buf,
			       unsigned long size, const char *sys)
6231
{
6232
	struct tep_event *event = NULL;
6233
	return __parse_event(pevent, &event, buf, size, sys);
6234 6235
}

6236
int get_field_val(struct trace_seq *s, struct tep_format_field *field,
6237
		  const char *name, struct tep_record *record,
6238 6239 6240 6241 6242 6243 6244 6245
		  unsigned long long *val, int err)
{
	if (!field) {
		if (err)
			trace_seq_printf(s, "<CANT FIND FIELD %s>", name);
		return -1;
	}

6246
	if (tep_read_number_field(field, record->data, val)) {
6247 6248 6249 6250 6251 6252 6253 6254 6255
		if (err)
			trace_seq_printf(s, " %s=INVALID", name);
		return -1;
	}

	return 0;
}

/**
6256
 * tep_get_field_raw - return the raw pointer into the data field
6257 6258 6259 6260 6261 6262 6263 6264 6265 6266 6267 6268
 * @s: The seq to print to on error
 * @event: the event that the field is for
 * @name: The name of the field
 * @record: The record with the field name.
 * @len: place to store the field length.
 * @err: print default error if failed.
 *
 * Returns a pointer into record->data of the field and places
 * the length of the field in @len.
 *
 * On failure, it returns NULL.
 */
6269
void *tep_get_field_raw(struct trace_seq *s, struct tep_event *event,
6270 6271
			const char *name, struct tep_record *record,
			int *len, int err)
6272
{
6273
	struct tep_format_field *field;
6274 6275 6276 6277 6278 6279 6280
	void *data = record->data;
	unsigned offset;
	int dummy;

	if (!event)
		return NULL;

6281
	field = tep_find_field(event, name);
6282 6283 6284 6285 6286 6287 6288 6289 6290 6291 6292 6293

	if (!field) {
		if (err)
			trace_seq_printf(s, "<CANT FIND FIELD %s>", name);
		return NULL;
	}

	/* Allow @len to be NULL */
	if (!len)
		len = &dummy;

	offset = field->offset;
6294
	if (field->flags & TEP_FIELD_IS_DYNAMIC) {
6295
		offset = tep_read_number(event->pevent,
6296 6297 6298 6299 6300 6301 6302 6303 6304 6305
					    data + offset, field->size);
		*len = offset >> 16;
		offset &= 0xffff;
	} else
		*len = field->size;

	return data + offset;
}

/**
6306
 * tep_get_field_val - find a field and return its value
6307 6308 6309 6310 6311 6312 6313 6314 6315
 * @s: The seq to print to on error
 * @event: the event that the field is for
 * @name: The name of the field
 * @record: The record with the field name.
 * @val: place to store the value of the field.
 * @err: print default error if failed.
 *
 * Returns 0 on success -1 on field not found.
 */
6316
int tep_get_field_val(struct trace_seq *s, struct tep_event *event,
6317 6318
		      const char *name, struct tep_record *record,
		      unsigned long long *val, int err)
6319
{
6320
	struct tep_format_field *field;
6321 6322 6323 6324

	if (!event)
		return -1;

6325
	field = tep_find_field(event, name);
6326 6327 6328 6329 6330

	return get_field_val(s, field, name, record, val, err);
}

/**
6331
 * tep_get_common_field_val - find a common field and return its value
6332 6333 6334 6335 6336 6337 6338 6339 6340
 * @s: The seq to print to on error
 * @event: the event that the field is for
 * @name: The name of the field
 * @record: The record with the field name.
 * @val: place to store the value of the field.
 * @err: print default error if failed.
 *
 * Returns 0 on success -1 on field not found.
 */
6341
int tep_get_common_field_val(struct trace_seq *s, struct tep_event *event,
6342 6343
			     const char *name, struct tep_record *record,
			     unsigned long long *val, int err)
6344
{
6345
	struct tep_format_field *field;
6346 6347 6348 6349

	if (!event)
		return -1;

6350
	field = tep_find_common_field(event, name);
6351 6352 6353 6354 6355

	return get_field_val(s, field, name, record, val, err);
}

/**
6356
 * tep_get_any_field_val - find a any field and return its value
6357 6358 6359 6360 6361 6362 6363 6364 6365
 * @s: The seq to print to on error
 * @event: the event that the field is for
 * @name: The name of the field
 * @record: The record with the field name.
 * @val: place to store the value of the field.
 * @err: print default error if failed.
 *
 * Returns 0 on success -1 on field not found.
 */
6366
int tep_get_any_field_val(struct trace_seq *s, struct tep_event *event,
6367 6368
			  const char *name, struct tep_record *record,
			  unsigned long long *val, int err)
6369
{
6370
	struct tep_format_field *field;
6371 6372 6373 6374

	if (!event)
		return -1;

6375
	field = tep_find_any_field(event, name);
6376 6377 6378 6379 6380

	return get_field_val(s, field, name, record, val, err);
}

/**
6381
 * tep_print_num_field - print a field and a format
6382 6383 6384 6385 6386 6387 6388
 * @s: The seq to print to
 * @fmt: The printf format to print the field with.
 * @event: the event that the field is for
 * @name: The name of the field
 * @record: The record with the field name.
 * @err: print default error if failed.
 *
6389
 * Returns: 0 on success, -1 field not found, or 1 if buffer is full.
6390
 */
6391
int tep_print_num_field(struct trace_seq *s, const char *fmt,
6392
			struct tep_event *event, const char *name,
6393
			struct tep_record *record, int err)
6394
{
6395
	struct tep_format_field *field = tep_find_field(event, name);
6396 6397 6398 6399 6400
	unsigned long long val;

	if (!field)
		goto failed;

6401
	if (tep_read_number_field(field, record->data, &val))
6402 6403 6404 6405 6406 6407 6408 6409 6410 6411
		goto failed;

	return trace_seq_printf(s, fmt, val);

 failed:
	if (err)
		trace_seq_printf(s, "CAN'T FIND FIELD \"%s\"", name);
	return -1;
}

6412
/**
6413
 * tep_print_func_field - print a field and a format for function pointers
6414 6415 6416 6417 6418 6419 6420 6421 6422
 * @s: The seq to print to
 * @fmt: The printf format to print the field with.
 * @event: the event that the field is for
 * @name: The name of the field
 * @record: The record with the field name.
 * @err: print default error if failed.
 *
 * Returns: 0 on success, -1 field not found, or 1 if buffer is full.
 */
6423
int tep_print_func_field(struct trace_seq *s, const char *fmt,
6424
			 struct tep_event *event, const char *name,
6425
			 struct tep_record *record, int err)
6426
{
6427
	struct tep_format_field *field = tep_find_field(event, name);
6428
	struct tep_handle *pevent = event->pevent;
6429 6430 6431 6432 6433 6434 6435
	unsigned long long val;
	struct func_map *func;
	char tmp[128];

	if (!field)
		goto failed;

6436
	if (tep_read_number_field(field, record->data, &val))
6437 6438 6439 6440 6441 6442 6443 6444 6445 6446 6447 6448 6449 6450 6451 6452 6453
		goto failed;

	func = find_func(pevent, val);

	if (func)
		snprintf(tmp, 128, "%s/0x%llx", func->func, func->addr - val);
	else
		sprintf(tmp, "0x%08llx", val);

	return trace_seq_printf(s, fmt, tmp);

 failed:
	if (err)
		trace_seq_printf(s, "CAN'T FIND FIELD \"%s\"", name);
	return -1;
}

6454
static void free_func_handle(struct tep_function_handler *func)
6455
{
6456
	struct func_params *params;
6457 6458 6459 6460 6461 6462 6463 6464 6465 6466 6467 6468 6469

	free(func->name);

	while (func->params) {
		params = func->params;
		func->params = params->next;
		free(params);
	}

	free(func);
}

/**
6470
 * tep_register_print_function - register a helper function
6471 6472
 * @pevent: the handle to the pevent
 * @func: the function to process the helper function
6473
 * @ret_type: the return type of the helper function
6474
 * @name: the name of the helper function
6475
 * @parameters: A list of enum tep_func_arg_type
6476 6477
 *
 * Some events may have helper functions in the print format arguments.
6478
 * This allows a plugin to dynamically create a way to process one
6479 6480
 * of these functions.
 *
6481 6482
 * The @parameters is a variable list of tep_func_arg_type enums that
 * must end with TEP_FUNC_ARG_VOID.
6483
 */
6484 6485 6486 6487
int tep_register_print_function(struct tep_handle *pevent,
				tep_func_handler func,
				enum tep_func_arg_type ret_type,
				char *name, ...)
6488
{
6489
	struct tep_function_handler *func_handle;
6490 6491
	struct func_params **next_param;
	struct func_params *param;
6492
	enum tep_func_arg_type type;
6493
	va_list ap;
6494
	int ret;
6495 6496 6497 6498 6499 6500 6501 6502 6503 6504 6505 6506

	func_handle = find_func_handler(pevent, name);
	if (func_handle) {
		/*
		 * This is most like caused by the users own
		 * plugins updating the function. This overrides the
		 * system defaults.
		 */
		pr_stat("override of function helper '%s'", name);
		remove_func_handler(pevent, name);
	}

6507
	func_handle = calloc(1, sizeof(*func_handle));
6508 6509
	if (!func_handle) {
		do_warning("Failed to allocate function handler");
6510
		return TEP_ERRNO__MEM_ALLOC_FAILED;
6511
	}
6512 6513 6514 6515

	func_handle->ret_type = ret_type;
	func_handle->name = strdup(name);
	func_handle->func = func;
6516 6517 6518
	if (!func_handle->name) {
		do_warning("Failed to allocate function name");
		free(func_handle);
6519
		return TEP_ERRNO__MEM_ALLOC_FAILED;
6520
	}
6521 6522 6523 6524

	next_param = &(func_handle->params);
	va_start(ap, name);
	for (;;) {
6525 6526
		type = va_arg(ap, enum tep_func_arg_type);
		if (type == TEP_FUNC_ARG_VOID)
6527 6528
			break;

6529
		if (type >= TEP_FUNC_ARG_MAX_TYPES) {
6530
			do_warning("Invalid argument type %d", type);
6531
			ret = TEP_ERRNO__INVALID_ARG_TYPE;
6532 6533 6534
			goto out_free;
		}

6535 6536 6537
		param = malloc(sizeof(*param));
		if (!param) {
			do_warning("Failed to allocate function param");
6538
			ret = TEP_ERRNO__MEM_ALLOC_FAILED;
6539 6540
			goto out_free;
		}
6541 6542 6543 6544 6545 6546 6547 6548 6549 6550 6551 6552 6553 6554 6555 6556 6557
		param->type = type;
		param->next = NULL;

		*next_param = param;
		next_param = &(param->next);

		func_handle->nr_args++;
	}
	va_end(ap);

	func_handle->next = pevent->func_handlers;
	pevent->func_handlers = func_handle;

	return 0;
 out_free:
	va_end(ap);
	free_func_handle(func_handle);
6558
	return ret;
6559 6560
}

6561
/**
6562
 * tep_unregister_print_function - unregister a helper function
6563 6564 6565 6566 6567 6568 6569 6570
 * @pevent: the handle to the pevent
 * @func: the function to process the helper function
 * @name: the name of the helper function
 *
 * This function removes existing print handler for function @name.
 *
 * Returns 0 if the handler was removed successully, -1 otherwise.
 */
6571 6572
int tep_unregister_print_function(struct tep_handle *pevent,
				  tep_func_handler func, char *name)
6573
{
6574
	struct tep_function_handler *func_handle;
6575 6576 6577 6578 6579 6580 6581 6582 6583

	func_handle = find_func_handler(pevent, name);
	if (func_handle && func_handle->func == func) {
		remove_func_handler(pevent, name);
		return 0;
	}
	return -1;
}

6584 6585 6586
static struct tep_event *search_event(struct tep_handle *pevent, int id,
				      const char *sys_name,
				      const char *event_name)
6587
{
6588
	struct tep_event *event;
6589 6590 6591

	if (id >= 0) {
		/* search by id */
6592
		event = tep_find_event(pevent, id);
6593 6594 6595 6596 6597 6598 6599
		if (!event)
			return NULL;
		if (event_name && (strcmp(event_name, event->name) != 0))
			return NULL;
		if (sys_name && (strcmp(sys_name, event->system) != 0))
			return NULL;
	} else {
6600
		event = tep_find_event_by_name(pevent, sys_name, event_name);
6601 6602 6603 6604 6605 6606
		if (!event)
			return NULL;
	}
	return event;
}

6607
/**
6608
 * tep_register_event_handler - register a way to parse an event
6609 6610 6611 6612 6613
 * @pevent: the handle to the pevent
 * @id: the id of the event to register
 * @sys_name: the system name the event belongs to
 * @event_name: the name of the event
 * @func: the function to call to parse the event information
6614
 * @context: the data to be passed to @func
6615 6616 6617 6618 6619 6620 6621 6622
 *
 * This function allows a developer to override the parsing of
 * a given event. If for some reason the default print format
 * is not sufficient, this function will register a function
 * for an event to be used to parse the data instead.
 *
 * If @id is >= 0, then it is used to find the event.
 * else @sys_name and @event_name are used.
6623 6624 6625 6626 6627 6628
 *
 * Returns:
 *  TEP_REGISTER_SUCCESS_OVERWRITE if an existing handler is overwritten
 *  TEP_REGISTER_SUCCESS if a new handler is registered successfully
 *  negative TEP_ERRNO_... in case of an error
 *
6629
 */
6630 6631 6632
int tep_register_event_handler(struct tep_handle *pevent, int id,
			       const char *sys_name, const char *event_name,
			       tep_event_handler_func func, void *context)
6633
{
6634
	struct tep_event *event;
6635 6636
	struct event_handler *handle;

6637
	event = search_event(pevent, id, sys_name, event_name);
6638 6639
	if (event == NULL)
		goto not_found;
6640 6641 6642 6643 6644 6645

	pr_stat("overriding event (%d) %s:%s with new print handler",
		event->id, event->system, event->name);

	event->handler = func;
	event->context = context;
6646
	return TEP_REGISTER_SUCCESS_OVERWRITE;
6647 6648 6649

 not_found:
	/* Save for later use. */
6650
	handle = calloc(1, sizeof(*handle));
6651 6652
	if (!handle) {
		do_warning("Failed to allocate event handler");
6653
		return TEP_ERRNO__MEM_ALLOC_FAILED;
6654 6655
	}

6656 6657 6658 6659 6660 6661
	handle->id = id;
	if (event_name)
		handle->event_name = strdup(event_name);
	if (sys_name)
		handle->sys_name = strdup(sys_name);

6662 6663
	if ((event_name && !handle->event_name) ||
	    (sys_name && !handle->sys_name)) {
6664 6665 6666 6667
		do_warning("Failed to allocate event/sys name");
		free((void *)handle->event_name);
		free((void *)handle->sys_name);
		free(handle);
6668
		return TEP_ERRNO__MEM_ALLOC_FAILED;
6669 6670
	}

6671 6672 6673 6674 6675
	handle->func = func;
	handle->next = pevent->handlers;
	pevent->handlers = handle;
	handle->context = context;

6676
	return TEP_REGISTER_SUCCESS;
6677 6678
}

6679 6680
static int handle_matches(struct event_handler *handler, int id,
			  const char *sys_name, const char *event_name,
6681
			  tep_event_handler_func func, void *context)
6682 6683 6684 6685 6686 6687 6688 6689 6690 6691 6692 6693 6694 6695 6696 6697 6698
{
	if (id >= 0 && id != handler->id)
		return 0;

	if (event_name && (strcmp(event_name, handler->event_name) != 0))
		return 0;

	if (sys_name && (strcmp(sys_name, handler->sys_name) != 0))
		return 0;

	if (func != handler->func || context != handler->context)
		return 0;

	return 1;
}

/**
6699
 * tep_unregister_event_handler - unregister an existing event handler
6700 6701 6702 6703 6704 6705 6706 6707 6708 6709 6710 6711 6712 6713
 * @pevent: the handle to the pevent
 * @id: the id of the event to unregister
 * @sys_name: the system name the handler belongs to
 * @event_name: the name of the event handler
 * @func: the function to call to parse the event information
 * @context: the data to be passed to @func
 *
 * This function removes existing event handler (parser).
 *
 * If @id is >= 0, then it is used to find the event.
 * else @sys_name and @event_name are used.
 *
 * Returns 0 if handler was removed successfully, -1 if event was not found.
 */
6714 6715 6716
int tep_unregister_event_handler(struct tep_handle *pevent, int id,
				 const char *sys_name, const char *event_name,
				 tep_event_handler_func func, void *context)
6717
{
6718
	struct tep_event *event;
6719 6720 6721
	struct event_handler *handle;
	struct event_handler **next;

6722
	event = search_event(pevent, id, sys_name, event_name);
6723 6724 6725 6726 6727 6728 6729 6730 6731 6732 6733 6734 6735 6736 6737 6738 6739 6740 6741 6742 6743 6744 6745 6746 6747 6748 6749 6750 6751
	if (event == NULL)
		goto not_found;

	if (event->handler == func && event->context == context) {
		pr_stat("removing override handler for event (%d) %s:%s. Going back to default handler.",
			event->id, event->system, event->name);

		event->handler = NULL;
		event->context = NULL;
		return 0;
	}

not_found:
	for (next = &pevent->handlers; *next; next = &(*next)->next) {
		handle = *next;
		if (handle_matches(handle, id, sys_name, event_name,
				   func, context))
			break;
	}

	if (!(*next))
		return -1;

	*next = handle->next;
	free_handler(handle);

	return 0;
}

6752
/**
6753
 * tep_alloc - create a pevent handle
6754
 */
6755
struct tep_handle *tep_alloc(void)
6756
{
6757
	struct tep_handle *pevent = calloc(1, sizeof(*pevent));
6758

6759
	if (pevent) {
6760
		pevent->ref_count = 1;
6761 6762
		pevent->host_bigendian = tep_host_bigendian();
	}
6763 6764 6765 6766

	return pevent;
}

6767
void tep_ref(struct tep_handle *pevent)
6768 6769 6770 6771
{
	pevent->ref_count++;
}

6772 6773 6774 6775 6776 6777 6778
int tep_get_ref(struct tep_handle *tep)
{
	if (tep)
		return tep->ref_count;
	return 0;
}

6779
void tep_free_format_field(struct tep_format_field *field)
6780 6781
{
	free(field->type);
6782 6783
	if (field->alias != field->name)
		free(field->alias);
6784 6785 6786 6787
	free(field->name);
	free(field);
}

6788
static void free_format_fields(struct tep_format_field *field)
6789
{
6790
	struct tep_format_field *next;
6791 6792 6793

	while (field) {
		next = field->next;
6794
		tep_free_format_field(field);
6795 6796 6797 6798
		field = next;
	}
}

6799
static void free_formats(struct tep_format *format)
6800 6801 6802 6803 6804
{
	free_format_fields(format->common_fields);
	free_format_fields(format->fields);
}

6805
void tep_free_event(struct tep_event *event)
6806 6807 6808 6809 6810 6811 6812 6813 6814 6815 6816 6817 6818
{
	free(event->name);
	free(event->system);

	free_formats(&event->format);

	free(event->print_fmt.format);
	free_args(event->print_fmt.args);

	free(event);
}

/**
6819
 * tep_free - free a pevent handle
6820 6821
 * @pevent: the pevent handle to free
 */
6822
void tep_free(struct tep_handle *pevent)
6823
{
6824 6825 6826
	struct cmdline_list *cmdlist, *cmdnext;
	struct func_list *funclist, *funcnext;
	struct printk_list *printklist, *printknext;
6827
	struct tep_function_handler *func_handler;
6828 6829 6830
	struct event_handler *handle;
	int i;

6831 6832 6833 6834 6835 6836 6837
	if (!pevent)
		return;

	cmdlist = pevent->cmdlist;
	funclist = pevent->funclist;
	printklist = pevent->printklist;

6838 6839 6840 6841 6842 6843 6844 6845 6846 6847 6848 6849 6850 6851 6852 6853 6854 6855
	pevent->ref_count--;
	if (pevent->ref_count)
		return;

	if (pevent->cmdlines) {
		for (i = 0; i < pevent->cmdline_count; i++)
			free(pevent->cmdlines[i].comm);
		free(pevent->cmdlines);
	}

	while (cmdlist) {
		cmdnext = cmdlist->next;
		free(cmdlist->comm);
		free(cmdlist);
		cmdlist = cmdnext;
	}

	if (pevent->func_map) {
6856
		for (i = 0; i < (int)pevent->func_count; i++) {
6857 6858 6859 6860 6861 6862 6863 6864 6865 6866 6867 6868 6869 6870 6871 6872 6873 6874 6875 6876 6877
			free(pevent->func_map[i].func);
			free(pevent->func_map[i].mod);
		}
		free(pevent->func_map);
	}

	while (funclist) {
		funcnext = funclist->next;
		free(funclist->func);
		free(funclist->mod);
		free(funclist);
		funclist = funcnext;
	}

	while (pevent->func_handlers) {
		func_handler = pevent->func_handlers;
		pevent->func_handlers = func_handler->next;
		free_func_handle(func_handler);
	}

	if (pevent->printk_map) {
6878
		for (i = 0; i < (int)pevent->printk_count; i++)
6879 6880 6881 6882 6883 6884 6885 6886 6887 6888 6889 6890
			free(pevent->printk_map[i].printk);
		free(pevent->printk_map);
	}

	while (printklist) {
		printknext = printklist->next;
		free(printklist->printk);
		free(printklist);
		printklist = printknext;
	}

	for (i = 0; i < pevent->nr_events; i++)
6891
		tep_free_event(pevent->events[i]);
6892 6893 6894 6895 6896 6897 6898

	while (pevent->handlers) {
		handle = pevent->handlers;
		pevent->handlers = handle->next;
		free_handler(handle);
	}

6899
	free(pevent->trace_clock);
6900 6901
	free(pevent->events);
	free(pevent->sort_events);
6902
	free(pevent->func_resolver);
6903 6904 6905 6906

	free(pevent);
}

6907
void tep_unref(struct tep_handle *pevent)
6908
{
6909
	tep_free(pevent);
6910
}