event-parse.h 24.5 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
/*
 * Copyright (C) 2009, 2010 Red Hat Inc, Steven Rostedt <srostedt@redhat.com>
 *
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation;
 * version 2.1 of the License (not later!)
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * 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 21 22
 *
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 */
#ifndef _PARSE_EVENTS_H
#define _PARSE_EVENTS_H

23
#include <stdbool.h>
24
#include <stdarg.h>
25
#include <stdio.h>
26
#include <regex.h>
27
#include <string.h>
28

29 30
#include "trace-seq.h"

31 32
#ifndef __maybe_unused
#define __maybe_unused __attribute__((unused))
33 34 35 36 37 38
#endif

#ifndef DEBUG_RECORD
#define DEBUG_RECORD 0
#endif

39
struct tep_record {
40 41 42 43 44 45 46 47 48
	unsigned long long	ts;
	unsigned long long	offset;
	long long		missed_events;	/* buffer dropped events before */
	int			record_size;	/* size of binary record */
	int			size;		/* size of data */
	void			*data;
	int			cpu;
	int			ref_count;
	int			locked;		/* Do not free, even if ref_count is zero */
49
	void			*priv;
50
#if DEBUG_RECORD
51 52
	struct tep_record	*prev;
	struct tep_record	*next;
53 54 55 56
	long			alloc_addr;
#endif
};

57
/* ----------------------- tep ----------------------- */
58

59
struct tep_handle;
60
struct tep_event_format;
61

62 63
typedef int (*tep_event_handler_func)(struct trace_seq *s,
				      struct tep_record *record,
64
				      struct tep_event_format *event,
65
				      void *context);
66

67 68
typedef int (*tep_plugin_load_func)(struct tep_handle *pevent);
typedef int (*tep_plugin_unload_func)(struct tep_handle *pevent);
69

70 71
struct tep_plugin_option {
	struct tep_plugin_option	*next;
72 73 74 75 76
	void				*handle;
	char				*file;
	char				*name;
	char				*plugin_alias;
	char				*description;
77
	const char			*value;
78
	void				*priv;
79 80 81 82 83 84
	int				set;
};

/*
 * Plugin hooks that can be called:
 *
85
 * TEP_PLUGIN_LOADER:  (required)
86 87
 *   The function name to initialized the plugin.
 *
88
 *   int TEP_PLUGIN_LOADER(struct tep_handle *pevent)
89
 *
90
 * TEP_PLUGIN_UNLOADER:  (optional)
91 92
 *   The function called just before unloading
 *
93
 *   int TEP_PLUGIN_UNLOADER(struct tep_handle *pevent)
94
 *
95
 * TEP_PLUGIN_OPTIONS:  (optional)
96 97
 *   Plugin options that can be set before loading
 *
98
 *   struct tep_plugin_option TEP_PLUGIN_OPTIONS[] = {
99 100
 *	{
 *		.name = "option-name",
101
 *		.plugin_alias = "override-file-name", (optional)
102 103 104 105 106 107 108 109 110 111 112 113 114
 *		.description = "description of option to show users",
 *	},
 *	{
 *		.name = NULL,
 *	},
 *   };
 *
 *   Array must end with .name = NULL;
 *
 *
 *   .plugin_alias is used to give a shorter name to access
 *   the vairable. Useful if a plugin handles more than one event.
 *
115 116 117 118
 *   If .value is not set, then it is considered a boolean and only
 *   .set will be processed. If .value is defined, then it is considered
 *   a string option and .set will be ignored.
 *
119
 * TEP_PLUGIN_ALIAS: (optional)
120 121
 *   The name to use for finding options (uses filename if not defined)
 */
122 123 124 125
#define TEP_PLUGIN_LOADER tep_plugin_loader
#define TEP_PLUGIN_UNLOADER tep_plugin_unloader
#define TEP_PLUGIN_OPTIONS tep_plugin_options
#define TEP_PLUGIN_ALIAS tep_plugin_alias
126 127
#define _MAKE_STR(x)	#x
#define MAKE_STR(x)	_MAKE_STR(x)
128 129 130 131
#define TEP_PLUGIN_LOADER_NAME MAKE_STR(TEP_PLUGIN_LOADER)
#define TEP_PLUGIN_UNLOADER_NAME MAKE_STR(TEP_PLUGIN_UNLOADER)
#define TEP_PLUGIN_OPTIONS_NAME MAKE_STR(TEP_PLUGIN_OPTIONS)
#define TEP_PLUGIN_ALIAS_NAME MAKE_STR(TEP_PLUGIN_ALIAS)
132 133 134 135 136 137 138 139

