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