Linux Audio

Check our new training course

Linux debugging, profiling, tracing and performance analysis training

Apr 14-17, 2025
Register
Loading...
v3.1
 
   1/*
   2 * Copyright (C) 2009, Steven Rostedt <srostedt@redhat.com>
   3 *
   4 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   5 *
   6 * This program is free software; you can redistribute it and/or modify
   7 * it under the terms of the GNU General Public License as published by
   8 * the Free Software Foundation; version 2 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 General Public License for more details.
  14 *
  15 * You should have received a copy of the GNU General Public License
  16 * along with this program; if not, write to the Free Software
  17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  18 *
  19 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  20 *
  21 *  The parts for function graph printing was taken and modified from the
  22 *  Linux Kernel that were written by Frederic Weisbecker.
  23 */
  24#define _GNU_SOURCE
  25#include <stdio.h>
  26#include <stdlib.h>
  27#include <string.h>
  28#include <ctype.h>
  29#include <errno.h>
  30
  31#undef _GNU_SOURCE
  32#include "../perf.h"
  33#include "util.h"
  34#include "trace-event.h"
  35
  36int header_page_ts_offset;
  37int header_page_ts_size;
  38int header_page_size_offset;
  39int header_page_size_size;
  40int header_page_overwrite_offset;
  41int header_page_overwrite_size;
  42int header_page_data_offset;
  43int header_page_data_size;
  44
  45bool latency_format;
  46
  47static char *input_buf;
  48static unsigned long long input_buf_ptr;
  49static unsigned long long input_buf_siz;
  50
  51static int cpus;
  52static int long_size;
  53static int is_flag_field;
  54static int is_symbolic_field;
  55
  56static struct format_field *
  57find_any_field(struct event *event, const char *name);
  58
  59static void init_input_buf(char *buf, unsigned long long size)
  60{
  61	input_buf = buf;
  62	input_buf_siz = size;
  63	input_buf_ptr = 0;
  64}
  65
  66struct cmdline {
  67	char *comm;
  68	int pid;
  69};
  70
  71static struct cmdline *cmdlines;
  72static int cmdline_count;
  73
  74static int cmdline_cmp(const void *a, const void *b)
  75{
  76	const struct cmdline *ca = a;
  77	const struct cmdline *cb = b;
  78
  79	if (ca->pid < cb->pid)
  80		return -1;
  81	if (ca->pid > cb->pid)
  82		return 1;
  83
  84	return 0;
  85}
  86
  87void parse_cmdlines(char *file, int size __unused)
  88{
  89	struct cmdline_list {
  90		struct cmdline_list	*next;
  91		char			*comm;
  92		int			pid;
  93	} *list = NULL, *item;
  94	char *line;
  95	char *next = NULL;
  96	int i;
  97
  98	line = strtok_r(file, "\n", &next);
  99	while (line) {
 100		item = malloc_or_die(sizeof(*item));
 101		sscanf(line, "%d %as", &item->pid,
 102		       (float *)(void *)&item->comm); /* workaround gcc warning */
 103		item->next = list;
 104		list = item;
 105		line = strtok_r(NULL, "\n", &next);
 106		cmdline_count++;
 107	}
 108
 109	cmdlines = malloc_or_die(sizeof(*cmdlines) * cmdline_count);
 110
 111	i = 0;
 112	while (list) {
 113		cmdlines[i].pid = list->pid;
 114		cmdlines[i].comm = list->comm;
 115		i++;
 116		item = list;
 117		list = list->next;
 118		free(item);
 119	}
 120
 121	qsort(cmdlines, cmdline_count, sizeof(*cmdlines), cmdline_cmp);
 122}
 123
 124static struct func_map {
 125	unsigned long long		addr;
 126	char				*func;
 127	char				*mod;
 128} *func_list;
 129static unsigned int func_count;
 130
 131static int func_cmp(const void *a, const void *b)
 132{
 133	const struct func_map *fa = a;
 134	const struct func_map *fb = b;
 135
 136	if (fa->addr < fb->addr)
 137		return -1;
 138	if (fa->addr > fb->addr)
 139		return 1;
 140
 141	return 0;
 142}
 143
 144void parse_proc_kallsyms(char *file, unsigned int size __unused)
 145{
 146	struct func_list {
 147		struct func_list	*next;
 148		unsigned long long	addr;
 149		char			*func;
 150		char			*mod;
 151	} *list = NULL, *item;
 152	char *line;
 153	char *next = NULL;
 154	char *addr_str;
 155	char ch;
 156	int ret __used;
 157	int i;
 158
 159	line = strtok_r(file, "\n", &next);
 160	while (line) {
 161		item = malloc_or_die(sizeof(*item));
 162		item->mod = NULL;
 163		ret = sscanf(line, "%as %c %as\t[%as",
 164			     (float *)(void *)&addr_str, /* workaround gcc warning */
 165			     &ch,
 166			     (float *)(void *)&item->func,
 167			     (float *)(void *)&item->mod);
 168		item->addr = strtoull(addr_str, NULL, 16);
 169		free(addr_str);
 170
 171		/* truncate the extra ']' */
 172		if (item->mod)
 173			item->mod[strlen(item->mod) - 1] = 0;
 174
 175
 176		item->next = list;
 177		list = item;
 178		line = strtok_r(NULL, "\n", &next);
 179		func_count++;
 180	}
 181
 182	func_list = malloc_or_die(sizeof(*func_list) * (func_count + 1));
 183
 184	i = 0;
 185	while (list) {
 186		func_list[i].func = list->func;
 187		func_list[i].addr = list->addr;
 188		func_list[i].mod = list->mod;
 189		i++;
 190		item = list;
 191		list = list->next;
 192		free(item);
 193	}
 194
 195	qsort(func_list, func_count, sizeof(*func_list), func_cmp);
 196
 197	/*
 198	 * Add a special record at the end.
 199	 */
 200	func_list[func_count].func = NULL;
 201	func_list[func_count].addr = 0;
 202	func_list[func_count].mod = NULL;
 203}
 204
 205/*
 206 * We are searching for a record in between, not an exact
 207 * match.
 208 */
 209static int func_bcmp(const void *a, const void *b)
 210{
 211	const struct func_map *fa = a;
 212	const struct func_map *fb = b;
 213
 214	if ((fa->addr == fb->addr) ||
 215
 216	    (fa->addr > fb->addr &&
 217	     fa->addr < (fb+1)->addr))
 218		return 0;
 219
 220	if (fa->addr < fb->addr)
 221		return -1;
 222
 223	return 1;
 224}
 225
 226static struct func_map *find_func(unsigned long long addr)
 227{
 228	struct func_map *func;
 229	struct func_map key;
 230
 231	key.addr = addr;
 232
 233	func = bsearch(&key, func_list, func_count, sizeof(*func_list),
 234		       func_bcmp);
 235
 236	return func;
 237}
 238
 239void print_funcs(void)
 240{
 241	int i;
 242
 243	for (i = 0; i < (int)func_count; i++) {
 244		printf("%016llx %s",
 245		       func_list[i].addr,
 246		       func_list[i].func);
 247		if (func_list[i].mod)
 248			printf(" [%s]\n", func_list[i].mod);
 249		else
 250			printf("\n");
 251	}
 252}
 253
 254static struct printk_map {
 255	unsigned long long		addr;
 256	char				*printk;
 257} *printk_list;
 258static unsigned int printk_count;
 259
 260static int printk_cmp(const void *a, const void *b)
 261{
 262	const struct func_map *fa = a;
 263	const struct func_map *fb = b;
 264
 265	if (fa->addr < fb->addr)
 266		return -1;
 267	if (fa->addr > fb->addr)
 268		return 1;
 269
 270	return 0;
 271}
 272
 273static struct printk_map *find_printk(unsigned long long addr)
 274{
 275	struct printk_map *printk;
 276	struct printk_map key;
 277
 278	key.addr = addr;
 279
 280	printk = bsearch(&key, printk_list, printk_count, sizeof(*printk_list),
 281			 printk_cmp);
 282
 283	return printk;
 284}
 285
 286void parse_ftrace_printk(char *file, unsigned int size __unused)
 287{
 288	struct printk_list {
 289		struct printk_list	*next;
 290		unsigned long long	addr;
 291		char			*printk;
 292	} *list = NULL, *item;
 293	char *line;
 294	char *next = NULL;
 295	char *addr_str;
 296	int i;
 297
 298	line = strtok_r(file, "\n", &next);
 299	while (line) {
 300		addr_str = strsep(&line, ":");
 301		if (!line) {
 302			warning("error parsing print strings");
 303			break;
 304		}
 305		item = malloc_or_die(sizeof(*item));
 306		item->addr = strtoull(addr_str, NULL, 16);
 307		/* fmt still has a space, skip it */
 308		item->printk = strdup(line+1);
 309		item->next = list;
 310		list = item;
 311		line = strtok_r(NULL, "\n", &next);
 312		printk_count++;
 313	}
 314
 315	printk_list = malloc_or_die(sizeof(*printk_list) * printk_count + 1);
 316
 317	i = 0;
 318	while (list) {
 319		printk_list[i].printk = list->printk;
 320		printk_list[i].addr = list->addr;
 321		i++;
 322		item = list;
 323		list = list->next;
 324		free(item);
 325	}
 326
 327	qsort(printk_list, printk_count, sizeof(*printk_list), printk_cmp);
 328}
 329
 330void print_printk(void)
 331{
 332	int i;
 333
 334	for (i = 0; i < (int)printk_count; i++) {
 335		printf("%016llx %s\n",
 336		       printk_list[i].addr,
 337		       printk_list[i].printk);
 338	}
 339}
 340
 341static struct event *alloc_event(void)
 342{
 343	struct event *event;
 344
 345	event = malloc_or_die(sizeof(*event));
 346	memset(event, 0, sizeof(*event));
 347
 348	return event;
 349}
 350
 351enum event_type {
 352	EVENT_ERROR,
 353	EVENT_NONE,
 354	EVENT_SPACE,
 355	EVENT_NEWLINE,
 356	EVENT_OP,
 357	EVENT_DELIM,
 358	EVENT_ITEM,
 359	EVENT_DQUOTE,
 360	EVENT_SQUOTE,
 361};
 362
 363static struct event *event_list;
 364
 365static void add_event(struct event *event)
 366{
 367	event->next = event_list;
 368	event_list = event;
 369}
 370
 371static int event_item_type(enum event_type type)
 372{
 373	switch (type) {
 374	case EVENT_ITEM ... EVENT_SQUOTE:
 375		return 1;
 376	case EVENT_ERROR ... EVENT_DELIM:
 377	default:
 378		return 0;
 379	}
 380}
 381
 382static void free_arg(struct print_arg *arg)
 383{
 384	if (!arg)
 385		return;
 386
 387	switch (arg->type) {
 388	case PRINT_ATOM:
 389		if (arg->atom.atom)
 390			free(arg->atom.atom);
 391		break;
 392	case PRINT_NULL:
 393	case PRINT_FIELD ... PRINT_OP:
 394	default:
 395		/* todo */
 396		break;
 397	}
 398
 399	free(arg);
 400}
 401
 402static enum event_type get_type(int ch)
 403{
 404	if (ch == '\n')
 405		return EVENT_NEWLINE;
 406	if (isspace(ch))
 407		return EVENT_SPACE;
 408	if (isalnum(ch) || ch == '_')
 409		return EVENT_ITEM;
 410	if (ch == '\'')
 411		return EVENT_SQUOTE;
 412	if (ch == '"')
 413		return EVENT_DQUOTE;
 414	if (!isprint(ch))
 415		return EVENT_NONE;
 416	if (ch == '(' || ch == ')' || ch == ',')
 417		return EVENT_DELIM;
 418
 419	return EVENT_OP;
 420}
 421
 422static int __read_char(void)
 423{
 424	if (input_buf_ptr >= input_buf_siz)
 425		return -1;
 426
 427	return input_buf[input_buf_ptr++];
 428}
 429
 430static int __peek_char(void)
 431{
 432	if (input_buf_ptr >= input_buf_siz)
 433		return -1;
 434
 435	return input_buf[input_buf_ptr];
 436}
 437
 438static enum event_type __read_token(char **tok)
 439{
 440	char buf[BUFSIZ];
 441	int ch, last_ch, quote_ch, next_ch;
 442	int i = 0;
 443	int tok_size = 0;
 444	enum event_type type;
 445
 446	*tok = NULL;
 447
 448
 449	ch = __read_char();
 450	if (ch < 0)
 451		return EVENT_NONE;
 452
 453	type = get_type(ch);
 454	if (type == EVENT_NONE)
 455		return type;
 456
 457	buf[i++] = ch;
 458
 459	switch (type) {
 460	case EVENT_NEWLINE:
 461	case EVENT_DELIM:
 462		*tok = malloc_or_die(2);
 463		(*tok)[0] = ch;
 464		(*tok)[1] = 0;
 465		return type;
 466
 467	case EVENT_OP:
 468		switch (ch) {
 469		case '-':
 470			next_ch = __peek_char();
 471			if (next_ch == '>') {
 472				buf[i++] = __read_char();
 473				break;
 474			}
 475			/* fall through */
 476		case '+':
 477		case '|':
 478		case '&':
 479		case '>':
 480		case '<':
 481			last_ch = ch;
 482			ch = __peek_char();
 483			if (ch != last_ch)
 484				goto test_equal;
 485			buf[i++] = __read_char();
 486			switch (last_ch) {
 487			case '>':
 488			case '<':
 489				goto test_equal;
 490			default:
 491				break;
 492			}
 493			break;
 494		case '!':
 495		case '=':
 496			goto test_equal;
 497		default: /* what should we do instead? */
 498			break;
 499		}
 500		buf[i] = 0;
 501		*tok = strdup(buf);
 502		return type;
 503
 504 test_equal:
 505		ch = __peek_char();
 506		if (ch == '=')
 507			buf[i++] = __read_char();
 508		break;
 509
 510	case EVENT_DQUOTE:
 511	case EVENT_SQUOTE:
 512		/* don't keep quotes */
 513		i--;
 514		quote_ch = ch;
 515		last_ch = 0;
 516		do {
 517			if (i == (BUFSIZ - 1)) {
 518				buf[i] = 0;
 519				if (*tok) {
 520					*tok = realloc(*tok, tok_size + BUFSIZ);
 521					if (!*tok)
 522						return EVENT_NONE;
 523					strcat(*tok, buf);
 524				} else
 525					*tok = strdup(buf);
 526
 527				if (!*tok)
 528					return EVENT_NONE;
 529				tok_size += BUFSIZ;
 530				i = 0;
 531			}
 532			last_ch = ch;
 533			ch = __read_char();
 534			buf[i++] = ch;
 535			/* the '\' '\' will cancel itself */
 536			if (ch == '\\' && last_ch == '\\')
 537				last_ch = 0;
 538		} while (ch != quote_ch || last_ch == '\\');
 539		/* remove the last quote */
 540		i--;
 541		goto out;
 542
 543	case EVENT_ERROR ... EVENT_SPACE:
 544	case EVENT_ITEM:
 545	default:
 546		break;
 547	}
 548
 549	while (get_type(__peek_char()) == type) {
 550		if (i == (BUFSIZ - 1)) {
 551			buf[i] = 0;
 552			if (*tok) {
 553				*tok = realloc(*tok, tok_size + BUFSIZ);
 554				if (!*tok)
 555					return EVENT_NONE;
 556				strcat(*tok, buf);
 557			} else
 558				*tok = strdup(buf);
 559
 560			if (!*tok)
 561				return EVENT_NONE;
 562			tok_size += BUFSIZ;
 563			i = 0;
 564		}
 565		ch = __read_char();
 566		buf[i++] = ch;
 567	}
 568
 569 out:
 570	buf[i] = 0;
 571	if (*tok) {
 572		*tok = realloc(*tok, tok_size + i);
 573		if (!*tok)
 574			return EVENT_NONE;
 575		strcat(*tok, buf);
 576	} else
 577		*tok = strdup(buf);
 578	if (!*tok)
 579		return EVENT_NONE;
 580
 581	return type;
 582}
 583
 584static void free_token(char *tok)
 585{
 586	if (tok)
 587		free(tok);
 588}
 589
 590static enum event_type read_token(char **tok)
 591{
 592	enum event_type type;
 593
 594	for (;;) {
 595		type = __read_token(tok);
 596		if (type != EVENT_SPACE)
 597			return type;
 598
 599		free_token(*tok);
 600	}
 601
 602	/* not reached */
 603	return EVENT_NONE;
 604}
 605
 606/* no newline */
 607static enum event_type read_token_item(char **tok)
 608{
 609	enum event_type type;
 610
 611	for (;;) {
 612		type = __read_token(tok);
 613		if (type != EVENT_SPACE && type != EVENT_NEWLINE)
 614			return type;
 615
 616		free_token(*tok);
 617	}
 618
 619	/* not reached */
 620	return EVENT_NONE;
 621}
 622
 623static int test_type(enum event_type type, enum event_type expect)
 624{
 625	if (type != expect) {
 626		warning("Error: expected type %d but read %d",
 627		    expect, type);
 628		return -1;
 629	}
 630	return 0;
 631}
 632
 633static int __test_type_token(enum event_type type, char *token,
 634			     enum event_type expect, const char *expect_tok,
 635			     bool warn)
 636{
 637	if (type != expect) {
 638		if (warn)
 639			warning("Error: expected type %d but read %d",
 640				expect, type);
 641		return -1;
 642	}
 643
 644	if (strcmp(token, expect_tok) != 0) {
 645		if (warn)
 646			warning("Error: expected '%s' but read '%s'",
 647				expect_tok, token);
 648		return -1;
 649	}
 650	return 0;
 651}
 652
 653static int test_type_token(enum event_type type, char *token,
 654			   enum event_type expect, const char *expect_tok)
 655{
 656	return __test_type_token(type, token, expect, expect_tok, true);
 657}
 658
 659static int __read_expect_type(enum event_type expect, char **tok, int newline_ok)
 660{
 661	enum event_type type;
 662
 663	if (newline_ok)
 664		type = read_token(tok);
 665	else
 666		type = read_token_item(tok);
 667	return test_type(type, expect);
 668}
 669
 670static int read_expect_type(enum event_type expect, char **tok)
 671{
 672	return __read_expect_type(expect, tok, 1);
 673}
 674
 675static int __read_expected(enum event_type expect, const char *str,
 676			   int newline_ok, bool warn)
 677{
 678	enum event_type type;
 679	char *token;
 680	int ret;
 681
 682	if (newline_ok)
 683		type = read_token(&token);
 684	else
 685		type = read_token_item(&token);
 686
 687	ret = __test_type_token(type, token, expect, str, warn);
 688
 689	free_token(token);
 690
 691	return ret;
 692}
 693
 694static int read_expected(enum event_type expect, const char *str)
 695{
 696	return __read_expected(expect, str, 1, true);
 697}
 698
 699static int read_expected_item(enum event_type expect, const char *str)
 700{
 701	return __read_expected(expect, str, 0, true);
 702}
 703
 704static char *event_read_name(void)
 705{
 706	char *token;
 707
 708	if (read_expected(EVENT_ITEM, "name") < 0)
 709		return NULL;
 710
 711	if (read_expected(EVENT_OP, ":") < 0)
 712		return NULL;
 713
 714	if (read_expect_type(EVENT_ITEM, &token) < 0)
 715		goto fail;
 716
 717	return token;
 718
 719 fail:
 720	free_token(token);
 721	return NULL;
 722}
 723
 724static int event_read_id(void)
 725{
 726	char *token;
 727	int id;
 728
 729	if (read_expected_item(EVENT_ITEM, "ID") < 0)
 730		return -1;
 731
 732	if (read_expected(EVENT_OP, ":") < 0)
 
 
 733		return -1;
 734
 735	if (read_expect_type(EVENT_ITEM, &token) < 0)
 736		goto fail;
 737
 738	id = strtoul(token, NULL, 0);
 739	free_token(token);
 740	return id;
 741
 742 fail:
 743	free_token(token);
 744	return -1;
 745}
 746
 747static int field_is_string(struct format_field *field)
 748{
 749	if ((field->flags & FIELD_IS_ARRAY) &&
 750	    (!strstr(field->type, "char") || !strstr(field->type, "u8") ||
 751	     !strstr(field->type, "s8")))
 752		return 1;
 753
 754	return 0;
 755}
 756
 757static int field_is_dynamic(struct format_field *field)
 758{
 759	if (!strncmp(field->type, "__data_loc", 10))
 760		return 1;
 761
 762	return 0;
 763}
 764
 765static int event_read_fields(struct event *event, struct format_field **fields)
 766{
 767	struct format_field *field = NULL;
 768	enum event_type type;
 769	char *token;
 770	char *last_token;
 771	int count = 0;
 772
 773	do {
 774		type = read_token(&token);
 775		if (type == EVENT_NEWLINE) {
 776			free_token(token);
 777			return count;
 778		}
 779
 780		count++;
 781
 782		if (test_type_token(type, token, EVENT_ITEM, "field"))
 783			goto fail;
 784		free_token(token);
 785
 786		type = read_token(&token);
 787		/*
 788		 * The ftrace fields may still use the "special" name.
 789		 * Just ignore it.
 790		 */
 791		if (event->flags & EVENT_FL_ISFTRACE &&
 792		    type == EVENT_ITEM && strcmp(token, "special") == 0) {
 793			free_token(token);
 794			type = read_token(&token);
 795		}
 796
 797		if (test_type_token(type, token, EVENT_OP, ":") < 0)
 798			return -1;
 799
 800		if (read_expect_type(EVENT_ITEM, &token) < 0)
 801			goto fail;
 802
 803		last_token = token;
 804
 805		field = malloc_or_die(sizeof(*field));
 806		memset(field, 0, sizeof(*field));
 807
 808		/* read the rest of the type */
 809		for (;;) {
 810			type = read_token(&token);
 811			if (type == EVENT_ITEM ||
 812			    (type == EVENT_OP && strcmp(token, "*") == 0) ||
 813			    /*
 814			     * Some of the ftrace fields are broken and have
 815			     * an illegal "." in them.
 816			     */
 817			    (event->flags & EVENT_FL_ISFTRACE &&
 818			     type == EVENT_OP && strcmp(token, ".") == 0)) {
 819
 820				if (strcmp(token, "*") == 0)
 821					field->flags |= FIELD_IS_POINTER;
 822
 823				if (field->type) {
 824					field->type = realloc(field->type,
 825							      strlen(field->type) +
 826							      strlen(last_token) + 2);
 827					strcat(field->type, " ");
 828					strcat(field->type, last_token);
 829				} else
 830					field->type = last_token;
 831				last_token = token;
 832				continue;
 833			}
 834
 835			break;
 836		}
 837
 838		if (!field->type) {
 839			die("no type found");
 840			goto fail;
 841		}
 842		field->name = last_token;
 843
 844		if (test_type(type, EVENT_OP))
 845			goto fail;
 846
 847		if (strcmp(token, "[") == 0) {
 848			enum event_type last_type = type;
 849			char *brackets = token;
 850			int len;
 851
 852			field->flags |= FIELD_IS_ARRAY;
 853
 854			type = read_token(&token);
 855		        while (strcmp(token, "]") != 0) {
 856				if (last_type == EVENT_ITEM &&
 857				    type == EVENT_ITEM)
 858					len = 2;
 859				else
 860					len = 1;
 861				last_type = type;
 862
 863				brackets = realloc(brackets,
 864						   strlen(brackets) +
 865						   strlen(token) + len);
 866				if (len == 2)
 867					strcat(brackets, " ");
 868				strcat(brackets, token);
 869				free_token(token);
 870				type = read_token(&token);
 871				if (type == EVENT_NONE) {
 872					die("failed to find token");
 873					goto fail;
 874				}
 875			}
 876
 877			free_token(token);
 878
 879			brackets = realloc(brackets, strlen(brackets) + 2);
 880			strcat(brackets, "]");
 881
 882			/* add brackets to type */
 883
 884			type = read_token(&token);
 885			/*
 886			 * If the next token is not an OP, then it is of
 887			 * the format: type [] item;
 888			 */
 889			if (type == EVENT_ITEM) {
 890				field->type = realloc(field->type,
 891						      strlen(field->type) +
 892						      strlen(field->name) +
 893						      strlen(brackets) + 2);
 894				strcat(field->type, " ");
 895				strcat(field->type, field->name);
 896				free_token(field->name);
 897				strcat(field->type, brackets);
 898				field->name = token;
 899				type = read_token(&token);
 900			} else {
 901				field->type = realloc(field->type,
 902						      strlen(field->type) +
 903						      strlen(brackets) + 1);
 904				strcat(field->type, brackets);
 905			}
 906			free(brackets);
 907		}
 908
 909		if (field_is_string(field)) {
 910			field->flags |= FIELD_IS_STRING;
 911			if (field_is_dynamic(field))
 912				field->flags |= FIELD_IS_DYNAMIC;
 913		}
 914
 915		if (test_type_token(type, token,  EVENT_OP, ";"))
 916			goto fail;
 917		free_token(token);
 918
 919		if (read_expected(EVENT_ITEM, "offset") < 0)
 920			goto fail_expect;
 921
 922		if (read_expected(EVENT_OP, ":") < 0)
 923			goto fail_expect;
 924
 925		if (read_expect_type(EVENT_ITEM, &token))
 926			goto fail;
 927		field->offset = strtoul(token, NULL, 0);
 928		free_token(token);
 929
 930		if (read_expected(EVENT_OP, ";") < 0)
 931			goto fail_expect;
 932
 933		if (read_expected(EVENT_ITEM, "size") < 0)
 934			goto fail_expect;
 935
 936		if (read_expected(EVENT_OP, ":") < 0)
 937			goto fail_expect;
 938
 939		if (read_expect_type(EVENT_ITEM, &token))
 940			goto fail;
 941		field->size = strtoul(token, NULL, 0);
 942		free_token(token);
 943
 944		if (read_expected(EVENT_OP, ";") < 0)
 945			goto fail_expect;
 946
 947		type = read_token(&token);
 948		if (type != EVENT_NEWLINE) {
 949			/* newer versions of the kernel have a "signed" type */
 950			if (test_type_token(type, token, EVENT_ITEM, "signed"))
 951				goto fail;
 952
 953			free_token(token);
 954
 955			if (read_expected(EVENT_OP, ":") < 0)
 956				goto fail_expect;
 957
 958			if (read_expect_type(EVENT_ITEM, &token))
 959				goto fail;
 960
 961			if (strtoul(token, NULL, 0))
 962				field->flags |= FIELD_IS_SIGNED;
 963
 964			free_token(token);
 965			if (read_expected(EVENT_OP, ";") < 0)
 966				goto fail_expect;
 967
 968			if (read_expect_type(EVENT_NEWLINE, &token))
 969				goto fail;
 970		}
 971
 972		free_token(token);
 973
 974		*fields = field;
 975		fields = &field->next;
 976
 977	} while (1);
 978
 979	return 0;
 980
 981fail:
 982	free_token(token);
 983fail_expect:
 984	if (field)
 985		free(field);
 986	return -1;
 987}
 988
 989static int event_read_format(struct event *event)
 990{
 991	char *token;
 
 992	int ret;
 993
 994	if (read_expected_item(EVENT_ITEM, "format") < 0)
 995		return -1;
 996
 997	if (read_expected(EVENT_OP, ":") < 0)
 998		return -1;
 999
1000	if (read_expect_type(EVENT_NEWLINE, &token))
1001		goto fail;
1002	free_token(token);
1003
1004	ret = event_read_fields(event, &event->format.common_fields);
1005	if (ret < 0)
1006		return ret;
1007	event->format.nr_common = ret;
1008
1009	ret = event_read_fields(event, &event->format.fields);
1010	if (ret < 0)
1011		return ret;
1012	event->format.nr_fields = ret;
1013
1014	return 0;
1015
1016 fail:
1017	free_token(token);
1018	return -1;
1019}
1020
1021enum event_type
1022process_arg_token(struct event *event, struct print_arg *arg,
1023		  char **tok, enum event_type type);
1024
1025static enum event_type
1026process_arg(struct event *event, struct print_arg *arg, char **tok)
1027{
1028	enum event_type type;
1029	char *token;
1030
1031	type = read_token(&token);
1032	*tok = token;
1033
1034	return process_arg_token(event, arg, tok, type);
1035}
1036
1037static enum event_type
1038process_cond(struct event *event, struct print_arg *top, char **tok)
1039{
1040	struct print_arg *arg, *left, *right;
1041	enum event_type type;
1042	char *token = NULL;
1043
1044	arg = malloc_or_die(sizeof(*arg));
1045	memset(arg, 0, sizeof(*arg));
1046
1047	left = malloc_or_die(sizeof(*left));
1048
1049	right = malloc_or_die(sizeof(*right));
1050
1051	arg->type = PRINT_OP;
1052	arg->op.left = left;
1053	arg->op.right = right;
1054
1055	*tok = NULL;
1056	type = process_arg(event, left, &token);
1057	if (test_type_token(type, token, EVENT_OP, ":"))
1058		goto out_free;
1059
1060	arg->op.op = token;
1061
1062	type = process_arg(event, right, &token);
1063
1064	top->op.right = arg;
1065
1066	*tok = token;
1067	return type;
1068
1069out_free:
1070	free_token(*tok);
1071	free(right);
1072	free(left);
1073	free_arg(arg);
1074	return EVENT_ERROR;
1075}
1076
1077static enum event_type
1078process_array(struct event *event, struct print_arg *top, char **tok)
1079{
1080	struct print_arg *arg;
1081	enum event_type type;
1082	char *token = NULL;
1083
1084	arg = malloc_or_die(sizeof(*arg));
1085	memset(arg, 0, sizeof(*arg));
1086
1087	*tok = NULL;
1088	type = process_arg(event, arg, &token);
1089	if (test_type_token(type, token, EVENT_OP, "]"))
1090		goto out_free;
1091
1092	top->op.right = arg;
1093
1094	free_token(token);
1095	type = read_token_item(&token);
1096	*tok = token;
1097
1098	return type;
1099
1100out_free:
1101	free_token(*tok);
1102	free_arg(arg);
1103	return EVENT_ERROR;
1104}
1105
1106static int get_op_prio(char *op)
1107{
1108	if (!op[1]) {
1109		switch (op[0]) {
1110		case '*':
1111		case '/':
1112		case '%':
1113			return 6;
1114		case '+':
1115		case '-':
1116			return 7;
1117			/* '>>' and '<<' are 8 */
1118		case '<':
1119		case '>':
1120			return 9;
1121			/* '==' and '!=' are 10 */
1122		case '&':
1123			return 11;
1124		case '^':
1125			return 12;
1126		case '|':
1127			return 13;
1128		case '?':
1129			return 16;
1130		default:
1131			die("unknown op '%c'", op[0]);
1132			return -1;
1133		}
1134	} else {
1135		if (strcmp(op, "++") == 0 ||
1136		    strcmp(op, "--") == 0) {
1137			return 3;
1138		} else if (strcmp(op, ">>") == 0 ||
1139			   strcmp(op, "<<") == 0) {
1140			return 8;
1141		} else if (strcmp(op, ">=") == 0 ||
1142			   strcmp(op, "<=") == 0) {
1143			return 9;
1144		} else if (strcmp(op, "==") == 0 ||
1145			   strcmp(op, "!=") == 0) {
1146			return 10;
1147		} else if (strcmp(op, "&&") == 0) {
1148			return 14;
1149		} else if (strcmp(op, "||") == 0) {
1150			return 15;
1151		} else {
1152			die("unknown op '%s'", op);
1153			return -1;
1154		}
1155	}
1156}
1157
1158static void set_op_prio(struct print_arg *arg)
1159{
1160
1161	/* single ops are the greatest */
1162	if (!arg->op.left || arg->op.left->type == PRINT_NULL) {
1163		arg->op.prio = 0;
1164		return;
1165	}
1166
1167	arg->op.prio = get_op_prio(arg->op.op);
1168}
1169
1170static enum event_type
1171process_op(struct event *event, struct print_arg *arg, char **tok)
1172{
1173	struct print_arg *left, *right = NULL;
1174	enum event_type type;
1175	char *token;
1176
1177	/* the op is passed in via tok */
1178	token = *tok;
1179
1180	if (arg->type == PRINT_OP && !arg->op.left) {
1181		/* handle single op */
1182		if (token[1]) {
1183			die("bad op token %s", token);
1184			return EVENT_ERROR;
1185		}
1186		switch (token[0]) {
1187		case '!':
1188		case '+':
1189		case '-':
1190			break;
1191		default:
1192			die("bad op token %s", token);
1193			return EVENT_ERROR;
1194		}
1195
1196		/* make an empty left */
1197		left = malloc_or_die(sizeof(*left));
1198		left->type = PRINT_NULL;
1199		arg->op.left = left;
1200
1201		right = malloc_or_die(sizeof(*right));
1202		arg->op.right = right;
1203
1204		type = process_arg(event, right, tok);
1205
1206	} else if (strcmp(token, "?") == 0) {
1207
1208		left = malloc_or_die(sizeof(*left));
1209		/* copy the top arg to the left */
1210		*left = *arg;
1211
1212		arg->type = PRINT_OP;
1213		arg->op.op = token;
1214		arg->op.left = left;
1215		arg->op.prio = 0;
1216
1217		type = process_cond(event, arg, tok);
1218
1219	} else if (strcmp(token, ">>") == 0 ||
1220		   strcmp(token, "<<") == 0 ||
1221		   strcmp(token, "&") == 0 ||
1222		   strcmp(token, "|") == 0 ||
1223		   strcmp(token, "&&") == 0 ||
1224		   strcmp(token, "||") == 0 ||
1225		   strcmp(token, "-") == 0 ||
1226		   strcmp(token, "+") == 0 ||
1227		   strcmp(token, "*") == 0 ||
1228		   strcmp(token, "^") == 0 ||
1229		   strcmp(token, "/") == 0 ||
1230		   strcmp(token, "<") == 0 ||
1231		   strcmp(token, ">") == 0 ||
1232		   strcmp(token, "==") == 0 ||
1233		   strcmp(token, "!=") == 0) {
1234
1235		left = malloc_or_die(sizeof(*left));
1236
1237		/* copy the top arg to the left */
1238		*left = *arg;
1239
1240		arg->type = PRINT_OP;
1241		arg->op.op = token;
1242		arg->op.left = left;
1243
1244		set_op_prio(arg);
1245
1246		right = malloc_or_die(sizeof(*right));
1247
1248		type = read_token_item(&token);
1249		*tok = token;
1250
1251		/* could just be a type pointer */
1252		if ((strcmp(arg->op.op, "*") == 0) &&
1253		    type == EVENT_DELIM && (strcmp(token, ")") == 0)) {
1254			if (left->type != PRINT_ATOM)
1255				die("bad pointer type");
1256			left->atom.atom = realloc(left->atom.atom,
1257					    sizeof(left->atom.atom) + 3);
1258			strcat(left->atom.atom, " *");
1259			*arg = *left;
1260			free(arg);
1261
1262			return type;
1263		}
1264
1265		type = process_arg_token(event, right, tok, type);
1266
1267		arg->op.right = right;
1268
1269	} else if (strcmp(token, "[") == 0) {
1270
1271		left = malloc_or_die(sizeof(*left));
1272		*left = *arg;
1273
1274		arg->type = PRINT_OP;
1275		arg->op.op = token;
1276		arg->op.left = left;
1277
1278		arg->op.prio = 0;
1279		type = process_array(event, arg, tok);
1280
1281	} else {
1282		warning("unknown op '%s'", token);
1283		event->flags |= EVENT_FL_FAILED;
1284		/* the arg is now the left side */
1285		return EVENT_NONE;
1286	}
1287
1288	if (type == EVENT_OP) {
1289		int prio;
1290
1291		/* higher prios need to be closer to the root */
1292		prio = get_op_prio(*tok);
1293
1294		if (prio > arg->op.prio)
1295			return process_op(event, arg, tok);
1296
1297		return process_op(event, right, tok);
1298	}
1299
1300	return type;
1301}
1302
1303static enum event_type
1304process_entry(struct event *event __unused, struct print_arg *arg,
1305	      char **tok)
1306{
1307	enum event_type type;
1308	char *field;
1309	char *token;
1310
1311	if (read_expected(EVENT_OP, "->") < 0)
1312		return EVENT_ERROR;
1313
1314	if (read_expect_type(EVENT_ITEM, &token) < 0)
1315		goto fail;
1316	field = token;
1317
1318	arg->type = PRINT_FIELD;
1319	arg->field.name = field;
1320
1321	if (is_flag_field) {
1322		arg->field.field = find_any_field(event, arg->field.name);
1323		arg->field.field->flags |= FIELD_IS_FLAG;
1324		is_flag_field = 0;
1325	} else if (is_symbolic_field) {
1326		arg->field.field = find_any_field(event, arg->field.name);
1327		arg->field.field->flags |= FIELD_IS_SYMBOLIC;
1328		is_symbolic_field = 0;
1329	}
1330
1331	type = read_token(&token);
1332	*tok = token;
1333
1334	return type;
1335
1336fail:
1337	free_token(token);
1338	return EVENT_ERROR;
1339}
1340
1341static char *arg_eval (struct print_arg *arg);
1342
1343static long long arg_num_eval(struct print_arg *arg)
1344{
1345	long long left, right;
1346	long long val = 0;
1347
1348	switch (arg->type) {
1349	case PRINT_ATOM:
1350		val = strtoll(arg->atom.atom, NULL, 0);
1351		break;
1352	case PRINT_TYPE:
1353		val = arg_num_eval(arg->typecast.item);
1354		break;
1355	case PRINT_OP:
1356		switch (arg->op.op[0]) {
1357		case '|':
1358			left = arg_num_eval(arg->op.left);
1359			right = arg_num_eval(arg->op.right);
1360			if (arg->op.op[1])
1361				val = left || right;
1362			else
1363				val = left | right;
1364			break;
1365		case '&':
1366			left = arg_num_eval(arg->op.left);
1367			right = arg_num_eval(arg->op.right);
1368			if (arg->op.op[1])
1369				val = left && right;
1370			else
1371				val = left & right;
1372			break;
1373		case '<':
1374			left = arg_num_eval(arg->op.left);
1375			right = arg_num_eval(arg->op.right);
1376			switch (arg->op.op[1]) {
1377			case 0:
1378				val = left < right;
1379				break;
1380			case '<':
1381				val = left << right;
1382				break;
1383			case '=':
1384				val = left <= right;
1385				break;
1386			default:
1387				die("unknown op '%s'", arg->op.op);
1388			}
1389			break;
1390		case '>':
1391			left = arg_num_eval(arg->op.left);
1392			right = arg_num_eval(arg->op.right);
1393			switch (arg->op.op[1]) {
1394			case 0:
1395				val = left > right;
1396				break;
1397			case '>':
1398				val = left >> right;
1399				break;
1400			case '=':
1401				val = left >= right;
1402				break;
1403			default:
1404				die("unknown op '%s'", arg->op.op);
1405			}
1406			break;
1407		case '=':
1408			left = arg_num_eval(arg->op.left);
1409			right = arg_num_eval(arg->op.right);
1410
1411			if (arg->op.op[1] != '=')
1412				die("unknown op '%s'", arg->op.op);
1413
1414			val = left == right;
1415			break;
1416		case '!':
1417			left = arg_num_eval(arg->op.left);
1418			right = arg_num_eval(arg->op.right);
1419
1420			switch (arg->op.op[1]) {
1421			case '=':
1422				val = left != right;
1423				break;
1424			default:
1425				die("unknown op '%s'", arg->op.op);
1426			}
1427			break;
1428		default:
1429			die("unknown op '%s'", arg->op.op);
1430		}
1431		break;
1432
1433	case PRINT_NULL:
1434	case PRINT_FIELD ... PRINT_SYMBOL:
1435	case PRINT_STRING:
1436	default:
1437		die("invalid eval type %d", arg->type);
1438
1439	}
1440	return val;
1441}
1442
1443static char *arg_eval (struct print_arg *arg)
1444{
1445	long long val;
1446	static char buf[20];
1447
1448	switch (arg->type) {
1449	case PRINT_ATOM:
1450		return arg->atom.atom;
1451	case PRINT_TYPE:
1452		return arg_eval(arg->typecast.item);
1453	case PRINT_OP:
1454		val = arg_num_eval(arg);
1455		sprintf(buf, "%lld", val);
1456		return buf;
1457
1458	case PRINT_NULL:
1459	case PRINT_FIELD ... PRINT_SYMBOL:
1460	case PRINT_STRING:
1461	default:
1462		die("invalid eval type %d", arg->type);
1463		break;
1464	}
1465
1466	return NULL;
1467}
1468
1469static enum event_type
1470process_fields(struct event *event, struct print_flag_sym **list, char **tok)
1471{
1472	enum event_type type;
1473	struct print_arg *arg = NULL;
1474	struct print_flag_sym *field;
1475	char *token = NULL;
1476	char *value;
1477
1478	do {
1479		free_token(token);
1480		type = read_token_item(&token);
1481		if (test_type_token(type, token, EVENT_OP, "{"))
1482			break;
1483
1484		arg = malloc_or_die(sizeof(*arg));
1485
1486		free_token(token);
1487		type = process_arg(event, arg, &token);
1488		if (test_type_token(type, token, EVENT_DELIM, ","))
1489			goto out_free;
1490
1491		field = malloc_or_die(sizeof(*field));
1492		memset(field, 0, sizeof(*field));
1493
1494		value = arg_eval(arg);
1495		field->value = strdup(value);
1496
1497		free_token(token);
1498		type = process_arg(event, arg, &token);
1499		if (test_type_token(type, token, EVENT_OP, "}"))
1500			goto out_free;
1501
1502		value = arg_eval(arg);
1503		field->str = strdup(value);
1504		free_arg(arg);
1505		arg = NULL;
1506
1507		*list = field;
1508		list = &field->next;
1509
1510		free_token(token);
1511		type = read_token_item(&token);
1512	} while (type == EVENT_DELIM && strcmp(token, ",") == 0);
1513
1514	*tok = token;
1515	return type;
1516
1517out_free:
1518	free_arg(arg);
1519	free_token(token);
1520
1521	return EVENT_ERROR;
1522}
1523
1524static enum event_type
1525process_flags(struct event *event, struct print_arg *arg, char **tok)
1526{
1527	struct print_arg *field;
1528	enum event_type type;
1529	char *token;
1530
1531	memset(arg, 0, sizeof(*arg));
1532	arg->type = PRINT_FLAGS;
1533
1534	if (read_expected_item(EVENT_DELIM, "(") < 0)
1535		return EVENT_ERROR;
1536
1537	field = malloc_or_die(sizeof(*field));
1538
1539	type = process_arg(event, field, &token);
1540	if (test_type_token(type, token, EVENT_DELIM, ","))
1541		goto out_free;
1542
1543	arg->flags.field = field;
1544
1545	type = read_token_item(&token);
1546	if (event_item_type(type)) {
1547		arg->flags.delim = token;
1548		type = read_token_item(&token);
1549	}
1550
1551	if (test_type_token(type, token, EVENT_DELIM, ","))
1552		goto out_free;
1553
1554	type = process_fields(event, &arg->flags.flags, &token);
1555	if (test_type_token(type, token, EVENT_DELIM, ")"))
1556		goto out_free;
1557
1558	free_token(token);
1559	type = read_token_item(tok);
1560	return type;
1561
1562out_free:
1563	free_token(token);
1564	return EVENT_ERROR;
1565}
1566
1567static enum event_type
1568process_symbols(struct event *event, struct print_arg *arg, char **tok)
1569{
1570	struct print_arg *field;
1571	enum event_type type;
1572	char *token;
1573
1574	memset(arg, 0, sizeof(*arg));
1575	arg->type = PRINT_SYMBOL;
1576
1577	if (read_expected_item(EVENT_DELIM, "(") < 0)
1578		return EVENT_ERROR;
1579
1580	field = malloc_or_die(sizeof(*field));
1581
1582	type = process_arg(event, field, &token);
1583	if (test_type_token(type, token, EVENT_DELIM, ","))
1584		goto out_free;
1585
1586	arg->symbol.field = field;
1587
1588	type = process_fields(event, &arg->symbol.symbols, &token);
1589	if (test_type_token(type, token, EVENT_DELIM, ")"))
1590		goto out_free;
1591
1592	free_token(token);
1593	type = read_token_item(tok);
1594	return type;
1595
1596out_free:
1597	free_token(token);
1598	return EVENT_ERROR;
1599}
1600
1601static enum event_type
1602process_paren(struct event *event, struct print_arg *arg, char **tok)
1603{
1604	struct print_arg *item_arg;
1605	enum event_type type;
1606	char *token;
1607
1608	type = process_arg(event, arg, &token);
1609
1610	if (type == EVENT_ERROR)
1611		return EVENT_ERROR;
1612
1613	if (type == EVENT_OP)
1614		type = process_op(event, arg, &token);
1615
1616	if (type == EVENT_ERROR)
1617		return EVENT_ERROR;
1618
1619	if (test_type_token(type, token, EVENT_DELIM, ")")) {
1620		free_token(token);
1621		return EVENT_ERROR;
1622	}
1623
1624	free_token(token);
1625	type = read_token_item(&token);
1626
1627	/*
1628	 * If the next token is an item or another open paren, then
1629	 * this was a typecast.
1630	 */
1631	if (event_item_type(type) ||
1632	    (type == EVENT_DELIM && strcmp(token, "(") == 0)) {
1633
1634		/* make this a typecast and contine */
1635
1636		/* prevous must be an atom */
1637		if (arg->type != PRINT_ATOM)
1638			die("previous needed to be PRINT_ATOM");
1639
1640		item_arg = malloc_or_die(sizeof(*item_arg));
1641
1642		arg->type = PRINT_TYPE;
1643		arg->typecast.type = arg->atom.atom;
1644		arg->typecast.item = item_arg;
1645		type = process_arg_token(event, item_arg, &token, type);
1646
1647	}
1648
1649	*tok = token;
1650	return type;
1651}
1652
1653
1654static enum event_type
1655process_str(struct event *event __unused, struct print_arg *arg, char **tok)
1656{
1657	enum event_type type;
1658	char *token;
1659
1660	if (read_expected(EVENT_DELIM, "(") < 0)
1661		return EVENT_ERROR;
1662
1663	if (read_expect_type(EVENT_ITEM, &token) < 0)
1664		goto fail;
1665
1666	arg->type = PRINT_STRING;
1667	arg->string.string = token;
1668	arg->string.offset = -1;
1669
1670	if (read_expected(EVENT_DELIM, ")") < 0)
1671		return EVENT_ERROR;
1672
1673	type = read_token(&token);
1674	*tok = token;
1675
1676	return type;
1677fail:
1678	free_token(token);
1679	return EVENT_ERROR;
1680}
1681
1682enum event_type
1683process_arg_token(struct event *event, struct print_arg *arg,
1684		  char **tok, enum event_type type)
1685{
1686	char *token;
1687	char *atom;
1688
1689	token = *tok;
1690
1691	switch (type) {
1692	case EVENT_ITEM:
1693		if (strcmp(token, "REC") == 0) {
1694			free_token(token);
1695			type = process_entry(event, arg, &token);
1696		} else if (strcmp(token, "__print_flags") == 0) {
1697			free_token(token);
1698			is_flag_field = 1;
1699			type = process_flags(event, arg, &token);
1700		} else if (strcmp(token, "__print_symbolic") == 0) {
1701			free_token(token);
1702			is_symbolic_field = 1;
1703			type = process_symbols(event, arg, &token);
1704		} else if (strcmp(token, "__get_str") == 0) {
1705			free_token(token);
1706			type = process_str(event, arg, &token);
1707		} else {
1708			atom = token;
1709			/* test the next token */
1710			type = read_token_item(&token);
1711
1712			/* atoms can be more than one token long */
1713			while (type == EVENT_ITEM) {
1714				atom = realloc(atom, strlen(atom) + strlen(token) + 2);
1715				strcat(atom, " ");
1716				strcat(atom, token);
1717				free_token(token);
1718				type = read_token_item(&token);
1719			}
1720
1721			/* todo, test for function */
1722
1723			arg->type = PRINT_ATOM;
1724			arg->atom.atom = atom;
1725		}
1726		break;
1727	case EVENT_DQUOTE:
1728	case EVENT_SQUOTE:
1729		arg->type = PRINT_ATOM;
1730		arg->atom.atom = token;
1731		type = read_token_item(&token);
1732		break;
1733	case EVENT_DELIM:
1734		if (strcmp(token, "(") == 0) {
1735			free_token(token);
1736			type = process_paren(event, arg, &token);
1737			break;
1738		}
1739	case EVENT_OP:
1740		/* handle single ops */
1741		arg->type = PRINT_OP;
1742		arg->op.op = token;
1743		arg->op.left = NULL;
1744		type = process_op(event, arg, &token);
1745
1746		break;
1747
1748	case EVENT_ERROR ... EVENT_NEWLINE:
1749	default:
1750		die("unexpected type %d", type);
1751	}
1752	*tok = token;
1753
1754	return type;
1755}
1756
1757static int event_read_print_args(struct event *event, struct print_arg **list)
1758{
1759	enum event_type type = EVENT_ERROR;
1760	struct print_arg *arg;
1761	char *token;
1762	int args = 0;
1763
1764	do {
1765		if (type == EVENT_NEWLINE) {
1766			free_token(token);
1767			type = read_token_item(&token);
1768			continue;
1769		}
1770
1771		arg = malloc_or_die(sizeof(*arg));
1772		memset(arg, 0, sizeof(*arg));
1773
1774		type = process_arg(event, arg, &token);
 
 
 
1775
1776		if (type == EVENT_ERROR) {
1777			free_arg(arg);
1778			return -1;
1779		}
1780
1781		*list = arg;
1782		args++;
1783
1784		if (type == EVENT_OP) {
1785			type = process_op(event, arg, &token);
1786			list = &arg->next;
1787			continue;
1788		}
1789
1790		if (type == EVENT_DELIM && strcmp(token, ",") == 0) {
1791			free_token(token);
1792			*list = arg;
1793			list = &arg->next;
1794			continue;
1795		}
1796		break;
1797	} while (type != EVENT_NONE);
1798
1799	if (type != EVENT_NONE)
1800		free_token(token);
1801
1802	return args;
1803}
1804
1805static int event_read_print(struct event *event)
1806{
1807	enum event_type type;
1808	char *token;
1809	int ret;
1810
1811	if (read_expected_item(EVENT_ITEM, "print") < 0)
1812		return -1;
1813
1814	if (read_expected(EVENT_ITEM, "fmt") < 0)
1815		return -1;
1816
1817	if (read_expected(EVENT_OP, ":") < 0)
1818		return -1;
1819
1820	if (read_expect_type(EVENT_DQUOTE, &token) < 0)
1821		goto fail;
1822
1823 concat:
1824	event->print_fmt.format = token;
1825	event->print_fmt.args = NULL;
1826
1827	/* ok to have no arg */
1828	type = read_token_item(&token);
1829
1830	if (type == EVENT_NONE)
1831		return 0;
1832
1833	/* Handle concatination of print lines */
1834	if (type == EVENT_DQUOTE) {
1835		char *cat;
1836
1837		cat = malloc_or_die(strlen(event->print_fmt.format) +
1838				    strlen(token) + 1);
1839		strcpy(cat, event->print_fmt.format);
1840		strcat(cat, token);
1841		free_token(token);
1842		free_token(event->print_fmt.format);
1843		event->print_fmt.format = NULL;
1844		token = cat;
1845		goto concat;
1846	}
1847
1848	if (test_type_token(type, token, EVENT_DELIM, ","))
1849		goto fail;
1850
1851	free_token(token);
1852
1853	ret = event_read_print_args(event, &event->print_fmt.args);
1854	if (ret < 0)
1855		return -1;
1856
1857	return ret;
1858
1859 fail:
1860	free_token(token);
1861	return -1;
1862}
1863
1864static struct format_field *
1865find_common_field(struct event *event, const char *name)
1866{
1867	struct format_field *format;
1868
1869	for (format = event->format.common_fields;
1870	     format; format = format->next) {
1871		if (strcmp(format->name, name) == 0)
1872			break;
1873	}
1874
1875	return format;
1876}
1877
1878static struct format_field *
1879find_field(struct event *event, const char *name)
1880{
1881	struct format_field *format;
1882
1883	for (format = event->format.fields;
1884	     format; format = format->next) {
1885		if (strcmp(format->name, name) == 0)
1886			break;
1887	}
1888
1889	return format;
1890}
1891
1892static struct format_field *
1893find_any_field(struct event *event, const char *name)
1894{
1895	struct format_field *format;
1896
1897	format = find_common_field(event, name);
1898	if (format)
1899		return format;
1900	return find_field(event, name);
1901}
1902
1903unsigned long long read_size(void *ptr, int size)
1904{
1905	switch (size) {
1906	case 1:
1907		return *(unsigned char *)ptr;
1908	case 2:
1909		return data2host2(ptr);
1910	case 4:
1911		return data2host4(ptr);
1912	case 8:
1913		return data2host8(ptr);
1914	default:
1915		/* BUG! */
1916		return 0;
1917	}
 
1918}
1919
1920unsigned long long
1921raw_field_value(struct event *event, const char *name, void *data)
1922{
1923	struct format_field *field;
1924
1925	field = find_any_field(event, name);
1926	if (!field)
1927		return 0ULL;
1928
1929	return read_size(data + field->offset, field->size);
1930}
1931
1932void *raw_field_ptr(struct event *event, const char *name, void *data)
 