enum format_flags {
	FIELD_IS_ARRAY		= 1,
	FIELD_IS_POINTER	= 2,
	FIELD_IS_SIGNED		= 4,
	FIELD_IS_STRING		= 8,
	FIELD_IS_DYNAMIC	= 16,
	FIELD_IS_LONG		= 32,
140 141
	FIELD_IS_FLAG		= 64,
	FIELD_IS_SYMBOLIC	= 128,
142 143
};

144 145
struct tep_format_field {
	struct tep_format_field	*next;
146
	struct tep_event_format	*event;
147 148
	char			*type;
	char			*name;
149
	char			*alias;
150 151 152 153 154 155 156
	int			offset;
	int			size;
	unsigned int		arraylen;
	unsigned int		elementsize;
	unsigned long		flags;
};

157
struct tep_format {
158 159
	int			nr_common;
	int			nr_fields;
160 161
	struct tep_format_field	*common_fields;
	struct tep_format_field	*fields;
162 163 164 165 166 167 168 169 170 171 172
};

struct print_arg_atom {
	char			*atom;
};

struct print_arg_string {
	char			*string;
	int			offset;
};

173 174 175 176 177
struct print_arg_bitmask {
	char			*bitmask;
	int			offset;
};

178 179
struct print_arg_field {
	char			*name;
180
	struct tep_format_field	*field;
181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204
};

struct print_flag_sym {
	struct print_flag_sym	*next;
	char			*value;
	char			*str;
};

struct print_arg_typecast {
	char 			*type;
	struct print_arg	*item;
};

struct print_arg_flags {
	struct print_arg	*field;
	char			*delim;
	struct print_flag_sym	*flags;
};

struct print_arg_symbol {
	struct print_arg	*field;
	struct print_flag_sym	*symbols;
};

205 206 207 208 209
struct print_arg_hex {
	struct print_arg	*field;
	struct print_arg	*size;
};

210 211 212 213 214 215
struct print_arg_int_array {
	struct print_arg	*field;
	struct print_arg	*count;
	struct print_arg	*el_size;
};

216
struct print_arg_dynarray {
217
	struct tep_format_field	*field;
218 219 220 221 222 223 224 225 226 227 228 229
	struct print_arg	*index;
};

struct print_arg;

struct print_arg_op {
	char			*op;
	int			prio;
	struct print_arg	*left;
	struct print_arg	*right;
};

230
struct tep_function_handler;
231 232

struct print_arg_func {
233
	struct tep_function_handler	*func;
234 235 236 237 238 239 240 241 242
	struct print_arg		*args;
};

enum print_arg_type {
	PRINT_NULL,
	PRINT_ATOM,
	PRINT_FIELD,
	PRINT_FLAGS,
	PRINT_SYMBOL,
243
	PRINT_HEX,
244
	PRINT_INT_ARRAY,
245 246 247 248 249 250
	PRINT_TYPE,
	PRINT_STRING,
	PRINT_BSTRING,
	PRINT_DYNAMIC_ARRAY,
	PRINT_OP,
	PRINT_FUNC,
251
	PRINT_BITMASK,
252
	PRINT_DYNAMIC_ARRAY_LEN,
253
	PRINT_HEX_STR,
254 255 256 257 258 259 260 261 262 263 264
};

struct print_arg {
	struct print_arg		*next;
	enum print_arg_type		type;
	union {
		struct print_arg_atom		atom;
		struct print_arg_field		field;
		struct print_arg_typecast	typecast;
		struct print_arg_flags		flags;
		struct print_arg_symbol		symbol;
265
		struct print_arg_hex		hex;
266
		struct print_arg_int_array	int_array;
267 268
		struct print_arg_func		func;
		struct print_arg_string		string;
269
		struct print_arg_bitmask	bitmask;
270 271 272 273 274 275 276 277 278 279
		struct print_arg_op		op;
		struct print_arg_dynarray	dynarray;
	};
};

