Linux Audio

Check our new training course

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