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