struct print_fmt {
	char			*format;
	struct print_arg	*args;
};

280
struct tep_event_format {
281
	struct tep_handle	*pevent;
282 283 284
	char			*name;
	int			id;
	int			flags;
285
	struct tep_format	format;
286 287
	struct print_fmt	print_fmt;
	char			*system;
288
	tep_event_handler_func	handler;
289 290 291 292 293 294 295 296 297
	void			*context;
};

enum {
	EVENT_FL_ISFTRACE	= 0x01,
	EVENT_FL_ISPRINT	= 0x02,
	EVENT_FL_ISBPRINT	= 0x04,
	EVENT_FL_ISFUNCENT	= 0x10,
	EVENT_FL_ISFUNCRET	= 0x20,
298 299
	EVENT_FL_NOHANDLE	= 0x40,
	EVENT_FL_PRINTRAW	= 0x80,
300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321

	EVENT_FL_FAILED		= 0x80000000
};

enum event_sort_type {
	EVENT_SORT_ID,
	EVENT_SORT_NAME,
	EVENT_SORT_SYSTEM,
};

enum event_type {
	EVENT_ERROR,
	EVENT_NONE,
	EVENT_SPACE,
	EVENT_NEWLINE,
	EVENT_OP,
	EVENT_DELIM,
	EVENT_ITEM,
	EVENT_DQUOTE,
	EVENT_SQUOTE,
};

322 323
typedef unsigned long long (*tep_func_handler)(struct trace_seq *s,
					       unsigned long long *args);
324

325 326 327 328 329 330 331
enum tep_func_arg_type {
	TEP_FUNC_ARG_VOID,
	TEP_FUNC_ARG_INT,
	TEP_FUNC_ARG_LONG,
	TEP_FUNC_ARG_STRING,
	TEP_FUNC_ARG_PTR,
	TEP_FUNC_ARG_MAX_TYPES
332 333
};

334 335 336 337
enum tep_flag {
	TEP_NSEC_OUTPUT		= 1,	/* output in NSECS */
	TEP_DISABLE_SYS_PLUGINS	= 1 << 1,
	TEP_DISABLE_PLUGINS	= 1 << 2,
338 339
};

340
#define TEP_ERRORS 							      \
341 342 343 344 345
	_PE(MEM_ALLOC_FAILED,	"failed to allocate memory"),		      \
	_PE(PARSE_EVENT_FAILED,	"failed to parse event"),		      \
	_PE(READ_ID_FAILED,	"failed to read event id"),		      \
	_PE(READ_FORMAT_FAILED,	"failed to read event format"),		      \
	_PE(READ_PRINT_FAILED,	"failed to read event print fmt"), 	      \
346
	_PE(OLD_FTRACE_ARG_FAILED,"failed to allocate field name for ftrace"),\
347
	_PE(INVALID_ARG_TYPE,	"invalid argument type"),		      \
348 349
	_PE(INVALID_EXP_TYPE,	"invalid expression type"),		      \
	_PE(INVALID_OP_TYPE,	"invalid operator type"),		      \
350
	_PE(INVALID_EVENT_NAME,	"invalid event name"),			      \
351 352 353 354 355 356
	_PE(EVENT_NOT_FOUND,	"no event found"),			      \
	_PE(SYNTAX_ERROR,	"syntax error"),			      \
	_PE(ILLEGAL_RVALUE,	"illegal rvalue"),			      \
	_PE(ILLEGAL_LVALUE,	"illegal lvalue for string comparison"),      \
	_PE(INVALID_REGEX,	"regex did not compute"),		      \
	_PE(ILLEGAL_STRING_CMP,	"illegal comparison for string"), 	      \
357 358 359
	_PE(ILLEGAL_INTEGER_CMP,"illegal comparison for integer"), 	      \
	_PE(REPARENT_NOT_OP,	"cannot reparent other than OP"),	      \
	_PE(REPARENT_FAILED,	"failed to reparent filter OP"),	      \
360
	_PE(BAD_FILTER_ARG,	"bad arg in filter tree"),		      \
