1/* SPDX-License-Identifier: GPL-2.0 */ 2#ifndef __LIBPERF_EVENT_H 3#define __LIBPERF_EVENT_H 4 5#include <linux/perf_event.h> 6#include <linux/types.h> 7#include <linux/limits.h> 8#include <linux/bpf.h> 9#include <sys/types.h> /* pid_t */ 10 11#define event_contains(obj, mem) ((obj).header.size > offsetof(typeof(obj), mem)) 12 13struct perf_record_mmap { 14 struct perf_event_header header; 15 __u32 pid, tid; 16 __u64 start; 17 __u64 len; 18 __u64 pgoff; 19 char filename[PATH_MAX]; 20}; 21 22struct perf_record_mmap2 { 23 struct perf_event_header header; 24 __u32 pid, tid; 25 __u64 start; 26 __u64 len; 27 __u64 pgoff; 28 union { 29 struct { 30 __u32 maj; 31 __u32 min; 32 __u64 ino; 33 __u64 ino_generation; 34 }; 35 struct { 36 __u8 build_id_size; 37 __u8 __reserved_1; 38 __u16 __reserved_2; 39 __u8 build_id[20]; 40 }; 41 }; 42 __u32 prot; 43 __u32 flags; 44 char filename[PATH_MAX]; 45}; 46 47struct perf_record_comm { 48 struct perf_event_header header; 49 __u32 pid, tid; 50 char comm[16]; 51}; 52 53struct perf_record_namespaces { 54 struct perf_event_header header; 55 __u32 pid, tid; 56 __u64 nr_namespaces; 57 struct perf_ns_link_info link_info[]; 58}; 59 60struct perf_record_fork { 61 struct perf_event_header header; 62 __u32 pid, ppid; 63 __u32 tid, ptid; 64 __u64 time; 65}; 66 67struct perf_record_lost { 68 struct perf_event_header header; 69 __u64 id; 70 __u64 lost; 71}; 72 73#define PERF_RECORD_MISC_LOST_SAMPLES_BPF (1 << 15) 74 75struct perf_record_lost_samples { 76 struct perf_event_header header; 77 __u64 lost; 78}; 79 80/* 81 * PERF_FORMAT_ENABLED | PERF_FORMAT_RUNNING | PERF_FORMAT_ID | PERF_FORMAT_LOST 82 */ 83struct perf_record_read { 84 struct perf_event_header header; 85 __u32 pid, tid; 86 __u64 value; 87 __u64 time_enabled; 88 __u64 time_running; 89 __u64 id; 90 __u64 lost; 91}; 92 93struct perf_record_throttle { 94 struct perf_event_header header; 95 __u64 time; 96 __u64 id; 97 __u64 stream_id; 98}; 99 100#ifndef KSYM_NAME_LEN 101#define KSYM_NAME_LEN 512 102#endif 103 104struct perf_record_ksymbol { 105 struct perf_event_header header; 106 __u64 addr; 107 __u32 len; 108 __u16 ksym_type; 109 __u16 flags; 110 char name[KSYM_NAME_LEN]; 111}; 112 113struct perf_record_bpf_event { 114 struct perf_event_header header; 115 __u16 type; 116 __u16 flags; 117 __u32 id; 118 119 /* for bpf_prog types */ 120 __u8 tag[BPF_TAG_SIZE]; // prog tag 121}; 122 123struct perf_record_cgroup { 124 struct perf_event_header header; 125 __u64 id; 126 char path[PATH_MAX]; 127}; 128 129struct perf_record_text_poke_event { 130 struct perf_event_header header; 131 __u64 addr; 132 __u16 old_len; 133 __u16 new_len; 134 __u8 bytes[]; 135}; 136 137struct perf_record_sample { 138 struct perf_event_header header; 139 __u64 array[]; 140}; 141 142struct perf_record_switch { 143 struct perf_event_header header; 144 __u32 next_prev_pid; 145 __u32 next_prev_tid; 146}; 147 148struct perf_record_header_attr { 149 struct perf_event_header header; 150 struct perf_event_attr attr; 151 /* 152 * Array of u64 id follows here but we cannot use a flexible array 153 * because size of attr in the data can be different then current 154 * version. Please use perf_record_header_attr_id() below. 155 * 156 * __u64 id[]; // do not use this 157 */ 158}; 159 160/* Returns the pointer to id array based on the actual attr size. */ 161#define perf_record_header_attr_id(evt) \ 162 ((void *)&(evt)->attr.attr + (evt)->attr.attr.size) 163 164enum { 165 PERF_CPU_MAP__CPUS = 0, 166 PERF_CPU_MAP__MASK = 1, 167 PERF_CPU_MAP__RANGE_CPUS = 2, 168}; 169 170/* 171 * Array encoding of a perf_cpu_map where nr is the number of entries in cpu[] 172 * and each entry is a value for a CPU in the map. 173 */ 174struct cpu_map_entries { 175 __u16 nr; 176 __u16 cpu[]; 177}; 178 179/* Bitmap encoding of a perf_cpu_map where bitmap entries are 32-bit. */ 180struct perf_record_mask_cpu_map32 { 181 /* Number of mask values. */ 182 __u16 nr; 183 /* Constant 4. */ 184 __u16 long_size; 185 /* Bitmap data. */ 186 __u32 mask[]; 187}; 188 189/* Bitmap encoding of a perf_cpu_map where bitmap entries are 64-bit. */ 190struct perf_record_mask_cpu_map64 { 191 /* Number of mask values. */ 192 __u16 nr; 193 /* Constant 8. */ 194 __u16 long_size; 195 /* Legacy padding. */ 196 char __pad[4]; 197 /* Bitmap data. */ 198 __u64 mask[]; 199}; 200 201/* 202 * 'struct perf_record_cpu_map_data' is packed as unfortunately an earlier 203 * version had unaligned data and we wish to retain file format compatibility. 204 * -irogers 205 */ 206#pragma GCC diagnostic push 207#pragma GCC diagnostic ignored "-Wpacked" 208#pragma GCC diagnostic ignored "-Wattributes" 209 210/* 211 * An encoding of a CPU map for a range starting at start_cpu through to 212 * end_cpu. If any_cpu is 1, an any CPU (-1) value (aka dummy value) is present. 213 */ 214struct perf_record_range_cpu_map { 215 __u8 any_cpu; 216 __u8 __pad; 217 __u16 start_cpu; 218 __u16 end_cpu; 219}; 220 221struct perf_record_cpu_map_data { 222 __u16 type; 223 union { 224 /* Used when type == PERF_CPU_MAP__CPUS. */ 225 struct cpu_map_entries cpus_data; 226 /* Used when type == PERF_CPU_MAP__MASK and long_size == 4. */ 227 struct perf_record_mask_cpu_map32 mask32_data; 228 /* Used when type == PERF_CPU_MAP__MASK and long_size == 8. */ 229 struct perf_record_mask_cpu_map64 mask64_data; 230 /* Used when type == PERF_CPU_MAP__RANGE_CPUS. */ 231 struct perf_record_range_cpu_map range_cpu_data; 232 }; 233} __attribute__((packed)); 234 235#pragma GCC diagnostic pop 236 237struct perf_record_cpu_map { 238 struct perf_event_header header; 239 struct perf_record_cpu_map_data data; 240}; 241 242enum { 243 PERF_EVENT_UPDATE__UNIT = 0, 244 PERF_EVENT_UPDATE__SCALE = 1, 245 PERF_EVENT_UPDATE__NAME = 2, 246 PERF_EVENT_UPDATE__CPUS = 3, 247}; 248 249struct perf_record_event_update_cpus { 250 struct perf_record_cpu_map_data cpus; 251}; 252 253struct perf_record_event_update_scale { 254 double scale; 255}; 256 257struct perf_record_event_update { 258 struct perf_event_header header; 259 __u64 type; 260 __u64 id; 261 union { 262 /* Used when type == PERF_EVENT_UPDATE__SCALE. */ 263 struct perf_record_event_update_scale scale; 264 /* Used when type == PERF_EVENT_UPDATE__UNIT. */ 265 char unit[0]; 266 /* Used when type == PERF_EVENT_UPDATE__NAME. */ 267 char name[0]; 268 /* Used when type == PERF_EVENT_UPDATE__CPUS. */ 269 struct perf_record_event_update_cpus cpus; 270 }; 271}; 272 273#define MAX_EVENT_NAME 64 274 275struct perf_trace_event_type { 276 __u64 event_id; 277 char name[MAX_EVENT_NAME]; 278}; 279 280struct perf_record_header_event_type { 281 struct perf_event_header header; 282 struct perf_trace_event_type event_type; 283}; 284 285struct perf_record_header_tracing_data { 286 struct perf_event_header header; 287 __u32 size; 288}; 289 290#define PERF_RECORD_MISC_BUILD_ID_SIZE (1 << 15) 291 292struct perf_record_header_build_id { 293 struct perf_event_header header; 294 pid_t pid; 295 union { 296 __u8 build_id[24]; 297 struct { 298 __u8 data[20]; 299 __u8 size; 300 __u8 reserved1__; 301 __u16 reserved2__; 302 }; 303 }; 304 char filename[]; 305}; 306 307struct id_index_entry { 308 __u64 id; 309 __u64 idx; 310 __u64 cpu; 311 __u64 tid; 312}; 313 314struct id_index_entry_2 { 315 __u64 machine_pid; 316 __u64 vcpu; 317}; 318 319struct perf_record_id_index { 320 struct perf_event_header header; 321 __u64 nr; 322 struct id_index_entry entries[]; 323}; 324 325struct perf_record_auxtrace_info { 326 struct perf_event_header header; 327 __u32 type; 328 __u32 reserved__; /* For alignment */ 329 __u64 priv[]; 330}; 331 332struct perf_record_auxtrace { 333 struct perf_event_header header; 334 __u64 size; 335 __u64 offset; 336 __u64 reference; 337 __u32 idx; 338 __u32 tid; 339 __u32 cpu; 340 __u32 reserved__; /* For alignment */ 341}; 342 343#define MAX_AUXTRACE_ERROR_MSG 64 344 345struct perf_record_auxtrace_error { 346 struct perf_event_header header; 347 __u32 type; 348 __u32 code; 349 __u32 cpu; 350 __u32 pid; 351 __u32 tid; 352 __u32 fmt; 353 __u64 ip; 354 __u64 time; 355 char msg[MAX_AUXTRACE_ERROR_MSG]; 356 __u32 machine_pid; 357 __u32 vcpu; 358}; 359 360struct perf_record_aux { 361 struct perf_event_header header; 362 __u64 aux_offset; 363 __u64 aux_size; 364 __u64 flags; 365}; 366 367struct perf_record_itrace_start { 368 struct perf_event_header header; 369 __u32 pid; 370 __u32 tid; 371}; 372 373struct perf_record_aux_output_hw_id { 374 struct perf_event_header header; 375 __u64 hw_id; 376}; 377 378struct perf_record_thread_map_entry { 379 __u64 pid; 380 char comm[16]; 381}; 382 383struct perf_record_thread_map { 384 struct perf_event_header header; 385 __u64 nr; 386 struct perf_record_thread_map_entry entries[]; 387}; 388 389enum { 390 PERF_STAT_CONFIG_TERM__AGGR_MODE = 0, 391 PERF_STAT_CONFIG_TERM__INTERVAL = 1, 392 PERF_STAT_CONFIG_TERM__SCALE = 2, 393 PERF_STAT_CONFIG_TERM__AGGR_LEVEL = 3, 394 PERF_STAT_CONFIG_TERM__MAX = 4, 395}; 396 397struct perf_record_stat_config_entry { 398 __u64 tag; 399 __u64 val; 400}; 401 402struct perf_record_stat_config { 403 struct perf_event_header header; 404 __u64 nr; 405 struct perf_record_stat_config_entry data[]; 406}; 407 408struct perf_record_stat { 409 struct perf_event_header header; 410 411 __u64 id; 412 __u32 cpu; 413 __u32 thread; 414 415 union { 416 struct { 417 __u64 val; 418 __u64 ena; 419 __u64 run; 420 }; 421 __u64 values[3]; 422 }; 423}; 424 425struct perf_record_stat_round { 426 struct perf_event_header header; 427 __u64 type; 428 __u64 time; 429}; 430 431struct perf_record_time_conv { 432 struct perf_event_header header; 433 __u64 time_shift; 434 __u64 time_mult; 435 __u64 time_zero; 436 __u64 time_cycles; 437 __u64 time_mask; 438 __u8 cap_user_time_zero; 439 __u8 cap_user_time_short; 440 __u8 reserved[6]; /* For alignment */ 441}; 442 443struct perf_record_header_feature { 444 struct perf_event_header header; 445 __u64 feat_id; 446 char data[]; 447}; 448 449struct perf_record_compressed { 450 struct perf_event_header header; 451 char data[]; 452}; 453 454enum perf_user_event_type { /* above any possible kernel type */ 455 PERF_RECORD_USER_TYPE_START = 64, 456 PERF_RECORD_HEADER_ATTR = 64, 457 PERF_RECORD_HEADER_EVENT_TYPE = 65, /* deprecated */ 458 PERF_RECORD_HEADER_TRACING_DATA = 66, 459 PERF_RECORD_HEADER_BUILD_ID = 67, 460 PERF_RECORD_FINISHED_ROUND = 68, 461 PERF_RECORD_ID_INDEX = 69, 462 PERF_RECORD_AUXTRACE_INFO = 70, 463 PERF_RECORD_AUXTRACE = 71, 464 PERF_RECORD_AUXTRACE_ERROR = 72, 465 PERF_RECORD_THREAD_MAP = 73, 466 PERF_RECORD_CPU_MAP = 74, 467 PERF_RECORD_STAT_CONFIG = 75, 468 PERF_RECORD_STAT = 76, 469 PERF_RECORD_STAT_ROUND = 77, 470 PERF_RECORD_EVENT_UPDATE = 78, 471 PERF_RECORD_TIME_CONV = 79, 472 PERF_RECORD_HEADER_FEATURE = 80, 473 PERF_RECORD_COMPRESSED = 81, 474 PERF_RECORD_FINISHED_INIT = 82, 475 PERF_RECORD_HEADER_MAX 476}; 477 478union perf_event { 479 struct perf_event_header header; 480 struct perf_record_mmap mmap; 481 struct perf_record_mmap2 mmap2; 482 struct perf_record_comm comm; 483 struct perf_record_namespaces namespaces; 484 struct perf_record_cgroup cgroup; 485 struct perf_record_fork fork; 486 struct perf_record_lost lost; 487 struct perf_record_lost_samples lost_samples; 488 struct perf_record_read read; 489 struct perf_record_throttle throttle; 490 struct perf_record_sample sample; 491 struct perf_record_bpf_event bpf; 492 struct perf_record_ksymbol ksymbol; 493 struct perf_record_text_poke_event text_poke; 494 struct perf_record_header_attr attr; 495 struct perf_record_event_update event_update; 496 struct perf_record_header_event_type event_type; 497 struct perf_record_header_tracing_data tracing_data; 498 struct perf_record_header_build_id build_id; 499 struct perf_record_id_index id_index; 500 struct perf_record_auxtrace_info auxtrace_info; 501 struct perf_record_auxtrace auxtrace; 502 struct perf_record_auxtrace_error auxtrace_error; 503 struct perf_record_aux aux; 504 struct perf_record_itrace_start itrace_start; 505 struct perf_record_aux_output_hw_id aux_output_hw_id; 506 struct perf_record_switch context_switch; 507 struct perf_record_thread_map thread_map; 508 struct perf_record_cpu_map cpu_map; 509 struct perf_record_stat_config stat_config; 510 struct perf_record_stat stat; 511 struct perf_record_stat_round stat_round; 512 struct perf_record_time_conv time_conv; 513 struct perf_record_header_feature feat; 514 struct perf_record_compressed pack; 515}; 516 517#endif /* __LIBPERF_EVENT_H */ 518