18b40f521SJohn Kacur #ifndef __PERF_HEADER_H 28b40f521SJohn Kacur #define __PERF_HEADER_H 37c6a1c65SPeter Zijlstra 4cdd6c482SIngo Molnar #include "../../../include/linux/perf_event.h" 57c6a1c65SPeter Zijlstra #include <sys/types.h> 68d06367fSArnaldo Carvalho de Melo #include <stdbool.h> 77c6a1c65SPeter Zijlstra #include "types.h" 87c6a1c65SPeter Zijlstra 9db9f11e3SFrederic Weisbecker #include <linux/bitmap.h> 10db9f11e3SFrederic Weisbecker 117c6a1c65SPeter Zijlstra struct perf_header_attr { 12cdd6c482SIngo Molnar struct perf_event_attr attr; 137c6a1c65SPeter Zijlstra int ids, size; 147c6a1c65SPeter Zijlstra u64 *id; 157c6a1c65SPeter Zijlstra off_t id_offset; 167c6a1c65SPeter Zijlstra }; 177c6a1c65SPeter Zijlstra 1837562eacSArnaldo Carvalho de Melo enum { 1937562eacSArnaldo Carvalho de Melo HEADER_TRACE_INFO = 1, 2037562eacSArnaldo Carvalho de Melo HEADER_BUILD_ID, 2137562eacSArnaldo Carvalho de Melo HEADER_LAST_FEATURE, 2237562eacSArnaldo Carvalho de Melo }; 232ba08250SFrederic Weisbecker 242ba08250SFrederic Weisbecker #define HEADER_FEAT_BITS 256 252ba08250SFrederic Weisbecker 2637562eacSArnaldo Carvalho de Melo struct perf_file_section { 2737562eacSArnaldo Carvalho de Melo u64 offset; 2837562eacSArnaldo Carvalho de Melo u64 size; 2937562eacSArnaldo Carvalho de Melo }; 3037562eacSArnaldo Carvalho de Melo 3137562eacSArnaldo Carvalho de Melo struct perf_file_header { 3237562eacSArnaldo Carvalho de Melo u64 magic; 3337562eacSArnaldo Carvalho de Melo u64 size; 3437562eacSArnaldo Carvalho de Melo u64 attr_size; 3537562eacSArnaldo Carvalho de Melo struct perf_file_section attrs; 3637562eacSArnaldo Carvalho de Melo struct perf_file_section data; 3737562eacSArnaldo Carvalho de Melo struct perf_file_section event_types; 3837562eacSArnaldo Carvalho de Melo DECLARE_BITMAP(adds_features, HEADER_FEAT_BITS); 3937562eacSArnaldo Carvalho de Melo }; 4037562eacSArnaldo Carvalho de Melo 4137562eacSArnaldo Carvalho de Melo struct perf_header; 4237562eacSArnaldo Carvalho de Melo 4337562eacSArnaldo Carvalho de Melo int perf_file_header__read(struct perf_file_header *self, 4437562eacSArnaldo Carvalho de Melo struct perf_header *ph, int fd); 4537562eacSArnaldo Carvalho de Melo 467c6a1c65SPeter Zijlstra struct perf_header { 477c6a1c65SPeter Zijlstra int frozen; 487c6a1c65SPeter Zijlstra int attrs, size; 497c6a1c65SPeter Zijlstra struct perf_header_attr **attr; 50dfe5a504SArjan van de Ven s64 attr_offset; 517c6a1c65SPeter Zijlstra u64 data_offset; 527c6a1c65SPeter Zijlstra u64 data_size; 538755a8f2SArjan van de Ven u64 event_offset; 548755a8f2SArjan van de Ven u64 event_size; 55db9f11e3SFrederic Weisbecker DECLARE_BITMAP(adds_features, HEADER_FEAT_BITS); 567c6a1c65SPeter Zijlstra }; 577c6a1c65SPeter Zijlstra 584dc0a04bSArnaldo Carvalho de Melo struct perf_header *perf_header__new(void); 594dc0a04bSArnaldo Carvalho de Melo void perf_header__delete(struct perf_header *self); 604dc0a04bSArnaldo Carvalho de Melo 614dc0a04bSArnaldo Carvalho de Melo int perf_header__read(struct perf_header *self, int fd); 62d5eed904SArnaldo Carvalho de Melo int perf_header__write(struct perf_header *self, int fd, bool at_exit); 637c6a1c65SPeter Zijlstra 6411deb1f9SArnaldo Carvalho de Melo int perf_header__add_attr(struct perf_header *self, 657c6a1c65SPeter Zijlstra struct perf_header_attr *attr); 667c6a1c65SPeter Zijlstra 678755a8f2SArjan van de Ven void perf_header__push_event(u64 id, const char *name); 688755a8f2SArjan van de Ven char *perf_header__find_event(u64 id); 698755a8f2SArjan van de Ven 70dc79c0fcSArnaldo Carvalho de Melo struct perf_header_attr *perf_header_attr__new(struct perf_event_attr *attr); 7111deb1f9SArnaldo Carvalho de Melo void perf_header_attr__delete(struct perf_header_attr *self); 7211deb1f9SArnaldo Carvalho de Melo 7358754121SArnaldo Carvalho de Melo int perf_header_attr__add_id(struct perf_header_attr *self, u64 id); 747c6a1c65SPeter Zijlstra 750d3a5c88SFrederic Weisbecker u64 perf_header__sample_type(struct perf_header *header); 76cdd6c482SIngo Molnar struct perf_event_attr * 770d3a5c88SFrederic Weisbecker perf_header__find_attr(u64 id, struct perf_header *header); 788d06367fSArnaldo Carvalho de Melo void perf_header__set_feat(struct perf_header *self, int feat); 798d06367fSArnaldo Carvalho de Melo bool perf_header__has_feat(const struct perf_header *self, int feat); 807c6a1c65SPeter Zijlstra 8137562eacSArnaldo Carvalho de Melo int perf_header__process_sections(struct perf_header *self, int fd, 8237562eacSArnaldo Carvalho de Melo int (*process)(struct perf_file_section *self, 8337562eacSArnaldo Carvalho de Melo int feat, int fd)); 8437562eacSArnaldo Carvalho de Melo 858b40f521SJohn Kacur #endif /* __PERF_HEADER_H */ 86