361 362 363 364
	_PE(UNEXPECTED_TYPE,	"unexpected type (not a value)"),	      \
	_PE(ILLEGAL_TOKEN,	"illegal token"),			      \
	_PE(INVALID_PAREN,	"open parenthesis cannot come here"), 	      \
	_PE(UNBALANCED_PAREN,	"unbalanced number of parenthesis"),	      \
365
	_PE(UNKNOWN_TOKEN,	"unknown token"),			      \
366 367 368 369
	_PE(FILTER_NOT_FOUND,	"no filter found"),			      \
	_PE(NOT_A_NUMBER,	"must have number field"),		      \
	_PE(NO_FILTER,		"no filters exists"),			      \
	_PE(FILTER_MISS,	"record does not match to filter")
370 371

#undef _PE
372 373 374 375
#define _PE(__code, __str) TEP_ERRNO__ ## __code
enum tep_errno {
	TEP_ERRNO__SUCCESS			= 0,
	TEP_ERRNO__FILTER_MATCH			= TEP_ERRNO__SUCCESS,
376 377 378 379 380 381 382 383

	/*
	 * Choose an arbitrary negative big number not to clash with standard
	 * errno since SUS requires the errno has distinct positive values.
	 * See 'Issue 6' in the link below.
	 *
	 * http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/errno.h.html
	 */
384
	__TEP_ERRNO__START			= -100000,
385

386
	TEP_ERRORS,
387

388
	__TEP_ERRNO__END,
389
};
390
#undef _PE
391

392 393
struct plugin_list;

394 395
#define INVALID_PLUGIN_LIST_OPTION	((char **)((unsigned long)-1))

396 397 398
struct plugin_list *tep_load_plugins(struct tep_handle *pevent);
void tep_unload_plugins(struct plugin_list *plugin_list,
			struct tep_handle *pevent);
399 400 401 402 403 404 405 406
char **tep_plugin_list_options(void);
void tep_plugin_free_options_list(char **list);
int tep_plugin_add_options(const char *name,
			   struct tep_plugin_option *options);
void tep_plugin_remove_options(struct tep_plugin_option *options);
void tep_print_plugins(struct trace_seq *s,
			const char *prefix, const char *suffix,
			const struct plugin_list *list);
407

408 409 410 411 412
struct cmdline;
struct cmdline_list;
struct func_map;
struct func_list;
struct event_handler;
413 414
struct func_resolver;

415 416
typedef char *(tep_func_resolver_t)(void *priv,
				    unsigned long long *addrp, char **modp);
417

418
struct tep_handle {
419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437
	int ref_count;

	int header_page_ts_offset;
	int header_page_ts_size;
	int header_page_size_offset;
	int header_page_size_size;
	int header_page_data_offset;
	int header_page_data_size;
	int header_page_overwrite;

	int file_bigendian;
	int host_bigendian;

	int latency_format;

	int old_format;

	int cpus;
	int long_size;
438
	int page_size;
439 440 441 442 443 444

	struct cmdline *cmdlines;
	struct cmdline_list *cmdlist;
	int cmdline_count;

	struct func_map *func_map;
445
	struct func_resolver *func_resolver;
446 447 448 449 450 451 452
	struct func_list *funclist;
	unsigned int func_count;

	struct printk_map *printk_map;
	struct printk_list *printklist;
	unsigned int printk_count;

453

454
	struct tep_event_format **events;
455
	int nr_events;
456
	struct tep_event_format **sort_events;
457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477
	enum event_sort_type last_type;

	int type_offset;
	int type_size;

	int pid_offset;
	int pid_size;

 	int pc_offset;
	int pc_size;

	int flags_offset;
	int flags_size;

	int ld_offset;
	int ld_size;

	int print_raw;

	int test_filters;

478 479
	int flags;

480 481 482
	struct tep_format_field *bprint_ip_field;
	struct tep_format_field *bprint_fmt_field;
	struct tep_format_field *bprint_buf_field;
483 484

	struct event_handler *handlers;
485
	struct tep_function_handler *func_handlers;
486 487

	/* cache */
488
	struct tep_event_format *last_event;
489 490

	char *trace_clock;
491 492
};

493
static inline void tep_set_flag(struct tep_handle *pevent, int flag)
494 495 496 497
{
	pevent->flags |= flag;
}

