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