40#define sel_event_mask perfsel.sel_event_mask
41#define sel_unit_mask perfsel.sel_unit_mask
42#define sel_usr perfsel.sel_usr
43#define sel_os perfsel.sel_os
44#define sel_edge perfsel.sel_edge
45#define sel_pc perfsel.sel_pc
46#define sel_int perfsel.sel_int
47#define sel_en perfsel.sel_en
48#define sel_inv perfsel.sel_inv
49#define sel_cnt_mask perfsel.sel_cnt_mask
50#define sel_event_mask2 perfsel.sel_event_mask2
51#define sel_guest perfsel.sel_guest
52#define sel_host perfsel.sel_host
54#define CHECK_AMD_ARCH(reg) \
55 ((reg).sel_event_mask2 || (reg).sel_guest || (reg).sel_host)
57#define PFMLIB_AMD64_HAS_COMBO(_e) \
58 ((pfm_amd64_get_event_entry(_e)->pme_flags & PFMLIB_AMD64_UMASK_COMBO) != 0)
61#define PFMLIB_AMD64_ALL_FLAGS \
62 (PFM_AMD64_SEL_INV|PFM_AMD64_SEL_EDGE|PFM_AMD64_SEL_GUEST|PFM_AMD64_SEL_HOST)
75#define AMD64_SEL_BASE 0xc0010000
76#define AMD64_CTR_BASE 0xc0010004
77#define AMD64_SEL_BASE_F15H 0xc0010200
78#define AMD64_CTR_BASE_F15H 0xc0010201
93 .pme_desc =
"This event is not supported be this cpu revision.",
100#define amd64_revision amd64_pmu.revision
101#define amd64_event_count amd64_support.pme_count
102#define amd64_cpu_clks amd64_pmu.cpu_clks
103#define amd64_ret_inst amd64_pmu.ret_inst
104#define amd64_events amd64_pmu.events
105#define amd64_family amd64_pmu.family
106#define amd64_model amd64_pmu.model
107#define amd64_stepping amd64_pmu.stepping
110#define IS_AMD_ARCH() (amd64_pmu.family >= 0x10)
119 switch (
model >> 4) {
167static inline void cpuid(
unsigned int op,
unsigned int *
a,
unsigned int *
b,
168 unsigned int *
c,
unsigned int *d)
170 __asm__ __volatile__ (
".byte 0x53\n\tcpuid\n\tmovl %%ebx, %%esi\n\t.byte 0x5b"
228 unsigned int a,
b,
c, d;
232 strncpy(&buffer[0], (
char *)(&
b), 4);
233 strncpy(&buffer[4], (
char *)(&d), 4);
234 strncpy(&buffer[8], (
char *)(&
c), 4);
237 if (strcmp(buffer,
"AuthenticAMD"))
264 str = getenv(
"LIBPFM_FORCE_PMU");
267 pmu_type = strtol(str, &str, 10);
270 if (!*str || *str++ !=
',')
273 if (!*str || *str++ !=
',')
276 if (!*str || *str++ !=
',')
282 DPRINT(
"force failed at: %s\n", str ? str :
"<NULL>");
298 __pfm_vbprintf(
"AMD family=%d model=0x%x stepping=0x%x rev=%s, %s\n",
359 unsigned int i, j, k, cnt, umask;
376 for (j=0; j < cnt; j++) {
383 for(
i=0, j=0; j < cnt; j++,
i++) {
388 DPRINT(
"event=%d invalid plm=%d\n", e[j].event, e[j].plm);
395 DPRINT(
"event does not supports unit mask combination\n");
405 DPRINT(
"CPU does not have correct revision level\n");
409 DPRINT(
"invalid AMD64 flags\n");
414 DPRINT(
"event=%d invalid cnt_mask=%d: must be < %u\n",
433 for (j=0; j < cnt ; j++ ) {
462 DPRINT(
"IBSOP:UOPS available on Rev C and later processors\n");
476 __pfm_vbprintf(
"[IBSOPCTL(pmc%u)=0x%llx en=%d uops=%d maxcnt=0x%x]\n",
501 __pfm_vbprintf(
"[IBSFETCHCTL(pmc%u)=0x%llx en=%d maxcnt=0x%x rand=%u]\n",
542 __pfm_vbprintf(
"[PERFSEL%u(pmc%u)=0x%llx emask=0x%x umask=0x%x os=%d usr=%d inv=%d en=%d int=%d edge=%d cnt_mask=%d] %s\n",
557 __pfm_vbprintf(
"[PERFCTR%u(pmd%u)]\n", pd[j].reg_num, pd[j].reg_num);
573 unsigned int pmc_base, pmd_base;
577 if (!inp_mod || !outp || !outp_mod)
634 DPRINT(
"IBSOP:UOPS available on Rev C and later processors\n");
705 memset(counters, 0,
sizeof(*counters));
static struct pme_amd64_table amd64_fam15h_table
static struct pme_amd64_table amd64_k7_table
static struct pme_amd64_table amd64_k8_table
static struct pme_amd64_table amd64_fam10h_table
#define PME_AMD64_IBSFETCH
static double a[MATRIX_SIZE][MATRIX_SIZE]
static double b[MATRIX_SIZE][MATRIX_SIZE]
static double c[MATRIX_SIZE][MATRIX_SIZE]
#define PFMLIB_ERR_FEATCOMB
#define PFMLIB_ERR_BADHOST
static int pfm_regmask_set(pfmlib_regmask_t *h, unsigned int b)
#define PFMLIB_ERR_TOOMANY
static int pfm_regmask_isset(pfmlib_regmask_t *h, unsigned int b)
#define PFMLIB_ERR_NOASSIGN
#define PFMLIB_ERR_NOTSUPP
static int is_valid_rev(unsigned int flags, int revision)
static int pfm_amd64_dispatch_ibs(pfmlib_input_param_t *inp, pfmlib_amd64_input_param_t *inp_mod, pfmlib_output_param_t *outp, pfmlib_amd64_output_param_t *outp_mod)
static int pfm_amd64_get_event_code(unsigned int i, unsigned int cnt, int *code)
static void pfm_amd64_get_impl_perfctr(pfmlib_regmask_t *impl_pmds)
static int pfm_amd64_get_event_mask_code(unsigned int ev, unsigned int midx, unsigned int *code)
static int pfm_amd64_get_event_desc(unsigned int ev, char **str)
static struct @95 amd64_pmu
pme_amd64_entry_t unsupported_event
#define PFMLIB_AMD64_ALL_FLAGS
static amd64_rev_t amd64_get_revision(int family, int model, int stepping)
#define CHECK_AMD_ARCH(reg)
pfm_pmu_support_t amd64_support
static int pfm_amd64_detect(void)
#define PFMLIB_AMD64_HAS_COMBO(_e)
static void pfm_amd64_force(void)
static unsigned int pfm_amd64_get_num_event_masks(unsigned int ev)
static int pfm_amd64_dispatch_counters(pfmlib_input_param_t *inp, pfmlib_amd64_input_param_t *mod_in, pfmlib_output_param_t *outp)
#define AMD64_SEL_BASE_F15H
static int is_valid_index(unsigned int index)
static char * pfm_amd64_get_event_name(unsigned int i)
static void cpuid(unsigned int op, unsigned int *a, unsigned int *b, unsigned int *c, unsigned int *d)
static char * pfm_amd64_get_event_mask_name(unsigned int ev, unsigned int midx)
static void pfm_amd64_get_impl_counters(pfmlib_regmask_t *impl_counters)
int pfm_amd64_get_event_umask(unsigned int i, unsigned long *umask)
static void pfm_amd64_get_hw_counter_width(unsigned int *width)
static void pfm_amd64_setup(amd64_rev_t revision)
#define amd64_event_count
static int pfm_amd64_dispatch_events(pfmlib_input_param_t *inp, void *_inp_mod, pfmlib_output_param_t *outp, void *outp_mod)
static int pfm_amd64_get_event_mask_desc(unsigned int ev, unsigned int midx, char **str)
#define AMD64_CTR_BASE_F15H
static int pfm_amd64_init(void)
static void pfm_amd64_get_impl_perfsel(pfmlib_regmask_t *impl_pmcs)
pme_amd64_entry_t * events
static void pfm_amd64_get_event_counters(unsigned int j, pfmlib_regmask_t *counters)
static int pfm_amd64_get_inst_retired(pfmlib_event_t *e)
static pme_amd64_entry_t * pfm_amd64_get_event_entry(unsigned int index)
static int pfm_amd64_get_cycle_event(pfmlib_event_t *e)
#define PFM_AMD64_SEL_GUEST
#define PFM_AMD64_SEL_HOST
#define PFMLIB_AMD64_USE_IBSFETCH
#define PFMLIB_AMD64_USE_IBSOP
#define PFM_AMD64_SEL_EDGE
#define IBS_OPTIONS_RANDEN
#define PMU_AMD64_MAX_COUNTERS
#define PFM_AMD64_SEL_INV
#define PMU_AMD64_IBSOPCTL_PMC
static int from_revision(unsigned int flags)
#define PMU_AMD64_COUNTER_WIDTH
#define PMU_AMD64_IBSOPCTL_PMD
#define PMU_AMD64_NUM_PERFCTR
static const char * amd64_cpu_strs[]
#define PMU_AMD64_NUM_PERFSEL
#define PMU_AMD64_IBSFETCHCTL_PMD
#define PMU_AMD64_NUM_COUNTERS_F15H
static const char * amd64_rev_strs[]
#define PMU_AMD64_CNT_MASK_MAX
#define PMU_AMD64_IBSFETCHCTL_PMC
#define PMU_AMD64_NUM_COUNTERS
#define PFMLIB_AMD64_NOT_SUPP
#define PFMLIB_AMD64_FAM10H_REV_C
static int till_revision(unsigned int flags)
void __pfm_vbprintf(const char *fmt,...)
#define DPRINT(fmt, a...)
unsigned int unit_masks[PFMLIB_MAX_MASKS_PER_EVENT]
pfmlib_reg_t pfp_pmds[PFMLIB_MAX_PMDS]
pfmlib_reg_t pfp_pmcs[PFMLIB_MAX_PMCS]
unsigned int pfp_pmc_count
unsigned int pfp_pmd_count
unsigned long long reg_value
unsigned long reg_alt_addr
unsigned long long reg_addr
pme_amd64_umask_t pme_umasks[PFMLIB_AMD64_MAX_UMASK]
pme_amd64_entry_t * events
struct ibsfetchctl_t::@13 reg
struct ibsopctl_t::@14 reg