|
Packit |
577717 |
.TH LIBPFM 3 "November, 2003" "" "Linux Programmer's Manual"
|
|
Packit |
577717 |
.SH NAME
|
|
Packit |
577717 |
libpfm_itanium - support for Itanium specific PMU features
|
|
Packit |
577717 |
.SH SYNOPSIS
|
|
Packit |
577717 |
.nf
|
|
Packit |
577717 |
.B #include <perfmon/pfmlib.h>
|
|
Packit |
577717 |
.B #include <perfmon/pfmlib_itanium.h>
|
|
Packit |
577717 |
.sp
|
|
Packit |
577717 |
.BI "int pfm_ita_is_ear(unsigned int " i ");"
|
|
Packit |
577717 |
.BI "int pfm_ita_is_dear(unsigned int " i ");"
|
|
Packit |
577717 |
.BI "int pfm_ita_is_dear_tlb(unsigned int " i ");"
|
|
Packit |
577717 |
.BI "int pfm_ita_is_dear_cache(unsigned int " i ");"
|
|
Packit |
577717 |
.BI "int pfm_ita_is_iear(unsigned int " i ");"
|
|
Packit |
577717 |
.BI "int pfm_ita_is_iear_tlb(unsigned int " i ");"
|
|
Packit |
577717 |
.BI "int pfm_ita_is_iear_cache(unsigned int " i ");"
|
|
Packit |
577717 |
.BI "int pfm_ita_is_btb(unsigned int " i ");"
|
|
Packit |
577717 |
.BI "int pfm_ita_support_opcm(unsigned int " i ");"
|
|
Packit |
577717 |
.BI "int pfm_ita_support_iarr(unsigned int " i ");"
|
|
Packit |
577717 |
.BI "int pfm_ita_support_darr(unsigned int " i ");"
|
|
Packit |
577717 |
.BI "int pfm_ita_get_event_maxincr(unsigned int " i ", unsigned int *"maxincr ");"
|
|
Packit |
577717 |
.BI "int pfm_ita_get_event_umask(unsigned int " i ", unsigned long *"umask ");"
|
|
Packit |
577717 |
.sp
|
|
Packit |
577717 |
.SH DESCRIPTION
|
|
Packit |
577717 |
The libpfm library provides full support for all the Itanium specific features
|
|
Packit |
577717 |
of the PMU. The interface is defined in \fBpfmlib_itanium.h\fR. It consists
|
|
Packit |
577717 |
of a set of functions and structures which describe and allow access to the
|
|
Packit |
577717 |
Itanium specific PMU features.
|
|
Packit |
577717 |
.sp
|
|
Packit |
577717 |
The Itanium specific functions presented here are mostly used to retrieve
|
|
Packit |
577717 |
the characteristics of an event. Given a opaque event descriptor, obtained
|
|
Packit |
577717 |
by the \fBpfm_find_event()\fR or its derivative functions, they return a boolean value
|
|
Packit |
577717 |
indicating whether this event support this features or is of a particular
|
|
Packit |
577717 |
kind.
|
|
Packit |
577717 |
.sp
|
|
Packit |
577717 |
The \fBpfm_ita_is_ear()\fR function returns 1 if the event
|
|
Packit |
577717 |
designated by \fBi\fR corresponds to a EAR event, i.e., an Event Address Register
|
|
Packit |
577717 |
type of events. Otherwise 0 is returned. For instance, \fBDATA_EAR_CACHE_LAT4\fR is an ear event, but
|
|
Packit |
577717 |
\fBCPU_CYCLES\fR is not. It can be a data or instruction EAR event.
|
|
Packit |
577717 |
.sp
|
|
Packit |
577717 |
The \fBpfm_ita_is_dear()\fR function returns 1 if the event
|
|
Packit |
577717 |
designated by \fBi\fR corresponds to an Data EAR event. Otherwise 0 is returned.
|
|
Packit |
577717 |
It can be a cache or TLB EAR event.
|
|
Packit |
577717 |
.sp
|
|
Packit |
577717 |
The \fBpfm_ita_is_dear_tlb()\fR function returns 1 if the event
|
|
Packit |
577717 |
designated by \fBi\fR corresponds to a Data EAR TLB event. Otherwise 0 is returned.
|
|
Packit |
577717 |
.sp
|
|
Packit |
577717 |
The \fBpfm_ita_is_dear_cache()\fR function returns 1 if the event
|
|
Packit |
577717 |
designated by \fBi\fR corresponds to a Data EAR cache event. Otherwise 0 is returned.
|
|
Packit |
577717 |
.sp
|
|
Packit |
577717 |
The \fBpfm_ita_is_iear()\fR function returns 1 if the event
|
|
Packit |
577717 |
designated by \fBi\fR corresponds to an instruction EAR event. Otherwise 0 is returned.
|
|
Packit |
577717 |
It can be a cache or TLB instruction EAR event.
|
|
Packit |
577717 |
.sp
|
|
Packit |
577717 |
The \fBpfm_ita_is_iear_tlb()\fR function returns 1 if the event
|
|
Packit |
577717 |
designated by \fBi\fR corresponds to an instruction EAR TLB event. Otherwise 0 is returned.
|
|
Packit |
577717 |
.sp
|
|
Packit |
577717 |
The \fBpfm_ita_is_iear_cache()\fR function returns 1 if the event
|
|
Packit |
577717 |
designated by \fBi\fR corresponds to an instruction EAR cache event. Otherwise 0 is returned.
|
|
Packit |
577717 |
.sp
|
|
Packit |
577717 |
The \fBpfm_ita_support_opcm()\fR function returns 1 if the event
|
|
Packit |
577717 |
designated by \fBi\fR supports opcode matching, i.e., can this event be measured accurately
|
|
Packit |
577717 |
when opcode matching via PMC8/PMC9 is active. Not all events supports this feature.
|
|
Packit |
577717 |
.sp
|
|
Packit |
577717 |
The \fBpfm_ita_support_iarr()\fR function returns 1 if the event
|
|
Packit |
577717 |
designated by \fBi\fR supports code address range restrictions, i.e., can this event be measured accurately when
|
|
Packit |
577717 |
code range restriction is active. Otherwise 0 is returned. Not all events supports this feature.
|
|
Packit |
577717 |
.sp
|
|
Packit |
577717 |
The \fBpfm_ita_support_darr()\fR function returns 1 if the event
|
|
Packit |
577717 |
designated by \fBi\fR supports data address range restrictions, i.e., can this event be measured accurately when
|
|
Packit |
577717 |
data range restriction is active. Otherwise 0 is returned. Not all events supports this feature.
|
|
Packit |
577717 |
.sp
|
|
Packit |
577717 |
The \fBpfm_ita_get_event_maxincr()\fR function returns in \fBmaxincr\fR the maximum number of
|
|
Packit |
577717 |
occurrences per cycle for the event designated by \fBi\fR. Certain Itanium events can occur more than
|
|
Packit |
577717 |
once per cycle. When an event occurs more than once per cycle, the PMD counter will be incremented accordingly.
|
|
Packit |
577717 |
It is possible to restrict measurement when event occur more than once per cycle. For instance,
|
|
Packit |
577717 |
\fBNOPS_RETIRED\fR can happen up to 6 times/cycle which means that the threshold can be adjusted between 0 and 5,
|
|
Packit |
577717 |
where 5 would mean that the PMD counter would be incremented by 1 only when the nop instruction is executed more
|
|
Packit |
577717 |
than 5 times/cycle. This function returns the maximum number of occurrences of the event per cycle, and
|
|
Packit |
577717 |
is the non-inclusive upper bound for the threshold to program in the PMC register.
|
|
Packit |
577717 |
.sp
|
|
Packit |
577717 |
The \fBpfm_ita_get_event_umask()\fR function returns in \fBumask\fR the umask for the event
|
|
Packit |
577717 |
designated by \fBi\fR.
|
|
Packit |
577717 |
.sp
|
|
Packit |
577717 |
|
|
Packit |
577717 |
When the Itanium specific features are needed to support a measurement their descriptions must be passed
|
|
Packit |
577717 |
as model-specific input arguments to the \fBpfm_dispatch_events()\fR function. The Itanium specific
|
|
Packit |
577717 |
input arguments are described in the \fBpfmlib_ita_input_param_t\fR structure and the output
|
|
Packit |
577717 |
parameters in \fBpfmlib_ita_output_param_t\fR. They are defined as follows:
|
|
Packit |
577717 |
.sp
|
|
Packit |
577717 |
.nf
|
|
Packit |
577717 |
typedef enum {
|
|
Packit |
577717 |
PFMLIB_ITA_ISM_BOTH=0,
|
|
Packit |
577717 |
PFMLIB_ITA_ISM_IA32=1,
|
|
Packit |
577717 |
PFMLIB_ITA_ISM_IA64=2
|
|
Packit |
577717 |
} pfmlib_ita_ism_t;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
typedef struct {
|
|
Packit |
577717 |
unsigned int flags;
|
|
Packit |
577717 |
unsigned int thres;
|
|
Packit |
577717 |
pfmlib_ita_ism_t ism;
|
|
Packit |
577717 |
} pfmlib_ita_counter_t;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
typedef struct {
|
|
Packit |
577717 |
unsigned char opcm_used;
|
|
Packit |
577717 |
unsigned long pmc_val;
|
|
Packit |
577717 |
} pfmlib_ita_opcm_t;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
typedef struct {
|
|
Packit |
577717 |
unsigned char btb_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;
|
|
Packit |
577717 |
} pfmlib_ita_btb_t;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
typedef enum {
|
|
Packit |
577717 |
PFMLIB_ITA_EAR_CACHE_MODE= 0,
|
|
Packit |
577717 |
PFMLIB_ITA_EAR_TLB_MODE = 1,
|
|
Packit |
577717 |
} pfmlib_ita_ear_mode_t;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
typedef struct {
|
|
Packit |
577717 |
unsigned char ear_used;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
pfmlib_ita_ear_mode_t ear_mode;
|
|
Packit |
577717 |
pfmlib_ita_ism_t ear_ism;
|
|
Packit |
577717 |
unsigned int ear_plm;
|
|
Packit |
577717 |
unsigned long ear_umask;
|
|
Packit |
577717 |
} pfmlib_ita_ear_t;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
typedef struct {
|
|
Packit |
577717 |
unsigned int rr_plm;
|
|
Packit |
577717 |
unsigned long rr_start;
|
|
Packit |
577717 |
unsigned long rr_end;
|
|
Packit |
577717 |
} pfmlib_ita_input_rr_desc_t;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
typedef struct {
|
|
Packit |
577717 |
unsigned long rr_soff;
|
|
Packit |
577717 |
unsigned long rr_eoff;
|
|
Packit |
577717 |
} pfmlib_ita_output_rr_desc_t;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
typedef struct {
|
|
Packit |
577717 |
unsigned int rr_flags;
|
|
Packit |
577717 |
pfmlib_ita_input_rr_desc_t rr_limits[4];
|
|
Packit |
577717 |
unsigned char rr_used;
|
|
Packit |
577717 |
} pfmlib_ita_input_rr_t;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
typedef struct {
|
|
Packit |
577717 |
unsigned int rr_nbr_used;
|
|
Packit |
577717 |
pfmlib_ita_output_rr_desc_t rr_infos[4];
|
|
Packit |
577717 |
pfmlib_reg_t rr_br[8];
|
|
Packit |
577717 |
} pfmlib_ita_output_rr_t;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
typedef struct {
|
|
Packit |
577717 |
pfmlib_ita_counter_t pfp_ita_counters[PMU_ITA_NUM_COUNTERS];
|
|
Packit |
577717 |
|
|
Packit |
577717 |
unsigned long pfp_ita_flags;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
pfmlib_ita_opcm_t pfp_ita_pmc8;
|
|
Packit |
577717 |
pfmlib_ita_opcm_t pfp_ita_pmc9;
|
|
Packit |
577717 |
pfmlib_ita_ear_t pfp_ita_iear;
|
|
Packit |
577717 |
pfmlib_ita_ear_t pfp_ita_dear;
|
|
Packit |
577717 |
pfmlib_ita_btb_t pfp_ita_btb;
|
|
Packit |
577717 |
pfmlib_ita_input_rr_t pfp_ita_drange;
|
|
Packit |
577717 |
pfmlib_ita_input_rr_t pfp_ita_irange;
|
|
Packit |
577717 |
} pfmlib_ita_input_param_t;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
typedef struct {
|
|
Packit |
577717 |
pfmlib_ita_output_rr_t pfp_ita_drange;
|
|
Packit |
577717 |
pfmlib_ita_output_rr_t pfp_ita_irange;
|
|
Packit |
577717 |
} pfmlib_ita_output_param_t;
|
|
Packit |
577717 |
.fi
|
|
Packit |
577717 |
.sp
|
|
Packit |
577717 |
.SH INSTRUCTION SET
|
|
Packit |
577717 |
.sp
|
|
Packit |
577717 |
The Itanium processor provides two additional per-event features for
|
|
Packit |
577717 |
counters: thresholding and instruction set selection. They can be set using the
|
|
Packit |
577717 |
\fBpfp_ita_counters\fR data structure for each event. The \fBism\fR
|
|
Packit |
577717 |
field can be initialized as follows:
|
|
Packit |
577717 |
.TP
|
|
Packit |
577717 |
.B PFMLIB_ITA_ISM_BOTH
|
|
Packit |
577717 |
The event will be monitored during IA-64 and IA-32 execution
|
|
Packit |
577717 |
.TP
|
|
Packit |
577717 |
.B PFMLIB_ITA_ISM_IA32
|
|
Packit |
577717 |
The event will only be monitored during IA-32 execution
|
|
Packit |
577717 |
.TP
|
|
Packit |
577717 |
.B PFMLIB_ITA_ISM_IA64
|
|
Packit |
577717 |
The event will only be monitored during IA-64 execution
|
|
Packit |
577717 |
.sp
|
|
Packit |
577717 |
.LP
|
|
Packit |
577717 |
If \fBism\fR has a value of zero, it will default to PFMLIB_ITA_ISM_BOTH.
|
|
Packit |
577717 |
.sp
|
|
Packit |
577717 |
The \fBthres\fR indicates the threshold for the event. A threshold of \fBn\fR means
|
|
Packit |
577717 |
that the counter will be incremented by one only when the event occurs more than \fBn\fR
|
|
Packit |
577717 |
times per cycle.
|
|
Packit |
577717 |
|
|
Packit |
577717 |
The \fBflags\fR field contains event-specific flags. The currently defined flags are:
|
|
Packit |
577717 |
.sp
|
|
Packit |
577717 |
.TP
|
|
Packit |
577717 |
PFMLIB_ITA_FL_EVT_NO_QUALCHECK
|
|
Packit |
577717 |
When this flag is set it indicates that the library should ignore the qualifiers constraints
|
|
Packit |
577717 |
for this event. Qualifiers includes opcode matching, code and data range restrictions. When an
|
|
Packit |
577717 |
event is marked as not supporting a particular qualifier, it usually means that it is ignored, i.e.,
|
|
Packit |
577717 |
the extra level of filtering is ignored. For instance, the CPU_CYCLES events does not support code
|
|
Packit |
577717 |
range restrictions and by default the library will refuse to program it if range restriction is also
|
|
Packit |
577717 |
requested. Using the flag will override the check and the call to the \fBpfm_dispatch_events()\fR function will succeed.
|
|
Packit |
577717 |
In this case, CPU_CYCLES will be measured for the entire program and not just for the code range requested.
|
|
Packit |
577717 |
For certain measurements this is perfectly acceptable as the range restriction will only be applied relevant
|
|
Packit |
577717 |
to events which support it. Make sure you understand which events do not support certain qualifiers before
|
|
Packit |
577717 |
using this flag.
|
|
Packit |
577717 |
.LP
|
|
Packit |
577717 |
|
|
Packit |
577717 |
.SH OPCODE MATCHING
|
|
Packit |
577717 |
.sp
|
|
Packit |
577717 |
The \fBpfp_ita_pmc8\fR and \fBpfp_ita_pmc9\fR fields of type \fBpfmlib_ita_opcm_t\fR contain
|
|
Packit |
577717 |
the description of what to do with the opcode matchers. Itanium supports opcode matching via
|
|
Packit |
577717 |
PMC8 and PMC9. When this feature is used the \fBopcm_used\fR field must be set to 1, otherwise
|
|
Packit |
577717 |
it is ignored by the library. The \fBpmc_val\fR simply contains the raw value to store in
|
|
Packit |
577717 |
PMC8 or PMC9. The library does not modify the values for PMC8 and PMC9, they will be stored in
|
|
Packit |
577717 |
the \fBpfp_pmcs\fR table of the generic output parameters.
|
|
Packit |
577717 |
|
|
Packit |
577717 |
.SH EVENT ADDRESS REGISTERS
|
|
Packit |
577717 |
.sp
|
|
Packit |
577717 |
The \fBpfp_ita_iear\fR field of type \fBpfmlib_ita_ear_t\fR describes what to do with instruction
|
|
Packit |
577717 |
Event Address Registers (I-EARs). Again if this feature is used the \fBear_used\fR must be set to 1,
|
|
Packit |
577717 |
otherwise it will be ignored by the library. The \fBear_mode\fR must be set to either one of
|
|
Packit |
577717 |
\fBPFMLIB_ITA_EAR_TLB_MODE\fR, \fBPFMLIB_ITA_EAR_CACHE_MODE\fRto indicate the type of EAR to program.
|
|
Packit |
577717 |
The umask to store into PMC10 must be in \fBear_umask\fR. The privilege level mask at which the I-EAR will be
|
|
Packit |
577717 |
monitored must be set in \fBear_plm\fR which can be any combination of \fBPFM_PLM0\fR, \fBPFM_PLM1\fR,
|
|
Packit |
577717 |
\fBPFM_PLM2\fR, \fBPFM_PLM3\fR. If \fBear_plm\fR is 0 then the default privilege level mask in \fBpfp_dfl_plm\fR is used.
|
|
Packit |
577717 |
Finally the instruction set for which to monitor is in \fBear_ism\fR and can be any one of
|
|
Packit |
577717 |
\fBPFMLIB_ITA_ISM_BOTH\fR, \fBPFMLIB_ITA_ISM_IA32\fR, or \fBPFMLIB_ITA_ISM_IA64\fR.
|
|
Packit |
577717 |
.sp
|
|
Packit |
577717 |
The \fBpfp_ita_dear\fR field of type \fBpfmlib_ita_ear_t\fR describes what to do with data Event Address
|
|
Packit |
577717 |
Registers (D-EARs). The description is identical to the I-EARs except that it applies to PMC11.
|
|
Packit |
577717 |
|
|
Packit |
577717 |
In general, there are four different methods to program the EAR (data or instruction):
|
|
Packit |
577717 |
.TP
|
|
Packit |
577717 |
.B Method 1
|
|
Packit |
577717 |
There is an EAR event in the list of events to monitor and \fBear_used\fR is cleared. In this
|
|
Packit |
577717 |
case the EAR will be programmed (PMC10 or PMC11) based on the information encoded in the event.
|
|
Packit |
577717 |
A counting monitor (PMC4/PMD4-PMC7/PMD7) will be programmed to count DATA_EAR_EVENT or INSTRUCTION_EAR_EVENTS
|
|
Packit |
577717 |
depending on the type of EAR.
|
|
Packit |
577717 |
.TP
|
|
Packit |
577717 |
.B Method 2
|
|
Packit |
577717 |
There is an EAR event in the list of events to monitor and \fBear_used\fR is set. In this
|
|
Packit |
577717 |
case the EAR will be programmed (PMC10 or PMC11) using the information in the \fBpfp_ita_iear\fR or
|
|
Packit |
577717 |
\fBpfp_ita_dear\fR structure because it contains more detailed information, such as privilege level and
|
|
Packit |
577717 |
instruction set. A counting monitor (PMC4/PMD4-PMC7/PMD7) will be programmed to count DATA_EAR_EVENT or
|
|
Packit |
577717 |
INSTRUCTION_EAR_EVENTS depending on the type of EAR.
|
|
Packit |
577717 |
.TP
|
|
Packit |
577717 |
.B Method 3
|
|
Packit |
577717 |
There is no EAR event in the list of events to monitor and and \fBear_used\fR is cleared. In this case
|
|
Packit |
577717 |
no EAR is programmed.
|
|
Packit |
577717 |
.TP
|
|
Packit |
577717 |
.B Method 4
|
|
Packit |
577717 |
There is no EAR event in the list of events to monitor and and \fBear_used\fR is set. In this case
|
|
Packit |
577717 |
case the EAR will be programmed (PMC10 or PMC11) using the information in the \fBpfp_ita_iear\fR or
|
|
Packit |
577717 |
\fBpfp_ita_dear\fR structure. This is the free running mode for the EAR.
|
|
Packit |
577717 |
.sp
|
|
Packit |
577717 |
.SH BRANCH TRACE BUFFER
|
|
Packit |
577717 |
The \fBpfp_ita_btb\fR of type \fBpfmlib_ita_btb_t\fR field is used to configure the Branch Trace Buffer (BTB). If the
|
|
Packit |
577717 |
\fBbtb_used\fR is set, then the library will take the configuration into account, otherwise any BTB configuration will be ignored.
|
|
Packit |
577717 |
The various fields in this structure provide means to filter out the kind of branches that gets recorded in the BTB.
|
|
Packit |
577717 |
Each one represents an element of the branch architecture of the Itanium processor. Refer to the Itanium specific
|
|
Packit |
577717 |
documentation for more details on the branch architecture. The fields are as follows:
|
|
Packit |
577717 |
.TP
|
|
Packit |
577717 |
.B btb_tar
|
|
Packit |
577717 |
If the value of this field is 1, then branches predicted by the Target Address Register (TAR) predictions are captured. If 0 no branch
|
|
Packit |
577717 |
predicted by the TAR is included.
|
|
Packit |
577717 |
.TP
|
|
Packit |
577717 |
.B btb_tac
|
|
Packit |
577717 |
If this field is 1, then branches predicted by the Target Address Cache (TAC) are captured. If 0 no branch predicted by the TAC
|
|
Packit |
577717 |
is included.
|
|
Packit |
577717 |
.TP
|
|
Packit |
577717 |
.B btb_bac
|
|
Packit |
577717 |
If this field is 1, then branches predicted by the Branch Address Corrector (BAC) are captured. If 0 no branch predicted by the BAC
|
|
Packit |
577717 |
is included.
|
|
Packit |
577717 |
.TP
|
|
Packit |
577717 |
.B btb_tm
|
|
Packit |
577717 |
If this field is 0, then no branch is captured. If this field is 1, then non taken branches are captured. If this field is 2, then
|
|
Packit |
577717 |
taken branches are captured. Finally if this field is 3 then all branches are captured.
|
|
Packit |
577717 |
.TP
|
|
Packit |
577717 |
.B btb_ptm
|
|
Packit |
577717 |
If this field is 0, then no branch is captured. If this field is 1, then branches with a mispredicted target address are captured. If this field
|
|
Packit |
577717 |
is 2, then branches with correctly predicted target address are captured. Finally if this field is 3 then all branches are captured regardless of
|
|
Packit |
577717 |
target address prediction.
|
|
Packit |
577717 |
.TP
|
|
Packit |
577717 |
.B btb_ppm
|
|
Packit |
577717 |
If this field is 0, then no branch is captured. If this field is 1, then branches with a mispredicted path (taken/non taken) are captured. If this field
|
|
Packit |
577717 |
is 2, then branches with correctly predicted path are captured. Finally if this field is 3 then all branches are captured regardless of
|
|
Packit |
577717 |
their path prediction.
|
|
Packit |
577717 |
.TP
|
|
Packit |
577717 |
.B btb_plm
|
|
Packit |
577717 |
This is the privilege level mask at which the BTB captures branches. It can be any combination of \fBPFM_PLM0\fR, \fBPFM_PLM1\fR, \fBPFM_PLM2\fR,
|
|
Packit |
577717 |
\fBPFM_PLM3\fR. If \fBbtb_plm\fR is 0 then the default privilege level mask in \fBpfp_dfl_plm\fR is used.
|
|
Packit |
577717 |
.sp
|
|
Packit |
577717 |
There are 4 methods to program the BTB and they are as follows:
|
|
Packit |
577717 |
.sp
|
|
Packit |
577717 |
.TP
|
|
Packit |
577717 |
.B Method 1
|
|
Packit |
577717 |
The \fBBRANCH_EVENT\fR is in the list of events to monitor and \fBbtb_used\fR is cleared. In this case,
|
|
Packit |
577717 |
the BTB will be configured (PMC12) to record ALL branches. A counting monitor (PMC4/PMD4-PMC7/PMD7) will be programmed to
|
|
Packit |
577717 |
count \fBBRANCH_EVENT\fR.
|
|
Packit |
577717 |
.TP
|
|
Packit |
577717 |
.B Method 2
|
|
Packit |
577717 |
The \fBBRANCH_EVENT\fR is in the list of events to monitor and \fBbtb_used\fR is set. In this case,
|
|
Packit |
577717 |
the BTB will be configured (PMC12) using the information in the \fBpfp_ita_btb\fR structure. A counting monitor
|
|
Packit |
577717 |
(PMC4/PMD4-PMC7/PMD7) will be programmed to count \fBBRANCH_EVENT\fR.
|
|
Packit |
577717 |
.TP
|
|
Packit |
577717 |
.B Method 3
|
|
Packit |
577717 |
The \fBBRANCH_EVENT\fR is not in the list of events to monitor and \fBbtb_used\fR is set. In this case,
|
|
Packit |
577717 |
the BTB will be configured (PMC12) using the information in the \fBpfp_ita_btb\fR structure. This is the
|
|
Packit |
577717 |
free running mode for the BTB.
|
|
Packit |
577717 |
.TP
|
|
Packit |
577717 |
.B Method 4
|
|
Packit |
577717 |
The \fBBRANCH_EVENT\fR is not in the list of events to monitor and \fBbtb_used\fR is cleared. In this case,
|
|
Packit |
577717 |
the BTB is not programmed.
|
|
Packit |
577717 |
.sp
|
|
Packit |
577717 |
.SH DATA AND CODE RANGE RESTRICTIONS
|
|
Packit |
577717 |
The \fBpfp_ita_drange\fR and \fBpfp_ita_irange\fR fields control the range restrictions for the data and
|
|
Packit |
577717 |
code respectively. The idea is that the application passes a set of ranges, each designated by a start
|
|
Packit |
577717 |
and end address. Upon return from the \fBpfm_dispatch_events()\fR function, the application gets back the set of
|
|
Packit |
577717 |
registers and their values that needs to be programmed via a kernel interface.
|
|
Packit |
577717 |
|
|
Packit |
577717 |
Range restriction is implemented using the debug registers. There is a limited number of debug registers
|
|
Packit |
577717 |
and they go in pair. With 8 data debug registers, a maximum of 4 distinct ranges can be specified. The same
|
|
Packit |
577717 |
applies to code range restrictions. Moreover, there are some severe constraints on the alignment and size
|
|
Packit |
577717 |
of the range. Given that the size range is specified using a bitmask, there can be situations where the actual
|
|
Packit |
577717 |
range is larger than the requested range. The library will make the best effort to cover only what is requested.
|
|
Packit |
577717 |
It will never cover less than what is requested. The algorithm uses more than one pair of debug registers to
|
|
Packit |
577717 |
get a more precise range if necessary. Hence, up to the 4 pairs can be used to describe a single range. The library
|
|
Packit |
577717 |
returns the start and end offsets of the actual range compared to the requested range.
|
|
Packit |
577717 |
|
|
Packit |
577717 |
If range restriction is to be used, the \fBrr_used\fR field must be set to one, otherwise settings will be ignored.
|
|
Packit |
577717 |
The ranges are described by the \fBpfmlib_ita_input_rr_t\fR structure. Up to 4 ranges can be defined. Each
|
|
Packit |
577717 |
range is described in by a entry in \fBrr_limits\fR.
|
|
Packit |
577717 |
|
|
Packit |
577717 |
The \fBpfmlib_ita_input_rr_desc_t\fR structure is defined as follows:
|
|
Packit |
577717 |
.TP
|
|
Packit |
577717 |
.B rr_plm
|
|
Packit |
577717 |
The privilege level at which the range is active. It can be any combinations of \fBPFM_PLM0\fR, \fBPFM_PLM1\fR, \fBPFM_PLM2\fR, \fBPFM_PLM3\fR.
|
|
Packit |
577717 |
If \fBrr_plm\fR is 0 then the default privilege level mask in \fBpfp_dfl_plm\fR is used.The privilege level is only relevant
|
|
Packit |
577717 |
for code ranges, data ranges ignores the setting.
|
|
Packit |
577717 |
.TP
|
|
Packit |
577717 |
.B rr_start
|
|
Packit |
577717 |
This is the start address of the range. Any address is supported but for code range it
|
|
Packit |
577717 |
must be bundle aligned, i.e., 16-byte aligned.
|
|
Packit |
577717 |
.TP
|
|
Packit |
577717 |
.B rr_end
|
|
Packit |
577717 |
This is the end address of the range. Any address is supported but for code range it
|
|
Packit |
577717 |
must be bundle aligned, i.e., 16-byte aligned.
|
|
Packit |
577717 |
.LP
|
|
Packit |
577717 |
.sp
|
|
Packit |
577717 |
The library will provide the values for the debug registers as well as some information
|
|
Packit |
577717 |
about the actual ranges in the output parameters and more precisely in the \fBpfmlib_ita_output_rr_t\fR
|
|
Packit |
577717 |
structure for each range. The structure is defined as follows:
|
|
Packit |
577717 |
.TP
|
|
Packit |
577717 |
.B rr_nbr_used
|
|
Packit |
577717 |
Contains the number of debug registers used to cover the range. This is necessarily an even number
|
|
Packit |
577717 |
as debug registers always go in pair. The value of this field is between 0 and 7.
|
|
Packit |
577717 |
.TP
|
|
Packit |
577717 |
.B rr_br
|
|
Packit |
577717 |
This table contains the list of debug registers necessary to cover the ranges. Each element is
|
|
Packit |
577717 |
of type \fBpfmlib_reg_t\fR. The \fBreg_num\fR field contains the debug register index while
|
|
Packit |
577717 |
\fBreg_value\fR contains the debug register value. Both the index and value must be copied
|
|
Packit |
577717 |
into the kernel specific argument to program the debug registers. The library never programs them.
|
|
Packit |
577717 |
.TP
|
|
Packit |
577717 |
.B rr_infos
|
|
Packit |
577717 |
Contains information about the ranges defined. Because of alignment restrictions, the actual range
|
|
Packit |
577717 |
covered by the debug registers may be larger than the requested range. This table describe the differences
|
|
Packit |
577717 |
between the requested and actual ranges expressed as offsets:
|
|
Packit |
577717 |
.TP
|
|
Packit |
577717 |
.B rr_soff
|
|
Packit |
577717 |
Contains the start offset of the actual range described by the debug registers. If zero, it means
|
|
Packit |
577717 |
the library was able to match exactly the beginning of the range. Otherwise it represents the number
|
|
Packit |
577717 |
of byte by which the actual range precedes the requested range.
|
|
Packit |
577717 |
.TP
|
|
Packit |
577717 |
.B rr_eoff
|
|
Packit |
577717 |
Contains the end offset of the actual range described by the debug registers. If zero, it means
|
|
Packit |
577717 |
the library was able to match exactly the end of the range. Otherwise it represents the number of
|
|
Packit |
577717 |
bytes by which the actual range exceeds the requested range.
|
|
Packit |
577717 |
.sp
|
|
Packit |
577717 |
.LP
|
|
Packit |
577717 |
.SH ERRORS
|
|
Packit |
577717 |
Refer to the description of the \fBpfm_dispatch_events()\fR function for errors when using the Itanium
|
|
Packit |
577717 |
specific input and output arguments.
|
|
Packit |
577717 |
.SH SEE ALSO
|
|
Packit |
577717 |
pfm_dispatch_events(3) and set of examples shipped with the library
|
|
Packit |
577717 |
.SH AUTHOR
|
|
Packit |
577717 |
Stephane Eranian <eranian@hpl.hp.com>
|
|
Packit |
577717 |
.PP
|