1 /*
2  * Copyright (C) 2009, 2010 Red Hat Inc, Steven Rostedt <srostedt@redhat.com>
3  *
4  * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation;
8  * version 2.1 of the License (not later!)
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public
16  * License along with this program; if not,  see <http://www.gnu.org/licenses>
17  *
18  * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
19  */
20 #ifndef _PARSE_EVENTS_H
21 #define _PARSE_EVENTS_H
22 
23 #include <stdbool.h>
24 #include <stdarg.h>
25 #include <stdio.h>
26 #include <regex.h>
27 #include <string.h>
28 
29 #include "trace-seq.h"
30 
31 #ifndef __maybe_unused
32 #define __maybe_unused __attribute__((unused))
33 #endif
34 
35 #ifndef DEBUG_RECORD
36 #define DEBUG_RECORD 0
37 #endif
38 
39 struct tep_record {
40 	unsigned long long	ts;
41 	unsigned long long	offset;
42 	long long		missed_events;	/* buffer dropped events before */
43 	int			record_size;	/* size of binary record */
44 	int			size;		/* size of data */
45 	void			*data;
46 	int			cpu;
47 	int			ref_count;
48 	int			locked;		/* Do not free, even if ref_count is zero */
49 	void			*priv;
50 #if DEBUG_RECORD
51 	struct tep_record	*prev;
52 	struct tep_record	*next;
53 	long			alloc_addr;
54 #endif
55 };
56 
57 /* ----------------------- tep ----------------------- */
58 
59 struct tep_handle;
60 struct tep_event;
61 
62 typedef int (*tep_event_handler_func)(struct trace_seq *s,
63 				      struct tep_record *record,
64 				      struct tep_event *event,
65 				      void *context);
66 
67 typedef int (*tep_plugin_load_func)(struct tep_handle *tep);
68 typedef int (*tep_plugin_unload_func)(struct tep_handle *tep);
69 
70 struct tep_plugin_option {
71 	struct tep_plugin_option	*next;
72 	void				*handle;
73 	char				*file;
74 	char				*name;
75 	char				*plugin_alias;
76 	char				*description;
77 	const char			*value;
78 	void				*priv;
79 	int				set;
80 };
81 
82 /*
83  * Plugin hooks that can be called:
84  *
85  * TEP_PLUGIN_LOADER:  (required)
86  *   The function name to initialized the plugin.
87  *
88  *   int TEP_PLUGIN_LOADER(struct tep_handle *tep)
89  *
90  * TEP_PLUGIN_UNLOADER:  (optional)
91  *   The function called just before unloading
92  *
93  *   int TEP_PLUGIN_UNLOADER(struct tep_handle *tep)
94  *
95  * TEP_PLUGIN_OPTIONS:  (optional)
96  *   Plugin options that can be set before loading
97  *
98  *   struct tep_plugin_option TEP_PLUGIN_OPTIONS[] = {
99  *	{
100  *		.name = "option-name",
101  *		.plugin_alias = "override-file-name", (optional)
102  *		.description = "description of option to show users",
103  *	},
104  *	{
105  *		.name = NULL,
106  *	},
107  *   };
108  *
109  *   Array must end with .name = NULL;
110  *
111  *
112  *   .plugin_alias is used to give a shorter name to access
113  *   the vairable. Useful if a plugin handles more than one event.
114  *
115  *   If .value is not set, then it is considered a boolean and only
116  *   .set will be processed. If .value is defined, then it is considered
117  *   a string option and .set will be ignored.
118  *
119  * TEP_PLUGIN_ALIAS: (optional)
120  *   The name to use for finding options (uses filename if not defined)
121  */
122 #define TEP_PLUGIN_LOADER tep_plugin_loader
123 #define TEP_PLUGIN_UNLOADER tep_plugin_unloader
124 #define TEP_PLUGIN_OPTIONS tep_plugin_options
125 #define TEP_PLUGIN_ALIAS tep_plugin_alias
126 #define _MAKE_STR(x)	#x
127 #define MAKE_STR(x)	_MAKE_STR(x)
128 #define TEP_PLUGIN_LOADER_NAME MAKE_STR(TEP_PLUGIN_LOADER)
129 #define TEP_PLUGIN_UNLOADER_NAME MAKE_STR(TEP_PLUGIN_UNLOADER)
130 #define TEP_PLUGIN_OPTIONS_NAME MAKE_STR(TEP_PLUGIN_OPTIONS)
131 #define TEP_PLUGIN_ALIAS_NAME MAKE_STR(TEP_PLUGIN_ALIAS)
132 
133 enum tep_format_flags {
134 	TEP_FIELD_IS_ARRAY	= 1,
135 	TEP_FIELD_IS_POINTER	= 2,
136 	TEP_FIELD_IS_SIGNED	= 4,
137 	TEP_FIELD_IS_STRING	= 8,
138 	TEP_FIELD_IS_DYNAMIC	= 16,
139 	TEP_FIELD_IS_LONG	= 32,
140 	TEP_FIELD_IS_FLAG	= 64,
141 	TEP_FIELD_IS_SYMBOLIC	= 128,
142 };
143 
144 struct tep_format_field {
145 	struct tep_format_field	*next;
146 	struct tep_event	*event;
147 	char			*type;
148 	char			*name;
149 	char			*alias;
150 	int			offset;
151 	int			size;
152 	unsigned int		arraylen;
153 	unsigned int		elementsize;
154 	unsigned long		flags;
155 };
156 
157 struct tep_format {
158 	int			nr_common;
159 	int			nr_fields;
160 	struct tep_format_field	*common_fields;
161 	struct tep_format_field	*fields;
162 };
163 
164 struct tep_print_arg_atom {
165 	char			*atom;
166 };
167 
168 struct tep_print_arg_string {
169 	char			*string;
170 	int			offset;
171 };
172 
173 struct tep_print_arg_bitmask {
174 	char			*bitmask;
175 	int			offset;
176 };
177 
178 struct tep_print_arg_field {
179 	char			*name;
180 	struct tep_format_field	*field;
181 };
182 
183 struct tep_print_flag_sym {
184 	struct tep_print_flag_sym	*next;
185 	char				*value;
186 	char				*str;
187 };
188 
189 struct tep_print_arg_typecast {
190 	char 			*type;
191 	struct tep_print_arg	*item;
192 };
193 
194 struct tep_print_arg_flags {
195 	struct tep_print_arg		*field;
196 	char				*delim;
197 	struct tep_print_flag_sym	*flags;
198 };
199 
200 struct tep_print_arg_symbol {
201 	struct tep_print_arg		*field;
202 	struct tep_print_flag_sym	*symbols;
203 };
204 
205 struct tep_print_arg_hex {
206 	struct tep_print_arg	*field;
207 	struct tep_print_arg	*size;
208 };
209 
210 struct tep_print_arg_int_array {
211 	struct tep_print_arg	*field;
212 	struct tep_print_arg	*count;
213 	struct tep_print_arg	*el_size;
214 };
215 
216 struct tep_print_arg_dynarray {
217 	struct tep_format_field	*field;
218 	struct tep_print_arg	*index;
219 };
220 
221 struct tep_print_arg;
222 
223 struct tep_print_arg_op {
224 	char			*op;
225 	int			prio;
226 	struct tep_print_arg	*left;
227 	struct tep_print_arg	*right;
228 };
229 
230 struct tep_function_handler;
231 
232 struct tep_print_arg_func {
233 	struct tep_function_handler	*func;
234 	struct tep_print_arg		*args;
235 };
236 
237 enum tep_print_arg_type {
238 	TEP_PRINT_NULL,
239 	TEP_PRINT_ATOM,
240 	TEP_PRINT_FIELD,
241 	TEP_PRINT_FLAGS,
242 	TEP_PRINT_SYMBOL,
243 	TEP_PRINT_HEX,
244 	TEP_PRINT_INT_ARRAY,
245 	TEP_PRINT_TYPE,
246 	TEP_PRINT_STRING,
247 	TEP_PRINT_BSTRING,
248 	TEP_PRINT_DYNAMIC_ARRAY,
249 	TEP_PRINT_OP,
250 	TEP_PRINT_FUNC,
251 	TEP_PRINT_BITMASK,
252 	TEP_PRINT_DYNAMIC_ARRAY_LEN,
253 	TEP_PRINT_HEX_STR,
254 };
255 
256 struct tep_print_arg {
257 	struct tep_print_arg		*next;
258 	enum tep_print_arg_type		type;
259 	union {
260 		struct tep_print_arg_atom	atom;
261 		struct tep_print_arg_field	field;
262 		struct tep_print_arg_typecast	typecast;
263 		struct tep_print_arg_flags	flags;
264 		struct tep_print_arg_symbol	symbol;
265 		struct tep_print_arg_hex	hex;
266 		struct tep_print_arg_int_array	int_array;
267 		struct tep_print_arg_func	func;
268 		struct tep_print_arg_string	string;
269 		struct tep_print_arg_bitmask	bitmask;
270 		struct tep_print_arg_op		op;
271 		struct tep_print_arg_dynarray	dynarray;
272 	};
273 };
274 
275 struct tep_print_fmt {
276 	char			*format;
277 	struct tep_print_arg	*args;
278 };
279 
280 struct tep_event {
281 	struct tep_handle	*tep;
282 	char			*name;
283 	int			id;
284 	int			flags;
285 	struct tep_format	format;
286 	struct tep_print_fmt	print_fmt;
287 	char			*system;
288 	tep_event_handler_func	handler;
289 	void			*context;
290 };
291 
292 enum {
293 	TEP_EVENT_FL_ISFTRACE	= 0x01,
294 	TEP_EVENT_FL_ISPRINT	= 0x02,
295 	TEP_EVENT_FL_ISBPRINT	= 0x04,
296 	TEP_EVENT_FL_ISFUNCENT	= 0x10,
297 	TEP_EVENT_FL_ISFUNCRET	= 0x20,
298 	TEP_EVENT_FL_NOHANDLE	= 0x40,
299 	TEP_EVENT_FL_PRINTRAW	= 0x80,
300 
301 	TEP_EVENT_FL_FAILED	= 0x80000000
302 };
303 
304 enum tep_event_sort_type {
305 	TEP_EVENT_SORT_ID,
306 	TEP_EVENT_SORT_NAME,
307 	TEP_EVENT_SORT_SYSTEM,
308 };
309 
310 enum tep_event_type {
311 	TEP_EVENT_ERROR,
312 	TEP_EVENT_NONE,
313 	TEP_EVENT_SPACE,
314 	TEP_EVENT_NEWLINE,
315 	TEP_EVENT_OP,
316 	TEP_EVENT_DELIM,
317 	TEP_EVENT_ITEM,
318 	TEP_EVENT_DQUOTE,
319 	TEP_EVENT_SQUOTE,
320 };
321 
322 typedef unsigned long long (*tep_func_handler)(struct trace_seq *s,
323 					       unsigned long long *args);
324 
325 enum tep_func_arg_type {
326 	TEP_FUNC_ARG_VOID,
327 	TEP_FUNC_ARG_INT,
328 	TEP_FUNC_ARG_LONG,
329 	TEP_FUNC_ARG_STRING,
330 	TEP_FUNC_ARG_PTR,
331 	TEP_FUNC_ARG_MAX_TYPES
332 };
333 
334 enum tep_flag {
335 	TEP_NSEC_OUTPUT		= 1,	/* output in NSECS */
336 	TEP_DISABLE_SYS_PLUGINS	= 1 << 1,
337 	TEP_DISABLE_PLUGINS	= 1 << 2,
338 };
339 
340 #define TEP_ERRORS 							      \
341 	_PE(MEM_ALLOC_FAILED,	"failed to allocate memory"),		      \
342 	_PE(PARSE_EVENT_FAILED,	"failed to parse event"),		      \
343 	_PE(READ_ID_FAILED,	"failed to read event id"),		      \
344 	_PE(READ_FORMAT_FAILED,	"failed to read event format"),		      \
345 	_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 	_PE(INVALID_EXP_TYPE,	"invalid expression type"),		      \
349 	_PE(INVALID_OP_TYPE,	"invalid operator type"),		      \
350 	_PE(INVALID_EVENT_NAME,	"invalid event name"),			      \
351 	_PE(EVENT_NOT_FOUND,	"no event found"),			      \
352 	_PE(SYNTAX_ERROR,	"syntax error"),			      \
353 	_PE(ILLEGAL_RVALUE,	"illegal rvalue"),			      \
354 	_PE(ILLEGAL_LVALUE,	"illegal lvalue for string comparison"),      \
355 	_PE(INVALID_REGEX,	"regex did not compute"),		      \
356 	_PE(ILLEGAL_STRING_CMP,	"illegal comparison for string"), 	      \
357 	_PE(ILLEGAL_INTEGER_CMP,"illegal comparison for integer"), 	      \
358 	_PE(REPARENT_NOT_OP,	"cannot reparent other than OP"),	      \
359 	_PE(REPARENT_FAILED,	"failed to reparent filter OP"),	      \
360 	_PE(BAD_FILTER_ARG,	"bad arg in filter tree"),		      \
361 	_PE(UNEXPECTED_TYPE,	"unexpected type (not a value)"),	      \
362 	_PE(ILLEGAL_TOKEN,	"illegal token"),			      \
363 	_PE(INVALID_PAREN,	"open parenthesis cannot come here"), 	      \
364 	_PE(UNBALANCED_PAREN,	"unbalanced number of parenthesis"),	      \
365 	_PE(UNKNOWN_TOKEN,	"unknown token"),			      \
366 	_PE(FILTER_NOT_FOUND,	"no filter found"),			      \
367 	_PE(NOT_A_NUMBER,	"must have number field"),		      \
368 	_PE(NO_FILTER,		"no filters exists"),			      \
369 	_PE(FILTER_MISS,	"record does not match to filter")
370 
371 #undef _PE
372 #define _PE(__code, __str) TEP_ERRNO__ ## __code
373 enum tep_errno {
374 	TEP_ERRNO__SUCCESS			= 0,
375 	TEP_ERRNO__FILTER_MATCH			= TEP_ERRNO__SUCCESS,
376 
377 	/*
378 	 * Choose an arbitrary negative big number not to clash with standard
379 	 * errno since SUS requires the errno has distinct positive values.
380 	 * See 'Issue 6' in the link below.
381 	 *
382 	 * http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/errno.h.html
383 	 */
384 	__TEP_ERRNO__START			= -100000,
385 
386 	TEP_ERRORS,
387 
388 	__TEP_ERRNO__END,
389 };
390 #undef _PE
391 
392 struct tep_plugin_list;
393 
394 #define INVALID_PLUGIN_LIST_OPTION	((char **)((unsigned long)-1))
395 
396 struct tep_plugin_list *tep_load_plugins(struct tep_handle *tep);
397 void tep_unload_plugins(struct tep_plugin_list *plugin_list,
398 			struct tep_handle *tep);
399 char **tep_plugin_list_options(void);
400 void tep_plugin_free_options_list(char **list);
401 int tep_plugin_add_options(const char *name,
402 			   struct tep_plugin_option *options);
403 void tep_plugin_remove_options(struct tep_plugin_option *options);
404 void tep_print_plugins(struct trace_seq *s,
405 			const char *prefix, const char *suffix,
406 			const struct tep_plugin_list *list);
407 
408 /* tep_handle */
409 typedef char *(tep_func_resolver_t)(void *priv,
410 				    unsigned long long *addrp, char **modp);
411 void tep_set_flag(struct tep_handle *tep, int flag);
412 void tep_clear_flag(struct tep_handle *tep, enum tep_flag flag);
413 bool tep_test_flag(struct tep_handle *tep, enum tep_flag flags);
414 
tep_is_bigendian(void)415 static inline int tep_is_bigendian(void)
416 {
417 	unsigned char str[] = { 0x1, 0x2, 0x3, 0x4 };
418 	unsigned int val;
419 
420 	memcpy(&val, str, 4);
421 	return val == 0x01020304;
422 }
423 
424 /* taken from kernel/trace/trace.h */
425 enum trace_flag_type {
426 	TRACE_FLAG_IRQS_OFF		= 0x01,
427 	TRACE_FLAG_IRQS_NOSUPPORT	= 0x02,
428 	TRACE_FLAG_NEED_RESCHED		= 0x04,
429 	TRACE_FLAG_HARDIRQ		= 0x08,
430 	TRACE_FLAG_SOFTIRQ		= 0x10,
431 };
432 
433 int tep_set_function_resolver(struct tep_handle *tep,
434 			      tep_func_resolver_t *func, void *priv);
435 void tep_reset_function_resolver(struct tep_handle *tep);
436 int tep_register_comm(struct tep_handle *tep, const char *comm, int pid);
437 int tep_override_comm(struct tep_handle *tep, const char *comm, int pid);
438 int tep_register_function(struct tep_handle *tep, char *name,
439 			  unsigned long long addr, char *mod);
440 int tep_register_print_string(struct tep_handle *tep, const char *fmt,
441 			      unsigned long long addr);
442 bool tep_is_pid_registered(struct tep_handle *tep, int pid);
443 
444 struct tep_event *tep_get_event(struct tep_handle *tep, int index);
445 
446 #define TEP_PRINT_INFO		"INFO"
447 #define TEP_PRINT_INFO_RAW	"INFO_RAW"
448 #define TEP_PRINT_COMM		"COMM"
449 #define TEP_PRINT_LATENCY	"LATENCY"
450 #define TEP_PRINT_NAME		"NAME"
451 #define TEP_PRINT_PID		1U
452 #define TEP_PRINT_TIME		2U
453 #define TEP_PRINT_CPU		3U
454 
455 void tep_print_event(struct tep_handle *tep, struct trace_seq *s,
456 		     struct tep_record *record, const char *fmt, ...)
457 	__attribute__ ((format (printf, 4, 5)));
458 
459 int tep_parse_header_page(struct tep_handle *tep, char *buf, unsigned long size,
460 			  int long_size);
461 
462 enum tep_errno tep_parse_event(struct tep_handle *tep, const char *buf,
463 			       unsigned long size, const char *sys);
464 enum tep_errno tep_parse_format(struct tep_handle *tep,
465 				struct tep_event **eventp,
466 				const char *buf,
467 				unsigned long size, const char *sys);
468 
469 void *tep_get_field_raw(struct trace_seq *s, struct tep_event *event,
470 			const char *name, struct tep_record *record,
471 			int *len, int err);
472 
473 int tep_get_field_val(struct trace_seq *s, struct tep_event *event,
474 		      const char *name, struct tep_record *record,
475 		      unsigned long long *val, int err);
476 int tep_get_common_field_val(struct trace_seq *s, struct tep_event *event,
477 			     const char *name, struct tep_record *record,
478 			     unsigned long long *val, int err);
479 int tep_get_any_field_val(struct trace_seq *s, struct tep_event *event,
480 			  const char *name, struct tep_record *record,
481 			  unsigned long long *val, int err);
482 
483 int tep_print_num_field(struct trace_seq *s, const char *fmt,
484 			struct tep_event *event, const char *name,
485 			struct tep_record *record, int err);
486 
487 int tep_print_func_field(struct trace_seq *s, const char *fmt,
488 			 struct tep_event *event, const char *name,
489 			 struct tep_record *record, int err);
490 
491 enum tep_reg_handler {
492 	TEP_REGISTER_SUCCESS = 0,
493 	TEP_REGISTER_SUCCESS_OVERWRITE,
494 };
495 
496 int tep_register_event_handler(struct tep_handle *tep, int id,
497 			       const char *sys_name, const char *event_name,
498 			       tep_event_handler_func func, void *context);
499 int tep_unregister_event_handler(struct tep_handle *tep, int id,
500 				 const char *sys_name, const char *event_name,
501 				 tep_event_handler_func func, void *context);
502 int tep_register_print_function(struct tep_handle *tep,
503 				tep_func_handler func,
504 				enum tep_func_arg_type ret_type,
505 				char *name, ...);
506 int tep_unregister_print_function(struct tep_handle *tep,
507 				  tep_func_handler func, char *name);
508 
509 struct tep_format_field *tep_find_common_field(struct tep_event *event, const char *name);
510 struct tep_format_field *tep_find_field(struct tep_event *event, const char *name);
511 struct tep_format_field *tep_find_any_field(struct tep_event *event, const char *name);
512 
513 const char *tep_find_function(struct tep_handle *tep, unsigned long long addr);
514 unsigned long long
515 tep_find_function_address(struct tep_handle *tep, unsigned long long addr);
516 unsigned long long tep_read_number(struct tep_handle *tep, const void *ptr, int size);
517 int tep_read_number_field(struct tep_format_field *field, const void *data,
518 			  unsigned long long *value);
519 
520 struct tep_event *tep_get_first_event(struct tep_handle *tep);
521 int tep_get_events_count(struct tep_handle *tep);
522 struct tep_event *tep_find_event(struct tep_handle *tep, int id);
523 
524 struct tep_event *
525 tep_find_event_by_name(struct tep_handle *tep, const char *sys, const char *name);
526 struct tep_event *
527 tep_find_event_by_record(struct tep_handle *tep, struct tep_record *record);
528 
529 int tep_data_type(struct tep_handle *tep, struct tep_record *rec);
530 int tep_data_pid(struct tep_handle *tep, struct tep_record *rec);
531 int tep_data_preempt_count(struct tep_handle *tep, struct tep_record *rec);
532 int tep_data_flags(struct tep_handle *tep, struct tep_record *rec);
533 const char *tep_data_comm_from_pid(struct tep_handle *tep, int pid);
534 struct tep_cmdline;
535 struct tep_cmdline *tep_data_pid_from_comm(struct tep_handle *tep, const char *comm,
536 					   struct tep_cmdline *next);
537 int tep_cmdline_pid(struct tep_handle *tep, struct tep_cmdline *cmdline);
538 
539 void tep_print_field(struct trace_seq *s, void *data,
540 		     struct tep_format_field *field);
541 void tep_print_fields(struct trace_seq *s, void *data,
542 		      int size __maybe_unused, struct tep_event *event);
543 int tep_strerror(struct tep_handle *tep, enum tep_errno errnum,
544 		 char *buf, size_t buflen);
545 
546 struct tep_event **tep_list_events(struct tep_handle *tep, enum tep_event_sort_type);
547 struct tep_event **tep_list_events_copy(struct tep_handle *tep,
548 					enum tep_event_sort_type);
549 struct tep_format_field **tep_event_common_fields(struct tep_event *event);
550 struct tep_format_field **tep_event_fields(struct tep_event *event);
551 
552 enum tep_endian {
553         TEP_LITTLE_ENDIAN = 0,
554         TEP_BIG_ENDIAN
555 };
556 int tep_get_cpus(struct tep_handle *tep);
557 void tep_set_cpus(struct tep_handle *tep, int cpus);
558 int tep_get_long_size(struct tep_handle *tep);
559 void tep_set_long_size(struct tep_handle *tep, int long_size);
560 int tep_get_page_size(struct tep_handle *tep);
561 void tep_set_page_size(struct tep_handle *tep, int _page_size);
562 bool tep_is_file_bigendian(struct tep_handle *tep);
563 void tep_set_file_bigendian(struct tep_handle *tep, enum tep_endian endian);
564 bool tep_is_local_bigendian(struct tep_handle *tep);
565 void tep_set_local_bigendian(struct tep_handle *tep, enum tep_endian endian);
566 int tep_get_header_page_size(struct tep_handle *tep);
567 int tep_get_header_timestamp_size(struct tep_handle *tep);
568 bool tep_is_old_format(struct tep_handle *tep);
569 void tep_set_test_filters(struct tep_handle *tep, int test_filters);
570 
571 struct tep_handle *tep_alloc(void);
572 void tep_free(struct tep_handle *tep);
573 void tep_ref(struct tep_handle *tep);
574 void tep_unref(struct tep_handle *tep);
575 int tep_get_ref(struct tep_handle *tep);
576 
577 /* access to the internal parser */
578 void tep_buffer_init(const char *buf, unsigned long long size);
579 enum tep_event_type tep_read_token(char **tok);
580 void tep_free_token(char *token);
581 int tep_peek_char(void);
582 const char *tep_get_input_buf(void);
583 unsigned long long tep_get_input_buf_ptr(void);
584 
585 /* for debugging */
586 void tep_print_funcs(struct tep_handle *tep);
587 void tep_print_printk(struct tep_handle *tep);
588 
589 /* ----------------------- filtering ----------------------- */
590 
591 enum tep_filter_boolean_type {
592 	TEP_FILTER_FALSE,
593 	TEP_FILTER_TRUE,
594 };
595 
596 enum tep_filter_op_type {
597 	TEP_FILTER_OP_AND = 1,
598 	TEP_FILTER_OP_OR,
599 	TEP_FILTER_OP_NOT,
600 };
601 
602 enum tep_filter_cmp_type {
603 	TEP_FILTER_CMP_NONE,
604 	TEP_FILTER_CMP_EQ,
605 	TEP_FILTER_CMP_NE,
606 	TEP_FILTER_CMP_GT,
607 	TEP_FILTER_CMP_LT,
608 	TEP_FILTER_CMP_GE,
609 	TEP_FILTER_CMP_LE,
610 	TEP_FILTER_CMP_MATCH,
611 	TEP_FILTER_CMP_NOT_MATCH,
612 	TEP_FILTER_CMP_REGEX,
613 	TEP_FILTER_CMP_NOT_REGEX,
614 };
615 
616 enum tep_filter_exp_type {
617 	TEP_FILTER_EXP_NONE,
618 	TEP_FILTER_EXP_ADD,
619 	TEP_FILTER_EXP_SUB,
620 	TEP_FILTER_EXP_MUL,
621 	TEP_FILTER_EXP_DIV,
622 	TEP_FILTER_EXP_MOD,
623 	TEP_FILTER_EXP_RSHIFT,
624 	TEP_FILTER_EXP_LSHIFT,
625 	TEP_FILTER_EXP_AND,
626 	TEP_FILTER_EXP_OR,
627 	TEP_FILTER_EXP_XOR,
628 	TEP_FILTER_EXP_NOT,
629 };
630 
631 enum tep_filter_arg_type {
632 	TEP_FILTER_ARG_NONE,
633 	TEP_FILTER_ARG_BOOLEAN,
634 	TEP_FILTER_ARG_VALUE,
635 	TEP_FILTER_ARG_FIELD,
636 	TEP_FILTER_ARG_EXP,
637 	TEP_FILTER_ARG_OP,
638 	TEP_FILTER_ARG_NUM,
639 	TEP_FILTER_ARG_STR,
640 };
641 
642 enum tep_filter_value_type {
643 	TEP_FILTER_NUMBER,
644 	TEP_FILTER_STRING,
645 	TEP_FILTER_CHAR
646 };
647 
648 struct tep_filter_arg;
649 
650 struct tep_filter_arg_boolean {
651 	enum tep_filter_boolean_type	value;
652 };
653 
654 struct tep_filter_arg_field {
655 	struct tep_format_field		*field;
656 };
657 
658 struct tep_filter_arg_value {
659 	enum tep_filter_value_type	type;
660 	union {
661 		char			*str;
662 		unsigned long long	val;
663 	};
664 };
665 
666 struct tep_filter_arg_op {
667 	enum tep_filter_op_type		type;
668 	struct tep_filter_arg		*left;
669 	struct tep_filter_arg		*right;
670 };
671 
672 struct tep_filter_arg_exp {
673 	enum tep_filter_exp_type	type;
674 	struct tep_filter_arg		*left;
675 	struct tep_filter_arg		*right;
676 };
677 
678 struct tep_filter_arg_num {
679 	enum tep_filter_cmp_type	type;
680 	struct tep_filter_arg		*left;
681 	struct tep_filter_arg		*right;
682 };
683 
684 struct tep_filter_arg_str {
685 	enum tep_filter_cmp_type	type;
686 	struct tep_format_field		*field;
687 	char				*val;
688 	char				*buffer;
689 	regex_t				reg;
690 };
691 
692 struct tep_filter_arg {
693 	enum tep_filter_arg_type		type;
694 	union {
695 		struct tep_filter_arg_boolean	boolean;
696 		struct tep_filter_arg_field	field;
697 		struct tep_filter_arg_value	value;
698 		struct tep_filter_arg_op	op;
699 		struct tep_filter_arg_exp	exp;
700 		struct tep_filter_arg_num	num;
701 		struct tep_filter_arg_str	str;
702 	};
703 };
704 
705 struct tep_filter_type {
706 	int			event_id;
707 	struct tep_event	*event;
708 	struct tep_filter_arg	*filter;
709 };
710 
711 #define TEP_FILTER_ERROR_BUFSZ  1024
712 
713 struct tep_event_filter {
714 	struct tep_handle	*tep;
715 	int			filters;
716 	struct tep_filter_type	*event_filters;
717 	char			error_buffer[TEP_FILTER_ERROR_BUFSZ];
718 };
719 
720 struct tep_event_filter *tep_filter_alloc(struct tep_handle *tep);
721 
722 /* for backward compatibility */
723 #define FILTER_NONE		TEP_ERRNO__NO_FILTER
724 #define FILTER_NOEXIST		TEP_ERRNO__FILTER_NOT_FOUND
725 #define FILTER_MISS		TEP_ERRNO__FILTER_MISS
726 #define FILTER_MATCH		TEP_ERRNO__FILTER_MATCH
727 
728 enum tep_errno tep_filter_add_filter_str(struct tep_event_filter *filter,
729 					 const char *filter_str);
730 
731 enum tep_errno tep_filter_match(struct tep_event_filter *filter,
732 				struct tep_record *record);
733 
734 int tep_filter_strerror(struct tep_event_filter *filter, enum tep_errno err,
735 			char *buf, size_t buflen);
736 
737 int tep_event_filtered(struct tep_event_filter *filter,
738 		       int event_id);
739 
740 void tep_filter_reset(struct tep_event_filter *filter);
741 
742 void tep_filter_free(struct tep_event_filter *filter);
743 
744 char *tep_filter_make_string(struct tep_event_filter *filter, int event_id);
745 
746 int tep_filter_remove_event(struct tep_event_filter *filter,
747 			    int event_id);
748 
749 int tep_filter_copy(struct tep_event_filter *dest, struct tep_event_filter *source);
750 
751 int tep_filter_compare(struct tep_event_filter *filter1, struct tep_event_filter *filter2);
752 
753 #endif /* _PARSE_EVENTS_H */
754