Home | History | Annotate | Download | only in util
      1 #ifndef __PERF_RECORD_H
      2 #define __PERF_RECORD_H
      3 
      4 #include <limits.h>
      5 #include <stdio.h>
      6 
      7 #include "../perf.h"
      8 #include "map.h"
      9 #include "build-id.h"
     10 
     11 struct mmap_event {
     12 	struct perf_event_header header;
     13 	u32 pid, tid;
     14 	u64 start;
     15 	u64 len;
     16 	u64 pgoff;
     17 	char filename[PATH_MAX];
     18 };
     19 
     20 struct mmap2_event {
     21 	struct perf_event_header header;
     22 	u32 pid, tid;
     23 	u64 start;
     24 	u64 len;
     25 	u64 pgoff;
     26 	u32 maj;
     27 	u32 min;
     28 	u64 ino;
     29 	u64 ino_generation;
     30 	char filename[PATH_MAX];
     31 };
     32 
     33 struct comm_event {
     34 	struct perf_event_header header;
     35 	u32 pid, tid;
     36 	char comm[16];
     37 };
     38 
     39 struct fork_event {
     40 	struct perf_event_header header;
     41 	u32 pid, ppid;
     42 	u32 tid, ptid;
     43 	u64 time;
     44 };
     45 
     46 struct lost_event {
     47 	struct perf_event_header header;
     48 	u64 id;
     49 	u64 lost;
     50 };
     51 
     52 /*
     53  * PERF_FORMAT_ENABLED | PERF_FORMAT_RUNNING | PERF_FORMAT_ID
     54  */
     55 struct read_event {
     56 	struct perf_event_header header;
     57 	u32 pid, tid;
     58 	u64 value;
     59 	u64 time_enabled;
     60 	u64 time_running;
     61 	u64 id;
     62 };
     63 
     64 
     65 #define PERF_SAMPLE_MASK				\
     66 	(PERF_SAMPLE_IP | PERF_SAMPLE_TID |		\
     67 	 PERF_SAMPLE_TIME | PERF_SAMPLE_ADDR |		\
     68 	PERF_SAMPLE_ID | PERF_SAMPLE_STREAM_ID |	\
     69 	 PERF_SAMPLE_CPU | PERF_SAMPLE_PERIOD |		\
     70 	 PERF_SAMPLE_IDENTIFIER)
     71 
     72 struct sample_event {
     73 	struct perf_event_header        header;
     74 	u64 array[];
     75 };
     76 
     77 struct regs_dump {
     78 	u64 abi;
     79 	u64 *regs;
     80 };
     81 
     82 struct stack_dump {
     83 	u16 offset;
     84 	u64 size;
     85 	char *data;
     86 };
     87 
     88 struct sample_read_value {
     89 	u64 value;
     90 	u64 id;
     91 };
     92 
     93 struct sample_read {
     94 	u64 time_enabled;
     95 	u64 time_running;
     96 	union {
     97 		struct {
     98 			u64 nr;
     99 			struct sample_read_value *values;
    100 		} group;
    101 		struct sample_read_value one;
    102 	};
    103 };
    104 
    105 struct perf_sample {
    106 	u64 ip;
    107 	u32 pid, tid;
    108 	u64 time;
    109 	u64 addr;
    110 	u64 id;
    111 	u64 stream_id;
    112 	u64 period;
    113 	u64 weight;
    114 	u32 cpu;
    115 	u32 raw_size;
    116 	u64 data_src;
    117 	void *raw_data;
    118 	struct ip_callchain *callchain;
    119 	struct branch_stack *branch_stack;
    120 	struct regs_dump  user_regs;
    121 	struct stack_dump user_stack;
    122 	struct sample_read read;
    123 };
    124 
    125 #define PERF_MEM_DATA_SRC_NONE \
    126 	(PERF_MEM_S(OP, NA) |\
    127 	 PERF_MEM_S(LVL, NA) |\
    128 	 PERF_MEM_S(SNOOP, NA) |\
    129 	 PERF_MEM_S(LOCK, NA) |\
    130 	 PERF_MEM_S(TLB, NA))
    131 
    132 struct build_id_event {
    133 	struct perf_event_header header;
    134 	pid_t			 pid;
    135 	u8			 build_id[PERF_ALIGN(BUILD_ID_SIZE, sizeof(u64))];
    136 	char			 filename[];
    137 };
    138 
    139 enum perf_user_event_type { /* above any possible kernel type */
    140 	PERF_RECORD_USER_TYPE_START		= 64,
    141 	PERF_RECORD_HEADER_ATTR			= 64,
    142 	PERF_RECORD_HEADER_EVENT_TYPE		= 65, /* depreceated */
    143 	PERF_RECORD_HEADER_TRACING_DATA		= 66,
    144 	PERF_RECORD_HEADER_BUILD_ID		= 67,
    145 	PERF_RECORD_FINISHED_ROUND		= 68,
    146 	PERF_RECORD_HEADER_MAX
    147 };
    148 
    149 struct attr_event {
    150 	struct perf_event_header header;
    151 	struct perf_event_attr attr;
    152 	u64 id[];
    153 };
    154 
    155 #define MAX_EVENT_NAME 64
    156 
    157 struct perf_trace_event_type {
    158 	u64	event_id;
    159 	char	name[MAX_EVENT_NAME];
    160 };
    161 
    162 struct event_type_event {
    163 	struct perf_event_header header;
    164 	struct perf_trace_event_type event_type;
    165 };
    166 
    167 struct tracing_data_event {
    168 	struct perf_event_header header;
    169 	u32 size;
    170 };
    171 
    172 union perf_event {
    173 	struct perf_event_header	header;
    174 	struct mmap_event		mmap;
    175 	struct mmap2_event		mmap2;
    176 	struct comm_event		comm;
    177 	struct fork_event		fork;
    178 	struct lost_event		lost;
    179 	struct read_event		read;
    180 	struct sample_event		sample;
    181 	struct attr_event		attr;
    182 	struct event_type_event		event_type;
    183 	struct tracing_data_event	tracing_data;
    184 	struct build_id_event		build_id;
    185 };
    186 
    187 void perf_event__print_totals(void);
    188 
    189 struct perf_tool;
    190 struct thread_map;
    191 
    192 typedef int (*perf_event__handler_t)(struct perf_tool *tool,
    193 				     union perf_event *event,
    194 				     struct perf_sample *sample,
    195 				     struct machine *machine);
    196 
    197 int perf_event__synthesize_thread_map(struct perf_tool *tool,
    198 				      struct thread_map *threads,
    199 				      perf_event__handler_t process,
    200 				      struct machine *machine);
    201 int perf_event__synthesize_threads(struct perf_tool *tool,
    202 				   perf_event__handler_t process,
    203 				   struct machine *machine);
    204 int perf_event__synthesize_kernel_mmap(struct perf_tool *tool,
    205 				       perf_event__handler_t process,
    206 				       struct machine *machine,
    207 				       const char *symbol_name);
    208 
    209 int perf_event__synthesize_modules(struct perf_tool *tool,
    210 				   perf_event__handler_t process,
    211 				   struct machine *machine);
    212 
    213 int perf_event__process_comm(struct perf_tool *tool,
    214 			     union perf_event *event,
    215 			     struct perf_sample *sample,
    216 			     struct machine *machine);
    217 int perf_event__process_lost(struct perf_tool *tool,
    218 			     union perf_event *event,
    219 			     struct perf_sample *sample,
    220 			     struct machine *machine);
    221 int perf_event__process_mmap(struct perf_tool *tool,
    222 			     union perf_event *event,
    223 			     struct perf_sample *sample,
    224 			     struct machine *machine);
    225 int perf_event__process_mmap2(struct perf_tool *tool,
    226 			     union perf_event *event,
    227 			     struct perf_sample *sample,
    228 			     struct machine *machine);
    229 int perf_event__process_fork(struct perf_tool *tool,
    230 			     union perf_event *event,
    231 			     struct perf_sample *sample,
    232 			     struct machine *machine);
    233 int perf_event__process_exit(struct perf_tool *tool,
    234 			     union perf_event *event,
    235 			     struct perf_sample *sample,
    236 			     struct machine *machine);
    237 int perf_event__process(struct perf_tool *tool,
    238 			union perf_event *event,
    239 			struct perf_sample *sample,
    240 			struct machine *machine);
    241 
    242 struct addr_location;
    243 int perf_event__preprocess_sample(const union perf_event *self,
    244 				  struct machine *machine,
    245 				  struct addr_location *al,
    246 				  struct perf_sample *sample);
    247 
    248 const char *perf_event__name(unsigned int id);
    249 
    250 size_t perf_event__sample_event_size(const struct perf_sample *sample, u64 type,
    251 				     u64 sample_regs_user, u64 read_format);
    252 int perf_event__synthesize_sample(union perf_event *event, u64 type,
    253 				  u64 sample_regs_user, u64 read_format,
    254 				  const struct perf_sample *sample,
    255 				  bool swapped);
    256 
    257 size_t perf_event__fprintf_comm(union perf_event *event, FILE *fp);
    258 size_t perf_event__fprintf_mmap(union perf_event *event, FILE *fp);
    259 size_t perf_event__fprintf_mmap2(union perf_event *event, FILE *fp);
    260 size_t perf_event__fprintf_task(union perf_event *event, FILE *fp);
    261 size_t perf_event__fprintf(union perf_event *event, FILE *fp);
    262 
    263 #endif /* __PERF_RECORD_H */
    264