diff options
Diffstat (limited to 'tools/perf/util/trace-parse-events.h')
| -rw-r--r-- | tools/perf/util/trace-parse-events.h | 273 | 
1 files changed, 273 insertions, 0 deletions
diff --git a/tools/perf/util/trace-parse-events.h b/tools/perf/util/trace-parse-events.h new file mode 100644 index 00000000000..794ec15ef08 --- /dev/null +++ b/tools/perf/util/trace-parse-events.h @@ -0,0 +1,273 @@ +#ifndef __PERF_TRACE_EVENTS_H +#define __PERF_TRACE_EVENTS_H + +#include <stdbool.h> +#include <unistd.h> + +#define __unused __attribute__((unused)) + + +#ifndef PAGE_MASK +#define PAGE_MASK (page_size - 1) +#endif + +enum { +	RINGBUF_TYPE_PADDING		= 29, +	RINGBUF_TYPE_TIME_EXTEND	= 30, +	RINGBUF_TYPE_TIME_STAMP		= 31, +}; + +#ifndef TS_SHIFT +#define TS_SHIFT		27 +#endif + +#define NSECS_PER_SEC		1000000000ULL +#define NSECS_PER_USEC		1000ULL + +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_FLAG		= 32, +	FIELD_IS_SYMBOLIC	= 64, +}; + +struct format_field { +	struct format_field	*next; +	char			*type; +	char			*name; +	int			offset; +	int			size; +	unsigned long		flags; +}; + +struct format { +	int			nr_common; +	int			nr_fields; +	struct format_field	*common_fields; +	struct format_field	*fields; +}; + +struct print_arg_atom { +	char			*atom; +}; + +struct print_arg_string { +	char			*string; +	int			offset; +}; + +struct print_arg_field { +	char			*name; +	struct format_field	*field; +}; + +struct print_flag_sym { +	struct print_flag_sym	*next; +	char			*value; +	char			*str; +}; + +struct print_arg_typecast { +	char			*type; +	struct print_arg	*item; +}; + +struct print_arg_flags { +	struct print_arg	*field; +	char			*delim; +	struct print_flag_sym	*flags; +}; + +struct print_arg_symbol { +	struct print_arg	*field; +	struct print_flag_sym	*symbols; +}; + +struct print_arg; + +struct print_arg_op { +	char			*op; +	int			prio; +	struct print_arg	*left; +	struct print_arg	*right; +}; + +struct print_arg_func { +	char			*name; +	struct print_arg	*args; +}; + +enum print_arg_type { +	PRINT_NULL, +	PRINT_ATOM, +	PRINT_FIELD, +	PRINT_FLAGS, +	PRINT_SYMBOL, +	PRINT_TYPE, +	PRINT_STRING, +	PRINT_OP, +}; + +struct print_arg { +	struct print_arg		*next; +	enum 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_func		func; +		struct print_arg_string		string; +		struct print_arg_op		op; +	}; +}; + +struct print_fmt { +	char			*format; +	struct print_arg	*args; +}; + +struct event { +	struct event		*next; +	char			*name; +	int			id; +	int			flags; +	struct format		format; +	struct print_fmt	print_fmt; +	char			*system; +}; + +enum { +	EVENT_FL_ISFTRACE	= 0x01, +	EVENT_FL_ISPRINT	= 0x02, +	EVENT_FL_ISBPRINT	= 0x04, +	EVENT_FL_ISFUNC		= 0x08, +	EVENT_FL_ISFUNCENT	= 0x10, +	EVENT_FL_ISFUNCRET	= 0x20, + +	EVENT_FL_FAILED		= 0x80000000 +}; + +struct record { +	unsigned long long ts; +	int size; +	void *data; +}; + +struct record *trace_peek_data(int cpu); +struct record *trace_read_data(int cpu); + +void parse_set_info(int nr_cpus, int long_sz); + +ssize_t trace_report(int fd, bool repipe); + +void *malloc_or_die(unsigned int size); + +void parse_cmdlines(char *file, int size); +void parse_proc_kallsyms(char *file, unsigned int size); +void parse_ftrace_printk(char *file, unsigned int size); + +void print_funcs(void); +void print_printk(void); + +int parse_ftrace_file(char *buf, unsigned long size); +int parse_event_file(char *buf, unsigned long size, char *sys); +void print_trace_event(int cpu, void *data, int size); + +extern int file_bigendian; +extern int host_bigendian; + +int bigendian(void); + +static inline unsigned short __data2host2(unsigned short data) +{ +	unsigned short swap; + +	if (host_bigendian == file_bigendian) +		return data; + +	swap = ((data & 0xffULL) << 8) | +		((data & (0xffULL << 8)) >> 8); + +	return swap; +} + +static inline unsigned int __data2host4(unsigned int data) +{ +	unsigned int swap; + +	if (host_bigendian == file_bigendian) +		return data; + +	swap = ((data & 0xffULL) << 24) | +		((data & (0xffULL << 8)) << 8) | +		((data & (0xffULL << 16)) >> 8) | +		((data & (0xffULL << 24)) >> 24); + +	return swap; +} + +static inline unsigned long long __data2host8(unsigned long long data) +{ +	unsigned long long swap; + +	if (host_bigendian == file_bigendian) +		return data; + +	swap = ((data & 0xffULL) << 56) | +		((data & (0xffULL << 8)) << 40) | +		((data & (0xffULL << 16)) << 24) | +		((data & (0xffULL << 24)) << 8) | +		((data & (0xffULL << 32)) >> 8) | +		((data & (0xffULL << 40)) >> 24) | +		((data & (0xffULL << 48)) >> 40) | +		((data & (0xffULL << 56)) >> 56); + +	return swap; +} + +#define data2host2(ptr)		__data2host2(*(unsigned short *)ptr) +#define data2host4(ptr)		__data2host4(*(unsigned int *)ptr) +#define data2host8(ptr)		({				\ +	unsigned long long __val;				\ +								\ +	memcpy(&__val, (ptr), sizeof(unsigned long long));	\ +	__data2host8(__val);					\ +}) + +extern int header_page_ts_offset; +extern int header_page_ts_size; +extern int header_page_size_offset; +extern int header_page_size_size; +extern int header_page_data_offset; +extern int header_page_data_size; + +extern bool latency_format; + +int trace_parse_common_type(void *data); +int trace_parse_common_pid(void *data); +int parse_common_pc(void *data); +int parse_common_flags(void *data); +int parse_common_lock_depth(void *data); +struct event *trace_find_event(int id); +struct event *trace_find_next_event(struct event *event); +unsigned long long read_size(void *ptr, int size); +unsigned long long +raw_field_value(struct event *event, const char *name, void *data); +void *raw_field_ptr(struct event *event, const char *name, void *data); +unsigned long long eval_flag(const char *flag); + +/* taken from kernel/trace/trace.h */ +enum trace_flag_type { +	TRACE_FLAG_IRQS_OFF		= 0x01, +	TRACE_FLAG_IRQS_NOSUPPORT	= 0x02, +	TRACE_FLAG_NEED_RESCHED		= 0x04, +	TRACE_FLAG_HARDIRQ		= 0x08, +	TRACE_FLAG_SOFTIRQ		= 0x10, +}; + +#endif /* __PERF_TRACE_EVENTS_H */  |