267 lines
7.0 KiB
C
267 lines
7.0 KiB
C
/* perMonLib.h - Performance Monitoring mechanism definitions header file */
|
|
|
|
/* Copyright 2001 Wind River Systems, Inc. */
|
|
|
|
/*
|
|
modification history
|
|
--------------------
|
|
01a,30jul01,hdn written
|
|
*/
|
|
|
|
#ifndef __INCperMonLibh
|
|
#define __INCperMonLibh
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
|
|
/* performance monitoring, number of counters, etc */
|
|
|
|
#define PM_N_COUNTER 18
|
|
#define EVENT_N_ESCR 2
|
|
#define EVENT_N_COUNTER 3
|
|
#define MSR_N_ESCR 8
|
|
|
|
/* performance monitoring event name/no */
|
|
|
|
#define PM_BRANCH_RETIRED 0
|
|
#define PM_MISPRED_BRANCH_RETIRED 1
|
|
#define PM_TC_DELIVER_MODE 2
|
|
#define PM_BPU_FETCH_REQUEST 3
|
|
#define PM_ITLB_REFERENCE 4
|
|
#define PM_MEMORY_CANCEL 5
|
|
#define PM_MEMORY_COMPLETE 6
|
|
#define PM_LOAD_PORT_REPLAY 7
|
|
#define PM_STORE_PORT_REPLAY 8
|
|
#define PM_MOB_LOAD_REPLAY 9
|
|
#define PM_PAGE_WALK_TYPE 10
|
|
#define PM_BSQ_2NDL_CACHE_REF 11
|
|
#define PM_IOQ_ALLOCATION 12
|
|
#define PM_FSB_DATA_ACTIVITY 13
|
|
#define PM_BSQ_ALLOCATION 14
|
|
#define PM_X87_ASSIST 15
|
|
#define PM_SSE_INPUT_ASSIST 16
|
|
#define PM_PACKED_SP_UOP 17
|
|
#define PM_PACKED_DP_UOP 18
|
|
#define PM_SCALAR_SP_UOP 19
|
|
#define PM_SCALAR_DP_UOP 20
|
|
#define PM_64BIT_MMX_UOP 21
|
|
#define PM_128BIT_MMX_UOP 22
|
|
#define PM_X87_FP_UOP 23
|
|
#define PM_X87_SIMD_MOVES_UOP 24
|
|
#define PM_MACHINE_CLEAR 25
|
|
#define PM_FRONT_END_EVENT 26
|
|
#define PM_EXECUTION_EVENT 27
|
|
#define PM_REPLAY_EVENT 28
|
|
#define PM_INSTR_RETIRED 29
|
|
#define PM_UOPS_RETIRED 30
|
|
|
|
/* metrics available for Front_end Tagging */
|
|
|
|
#define FRONT_MEMORY_LOADS 0
|
|
#define FRONT_MEMORY_STORES 1
|
|
|
|
/* metrics available for Execution Tagging */
|
|
|
|
#define EXEC_PACKED_SP_RETIRED 0
|
|
#define EXEC_PACKED_DP_RETIRED 1
|
|
#define EXEC_SCALAR_SP_RETIRED 2
|
|
#define EXEC_SCALAR_DP_RETIRED 3
|
|
#define EXEC_128BIT_MMX_RETIRED 4
|
|
#define EXEC_64BIT_MMX_RETIRED 5
|
|
#define EXEC_X87_FP_RETIRED 6
|
|
#define EXEC_X87_SIMD_MM_RETIRED 7
|
|
|
|
/* metrics available for Replay Tagging */
|
|
|
|
#define REPLAY_1CACHE_LOAD_MISS_RETIRED 0
|
|
#define REPLAY_2CACHE_LOAD_MISS_RETIRED 1
|
|
#define REPLAY_DTLB_LOAD_MISS_RETIRED 2
|
|
#define REPLAY_DTLB_STORE_MISS_RETIRED 3
|
|
#define REPLAY_DTLB_ALL_MISS_RETIRED 4
|
|
#define REPLAY_MOB_LOAD_REPLAY_RETIRED 5
|
|
#define REPLAY_SPLIT_LOAD_RETIRED 6
|
|
#define REPLAY_SPLIT_STORE_RETIRED 7
|
|
|
|
/* event mask available for Replay Tagging */
|
|
|
|
#define PARTIAL_DATA 0x10
|
|
#define UNALIGN_ADDR 0x20
|
|
#define SPLIT_LD 0x02
|
|
#define SPLIT_ST 0x02
|
|
|
|
/* CCCR bit definitions */
|
|
|
|
#define CCCR_ENABLE 0x00001000
|
|
#define CCCR_ENABLE_NOT 0xffffefff
|
|
#define CCCR_ESCR_SELECT 0x0000e000
|
|
#define CCCR_RSVD 0x00030000
|
|
#define CCCR_COMPARE 0x00040000
|
|
#define CCCR_COMPLIMENT 0x00080000
|
|
#define CCCR_THRESHOLD 0x00f00000
|
|
#define CCCR_EDGE 0x01000000
|
|
#define CCCR_FORCE_OVF 0x02000000
|
|
#define CCCR_OVF_PMI 0x04000000
|
|
#define CCCR_CASCADE 0x40000000
|
|
#define CCCR_OVF 0x80000000
|
|
|
|
/* ESCR bit definitions */
|
|
|
|
#define ESCR_USR 0x00000004
|
|
#define ESCR_OS 0x00000008
|
|
#define ESCR_TAG_ENABLE 0x00000010
|
|
#define ESCR_TAG_VALUE 0x000001e0
|
|
#define ESCR_EVENT_MASK 0x01fffe00
|
|
#define ESCR_EVENT_SELECT 0x7e000000
|
|
|
|
/* Replay Event Mask definitions */
|
|
|
|
#define REPLAY_NBOGUS 0x00000001
|
|
#define REPLAY_BOGUS 0x00000002
|
|
|
|
/* Execution Event Mask definitions */
|
|
|
|
#define EXEC_NBOGUS0 0x00000001
|
|
#define EXEC_NBOGUS1 0x00000002
|
|
#define EXEC_NBOGUS2 0x00000004
|
|
#define EXEC_NBOGUS3 0x00000008
|
|
#define EXEC_BOGUS0 0x00000010
|
|
#define EXEC_BOGUS1 0x00000020
|
|
#define EXEC_BOGUS2 0x00000040
|
|
#define EXEC_BOGUS3 0x00000080
|
|
|
|
|
|
#ifndef _ASMLANGUAGE
|
|
|
|
typedef struct perMonMsr /* PM CCCR-ESCR table */
|
|
{
|
|
short counter;
|
|
short cccr;
|
|
short escr[MSR_N_ESCR];
|
|
} PER_MON_MSR;
|
|
|
|
typedef struct perMonMsrUse /* PM MSRs selected and its value */
|
|
{
|
|
BOOL used;
|
|
int escrMsr;
|
|
int counterValue;
|
|
int cccrValue;
|
|
int escrValue;
|
|
int pebsEnable;
|
|
int pebsMatrix;
|
|
} PER_MON_MSR_USE;
|
|
|
|
typedef struct perMonEvent /* PM event table */
|
|
{
|
|
char * name;
|
|
short escr[EVENT_N_ESCR];
|
|
char counterNo[EVENT_N_ESCR][EVENT_N_COUNTER];
|
|
int eventSelect;
|
|
int eventMask;
|
|
int cccrSelect;
|
|
BOOL pebs;
|
|
} PER_MON_EVENT;
|
|
|
|
typedef struct perMonReplayTag /* Replay Tagging Metrics table */
|
|
{
|
|
char * name;
|
|
int pebsEnable;
|
|
int pebsMatrix;
|
|
int upEvent;
|
|
int upEventMask;
|
|
int eventMask;
|
|
} PER_MON_REPLAY_TAG;
|
|
|
|
typedef struct perMonExecTag /* Execution Tagging Metrics table */
|
|
{
|
|
char * name;
|
|
int upEvent;
|
|
int upEventMask;
|
|
int upTagValue;
|
|
int eventMask;
|
|
} PER_MON_EXEC_TAG;
|
|
|
|
|
|
|
|
/* function declarations */
|
|
|
|
#if defined(__STDC__) || defined(__cplusplus)
|
|
|
|
extern void perMonLibInit (void);
|
|
extern STATUS perMonInt (void);
|
|
extern int perMonCget32 (int counterNo);
|
|
extern long long int perMonCget40 (int counterNo);
|
|
extern void perMonCenable (int cccr);
|
|
extern void perMonCdisable (int cccr);
|
|
|
|
extern void perMonIntEnable (void);
|
|
extern void perMonIntDisable (void);
|
|
extern int perMonCccrGet (int counterNo, PER_MON_MSR_USE * pMsrUse);
|
|
extern void perMonCccrSet (int counterNo, int value,
|
|
PER_MON_MSR_USE *pMsrUse);
|
|
extern int perMonEscrGet (int counterNo, PER_MON_MSR_USE *pMsrUse);
|
|
extern void perMonEscrSet (int counterNo, int value,
|
|
PER_MON_MSR_USE *pMsrUse);
|
|
extern void perMonOsSet (int counterNo, PER_MON_MSR_USE * pMsrUse);
|
|
extern void perMonUsrSet (int counterNo, PER_MON_MSR_USE * pMsrUse);
|
|
extern void perMonIntSet (int counterNo, PER_MON_MSR_USE * pMsrUse);
|
|
extern void perMonIntClear (int counterNo, PER_MON_MSR_USE * pMsrUse);
|
|
extern void perMonCset (int counterNo, long long int * pValue);
|
|
extern void perMonCstart (int counterNo);
|
|
extern void perMonCstop (int counterNo);
|
|
extern STATUS perMonEventSelect (int event, int escrMsr, int counterNo,
|
|
int eventMask, int * pCounterMsr,
|
|
int * pCccrMsr, int * pCccrValue,
|
|
int * pEscrValue);
|
|
extern STATUS perMonReplaySelect (int metric, int * pUpEvent, int * pUpEventM,
|
|
int * pPebsEnable, int * pPebsMatrix,
|
|
int * pEventMask);
|
|
extern STATUS perMonExecSelect (int metric, int * pUpEvent, int * pUpEventM,
|
|
int * pUpTagValue, int * pEventMask);
|
|
extern STATUS perMonEventSet (int event, int escrMsr, int counterNo,
|
|
int eventMask, int metric, int upEventNo,
|
|
int upEscrMsr, int upCounterNo,
|
|
PER_MON_MSR_USE * pMsrUse);
|
|
extern STATUS perMonMsrSet (PER_MON_MSR_USE * pMsrUse);
|
|
|
|
#else /* __STDC__ */
|
|
|
|
extern void perMonLibInit ();
|
|
extern STATUS perMonInt ();
|
|
extern int perMonCget32 ();
|
|
extern long long int perMonCget40 ();
|
|
extern void perMonCenable ();
|
|
extern void perMonCdisable ();
|
|
|
|
extern void perMonIntEnable ();
|
|
extern void perMonIntDisable ();
|
|
extern int perMonCccrGet ();
|
|
extern void perMonCccrSet ();
|
|
extern int perMonEscrGet ();
|
|
extern void perMonEscrSet ();
|
|
extern void perMonOsSet ();
|
|
extern void perMonUsrSet ();
|
|
extern void perMonIntSet ();
|
|
extern void perMonIntClear ();
|
|
extern void perMonCset ();
|
|
extern void perMonCstart ();
|
|
extern void perMonCstop ();
|
|
extern STATUS perMonEventSelect ();
|
|
extern STATUS perMonReplaySelect ();
|
|
extern STATUS perMonExecSelect ();
|
|
extern STATUS perMonEventSet ();
|
|
extern STATUS perMonMsrSet ();
|
|
|
|
#endif /* __STDC__ */
|
|
|
|
|
|
#endif /* _ASMLANGUAGE */
|
|
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* __INCperMonLibh */
|