498
static inline unsigned short
499
__data2host2(struct tep_handle *pevent, unsigned short data)
500 501 502 503 504 505 506 507 508 509 510 511 512
{
	unsigned short swap;

	if (pevent->host_bigendian == pevent->file_bigendian)
		return data;

	swap = ((data & 0xffULL) << 8) |
		((data & (0xffULL << 8)) >> 8);

	return swap;
}

static inline unsigned int
513
__data2host4(struct tep_handle *pevent, unsigned int data)
514 515 516 517 518 519 520 521 522 523 524 525 526 527 528
{
	unsigned int swap;

	if (pevent->host_bigendian == pevent->file_bigendian)
		return data;

	swap = ((data & 0xffULL) << 24) |
		((data & (0xffULL << 8)) << 8) |
		((data & (0xffULL << 16)) >> 8) |
		((data & (0xffULL << 24)) >> 24);

	return swap;
}

static inline unsigned long long
529
__data2host8(struct tep_handle *pevent, unsigned long long data)
530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557
{
	unsigned long long swap;

	if (pevent->host_bigendian == pevent->file_bigendian)
		return data;

	swap = ((data & 0xffULL) << 56) |
		((data & (0xffULL << 8)) << 40) |
		((data & (0xffULL << 16)) << 24) |
		((data & (0xffULL << 24)) << 8) |
		((data & (0xffULL << 32)) >> 8) |
		((data & (0xffULL << 40)) >> 24) |
		((data & (0xffULL << 48)) >> 40) |
		((data & (0xffULL << 56)) >> 56);

	return swap;
}

#define data2host2(pevent, ptr)		__data2host2(pevent, *(unsigned short *)(ptr))
#define data2host4(pevent, ptr)		__data2host4(pevent, *(unsigned int *)(ptr))
#define data2host8(pevent, ptr)					\
({								\
	unsigned long long __val;				\
								\
	memcpy(&__val, (ptr), sizeof(unsigned long long));	\
	__data2host8(pevent, __val);				\
})

558
static inline int tep_host_bigendian(void)
559 560 561 562 563 564 565 566
{
	unsigned char str[] = { 0x1, 0x2, 0x3, 0x4 };
	unsigned int val;

	memcpy(&val, str, 4);
	return val == 0x01020304;
}

567 568 569 570 571 572 573 574 575
/* taken from kernel/trace/trace.h */
enum trace_flag_type {
	TRACE_FLAG_IRQS_OFF		= 0x01,
	TRACE_FLAG_IRQS_NOSUPPORT	= 0x02,
	TRACE_FLAG_NEED_RESCHED		= 0x04,
	TRACE_FLAG_HARDIRQ		= 0x08,
	TRACE_FLAG_SOFTIRQ		= 0x10,
};

576 577
int tep_set_function_resolver(struct tep_handle *pevent,
			      tep_func_resolver_t *func, void *priv);
578
void tep_reset_function_resolver(struct tep_handle *pevent);
579
int tep_register_comm(struct tep_handle *pevent, const char *comm, int pid);
580 581 582
int tep_register_trace_clock(struct tep_handle *pevent, const char *trace_clock);
int tep_register_function(struct tep_handle *pevent, char *name,
			  unsigned long long addr, char *mod);
583 584
int tep_register_print_string(struct tep_handle *pevent, const char *fmt,
			      unsigned long long addr);
585
int tep_pid_is_registered(struct tep_handle *pevent, int pid);
586

587
void tep_print_event_task(struct tep_handle *pevent, struct trace_seq *s,
588
			  struct tep_event_format *event,
589 590
			  struct tep_record *record);
void tep_print_event_time(struct tep_handle *pevent, struct trace_seq *s,
591
			  struct tep_event_format *event,
592 593 594
			  struct tep_record *record,
			  bool use_trace_clock);
void tep_print_event_data(struct tep_handle *pevent, struct trace_seq *s,
595
			  struct tep_event_format *event,
596 597 598
			  struct tep_record *record);
void tep_print_event(struct tep_handle *pevent, struct trace_seq *s,
		     struct tep_record *record, bool use_trace_clock);
599

600 601 602
int tep_parse_header_page(struct tep_handle *pevent, char *buf, unsigned long size,
			  int long_size);

603 604 605
enum tep_errno tep_parse_event(struct tep_handle *pevent, const char *buf,
			       unsigned long size, const char *sys);
