|
Packit |
577717 |
/*
|
|
Packit |
577717 |
* Copyright (c) 2009 Google, Inc
|
|
Packit |
577717 |
* Contributed by Stephane Eranian <eranian@gmail.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 |
* This file is part of libpfm, a performance monitoring support library for
|
|
Packit |
577717 |
* applications on Linux.
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
#ifndef __PFMLIB_INTEL_X86_PRIV_H__
|
|
Packit |
577717 |
#define __PFMLIB_INTEL_X86_PRIV_H__
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/*
|
|
Packit |
577717 |
* This file contains the definitions used for all Intel X86 processors
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/*
|
|
Packit |
577717 |
* maximum number of unit masks groups per event
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
#define INTEL_X86_NUM_GRP 8
|
|
Packit |
577717 |
#define INTEL_X86_MAX_FILTERS 3
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/*
|
|
Packit |
577717 |
* unit mask description
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
typedef struct {
|
|
Packit |
577717 |
const char *uname; /* unit mask name */
|
|
Packit |
577717 |
const char *udesc; /* unit umask description */
|
|
Packit |
577717 |
const char *uequiv;/* name of event from which this one is derived, NULL if none */
|
|
Packit |
577717 |
uint64_t ucntmsk;/* supported counters for umask (if set, supersedes cntmsk) */
|
|
Packit |
577717 |
uint64_t ucode; /* unit mask code */
|
|
Packit |
577717 |
uint64_t ufilters[INTEL_X86_MAX_FILTERS]; /* extra encoding for event */
|
|
Packit |
577717 |
unsigned int uflags; /* unit mask flags */
|
|
Packit |
577717 |
unsigned short umodel; /* only available on this PMU model */
|
|
Packit |
577717 |
unsigned short grpid; /* unit mask group id */
|
|
Packit |
577717 |
unsigned int modhw; /* hardwired modifiers, cannot be changed */
|
|
Packit |
577717 |
unsigned int umodmsk_req; /* bitmask of required modifiers */
|
|
Packit |
577717 |
} intel_x86_umask_t;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#define INTEL_X86_MAX_GRPID ((unsigned short)(~0))
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/*
|
|
Packit |
577717 |
* event description
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
typedef struct {
|
|
Packit |
577717 |
const char *name; /* event name */
|
|
Packit |
577717 |
const char *desc; /* event description */
|
|
Packit |
577717 |
const char *equiv; /* name of event from which this one is derived, NULL if none */
|
|
Packit |
577717 |
uint64_t cntmsk; /* supported counters */
|
|
Packit |
577717 |
unsigned int code; /* event code */
|
|
Packit |
577717 |
unsigned int numasks;/* number of umasks */
|
|
Packit |
577717 |
unsigned int flags; /* flags */
|
|
Packit |
577717 |
unsigned int modmsk; /* bitmask of modifiers for this event */
|
|
Packit |
577717 |
unsigned int modmsk_req; /* bitmask of required modifiers */
|
|
Packit |
577717 |
unsigned short ngrp; /* number of unit masks groups */
|
|
Packit |
577717 |
unsigned short model; /* only available on this PMU model */
|
|
Packit |
577717 |
const intel_x86_umask_t *umasks; /* umask desc */
|
|
Packit |
577717 |
} intel_x86_entry_t;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/*
|
|
Packit |
577717 |
* pme_flags value (event and unit mask)
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
#define INTEL_X86_NCOMBO 0x0001 /* unit masks within group cannot be combined */
|
|
Packit |
577717 |
#define INTEL_X86_FALLBACK_GEN 0x0002 /* fallback from fixed to generic counter possible */
|
|
Packit |
577717 |
#define INTEL_X86_PEBS 0x0004 /* event supports PEBS or at least one umask supports PEBS */
|
|
Packit |
577717 |
#define INTEL_X86_DFL 0x0008 /* unit mask is default choice */
|
|
Packit |
577717 |
#define INTEL_X86_GRP_EXCL 0x0010 /* only one unit mask group can be selected */
|
|
Packit |
577717 |
#define INTEL_X86_NHM_OFFCORE 0x0020 /* Nehalem/Westmere offcore_response */
|
|
Packit |
577717 |
#define INTEL_X86_EXCL_GRP_GT 0x0040 /* exclude use of grp with id > own grp */
|
|
Packit |
577717 |
#define INTEL_X86_FIXED 0x0080 /* fixed counter only event */
|
|
Packit |
577717 |
#define INTEL_X86_NO_AUTOENCODE 0x0100 /* does not support auto encoding validation */
|
|
Packit |
577717 |
#define INTEL_X86_CODE_OVERRIDE 0x0200 /* umask overrides event code */
|
|
Packit |
577717 |
#define INTEL_X86_LDLAT 0x0400 /* needs load latency modifier (ldlat) */
|
|
Packit |
577717 |
#define INTEL_X86_GRP_DFL_NONE 0x0800 /* ok if umask group defaults to no umask */
|
|
Packit |
577717 |
#define INTEL_X86_FRONTEND 0x1000 /* Skylake Precise frontend */
|
|
Packit |
577717 |
#define INTEL_X86_FETHR 0x2000 /* precise frontend umask requires threshold modifier (fe_thres) */
|
|
Packit |
577717 |
#define INTEL_X86_EXCL_GRP_BUT_0 0x4000 /* exclude all groups except self and grpid = 0 */
|
|
Packit |
577717 |
|
|
Packit |
577717 |
typedef union pfm_intel_x86_reg {
|
|
Packit |
577717 |
unsigned long long val; /* complete register value */
|
|
Packit |
577717 |
struct {
|
|
Packit |
577717 |
unsigned long sel_event_select:8; /* event mask */
|
|
Packit |
577717 |
unsigned long sel_unit_mask:8; /* unit mask */
|
|
Packit |
577717 |
unsigned long sel_usr:1; /* user level */
|
|
Packit |
577717 |
unsigned long sel_os:1; /* system level */
|
|
Packit |
577717 |
unsigned long sel_edge:1; /* edge detec */
|
|
Packit |
577717 |
unsigned long sel_pc:1; /* pin control */
|
|
Packit |
577717 |
unsigned long sel_int:1; /* enable APIC intr */
|
|
Packit |
577717 |
unsigned long sel_anythr:1; /* measure any thread */
|
|
Packit |
577717 |
unsigned long sel_en:1; /* enable */
|
|
Packit |
577717 |
unsigned long sel_inv:1; /* invert counter mask */
|
|
Packit |
577717 |
unsigned long sel_cnt_mask:8; /* counter mask */
|
|
Packit |
577717 |
unsigned long sel_intx:1; /* only in tx region */
|
|
Packit |
577717 |
unsigned long sel_intxcp:1; /* excl. aborted tx region */
|
|
Packit |
577717 |
unsigned long sel_res2:30;
|
|
Packit |
577717 |
} perfevtsel;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
struct {
|
|
Packit |
577717 |
unsigned long usel_event:8; /* event select */
|
|
Packit |
577717 |
unsigned long usel_umask:8; /* event unit mask */
|
|
Packit |
577717 |
unsigned long usel_res1:1; /* reserved */
|
|
Packit |
577717 |
unsigned long usel_occ:1; /* occupancy reset */
|
|
Packit |
577717 |
unsigned long usel_edge:1; /* edge detection */
|
|
Packit |
577717 |
unsigned long usel_res2:1; /* reserved */
|
|
Packit |
577717 |
unsigned long usel_int:1; /* PMI enable */
|
|
Packit |
577717 |
unsigned long usel_res3:1; /* reserved */
|
|
Packit |
577717 |
unsigned long usel_en:1; /* enable */
|
|
Packit |
577717 |
unsigned long usel_inv:1; /* invert */
|
|
Packit |
577717 |
unsigned long usel_cnt_mask:8; /* counter mask */
|
|
Packit |
577717 |
unsigned long usel_res4:32; /* reserved */
|
|
Packit |
577717 |
} nhm_unc;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
struct {
|
|
Packit |
577717 |
unsigned long usel_en:1; /* enable */
|
|
Packit |
577717 |
unsigned long usel_res1:1;
|
|
Packit |
577717 |
unsigned long usel_int:1; /* PMI enable */
|
|
Packit |
577717 |
unsigned long usel_res2:32;
|
|
Packit |
577717 |
unsigned long usel_res3:29;
|
|
Packit |
577717 |
} nhm_unc_fixed;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
struct {
|
|
Packit |
577717 |
unsigned long cpl_eq0:1; /* filter out branches at pl0 */
|
|
Packit |
577717 |
unsigned long cpl_neq0:1; /* filter out branches at pl1-pl3 */
|
|
Packit |
577717 |
unsigned long jcc:1; /* filter out condition branches */
|
|
Packit |
577717 |
unsigned long near_rel_call:1; /* filter out near relative calls */
|
|
Packit |
577717 |
unsigned long near_ind_call:1; /* filter out near indirect calls */
|
|
Packit |
577717 |
unsigned long near_ret:1; /* filter out near returns */
|
|
Packit |
577717 |
unsigned long near_ind_jmp:1; /* filter out near unconditional jmp/calls */
|
|
Packit |
577717 |
unsigned long near_rel_jmp:1; /* filter out near uncoditional relative jmp */
|
|
Packit |
577717 |
unsigned long far_branch:1; /* filter out far branches */
|
|
Packit |
577717 |
unsigned long reserved1:23; /* reserved */
|
|
Packit |
577717 |
unsigned long reserved2:32; /* reserved */
|
|
Packit |
577717 |
} nhm_lbr_select;
|
|
Packit |
577717 |
} pfm_intel_x86_reg_t;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#define INTEL_X86_ATTR_K 0 /* kernel (0) */
|
|
Packit |
577717 |
#define INTEL_X86_ATTR_U 1 /* user (1, 2, 3) */
|
|
Packit |
577717 |
#define INTEL_X86_ATTR_E 2 /* edge */
|
|
Packit |
577717 |
#define INTEL_X86_ATTR_I 3 /* invert */
|
|
Packit |
577717 |
#define INTEL_X86_ATTR_C 4 /* counter mask */
|
|
Packit |
577717 |
#define INTEL_X86_ATTR_T 5 /* any thread */
|
|
Packit |
577717 |
#define INTEL_X86_ATTR_LDLAT 6 /* load latency threshold */
|
|
Packit |
577717 |
#define INTEL_X86_ATTR_INTX 7 /* in transaction */
|
|
Packit |
577717 |
#define INTEL_X86_ATTR_INTXCP 8 /* not aborted transaction */
|
|
Packit |
577717 |
#define INTEL_X86_ATTR_FETHR 9 /* precise frontend latency theshold */
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#define _INTEL_X86_ATTR_U (1 << INTEL_X86_ATTR_U)
|
|
Packit |
577717 |
#define _INTEL_X86_ATTR_K (1 << INTEL_X86_ATTR_K)
|
|
Packit |
577717 |
#define _INTEL_X86_ATTR_I (1 << INTEL_X86_ATTR_I)
|
|
Packit |
577717 |
#define _INTEL_X86_ATTR_E (1 << INTEL_X86_ATTR_E)
|
|
Packit |
577717 |
#define _INTEL_X86_ATTR_C (1 << INTEL_X86_ATTR_C)
|
|
Packit |
577717 |
#define _INTEL_X86_ATTR_T (1 << INTEL_X86_ATTR_T)
|
|
Packit |
577717 |
#define _INTEL_X86_ATTR_INTX (1 << INTEL_X86_ATTR_INTX)
|
|
Packit |
577717 |
#define _INTEL_X86_ATTR_INTXCP (1 << INTEL_X86_ATTR_INTXCP)
|
|
Packit |
577717 |
#define _INTEL_X86_ATTR_LDLAT (1 << INTEL_X86_ATTR_LDLAT)
|
|
Packit |
577717 |
#define _INTEL_X86_ATTR_FETHR (1 << INTEL_X86_ATTR_FETHR)
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#define INTEL_X86_ATTRS \
|
|
Packit |
577717 |
(_INTEL_X86_ATTR_I|_INTEL_X86_ATTR_E|_INTEL_X86_ATTR_C|_INTEL_X86_ATTR_U|_INTEL_X86_ATTR_K)
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#define INTEL_V1_ATTRS INTEL_X86_ATTRS
|
|
Packit |
577717 |
#define INTEL_V2_ATTRS INTEL_X86_ATTRS
|
|
Packit |
577717 |
#define INTEL_FIXED2_ATTRS (_INTEL_X86_ATTR_U|_INTEL_X86_ATTR_K)
|
|
Packit |
577717 |
#define INTEL_FIXED3_ATTRS (INTEL_FIXED2_ATTRS|_INTEL_X86_ATTR_T)
|
|
Packit |
577717 |
#define INTEL_V3_ATTRS (INTEL_V2_ATTRS|_INTEL_X86_ATTR_T)
|
|
Packit |
577717 |
#define INTEL_V4_ATTRS (INTEL_V3_ATTRS | _INTEL_X86_ATTR_INTX | _INTEL_X86_ATTR_INTXCP)
|
|
Packit |
577717 |
#define INTEL_SKL_FE_ATTRS (INTEL_V4_ATTRS | _INTEL_X86_ATTR_FETHR)
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* let's define some handy shortcuts! */
|
|
Packit |
577717 |
#define sel_event_select perfevtsel.sel_event_select
|
|
Packit |
577717 |
#define sel_unit_mask perfevtsel.sel_unit_mask
|
|
Packit |
577717 |
#define sel_usr perfevtsel.sel_usr
|
|
Packit |
577717 |
#define sel_os perfevtsel.sel_os
|
|
Packit |
577717 |
#define sel_edge perfevtsel.sel_edge
|
|
Packit |
577717 |
#define sel_pc perfevtsel.sel_pc
|
|
Packit |
577717 |
#define sel_int perfevtsel.sel_int
|
|
Packit |
577717 |
#define sel_en perfevtsel.sel_en
|
|
Packit |
577717 |
#define sel_inv perfevtsel.sel_inv
|
|
Packit |
577717 |
#define sel_cnt_mask perfevtsel.sel_cnt_mask
|
|
Packit |
577717 |
#define sel_anythr perfevtsel.sel_anythr
|
|
Packit |
577717 |
#define sel_intx perfevtsel.sel_intx
|
|
Packit |
577717 |
#define sel_intxcp perfevtsel.sel_intxcp
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/*
|
|
Packit |
577717 |
* shift relative to start of register
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
#define INTEL_X86_EDGE_BIT 18
|
|
Packit |
577717 |
#define INTEL_X86_ANY_BIT 21
|
|
Packit |
577717 |
#define INTEL_X86_INV_BIT 23
|
|
Packit |
577717 |
#define INTEL_X86_CMASK_BIT 24
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#define INTEL_X86_MOD_EDGE (1 << INTEL_X86_EDGE_BIT)
|
|
Packit |
577717 |
#define INTEL_X86_MOD_ANY (1 << INTEL_X86_ANY_BIT)
|
|
Packit |
577717 |
#define INTEL_X86_MOD_INV (1 << INTEL_X86_INV_BIT)
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* intel x86 core PMU supported plm */
|
|
Packit |
577717 |
#define INTEL_X86_PLM (PFM_PLM0|PFM_PLM3)
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/*
|
|
Packit |
577717 |
* Intel x86 specific pmu flags (pmu->flags 16 MSB)
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
#define INTEL_X86_PMU_FL_ECMASK 0x10000 /* edge requires cmask >=1 */
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/*
|
|
Packit |
577717 |
* default ldlat value for PEBS-LL events. Used when ldlat= is missing
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
#define INTEL_X86_LDLAT_DEFAULT 3 /* default ldlat value in core cycles */
|
|
Packit |
577717 |
#define INTEL_X86_FETHR_DEFAULT 1 /* default fe_thres value in core cycles */
|
|
Packit |
577717 |
|
|
Packit |
577717 |
typedef struct {
|
|
Packit |
577717 |
unsigned int version:8;
|
|
Packit |
577717 |
unsigned int num_cnt:8;
|
|
Packit |
577717 |
unsigned int cnt_width:8;
|
|
Packit |
577717 |
unsigned int ebx_length:8;
|
|
Packit |
577717 |
} intel_x86_pmu_eax_t;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
typedef struct {
|
|
Packit |
577717 |
unsigned int num_cnt:6;
|
|
Packit |
577717 |
unsigned int cnt_width:6;
|
|
Packit |
577717 |
unsigned int reserved:20;
|
|
Packit |
577717 |
} intel_x86_pmu_edx_t;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
typedef struct {
|
|
Packit |
577717 |
unsigned int no_core_cycle:1;
|
|
Packit |
577717 |
unsigned int no_inst_retired:1;
|
|
Packit |
577717 |
unsigned int no_ref_cycle:1;
|
|
Packit |
577717 |
unsigned int no_llc_ref:1;
|
|
Packit |
577717 |
unsigned int no_llc_miss:1;
|
|
Packit |
577717 |
unsigned int no_br_retired:1;
|
|
Packit |
577717 |
unsigned int no_br_mispred_retired:1;
|
|
Packit |
577717 |
unsigned int reserved:25;
|
|
Packit |
577717 |
} intel_x86_pmu_ebx_t;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
typedef struct {
|
|
Packit |
577717 |
int model;
|
|
Packit |
577717 |
int family; /* 0 means nothing detected yet */
|
|
Packit |
577717 |
int arch_version;
|
|
Packit |
577717 |
int stepping;
|
|
Packit |
577717 |
} pfm_intel_x86_config_t;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
extern pfm_intel_x86_config_t pfm_intel_x86_cfg;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
extern const pfmlib_attr_desc_t intel_x86_mods[];
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static inline int
|
|
Packit |
577717 |
intel_x86_eflag(void *this, int idx, int flag)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
const intel_x86_entry_t *pe = this_pe(this);
|
|
Packit |
577717 |
return !!(pe[idx].flags & flag);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static inline int
|
|
Packit |
577717 |
is_model_event(void *this, int pidx)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
pfmlib_pmu_t *pmu = this;
|
|
Packit |
577717 |
const intel_x86_entry_t *pe = this_pe(this);
|
|
Packit |
577717 |
unsigned short model;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
model = pe[pidx].model;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
return model == 0 || model == pmu->pmu;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static inline int
|
|
Packit |
577717 |
is_model_umask(void *this, int pidx, int attr)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
pfmlib_pmu_t *pmu = this;
|
|
Packit |
577717 |
const intel_x86_entry_t *pe = this_pe(this);
|
|
Packit |
577717 |
const intel_x86_entry_t *ent;
|
|
Packit |
577717 |
unsigned short model;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
ent = pe + pidx;
|
|
Packit |
577717 |
model = ent->umasks[attr].umodel;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
return model == 0 || model == pmu->pmu;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static inline int
|
|
Packit |
577717 |
intel_x86_uflag(void *this, int idx, int attr, int flag)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
const intel_x86_entry_t *pe = this_pe(this);
|
|
Packit |
577717 |
return !!(pe[idx].umasks[attr].uflags & flag);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static inline unsigned int
|
|
Packit |
577717 |
intel_x86_num_umasks(void *this, int pidx)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
pfmlib_pmu_t *pmu = this;
|
|
Packit |
577717 |
const intel_x86_entry_t *pe = this_pe(this);
|
|
Packit |
577717 |
unsigned int i, n = 0;
|
|
Packit |
577717 |
unsigned short model;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/*
|
|
Packit |
577717 |
* some umasks may be model specific
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
for (i = 0; i < pe[pidx].numasks; i++) {
|
|
Packit |
577717 |
model = pe[pidx].umasks[i].umodel;
|
|
Packit |
577717 |
if (model && model != pmu->pmu)
|
|
Packit |
577717 |
continue;
|
|
Packit |
577717 |
n++;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
return n;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/*
|
|
Packit |
577717 |
* find actual index of umask based on attr_idx
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
static inline int
|
|
Packit |
577717 |
intel_x86_attr2umask(void *this, int pidx, int attr_idx)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
const intel_x86_entry_t *pe = this_pe(this);
|
|
Packit |
577717 |
unsigned int i;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
for (i = 0; i < pe[pidx].numasks; i++) {
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if (!is_model_umask(this, pidx, i))
|
|
Packit |
577717 |
continue;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if (attr_idx == 0)
|
|
Packit |
577717 |
break;
|
|
Packit |
577717 |
attr_idx--;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
return i;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
extern int pfm_intel_x86_detect(void);
|
|
Packit |
577717 |
extern int pfm_intel_x86_add_defaults(void *this, pfmlib_event_desc_t *e, unsigned int msk, uint64_t *umask, unsigned short max_grpid, int excl_grp_but_0);
|
|
Packit |
577717 |
|
|
Packit |
577717 |
extern int pfm_intel_x86_event_is_valid(void *this, int pidx);
|
|
Packit |
577717 |
extern int pfm_intel_x86_get_encoding(void *this, pfmlib_event_desc_t *e);
|
|
Packit |
577717 |
extern int pfm_intel_x86_get_event_first(void *this);
|
|
Packit |
577717 |
extern int pfm_intel_x86_get_event_next(void *this, int idx);
|
|
Packit |
577717 |
extern int pfm_intel_x86_get_event_umask_first(void *this, int idx);
|
|
Packit |
577717 |
extern int pfm_intel_x86_get_event_umask_next(void *this, int idx, int attr);
|
|
Packit |
577717 |
extern int pfm_intel_x86_validate_table(void *this, FILE *fp);
|
|
Packit |
577717 |
extern int pfm_intel_x86_get_event_attr_info(void *this, int idx, int attr_idx, pfmlib_event_attr_info_t *info);
|
|
Packit |
577717 |
extern int pfm_intel_x86_get_event_info(void *this, int idx, pfm_event_info_t *info);
|
|
Packit |
577717 |
extern int pfm_intel_x86_valid_pebs(pfmlib_event_desc_t *e);
|
|
Packit |
577717 |
extern int pfm_intel_x86_perf_event_encoding(pfmlib_event_desc_t *e, void *data);
|
|
Packit |
577717 |
extern int pfm_intel_x86_perf_detect(void *this);
|
|
Packit |
577717 |
extern unsigned int pfm_intel_x86_get_event_nattrs(void *this, int pidx);
|
|
Packit |
577717 |
extern int intel_x86_attr2mod(void *this, int pidx, int attr_idx);
|
|
Packit |
577717 |
|
|
Packit |
577717 |
extern int pfm_intel_x86_get_perf_encoding(void *this, pfmlib_event_desc_t *e);
|
|
Packit |
577717 |
extern int pfm_intel_nhm_unc_get_perf_encoding(void *this, pfmlib_event_desc_t *e);
|
|
Packit |
577717 |
extern void pfm_intel_x86_perf_validate_pattrs(void *this, pfmlib_event_desc_t *e);
|
|
Packit |
577717 |
extern int pfm_intel_x86_can_auto_encode(void *this, int pidx, int uidx);
|
|
Packit |
577717 |
extern int pfm_intel_x86_model_detect(void *this);
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#endif /* __PFMLIB_INTEL_X86_PRIV_H__ */
|