blob: a6aa2cb28eb56d387a8394812a1196661eefdc35 [file] [log] [blame]
/*
* @file pe_profiling/operf_event.h
* Definitions of structures and methods for handling perf_event data
* from the kernel.
*
* @remark Copyright 2011 OProfile authors
* @remark Read the file COPYING
*
* Created on: Dec 7, 2011
* @author Maynard Johnson
* (C) Copyright IBM Corp. 2011
*/
#ifndef OPERF_EVENT_H_
#define OPERF_EVENT_H_
#include <limits.h>
#include <linux/perf_event.h>
#include <vector>
#include "op_types.h"
#define OP_MAX_EVT_NAME_LEN 64
#define OP_MAX_UM_NAME_LEN 64
#define OP_MAX_NUM_EVENTS 512
struct ip_event {
struct perf_event_header header;
u64 ip;
u32 pid, tid;
unsigned char __more_data[];
};
struct mmap_event {
struct perf_event_header header;
u32 pid, tid;
u64 start;
u64 len;
u64 pgoff;
char filename[PATH_MAX];
};
struct comm_event {
struct perf_event_header header;
u32 pid, tid;
char comm[16];
};
struct fork_event {
struct perf_event_header header;
u32 pid, ppid;
u32 tid, ptid;
u64 time;
};
struct lost_event {
struct perf_event_header header;
u64 id;
u64 lost;
};
struct read_event {
struct perf_event_header header;
u32 pid, tid;
u64 value;
u64 time_enabled;
u64 time_running;
u64 id;
};
struct sample_event {
struct perf_event_header header;
u64 array[];
};
struct throttle_event {
struct perf_event_header header;
u64 time;
u64 id;
u64 stream_id;
};
typedef union event_union {
struct perf_event_header header;
struct ip_event ip;
struct mmap_event mmap;
struct comm_event comm;
struct fork_event fork;
struct lost_event lost;
struct read_event read;
struct sample_event sample;
struct throttle_event throttle;
} event_t;
struct mmap_data {
void *base;
u64 mask;
u64 prev;
};
struct ip_callchain {
u64 nr;
u64 ips[0];
};
struct sample_data {
u64 ip;
u32 pid, tid;
u64 time;
u64 addr;
u64 id;
u32 cpu;
u64 period;
u32 raw_size;
void *raw_data;
struct ip_callchain * callchain;
};
typedef struct operf_event {
char name[OP_MAX_EVT_NAME_LEN];
// code for perf_events
u64 evt_code;
/* Base event code for oprofile sample file management; may be the same as evt_code,
* but different for certain architectures (e.g., ppc64). Also, when unit masks
* are used, the evt_code to be passed to perf_events includes both the
* base code from op_evt_code and the left-shifted unit mask bits.
*/
u64 op_evt_code;
// Make the evt_um and count fields unsigned long to match op_default_event_descr
unsigned long evt_um;
char um_name[OP_MAX_UM_NAME_LEN];
unsigned long count;
bool no_kernel;
bool no_user;
bool no_hv;
bool throttled; /* set to true if the event is ever throttled */
} operf_event_t;
struct mmap_info {
u64 offset, file_data_size, file_data_offset, head;
char * buf;
int traceFD;
};
struct op_file_section {
u64 size;
u64 offset;
};
struct op_file_attr {
struct perf_event_attr attr;
struct op_file_section ids;
};
struct op_header_evt_info {
struct perf_event_attr attr;
std::vector<u64> ids;
off_t id_offset;
};
struct OP_file_header {
u64 magic;
u64 size;
u64 attr_size;
struct op_file_section attrs;
struct op_file_section data;
};
struct OP_header {
struct op_header_evt_info h_attrs[OP_MAX_NUM_EVENTS];
off_t attr_offset;
off_t data_offset;
u64 data_size;
};
/* Some of the above definitions were borrowed from the perf tool's util/event.h file. */
#endif /* OPERF_EVENT_H_ */