1933{
1934	struct format_field *field;
1935
1936	field = find_any_field(event, name);
1937	if (!field)
1938		return NULL;
1939
1940	if (field->flags & FIELD_IS_DYNAMIC) {
1941		int offset;
1942
1943		offset = *(int *)(data + field->offset);
1944		offset &= 0xffff;
1945
1946		return data + offset;
 
 
 
 
1947	}
1948
1949	return data + field->offset;
1950}
1951
1952static int get_common_info(const char *type, int *offset, int *size)
1953{
1954	struct event *event;
1955	struct format_field *field;
 
 
 
1956
1957	/*
1958	 * All events should have the same common elements.
1959	 * Pick any event to find where the type is;
1960	 */
1961	if (!event_list)
1962		die("no event_list!");
1963
1964	event = event_list;
1965	field = find_common_field(event, type);
1966	if (!field)
1967		die("field '%s' not found", type);
1968
1969	*offset = field->offset;
1970	*size = field->size;
1971
1972	return 0;
1973}
1974
1975static int __parse_common(void *data, int *size, int *offset,
1976			  const char *name)
1977{
1978	int ret;
1979
1980	if (!*size) {
1981		ret = get_common_info(name, offset, size);
1982		if (ret < 0)
1983			return ret;
1984	}
1985	return read_size(data + *offset, *size);
1986}
1987
1988int trace_parse_common_type(void *data)
1989{
1990	static int type_offset;
1991	static int type_size;
1992
1993	return __parse_common(data, &type_size, &type_offset,
1994			      "common_type");
1995}
1996
1997int trace_parse_common_pid(void *data)
1998{
1999	static int pid_offset;
2000	static int pid_size;
2001
2002	return __parse_common(data, &pid_size, &pid_offset,
2003			      "common_pid");
2004}
2005
2006int parse_common_pc(void *data)
2007{
2008	static int pc_offset;
2009	static int pc_size;
2010
2011	return __parse_common(data, &pc_size, &pc_offset,
2012			      "common_preempt_count");
2013}
2014
2015int parse_common_flags(void *data)
2016{
2017	static int flags_offset;
2018	static int flags_size;
2019
2020	return __parse_common(data, &flags_size, &flags_offset,
2021			      "common_flags");
2022}
2023
2024int parse_common_lock_depth(void *data)
 
