Blame src/components/perfctr/perfctr-x86.h

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