Home | History | Annotate | Download | only in util
      1 #ifndef __PERF_RECORD_H
      2 #define __PERF_RECORD_H
      3 
      4 #include <limits.h>
      5 
      6 #include "../perf.h"
      7 #include "map.h"
      8 
      9 /*
     10  * PERF_SAMPLE_IP | PERF_SAMPLE_TID | *
     11  */
     12 struct ip_event {
     13 	struct perf_event_header header;
     14 	u64 ip;
     15 	u32 pid, tid;
     16 	unsigned char __more_data[];
     17 };
     18 
     19 struct mmap_event {
     20 	struct perf_event_header header;
     21 	u32 pid, tid;
     22 	u64 start;
     23 	u64 len;
     24 	u64 pgoff;
     25 	char filename[PATH_MAX];
     26 };
     27 
     28 struct comm_event {
     29 	struct perf_event_header header;
     30 	u32 pid, tid;
     31 	char comm[16];
     32 };
     33 
     34 struct fork_event {
     35 	struct perf_event_header header;
     36 	u32 pid, ppid;
     37 	u32 tid, ptid;
     38 	u64 time;
     39 };
     40 
     41 struct lost_event {
     42 	struct perf_event_header header;
     43 	u64 id;
     44 	u64 lost;
     45 };
     46 
     47 /*
     48  * PERF_FORMAT_ENABLED | PERF_FORMAT_RUNNING | PERF_FORMAT_ID
     49  */
     50 struct read_event {
     51 	struct perf_event_header header;
     52 	u32 pid, tid;
     53 	u64 value;
     54 	u64 time_enabled;
     55 	u64 time_running;
     56 	u64 id;
     57 };
     58 
     59 
     60 #define PERF_SAMPLE_MASK				\
     61 	(PERF_SAMPLE_IP | PERF_SAMPLE_TID |		\
     62 	 PERF_SAMPLE_TIME | PERF_SAMPLE_ADDR |		\
     63 	PERF_SAMPLE_ID | PERF_SAMPLE_STREAM_ID |	\
     64 	 PERF_SAMPLE_CPU | PERF_SAMPLE_PERIOD)
     65 
     66 struct sample_event {
     67 	struct perf_event_header        header;
     68 	u64 array[];
     69 };
     70 
     71 struct perf_sample {
     72 	u64 ip;
     73 	u32 pid, tid;
     74 	u64 time;
     75 	u64 addr;
     76 	u64 id;
     77 	u64 stream_id;
     78 	u64 period;
     79 	u32 cpu;
     80 	u32 raw_size;
     81 	void *raw_data;
     82 	struct ip_callchain *callchain;
     83 };
     84 
     85 #define BUILD_ID_SIZE 20
     86 
     87 struct build_id_event {
     88 	struct perf_event_header header;
     89 	pid_t			 pid;
     90         /* ANDROID_CHANGE_BEGIN */
     91 #if defined(__BIONIC__) || defined(__APPLE__)
     92 	u8			 build_id[KERNEL_ALIGN(BUILD_ID_SIZE, sizeof(u64))];
     93 #else
     94 	u8			 build_id[ALIGN(BUILD_ID_SIZE, sizeof(u64))];
     95 #endif
     96         /* ANDROID_CHANGE_END */
     97 	char			 filename[];
     98 };
     99 
    100 enum perf_user_event_type { /* above any possible kernel type */
    101 	PERF_RECORD_USER_TYPE_START		= 64,
    102 	PERF_RECORD_HEADER_ATTR			= 64,
    103 	PERF_RECORD_HEADER_EVENT_TYPE		= 65,
    104 	PERF_RECORD_HEADER_TRACING_DATA		= 66,
    105 	PERF_RECORD_HEADER_BUILD_ID		= 67,
    106 	PERF_RECORD_FINISHED_ROUND		= 68,
    107 	PERF_RECORD_HEADER_MAX
    108 };
    109 
    110 struct attr_event {
    111 	struct perf_event_header header;
    112 	struct perf_event_attr attr;
    113 	u64 id[];
    114 };
    115 
    116 #define MAX_EVENT_NAME 64
    117 
    118 struct perf_trace_event_type {
    119 	u64	event_id;
    120 	char	name[MAX_EVENT_NAME];
    121 };
    122 
    123 struct event_type_event {
    124 	struct perf_event_header header;
    125 	struct perf_trace_event_type event_type;
    126 };
    127 
    128 struct tracing_data_event {
    129 	struct perf_event_header header;
    130 	u32 size;
    131 };
    132 
    133 union perf_event {
    134 	struct perf_event_header	header;
    135 	struct ip_event			ip;
    136 	struct mmap_event		mmap;
    137 	struct comm_event		comm;
    138 	struct fork_event		fork;
    139 	struct lost_event		lost;
    140 	struct read_event		read;
    141 	struct sample_event		sample;
    142 	struct attr_event		attr;
    143 	struct event_type_event		event_type;
    144 	struct tracing_data_event	tracing_data;
    145 	struct build_id_event		build_id;
    146 };
    147 
    148 void perf_event__print_totals(void);
    149 
    150 struct perf_session;
    151 struct thread_map;
    152 
    153 typedef int (*perf_event__handler_synth_t)(union perf_event *event,
    154 					   struct perf_session *session);
    155 typedef int (*perf_event__handler_t)(union perf_event *event,
    156 				     struct perf_sample *sample,
    157 				      struct perf_session *session);
    158 
    159 int perf_event__synthesize_thread_map(struct thread_map *threads,
    160 				      perf_event__handler_t process,
    161 				      struct perf_session *session);
    162 int perf_event__synthesize_threads(perf_event__handler_t process,
    163 				   struct perf_session *session);
    164 int perf_event__synthesize_kernel_mmap(perf_event__handler_t process,
    165 				       struct perf_session *session,
    166 				       struct machine *machine,
    167 				       const char *symbol_name);
    168 
    169 int perf_event__synthesize_modules(perf_event__handler_t process,
    170 				   struct perf_session *session,
    171 				   struct machine *machine);
    172 
    173 int perf_event__process_comm(union perf_event *event, struct perf_sample *sample,
    174 			     struct perf_session *session);
    175 int perf_event__process_lost(union perf_event *event, struct perf_sample *sample,
    176 			     struct perf_session *session);
    177 int perf_event__process_mmap(union perf_event *event, struct perf_sample *sample,
    178 			     struct perf_session *session);
    179 int perf_event__process_task(union perf_event *event, struct perf_sample *sample,
    180 			     struct perf_session *session);
    181 int perf_event__process(union perf_event *event, struct perf_sample *sample,
    182 			struct perf_session *session);
    183 
    184 struct addr_location;
    185 int perf_event__preprocess_sample(const union perf_event *self,
    186 				  struct perf_session *session,
    187 				  struct addr_location *al,
    188 				  struct perf_sample *sample,
    189 				  symbol_filter_t filter);
    190 
    191 const char *perf_event__name(unsigned int id);
    192 
    193 int perf_event__parse_sample(const union perf_event *event, u64 type,
    194 			     int sample_size, bool sample_id_all,
    195 			     struct perf_sample *sample);
    196 
    197 #endif /* __PERF_RECORD_H */
    198