2012-04-06 00:47:53 +02:00
/*
* 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
2012-09-07 16:32:46 -04:00
* License along with this program ; if not , see < http : //www.gnu.org/licenses>
2012-04-06 00:47:53 +02:00
*
* ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
*/
# ifndef _PARSE_EVENTS_H
# define _PARSE_EVENTS_H
2013-11-01 17:53:53 -04:00
# include <stdbool.h>
2012-04-06 00:47:53 +02:00
# include <stdarg.h>
2015-02-03 12:44:09 -03:00
# include <stdio.h>
2012-04-06 00:47:53 +02:00
# include <regex.h>
2013-12-03 14:09:18 +01:00
# include <string.h>
2012-04-06 00:47:53 +02:00
2018-08-28 18:50:38 -04:00
# include "trace-seq.h"
2012-09-11 01:15:03 +03:00
# ifndef __maybe_unused
# define __maybe_unused __attribute__((unused))
2012-04-06 00:47:53 +02:00
# endif
# ifndef DEBUG_RECORD
# define DEBUG_RECORD 0
# endif
2018-08-08 14:02:47 -04:00
struct tep_record {
2012-04-06 00:47:53 +02:00
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 */
2012-08-23 11:22:01 -04:00
void * priv ;
2012-04-06 00:47:53 +02:00
# if DEBUG_RECORD
2018-08-08 14:02:47 -04:00
struct tep_record * prev ;
struct tep_record * next ;
2012-04-06 00:47:53 +02:00
long alloc_addr ;
# endif
} ;
2018-09-19 14:56:44 -04:00
/* ----------------------- tep ----------------------- */
2012-04-06 00:47:53 +02:00
2018-08-08 14:02:46 -04:00
struct tep_handle ;
2018-11-30 10:44:07 -05:00
struct tep_event ;
2012-04-06 00:47:53 +02:00
2018-08-08 14:02:48 -04:00
typedef int ( * tep_event_handler_func ) ( struct trace_seq * s ,
struct tep_record * record ,
2018-11-30 10:44:07 -05:00
struct tep_event * event ,
2018-08-08 14:02:48 -04:00
void * context ) ;
2012-04-06 00:47:53 +02:00
2019-04-01 12:43:17 -04:00
typedef int ( * tep_plugin_load_func ) ( struct tep_handle * tep ) ;
typedef int ( * tep_plugin_unload_func ) ( struct tep_handle * tep ) ;
2012-04-06 00:47:53 +02:00
2018-08-08 14:02:48 -04:00
struct tep_plugin_option {
struct tep_plugin_option * next ;
2012-04-06 00:47:53 +02:00
void * handle ;
char * file ;
char * name ;
char * plugin_alias ;
char * description ;
2015-03-24 09:57:54 -04:00
const char * value ;
2012-08-23 11:22:01 -04:00
void * priv ;
2012-04-06 00:47:53 +02:00
int set ;
} ;
/*
* Plugin hooks that can be called :
*
2018-08-08 14:02:48 -04:00
* TEP_PLUGIN_LOADER : ( required )
2012-04-06 00:47:53 +02:00
* The function name to initialized the plugin .
*
2019-04-01 12:43:17 -04:00
* int TEP_PLUGIN_LOADER ( struct tep_handle * tep )
2012-04-06 00:47:53 +02:00
*
2018-08-08 14:02:48 -04:00
* TEP_PLUGIN_UNLOADER : ( optional )
2012-04-06 00:47:53 +02:00
* The function called just before unloading
*
2019-04-01 12:43:17 -04:00
* int TEP_PLUGIN_UNLOADER ( struct tep_handle * tep )
2012-04-06 00:47:53 +02:00
*
2018-08-08 14:02:48 -04:00
* TEP_PLUGIN_OPTIONS : ( optional )
2012-04-06 00:47:53 +02:00
* Plugin options that can be set before loading
*
2018-08-08 14:02:48 -04:00
* struct tep_plugin_option TEP_PLUGIN_OPTIONS [ ] = {
2012-04-06 00:47:53 +02:00
* {
* . name = " option-name " ,
2017-03-09 16:16:33 -08:00
* . plugin_alias = " override-file-name " , ( optional )
2012-04-06 00:47:53 +02:00
* . 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 .
*
2015-03-24 09:57:54 -04:00
* 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 .
*
2018-08-08 14:02:48 -04:00
* TEP_PLUGIN_ALIAS : ( optional )
2012-04-06 00:47:53 +02:00
* The name to use for finding options ( uses filename if not defined )
*/
2018-08-08 14:02:48 -04:00
# 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
2012-04-06 00:47:53 +02:00
# define _MAKE_STR(x) #x
# define MAKE_STR(x) _MAKE_STR(x)
2018-08-08 14:02:48 -04:00
# 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)
2012-04-06 00:47:53 +02:00
2018-09-19 14:56:46 -04:00
enum tep_format_flags {
TEP_FIELD_IS_ARRAY = 1 ,
TEP_FIELD_IS_POINTER = 2 ,
TEP_FIELD_IS_SIGNED = 4 ,
TEP_FIELD_IS_STRING = 8 ,
TEP_FIELD_IS_DYNAMIC = 16 ,
TEP_FIELD_IS_LONG = 32 ,
TEP_FIELD_IS_FLAG = 64 ,
TEP_FIELD_IS_SYMBOLIC = 128 ,
2012-04-06 00:47:53 +02:00
} ;
2018-09-19 14:56:45 -04:00
struct tep_format_field {
struct tep_format_field * next ;
2018-11-30 10:44:07 -05:00
struct tep_event * event ;
2012-04-06 00:47:53 +02:00
char * type ;
char * name ;
2015-04-18 17:50:18 +02:00
char * alias ;
2012-04-06 00:47:53 +02:00
int offset ;
int size ;
unsigned int arraylen ;
unsigned int elementsize ;
unsigned long flags ;
} ;
2018-09-19 14:56:45 -04:00
struct tep_format {
2012-04-06 00:47:53 +02:00
int nr_common ;
int nr_fields ;
2018-09-19 14:56:45 -04:00
struct tep_format_field * common_fields ;
struct tep_format_field * fields ;
2012-04-06 00:47:53 +02:00
} ;
2018-09-19 14:56:49 -04:00
struct tep_print_arg_atom {
2012-04-06 00:47:53 +02:00
char * atom ;
} ;
2018-09-19 14:56:49 -04:00
struct tep_print_arg_string {
2012-04-06 00:47:53 +02:00
char * string ;
int offset ;
} ;
2018-09-19 14:56:49 -04:00
struct tep_print_arg_bitmask {
2014-06-02 23:20:16 -04:00
char * bitmask ;
int offset ;
} ;
2018-09-19 14:56:49 -04:00
struct tep_print_arg_field {
2012-04-06 00:47:53 +02:00
char * name ;
2018-09-19 14:56:45 -04:00
struct tep_format_field * field ;
2012-04-06 00:47:53 +02:00
} ;
2018-09-19 14:56:49 -04:00
struct tep_print_flag_sym {
struct tep_print_flag_sym * next ;
char * value ;
char * str ;
2012-04-06 00:47:53 +02:00
} ;
2018-09-19 14:56:49 -04:00
struct tep_print_arg_typecast {
2012-04-06 00:47:53 +02:00
char * type ;
2018-09-19 14:56:49 -04:00
struct tep_print_arg * item ;
2012-04-06 00:47:53 +02:00
} ;
2018-09-19 14:56:49 -04:00
struct tep_print_arg_flags {
struct tep_print_arg * field ;
char * delim ;
struct tep_print_flag_sym * flags ;
2012-04-06 00:47:53 +02:00
} ;
2018-09-19 14:56:49 -04:00
struct tep_print_arg_symbol {
struct tep_print_arg * field ;
struct tep_print_flag_sym * symbols ;
2012-04-06 00:47:53 +02:00
} ;
2018-09-19 14:56:49 -04:00
struct tep_print_arg_hex {
struct tep_print_arg * field ;
struct tep_print_arg * size ;
2012-06-27 09:41:41 +09:00
} ;
2018-09-19 14:56:49 -04:00
struct tep_print_arg_int_array {
struct tep_print_arg * field ;
struct tep_print_arg * count ;
struct tep_print_arg * el_size ;
2015-03-24 11:07:19 +00:00
} ;
2018-09-19 14:56:49 -04:00
struct tep_print_arg_dynarray {
2018-09-19 14:56:45 -04:00
struct tep_format_field * field ;
2018-09-19 14:56:49 -04:00
struct tep_print_arg * index ;
2012-04-06 00:47:53 +02:00
} ;
2018-09-19 14:56:49 -04:00
struct tep_print_arg ;
2012-04-06 00:47:53 +02:00
2018-09-19 14:56:49 -04:00
struct tep_print_arg_op {
2012-04-06 00:47:53 +02:00
char * op ;
int prio ;
2018-09-19 14:56:49 -04:00
struct tep_print_arg * left ;
struct tep_print_arg * right ;
2012-04-06 00:47:53 +02:00
} ;
tools lib traceevent: Rename pevent_function* APIs
In order to make libtraceevent into a proper library, variables, data
structures and functions require a unique prefix to prevent name space
conflicts. That prefix will be "tep_" and not "pevent_". This changes
APIs: pevent_function_handler, pevent_func_handler,
pevent_func_arg_type, PEVENT_FUNC_ARG_VOID, PEVENT_FUNC_ARG_INT,
PEVENT_FUNC_ARG_LONG, PEVENT_FUNC_ARG_STRING, PEVENT_FUNC_ARG_PTRS,
PEVENT_FUNC_ARG_MAX_TYPES
Signed-off-by: Tzvetomir Stoyanov (VMware) <tz.stoyanov@gmail.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Yordan Karadzhov (VMware) <y.karadz@gmail.com>
Cc: linux-trace-devel@vger.kernel.org
Link: http://lkml.kernel.org/r/20180808180701.935881193@goodmis.org
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2018-08-08 14:02:59 -04:00
struct tep_function_handler ;
2012-04-06 00:47:53 +02:00
2018-09-19 14:56:49 -04:00
struct tep_print_arg_func {
tools lib traceevent: Rename pevent_function* APIs
In order to make libtraceevent into a proper library, variables, data
structures and functions require a unique prefix to prevent name space
conflicts. That prefix will be "tep_" and not "pevent_". This changes
APIs: pevent_function_handler, pevent_func_handler,
pevent_func_arg_type, PEVENT_FUNC_ARG_VOID, PEVENT_FUNC_ARG_INT,
PEVENT_FUNC_ARG_LONG, PEVENT_FUNC_ARG_STRING, PEVENT_FUNC_ARG_PTRS,
PEVENT_FUNC_ARG_MAX_TYPES
Signed-off-by: Tzvetomir Stoyanov (VMware) <tz.stoyanov@gmail.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Yordan Karadzhov (VMware) <y.karadz@gmail.com>
Cc: linux-trace-devel@vger.kernel.org
Link: http://lkml.kernel.org/r/20180808180701.935881193@goodmis.org
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2018-08-08 14:02:59 -04:00
struct tep_function_handler * func ;
2018-09-19 14:56:49 -04:00
struct tep_print_arg * args ;
2012-04-06 00:47:53 +02:00
} ;
2018-09-19 14:56:50 -04:00
enum tep_print_arg_type {
TEP_PRINT_NULL ,
TEP_PRINT_ATOM ,
TEP_PRINT_FIELD ,
TEP_PRINT_FLAGS ,
TEP_PRINT_SYMBOL ,
TEP_PRINT_HEX ,
TEP_PRINT_INT_ARRAY ,
TEP_PRINT_TYPE ,
TEP_PRINT_STRING ,
TEP_PRINT_BSTRING ,
TEP_PRINT_DYNAMIC_ARRAY ,
TEP_PRINT_OP ,
TEP_PRINT_FUNC ,
TEP_PRINT_BITMASK ,
TEP_PRINT_DYNAMIC_ARRAY_LEN ,
TEP_PRINT_HEX_STR ,
2012-04-06 00:47:53 +02:00
} ;
2018-09-19 14:56:49 -04:00
struct tep_print_arg {
struct tep_print_arg * next ;
2018-09-19 14:56:50 -04:00
enum tep_print_arg_type type ;
2012-04-06 00:47:53 +02:00
union {
2018-09-19 14:56:49 -04:00
struct tep_print_arg_atom atom ;
struct tep_print_arg_field field ;
struct tep_print_arg_typecast typecast ;
struct tep_print_arg_flags flags ;
struct tep_print_arg_symbol symbol ;
struct tep_print_arg_hex hex ;
struct tep_print_arg_int_array int_array ;
struct tep_print_arg_func func ;
struct tep_print_arg_string string ;
struct tep_print_arg_bitmask bitmask ;
struct tep_print_arg_op op ;
struct tep_print_arg_dynarray dynarray ;
2012-04-06 00:47:53 +02:00
} ;
} ;
2018-09-19 14:56:49 -04:00
struct tep_print_fmt {
2012-04-06 00:47:53 +02:00
char * format ;
2018-09-19 14:56:49 -04:00
struct tep_print_arg * args ;
2012-04-06 00:47:53 +02:00
} ;
2018-11-30 10:44:07 -05:00
struct tep_event {
2019-04-01 12:43:18 -04:00
struct tep_handle * tep ;
2012-04-06 00:47:53 +02:00
char * name ;
int id ;
int flags ;
2018-09-19 14:56:45 -04:00
struct tep_format format ;
2018-09-19 14:56:49 -04:00
struct tep_print_fmt print_fmt ;
2012-04-06 00:47:53 +02:00
char * system ;
2018-08-08 14:02:48 -04:00
tep_event_handler_func handler ;
2012-04-06 00:47:53 +02:00
void * context ;
} ;
enum {
2018-09-19 14:56:48 -04:00
TEP_EVENT_FL_ISFTRACE = 0x01 ,
TEP_EVENT_FL_ISPRINT = 0x02 ,
TEP_EVENT_FL_ISBPRINT = 0x04 ,
TEP_EVENT_FL_ISFUNCENT = 0x10 ,
TEP_EVENT_FL_ISFUNCRET = 0x20 ,
TEP_EVENT_FL_NOHANDLE = 0x40 ,
TEP_EVENT_FL_PRINTRAW = 0x80 ,
TEP_EVENT_FL_FAILED = 0x80000000
2012-04-06 00:47:53 +02:00
} ;
2018-09-19 14:56:47 -04:00
enum tep_event_sort_type {
TEP_EVENT_SORT_ID ,
TEP_EVENT_SORT_NAME ,
TEP_EVENT_SORT_SYSTEM ,
2012-04-06 00:47:53 +02:00
} ;
2018-09-19 14:56:47 -04:00
enum tep_event_type {
TEP_EVENT_ERROR ,
TEP_EVENT_NONE ,
TEP_EVENT_SPACE ,
TEP_EVENT_NEWLINE ,
TEP_EVENT_OP ,
TEP_EVENT_DELIM ,
TEP_EVENT_ITEM ,
TEP_EVENT_DQUOTE ,
TEP_EVENT_SQUOTE ,
2012-04-06 00:47:53 +02:00
} ;
tools lib traceevent: Rename pevent_function* APIs
In order to make libtraceevent into a proper library, variables, data
structures and functions require a unique prefix to prevent name space
conflicts. That prefix will be "tep_" and not "pevent_". This changes
APIs: pevent_function_handler, pevent_func_handler,
pevent_func_arg_type, PEVENT_FUNC_ARG_VOID, PEVENT_FUNC_ARG_INT,
PEVENT_FUNC_ARG_LONG, PEVENT_FUNC_ARG_STRING, PEVENT_FUNC_ARG_PTRS,
PEVENT_FUNC_ARG_MAX_TYPES
Signed-off-by: Tzvetomir Stoyanov (VMware) <tz.stoyanov@gmail.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Yordan Karadzhov (VMware) <y.karadz@gmail.com>
Cc: linux-trace-devel@vger.kernel.org
Link: http://lkml.kernel.org/r/20180808180701.935881193@goodmis.org
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2018-08-08 14:02:59 -04:00
typedef unsigned long long ( * tep_func_handler ) ( struct trace_seq * s ,
unsigned long long * args ) ;
2012-04-06 00:47:53 +02:00
tools lib traceevent: Rename pevent_function* APIs
In order to make libtraceevent into a proper library, variables, data
structures and functions require a unique prefix to prevent name space
conflicts. That prefix will be "tep_" and not "pevent_". This changes
APIs: pevent_function_handler, pevent_func_handler,
pevent_func_arg_type, PEVENT_FUNC_ARG_VOID, PEVENT_FUNC_ARG_INT,
PEVENT_FUNC_ARG_LONG, PEVENT_FUNC_ARG_STRING, PEVENT_FUNC_ARG_PTRS,
PEVENT_FUNC_ARG_MAX_TYPES
Signed-off-by: Tzvetomir Stoyanov (VMware) <tz.stoyanov@gmail.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Yordan Karadzhov (VMware) <y.karadz@gmail.com>
Cc: linux-trace-devel@vger.kernel.org
Link: http://lkml.kernel.org/r/20180808180701.935881193@goodmis.org
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2018-08-08 14:02:59 -04:00
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
2012-04-06 00:47:53 +02:00
} ;
2018-08-08 14:02:57 -04:00
enum tep_flag {
TEP_NSEC_OUTPUT = 1 , /* output in NSECS */
TEP_DISABLE_SYS_PLUGINS = 1 < < 1 ,
TEP_DISABLE_PLUGINS = 1 < < 2 ,
2012-04-06 00:47:57 +02:00
} ;
2018-08-08 14:02:58 -04:00
# define TEP_ERRORS \
2012-08-22 16:00:30 +09:00
_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 " ) , \
2012-09-07 11:49:47 +09:00
_PE ( OLD_FTRACE_ARG_FAILED , " failed to allocate field name for ftrace " ) , \
2013-12-12 16:36:08 +09:00
_PE ( INVALID_ARG_TYPE , " invalid argument type " ) , \
2013-12-12 16:36:15 +09:00
_PE ( INVALID_EXP_TYPE , " invalid expression type " ) , \
_PE ( INVALID_OP_TYPE , " invalid operator type " ) , \
2013-12-12 16:36:08 +09:00
_PE ( INVALID_EVENT_NAME , " invalid event name " ) , \
2013-12-12 16:36:09 +09:00
_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 " ) , \
2013-12-12 16:36:11 +09:00
_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 " ) , \
2013-12-12 16:36:12 +09:00
_PE ( BAD_FILTER_ARG , " bad arg in filter tree " ) , \
2013-12-12 16:36:13 +09:00
_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 " ) , \
2013-12-12 16:36:14 +09:00
_PE ( UNKNOWN_TOKEN , " unknown token " ) , \
2013-12-12 16:36:15 +09:00
_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 " )
2012-08-22 16:00:30 +09:00
# undef _PE
2018-08-08 14:02:58 -04:00
# define _PE(__code, __str) TEP_ERRNO__ ## __code
enum tep_errno {
TEP_ERRNO__SUCCESS = 0 ,
TEP_ERRNO__FILTER_MATCH = TEP_ERRNO__SUCCESS ,
2012-08-22 16:00:29 +09:00
/*
* 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
*/
2018-08-08 14:02:58 -04:00
__TEP_ERRNO__START = - 100000 ,
2012-08-22 16:00:29 +09:00
2018-08-08 14:02:58 -04:00
TEP_ERRORS ,
2012-08-22 16:00:29 +09:00
2018-08-08 14:02:58 -04:00
__TEP_ERRNO__END ,
2012-08-22 16:00:29 +09:00
} ;
2012-08-22 16:00:30 +09:00
# undef _PE
2012-08-22 16:00:29 +09:00
2018-09-19 14:56:56 -04:00
struct tep_plugin_list ;
2013-12-03 14:09:16 +01:00
2014-06-03 18:41:54 -04:00
# define INVALID_PLUGIN_LIST_OPTION ((char **)((unsigned long)-1))
2019-04-01 12:43:17 -04:00
struct tep_plugin_list * tep_load_plugins ( struct tep_handle * tep ) ;
2018-09-19 14:56:56 -04:00
void tep_unload_plugins ( struct tep_plugin_list * plugin_list ,
2019-04-01 12:43:17 -04:00
struct tep_handle * tep ) ;
2018-08-08 14:03:00 -04:00
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 ,
2018-09-19 14:56:56 -04:00
const struct tep_plugin_list * list ) ;
2013-12-03 14:09:16 +01:00
2018-10-05 12:22:25 -04:00
/* tep_handle */
2018-08-08 14:02:49 -04:00
typedef char * ( tep_func_resolver_t ) ( void * priv ,
unsigned long long * addrp , char * * modp ) ;
2018-10-05 12:22:25 -04:00
void tep_set_flag ( struct tep_handle * tep , int flag ) ;
2019-04-01 12:43:12 -04:00
void tep_clear_flag ( struct tep_handle * tep , enum tep_flag flag ) ;
2019-04-01 12:43:17 -04:00
bool tep_test_flag ( struct tep_handle * tep , enum tep_flag flags ) ;
2012-04-06 00:47:53 +02:00
2019-04-01 12:43:16 -04:00
static inline int tep_is_bigendian ( void )
2013-12-03 14:09:18 +01:00
{
unsigned char str [ ] = { 0x1 , 0x2 , 0x3 , 0x4 } ;
unsigned int val ;
memcpy ( & val , str , 4 ) ;
return val = = 0x01020304 ;
}
2012-04-06 00:47:53 +02:00
/* 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 ,
} ;
2019-04-01 12:43:17 -04:00
int tep_set_function_resolver ( struct tep_handle * tep ,
2018-08-08 14:02:55 -04:00
tep_func_resolver_t * func , void * priv ) ;
2019-04-01 12:43:17 -04:00
void tep_reset_function_resolver ( struct tep_handle * tep ) ;
int tep_register_comm ( struct tep_handle * tep , const char * comm , int pid ) ;
int tep_override_comm ( struct tep_handle * tep , const char * comm , int pid ) ;
int tep_register_function ( struct tep_handle * tep , char * name ,
2018-08-08 14:03:02 -04:00
unsigned long long addr , char * mod ) ;
2019-04-01 12:43:17 -04:00
int tep_register_print_string ( struct tep_handle * tep , const char * fmt ,
2018-08-08 14:02:54 -04:00
unsigned long long addr ) ;
2019-04-01 12:43:17 -04:00
bool tep_is_pid_registered ( struct tep_handle * tep , int pid ) ;
2012-04-06 00:47:53 +02:00
2019-09-19 17:23:39 -04:00
struct tep_event * tep_get_event ( struct tep_handle * tep , int index ) ;
libtraceevent, perf tools: Changes in tep_print_event_* APIs
Libtraceevent APIs for printing various trace events information are
complicated, there are complex extra parameters. To control the way
event information is printed, the user should call a set of functions in
a specific sequence.
These APIs are reimplemented to provide a more simple interface for
printing event information.
Removed APIs:
tep_print_event_task()
tep_print_event_time()
tep_print_event_data()
tep_event_info()
tep_is_latency_format()
tep_set_latency_format()
tep_data_latency_format()
tep_set_print_raw()
A new API for printing event information is introduced:
void tep_print_event(struct tep_handle *tep, struct trace_seq *s,
struct tep_record *record, const char *fmt, ...);
where "fmt" is a printf-like format string, followed by the event
fields to be printed. Supported fields:
TEP_PRINT_PID, "%d" - event PID
TEP_PRINT_CPU, "%d" - event CPU
TEP_PRINT_COMM, "%s" - event command string
TEP_PRINT_NAME, "%s" - event name
TEP_PRINT_LATENCY, "%s" - event latency
TEP_PRINT_TIME, %d - event time stamp. A divisor and precision
can be specified as part of this format string:
"%precision.divisord". Example:
"%3.1000d" - divide the time by 1000 and print the first 3 digits
before the dot. Thus, the time stamp "123456000" will be printed as
"123.456"
TEP_PRINT_INFO, "%s" - event information.
TEP_PRINT_INFO_RAW, "%s" - event information, in raw format.
Example:
tep_print_event(tep, s, record, "%16s-%-5d [%03d] %s %6.1000d %s %s",
TEP_PRINT_COMM, TEP_PRINT_PID, TEP_PRINT_CPU,
TEP_PRINT_LATENCY, TEP_PRINT_TIME, TEP_PRINT_NAME, TEP_PRINT_INFO);
Output:
ls-11314 [005] d.h. 185207.366383 function __wake_up
Signed-off-by: Tzvetomir Stoyanov <tstoyanov@vmware.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: linux-trace-devel@vger.kernel.org
Cc: Patrick McLean <chutzpah@gentoo.org>
Link: http://lore.kernel.org/linux-trace-devel/20190801074959.22023-2-tz.stoyanov@gmail.com
Link: http://lore.kernel.org/lkml/20190805204355.041132030@goodmis.org
Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2019-08-05 16:43:13 -04:00
# define TEP_PRINT_INFO "INFO"
# define TEP_PRINT_INFO_RAW "INFO_RAW"
# define TEP_PRINT_COMM "COMM"
# define TEP_PRINT_LATENCY "LATENCY"
# define TEP_PRINT_NAME "NAME"
# define TEP_PRINT_PID 1U
# define TEP_PRINT_TIME 2U
# define TEP_PRINT_CPU 3U
2019-04-01 12:43:17 -04:00
void tep_print_event ( struct tep_handle * tep , struct trace_seq * s ,
libtraceevent, perf tools: Changes in tep_print_event_* APIs
Libtraceevent APIs for printing various trace events information are
complicated, there are complex extra parameters. To control the way
event information is printed, the user should call a set of functions in
a specific sequence.
These APIs are reimplemented to provide a more simple interface for
printing event information.
Removed APIs:
tep_print_event_task()
tep_print_event_time()
tep_print_event_data()
tep_event_info()
tep_is_latency_format()
tep_set_latency_format()
tep_data_latency_format()
tep_set_print_raw()
A new API for printing event information is introduced:
void tep_print_event(struct tep_handle *tep, struct trace_seq *s,
struct tep_record *record, const char *fmt, ...);
where "fmt" is a printf-like format string, followed by the event
fields to be printed. Supported fields:
TEP_PRINT_PID, "%d" - event PID
TEP_PRINT_CPU, "%d" - event CPU
TEP_PRINT_COMM, "%s" - event command string
TEP_PRINT_NAME, "%s" - event name
TEP_PRINT_LATENCY, "%s" - event latency
TEP_PRINT_TIME, %d - event time stamp. A divisor and precision
can be specified as part of this format string:
"%precision.divisord". Example:
"%3.1000d" - divide the time by 1000 and print the first 3 digits
before the dot. Thus, the time stamp "123456000" will be printed as
"123.456"
TEP_PRINT_INFO, "%s" - event information.
TEP_PRINT_INFO_RAW, "%s" - event information, in raw format.
Example:
tep_print_event(tep, s, record, "%16s-%-5d [%03d] %s %6.1000d %s %s",
TEP_PRINT_COMM, TEP_PRINT_PID, TEP_PRINT_CPU,
TEP_PRINT_LATENCY, TEP_PRINT_TIME, TEP_PRINT_NAME, TEP_PRINT_INFO);
Output:
ls-11314 [005] d.h. 185207.366383 function __wake_up
Signed-off-by: Tzvetomir Stoyanov <tstoyanov@vmware.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: linux-trace-devel@vger.kernel.org
Cc: Patrick McLean <chutzpah@gentoo.org>
Link: http://lore.kernel.org/linux-trace-devel/20190801074959.22023-2-tz.stoyanov@gmail.com
Link: http://lore.kernel.org/lkml/20190805204355.041132030@goodmis.org
Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2019-08-05 16:43:13 -04:00
struct tep_record * record , const char * fmt , . . . )
__attribute__ ( ( format ( printf , 4 , 5 ) ) ) ;
2012-04-06 00:47:53 +02:00
2019-04-01 12:43:17 -04:00
int tep_parse_header_page ( struct tep_handle * tep , char * buf , unsigned long size ,
2018-08-08 14:02:51 -04:00
int long_size ) ;
2019-04-01 12:43:17 -04:00
enum tep_errno tep_parse_event ( struct tep_handle * tep , const char * buf ,
2018-08-08 14:02:58 -04:00
unsigned long size , const char * sys ) ;
2019-04-01 12:43:17 -04:00
enum tep_errno tep_parse_format ( struct tep_handle * tep ,
2018-11-30 10:44:07 -05:00
struct tep_event * * eventp ,
2018-08-08 14:02:58 -04:00
const char * buf ,
unsigned long size , const char * sys ) ;
2018-08-08 14:03:04 -04:00
2018-11-30 10:44:07 -05:00
void * tep_get_field_raw ( struct trace_seq * s , struct tep_event * event ,
2018-08-08 14:03:04 -04:00
const char * name , struct tep_record * record ,
int * len , int err ) ;
2018-11-30 10:44:07 -05:00
int tep_get_field_val ( struct trace_seq * s , struct tep_event * event ,
2018-08-08 14:03:04 -04:00
const char * name , struct tep_record * record ,
unsigned long long * val , int err ) ;
2018-11-30 10:44:07 -05:00
int tep_get_common_field_val ( struct trace_seq * s , struct tep_event * event ,
2018-08-08 14:02:47 -04:00
const char * name , struct tep_record * record ,
2012-04-06 00:47:53 +02:00
unsigned long long * val , int err ) ;
2018-11-30 10:44:07 -05:00
int tep_get_any_field_val ( struct trace_seq * s , struct tep_event * event ,
2018-08-08 14:03:04 -04:00
const char * name , struct tep_record * record ,
unsigned long long * val , int err ) ;
2012-04-06 00:47:53 +02:00
2018-08-08 14:02:52 -04:00
int tep_print_num_field ( struct trace_seq * s , const char * fmt ,
2018-11-30 10:44:07 -05:00
struct tep_event * event , const char * name ,
2018-09-19 14:56:44 -04:00
struct tep_record * record , int err ) ;
2012-04-06 00:47:53 +02:00
2018-08-08 14:02:52 -04:00
int tep_print_func_field ( struct trace_seq * s , const char * fmt ,
2018-11-30 10:44:07 -05:00
struct tep_event * event , const char * name ,
2018-08-08 14:02:52 -04:00
struct tep_record * record , int err ) ;
2013-11-01 17:54:00 -04:00
2018-11-30 23:08:11 -05:00
enum tep_reg_handler {
TEP_REGISTER_SUCCESS = 0 ,
TEP_REGISTER_SUCCESS_OVERWRITE ,
} ;
2019-04-01 12:43:17 -04:00
int tep_register_event_handler ( struct tep_handle * tep , int id ,
2018-08-08 14:03:02 -04:00
const char * sys_name , const char * event_name ,
tep_event_handler_func func , void * context ) ;
2019-04-01 12:43:17 -04:00
int tep_unregister_event_handler ( struct tep_handle * tep , int id ,
2018-08-08 14:03:02 -04:00
const char * sys_name , const char * event_name ,
tep_event_handler_func func , void * context ) ;
2019-04-01 12:43:17 -04:00
int tep_register_print_function ( struct tep_handle * tep ,
2018-08-08 14:03:02 -04:00
tep_func_handler func ,
enum tep_func_arg_type ret_type ,
char * name , . . . ) ;
2019-04-01 12:43:17 -04:00
int tep_unregister_print_function ( struct tep_handle * tep ,
2018-08-08 14:03:02 -04:00
tep_func_handler func , char * name ) ;
2012-04-06 00:47:53 +02:00
2018-11-30 10:44:07 -05:00
struct tep_format_field * tep_find_common_field ( struct tep_event * event , const char * name ) ;
struct tep_format_field * tep_find_field ( struct tep_event * event , const char * name ) ;
struct tep_format_field * tep_find_any_field ( struct tep_event * event , const char * name ) ;
2012-04-06 00:47:53 +02:00
2019-04-01 12:43:17 -04:00
const char * tep_find_function ( struct tep_handle * tep , unsigned long long addr ) ;
2012-04-06 00:47:53 +02:00
unsigned long long
2019-04-01 12:43:17 -04:00
tep_find_function_address ( struct tep_handle * tep , unsigned long long addr ) ;
unsigned long long tep_read_number ( struct tep_handle * tep , const void * ptr , int size ) ;
2018-09-19 14:56:45 -04:00
int tep_read_number_field ( struct tep_format_field * field , const void * data ,
2018-08-08 14:02:53 -04:00
unsigned long long * value ) ;
2012-04-06 00:47:53 +02:00
2018-11-30 10:44:07 -05:00
struct tep_event * tep_get_first_event ( struct tep_handle * tep ) ;
2018-10-05 12:22:25 -04:00
int tep_get_events_count ( struct tep_handle * tep ) ;
2019-04-01 12:43:17 -04:00
struct tep_event * tep_find_event ( struct tep_handle * tep , int id ) ;
2012-04-06 00:47:53 +02:00
2018-11-30 10:44:07 -05:00
struct tep_event *
2019-04-01 12:43:17 -04:00
tep_find_event_by_name ( struct tep_handle * tep , const char * sys , const char * name ) ;
2018-11-30 10:44:07 -05:00
struct tep_event *
2019-04-01 12:43:17 -04:00
tep_find_event_by_record ( struct tep_handle * tep , struct tep_record * record ) ;
2016-02-29 09:01:28 -05:00
2019-04-01 12:43:17 -04:00
int tep_data_type ( struct tep_handle * tep , struct tep_record * rec ) ;
int tep_data_pid ( struct tep_handle * tep , struct tep_record * rec ) ;
int tep_data_preempt_count ( struct tep_handle * tep , struct tep_record * rec ) ;
int tep_data_flags ( struct tep_handle * tep , struct tep_record * rec ) ;
const char * tep_data_comm_from_pid ( struct tep_handle * tep , int pid ) ;
2018-11-30 23:08:09 -05:00
struct tep_cmdline ;
2019-04-01 12:43:17 -04:00
struct tep_cmdline * tep_data_pid_from_comm ( struct tep_handle * tep , const char * comm ,
2018-11-30 23:08:09 -05:00
struct tep_cmdline * next ) ;
2019-04-01 12:43:17 -04:00
int tep_cmdline_pid ( struct tep_handle * tep , struct tep_cmdline * cmdline ) ;
2015-03-24 09:57:52 -04:00
2018-08-08 14:02:52 -04:00
void tep_print_field ( struct trace_seq * s , void * data ,
2018-09-19 14:56:45 -04:00
struct tep_format_field * field ) ;
2018-08-08 14:02:52 -04:00
void tep_print_fields ( struct trace_seq * s , void * data ,
2018-11-30 10:44:07 -05:00
int size __maybe_unused , struct tep_event * event ) ;
2019-04-01 12:43:17 -04:00
int tep_strerror ( struct tep_handle * tep , enum tep_errno errnum ,
2018-11-30 10:44:07 -05:00
char * buf , size_t buflen ) ;
2012-04-06 00:47:53 +02:00
2019-04-01 12:43:17 -04:00
struct tep_event * * tep_list_events ( struct tep_handle * tep , enum tep_event_sort_type ) ;
2019-04-01 12:43:08 -04:00
struct tep_event * * tep_list_events_copy ( struct tep_handle * tep ,
enum tep_event_sort_type ) ;
2018-11-30 10:44:07 -05:00
struct tep_format_field * * tep_event_common_fields ( struct tep_event * event ) ;
struct tep_format_field * * tep_event_fields ( struct tep_event * event ) ;
2012-04-06 00:47:53 +02:00
2018-10-05 12:22:25 -04:00
enum tep_endian {
TEP_LITTLE_ENDIAN = 0 ,
TEP_BIG_ENDIAN
} ;
2019-04-01 12:43:17 -04:00
int tep_get_cpus ( struct tep_handle * tep ) ;
void tep_set_cpus ( struct tep_handle * tep , int cpus ) ;
int tep_get_long_size ( struct tep_handle * tep ) ;
void tep_set_long_size ( struct tep_handle * tep , int long_size ) ;
int tep_get_page_size ( struct tep_handle * tep ) ;
void tep_set_page_size ( struct tep_handle * tep , int _page_size ) ;
bool tep_is_file_bigendian ( struct tep_handle * tep ) ;
void tep_set_file_bigendian ( struct tep_handle * tep , enum tep_endian endian ) ;
bool tep_is_local_bigendian ( struct tep_handle * tep ) ;
void tep_set_local_bigendian ( struct tep_handle * tep , enum tep_endian endian ) ;
int tep_get_header_page_size ( struct tep_handle * tep ) ;
2019-04-01 12:43:12 -04:00
int tep_get_header_timestamp_size ( struct tep_handle * tep ) ;
bool tep_is_old_format ( struct tep_handle * tep ) ;
void tep_set_test_filters ( struct tep_handle * tep , int test_filters ) ;
2012-04-06 00:47:53 +02:00
2018-08-08 14:02:49 -04:00
struct tep_handle * tep_alloc ( void ) ;
2019-04-01 12:43:17 -04:00
void tep_free ( struct tep_handle * tep ) ;
void tep_ref ( struct tep_handle * tep ) ;
void tep_unref ( struct tep_handle * tep ) ;
2018-11-30 10:44:04 -05:00
int tep_get_ref ( struct tep_handle * tep ) ;
2012-04-06 00:47:53 +02:00
/* access to the internal parser */
2018-08-08 14:03:07 -04:00
void tep_buffer_init ( const char * buf , unsigned long long size ) ;
2018-09-19 14:56:47 -04:00
enum tep_event_type tep_read_token ( char * * tok ) ;
2018-08-08 14:03:07 -04:00
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 ) ;
2012-04-06 00:47:53 +02:00
/* for debugging */
2019-04-01 12:43:17 -04:00
void tep_print_funcs ( struct tep_handle * tep ) ;
void tep_print_printk ( struct tep_handle * tep ) ;
2012-04-06 00:47:53 +02:00
/* ----------------------- filtering ----------------------- */
2018-09-19 14:56:51 -04:00
enum tep_filter_boolean_type {
TEP_FILTER_FALSE ,
TEP_FILTER_TRUE ,
2012-04-06 00:47:53 +02:00
} ;
2018-09-19 14:56:51 -04:00
enum tep_filter_op_type {
TEP_FILTER_OP_AND = 1 ,
TEP_FILTER_OP_OR ,
TEP_FILTER_OP_NOT ,
2012-04-06 00:47:53 +02:00
} ;
2018-09-19 14:56:51 -04:00
enum tep_filter_cmp_type {
TEP_FILTER_CMP_NONE ,
TEP_FILTER_CMP_EQ ,
TEP_FILTER_CMP_NE ,
TEP_FILTER_CMP_GT ,
TEP_FILTER_CMP_LT ,
TEP_FILTER_CMP_GE ,
TEP_FILTER_CMP_LE ,
TEP_FILTER_CMP_MATCH ,
TEP_FILTER_CMP_NOT_MATCH ,
TEP_FILTER_CMP_REGEX ,
TEP_FILTER_CMP_NOT_REGEX ,
2012-04-06 00:47:53 +02:00
} ;
2018-09-19 14:56:52 -04:00
enum tep_filter_exp_type {
TEP_FILTER_EXP_NONE ,
TEP_FILTER_EXP_ADD ,
TEP_FILTER_EXP_SUB ,
TEP_FILTER_EXP_MUL ,
TEP_FILTER_EXP_DIV ,
TEP_FILTER_EXP_MOD ,
TEP_FILTER_EXP_RSHIFT ,
TEP_FILTER_EXP_LSHIFT ,
TEP_FILTER_EXP_AND ,
TEP_FILTER_EXP_OR ,
TEP_FILTER_EXP_XOR ,
TEP_FILTER_EXP_NOT ,
} ;
enum tep_filter_arg_type {
TEP_FILTER_ARG_NONE ,
TEP_FILTER_ARG_BOOLEAN ,
TEP_FILTER_ARG_VALUE ,
TEP_FILTER_ARG_FIELD ,
TEP_FILTER_ARG_EXP ,
TEP_FILTER_ARG_OP ,
TEP_FILTER_ARG_NUM ,
TEP_FILTER_ARG_STR ,
2012-04-06 00:47:53 +02:00
} ;
2018-09-19 14:56:53 -04:00
enum tep_filter_value_type {
TEP_FILTER_NUMBER ,
TEP_FILTER_STRING ,
TEP_FILTER_CHAR
2012-04-06 00:47:53 +02:00
} ;
2018-09-19 14:56:53 -04:00
struct tep_filter_arg ;
2012-04-06 00:47:53 +02:00
2018-09-19 14:56:54 -04:00
struct tep_filter_arg_boolean {
2018-09-19 14:56:51 -04:00
enum tep_filter_boolean_type value ;
2012-04-06 00:47:53 +02:00
} ;
2018-09-19 14:56:54 -04:00
struct tep_filter_arg_field {
struct tep_format_field * field ;
2012-04-06 00:47:53 +02:00
} ;
2018-09-19 14:56:54 -04:00
struct tep_filter_arg_value {
2018-09-19 14:56:53 -04:00
enum tep_filter_value_type type ;
2012-04-06 00:47:53 +02:00
union {
char * str ;
unsigned long long val ;
} ;
} ;
2018-09-19 14:56:54 -04:00
struct tep_filter_arg_op {
enum tep_filter_op_type type ;
struct tep_filter_arg * left ;
struct tep_filter_arg * right ;
2012-04-06 00:47:53 +02:00
} ;
2018-09-19 14:56:54 -04:00
struct tep_filter_arg_exp {
2018-09-19 14:56:52 -04:00
enum tep_filter_exp_type type ;
2018-09-19 14:56:53 -04:00
struct tep_filter_arg * left ;
struct tep_filter_arg * right ;
2012-04-06 00:47:53 +02:00
} ;
2018-09-19 14:56:54 -04:00
struct tep_filter_arg_num {
2018-09-19 14:56:51 -04:00
enum tep_filter_cmp_type type ;
2018-09-19 14:56:54 -04:00
struct tep_filter_arg * left ;
struct tep_filter_arg * right ;
2012-04-06 00:47:53 +02:00
} ;
2018-09-19 14:56:54 -04:00
struct tep_filter_arg_str {
2018-09-19 14:56:51 -04:00
enum tep_filter_cmp_type type ;
2018-09-19 14:56:54 -04:00
struct tep_format_field * field ;
char * val ;
char * buffer ;
regex_t reg ;
2012-04-06 00:47:53 +02:00
} ;
2018-09-19 14:56:53 -04:00
struct tep_filter_arg {
2018-09-19 14:56:52 -04:00
enum tep_filter_arg_type type ;
2012-04-06 00:47:53 +02:00
union {
2018-09-19 14:56:54 -04:00
struct tep_filter_arg_boolean boolean ;
struct tep_filter_arg_field field ;
struct tep_filter_arg_value value ;
struct tep_filter_arg_op op ;
struct tep_filter_arg_exp exp ;
struct tep_filter_arg_num num ;
struct tep_filter_arg_str str ;
2012-04-06 00:47:53 +02:00
} ;
} ;
2018-09-19 14:56:55 -04:00
struct tep_filter_type {
2012-04-06 00:47:53 +02:00
int event_id ;
2018-11-30 10:44:07 -05:00
struct tep_event * event ;
2018-09-19 14:56:53 -04:00
struct tep_filter_arg * filter ;
2012-04-06 00:47:53 +02:00
} ;
tools lib traceevent: Rename pevent_filter* APIs
In order to make libtraceevent into a proper library, variables, data
structures and functions require a unique prefix to prevent name space
conflicts. That prefix will be "tep_" and not "pevent_". This changes
APIs: PEVENT_FILTER_ERROR_BUFSZ, pevent_filter_alloc,
pevent_filter_add_filter_str, pevent_filter_match, pevent_filter_strerror,
pevent_event_filtered, pevent_filter_reset, pevent_filter_clear_trivial,
pevent_filter_free, pevent_filter_make_string, pevent_filter_remove_event,
pevent_filter_event_has_trivial, pevent_filter_copy, pevent_update_trivial,
pevent_filter_compare
Signed-off-by: Tzvetomir Stoyanov (VMware) <tz.stoyanov@gmail.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Yordan Karadzhov (VMware) <y.karadz@gmail.com>
Cc: linux-trace-devel@vger.kernel.org
Link: http://lkml.kernel.org/r/20180808180702.370659353@goodmis.org
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2018-08-08 14:03:01 -04:00
# define TEP_FILTER_ERROR_BUFSZ 1024
2013-12-12 16:36:17 +09:00
2018-09-19 14:56:55 -04:00
struct tep_event_filter {
2019-04-01 12:43:19 -04:00
struct tep_handle * tep ;
2012-04-06 00:47:53 +02:00
int filters ;
2018-09-19 14:56:55 -04:00
struct tep_filter_type * event_filters ;
tools lib traceevent: Rename pevent_filter* APIs
In order to make libtraceevent into a proper library, variables, data
structures and functions require a unique prefix to prevent name space
conflicts. That prefix will be "tep_" and not "pevent_". This changes
APIs: PEVENT_FILTER_ERROR_BUFSZ, pevent_filter_alloc,
pevent_filter_add_filter_str, pevent_filter_match, pevent_filter_strerror,
pevent_event_filtered, pevent_filter_reset, pevent_filter_clear_trivial,
pevent_filter_free, pevent_filter_make_string, pevent_filter_remove_event,
pevent_filter_event_has_trivial, pevent_filter_copy, pevent_update_trivial,
pevent_filter_compare
Signed-off-by: Tzvetomir Stoyanov (VMware) <tz.stoyanov@gmail.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Yordan Karadzhov (VMware) <y.karadz@gmail.com>
Cc: linux-trace-devel@vger.kernel.org
Link: http://lkml.kernel.org/r/20180808180702.370659353@goodmis.org
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2018-08-08 14:03:01 -04:00
char error_buffer [ TEP_FILTER_ERROR_BUFSZ ] ;
2012-04-06 00:47:53 +02:00
} ;
2019-04-01 12:43:17 -04:00
struct tep_event_filter * tep_filter_alloc ( struct tep_handle * tep ) ;
2012-04-06 00:47:53 +02:00
2013-12-12 16:36:15 +09:00
/* for backward compatibility */
2018-08-08 14:02:58 -04:00
# 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
2012-04-06 00:47:53 +02:00
2018-09-19 14:56:55 -04:00
enum tep_errno tep_filter_add_filter_str ( struct tep_event_filter * filter ,
tools lib traceevent: Rename pevent_filter* APIs
In order to make libtraceevent into a proper library, variables, data
structures and functions require a unique prefix to prevent name space
conflicts. That prefix will be "tep_" and not "pevent_". This changes
APIs: PEVENT_FILTER_ERROR_BUFSZ, pevent_filter_alloc,
pevent_filter_add_filter_str, pevent_filter_match, pevent_filter_strerror,
pevent_event_filtered, pevent_filter_reset, pevent_filter_clear_trivial,
pevent_filter_free, pevent_filter_make_string, pevent_filter_remove_event,
pevent_filter_event_has_trivial, pevent_filter_copy, pevent_update_trivial,
pevent_filter_compare
Signed-off-by: Tzvetomir Stoyanov (VMware) <tz.stoyanov@gmail.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Yordan Karadzhov (VMware) <y.karadz@gmail.com>
Cc: linux-trace-devel@vger.kernel.org
Link: http://lkml.kernel.org/r/20180808180702.370659353@goodmis.org
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2018-08-08 14:03:01 -04:00
const char * filter_str ) ;
2012-04-06 00:47:53 +02:00
2018-09-19 14:56:55 -04:00
enum tep_errno tep_filter_match ( struct tep_event_filter * filter ,
tools lib traceevent: Rename pevent_filter* APIs
In order to make libtraceevent into a proper library, variables, data
structures and functions require a unique prefix to prevent name space
conflicts. That prefix will be "tep_" and not "pevent_". This changes
APIs: PEVENT_FILTER_ERROR_BUFSZ, pevent_filter_alloc,
pevent_filter_add_filter_str, pevent_filter_match, pevent_filter_strerror,
pevent_event_filtered, pevent_filter_reset, pevent_filter_clear_trivial,
pevent_filter_free, pevent_filter_make_string, pevent_filter_remove_event,
pevent_filter_event_has_trivial, pevent_filter_copy, pevent_update_trivial,
pevent_filter_compare
Signed-off-by: Tzvetomir Stoyanov (VMware) <tz.stoyanov@gmail.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Yordan Karadzhov (VMware) <y.karadz@gmail.com>
Cc: linux-trace-devel@vger.kernel.org
Link: http://lkml.kernel.org/r/20180808180702.370659353@goodmis.org
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2018-08-08 14:03:01 -04:00
struct tep_record * record ) ;
2012-04-06 00:47:53 +02:00
2018-09-19 14:56:55 -04:00
int tep_filter_strerror ( struct tep_event_filter * filter , enum tep_errno err ,
tools lib traceevent: Rename pevent_filter* APIs
In order to make libtraceevent into a proper library, variables, data
structures and functions require a unique prefix to prevent name space
conflicts. That prefix will be "tep_" and not "pevent_". This changes
APIs: PEVENT_FILTER_ERROR_BUFSZ, pevent_filter_alloc,
pevent_filter_add_filter_str, pevent_filter_match, pevent_filter_strerror,
pevent_event_filtered, pevent_filter_reset, pevent_filter_clear_trivial,
pevent_filter_free, pevent_filter_make_string, pevent_filter_remove_event,
pevent_filter_event_has_trivial, pevent_filter_copy, pevent_update_trivial,
pevent_filter_compare
Signed-off-by: Tzvetomir Stoyanov (VMware) <tz.stoyanov@gmail.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Yordan Karadzhov (VMware) <y.karadz@gmail.com>
Cc: linux-trace-devel@vger.kernel.org
Link: http://lkml.kernel.org/r/20180808180702.370659353@goodmis.org
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2018-08-08 14:03:01 -04:00
char * buf , size_t buflen ) ;
2013-12-12 16:36:17 +09:00
2018-09-19 14:56:55 -04:00
int tep_event_filtered ( struct tep_event_filter * filter ,
tools lib traceevent: Rename pevent_filter* APIs
In order to make libtraceevent into a proper library, variables, data
structures and functions require a unique prefix to prevent name space
conflicts. That prefix will be "tep_" and not "pevent_". This changes
APIs: PEVENT_FILTER_ERROR_BUFSZ, pevent_filter_alloc,
pevent_filter_add_filter_str, pevent_filter_match, pevent_filter_strerror,
pevent_event_filtered, pevent_filter_reset, pevent_filter_clear_trivial,
pevent_filter_free, pevent_filter_make_string, pevent_filter_remove_event,
pevent_filter_event_has_trivial, pevent_filter_copy, pevent_update_trivial,
pevent_filter_compare
Signed-off-by: Tzvetomir Stoyanov (VMware) <tz.stoyanov@gmail.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Yordan Karadzhov (VMware) <y.karadz@gmail.com>
Cc: linux-trace-devel@vger.kernel.org
Link: http://lkml.kernel.org/r/20180808180702.370659353@goodmis.org
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2018-08-08 14:03:01 -04:00
int event_id ) ;
2012-04-06 00:47:53 +02:00
2018-09-19 14:56:55 -04:00
void tep_filter_reset ( struct tep_event_filter * filter ) ;
2012-04-06 00:47:53 +02:00
2018-09-19 14:56:55 -04:00
void tep_filter_free ( struct tep_event_filter * filter ) ;
2012-04-06 00:47:53 +02:00
2018-09-19 14:56:55 -04:00
char * tep_filter_make_string ( struct tep_event_filter * filter , int event_id ) ;
2012-04-06 00:47:53 +02:00
2018-09-19 14:56:55 -04:00
int tep_filter_remove_event ( struct tep_event_filter * filter ,
tools lib traceevent: Rename pevent_filter* APIs
In order to make libtraceevent into a proper library, variables, data
structures and functions require a unique prefix to prevent name space
conflicts. That prefix will be "tep_" and not "pevent_". This changes
APIs: PEVENT_FILTER_ERROR_BUFSZ, pevent_filter_alloc,
pevent_filter_add_filter_str, pevent_filter_match, pevent_filter_strerror,
pevent_event_filtered, pevent_filter_reset, pevent_filter_clear_trivial,
pevent_filter_free, pevent_filter_make_string, pevent_filter_remove_event,
pevent_filter_event_has_trivial, pevent_filter_copy, pevent_update_trivial,
pevent_filter_compare
Signed-off-by: Tzvetomir Stoyanov (VMware) <tz.stoyanov@gmail.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Yordan Karadzhov (VMware) <y.karadz@gmail.com>
Cc: linux-trace-devel@vger.kernel.org
Link: http://lkml.kernel.org/r/20180808180702.370659353@goodmis.org
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2018-08-08 14:03:01 -04:00
int event_id ) ;
2012-04-06 00:47:53 +02:00
2018-09-19 14:56:55 -04:00
int tep_filter_copy ( struct tep_event_filter * dest , struct tep_event_filter * source ) ;
2012-04-06 00:47:53 +02:00
2018-09-19 14:56:55 -04:00
int tep_filter_compare ( struct tep_event_filter * filter1 , struct tep_event_filter * filter2 ) ;
2012-04-06 00:47:53 +02:00
# endif /* _PARSE_EVENTS_H */