Blame src/libpfm-3.y/include/perfmon/pfmlib_itanium.h

Packit 577717
/*
Packit 577717
 * Itanium PMU specific types and definitions
Packit 577717
 *
Packit 577717
 * Copyright (c) 2001-2006 Hewlett-Packard Development Company, L.P.
Packit 577717
 * Contributed by Stephane Eranian <eranian@hpl.hp.com>
Packit 577717
 *
Packit 577717
 * Permission is hereby granted, free of charge, to any person obtaining a copy
Packit 577717
 * of this software and associated documentation files (the "Software"), to deal
Packit 577717
 * in the Software without restriction, including without limitation the rights
Packit 577717
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
Packit 577717
 * of the Software, and to permit persons to whom the Software is furnished to do so,
Packit 577717
 * subject to the following conditions:
Packit 577717
 *
Packit 577717
 * The above copyright notice and this permission notice shall be included in all
Packit 577717
 * copies or substantial portions of the Software.
Packit 577717
 *
Packit 577717
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
Packit 577717
 * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
Packit 577717
 * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
Packit 577717
 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
Packit 577717
 * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
Packit 577717
 * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Packit 577717
 */
Packit 577717
#ifndef __PFMLIB_ITANIUM_H__
Packit 577717
#define __PFMLIB_ITANIUM_H__
Packit 577717
Packit 577717
#include <perfmon/pfmlib.h>
Packit 577717
#include <endian.h>
Packit 577717
Packit 577717
#if BYTE_ORDER != LITTLE_ENDIAN
Packit 577717
#error "this file only supports little endian environments"
Packit 577717
#endif
Packit 577717
Packit 577717
#ifdef __cplusplus
Packit 577717
extern "C" {
Packit 577717
#endif
Packit 577717
Packit 577717
#define PMU_ITA_FIRST_COUNTER	4	/* index of first PMC/PMD counter */
Packit 577717
#define PMU_ITA_NUM_COUNTERS	4	/* total numbers of PMC/PMD pairs used as counting monitors */
Packit 577717
#define PMU_ITA_NUM_PMCS	14	/* total number of PMCS defined */
Packit 577717
#define PMU_ITA_NUM_PMDS	18	/* total number of PMDS defined */
Packit 577717
#define PMU_ITA_NUM_BTB		8	/* total number of PMDS in BTB  */
Packit 577717
#define PMU_ITA_COUNTER_WIDTH	32	/* hardware counter bit width   */
Packit 577717
Packit 577717
Packit 577717
/*
Packit 577717
 * This structure provides a detailed way to setup a PMC register.
Packit 577717
 */
Packit 577717
typedef union {
Packit 577717
	unsigned long pmc_val;			/* complete register value */
Packit 577717
Packit 577717
	/* This is the Itanium-specific PMC layout for counter config */
Packit 577717
	struct {
Packit 577717
		unsigned long pmc_plm:4;	/* privilege level mask */
Packit 577717
		unsigned long pmc_ev:1;		/* external visibility */
Packit 577717
		unsigned long pmc_oi:1;		/* overflow interrupt */
Packit 577717
		unsigned long pmc_pm:1;		/* privileged monitor */
Packit 577717
		unsigned long pmc_ig1:1;	/* reserved */
Packit 577717
		unsigned long pmc_es:7;		/* event select */
Packit 577717
		unsigned long pmc_ig2:1;	/* reserved */
Packit 577717
		unsigned long pmc_umask:4;	/* unit mask */
Packit 577717
		unsigned long pmc_thres:3;	/* threshold */
Packit 577717
		unsigned long pmc_ig3:1;	/* reserved (missing from table on p6-17) */
Packit 577717
		unsigned long pmc_ism:2;	/* instruction set mask */
Packit 577717
		unsigned long pmc_ig4:38;	/* reserved */
Packit 577717
	} pmc_ita_count_reg;
Packit 577717
Packit 577717
	/* Opcode matcher */
Packit 577717
	struct {
Packit 577717
		unsigned long ignored1:3;
Packit 577717
		unsigned long mask:27;		/* mask encoding bits {40:27}{12:0} */
Packit 577717
		unsigned long ignored2:3;	
Packit 577717
		unsigned long match:27;		/* match encoding bits {40:27}{12:0} */
Packit 577717
		unsigned long b:1;		/* B-syllable */
Packit 577717
		unsigned long f:1;		/* F-syllable */
Packit 577717
		unsigned long i:1;		/* I-syllable */
Packit 577717
		unsigned long m:1;		/* M-syllable */
Packit 577717
	} pmc8_9_ita_reg;
Packit 577717
Packit 577717
	/* Instruction Event Address Registers */
Packit 577717
	struct {
Packit 577717
		unsigned long iear_plm:4;	/* privilege level mask */
Packit 577717
		unsigned long iear_ig1:2;	/* reserved */
Packit 577717
		unsigned long iear_pm:1;	/* privileged monitor */
Packit 577717
		unsigned long iear_tlb:1;	/* cache/tlb mode */
Packit 577717
		unsigned long iear_ig2:8;	/* reserved */
Packit 577717
		unsigned long iear_umask:4;	/* unit mask */
Packit 577717
		unsigned long iear_ig3:4;	/* reserved */
Packit 577717
		unsigned long iear_ism:2;	/* instruction set */
Packit 577717
		unsigned long iear_ig4:38;	/* reserved */
Packit 577717
	} pmc10_ita_reg;
Packit 577717
Packit 577717
	/* Data Event Address Registers */
Packit 577717
	struct {
Packit 577717
		unsigned long dear_plm:4;	/* privilege level mask */
Packit 577717
		unsigned long dear_ig1:2;	/* reserved */
Packit 577717
		unsigned long dear_pm:1;	/* privileged monitor */
Packit 577717
		unsigned long dear_tlb:1;	/* cache/tlb mode */
Packit 577717
		unsigned long dear_ig2:8;	/* reserved */
Packit 577717
		unsigned long dear_umask:4;	/* unit mask */
Packit 577717
		unsigned long dear_ig3:4;	/* reserved */
Packit 577717
		unsigned long dear_ism:2;	/* instruction set */
Packit 577717
		unsigned long dear_ig4:2;	/* reserved */
Packit 577717
		unsigned long dear_pt:1;	/* pass tags */
Packit 577717
		unsigned long dear_ig5:35;	/* reserved */
Packit 577717
	} pmc11_ita_reg;
Packit 577717
Packit 577717
	/* Branch Trace Buffer registers */
Packit 577717
	struct {
Packit 577717
		unsigned long btbc_plm:4;	/* privilege level */
Packit 577717
		unsigned long btbc_ig1:2;
Packit 577717
		unsigned long btbc_pm:1;	/* privileged monitor */
Packit 577717
		unsigned long btbc_tar:1;	/* target address register */
Packit 577717
		unsigned long btbc_tm:2;	/* taken mask */
Packit 577717
		unsigned long btbc_ptm:2;	/* predicted taken address mask */
Packit 577717
		unsigned long btbc_ppm:2;	/* predicted predicate mask */
Packit 577717
		unsigned long btbc_bpt:1;	/* branch prediction table */
Packit 577717
		unsigned long btbc_bac:1;	/* branch address calculator */
Packit 577717
		unsigned long btbc_ig2:48;
Packit 577717
	} pmc12_ita_reg;
Packit 577717
Packit 577717
	struct {
Packit 577717
		unsigned long irange_ta:1;	/* tag all bit */
Packit 577717
		unsigned long irange_ig:63;
Packit 577717
	} pmc13_ita_reg;
Packit 577717
} pfm_ita_pmc_reg_t;
Packit 577717
Packit 577717
typedef union {
Packit 577717
	unsigned long	pmd_val;	/* counter value */
Packit 577717
Packit 577717
	/* counting pmd register */
Packit 577717
	struct {
Packit 577717
		unsigned long pmd_count:32;	/* 32-bit hardware counter  */
Packit 577717
		unsigned long pmd_sxt32:32;	/* sign extension of bit 32 */
Packit 577717
	} pmd_ita_counter_reg;
Packit 577717
Packit 577717
	struct {
Packit 577717
		unsigned long iear_v:1;		/* valid bit */
Packit 577717
		unsigned long iear_tlb:1;	/* tlb miss bit */
Packit 577717
		unsigned long iear_ig1:3;	/* reserved */
Packit 577717
		unsigned long iear_icla:59;	/* instruction cache line address {60:51} sxt {50}*/
Packit 577717
	} pmd0_ita_reg;
Packit 577717
Packit 577717
	struct {
Packit 577717
		unsigned long iear_lat:12;	/* latency */
Packit 577717
		unsigned long iear_ig1:52;	/* reserved */
Packit 577717
	} pmd1_ita_reg;
Packit 577717
Packit 577717
	struct {
Packit 577717
		unsigned long dear_daddr;	/* data address */
Packit 577717
	} pmd2_ita_reg;
Packit 577717
Packit 577717
	struct {
Packit 577717
		unsigned long dear_latency:12;	/* latency */
Packit 577717
		unsigned long dear_ig1:50;	/* reserved */
Packit 577717
		unsigned long dear_level:2;	/* level */
Packit 577717
	} pmd3_ita_reg;
Packit 577717
Packit 577717
	struct {
Packit 577717
		unsigned long btb_b:1;		/* branch bit */
Packit 577717
		unsigned long btb_mp:1;		/* mispredict bit */
Packit 577717
		unsigned long btb_slot:2;	/* which slot, 3=not taken branch */
Packit 577717
		unsigned long btb_addr:60;	/* b=1, bundle address, b=0 target address */
Packit 577717
	} pmd8_15_ita_reg;
Packit 577717
Packit 577717
	struct {
Packit 577717
		unsigned long btbi_bbi:3;	/* branch buffer index */
Packit 577717
		unsigned long btbi_full:1;	/* full bit (sticky) */
Packit 577717
		unsigned long btbi_ignored:60;
Packit 577717
	} pmd16_ita_reg;
Packit 577717
Packit 577717
	struct {
Packit 577717
		unsigned long dear_vl:1;	/* valid bit */
Packit 577717
		unsigned long dear_ig1:1;	/* reserved */
Packit 577717
		unsigned long dear_slot:2;	/* slot number */
Packit 577717
		unsigned long dear_iaddr:60;	/* instruction address */
Packit 577717
	} pmd17_ita_reg;
Packit 577717
} pfm_ita_pmd_reg_t;
Packit 577717
Packit 577717
/*
Packit 577717
 * type definition for Itanium instruction set support
Packit 577717
 */
Packit 577717
typedef enum {
Packit 577717
	PFMLIB_ITA_ISM_BOTH=0, 	/* IA-32 and IA-64 (default) */
Packit 577717
	PFMLIB_ITA_ISM_IA32=1, 	/* IA-32 only */
Packit 577717
	PFMLIB_ITA_ISM_IA64=2 	/* IA-64 only */
Packit 577717
} pfmlib_ita_ism_t;
Packit 577717
Packit 577717
typedef struct {
Packit 577717
	unsigned int 	 flags; /* counter specific flags */
Packit 577717
	unsigned int	 thres;	/* per event threshold */
Packit 577717
	pfmlib_ita_ism_t ism;	/* per event instruction set */
Packit 577717
} pfmlib_ita_counter_t;
Packit 577717
Packit 577717
/*
Packit 577717
 * counter specific flags
Packit 577717
 */
Packit 577717
#define PFMLIB_ITA_FL_EVT_NO_QUALCHECK	0x1 /* don't check qualifier constraints */
Packit 577717
Packit 577717
typedef struct {
Packit 577717
	unsigned char	 opcm_used;	/* set to 1 if this opcode matcher is used */
Packit 577717
	unsigned long	 pmc_val;	/* value of opcode matcher for PMC8 */
Packit 577717
} pfmlib_ita_opcm_t;
Packit 577717
Packit 577717
/*
Packit 577717
 *
Packit 577717
 * The BTB can be configured via 4 different methods:
Packit 577717
 *
Packit 577717
 * 	- BRANCH_EVENT is in the event list, pfp_ita_btb.btb_used == 0:
Packit 577717
 * 		The BTB will be configured (PMC12) to record all branches AND a counting
Packit 577717
 * 		monitor will be setup to count BRANCH_EVENT.
Packit 577717
 *
Packit 577717
 * 	-  BRANCH_EVENT is in the event list, pfp_ita_btb.btb_used == 1:
Packit 577717
 * 		The BTB will be configured (PMC12) according to information in pfp_ita_btb AND
Packit 577717
 * 		a counter will be setup to count BRANCH_EVENT.
Packit 577717
 *
Packit 577717
 * 	-  BRANCH_EVENT is NOT in the event list, pfp_ita_btb.btb_used == 0:
Packit 577717
 * 	   	Nothing is programmed
Packit 577717
 *
Packit 577717
 * 	-  BRANCH_EVENT is NOT in the event list, pfp_ita_btb.btb_used == 1:
Packit 577717
 * 		The BTB will be configured (PMC12) according to information in pfp_ita_btb.
Packit 577717
 * 		This is the free running BTB mode.
Packit 577717
 */
Packit 577717
typedef struct {
Packit 577717
	unsigned char	 btb_used;	/* set to 1 if the BTB is used */
Packit 577717
Packit 577717
	unsigned char	 btb_tar;
Packit 577717
	unsigned char	 btb_tac;
Packit 577717
	unsigned char	 btb_bac;
Packit 577717
	unsigned char	 btb_tm;
Packit 577717
	unsigned char	 btb_ptm;
Packit 577717
	unsigned char	 btb_ppm;
Packit 577717
	unsigned int	 btb_plm;	/* BTB privilege level mask */
Packit 577717
} pfmlib_ita_btb_t;
Packit 577717
Packit 577717
/*
Packit 577717
 * There are four ways to configure EAR:
Packit 577717
 *
Packit 577717
 * 	- an EAR event is in the event list AND pfp_ita_ear.ear_used = 0:
Packit 577717
 * 		The EAR will be programmed (PMC10 or PMC11) based on the information encoded in the
Packit 577717
 * 		event (umask, cache, tlb). A counting monitor will be programmed to
Packit 577717
 * 		count DATA_EAR_EVENTS or INSTRUCTION_EAR_EVENTS depending on the type of EAR.
Packit 577717
 *
Packit 577717
 * 	- an EAR event is in the event list AND pfp_ita_ear.ear_used = 1:
Packit 577717
 * 		The EAR will be programmed (PMC10 or PMC11) according to the information in the
Packit 577717
 * 		pfp_ita_ear structure	because it contains more detailed information
Packit 577717
 * 		(such as priv level and instruction set). A counting monitor will be programmed
Packit 577717
 * 		to count DATA_EAR_EVENTS or INSTRUCTION_EAR_EVENTS depending on the type of EAR.
Packit 577717
 *
Packit 577717
 * 	- no EAR event is in the event list AND pfp_ita_ear.ear_used = 0:
Packit 577717
 * 	 	Nothing is programmed.
Packit 577717
 *
Packit 577717
 * 	- no EAR event is in the event list AND pfp_ita_ear.ear_used = 1:
Packit 577717
 * 		The EAR will be programmed (PMC10 or PMC11) according to the information in the
Packit 577717
 * 		pfp_ita_ear structure. This is the free running mode for EAR
Packit 577717
 */
Packit 577717
typedef enum {
Packit 577717
	PFMLIB_ITA_EAR_CACHE_MODE=0,	/* Cache mode : I-EAR and D-EAR */
Packit 577717
	PFMLIB_ITA_EAR_TLB_MODE  =1, 	/* TLB mode   : I-EAR and D-EAR */
Packit 577717
} pfmlib_ita_ear_mode_t;
Packit 577717
Packit 577717
Packit 577717
typedef struct {
Packit 577717
	unsigned char	 	ear_used;	/* when set will force definition of PMC[10] */
Packit 577717
Packit 577717
	pfmlib_ita_ear_mode_t	ear_mode;	/* EAR mode */
Packit 577717
	pfmlib_ita_ism_t 	ear_ism;	/* instruction set */
Packit 577717
	unsigned int	 	ear_plm;	/* IEAR privilege level mask */
Packit 577717
	unsigned long	 	ear_umask;	/* umask value for PMC10 */
Packit 577717
} pfmlib_ita_ear_t;
Packit 577717
Packit 577717
/*
Packit 577717
 * describes one range. rr_plm is ignored for data ranges
Packit 577717
 * a range is interpreted as unused (not defined) when rr_start = rr_end = 0.
Packit 577717
 * if rr_plm is not set it will use the default settings set in the generic
Packit 577717
 * library param structure.
Packit 577717
 */
Packit 577717
typedef struct {
Packit 577717
	unsigned int            rr_flags;	/* currently unused */
Packit 577717
	unsigned int		rr_plm;		/* privilege level (ignored for data ranges) */
Packit 577717
	unsigned long		rr_start;	/* start address */
Packit 577717
	unsigned long		rr_end;		/* end address (not included) */
Packit 577717
} pfmlib_ita_input_rr_desc_t;
Packit 577717
Packit 577717
typedef struct {
Packit 577717
	unsigned long		rr_soff;	/* output: start offset from actual start */
Packit 577717
	unsigned long		rr_eoff;	/* output: end offset from actual end */
Packit 577717
} pfmlib_ita_output_rr_desc_t;
Packit 577717
Packit 577717
Packit 577717
/*
Packit 577717
 * rr_used must be set to true for the library to configure the debug registers.
Packit 577717
 * If using less than 4 intervals, must mark the end with entry: rr_limits[x].rr_start = rr_limits[x].rr_end = 0
Packit 577717
 */
Packit 577717
typedef struct {
Packit 577717
	unsigned char	 		rr_used;	/* set if address range restriction is used */
Packit 577717
	unsigned int			rr_flags;	/* set of flags for all ranges              */
Packit 577717
	unsigned int			rr_nbr_used;	/* how many registers were used (output)    */
Packit 577717
	pfmlib_ita_input_rr_desc_t	rr_limits[4];	/* at most 4 distinct intervals             */
Packit 577717
} pfmlib_ita_input_rr_t;
Packit 577717
Packit 577717
typedef struct {
Packit 577717
	unsigned int			rr_nbr_used;	/* how many registers were used (output)    */
Packit 577717
	pfmlib_ita_output_rr_desc_t	rr_infos[4];	/* at most 4 distinct intervals             */
Packit 577717
	pfmlib_reg_t			rr_br[8];	/* array of debug reg requests to configure */
Packit 577717
} pfmlib_ita_output_rr_t;
Packit 577717
Packit 577717
Packit 577717
/*
Packit 577717
 * Itanium specific parameters for the library
Packit 577717
 */
Packit 577717
typedef struct {
Packit 577717
	pfmlib_ita_counter_t	pfp_ita_counters[PMU_ITA_NUM_COUNTERS];	/* extended counter features */
Packit 577717
Packit 577717
	unsigned long		pfp_ita_flags;		/* Itanium specific flags */
Packit 577717
Packit 577717
	pfmlib_ita_opcm_t	pfp_ita_pmc8;		/* PMC8 (opcode matcher) configuration */
Packit 577717
	pfmlib_ita_opcm_t	pfp_ita_pmc9;		/* PMC9 (opcode matcher) configuration */
Packit 577717
	pfmlib_ita_ear_t	pfp_ita_iear;		/* IEAR configuration */
Packit 577717
	pfmlib_ita_ear_t	pfp_ita_dear;		/* DEAR configuration */
Packit 577717
	pfmlib_ita_btb_t	pfp_ita_btb;		/* BTB configuration */
Packit 577717
Packit 577717
	pfmlib_ita_input_rr_t	pfp_ita_drange;		/* data range restrictions */
Packit 577717
	pfmlib_ita_input_rr_t	pfp_ita_irange;		/* code range restrictions */
Packit 577717
	unsigned long		reserved[1];		/* for future use */
Packit 577717
} pfmlib_ita_input_param_t;
Packit 577717
Packit 577717
typedef struct {
Packit 577717
	pfmlib_ita_output_rr_t	pfp_ita_drange;		/* data range restrictions */
Packit 577717
	pfmlib_ita_output_rr_t	pfp_ita_irange;		/* code range restrictions */
Packit 577717
	unsigned long		reserved[6];		/* for future use */
Packit 577717
} pfmlib_ita_output_param_t;
Packit 577717
Packit 577717
extern int pfm_ita_is_ear(unsigned int i);
Packit 577717
extern int pfm_ita_is_dear(unsigned int i);
Packit 577717
extern int pfm_ita_is_dear_tlb(unsigned int i);
Packit 577717
extern int pfm_ita_is_dear_cache(unsigned int i);
Packit 577717
extern int pfm_ita_is_iear(unsigned int i);
Packit 577717
extern int pfm_ita_is_iear_tlb(unsigned int i);
Packit 577717
extern int pfm_ita_is_iear_cache(unsigned int i);
Packit 577717
extern int pfm_ita_is_btb(unsigned int i);
Packit 577717
extern int pfm_ita_support_opcm(unsigned int i);
Packit 577717
extern int pfm_ita_support_iarr(unsigned int i);
Packit 577717
extern int pfm_ita_support_darr(unsigned int i);
Packit 577717
extern int pfm_ita_get_ear_mode(unsigned int i, pfmlib_ita_ear_mode_t *m);
Packit 577717
Packit 577717
extern int pfm_ita_get_event_maxincr(unsigned int i, unsigned int *maxincr);
Packit 577717
extern int pfm_ita_get_event_umask(unsigned int i, unsigned long *umask);
Packit 577717
Packit 577717
#ifdef __cplusplus /* extern C */
Packit 577717
}
Packit 577717
#endif
Packit 577717
Packit 577717
#endif /* __PFMLIB_ITANIUM_H__ */