enum tep_errno tep_parse_format(struct tep_handle *pevent,
606
				struct tep_event_format **eventp,
607 608
				const char *buf,
				unsigned long size, const char *sys);
609
void tep_free_format(struct tep_event_format *event);
610
void tep_free_format_field(struct tep_format_field *field);
611

612
void *tep_get_field_raw(struct trace_seq *s, struct tep_event_format *event,
613 614 615
			const char *name, struct tep_record *record,
			int *len, int err);

616
int tep_get_field_val(struct trace_seq *s, struct tep_event_format *event,
617 618
		      const char *name, struct tep_record *record,
		      unsigned long long *val, int err);
619
int tep_get_common_field_val(struct trace_seq *s, struct tep_event_format *event,
620
			     const char *name, struct tep_record *record,
621
			     unsigned long long *val, int err);
622
int tep_get_any_field_val(struct trace_seq *s, struct tep_event_format *event,
623 624
			  const char *name, struct tep_record *record,
			  unsigned long long *val, int err);
625

626
int tep_print_num_field(struct trace_seq *s, const char *fmt,
627 628
			struct tep_event_format *event, const char *name,
			struct tep_record *record, int err);
629

630
int tep_print_func_field(struct trace_seq *s, const char *fmt,
631
			 struct tep_event_format *event, const char *name,
632
			 struct tep_record *record, int err);
633

634 635 636 637 638 639 640 641 642 643 644 645
int tep_register_event_handler(struct tep_handle *pevent, int id,
			       const char *sys_name, const char *event_name,
			       tep_event_handler_func func, void *context);
int tep_unregister_event_handler(struct tep_handle *pevent, int id,
				 const char *sys_name, const char *event_name,
				 tep_event_handler_func func, void *context);
int tep_register_print_function(struct tep_handle *pevent,
				tep_func_handler func,
				enum tep_func_arg_type ret_type,
				char *name, ...);
int tep_unregister_print_function(struct tep_handle *pevent,
				  tep_func_handler func, char *name);
646

647 648 649
struct tep_format_field *tep_find_common_field(struct tep_event_format *event, const char *name);
struct tep_format_field *tep_find_field(struct tep_event_format *event, const char *name);
struct tep_format_field *tep_find_any_field(struct tep_event_format *event, const char *name);
650

651
const char *tep_find_function(struct tep_handle *pevent, unsigned long long addr);
652
unsigned long long
653
tep_find_function_address(struct tep_handle *pevent, unsigned long long addr);
654
unsigned long long tep_read_number(struct tep_handle *pevent, const void *ptr, int size);
655
int tep_read_number_field(struct tep_format_field *field, const void *data,
656
			  unsigned long long *value);
657

658
struct tep_event_format *tep_find_event(struct tep_handle *pevent, int id);
659

660
struct tep_event_format *
661
tep_find_event_by_name(struct tep_handle *pevent, const char *sys, const char *name);
662

663
struct tep_event_format *
664
tep_find_event_by_record(struct tep_handle *pevent, struct tep_record *record);
665

666 667 668
void tep_data_lat_fmt(struct tep_handle *pevent,
		      struct trace_seq *s, struct tep_record *record);
int tep_data_type(struct tep_handle *pevent, struct tep_record *rec);
669
struct tep_event_format *tep_data_event_from_type(struct tep_handle *pevent, int type);
670 671 672 673
int tep_data_pid(struct tep_handle *pevent, struct tep_record *rec);
int tep_data_preempt_count(struct tep_handle *pevent, struct tep_record *rec);
int tep_data_flags(struct tep_handle *pevent, struct tep_record *rec);
const char *tep_data_comm_from_pid(struct tep_handle *pevent, int pid);
674
struct cmdline;
675 676 677
struct cmdline *tep_data_pid_from_comm(struct tep_handle *pevent, const char *comm,
				       struct cmdline *next);
int tep_cmdline_pid(struct tep_handle *pevent, struct cmdline *cmdline);
678

679
void tep_print_field(struct trace_seq *s, void *data,
680
		     struct tep_format_field *field);
681
void tep_print_fields(struct trace_seq *s, void *data,
682 683
		      int size __maybe_unused, struct tep_event_format *event);
