#ifndef PEVENT_H
#define PEVENT_H
#include <linux/perf_event.h>
#include "intel-pt.h"
#include <stdint.h>
#include <stddef.h>
#include <string.h>
struct pev_config {
size_t size;
uint64_t sample_type;
uint16_t time_shift;
uint32_t time_mult;
uint64_t time_zero;
};
static inline void pev_config_init(struct pev_config *config)
{
memset(config, 0, sizeof(*config));
config->size = sizeof(*config);
}
struct pev_record_mmap {
uint32_t pid, tid;
uint64_t addr;
uint64_t len;
uint64_t pgoff;
char filename[];
};
struct pev_record_lost {
uint64_t id;
uint64_t lost;
};
struct pev_record_comm {
uint32_t pid, tid;
char comm[];
};
struct pev_record_exit {
uint32_t pid, ppid;
uint32_t tid, ptid;
uint64_t time;
};
struct pev_record_throttle {
uint64_t time;
uint64_t id;
uint64_t stream_id;
};
struct pev_record_fork {
uint32_t pid, ppid;
uint32_t tid, ptid;
uint64_t time;
};
struct pev_record_mmap2 {
uint32_t pid, tid;
uint64_t addr;
uint64_t len;
uint64_t pgoff;
uint32_t maj, min;
uint64_t ino;
uint64_t ino_generation;
uint32_t prot, flags;
char filename[];
};
struct pev_record_aux {
uint64_t aux_offset;
uint64_t aux_size;
uint64_t flags;
};
struct pev_record_itrace_start {
uint32_t pid, tid;
};
struct pev_record_lost_samples {
uint64_t lost;
};
struct pev_record_switch_cpu_wide {
uint32_t next_prev_pid;
uint32_t next_prev_tid;
};
struct pev_event {
uint32_t type;
uint16_t misc;
union {
const struct pev_record_mmap *mmap;
const struct pev_record_lost *lost;
const struct pev_record_comm *comm;
const struct pev_record_exit *exit;
const struct pev_record_throttle *throttle;
const struct pev_record_fork *fork;
const struct pev_record_mmap2 *mmap2;
const struct pev_record_aux *aux;
const struct pev_record_itrace_start *itrace_start;
const struct pev_record_lost_samples *lost_samples;
const struct pev_record_switch_cpu_wide *switch_cpu_wide;
} record;
struct {
const uint32_t *pid;
const uint32_t *tid;
const uint64_t *time;
uint64_t tsc;
const uint64_t *id;
const uint64_t *stream_id;
const uint32_t *cpu;
const uint64_t *identifier;
} sample;
};
static inline void pev_event_init(struct pev_event *event)
{
memset(event, 0, sizeof(*event));
}
extern int pev_time_to_tsc(uint64_t *tsc, uint64_t time,
const struct pev_config *config);
extern int pev_time_from_tsc(uint64_t *time, uint64_t tsc,
const struct pev_config *config);
extern int pev_read(struct pev_event *event, const uint8_t *begin,
const uint8_t *end, const struct pev_config *config);
extern int pev_write(const struct pev_event *event, uint8_t *begin,
uint8_t *end, const struct pev_config *config);
#endif