Linux Audio

Check our new training course

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