void tep_event_info(struct trace_seq *s, struct tep_event_format *event,
684
		       struct tep_record *record);
685
int tep_strerror(struct tep_handle *pevent, enum tep_errno errnum,
686
		    char *buf, size_t buflen);
687

688
struct tep_event_format **tep_list_events(struct tep_handle *pevent, enum event_sort_type);
689 690
struct tep_format_field **tep_event_common_fields(struct tep_event_format *event);
struct tep_format_field **tep_event_fields(struct tep_event_format *event);
691

692
static inline int tep_get_cpus(struct tep_handle *pevent)
693 694 695 696
{
	return pevent->cpus;
}

697
static inline void tep_set_cpus(struct tep_handle *pevent, int cpus)
698 699 700 701
{
	pevent->cpus = cpus;
}

702
static inline int tep_get_long_size(struct tep_handle *pevent)
703 704 705 706
{
	return pevent->long_size;
}

707
static inline void tep_set_long_size(struct tep_handle *pevent, int long_size)
708 709 710 711
{
	pevent->long_size = long_size;
}

712
static inline int tep_get_page_size(struct tep_handle *pevent)
713 714 715 716
{
	return pevent->page_size;
}

717
static inline void tep_set_page_size(struct tep_handle *pevent, int _page_size)
718 719 720 721
{
	pevent->page_size = _page_size;
}

722
static inline int tep_is_file_bigendian(struct tep_handle *pevent)
723 724 725 726
{
	return pevent->file_bigendian;
}

727
static inline void tep_set_file_bigendian(struct tep_handle *pevent, int endian)
728 729 730 731
{
	pevent->file_bigendian = endian;
}

732
static inline int tep_is_host_bigendian(struct tep_handle *pevent)
733 734 735 736
{
	return pevent->host_bigendian;
}

737
static inline void tep_set_host_bigendian(struct tep_handle *pevent, int endian)
738 739 740 741
{
	pevent->host_bigendian = endian;
}

742
static inline int tep_is_latency_format(struct tep_handle *pevent)
743 744 745 746
{
	return pevent->latency_format;
}

747
static inline void tep_set_latency_format(struct tep_handle *pevent, int lat)
748 749 750 751
{
	pevent->latency_format = lat;
}

752 753
struct tep_handle *tep_alloc(void);
void tep_free(struct tep_handle *pevent);
754 755
void tep_ref(struct tep_handle *pevent);
void tep_unref(struct tep_handle *pevent);
756 757

/* access to the internal parser */
758 759 760 761 762 763
void tep_buffer_init(const char *buf, unsigned long long size);
enum event_type tep_read_token(char **tok);
void tep_free_token(char *token);
int tep_peek_char(void);
const char *tep_get_input_buf(void);
unsigned long long tep_get_input_buf_ptr(void);
764 765

/* for debugging */
766 767
void tep_print_funcs(struct tep_handle *pevent);
void tep_print_printk(struct tep_handle *pevent);
768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834

/* ----------------------- filtering ----------------------- */

enum filter_boolean_type {
	FILTER_FALSE,
	FILTER_TRUE,
};

enum filter_op_type {
	FILTER_OP_AND = 1,
	FILTER_OP_OR,
	FILTER_OP_NOT,
};

enum filter_cmp_type {
	FILTER_CMP_NONE,
	FILTER_CMP_EQ,
	FILTER_CMP_NE,
	FILTER_CMP_GT,
	FILTER_CMP_LT,
	FILTER_CMP_GE,
	FILTER_CMP_LE,
	FILTER_CMP_MATCH,
	FILTER_CMP_NOT_MATCH,
	FILTER_CMP_REGEX,
	FILTER_CMP_NOT_REGEX,
};

enum filter_exp_type {
	FILTER_EXP_NONE,
	FILTER_EXP_ADD,
	FILTER_EXP_SUB,
	FILTER_EXP_MUL,
	FILTER_EXP_DIV,
	FILTER_EXP_MOD,
	FILTER_EXP_RSHIFT,
	FILTER_EXP_LSHIFT,
	FILTER_EXP_AND,
	FILTER_EXP_OR,
	FILTER_EXP_XOR,
	FILTER_EXP_NOT,
};

