1e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/*
2e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * Copyright (C) 2009, 2010 Red Hat Inc, Steven Rostedt <srostedt@redhat.com>
3e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *
4e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * This program is free software; you can redistribute it and/or
6e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * modify it under the terms of the GNU Lesser General Public
7e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * License as published by the Free Software Foundation;
8e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * version 2.1 of the License (not later!)
9e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *
10e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * This program is distributed in the hope that it will be useful,
11e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * but WITHOUT ANY WARRANTY; without even the implied warranty of
12e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * GNU Lesser General Public License for more details.
14e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *
15e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * You should have received a copy of the GNU Lesser General Public
16e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * License along with this program; if not,  see <http://www.gnu.org/licenses>
17e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *
18e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
19e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng */
20e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#ifndef _PARSE_EVENTS_H
21e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define _PARSE_EVENTS_H
22e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
23e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <stdarg.h>
24e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <regex.h>
25e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
26e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#ifndef __maybe_unused
27e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define __maybe_unused __attribute__((unused))
28e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#endif
29e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
30e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/* ----------------------- trace_seq ----------------------- */
31e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
32e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
33e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#ifndef TRACE_SEQ_BUF_SIZE
34e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define TRACE_SEQ_BUF_SIZE 4096
35e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#endif
36e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
37e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#ifndef DEBUG_RECORD
38e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define DEBUG_RECORD 0
39e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#endif
40e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
41e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct pevent_record {
42e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	unsigned long long	ts;
43e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	unsigned long long	offset;
44e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	long long		missed_events;	/* buffer dropped events before */
45e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int			record_size;	/* size of binary record */
46e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int			size;		/* size of data */
47e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	void			*data;
48e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int			cpu;
49e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int			ref_count;
50e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int			locked;		/* Do not free, even if ref_count is zero */
51e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	void			*priv;
52e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#if DEBUG_RECORD
53e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct pevent_record	*prev;
54e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct pevent_record	*next;
55e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	long			alloc_addr;
56e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#endif
57e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
58e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
59e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/*
60e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * Trace sequences are used to allow a function to call several other functions
61e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * to create a string of data to use (up to a max of PAGE_SIZE).
62e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng */
63e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
64e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct trace_seq {
65e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	char			*buffer;
66e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	unsigned int		buffer_size;
67e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	unsigned int		len;
68e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	unsigned int		readpos;
69e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
70e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
71e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid trace_seq_init(struct trace_seq *s);
72e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid trace_seq_reset(struct trace_seq *s);
73e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid trace_seq_destroy(struct trace_seq *s);
74e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
75e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengextern int trace_seq_printf(struct trace_seq *s, const char *fmt, ...)
76e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	__attribute__ ((format (printf, 2, 3)));
77e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengextern int trace_seq_vprintf(struct trace_seq *s, const char *fmt, va_list args)
78e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	__attribute__ ((format (printf, 2, 0)));
79e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
80e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengextern int trace_seq_puts(struct trace_seq *s, const char *str);
81e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengextern int trace_seq_putc(struct trace_seq *s, unsigned char c);
82e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
83e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengextern void trace_seq_terminate(struct trace_seq *s);
84e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
85e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengextern int trace_seq_do_printf(struct trace_seq *s);
86e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
87e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
88e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/* ----------------------- pevent ----------------------- */
89e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
90e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct pevent;
91e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct event_format;
92e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
93e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengtypedef int (*pevent_event_handler_func)(struct trace_seq *s,
94e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng					 struct pevent_record *record,
95e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng					 struct event_format *event,
96e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng					 void *context);
97e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
98e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengtypedef int (*pevent_plugin_load_func)(struct pevent *pevent);
99e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengtypedef int (*pevent_plugin_unload_func)(void);
100e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
101e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct plugin_option {
102e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct plugin_option		*next;
103e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	void				*handle;
104e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	char				*file;
105e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	char				*name;
106e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	char				*plugin_alias;
107e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	char				*description;
108e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	char				*value;
109e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	void				*priv;
110e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int				set;
111e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
112e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
113e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/*
114e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * Plugin hooks that can be called:
115e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *
116e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * PEVENT_PLUGIN_LOADER:  (required)
117e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *   The function name to initialized the plugin.
118e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *
119e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *   int PEVENT_PLUGIN_LOADER(struct pevent *pevent)
120e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *
121e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * PEVENT_PLUGIN_UNLOADER:  (optional)
122e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *   The function called just before unloading
123e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *
124e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *   int PEVENT_PLUGIN_UNLOADER(void)
125e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *
126e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * PEVENT_PLUGIN_OPTIONS:  (optional)
127e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *   Plugin options that can be set before loading
128e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *
129e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *   struct plugin_option PEVENT_PLUGIN_OPTIONS[] = {
130e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *	{
131e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *		.name = "option-name",
132e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *		.plugin_alias = "overide-file-name", (optional)
133e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *		.description = "description of option to show users",
134e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *	},
135e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *	{
136e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *		.name = NULL,
137e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *	},
138e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *   };
139e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *
140e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *   Array must end with .name = NULL;
141e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *
142e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *
143e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *   .plugin_alias is used to give a shorter name to access
144e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *   the vairable. Useful if a plugin handles more than one event.
145e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *
146e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * PEVENT_PLUGIN_ALIAS: (optional)
147e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *   The name to use for finding options (uses filename if not defined)
148e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng */
149e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PEVENT_PLUGIN_LOADER pevent_plugin_loader
150e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PEVENT_PLUGIN_UNLOADER pevent_plugin_unloader
151e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PEVENT_PLUGIN_OPTIONS pevent_plugin_options
152e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PEVENT_PLUGIN_ALIAS pevent_plugin_alias
153e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define _MAKE_STR(x)	#x
154e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define MAKE_STR(x)	_MAKE_STR(x)
155e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PEVENT_PLUGIN_LOADER_NAME MAKE_STR(PEVENT_PLUGIN_LOADER)
156e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PEVENT_PLUGIN_UNLOADER_NAME MAKE_STR(PEVENT_PLUGIN_UNLOADER)
157e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PEVENT_PLUGIN_OPTIONS_NAME MAKE_STR(PEVENT_PLUGIN_OPTIONS)
158e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PEVENT_PLUGIN_ALIAS_NAME MAKE_STR(PEVENT_PLUGIN_ALIAS)
159e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
160e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define NSECS_PER_SEC		1000000000ULL
161e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define NSECS_PER_USEC		1000ULL
162e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
163e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengenum format_flags {
164e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	FIELD_IS_ARRAY		= 1,
165e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	FIELD_IS_POINTER	= 2,
166e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	FIELD_IS_SIGNED		= 4,
167e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	FIELD_IS_STRING		= 8,
168e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	FIELD_IS_DYNAMIC	= 16,
169e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	FIELD_IS_LONG		= 32,
170e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	FIELD_IS_FLAG		= 64,
171e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	FIELD_IS_SYMBOLIC	= 128,
172e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
173e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
174e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct format_field {
175e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct format_field	*next;
176e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct event_format	*event;
177e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	char			*type;
178e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	char			*name;
179e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int			offset;
180e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int			size;
181e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	unsigned int		arraylen;
182e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	unsigned int		elementsize;
183e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	unsigned long		flags;
184e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
185e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
186e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct format {
187e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int			nr_common;
188e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int			nr_fields;
189e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct format_field	*common_fields;
190e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct format_field	*fields;
191e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
192e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
193e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct print_arg_atom {
194e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	char			*atom;
195e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
196e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
197e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct print_arg_string {
198e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	char			*string;
199e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int			offset;
200e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
201e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
202e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct print_arg_field {
203e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	char			*name;
204e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct format_field	*field;
205e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
206e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
207e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct print_flag_sym {
208e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct print_flag_sym	*next;
209e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	char			*value;
210e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	char			*str;
211e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
212e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
213e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct print_arg_typecast {
214e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	char 			*type;
215e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct print_arg	*item;
216e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
217e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
218e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct print_arg_flags {
219e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct print_arg	*field;
220e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	char			*delim;
221e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct print_flag_sym	*flags;
222e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
223e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
224e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct print_arg_symbol {
225e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct print_arg	*field;
226e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct print_flag_sym	*symbols;
227e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
228e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
229e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct print_arg_hex {
230e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct print_arg	*field;
231e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct print_arg	*size;
232e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
233e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
234e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct print_arg_dynarray {
235e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct format_field	*field;
236e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct print_arg	*index;
237e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
238e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
239e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct print_arg;
240e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
241e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct print_arg_op {
242e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	char			*op;
243e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int			prio;
244e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct print_arg	*left;
245e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct print_arg	*right;
246e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
247e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
248e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct pevent_function_handler;
249e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
250e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct print_arg_func {
251e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct pevent_function_handler	*func;
252e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct print_arg		*args;
253e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
254e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
255e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengenum print_arg_type {
256e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PRINT_NULL,
257e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PRINT_ATOM,
258e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PRINT_FIELD,
259e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PRINT_FLAGS,
260e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PRINT_SYMBOL,
261e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PRINT_HEX,
262e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PRINT_TYPE,
263e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PRINT_STRING,
264e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PRINT_BSTRING,
265e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PRINT_DYNAMIC_ARRAY,
266e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PRINT_OP,
267e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PRINT_FUNC,
268e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
269e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
270e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct print_arg {
271e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct print_arg		*next;
272e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	enum print_arg_type		type;
273e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	union {
274e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		struct print_arg_atom		atom;
275e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		struct print_arg_field		field;
276e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		struct print_arg_typecast	typecast;
277e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		struct print_arg_flags		flags;
278e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		struct print_arg_symbol		symbol;
279e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		struct print_arg_hex		hex;
280e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		struct print_arg_func		func;
281e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		struct print_arg_string		string;
282e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		struct print_arg_op		op;
283e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		struct print_arg_dynarray	dynarray;
284e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	};
285e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
286e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
287e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct print_fmt {
288e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	char			*format;
289e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct print_arg	*args;
290e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
291e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
292e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct event_format {
293e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct pevent		*pevent;
294e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	char			*name;
295e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int			id;
296e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int			flags;
297e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct format		format;
298e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct print_fmt	print_fmt;
299e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	char			*system;
300e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	pevent_event_handler_func handler;
301e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	void			*context;
302e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
303e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
304e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengenum {
305e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	EVENT_FL_ISFTRACE	= 0x01,
306e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	EVENT_FL_ISPRINT	= 0x02,
307e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	EVENT_FL_ISBPRINT	= 0x04,
308e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	EVENT_FL_ISFUNCENT	= 0x10,
309e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	EVENT_FL_ISFUNCRET	= 0x20,
310e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
311e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	EVENT_FL_FAILED		= 0x80000000
312e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
313e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
314e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengenum event_sort_type {
315e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	EVENT_SORT_ID,
316e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	EVENT_SORT_NAME,
317e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	EVENT_SORT_SYSTEM,
318e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
319e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
320e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengenum event_type {
321e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	EVENT_ERROR,
322e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	EVENT_NONE,
323e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	EVENT_SPACE,
324e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	EVENT_NEWLINE,
325e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	EVENT_OP,
326e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	EVENT_DELIM,
327e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	EVENT_ITEM,
328e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	EVENT_DQUOTE,
329e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	EVENT_SQUOTE,
330e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
331e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
332e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengtypedef unsigned long long (*pevent_func_handler)(struct trace_seq *s,
333e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng					     unsigned long long *args);
334e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
335e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengenum pevent_func_arg_type {
336e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PEVENT_FUNC_ARG_VOID,
337e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PEVENT_FUNC_ARG_INT,
338e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PEVENT_FUNC_ARG_LONG,
339e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PEVENT_FUNC_ARG_STRING,
340e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PEVENT_FUNC_ARG_PTR,
341e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PEVENT_FUNC_ARG_MAX_TYPES
342e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
343e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
344e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengenum pevent_flag {
345e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PEVENT_NSEC_OUTPUT		= 1,	/* output in NSECS */
346e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
347e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
348e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PEVENT_ERRORS 							      \
349e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	_PE(MEM_ALLOC_FAILED,	"failed to allocate memory"),		      \
350e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	_PE(PARSE_EVENT_FAILED,	"failed to parse event"),		      \
351e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	_PE(READ_ID_FAILED,	"failed to read event id"),		      \
352e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	_PE(READ_FORMAT_FAILED,	"failed to read event format"),		      \
353e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	_PE(READ_PRINT_FAILED,	"failed to read event print fmt"), 	      \
354e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	_PE(OLD_FTRACE_ARG_FAILED,"failed to allocate field name for ftrace"),\
355e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	_PE(INVALID_ARG_TYPE,	"invalid argument type")
356e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
357e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#undef _PE
358e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define _PE(__code, __str) PEVENT_ERRNO__ ## __code
359e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengenum pevent_errno {
360e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PEVENT_ERRNO__SUCCESS			= 0,
361e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
362e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	/*
363e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * Choose an arbitrary negative big number not to clash with standard
364e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * errno since SUS requires the errno has distinct positive values.
365e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * See 'Issue 6' in the link below.
366e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *
367e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/errno.h.html
368e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 */
369e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	__PEVENT_ERRNO__START			= -100000,
370e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
371e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PEVENT_ERRORS,
372e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
373e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	__PEVENT_ERRNO__END,
374e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
375e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#undef _PE
376e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
377e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct cmdline;
378e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct cmdline_list;
379e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct func_map;
380e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct func_list;
381e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct event_handler;
382e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
383e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct pevent {
384e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int ref_count;
385e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
386e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int header_page_ts_offset;
387e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int header_page_ts_size;
388e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int header_page_size_offset;
389e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int header_page_size_size;
390e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int header_page_data_offset;
391e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int header_page_data_size;
392e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int header_page_overwrite;
393e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
394e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int file_bigendian;
395e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int host_bigendian;
396e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
397e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int latency_format;
398e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
399e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int old_format;
400e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
401e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int cpus;
402e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int long_size;
403e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int page_size;
404e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
405e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct cmdline *cmdlines;
406e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct cmdline_list *cmdlist;
407e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int cmdline_count;
408e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
409e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct func_map *func_map;
410e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct func_list *funclist;
411e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	unsigned int func_count;
412e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
413e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct printk_map *printk_map;
414e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct printk_list *printklist;
415e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	unsigned int printk_count;
416e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
417e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
418e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct event_format **events;
419e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int nr_events;
420e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct event_format **sort_events;
421e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	enum event_sort_type last_type;
422e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
423e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int type_offset;
424e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int type_size;
425e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
426e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int pid_offset;
427e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int pid_size;
428e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
429e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 	int pc_offset;
430e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int pc_size;
431e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
432e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int flags_offset;
433e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int flags_size;
434e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
435e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int ld_offset;
436e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int ld_size;
437e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
438e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int print_raw;
439e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
440e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int test_filters;
441e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
442e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int flags;
443e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
444e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct format_field *bprint_ip_field;
445e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct format_field *bprint_fmt_field;
446e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct format_field *bprint_buf_field;
447e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
448e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct event_handler *handlers;
449e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct pevent_function_handler *func_handlers;
450e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
451e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	/* cache */
452e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct event_format *last_event;
453e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
454e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
455e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic inline void pevent_set_flag(struct pevent *pevent, int flag)
456e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
457e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	pevent->flags |= flag;
458e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
459e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
460e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic inline unsigned short
461e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng__data2host2(struct pevent *pevent, unsigned short data)
462e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
463e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	unsigned short swap;
464e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
465e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (pevent->host_bigendian == pevent->file_bigendian)
466e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		return data;
467e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
468e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	swap = ((data & 0xffULL) << 8) |
469e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		((data & (0xffULL << 8)) >> 8);
470e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
471e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	return swap;
472e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
473e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
474e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic inline unsigned int
475e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng__data2host4(struct pevent *pevent, unsigned int data)
476e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
477e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	unsigned int swap;
478e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
479e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (pevent->host_bigendian == pevent->file_bigendian)
480e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		return data;
481e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
482e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	swap = ((data & 0xffULL) << 24) |
483e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		((data & (0xffULL << 8)) << 8) |
484e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		((data & (0xffULL << 16)) >> 8) |
485e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		((data & (0xffULL << 24)) >> 24);
486e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
487e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	return swap;
488e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
489e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
490e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic inline unsigned long long
491e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng__data2host8(struct pevent *pevent, unsigned long long data)
492e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
493e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	unsigned long long swap;
494e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
495e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (pevent->host_bigendian == pevent->file_bigendian)
496e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		return data;
497e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
498e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	swap = ((data & 0xffULL) << 56) |
499e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		((data & (0xffULL << 8)) << 40) |
500e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		((data & (0xffULL << 16)) << 24) |
501e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		((data & (0xffULL << 24)) << 8) |
502e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		((data & (0xffULL << 32)) >> 8) |
503e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		((data & (0xffULL << 40)) >> 24) |
504e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		((data & (0xffULL << 48)) >> 40) |
505e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		((data & (0xffULL << 56)) >> 56);
506e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
507e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	return swap;
508e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
509e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
510e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define data2host2(pevent, ptr)		__data2host2(pevent, *(unsigned short *)(ptr))
511e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define data2host4(pevent, ptr)		__data2host4(pevent, *(unsigned int *)(ptr))
512e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define data2host8(pevent, ptr)					\
513e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng({								\
514e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	unsigned long long __val;				\
515e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng								\
516e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	memcpy(&__val, (ptr), sizeof(unsigned long long));	\
517e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	__data2host8(pevent, __val);				\
518e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng})
519e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
520e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/* taken from kernel/trace/trace.h */
521e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengenum trace_flag_type {
522e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	TRACE_FLAG_IRQS_OFF		= 0x01,
523e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	TRACE_FLAG_IRQS_NOSUPPORT	= 0x02,
524e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	TRACE_FLAG_NEED_RESCHED		= 0x04,
525e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	TRACE_FLAG_HARDIRQ		= 0x08,
526e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	TRACE_FLAG_SOFTIRQ		= 0x10,
527e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
528e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
529e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint pevent_register_comm(struct pevent *pevent, const char *comm, int pid);
530e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint pevent_register_function(struct pevent *pevent, char *name,
531e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			     unsigned long long addr, char *mod);
532e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint pevent_register_print_string(struct pevent *pevent, char *fmt,
533e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				 unsigned long long addr);
534e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint pevent_pid_is_registered(struct pevent *pevent, int pid);
535e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
536e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid pevent_print_event(struct pevent *pevent, struct trace_seq *s,
537e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			struct pevent_record *record);
538e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
539e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint pevent_parse_header_page(struct pevent *pevent, char *buf, unsigned long size,
540e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			     int long_size);
541e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
542e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengenum pevent_errno pevent_parse_event(struct pevent *pevent, const char *buf,
543e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				     unsigned long size, const char *sys);
544e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengenum pevent_errno pevent_parse_format(struct event_format **eventp, const char *buf,
545e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				      unsigned long size, const char *sys);
546e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid pevent_free_format(struct event_format *event);
547e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
548e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid *pevent_get_field_raw(struct trace_seq *s, struct event_format *event,
549e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			   const char *name, struct pevent_record *record,
550e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			   int *len, int err);
551e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
552e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint pevent_get_field_val(struct trace_seq *s, struct event_format *event,
553e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			 const char *name, struct pevent_record *record,
554e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			 unsigned long long *val, int err);
555e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint pevent_get_common_field_val(struct trace_seq *s, struct event_format *event,
556e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				const char *name, struct pevent_record *record,
557e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				unsigned long long *val, int err);
558e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint pevent_get_any_field_val(struct trace_seq *s, struct event_format *event,
559e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			     const char *name, struct pevent_record *record,
560e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			     unsigned long long *val, int err);
561e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
562e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint pevent_print_num_field(struct trace_seq *s, const char *fmt,
563e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			   struct event_format *event, const char *name,
564e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			   struct pevent_record *record, int err);
565e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
566e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint pevent_register_event_handler(struct pevent *pevent, int id,
567e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				  const char *sys_name, const char *event_name,
568e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				  pevent_event_handler_func func, void *context);
569e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint pevent_register_print_function(struct pevent *pevent,
570e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				   pevent_func_handler func,
571e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				   enum pevent_func_arg_type ret_type,
572e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				   char *name, ...);
573e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
574e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct format_field *pevent_find_common_field(struct event_format *event, const char *name);
575e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct format_field *pevent_find_field(struct event_format *event, const char *name);
576e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct format_field *pevent_find_any_field(struct event_format *event, const char *name);
577e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
578e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengconst char *pevent_find_function(struct pevent *pevent, unsigned long long addr);
579e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengunsigned long long
580e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengpevent_find_function_address(struct pevent *pevent, unsigned long long addr);
581e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengunsigned long long pevent_read_number(struct pevent *pevent, const void *ptr, int size);
582e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint pevent_read_number_field(struct format_field *field, const void *data,
583e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			     unsigned long long *value);
584e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
585e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct event_format *pevent_find_event(struct pevent *pevent, int id);
586e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
587e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct event_format *
588e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengpevent_find_event_by_name(struct pevent *pevent, const char *sys, const char *name);
589e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
590e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid pevent_data_lat_fmt(struct pevent *pevent,
591e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			 struct trace_seq *s, struct pevent_record *record);
592e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint pevent_data_type(struct pevent *pevent, struct pevent_record *rec);
593e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct event_format *pevent_data_event_from_type(struct pevent *pevent, int type);
594e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint pevent_data_pid(struct pevent *pevent, struct pevent_record *rec);
595e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengconst char *pevent_data_comm_from_pid(struct pevent *pevent, int pid);
596e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid pevent_event_info(struct trace_seq *s, struct event_format *event,
597e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		       struct pevent_record *record);
598e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint pevent_strerror(struct pevent *pevent, enum pevent_errno errnum,
599e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		    char *buf, size_t buflen);
600e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
601e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct event_format **pevent_list_events(struct pevent *pevent, enum event_sort_type);
602e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct format_field **pevent_event_common_fields(struct event_format *event);
603e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct format_field **pevent_event_fields(struct event_format *event);
604e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
605e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic inline int pevent_get_cpus(struct pevent *pevent)
606e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
607e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	return pevent->cpus;
608e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
609e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
610e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic inline void pevent_set_cpus(struct pevent *pevent, int cpus)
611e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
612e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	pevent->cpus = cpus;
613e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
614e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
615e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic inline int pevent_get_long_size(struct pevent *pevent)
616e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
617e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	return pevent->long_size;
618e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
619e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
620e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic inline void pevent_set_long_size(struct pevent *pevent, int long_size)
621e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
622e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	pevent->long_size = long_size;
623e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
624e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
625e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic inline int pevent_get_page_size(struct pevent *pevent)
626e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
627e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	return pevent->page_size;
628e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
629e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
630e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic inline void pevent_set_page_size(struct pevent *pevent, int _page_size)
631e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
632e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	pevent->page_size = _page_size;
633e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
634e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
635e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic inline int pevent_is_file_bigendian(struct pevent *pevent)
636e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
637e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	return pevent->file_bigendian;
638e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
639e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
640e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic inline void pevent_set_file_bigendian(struct pevent *pevent, int endian)
641e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
642e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	pevent->file_bigendian = endian;
643e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
644e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
645e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic inline int pevent_is_host_bigendian(struct pevent *pevent)
646e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
647e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	return pevent->host_bigendian;
648e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
649e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
650e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic inline void pevent_set_host_bigendian(struct pevent *pevent, int endian)
651e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
652e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	pevent->host_bigendian = endian;
653e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
654e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
655e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic inline int pevent_is_latency_format(struct pevent *pevent)
656e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
657e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	return pevent->latency_format;
658e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
659e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
660e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic inline void pevent_set_latency_format(struct pevent *pevent, int lat)
661e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
662e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	pevent->latency_format = lat;
663e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
664e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
665e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct pevent *pevent_alloc(void);
666e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid pevent_free(struct pevent *pevent);
667e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid pevent_ref(struct pevent *pevent);
668e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid pevent_unref(struct pevent *pevent);
669e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
670e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/* access to the internal parser */
671e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid pevent_buffer_init(const char *buf, unsigned long long size);
672e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengenum event_type pevent_read_token(char **tok);
673e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid pevent_free_token(char *token);
674e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint pevent_peek_char(void);
675e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengconst char *pevent_get_input_buf(void);
676e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengunsigned long long pevent_get_input_buf_ptr(void);
677e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
678e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/* for debugging */
679e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid pevent_print_funcs(struct pevent *pevent);
680e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid pevent_print_printk(struct pevent *pevent);
681e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
682e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/* ----------------------- filtering ----------------------- */
683e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
684e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengenum filter_boolean_type {
685e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	FILTER_FALSE,
686e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	FILTER_TRUE,
687e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
688e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
689e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengenum filter_op_type {
690e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	FILTER_OP_AND = 1,
691e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	FILTER_OP_OR,
692e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	FILTER_OP_NOT,
693e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
694e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
695e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengenum filter_cmp_type {
696e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	FILTER_CMP_NONE,
697e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	FILTER_CMP_EQ,
698e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	FILTER_CMP_NE,
699e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	FILTER_CMP_GT,
700e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	FILTER_CMP_LT,
701e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	FILTER_CMP_GE,
702e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	FILTER_CMP_LE,
703e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	FILTER_CMP_MATCH,
704e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	FILTER_CMP_NOT_MATCH,
705e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	FILTER_CMP_REGEX,
706e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	FILTER_CMP_NOT_REGEX,
707e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
708e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
709e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengenum filter_exp_type {
710e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	FILTER_EXP_NONE,
711e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	FILTER_EXP_ADD,
712e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	FILTER_EXP_SUB,
713e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	FILTER_EXP_MUL,
714e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	FILTER_EXP_DIV,
715e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	FILTER_EXP_MOD,
716e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	FILTER_EXP_RSHIFT,
717e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	FILTER_EXP_LSHIFT,
718e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	FILTER_EXP_AND,
719e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	FILTER_EXP_OR,
720e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	FILTER_EXP_XOR,
721e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	FILTER_EXP_NOT,
722e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
723e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
724e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengenum filter_arg_type {
725e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	FILTER_ARG_NONE,
726e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	FILTER_ARG_BOOLEAN,
727e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	FILTER_ARG_VALUE,
728e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	FILTER_ARG_FIELD,
729e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	FILTER_ARG_EXP,
730e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	FILTER_ARG_OP,
731e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	FILTER_ARG_NUM,
732e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	FILTER_ARG_STR,
733e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
734e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
735e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengenum filter_value_type {
736e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	FILTER_NUMBER,
737e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	FILTER_STRING,
738e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	FILTER_CHAR
739e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
740e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
741e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct fliter_arg;
742e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
743e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct filter_arg_boolean {
744e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	enum filter_boolean_type	value;
745e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
746e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
747e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct filter_arg_field {
748e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct format_field	*field;
749e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
750e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
751e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct filter_arg_value {
752e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	enum filter_value_type	type;
753e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	union {
754e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		char			*str;
755e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		unsigned long long	val;
756e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	};
757e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
758e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
759e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct filter_arg_op {
760e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	enum filter_op_type	type;
761e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct filter_arg	*left;
762e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct filter_arg	*right;
763e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
764e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
765e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct filter_arg_exp {
766e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	enum filter_exp_type	type;
767e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct filter_arg	*left;
768e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct filter_arg	*right;
769e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
770e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
771e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct filter_arg_num {
772e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	enum filter_cmp_type	type;
773e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct filter_arg	*left;
774e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct filter_arg	*right;
775e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
776e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
777e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct filter_arg_str {
778e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	enum filter_cmp_type	type;
779e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct format_field	*field;
780e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	char			*val;
781e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	char			*buffer;
782e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	regex_t			reg;
783e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
784e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
785e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct filter_arg {
786e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	enum filter_arg_type	type;
787e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	union {
788e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		struct filter_arg_boolean	boolean;
789e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		struct filter_arg_field		field;
790e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		struct filter_arg_value		value;
791e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		struct filter_arg_op		op;
792e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		struct filter_arg_exp		exp;
793e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		struct filter_arg_num		num;
794e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		struct filter_arg_str		str;
795e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	};
796e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
797e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
798e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct filter_type {
799e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int			event_id;
800e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct event_format	*event;
801e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct filter_arg	*filter;
802e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
803e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
804e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct event_filter {
805e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct pevent		*pevent;
806e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int			filters;
807e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct filter_type	*event_filters;
808e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
809e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
810e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct event_filter *pevent_filter_alloc(struct pevent *pevent);
811e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
812e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define FILTER_NONE		-2
813e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define FILTER_NOEXIST		-1
814e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define FILTER_MISS		0
815e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define FILTER_MATCH		1
816e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
817e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengenum filter_trivial_type {
818e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	FILTER_TRIVIAL_FALSE,
819e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	FILTER_TRIVIAL_TRUE,
820e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	FILTER_TRIVIAL_BOTH,
821e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
822e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
823e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint pevent_filter_add_filter_str(struct event_filter *filter,
824e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				 const char *filter_str,
825e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				 char **error_str);
826e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
827e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
828e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint pevent_filter_match(struct event_filter *filter,
829e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			struct pevent_record *record);
830e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
831e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint pevent_event_filtered(struct event_filter *filter,
832e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			  int event_id);
833e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
834e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid pevent_filter_reset(struct event_filter *filter);
835e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
836e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid pevent_filter_clear_trivial(struct event_filter *filter,
837e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				 enum filter_trivial_type type);
838e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
839e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid pevent_filter_free(struct event_filter *filter);
840e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
841e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengchar *pevent_filter_make_string(struct event_filter *filter, int event_id);
842e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
843e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint pevent_filter_remove_event(struct event_filter *filter,
844e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			       int event_id);
845e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
846e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint pevent_filter_event_has_trivial(struct event_filter *filter,
847e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				    int event_id,
848e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				    enum filter_trivial_type type);
849e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
850e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint pevent_filter_copy(struct event_filter *dest, struct event_filter *source);
851e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
852e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint pevent_update_trivial(struct event_filter *dest, struct event_filter *source,
853e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			  enum filter_trivial_type type);
854e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
855e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint pevent_filter_compare(struct event_filter *filter1, struct event_filter *filter2);
856e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
857e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#endif /* _PARSE_EVENTS_H */
858