2025{
2026	static int ld_offset;
2027	static int ld_size;
2028	int ret;
2029
2030	ret = __parse_common(data, &ld_size, &ld_offset,
2031			     "common_lock_depth");
2032	if (ret < 0)
2033		return -1;
2034
2035	return ret;
 
 
 
 
 
 
 
 
 
 
 
 
 
2036}
2037
2038struct event *trace_find_event(int id)
 
2039{
2040	struct event *event;
 
 
 
2041
2042	for (event = event_list; event; event = event->next) {
2043		if (event->id == id)
2044			break;
 
 
2045	}
2046	return event;
2047}
2048
2049struct event *trace_find_next_event(struct event *event)
2050{
2051	if (!event)
2052		return event_list;
2053
2054	return event->next;
2055}
2056
2057static unsigned long long eval_num_arg(void *data, int size,
2058				   struct event *event, struct print_arg *arg)
2059{
2060	unsigned long long val = 0;
2061	unsigned long long left, right;
2062	struct print_arg *larg;
2063
2064	switch (arg->type) {
2065	case PRINT_NULL:
2066		/* ?? */
2067		return 0;
2068	case PRINT_ATOM:
2069		return strtoull(arg->atom.atom, NULL, 0);
2070	case PRINT_FIELD:
2071		if (!arg->field.field) {
2072			arg->field.field = find_any_field(event, arg->field.name);
2073			if (!arg->field.field)
2074				die("field %s not found", arg->field.name);
2075		}
2076		/* must be a number */
2077		val = read_size(data + arg->field.field->offset,
2078				arg->field.field->size);
2079		break;
2080	case PRINT_FLAGS:
2081	case PRINT_SYMBOL:
2082		break;
2083	case PRINT_TYPE:
2084		return eval_num_arg(data, size, event, arg->typecast.item);
2085	case PRINT_STRING:
2086		return 0;
2087		break;
2088	case PRINT_OP:
2089		if (strcmp(arg->op.op, "[") == 0) {
2090			/*
2091			 * Arrays are special, since we don't want
2092			 * to read the arg as is.
2093			 */
2094			if (arg->op.left->type != PRINT_FIELD)
2095				goto default_op; /* oops, all bets off */
2096			larg = arg->op.left;
2097			if (!larg->field.field) {
2098				larg->field.field =
2099					find_any_field(event, larg->field.name);
2100				if (!larg->field.field)
2101					die("field %s not found", larg->field.name);
2102			}
2103			right = eval_num_arg(data, size, event, arg->op.right);
2104			val = read_size(data + larg->field.field->offset +
2105					right * long_size, long_size);
2106			break;
2107		}
2108 default_op:
2109		left = eval_num_arg(data, size, event, arg->op.left);
2110		right = eval_num_arg(data, size, event, arg->op.right);
2111		switch (arg->op.op[0]) {
2112		case '|':
2113			if (arg->op.op[1])
2114				val = left || right;
2115			else
2116				val = left | right;
2117			break;
2118		case '&':
2119			if (arg->op.op[1])
2120				val = left && right;
2121			else
2122				val = left & right;
2123			break;
2124		case '<':
2125			switch (arg->op.op[1]) {
2126			case 0:
2127				val = left < right;
2128				break;
2129			case '<':
2130				val = left << right;
2131				break;
2132			case '=':
2133				val = left <= right;
2134				break;
2135			default:
2136				die("unknown op '%s'", arg->op.op);
2137			}
2138			break;
2139		case '>':
2140			switch (arg->op.op[1]) {
2141			case 0:
2142				val = left > right;
2143				break;
2144			case '>':
2145				val = left >> right;
2146				break;
2147			case '=':
2148				val = left >= right;
2149				break;
2150			default:
2151				die("unknown op '%s'", arg->op.op);
2152			}
2153			break;
2154		case '=':
2155			if (arg->op.op[1] != '=')
2156				die("unknown op '%s'", arg->op.op);
2157			val = left == right;
2158			break;
2159		case '-':
2160			val = left - right;
2161			break;
2162		case '+':
2163			val = left + right;
2164			break;
2165		default:
2166			die("unknown op '%s'", arg->op.op);
2167		}
2168		break;
2169	default: /* not sure what to do there */
2170		return 0;
2171	}
2172	return val;
2173}
2174
2175struct flag {
2176	const char *name;
2177	unsigned long long value;
2178};
2179
2180static const struct flag flags[] = {
2181	{ "HI_SOFTIRQ", 0 },
2182	{ "TIMER_SOFTIRQ", 1 },
2183	{ "NET_TX_SOFTIRQ", 2 },
2184	{ "NET_RX_SOFTIRQ", 3 },
2185	{ "BLOCK_SOFTIRQ", 4 },
2186	{ "BLOCK_IOPOLL_SOFTIRQ", 5 },
2187	{ "TASKLET_SOFTIRQ", 6 },
2188	{ "SCHED_SOFTIRQ", 7 },
2189	{ "HRTIMER_SOFTIRQ", 8 },
2190	{ "RCU_SOFTIRQ", 9 },
2191
2192	{ "HRTIMER_NORESTART", 0 },
2193	{ "HRTIMER_RESTART", 1 },
2194};
2195
2196unsigned long long eval_flag(const char *flag)
2197{
2198	int i;
2199
2200	/*
2201	 * Some flags in the format files do not get converted.
2202	 * If the flag is not numeric, see if it is something that
2203	 * we already know about.
2204	 */
2205	if (isdigit(flag[0]))
2206		return strtoull(flag, NULL, 0);
2207
2208	for (i = 0; i < (int)(sizeof(flags)/sizeof(flags[0])); i++)
2209		if (strcmp(flags[i].name, flag) == 0)
2210			return flags[i].value;
2211
2212	return 0;
2213}
2214
2215static void print_str_arg(void *data, int size,
2216			  struct event *event, struct print_arg *arg)
2217{
2218	struct print_flag_sym *flag;
2219	unsigned long long val, fval;
2220	char *str;
2221	int print;
2222
2223	switch (arg->type) {
2224	case PRINT_NULL:
2225		/* ?? */
2226		return;
2227	case PRINT_ATOM:
2228		printf("%s", arg->atom.atom);
2229		return;
2230	case PRINT_FIELD:
2231		if (!arg->field.field) {
2232			arg->field.field = find_any_field(event, arg->field.name);
2233			if (!arg->field.field)
2234				die("field %s not found", arg->field.name);
2235		}
2236		str = malloc_or_die(arg->field.field->size + 1);
2237		memcpy(str, data + arg->field.field->offset,
2238		       arg->field.field->size);
2239		str[arg->field.field->size] = 0;
2240		printf("%s", str);
2241		free(str);
2242		break;
2243	case PRINT_FLAGS:
2244		val = eval_num_arg(data, size, event, arg->flags.field);
2245		print = 0;
2246		for (flag = arg->flags.flags; flag; flag = flag->next) {
2247			fval = eval_flag(flag->value);
2248			if (!val && !fval) {
2249				printf("%s", flag->str);
2250				break;
2251			}
2252			if (fval && (val & fval) == fval) {
2253				if (print && arg->flags.delim)
2254					printf("%s", arg->flags.delim);
2255				printf("%s", flag->str);
2256				print = 1;
2257				val &= ~fval;
2258			}
2259		}
2260		break;
2261	case PRINT_SYMBOL:
2262		val = eval_num_arg(data, size, event, arg->symbol.field);
2263		for (flag = arg->symbol.symbols; flag; flag = flag->next) {
2264			fval = eval_flag(flag->value);
2265			if (val == fval) {
2266				printf("%s", flag->str);
2267				break;
2268			}
2269		}
2270		break;
2271
2272	case PRINT_TYPE:
2273		break;
2274	case PRINT_STRING: {
2275		int str_offset;
2276
2277		if (arg->string.offset == -1) {
2278			struct format_field *f;
2279
2280			f = find_any_field(event, arg->string.string);
2281			arg->string.offset = f->offset;
2282		}
2283		str_offset = *(int *)(data + arg->string.offset);
2284		str_offset &= 0xffff;
2285		printf("%s", ((char *)data) + str_offset);
2286		break;
2287	}
2288	case PRINT_OP:
2289		/*
2290		 * The only op for string should be ? :
2291		 */
2292		if (arg->op.op[0] != '?')
2293			return;
2294		val = eval_num_arg(data, size, event, arg->op.left);
2295		if (val)
2296			print_str_arg(data, size, event, arg->op.right->op.left);
2297		else
2298			print_str_arg(data, size, event, arg->op.right->op.right);
2299		break;
2300	default:
2301		/* well... */
2302		break;
2303	}
2304}
2305
2306static struct print_arg *make_bprint_args(char *fmt, void *data, int size, struct event *event)
2307{
2308	static struct format_field *field, *ip_field;
2309	struct print_arg *args, *arg, **next;
2310	unsigned long long ip, val;
2311	char *ptr;
2312	void *bptr;
2313
2314	if (!field) {
2315		field = find_field(event, "buf");
2316		if (!field)
2317			die("can't find buffer field for binary printk");
2318		ip_field = find_field(event, "ip");
2319		if (!ip_field)
2320			die("can't find ip field for binary printk");
2321	}
2322
2323	ip = read_size(data + ip_field->offset, ip_field->size);
2324
2325	/*
2326	 * The first arg is the IP pointer.
2327	 */
2328	args = malloc_or_die(sizeof(*args));
2329	arg = args;
2330	arg->next = NULL;
2331	next = &arg->next;
2332
2333	arg->type = PRINT_ATOM;
2334	arg->atom.atom = malloc_or_die(32);
2335	sprintf(arg->atom.atom, "%lld", ip);
2336
2337	/* skip the first "%pf : " */
2338	for (ptr = fmt + 6, bptr = data + field->offset;
2339	     bptr < data + size && *ptr; ptr++) {
2340		int ls = 0;
2341
2342		if (*ptr == '%') {
2343 process_again:
2344			ptr++;
2345			switch (*ptr) {
2346			case '%':
2347				break;
2348			case 'l':
2349				ls++;
2350				goto process_again;
2351			case 'L':
2352				ls = 2;
2353				goto process_again;
2354			case '0' ... '9':
2355				goto process_again;
2356			case 'p':
2357				ls = 1;
2358				/* fall through */
2359			case 'd':
2360			case 'u':
2361			case 'x':
2362			case 'i':
2363				/* the pointers are always 4 bytes aligned */
2364				bptr = (void *)(((unsigned long)bptr + 3) &
2365						~3);
2366				switch (ls) {
2367				case 0:
2368				case 1:
2369					ls = long_size;
2370					break;
2371				case 2:
2372					ls = 8;
2373				default:
2374					break;
2375				}
2376				val = read_size(bptr, ls);
2377				bptr += ls;
2378				arg = malloc_or_die(sizeof(*arg));
2379				arg->next = NULL;
2380				arg->type = PRINT_ATOM;
2381				arg->atom.atom = malloc_or_die(32);
2382				sprintf(arg->atom.atom, "%lld", val);
2383				*next = arg;
2384				next = &arg->next;
2385				break;
2386			case 's':
2387				arg = malloc_or_die(sizeof(*arg));
2388				arg->next = NULL;
2389				arg->type = PRINT_STRING;
2390				arg->string.string = strdup(bptr);
2391				bptr += strlen(bptr) + 1;
2392				*next = arg;
2393				next = &arg->next;
2394			default:
2395				break;
2396			}
2397		}
2398	}
2399
2400	return args;
2401}
2402
2403static void free_args(struct print_arg *args)
2404{
2405	struct print_arg *next;
2406
2407	while (args) {
2408		next = args->next;
2409
2410		if (args->type == PRINT_ATOM)
2411			free(args->atom.atom);
2412		else
2413			free(args->string.string);
2414		free(args);
2415		args = next;
2416	}
2417}
2418
2419static char *get_bprint_format(void *data, int size __unused, struct event *event)
2420{
2421	unsigned long long addr;
2422	static struct format_field *field;
2423	struct printk_map *printk;
2424	char *format;
2425	char *p;
2426
2427	if (!field) {
2428		field = find_field(event, "fmt");
2429		if (!field)
2430			die("can't find format field for binary printk");
2431		printf("field->offset = %d size=%d\n", field->offset, field->size);
2432	}
2433
2434	addr = read_size(data + field->offset, field->size);
2435
2436	printk = find_printk(addr);
2437	if (!printk) {
2438		format = malloc_or_die(45);
2439		sprintf(format, "%%pf : (NO FORMAT FOUND at %llx)\n",
2440			addr);
2441		return format;
2442	}
2443
2444	p = printk->printk;
2445	/* Remove any quotes. */
2446	if (*p == '"')
2447		p++;
2448	format = malloc_or_die(strlen(p) + 10);
2449	sprintf(format, "%s : %s", "%pf", p);
2450	/* remove ending quotes and new line since we will add one too */
2451	p = format + strlen(format) - 1;
2452	if (*p == '"')
2453		*p = 0;
2454
2455	p -= 2;
2456	if (strcmp(p, "\\n") == 0)
2457		*p = 0;
2458
2459	return format;
2460}
2461
2462static void pretty_print(void *data, int size, struct event *event)
2463{
2464	struct print_fmt *print_fmt = &event->print_fmt;
2465	struct print_arg *arg = print_fmt->args;
2466	struct print_arg *args = NULL;
2467	const char *ptr = print_fmt->format;
2468	unsigned long long val;
2469	struct func_map *func;
2470	const char *saveptr;
2471	char *bprint_fmt = NULL;
2472	char format[32];
2473	int show_func;
2474	int len;
2475	int ls;
2476
2477	if (event->flags & EVENT_FL_ISFUNC)
2478		ptr = " %pF <-- %pF";
2479
2480	if (event->flags & EVENT_FL_ISBPRINT) {
2481		bprint_fmt = get_bprint_format(data, size, event);
2482		args = make_bprint_args(bprint_fmt, data, size, event);
2483		arg = args;
2484		ptr = bprint_fmt;
2485	}
2486
2487	for (; *ptr; ptr++) {
2488		ls = 0;
2489		if (*ptr == '\\') {
2490			ptr++;
2491			switch (*ptr) {
2492			case 'n':
2493				printf("\n");
2494				break;
2495			case 't':
2496				printf("\t");
2497				break;
2498			case 'r':
2499				printf("\r");
2500				break;
2501			case '\\':
2502				printf("\\");
2503				break;
2504			default:
2505				printf("%c", *ptr);
2506				break;
2507			}
2508
2509		} else if (*ptr == '%') {
2510			saveptr = ptr;
2511			show_func = 0;
2512 cont_process:
2513			ptr++;
2514			switch (*ptr) {
2515			case '%':
2516				printf("%%");
2517				break;
2518			case 'l':
2519				ls++;
2520				goto cont_process;
2521			case 'L':
2522				ls = 2;
2523				goto cont_process;
2524			case 'z':
2525			case 'Z':
2526			case '0' ... '9':
2527				goto cont_process;
2528			case 'p':
2529				if (long_size == 4)
2530					ls = 1;
2531				else
2532					ls = 2;
2533
2534				if (*(ptr+1) == 'F' ||
2535				    *(ptr+1) == 'f') {
2536					ptr++;
2537					show_func = *ptr;
2538				}
2539
2540				/* fall through */
2541			case 'd':
2542			case 'i':
2543			case 'x':
2544			case 'X':
2545			case 'u':
2546				if (!arg)
2547					die("no argument match");
2548
2549				len = ((unsigned long)ptr + 1) -
2550					(unsigned long)saveptr;
2551
2552				/* should never happen */
2553				if (len > 32)
2554					die("bad format!");
2555
2556				memcpy(format, saveptr, len);
2557				format[len] = 0;
2558
2559				val = eval_num_arg(data, size, event, arg);
2560				arg = arg->next;
2561
2562				if (show_func) {
2563					func = find_func(val);
2564					if (func) {
2565						printf("%s", func->func);
2566						if (show_func == 'F')
2567							printf("+0x%llx",
2568							       val - func->addr);
2569						break;
2570					}
2571				}
2572				switch (ls) {
2573				case 0:
2574					printf(format, (int)val);
2575					break;
2576				case 1:
2577					printf(format, (long)val);
2578					break;
2579				case 2:
2580					printf(format, (long long)val);
2581					break;
2582				default:
2583					die("bad count (%d)", ls);
2584				}
2585				break;
2586			case 's':
2587				if (!arg)
2588					die("no matching argument");
2589
2590				print_str_arg(data, size, event, arg);
2591				arg = arg->next;
2592				break;
2593			default:
2594				printf(">%c<", *ptr);
2595
2596			}
2597		} else
2598			printf("%c", *ptr);
2599	}
2600
2601	if (args) {
2602		free_args(args);
2603		free(bprint_fmt);
2604	}
2605}
2606
2607static inline int log10_cpu(int nb)
2608{
2609	if (nb / 100)
2610		return 3;
2611	if (nb / 10)
2612		return 2;
2613	return 1;
2614}
2615
2616static void print_lat_fmt(void *data, int size __unused)
2617{
2618	unsigned int lat_flags;
2619	unsigned int pc;
2620	int lock_depth;
2621	int hardirq;
2622	int softirq;
2623
2624	lat_flags = parse_common_flags(data);
2625	pc = parse_common_pc(data);
2626	lock_depth = parse_common_lock_depth(data);
2627
2628	hardirq = lat_flags & TRACE_FLAG_HARDIRQ;
2629	softirq = lat_flags & TRACE_FLAG_SOFTIRQ;
2630
2631	printf("%c%c%c",
2632	       (lat_flags & TRACE_FLAG_IRQS_OFF) ? 'd' :
2633	       (lat_flags & TRACE_FLAG_IRQS_NOSUPPORT) ?
2634	       'X' : '.',
2635	       (lat_flags & TRACE_FLAG_NEED_RESCHED) ?
2636	       'N' : '.',
2637	       (hardirq && softirq) ? 'H' :
2638	       hardirq ? 'h' : softirq ? 's' : '.');
2639
2640	if (pc)
2641		printf("%x", pc);
2642	else
2643		printf(".");
2644
2645	if (lock_depth < 0)
2646		printf(". ");
2647	else
2648		printf("%d ", lock_depth);
2649}
2650
2651#define TRACE_GRAPH_INDENT	2
2652
2653static struct record *
2654get_return_for_leaf(int cpu, int cur_pid, unsigned long long cur_func,
2655		    struct record *next)
2656{
2657	struct format_field *field;
2658	struct event *event;
2659	unsigned long val;
2660	int type;
2661	int pid;
2662
2663	type = trace_parse_common_type(next->data);
2664	event = trace_find_event(type);
2665	if (!event)
2666		return NULL;
2667
2668	if (!(event->flags & EVENT_FL_ISFUNCRET))
2669		return NULL;
2670
2671	pid = trace_parse_common_pid(next->data);
2672	field = find_field(event, "func");
2673	if (!field)
2674		die("function return does not have field func");
2675
2676	val = read_size(next->data + field->offset, field->size);
2677
2678	if (cur_pid != pid || cur_func != val)
2679		return NULL;
2680
2681	/* this is a leaf, now advance the iterator */
2682	return trace_read_data(cpu);
2683}
2684
2685/* Signal a overhead of time execution to the output */
2686static void print_graph_overhead(unsigned long long duration)
2687{
2688	/* Non nested entry or return */
2689	if (duration == ~0ULL)
2690		return (void)printf("  ");
2691
2692	/* Duration exceeded 100 msecs */
2693	if (duration > 100000ULL)
2694		return (void)printf("! ");
2695
2696	/* Duration exceeded 10 msecs */
2697	if (duration > 10000ULL)
2698		return (void)printf("+ ");
2699
2700	printf("  ");
2701}
2702
2703static void print_graph_duration(unsigned long long duration)
2704{
2705	unsigned long usecs = duration / 1000;
2706	unsigned long nsecs_rem = duration % 1000;
2707	/* log10(ULONG_MAX) + '\0' */
2708	char msecs_str[21];
2709	char nsecs_str[5];
2710	int len;
2711	int i;
2712
2713	sprintf(msecs_str, "%lu", usecs);
2714
2715	/* Print msecs */
2716	len = printf("%lu", usecs);
2717
2718	/* Print nsecs (we don't want to exceed 7 numbers) */
2719	if (len < 7) {
2720		snprintf(nsecs_str, 8 - len, "%03lu", nsecs_rem);
2721		len += printf(".%s", nsecs_str);
2722	}
2723
2724	printf(" us ");
2725
2726	/* Print remaining spaces to fit the row's width */
2727	for (i = len; i < 7; i++)
2728		printf(" ");
2729
2730	printf("|  ");
2731}
2732
2733static void
2734print_graph_entry_leaf(struct event *event, void *data, struct record *ret_rec)
2735{
2736	unsigned long long rettime, calltime;
2737	unsigned long long duration, depth;
2738	unsigned long long val;
2739	struct format_field *field;
2740	struct func_map *func;
2741	struct event *ret_event;
2742	int type;
2743	int i;
2744
2745	type = trace_parse_common_type(ret_rec->data);
2746	ret_event = trace_find_event(type);
2747
2748	field = find_field(ret_event, "rettime");
2749	if (!field)
2750		die("can't find rettime in return graph");
2751	rettime = read_size(ret_rec->data + field->offset, field->size);
2752
2753	field = find_field(ret_event, "calltime");
2754	if (!field)
2755		die("can't find rettime in return graph");
2756	calltime = read_size(ret_rec->data + field->offset, field->size);
2757
2758	duration = rettime - calltime;
2759
2760	/* Overhead */
2761	print_graph_overhead(duration);
2762
2763	/* Duration */
2764	print_graph_duration(duration);
2765
2766	field = find_field(event, "depth");
2767	if (!field)
2768		die("can't find depth in entry graph");
2769	depth = read_size(data + field->offset, field->size);
2770
2771	/* Function */
2772	for (i = 0; i < (int)(depth * TRACE_GRAPH_INDENT); i++)
2773		printf(" ");
2774
2775	field = find_field(event, "func");
2776	if (!field)
2777		die("can't find func in entry graph");
2778	val = read_size(data + field->offset, field->size);
2779	func = find_func(val);
2780
2781	if (func)
2782		printf("%s();", func->func);
2783	else
2784		printf("%llx();", val);
2785}
2786
2787static void print_graph_nested(struct event *event, void *data)
2788{
2789	struct format_field *field;
2790	unsigned long long depth;
2791	unsigned long long val;
2792	struct func_map *func;
2793	int i;
2794
2795	/* No overhead */
2796	print_graph_overhead(-1);
2797
2798	/* No time */
2799	printf("           |  ");
2800
2801	field = find_field(event, "depth");
2802	if (!field)
2803		die("can't find depth in entry graph");
2804	depth = read_size(data + field->offset, field->size);
2805
2806	/* Function */
2807	for (i = 0; i < (int)(depth * TRACE_GRAPH_INDENT); i++)
2808		printf(" ");
2809
2810	field = find_field(event, "func");
2811	if (!field)
2812		die("can't find func in entry graph");
2813	val = read_size(data + field->offset, field->size);
2814	func = find_func(val);
2815
2816	if (func)
2817		printf("%s() {", func->func);
2818	else
2819		printf("%llx() {", val);
2820}
2821
2822static void
2823pretty_print_func_ent(void *data, int size, struct event *event,
2824		      int cpu, int pid)
2825{
2826	struct format_field *field;
2827	struct record *rec;
2828	void *copy_data;
2829	unsigned long val;
2830
2831	if (latency_format) {
2832		print_lat_fmt(data, size);
2833		printf(" | ");
2834	}
2835
2836	field = find_field(event, "func");
2837	if (!field)
2838		die("function entry does not have func field");
2839
2840	val = read_size(data + field->offset, field->size);
2841
2842	/*
2843	 * peek_data may unmap the data pointer. Copy it first.
2844	 */
2845	copy_data = malloc_or_die(size);
2846	memcpy(copy_data, data, size);
2847	data = copy_data;
2848
2849	rec = trace_peek_data(cpu);
2850	if (rec) {
2851		rec = get_return_for_leaf(cpu, pid, val, rec);
2852		if (rec) {
2853			print_graph_entry_leaf(event, data, rec);
2854			goto out_free;
2855		}
2856	}
2857	print_graph_nested(event, data);
2858out_free:
2859	free(data);
2860}
2861
2862static void
2863pretty_print_func_ret(void *data, int size __unused, struct event *event)
2864{
2865	unsigned long long rettime, calltime;
2866	unsigned long long duration, depth;
2867	struct format_field *field;
2868	int i;
2869
2870	if (latency_format) {
2871		print_lat_fmt(data, size);
2872		printf(" | ");
2873	}
2874
2875	field = find_field(event, "rettime");
2876	if (!field)
2877		die("can't find rettime in return graph");
2878	rettime = read_size(data + field->offset, field->size);
2879
2880	field = find_field(event, "calltime");
2881	if (!field)
2882		die("can't find calltime in return graph");
2883	calltime = read_size(data + field->offset, field->size);
2884
2885	duration = rettime - calltime;
2886
2887	/* Overhead */
2888	print_graph_overhead(duration);
2889
2890	/* Duration */
2891	print_graph_duration(duration);
2892
2893	field = find_field(event, "depth");
2894	if (!field)
2895		die("can't find depth in entry graph");
2896	depth = read_size(data + field->offset, field->size);
2897
2898	/* Function */
2899	for (i = 0; i < (int)(depth * TRACE_GRAPH_INDENT); i++)
2900		printf(" ");
2901
2902	printf("}");
2903}
2904
2905static void
2906pretty_print_func_graph(void *data, int size, struct event *event,
2907			int cpu, int pid)
2908{
2909	if (event->flags & EVENT_FL_ISFUNCENT)
2910		pretty_print_func_ent(data, size, event, cpu, pid);
2911	else if (event->flags & EVENT_FL_ISFUNCRET)
2912		pretty_print_func_ret(data, size, event);
2913	printf("\n");
2914}
2915
2916void print_trace_event(int cpu, void *data, int size)
2917{
2918	struct event *event;
2919	int type;
2920	int pid;
2921
2922	type = trace_parse_common_type(data);
2923
2924	event = trace_find_event(type);
2925	if (!event) {
2926		warning("ug! no event found for type %d", type);
2927		return;
2928	}
2929
2930	pid = trace_parse_common_pid(data);
2931
2932	if (event->flags & (EVENT_FL_ISFUNCENT | EVENT_FL_ISFUNCRET))
2933		return pretty_print_func_graph(data, size, event, cpu, pid);
2934
2935	if (latency_format)
2936		print_lat_fmt(data, size);
2937
2938	if (event->flags & EVENT_FL_FAILED) {
2939		printf("EVENT '%s' FAILED TO PARSE\n",
2940		       event->name);
2941		return;
2942	}
2943
2944	pretty_print(data, size, event);
2945}
2946
2947static void print_fields(struct print_flag_sym *field)
2948{
2949	printf("{ %s, %s }", field->value, field->str);
2950	if (field->next) {
2951		printf(", ");
2952		print_fields(field->next);
2953	}
2954}
2955
2956static void print_args(struct print_arg *args)
2957{
2958	int print_paren = 1;
2959
2960	switch (args->type) {
2961	case PRINT_NULL:
2962		printf("null");
2963		break;
2964	case PRINT_ATOM:
2965		printf("%s", args->atom.atom);
2966		break;
2967	case PRINT_FIELD:
2968		printf("REC->%s", args->field.name);
2969		break;
2970	case PRINT_FLAGS:
2971		printf("__print_flags(");
2972		print_args(args->flags.field);
2973		printf(", %s, ", args->flags.delim);
2974		print_fields(args->flags.flags);
2975		printf(")");
2976		break;
2977	case PRINT_SYMBOL:
2978		printf("__print_symbolic(");
2979		print_args(args->symbol.field);
2980		printf(", ");
2981		print_fields(args->symbol.symbols);
2982		printf(")");
2983		break;
2984	case PRINT_STRING:
2985		printf("__get_str(%s)", args->string.string);
2986		break;
2987	case PRINT_TYPE:
2988		printf("(%s)", args->typecast.type);
2989		print_args(args->typecast.item);
2990		break;
2991	case PRINT_OP:
2992		if (strcmp(args->op.op, ":") == 0)
2993			print_paren = 0;
2994		if (print_paren)
2995			printf("(");
2996		print_args(args->op.left);
2997		printf(" %s ", args->op.op);
2998		print_args(args->op.right);
2999		if (print_paren)
3000			printf(")");
3001		break;
3002	default:
3003		/* we should warn... */
3004		return;
3005	}
3006	if (args->next) {
3007		printf("\n");
3008		print_args(args->next);
3009	}
3010}
3011
3012int parse_ftrace_file(char *buf, unsigned long size)
3013{
3014	struct format_field *field;
3015	struct print_arg *arg, **list;
3016	struct event *event;
3017	int ret;
3018
3019	init_input_buf(buf, size);
3020
3021	event = alloc_event();
3022	if (!event)
3023		return -ENOMEM;
3024
3025	event->flags |= EVENT_FL_ISFTRACE;
3026
3027	event->name = event_read_name();
3028	if (!event->name)
3029		die("failed to read ftrace event name");
3030
3031	if (strcmp(event->name, "function") == 0)
3032		event->flags |= EVENT_FL_ISFUNC;
3033
3034	else if (strcmp(event->name, "funcgraph_entry") == 0)
3035		event->flags |= EVENT_FL_ISFUNCENT;
3036
3037	else if (strcmp(event->name, "funcgraph_exit") == 0)
3038		event->flags |= EVENT_FL_ISFUNCRET;
3039
3040	else if (strcmp(event->name, "bprint") == 0)
3041		event->flags |= EVENT_FL_ISBPRINT;
3042
3043	event->id = event_read_id();
3044	if (event->id < 0)
3045		die("failed to read ftrace event id");
3046
3047	add_event(event);
3048
3049	ret = event_read_format(event);
3050	if (ret < 0)
3051		die("failed to read ftrace event format");
3052
3053	ret = event_read_print(event);
3054	if (ret < 0)
3055		die("failed to read ftrace event print fmt");
3056
3057	/* New ftrace handles args */
3058	if (ret > 0)
3059		return 0;
3060	/*
3061	 * The arguments for ftrace files are parsed by the fields.
3062	 * Set up the fields as their arguments.
3063	 */
3064	list = &event->print_fmt.args;
3065	for (field = event->format.fields; field; field = field->next) {
3066		arg = malloc_or_die(sizeof(*arg));
3067		memset(arg, 0, sizeof(*arg));
3068		*list = arg;
3069		list = &arg->next;
3070		arg->type = PRINT_FIELD;
3071		arg->field.name = field->name;
3072		arg->field.field = field;
3073	}
3074	return 0;
3075}
3076
3077int parse_event_file(char *buf, unsigned long size, char *sys)
3078{
3079	struct event *event;
3080	int ret;
3081
3082	init_input_buf(buf, size);
3083
3084	event = alloc_event();
3085	if (!event)
3086		return -ENOMEM;
3087
3088	event->name = event_read_name();
3089	if (!event->name)
3090		die("failed to read event name");
3091
3092	event->id = event_read_id();
3093	if (event->id < 0)
3094		die("failed to read event id");
3095
3096	ret = event_read_format(event);
3097	if (ret < 0) {
3098		warning("failed to read event format for %s", event->name);
3099		goto event_failed;
3100	}
3101
3102	ret = event_read_print(event);
3103	if (ret < 0) {
3104		warning("failed to read event print fmt for %s", event->name);
3105		goto event_failed;
3106	}
3107
3108	event->system = strdup(sys);
3109
3110#define PRINT_ARGS 0
3111	if (PRINT_ARGS && event->print_fmt.args)
3112		print_args(event->print_fmt.args);
3113
3114	add_event(event);
3115	return 0;
3116
3117 event_failed:
3118	event->flags |= EVENT_FL_FAILED;
3119	/* still add it even if it failed */
3120	add_event(event);
3121	return -1;
3122}
3123
3124void parse_set_info(int nr_cpus, int long_sz)
3125{
3126	cpus = nr_cpus;
3127	long_size = long_sz;
3128}
3129
3130int common_pc(struct scripting_context *context)
3131{
3132	return parse_common_pc(context->event_data);
3133}
3134
3135int common_flags(struct scripting_context *context)
3136{
3137	return parse_common_flags(context->event_data);
3138}
3139
3140int common_lock_depth(struct scripting_context *context)
3141{
3142	return parse_common_lock_depth(context->event_data);
3143}
v6.9.4
  1// SPDX-License-Identifier: GPL-2.0-only
  2/*
  3 * Copyright (C) 2009, Steven Rostedt <srostedt@redhat.com>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  4 */
 
  5#include <stdio.h>
  6#include <stdlib.h>
  7#include <string.h>
 
  8#include <errno.h>
  9
 10#include "debug.h"
 
 
 11#include "trace-event.h"
 12
 13#include <linux/ctype.h>
 14#include <linux/kernel.h>
 15#include <traceevent/event-parse.h>
 16
 17static int get_common_field(struct scripting_context *context,
 18			    int *offset, int *size, const char *type)
 19{
 20	struct tep_handle *pevent = context->pevent;
 21	struct tep_event *event;
 22	struct tep_format_field *field;
 
 
 
 
 
 
 
 
 
 23
 24	if (!*size) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 25
 26		event = tep_get_first_event(pevent);
 27		if (!event)
 28			return 0;
 
 
 
 
 
 
 
 29
 30		field = tep_find_common_field(event, type);
 31		if (!field)
 32			return 0;
 33		*offset = field->offset;
 34		*size = field->size;
 35	}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 36
 37	return tep_read_number(pevent, context->event_data + *offset, *size);
 
 
 38}
 39
 40int common_lock_depth(struct scripting_context *context)
 
 41{
 42	static int offset;
 43	static int size;
 44	int ret;
 45
 46	ret = get_common_field(context, &size, &offset,
 47			       "common_lock_depth");
 48	if (ret < 0)
 49		return -1;
 
 
 
 
 50
 51	return ret;
 52}
 53
 54int common_flags(struct scripting_context *context)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 55{
 56	static int offset;
 57	static int size;
 58	int ret;
 
 
 59
 60	ret = get_common_field(context, &size, &offset,
 61			       "common_flags");
 62	if (ret < 0)
 63		return -1;
 64
 65	return ret;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 66}
 67
 68int common_pc(struct scripting_context *context)
 69{
 70	static int offset;
 71	static int size;
 72	int ret;
 73
 74	ret = get_common_field(context, &size, &offset,
 75			       "common_preempt_count");
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 76	if (ret < 0)
 77		return -1;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 78
 79	return ret;
 
 
 80}
 81
 82unsigned long long
 83raw_field_value(struct tep_event *event, const char *name, void *data)
 
 84{
 85	struct tep_format_field *field;
 86	unsigned long long val;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 87
 88	field = tep_find_any_field(event, name);
 89	if (!field)
 90		return 0ULL;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 91
 92	tep_read_number_field(field, data, &val);
 
 
 
 
 93
 
 94	return val;
 95}
 96
 97unsigned long long read_size(struct tep_event *event, void *ptr, int size)
 98{
 99	return tep_read_number(event->tep, ptr, size);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
100}
101
102void event_format__fprintf(struct tep_event *event,
103			   int cpu, void *data, int size, FILE *fp)
104{
105	struct tep_record record;
106	struct trace_seq s;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
107
108	memset(&record, 0, sizeof(record));
109	record.cpu = cpu;
110	record.size = size;
111	record.data = data;
112
113	trace_seq_init(&s);
114	tep_print_event(event->tep, &s, &record, "%s", TEP_PRINT_INFO);
115	trace_seq_do_fprintf(&s, fp);
116	trace_seq_destroy(&s);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
117}
118
119void event_format__print(struct tep_event *event,
120			 int cpu, void *data, int size)
121{
122	return event_format__fprintf(event, cpu, data, size, stdout);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
123}
124
125/*
126 * prev_state is of size long, which is 32 bits on 32 bit architectures.
127 * As it needs to have the same bits for both 32 bit and 64 bit architectures
128 * we can just assume that the flags we care about will all be within
129 * the 32 bits.
130 */
131#define MAX_STATE_BITS 32
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
132
133static const char *convert_sym(struct tep_print_flag_sym *sym)
134{
135	static char save_states[MAX_STATE_BITS + 1];
 
 
 
 
 
 
 
 
 
 
136
137	memset(save_states, 0, sizeof(save_states));
 
138
139	/* This is the flags for the prev_state_field, now make them into a string */
140	for (; sym; sym = sym->next) {
141		long bitmask = strtoul(sym->value, NULL, 0);
142		int i;
143
144		for (i = 0; !(bitmask & 1); i++)
145			bitmask >>= 1;
 
 
 
 
 
 
 
 
 
 
 
146
147		if (i >= MAX_STATE_BITS)
 
 
 
148			continue;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
149
150		save_states[i] = sym->str[0];
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
151	}
152
153	return save_states;
 
 
 
 
 
 
 
 
 
 
 
 
 
154}
155
156static struct tep_print_arg_field *
157find_arg_field(struct tep_format_field *prev_state_field, struct tep_print_arg *arg)
158{
159	struct tep_print_arg_field *field;
 
 
 
 
 
 
 
 
 
160
161	if (!arg)
162		return NULL;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
163
164	if (arg->type == TEP_PRINT_FIELD)
165		return &arg->field;
 
 
 
166
167	if (arg->type == TEP_PRINT_OP) {
168		field = find_arg_field(prev_state_field, arg->op.left);
169		if (field && field->field == prev_state_field)
170			return field;
171		field = find_arg_field(prev_state_field, arg->op.right);
172		if (field && field->field == prev_state_field)
173			return field;
 
 
 
 
 
 
 
174	}
175	return NULL;
176}
177
178static struct tep_print_flag_sym *
179test_flags(struct tep_format_field *prev_state_field, struct tep_print_arg *arg)
180{
181	struct tep_print_arg_field *field;
182
183	field = find_arg_field(prev_state_field, arg->flags.field);
184	if (!field)
185		return NULL;
186
187	return arg->flags.flags;
188}
189
190static struct tep_print_flag_sym *
191search_op(struct tep_format_field *prev_state_field, struct tep_print_arg *arg)
192{
193	struct tep_print_flag_sym *sym = NULL;
194
195	if (!arg)
 
196		return NULL;
197
198	if (arg->type == TEP_PRINT_OP) {
199		sym = search_op(prev_state_field, arg->op.left);
200		if (sym)
201			return sym;
 
202
203		sym = search_op(prev_state_field, arg->op.right);
204		if (sym)
205			return sym;
206	} else if (arg->type == TEP_PRINT_FLAGS) {
207		sym = test_flags(prev_state_field, arg);
208	}
209
210	return sym;
211}
212
213const char *parse_task_states(struct tep_format_field *state_field)
214{
215	struct tep_print_flag_sym *sym;
216	struct tep_print_arg *arg;
217	struct tep_event *event;
218
219	event = state_field->event;
220
221	/*
222	 * Look at the event format fields, and search for where
223	 * the prev_state is parsed via the format flags.
224	 */
225	for (arg = event->print_fmt.args; arg; arg = arg->next) {
226		/*
227		 * Currently, the __print_flags() for the prev_state
228		 * is embedded in operations, so they too must be
229		 * searched.
230		 */
231		sym = search_op(state_field, arg);
232		if (sym)
233			return convert_sym(sym);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
234	}
235	return NULL;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
236}
237
238void parse_ftrace_printk(struct tep_handle *pevent,
239			 char *file, unsigned int size __maybe_unused)
240{
241	unsigned long long addr;
242	char *printk;
243	char *line;
244	char *next = NULL;
245	char *addr_str;
246	char *fmt = NULL;
 
 
247
248	line = strtok_r(file, "\n", &next);
249	while (line) {
250		addr_str = strtok_r(line, ":", &fmt);
251		if (!addr_str) {
252			pr_warning("printk format with empty entry");
253			break;
254		}
255		addr = strtoull(addr_str, NULL, 16);
256		/* fmt still has a space, skip it */
257		printk = strdup(fmt+1);
258		line = strtok_r(NULL, "\n", &next);
259		tep_register_print_string(pevent, printk, addr);
260		free(printk);
261	}
262}
263
264void parse_saved_cmdline(struct tep_handle *pevent,
265			 char *file, unsigned int size __maybe_unused)
266{
267	char comm[17]; /* Max comm length in the kernel is 16. */
268	char *line;
269	char *next = NULL;
270	int pid;
271
272	line = strtok_r(file, "\n", &next);
273	while (line) {
274		if (sscanf(line, "%d %16s", &pid, comm) == 2)
275			tep_register_comm(pevent, comm, pid);
276		line = strtok_r(NULL, "\n", &next);
277	}
 
278}
279
280int parse_ftrace_file(struct tep_handle *pevent, char *buf, unsigned long size)
281{
282	return tep_parse_event(pevent, buf, size, "ftrace");
 
 
 
283}
284
285int parse_event_file(struct tep_handle *pevent,
286		     char *buf, unsigned long size, char *sys)
287{
288	return tep_parse_event(pevent, buf, size, sys);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
289}
290
291struct flag {
292	const char *name;
293	unsigned long long value;
294};
295
296static const struct flag flags[] = {
297	{ "HI_SOFTIRQ", 0 },
298	{ "TIMER_SOFTIRQ", 1 },
299	{ "NET_TX_SOFTIRQ", 2 },
300	{ "NET_RX_SOFTIRQ", 3 },
301	{ "BLOCK_SOFTIRQ", 4 },
302	{ "IRQ_POLL_SOFTIRQ", 5 },
303	{ "TASKLET_SOFTIRQ", 6 },
304	{ "SCHED_SOFTIRQ", 7 },
305	{ "HRTIMER_SOFTIRQ", 8 },
306	{ "RCU_SOFTIRQ", 9 },
307
308	{ "HRTIMER_NORESTART", 0 },
309	{ "HRTIMER_RESTART", 1 },
310};
311
312unsigned long long eval_flag(const char *flag)
313{
314	int i;
315
316	/*
317	 * Some flags in the format files do not get converted.
318	 * If the flag is not numeric, see if it is something that
319	 * we already know about.
320	 */
321	if (isdigit(flag[0]))
322		return strtoull(flag, NULL, 0);
323
324	for (i = 0; i < (int)(ARRAY_SIZE(flags)); i++)
325		if (strcmp(flags[i].name, flag) == 0)
326			return flags[i].value;
327
328	return 0;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
329}