enum filter_arg_type {
	FILTER_ARG_NONE,
	FILTER_ARG_BOOLEAN,
	FILTER_ARG_VALUE,
	FILTER_ARG_FIELD,
	FILTER_ARG_EXP,
	FILTER_ARG_OP,
	FILTER_ARG_NUM,
	FILTER_ARG_STR,
};

enum filter_value_type {
	FILTER_NUMBER,
	FILTER_STRING,
	FILTER_CHAR
};

struct fliter_arg;

struct filter_arg_boolean {
	enum filter_boolean_type	value;
};

struct filter_arg_field {
835
	struct tep_format_field	*field;
836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865
};

struct filter_arg_value {
	enum filter_value_type	type;
	union {
		char			*str;
		unsigned long long	val;
	};
};

struct filter_arg_op {
	enum filter_op_type	type;
	struct filter_arg	*left;
	struct filter_arg	*right;
};

struct filter_arg_exp {
	enum filter_exp_type	type;
	struct filter_arg	*left;
	struct filter_arg	*right;
};

struct filter_arg_num {
	enum filter_cmp_type	type;
	struct filter_arg	*left;
	struct filter_arg	*right;
};

struct filter_arg_str {
	enum filter_cmp_type	type;
866
	struct tep_format_field	*field;
867 868 869 870 871 872 873 874
	char			*val;
	char			*buffer;
	regex_t			reg;
};

struct filter_arg {
	enum filter_arg_type	type;
	union {
875
		struct filter_arg_boolean	boolean;
876 877 878 879 880 881 882 883 884 885 886
		struct filter_arg_field		field;
		struct filter_arg_value		value;
		struct filter_arg_op		op;
		struct filter_arg_exp		exp;
		struct filter_arg_num		num;
		struct filter_arg_str		str;
	};
};

struct filter_type {
	int			event_id;
887
	struct tep_event_format	*event;
888 889 890
	struct filter_arg	*filter;
};

891
#define TEP_FILTER_ERROR_BUFSZ  1024
892

893
struct event_filter {
894
	struct tep_handle	*pevent;
895 896
	int			filters;
	struct filter_type	*event_filters;
897
	char			error_buffer[TEP_FILTER_ERROR_BUFSZ];
898 899
};

900
struct event_filter *tep_filter_alloc(struct tep_handle *pevent);
901

902
/* for backward compatibility */
903 904 905 906
#define FILTER_NONE		TEP_ERRNO__NO_FILTER
#define FILTER_NOEXIST		TEP_ERRNO__FILTER_NOT_FOUND
#define FILTER_MISS		TEP_ERRNO__FILTER_MISS
#define FILTER_MATCH		TEP_ERRNO__FILTER_MATCH
907 908 909 910 911 912 913

enum filter_trivial_type {
	FILTER_TRIVIAL_FALSE,
	FILTER_TRIVIAL_TRUE,
	FILTER_TRIVIAL_BOTH,
};

914 915
enum tep_errno tep_filter_add_filter_str(struct event_filter *filter,
					 const char *filter_str);
916

917 918
enum tep_errno tep_filter_match(struct event_filter *filter,
				struct tep_record *record);
919

920 921
int tep_filter_strerror(struct event_filter *filter, enum tep_errno err,
			char *buf, size_t buflen);
922

923 924
int tep_event_filtered(struct event_filter *filter,
		       int event_id);
925

926
void tep_filter_reset(struct event_filter *filter);
927

928 929
int tep_filter_clear_trivial(struct event_filter *filter,
			     enum filter_trivial_type type);
930

931
void tep_filter_free(struct event_filter *filter);
932

933
char *tep_filter_make_string(struct event_filter *filter, int event_id);
934

935 936
int tep_filter_remove_event(struct event_filter *filter,
			    int event_id);
937

938 939 940
int tep_filter_event_has_trivial(struct event_filter *filter,
				 int event_id,
				 enum filter_trivial_type type);
941

942
int tep_filter_copy(struct event_filter *dest, struct event_filter *source);
943

944 945
int tep_update_trivial(struct event_filter *dest, struct event_filter *source,
			enum filter_trivial_type type);
946

947
int tep_filter_compare(struct event_filter *filter1, struct event_filter *filter2);
948 949

#endif /* _PARSE_EVENTS_H */