|
Packit |
577717 |
#ifndef _PERFCTR_X86_H
|
|
Packit |
577717 |
#define _PERFCTR_X86_H
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#include "perfmon/pfmlib.h"
|
|
Packit |
577717 |
#include "libperfctr.h"
|
|
Packit |
577717 |
#include "papi_lock.h"
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#define MAX_COUNTERS 18
|
|
Packit |
577717 |
#define MAX_COUNTER_TERMS 8
|
|
Packit |
577717 |
#define HW_OVERFLOW 1
|
|
Packit |
577717 |
#define hwd_pmc_control vperfctr_control
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#include "linux-context.h"
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* bit fields unique to P4 */
|
|
Packit |
577717 |
#define ESCR_T0_OS (1 << 3)
|
|
Packit |
577717 |
#define ESCR_T0_USR (1 << 2)
|
|
Packit |
577717 |
#define CCCR_OVF_PMI_T0 (1 << 26)
|
|
Packit |
577717 |
#define FAST_RDPMC (1 << 31)
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#ifndef CONFIG_SMP
|
|
Packit |
577717 |
/* Assert that CONFIG_SMP is set before including asm/atomic.h to
|
|
Packit |
577717 |
* get bus-locking atomic_* operations when building on UP kernels */
|
|
Packit |
577717 |
#define CONFIG_SMP
|
|
Packit |
577717 |
#endif
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Used in resources.selector to determine on which counters an event can live. */
|
|
Packit |
577717 |
#define CNTR1 0x1
|
|
Packit |
577717 |
#define CNTR2 0x2
|
|
Packit |
577717 |
#define CNTR3 0x4
|
|
Packit |
577717 |
#define CNTR4 0x8
|
|
Packit |
577717 |
#define CNTR5 0x10
|
|
Packit |
577717 |
#define CNTRS12 (CNTR1|CNTR2)
|
|
Packit |
577717 |
#define ALLCNTRS (CNTR1|CNTR2|CNTR3|CNTR4|CNTR5)
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#define HAS_MESI 0x0100 // indicates this event supports MESI modifiers
|
|
Packit |
577717 |
#define HAS_MOESI 0x0200 // indicates this event supports MOESI modifiers
|
|
Packit |
577717 |
#define HAS_UMASK 0x0400 // indicates this event has defined unit mask bits
|
|
Packit |
577717 |
#define MOESI_M 0x1000 // modified bit
|
|
Packit |
577717 |
#define MOESI_O 0x0800 // owner bit
|
|
Packit |
577717 |
#define MOESI_E 0x0400 // exclusive bit
|
|
Packit |
577717 |
#define MOESI_S 0x0200 // shared bit
|
|
Packit |
577717 |
#define MOESI_I 0x0100 // invalid bit
|
|
Packit |
577717 |
#define MOESI_M_INTEL MOESI_O // modified bit on Intel processors
|
|
Packit |
577717 |
#define MOESI_ALL 0x1F00 // mask for MOESI bits in event code or counter_cmd
|
|
Packit |
577717 |
#define UNIT_MASK_ALL 0xFF00 // mask for unit mask bits in event code or counter_cmd
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Masks to craft an eventcode to perfctr's liking */
|
|
Packit |
577717 |
#define PERF_CTR_MASK 0xFF000000
|
|
Packit |
577717 |
#define PERF_INV_CTR_MASK 0x00800000
|
|
Packit |
577717 |
#define PERF_ENABLE 0x00400000
|
|
Packit |
577717 |
#define PERF_INT_ENABLE 0x00100000
|
|
Packit |
577717 |
#define PERF_PIN_CONTROL 0x00080000
|
|
Packit |
577717 |
#define PERF_EDGE_DETECT 0x00040000
|
|
Packit |
577717 |
#define PERF_OS 0x00020000
|
|
Packit |
577717 |
#define PERF_USR 0x00010000
|
|
Packit |
577717 |
#define PERF_UNIT_MASK 0x0000FF00
|
|
Packit |
577717 |
#define PERF_EVNT_MASK 0x000000FF
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#define AI_ERROR "No support for a-mode counters after adding an i-mode counter"
|
|
Packit |
577717 |
#define VOPEN_ERROR "vperfctr_open() returned NULL, please run perfex -i to verify your perfctr installation"
|
|
Packit |
577717 |
#define GOPEN_ERROR "gperfctr_open() returned NULL"
|
|
Packit |
577717 |
#define VINFO_ERROR "vperfctr_info() returned < 0"
|
|
Packit |
577717 |
#define VCNTRL_ERROR "vperfctr_control() returned < 0"
|
|
Packit |
577717 |
#define RCNTRL_ERROR "rvperfctr_control() returned < 0"
|
|
Packit |
577717 |
#define GCNTRL_ERROR "gperfctr_control() returned < 0"
|
|
Packit |
577717 |
#define FOPEN_ERROR "fopen(%s) returned NULL"
|
|
Packit |
577717 |
#define STATE_MAL_ERROR "Error allocating perfctr structures"
|
|
Packit |
577717 |
#define MODEL_ERROR "This is not a supported cpu."
|
|
Packit |
577717 |
|
|
Packit |
577717 |
typedef struct X86_register
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
unsigned int selector; // mask for which counters in use
|
|
Packit |
577717 |
int counter_cmd; // event code
|
|
Packit |
577717 |
/****************** P4 elements *******************/
|
|
Packit |
577717 |
unsigned counter[2]; // bitmap of valid counters for each escr
|
|
Packit |
577717 |
unsigned escr[2]; // bit offset for each of 2 valid escrs
|
|
Packit |
577717 |
unsigned cccr; // value to be loaded into cccr register
|
|
Packit |
577717 |
unsigned event; // value defining event to be loaded into escr register
|
|
Packit |
577717 |
unsigned pebs_enable; // flag for PEBS counting
|
|
Packit |
577717 |
unsigned pebs_matrix_vert; // flag for PEBS_MATRIX_VERT
|
|
Packit |
577717 |
unsigned ireset;
|
|
Packit |
577717 |
} X86_register_t;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
typedef struct X86_reg_alloc
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
X86_register_t ra_bits; // info about this native event mapping
|
|
Packit |
577717 |
unsigned ra_selector; // bit mask showing which counters can carry this metric
|
|
Packit |
577717 |
unsigned ra_rank; // how many counters can carry this metric
|
|
Packit |
577717 |
/*************** P4 specific element ****************/
|
|
Packit |
577717 |
unsigned ra_escr[2]; // bit field array showing which esc registers can carry this metric
|
|
Packit |
577717 |
} X86_reg_alloc_t;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
typedef struct hwd_native
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
int index; // index in the native table, required
|
|
Packit |
577717 |
unsigned int selector; // which counters
|
|
Packit |
577717 |
unsigned char rank; // rank determines how many counters carry each metric
|
|
Packit |
577717 |
int position; // which counter this native event stays
|
|
Packit |
577717 |
int mod;
|
|
Packit |
577717 |
int link;
|
|
Packit |
577717 |
} hwd_native_t;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
typedef struct X86_perfctr_control
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
hwd_native_t native[MAX_COUNTERS];
|
|
Packit |
577717 |
int native_idx;
|
|
Packit |
577717 |
unsigned char master_selector;
|
|
Packit |
577717 |
X86_register_t allocated_registers;
|
|
Packit |
577717 |
struct vperfctr_control control;
|
|
Packit |
577717 |
struct perfctr_sum_ctrs state;
|
|
Packit |
577717 |
struct rvperfctr *rvperfctr; // Allow attach to be per-eventset
|
|
Packit |
577717 |
} X86_perfctr_control_t;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
typedef struct X86_perfctr_context
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
struct vperfctr *perfctr;
|
|
Packit |
577717 |
int stat_fd;
|
|
Packit |
577717 |
} X86_perfctr_context_t;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Override void* definitions from PAPI framework layer
|
|
Packit |
577717 |
with typedefs to conform to PAPI component layer code. */
|
|
Packit |
577717 |
#undef hwd_reg_alloc_t
|
|
Packit |
577717 |
typedef X86_reg_alloc_t hwd_reg_alloc_t;
|
|
Packit |
577717 |
#undef hwd_register_t
|
|
Packit |
577717 |
typedef X86_register_t hwd_register_t;
|
|
Packit |
577717 |
#undef hwd_control_state_t
|
|
Packit |
577717 |
typedef X86_perfctr_control_t hwd_control_state_t;
|
|
Packit |
577717 |
#undef hwd_context_t
|
|
Packit |
577717 |
typedef X86_perfctr_context_t hwd_context_t;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
typedef struct native_event_entry
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
char name[PAPI_MAX_STR_LEN]; // name of this event
|
|
Packit |
577717 |
char *description; // description of this event
|
|
Packit |
577717 |
X86_register_t resources; // resources required by this native event
|
|
Packit |
577717 |
} native_event_entry_t;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
typedef pfmlib_event_t pfm_register_t;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#endif
|