perf/core improvements and fixes:
Hardware tracing: intel-pt: . Previously, the decoder would indicate begin / end by a branch from / to zero. That hides useful information, in particular when a trace ends with a call. Remove that limitation. (Adrian Hunter) . Better "callindent" output in 'perf script', improving intel-PT output (Andi Kleen) Arch specific: . Split the PMU events into meaningful functional groups for the ARM eMAG arch (Sean V Kelley) Fixes: perf help: . Add missing subcommand `version` (Sangwon Hong) Miscellaneous: - More patches renaming of structs, enums, functions to make libbtraceevent more generally available (Tzvetomir Stoyanov (VMware)) Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> -----BEGIN PGP SIGNATURE----- iHUEABYIAB0WIQR2GiIUctdOfX2qHhGyPKLppCJ+JwUCW6j28gAKCRCyPKLppCJ+ J6YtAQD4DDX3cawKg5gYUk5wpRFjpmKBSVzy0FBG4vwEGvXb3AD+K0JXjNpclXuj GPqUHlY6l2yNKNWo/qHAsZz/RHLaPgw= =JSjC -----END PGP SIGNATURE----- Merge tag 'perf-core-for-mingo-4.20-20180924' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/core Pull perf/core improvements and fixes from Arnaldo Carvalho de Melo: Hardware tracing changes: intel-pt: - Previously, the decoder would indicate begin / end by a branch from / to zero. That hides useful information, in particular when a trace ends with a call. Remove that limitation. (Adrian Hunter) - Better "callindent" output in 'perf script', improving intel-PT output (Andi Kleen) Arch specific changes: - Split the PMU events into meaningful functional groups for the ARM eMAG arch (Sean V Kelley) Fixes: perf help: - Add missing subcommand `version` (Sangwon Hong) Miscellaneous: - More patches renaming of structs, enums, functions to make libbtraceevent more generally available (Tzvetomir Stoyanov (VMware)) Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
commit
c90d3bd1b9
|
@ -23,6 +23,13 @@ void pager_init(const char *pager_env)
|
|||
subcmd_config.pager_env = pager_env;
|
||||
}
|
||||
|
||||
static const char *forced_pager;
|
||||
|
||||
void force_pager(const char *pager)
|
||||
{
|
||||
forced_pager = pager;
|
||||
}
|
||||
|
||||
static void pager_preexec(void)
|
||||
{
|
||||
/*
|
||||
|
@ -66,7 +73,9 @@ void setup_pager(void)
|
|||
const char *pager = getenv(subcmd_config.pager_env);
|
||||
struct winsize sz;
|
||||
|
||||
if (!isatty(1))
|
||||
if (forced_pager)
|
||||
pager = forced_pager;
|
||||
if (!isatty(1) && !forced_pager)
|
||||
return;
|
||||
if (ioctl(1, TIOCGWINSZ, &sz) == 0)
|
||||
pager_columns = sz.ws_col;
|
||||
|
|
|
@ -7,5 +7,6 @@ extern void pager_init(const char *pager_env);
|
|||
extern void setup_pager(void);
|
||||
extern int pager_in_use(void);
|
||||
extern int pager_get_columns(void);
|
||||
extern void force_pager(const char *);
|
||||
|
||||
#endif /* __SUBCMD_PAGER_H */
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -54,14 +54,14 @@ struct tep_record {
|
|||
#endif
|
||||
};
|
||||
|
||||
/* ----------------------- pevent ----------------------- */
|
||||
/* ----------------------- tep ----------------------- */
|
||||
|
||||
struct tep_handle;
|
||||
struct event_format;
|
||||
struct tep_event_format;
|
||||
|
||||
typedef int (*tep_event_handler_func)(struct trace_seq *s,
|
||||
struct tep_record *record,
|
||||
struct event_format *event,
|
||||
struct tep_event_format *event,
|
||||
void *context);
|
||||
|
||||
typedef int (*tep_plugin_load_func)(struct tep_handle *pevent);
|
||||
|
@ -130,20 +130,20 @@ struct tep_plugin_option {
|
|||
#define TEP_PLUGIN_OPTIONS_NAME MAKE_STR(TEP_PLUGIN_OPTIONS)
|
||||
#define TEP_PLUGIN_ALIAS_NAME MAKE_STR(TEP_PLUGIN_ALIAS)
|
||||
|
||||
enum format_flags {
|
||||
FIELD_IS_ARRAY = 1,
|
||||
FIELD_IS_POINTER = 2,
|
||||
FIELD_IS_SIGNED = 4,
|
||||
FIELD_IS_STRING = 8,
|
||||
FIELD_IS_DYNAMIC = 16,
|
||||
FIELD_IS_LONG = 32,
|
||||
FIELD_IS_FLAG = 64,
|
||||
FIELD_IS_SYMBOLIC = 128,
|
||||
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,
|
||||
};
|
||||
|
||||
struct format_field {
|
||||
struct format_field *next;
|
||||
struct event_format *event;
|
||||
struct tep_format_field {
|
||||
struct tep_format_field *next;
|
||||
struct tep_event_format *event;
|
||||
char *type;
|
||||
char *name;
|
||||
char *alias;
|
||||
|
@ -154,169 +154,169 @@ struct format_field {
|
|||
unsigned long flags;
|
||||
};
|
||||
|
||||
struct format {
|
||||
struct tep_format {
|
||||
int nr_common;
|
||||
int nr_fields;
|
||||
struct format_field *common_fields;
|
||||
struct format_field *fields;
|
||||
struct tep_format_field *common_fields;
|
||||
struct tep_format_field *fields;
|
||||
};
|
||||
|
||||
struct print_arg_atom {
|
||||
struct tep_print_arg_atom {
|
||||
char *atom;
|
||||
};
|
||||
|
||||
struct print_arg_string {
|
||||
struct tep_print_arg_string {
|
||||
char *string;
|
||||
int offset;
|
||||
};
|
||||
|
||||
struct print_arg_bitmask {
|
||||
struct tep_print_arg_bitmask {
|
||||
char *bitmask;
|
||||
int offset;
|
||||
};
|
||||
|
||||
struct print_arg_field {
|
||||
struct tep_print_arg_field {
|
||||
char *name;
|
||||
struct format_field *field;
|
||||
struct tep_format_field *field;
|
||||
};
|
||||
|
||||
struct print_flag_sym {
|
||||
struct print_flag_sym *next;
|
||||
char *value;
|
||||
char *str;
|
||||
struct tep_print_flag_sym {
|
||||
struct tep_print_flag_sym *next;
|
||||
char *value;
|
||||
char *str;
|
||||
};
|
||||
|
||||
struct print_arg_typecast {
|
||||
struct tep_print_arg_typecast {
|
||||
char *type;
|
||||
struct print_arg *item;
|
||||
struct tep_print_arg *item;
|
||||
};
|
||||
|
||||
struct print_arg_flags {
|
||||
struct print_arg *field;
|
||||
char *delim;
|
||||
struct print_flag_sym *flags;
|
||||
struct tep_print_arg_flags {
|
||||
struct tep_print_arg *field;
|
||||
char *delim;
|
||||
struct tep_print_flag_sym *flags;
|
||||
};
|
||||
|
||||
struct print_arg_symbol {
|
||||
struct print_arg *field;
|
||||
struct print_flag_sym *symbols;
|
||||
struct tep_print_arg_symbol {
|
||||
struct tep_print_arg *field;
|
||||
struct tep_print_flag_sym *symbols;
|
||||
};
|
||||
|
||||
struct print_arg_hex {
|
||||
struct print_arg *field;
|
||||
struct print_arg *size;
|
||||
struct tep_print_arg_hex {
|
||||
struct tep_print_arg *field;
|
||||
struct tep_print_arg *size;
|
||||
};
|
||||
|
||||
struct print_arg_int_array {
|
||||
struct print_arg *field;
|
||||
struct print_arg *count;
|
||||
struct print_arg *el_size;
|
||||
struct tep_print_arg_int_array {
|
||||
struct tep_print_arg *field;
|
||||
struct tep_print_arg *count;
|
||||
struct tep_print_arg *el_size;
|
||||
};
|
||||
|
||||
struct print_arg_dynarray {
|
||||
struct format_field *field;
|
||||
struct print_arg *index;
|
||||
struct tep_print_arg_dynarray {
|
||||
struct tep_format_field *field;
|
||||
struct tep_print_arg *index;
|
||||
};
|
||||
|
||||
struct print_arg;
|
||||
struct tep_print_arg;
|
||||
|
||||
struct print_arg_op {
|
||||
struct tep_print_arg_op {
|
||||
char *op;
|
||||
int prio;
|
||||
struct print_arg *left;
|
||||
struct print_arg *right;
|
||||
struct tep_print_arg *left;
|
||||
struct tep_print_arg *right;
|
||||
};
|
||||
|
||||
struct tep_function_handler;
|
||||
|
||||
struct print_arg_func {
|
||||
struct tep_print_arg_func {
|
||||
struct tep_function_handler *func;
|
||||
struct print_arg *args;
|
||||
struct tep_print_arg *args;
|
||||
};
|
||||
|
||||
enum print_arg_type {
|
||||
PRINT_NULL,
|
||||
PRINT_ATOM,
|
||||
PRINT_FIELD,
|
||||
PRINT_FLAGS,
|
||||
PRINT_SYMBOL,
|
||||
PRINT_HEX,
|
||||
PRINT_INT_ARRAY,
|
||||
PRINT_TYPE,
|
||||
PRINT_STRING,
|
||||
PRINT_BSTRING,
|
||||
PRINT_DYNAMIC_ARRAY,
|
||||
PRINT_OP,
|
||||
PRINT_FUNC,
|
||||
PRINT_BITMASK,
|
||||
PRINT_DYNAMIC_ARRAY_LEN,
|
||||
PRINT_HEX_STR,
|
||||
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,
|
||||
};
|
||||
|
||||
struct print_arg {
|
||||
struct print_arg *next;
|
||||
enum print_arg_type type;
|
||||
struct tep_print_arg {
|
||||
struct tep_print_arg *next;
|
||||
enum tep_print_arg_type type;
|
||||
union {
|
||||
struct print_arg_atom atom;
|
||||
struct print_arg_field field;
|
||||
struct print_arg_typecast typecast;
|
||||
struct print_arg_flags flags;
|
||||
struct print_arg_symbol symbol;
|
||||
struct print_arg_hex hex;
|
||||
struct print_arg_int_array int_array;
|
||||
struct print_arg_func func;
|
||||
struct print_arg_string string;
|
||||
struct print_arg_bitmask bitmask;
|
||||
struct print_arg_op op;
|
||||
struct print_arg_dynarray dynarray;
|
||||
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;
|
||||
};
|
||||
};
|
||||
|
||||
struct print_fmt {
|
||||
struct tep_print_fmt {
|
||||
char *format;
|
||||
struct print_arg *args;
|
||||
struct tep_print_arg *args;
|
||||
};
|
||||
|
||||
struct event_format {
|
||||
struct tep_event_format {
|
||||
struct tep_handle *pevent;
|
||||
char *name;
|
||||
int id;
|
||||
int flags;
|
||||
struct format format;
|
||||
struct print_fmt print_fmt;
|
||||
struct tep_format format;
|
||||
struct tep_print_fmt print_fmt;
|
||||
char *system;
|
||||
tep_event_handler_func handler;
|
||||
void *context;
|
||||
};
|
||||
|
||||
enum {
|
||||
EVENT_FL_ISFTRACE = 0x01,
|
||||
EVENT_FL_ISPRINT = 0x02,
|
||||
EVENT_FL_ISBPRINT = 0x04,
|
||||
EVENT_FL_ISFUNCENT = 0x10,
|
||||
EVENT_FL_ISFUNCRET = 0x20,
|
||||
EVENT_FL_NOHANDLE = 0x40,
|
||||
EVENT_FL_PRINTRAW = 0x80,
|
||||
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,
|
||||
|
||||
EVENT_FL_FAILED = 0x80000000
|
||||
TEP_EVENT_FL_FAILED = 0x80000000
|
||||
};
|
||||
|
||||
enum event_sort_type {
|
||||
EVENT_SORT_ID,
|
||||
EVENT_SORT_NAME,
|
||||
EVENT_SORT_SYSTEM,
|
||||
enum tep_event_sort_type {
|
||||
TEP_EVENT_SORT_ID,
|
||||
TEP_EVENT_SORT_NAME,
|
||||
TEP_EVENT_SORT_SYSTEM,
|
||||
};
|
||||
|
||||
enum event_type {
|
||||
EVENT_ERROR,
|
||||
EVENT_NONE,
|
||||
EVENT_SPACE,
|
||||
EVENT_NEWLINE,
|
||||
EVENT_OP,
|
||||
EVENT_DELIM,
|
||||
EVENT_ITEM,
|
||||
EVENT_DQUOTE,
|
||||
EVENT_SQUOTE,
|
||||
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,
|
||||
};
|
||||
|
||||
typedef unsigned long long (*tep_func_handler)(struct trace_seq *s,
|
||||
|
@ -389,12 +389,12 @@ enum tep_errno {
|
|||
};
|
||||
#undef _PE
|
||||
|
||||
struct plugin_list;
|
||||
struct tep_plugin_list;
|
||||
|
||||
#define INVALID_PLUGIN_LIST_OPTION ((char **)((unsigned long)-1))
|
||||
|
||||
struct plugin_list *tep_load_plugins(struct tep_handle *pevent);
|
||||
void tep_unload_plugins(struct plugin_list *plugin_list,
|
||||
struct tep_plugin_list *tep_load_plugins(struct tep_handle *pevent);
|
||||
void tep_unload_plugins(struct tep_plugin_list *plugin_list,
|
||||
struct tep_handle *pevent);
|
||||
char **tep_plugin_list_options(void);
|
||||
void tep_plugin_free_options_list(char **list);
|
||||
|
@ -403,7 +403,7 @@ int tep_plugin_add_options(const char *name,
|
|||
void tep_plugin_remove_options(struct tep_plugin_option *options);
|
||||
void tep_print_plugins(struct trace_seq *s,
|
||||
const char *prefix, const char *suffix,
|
||||
const struct plugin_list *list);
|
||||
const struct tep_plugin_list *list);
|
||||
|
||||
struct cmdline;
|
||||
struct cmdline_list;
|
||||
|
@ -451,10 +451,10 @@ struct tep_handle {
|
|||
unsigned int printk_count;
|
||||
|
||||
|
||||
struct event_format **events;
|
||||
struct tep_event_format **events;
|
||||
int nr_events;
|
||||
struct event_format **sort_events;
|
||||
enum event_sort_type last_type;
|
||||
struct tep_event_format **sort_events;
|
||||
enum tep_event_sort_type last_type;
|
||||
|
||||
int type_offset;
|
||||
int type_size;
|
||||
|
@ -477,15 +477,15 @@ struct tep_handle {
|
|||
|
||||
int flags;
|
||||
|
||||
struct format_field *bprint_ip_field;
|
||||
struct format_field *bprint_fmt_field;
|
||||
struct format_field *bprint_buf_field;
|
||||
struct tep_format_field *bprint_ip_field;
|
||||
struct tep_format_field *bprint_fmt_field;
|
||||
struct tep_format_field *bprint_buf_field;
|
||||
|
||||
struct event_handler *handlers;
|
||||
struct tep_function_handler *func_handlers;
|
||||
|
||||
/* cache */
|
||||
struct event_format *last_event;
|
||||
struct tep_event_format *last_event;
|
||||
|
||||
char *trace_clock;
|
||||
};
|
||||
|
@ -496,7 +496,7 @@ static inline void tep_set_flag(struct tep_handle *pevent, int flag)
|
|||
}
|
||||
|
||||
static inline unsigned short
|
||||
__data2host2(struct tep_handle *pevent, unsigned short data)
|
||||
__tep_data2host2(struct tep_handle *pevent, unsigned short data)
|
||||
{
|
||||
unsigned short swap;
|
||||
|
||||
|
@ -510,7 +510,7 @@ __data2host2(struct tep_handle *pevent, unsigned short data)
|
|||
}
|
||||
|
||||
static inline unsigned int
|
||||
__data2host4(struct tep_handle *pevent, unsigned int data)
|
||||
__tep_data2host4(struct tep_handle *pevent, unsigned int data)
|
||||
{
|
||||
unsigned int swap;
|
||||
|
||||
|
@ -526,7 +526,7 @@ __data2host4(struct tep_handle *pevent, unsigned int data)
|
|||
}
|
||||
|
||||
static inline unsigned long long
|
||||
__data2host8(struct tep_handle *pevent, unsigned long long data)
|
||||
__tep_data2host8(struct tep_handle *pevent, unsigned long long data)
|
||||
{
|
||||
unsigned long long swap;
|
||||
|
||||
|
@ -545,14 +545,14 @@ __data2host8(struct tep_handle *pevent, unsigned long long data)
|
|||
return swap;
|
||||
}
|
||||
|
||||
#define data2host2(pevent, ptr) __data2host2(pevent, *(unsigned short *)(ptr))
|
||||
#define data2host4(pevent, ptr) __data2host4(pevent, *(unsigned int *)(ptr))
|
||||
#define data2host8(pevent, ptr) \
|
||||
#define tep_data2host2(pevent, ptr) __tep_data2host2(pevent, *(unsigned short *)(ptr))
|
||||
#define tep_data2host4(pevent, ptr) __tep_data2host4(pevent, *(unsigned int *)(ptr))
|
||||
#define tep_data2host8(pevent, ptr) \
|
||||
({ \
|
||||
unsigned long long __val; \
|
||||
\
|
||||
memcpy(&__val, (ptr), sizeof(unsigned long long)); \
|
||||
__data2host8(pevent, __val); \
|
||||
__tep_data2host8(pevent, __val); \
|
||||
})
|
||||
|
||||
static inline int tep_host_bigendian(void)
|
||||
|
@ -585,14 +585,14 @@ int tep_register_print_string(struct tep_handle *pevent, const char *fmt,
|
|||
int tep_pid_is_registered(struct tep_handle *pevent, int pid);
|
||||
|
||||
void tep_print_event_task(struct tep_handle *pevent, struct trace_seq *s,
|
||||
struct event_format *event,
|
||||
struct tep_event_format *event,
|
||||
struct tep_record *record);
|
||||
void tep_print_event_time(struct tep_handle *pevent, struct trace_seq *s,
|
||||
struct event_format *event,
|
||||
struct tep_event_format *event,
|
||||
struct tep_record *record,
|
||||
bool use_trace_clock);
|
||||
void tep_print_event_data(struct tep_handle *pevent, struct trace_seq *s,
|
||||
struct event_format *event,
|
||||
struct tep_event_format *event,
|
||||
struct tep_record *record);
|
||||
void tep_print_event(struct tep_handle *pevent, struct trace_seq *s,
|
||||
struct tep_record *record, bool use_trace_clock);
|
||||
|
@ -603,32 +603,32 @@ int tep_parse_header_page(struct tep_handle *pevent, char *buf, unsigned long si
|
|||
enum tep_errno tep_parse_event(struct tep_handle *pevent, const char *buf,
|
||||
unsigned long size, const char *sys);
|
||||
enum tep_errno tep_parse_format(struct tep_handle *pevent,
|
||||
struct event_format **eventp,
|
||||
struct tep_event_format **eventp,
|
||||
const char *buf,
|
||||
unsigned long size, const char *sys);
|
||||
void tep_free_format(struct event_format *event);
|
||||
void tep_free_format_field(struct format_field *field);
|
||||
void tep_free_format(struct tep_event_format *event);
|
||||
void tep_free_format_field(struct tep_format_field *field);
|
||||
|
||||
void *tep_get_field_raw(struct trace_seq *s, struct event_format *event,
|
||||
void *tep_get_field_raw(struct trace_seq *s, struct tep_event_format *event,
|
||||
const char *name, struct tep_record *record,
|
||||
int *len, int err);
|
||||
|
||||
int tep_get_field_val(struct trace_seq *s, struct event_format *event,
|
||||
int tep_get_field_val(struct trace_seq *s, struct tep_event_format *event,
|
||||
const char *name, struct tep_record *record,
|
||||
unsigned long long *val, int err);
|
||||
int tep_get_common_field_val(struct trace_seq *s, struct event_format *event,
|
||||
int tep_get_common_field_val(struct trace_seq *s, struct tep_event_format *event,
|
||||
const char *name, struct tep_record *record,
|
||||
unsigned long long *val, int err);
|
||||
int tep_get_any_field_val(struct trace_seq *s, struct event_format *event,
|
||||
int tep_get_any_field_val(struct trace_seq *s, struct tep_event_format *event,
|
||||
const char *name, struct tep_record *record,
|
||||
unsigned long long *val, int err);
|
||||
|
||||
int tep_print_num_field(struct trace_seq *s, const char *fmt,
|
||||
struct event_format *event, const char *name,
|
||||
struct tep_record *record, int err);
|
||||
struct tep_event_format *event, const char *name,
|
||||
struct tep_record *record, int err);
|
||||
|
||||
int tep_print_func_field(struct trace_seq *s, const char *fmt,
|
||||
struct event_format *event, const char *name,
|
||||
struct tep_event_format *event, const char *name,
|
||||
struct tep_record *record, int err);
|
||||
|
||||
int tep_register_event_handler(struct tep_handle *pevent, int id,
|
||||
|
@ -644,29 +644,29 @@ int tep_register_print_function(struct tep_handle *pevent,
|
|||
int tep_unregister_print_function(struct tep_handle *pevent,
|
||||
tep_func_handler func, char *name);
|
||||
|
||||
struct format_field *tep_find_common_field(struct event_format *event, const char *name);
|
||||
struct format_field *tep_find_field(struct event_format *event, const char *name);
|
||||
struct format_field *tep_find_any_field(struct event_format *event, const char *name);
|
||||
struct tep_format_field *tep_find_common_field(struct tep_event_format *event, const char *name);
|
||||
struct tep_format_field *tep_find_field(struct tep_event_format *event, const char *name);
|
||||
struct tep_format_field *tep_find_any_field(struct tep_event_format *event, const char *name);
|
||||
|
||||
const char *tep_find_function(struct tep_handle *pevent, unsigned long long addr);
|
||||
unsigned long long
|
||||
tep_find_function_address(struct tep_handle *pevent, unsigned long long addr);
|
||||
unsigned long long tep_read_number(struct tep_handle *pevent, const void *ptr, int size);
|
||||
int tep_read_number_field(struct format_field *field, const void *data,
|
||||
int tep_read_number_field(struct tep_format_field *field, const void *data,
|
||||
unsigned long long *value);
|
||||
|
||||
struct event_format *tep_find_event(struct tep_handle *pevent, int id);
|
||||
struct tep_event_format *tep_find_event(struct tep_handle *pevent, int id);
|
||||
|
||||
struct event_format *
|
||||
struct tep_event_format *
|
||||
tep_find_event_by_name(struct tep_handle *pevent, const char *sys, const char *name);
|
||||
|
||||
struct event_format *
|
||||
struct tep_event_format *
|
||||
tep_find_event_by_record(struct tep_handle *pevent, struct tep_record *record);
|
||||
|
||||
void tep_data_lat_fmt(struct tep_handle *pevent,
|
||||
struct trace_seq *s, struct tep_record *record);
|
||||
int tep_data_type(struct tep_handle *pevent, struct tep_record *rec);
|
||||
struct event_format *tep_data_event_from_type(struct tep_handle *pevent, int type);
|
||||
struct tep_event_format *tep_data_event_from_type(struct tep_handle *pevent, int type);
|
||||
int tep_data_pid(struct tep_handle *pevent, struct tep_record *rec);
|
||||
int tep_data_preempt_count(struct tep_handle *pevent, struct tep_record *rec);
|
||||
int tep_data_flags(struct tep_handle *pevent, struct tep_record *rec);
|
||||
|
@ -677,17 +677,17 @@ struct cmdline *tep_data_pid_from_comm(struct tep_handle *pevent, const char *co
|
|||
int tep_cmdline_pid(struct tep_handle *pevent, struct cmdline *cmdline);
|
||||
|
||||
void tep_print_field(struct trace_seq *s, void *data,
|
||||
struct format_field *field);
|
||||
struct tep_format_field *field);
|
||||
void tep_print_fields(struct trace_seq *s, void *data,
|
||||
int size __maybe_unused, struct event_format *event);
|
||||
void tep_event_info(struct trace_seq *s, struct event_format *event,
|
||||
int size __maybe_unused, struct tep_event_format *event);
|
||||
void tep_event_info(struct trace_seq *s, struct tep_event_format *event,
|
||||
struct tep_record *record);
|
||||
int tep_strerror(struct tep_handle *pevent, enum tep_errno errnum,
|
||||
char *buf, size_t buflen);
|
||||
|
||||
struct event_format **tep_list_events(struct tep_handle *pevent, enum event_sort_type);
|
||||
struct format_field **tep_event_common_fields(struct event_format *event);
|
||||
struct format_field **tep_event_fields(struct event_format *event);
|
||||
struct tep_event_format **tep_list_events(struct tep_handle *pevent, enum tep_event_sort_type);
|
||||
struct tep_format_field **tep_event_common_fields(struct tep_event_format *event);
|
||||
struct tep_format_field **tep_event_fields(struct tep_event_format *event);
|
||||
|
||||
static inline int tep_get_cpus(struct tep_handle *pevent)
|
||||
{
|
||||
|
@ -756,7 +756,7 @@ void tep_unref(struct tep_handle *pevent);
|
|||
|
||||
/* access to the internal parser */
|
||||
void tep_buffer_init(const char *buf, unsigned long long size);
|
||||
enum event_type tep_read_token(char **tok);
|
||||
enum tep_event_type tep_read_token(char **tok);
|
||||
void tep_free_token(char *token);
|
||||
int tep_peek_char(void);
|
||||
const char *tep_get_input_buf(void);
|
||||
|
@ -768,136 +768,136 @@ void tep_print_printk(struct tep_handle *pevent);
|
|||
|
||||
/* ----------------------- filtering ----------------------- */
|
||||
|
||||
enum filter_boolean_type {
|
||||
FILTER_FALSE,
|
||||
FILTER_TRUE,
|
||||
enum tep_filter_boolean_type {
|
||||
TEP_FILTER_FALSE,
|
||||
TEP_FILTER_TRUE,
|
||||
};
|
||||
|
||||
enum filter_op_type {
|
||||
FILTER_OP_AND = 1,
|
||||
FILTER_OP_OR,
|
||||
FILTER_OP_NOT,
|
||||
enum tep_filter_op_type {
|
||||
TEP_FILTER_OP_AND = 1,
|
||||
TEP_FILTER_OP_OR,
|
||||
TEP_FILTER_OP_NOT,
|
||||
};
|
||||
|
||||
enum filter_cmp_type {
|
||||
FILTER_CMP_NONE,
|
||||
FILTER_CMP_EQ,
|
||||
FILTER_CMP_NE,
|
||||
FILTER_CMP_GT,
|
||||
FILTER_CMP_LT,
|
||||
FILTER_CMP_GE,
|
||||
FILTER_CMP_LE,
|
||||
FILTER_CMP_MATCH,
|
||||
FILTER_CMP_NOT_MATCH,
|
||||
FILTER_CMP_REGEX,
|
||||
FILTER_CMP_NOT_REGEX,
|
||||
enum 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,
|
||||
};
|
||||
|
||||
enum filter_exp_type {
|
||||
FILTER_EXP_NONE,
|
||||
FILTER_EXP_ADD,
|
||||
FILTER_EXP_SUB,
|
||||
FILTER_EXP_MUL,
|
||||
FILTER_EXP_DIV,
|
||||
FILTER_EXP_MOD,
|
||||
FILTER_EXP_RSHIFT,
|
||||
FILTER_EXP_LSHIFT,
|
||||
FILTER_EXP_AND,
|
||||
FILTER_EXP_OR,
|
||||
FILTER_EXP_XOR,
|
||||
FILTER_EXP_NOT,
|
||||
enum 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 filter_arg_type {
|
||||
FILTER_ARG_NONE,
|
||||
FILTER_ARG_BOOLEAN,
|
||||
FILTER_ARG_VALUE,
|
||||
FILTER_ARG_FIELD,
|
||||
FILTER_ARG_EXP,
|
||||
FILTER_ARG_OP,
|
||||
FILTER_ARG_NUM,
|
||||
FILTER_ARG_STR,
|
||||
enum 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,
|
||||
};
|
||||
|
||||
enum filter_value_type {
|
||||
FILTER_NUMBER,
|
||||
FILTER_STRING,
|
||||
FILTER_CHAR
|
||||
enum tep_filter_value_type {
|
||||
TEP_FILTER_NUMBER,
|
||||
TEP_FILTER_STRING,
|
||||
TEP_FILTER_CHAR
|
||||
};
|
||||
|
||||
struct fliter_arg;
|
||||
struct tep_filter_arg;
|
||||
|
||||
struct filter_arg_boolean {
|
||||
enum filter_boolean_type value;
|
||||
struct tep_filter_arg_boolean {
|
||||
enum tep_filter_boolean_type value;
|
||||
};
|
||||
|
||||
struct filter_arg_field {
|
||||
struct format_field *field;
|
||||
struct tep_filter_arg_field {
|
||||
struct tep_format_field *field;
|
||||
};
|
||||
|
||||
struct filter_arg_value {
|
||||
enum filter_value_type type;
|
||||
struct tep_filter_arg_value {
|
||||
enum tep_filter_value_type type;
|
||||
union {
|
||||
char *str;
|
||||
unsigned long long val;
|
||||
};
|
||||
};
|
||||
|
||||
struct filter_arg_op {
|
||||
enum filter_op_type type;
|
||||
struct filter_arg *left;
|
||||
struct filter_arg *right;
|
||||
struct tep_filter_arg_op {
|
||||
enum tep_filter_op_type type;
|
||||
struct tep_filter_arg *left;
|
||||
struct tep_filter_arg *right;
|
||||
};
|
||||
|
||||
struct filter_arg_exp {
|
||||
enum filter_exp_type type;
|
||||
struct filter_arg *left;
|
||||
struct filter_arg *right;
|
||||
struct tep_filter_arg_exp {
|
||||
enum tep_filter_exp_type type;
|
||||
struct tep_filter_arg *left;
|
||||
struct tep_filter_arg *right;
|
||||
};
|
||||
|
||||
struct filter_arg_num {
|
||||
enum filter_cmp_type type;
|
||||
struct filter_arg *left;
|
||||
struct filter_arg *right;
|
||||
struct tep_filter_arg_num {
|
||||
enum tep_filter_cmp_type type;
|
||||
struct tep_filter_arg *left;
|
||||
struct tep_filter_arg *right;
|
||||
};
|
||||
|
||||
struct filter_arg_str {
|
||||
enum filter_cmp_type type;
|
||||
struct format_field *field;
|
||||
char *val;
|
||||
char *buffer;
|
||||
regex_t reg;
|
||||
struct tep_filter_arg_str {
|
||||
enum tep_filter_cmp_type type;
|
||||
struct tep_format_field *field;
|
||||
char *val;
|
||||
char *buffer;
|
||||
regex_t reg;
|
||||
};
|
||||
|
||||
struct filter_arg {
|
||||
enum filter_arg_type type;
|
||||
struct tep_filter_arg {
|
||||
enum tep_filter_arg_type type;
|
||||
union {
|
||||
struct filter_arg_boolean boolean;
|
||||
struct filter_arg_field field;
|
||||
struct filter_arg_value value;
|
||||
struct filter_arg_op op;
|
||||
struct filter_arg_exp exp;
|
||||
struct filter_arg_num num;
|
||||
struct filter_arg_str str;
|
||||
struct 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;
|
||||
};
|
||||
};
|
||||
|
||||
struct filter_type {
|
||||
struct tep_filter_type {
|
||||
int event_id;
|
||||
struct event_format *event;
|
||||
struct filter_arg *filter;
|
||||
struct tep_event_format *event;
|
||||
struct tep_filter_arg *filter;
|
||||
};
|
||||
|
||||
#define TEP_FILTER_ERROR_BUFSZ 1024
|
||||
|
||||
struct event_filter {
|
||||
struct tep_event_filter {
|
||||
struct tep_handle *pevent;
|
||||
int filters;
|
||||
struct filter_type *event_filters;
|
||||
struct tep_filter_type *event_filters;
|
||||
char error_buffer[TEP_FILTER_ERROR_BUFSZ];
|
||||
};
|
||||
|
||||
struct event_filter *tep_filter_alloc(struct tep_handle *pevent);
|
||||
struct tep_event_filter *tep_filter_alloc(struct tep_handle *pevent);
|
||||
|
||||
/* for backward compatibility */
|
||||
#define FILTER_NONE TEP_ERRNO__NO_FILTER
|
||||
|
@ -905,45 +905,45 @@ struct event_filter *tep_filter_alloc(struct tep_handle *pevent);
|
|||
#define FILTER_MISS TEP_ERRNO__FILTER_MISS
|
||||
#define FILTER_MATCH TEP_ERRNO__FILTER_MATCH
|
||||
|
||||
enum filter_trivial_type {
|
||||
FILTER_TRIVIAL_FALSE,
|
||||
FILTER_TRIVIAL_TRUE,
|
||||
FILTER_TRIVIAL_BOTH,
|
||||
enum tep_filter_trivial_type {
|
||||
TEP_FILTER_TRIVIAL_FALSE,
|
||||
TEP_FILTER_TRIVIAL_TRUE,
|
||||
TEP_FILTER_TRIVIAL_BOTH,
|
||||
};
|
||||
|
||||
enum tep_errno tep_filter_add_filter_str(struct event_filter *filter,
|
||||
enum tep_errno tep_filter_add_filter_str(struct tep_event_filter *filter,
|
||||
const char *filter_str);
|
||||
|
||||
enum tep_errno tep_filter_match(struct event_filter *filter,
|
||||
enum tep_errno tep_filter_match(struct tep_event_filter *filter,
|
||||
struct tep_record *record);
|
||||
|
||||
int tep_filter_strerror(struct event_filter *filter, enum tep_errno err,
|
||||
int tep_filter_strerror(struct tep_event_filter *filter, enum tep_errno err,
|
||||
char *buf, size_t buflen);
|
||||
|
||||
int tep_event_filtered(struct event_filter *filter,
|
||||
int tep_event_filtered(struct tep_event_filter *filter,
|
||||
int event_id);
|
||||
|
||||
void tep_filter_reset(struct event_filter *filter);
|
||||
void tep_filter_reset(struct tep_event_filter *filter);
|
||||
|
||||
int tep_filter_clear_trivial(struct event_filter *filter,
|
||||
enum filter_trivial_type type);
|
||||
int tep_filter_clear_trivial(struct tep_event_filter *filter,
|
||||
enum tep_filter_trivial_type type);
|
||||
|
||||
void tep_filter_free(struct event_filter *filter);
|
||||
void tep_filter_free(struct tep_event_filter *filter);
|
||||
|
||||
char *tep_filter_make_string(struct event_filter *filter, int event_id);
|
||||
char *tep_filter_make_string(struct tep_event_filter *filter, int event_id);
|
||||
|
||||
int tep_filter_remove_event(struct event_filter *filter,
|
||||
int tep_filter_remove_event(struct tep_event_filter *filter,
|
||||
int event_id);
|
||||
|
||||
int tep_filter_event_has_trivial(struct event_filter *filter,
|
||||
int tep_filter_event_has_trivial(struct tep_event_filter *filter,
|
||||
int event_id,
|
||||
enum filter_trivial_type type);
|
||||
enum tep_filter_trivial_type type);
|
||||
|
||||
int tep_filter_copy(struct event_filter *dest, struct event_filter *source);
|
||||
int tep_filter_copy(struct tep_event_filter *dest, struct tep_event_filter *source);
|
||||
|
||||
int tep_update_trivial(struct event_filter *dest, struct event_filter *source,
|
||||
enum filter_trivial_type type);
|
||||
int tep_update_trivial(struct tep_event_filter *dest, struct tep_event_filter *source,
|
||||
enum tep_filter_trivial_type type);
|
||||
|
||||
int tep_filter_compare(struct event_filter *filter1, struct event_filter *filter2);
|
||||
int tep_filter_compare(struct tep_event_filter *filter1, struct tep_event_filter *filter2);
|
||||
|
||||
#endif /* _PARSE_EVENTS_H */
|
||||
|
|
|
@ -31,8 +31,8 @@ static struct trace_plugin_options {
|
|||
char *value;
|
||||
} *trace_plugin_options;
|
||||
|
||||
struct plugin_list {
|
||||
struct plugin_list *next;
|
||||
struct tep_plugin_list {
|
||||
struct tep_plugin_list *next;
|
||||
char *name;
|
||||
void *handle;
|
||||
};
|
||||
|
@ -259,7 +259,7 @@ void tep_plugin_remove_options(struct tep_plugin_option *options)
|
|||
*/
|
||||
void tep_print_plugins(struct trace_seq *s,
|
||||
const char *prefix, const char *suffix,
|
||||
const struct plugin_list *list)
|
||||
const struct tep_plugin_list *list)
|
||||
{
|
||||
while (list) {
|
||||
trace_seq_printf(s, "%s%s%s", prefix, list->name, suffix);
|
||||
|
@ -271,9 +271,9 @@ static void
|
|||
load_plugin(struct tep_handle *pevent, const char *path,
|
||||
const char *file, void *data)
|
||||
{
|
||||
struct plugin_list **plugin_list = data;
|
||||
struct tep_plugin_list **plugin_list = data;
|
||||
tep_plugin_load_func func;
|
||||
struct plugin_list *list;
|
||||
struct tep_plugin_list *list;
|
||||
const char *alias;
|
||||
char *plugin;
|
||||
void *handle;
|
||||
|
@ -417,20 +417,20 @@ load_plugins(struct tep_handle *pevent, const char *suffix,
|
|||
free(path);
|
||||
}
|
||||
|
||||
struct plugin_list*
|
||||
struct tep_plugin_list*
|
||||
tep_load_plugins(struct tep_handle *pevent)
|
||||
{
|
||||
struct plugin_list *list = NULL;
|
||||
struct tep_plugin_list *list = NULL;
|
||||
|
||||
load_plugins(pevent, ".so", load_plugin, &list);
|
||||
return list;
|
||||
}
|
||||
|
||||
void
|
||||
tep_unload_plugins(struct plugin_list *plugin_list, struct tep_handle *pevent)
|
||||
tep_unload_plugins(struct tep_plugin_list *plugin_list, struct tep_handle *pevent)
|
||||
{
|
||||
tep_plugin_unload_func func;
|
||||
struct plugin_list *list;
|
||||
struct tep_plugin_list *list;
|
||||
|
||||
while (plugin_list) {
|
||||
list = plugin_list;
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -124,7 +124,7 @@ static int add_and_get_index(const char *parent, const char *child, int cpu)
|
|||
}
|
||||
|
||||
static int function_handler(struct trace_seq *s, struct tep_record *record,
|
||||
struct event_format *event, void *context)
|
||||
struct tep_event_format *event, void *context)
|
||||
{
|
||||
struct tep_handle *pevent = event->pevent;
|
||||
unsigned long long function;
|
||||
|
|
|
@ -27,7 +27,7 @@
|
|||
|
||||
static int timer_expire_handler(struct trace_seq *s,
|
||||
struct tep_record *record,
|
||||
struct event_format *event, void *context)
|
||||
struct tep_event_format *event, void *context)
|
||||
{
|
||||
trace_seq_printf(s, "hrtimer=");
|
||||
|
||||
|
@ -47,7 +47,7 @@ static int timer_expire_handler(struct trace_seq *s,
|
|||
|
||||
static int timer_start_handler(struct trace_seq *s,
|
||||
struct tep_record *record,
|
||||
struct event_format *event, void *context)
|
||||
struct tep_event_format *event, void *context)
|
||||
{
|
||||
trace_seq_printf(s, "hrtimer=");
|
||||
|
||||
|
|
|
@ -25,9 +25,9 @@
|
|||
#include "trace-seq.h"
|
||||
|
||||
static int call_site_handler(struct trace_seq *s, struct tep_record *record,
|
||||
struct event_format *event, void *context)
|
||||
struct tep_event_format *event, void *context)
|
||||
{
|
||||
struct format_field *field;
|
||||
struct tep_format_field *field;
|
||||
unsigned long long val, addr;
|
||||
void *data = record->data;
|
||||
const char *func;
|
||||
|
|
|
@ -249,7 +249,7 @@ static const char *find_exit_reason(unsigned isa, int val)
|
|||
}
|
||||
|
||||
static int print_exit_reason(struct trace_seq *s, struct tep_record *record,
|
||||
struct event_format *event, const char *field)
|
||||
struct tep_event_format *event, const char *field)
|
||||
{
|
||||
unsigned long long isa;
|
||||
unsigned long long val;
|
||||
|
@ -270,7 +270,7 @@ static int print_exit_reason(struct trace_seq *s, struct tep_record *record,
|
|||
}
|
||||
|
||||
static int kvm_exit_handler(struct trace_seq *s, struct tep_record *record,
|
||||
struct event_format *event, void *context)
|
||||
struct tep_event_format *event, void *context)
|
||||
{
|
||||
unsigned long long info1 = 0, info2 = 0;
|
||||
|
||||
|
@ -293,7 +293,7 @@ static int kvm_exit_handler(struct trace_seq *s, struct tep_record *record,
|
|||
|
||||
static int kvm_emulate_insn_handler(struct trace_seq *s,
|
||||
struct tep_record *record,
|
||||
struct event_format *event, void *context)
|
||||
struct tep_event_format *event, void *context)
|
||||
{
|
||||
unsigned long long rip, csbase, len, flags, failed;
|
||||
int llen;
|
||||
|
@ -332,7 +332,7 @@ static int kvm_emulate_insn_handler(struct trace_seq *s,
|
|||
|
||||
|
||||
static int kvm_nested_vmexit_inject_handler(struct trace_seq *s, struct tep_record *record,
|
||||
struct event_format *event, void *context)
|
||||
struct tep_event_format *event, void *context)
|
||||
{
|
||||
if (print_exit_reason(s, record, event, "exit_code") < 0)
|
||||
return -1;
|
||||
|
@ -346,7 +346,7 @@ static int kvm_nested_vmexit_inject_handler(struct trace_seq *s, struct tep_reco
|
|||
}
|
||||
|
||||
static int kvm_nested_vmexit_handler(struct trace_seq *s, struct tep_record *record,
|
||||
struct event_format *event, void *context)
|
||||
struct tep_event_format *event, void *context)
|
||||
{
|
||||
tep_print_num_field(s, "rip %llx ", event, "rip", record, 1);
|
||||
|
||||
|
@ -372,7 +372,7 @@ union kvm_mmu_page_role {
|
|||
};
|
||||
|
||||
static int kvm_mmu_print_role(struct trace_seq *s, struct tep_record *record,
|
||||
struct event_format *event, void *context)
|
||||
struct tep_event_format *event, void *context)
|
||||
{
|
||||
unsigned long long val;
|
||||
static const char *access_str[] = {
|
||||
|
@ -419,7 +419,7 @@ static int kvm_mmu_print_role(struct trace_seq *s, struct tep_record *record,
|
|||
|
||||
static int kvm_mmu_get_page_handler(struct trace_seq *s,
|
||||
struct tep_record *record,
|
||||
struct event_format *event, void *context)
|
||||
struct tep_event_format *event, void *context)
|
||||
{
|
||||
unsigned long long val;
|
||||
|
||||
|
|
|
@ -26,10 +26,10 @@
|
|||
|
||||
#define INDENT 65
|
||||
|
||||
static void print_string(struct trace_seq *s, struct event_format *event,
|
||||
static void print_string(struct trace_seq *s, struct tep_event_format *event,
|
||||
const char *name, const void *data)
|
||||
{
|
||||
struct format_field *f = tep_find_field(event, name);
|
||||
struct tep_format_field *f = tep_find_field(event, name);
|
||||
int offset;
|
||||
int length;
|
||||
|
||||
|
@ -60,7 +60,7 @@ static void print_string(struct trace_seq *s, struct event_format *event,
|
|||
|
||||
static int drv_bss_info_changed(struct trace_seq *s,
|
||||
struct tep_record *record,
|
||||
struct event_format *event, void *context)
|
||||
struct tep_event_format *event, void *context)
|
||||
{
|
||||
void *data = record->data;
|
||||
|
||||
|
|
|
@ -45,7 +45,7 @@ static void write_state(struct trace_seq *s, int val)
|
|||
trace_seq_putc(s, 'R');
|
||||
}
|
||||
|
||||
static void write_and_save_comm(struct format_field *field,
|
||||
static void write_and_save_comm(struct tep_format_field *field,
|
||||
struct tep_record *record,
|
||||
struct trace_seq *s, int pid)
|
||||
{
|
||||
|
@ -67,9 +67,9 @@ static void write_and_save_comm(struct format_field *field,
|
|||
|
||||
static int sched_wakeup_handler(struct trace_seq *s,
|
||||
struct tep_record *record,
|
||||
struct event_format *event, void *context)
|
||||
struct tep_event_format *event, void *context)
|
||||
{
|
||||
struct format_field *field;
|
||||
struct tep_format_field *field;
|
||||
unsigned long long val;
|
||||
|
||||
if (tep_get_field_val(s, event, "pid", record, &val, 1))
|
||||
|
@ -96,9 +96,9 @@ static int sched_wakeup_handler(struct trace_seq *s,
|
|||
|
||||
static int sched_switch_handler(struct trace_seq *s,
|
||||
struct tep_record *record,
|
||||
struct event_format *event, void *context)
|
||||
struct tep_event_format *event, void *context)
|
||||
{
|
||||
struct format_field *field;
|
||||
struct tep_format_field *field;
|
||||
unsigned long long val;
|
||||
|
||||
if (tep_get_field_val(s, event, "prev_pid", record, &val, 1))
|
||||
|
|
|
@ -798,7 +798,8 @@ int cmd_inject(int argc, const char **argv)
|
|||
"kallsyms pathname"),
|
||||
OPT_BOOLEAN('f', "force", &data.force, "don't complain, do it"),
|
||||
OPT_CALLBACK_OPTARG(0, "itrace", &inject.itrace_synth_opts,
|
||||
NULL, "opts", "Instruction Tracing options",
|
||||
NULL, "opts", "Instruction Tracing options\n"
|
||||
ITRACE_HELP,
|
||||
itrace_parse_synth_opts),
|
||||
OPT_BOOLEAN(0, "strip", &inject.strip,
|
||||
"strip non-synthesized events (use with --itrace)"),
|
||||
|
|
|
@ -1104,7 +1104,7 @@ int cmd_report(int argc, const char **argv)
|
|||
OPT_CALLBACK(0, "percentage", NULL, "relative|absolute",
|
||||
"how to display percentage of filtered entries", parse_filter_percentage),
|
||||
OPT_CALLBACK_OPTARG(0, "itrace", &itrace_synth_opts, NULL, "opts",
|
||||
"Instruction Tracing options",
|
||||
"Instruction Tracing options\n" ITRACE_HELP,
|
||||
itrace_parse_synth_opts),
|
||||
OPT_BOOLEAN(0, "full-source-path", &srcline_full_filename,
|
||||
"Show full source file name path for source lines"),
|
||||
|
|
|
@ -406,9 +406,10 @@ static int perf_evsel__check_attr(struct perf_evsel *evsel,
|
|||
PERF_OUTPUT_WEIGHT))
|
||||
return -EINVAL;
|
||||
|
||||
if (PRINT_FIELD(SYM) && !PRINT_FIELD(IP) && !PRINT_FIELD(ADDR)) {
|
||||
if (PRINT_FIELD(SYM) &&
|
||||
!(evsel->attr.sample_type & (PERF_SAMPLE_IP|PERF_SAMPLE_ADDR))) {
|
||||
pr_err("Display of symbols requested but neither sample IP nor "
|
||||
"sample address\nis selected. Hence, no addresses to convert "
|
||||
"sample address\navailable. Hence, no addresses to convert "
|
||||
"to symbols.\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
@ -417,10 +418,9 @@ static int perf_evsel__check_attr(struct perf_evsel *evsel,
|
|||
"selected.\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
if (PRINT_FIELD(DSO) && !PRINT_FIELD(IP) && !PRINT_FIELD(ADDR) &&
|
||||
!PRINT_FIELD(BRSTACK) && !PRINT_FIELD(BRSTACKSYM) && !PRINT_FIELD(BRSTACKOFF)) {
|
||||
pr_err("Display of DSO requested but no address to convert. Select\n"
|
||||
"sample IP, sample address, brstack, brstacksym, or brstackoff.\n");
|
||||
if (PRINT_FIELD(DSO) &&
|
||||
!(evsel->attr.sample_type & (PERF_SAMPLE_IP|PERF_SAMPLE_ADDR))) {
|
||||
pr_err("Display of DSO requested but no address to convert.\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
if (PRINT_FIELD(SRCLINE) && !PRINT_FIELD(IP)) {
|
||||
|
@ -1115,6 +1115,7 @@ static int perf_sample__fprintf_callindent(struct perf_sample *sample,
|
|||
const char *name = NULL;
|
||||
static int spacing;
|
||||
int len = 0;
|
||||
int dlen = 0;
|
||||
u64 ip = 0;
|
||||
|
||||
/*
|
||||
|
@ -1141,6 +1142,12 @@ static int perf_sample__fprintf_callindent(struct perf_sample *sample,
|
|||
ip = sample->ip;
|
||||
}
|
||||
|
||||
if (PRINT_FIELD(DSO) && !(PRINT_FIELD(IP) || PRINT_FIELD(ADDR))) {
|
||||
dlen += fprintf(fp, "(");
|
||||
dlen += map__fprintf_dsoname(al->map, fp);
|
||||
dlen += fprintf(fp, ")\t");
|
||||
}
|
||||
|
||||
if (name)
|
||||
len = fprintf(fp, "%*s%s", (int)depth * 4, "", name);
|
||||
else if (ip)
|
||||
|
@ -1159,7 +1166,7 @@ static int perf_sample__fprintf_callindent(struct perf_sample *sample,
|
|||
if (len < spacing)
|
||||
len += fprintf(fp, "%*s", spacing - len, "");
|
||||
|
||||
return len;
|
||||
return len + dlen;
|
||||
}
|
||||
|
||||
static int perf_sample__fprintf_insn(struct perf_sample *sample,
|
||||
|
@ -1255,6 +1262,18 @@ static struct {
|
|||
{0, NULL}
|
||||
};
|
||||
|
||||
static const char *sample_flags_to_name(u32 flags)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; sample_flags[i].name ; i++) {
|
||||
if (sample_flags[i].flags == flags)
|
||||
return sample_flags[i].name;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static int perf_sample__fprintf_flags(u32 flags, FILE *fp)
|
||||
{
|
||||
const char *chars = PERF_IP_FLAG_CHARS;
|
||||
|
@ -1264,11 +1283,20 @@ static int perf_sample__fprintf_flags(u32 flags, FILE *fp)
|
|||
char str[33];
|
||||
int i, pos = 0;
|
||||
|
||||
for (i = 0; sample_flags[i].name ; i++) {
|
||||
if (sample_flags[i].flags == (flags & ~PERF_IP_FLAG_IN_TX)) {
|
||||
name = sample_flags[i].name;
|
||||
break;
|
||||
}
|
||||
name = sample_flags_to_name(flags & ~PERF_IP_FLAG_IN_TX);
|
||||
if (name)
|
||||
return fprintf(fp, " %-15s%4s ", name, in_tx ? "(x)" : "");
|
||||
|
||||
if (flags & PERF_IP_FLAG_TRACE_BEGIN) {
|
||||
name = sample_flags_to_name(flags & ~(PERF_IP_FLAG_IN_TX | PERF_IP_FLAG_TRACE_BEGIN));
|
||||
if (name)
|
||||
return fprintf(fp, " tr strt %-7s%4s ", name, in_tx ? "(x)" : "");
|
||||
}
|
||||
|
||||
if (flags & PERF_IP_FLAG_TRACE_END) {
|
||||
name = sample_flags_to_name(flags & ~(PERF_IP_FLAG_IN_TX | PERF_IP_FLAG_TRACE_END));
|
||||
if (name)
|
||||
return fprintf(fp, " tr end %-7s%4s ", name, in_tx ? "(x)" : "");
|
||||
}
|
||||
|
||||
for (i = 0; i < n; i++, flags >>= 1) {
|
||||
|
@ -1281,10 +1309,7 @@ static int perf_sample__fprintf_flags(u32 flags, FILE *fp)
|
|||
}
|
||||
str[pos] = 0;
|
||||
|
||||
if (name)
|
||||
return fprintf(fp, " %-7s%4s ", name, in_tx ? "(x)" : "");
|
||||
|
||||
return fprintf(fp, " %-11s ", str);
|
||||
return fprintf(fp, " %-19s ", str);
|
||||
}
|
||||
|
||||
struct printer_data {
|
||||
|
@ -2491,6 +2516,8 @@ parse:
|
|||
output[j].fields &= ~all_output_options[i].field;
|
||||
else
|
||||
output[j].fields |= all_output_options[i].field;
|
||||
output[j].user_set = true;
|
||||
output[j].wildcard_set = true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
@ -2501,7 +2528,8 @@ parse:
|
|||
rc = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
output[type].fields |= all_output_options[i].field;
|
||||
output[type].user_set = true;
|
||||
output[type].wildcard_set = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3193,7 +3221,7 @@ int cmd_script(int argc, const char **argv)
|
|||
OPT_BOOLEAN(0, "ns", &nanosecs,
|
||||
"Use 9 decimal places when displaying time"),
|
||||
OPT_CALLBACK_OPTARG(0, "itrace", &itrace_synth_opts, NULL, "opts",
|
||||
"Instruction Tracing options",
|
||||
"Instruction Tracing options\n" ITRACE_HELP,
|
||||
itrace_parse_synth_opts),
|
||||
OPT_BOOLEAN(0, "full-source-path", &srcline_full_filename,
|
||||
"Show full source file name path for source lines"),
|
||||
|
|
|
@ -181,7 +181,7 @@ static int __tp_field__init_uint(struct tp_field *field, int size, int offset, b
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int tp_field__init_uint(struct tp_field *field, struct format_field *format_field, bool needs_swap)
|
||||
static int tp_field__init_uint(struct tp_field *field, struct tep_format_field *format_field, bool needs_swap)
|
||||
{
|
||||
return __tp_field__init_uint(field, format_field->size, format_field->offset, needs_swap);
|
||||
}
|
||||
|
@ -198,7 +198,7 @@ static int __tp_field__init_ptr(struct tp_field *field, int offset)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int tp_field__init_ptr(struct tp_field *field, struct format_field *format_field)
|
||||
static int tp_field__init_ptr(struct tp_field *field, struct tep_format_field *format_field)
|
||||
{
|
||||
return __tp_field__init_ptr(field, format_field->offset);
|
||||
}
|
||||
|
@ -214,7 +214,7 @@ static int perf_evsel__init_tp_uint_field(struct perf_evsel *evsel,
|
|||
struct tp_field *field,
|
||||
const char *name)
|
||||
{
|
||||
struct format_field *format_field = perf_evsel__field(evsel, name);
|
||||
struct tep_format_field *format_field = perf_evsel__field(evsel, name);
|
||||
|
||||
if (format_field == NULL)
|
||||
return -1;
|
||||
|
@ -230,7 +230,7 @@ static int perf_evsel__init_tp_ptr_field(struct perf_evsel *evsel,
|
|||
struct tp_field *field,
|
||||
const char *name)
|
||||
{
|
||||
struct format_field *format_field = perf_evsel__field(evsel, name);
|
||||
struct tep_format_field *format_field = perf_evsel__field(evsel, name);
|
||||
|
||||
if (format_field == NULL)
|
||||
return -1;
|
||||
|
@ -862,12 +862,12 @@ static struct syscall_fmt *syscall_fmt__find(const char *name)
|
|||
* args_size: sum of the sizes of the syscall arguments, anything after that is augmented stuff: pathname for openat, etc.
|
||||
*/
|
||||
struct syscall {
|
||||
struct event_format *tp_format;
|
||||
struct tep_event_format *tp_format;
|
||||
int nr_args;
|
||||
int args_size;
|
||||
bool is_exit;
|
||||
bool is_open;
|
||||
struct format_field *args;
|
||||
struct tep_format_field *args;
|
||||
const char *name;
|
||||
struct syscall_fmt *fmt;
|
||||
struct syscall_arg_fmt *arg_fmt;
|
||||
|
@ -1279,7 +1279,7 @@ static int syscall__alloc_arg_fmts(struct syscall *sc, int nr_args)
|
|||
|
||||
static int syscall__set_arg_fmts(struct syscall *sc)
|
||||
{
|
||||
struct format_field *field, *last_field = NULL;
|
||||
struct tep_format_field *field, *last_field = NULL;
|
||||
int idx = 0, len;
|
||||
|
||||
for (field = sc->args; field; field = field->next, ++idx) {
|
||||
|
@ -1293,7 +1293,7 @@ static int syscall__set_arg_fmts(struct syscall *sc)
|
|||
strcmp(field->name, "path") == 0 ||
|
||||
strcmp(field->name, "pathname") == 0))
|
||||
sc->arg_fmt[idx].scnprintf = SCA_FILENAME;
|
||||
else if (field->flags & FIELD_IS_POINTER)
|
||||
else if (field->flags & TEP_FIELD_IS_POINTER)
|
||||
sc->arg_fmt[idx].scnprintf = syscall_arg__scnprintf_hex;
|
||||
else if (strcmp(field->type, "pid_t") == 0)
|
||||
sc->arg_fmt[idx].scnprintf = SCA_PID;
|
||||
|
@ -1525,7 +1525,7 @@ static size_t syscall__scnprintf_args(struct syscall *sc, char *bf, size_t size,
|
|||
ttrace->ret_scnprintf = NULL;
|
||||
|
||||
if (sc->args != NULL) {
|
||||
struct format_field *field;
|
||||
struct tep_format_field *field;
|
||||
|
||||
for (field = sc->args; field;
|
||||
field = field->next, ++arg.idx, bit <<= 1) {
|
||||
|
|
|
@ -30,3 +30,4 @@ perf-test mainporcelain common
|
|||
perf-timechart mainporcelain common
|
||||
perf-top mainporcelain common
|
||||
perf-trace mainporcelain audit
|
||||
perf-version mainporcelain common
|
||||
|
|
|
@ -0,0 +1,23 @@
|
|||
[
|
||||
{
|
||||
"ArchStdEvent": "BR_IMMED_SPEC",
|
||||
},
|
||||
{
|
||||
"ArchStdEvent": "BR_RETURN_SPEC",
|
||||
},
|
||||
{
|
||||
"ArchStdEvent": "BR_INDIRECT_SPEC",
|
||||
},
|
||||
{
|
||||
"PublicDescription": "Mispredicted or not predicted branch speculatively executed",
|
||||
"EventCode": "0x10",
|
||||
"EventName": "BR_MIS_PRED",
|
||||
"BriefDescription": "Branch mispredicted"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "Predictable branch speculatively executed",
|
||||
"EventCode": "0x12",
|
||||
"EventName": "BR_PRED",
|
||||
"BriefDescription": "Predictable branch"
|
||||
},
|
||||
]
|
|
@ -0,0 +1,26 @@
|
|||
[
|
||||
{
|
||||
"ArchStdEvent": "BUS_ACCESS_RD",
|
||||
},
|
||||
{
|
||||
"ArchStdEvent": "BUS_ACCESS_WR",
|
||||
},
|
||||
{
|
||||
"ArchStdEvent": "BUS_ACCESS_SHARED",
|
||||
},
|
||||
{
|
||||
"ArchStdEvent": "BUS_ACCESS_NOT_SHARED",
|
||||
},
|
||||
{
|
||||
"ArchStdEvent": "BUS_ACCESS_NORMAL",
|
||||
},
|
||||
{
|
||||
"ArchStdEvent": "BUS_ACCESS_PERIPH",
|
||||
},
|
||||
{
|
||||
"PublicDescription": "Bus access",
|
||||
"EventCode": "0x19",
|
||||
"EventName": "BUS_ACCESS",
|
||||
"BriefDescription": "Bus access"
|
||||
},
|
||||
]
|
|
@ -0,0 +1,191 @@
|
|||
[
|
||||
{
|
||||
"ArchStdEvent": "L1D_CACHE_RD",
|
||||
},
|
||||
{
|
||||
"ArchStdEvent": "L1D_CACHE_WR",
|
||||
},
|
||||
{
|
||||
"ArchStdEvent": "L1D_CACHE_REFILL_RD",
|
||||
},
|
||||
{
|
||||
"ArchStdEvent": "L1D_CACHE_INVAL",
|
||||
},
|
||||
{
|
||||
"ArchStdEvent": "L1D_TLB_REFILL_RD",
|
||||
},
|
||||
{
|
||||
"ArchStdEvent": "L1D_TLB_REFILL_WR",
|
||||
},
|
||||
{
|
||||
"ArchStdEvent": "L2D_CACHE_RD",
|
||||
},
|
||||
{
|
||||
"ArchStdEvent": "L2D_CACHE_WR",
|
||||
},
|
||||
{
|
||||
"ArchStdEvent": "L2D_CACHE_REFILL_RD",
|
||||
},
|
||||
{
|
||||
"ArchStdEvent": "L2D_CACHE_REFILL_WR",
|
||||
},
|
||||
{
|
||||
"ArchStdEvent": "L2D_CACHE_WB_VICTIM",
|
||||
},
|
||||
{
|
||||
"ArchStdEvent": "L2D_CACHE_WB_CLEAN",
|
||||
},
|
||||
{
|
||||
"ArchStdEvent": "L2D_CACHE_INVAL",
|
||||
},
|
||||
{
|
||||
"PublicDescription": "Level 1 instruction cache refill",
|
||||
"EventCode": "0x01",
|
||||
"EventName": "L1I_CACHE_REFILL",
|
||||
"BriefDescription": "L1I cache refill"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "Level 1 instruction TLB refill",
|
||||
"EventCode": "0x02",
|
||||
"EventName": "L1I_TLB_REFILL",
|
||||
"BriefDescription": "L1I TLB refill"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "Level 1 data cache refill",
|
||||
"EventCode": "0x03",
|
||||
"EventName": "L1D_CACHE_REFILL",
|
||||
"BriefDescription": "L1D cache refill"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "Level 1 data cache access",
|
||||
"EventCode": "0x04",
|
||||
"EventName": "L1D_CACHE_ACCESS",
|
||||
"BriefDescription": "L1D cache access"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "Level 1 data TLB refill",
|
||||
"EventCode": "0x05",
|
||||
"EventName": "L1D_TLB_REFILL",
|
||||
"BriefDescription": "L1D TLB refill"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "Level 1 instruction cache access",
|
||||
"EventCode": "0x14",
|
||||
"EventName": "L1I_CACHE_ACCESS",
|
||||
"BriefDescription": "L1I cache access"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "Level 2 data cache access",
|
||||
"EventCode": "0x16",
|
||||
"EventName": "L2D_CACHE_ACCESS",
|
||||
"BriefDescription": "L2D cache access"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "Level 2 data refill",
|
||||
"EventCode": "0x17",
|
||||
"EventName": "L2D_CACHE_REFILL",
|
||||
"BriefDescription": "L2D cache refill"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "Level 2 data cache, Write-Back",
|
||||
"EventCode": "0x18",
|
||||
"EventName": "L2D_CACHE_WB",
|
||||
"BriefDescription": "L2D cache Write-Back"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "Level 1 data TLB access. This event counts any load or store operation which accesses the data L1 TLB",
|
||||
"EventCode": "0x25",
|
||||
"EventName": "L1D_TLB_ACCESS",
|
||||
"BriefDescription": "L1D TLB access"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "Level 1 instruction TLB access. This event counts any instruction fetch which accesses the instruction L1 TLB",
|
||||
"EventCode": "0x26",
|
||||
"EventName": "L1I_TLB_ACCESS",
|
||||
"BriefDescription": "L1I TLB access"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "Level 2 access to data TLB that caused a page table walk. This event counts on any data access which causes L2D_TLB_REFILL to count",
|
||||
"EventCode": "0x34",
|
||||
"EventName": "L2D_TLB_ACCESS",
|
||||
"BriefDescription": "L2D TLB access"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "Level 2 access to instruciton TLB that caused a page table walk. This event counts on any instruciton access which causes L2I_TLB_REFILL to count",
|
||||
"EventCode": "0x35",
|
||||
"EventName": "L2I_TLB_ACCESS",
|
||||
"BriefDescription": "L2D TLB access"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "Branch target buffer misprediction",
|
||||
"EventCode": "0x102",
|
||||
"EventName": "BTB_MIS_PRED",
|
||||
"BriefDescription": "BTB misprediction"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "ITB miss",
|
||||
"EventCode": "0x103",
|
||||
"EventName": "ITB_MISS",
|
||||
"BriefDescription": "ITB miss"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "DTB miss",
|
||||
"EventCode": "0x104",
|
||||
"EventName": "DTB_MISS",
|
||||
"BriefDescription": "DTB miss"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "Level 1 data cache late miss",
|
||||
"EventCode": "0x105",
|
||||
"EventName": "L1D_CACHE_LATE_MISS",
|
||||
"BriefDescription": "L1D cache late miss"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "Level 1 data cache prefetch request",
|
||||
"EventCode": "0x106",
|
||||
"EventName": "L1D_CACHE_PREFETCH",
|
||||
"BriefDescription": "L1D cache prefetch"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "Level 2 data cache prefetch request",
|
||||
"EventCode": "0x107",
|
||||
"EventName": "L2D_CACHE_PREFETCH",
|
||||
"BriefDescription": "L2D cache prefetch"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "Level 1 stage 2 TLB refill",
|
||||
"EventCode": "0x111",
|
||||
"EventName": "L1_STAGE2_TLB_REFILL",
|
||||
"BriefDescription": "L1 stage 2 TLB refill"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "Page walk cache level-0 stage-1 hit",
|
||||
"EventCode": "0x112",
|
||||
"EventName": "PAGE_WALK_L0_STAGE1_HIT",
|
||||
"BriefDescription": "Page walk, L0 stage-1 hit"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "Page walk cache level-1 stage-1 hit",
|
||||
"EventCode": "0x113",
|
||||
"EventName": "PAGE_WALK_L1_STAGE1_HIT",
|
||||
"BriefDescription": "Page walk, L1 stage-1 hit"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "Page walk cache level-2 stage-1 hit",
|
||||
"EventCode": "0x114",
|
||||
"EventName": "PAGE_WALK_L2_STAGE1_HIT",
|
||||
"BriefDescription": "Page walk, L2 stage-1 hit"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "Page walk cache level-1 stage-2 hit",
|
||||
"EventCode": "0x115",
|
||||
"EventName": "PAGE_WALK_L1_STAGE2_HIT",
|
||||
"BriefDescription": "Page walk, L1 stage-2 hit"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "Page walk cache level-2 stage-2 hit",
|
||||
"EventCode": "0x116",
|
||||
"EventName": "PAGE_WALK_L2_STAGE2_HIT",
|
||||
"BriefDescription": "Page walk, L2 stage-2 hit"
|
||||
},
|
||||
]
|
|
@ -0,0 +1,20 @@
|
|||
[
|
||||
{
|
||||
"PublicDescription": "The number of core clock cycles",
|
||||
"EventCode": "0x11",
|
||||
"EventName": "CPU_CYCLES",
|
||||
"BriefDescription": "Clock cycles"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "FSU clocking gated off cycle",
|
||||
"EventCode": "0x101",
|
||||
"EventName": "FSU_CLOCK_OFF_CYCLES",
|
||||
"BriefDescription": "FSU clocking gated off cycle"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "Wait state cycle",
|
||||
"EventCode": "0x110",
|
||||
"EventName": "Wait_CYCLES",
|
||||
"BriefDescription": "Wait state cycle"
|
||||
},
|
||||
]
|
|
@ -1,32 +0,0 @@
|
|||
[
|
||||
{
|
||||
"ArchStdEvent": "L1D_CACHE_RD",
|
||||
},
|
||||
{
|
||||
"ArchStdEvent": "L1D_CACHE_WR",
|
||||
},
|
||||
{
|
||||
"ArchStdEvent": "L1D_CACHE_REFILL_RD",
|
||||
},
|
||||
{
|
||||
"ArchStdEvent": "L1D_CACHE_REFILL_WR",
|
||||
},
|
||||
{
|
||||
"ArchStdEvent": "L1D_TLB_REFILL_RD",
|
||||
},
|
||||
{
|
||||
"ArchStdEvent": "L1D_TLB_REFILL_WR",
|
||||
},
|
||||
{
|
||||
"ArchStdEvent": "L1D_TLB_RD",
|
||||
},
|
||||
{
|
||||
"ArchStdEvent": "L1D_TLB_WR",
|
||||
},
|
||||
{
|
||||
"ArchStdEvent": "BUS_ACCESS_RD",
|
||||
},
|
||||
{
|
||||
"ArchStdEvent": "BUS_ACCESS_WR",
|
||||
}
|
||||
]
|
|
@ -0,0 +1,50 @@
|
|||
[
|
||||
{
|
||||
"ArchStdEvent": "EXC_UNDEF",
|
||||
},
|
||||
{
|
||||
"ArchStdEvent": "EXC_SVC",
|
||||
},
|
||||
{
|
||||
"ArchStdEvent": "EXC_PABORT",
|
||||
},
|
||||
{
|
||||
"ArchStdEvent": "EXC_DABORT",
|
||||
},
|
||||
{
|
||||
"ArchStdEvent": "EXC_IRQ",
|
||||
},
|
||||
{
|
||||
"ArchStdEvent": "EXC_FIQ",
|
||||
},
|
||||
{
|
||||
"ArchStdEvent": "EXC_HVC",
|
||||
},
|
||||
{
|
||||
"ArchStdEvent": "EXC_TRAP_PABORT",
|
||||
},
|
||||
{
|
||||
"ArchStdEvent": "EXC_TRAP_DABORT",
|
||||
},
|
||||
{
|
||||
"ArchStdEvent": "EXC_TRAP_OTHER",
|
||||
},
|
||||
{
|
||||
"ArchStdEvent": "EXC_TRAP_IRQ",
|
||||
},
|
||||
{
|
||||
"ArchStdEvent": "EXC_TRAP_FIQ",
|
||||
},
|
||||
{
|
||||
"PublicDescription": "Exception taken",
|
||||
"EventCode": "0x09",
|
||||
"EventName": "EXC_TAKEN",
|
||||
"BriefDescription": "Exception taken"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "Instruction architecturally executed, condition check pass, exception return",
|
||||
"EventCode": "0x0a",
|
||||
"EventName": "EXC_RETURN",
|
||||
"BriefDescription": "Exception return"
|
||||
},
|
||||
]
|
|
@ -0,0 +1,89 @@
|
|||
[
|
||||
{
|
||||
"ArchStdEvent": "LD_SPEC",
|
||||
},
|
||||
{
|
||||
"ArchStdEvent": "ST_SPEC",
|
||||
},
|
||||
{
|
||||
"ArchStdEvent": "LDST_SPEC",
|
||||
},
|
||||
{
|
||||
"ArchStdEvent": "DP_SPEC",
|
||||
},
|
||||
{
|
||||
"ArchStdEvent": "ASE_SPEC",
|
||||
},
|
||||
{
|
||||
"ArchStdEvent": "VFP_SPEC",
|
||||
},
|
||||
{
|
||||
"ArchStdEvent": "PC_WRITE_SPEC",
|
||||
},
|
||||
{
|
||||
"ArchStdEvent": "CRYPTO_SPEC",
|
||||
},
|
||||
{
|
||||
"ArchStdEvent": "ISB_SPEC",
|
||||
},
|
||||
{
|
||||
"ArchStdEvent": "DSB_SPEC",
|
||||
},
|
||||
{
|
||||
"ArchStdEvent": "DMB_SPEC",
|
||||
},
|
||||
{
|
||||
"ArchStdEvent": "RC_LD_SPEC",
|
||||
},
|
||||
{
|
||||
"ArchStdEvent": "RC_ST_SPEC",
|
||||
},
|
||||
{
|
||||
"PublicDescription": "Instruction architecturally executed, software increment",
|
||||
"EventCode": "0x00",
|
||||
"EventName": "SW_INCR",
|
||||
"BriefDescription": "Software increment"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "Instruction architecturally executed",
|
||||
"EventCode": "0x08",
|
||||
"EventName": "INST_RETIRED",
|
||||
"BriefDescription": "Instruction retired"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "Instruction architecturally executed, condition code check pass, write to CONTEXTIDR",
|
||||
"EventCode": "0x0b",
|
||||
"EventName": "CID_WRITE_RETIRED",
|
||||
"BriefDescription": "Write to CONTEXTIDR"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "Operation speculatively executed",
|
||||
"EventCode": "0x1b",
|
||||
"EventName": "INST_SPEC",
|
||||
"BriefDescription": "Speculatively executed"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "Instruction architecturally executed (condition check pass), write to TTBR",
|
||||
"EventCode": "0x1c",
|
||||
"EventName": "TTBR_WRITE_RETIRED",
|
||||
"BriefDescription": "Instruction executed, TTBR write"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "Instruction architecturally executed, branch. This event counts all branches, taken or not. This excludes exception entries, debug entries and CCFAIL branches",
|
||||
"EventCode": "0x21",
|
||||
"EventName": "BR_RETIRED",
|
||||
"BriefDescription": "Branch retired"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "Instruction architecturally executed, mispredicted branch. This event counts any branch counted by BR_RETIRED which is not correctly predicted and causes a pipeline flush",
|
||||
"EventCode": "0x22",
|
||||
"EventName": "BR_MISPRED_RETIRED",
|
||||
"BriefDescription": "Mispredicted branch retired"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "Operation speculatively executed, NOP",
|
||||
"EventCode": "0x100",
|
||||
"EventName": "NOP_SPEC",
|
||||
"BriefDescription": "Speculatively executed, NOP"
|
||||
},
|
||||
]
|
|
@ -0,0 +1,14 @@
|
|||
[
|
||||
{
|
||||
"ArchStdEvent": "LDREX_SPEC",
|
||||
},
|
||||
{
|
||||
"ArchStdEvent": "STREX_PASS_SPEC",
|
||||
},
|
||||
{
|
||||
"ArchStdEvent": "STREX_FAIL_SPEC",
|
||||
},
|
||||
{
|
||||
"ArchStdEvent": "STREX_SPEC",
|
||||
},
|
||||
]
|
|
@ -0,0 +1,29 @@
|
|||
[
|
||||
{
|
||||
"ArchStdEvent": "MEM_ACCESS_RD",
|
||||
},
|
||||
{
|
||||
"ArchStdEvent": "MEM_ACCESS_WR",
|
||||
},
|
||||
{
|
||||
"ArchStdEvent": "UNALIGNED_LD_SPEC",
|
||||
},
|
||||
{
|
||||
"ArchStdEvent": "UNALIGNED_ST_SPEC",
|
||||
},
|
||||
{
|
||||
"ArchStdEvent": "UNALIGNED_LDST_SPEC",
|
||||
},
|
||||
{
|
||||
"PublicDescription": "Data memory access",
|
||||
"EventCode": "0x13",
|
||||
"EventName": "MEM_ACCESS",
|
||||
"BriefDescription": "Memory access"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "Local memory error. This event counts any correctable or uncorrectable memory error (ECC or parity) in the protected core RAMs",
|
||||
"EventCode": "0x1a",
|
||||
"EventName": "MEM_ERROR",
|
||||
"BriefDescription": "Memory error"
|
||||
},
|
||||
]
|
|
@ -0,0 +1,50 @@
|
|||
[
|
||||
{
|
||||
"PublicDescription": "Decode starved for instruction cycle",
|
||||
"EventCode": "0x108",
|
||||
"EventName": "DECODE_STALL",
|
||||
"BriefDescription": "Decode starved"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "Op dispatch stalled cycle",
|
||||
"EventCode": "0x109",
|
||||
"EventName": "DISPATCH_STALL",
|
||||
"BriefDescription": "Dispatch stalled"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "IXA Op non-issue",
|
||||
"EventCode": "0x10a",
|
||||
"EventName": "IXA_STALL",
|
||||
"BriefDescription": "IXA stalled"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "IXB Op non-issue",
|
||||
"EventCode": "0x10b",
|
||||
"EventName": "IXB_STALL",
|
||||
"BriefDescription": "IXB stalled"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "BX Op non-issue",
|
||||
"EventCode": "0x10c",
|
||||
"EventName": "BX_STALL",
|
||||
"BriefDescription": "BX stalled"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "LX Op non-issue",
|
||||
"EventCode": "0x10d",
|
||||
"EventName": "LX_STALL",
|
||||
"BriefDescription": "LX stalled"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "SX Op non-issue",
|
||||
"EventCode": "0x10e",
|
||||
"EventName": "SX_STALL",
|
||||
"BriefDescription": "SX stalled"
|
||||
},
|
||||
{
|
||||
"PublicDescription": "FX Op non-issue",
|
||||
"EventCode": "0x10f",
|
||||
"EventName": "FX_STALL",
|
||||
"BriefDescription": "FX stalled"
|
||||
},
|
||||
]
|
|
@ -8,7 +8,7 @@
|
|||
static int perf_evsel__test_field(struct perf_evsel *evsel, const char *name,
|
||||
int size, bool should_be_signed)
|
||||
{
|
||||
struct format_field *field = perf_evsel__field(evsel, name);
|
||||
struct tep_format_field *field = perf_evsel__field(evsel, name);
|
||||
int is_signed;
|
||||
int ret = 0;
|
||||
|
||||
|
@ -17,7 +17,7 @@ static int perf_evsel__test_field(struct perf_evsel *evsel, const char *name,
|
|||
return -1;
|
||||
}
|
||||
|
||||
is_signed = !!(field->flags | FIELD_IS_SIGNED);
|
||||
is_signed = !!(field->flags | TEP_FIELD_IS_SIGNED);
|
||||
if (should_be_signed && !is_signed) {
|
||||
pr_debug("%s: \"%s\" signedness(%d) is wrong, should be %d\n",
|
||||
evsel->name, name, is_signed, should_be_signed);
|
||||
|
|
|
@ -576,6 +576,23 @@ static inline void auxtrace__free(struct perf_session *session)
|
|||
return session->auxtrace->free(session);
|
||||
}
|
||||
|
||||
#define ITRACE_HELP \
|
||||
" i: synthesize instructions events\n" \
|
||||
" b: synthesize branches events\n" \
|
||||
" c: synthesize branches events (calls only)\n" \
|
||||
" r: synthesize branches events (returns only)\n" \
|
||||
" x: synthesize transactions events\n" \
|
||||
" w: synthesize ptwrite events\n" \
|
||||
" p: synthesize power events\n" \
|
||||
" e: synthesize error events\n" \
|
||||
" d: create a debug log\n" \
|
||||
" g[len]: synthesize a call chain (use with i or x)\n" \
|
||||
" l[len]: synthesize last branch entries (use with i or x)\n" \
|
||||
" sNUMBER: skip initial number of events\n" \
|
||||
" PERIOD[ns|us|ms|i|t]: specify period to sample stream\n" \
|
||||
" concatenate multiple options. Default is ibxwpe or cewp\n"
|
||||
|
||||
|
||||
#else
|
||||
|
||||
static inline struct auxtrace_record *
|
||||
|
@ -716,6 +733,8 @@ void auxtrace_mmap_params__set_idx(struct auxtrace_mmap_params *mp,
|
|||
struct perf_evlist *evlist, int idx,
|
||||
bool per_cpu);
|
||||
|
||||
#define ITRACE_HELP ""
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
|
@ -182,20 +182,20 @@ err_put_field:
|
|||
}
|
||||
|
||||
static struct bt_ctf_field_type*
|
||||
get_tracepoint_field_type(struct ctf_writer *cw, struct format_field *field)
|
||||
get_tracepoint_field_type(struct ctf_writer *cw, struct tep_format_field *field)
|
||||
{
|
||||
unsigned long flags = field->flags;
|
||||
|
||||
if (flags & FIELD_IS_STRING)
|
||||
if (flags & TEP_FIELD_IS_STRING)
|
||||
return cw->data.string;
|
||||
|
||||
if (!(flags & FIELD_IS_SIGNED)) {
|
||||
if (!(flags & TEP_FIELD_IS_SIGNED)) {
|
||||
/* unsigned long are mostly pointers */
|
||||
if (flags & FIELD_IS_LONG || flags & FIELD_IS_POINTER)
|
||||
if (flags & TEP_FIELD_IS_LONG || flags & TEP_FIELD_IS_POINTER)
|
||||
return cw->data.u64_hex;
|
||||
}
|
||||
|
||||
if (flags & FIELD_IS_SIGNED) {
|
||||
if (flags & TEP_FIELD_IS_SIGNED) {
|
||||
if (field->size == 8)
|
||||
return cw->data.s64;
|
||||
else
|
||||
|
@ -287,7 +287,7 @@ static int add_tracepoint_field_value(struct ctf_writer *cw,
|
|||
struct bt_ctf_event_class *event_class,
|
||||
struct bt_ctf_event *event,
|
||||
struct perf_sample *sample,
|
||||
struct format_field *fmtf)
|
||||
struct tep_format_field *fmtf)
|
||||
{
|
||||
struct bt_ctf_field_type *type;
|
||||
struct bt_ctf_field *array_field;
|
||||
|
@ -304,10 +304,10 @@ static int add_tracepoint_field_value(struct ctf_writer *cw,
|
|||
name = fmtf->alias;
|
||||
offset = fmtf->offset;
|
||||
len = fmtf->size;
|
||||
if (flags & FIELD_IS_STRING)
|
||||
flags &= ~FIELD_IS_ARRAY;
|
||||
if (flags & TEP_FIELD_IS_STRING)
|
||||
flags &= ~TEP_FIELD_IS_ARRAY;
|
||||
|
||||
if (flags & FIELD_IS_DYNAMIC) {
|
||||
if (flags & TEP_FIELD_IS_DYNAMIC) {
|
||||
unsigned long long tmp_val;
|
||||
|
||||
tmp_val = tep_read_number(fmtf->event->pevent,
|
||||
|
@ -317,7 +317,7 @@ static int add_tracepoint_field_value(struct ctf_writer *cw,
|
|||
offset &= 0xffff;
|
||||
}
|
||||
|
||||
if (flags & FIELD_IS_ARRAY) {
|
||||
if (flags & TEP_FIELD_IS_ARRAY) {
|
||||
|
||||
type = bt_ctf_event_class_get_field_by_name(
|
||||
event_class, name);
|
||||
|
@ -338,7 +338,7 @@ static int add_tracepoint_field_value(struct ctf_writer *cw,
|
|||
type = get_tracepoint_field_type(cw, fmtf);
|
||||
|
||||
for (i = 0; i < n_items; i++) {
|
||||
if (flags & FIELD_IS_ARRAY)
|
||||
if (flags & TEP_FIELD_IS_ARRAY)
|
||||
field = bt_ctf_field_array_get_field(array_field, i);
|
||||
else
|
||||
field = bt_ctf_field_create(type);
|
||||
|
@ -348,7 +348,7 @@ static int add_tracepoint_field_value(struct ctf_writer *cw,
|
|||
return -1;
|
||||
}
|
||||
|
||||
if (flags & FIELD_IS_STRING)
|
||||
if (flags & TEP_FIELD_IS_STRING)
|
||||
ret = string_set_value(field, data + offset + i * len);
|
||||
else {
|
||||
unsigned long long value_int;
|
||||
|
@ -357,7 +357,7 @@ static int add_tracepoint_field_value(struct ctf_writer *cw,
|
|||
fmtf->event->pevent,
|
||||
data + offset + i * len, len);
|
||||
|
||||
if (!(flags & FIELD_IS_SIGNED))
|
||||
if (!(flags & TEP_FIELD_IS_SIGNED))
|
||||
ret = bt_ctf_field_unsigned_integer_set_value(
|
||||
field, value_int);
|
||||
else
|
||||
|
@ -369,7 +369,7 @@ static int add_tracepoint_field_value(struct ctf_writer *cw,
|
|||
pr_err("failed to set file value %s\n", name);
|
||||
goto err_put_field;
|
||||
}
|
||||
if (!(flags & FIELD_IS_ARRAY)) {
|
||||
if (!(flags & TEP_FIELD_IS_ARRAY)) {
|
||||
ret = bt_ctf_event_set_payload(event, name, field);
|
||||
if (ret) {
|
||||
pr_err("failed to set payload %s\n", name);
|
||||
|
@ -378,7 +378,7 @@ static int add_tracepoint_field_value(struct ctf_writer *cw,
|
|||
}
|
||||
bt_ctf_field_put(field);
|
||||
}
|
||||
if (flags & FIELD_IS_ARRAY) {
|
||||
if (flags & TEP_FIELD_IS_ARRAY) {
|
||||
ret = bt_ctf_event_set_payload(event, name, array_field);
|
||||
if (ret) {
|
||||
pr_err("Failed add payload array %s\n", name);
|
||||
|
@ -396,10 +396,10 @@ err_put_field:
|
|||
static int add_tracepoint_fields_values(struct ctf_writer *cw,
|
||||
struct bt_ctf_event_class *event_class,
|
||||
struct bt_ctf_event *event,
|
||||
struct format_field *fields,
|
||||
struct tep_format_field *fields,
|
||||
struct perf_sample *sample)
|
||||
{
|
||||
struct format_field *field;
|
||||
struct tep_format_field *field;
|
||||
int ret;
|
||||
|
||||
for (field = fields; field; field = field->next) {
|
||||
|
@ -417,8 +417,8 @@ static int add_tracepoint_values(struct ctf_writer *cw,
|
|||
struct perf_evsel *evsel,
|
||||
struct perf_sample *sample)
|
||||
{
|
||||
struct format_field *common_fields = evsel->tp_format->format.common_fields;
|
||||
struct format_field *fields = evsel->tp_format->format.fields;
|
||||
struct tep_format_field *common_fields = evsel->tp_format->format.common_fields;
|
||||
struct tep_format_field *fields = evsel->tp_format->format.fields;
|
||||
int ret;
|
||||
|
||||
ret = add_tracepoint_fields_values(cw, event_class, event,
|
||||
|
@ -970,7 +970,7 @@ out:
|
|||
|
||||
static int event_class_add_field(struct bt_ctf_event_class *event_class,
|
||||
struct bt_ctf_field_type *type,
|
||||
struct format_field *field)
|
||||
struct tep_format_field *field)
|
||||
{
|
||||
struct bt_ctf_field_type *t = NULL;
|
||||
char *name;
|
||||
|
@ -1009,10 +1009,10 @@ static int event_class_add_field(struct bt_ctf_event_class *event_class,
|
|||
}
|
||||
|
||||
static int add_tracepoint_fields_types(struct ctf_writer *cw,
|
||||
struct format_field *fields,
|
||||
struct tep_format_field *fields,
|
||||
struct bt_ctf_event_class *event_class)
|
||||
{
|
||||
struct format_field *field;
|
||||
struct tep_format_field *field;
|
||||
int ret;
|
||||
|
||||
for (field = fields; field; field = field->next) {
|
||||
|
@ -1030,15 +1030,15 @@ static int add_tracepoint_fields_types(struct ctf_writer *cw,
|
|||
* type and don't care that it is an array. What we don't
|
||||
* support is an array of strings.
|
||||
*/
|
||||
if (flags & FIELD_IS_STRING)
|
||||
flags &= ~FIELD_IS_ARRAY;
|
||||
if (flags & TEP_FIELD_IS_STRING)
|
||||
flags &= ~TEP_FIELD_IS_ARRAY;
|
||||
|
||||
if (flags & FIELD_IS_ARRAY)
|
||||
if (flags & TEP_FIELD_IS_ARRAY)
|
||||
type = bt_ctf_field_type_array_create(type, field->arraylen);
|
||||
|
||||
ret = event_class_add_field(event_class, type, field);
|
||||
|
||||
if (flags & FIELD_IS_ARRAY)
|
||||
if (flags & TEP_FIELD_IS_ARRAY)
|
||||
bt_ctf_field_type_put(type);
|
||||
|
||||
if (ret) {
|
||||
|
@ -1055,8 +1055,8 @@ static int add_tracepoint_types(struct ctf_writer *cw,
|
|||
struct perf_evsel *evsel,
|
||||
struct bt_ctf_event_class *class)
|
||||
{
|
||||
struct format_field *common_fields = evsel->tp_format->format.common_fields;
|
||||
struct format_field *fields = evsel->tp_format->format.fields;
|
||||
struct tep_format_field *common_fields = evsel->tp_format->format.common_fields;
|
||||
struct tep_format_field *fields = evsel->tp_format->format.fields;
|
||||
int ret;
|
||||
|
||||
ret = add_tracepoint_fields_types(cw, common_fields, class);
|
||||
|
|
|
@ -463,6 +463,28 @@ int db_export__branch_types(struct db_export *dbe)
|
|||
if (err)
|
||||
break;
|
||||
}
|
||||
|
||||
/* Add trace begin / end variants */
|
||||
for (i = 0; branch_types[i].name ; i++) {
|
||||
const char *name = branch_types[i].name;
|
||||
u32 type = branch_types[i].branch_type;
|
||||
char buf[64];
|
||||
|
||||
if (type == PERF_IP_FLAG_BRANCH ||
|
||||
(type & (PERF_IP_FLAG_TRACE_BEGIN | PERF_IP_FLAG_TRACE_END)))
|
||||
continue;
|
||||
|
||||
snprintf(buf, sizeof(buf), "trace begin / %s", name);
|
||||
err = db_export__branch_type(dbe, type | PERF_IP_FLAG_TRACE_BEGIN, buf);
|
||||
if (err)
|
||||
break;
|
||||
|
||||
snprintf(buf, sizeof(buf), "%s / trace end", name);
|
||||
err = db_export__branch_type(dbe, type | PERF_IP_FLAG_TRACE_END, buf);
|
||||
if (err)
|
||||
break;
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
|
|
|
@ -2682,7 +2682,7 @@ int perf_event__synthesize_sample(union perf_event *event, u64 type,
|
|||
return 0;
|
||||
}
|
||||
|
||||
struct format_field *perf_evsel__field(struct perf_evsel *evsel, const char *name)
|
||||
struct tep_format_field *perf_evsel__field(struct perf_evsel *evsel, const char *name)
|
||||
{
|
||||
return tep_find_field(evsel->tp_format, name);
|
||||
}
|
||||
|
@ -2690,7 +2690,7 @@ struct format_field *perf_evsel__field(struct perf_evsel *evsel, const char *nam
|
|||
void *perf_evsel__rawptr(struct perf_evsel *evsel, struct perf_sample *sample,
|
||||
const char *name)
|
||||
{
|
||||
struct format_field *field = perf_evsel__field(evsel, name);
|
||||
struct tep_format_field *field = perf_evsel__field(evsel, name);
|
||||
int offset;
|
||||
|
||||
if (!field)
|
||||
|
@ -2698,7 +2698,7 @@ void *perf_evsel__rawptr(struct perf_evsel *evsel, struct perf_sample *sample,
|
|||
|
||||
offset = field->offset;
|
||||
|
||||
if (field->flags & FIELD_IS_DYNAMIC) {
|
||||
if (field->flags & TEP_FIELD_IS_DYNAMIC) {
|
||||
offset = *(int *)(sample->raw_data + field->offset);
|
||||
offset &= 0xffff;
|
||||
}
|
||||
|
@ -2706,7 +2706,7 @@ void *perf_evsel__rawptr(struct perf_evsel *evsel, struct perf_sample *sample,
|
|||
return sample->raw_data + offset;
|
||||
}
|
||||
|
||||
u64 format_field__intval(struct format_field *field, struct perf_sample *sample,
|
||||
u64 format_field__intval(struct tep_format_field *field, struct perf_sample *sample,
|
||||
bool needs_swap)
|
||||
{
|
||||
u64 value;
|
||||
|
@ -2748,7 +2748,7 @@ u64 format_field__intval(struct format_field *field, struct perf_sample *sample,
|
|||
u64 perf_evsel__intval(struct perf_evsel *evsel, struct perf_sample *sample,
|
||||
const char *name)
|
||||
{
|
||||
struct format_field *field = perf_evsel__field(evsel, name);
|
||||
struct tep_format_field *field = perf_evsel__field(evsel, name);
|
||||
|
||||
if (!field)
|
||||
return 0;
|
||||
|
|
|
@ -102,7 +102,7 @@ struct perf_evsel {
|
|||
char *name;
|
||||
double scale;
|
||||
const char *unit;
|
||||
struct event_format *tp_format;
|
||||
struct tep_event_format *tp_format;
|
||||
off_t id_offset;
|
||||
struct perf_stat_evsel *stats;
|
||||
void *priv;
|
||||
|
@ -211,7 +211,7 @@ static inline struct perf_evsel *perf_evsel__newtp(const char *sys, const char *
|
|||
|
||||
struct perf_evsel *perf_evsel__new_cycles(bool precise);
|
||||
|
||||
struct event_format *event_format__new(const char *sys, const char *name);
|
||||
struct tep_event_format *event_format__new(const char *sys, const char *name);
|
||||
|
||||
void perf_evsel__init(struct perf_evsel *evsel,
|
||||
struct perf_event_attr *attr, int idx);
|
||||
|
@ -296,11 +296,11 @@ static inline char *perf_evsel__strval(struct perf_evsel *evsel,
|
|||
return perf_evsel__rawptr(evsel, sample, name);
|
||||
}
|
||||
|
||||
struct format_field;
|
||||
struct tep_format_field;
|
||||
|
||||
u64 format_field__intval(struct format_field *field, struct perf_sample *sample, bool needs_swap);
|
||||
u64 format_field__intval(struct tep_format_field *field, struct perf_sample *sample, bool needs_swap);
|
||||
|
||||
struct format_field *perf_evsel__field(struct perf_evsel *evsel, const char *name);
|
||||
struct tep_format_field *perf_evsel__field(struct perf_evsel *evsel, const char *name);
|
||||
|
||||
#define perf_evsel__match(evsel, t, c) \
|
||||
(evsel->attr.type == PERF_TYPE_##t && \
|
||||
|
|
|
@ -73,7 +73,7 @@ int perf_evsel__fprintf(struct perf_evsel *evsel,
|
|||
}
|
||||
|
||||
if (details->trace_fields) {
|
||||
struct format_field *field;
|
||||
struct tep_format_field *field;
|
||||
|
||||
if (evsel->attr.type != PERF_TYPE_TRACEPOINT) {
|
||||
printed += comma_fprintf(fp, &first, " (not a tracepoint)");
|
||||
|
|
|
@ -3206,7 +3206,7 @@ static int read_attr(int fd, struct perf_header *ph,
|
|||
static int perf_evsel__prepare_tracepoint_event(struct perf_evsel *evsel,
|
||||
struct tep_handle *pevent)
|
||||
{
|
||||
struct event_format *event;
|
||||
struct tep_event_format *event;
|
||||
char bf[128];
|
||||
|
||||
/* already prepared */
|
||||
|
|
|
@ -1165,7 +1165,7 @@ static int intel_pt_walk_tip(struct intel_pt_decoder *decoder)
|
|||
decoder->pge = false;
|
||||
decoder->continuous_period = false;
|
||||
decoder->pkt_state = INTEL_PT_STATE_IN_SYNC;
|
||||
decoder->state.to_ip = 0;
|
||||
decoder->state.type |= INTEL_PT_TRACE_END;
|
||||
return 0;
|
||||
}
|
||||
if (err == INTEL_PT_RETURN)
|
||||
|
@ -1179,9 +1179,13 @@ static int intel_pt_walk_tip(struct intel_pt_decoder *decoder)
|
|||
decoder->continuous_period = false;
|
||||
decoder->pkt_state = INTEL_PT_STATE_IN_SYNC;
|
||||
decoder->state.from_ip = decoder->ip;
|
||||
decoder->state.to_ip = 0;
|
||||
if (decoder->packet.count != 0)
|
||||
if (decoder->packet.count == 0) {
|
||||
decoder->state.to_ip = 0;
|
||||
} else {
|
||||
decoder->state.to_ip = decoder->last_ip;
|
||||
decoder->ip = decoder->last_ip;
|
||||
}
|
||||
decoder->state.type |= INTEL_PT_TRACE_END;
|
||||
} else {
|
||||
decoder->pkt_state = INTEL_PT_STATE_IN_SYNC;
|
||||
decoder->state.from_ip = decoder->ip;
|
||||
|
@ -1208,7 +1212,8 @@ static int intel_pt_walk_tip(struct intel_pt_decoder *decoder)
|
|||
decoder->pkt_state = INTEL_PT_STATE_IN_SYNC;
|
||||
decoder->ip = to_ip;
|
||||
decoder->state.from_ip = decoder->ip;
|
||||
decoder->state.to_ip = 0;
|
||||
decoder->state.to_ip = to_ip;
|
||||
decoder->state.type |= INTEL_PT_TRACE_END;
|
||||
return 0;
|
||||
}
|
||||
intel_pt_log_at("ERROR: Conditional branch when expecting indirect branch",
|
||||
|
@ -1640,14 +1645,15 @@ static int intel_pt_walk_fup_tip(struct intel_pt_decoder *decoder)
|
|||
|
||||
case INTEL_PT_TIP_PGD:
|
||||
decoder->state.from_ip = decoder->ip;
|
||||
decoder->state.to_ip = 0;
|
||||
if (decoder->packet.count != 0) {
|
||||
if (decoder->packet.count == 0) {
|
||||
decoder->state.to_ip = 0;
|
||||
} else {
|
||||
intel_pt_set_ip(decoder);
|
||||
intel_pt_log("Omitting PGD ip " x64_fmt "\n",
|
||||
decoder->ip);
|
||||
decoder->state.to_ip = decoder->ip;
|
||||
}
|
||||
decoder->pge = false;
|
||||
decoder->continuous_period = false;
|
||||
decoder->state.type |= INTEL_PT_TRACE_END;
|
||||
return 0;
|
||||
|
||||
case INTEL_PT_TIP_PGE:
|
||||
|
@ -1661,6 +1667,7 @@ static int intel_pt_walk_fup_tip(struct intel_pt_decoder *decoder)
|
|||
intel_pt_set_ip(decoder);
|
||||
decoder->state.to_ip = decoder->ip;
|
||||
}
|
||||
decoder->state.type |= INTEL_PT_TRACE_BEGIN;
|
||||
return 0;
|
||||
|
||||
case INTEL_PT_TIP:
|
||||
|
@ -1739,6 +1746,7 @@ next:
|
|||
intel_pt_set_ip(decoder);
|
||||
decoder->state.from_ip = 0;
|
||||
decoder->state.to_ip = decoder->ip;
|
||||
decoder->state.type |= INTEL_PT_TRACE_BEGIN;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -2077,9 +2085,13 @@ static int intel_pt_walk_to_ip(struct intel_pt_decoder *decoder)
|
|||
decoder->pge = decoder->packet.type != INTEL_PT_TIP_PGD;
|
||||
if (intel_pt_have_ip(decoder))
|
||||
intel_pt_set_ip(decoder);
|
||||
if (decoder->ip)
|
||||
return 0;
|
||||
break;
|
||||
if (!decoder->ip)
|
||||
break;
|
||||
if (decoder->packet.type == INTEL_PT_TIP_PGE)
|
||||
decoder->state.type |= INTEL_PT_TRACE_BEGIN;
|
||||
if (decoder->packet.type == INTEL_PT_TIP_PGD)
|
||||
decoder->state.type |= INTEL_PT_TRACE_END;
|
||||
return 0;
|
||||
|
||||
case INTEL_PT_FUP:
|
||||
if (intel_pt_have_ip(decoder))
|
||||
|
|
|
@ -37,6 +37,8 @@ enum intel_pt_sample_type {
|
|||
INTEL_PT_EX_STOP = 1 << 6,
|
||||
INTEL_PT_PWR_EXIT = 1 << 7,
|
||||
INTEL_PT_CBR_CHG = 1 << 8,
|
||||
INTEL_PT_TRACE_BEGIN = 1 << 9,
|
||||
INTEL_PT_TRACE_END = 1 << 10,
|
||||
};
|
||||
|
||||
enum intel_pt_period_type {
|
||||
|
|
|
@ -908,6 +908,11 @@ static void intel_pt_sample_flags(struct intel_pt_queue *ptq)
|
|||
ptq->insn_len = ptq->state->insn_len;
|
||||
memcpy(ptq->insn, ptq->state->insn, INTEL_PT_INSN_BUF_SZ);
|
||||
}
|
||||
|
||||
if (ptq->state->type & INTEL_PT_TRACE_BEGIN)
|
||||
ptq->flags |= PERF_IP_FLAG_TRACE_BEGIN;
|
||||
if (ptq->state->type & INTEL_PT_TRACE_END)
|
||||
ptq->flags |= PERF_IP_FLAG_TRACE_END;
|
||||
}
|
||||
|
||||
static int intel_pt_setup_queue(struct intel_pt *pt,
|
||||
|
|
|
@ -340,7 +340,7 @@ static bool is_tracepoint(struct pyrf_event *pevent)
|
|||
}
|
||||
|
||||
static PyObject*
|
||||
tracepoint_field(struct pyrf_event *pe, struct format_field *field)
|
||||
tracepoint_field(struct pyrf_event *pe, struct tep_format_field *field)
|
||||
{
|
||||
struct tep_handle *pevent = field->event->pevent;
|
||||
void *data = pe->sample.raw_data;
|
||||
|
@ -348,28 +348,28 @@ tracepoint_field(struct pyrf_event *pe, struct format_field *field)
|
|||
unsigned long long val;
|
||||
unsigned int offset, len;
|
||||
|
||||
if (field->flags & FIELD_IS_ARRAY) {
|
||||
if (field->flags & TEP_FIELD_IS_ARRAY) {
|
||||
offset = field->offset;
|
||||
len = field->size;
|
||||
if (field->flags & FIELD_IS_DYNAMIC) {
|
||||
if (field->flags & TEP_FIELD_IS_DYNAMIC) {
|
||||
val = tep_read_number(pevent, data + offset, len);
|
||||
offset = val;
|
||||
len = offset >> 16;
|
||||
offset &= 0xffff;
|
||||
}
|
||||
if (field->flags & FIELD_IS_STRING &&
|
||||
if (field->flags & TEP_FIELD_IS_STRING &&
|
||||
is_printable_array(data + offset, len)) {
|
||||
ret = _PyUnicode_FromString((char *)data + offset);
|
||||
} else {
|
||||
ret = PyByteArray_FromStringAndSize((const char *) data + offset, len);
|
||||
field->flags &= ~FIELD_IS_STRING;
|
||||
field->flags &= ~TEP_FIELD_IS_STRING;
|
||||
}
|
||||
} else {
|
||||
val = tep_read_number(pevent, data + field->offset,
|
||||
field->size);
|
||||
if (field->flags & FIELD_IS_POINTER)
|
||||
if (field->flags & TEP_FIELD_IS_POINTER)
|
||||
ret = PyLong_FromUnsignedLong((unsigned long) val);
|
||||
else if (field->flags & FIELD_IS_SIGNED)
|
||||
else if (field->flags & TEP_FIELD_IS_SIGNED)
|
||||
ret = PyLong_FromLong((long) val);
|
||||
else
|
||||
ret = PyLong_FromUnsignedLong((unsigned long) val);
|
||||
|
@ -383,10 +383,10 @@ get_tracepoint_field(struct pyrf_event *pevent, PyObject *attr_name)
|
|||
{
|
||||
const char *str = _PyUnicode_AsString(PyObject_Str(attr_name));
|
||||
struct perf_evsel *evsel = pevent->evsel;
|
||||
struct format_field *field;
|
||||
struct tep_format_field *field;
|
||||
|
||||
if (!evsel->tp_format) {
|
||||
struct event_format *tp_format;
|
||||
struct tep_event_format *tp_format;
|
||||
|
||||
tp_format = trace_event__tp_format_id(evsel->attr.config);
|
||||
if (!tp_format)
|
||||
|
@ -1240,7 +1240,7 @@ static struct {
|
|||
static PyObject *pyrf__tracepoint(struct pyrf_evsel *pevsel,
|
||||
PyObject *args, PyObject *kwargs)
|
||||
{
|
||||
struct event_format *tp_format;
|
||||
struct tep_event_format *tp_format;
|
||||
static char *kwlist[] = { "sys", "name", NULL };
|
||||
char *sys = NULL;
|
||||
char *name = NULL;
|
||||
|
|
|
@ -99,7 +99,7 @@ static void define_symbolic_value(const char *ev_name,
|
|||
LEAVE;
|
||||
}
|
||||
|
||||
static void define_symbolic_values(struct print_flag_sym *field,
|
||||
static void define_symbolic_values(struct tep_print_flag_sym *field,
|
||||
const char *ev_name,
|
||||
const char *field_name)
|
||||
{
|
||||
|
@ -157,7 +157,7 @@ static void define_flag_value(const char *ev_name,
|
|||
LEAVE;
|
||||
}
|
||||
|
||||
static void define_flag_values(struct print_flag_sym *field,
|
||||
static void define_flag_values(struct tep_print_flag_sym *field,
|
||||
const char *ev_name,
|
||||
const char *field_name)
|
||||
{
|
||||
|
@ -189,62 +189,62 @@ static void define_flag_field(const char *ev_name,
|
|||
LEAVE;
|
||||
}
|
||||
|
||||
static void define_event_symbols(struct event_format *event,
|
||||
static void define_event_symbols(struct tep_event_format *event,
|
||||
const char *ev_name,
|
||||
struct print_arg *args)
|
||||
struct tep_print_arg *args)
|
||||
{
|
||||
if (args == NULL)
|
||||
return;
|
||||
|
||||
switch (args->type) {
|
||||
case PRINT_NULL:
|
||||
case TEP_PRINT_NULL:
|
||||
break;
|
||||
case PRINT_ATOM:
|
||||
case TEP_PRINT_ATOM:
|
||||
define_flag_value(ev_name, cur_field_name, "0",
|
||||
args->atom.atom);
|
||||
zero_flag_atom = 0;
|
||||
break;
|
||||
case PRINT_FIELD:
|
||||
case TEP_PRINT_FIELD:
|
||||
free(cur_field_name);
|
||||
cur_field_name = strdup(args->field.name);
|
||||
break;
|
||||
case PRINT_FLAGS:
|
||||
case TEP_PRINT_FLAGS:
|
||||
define_event_symbols(event, ev_name, args->flags.field);
|
||||
define_flag_field(ev_name, cur_field_name, args->flags.delim);
|
||||
define_flag_values(args->flags.flags, ev_name, cur_field_name);
|
||||
break;
|
||||
case PRINT_SYMBOL:
|
||||
case TEP_PRINT_SYMBOL:
|
||||
define_event_symbols(event, ev_name, args->symbol.field);
|
||||
define_symbolic_field(ev_name, cur_field_name);
|
||||
define_symbolic_values(args->symbol.symbols, ev_name,
|
||||
cur_field_name);
|
||||
break;
|
||||
case PRINT_HEX:
|
||||
case PRINT_HEX_STR:
|
||||
case TEP_PRINT_HEX:
|
||||
case TEP_PRINT_HEX_STR:
|
||||
define_event_symbols(event, ev_name, args->hex.field);
|
||||
define_event_symbols(event, ev_name, args->hex.size);
|
||||
break;
|
||||
case PRINT_INT_ARRAY:
|
||||
case TEP_PRINT_INT_ARRAY:
|
||||
define_event_symbols(event, ev_name, args->int_array.field);
|
||||
define_event_symbols(event, ev_name, args->int_array.count);
|
||||
define_event_symbols(event, ev_name, args->int_array.el_size);
|
||||
break;
|
||||
case PRINT_BSTRING:
|
||||
case PRINT_DYNAMIC_ARRAY:
|
||||
case PRINT_DYNAMIC_ARRAY_LEN:
|
||||
case PRINT_STRING:
|
||||
case PRINT_BITMASK:
|
||||
case TEP_PRINT_BSTRING:
|
||||
case TEP_PRINT_DYNAMIC_ARRAY:
|
||||
case TEP_PRINT_DYNAMIC_ARRAY_LEN:
|
||||
case TEP_PRINT_STRING:
|
||||
case TEP_PRINT_BITMASK:
|
||||
break;
|
||||
case PRINT_TYPE:
|
||||
case TEP_PRINT_TYPE:
|
||||
define_event_symbols(event, ev_name, args->typecast.item);
|
||||
break;
|
||||
case PRINT_OP:
|
||||
case TEP_PRINT_OP:
|
||||
if (strcmp(args->op.op, ":") == 0)
|
||||
zero_flag_atom = 1;
|
||||
define_event_symbols(event, ev_name, args->op.left);
|
||||
define_event_symbols(event, ev_name, args->op.right);
|
||||
break;
|
||||
case PRINT_FUNC:
|
||||
case TEP_PRINT_FUNC:
|
||||
default:
|
||||
pr_err("Unsupported print arg type\n");
|
||||
/* we should warn... */
|
||||
|
@ -338,8 +338,8 @@ static void perl_process_tracepoint(struct perf_sample *sample,
|
|||
struct addr_location *al)
|
||||
{
|
||||
struct thread *thread = al->thread;
|
||||
struct event_format *event = evsel->tp_format;
|
||||
struct format_field *field;
|
||||
struct tep_event_format *event = evsel->tp_format;
|
||||
struct tep_format_field *field;
|
||||
static char handler[256];
|
||||
unsigned long long val;
|
||||
unsigned long s, ns;
|
||||
|
@ -388,9 +388,9 @@ static void perl_process_tracepoint(struct perf_sample *sample,
|
|||
/* common fields other than pid can be accessed via xsub fns */
|
||||
|
||||
for (field = event->format.fields; field; field = field->next) {
|
||||
if (field->flags & FIELD_IS_STRING) {
|
||||
if (field->flags & TEP_FIELD_IS_STRING) {
|
||||
int offset;
|
||||
if (field->flags & FIELD_IS_DYNAMIC) {
|
||||
if (field->flags & TEP_FIELD_IS_DYNAMIC) {
|
||||
offset = *(int *)(data + field->offset);
|
||||
offset &= 0xffff;
|
||||
} else
|
||||
|
@ -399,7 +399,7 @@ static void perl_process_tracepoint(struct perf_sample *sample,
|
|||
} else { /* FIELD_IS_NUMERIC */
|
||||
val = read_size(event, data + field->offset,
|
||||
field->size);
|
||||
if (field->flags & FIELD_IS_SIGNED) {
|
||||
if (field->flags & TEP_FIELD_IS_SIGNED) {
|
||||
XPUSHs(sv_2mortal(newSViv(val)));
|
||||
} else {
|
||||
XPUSHs(sv_2mortal(newSVuv(val)));
|
||||
|
@ -537,8 +537,8 @@ static int perl_stop_script(void)
|
|||
|
||||
static int perl_generate_script(struct tep_handle *pevent, const char *outfile)
|
||||
{
|
||||
struct event_format *event = NULL;
|
||||
struct format_field *f;
|
||||
struct tep_event_format *event = NULL;
|
||||
struct tep_format_field *f;
|
||||
char fname[PATH_MAX];
|
||||
int not_first, count;
|
||||
FILE *ofp;
|
||||
|
@ -646,11 +646,11 @@ sub print_backtrace\n\
|
|||
count++;
|
||||
|
||||
fprintf(ofp, "%s=", f->name);
|
||||
if (f->flags & FIELD_IS_STRING ||
|
||||
f->flags & FIELD_IS_FLAG ||
|
||||
f->flags & FIELD_IS_SYMBOLIC)
|
||||
if (f->flags & TEP_FIELD_IS_STRING ||
|
||||
f->flags & TEP_FIELD_IS_FLAG ||
|
||||
f->flags & TEP_FIELD_IS_SYMBOLIC)
|
||||
fprintf(ofp, "%%s");
|
||||
else if (f->flags & FIELD_IS_SIGNED)
|
||||
else if (f->flags & TEP_FIELD_IS_SIGNED)
|
||||
fprintf(ofp, "%%d");
|
||||
else
|
||||
fprintf(ofp, "%%u");
|
||||
|
@ -668,7 +668,7 @@ sub print_backtrace\n\
|
|||
if (++count % 5 == 0)
|
||||
fprintf(ofp, "\n\t ");
|
||||
|
||||
if (f->flags & FIELD_IS_FLAG) {
|
||||
if (f->flags & TEP_FIELD_IS_FLAG) {
|
||||
if ((count - 1) % 5 != 0) {
|
||||
fprintf(ofp, "\n\t ");
|
||||
count = 4;
|
||||
|
@ -678,7 +678,7 @@ sub print_backtrace\n\
|
|||
event->name);
|
||||
fprintf(ofp, "\"%s\", $%s)", f->name,
|
||||
f->name);
|
||||
} else if (f->flags & FIELD_IS_SYMBOLIC) {
|
||||
} else if (f->flags & TEP_FIELD_IS_SYMBOLIC) {
|
||||
if ((count - 1) % 5 != 0) {
|
||||
fprintf(ofp, "\n\t ");
|
||||
count = 4;
|
||||
|
|
|
@ -193,7 +193,7 @@ static void try_call_object(const char *handler_name, PyObject *args)
|
|||
call_object(handler, args, handler_name);
|
||||
}
|
||||
|
||||
static void define_value(enum print_arg_type field_type,
|
||||
static void define_value(enum tep_print_arg_type field_type,
|
||||
const char *ev_name,
|
||||
const char *field_name,
|
||||
const char *field_value,
|
||||
|
@ -204,7 +204,7 @@ static void define_value(enum print_arg_type field_type,
|
|||
unsigned long long value;
|
||||
unsigned n = 0;
|
||||
|
||||
if (field_type == PRINT_SYMBOL)
|
||||
if (field_type == TEP_PRINT_SYMBOL)
|
||||
handler_name = "define_symbolic_value";
|
||||
|
||||
t = PyTuple_New(4);
|
||||
|
@ -223,8 +223,8 @@ static void define_value(enum print_arg_type field_type,
|
|||
Py_DECREF(t);
|
||||
}
|
||||
|
||||
static void define_values(enum print_arg_type field_type,
|
||||
struct print_flag_sym *field,
|
||||
static void define_values(enum tep_print_arg_type field_type,
|
||||
struct tep_print_flag_sym *field,
|
||||
const char *ev_name,
|
||||
const char *field_name)
|
||||
{
|
||||
|
@ -235,7 +235,7 @@ static void define_values(enum print_arg_type field_type,
|
|||
define_values(field_type, field->next, ev_name, field_name);
|
||||
}
|
||||
|
||||
static void define_field(enum print_arg_type field_type,
|
||||
static void define_field(enum tep_print_arg_type field_type,
|
||||
const char *ev_name,
|
||||
const char *field_name,
|
||||
const char *delim)
|
||||
|
@ -244,10 +244,10 @@ static void define_field(enum print_arg_type field_type,
|
|||
PyObject *t;
|
||||
unsigned n = 0;
|
||||
|
||||
if (field_type == PRINT_SYMBOL)
|
||||
if (field_type == TEP_PRINT_SYMBOL)
|
||||
handler_name = "define_symbolic_field";
|
||||
|
||||
if (field_type == PRINT_FLAGS)
|
||||
if (field_type == TEP_PRINT_FLAGS)
|
||||
t = PyTuple_New(3);
|
||||
else
|
||||
t = PyTuple_New(2);
|
||||
|
@ -256,7 +256,7 @@ static void define_field(enum print_arg_type field_type,
|
|||
|
||||
PyTuple_SetItem(t, n++, _PyUnicode_FromString(ev_name));
|
||||
PyTuple_SetItem(t, n++, _PyUnicode_FromString(field_name));
|
||||
if (field_type == PRINT_FLAGS)
|
||||
if (field_type == TEP_PRINT_FLAGS)
|
||||
PyTuple_SetItem(t, n++, _PyUnicode_FromString(delim));
|
||||
|
||||
try_call_object(handler_name, t);
|
||||
|
@ -264,54 +264,54 @@ static void define_field(enum print_arg_type field_type,
|
|||
Py_DECREF(t);
|
||||
}
|
||||
|
||||
static void define_event_symbols(struct event_format *event,
|
||||
static void define_event_symbols(struct tep_event_format *event,
|
||||
const char *ev_name,
|
||||
struct print_arg *args)
|
||||
struct tep_print_arg *args)
|
||||
{
|
||||
if (args == NULL)
|
||||
return;
|
||||
|
||||
switch (args->type) {
|
||||
case PRINT_NULL:
|
||||
case TEP_PRINT_NULL:
|
||||
break;
|
||||
case PRINT_ATOM:
|
||||
define_value(PRINT_FLAGS, ev_name, cur_field_name, "0",
|
||||
case TEP_PRINT_ATOM:
|
||||
define_value(TEP_PRINT_FLAGS, ev_name, cur_field_name, "0",
|
||||
args->atom.atom);
|
||||
zero_flag_atom = 0;
|
||||
break;
|
||||
case PRINT_FIELD:
|
||||
case TEP_PRINT_FIELD:
|
||||
free(cur_field_name);
|
||||
cur_field_name = strdup(args->field.name);
|
||||
break;
|
||||
case PRINT_FLAGS:
|
||||
case TEP_PRINT_FLAGS:
|
||||
define_event_symbols(event, ev_name, args->flags.field);
|
||||
define_field(PRINT_FLAGS, ev_name, cur_field_name,
|
||||
define_field(TEP_PRINT_FLAGS, ev_name, cur_field_name,
|
||||
args->flags.delim);
|
||||
define_values(PRINT_FLAGS, args->flags.flags, ev_name,
|
||||
define_values(TEP_PRINT_FLAGS, args->flags.flags, ev_name,
|
||||
cur_field_name);
|
||||
break;
|
||||
case PRINT_SYMBOL:
|
||||
case TEP_PRINT_SYMBOL:
|
||||
define_event_symbols(event, ev_name, args->symbol.field);
|
||||
define_field(PRINT_SYMBOL, ev_name, cur_field_name, NULL);
|
||||
define_values(PRINT_SYMBOL, args->symbol.symbols, ev_name,
|
||||
define_field(TEP_PRINT_SYMBOL, ev_name, cur_field_name, NULL);
|
||||
define_values(TEP_PRINT_SYMBOL, args->symbol.symbols, ev_name,
|
||||
cur_field_name);
|
||||
break;
|
||||
case PRINT_HEX:
|
||||
case PRINT_HEX_STR:
|
||||
case TEP_PRINT_HEX:
|
||||
case TEP_PRINT_HEX_STR:
|
||||
define_event_symbols(event, ev_name, args->hex.field);
|
||||
define_event_symbols(event, ev_name, args->hex.size);
|
||||
break;
|
||||
case PRINT_INT_ARRAY:
|
||||
case TEP_PRINT_INT_ARRAY:
|
||||
define_event_symbols(event, ev_name, args->int_array.field);
|
||||
define_event_symbols(event, ev_name, args->int_array.count);
|
||||
define_event_symbols(event, ev_name, args->int_array.el_size);
|
||||
break;
|
||||
case PRINT_STRING:
|
||||
case TEP_PRINT_STRING:
|
||||
break;
|
||||
case PRINT_TYPE:
|
||||
case TEP_PRINT_TYPE:
|
||||
define_event_symbols(event, ev_name, args->typecast.item);
|
||||
break;
|
||||
case PRINT_OP:
|
||||
case TEP_PRINT_OP:
|
||||
if (strcmp(args->op.op, ":") == 0)
|
||||
zero_flag_atom = 1;
|
||||
define_event_symbols(event, ev_name, args->op.left);
|
||||
|
@ -319,11 +319,11 @@ static void define_event_symbols(struct event_format *event,
|
|||
break;
|
||||
default:
|
||||
/* gcc warns for these? */
|
||||
case PRINT_BSTRING:
|
||||
case PRINT_DYNAMIC_ARRAY:
|
||||
case PRINT_DYNAMIC_ARRAY_LEN:
|
||||
case PRINT_FUNC:
|
||||
case PRINT_BITMASK:
|
||||
case TEP_PRINT_BSTRING:
|
||||
case TEP_PRINT_DYNAMIC_ARRAY:
|
||||
case TEP_PRINT_DYNAMIC_ARRAY_LEN:
|
||||
case TEP_PRINT_FUNC:
|
||||
case TEP_PRINT_BITMASK:
|
||||
/* we should warn... */
|
||||
return;
|
||||
}
|
||||
|
@ -332,10 +332,10 @@ static void define_event_symbols(struct event_format *event,
|
|||
define_event_symbols(event, ev_name, args->next);
|
||||
}
|
||||
|
||||
static PyObject *get_field_numeric_entry(struct event_format *event,
|
||||
struct format_field *field, void *data)
|
||||
static PyObject *get_field_numeric_entry(struct tep_event_format *event,
|
||||
struct tep_format_field *field, void *data)
|
||||
{
|
||||
bool is_array = field->flags & FIELD_IS_ARRAY;
|
||||
bool is_array = field->flags & TEP_FIELD_IS_ARRAY;
|
||||
PyObject *obj = NULL, *list = NULL;
|
||||
unsigned long long val;
|
||||
unsigned int item_size, n_items, i;
|
||||
|
@ -353,7 +353,7 @@ static PyObject *get_field_numeric_entry(struct event_format *event,
|
|||
|
||||
val = read_size(event, data + field->offset + i * item_size,
|
||||
item_size);
|
||||
if (field->flags & FIELD_IS_SIGNED) {
|
||||
if (field->flags & TEP_FIELD_IS_SIGNED) {
|
||||
if ((long long)val >= LONG_MIN &&
|
||||
(long long)val <= LONG_MAX)
|
||||
obj = _PyLong_FromLong(val);
|
||||
|
@ -790,11 +790,11 @@ static void python_process_tracepoint(struct perf_sample *sample,
|
|||
struct perf_evsel *evsel,
|
||||
struct addr_location *al)
|
||||
{
|
||||
struct event_format *event = evsel->tp_format;
|
||||
struct tep_event_format *event = evsel->tp_format;
|
||||
PyObject *handler, *context, *t, *obj = NULL, *callchain;
|
||||
PyObject *dict = NULL, *all_entries_dict = NULL;
|
||||
static char handler_name[256];
|
||||
struct format_field *field;
|
||||
struct tep_format_field *field;
|
||||
unsigned long s, ns;
|
||||
unsigned n = 0;
|
||||
int pid;
|
||||
|
@ -867,22 +867,22 @@ static void python_process_tracepoint(struct perf_sample *sample,
|
|||
unsigned int offset, len;
|
||||
unsigned long long val;
|
||||
|
||||
if (field->flags & FIELD_IS_ARRAY) {
|
||||
if (field->flags & TEP_FIELD_IS_ARRAY) {
|
||||
offset = field->offset;
|
||||
len = field->size;
|
||||
if (field->flags & FIELD_IS_DYNAMIC) {
|
||||
if (field->flags & TEP_FIELD_IS_DYNAMIC) {
|
||||
val = tep_read_number(scripting_context->pevent,
|
||||
data + offset, len);
|
||||
offset = val;
|
||||
len = offset >> 16;
|
||||
offset &= 0xffff;
|
||||
}
|
||||
if (field->flags & FIELD_IS_STRING &&
|
||||
if (field->flags & TEP_FIELD_IS_STRING &&
|
||||
is_printable_array(data + offset, len)) {
|
||||
obj = _PyUnicode_FromString((char *) data + offset);
|
||||
} else {
|
||||
obj = PyByteArray_FromStringAndSize((const char *) data + offset, len);
|
||||
field->flags &= ~FIELD_IS_STRING;
|
||||
field->flags &= ~TEP_FIELD_IS_STRING;
|
||||
}
|
||||
} else { /* FIELD_IS_NUMERIC */
|
||||
obj = get_field_numeric_entry(event, field, data);
|
||||
|
@ -1590,8 +1590,8 @@ static int python_stop_script(void)
|
|||
|
||||
static int python_generate_script(struct tep_handle *pevent, const char *outfile)
|
||||
{
|
||||
struct event_format *event = NULL;
|
||||
struct format_field *f;
|
||||
struct tep_event_format *event = NULL;
|
||||
struct tep_format_field *f;
|
||||
char fname[PATH_MAX];
|
||||
int not_first, count;
|
||||
FILE *ofp;
|
||||
|
@ -1686,12 +1686,12 @@ static int python_generate_script(struct tep_handle *pevent, const char *outfile
|
|||
count++;
|
||||
|
||||
fprintf(ofp, "%s=", f->name);
|
||||
if (f->flags & FIELD_IS_STRING ||
|
||||
f->flags & FIELD_IS_FLAG ||
|
||||
f->flags & FIELD_IS_ARRAY ||
|
||||
f->flags & FIELD_IS_SYMBOLIC)
|
||||
if (f->flags & TEP_FIELD_IS_STRING ||
|
||||
f->flags & TEP_FIELD_IS_FLAG ||
|
||||
f->flags & TEP_FIELD_IS_ARRAY ||
|
||||
f->flags & TEP_FIELD_IS_SYMBOLIC)
|
||||
fprintf(ofp, "%%s");
|
||||
else if (f->flags & FIELD_IS_SIGNED)
|
||||
else if (f->flags & TEP_FIELD_IS_SIGNED)
|
||||
fprintf(ofp, "%%d");
|
||||
else
|
||||
fprintf(ofp, "%%u");
|
||||
|
@ -1709,7 +1709,7 @@ static int python_generate_script(struct tep_handle *pevent, const char *outfile
|
|||
if (++count % 5 == 0)
|
||||
fprintf(ofp, "\n\t\t");
|
||||
|
||||
if (f->flags & FIELD_IS_FLAG) {
|
||||
if (f->flags & TEP_FIELD_IS_FLAG) {
|
||||
if ((count - 1) % 5 != 0) {
|
||||
fprintf(ofp, "\n\t\t");
|
||||
count = 4;
|
||||
|
@ -1719,7 +1719,7 @@ static int python_generate_script(struct tep_handle *pevent, const char *outfile
|
|||
event->name);
|
||||
fprintf(ofp, "\"%s\", %s)", f->name,
|
||||
f->name);
|
||||
} else if (f->flags & FIELD_IS_SYMBOLIC) {
|
||||
} else if (f->flags & TEP_FIELD_IS_SYMBOLIC) {
|
||||
if ((count - 1) % 5 != 0) {
|
||||
fprintf(ofp, "\n\t\t");
|
||||
count = 4;
|
||||
|
|
|
@ -1884,7 +1884,7 @@ static int __sort_dimension__add_hpp_output(struct sort_dimension *sd,
|
|||
struct hpp_dynamic_entry {
|
||||
struct perf_hpp_fmt hpp;
|
||||
struct perf_evsel *evsel;
|
||||
struct format_field *field;
|
||||
struct tep_format_field *field;
|
||||
unsigned dynamic_len;
|
||||
bool raw_trace;
|
||||
};
|
||||
|
@ -1899,7 +1899,7 @@ static int hde_width(struct hpp_dynamic_entry *hde)
|
|||
if (namelen > len)
|
||||
len = namelen;
|
||||
|
||||
if (!(hde->field->flags & FIELD_IS_STRING)) {
|
||||
if (!(hde->field->flags & TEP_FIELD_IS_STRING)) {
|
||||
/* length for print hex numbers */
|
||||
fieldlen = hde->field->size * 2 + 2;
|
||||
}
|
||||
|
@ -1915,7 +1915,7 @@ static void update_dynamic_len(struct hpp_dynamic_entry *hde,
|
|||
struct hist_entry *he)
|
||||
{
|
||||
char *str, *pos;
|
||||
struct format_field *field = hde->field;
|
||||
struct tep_format_field *field = hde->field;
|
||||
size_t namelen;
|
||||
bool last = false;
|
||||
|
||||
|
@ -2000,7 +2000,7 @@ static int __sort__hde_entry(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp,
|
|||
struct hpp_dynamic_entry *hde;
|
||||
size_t len = fmt->user_len;
|
||||
char *str, *pos;
|
||||
struct format_field *field;
|
||||
struct tep_format_field *field;
|
||||
size_t namelen;
|
||||
bool last = false;
|
||||
int ret;
|
||||
|
@ -2060,7 +2060,7 @@ static int64_t __sort__hde_cmp(struct perf_hpp_fmt *fmt,
|
|||
struct hist_entry *a, struct hist_entry *b)
|
||||
{
|
||||
struct hpp_dynamic_entry *hde;
|
||||
struct format_field *field;
|
||||
struct tep_format_field *field;
|
||||
unsigned offset, size;
|
||||
|
||||
hde = container_of(fmt, struct hpp_dynamic_entry, hpp);
|
||||
|
@ -2071,7 +2071,7 @@ static int64_t __sort__hde_cmp(struct perf_hpp_fmt *fmt,
|
|||
}
|
||||
|
||||
field = hde->field;
|
||||
if (field->flags & FIELD_IS_DYNAMIC) {
|
||||
if (field->flags & TEP_FIELD_IS_DYNAMIC) {
|
||||
unsigned long long dyn;
|
||||
|
||||
tep_read_number_field(field, a->raw_data, &dyn);
|
||||
|
@ -2117,7 +2117,7 @@ static void hde_free(struct perf_hpp_fmt *fmt)
|
|||
}
|
||||
|
||||
static struct hpp_dynamic_entry *
|
||||
__alloc_dynamic_entry(struct perf_evsel *evsel, struct format_field *field,
|
||||
__alloc_dynamic_entry(struct perf_evsel *evsel, struct tep_format_field *field,
|
||||
int level)
|
||||
{
|
||||
struct hpp_dynamic_entry *hde;
|
||||
|
@ -2252,7 +2252,7 @@ static struct perf_evsel *find_evsel(struct perf_evlist *evlist, char *event_nam
|
|||
}
|
||||
|
||||
static int __dynamic_dimension__add(struct perf_evsel *evsel,
|
||||
struct format_field *field,
|
||||
struct tep_format_field *field,
|
||||
bool raw_trace, int level)
|
||||
{
|
||||
struct hpp_dynamic_entry *hde;
|
||||
|
@ -2270,7 +2270,7 @@ static int __dynamic_dimension__add(struct perf_evsel *evsel,
|
|||
static int add_evsel_fields(struct perf_evsel *evsel, bool raw_trace, int level)
|
||||
{
|
||||
int ret;
|
||||
struct format_field *field;
|
||||
struct tep_format_field *field;
|
||||
|
||||
field = evsel->tp_format->format.fields;
|
||||
while (field) {
|
||||
|
@ -2305,7 +2305,7 @@ static int add_all_matching_fields(struct perf_evlist *evlist,
|
|||
{
|
||||
int ret = -ESRCH;
|
||||
struct perf_evsel *evsel;
|
||||
struct format_field *field;
|
||||
struct tep_format_field *field;
|
||||
|
||||
evlist__for_each_entry(evlist, evsel) {
|
||||
if (evsel->attr.type != PERF_TYPE_TRACEPOINT)
|
||||
|
@ -2327,7 +2327,7 @@ static int add_dynamic_entry(struct perf_evlist *evlist, const char *tok,
|
|||
{
|
||||
char *str, *event_name, *field_name, *opt_name;
|
||||
struct perf_evsel *evsel;
|
||||
struct format_field *field;
|
||||
struct tep_format_field *field;
|
||||
bool raw_trace = symbol_conf.raw_trace;
|
||||
int ret = 0;
|
||||
|
||||
|
|
|
@ -36,6 +36,7 @@
|
|||
* @branch_count: the branch count when the entry was created
|
||||
* @cp: call path
|
||||
* @no_call: a 'call' was not seen
|
||||
* @trace_end: a 'call' but trace ended
|
||||
*/
|
||||
struct thread_stack_entry {
|
||||
u64 ret_addr;
|
||||
|
@ -44,6 +45,7 @@ struct thread_stack_entry {
|
|||
u64 branch_count;
|
||||
struct call_path *cp;
|
||||
bool no_call;
|
||||
bool trace_end;
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -112,7 +114,8 @@ static struct thread_stack *thread_stack__new(struct thread *thread,
|
|||
return ts;
|
||||
}
|
||||
|
||||
static int thread_stack__push(struct thread_stack *ts, u64 ret_addr)
|
||||
static int thread_stack__push(struct thread_stack *ts, u64 ret_addr,
|
||||
bool trace_end)
|
||||
{
|
||||
int err = 0;
|
||||
|
||||
|
@ -124,6 +127,7 @@ static int thread_stack__push(struct thread_stack *ts, u64 ret_addr)
|
|||
}
|
||||
}
|
||||
|
||||
ts->stack[ts->cnt].trace_end = trace_end;
|
||||
ts->stack[ts->cnt++].ret_addr = ret_addr;
|
||||
|
||||
return err;
|
||||
|
@ -150,6 +154,18 @@ static void thread_stack__pop(struct thread_stack *ts, u64 ret_addr)
|
|||
}
|
||||
}
|
||||
|
||||
static void thread_stack__pop_trace_end(struct thread_stack *ts)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
for (i = ts->cnt; i; ) {
|
||||
if (ts->stack[--i].trace_end)
|
||||
ts->cnt = i;
|
||||
else
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
static bool thread_stack__in_kernel(struct thread_stack *ts)
|
||||
{
|
||||
if (!ts->cnt)
|
||||
|
@ -254,10 +270,19 @@ int thread_stack__event(struct thread *thread, u32 flags, u64 from_ip,
|
|||
ret_addr = from_ip + insn_len;
|
||||
if (ret_addr == to_ip)
|
||||
return 0; /* Zero-length calls are excluded */
|
||||
return thread_stack__push(thread->ts, ret_addr);
|
||||
} else if (flags & PERF_IP_FLAG_RETURN) {
|
||||
if (!from_ip)
|
||||
return 0;
|
||||
return thread_stack__push(thread->ts, ret_addr,
|
||||
flags & PERF_IP_FLAG_TRACE_END);
|
||||
} else if (flags & PERF_IP_FLAG_TRACE_BEGIN) {
|
||||
/*
|
||||
* If the caller did not change the trace number (which would
|
||||
* have flushed the stack) then try to make sense of the stack.
|
||||
* Possibly, tracing began after returning to the current
|
||||
* address, so try to pop that. Also, do not expect a call made
|
||||
* when the trace ended, to return, so pop that.
|
||||
*/
|
||||
thread_stack__pop(thread->ts, to_ip);
|
||||
thread_stack__pop_trace_end(thread->ts);
|
||||
} else if ((flags & PERF_IP_FLAG_RETURN) && from_ip) {
|
||||
thread_stack__pop(thread->ts, to_ip);
|
||||
}
|
||||
|
||||
|
@ -332,7 +357,7 @@ void call_return_processor__free(struct call_return_processor *crp)
|
|||
|
||||
static int thread_stack__push_cp(struct thread_stack *ts, u64 ret_addr,
|
||||
u64 timestamp, u64 ref, struct call_path *cp,
|
||||
bool no_call)
|
||||
bool no_call, bool trace_end)
|
||||
{
|
||||
struct thread_stack_entry *tse;
|
||||
int err;
|
||||
|
@ -350,6 +375,7 @@ static int thread_stack__push_cp(struct thread_stack *ts, u64 ret_addr,
|
|||
tse->branch_count = ts->branch_count;
|
||||
tse->cp = cp;
|
||||
tse->no_call = no_call;
|
||||
tse->trace_end = trace_end;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -423,7 +449,7 @@ static int thread_stack__bottom(struct thread *thread, struct thread_stack *ts,
|
|||
return -ENOMEM;
|
||||
|
||||
return thread_stack__push_cp(thread->ts, ip, sample->time, ref, cp,
|
||||
true);
|
||||
true, false);
|
||||
}
|
||||
|
||||
static int thread_stack__no_call_return(struct thread *thread,
|
||||
|
@ -455,7 +481,7 @@ static int thread_stack__no_call_return(struct thread *thread,
|
|||
if (!cp)
|
||||
return -ENOMEM;
|
||||
return thread_stack__push_cp(ts, 0, sample->time, ref,
|
||||
cp, true);
|
||||
cp, true, false);
|
||||
}
|
||||
} else if (thread_stack__in_kernel(ts) && sample->ip < ks) {
|
||||
/* Return to userspace, so pop all kernel addresses */
|
||||
|
@ -480,7 +506,7 @@ static int thread_stack__no_call_return(struct thread *thread,
|
|||
return -ENOMEM;
|
||||
|
||||
err = thread_stack__push_cp(ts, sample->addr, sample->time, ref, cp,
|
||||
true);
|
||||
true, false);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
|
@ -500,7 +526,7 @@ static int thread_stack__trace_begin(struct thread *thread,
|
|||
|
||||
/* Pop trace end */
|
||||
tse = &ts->stack[ts->cnt - 1];
|
||||
if (tse->cp->sym == NULL && tse->cp->ip == 0) {
|
||||
if (tse->trace_end) {
|
||||
err = thread_stack__call_return(thread, ts, --ts->cnt,
|
||||
timestamp, ref, false);
|
||||
if (err)
|
||||
|
@ -529,7 +555,7 @@ static int thread_stack__trace_end(struct thread_stack *ts,
|
|||
ret_addr = sample->ip + sample->insn_len;
|
||||
|
||||
return thread_stack__push_cp(ts, ret_addr, sample->time, ref, cp,
|
||||
false);
|
||||
false, true);
|
||||
}
|
||||
|
||||
int thread_stack__process(struct thread *thread, struct comm *comm,
|
||||
|
@ -579,6 +605,7 @@ int thread_stack__process(struct thread *thread, struct comm *comm,
|
|||
ts->last_time = sample->time;
|
||||
|
||||
if (sample->flags & PERF_IP_FLAG_CALL) {
|
||||
bool trace_end = sample->flags & PERF_IP_FLAG_TRACE_END;
|
||||
struct call_path_root *cpr = ts->crp->cpr;
|
||||
struct call_path *cp;
|
||||
u64 ret_addr;
|
||||
|
@ -596,7 +623,7 @@ int thread_stack__process(struct thread *thread, struct comm *comm,
|
|||
if (!cp)
|
||||
return -ENOMEM;
|
||||
err = thread_stack__push_cp(ts, ret_addr, sample->time, ref,
|
||||
cp, false);
|
||||
cp, false, trace_end);
|
||||
} else if (sample->flags & PERF_IP_FLAG_RETURN) {
|
||||
if (!sample->ip || !sample->addr)
|
||||
return 0;
|
||||
|
|
|
@ -33,8 +33,8 @@ static int get_common_field(struct scripting_context *context,
|
|||
int *offset, int *size, const char *type)
|
||||
{
|
||||
struct tep_handle *pevent = context->pevent;
|
||||
struct event_format *event;
|
||||
struct format_field *field;
|
||||
struct tep_event_format *event;
|
||||
struct tep_format_field *field;
|
||||
|
||||
if (!*size) {
|
||||
if (!pevent->events)
|
||||
|
@ -94,9 +94,9 @@ int common_pc(struct scripting_context *context)
|
|||
}
|
||||
|
||||
unsigned long long
|
||||
raw_field_value(struct event_format *event, const char *name, void *data)
|
||||
raw_field_value(struct tep_event_format *event, const char *name, void *data)
|
||||
{
|
||||
struct format_field *field;
|
||||
struct tep_format_field *field;
|
||||
unsigned long long val;
|
||||
|
||||
field = tep_find_any_field(event, name);
|
||||
|
@ -108,12 +108,12 @@ raw_field_value(struct event_format *event, const char *name, void *data)
|
|||
return val;
|
||||
}
|
||||
|
||||
unsigned long long read_size(struct event_format *event, void *ptr, int size)
|
||||
unsigned long long read_size(struct tep_event_format *event, void *ptr, int size)
|
||||
{
|
||||
return tep_read_number(event->pevent, ptr, size);
|
||||
}
|
||||
|
||||
void event_format__fprintf(struct event_format *event,
|
||||
void event_format__fprintf(struct tep_event_format *event,
|
||||
int cpu, void *data, int size, FILE *fp)
|
||||
{
|
||||
struct tep_record record;
|
||||
|
@ -130,7 +130,7 @@ void event_format__fprintf(struct event_format *event,
|
|||
trace_seq_destroy(&s);
|
||||
}
|
||||
|
||||
void event_format__print(struct event_format *event,
|
||||
void event_format__print(struct tep_event_format *event,
|
||||
int cpu, void *data, int size)
|
||||
{
|
||||
return event_format__fprintf(event, cpu, data, size, stdout);
|
||||
|
@ -188,8 +188,8 @@ int parse_event_file(struct tep_handle *pevent,
|
|||
return tep_parse_event(pevent, buf, size, sys);
|
||||
}
|
||||
|
||||
struct event_format *trace_find_next_event(struct tep_handle *pevent,
|
||||
struct event_format *event)
|
||||
struct tep_event_format *trace_find_next_event(struct tep_handle *pevent,
|
||||
struct tep_event_format *event)
|
||||
{
|
||||
static int idx;
|
||||
|
||||
|
|
|
@ -102,7 +102,7 @@ static unsigned int read4(struct tep_handle *pevent)
|
|||
|
||||
if (do_read(&data, 4) < 0)
|
||||
return 0;
|
||||
return __data2host4(pevent, data);
|
||||
return __tep_data2host4(pevent, data);
|
||||
}
|
||||
|
||||
static unsigned long long read8(struct tep_handle *pevent)
|
||||
|
@ -111,7 +111,7 @@ static unsigned long long read8(struct tep_handle *pevent)
|
|||
|
||||
if (do_read(&data, 8) < 0)
|
||||
return 0;
|
||||
return __data2host8(pevent, data);
|
||||
return __tep_data2host8(pevent, data);
|
||||
}
|
||||
|
||||
static char *read_string(void)
|
||||
|
|
|
@ -72,12 +72,12 @@ void trace_event__cleanup(struct trace_event *t)
|
|||
/*
|
||||
* Returns pointer with encoded error via <linux/err.h> interface.
|
||||
*/
|
||||
static struct event_format*
|
||||
static struct tep_event_format*
|
||||
tp_format(const char *sys, const char *name)
|
||||
{
|
||||
char *tp_dir = get_events_file(sys);
|
||||
struct tep_handle *pevent = tevent.pevent;
|
||||
struct event_format *event = NULL;
|
||||
struct tep_event_format *event = NULL;
|
||||
char path[PATH_MAX];
|
||||
size_t size;
|
||||
char *data;
|
||||
|
@ -102,7 +102,7 @@ tp_format(const char *sys, const char *name)
|
|||
/*
|
||||
* Returns pointer with encoded error via <linux/err.h> interface.
|
||||
*/
|
||||
struct event_format*
|
||||
struct tep_event_format*
|
||||
trace_event__tp_format(const char *sys, const char *name)
|
||||
{
|
||||
if (!tevent_initialized && trace_event__init2())
|
||||
|
@ -111,7 +111,7 @@ trace_event__tp_format(const char *sys, const char *name)
|
|||
return tp_format(sys, name);
|
||||
}
|
||||
|
||||
struct event_format *trace_event__tp_format_id(int id)
|
||||
struct tep_event_format *trace_event__tp_format_id(int id)
|
||||
{
|
||||
if (!tevent_initialized && trace_event__init2())
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
|
|
@ -11,28 +11,28 @@ struct perf_sample;
|
|||
union perf_event;
|
||||
struct perf_tool;
|
||||
struct thread;
|
||||
struct plugin_list;
|
||||
struct tep_plugin_list;
|
||||
|
||||
struct trace_event {
|
||||
struct tep_handle *pevent;
|
||||
struct plugin_list *plugin_list;
|
||||
struct tep_plugin_list *plugin_list;
|
||||
};
|
||||
|
||||
int trace_event__init(struct trace_event *t);
|
||||
void trace_event__cleanup(struct trace_event *t);
|
||||
int trace_event__register_resolver(struct machine *machine,
|
||||
tep_func_resolver_t *func);
|
||||
struct event_format*
|
||||
struct tep_event_format*
|
||||
trace_event__tp_format(const char *sys, const char *name);
|
||||
|
||||
struct event_format *trace_event__tp_format_id(int id);
|
||||
struct tep_event_format *trace_event__tp_format_id(int id);
|
||||
|
||||
int bigendian(void);
|
||||
|
||||
void event_format__fprintf(struct event_format *event,
|
||||
void event_format__fprintf(struct tep_event_format *event,
|
||||
int cpu, void *data, int size, FILE *fp);
|
||||
|
||||
void event_format__print(struct event_format *event,
|
||||
void event_format__print(struct tep_event_format *event,
|
||||
int cpu, void *data, int size);
|
||||
|
||||
int parse_ftrace_file(struct tep_handle *pevent, char *buf, unsigned long size);
|
||||
|
@ -40,7 +40,7 @@ int parse_event_file(struct tep_handle *pevent,
|
|||
char *buf, unsigned long size, char *sys);
|
||||
|
||||
unsigned long long
|
||||
raw_field_value(struct event_format *event, const char *name, void *data);
|
||||
raw_field_value(struct tep_event_format *event, const char *name, void *data);
|
||||
|
||||
void parse_proc_kallsyms(struct tep_handle *pevent, char *file, unsigned int size);
|
||||
void parse_ftrace_printk(struct tep_handle *pevent, char *file, unsigned int size);
|
||||
|
@ -48,9 +48,9 @@ void parse_saved_cmdline(struct tep_handle *pevent, char *file, unsigned int siz
|
|||
|
||||
ssize_t trace_report(int fd, struct trace_event *tevent, bool repipe);
|
||||
|
||||
struct event_format *trace_find_next_event(struct tep_handle *pevent,
|
||||
struct event_format *event);
|
||||
unsigned long long read_size(struct event_format *event, void *ptr, int size);
|
||||
struct tep_event_format *trace_find_next_event(struct tep_handle *pevent,
|
||||
struct tep_event_format *event);
|
||||
unsigned long long read_size(struct tep_event_format *event, void *ptr, int size);
|
||||
unsigned long long eval_flag(const char *flag);
|
||||
|
||||
int read_tracing_data(int fd, struct list_head *pattrs);
|
||||
|
|
Loading…
Reference in New Issue