2024-01-04 22:22:08 +10:30
/* Copyright (C) 2021-2024 Free Software Foundation, Inc.
2022-03-11 08:58:31 +00:00
Contributed by Oracle .
This file is part of GNU Binutils .
This program is free software ; you can redistribute it and / or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation ; either version 3 , or ( at your option )
any later version .
This program is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU General Public License for more details .
You should have received a copy of the GNU General Public License
along with this program ; if not , write to the Free Software
Foundation , 51 Franklin Street - Fifth Floor , Boston ,
MA 02110 - 1301 , USA . */
# include <stdlib.h>
# include <stdio.h>
# include <errno.h>
# include <string.h>
# include <limits.h>
# include "hwcdrv.h"
# include "hwcfuncs.h"
/* TprintfT(<level>,...) definitions. Adjust per module as needed */
# define DBG_LT0 0 // for high-level configuration, unexpected errors/warnings
# define DBG_LT1 1 // for configuration details, warnings
# define DBG_LT2 2
# define DBG_LT3 3
/*---------------------------------------------------------------------------*/
/* compile options */
# define DISALLOW_USI_USII_6357446
/* Solaris 9/libcpc1 allows cpc_bind() to work on US-IIe processors, even
though this processor cannot generate profiling interrupts . */
# define DISALLOW_PENTIUM_PRO_MMX_7007575
/* Solaris/libcpc2 defaults to "Pentium Pro with MMX, Pentium II"
when it doesn ' t recognize an Intel processor . As a result ,
when collect attempts to start Pentium Pro counters on a
new machine ( e . g . Westmere as of 1 / 2011 ) , the OS may hang . */
/* Register 0 counter doesn't work on Niagara T1 version (?) */
# define WORKAROUND_6231196_NIAGARA1_NO_CTR_0
/*---------------------------------------------------------------------------*/
/* consts, macros */
/* 10^N rates */
# define PRELOADS_9 1001000001
# define PRELOADS_85 320100001
# define PRELOADS_8 100100001
# define PRELOADS_75 32010001
# define PRELOADS_7 10010001
# define PRELOADS_65 3201001
# define PRELOADS_6 1001001
# define PRELOADS_55 320101
# define PRELOADS_5 100101
# define PRELOADS_45 32001
# define PRELOADS_4 10001
# define PRELOADS_35 3201
# define PRELOADS_3 1001
# define PRELOADS_25 301
# define ABST_TBD ABST_NONE /* to be determined */
/*---------------------------------------------------------------------------*/
/* prototypes */
static void hwc_cb ( uint_t cpc_regno , const char * name ) ;
static void attrs_cb ( const char * attr ) ;
static int attr_is_valid ( int forKernel , const char * attr ) ;
/*---------------------------------------------------------------------------*/
/* HWC definition tables */
/*
comments on hwcentry tables
- - - - - - - - - - - - - - - - - - - - - - - - - - -
name : this field should not contain ' ~ ' .
int_name : actual name of register , may contain ~ attribute specifications .
regnum : assigned register .
metric : if non - NULL , is a ' standard ' counter that will show up in help .
timecvt : > 0 : can convert to time , ' timecvt ' CPU cycles per event
= 0 : counts events
< 0 : can convert to time , count reference - clock cycles at ' - timecvt ' MHz
memop : see description for ABST_type enum
*/
// PRELOAD(): generates an interval based on the cycles/event and CPU GHZ.
// Note: the macro tweaks the interval so that it ends in decimal 001.
# define CYC_PER_SAMPLE (1000ULL*1000*1000 / 100) // cycles per signal at 1ghz, 100 samples/second
# define PRELOAD(min_cycles_per_event,ghz) (((ghz)*CYC_PER_SAMPLE / (min_cycles_per_event)) / 100*100+1)
// PRELOAD_DEF: initial value for uncalibrated events.
// This value should be based on a rate that will work for the slowest changing
// HWCs, HWCs where there are many CPU cycles between events.
//
// The interval needs to target the slowest HWCs so that
// automatic adjustment of HWC overflow intervals can adapt.
# define PRELOAD_DEF PRELOAD(1000,3) // default interval targets 1000 cycles/event at 3ghz
// For er_kernel, which HWC intervals cannot be adjusted automatically for ON/HI/LO,
// The interval should target some safe interval for fast events
# define PRELOAD_DEF_ERKERNEL PRELOAD(4,4) // default interval targets 4 cycles/event at 4ghz
static const Hwcentry empty_ctr = { NULL , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_NONE , 0 } ;
// --- use cycles counter to expose "system_time" on Linux ---
# define SYSTIME_REGNOS REGNO_ANY // Linux: make sys_time/usr_time available for data collection
// Note: For x86, Linux and Solaris use different ref-clock names
# define USE_INTEL_REF_CYCLES(MHZ) \
{ " usr_time " , " unhalted-reference-cycles " , SYSTIME_REGNOS , STXT ( " User CPU " ) , PRELOAD ( 900 , MHZ ) , - ( MHZ ) , ABST_NONE } , \
{ " usr_time " , " cpu_clk_unhalted.ref_p " , SYSTIME_REGNOS , STXT ( " User CPU " ) , PRELOAD ( 900 , MHZ ) , - ( MHZ ) , ABST_NONE } , \
{ " sys_time " , " unhalted-reference-cycles~system=1~user=0 " , SYSTIME_REGNOS , STXT ( " System CPU " ) , PRELOAD ( 900 , MHZ ) , - ( MHZ ) , ABST_NONE } , \
{ " sys_time " , " cpu_clk_unhalted.ref_p~system=1~user=0 " , SYSTIME_REGNOS , STXT ( " System CPU " ) , PRELOAD ( 900 , MHZ ) , - ( MHZ ) , ABST_NONE } , \
{ " cycles0 " , " unhalted-reference-cycles " , 0 , NULL , PRELOAD ( 900 , MHZ ) , - ( MHZ ) , ABST_NONE } , /*hidden*/ \
{ " cycles0 " , " cpu_clk_unhalted.ref_p " , 0 , NULL , PRELOAD ( 900 , MHZ ) , - ( MHZ ) , ABST_NONE } , /*hidden*/ \
{ " cycles1 " , " unhalted-reference-cycles " , 1 , NULL , PRELOAD ( 910 , MHZ ) , - ( MHZ ) , ABST_NONE } , /*hidden*/ \
{ " cycles1 " , " cpu_clk_unhalted.ref_p " , 1 , NULL , PRELOAD ( 910 , MHZ ) , - ( MHZ ) , ABST_NONE } , /*hidden*/ \
/* end of list */
# define SPARC_CYCLES \
{ " usr_time " , " Cycles_user " , SYSTIME_REGNOS , STXT ( " User CPU " ) , PRELOADS_75 , 1 , ABST_NONE } , \
{ " sys_time " , " Cycles_user~system=1~user=0 " , SYSTIME_REGNOS , STXT ( " System CPU " ) , PRELOADS_75 , 1 , ABST_NONE } , \
/* end of list */
/* --- PERF_EVENTS "software" definitions --- */
# define PERF_EVENTS_SW_EVENT_ALIASES \
// none supported for now
#if 0
{ " usr " , " PERF_COUNT_SW_TASK_CLOCK " , REGNO_ANY , STXT ( " User CPU " ) , PRELOADS_7 , - ( 1000 ) , ABST_NONE } , \
{ " sys " , " PERF_COUNT_SW_TASK_CLOCK~system=1~user=0 " , REGNO_ANY , STXT ( " System CPU " ) , PRELOADS_7 , - ( 1000 ) , ABST_NONE } , \
/* end of list */
# endif
# define PERF_EVENTS_SW_EVENT_DEFS \
// none supported for now
#if 0
{ " PERF_COUNT_SW_TASK_CLOCK " , NULL , REGNO_ANY , NULL , PRELOADS_7 , - ( 1000 ) , ABST_NONE } , \
/* end of list */
# endif
/*
* The PAPI descriptive strings used to be wrapped with STXT ( ) ,
* a macro defined in perfan / include / i18n . h . For the time being ,
* we want to demote the PAPI counters by omitting the
* descriptions . So we use a new macro PAPITXT ( ) for this purpose .
*/
# define PAPITXT(x) NULL
/* Solaris "Generic" Counters */
static Hwcentry papi_generic_list [ ] = {
{ " PAPI_l1_dcm " , NULL , REGNO_ANY , PAPITXT ( " L1 D-cache misses " ) , PRELOADS_65 , 0 , ABST_NONE } ,
{ " PAPI_l1_icm " , NULL , REGNO_ANY , PAPITXT ( " L1 I-cache misses " ) , PRELOADS_6 , 0 , ABST_NONE } ,
{ " PAPI_l2_dcm " , NULL , REGNO_ANY , PAPITXT ( " L2 D-cache misses " ) , PRELOADS_6 , 0 , ABST_NONE } ,
{ " PAPI_l2_icm " , NULL , REGNO_ANY , PAPITXT ( " L2 I-cache misses " ) , PRELOADS_6 , 0 , ABST_NONE } ,
{ " PAPI_l3_dcm " , NULL , REGNO_ANY , PAPITXT ( " L3 D-cache misses " ) , PRELOADS_5 , 0 , ABST_NONE } ,
{ " PAPI_l3_icm " , NULL , REGNO_ANY , PAPITXT ( " L3 I-cache misses " ) , PRELOADS_5 , 0 , ABST_NONE } ,
{ " PAPI_l1_tcm " , NULL , REGNO_ANY , PAPITXT ( " L1 misses " ) , PRELOADS_65 , 0 , ABST_NONE } ,
{ " PAPI_l2_tcm " , NULL , REGNO_ANY , PAPITXT ( " L2 misses " ) , PRELOADS_6 , 0 , ABST_NONE } ,
{ " PAPI_l3_tcm " , NULL , REGNO_ANY , PAPITXT ( " L3 misses " ) , PRELOADS_5 , 0 , ABST_NONE } ,
{ " PAPI_ca_snp " , NULL , REGNO_ANY , PAPITXT ( " Requests for a snoop " ) , PRELOADS_6 , 0 , ABST_NONE } ,
{ " PAPI_ca_shr " , NULL , REGNO_ANY , PAPITXT ( " Requests for exclusive access to shared cache line " ) , PRELOADS_6 , 0 , ABST_NONE } ,
{ " PAPI_ca_cln " , NULL , REGNO_ANY , PAPITXT ( " Requests for exclusive access to clean cache line " ) , PRELOADS_6 , 0 , ABST_NONE } ,
{ " PAPI_ca_inv " , NULL , REGNO_ANY , PAPITXT ( " Requests for cache line invalidation " ) , PRELOADS_6 , 0 , ABST_NONE } ,
{ " PAPI_ca_itv " , NULL , REGNO_ANY , PAPITXT ( " Requests for cache line intervention " ) , PRELOADS_6 , 0 , ABST_NONE } ,
{ " PAPI_l3_ldm " , NULL , REGNO_ANY , PAPITXT ( " L3 load misses " ) , PRELOADS_5 , 0 , ABST_NONE } ,
{ " PAPI_l3_stm " , NULL , REGNO_ANY , PAPITXT ( " L3 store misses " ) , PRELOADS_5 , 0 , ABST_NONE } ,
{ " PAPI_bru_idl " , NULL , REGNO_ANY , PAPITXT ( " Cycles branch units are idle " ) , PRELOADS_7 , 1 , ABST_NONE } ,
{ " PAPI_fxu_idl " , NULL , REGNO_ANY , PAPITXT ( " Cycles integer units are idle " ) , PRELOADS_7 , 1 , ABST_NONE } ,
{ " PAPI_fpu_idl " , NULL , REGNO_ANY , PAPITXT ( " Cycles FP units are idle " ) , PRELOADS_7 , 1 , ABST_NONE } ,
{ " PAPI_lsu_idl " , NULL , REGNO_ANY , PAPITXT ( " Cycles load/store units are idle " ) , PRELOADS_7 , 1 , ABST_NONE } ,
{ " PAPI_tlb_dm " , NULL , REGNO_ANY , PAPITXT ( " DTLB misses " ) , PRELOADS_6 , 0 , ABST_NONE } ,
{ " PAPI_tlb_im " , NULL , REGNO_ANY , PAPITXT ( " ITLB misses " ) , PRELOADS_6 , 0 , ABST_NONE } ,
{ " PAPI_tlb_tl " , NULL , REGNO_ANY , PAPITXT ( " Total TLB misses " ) , PRELOADS_6 , 0 , ABST_NONE } ,
{ " PAPI_tlb_tm " , NULL , REGNO_ANY , PAPITXT ( " Total TLB misses " ) , PRELOADS_6 , 0 , ABST_NONE } ,
{ " PAPI_l1_ldm " , NULL , REGNO_ANY , PAPITXT ( " L1 load misses " ) , PRELOADS_65 , 0 , ABST_NONE } ,
{ " PAPI_l1_stm " , NULL , REGNO_ANY , PAPITXT ( " L1 store misses " ) , PRELOADS_65 , 0 , ABST_NONE } ,
{ " PAPI_l2_ldm " , NULL , REGNO_ANY , PAPITXT ( " L2 load misses " ) , PRELOADS_6 , 0 , ABST_NONE } ,
{ " PAPI_l2_stm " , NULL , REGNO_ANY , PAPITXT ( " L2 store misses " ) , PRELOADS_6 , 0 , ABST_NONE } ,
{ " PAPI_btac_m " , NULL , REGNO_ANY , PAPITXT ( " Branch target address cache misses " ) , PRELOADS_5 , 0 , ABST_NONE } ,
{ " PAPI_prf_dm " , NULL , REGNO_ANY , PAPITXT ( " Data prefetch cache misses " ) , PRELOADS_65 , 0 , ABST_NONE } ,
{ " PAPI_l3_dch " , NULL , REGNO_ANY , PAPITXT ( " L3 D-cache hits " ) , PRELOADS_6 , 0 , ABST_NONE } ,
{ " PAPI_tlb_sd " , NULL , REGNO_ANY , PAPITXT ( " TLB shootdowns " ) , PRELOADS_6 , 0 , ABST_NONE } ,
{ " PAPI_csr_fal " , NULL , REGNO_ANY , PAPITXT ( " Failed store conditional instructions " ) , PRELOADS_6 , 0 , ABST_NONE } ,
{ " PAPI_csr_suc " , NULL , REGNO_ANY , PAPITXT ( " Successful store conditional instructions " ) , PRELOADS_7 , 0 , ABST_NONE } ,
{ " PAPI_csr_tot " , NULL , REGNO_ANY , PAPITXT ( " Total store conditional instructions " ) , PRELOADS_7 , 0 , ABST_NONE } ,
{ " PAPI_mem_scy " , NULL , REGNO_ANY , PAPITXT ( " Cycles Stalled Waiting for memory accesses " ) , PRELOADS_7 , 1 , ABST_NONE } ,
{ " PAPI_mem_rcy " , NULL , REGNO_ANY , PAPITXT ( " Cycles Stalled Waiting for memory reads " ) , PRELOADS_7 , 1 , ABST_NONE } ,
{ " PAPI_mem_wcy " , NULL , REGNO_ANY , PAPITXT ( " Cycles Stalled Waiting for memory writes " ) , PRELOADS_7 , 1 , ABST_NONE } ,
{ " PAPI_stl_icy " , NULL , REGNO_ANY , PAPITXT ( " Cycles with no instruction issue " ) , PRELOADS_7 , 1 , ABST_NONE } ,
{ " PAPI_ful_icy " , NULL , REGNO_ANY , PAPITXT ( " Cycles with maximum instruction issue " ) , PRELOADS_7 , 1 , ABST_NONE } ,
{ " PAPI_stl_ccy " , NULL , REGNO_ANY , PAPITXT ( " Cycles with no instructions completed " ) , PRELOADS_7 , 1 , ABST_NONE } ,
{ " PAPI_ful_ccy " , NULL , REGNO_ANY , PAPITXT ( " Cycles with maximum instructions completed " ) , PRELOADS_7 , 1 , ABST_NONE } ,
{ " PAPI_hw_int " , NULL , REGNO_ANY , PAPITXT ( " Hardware interrupts " ) , PRELOADS_5 , 0 , ABST_NONE } ,
{ " PAPI_br_ucn " , NULL , REGNO_ANY , PAPITXT ( " Unconditional branch instructions " ) , PRELOADS_7 , 0 , ABST_NONE } ,
{ " PAPI_br_cn " , NULL , REGNO_ANY , PAPITXT ( " Cond. branch instructions " ) , PRELOADS_7 , 0 , ABST_NONE } ,
{ " PAPI_br_tkn " , NULL , REGNO_ANY , PAPITXT ( " Cond. branch instructions taken " ) , PRELOADS_7 , 0 , ABST_NONE } ,
{ " PAPI_br_ntk " , NULL , REGNO_ANY , PAPITXT ( " Cond. branch instructions not taken " ) , PRELOADS_7 , 0 , ABST_NONE } ,
{ " PAPI_br_msp " , NULL , REGNO_ANY , PAPITXT ( " Cond. branch instructions mispredicted " ) , PRELOADS_6 , 0 , ABST_NONE } ,
{ " PAPI_br_prc " , NULL , REGNO_ANY , PAPITXT ( " Cond. branch instructions correctly predicted " ) , PRELOADS_7 , 0 , ABST_NONE } ,
{ " PAPI_fma_ins " , NULL , REGNO_ANY , PAPITXT ( " FMA instructions completed " ) , PRELOADS_65 , 0 , ABST_NONE } ,
{ " PAPI_tot_iis " , NULL , REGNO_ANY , PAPITXT ( " Instructions issued " ) , PRELOADS_7 , 0 , ABST_NONE } ,
{ " PAPI_tot_ins " , NULL , REGNO_ANY , PAPITXT ( " Instructions completed " ) , PRELOADS_7 , 0 , ABST_NONE } ,
{ " PAPI_int_ins " , NULL , REGNO_ANY , PAPITXT ( " Integer instructions " ) , PRELOADS_7 , 0 , ABST_NONE } ,
{ " PAPI_fp_ins " , NULL , REGNO_ANY , PAPITXT ( " Floating-point instructions " ) , PRELOADS_7 , 0 , ABST_NONE } ,
{ " PAPI_ld_ins " , NULL , REGNO_ANY , PAPITXT ( " Load instructions " ) , PRELOADS_7 , 0 , ABST_NONE } ,
{ " PAPI_sr_ins " , NULL , REGNO_ANY , PAPITXT ( " Store instructions " ) , PRELOADS_7 , 0 , ABST_NONE } ,
{ " PAPI_br_ins " , NULL , REGNO_ANY , PAPITXT ( " Branch instructions " ) , PRELOADS_7 , 0 , ABST_NONE } ,
{ " PAPI_vec_ins " , NULL , REGNO_ANY , PAPITXT ( " Vector/SIMD instructions " ) , PRELOADS_7 , 0 , ABST_NONE } ,
{ " PAPI_res_stl " , NULL , REGNO_ANY , PAPITXT ( " Cycles stalled on any resource " ) , PRELOADS_7 , 1 , ABST_NONE } ,
{ " PAPI_fp_stal " , NULL , REGNO_ANY , PAPITXT ( " Cycles the FP unit(s) are stalled " ) , PRELOADS_7 , 1 , ABST_NONE } ,
{ " PAPI_tot_cyc " , NULL , REGNO_ANY , PAPITXT ( " Total cycles " ) , PRELOADS_7 , 1 , ABST_NONE } ,
{ " PAPI_lst_ins " , NULL , REGNO_ANY , PAPITXT ( " Load/store instructions completed " ) , PRELOADS_7 , 0 , ABST_NONE } ,
{ " PAPI_syc_ins " , NULL , REGNO_ANY , PAPITXT ( " Sync instructions completed " ) , PRELOADS_65 , 0 , ABST_NONE } ,
{ " PAPI_l1_dch " , NULL , REGNO_ANY , PAPITXT ( " L1 D-cache hits " ) , PRELOADS_7 , 0 , ABST_NONE } ,
{ " PAPI_l2_dch " , NULL , REGNO_ANY , PAPITXT ( " L2 D-cache hits " ) , PRELOADS_65 , 0 , ABST_NONE } ,
{ " PAPI_l1_dca " , NULL , REGNO_ANY , PAPITXT ( " L1 D-cache accesses " ) , PRELOADS_7 , 0 , ABST_NONE } ,
{ " PAPI_l2_dca " , NULL , REGNO_ANY , PAPITXT ( " L2 D-cache accesses " ) , PRELOADS_65 , 0 , ABST_NONE } ,
{ " PAPI_l3_dca " , NULL , REGNO_ANY , PAPITXT ( " L3 D-cache accesses " ) , PRELOADS_6 , 0 , ABST_NONE } ,
{ " PAPI_l1_dcr " , NULL , REGNO_ANY , PAPITXT ( " L1 D-cache reads " ) , PRELOADS_7 , 0 , ABST_NONE } ,
{ " PAPI_l2_dcr " , NULL , REGNO_ANY , PAPITXT ( " L2 D-cache reads " ) , PRELOADS_65 , 0 , ABST_NONE } ,
{ " PAPI_l3_dcr " , NULL , REGNO_ANY , PAPITXT ( " L3 D-cache reads " ) , PRELOADS_6 , 0 , ABST_NONE } ,
{ " PAPI_l1_dcw " , NULL , REGNO_ANY , PAPITXT ( " L1 D-cache writes " ) , PRELOADS_7 , 0 , ABST_NONE } ,
{ " PAPI_l2_dcw " , NULL , REGNO_ANY , PAPITXT ( " L2 D-cache writes " ) , PRELOADS_65 , 0 , ABST_NONE } ,
{ " PAPI_l3_dcw " , NULL , REGNO_ANY , PAPITXT ( " L3 D-cache writes " ) , PRELOADS_6 , 0 , ABST_NONE } ,
{ " PAPI_l1_ich " , NULL , REGNO_ANY , PAPITXT ( " L1 I-cache hits " ) , PRELOADS_7 , 0 , ABST_NONE } ,
{ " PAPI_l2_ich " , NULL , REGNO_ANY , PAPITXT ( " L2 I-cache hits " ) , PRELOADS_65 , 0 , ABST_NONE } ,
{ " PAPI_l3_ich " , NULL , REGNO_ANY , PAPITXT ( " L3 I-cache hits " ) , PRELOADS_6 , 0 , ABST_NONE } ,
{ " PAPI_l1_ica " , NULL , REGNO_ANY , PAPITXT ( " L1 I-cache accesses " ) , PRELOADS_7 , 0 , ABST_NONE } ,
{ " PAPI_l2_ica " , NULL , REGNO_ANY , PAPITXT ( " L2 I-cache accesses " ) , PRELOADS_65 , 0 , ABST_NONE } ,
{ " PAPI_l3_ica " , NULL , REGNO_ANY , PAPITXT ( " L3 I-cache accesses " ) , PRELOADS_6 , 0 , ABST_NONE } ,
{ " PAPI_l1_icr " , NULL , REGNO_ANY , PAPITXT ( " L1 I-cache reads " ) , PRELOADS_7 , 0 , ABST_NONE } ,
{ " PAPI_l2_icr " , NULL , REGNO_ANY , PAPITXT ( " L2 I-cache reads " ) , PRELOADS_65 , 0 , ABST_NONE } ,
{ " PAPI_l3_icr " , NULL , REGNO_ANY , PAPITXT ( " L3 I-cache reads " ) , PRELOADS_6 , 0 , ABST_NONE } ,
{ " PAPI_l1_icw " , NULL , REGNO_ANY , PAPITXT ( " L1 I-cache writes " ) , PRELOADS_7 , 0 , ABST_NONE } ,
{ " PAPI_l2_icw " , NULL , REGNO_ANY , PAPITXT ( " L2 I-cache writes " ) , PRELOADS_65 , 0 , ABST_NONE } ,
{ " PAPI_l3_icw " , NULL , REGNO_ANY , PAPITXT ( " L3 I-cache writes " ) , PRELOADS_6 , 0 , ABST_NONE } ,
{ " PAPI_l1_tch " , NULL , REGNO_ANY , PAPITXT ( " L1 total hits " ) , PRELOADS_7 , 0 , ABST_NONE } ,
{ " PAPI_l2_tch " , NULL , REGNO_ANY , PAPITXT ( " L2 total hits " ) , PRELOADS_65 , 0 , ABST_NONE } ,
{ " PAPI_l3_tch " , NULL , REGNO_ANY , PAPITXT ( " L3 total hits " ) , PRELOADS_6 , 0 , ABST_NONE } ,
{ " PAPI_l1_tca " , NULL , REGNO_ANY , PAPITXT ( " L1 total accesses " ) , PRELOADS_7 , 0 , ABST_NONE } ,
{ " PAPI_l2_tca " , NULL , REGNO_ANY , PAPITXT ( " L2 total accesses " ) , PRELOADS_65 , 0 , ABST_NONE } ,
{ " PAPI_l3_tca " , NULL , REGNO_ANY , PAPITXT ( " L3 total accesses " ) , PRELOADS_6 , 0 , ABST_NONE } ,
{ " PAPI_l1_tcr " , NULL , REGNO_ANY , PAPITXT ( " L1 total reads " ) , PRELOADS_7 , 0 , ABST_NONE } ,
{ " PAPI_l2_tcr " , NULL , REGNO_ANY , PAPITXT ( " L2 total reads " ) , PRELOADS_65 , 0 , ABST_NONE } ,
{ " PAPI_l3_tcr " , NULL , REGNO_ANY , PAPITXT ( " L3 total reads " ) , PRELOADS_6 , 0 , ABST_NONE } ,
{ " PAPI_l1_tcw " , NULL , REGNO_ANY , PAPITXT ( " L1 total writes " ) , PRELOADS_7 , 0 , ABST_NONE } ,
{ " PAPI_l2_tcw " , NULL , REGNO_ANY , PAPITXT ( " L2 total writes " ) , PRELOADS_65 , 0 , ABST_NONE } ,
{ " PAPI_l3_tcw " , NULL , REGNO_ANY , PAPITXT ( " L3 total writes " ) , PRELOADS_6 , 0 , ABST_NONE } ,
{ " PAPI_fml_ins " , NULL , REGNO_ANY , PAPITXT ( " FP multiply instructions " ) , PRELOADS_7 , 0 , ABST_NONE } ,
{ " PAPI_fad_ins " , NULL , REGNO_ANY , PAPITXT ( " FP add instructions " ) , PRELOADS_7 , 0 , ABST_NONE } ,
{ " PAPI_fdv_ins " , NULL , REGNO_ANY , PAPITXT ( " FP divide instructions " ) , PRELOADS_7 , 0 , ABST_NONE } ,
{ " PAPI_fsq_ins " , NULL , REGNO_ANY , PAPITXT ( " FP square root instructions " ) , PRELOADS_65 , 0 , ABST_NONE } ,
{ " PAPI_fnv_ins " , NULL , REGNO_ANY , PAPITXT ( " FP inverse instructions " ) , PRELOADS_7 , 0 , ABST_NONE } ,
{ " PAPI_fp_ops " , NULL , REGNO_ANY , PAPITXT ( " FP operations " ) , PRELOADS_7 , 0 , ABST_NONE } ,
{ NULL , NULL , 0 , NULL , 0 , 0 , 0 , 0 , ABST_NONE }
} ;
static Hwcentry usIlist [ ] = {
{ " cycles " , " Cycle_cnt " , REGNO_ANY , STXT ( " CPU Cycles " ) , PRELOADS_7 , 1 , ABST_NONE } ,
{ " insts " , " Instr_cnt " , REGNO_ANY , STXT ( " Instructions Executed " ) , PRELOADS_7 , 0 , ABST_NONE } ,
{ NULL , NULL , 0 , NULL , 0 , 0 , 0 , 0 , ABST_NONE }
} ;
static Hwcentry usIIIlist [ ] = /* III, IIIi, IIIp. Note that some counters are processor-specific */ {
{ " cycles " , " Cycle_cnt " , REGNO_ANY , STXT ( " CPU Cycles " ) , PRELOADS_7 , 1 , ABST_NONE } ,
{ " insts " , " Instr_cnt " , REGNO_ANY , STXT ( " Instructions Executed " ) , PRELOADS_7 , 0 , ABST_NONE } ,
{ " icm " , " IC_miss " , REGNO_ANY , STXT ( " I$ Misses " ) , PRELOADS_5 , 0 , ABST_NONE } ,
{ " dcrm " , " DC_rd_miss " , REGNO_ANY , STXT ( " D$ Read Misses " ) , PRELOADS_5 , 0 , ABST_LOAD } ,
{ " dcwm " , " DC_wr_miss " , REGNO_ANY , STXT ( " D$ Write Misses " ) , PRELOADS_5 , 0 , ABST_STORE } ,
{ " dcr " , " DC_rd " , REGNO_ANY , STXT ( " D$ Read Refs " ) , PRELOADS_6 , 0 , ABST_LOAD } ,
{ " dcw " , " DC_wr " , REGNO_ANY , STXT ( " D$ Write Refs " ) , PRELOADS_6 , 0 , ABST_STORE } ,
{ " ecref " , " EC_ref " , REGNO_ANY , STXT ( " E$ Refs " ) , PRELOADS_6 , 0 , ABST_LDST } ,
{ " itlbm " , " ITLB_miss " , REGNO_ANY , STXT ( " ITLB Misses " ) , PRELOADS_5 , 0 , ABST_NONE } ,
{ " dtlbm " , " DTLB_miss " , REGNO_ANY , STXT ( " DTLB Misses " ) , PRELOADS_5 , 0 , ABST_US_DTLBM } ,
{ " ecm " , " EC_misses " , REGNO_ANY , STXT ( " E$ Misses " ) , PRELOADS_5 , 0 , ABST_LDST } ,
{ " ecrm " , " EC_rd_miss " , REGNO_ANY , STXT ( " E$ Read Misses " ) , PRELOADS_5 , 0 , ABST_LOAD } ,
{ " ecml " , " EC_miss_local " , REGNO_ANY , STXT ( " E$ Local Misses " ) , PRELOADS_5 , 0 , ABST_LDST } ,
{ " ecmr " , " EC_miss_remote " , REGNO_ANY , STXT ( " E$ Remote Misses " ) , PRELOADS_5 , 0 , ABST_LDST } ,
{ " ecim " , " EC_ic_miss " , REGNO_ANY , STXT ( " E$ Instr. Misses " ) , PRELOADS_5 , 0 , ABST_NONE } ,
{ " icstall " , " Dispatch0_IC_miss " , REGNO_ANY , STXT ( " I$ Stall Cycles " ) , PRELOADS_6 , 1 , ABST_NONE } ,
{ " dcstall " , " Re_DC_miss " , REGNO_ANY , STXT ( " D$ and E$ Stall Cycles " ) , PRELOADS_6 , 1 , ABST_LOAD } ,
{ " ecstall " , " Re_EC_miss " , REGNO_ANY , STXT ( " E$ Stall Cycles " ) , PRELOADS_6 , 1 , ABST_LOAD } ,
{ " sqstall " , " Rstall_storeQ " , REGNO_ANY , STXT ( " StoreQ Stall Cycles " ) , PRELOADS_6 , 1 , ABST_STORE } ,
{ " rawstall " , " Re_RAW_miss " , REGNO_ANY , STXT ( " RAW Stall Cycles " ) , PRELOADS_6 , 1 , ABST_LOAD } ,
{ " dcmissov " , " Re_DC_missovhd " , REGNO_ANY , STXT ( " DC Miss Ovhd " ) , PRELOADS_6 , 1 , ABST_LOAD } ,
{ " fpustall " , " Re_FPU_bypass " , REGNO_ANY , STXT ( " FPU Stall Cycles " ) , PRELOADS_6 , 1 , ABST_NONE } ,
{ " fpusestall " , " Rstall_FP_use " , REGNO_ANY , STXT ( " FPU Use Stall Cycles " ) , PRELOADS_6 , 1 , ABST_NONE } ,
{ " iustall " , " Rstall_IU_use " , REGNO_ANY , STXT ( " IU Stall Cycles " ) , PRELOADS_6 , 1 , ABST_NONE } ,
{ " fpadd " , " FA_pipe_completion " , REGNO_ANY , STXT ( " FP Adds " ) , PRELOADS_6 , 0 , ABST_NONE } ,
{ " fpmul " , " FM_pipe_completion " , REGNO_ANY , STXT ( " FP Muls " ) , PRELOADS_6 , 0 , ABST_NONE } ,
/* explicit definitions of (hidden) entries for proper counters */
/* Only counters that can be time converted, or are load-store need to be in this table */
{ " Cycle_cnt " , NULL , REGNO_ANY , NULL , PRELOADS_7 , 1 , ABST_NONE } ,
{ " EC_miss_mtag_remote " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_LDST } ,
{ " DC_rd_miss " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_LOAD } ,
{ " DC_wr_miss " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_STORE } ,
{ " DC_rd " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_LOAD } ,
{ " DC_wr " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_STORE } ,
{ " EC_ref " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_LDST } ,
{ " EC_snoop_inv " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_NOPC /*?*/ } ,
{ " EC_wb " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_STORE } ,
{ " EC_wb_remote " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_STORE } ,
{ " DTLB_miss " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_US_DTLBM } ,
{ " EC_misses " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_LDST } ,
{ " EC_rd_miss " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_LOAD } ,
{ " PC_port0_rd " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_LOAD } ,
{ " EC_miss_local " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_LDST } ,
{ " EC_miss_remote " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_LDST } ,
{ " EC_snoop_cb " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_NOPC /*?*/ } ,
{ " WC_snoop_cb " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_NOPC /*?*/ } ,
{ " WC_scrubbed " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_STORE } ,
{ " WC_wb_wo_read " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_STORE } ,
{ " PC_MS_misses " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_LOAD } ,
{ " PC_soft_hit " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_LOAD } ,
{ " PC_hard_hit " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_LOAD } ,
{ " PC_port1_rd " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_LOAD } ,
{ " PC_snoop_inv " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_STORE /*?*/ } ,
{ " SW_count_0 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_COUNT } ,
{ " SW_count_1 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_COUNT } ,
{ " Dispatch0_IC_miss " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " Dispatch0_mispred " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " Dispatch0_br_target " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " Dispatch0_2nd_br " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " Dispatch_rs_mispred " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " Rstall_storeQ " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_STORE } ,
{ " Rstall_FP_use " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " Rstall_IU_use " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " EC_write_hit_RTO " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_STORE } ,
{ " Re_RAW_miss " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_LOAD } ,
{ " Re_DC_missovhd " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_LOAD } ,
{ " Re_endian_miss " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_LOAD } ,
{ " Re_FPU_bypass " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " Re_DC_miss " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_LOAD } ,
{ " Re_EC_miss " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_LOAD } ,
{ " Re_PC_miss " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_LOAD } ,
{ " SI_snoop " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_NOPC } ,
{ " SI_ciq_flow " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_NOPC } ,
{ " SI_owned " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_NOPC } ,
{ " MC_msl_busy_stall " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NOPC } ,
{ " MC_mdb_overflow_stall " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NOPC } ,
{ " MC_page_close_stall " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NOPC } ,
{ " MC_reads_0 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_NOPC } ,
{ " MC_reads_1 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_NOPC } ,
{ " MC_reads_2 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_NOPC } ,
{ " MC_reads_3 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_NOPC } ,
{ " MC_writes_0 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_NOPC } ,
{ " MC_writes_1 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_NOPC } ,
{ " MC_writes_2 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_NOPC } ,
{ " MC_writes_3 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_NOPC } ,
{ " MC_stalls_0 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NOPC } ,
{ " MC_stalls_1 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NOPC } ,
{ " MC_stalls_2 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NOPC } ,
{ " MC_stalls_3 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NOPC } ,
/* additional (hidden) aliases, for convenience */
{ " cycles0 " , " Cycle_cnt " , 0 , NULL , PRELOADS_75 , 1 , ABST_NONE } ,
{ " cycles1 " , " Cycle_cnt " , 1 , NULL , PRELOADS_75 , 1 , ABST_NONE } ,
{ " insts0 " , " Instr_cnt " , 0 , NULL , PRELOADS_75 , 0 , ABST_NONE } ,
{ " insts1 " , " Instr_cnt " , 1 , NULL , PRELOADS_75 , 0 , ABST_NONE } ,
{ NULL , NULL , 0 , NULL , 0 , 0 , 0 , 0 , ABST_NONE }
} ;
static Hwcentry usIVplist [ ] = {
{ " cycles " , " Cycle_cnt " , REGNO_ANY , STXT ( " CPU Cycles " ) , PRELOADS_7 , 1 , ABST_NONE } ,
{ " insts " , " Instr_cnt " , REGNO_ANY , STXT ( " Instructions Executed " ) , PRELOADS_7 , 0 , ABST_NONE } ,
{ " icm " , " IC_fill " , REGNO_ANY , STXT ( " I$ Misses " ) , PRELOADS_5 , 0 , ABST_NONE } ,
{ " dcrm " , " DC_rd_miss " , REGNO_ANY , STXT ( " D$ Read Misses " ) , PRELOADS_5 , 0 , ABST_LOAD } ,
{ " dcwm " , " DC_wr_miss " , REGNO_ANY , STXT ( " D$ Write Misses " ) , PRELOADS_5 , 0 , ABST_STORE } ,
{ " dcr " , " DC_rd " , REGNO_ANY , STXT ( " D$ Read Refs " ) , PRELOADS_6 , 0 , ABST_LOAD } ,
{ " dcw " , " DC_wr " , REGNO_ANY , STXT ( " D$ Write Refs " ) , PRELOADS_6 , 0 , ABST_STORE } ,
{ " itlbm " , " ITLB_miss " , REGNO_ANY , STXT ( " ITLB Misses " ) , PRELOADS_5 , 0 , ABST_NONE } ,
{ " dtlbm " , " DTLB_miss " , REGNO_ANY , STXT ( " DTLB Misses " ) , PRELOADS_5 , 0 , ABST_US_DTLBM } ,
{ " l2ref " , " L2_ref " , REGNO_ANY , STXT ( " L2$ Refs " ) , PRELOADS_5 , 0 , ABST_LDST } ,
{ " l2m " , " L2_miss " , REGNO_ANY , STXT ( " L2$ Misses " ) , PRELOADS_5 , 0 , ABST_LDST } ,
{ " l2rm " , " L2_rd_miss " , REGNO_ANY , STXT ( " L2$ Read Misses " ) , PRELOADS_5 , 0 , ABST_LOAD } ,
{ " l2im " , " L2_IC_miss " , REGNO_ANY , STXT ( " L2$ Instr. Misses " ) , PRELOADS_5 , 0 , ABST_NONE } ,
{ " ecm " , " L3_miss " , REGNO_ANY , STXT ( " E$ Misses " ) , PRELOADS_5 , 0 , ABST_LDST } ,
{ " ecrm " , " L3_rd_miss " , REGNO_ANY , STXT ( " E$ Read Misses " ) , PRELOADS_5 , 0 , ABST_LOAD } ,
{ " ecml " , " SSM_L3_miss_local " , REGNO_ANY , STXT ( " E$ Local Misses " ) , PRELOADS_5 , 0 , ABST_LDST } ,
{ " ecmr " , " SSM_L3_miss_remote " , REGNO_ANY , STXT ( " E$ Remote Misses " ) , PRELOADS_5 , 0 , ABST_LDST } ,
{ " ecim " , " L3_IC_miss " , REGNO_ANY , STXT ( " E$ Instr. Misses " ) , PRELOADS_5 , 0 , ABST_NONE } ,
{ " icstall " , " Dispatch0_IC_miss " , REGNO_ANY , STXT ( " I$ Stall Cycles " ) , PRELOADS_6 , 1 , ABST_NONE } ,
{ " dcstall " , " Re_DC_miss " , REGNO_ANY , STXT ( " D$ and E$ Stall Cycles " ) , PRELOADS_6 , 1 , ABST_LOAD } ,
{ " ecstall " , " Re_L3_miss " , REGNO_ANY , STXT ( " E$ Stall Cycles " ) , PRELOADS_6 , 1 , ABST_LOAD } ,
{ " sqstall " , " Rstall_storeQ " , REGNO_ANY , STXT ( " StoreQ Stall Cycles " ) , PRELOADS_6 , 1 , ABST_STORE } ,
{ " rawstall " , " Re_RAW_miss " , REGNO_ANY , STXT ( " RAW Stall Cycles " ) , PRELOADS_6 , 1 , ABST_LOAD } ,
{ " dcmissov " , " Re_DC_missovhd " , REGNO_ANY , STXT ( " DC Miss Ovhd " ) , PRELOADS_6 , 1 , ABST_LOAD } ,
{ " fpustall " , " Re_FPU_bypass " , REGNO_ANY , STXT ( " FPU Stall Cycles " ) , PRELOADS_6 , 1 , ABST_NONE } ,
{ " fpusestall " , " Rstall_FP_use " , REGNO_ANY , STXT ( " FPU Use Stall Cycles " ) , PRELOADS_6 , 1 , ABST_NONE } ,
{ " iustall " , " Rstall_IU_use " , REGNO_ANY , STXT ( " IU Stall Cycles " ) , PRELOADS_6 , 1 , ABST_NONE } ,
{ " fpadd " , " FA_pipe_completion " , REGNO_ANY , STXT ( " FP Adds " ) , PRELOADS_6 , 0 , ABST_NONE } ,
{ " fpmul " , " FM_pipe_completion " , REGNO_ANY , STXT ( " FP Muls " ) , PRELOADS_6 , 0 , ABST_NONE } ,
/* explicit definitions of (hidden) entries for proper counters */
/* Only counters that can be time converted, or are load-store need to be in this table */
{ " Cycle_cnt " , NULL , REGNO_ANY , NULL , PRELOADS_7 , 1 , ABST_NONE } ,
{ " DC_rd " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_LOAD } ,
{ " DC_rd_miss " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_LOAD } ,
{ " DC_wr " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_STORE } ,
{ " DC_wr_miss " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_STORE } ,
{ " DTLB_miss " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_US_DTLBM } ,
{ " Dispatch0_2nd_br " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " Dispatch0_IC_miss " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " Dispatch0_other " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " L2L3_snoop_cb_sh " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_NOPC /*?*/ } ,
{ " L2L3_snoop_inv_sh " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_NOPC /*?*/ } ,
{ " L2_hit_I_state_sh " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_LDST /*?*/ } ,
{ " L2_hit_other_half " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_LDST } ,
{ " L2_miss " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_LDST } ,
{ " L2_rd_miss " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_LOAD } ,
{ " L2_ref " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_LDST } ,
{ " L2_snoop_cb_sh " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_NOPC /*?*/ } ,
{ " L2_snoop_inv_sh " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_NOPC /*?*/ } ,
{ " L2_wb " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_STORE } ,
{ " L2_wb_sh " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_STORE } ,
{ " L2_write_hit_RTO " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_STORE } ,
{ " L2_write_miss " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_STORE } ,
{ " L3_hit_I_state_sh " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_LDST } ,
{ " L3_hit_other_half " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_LDST } ,
{ " L3_miss " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_LDST } ,
{ " L3_rd_miss " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_LOAD } ,
{ " L3_wb " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_STORE } ,
{ " L3_wb_sh " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_STORE } ,
{ " L3_write_hit_RTO " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_STORE } ,
{ " L3_write_miss_RTO " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_STORE } ,
{ " MC_reads_0_sh " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_NOPC } ,
{ " MC_reads_1_sh " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_NOPC } ,
{ " MC_reads_2_sh " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_NOPC } ,
{ " MC_reads_3_sh " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_NOPC } ,
{ " MC_stalls_0_sh " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NOPC } ,
{ " MC_stalls_1_sh " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NOPC } ,
{ " MC_stalls_2_sh " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NOPC } ,
{ " MC_stalls_3_sh " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NOPC } ,
{ " MC_writes_0_sh " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_NOPC } ,
{ " MC_writes_1_sh " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_NOPC } ,
{ " MC_writes_2_sh " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_NOPC } ,
{ " MC_writes_3_sh " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_NOPC } ,
/*? {"PC_MS_misses", NULL, REGNO_ANY, NULL, PRELOAD_DEF, 0, ABST_LOAD}, */
{ " PC_hard_hit " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_LOAD } ,
{ " PC_inv " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_STORE /*?*/ } ,
{ " PC_miss " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_LOAD } ,
{ " PC_rd " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_LOAD } ,
{ " PC_soft_hit " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_LOAD } ,
{ " Re_DC_miss " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_LOAD } ,
{ " Re_DC_missovhd " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_LOAD } ,
{ " Re_FPU_bypass " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " Re_L2_miss " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_LOAD } ,
{ " Re_L3_miss " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_LOAD } ,
{ " Re_PFQ_full " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " Re_RAW_miss " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_LOAD } ,
{ " Rstall_FP_use " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " Rstall_IU_use " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " Rstall_storeQ " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_STORE } ,
{ " SI_RTO_src_data " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_NOPC } ,
{ " SI_RTS_src_data " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_NOPC } ,
{ " SI_ciq_flow_sh " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NOPC } ,
{ " SI_owned_sh " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_NOPC } ,
{ " SI_snoop_sh " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_NOPC } ,
{ " ecml " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_LDST } ,
{ " ecmr " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_LDST } ,
{ " SSM_L3_miss_local " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_LDST /*?*/ } ,
{ " SSM_L3_miss_mtag_remote " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_LDST /*?*/ } ,
{ " SSM_L3_miss_remote " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_LDST /*?*/ } ,
{ " SSM_L3_wb_remote " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_STORE /*?*/ } ,
{ " SSM_new_transaction_sh " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_TBD /*?*/ } ,
/* additional (hidden) aliases, for convenience */
{ " cycles0 " , " Cycle_cnt " , 0 , NULL , PRELOADS_75 , 1 , ABST_NONE } ,
{ " cycles1 " , " Cycle_cnt " , 1 , NULL , PRELOADS_75 , 1 , ABST_NONE } ,
{ " insts0 " , " Instr_cnt " , 0 , NULL , PRELOADS_75 , 0 , ABST_NONE } ,
{ " insts1 " , " Instr_cnt " , 1 , NULL , PRELOADS_75 , 0 , ABST_NONE } ,
{ NULL , NULL , 0 , NULL , 0 , 0 , 0 , 0 , ABST_NONE }
} ;
static Hwcentry niagara1 [ ] =
/* CPC_ULTRA_T1 , "UltraSPARC T1" */ {
{ " insts " , " Instr_cnt " , REGNO_ANY , STXT ( " Instructions Executed " ) , PRELOADS_7 , 0 , ABST_NONE } ,
# ifndef WORKAROUND_6231196_NIAGARA1_NO_CTR_0 /* since register 0 counter don't work XXX */
{ " icm " , " IC_miss " , REGNO_ANY , STXT ( " I$ Misses " ) , PRELOADS_5 , 0 , ABST_NONE } ,
{ " itlbm " , " ITLB_miss " , REGNO_ANY , STXT ( " ITLB Misses " ) , PRELOADS_5 , 0 , ABST_NONE } ,
{ " ecim " , " L2_imiss " , REGNO_ANY , STXT ( " E$ Instr. Misses " ) , PRELOADS_4 , 0 , ABST_NONE } ,
{ " dcm " , " DC_miss " , REGNO_ANY , STXT ( " D$ Misses " ) , PRELOADS_5 , 0 , ABST_EXACT } ,
{ " dtlbm " , " DTLB_miss " , REGNO_ANY , STXT ( " DTLB Misses " ) , PRELOADS_5 , 0 , ABST_EXACT } ,
{ " ecdm " , " L2_dmiss_ld " , REGNO_ANY , STXT ( " E$ Data Misses " ) , PRELOADS_4 , 0 , ABST_EXACT } ,
{ " flops " , " FP_instr_cnt " , REGNO_ANY , STXT ( " Floating-point Ops " ) , PRELOADS_6 , 0 , ABST_NONE } ,
/* explicit definitions of (hidden) entries for proper counters */
/* Only counters that can be time converted, or are load-store need to be in this table */
{ " SB_full " , NULL , REGNO_ANY , NULL , PRELOADS_6 , 1 , ABST_NONE } ,
{ " DC_miss " , NULL , REGNO_ANY , NULL , PRELOADS_6 , 0 , ABST_EXACT } ,
{ " DTLB_miss " , NULL , REGNO_ANY , NULL , PRELOADS_6 , 0 , ABST_EXACT } ,
{ " L2_dmiss_ld " , NULL , REGNO_ANY , NULL , PRELOADS_6 , 0 , ABST_EXACT } ,
# endif
/* additional (hidden) aliases, for convenience */
{ " insts1 " , " Instr_cnt " , 1 , NULL , PRELOADS_75 , 0 , ABST_NONE } ,
{ NULL , NULL , 0 , NULL , 0 , 0 , 0 , 0 , ABST_NONE }
} ;
static Hwcentry niagara2 [ ] = {
/* CPC_ULTRA_T2 , "UltraSPARC T2" */
/* CPC_ULTRA_T2 , "UltraSPARC T2+" */
{ " insts " , " Instr_cnt " , REGNO_ANY , STXT ( " Instructions Executed " ) , PRELOADS_7 , 0 , ABST_NONE } ,
{ " loads " , " Instr_ld " , REGNO_ANY , STXT ( " Load Instructions " ) , PRELOADS_7 , 0 , ABST_EXACT } ,
{ " stores " , " Instr_st " , REGNO_ANY , STXT ( " Store Instructions " ) , PRELOADS_6 , 0 , ABST_EXACT } ,
{ " dcm " , " DC_miss " , REGNO_ANY , STXT ( " L1 D-cache Misses " ) , PRELOADS_6 , 0 , ABST_EXACT } ,
{ " dtlbm " , " DTLB_miss " , REGNO_ANY , STXT ( " DTLB Misses " ) , PRELOADS_6 , 0 , ABST_NONE } ,
{ " l2drm " , " L2_dmiss_ld " , REGNO_ANY , STXT ( " L2 D-cache Read Misses (See Bug 15664448) " ) , PRELOADS_5 , 0 , ABST_EXACT } ,
{ " icm " , " IC_miss " , REGNO_ANY , STXT ( " L1 I-cache Misses " ) , PRELOADS_5 , 0 , ABST_NONE } ,
{ " itlbm " , " ITLB_miss " , REGNO_ANY , STXT ( " ITLB Misses " ) , PRELOADS_5 , 0 , ABST_NONE } ,
{ " l2im " , " L2_imiss " , REGNO_ANY , STXT ( " L2 I-cache Misses " ) , PRELOADS_4 , 0 , ABST_NONE } ,
/* explicit definitions of (hidden) entries for proper counters */
/* Only counters that can be time converted, or are load-store need to be in this table */
{ " Instr_ld " , NULL , REGNO_ANY , NULL , PRELOADS_7 , 0 , ABST_EXACT } ,
{ " Instr_st " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_EXACT } ,
{ " Atomics " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_EXACT } ,
{ " DC_miss " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_EXACT } ,
{ " L2_dmiss_ld " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_EXACT } ,
{ " DTLB_miss " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_NONE } ,
{ " DES_3DES_busy_cycle " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " AES_busy_cycle " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " Kasumi_busy_cycle " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " MD5_SHA-1_SHA-256_busy_cycle " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " MA_busy_cycle " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
/* additional (hidden) aliases, for convenience */
{ " insts1 " , " Instr_cnt " , 1 , NULL , PRELOADS_75 , 0 , ABST_NONE } ,
{ NULL , NULL , 0 , NULL , 0 , 0 , 0 , 0 , ABST_NONE }
} ;
static Hwcentry sparc_t4 [ ] = {
// Identical to sparc_t5_m6 except for: l3m_spec
// when updating this table, also update sparc_t5_m6[]
// obsolete aliases marked with REGNO_INVALID (allows reading of older experiments)
{ " l2l3dh " , " DC_miss_L2_L3_hit_nospec " , REGNO_INVALID , STXT ( " L2 or L3 D-cache Hits " ) , PRELOADS_6 , 0 , ABST_EXACT } , // undercounts due to thread-hog issue
{ " l3m " , " DC_miss_remote_L3_hit_nospec~emask=0x6 " , REGNO_INVALID , STXT ( " L3 D-cache Misses " ) , PRELOADS_5 , 0 , ABST_EXACT } , // undercounts due to thread-hog issue
{ " lmh " , " DC_miss_local_hit_nospec " , REGNO_INVALID , STXT ( " Local Mem. Hits " ) , PRELOADS_5 , 0 , ABST_EXACT } , // undercounts due to thread-hog issue
{ " rmh " , " DC_miss_remote_L3_hit_nospec " , REGNO_INVALID , STXT ( " Remote Mem. Hits " ) , PRELOADS_5 , 0 , ABST_EXACT } , // undercounts due to thread-hog issue
{ " pqs " , " PQ_tag_wait " , REGNO_INVALID , STXT ( " Pick Queue Stalls " ) , PRELOADS_7 , 1 , ABST_NONE } , // old alias name
{ " raw_stb " , " RAW_hit_st_buf " , REGNO_INVALID , STXT ( " RAW Hazard in Store Buffer " ) , PRELOADS_55 , 0 , ABST_NONE } , // 11@full hit, 60@partial hit (in future, combine w/st_q)
{ " raw_stq " , " RAW_hit_st_q " , REGNO_INVALID , STXT ( " RAW Hazard in Store Queue " ) , PRELOADS_55 , 0 , ABST_NONE } , // 11@full hit, 60@partial hit (in future, combine w/st_buf)
{ " sel_stalls " , " Sel_0_ready " , REGNO_INVALID , STXT ( " Stalls Another Thread Selected " ) , PRELOADS_7 , 1 , ABST_NONE } ,
{ " icm " , " IC_miss " , REGNO_INVALID , STXT ( " L1 I-Cache Misses " ) , PRELOADS_55 , 0 , ABST_NONE } , // 20@ l2/l3 hit (guess)
{ " icm_stalls " , " IC_miss " , REGNO_INVALID , STXT ( " L1 I-Cache Miss Est Stalls " ) , PRELOADS_55 , 25 , ABST_NONE } , // 25@ l2-20/l3-50
// current aliases
SPARC_CYCLES
{ " cycles " , " Cycles_user " , REGNO_ANY , STXT ( " CPU Cycles " ) , PRELOADS_75 , 1 , ABST_NONE } ,
{ " insts " , " Instr_all " , REGNO_ANY , STXT ( " Instructions Executed " ) , PRELOADS_75 , 0 , ABST_NONE } ,
{ " c_stalls " , " Commit_0 " , REGNO_ANY , STXT ( " Stall Cycles " ) , PRELOADS_7 , 1 , ABST_NONE } ,
{ " loads " , " Instr_ld " , REGNO_ANY , STXT ( " Load Instructions " ) , PRELOADS_7 , 0 , ABST_EXACT } ,
{ " stores " , " Instr_st " , REGNO_ANY , STXT ( " Store Instructions " ) , PRELOADS_7 , 0 , ABST_EXACT } ,
{ " dcm " , " DC_miss_nospec " , REGNO_ANY , STXT ( " L1 D-cache Misses " ) , PRELOADS_65 , 0 , ABST_EXACT } ,
{ " l3m_spec " , " DC_miss_local_hit~emask=0x6 " , REGNO_ANY , STXT ( " L3 D-cache Speculative Misses " ) , PRELOADS_5 , 0 , ABST_NONE , STXT ( " Loads that speculatively missed local L3 " ) } , // T4 encoding (430 lm, 690 rm) ~5 misses overlap on t5/pico_ile
// {"l3m_spec", "DC_miss_local_hit~emask=0x30", REGNO_ANY, STXT("L3 D-cache Speculative Misses"),PRELOADS_5,0, ABST_NONE, STXT("Loads that speculatively missed local L3")}, // T5/M6 encoding (430 lm, 690 rm) ~5 misses overlap on t5/pico_ile
{ " lmh_spec " , " DC_miss_local_hit " , REGNO_ANY , STXT ( " Local Mem Speculative Hits " ) , PRELOADS_5 , 0 , ABST_NONE } ,
{ " rmh_spec " , " DC_miss_remote_L3_hit " , REGNO_ANY , STXT ( " Remote Mem Speculative Hits " ) , PRELOADS_5 , 0 , ABST_NONE } ,
//
{ " dtlbm " , " DTLB_miss_asynch " , REGNO_ANY , STXT ( " DTLB Misses " ) , PRELOADS_55 , 0 , ABST_NONE } , // 10@l1 hit, 24@l2 hit, 60@l3 hit, 500@l3 miss, 5000@trap 0.001 events/cycle
{ " dtlb_hwtw_stalls " , " DTLB_HWTW_all " , REGNO_ANY , STXT ( " DTLB HWTW Est Stalls " ) , PRELOADS_55 , 25 , ABST_NONE , STXT ( " Estimated time stalled on a DTLB miss requiring a HW tablewalk " ) } , // l2-20, l3-50
{ " dtlb_trap_stalls " , " DTLB_fill_trap " , REGNO_ANY , STXT ( " DTLB Trap Est Stalls " ) , PRELOADS_35 , 5000 , ABST_NONE , STXT ( " Estimated time stalled on a DTLB miss with HW tablewalk unsuccessful " ) } , // 5000@trap
{ " rawhaz " , " RAW_hit_st_q~emask=0xf " , REGNO_ANY , STXT ( " Read-after-write Hazards " ) , PRELOADS_55 , 0 , ABST_NONE , STXT ( " Loads delayed by a previous store (read-after-write hazards) " ) } ,
{ " br_msp_stalls " , " Br_mispred " , REGNO_ANY , STXT ( " Branch Mispredict Stalls " ) , PRELOADS_6 , 24 , ABST_NONE , STXT ( " Estimated time stalled on Branch mispredictions " ) } , // 24@miss, %5 of branches is bad
{ " br_msp " , " Br_mispred " , REGNO_ANY , STXT ( " Branch Mispredict " ) , PRELOADS_6 , 0 , ABST_NONE } , // 24@miss, %5 of branches is bad
{ " br_tkn " , " Br_taken " , REGNO_ANY , STXT ( " Branch Taken " ) , PRELOADS_7 , 0 , ABST_NONE } , // 2 cycles minimum
{ " br_ins " , " Branches " , REGNO_ANY , STXT ( " Branch Instructions " ) , PRELOADS_7 , 0 , ABST_NONE } , // 24@miss, %5 of branches is bad
{ " fgu " , " Instr_FGU_crypto " , REGNO_ANY , STXT ( " FP/VIS/Crypto Instructions " ) , PRELOADS_7 , 0 , ABST_NONE } , // 1 cycle/event
/* explicit definitions of (hidden) entries for proper counters */
/* Counters that can be time converted, support memspace, or have a short_desc need to be in this table */
{ " Sel_pipe_drain_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE , STXT ( " Cycles a hardware thread stalls at Select waiting with correct instructions when pipeline has to drain after branch misprediction " ) } ,
{ " Sel_0_wait " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE , STXT ( " Cycles a hardware thread stalls at Select waiting for various conditions to be resolved " ) } ,
{ " Sel_0_ready " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE , STXT ( " Cycles a hardware thread was ready to have its instructions selected but another hardware thread was selected instead " ) } ,
{ " Sel_1 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE , STXT ( " Cycles that only 1 instruction or uop was selected " ) } ,
{ " Sel_2 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE , STXT ( " Cycles that 2 instructions or uops were selected " ) } ,
{ " Pick_0 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " Pick_1 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " Pick_2 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " Pick_3 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " Pick_any " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " Branches " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_NONE , STXT ( " Control transfer instructions completed, excluding trap-related transfers " ) } ,
{ " Instr_FGU_crypto " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_NONE , STXT ( " FP and VIS instructions completed by the Floating Point and Graphics Unit " ) } ,
{ " Instr_ld " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_EXACT , STXT ( " Load instructions completed " ) } ,
{ " Instr_st " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_EXACT , STXT ( " Store instructions completed " ) } ,
{ " SPR_ring_ops " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_EXACT , STXT ( " Specialized instructions that require internal use of SPR ring completed " ) } ,
{ " Instr_other " , NULL , REGNO_ANY , NULL , PRELOAD ( 2 , 4 ) , 0 , ABST_NONE , STXT ( " Basic arithmetic and logical instructions completed " ) } ,
{ " Instr_all " , NULL , REGNO_ANY , NULL , PRELOAD ( 1 , 4 ) , 0 , ABST_NONE , STXT ( " Total instructions completed " ) } ,
{ " Br_taken " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_NONE , STXT ( " Branch instructions taken and completed " ) } ,
{ " Sw_count_intr " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_NONE , STXT ( " SW Count instructions completed " ) } ,
{ " Atomics " , NULL , REGNO_ANY , NULL , PRELOAD ( 20 , 4 ) , 0 , ABST_EXACT , STXT ( " Atomic instructions, including CASA/XA, completed " ) } ,
{ " SW_prefetch " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_EXACT , STXT ( " PREFETCH and PREFETCHA instructions completed " ) } ,
{ " Block_ld_st " , NULL , REGNO_ANY , NULL , PRELOAD ( 20 , 4 ) , 0 , ABST_EXACT , STXT ( " Block load/store instructions completed " ) } ,
{ " BTC_miss " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_NONE , STXT ( " Branches delayed a few extra cycles because branch target not found in Branch Target Cache " ) } ,
{ " ITLB_fill_8KB " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 4 ) , 0 , ABST_NONE , STXT ( " ITLB miss and HW tablewalk successfully loaded translation for 8K page " ) } ,
{ " ITLB_fill_64KB " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 4 ) , 0 , ABST_NONE , STXT ( " ITLB miss and HW tablewalk successfully loaded translation for 64K page " ) } ,
{ " ITLB_fill_4MB " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 4 ) , 0 , ABST_NONE , STXT ( " ITLB miss and HW tablewalk successfully loaded translation for 4M page " ) } ,
{ " ITLB_fill_256MB " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 4 ) , 0 , ABST_NONE , STXT ( " ITLB miss and HW tablewalk successfully loaded translation for 256M page " ) } ,
{ " ITLB_fill_2GB " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 4 ) , 0 , ABST_NONE , STXT ( " ITLB miss and HW tablewalk successfully loaded translation for 2G or 16G page " ) } ,
{ " ITLB_fill_trap " , NULL , REGNO_ANY , NULL , PRELOAD ( 1000 , 4 ) , 0 , ABST_NONE , STXT ( " ITLB miss and HW tablewalk unsuccessful " ) } ,
{ " ITLB_miss_asynch " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 4 ) , 0 , ABST_NONE , STXT ( " ITLB miss and HW tablewalk search done " ) } ,
{ " Fetch_0 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " Fetch_0_all " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " Instr_buffer_full " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " PQ_tag_wait " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " ROB_tag_wait " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " LB_tag_wait " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " ROB_LB_tag_wait " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " SB_tag_wait " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " ROB_SB_tag_wait " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " LB_SB_tag_wait " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " ROB_LB_SB_tag_wait " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " DTLB_miss_tag_wait " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " ITLB_HWTW_L2_hit " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 4 ) , 0 , ABST_NONE , STXT ( " ITLB miss and HW tablewalk hit local L2D " ) } ,
{ " ITLB_HWTW_L3_hit " , NULL , REGNO_ANY , NULL , PRELOAD ( 80 , 4 ) , 0 , ABST_NONE , STXT ( " ITLB miss and HW tablewalk hit local L3 or neighbor L2D " ) } ,
{ " ITLB_HWTW_L3_miss " , NULL , REGNO_ANY , NULL , PRELOAD ( 800 , 4 ) , 0 , ABST_NONE , STXT ( " ITLB miss and HW tablewalk missed all local caches " ) } ,
{ " DTLB_HWTW_L2_hit " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 4 ) , 0 , ABST_NONE , STXT ( " DTLB miss and HW tablewalk hit local L2D " ) } ,
{ " DTLB_HWTW_L3_hit " , NULL , REGNO_ANY , NULL , PRELOAD ( 80 , 4 ) , 0 , ABST_NONE , STXT ( " DTLB miss and HW tablewalk hit local L3 or neighbor L2D " ) } ,
{ " DTLB_HWTW_L3_miss " , NULL , REGNO_ANY , NULL , PRELOAD ( 800 , 4 ) , 0 , ABST_NONE , STXT ( " DTLB miss and HW tablewalk missed all local caches " ) } ,
{ " DTLB_HWTW_all " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 4 ) , 0 , ABST_NONE , STXT ( " DTLB miss requiring HW tablewalk " ) } ,
{ " DC_miss_L2_L3_hit_nospec " , NULL , REGNO_ANY , NULL , PRELOAD ( 25 , 4 ) , 0 , ABST_EXACT } ,
{ " DC_miss_local_hit_nospec " , NULL , REGNO_ANY , NULL , PRELOAD ( 500 , 4 ) , 0 , ABST_EXACT } ,
{ " DC_miss_remote_L3_hit_nospec " , NULL , REGNO_ANY , NULL , PRELOAD ( 800 , 4 ) , 0 , ABST_EXACT } ,
{ " DC_miss_nospec " , NULL , REGNO_ANY , NULL , PRELOAD ( 25 , 4 ) , 0 , ABST_EXACT , STXT ( " Loads that missed local L1D " ) } ,
{ " DTLB_fill_8KB " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 4 ) , 0 , ABST_NONE , STXT ( " DTLB miss and HW tablewalk successfully loaded translation for 8K page " ) } ,
{ " DTLB_fill_64KB " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 4 ) , 0 , ABST_NONE , STXT ( " DTLB miss and HW tablewalk successfully loaded translation for 64K page " ) } ,
{ " DTLB_fill_4MB " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 4 ) , 0 , ABST_NONE , STXT ( " DTLB miss and HW tablewalk successfully loaded translation for 4M page " ) } ,
{ " DTLB_fill_256MB " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 4 ) , 0 , ABST_NONE , STXT ( " DTLB miss and HW tablewalk successfully loaded translation for 256M page " ) } ,
{ " DTLB_fill_2GB " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 4 ) , 0 , ABST_NONE , STXT ( " DTLB miss and HW tablewalk successfully loaded translation for 2G or 16G page " ) } ,
{ " DTLB_fill_trap " , NULL , REGNO_ANY , NULL , PRELOAD ( 800 , 4 ) , 0 , ABST_NONE , STXT ( " DTLB miss and HW tablewalk unsuccessful " ) } ,
{ " DTLB_miss_asynch " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 4 ) , 0 , ABST_NONE , STXT ( " DTLB miss and HW tablewalk search done " ) } ,
{ " RAW_hit_st_buf " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 4 ) , 0 , ABST_NONE , STXT ( " Loads delayed by a previous store (read-after-write) still in store buffer not yet committed " ) } ,
{ " RAW_hit_st_q " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 4 ) , 0 , ABST_NONE , STXT ( " Loads delayed by a previous store (read-after-write) committed but in store queue not yet written to L2D " ) } ,
{ " St_q_tag_wait " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " St_hit_L2 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_NONE , STXT ( " Stores whose cacheline being updated was in local L2D " ) } ,
{ " St_hit_L3 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_NONE , STXT ( " Stores whose cacheline being updated was in local L3 " ) } ,
{ " DC_miss_L2_L3_hit " , NULL , REGNO_ANY , NULL , PRELOAD ( 20 , 4 ) , 0 , ABST_NONE , STXT ( " Loads that speculatively hit local L2D or L3 " ) } ,
{ " DC_miss_local_hit " , NULL , REGNO_ANY , NULL , PRELOAD ( 500 , 4 ) , 0 , ABST_NONE , STXT ( " Loads that speculatively hit local memory " ) } ,
{ " DC_miss_remote_L3_hit " , NULL , REGNO_ANY , NULL , PRELOAD ( 800 , 4 ) , 0 , ABST_NONE , STXT ( " Loads that speculatively hit remote cache or remote memory " ) } ,
{ " DC_miss " , NULL , REGNO_ANY , NULL , PRELOAD ( 20 , 4 ) , 0 , ABST_NONE , STXT ( " Loads that speculatively missed L1D " ) } ,
{ " L2_pipe_stall " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " Br_dir_mispred " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 4 ) , 0 , ABST_NONE , STXT ( " Branch instructions completed whose direction was mispredicted " ) } ,
{ " Br_trg_mispred " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 4 ) , 0 , ABST_NONE , STXT ( " Branch instructions completed whose target was mispredicted " ) } ,
{ " Br_mispred " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 4 ) , 0 , ABST_NONE , STXT ( " Branch instructions completed whose direction or target was mispredicted " ) } ,
{ " Cycles_user " , NULL , REGNO_ANY , NULL , PRELOAD ( 1 , 4 ) , 1 , ABST_NONE , STXT ( " Cycles hardware thread is active in specified mode(s) " ) } ,
//
{ " Commit_0 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE , STXT ( " Cycles no uop commits from this hardware thread " ) } ,
{ " Commit_0_all " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE , STXT ( " Cycles no uop commits from any hardware thread on this core " ) } ,
{ " Commit_1 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE , STXT ( " Cycles 1 uop commits from this hardware thread " ) } ,
{ " Commit_2 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE , STXT ( " Cycles 2 uops commit from this hardware thread " ) } ,
{ " Commit_1_or_2 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE , STXT ( " Cycles 1 or 2 uops commit from this hardware thread " ) } ,
/* additional (hidden) aliases, for convenience */
{ " cycles0 " , " Cycles_user " , 0 , NULL , PRELOADS_8 , 1 , ABST_NONE } ,
{ " cycles1 " , " Cycles_user " , 1 , NULL , PRELOADS_8 , 1 , ABST_NONE } ,
{ " insts0 " , " Instr_all " , 0 , NULL , PRELOADS_8 , 0 , ABST_NONE } ,
{ " insts1 " , " Instr_all " , 1 , NULL , PRELOADS_8 , 0 , ABST_NONE } ,
{ NULL , NULL , 0 , NULL , 0 , 0 , 0 , 0 , ABST_NONE }
} ;
static Hwcentry sparc_t5_m6 [ ] = {
// Identical to sparc_t4 except for: l3m_spec
// when updating this table, also update sparc_t4[]
// obsolete aliases marked with REGNO_INVALID (allows reading of older experiments)
{ " l2l3dh " , " DC_miss_L2_L3_hit_nospec " , REGNO_INVALID , STXT ( " L2 or L3 D-cache Hits " ) , PRELOADS_6 , 0 , ABST_EXACT } , // undercounts due to thread-hog issue
{ " l3m " , " DC_miss_remote_L3_hit_nospec~emask=0x6 " , REGNO_INVALID , STXT ( " L3 D-cache Misses " ) , PRELOADS_5 , 0 , ABST_EXACT } , // undercounts due to thread-hog issue
{ " lmh " , " DC_miss_local_hit_nospec " , REGNO_INVALID , STXT ( " Local Mem. Hits " ) , PRELOADS_5 , 0 , ABST_EXACT } , // undercounts due to thread-hog issue
{ " rmh " , " DC_miss_remote_L3_hit_nospec " , REGNO_INVALID , STXT ( " Remote Mem. Hits " ) , PRELOADS_5 , 0 , ABST_EXACT } , // undercounts due to thread-hog issue
{ " pqs " , " PQ_tag_wait " , REGNO_INVALID , STXT ( " Pick Queue Stalls " ) , PRELOADS_7 , 1 , ABST_NONE } , // old alias name
{ " raw_stb " , " RAW_hit_st_buf " , REGNO_INVALID , STXT ( " RAW Hazard in Store Buffer " ) , PRELOADS_55 , 0 , ABST_NONE } , // 11@full hit, 60@partial hit (in future, combine w/st_q)
{ " raw_stq " , " RAW_hit_st_q " , REGNO_INVALID , STXT ( " RAW Hazard in Store Queue " ) , PRELOADS_55 , 0 , ABST_NONE } , // 11@full hit, 60@partial hit (in future, combine w/st_buf)
{ " sel_stalls " , " Sel_0_ready " , REGNO_INVALID , STXT ( " Stalls Another Thread Selected " ) , PRELOADS_7 , 1 , ABST_NONE } ,
{ " icm " , " IC_miss " , REGNO_INVALID , STXT ( " L1 I-Cache Misses " ) , PRELOADS_55 , 0 , ABST_NONE } , // 20@ l2/l3 hit (guess)
{ " icm_stalls " , " IC_miss " , REGNO_INVALID , STXT ( " L1 I-Cache Miss Est Stalls " ) , PRELOADS_55 , 25 , ABST_NONE } , // 25@ l2-20/l3-50
// current aliases
SPARC_CYCLES
{ " cycles " , " Cycles_user " , REGNO_ANY , STXT ( " CPU Cycles " ) , PRELOADS_75 , 1 , ABST_NONE } ,
{ " insts " , " Instr_all " , REGNO_ANY , STXT ( " Instructions Executed " ) , PRELOADS_75 , 0 , ABST_NONE } ,
{ " c_stalls " , " Commit_0 " , REGNO_ANY , STXT ( " Stall Cycles " ) , PRELOADS_7 , 1 , ABST_NONE } ,
{ " loads " , " Instr_ld " , REGNO_ANY , STXT ( " Load Instructions " ) , PRELOADS_7 , 0 , ABST_EXACT } ,
{ " stores " , " Instr_st " , REGNO_ANY , STXT ( " Store Instructions " ) , PRELOADS_7 , 0 , ABST_EXACT } ,
{ " dcm " , " DC_miss_nospec " , REGNO_ANY , STXT ( " L1 D-cache Misses " ) , PRELOADS_65 , 0 , ABST_EXACT } ,
// {"l3m_spec", "DC_miss_local_hit~emask=0x6", REGNO_ANY, STXT("L3 D-cache Speculative Misses"),PRELOADS_5,0, ABST_NONE, STXT("Loads that speculatively missed local L3")}, // T4 encoding (430 lm, 690 rm) ~5 misses overlap on t5/pico_ile
{ " l3m_spec " , " DC_miss_local_hit~emask=0x30 " , REGNO_ANY , STXT ( " L3 D-cache Speculative Misses " ) , PRELOADS_5 , 0 , ABST_NONE , STXT ( " Loads that speculatively missed local L3 " ) } , // T5/M6 encoding (430 lm, 690 rm) ~5 misses overlap on t5/pico_ile
{ " lmh_spec " , " DC_miss_local_hit " , REGNO_ANY , STXT ( " Local Mem Speculative Hits " ) , PRELOADS_5 , 0 , ABST_NONE } ,
{ " rmh_spec " , " DC_miss_remote_L3_hit " , REGNO_ANY , STXT ( " Remote Mem Speculative Hits " ) , PRELOADS_5 , 0 , ABST_NONE } ,
//
{ " dtlbm " , " DTLB_miss_asynch " , REGNO_ANY , STXT ( " DTLB Misses " ) , PRELOADS_55 , 0 , ABST_NONE } , // 10@l1 hit, 24@l2 hit, 60@l3 hit, 500@l3 miss, 5000@trap 0.001 events/cycle
{ " dtlb_hwtw_stalls " , " DTLB_HWTW_all " , REGNO_ANY , STXT ( " DTLB HWTW Est Stalls " ) , PRELOADS_55 , 25 , ABST_NONE , STXT ( " Estimated time stalled on a DTLB miss requiring a HW tablewalk " ) } , // l2-20, l3-50
{ " dtlb_trap_stalls " , " DTLB_fill_trap " , REGNO_ANY , STXT ( " DTLB Trap Est Stalls " ) , PRELOADS_35 , 5000 , ABST_NONE , STXT ( " Estimated time stalled on a DTLB miss with HW tablewalk unsuccessful " ) } , // 5000@trap
{ " rawhaz " , " RAW_hit_st_q~emask=0xf " , REGNO_ANY , STXT ( " Read-after-write Hazards " ) , PRELOADS_55 , 0 , ABST_NONE , STXT ( " Loads delayed by a previous store (read-after-write hazards) " ) } ,
{ " br_msp_stalls " , " Br_mispred " , REGNO_ANY , STXT ( " Branch Mispredict Stalls " ) , PRELOADS_6 , 24 , ABST_NONE , STXT ( " Estimated time stalled on Branch mispredictions " ) } , // 24@miss, %5 of branches is bad
{ " br_msp " , " Br_mispred " , REGNO_ANY , STXT ( " Branch Mispredict " ) , PRELOADS_6 , 0 , ABST_NONE } , // 24@miss, %5 of branches is bad
{ " br_tkn " , " Br_taken " , REGNO_ANY , STXT ( " Branch Taken " ) , PRELOADS_7 , 0 , ABST_NONE } , // 2 cycles minimum
{ " br_ins " , " Branches " , REGNO_ANY , STXT ( " Branch Instructions " ) , PRELOADS_7 , 0 , ABST_NONE } , // 24@miss, %5 of branches is bad
{ " fgu " , " Instr_FGU_crypto " , REGNO_ANY , STXT ( " FP/VIS/Crypto Instructions " ) , PRELOADS_7 , 0 , ABST_NONE } , // 1 cycle/event
/* explicit definitions of (hidden) entries for proper counters */
/* Counters that can be time converted, support memspace, or have a short_desc need to be in this table */
{ " Sel_pipe_drain_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE , STXT ( " Cycles a hardware thread stalls at Select waiting with correct instructions when pipeline has to drain after branch misprediction " ) } ,
{ " Sel_0_wait " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE , STXT ( " Cycles a hardware thread stalls at Select waiting for various conditions to be resolved " ) } ,
{ " Sel_0_ready " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE , STXT ( " Cycles a hardware thread was ready to have its instructions selected but another hardware thread was selected instead " ) } ,
{ " Sel_1 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE , STXT ( " Cycles that only 1 instruction or uop was selected " ) } ,
{ " Sel_2 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE , STXT ( " Cycles that 2 instructions or uops were selected " ) } ,
{ " Pick_0 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " Pick_1 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " Pick_2 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " Pick_3 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " Pick_any " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " Branches " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_NONE , STXT ( " Control transfer instructions completed, excluding trap-related transfers " ) } ,
{ " Instr_FGU_crypto " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_NONE , STXT ( " FP and VIS instructions completed by the Floating Point and Graphics Unit " ) } ,
{ " Instr_ld " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_EXACT , STXT ( " Load instructions completed " ) } ,
{ " Instr_st " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_EXACT , STXT ( " Store instructions completed " ) } ,
{ " SPR_ring_ops " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_EXACT , STXT ( " Specialized instructions that require internal use of SPR ring completed " ) } ,
{ " Instr_other " , NULL , REGNO_ANY , NULL , PRELOAD ( 2 , 4 ) , 0 , ABST_NONE , STXT ( " Basic arithmetic and logical instructions completed " ) } ,
{ " Instr_all " , NULL , REGNO_ANY , NULL , PRELOAD ( 1 , 4 ) , 0 , ABST_NONE , STXT ( " Total instructions completed " ) } ,
{ " Br_taken " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_NONE , STXT ( " Branch instructions taken and completed " ) } ,
{ " Sw_count_intr " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_NONE , STXT ( " SW Count instructions completed " ) } ,
{ " Atomics " , NULL , REGNO_ANY , NULL , PRELOAD ( 20 , 4 ) , 0 , ABST_EXACT , STXT ( " Atomic instructions, including CASA/XA, completed " ) } ,
{ " SW_prefetch " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_EXACT , STXT ( " PREFETCH and PREFETCHA instructions completed " ) } ,
{ " Block_ld_st " , NULL , REGNO_ANY , NULL , PRELOAD ( 20 , 4 ) , 0 , ABST_EXACT , STXT ( " Block load/store instructions completed " ) } ,
{ " BTC_miss " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_NONE , STXT ( " Branches delayed a few extra cycles because branch target not found in Branch Target Cache " ) } ,
{ " ITLB_fill_8KB " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 4 ) , 0 , ABST_NONE , STXT ( " ITLB miss and HW tablewalk successfully loaded translation for 8K page " ) } ,
{ " ITLB_fill_64KB " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 4 ) , 0 , ABST_NONE , STXT ( " ITLB miss and HW tablewalk successfully loaded translation for 64K page " ) } ,
{ " ITLB_fill_4MB " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 4 ) , 0 , ABST_NONE , STXT ( " ITLB miss and HW tablewalk successfully loaded translation for 4M page " ) } ,
{ " ITLB_fill_256MB " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 4 ) , 0 , ABST_NONE , STXT ( " ITLB miss and HW tablewalk successfully loaded translation for 256M page " ) } ,
{ " ITLB_fill_2GB " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 4 ) , 0 , ABST_NONE , STXT ( " ITLB miss and HW tablewalk successfully loaded translation for 2G or 16G page " ) } ,
{ " ITLB_fill_trap " , NULL , REGNO_ANY , NULL , PRELOAD ( 1000 , 4 ) , 0 , ABST_NONE , STXT ( " ITLB miss and HW tablewalk unsuccessful " ) } ,
{ " ITLB_miss_asynch " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 4 ) , 0 , ABST_NONE , STXT ( " ITLB miss and HW tablewalk search done " ) } ,
{ " Fetch_0 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " Fetch_0_all " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " Instr_buffer_full " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " PQ_tag_wait " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " ROB_tag_wait " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " LB_tag_wait " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " ROB_LB_tag_wait " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " SB_tag_wait " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " ROB_SB_tag_wait " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " LB_SB_tag_wait " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " ROB_LB_SB_tag_wait " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " DTLB_miss_tag_wait " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " ITLB_HWTW_L2_hit " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 4 ) , 0 , ABST_NONE , STXT ( " ITLB miss and HW tablewalk hit local L2D " ) } ,
{ " ITLB_HWTW_L3_hit " , NULL , REGNO_ANY , NULL , PRELOAD ( 80 , 4 ) , 0 , ABST_NONE , STXT ( " ITLB miss and HW tablewalk hit local L3 or neighbor L2D " ) } ,
{ " ITLB_HWTW_L3_miss " , NULL , REGNO_ANY , NULL , PRELOAD ( 800 , 4 ) , 0 , ABST_NONE , STXT ( " ITLB miss and HW tablewalk missed all local caches " ) } ,
{ " DTLB_HWTW_L2_hit " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 4 ) , 0 , ABST_NONE , STXT ( " DTLB miss and HW tablewalk hit local L2D " ) } ,
{ " DTLB_HWTW_L3_hit " , NULL , REGNO_ANY , NULL , PRELOAD ( 80 , 4 ) , 0 , ABST_NONE , STXT ( " DTLB miss and HW tablewalk hit local L3 or neighbor L2D " ) } ,
{ " DTLB_HWTW_L3_miss " , NULL , REGNO_ANY , NULL , PRELOAD ( 800 , 4 ) , 0 , ABST_NONE , STXT ( " DTLB miss and HW tablewalk missed all local caches " ) } ,
{ " DTLB_HWTW_all " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 4 ) , 0 , ABST_NONE , STXT ( " DTLB miss requiring HW tablewalk " ) } ,
{ " DC_miss_L2_L3_hit_nospec " , NULL , REGNO_ANY , NULL , PRELOAD ( 25 , 4 ) , 0 , ABST_EXACT } ,
{ " DC_miss_local_hit_nospec " , NULL , REGNO_ANY , NULL , PRELOAD ( 500 , 4 ) , 0 , ABST_EXACT } ,
{ " DC_miss_remote_L3_hit_nospec " , NULL , REGNO_ANY , NULL , PRELOAD ( 800 , 4 ) , 0 , ABST_EXACT } ,
{ " DC_miss_nospec " , NULL , REGNO_ANY , NULL , PRELOAD ( 25 , 4 ) , 0 , ABST_EXACT , STXT ( " Loads that missed local L1D " ) } ,
{ " DTLB_fill_8KB " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 4 ) , 0 , ABST_NONE , STXT ( " DTLB miss and HW tablewalk successfully loaded translation for 8K page " ) } ,
{ " DTLB_fill_64KB " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 4 ) , 0 , ABST_NONE , STXT ( " DTLB miss and HW tablewalk successfully loaded translation for 64K page " ) } ,
{ " DTLB_fill_4MB " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 4 ) , 0 , ABST_NONE , STXT ( " DTLB miss and HW tablewalk successfully loaded translation for 4M page " ) } ,
{ " DTLB_fill_256MB " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 4 ) , 0 , ABST_NONE , STXT ( " DTLB miss and HW tablewalk successfully loaded translation for 256M page " ) } ,
{ " DTLB_fill_2GB " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 4 ) , 0 , ABST_NONE , STXT ( " DTLB miss and HW tablewalk successfully loaded translation for 2G or 16G page " ) } ,
{ " DTLB_fill_trap " , NULL , REGNO_ANY , NULL , PRELOAD ( 800 , 4 ) , 0 , ABST_NONE , STXT ( " DTLB miss and HW tablewalk unsuccessful " ) } ,
{ " DTLB_miss_asynch " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 4 ) , 0 , ABST_NONE , STXT ( " DTLB miss and HW tablewalk search done " ) } ,
{ " RAW_hit_st_buf " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 4 ) , 0 , ABST_NONE , STXT ( " Loads delayed by a previous store (read-after-write) still in store buffer not yet committed " ) } ,
{ " RAW_hit_st_q " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 4 ) , 0 , ABST_NONE , STXT ( " Loads delayed by a previous store (read-after-write) committed but in store queue not yet written to L2D " ) } ,
{ " St_q_tag_wait " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " St_hit_L2 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_NONE , STXT ( " Stores whose cacheline being updated was in local L2D " ) } ,
{ " St_hit_L3 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_NONE , STXT ( " Stores whose cacheline being updated was in local L3 " ) } ,
{ " DC_miss_L2_L3_hit " , NULL , REGNO_ANY , NULL , PRELOAD ( 20 , 4 ) , 0 , ABST_NONE , STXT ( " Loads that speculatively hit local L2D or L3 " ) } ,
{ " DC_miss_local_hit " , NULL , REGNO_ANY , NULL , PRELOAD ( 500 , 4 ) , 0 , ABST_NONE , STXT ( " Loads that speculatively hit local memory " ) } ,
{ " DC_miss_remote_L3_hit " , NULL , REGNO_ANY , NULL , PRELOAD ( 800 , 4 ) , 0 , ABST_NONE , STXT ( " Loads that speculatively hit remote cache or remote memory " ) } ,
{ " DC_miss " , NULL , REGNO_ANY , NULL , PRELOAD ( 20 , 4 ) , 0 , ABST_NONE , STXT ( " Loads that speculatively missed L1D " ) } ,
{ " L2_pipe_stall " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " Br_dir_mispred " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 4 ) , 0 , ABST_NONE , STXT ( " Branch instructions completed whose direction was mispredicted " ) } ,
{ " Br_trg_mispred " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 4 ) , 0 , ABST_NONE , STXT ( " Branch instructions completed whose target was mispredicted " ) } ,
{ " Br_mispred " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 4 ) , 0 , ABST_NONE , STXT ( " Branch instructions completed whose direction or target was mispredicted " ) } ,
{ " Cycles_user " , NULL , REGNO_ANY , NULL , PRELOAD ( 1 , 4 ) , 1 , ABST_NONE , STXT ( " Cycles hardware thread is active in specified mode(s) " ) } ,
//
{ " Commit_0 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE , STXT ( " Cycles no uop commits from this hardware thread " ) } ,
{ " Commit_0_all " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE , STXT ( " Cycles no uop commits from any hardware thread on this core " ) } ,
{ " Commit_1 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE , STXT ( " Cycles 1 uop commits from this hardware thread " ) } ,
{ " Commit_2 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE , STXT ( " Cycles 2 uops commit from this hardware thread " ) } ,
{ " Commit_1_or_2 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE , STXT ( " Cycles 1 or 2 uops commit from this hardware thread " ) } ,
/* additional (hidden) aliases, for convenience */
{ " cycles0 " , " Cycles_user " , 0 , NULL , PRELOADS_8 , 1 , ABST_NONE } ,
{ " cycles1 " , " Cycles_user " , 1 , NULL , PRELOADS_8 , 1 , ABST_NONE } ,
{ " insts0 " , " Instr_all " , 0 , NULL , PRELOADS_8 , 0 , ABST_NONE } ,
{ " insts1 " , " Instr_all " , 1 , NULL , PRELOADS_8 , 0 , ABST_NONE } ,
{ NULL , NULL , 0 , NULL , 0 , 0 , 0 , 0 , ABST_NONE }
} ;
static Hwcentry sparc_m7 [ ] = {
// obsolete aliases marked with REGNO_INVALID (allows reading of older experiments)
{ " icm " , " IC_miss_commit " , REGNO_INVALID , STXT ( " L1 I-Cache Misses " ) , PRELOADS_6 , 0 , ABST_EXACT } ,
{ " raw_stb " , " RAW_hit_st_buf " , REGNO_INVALID , STXT ( " RAW Hazard in Store Buffer " ) , PRELOADS_55 , 0 , ABST_NONE } ,
{ " raw_stq " , " RAW_hit_st_q " , REGNO_INVALID , STXT ( " RAW Hazard in Store Queue " ) , PRELOADS_55 , 0 , ABST_NONE } ,
{ " pqs " , " PQ_tag_wait_cyc " , REGNO_INVALID , STXT ( " Pick Queue Stalls " ) , PRELOADS_7 , 1 , ABST_NONE } ,
{ " sel_stalls " , " Sel_0_ready_cyc " , REGNO_INVALID , STXT ( " Stalls Another Thread Selected " ) , PRELOADS_7 , 1 , ABST_NONE } ,
// current aliases
SPARC_CYCLES
{ " cycles " , " Cycles_user " , REGNO_ANY , STXT ( " CPU Cycles " ) , PRELOADS_75 , 1 , ABST_NONE } ,
{ " insts " , " Instr_all " , REGNO_ANY , STXT ( " Instructions Executed " ) , PRELOADS_75 , 0 , ABST_NONE } ,
{ " c_stalls " , " Commit_0_cyc " , REGNO_ANY , STXT ( " Stall Cycles " ) , PRELOADS_7 , 1 , ABST_NONE } ,
{ " loads " , " Instr_ld " , REGNO_ANY , STXT ( " Load Instructions " ) , PRELOADS_7 , 0 , ABST_EXACT } ,
{ " stores " , " Instr_st " , REGNO_ANY , STXT ( " Store Instructions " ) , PRELOADS_6 , 0 , ABST_EXACT } ,
{ " dcm " , " DC_miss_commit " , REGNO_ANY , STXT ( " L1 D-cache Misses " ) , PRELOADS_6 , 0 , ABST_EXACT } ,
{ " l3m_spec " , " DC_miss_L3_miss " , REGNO_ANY , STXT ( " L3 D-cache Speculative Misses " ) , PRELOADS_5 , 0 , ABST_NONE } ,
{ " lmh_spec " , " DC_miss_local_mem_hit " , REGNO_ANY , STXT ( " Local Mem Speculative Hits " ) , PRELOADS_5 , 0 , ABST_NONE } ,
{ " rmh_spec " , " DC_miss_remote_mem_hit " , REGNO_ANY , STXT ( " Remote Mem Speculative Hits " ) , PRELOADS_5 , 0 , ABST_NONE } ,
//
{ " dtlbm " , " DTLB_HWTW_search " , REGNO_ANY , STXT ( " DTLB Misses " ) , PRELOADS_55 , 0 , ABST_NONE } , // 10@l1 hit, 24@l2 hit, 60@l3 hit, 500@l3 miss, 5000@trap 0.001 events/cycle
{ " dtlb_hwtw_stalls " , " DTLB_HWTW_ref " , REGNO_ANY , STXT ( " DTLB HWTW Est Stalls " ) , PRELOADS_55 , 25 , ABST_NONE , STXT ( " Estimated time stalled on a DTLB miss requiring a HW tablewalk " ) } , // l2-20, l3-50
{ " dtlb_trap_stalls " , " DTLB_HWTW_miss_trap " , REGNO_ANY , STXT ( " DTLB Trap Est Stalls " ) , PRELOADS_35 , 5000 , ABST_NONE , STXT ( " Estimated time stalled on a DTLB miss with HW tablewalk unsuccessful " ) } , // 5000@trap
{ " rawhaz " , " RAW_hit_st_q~emask=0xf " , REGNO_ANY , STXT ( " Read-after-write Hazards " ) , PRELOADS_55 , 0 , ABST_NONE , STXT ( " Loads delayed by a previous store (read-after-write hazards) " ) } ,
{ " br_msp_stalls " , " Br_mispred " , REGNO_ANY , STXT ( " Branch Mispredict Stalls " ) , PRELOADS_6 , 24 , ABST_NONE , STXT ( " Estimated time stalled on Branch mispredictions " ) } , // 24@miss, %5 of branches is bad
{ " br_msp " , " Br_mispred " , REGNO_ANY , STXT ( " Branch Mispredict " ) , PRELOADS_6 , 0 , ABST_NONE } ,
{ " br_tkn " , " Br_taken " , REGNO_ANY , STXT ( " Branch Taken " ) , PRELOADS_7 , 0 , ABST_NONE } ,
{ " br_ins " , " Branches " , REGNO_ANY , STXT ( " Branch Instructions " ) , PRELOADS_7 , 0 , ABST_NONE } ,
{ " fgu " , " Instr_FGU_crypto " , REGNO_ANY , STXT ( " FP/VIS/Crypto Instructions " ) , PRELOADS_7 , 0 , ABST_NONE } ,
{ " spill_fill " , " Flush_arch_exception " , REGNO_ANY , STXT ( " Reg Window Spill/Fill Est Stalls " ) , PRELOAD ( 100 , 4 ) , 80 , ABST_NONE , STXT ( " Estimated time stalled on flushing pipeline due to register window spill/fill " ) } ,
/* explicit definitions of (hidden) entries for proper counters */
/* Counters that can be time converted, support memspace, or have a short_desc need to be in this table */
{ " Sel_pipe_drain_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE , STXT ( " Cycles a hardware thread stalls at Select waiting with correct instructions when pipeline has to drain after branch misprediction " ) } ,
{ " Sel_0_wait_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE , STXT ( " Cycles a hardware thread stalls at Select waiting for various conditions to be resolved " ) } ,
{ " Sel_0_ready_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE , STXT ( " Cycles a hardware thread was ready to have its instructions selected but another hardware thread was selected instead " ) } ,
{ " Sel_1_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE , STXT ( " Cycles that only 1 instruction or uop was selected " ) } ,
{ " Sel_2_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE , STXT ( " Cycles that 2 instructions or uops were selected " ) } ,
{ " Pick_0_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " Pick_1_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " Pick_2_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " Pick_3_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " Pick_any_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " Branches " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_NONE , STXT ( " Control transfer instructions completed, excluding trap-related transfers " ) } ,
{ " Instr_FGU_crypto " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_NONE , STXT ( " FP and VIS instructions completed by the Floating Point and Graphics Unit " ) } ,
{ " Instr_ld " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_EXACT , STXT ( " Load instructions completed " ) } ,
{ " Instr_st " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_EXACT , STXT ( " Store instructions completed " ) } ,
{ " Instr_SPR_ring_ops " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_EXACT , STXT ( " Specialized instructions that require internal use of SPR ring completed " ) } ,
{ " Instr_other " , NULL , REGNO_ANY , NULL , PRELOAD ( 2 , 4 ) , 0 , ABST_NONE , STXT ( " Basic arithmetic and logical instructions completed " ) } ,
{ " Instr_all " , NULL , REGNO_ANY , NULL , PRELOAD ( 1 , 4 ) , 0 , ABST_NONE , STXT ( " Total instructions completed " ) } ,
{ " Br_taken " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_NONE , STXT ( " Branch instructions taken and completed " ) } ,
{ " Instr_SW_count " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_NONE , STXT ( " SW Count instructions completed " ) } ,
{ " Instr_atomic " , NULL , REGNO_ANY , NULL , PRELOAD ( 20 , 4 ) , 0 , ABST_EXACT , STXT ( " Atomic instructions, including CASA/XA, completed " ) } ,
{ " Instr_SW_prefetch " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_EXACT , STXT ( " PREFETCH and PREFETCHA instructions completed " ) } ,
{ " Instr_block_ld_st " , NULL , REGNO_ANY , NULL , PRELOAD ( 20 , 4 ) , 0 , ABST_EXACT , STXT ( " Block load/store instructions completed " ) } ,
{ " Br_BTC_miss " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_NONE , STXT ( " Branches delayed a few extra cycles because branch target not found in Branch Target Cache " ) } ,
{ " ITLB_HWTW_hit_8K " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 4 ) , 0 , ABST_NONE , STXT ( " ITLB miss and HW tablewalk successfully loaded translation for 8K page " ) } ,
{ " ITLB_HWTW_hit_64K " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 4 ) , 0 , ABST_NONE , STXT ( " ITLB miss and HW tablewalk successfully loaded translation for 64K page " ) } ,
{ " ITLB_HWTW_hit_4M " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 4 ) , 0 , ABST_NONE , STXT ( " ITLB miss and HW tablewalk successfully loaded translation for 4M page " ) } ,
{ " ITLB_HWTW_hit_256M " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 4 ) , 0 , ABST_NONE , STXT ( " ITLB miss and HW tablewalk successfully loaded translation for 256M page " ) } ,
{ " ITLB_HWTW_hit_2G_16G " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 4 ) , 0 , ABST_NONE , STXT ( " ITLB miss and HW tablewalk successfully loaded translation for 2G or 16G page " ) } ,
{ " ITLB_HWTW_miss_trap " , NULL , REGNO_ANY , NULL , PRELOAD ( 1000 , 4 ) , 0 , ABST_NONE , STXT ( " ITLB miss and HW tablewalk unsuccessful " ) } ,
{ " ITLB_HWTW_search " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 4 ) , 0 , ABST_NONE , STXT ( " ITLB miss and HW tablewalk search done " ) } ,
{ " Fetch_0_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " Fetch_0_all_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " Instr_buffer_full_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " PQ_tag_wait_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " ROB_tag_wait_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " LB_tag_wait_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " SB_tag_wait_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " ROB_LB_tag_wait_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " ROB_SB_tag_wait_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " LB_SB_tag_wait_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " ROB_LB_SB_tag_wait_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " DTLB_miss_tag_wait_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " ITLB_HWTW_L2_hit " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 4 ) , 0 , ABST_NONE , STXT ( " ITLB miss and HW tablewalk hit local L2D " ) } ,
{ " ITLB_HWTW_L3_hit " , NULL , REGNO_ANY , NULL , PRELOAD ( 80 , 4 ) , 0 , ABST_NONE , STXT ( " ITLB miss and HW tablewalk hit local L3 or neighbor L2D " ) } ,
{ " ITLB_HWTW_L3_miss " , NULL , REGNO_ANY , NULL , PRELOAD ( 800 , 4 ) , 0 , ABST_NONE , STXT ( " ITLB miss and HW tablewalk missed all local caches " ) } ,
{ " DTLB_HWTW_L2_hit " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 4 ) , 0 , ABST_NONE , STXT ( " DTLB miss and HW tablewalk hit local L2D " ) } ,
{ " DTLB_HWTW_L3_hit " , NULL , REGNO_ANY , NULL , PRELOAD ( 80 , 4 ) , 0 , ABST_NONE , STXT ( " DTLB miss and HW tablewalk hit local L3 or neighbor L2D " ) } ,
{ " DTLB_HWTW_L3_miss " , NULL , REGNO_ANY , NULL , PRELOAD ( 800 , 4 ) , 0 , ABST_NONE , STXT ( " DTLB miss and HW tablewalk missed all local caches " ) } ,
{ " DTLB_HWTW_ref " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 4 ) , 0 , ABST_NONE , STXT ( " DTLB miss requiring HW tablewalk " ) } ,
{ " DC_miss_L2_L3_hit_commit " , NULL , REGNO_ANY , NULL , PRELOAD ( 25 , 4 ) , 0 , ABST_EXACT } ,
{ " DC_miss_nbr_scc_hit_commit " , NULL , REGNO_ANY , NULL , PRELOAD ( 500 , 4 ) , 0 , ABST_EXACT } ,
{ " DC_miss_nbr_scc_miss_commit " , NULL , REGNO_ANY , NULL , PRELOAD ( 800 , 4 ) , 0 , ABST_EXACT } ,
{ " DC_miss_commit " , NULL , REGNO_ANY , NULL , PRELOAD ( 25 , 4 ) , 0 , ABST_EXACT , STXT ( " Loads that missed local L1D " ) } ,
{ " DTLB_HWTW_hit_8K " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 4 ) , 0 , ABST_NONE , STXT ( " DTLB miss and HW tablewalk successfully loaded translation for 8K page " ) } ,
{ " DTLB_HWTW_hit_64K " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 4 ) , 0 , ABST_NONE , STXT ( " DTLB miss and HW tablewalk successfully loaded translation for 64K page " ) } ,
{ " DTLB_HWTW_hit_4M " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 4 ) , 0 , ABST_NONE , STXT ( " DTLB miss and HW tablewalk successfully loaded translation for 4M page " ) } ,
{ " DTLB_HWTW_hit_256M " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 4 ) , 0 , ABST_NONE , STXT ( " DTLB miss and HW tablewalk successfully loaded translation for 256M page " ) } ,
{ " DTLB_HWTW_hit_2G_16G " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 4 ) , 0 , ABST_NONE , STXT ( " DTLB miss and HW tablewalk successfully loaded translation for 2G or 16G page " ) } ,
{ " DTLB_HWTW_miss_trap " , NULL , REGNO_ANY , NULL , PRELOAD ( 800 , 4 ) , 0 , ABST_NONE , STXT ( " DTLB miss and HW tablewalk unsuccessful " ) } ,
{ " DTLB_HWTW_search " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 4 ) , 0 , ABST_NONE , STXT ( " DTLB miss and HW tablewalk search done " ) } ,
{ " RAW_hit_st_buf " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 4 ) , 0 , ABST_NONE , STXT ( " Loads delayed by a previous store (read-after-write) still in store buffer not yet committed " ) } ,
{ " RAW_hit_st_q " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 4 ) , 0 , ABST_NONE , STXT ( " Loads delayed by a previous store (read-after-write) committed but in store queue not yet written to L2D " ) } ,
{ " St_q_tag_wait_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " St_L2_hit " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_NONE , STXT ( " Stores whose cacheline being updated was in local L2D " ) } ,
{ " St_L3_hit " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_NONE , STXT ( " Stores whose cacheline being updated was in local L3 " ) } ,
{ " DC_hit " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_NONE , STXT ( " Loads that speculatively hit local L1D " ) } ,
{ " DC_miss_L2_hit " , NULL , REGNO_ANY , NULL , PRELOAD ( 20 , 4 ) , 0 , ABST_NONE , STXT ( " Loads that speculatively hit local L2D " ) } ,
{ " DC_miss_L3_hit " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 4 ) , 0 , ABST_NONE , STXT ( " Loads that speculatively hit local L3 " ) } ,
{ " DC_miss_nbr_L2_hit " , NULL , REGNO_ANY , NULL , PRELOAD ( 100 , 4 ) , 0 , ABST_NONE , STXT ( " Loads that speculatively hit neighbor L2D via local L3 " ) } ,
{ " DC_miss_nbr_scc_hit " , NULL , REGNO_ANY , NULL , PRELOAD ( 100 , 4 ) , 0 , ABST_NONE , STXT ( " Loads that speculatively hit neighbor L3 on same socket " ) } ,
{ " DC_miss_nbr_scc_miss " , NULL , REGNO_ANY , NULL , PRELOAD ( 400 , 4 ) , 0 , ABST_NONE , STXT ( " Loads that speculatively missed all caches on same socket " ) } ,
{ " DC_miss " , NULL , REGNO_ANY , NULL , PRELOAD ( 10 , 4 ) , 0 , ABST_NONE , STXT ( " Loads that speculatively missed local L1D " ) } ,
{ " DC_miss_L2_miss " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 4 ) , 0 , ABST_NONE , STXT ( " Loads that speculatively missed local L2D " ) } ,
{ " DC_miss_L3_miss " , NULL , REGNO_ANY , NULL , PRELOAD ( 200 , 4 ) , 0 , ABST_NONE , STXT ( " Loads that speculatively missed local L3 " ) } ,
{ " DC_miss_remote_scc_hit " , NULL , REGNO_ANY , NULL , PRELOAD ( 800 , 4 ) , 0 , ABST_NONE , STXT ( " Loads that speculatively hit remote cache on different socket " ) } ,
{ " DC_miss_local_mem_hit " , NULL , REGNO_ANY , NULL , PRELOAD ( 500 , 4 ) , 0 , ABST_NONE , STXT ( " Loads that speculatively hit local memory " ) } ,
{ " DC_miss_remote_mem_hit " , NULL , REGNO_ANY , NULL , PRELOAD ( 1000 , 4 ) , 0 , ABST_NONE , STXT ( " Loads that speculatively hit remote memory " ) } ,
{ " Br_dir_mispred " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 4 ) , 0 , ABST_NONE , STXT ( " Branch instructions completed whose direction was mispredicted " ) } ,
{ " Br_tgt_mispred " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 4 ) , 0 , ABST_NONE , STXT ( " Branch instructions completed whose target was mispredicted " ) } ,
{ " Br_mispred " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 4 ) , 0 , ABST_NONE , STXT ( " Branch instructions completed whose direction or target was mispredicted " ) } ,
{ " Cycles_user " , NULL , REGNO_ANY , NULL , PRELOAD ( 1 , 4 ) , 1 , ABST_NONE , STXT ( " Cycles hardware thread is active in specified mode(s) " ) } ,
{ " Flush_L3_miss " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 4 ) , 0 , ABST_NONE , STXT ( " Pipeline flushes due to a load that misses L3 when more than 1 hardware thread is active on the core " ) } ,
{ " Flush_br_mispred " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 4 ) , 0 , ABST_NONE , STXT ( " Pipeline flushes due to a branch misprediction " ) } ,
{ " Flush_arch_exception " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 4 ) , 0 , ABST_NONE , STXT ( " Pipeline flushes due to SPARC architecture exceptions and trap entry/return " ) } ,
{ " Flush_other " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 4 ) , 0 , ABST_NONE , STXT ( " Pipeline flushes due to hardware thread state change to/from halted/paused state " ) } ,
//
{ " Commit_0_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE , STXT ( " Cycles no uop commits from this hardware thread " ) } ,
{ " Commit_0_all_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE , STXT ( " Cycles no uop commits from any hardware thread on this core " ) } ,
{ " Commit_1_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE , STXT ( " Cycles 1 uop commits from this hardware thread " ) } ,
{ " Commit_2_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE , STXT ( " Cycles 2 uops commit from this hardware thread " ) } ,
{ " Commit_1_or_2_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE , STXT ( " Cycles 1 or 2 uops commit from this hardware thread " ) } ,
/* additional (hidden) aliases, for convenience */
{ " cycles0 " , " Cycles_user " , 0 , NULL , PRELOADS_8 , 1 , ABST_NONE } ,
{ " cycles1 " , " Cycles_user " , 1 , NULL , PRELOADS_8 , 1 , ABST_NONE } ,
{ " insts0 " , " Instr_all " , 0 , NULL , PRELOADS_8 , 0 , ABST_NONE } ,
{ " insts1 " , " Instr_all " , 1 , NULL , PRELOADS_8 , 0 , ABST_NONE } ,
{ NULL , NULL , 0 , NULL , 0 , 0 , 0 , 0 , ABST_NONE }
} ;
static Hwcentry sparc_m8 [ ] = {
// current aliases
SPARC_CYCLES
{ " cycles " , " Cycles_user " , REGNO_ANY , STXT ( " CPU Cycles " ) , PRELOADS_75 , 1 , ABST_NONE } ,
{ " insts " , " Instr_all " , REGNO_ANY , STXT ( " Instructions Executed " ) , PRELOADS_75 , 0 , ABST_NONE } ,
{ " c_stalls " , " Commit_0_cyc " , 3 , STXT ( " Stall Cycles " ) , PRELOADS_7 , 1 , ABST_NONE } , // 22825776: limit to reg 3
{ " Sel_0_wait_cyc " , " Sel_0_cyc~emask=0x3f " , REGNO_ANY , STXT ( " Select Stall Cycles " ) , PRELOADS_7 , 1 , ABST_NONE , STXT ( " Cycles a hardware thread stalls at Select waiting for various conditions to be resolved that prevent it being selected " ) } ,
{ " loads " , " Instr_ld " , REGNO_ANY , STXT ( " Load Instructions " ) , PRELOADS_7 , 0 , ABST_EXACT } ,
{ " stores " , " Instr_st " , REGNO_ANY , STXT ( " Store Instructions " ) , PRELOADS_6 , 0 , ABST_EXACT } ,
{ " dcm " , " DC_miss_commit " , REGNO_ANY , STXT ( " L1 D-cache Misses " ) , PRELOADS_6 , 0 , ABST_EXACT } ,
{ " lmh_spec " , " DC_miss_local_mem_hit " , REGNO_ANY , STXT ( " Local Mem Speculative Hits " ) , PRELOADS_5 , 0 , ABST_NONE } ,
{ " rmh_spec " , " DC_miss_remote_mem_hit " , REGNO_ANY , STXT ( " Remote Mem Speculative Hits " ) , PRELOADS_5 , 0 , ABST_NONE } ,
{ " dtlbm " , " DTLB_HWTW " , REGNO_ANY , STXT ( " DTLB Misses " ) , PRELOAD ( 40 , 5 ) , 0 , ABST_NONE } , // 10@l1 hit, 24@l2 hit, 60@l3 hit, 500@l3 miss, 5000@trap 0.001 events/cycle
{ " dtlb_hwtw_stalls " , " DTLB_HWTW " , REGNO_ANY , STXT ( " DTLB HWTW Est Stalls " ) , PRELOAD ( 40 , 5 ) , 25 , ABST_NONE , STXT ( " Estimated time stalled on a DTLB miss requiring a HW tablewalk " ) } , // l2-20, l3-50
{ " dtlb_trap_stalls " , " DTLB_HWTW_miss_trap " , REGNO_ANY , STXT ( " DTLB Trap Est Stalls " ) , PRELOAD ( 800 , 5 ) , 5000 , ABST_NONE , STXT ( " Estimated time stalled on a DTLB miss with HW tablewalk unsuccessful " ) } , // 5000@trap
{ " rawhaz " , " RAW_hit " , REGNO_ANY , STXT ( " Read-after-write Hazards " ) , PRELOAD ( 40 , 5 ) , 0 , ABST_NONE } ,
{ " br_msp_stalls " , " Br_mispred " , REGNO_ANY , STXT ( " Branch Mispredict Stalls " ) , PRELOAD ( 40 , 5 ) , 24 , ABST_NONE , STXT ( " Estimated time stalled on Branch mispredictions " ) } , // 24@miss, %5 of branches is bad
{ " br_msp " , " Br_mispred " , REGNO_ANY , STXT ( " Branch Mispredict " ) , PRELOAD ( 40 , 5 ) , 0 , ABST_NONE } ,
{ " br_tkn " , " Br_taken " , REGNO_ANY , STXT ( " Branch Taken " ) , PRELOADS_7 , 0 , ABST_NONE } ,
{ " br_ins " , " Branches " , REGNO_ANY , STXT ( " Branch Instructions " ) , PRELOADS_7 , 0 , ABST_NONE } ,
{ " fgu " , " Instr_FGU_crypto " , REGNO_ANY , STXT ( " FP/VIS/Crypto Instructions " ) , PRELOADS_7 , 0 , ABST_NONE } ,
{ " spill_fill " , " Flush_spill_fill " , REGNO_ANY , STXT ( " Reg Window Spill/Fill Est Stalls " ) , PRELOAD ( 100 , 5 ) , 80 , ABST_NONE , STXT ( " Estimated time stalled on flushing pipeline due to register window spill/fill " ) } ,
/* explicit definitions of (hidden) entries for proper counters */
/* Counters that can be time converted, support memspace, or have a short_desc need to be in this table */
//0x01
{ " Fetch_stall_IFU_reset_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " Fetch_stall_IC_miss_MB_full_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " Fetch_stall_IC_miss_MB_avail_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " Fetch_stall_IC_miss_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " Fetch_stall_ITLB_miss_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " Fetch_stall_SEL_buf_full_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " Fetch_ready_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " Fetch_0_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " Fetch_0_all_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
//0x02
{ " Fetch_1_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " Fetch_2_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " Fetch_3_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " Fetch_4_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " Fetch_5_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " Fetch_6_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " Fetch_7_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " Fetch_8_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " Fetch_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
//0x07
{ " ITLB_HWTW_hit_8K " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 5 ) , 0 , ABST_NONE , STXT ( " ITLB miss and HW tablewalk successfully loaded translation for 8K page " ) } ,
{ " ITLB_HWTW_hit_64K " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 5 ) , 0 , ABST_NONE , STXT ( " ITLB miss and HW tablewalk successfully loaded translation for 64K page " ) } ,
{ " ITLB_HWTW_hit_4M " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 5 ) , 0 , ABST_NONE , STXT ( " ITLB miss and HW tablewalk successfully loaded translation for 4M page " ) } ,
{ " ITLB_HWTW_hit_256M " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 5 ) , 0 , ABST_NONE , STXT ( " ITLB miss and HW tablewalk successfully loaded translation for 256M page " ) } ,
{ " ITLB_HWTW_hit_16G " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 5 ) , 0 , ABST_NONE , STXT ( " ITLB miss and HW tablewalk successfully loaded translation for 16G page " ) } ,
{ " ITLB_HWTW_hit_1T " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 5 ) , 0 , ABST_NONE , STXT ( " ITLB miss and HW tablewalk successfully loaded translation for 1T page " ) } ,
// { "ITLB_HWTW_miss_RA2PAC", 0x0740, 0xf07ff },
// { "ITLB_HWTW_miss_not_RA2PAC", 0x0780, 0xf07ff },
{ " ITLB_HWTW_miss_trap " , NULL , REGNO_ANY , NULL , PRELOAD ( 1000 , 5 ) , 0 , ABST_NONE , STXT ( " ITLB miss and HW tablewalk unsuccessful " ) } ,
{ " ITLB_HWTW " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 5 ) , 0 , ABST_NONE , STXT ( " ITLB miss and HW tablewalk search done " ) } ,
//0x08
{ " Br_BTC_miss " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_NONE , STXT ( " Branches delayed a few extra cycles because branch target not found in Branch Target Cache " ) } ,
//0x09
{ " Sel_0_no_instr_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE , STXT ( " Cycles a hardware thread stalls at Select because no instructions are available " ) } ,
{ " Sel_0_pipe_drain_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE , STXT ( " Cycles a hardware thread stalls at Select waiting with correct instructions when pipeline has to drain after branch misprediction " ) } ,
{ " Sel_0_postsync_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE , STXT ( " Cycles a hardware thread stalls at Select waiting for prior instructions to commit " ) } ,
{ " Sel_0_presync_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE , STXT ( " Cycles a hardware thread stalls at Select with instruction that cannot decode until prior instructions have committed " ) } ,
{ " Sel_0_thread_hog_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE , STXT ( " Cycles a hardware thread stalls at Select to prevent strand monopolizing resources " ) } ,
{ " Sel_0_tag_stall_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE , STXT ( " Cycles a hardware thread stalls at Select because no required tags are available " ) } ,
{ " Sel_0_ready_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE , STXT ( " Cycles a hardware thread was ready to have its instructions selected but another hardware thread was selected instead " ) } ,
{ " Sel_0_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE , STXT ( " Cycles a hardware thread is not selected " ) } ,
// No direct equivalent Sel_1/2_cyc. Nearest is Decode_uop, which increments by 0-4 each cycle according to how many uops were decoded.
//0x13
{ " ITLB_HWTW_L2_hit " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 5 ) , 0 , ABST_NONE , STXT ( " ITLB miss and HW tablewalk hit local L2D " ) } ,
{ " ITLB_HWTW_L3_hit " , NULL , REGNO_ANY , NULL , PRELOAD ( 80 , 5 ) , 0 , ABST_NONE , STXT ( " ITLB miss and HW tablewalk hit local L3 or neighbor L2D " ) } ,
{ " ITLB_HWTW_L3_miss " , NULL , REGNO_ANY , NULL , PRELOAD ( 800 , 5 ) , 0 , ABST_NONE , STXT ( " ITLB miss and HW tablewalk missed all local caches " ) } ,
{ " DTLB_HWTW_L2_hit " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 5 ) , 0 , ABST_NONE , STXT ( " DTLB miss and HW tablewalk hit local L2D " ) } ,
{ " DTLB_HWTW_L3_hit " , NULL , REGNO_ANY , NULL , PRELOAD ( 80 , 5 ) , 0 , ABST_NONE , STXT ( " DTLB miss and HW tablewalk hit local L3 or neighbor L2D " ) } ,
{ " DTLB_HWTW_L3_miss " , NULL , REGNO_ANY , NULL , PRELOAD ( 800 , 5 ) , 0 , ABST_NONE , STXT ( " DTLB miss and HW tablewalk missed all local caches " ) } ,
{ " DTLB_HWTW_ref " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 5 ) , 0 , ABST_NONE , STXT ( " DTLB miss requiring HW tablewalk " ) } ,
//0x0E
{ " Instr_FGU_crypto " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_NONE , STXT ( " FP and VIS instructions completed by the Floating Point and Graphics Unit " ) } ,
{ " Instr_ld " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_EXACT , STXT ( " Load instructions completed " ) } ,
{ " Instr_st " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_EXACT , STXT ( " Store instructions completed " ) } ,
{ " Instr_block_ld_st " , NULL , REGNO_ANY , NULL , PRELOAD ( 20 , 5 ) , 0 , ABST_EXACT , STXT ( " Block load/store instructions completed " ) } ,
{ " Instr_SPR_ring_ops " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_EXACT , STXT ( " Specialized instructions that require internal use of SPR ring completed " ) } ,
{ " Instr_atomic " , NULL , REGNO_ANY , NULL , PRELOAD ( 20 , 5 ) , 0 , ABST_EXACT , STXT ( " Atomic instructions, including CASA/XA, completed " ) } ,
{ " Instr_SW_prefetch " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_EXACT , STXT ( " PREFETCH and PREFETCHA instructions completed " ) } ,
{ " Instr_other " , NULL , REGNO_ANY , NULL , PRELOAD ( 2 , 5 ) , 0 , ABST_NONE , STXT ( " Basic arithmetic and logical instructions completed " ) } ,
{ " Instr_all " , NULL , REGNO_ANY , NULL , PRELOAD ( 1 , 5 ) , 0 , ABST_NONE , STXT ( " Total instructions completed " ) } ,
//0x0F
{ " Branches " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_NONE , STXT ( " Control transfer instructions completed, excluding trap-related transfers " ) } ,
//0x10
{ " Br_taken " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_NONE , STXT ( " Branch instructions taken and completed " ) } ,
//0x11
{ " Rename_tag_wait_PQ_1_EXU_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " Rename_tag_wait_PQ_0_LSU_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " Rename_wait_crypto_diag_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " Sel_0_wait_ROB_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " Sel_0_wait_WRF_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " Sel_0_wait_LB_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " Sel_0_wait_SB_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
//0x12
{ " Fetch_stall_BDA_tag_unavail_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " Fetch_stall_BTA_tag_unavail_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " Fetch_stall_misc_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " Fetch_stall_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " MMU_TTE_buffer_tag_wait_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " MMU_PRQ_pool_tag_wait_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
//0x15
{ " L2I_request_block_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " L2I_thread_hog_stall_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " L2I_MB_full_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " L2I_snoop_eviction " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " L2I_stall_no_request_credit_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " L2I_stall_no_response_credit_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
//0x16
{ " Flush_thread_hog " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 5 ) , 0 , ABST_NONE , STXT ( " Pipeline flushes to prevent thread from monopolizing resources " ) } ,
{ " Flush_br_mispred " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 5 ) , 0 , ABST_NONE , STXT ( " Pipeline flushes due to a branch misprediction " ) } ,
{ " Flush_arch_exception " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 5 ) , 0 , ABST_NONE , STXT ( " Pipeline flushes due to SPARC architecture exceptions and trap entry/return " ) } ,
{ " Flush_evil_twin " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 5 ) , 0 , ABST_NONE , STXT ( " Pipeline flushes due to detecting floating point evil twin condition " ) } ,
{ " Flush_LSU_trap " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 5 ) , 0 , ABST_NONE , STXT ( " Pipeline flushes to refetch Next-PC " ) } ,
{ " Flush_mode_change " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 5 ) , 0 , ABST_NONE , STXT ( " Pipeline flushes due to strand mode change " ) } ,
{ " Flush_misalign " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 5 ) , 0 , ABST_NONE , STXT ( " Pipeline flushes due to detecting misaligned load/store requiring transition to misaligned mitigation mode " ) } ,
{ " Flush_other " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 5 ) , 0 , ABST_NONE , STXT ( " Pipeline flushes due to hardware thread state change to/from halted/paused state " ) } ,
{ " Flush_all " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 5 ) , 0 , ABST_NONE , STXT ( " Pipeline flushes due to any reason " ) } ,
//0x17
{ " Flush_spill_n_normal " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 5 ) , 0 , ABST_NONE , STXT ( " Pipeline flushes due to spill_n_normal exception " ) } ,
{ " Flush_spill_n_other " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 5 ) , 0 , ABST_NONE , STXT ( " Pipeline flushes due to spill_n_other exception " ) } ,
{ " Flush_fill_n_normal " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 5 ) , 0 , ABST_NONE , STXT ( " Pipeline flushes due to fill_n_normal exception " ) } ,
{ " Flush_fill_n_other " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 5 ) , 0 , ABST_NONE , STXT ( " Pipeline flushes due to fill_n_other exception " ) } ,
{ " Flush_spill_fill " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 5 ) , 0 , ABST_NONE , STXT ( " Pipeline flushes due to spill/fill exceptions " ) } ,
{ " Flush_lost_load " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 5 ) , 0 , ABST_NONE , STXT ( " Pipeline flushes due to speculatively executed load violating memory order " ) } ,
//0x21
{ " Br_dir_mispred " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 5 ) , 0 , ABST_NONE , STXT ( " Branch instructions completed whose direction was mispredicted " ) } ,
{ " Br_tgt_mispred " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 5 ) , 0 , ABST_NONE , STXT ( " Branch instructions completed whose target was mispredicted " ) } ,
{ " Br_mispred " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 5 ) , 0 , ABST_NONE , STXT ( " Branch instructions completed whose direction or target was mispredicted " ) } ,
//0x23
{ " LSU_st_q_tag_wait_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " LSU_st_q_tag_wait_all_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " L2D_stall_no_request_credit_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " L2D_stall_no_response_credit_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
//0x27
{ " DC_miss_L2_hit " , NULL , REGNO_ANY , NULL , PRELOAD ( 20 , 5 ) , 0 , ABST_NONE , STXT ( " Loads that speculatively hit local L2D " ) } ,
{ " DC_miss_L3_hit " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 5 ) , 0 , ABST_NONE , STXT ( " Loads that speculatively hit local L3 " ) } ,
{ " DC_miss_L3_dirty_copyback " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 5 ) , 0 , ABST_NONE , STXT ( " Loads that speculatively hit local L3 but require copyback from L2D within same CPC " ) } ,
{ " DC_miss_nbr_L3_hit " , NULL , REGNO_ANY , NULL , PRELOAD ( 100 , 5 ) , 0 , ABST_NONE , STXT ( " Loads that speculatively hit neighbor L3 on same socket " ) } ,
{ " DC_miss_remote_L3_hit " , NULL , REGNO_ANY , NULL , PRELOAD ( 400 , 5 ) , 0 , ABST_NONE , STXT ( " Loads that speculatively hit remote cache on different socket " ) } ,
{ " DC_miss_local_mem_hit " , NULL , REGNO_ANY , NULL , PRELOAD ( 500 , 5 ) , 0 , ABST_NONE , STXT ( " Loads that speculatively hit local memory " ) } ,
{ " DC_miss_remote_mem_hit " , NULL , REGNO_ANY , NULL , PRELOAD ( 1000 , 5 ) , 0 , ABST_NONE , STXT ( " Loads that speculatively hit remote memory " ) } ,
{ " DC_miss " , NULL , REGNO_ANY , NULL , PRELOAD ( 10 , 5 ) , 0 , ABST_NONE , STXT ( " Loads that speculatively missed local L1D " ) } ,
//0x28
{ " DC_sec_miss_L2_hit_commit " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_EXACT } ,
{ " DC_miss_L2_hit_commit " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_EXACT } ,
{ " DC_miss_L3_hit_commit " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_EXACT } ,
{ " DC_miss_L3_dirty_copyback_commit " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_EXACT } ,
{ " DC_miss_nbr_L3_hit_commit " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_EXACT } ,
{ " DC_miss_remote_L3_hit_commit " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_EXACT } ,
{ " DC_miss_local_mem_hit_commit " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_EXACT } ,
{ " DC_miss_remote_mem_hit_commit " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_EXACT } ,
{ " DC_miss_commit " , NULL , REGNO_ANY , NULL , PRELOAD ( 25 , 5 ) , 0 , ABST_EXACT , STXT ( " Loads that missed local L1D " ) } ,
//0x29
// {"Store_DC_sec_miss_L2_hit", NULL, REGNO_ANY, NULL, PRELOAD_DEF, 0, ABST_NONE, STXT("")},
{ " Store_L2_hit " , NULL , REGNO_ANY , NULL , PRELOAD ( 20 , 5 ) , 0 , ABST_NONE , STXT ( " Stores whose cacheline being updated was in local L2D " ) } ,
{ " Store_L3_hit " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 5 ) , 0 , ABST_NONE , STXT ( " Stores whose cacheline being updated was in local L3 " ) } ,
{ " Store_nbr_L2_hit " , NULL , REGNO_ANY , NULL , PRELOAD ( 100 , 5 ) , 0 , ABST_NONE , STXT ( " Stores whose cacheline being updated was in neighbor L2 on same socket " ) } ,
{ " Store_nbr_L3_hit " , NULL , REGNO_ANY , NULL , PRELOAD ( 100 , 5 ) , 0 , ABST_NONE , STXT ( " Stores whose cacheline being updated was in neighbor L3 on same socket " ) } ,
{ " Store_remote_L3_hit " , NULL , REGNO_ANY , NULL , PRELOAD ( 400 , 5 ) , 0 , ABST_NONE , STXT ( " Stores whose cacheline being updated was in remote cache on different socket " ) } ,
{ " Store_local_mem_hit " , NULL , REGNO_ANY , NULL , PRELOAD ( 500 , 5 ) , 0 , ABST_NONE , STXT ( " Stores whose cacheline being updated was in local memory " ) } ,
{ " Store_remote_mem_hit " , NULL , REGNO_ANY , NULL , PRELOAD ( 1000 , 5 ) , 0 , ABST_NONE , STXT ( " Stores whose cacheline being updated was in remote memory " ) } ,
{ " Store_all " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_NONE , STXT ( " Stores whose cacheline being updated was observed to be somewhere in the memory hierarchy " ) } ,
//0x2d
{ " RAW_hit_st_buf " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 5 ) , 0 , ABST_NONE , STXT ( " Loads delayed by a previous store (read-after-write) still in store buffer not yet committed " ) } ,
{ " RAW_hit_st_q " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 5 ) , 0 , ABST_NONE , STXT ( " Loads delayed by a previous store (read-after-write) committed but in store queue not yet written to L2D " ) } ,
{ " RAW_hit " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 5 ) , 0 , ABST_NONE , STXT ( " Loads delayed by a previous store (read-after-write hazards) " ) } ,
//0x2f
{ " Cycles_user_non_MLA " , NULL , REGNO_ANY , NULL , PRELOADS_75 , 1 , ABST_NONE } ,
{ " Cycles_user_MLA " , NULL , REGNO_ANY , NULL , PRELOADS_75 , 1 , ABST_NONE } ,
{ " Cycles_user " , NULL , REGNO_ANY , NULL , PRELOAD ( 1 , 5 ) , 1 , ABST_NONE , STXT ( " Cycles hardware thread is active in specified mode(s) " ) } ,
//0x37
{ " DTLB_HWTW_hit_8K " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 5 ) , 0 , ABST_NONE , STXT ( " DTLB miss and HW tablewalk successfully loaded translation for 8K page " ) } ,
{ " DTLB_HWTW_hit_64K " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 5 ) , 0 , ABST_NONE , STXT ( " DTLB miss and HW tablewalk successfully loaded translation for 64K page " ) } ,
{ " DTLB_HWTW_hit_4M " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 5 ) , 0 , ABST_NONE , STXT ( " DTLB miss and HW tablewalk successfully loaded translation for 4M page " ) } ,
{ " DTLB_HWTW_hit_256M " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 5 ) , 0 , ABST_NONE , STXT ( " DTLB miss and HW tablewalk successfully loaded translation for 256M page " ) } ,
{ " DTLB_HWTW_hit_16G " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 5 ) , 0 , ABST_NONE , STXT ( " DTLB miss and HW tablewalk successfully loaded translation for 16G page " ) } ,
{ " DTLB_HWTW_hit_1T " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 5 ) , 0 , ABST_NONE , STXT ( " DTLB miss and HW tablewalk successfully loaded translation for 1T page " ) } ,
{ " DTLB_HWTW_miss_trap " , NULL , REGNO_ANY , NULL , PRELOAD ( 800 , 5 ) , 0 , ABST_NONE , STXT ( " DTLB miss and HW tablewalk unsuccessful " ) } ,
{ " DTLB_HWTW " , NULL , REGNO_ANY , NULL , PRELOAD ( 40 , 5 ) , 0 , ABST_NONE , STXT ( " DTLB miss and HW tablewalk search done " ) } ,
//0x3f
{ " Commit_0_cyc " , /*22825776*/ NULL , 3 , NULL , PRELOAD_DEF , 1 , ABST_NONE , STXT ( " Cycles no uop commits from this hardware thread " ) } ,
{ " Commit_0_all_cyc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE , STXT ( " Cycles no uop commits from any hardware thread on this core " ) } ,
// Similar situation to Sel_1_cyc etc. No direct equivalent, nearest is Commit_uop, which increments by 0-4 each cycle according to how many uops were committed.
/* additional (hidden) aliases, for convenience */
{ " cycles0 " , " Cycles_user " , 0 , NULL , PRELOADS_8 , 1 , ABST_NONE } ,
{ " cycles1 " , " Cycles_user " , 1 , NULL , PRELOADS_8 , 1 , ABST_NONE } ,
{ " insts0 " , " Instr_all " , 0 , NULL , PRELOADS_8 , 0 , ABST_NONE } ,
{ " insts1 " , " Instr_all " , 1 , NULL , PRELOADS_8 , 0 , ABST_NONE } ,
{ NULL , NULL , 0 , NULL , 0 , 0 , 0 , 0 , ABST_NONE }
} ;
static Hwcentry usfuji_V_list [ ] = {
{ " cycles " , " cycle_counts " , REGNO_ANY , STXT ( " CPU Cycles " ) , PRELOADS_7 , 1 , ABST_NONE } ,
{ " insts " , " instruction_counts " , REGNO_ANY , STXT ( " Instructions Executed " ) , PRELOADS_7 , 0 , ABST_NONE } ,
{ " flops " , " floating_instructions " , REGNO_ANY , STXT ( " Floating-point Ops " ) , PRELOADS_6 , 0 , ABST_NONE } ,
/* explicit definitions of (hidden) entries for proper counters */
/* Only counters that can be time converted, or are load-store need to be in this table */
{ " cycle_counts " , NULL , REGNO_ANY , NULL , PRELOADS_7 , 1 , ABST_NONE } ,
{ " load_store_instructions " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_NONE } ,
/* additional (hidden) aliases for convenience */
{ " cycles0 " , " cycle_counts " , 0 , NULL , PRELOADS_75 , 1 , ABST_NONE } ,
{ " cycles1 " , " cycle_counts " , 1 , NULL , PRELOADS_75 , 1 , ABST_NONE } ,
{ " insts0 " , " instruction_counts " , 0 , NULL , PRELOADS_75 , 0 , ABST_NONE } ,
{ " insts1 " , " instruction_counts " , 1 , NULL , PRELOADS_75 , 0 , ABST_NONE } ,
{ NULL , NULL , 0 , NULL , 0 , 0 , 0 , 0 , ABST_NONE }
} ;
static Hwcentry usfuji_VI_VII_list [ ] = {
{ " cycles " , " cycle_counts " , REGNO_ANY , STXT ( " CPU Cycles " ) , PRELOADS_75 , 1 , ABST_NONE } ,
{ " insts " , " instruction_counts " , REGNO_ANY , STXT ( " Instructions Executed " ) , PRELOADS_75 , 0 , ABST_NONE } ,
{ " dcm " , " op_r_iu_req_mi_go " , REGNO_ANY , STXT ( " L1 D-cache Misses " ) , PRELOADS_6 , 0 , ABST_NONE } ,
{ " dcstall " , " op_wait_all " , REGNO_ANY , STXT ( " L1 D-cache Stall Cycles " ) , PRELOADS_7 , 1 , ABST_NONE } ,
{ " dtlbm " , " write_op_uTLB " , REGNO_ANY , STXT ( " DTLB Misses " ) , PRELOADS_5 , 0 , ABST_NONE } ,
// l2m: mem_cache_load test shows undercount of 3x, however, we don't care too much about this chip, keeping the alias for now
{ " l2m " , " sx_miss_count_dm " , REGNO_ANY , STXT ( " L2 Cache Misses " ) , PRELOADS_5 , 0 , ABST_NONE } , /*YXXX undercounts?*/
{ " l2wm " , " dvp_count_dm " , REGNO_ANY , STXT ( " L2 Cache Writeback Misses " ) , PRELOADS_5 , 0 , ABST_NONE } ,
{ " l2ref " , " sx_read_count_dm " , REGNO_ANY , STXT ( " L2 Cache Refs " ) , PRELOADS_6 , 0 , ABST_NONE } ,
{ " l2stall " , " sx_miss_wait_dm " , REGNO_ANY , STXT ( " L2 Cache Stall Cycles " ) , PRELOADS_7 , 1 , ABST_NONE } ,
{ " icm " , " if_r_iu_req_mi_go " , REGNO_ANY , STXT ( " L1 I-cache Misses " ) , PRELOADS_6 , 0 , ABST_NONE } ,
{ " icstall " , " if_wait_all " , REGNO_ANY , STXT ( " L1 I-cache Stall Cycles " ) , PRELOADS_7 , 1 , ABST_NONE } ,
{ " itlbm " , " write_if_uTLB " , REGNO_ANY , STXT ( " ITLB Misses " ) , PRELOADS_5 , 0 , ABST_NONE } ,
{ " flops " , " floating_instructions " , REGNO_ANY , STXT ( " Floating-point Ops " ) , PRELOADS_7 , 0 , ABST_NONE } ,
/* explicit definitions of (hidden) entries for proper counters */
/* Only counters that can be time converted, or are load-store need to be in this table */
{ " cycle_counts " , NULL , REGNO_ANY , NULL , PRELOADS_75 , 1 , ABST_NONE } ,
{ " op_stv_wait " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " load_store_instructions " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_NONE } ,
{ " active_cycle_count " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " op_stv_wait_sxmiss " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " branch_comp_wait " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " write_op_uTLB " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_NONE } ,
{ " sx_miss_wait_pf " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " sx_miss_wait_dm " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " op_stv_wait_nc_pend " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " op_stv_wait_sxmiss_ex " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " eu_comp_wait " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " sx_miss_count_dm " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_NONE } ,
{ " fl_comp_wait " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " op_r_iu_req_mi_go " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_NONE } ,
{ " sx_miss_count_dm_if " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_NONE } ,
{ " op_stv_wait_ex " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " swpf_lbs_hit " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_NONE } ,
{ " sx_read_count_dm " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_NONE } ,
{ " trap_DMMU_miss " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_NONE } ,
{ " op_wait_all " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " sx_miss_count_dm_opex " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_NONE } ,
{ " if_wait_all " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " dvp_count_dm " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_NONE } ,
{ " sx_miss_count_dm_opsh " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 0 , ABST_NONE } ,
/* additional (hidden) aliases for convenience */
{ " cycles0 " , " cycle_counts " , 0 , NULL , PRELOADS_8 , 1 , ABST_NONE } ,
{ " cycles1 " , " cycle_counts " , 1 , NULL , PRELOADS_8 , 1 , ABST_NONE } ,
{ " insts0 " , " instruction_counts " , 0 , NULL , PRELOADS_8 , 0 , ABST_NONE } ,
{ " insts1 " , " instruction_counts " , 1 , NULL , PRELOADS_8 , 0 , ABST_NONE } ,
{ NULL , NULL , 0 , NULL , 0 , 0 , 0 , 0 , ABST_NONE }
} ;
static Hwcentry usfuji_X_list [ ] = {
{ " cycles " , " cycle_counts " , REGNO_ANY , STXT ( " CPU Cycles " ) , PRELOADS_75 , 1 , ABST_NONE } ,
{ " insts " , " instruction_counts " , REGNO_ANY , STXT ( " Instructions Executed " ) , PRELOADS_75 , 0 , ABST_NONE } ,
{ " dcm " , " L1D_miss " , REGNO_ANY , STXT ( " L1 D-cache Misses " ) , PRELOADS_65 , 0 , ABST_NONE } ,
{ " dcstall " , " L1D_wait_all " , REGNO_ANY , STXT ( " L1 D-cache Stall Cycles " ) , PRELOADS_7 , 1 , ABST_NONE } ,
/* explicit definitions of (hidden) entries for proper counters */
/* Only counters that can be time converted, or are load-store need to be in this table */
{ " cycle_counts " , NULL , REGNO_ANY , NULL , PRELOADS_75 , 1 , ABST_NONE } ,
{ " w_op_stv_wait_nc_pend " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " op_stv_wait " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " eu_comp_wait " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " L2_miss_wait_pf_bank0 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " op_stv_wait_pfp_busy_ex " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " L2_miss_wait_dm_bank0 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " w_branch_comp_wait " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " w_op_stv_wait_sxmiss_ex " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " op_stv_wait_nc_pend " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " L2_miss_wait_pf_bank2 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " w_eu_comp_wait " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " w_op_stv_wait_sxmiss " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " op_stv_wait_sxmiss_ex " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " branch_comp_wait " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " L2_miss_wait_dm_bank2 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " d_move_wait " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " w_op_stv_wait " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " w_fl_comp_wait " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " op_stv_wait_pfp_busy " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " fl_comp_wait " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " L2_miss_wait_pf_bank1 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " op_stv_wait_ex " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " L2_miss_wait_dm_bank1 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " w_op_stv_wait_ex " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " op_stv_wait_sxmiss " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " op_stv_wait_swpf " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " L1D_wait_all " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " L2_miss_wait_pf_bank3 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " cse_priority_wait " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " op_stv_wait_pfp_busy_swpf " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " L1I_wait_all " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " L2_miss_wait_dm_bank3 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " single_mode_cycle_counts " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " suspend_cycle " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " sleep_cycle " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
/* additional (hidden) aliases for convenience */
{ " cycles0 " , " cycle_counts " , 0 , NULL , PRELOADS_8 , 1 , ABST_NONE } ,
{ " cycles1 " , " cycle_counts " , 1 , NULL , PRELOADS_8 , 1 , ABST_NONE } ,
{ " insts0 " , " instruction_counts " , 0 , NULL , PRELOADS_8 , 0 , ABST_NONE } ,
{ " insts1 " , " instruction_counts " , 1 , NULL , PRELOADS_8 , 0 , ABST_NONE } ,
{ NULL , NULL , 0 , NULL , 0 , 0 , 0 , 0 , ABST_NONE }
} ;
static Hwcentry usfuji_XII_list [ ] = {
{ " cycles " , " cycle_counts " , REGNO_ANY , STXT ( " CPU Cycles " ) , PRELOADS_75 , 1 , ABST_NONE } ,
{ " insts " , " instruction_counts " , REGNO_ANY , STXT ( " Instructions Executed " ) , PRELOADS_75 , 0 , ABST_NONE } ,
{ " dcm " , " L1D_miss " , REGNO_ANY , STXT ( " L1 D-cache Misses " ) , PRELOADS_65 , 0 , ABST_NONE } ,
{ " dcstall " , " L1D_wait_all " , REGNO_ANY , STXT ( " L1 D-cache Stall Cycles " ) , PRELOADS_7 , 1 , ABST_NONE } ,
/* explicit definitions of (hidden) entries for proper counters */
/* Only counters that can be time converted, or are load-store need to be in this table */
{ " cycle_counts " , NULL , REGNO_ANY , NULL , PRELOADS_75 , 1 , ABST_NONE } ,
{ " L1D_wait_all " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " L1I_wait_all " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " L2_miss_wait_dm_bank0 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " L2_miss_wait_dm_bank1 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " L2_miss_wait_dm_bank2 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " L2_miss_wait_dm_bank3 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " L2_miss_wait_pf_bank0 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " L2_miss_wait_pf_bank1 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " L2_miss_wait_pf_bank2 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " L2_miss_wait_pf_bank3 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " LL_miss_wait_dm_bank0 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " LL_miss_wait_dm_bank1 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " LL_miss_wait_dm_bank2 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " LL_miss_wait_dm_bank3 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " LL_miss_wait_pf_bank0 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " LL_miss_wait_pf_bank1 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " LL_miss_wait_pf_bank2 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " LL_miss_wait_pf_bank3 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " branch_comp_wait " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " cse_priority_wait " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " d_move_wait " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " eu_comp_wait " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " fl_comp_wait " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " l2_sy_miss_wait_dm_part1 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " l2_sy_miss_wait_dm_part2 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " msgr_reqp_wait " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " msgr_rtnp_wait " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " msgs_wait " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " op_stv_wait " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " op_stv_wait_ex " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " op_stv_wait_l1d_miss " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " op_stv_wait_l1d_miss_ex " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " op_stv_wait_l2_miss " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " op_stv_wait_l2_miss_ex " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " op_stv_wait_ll_miss " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " op_stv_wait_ll_miss_ex " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " op_stv_wait_nc_pend " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " op_stv_wait_pfp_busy " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " op_stv_wait_pfp_busy_ex " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " op_stv_wait_pfp_busy_swpf " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " op_stv_wait_swpf " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " op_stv_wait_sxmiss " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " op_stv_wait_sxmiss_ex " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " w_branch_comp_wait " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " w_eu_comp_wait " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " w_fl_comp_wait " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " w_op_stv_wait " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " w_op_stv_wait_ex " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " w_op_stv_wait_l1d_miss " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " w_op_stv_wait_l1d_miss_ex " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " w_op_stv_wait_l2_miss " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " w_op_stv_wait_l2_miss_ex " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " w_op_stv_wait_ll_miss " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " w_op_stv_wait_ll_miss_ex " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " w_op_stv_wait_nc_pend " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " w_op_stv_wait_pfp_busy " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " w_op_stv_wait_pfp_busy_ex " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " w_op_stv_wait_pfp_busy_swpf " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " w_op_stv_wait_sxmiss " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " w_op_stv_wait_sxmiss_ex " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " single_mode_cycle_counts " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " suspend_cycle " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " sleep_cycle " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
/* additional (hidden) aliases for convenience */
{ " cycles0 " , " cycle_counts " , 0 , NULL , PRELOADS_8 , 1 , ABST_NONE } ,
{ " cycles1 " , " cycle_counts " , 1 , NULL , PRELOADS_8 , 1 , ABST_NONE } ,
{ " insts0 " , " instruction_counts " , 0 , NULL , PRELOADS_8 , 0 , ABST_NONE } ,
{ " insts1 " , " instruction_counts " , 1 , NULL , PRELOADS_8 , 0 , ABST_NONE } ,
{ NULL , NULL , 0 , NULL , 0 , 0 , 0 , 0 , ABST_NONE }
} ;
/* Kernel profiling pseudo-chip, OBSOLETE (To support 12.3 and earlier, TBR) */
static Hwcentry kproflist [ ] = {
{ " kcycles " , " kcycles " , 0 , STXT ( " KCPU Cycles " ) , PRELOADS_5 , 1 , ABST_NONE } ,
{ " kucycles " , " kucycles " , 0 , STXT ( " KUCPU Cycles " ) , PRELOADS_5 , 1 , ABST_NONE } ,
{ " kthr " , " kthr " , 0 , STXT ( " KTHR Cycles " ) , PRELOADS_5 , 1 , ABST_NONE } ,
{ NULL , NULL , 0 , NULL , 0 , 0 , 0 , 0 , ABST_NONE }
} ;
static Hwcentry pentiumIIlist [ ] = {
/* note -- missing entries for dtlbm, ecm */
{ " cycles " , " cpu_clk_unhalted " , REGNO_ANY , STXT ( " CPU Cycles " ) , PRELOADS_7 , 1 , ABST_NONE } ,
{ " insts " , " inst_retired " , REGNO_ANY , STXT ( " Instructions Executed " ) , PRELOADS_7 , 0 , ABST_NONE } ,
{ " icm " , " ifu_ifetch_miss " , REGNO_ANY , STXT ( " I$ Misses " ) , PRELOADS_5 , 0 , ABST_NONE } ,
{ " dcrm " , " dcu_m_lines_in " , REGNO_ANY , STXT ( " D$ Read Misses " ) , PRELOADS_5 , 0 , ABST_NONE } ,
{ " dcwm " , " dcu_m_lines_out " , REGNO_ANY , STXT ( " D$ Write Misses " ) , PRELOADS_5 , 0 , ABST_NONE } ,
{ " flops " , " flops " , REGNO_ANY , STXT ( " Floating-point Ops " ) , PRELOADS_7 , 0 , ABST_NONE } ,
{ " itlbm " , " itlb_miss " , REGNO_ANY , STXT ( " ITLB Misses " ) , PRELOADS_5 , 0 , ABST_NONE } ,
{ " ecim " , " l2_ifetch " , REGNO_ANY , STXT ( " E$ Instr. Misses " ) , PRELOADS_5 , 0 , ABST_NONE } ,
/* explicit definitions of (hidden) entries for proper counters */
/* Only counters that can be time converted, or are load-store need to be in this table */
{ " cpu_clk_unhalted " , NULL , REGNO_ANY , NULL , PRELOADS_7 , 1 , ABST_NONE } ,
/* additional (hidden) aliases for convenience */
{ " cycles0 " , " cpu_clk_unhalted " , 0 , NULL , PRELOADS_75 , 1 , ABST_NONE } ,
{ " cycles1 " , " cpu_clk_unhalted " , 1 , NULL , PRELOADS_75 , 1 , ABST_NONE } ,
{ " insts0 " , " inst_retired " , 0 , NULL , PRELOADS_75 , 0 , ABST_NONE } ,
{ " insts1 " , " inst_retired " , 1 , NULL , PRELOADS_75 , 0 , ABST_NONE } ,
{ NULL , NULL , 0 , NULL , 0 , 0 , 0 , 0 , ABST_NONE }
} ;
static Hwcentry pentiumIIIlist [ ] = {
/* note -- many missing entries; no reference machine to try */
{ " cycles " , " cpu_clk_unhalted " , REGNO_ANY , STXT ( " CPU Cycles " ) , PRELOADS_7 , 1 , ABST_NONE } ,
{ " insts " , " inst_retired " , REGNO_ANY , STXT ( " Instructions Executed " ) , PRELOADS_7 , 0 , ABST_NONE } ,
/* explicit definitions of (hidden) entries for proper counters */
/* Only counters that can be time converted, or are load-store need to be in this table */
{ " cpu_clk_unhalted " , NULL , REGNO_ANY , NULL , PRELOADS_7 , 1 , ABST_NONE } ,
/* additional (hidden) aliases for convenience */
{ " cycles0 " , " cpu_clk_unhalted " , 0 , NULL , PRELOADS_75 , 1 , ABST_NONE } ,
{ " cycles1 " , " cpu_clk_unhalted " , 1 , NULL , PRELOADS_75 , 1 , ABST_NONE } ,
{ " insts0 " , " inst_retired " , 0 , NULL , PRELOADS_75 , 0 , ABST_NONE } ,
{ " insts1 " , " inst_retired " , 1 , NULL , PRELOADS_75 , 0 , ABST_NONE } ,
{ NULL , NULL , 0 , NULL , 0 , 0 , 0 , 0 , ABST_NONE }
} ;
static Hwcentry pentium4 [ ] = {
{ " cycles " , " TC_deliver_mode~threshold=0xf~complement=1~compare=1 " , REGNO_ANY , STXT ( " CPU Cycles " ) , PRELOADS_7 , 1 , ABST_NONE } ,
{ " insts " , " instr_retired~emask=0x3 " , REGNO_ANY , STXT ( " Instructions Executed " ) , PRELOADS_7 , 0 , ABST_NONE } ,
{ " l1m " , " BSQ_cache_reference~emask=0x0507 " , REGNO_ANY , STXT ( " L1 Cache Misses " ) , PRELOADS_7 , 0 , ABST_NONE } ,
{ " l2h " , " BSQ_cache_reference~emask=0x0007 " , REGNO_ANY , STXT ( " L2 Cache Hits " ) , PRELOADS_7 , 0 , ABST_NONE } ,
{ " l2m " , " BSQ_cache_reference~emask=0x0500 " , REGNO_ANY , STXT ( " L2 Cache Misses " ) , PRELOADS_6 , 0 , ABST_NONE } ,
/* explicit definitions of (hidden) entries for proper counters */
/* Only counters that can be time converted, or are load-store need to be in this table */
{ " TC_deliver_mode " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " machine_clear " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
/* additional (hidden) aliases, for convenience */
{ " cycles0 " , " TC_deliver_mode~threshold=0xf~complement=1~compare=1 " , 5 , NULL , PRELOADS_75 , 1 , ABST_NONE } ,
{ " cycles1 " , " TC_deliver_mode~threshold=0xf~complement=1~compare=1 " , 6 , NULL , PRELOADS_75 , 1 , ABST_NONE } ,
{ " insts0 " , " instr_retired~emask=0x3 " , 15 , NULL , PRELOADS_75 , 0 , ABST_NONE } ,
{ " insts1 " , " instr_retired~emask=0x3 " , 16 , NULL , PRELOADS_75 , 0 , ABST_NONE } ,
{ NULL , NULL , 0 , NULL , 0 , 0 , 0 , 0 , ABST_NONE }
} ;
static Hwcentry intelCore2list [ ] = {
// For post-processing, both Linux and Solaris definitions need to be "live".
// However, for data collection, OS-specific definitions may need to be hidden.
// Use REGNO_INVALID for definitions that should be hidden for data collection.
# define LINUX_ONLY REGNO_ANY
# define SOLARIS_ONLY REGNO_INVALID /* hidden for Linux data collection */
{ " cycles " , " cpu_clk_unhalted.core " , /*6759307*/ SOLARIS_ONLY , STXT ( " CPU Cycles " ) , PRELOADS_75 , 1 , ABST_NONE } ,
{ " cycles " , " cpu_clk_unhalted.thread " , /*6759307*/ SOLARIS_ONLY , STXT ( " CPU Cycles " ) , PRELOADS_75 , 1 , ABST_NONE } ,
/* Linux Note: 7046312 Many HWC tests fail on system Core2 system with perf_events if above alias used */
{ " cycles " , " cpu_clk_unhalted " , LINUX_ONLY , STXT ( " CPU Cycles " ) , PRELOADS_75 , 1 , ABST_NONE } ,
{ " insts " , " instr_retired.any " , SOLARIS_ONLY , STXT ( " Instructions Executed " ) , PRELOADS_75 , 0 , ABST_NONE } ,
/* Linux Note: 7046312 Many HWC tests fail on system Core2 system with perf_events if above alias used */
{ " insts " , " inst_retired " , LINUX_ONLY , STXT ( " Instructions Executed " ) , PRELOADS_75 , 0 , ABST_NONE } ,
// The following counters were identified in "Cycle Accounting Analysis on Intel Core2 Processors" by David Levinthal
{ " uops_stalled " , " rs_uops_dispatched~cmask=1~inv=1 " , REGNO_ANY , STXT ( " uOps Stalled " ) , PRELOADS_7 , 1 , ABST_NONE } ,
{ " l2m " , " mem_load_retired~umask=0x08 " , REGNO_ANY , STXT ( " L2 Line Misses " ) , PRELOADS_5 , 0 , ABST_NONE } ,
{ " dtlbm " , " mem_load_retired~umask=0x10 " , REGNO_ANY , STXT ( " L1 DTLB Misses " ) , PRELOADS_5 , 0 , ABST_NONE } ,
{ " l1m " , " mem_load_retired~umask=0x02 " , REGNO_ANY , STXT ( " L1 Line Misses " ) , PRELOADS_6 , 0 , ABST_NONE } ,
// {"stalls_resources","resource_stalls~umask=0x1f", REGNO_ANY, STXT("Resource Stalls"), PRELOADS_6, 1, ABST_NONE},
{ " rs_full " , " resource_stalls~umask=0x02 " , REGNO_ANY , STXT ( " Reservation Station Full " ) , PRELOADS_6 , 1 , ABST_NONE } ,
{ " br_miss_flush " , " resource_stalls~umask=0x10 " , REGNO_ANY , STXT ( " Mispredicted Branch Flushes " ) , PRELOADS_6 , 1 , ABST_NONE } ,
{ " ld_st_full " , " resource_stalls~umask=0x04 " , REGNO_ANY , STXT ( " Load/Store Buffers Full " ) , PRELOADS_6 , 1 , ABST_NONE } ,
{ " rob_full " , " resource_stalls~umask=0x01 " , REGNO_ANY , STXT ( " Reorder Buffer Full " ) , PRELOADS_6 , 1 , ABST_NONE } ,
{ " slow_decode " , " ild_stall " , REGNO_ANY , STXT ( " Slow Instruction Decode " ) , PRELOADS_6 , 1 , ABST_NONE } ,
{ " br_miss " , " br_cnd_missp_exec " , REGNO_ANY , STXT ( " Mispredicted Branches " ) , PRELOADS_5 , 0 , ABST_NONE } ,
{ " ret_miss " , " br_call_missp_exec " , REGNO_ANY , STXT ( " Mispredicted Return Calls " ) , PRELOADS_5 , 0 , ABST_NONE } ,
{ " div_busy " , " idle_during_div " , REGNO_ANY , STXT ( " Divider Unit Busy " ) , PRELOADS_5 , 1 , ABST_NONE } ,
{ " fp_assists " , " fp_assist " , REGNO_ANY , STXT ( " FP Microcode Assists " ) , PRELOADS_5 , 0 , ABST_NONE } ,
{ " bus_busy " , " bus_drdy_clocks~umask=0x60 " , REGNO_ANY , STXT ( " Busy Data Bus " ) , PRELOADS_5 , 1 , ABST_NONE } ,
/* explicit definitions of (hidden) entries for proper counters */
/* Only counters that can be time converted, or are load-store need to be in this table */
{ /*30a*/ " cpu_clk_unhalted.core " , /*6759307*/ NULL , REGNO_ANY , NULL , PRELOADS_75 , 1 , ABST_NONE } ,
{ /*30a*/ " cpu_clk_unhalted.thread " , /*6759307*/ NULL , REGNO_ANY , NULL , PRELOADS_75 , 1 , ABST_NONE } ,
{ /*03*/ " store_block " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*03*/ " store_block.drain_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*03*/ " store_block.order " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*03*/ " store_block.snoop " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*09*/ " memory_disambiguation.reset " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*0c*/ " page_walks.cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*14*/ " cycles_div_busy " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*18*/ " idle_during_div " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*19*/ " delayed_bypass.load " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*21*/ " l2_ads " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*23*/ " l2_dbus_busy_rd " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*32*/ " l2_no_req " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*3c*/ " cpu_clk_unhalted " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*3c*/ " cpu_clk_unhalted.core_p " , NULL , REGNO_ANY , NULL , PRELOADS_75 , 1 , ABST_NONE } ,
{ /*3c*/ " cpu_clk_unhalted.bus " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*3c*/ " cpu_clk_unhalted.no_other " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*42*/ " l1d_cache_lock.duration " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*62*/ " bus_drdy_clocks " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*63*/ " bus_lock_clocks " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*64*/ " bus_data_rcv " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*7a*/ " bus_hit_drv " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*7b*/ " bus_hitm_drv " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*7d*/ " busq_empty " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*7e*/ " snoop_stall_drv " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*7f*/ " bus_io_wait " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*83*/ " inst_queue " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*83*/ " inst_queue.full " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*86*/ " cycles_l1i_mem_stalled " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*87*/ " ild_stall " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a1*/ " rs_uops_dispatched " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a1*/ " rs_uops_dispatched_port " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a1*/ " rs_uops_dispatched_port.0 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a1*/ " rs_uops_dispatched_port.1 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a1*/ " rs_uops_dispatched_port.2 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a1*/ " rs_uops_dispatched_port.3 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a1*/ " rs_uops_dispatched_port.4 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a1*/ " rs_uops_dispatched_port.5 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*6c*/ " cycles_int " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*6c*/ " cycles_int.masked " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*6c*/ " cycles_int.pending_and_masked " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*d2*/ " rat_stalls " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*d2*/ " rat_stalls.rob_read_port " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*d2*/ " rat_stalls.partial_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*d2*/ " rat_stalls.flags " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*d2*/ " rat_stalls.fpsw " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*d2*/ " rat_stalls.any " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*d2*/ " rat_stalls.other_serialization_stalls " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*d4*/ " seg_rename_stalls " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*d4*/ " seg_rename_stalls.es " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*d4*/ " seg_rename_stalls.ds " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*d4*/ " seg_rename_stalls.fs " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*d4*/ " seg_rename_stalls.gs " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*d4*/ " seg_rename_stalls.any " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*dc*/ " resource_stalls " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*dc*/ " resource_stalls.rob_full " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*dc*/ " resource_stalls.rs_full " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*dc*/ " resource_stalls.ld_st " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*dc*/ " resource_stalls.fpcw " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*dc*/ " resource_stalls.br_miss_clear " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*dc*/ " resource_stalls.any " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
/* "Architectural" events: */
{ /*3c*/ " unhalted-core-cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
/* additional (hidden) aliases for convenience */
{ " cycles0 " , " cpu_clk_unhalted " , 0 , NULL , PRELOADS_8 , 1 , ABST_NONE } ,
{ " cycles1 " , " cpu_clk_unhalted " , 1 , NULL , PRELOADS_8 , 1 , ABST_NONE } ,
{ " insts0 " , " inst_retired " , 0 , NULL , PRELOADS_8 , 0 , ABST_NONE } ,
{ " insts1 " , " inst_retired " , 1 , NULL , PRELOADS_8 , 0 , ABST_NONE } ,
{ NULL , NULL , 0 , NULL , 0 , 0 , 0 , 0 , ABST_NONE }
} ;
static Hwcentry intelNehalemList [ ] = {
/* 6832635: on Linux, we're not seeing consistent overflows on FFCs */
/* 15634344==6940930: HWC overflow profiling can cause system hang on Solaris/core-i7 systems */
/* 17578620: counter overflow for fixed-function counters hangs systems */
/* same issues for intelSandyBridgeList and intelHaswellList */
PERF_EVENTS_SW_EVENT_ALIASES
USE_INTEL_REF_CYCLES ( 133 )
{ " cycles " , " cpu_clk_unhalted.thread_p " , REGNO_ANY , STXT ( " CPU Cycles " ) , PRELOADS_75 , 1 , ABST_NONE } ,
{ " insts " , " inst_retired.any_p " , REGNO_ANY , STXT ( " Instructions Executed " ) , PRELOADS_75 , 0 , ABST_NONE } ,
// cpu_clk_unhalted.ref: at the ref requency of the cpu. Should not be affected by Speedstep or Turbo.
// cpu_clk_unhalted.thread_p: with HT & 2 threads, 2x cycles. Affected by Speedstep and Turbo.
// PEBs (Sampling)
{ " l2m_latency " , " mem_inst_retired.latency_above_threshold " , REGNO_ANY , STXT ( " L2 Cache Miss Est. Latency " ) , PRELOADS_4 , 33 , ABST_EXACT_PEBS_PLUS1 } ,
// See file hwctable.README.corei7
{ " dch " , " mem_load_retired.l1d_hit " , REGNO_ANY , STXT ( " L1 D-cache Hits " ) , PRELOADS_7 , 0 , ABST_NONE } ,
{ " dcm " , " 0xCB~umask=0x1e " , REGNO_ANY , STXT ( " L1 D-Cache Misses " ) , PRELOADS_65 , 0 , ABST_NONE } , /*mem_load_retired*/
{ " lfbdh " , " mem_load_retired.hit_lfb " , REGNO_ANY , STXT ( " LFB D-cache Hits " ) , PRELOADS_65 , 0 , ABST_NONE } ,
{ " l2h " , " mem_load_retired.l2_hit " , REGNO_ANY , STXT ( " L2 Cache Hits " ) , PRELOADS_65 , 0 , ABST_NONE } ,
{ " l2m " , " 0xCB~umask=0x1c " , REGNO_ANY , STXT ( " L2 Cache Misses " ) , PRELOADS_6 , 0 , ABST_NONE } , /*mem_load_retired*/
{ " l3h " , " mem_load_retired.llc_unshared_hit " , REGNO_ANY , STXT ( " L3 Cache Hit w/o Snoop " ) , PRELOADS_6 , 0 , ABST_NONE } ,
{ " l3h_stall " , " mem_load_retired.llc_unshared_hit " , REGNO_ANY , STXT ( " L3 Cache Hit w/o Snoop x 35: Est. Stalls " ) , PRELOADS_6 , 35 , ABST_NONE } ,
{ " l3hsnoop " , " mem_load_retired.other_core_l2_hit_hitm " , REGNO_ANY , STXT ( " L3 Cache Hit w/Snoop " ) , PRELOADS_6 , 0 , ABST_NONE } ,
{ " l3hsnoop_stall " , " mem_load_retired.other_core_l2_hit_hitm " , REGNO_ANY , STXT ( " L3 Cache Hit w/Snoop x 74: Est. Stalls " ) , PRELOADS_6 , 74 , ABST_NONE } ,
{ " l3m " , " mem_load_retired.llc_miss " , REGNO_ANY , STXT ( " L3 Cache Misses " ) , PRELOADS_5 , 0 , ABST_NONE } ,
{ " l3m_stall " , " mem_load_retired.llc_miss " , REGNO_ANY , STXT ( " L3 Cache Misses x 180: Estimated Stalls " ) , PRELOADS_5 , 180 , ABST_NONE } ,
{ " dtlbm " , " dtlb_load_misses.walk_completed " , REGNO_ANY , STXT ( " DTLB Misses " ) , PRELOADS_6 , 0 , ABST_NONE } ,
{ " dtlbm_stall " , " dtlb_load_misses.walk_completed " , REGNO_ANY , STXT ( " DTLB Misses x 30: Estimated Stalls " ) , PRELOADS_6 , 30 , ABST_NONE } ,
{ " addr_alias_stall " , " partial_address_alias " , REGNO_ANY , STXT ( " Partial Address Aliases x 3: Est. Stalls " ) , PRELOADS_6 , 3 , ABST_NONE } ,
{ " uope_stall " , " uops_executed.port234~cmask=1~inv=1 " , REGNO_ANY , STXT ( " UOP Execute Stalls per Core " ) , PRELOADS_7 , 1 , ABST_NONE } ,
{ " uopr_stall " , " uops_retired.any~cmask=1~inv=1 " , REGNO_ANY , STXT ( " UOP Retired Stalls " ) , PRELOADS_7 , 1 , ABST_NONE } ,
{ " itlbm " , " itlb_miss_retired " , REGNO_ANY , STXT ( " ITLB Misses " ) , PRELOADS_6 , 0 , ABST_NONE } ,
{ " l1i_stall " , " l1i.cycles_stalled " , REGNO_ANY , STXT ( " L1 I-cache Stalls " ) , PRELOADS_6 , 1 , ABST_NONE } ,
{ " br_rets " , " br_inst_retired.all_branches " , REGNO_ANY , STXT ( " Branch Instruction Retires " ) , PRELOADS_7 , 0 , ABST_NONE } ,
{ " br_misp " , " br_misp_exec.any " , REGNO_ANY , STXT ( " Branch Mispredicts " ) , PRELOADS_6 , 0 , ABST_NONE } ,
{ " mach_clear " , " machine_clears.cycles " , REGNO_ANY , STXT ( " Machine Clear Asserted " ) , PRELOADS_6 , 1 , ABST_NONE } ,
{ " fp_mmx " , " fp_mmx_trans.any " , REGNO_ANY , STXT ( " FP-MMX Transistions " ) , PRELOADS_6 , 0 , ABST_NONE } ,
{ " div_busy " , " arith.cycles_div_busy " , REGNO_ANY , STXT ( " Divider Busy Cycles " ) , PRELOADS_6 , 1 , ABST_NONE } ,
/* explicit definitions of (hidden) entries for proper counters */
/* Only counters that can be time converted, or are load-store need to be in this table */
{ /*30a*/ " cpu_clk_unhalted.core " , /*6759307*/ NULL , REGNO_ANY , NULL , PRELOADS_75 , 1 , ABST_NONE } ,
{ /*30a*/ " cpu_clk_unhalted.thread " , /*6759307*/ NULL , REGNO_ANY , NULL , PRELOADS_75 , 1 , ABST_NONE } ,
{ /*04*/ " sb_drain.cycles " , /*future*/ NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*08.04*/ " dtlb_load_misses.walk_cycles " , /*westmere*/ NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
//{/*0e*/"uops_issued.stalled_cycles",/*future, multibit*/ NULL, REGNO_ANY, NULL, PRELOAD_DEF, 1, ABST_NONE},
{ /*09*/ " memory_disambiguation.reset " , /*future*/ NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*09*/ " memory_disambiguation.watch_cycles " , /*future*/ NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*0b*/ " mem_inst_retired.latency_above_threshold " , /*PEBS*/ NULL , REGNO_ANY , NULL , PRELOADS_4 , 33 , ABST_EXACT_PEBS_PLUS1 } , //non-standard overflow
{ /*14*/ " arith.cycles_div_busy " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*17*/ " inst_queue_write_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*1d*/ " hw_int.cycles_masked " , /*future*/ NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*1d*/ " hw_int.cycles_pending_and_masked " , /*future*/ NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*3c*/ " cpu_clk_unhalted.thread_p " , NULL , REGNO_ANY , NULL , PRELOADS_75 , 1 , ABST_NONE } ,
{ /*48*/ " l1d_pend_miss.load_buffers_full " , /*future*/ NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*49.04*/ " dtlb_misses.walk_cycles " , /*westmere*/ NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*4e*/ " sfence_cycles " , /*future*/ NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*4f.10*/ " ept.walk_cycles " , /*westmere*/ NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*60*/ " offcore_requests_outstanding.demand.read_data " , /*future*/ NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*60*/ " offcore_requests_outstanding.demand.read_code " , /*future*/ NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*60*/ " offcore_requests_outstanding.demand.rfo " , /*future*/ NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*60*/ " offcore_requests_outstanding.any.read " , /*future*/ NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*63*/ " cache_lock_cycles.l1d " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*63*/ " cache_lock_cycles.l1d_l2 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*80*/ " l1i.cycles_stalled " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*85*/ " itlb_misses.walk_cycles " , /*future*/ NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*85*/ " itlb_misses.pmh_busy_cycles " , /*future*/ NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*87*/ " ild_stall.lcp " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*87*/ " ild_stall.mru " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*87*/ " ild_stall.iq_full " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*87*/ " ild_stall.regen " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*87*/ " ild_stall.any " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a2*/ " resource_stalls.any " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a2*/ " resource_stalls.load " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a2*/ " resource_stalls.rs_full " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a2*/ " resource_stalls.store " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a2*/ " resource_stalls.rob_full " , /*future*/ NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a2*/ " resource_stalls.fpcw " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a2*/ " resource_stalls.mxcsr " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a2*/ " resource_stalls.other " , /*future*/ NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*b0*/ " offcore_requests_sq_full " , /*future*/ NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*b3*/ " snoopq_requests_outstanding.data " , /*future*/ NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*b3*/ " snoopq_requests_outstanding.invalidate " , /*future*/ NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*b3*/ " snoopq_requests_outstanding.code " , /*future*/ NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
//{/*c2*/"uops_retired.stalled_cycles",/*future, multibit*/ NULL, REGNO_ANY, NULL, PRELOAD_DEF, 1, ABST_NONE},
{ /*c3*/ " machine_clears.cycles " , /*future*/ NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*d2*/ " rat_stalls.flags " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*d2*/ " rat_stalls.registers " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*d2*/ " rat_stalls.rob_read_port " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*d2*/ " rat_stalls.scoreboard " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*d2*/ " rat_stalls.any " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*d4*/ " seg_rename_stalls " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*f6*/ " sq_full_stall_cycles " , /*future*/ NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
/* "Architectural" events: */
{ /*3c*/ " unhalted-core-cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
PERF_EVENTS_SW_EVENT_DEFS
/* additional (hidden) aliases for convenience */
#if 0
USE_INTEL_REF_CYCLES ( 133 ) ,
# endif
{ " insts0 " , " inst_retired.any_p " , 0 , NULL , PRELOADS_8 , 0 , ABST_NONE } ,
{ " insts1 " , " inst_retired.any_p " , 1 , NULL , PRELOADS_8 , 0 , ABST_NONE } ,
{ NULL , NULL , 0 , NULL , 0 , 0 , 0 , 0 , ABST_NONE }
} ;
static Hwcentry intelSandyBridgeList [ ] = {
/* see comments for "cycles" and "insts" for intelNehalemList */
PERF_EVENTS_SW_EVENT_ALIASES
USE_INTEL_REF_CYCLES ( 100 )
{ " cycles " , " cpu_clk_unhalted.thread_p " , REGNO_ANY , STXT ( " CPU Cycles " ) , PRELOADS_75 , 1 , ABST_NONE } ,
{ " insts " , " inst_retired.any_p " , REGNO_ANY , STXT ( " Instructions Executed " ) , PRELOADS_75 , 0 , ABST_NONE } ,
// PEBS (sampling)
{ " l2m_latency " , " mem_trans_retired.load_latency " , REGNO_ANY , STXT ( " L2 Cache Miss Est. Latency " ) , PRELOADS_4 , 65 , ABST_EXACT_PEBS_PLUS1 } ,
// See file hwctable.README.sandybridge
{ " dch " , " mem_load_uops_retired.l1_hit " , REGNO_ANY , STXT ( " L1 D-cache Hits " ) , PRELOADS_7 , 0 , ABST_NONE } ,
{ " dcm " , " mem_load_uops_retired.l1_miss " , REGNO_ANY , STXT ( " L1 D-cache Misses " ) , PRELOADS_65 , 0 , ABST_NONE } , /*mem_load_uops_retired*/
{ " l2h " , " mem_load_uops_retired.l2_hit " , REGNO_ANY , STXT ( " L2 Cache Hits " ) , PRELOADS_65 , 0 , ABST_NONE } ,
{ " l2m " , " mem_load_uops_retired.l2_miss " , REGNO_ANY , STXT ( " L2 Cache Misses " ) , PRELOADS_6 , 0 , ABST_NONE } , /*mem_load_uops_retired*/
// Intel errata: BT241 and BT243 says the mem_load_uops_retired.llc* counters may not be reliable on some CPU variants
{ " l3h " , " mem_load_uops_retired.llc_hit " , REGNO_ANY , STXT ( " L3 Cache Hit w/o Snoop " ) , PRELOADS_6 , 0 , ABST_NONE } , // may undercount
{ " l3m " , " longest_lat_cache.miss " , REGNO_ANY , STXT ( " L3 Cache Misses " ) , PRELOADS_5 , 0 , ABST_NONE } ,
/* dtlbm has not been confirmed via Intel white paper */
{ " dtlbm " , " dtlb_load_misses.walk_completed " , REGNO_ANY , STXT ( " DTLB Misses " ) , PRELOADS_6 , 0 , ABST_NONE } ,
{ " dtlbm_stall " , " dtlb_load_misses.walk_completed " , REGNO_ANY , STXT ( " DTLB Misses x 30: Estimated Stalls " ) , PRELOADS_6 , 30 , ABST_NONE } ,
{ " dtlbm " , " dtlb_load_misses.demand_ld_walk_completed " , REGNO_ANY , STXT ( " DTLB Misses " ) , PRELOADS_6 , 0 , ABST_NONE } ,
{ " dtlbm_stall " , " dtlb_load_misses.demand_ld_walk_completed " , REGNO_ANY , STXT ( " DTLB Misses x 30: Estimated Stalls " ) , PRELOADS_6 , 30 , ABST_NONE } ,
/* explicit definitions of (hidden) entries for proper counters */
/* Only counters that can be time converted, or are load-store need to be in this table */
{ /* 30a */ " cpu_clk_unhalted.thread " , /*15634344==6940930*/ NULL , REGNO_ANY , NULL , PRELOADS_75 , 1 , ABST_NONE } ,
//{/* 30a */"cpu_clk_unhalted.core", /*6759307*/ NULL, REGNO_ANY, NULL, PRELOADS_75, 1, ABST_NONE},
{ /*08.04*/ " dtlb_load_misses.walk_duration " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*08.84*/ " dtlb_load_misses.demand_ld_walk_duration " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*0d.03*/ " int_misc.recovery_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*0d.40*/ " int_misc.rat_stall_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*0e.01*/ " uops_issued.stall_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*0e.01*/ " uops_issued.core_stall_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*14.01*/ " arith.fpu_div_active " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*3c.00*/ " cpu_clk_unhalted.thread_p " , NULL , REGNO_ANY , NULL , PRELOADS_75 , 1 , ABST_NONE } ,
{ /*48.01*/ " l1d_pend_miss.pending_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*49.04*/ " dtlb_store_misses.walk_duration " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*59.20*/ " partial_rat_stalls.flags_merge_uop " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*59.20*/ " partial_rat_stalls.flags_merge_uop_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*59.40*/ " partial_rat_stalls.slow_lea_window " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
//{/*59.80*/"partial_rat_stalls.mul_single_uop", NULL, REGNO_ANY, NULL, PRELOAD_DEF, 1, ABST_NONE},
{ /*5b.0c*/ " resource_stalls2.all_fl_empty " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*5b.0f*/ " resource_stalls2.all_prf_control " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*5b.40*/ " resource_stalls2.bob_full " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*5b.4f*/ " resource_stalls2.ooo_rsrc " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*5c.01*/ " cpl_cycles.ring0 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*5c.02*/ " cpl_cycles.ring123 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*5c.xx*/ " cpl_cycles.ring0_trans " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*5c.xx*/ " cpl_cycles.ring0_transition " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*5e.01*/ " rs_events.empty_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*60.01*/ " offcore_requests_outstanding.cycles_with_demand_data_rd " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*60.01*/ " offcore_requests_outstanding.demand_data_rd_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*60.04*/ " offcore_requests_outstanding.cycles_with_demand_rfo " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*60.04*/ " offcore_requests_outstanding.demand_rfo_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*60.08*/ " offcore_requests_outstanding.cycles_with_data_rd " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*60.08*/ " offcore_requests_outstanding.all_data_rd_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*60.02*/ " offcore_requests_outstanding.demand_code_rd_cycles " , /*?*/ NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*63.01*/ " lock_cycles.split_lock_uc_lock_duration " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*63.02*/ " lock_cycles.cache_lock_duration " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*79.00*/ " idq.empty " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*79.04*/ " idq.mite_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*79.08*/ " idq.dsb_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*79.10*/ " idq.ms_dsb_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*79.20*/ " idq.ms_mite_uops_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*79.20*/ " idq.ms_mite_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*79.30*/ " idq.ms_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*79.18*/ " idq.all_dsb_cycles_any_uops " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*79.18*/ " idq.all_dsb_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*79.18*/ " idq.all_dsb_cycles_4_uops " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*79.24*/ " idq.all_mite_cycles_any_uops " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*79.24*/ " idq.all_mite_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*79.24*/ " idq.all_mite_cycles_4_uops " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*79.3c*/ " idq.mite_all_cycles " , /* Linux, but not in docs? */ NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*80.04*/ " icache.ifetch_stall " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*85.04*/ " itlb_misses.walk_duration " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*87.01*/ " ild_stall.lcp " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*87.04*/ " ild_stall.iq_full " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*9c.xx*/ " idq_uops_not_delivered.cycles_0_uops_deliv.core " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*9c.xx*/ " idq_uops_not_delivered.cycles_le_1_uop_deliv.core " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*9c.xx*/ " idq_uops_not_delivered.cycles_le_2_uop_deliv.core " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*9c.xx*/ " idq_uops_not_delivered.cycles_le_3_uop_deliv.core " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*9c.01*/ " idq_uops_not_delivered.cycles_ge_1_uop_deliv.core " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*9c.01*/ " idq_uops_not_delivered.cycles_fe_was_ok " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a1.01*/ " uops_executed_port.port_0 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a1.02*/ " uops_executed_port.port_1 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a1.04*/ " uops_executed_port.port_2 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a1.08*/ " uops_executed_port.port_3 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a1.10*/ " uops_executed_port.port_4 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a1.20*/ " uops_executed_port.port_5 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a2.01*/ " resource_stalls.any " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a2.02*/ " resource_stalls.lb " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a2.04*/ " resource_stalls.rs " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a2.08*/ " resource_stalls.sb " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a2.0a*/ " resource_stalls.lb_sb " , /*sb-ep*/ NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a2.0e*/ " resource_stalls.mem_rs " , /*sb-ep*/ NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a2.10*/ " resource_stalls.rob " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a2.20*/ " resource_stalls.fcsw " , /*sb*/ NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a2.40*/ " resource_stalls.mxcsr " , /*sb*/ NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a2.80*/ " resource_stalls.other " , /*sb*/ NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a2.F0*/ " resource_stalls.ooo_rsrc " , /*sb-ep*/ NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a3.01*/ " cycle_activity.cycles_l2_pending " , /*F6M62*/ NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*??.??*/ " cycle_activity.stalls_l2_pending " , /*F6M62*/ NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a3.02*/ " cycle_activity.cycles_ldm_pending " , /*F6M62*/ NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*??.??*/ " cycle_activity.stalls_ldm_pending " , /*F6M62*/ NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a3.04*/ " cycle_activity.cycles_no_execute " , /*F6M62*/ NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a3.04*/ " cycle_activity.cycles_no_dispatch " , /*sandybridge*/ NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a3.08*/ " cycle_activity.cycles_l1d_pending " , /*F6M62*/ NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*??.??*/ " cycle_activity.stalls_l1d_pending " , /*F6M62*/ NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*ab.02*/ " dsb2mite_switches.penalty_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*b1.??*/ " uops_executed.stall_cycles " , /*? not in PRM*/ NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*b1.01*/ " uops_dispatched.stall_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*b1.01*/ " uops_executed.stall_cycles " , /*F6M62*/ NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*b1.01*/ " uops_executed.cycles_ge_1_uop_exec " , /*F6M62,not doc'd*/ NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*b1.01*/ " uops_executed.cycles_ge_2_uops_exec " , /*F6M62,not doc'd*/ NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*b1.01*/ " uops_executed.cycles_ge_3_uops_exec " , /*F6M62,not doc'd*/ NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*b1.01*/ " uops_executed.cycles_ge_4_uops_exec " , /*F6M62,not doc'd*/ NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*bf.05*/ " l1d_blocks.bank_conflict_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*c2.01*/ " uops_retired.stall_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*c2.01*/ " uops_retired.total_cycles " , /*cmask==0x10*/ NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*c2.01*/ " uops_retired.core_stall_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*c2.01*/ " uops_retired.active_cycles " , /*cmask==0x1*/ NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
#if 0 // need to see documentation on the following before marking them as cycles
uops_executed . cycles_ge_1_uop_exec [ / { 0 | 1 | 2 | 3 } ] , 1000003 ( events )
uops_executed . cycles_ge_2_uops_exec [ /
{ 0 | 1 | 2 | 3 }
] , 1000003 ( events )
uops_executed . cycles_ge_3_uops_exec [ /
{ 0 | 1 | 2 | 3 }
] , 1000003 ( events )
uops_executed . cycles_ge_4_uops_exec [ /
{ 0 | 1 | 2 | 3 }
] , 1000003 ( events )
# endif
{ /*cd.01*/ " mem_trans_retired.load_latency " , /*PEBS*/ NULL , REGNO_ANY , NULL , PRELOADS_4 , 65 , ABST_EXACT_PEBS_PLUS1 } , //non-standard overflow
/* "Architectural" events: */
{ /*3c*/ " unhalted-core-cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
PERF_EVENTS_SW_EVENT_DEFS
/* additional (hidden) aliases for convenience */
#if 0
USE_INTEL_REF_CYCLES ( 100 ) ,
# endif
{ " insts0 " , " inst_retired.any_p " , 0 , NULL , PRELOADS_8 , 0 , ABST_NONE } ,
{ " insts1 " , " inst_retired.any_p " , 1 , NULL , PRELOADS_8 , 0 , ABST_NONE } ,
{ NULL , NULL , 0 , NULL , 0 , 0 , 0 , 0 , ABST_NONE }
} ;
static Hwcentry intelHaswellList [ ] = {
/* see comments for "cycles" and "insts" for intelNehalemList */
PERF_EVENTS_SW_EVENT_ALIASES
USE_INTEL_REF_CYCLES ( 100 )
{ " cycles " , " cpu_clk_unhalted.thread_p " , REGNO_ANY , STXT ( " CPU Cycles " ) , PRELOADS_75 , 1 , ABST_NONE } ,
{ " insts " , " inst_retired.any_p " , REGNO_ANY , STXT ( " Instructions Executed " ) , PRELOADS_75 , 0 , ABST_NONE } ,
// PEBS (sampling)
{ " l2m_latency " , " mem_trans_retired.load_latency " , REGNO_ANY , STXT ( " L2 Cache Miss Est. Latency " ) , PRELOADS_4 , 65 , ABST_EXACT_PEBS_PLUS1 } ,
{ " dch " , " mem_load_uops_retired.l1_hit " , REGNO_ANY , STXT ( " L1 D-cache Hits " ) , PRELOADS_7 , 0 , ABST_NONE } ,
{ " dcm " , " mem_load_uops_retired.l1_miss " , REGNO_ANY , STXT ( " L1 D-cache Misses " ) , PRELOADS_65 , 0 , ABST_NONE } , //mem_load_uops_retired
{ " dcm " , " 0xd1~umask=0x08 " , REGNO_ANY , STXT ( " L1 D-cache Misses " ) , PRELOADS_65 , 0 , ABST_NONE } , //mem_load_uops_retired
{ " l2h " , " mem_load_uops_retired.l2_hit " , REGNO_ANY , STXT ( " L2 Cache Hits " ) , PRELOADS_65 , 0 , ABST_NONE } ,
{ " l2m " , " mem_load_uops_retired.l2_miss " , REGNO_ANY , STXT ( " L2 Cache Misses " ) , PRELOADS_6 , 0 , ABST_NONE } , //mem_load_uops_retired
{ " l2m " , " 0xd1~umask=0x10 " , REGNO_ANY , STXT ( " L2 Cache Misses " ) , PRELOADS_6 , 0 , ABST_NONE } , //mem_load_uops_retired
{ " l3h " , " mem_load_uops_retired.l3_hit " , REGNO_ANY , STXT ( " L3 Cache Hit w/o Snoop " ) , PRELOADS_6 , 0 , ABST_NONE } ,
{ " l3m " , " mem_load_uops_retired.l3_miss " , REGNO_ANY , STXT ( " L3 Cache Misses " ) , PRELOADS_5 , 0 , ABST_NONE } , //mem_load_uops_retired
{ " l3m " , " 0xd1~umask=0x20 " , REGNO_ANY , STXT ( " L3 Cache Misses " ) , PRELOADS_5 , 0 , ABST_NONE } , //mem_load_uops_retired
/* dtlbm has not been confirmed via Intel white paper */
{ " dtlbm " , " dtlb_load_misses.walk_completed " , REGNO_ANY , STXT ( " DTLB Misses " ) , PRELOADS_6 , 0 , ABST_NONE } ,
{ " dtlbm_stall " , " dtlb_load_misses.walk_completed " , REGNO_ANY , STXT ( " DTLB Misses x 30: Estimated Stalls " ) , PRELOADS_6 , 30 , ABST_NONE } ,
/* explicit definitions of (hidden) entries for proper counters */
/* Only counters that can be time converted, or are load-store need to be in this table */
{ /* 30a */ " cpu_clk_unhalted.thread " , /*15634344==6940930*/ NULL , REGNO_ANY , NULL , PRELOADS_75 , 1 , ABST_NONE } ,
//{/* 30a */"cpu_clk_unhalted.core", /*6759307*/ NULL, REGNO_ANY, NULL, PRELOADS_75, 1, ABST_NONE},
{ /*08.10*/ " dtlb_load_misses.walk_duration " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*0d.03*/ " int_misc.recovery_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*0e.01*/ " uops_issued.stall_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*0e.01*/ " uops_issued.core_stall_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*3c.00*/ " cpu_clk_unhalted.thread_p " , NULL , REGNO_ANY , NULL , PRELOADS_75 , 1 , ABST_NONE } ,
{ /*48.01*/ " l1d_pend_miss.pending_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*49.04*/ " dtlb_store_misses.walk_duration " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*5c.01*/ " cpl_cycles.ring0 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*5c.02*/ " cpl_cycles.ring123 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*5c.xx*/ " cpl_cycles.ring0_trans " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*5e.01*/ " rs_events.empty_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*60.01*/ " offcore_requests_outstanding.cycles_with_demand_data_rd " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*60.02*/ " offcore_requests_outstanding.demand_code_rd_cycles " , /*?*/ NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*60.04*/ " offcore_requests_outstanding.demand_rfo_cycles " , /*?*/ NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*60.08*/ " offcore_requests_outstanding.cycles_with_data_rd " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*63.01*/ " lock_cycles.split_lock_uc_lock_duration " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*63.02*/ " lock_cycles.cache_lock_duration " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*79.00*/ " idq.empty " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*79.04*/ " idq.mite_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*79.08*/ " idq.dsb_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*79.10*/ " idq.ms_dsb_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*79.20*/ " idq.ms_mite_uops_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*79.20*/ " idq.ms_mite_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*79.30*/ " idq.ms_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*79.18*/ " idq.all_dsb_cycles_any_uops " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*79.18*/ " idq.all_dsb_cycles_4_uops " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*79.24*/ " idq.all_mite_cycles_any_uops " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*79.24*/ " idq.all_mite_cycles_4_uops " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*80.04*/ " icache.ifetch_stall " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*85.04*/ " itlb_misses.walk_duration " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*87.01*/ " ild_stall.lcp " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } , // Intel SDM says these are stalls, not cycles
{ /*87.04*/ " ild_stall.iq_full " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*9c.xx*/ " idq_uops_not_delivered.cycles_0_uops_deliv.core " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*9c.xx*/ " idq_uops_not_delivered.cycles_le_1_uop_deliv.core " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*9c.xx*/ " idq_uops_not_delivered.cycles_le_2_uop_deliv.core " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*9c.xx*/ " idq_uops_not_delivered.cycles_le_3_uop_deliv.core " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
// {/*9c.01*/"idq_uops_not_delivered.cycles_ge_1_uop_deliv.core", NULL, REGNO_ANY, NULL, PRELOAD_DEF, 1, ABST_NONE},
{ /*9c.01*/ " idq_uops_not_delivered.cycles_fe_was_ok " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a1.01*/ " uops_executed_port.port_0 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a1.02*/ " uops_executed_port.port_1 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a1.04*/ " uops_executed_port.port_2 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a1.08*/ " uops_executed_port.port_3 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a1.10*/ " uops_executed_port.port_4 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a1.20*/ " uops_executed_port.port_5 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a1.40*/ " uops_executed_port.port_6 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a1.80*/ " uops_executed_port.port_7 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a1.01*/ " uops_executed_port.port_0_core " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a1.02*/ " uops_executed_port.port_1_core " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a1.04*/ " uops_executed_port.port_2_core " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a1.08*/ " uops_executed_port.port_3_core " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a1.10*/ " uops_executed_port.port_4_core " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a1.20*/ " uops_executed_port.port_5_core " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a1.40*/ " uops_executed_port.port_6_core " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a1.80*/ " uops_executed_port.port_7_core " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a2.01*/ " resource_stalls.any " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a2.04*/ " resource_stalls.rs " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a2.08*/ " resource_stalls.sb " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a2.10*/ " resource_stalls.rob " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a3.01*/ " cycle_activity.cycles_l2_pending_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
// {/*a3.01*/"cycle_activity.cycles_l2_pending", NULL, REGNO_ANY, NULL, PRELOAD_DEF, 1, ABST_NONE},
{ /*a3.02*/ " cycle_activity.cycles_ldm_pending_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
// {/*a3.05*/"cycle_activity.stalls_l2_pending", NULL, REGNO_ANY, NULL, PRELOAD_DEF, 1, ABST_NONE},
{ /*a3.08*/ " cycle_activity.cycles_l1d_pending_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
// {/*a3.??*/"cycle_activity.cycles_no_execute", NULL, REGNO_ANY, NULL, PRELOAD_DEF, 1, ABST_NONE},
// {/*a3.??*/"cycle_activity.stalls_ldm_pending",/*?*/ NULL, REGNO_ANY, NULL, PRELOAD_DEF, 1, ABST_NONE},
{ /*ab.02*/ " dsb2mite_switches.penalty_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*b1.??*/ " uops_executed.stall_cycles " , /*? not in PRM*/ NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*b1.??*/ " uops_executed.cycles_ge_1_uop_exec " , /*?*/ NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*b1.??*/ " uops_executed.cycles_ge_2_uops_exec " , /*?*/ NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*b1.??*/ " uops_executed.cycles_ge_3_uops_exec " , /*?*/ NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*b1.??*/ " uops_executed.cycles_ge_4_uops_exec " , /*?*/ NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*c2.01*/ " uops_retired.stall_cycles " , /*cmask==1 + INV*/ NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*c2.01*/ " uops_retired.total_cycles " , /*cmask==0x1*/ NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*c2.01*/ " uops_retired.core_stall_cycles " , /*PEBS Any==1*/ NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*c3.01*/ " machine_clears.cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*ca.1e*/ " fp_assist.any " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*cd.01*/ " mem_trans_retired.load_latency " , /*PEBS*/ NULL , REGNO_ANY , NULL , PRELOADS_4 , 65 , ABST_EXACT_PEBS_PLUS1 } , //non-standard overflow
/* "Architectural" events: */
{ /*3c*/ " unhalted-core-cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
PERF_EVENTS_SW_EVENT_DEFS
/* additional (hidden) aliases for convenience */
#if 0
USE_INTEL_REF_CYCLES ( 100 ) ,
# endif
{ " insts0 " , " inst_retired.any_p " , 0 , NULL , PRELOADS_8 , 0 , ABST_NONE } ,
{ " insts1 " , " inst_retired.any_p " , 1 , NULL , PRELOADS_8 , 0 , ABST_NONE } ,
{ NULL , NULL , 0 , NULL , 0 , 0 , 0 , 0 , ABST_NONE }
} ;
static Hwcentry intelBroadwellList [ ] = {
/* see comments for "cycles" and "insts" for intelNehalemList */
PERF_EVENTS_SW_EVENT_ALIASES
USE_INTEL_REF_CYCLES ( 100 )
{ " cycles " , " cpu_clk_unhalted.thread_p " , REGNO_ANY , STXT ( " CPU Cycles " ) , PRELOADS_75 , 1 , ABST_NONE } ,
{ " insts " , " inst_retired.any_p " , REGNO_ANY , STXT ( " Instructions Executed " ) , PRELOADS_75 , 0 , ABST_NONE } ,
// PEBS (sampling)
{ " l2m_latency " , " mem_trans_retired.load_latency " , REGNO_ANY , STXT ( " L2 Cache Miss Est. Latency " ) , PRELOADS_4 , 65 , ABST_EXACT_PEBS_PLUS1 } ,
{ /*cd.01*/ " mem_trans_retired.load_latency " , NULL , REGNO_ANY , NULL , PRELOADS_4 , 65 , ABST_EXACT_PEBS_PLUS1 } ,
// aliases (the first set are PEBS, but on Intel the only precise counter we support is l2m_latency)
{ " dch " , " mem_load_uops_retired.l1_hit " , REGNO_ANY , STXT ( " L1 D-cache Hits " ) , PRELOADS_7 , 0 , ABST_NONE } ,
{ " dcm " , " mem_load_uops_retired.l1_miss " , REGNO_ANY , STXT ( " L1 D-cache Misses " ) , PRELOADS_65 , 0 , ABST_NONE } ,
{ " l2h " , " mem_load_uops_retired.l2_hit " , REGNO_ANY , STXT ( " L2 Cache Hits " ) , PRELOADS_65 , 0 , ABST_NONE } ,
{ " l2m " , " mem_load_uops_retired.l2_miss " , REGNO_ANY , STXT ( " L2 Cache Misses " ) , PRELOADS_6 , 0 , ABST_NONE } ,
{ " l3h " , " mem_load_uops_retired.l3_hit " , REGNO_ANY , STXT ( " L3 Cache Hits " ) , PRELOADS_6 , 0 , ABST_NONE } ,
{ " l3m " , " mem_load_uops_retired.l3_miss " , REGNO_ANY , STXT ( " L3 Cache Misses " ) , PRELOADS_5 , 0 , ABST_NONE } ,
{ " dtlbm " , " dtlb_load_misses.walk_completed " , REGNO_ANY , STXT ( " DTLB Misses " ) , PRELOADS_6 , 0 , ABST_NONE } ,
// counters that can be time converted (add FFCs if we decide to support them)
// counters that are load-store (did not include any... do we want to?)
{ /*08.10*/ " dtlb_load_misses.walk_duration " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*0d.03*/ " int_misc.recovery_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*0e.01*/ " uops_issued.stall_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*0e.01*/ " uops_issued.core_stall_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*14.01*/ " arith.fpu_div_active " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*3c.00*/ " cpu_clk_unhalted.thread_p_any " , NULL , REGNO_ANY , NULL , PRELOADS_75 , 1 , ABST_NONE } ,
{ /*3c.00*/ " cpu_clk_unhalted.thread_p " , NULL , REGNO_ANY , NULL , PRELOADS_75 , 1 , ABST_NONE } ,
{ /*3c.02*/ " cpu_clk_thread_unhalted.one_thread_active " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*48.01*/ " l1d_pend_miss.pending_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*48.01*/ " l1d_pend_miss.pending_cycles_any " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*49.10*/ " dtlb_store_misses.walk_duration " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*4f.10*/ " ept.walk_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*5c.01*/ " cpl_cycles.ring0 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*5c.01*/ " cpl_cycles.ring0_trans " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*5c.02*/ " cpl_cycles.ring123 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*5e.01*/ " rs_events.empty_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*60.01*/ " offcore_requests_outstanding.cycles_with_demand_data_rd " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*60.02*/ " offcore_requests_outstanding.demand_code_rd_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*60.04*/ " offcore_requests_outstanding.demand_rfo_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*60.08*/ " offcore_requests_outstanding.cycles_with_data_rd " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*63.01*/ " lock_cycles.split_lock_uc_lock_duration " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*63.02*/ " lock_cycles.cache_lock_duration " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*79.02*/ " idq.empty " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*79.04*/ " idq.mite_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*79.08*/ " idq.dsb_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*79.10*/ " idq.ms_dsb_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*79.18*/ " idq.all_dsb_cycles_4_uops " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*79.18*/ " idq.all_dsb_cycles_any_uops " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*79.24*/ " idq.all_mite_cycles_4_uops " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*79.24*/ " idq.all_mite_cycles_any_uops " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*79.30*/ " idq.ms_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*85.10*/ " itlb_misses.walk_duration " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*9c.xx*/ " idq_uops_not_delivered.cycles_0_uops_deliv.core " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*9c.xx*/ " idq_uops_not_delivered.cycles_le_1_uop_deliv.core " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*9c.xx*/ " idq_uops_not_delivered.cycles_le_2_uop_deliv.core " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*9c.xx*/ " idq_uops_not_delivered.cycles_le_3_uop_deliv.core " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*9c.01*/ " idq_uops_not_delivered.cycles_fe_was_ok " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a1.01*/ " uops_executed_port.port_0 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a1.02*/ " uops_executed_port.port_1 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a1.04*/ " uops_executed_port.port_2 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a1.08*/ " uops_executed_port.port_3 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a1.10*/ " uops_executed_port.port_4 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a1.20*/ " uops_executed_port.port_5 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a1.40*/ " uops_executed_port.port_6 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a1.80*/ " uops_executed_port.port_7 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a1.01*/ " uops_executed_port.port_0_core " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a1.02*/ " uops_executed_port.port_1_core " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a1.04*/ " uops_executed_port.port_2_core " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a1.08*/ " uops_executed_port.port_3_core " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a1.10*/ " uops_executed_port.port_4_core " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a1.20*/ " uops_executed_port.port_5_core " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a1.40*/ " uops_executed_port.port_6_core " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a1.80*/ " uops_executed_port.port_7_core " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a2.01*/ " resource_stalls.any " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a2.04*/ " resource_stalls.rs " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a2.08*/ " resource_stalls.sb " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a2.10*/ " resource_stalls.rob " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a3.01*/ " cycle_activity.cycles_l2_pending " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a3.02*/ " cycle_activity.cycles_ldm_pending " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a3.04*/ " cycle_activity.cycles_no_execute " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a3.08*/ " cycle_activity.cycles_l1d_pending " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a8.01*/ " lsd.cycles_active " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a8.01*/ " lsd.cycles_4_uops " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*ab.02*/ " dsb2mite_switches.penalty_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*b1.01*/ " uops_executed.stall_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*c2.01*/ " uops_retired.stall_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*c2.01*/ " uops_retired.total_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*c2.01*/ " uops_retired.core_stall_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*c3.01*/ " machine_clears.cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*ca.1e*/ " fp_assist.any " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
/* "Architectural" events: */
{ /*3c*/ " unhalted-core-cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
PERF_EVENTS_SW_EVENT_DEFS
/* additional (hidden) aliases for convenience */
#if 0
USE_INTEL_REF_CYCLES ( 100 ) ,
# endif
{ " insts0 " , " inst_retired.any_p " , 0 , NULL , PRELOADS_8 , 0 , ABST_NONE } ,
{ " insts1 " , " inst_retired.any_p " , 1 , NULL , PRELOADS_8 , 0 , ABST_NONE } ,
{ NULL , NULL , 0 , NULL , 0 , 0 , 0 , 0 , ABST_NONE }
} ;
static Hwcentry intelSkylakeList [ ] = {
/* see comments for "cycles" and "insts" for intelNehalemList */
PERF_EVENTS_SW_EVENT_ALIASES
USE_INTEL_REF_CYCLES ( 25 )
{ " cycles " , " cpu_clk_unhalted.thread_p " , REGNO_ANY , STXT ( " CPU Cycles " ) , PRELOADS_75 , 1 , ABST_NONE } ,
{ " insts " , " inst_retired.any_p " , REGNO_ANY , STXT ( " Instructions Executed " ) , PRELOADS_75 , 0 , ABST_NONE } ,
// PEBS (sampling)
{ " l2m_latency " , " mem_trans_retired.load_latency " , REGNO_ANY , STXT ( " L2 Cache Miss Est. Latency " ) , PRELOADS_4 , 65 , ABST_EXACT_PEBS_PLUS1 } ,
{ /*cd.01*/ " mem_trans_retired.load_latency " , NULL , REGNO_ANY , NULL , PRELOADS_4 , 65 , ABST_EXACT_PEBS_PLUS1 } ,
// aliases (the first set are PEBS, but on Intel the only precise counter we support is l2m_latency)
{ " dch " , " mem_load_retired.l1_hit " , REGNO_ANY , STXT ( " L1 D-cache Hits " ) , PRELOADS_7 , 0 , ABST_NONE } ,
{ " dcm " , " mem_load_retired.l1_miss " , REGNO_ANY , STXT ( " L1 D-cache Misses " ) , PRELOADS_65 , 0 , ABST_NONE } ,
{ " l2h " , " mem_load_retired.l2_hit " , REGNO_ANY , STXT ( " L2 Cache Hits " ) , PRELOADS_65 , 0 , ABST_NONE } ,
{ " l2m " , " mem_load_retired.l2_miss " , REGNO_ANY , STXT ( " L2 Cache Misses " ) , PRELOADS_6 , 0 , ABST_NONE } ,
{ " l2m_stall " , " cycle_activity.stalls_l2_miss " , REGNO_ANY , STXT ( " L2 Cache Miss Stall " ) , PRELOADS_7 , 1 , ABST_NONE } , // needs validation
{ " l3h " , " mem_load_retired.l3_hit " , REGNO_ANY , STXT ( " L3 Cache Hits " ) , PRELOADS_6 , 0 , ABST_NONE } ,
{ " l3m " , " mem_load_retired.l3_miss " , REGNO_ANY , STXT ( " L3 Cache Misses " ) , PRELOADS_5 , 0 , ABST_NONE } ,
{ " l3m_stall " , " cycle_activity.stalls_l3_miss " , REGNO_ANY , STXT ( " L3 Cache Miss Stall " ) , PRELOADS_7 , 1 , ABST_NONE } , // needs validation
{ " dtlbm_stall " , " dtlb_load_misses.walk_active " , REGNO_ANY , STXT ( " DTLB Miss Est Stall " ) , PRELOADS_7 , 1 , ABST_NONE , STXT ( " Estimated time stalled on DTLB misses requiring a tablewalk. Does not include time related to STLB hits. " ) } , // needs validation
// PEBS mem_inst_retired.stlb_miss_loads for finding location of DTLB issues
// what about: dtlb_load_misses.walk_completed, dtlb_load_misses.walk_pending, dtlb_load_misses.stlb_hit
{ " fp_scalar " , " fp_arith_inst_retired.scalar_double~umask=0x3 " , REGNO_ANY , STXT ( " FP Scalar uOps " ) , PRELOADS_7 , 0 , ABST_NONE , STXT ( " Floating-point scalar micro-ops that retired " ) } ,
{ " fp_vector " , " fp_arith_inst_retired.128b_packed_double~umask=0x3c " , REGNO_ANY , STXT ( " FP Vector uOps " ) , /*needs test*/ PRELOADS_7 , 0 , ABST_NONE , STXT ( " Floating-point vector micro-ops that retired " ) } ,
// counters that can be time converted (add FFCs if we decide to support them)
// counters that are load-store (did not include any... do we want to?)
{ /*08.10*/ " dtlb_load_misses.walk_active " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*08.10*/ " dtlb_load_misses.walk_pending " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*0d.01*/ " int_misc.recovery_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*0d.01*/ " int_misc.recovery_cycles_any " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*0d.80*/ " int_misc.clear_resteer_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*0e.01*/ " uops_issued.stall_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*14.01*/ " arith.divider_active " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*3c.00*/ " cpu_clk_unhalted.ring0_trans " , NULL , REGNO_ANY , NULL , PRELOADS_75 , 1 , ABST_NONE } ,
{ /*3c.00*/ " cpu_clk_unhalted.thread_p_any " , NULL , REGNO_ANY , NULL , PRELOADS_75 , 1 , ABST_NONE } ,
{ /*3c.00*/ " cpu_clk_unhalted.thread_p " , NULL , REGNO_ANY , NULL , PRELOADS_75 , 1 , ABST_NONE } ,
{ /*3c.00*/ " cpu_clk_unhalted.core " , NULL , REGNO_ANY , NULL , PRELOADS_75 , 1 , ABST_NONE } ,
{ /*48.01*/ " l1d_pend_miss.pending_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*48.01*/ " l1d_pend_miss.pending_cycles_any " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*49.10*/ " dtlb_store_misses.walk_active " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*49.10*/ " dtlb_store_misses.walk_pending " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*4f.10*/ " ept.walk_pending " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*5e.01*/ " rs_events.empty_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*60.01*/ " offcore_requests_outstanding.cycles_with_demand_data_rd " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*60.01*/ " offcore_requests_outstanding.demand_data_rd_ge_6 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*60.02*/ " offcore_requests_outstanding.cycles_with_demand_code_rd " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*60.04*/ " offcore_requests_outstanding.cycles_with_demand_rfo " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*60.08*/ " offcore_requests_outstanding.cycles_with_data_rd " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*60.10*/ " offcore_requests_outstanding.cycles_with_l3_miss_demand_data_rd " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*60.10*/ " offcore_requests_outstanding.l3_miss_demand_data_rd_ge_6 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*63.02*/ " lock_cycles.cache_lock_duration " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*79.04*/ " idq.mite_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*79.08*/ " idq.dsb_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*79.10*/ " idq.ms_dsb_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*79.18*/ " idq.all_dsb_cycles_4_uops " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*79.18*/ " idq.all_dsb_cycles_any_uops " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*79.24*/ " idq.all_mite_cycles_4_uops " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*79.24*/ " idq.all_mite_cycles_any_uops " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*79.30*/ " idq.ms_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*80.04*/ " icache_16b.ifdata_stall " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*83.04*/ " icache_64b.iftag_stall " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*85.10*/ " itlb_misses.walk_active " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*85.10*/ " itlb_misses.walk_pending " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*87.01*/ " ild_stall.lcp " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*9c.01*/ " idq_uops_not_delivered.cycles_0_uops_deliv.core " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*9c.01*/ " idq_uops_not_delivered.cycles_le_1_uop_deliv.core " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*9c.01*/ " idq_uops_not_delivered.cycles_le_2_uop_deliv.core " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*9c.01*/ " idq_uops_not_delivered.cycles_le_3_uop_deliv.core " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*9c.01*/ " idq_uops_not_delivered.cycles_fe_was_ok " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a1.01*/ " uops_dispatched_port.port_0 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a1.02*/ " uops_dispatched_port.port_1 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a1.04*/ " uops_dispatched_port.port_2 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a1.08*/ " uops_dispatched_port.port_3 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a1.10*/ " uops_dispatched_port.port_4 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a1.20*/ " uops_dispatched_port.port_5 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a1.40*/ " uops_dispatched_port.port_6 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a1.80*/ " uops_dispatched_port.port_7 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a2.01*/ " resource_stalls.any " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a2.08*/ " resource_stalls.sb " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a3.01*/ " cycle_activity.cycles_l2_miss " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a3.02*/ " cycle_activity.cycles_l3_miss " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a3.04*/ " cycle_activity.stalls_total " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a3.05*/ " cycle_activity.stalls_l2_miss " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a3.06*/ " cycle_activity.stalls_l3_miss " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a3.08*/ " cycle_activity.cycles_l1d_miss " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a3.0c*/ " cycle_activity.stalls_l1d_miss " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a3.10*/ " cycle_activity.cycles_mem_any " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a3.14*/ " cycle_activity.stalls_mem_any " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a6.01*/ " exe_activity.exe_bound_0_ports " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a6.02*/ " exe_activity.1_ports_util " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a6.04*/ " exe_activity.2_ports_util " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a6.08*/ " exe_activity.3_ports_util " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a6.10*/ " exe_activity.4_ports_util " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a6.40*/ " exe_activity.bound_on_stores " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a8.01*/ " lsd.cycles_4_uops " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*a8.01*/ " lsd.cycles_active " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*ab.02*/ " dsb2mite_switches.penalty_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*b1.01*/ " uops_executed.cycles_ge_1_uop_exec " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*b1.01*/ " uops_executed.cycles_ge_2_uops_exec " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*b1.01*/ " uops_executed.cycles_ge_3_uops_exec " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*b1.01*/ " uops_executed.cycles_ge_4_uops_exec " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*b1.01*/ " uops_executed.stall_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*b1.02*/ " uops_executed.core_cycles_ge_1 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*b1.02*/ " uops_executed.core_cycles_ge_2 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*b1.02*/ " uops_executed.core_cycles_ge_3 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*b1.02*/ " uops_executed.core_cycles_ge_4 " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*b1.02*/ " uops_executed.core_cycles_none " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*c0.1*/ " inst_retired.total_cycles_ps " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*c2.01*/ " uops_retired.stall_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*c2.01*/ " uops_retired.total_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*ca.1e*/ " fp_assist.any " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
/* "Architectural" events: */
{ /* FFC */ " cpu_clk_unhalted.thread " , NULL , REGNO_ANY , NULL , PRELOADS_75 , 1 , ABST_NONE } ,
{ /* FFC */ " unhalted-core-cycles " , NULL , REGNO_ANY , NULL , PRELOADS_75 , 1 , ABST_NONE } ,
PERF_EVENTS_SW_EVENT_DEFS
/* additional (hidden) aliases for convenience */
#if 0
USE_INTEL_REF_CYCLES ( 25 ) ,
# endif
{ " insts0 " , " inst_retired.any_p " , 0 , NULL , PRELOADS_8 , 0 , ABST_NONE } ,
{ " insts1 " , " inst_retired.any_p " , 1 , NULL , PRELOADS_8 , 0 , ABST_NONE } ,
{ NULL , NULL , 0 , NULL , 0 , 0 , 0 , 0 , ABST_NONE }
} ;
static Hwcentry intelLinuxUnknown [ ] = {
PERF_EVENTS_SW_EVENT_ALIASES
// USE_INTEL_REF_CYCLES(100) // freq is unknown
{ " cycles " , " unhalted-core-cycles " , REGNO_ANY , STXT ( " CPU Cycles " ) , PRELOADS_75 , 1 , ABST_NONE } ,
{ " cycles " , " PERF_COUNT_HW_CPU_CYCLES " , REGNO_ANY , STXT ( " CPU Cycles " ) , PRELOADS_75 , 1 , ABST_NONE } ,
{ " insts " , " instruction-retired " , REGNO_ANY , STXT ( " Instructions Executed " ) , PRELOADS_75 , 0 , ABST_NONE } ,
{ " insts " , " PERF_COUNT_HW_INSTRUCTIONS " , REGNO_ANY , STXT ( " Instructions Executed " ) , PRELOADS_75 , 0 , ABST_NONE } ,
{ " dcm " , " PERF_COUNT_HW_CACHE_MISSES.L1D " , REGNO_ANY , STXT ( " L1 D-cache Misses " ) , PRELOADS_65 , 0 , ABST_NONE } ,
{ " llm " , " llc-misses " , REGNO_ANY , STXT ( " Last-Level Cache Misses " ) , PRELOADS_5 , 0 , ABST_NONE } ,
{ " llm " , " PERF_COUNT_HW_CACHE_MISSES.LL " , REGNO_ANY , STXT ( " Last-Level Cache Misses " ) , PRELOADS_5 , 0 , ABST_NONE } ,
{ " br_msp " , " branch-misses-retired " , REGNO_ANY , STXT ( " Branch Mispredict " ) , PRELOADS_6 , 0 , ABST_NONE } ,
{ " br_msp " , " PERF_COUNT_HW_BRANCH_MISSES " , REGNO_ANY , STXT ( " Branch Mispredict " ) , PRELOADS_6 , 0 , ABST_NONE } ,
{ " br_ins " , " branch-instruction-retired " , REGNO_ANY , STXT ( " Branch Instructions " ) , PRELOADS_7 , 0 , ABST_NONE } ,
{ " br_ins " , " PERF_COUNT_HW_BRANCH_INSTRUCTIONS " , REGNO_ANY , STXT ( " Branch Instructions " ) , PRELOADS_7 , 0 , ABST_NONE } ,
// counters that can be time converted (add FFCs if we decide to support them)
// counters that are load-store (did not include any... do we want to?)
/* "Architectural" events: */
{ /* FFC */ " cpu_clk_unhalted.thread " , NULL , REGNO_ANY , NULL , PRELOADS_75 , 1 , ABST_NONE } ,
{ /* FFC */ " unhalted-core-cycles " , NULL , REGNO_ANY , NULL , PRELOADS_75 , 1 , ABST_NONE } ,
PERF_EVENTS_SW_EVENT_DEFS
/* additional (hidden) aliases for convenience */
{ " cycles0 " , " unhalted-reference-cycles " , 0 , NULL , PRELOADS_6 , - ( 25 ) , ABST_NONE } , //YXXX -can't do with ref cycles #
{ " cycles0 " , " PERF_COUNT_HW_BUS_CYCLES " , 0 , NULL , PRELOADS_6 , - ( 25 ) , ABST_NONE } , //YXXX -can't do with ref cycles #
{ " cycles1 " , " unhalted-reference-cycles " , 1 , NULL , PRELOADS_65 , - ( 25 ) , ABST_NONE } , //YXXX - can't do with ref cycles #
{ " cycles1 " , " PERF_COUNT_HW_BUS_CYCLES " , 1 , NULL , PRELOADS_65 , - ( 25 ) , ABST_NONE } , //YXXX - can't do with ref cycles #
{ " insts0 " , " instruction-retired " , 0 , NULL , PRELOADS_8 , 0 , ABST_NONE } ,
{ " insts0 " , " PERF_COUNT_HW_INSTRUCTIONS " , 0 , NULL , PRELOADS_8 , 0 , ABST_NONE } ,
{ " insts1 " , " instruction-retired " , 1 , NULL , PRELOADS_8 , 0 , ABST_NONE } ,
{ " insts1 " , " PERF_COUNT_HW_INSTRUCTIONS " , 1 , NULL , PRELOADS_8 , 0 , ABST_NONE } ,
{ NULL , NULL , 0 , NULL , 0 , 0 , 0 , 0 , ABST_NONE }
} ;
static Hwcentry intelAtomList [ ] = {
{ " cycles " , " cpu_clk_unhalted.core " , /*6759307*/ REGNO_ANY , STXT ( " CPU Cycles " ) , PRELOADS_7 , 1 , ABST_NONE } ,
{ " cycles " , " cpu_clk_unhalted.thread " , /*6759307*/ REGNO_ANY , STXT ( " CPU Cycles " ) , PRELOADS_7 , 1 , ABST_NONE } ,
{ " insts " , " instr_retired.any " , REGNO_ANY , STXT ( " Instructions Executed " ) , PRELOADS_7 , 0 , ABST_NONE } ,
/* explicit definitions of (hidden) entries for proper counters */
/* Only counters that can be time converted, or are load-store need to be in this table */
/* XXXX add core2-related entries if appropriate */
{ /*30A*/ " cpu_clk_unhalted.core " , /*6759307*/ NULL , REGNO_ANY , NULL , PRELOADS_7 , 1 , ABST_NONE } ,
{ /*30A*/ " cpu_clk_unhalted.thread " , /*6759307*/ NULL , REGNO_ANY , NULL , PRELOADS_7 , 1 , ABST_NONE } ,
{ /*0c*/ " page_walks.cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*14*/ " cycles_div_busy " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*21*/ " l2_ads " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*22*/ " l2_dbus_busy " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*32*/ " l2_no_req " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*3c*/ " cpu_clk_unhalted.core_p " , NULL , REGNO_ANY , NULL , PRELOADS_7 , 1 , ABST_NONE } ,
{ /*3c*/ " cpu_clk_unhalted.bus " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*3c*/ " cpu_clk_unhalted.no_other " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*62*/ " bus_drdy_clocks " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*63*/ " bus_lock_clocks " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*64*/ " bus_data_rcv " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*7a*/ " bus_hit_drv " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*7b*/ " bus_hitm_drv " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*7d*/ " busq_empty " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*7e*/ " snoop_stall_drv " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*7f*/ " bus_io_wait " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*c6*/ " cycles_int_masked.cycles_int_masked " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*c6*/ " cycles_int_masked.cycles_int_pending_and_masked " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
/* "Architectural" events: */
{ /*3c*/ " unhalted-core-cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
/* additional (hidden) aliases for convenience */
{ " cycles0 " , " cpu_clk_unhalted.core_p " , 0 , NULL , PRELOADS_75 , 1 , ABST_NONE } ,
{ " cycles1 " , " cpu_clk_unhalted.core_p " , 1 , NULL , PRELOADS_75 , 1 , ABST_NONE } ,
{ " insts0 " , " inst_retired.any_p " , 0 , NULL , PRELOADS_75 , 0 , ABST_NONE } ,
{ " insts1 " , " inst_retired.any_p " , 1 , NULL , PRELOADS_75 , 0 , ABST_NONE } ,
{ NULL , NULL , 0 , NULL , 0 , 0 , 0 , 0 , ABST_NONE }
} ;
static Hwcentry amd_opteron_10h_11h [ ] = {
{ " cycles " , " BU_cpu_clk_unhalted " , REGNO_ANY , STXT ( " CPU Cycles " ) , PRELOADS_75 , 1 , ABST_NONE } ,
{ " insts " , " FR_retired_x86_instr_w_excp_intr " , REGNO_ANY , STXT ( " Instructions Executed " ) , PRELOADS_75 , 0 , ABST_NONE } ,
{ " icr " , " IC_fetch " , REGNO_ANY , STXT ( " L1 I-cache Refs " ) , PRELOADS_7 , 0 , ABST_NONE } , /* new */
{ " icm " , " IC_miss " , REGNO_ANY , STXT ( " L1 I-cache Misses " ) , PRELOADS_6 , 0 , ABST_NONE } ,
{ " l2itlbh " , " IC_itlb_L1_miss_L2_hit " , REGNO_ANY , STXT ( " L2 ITLB Hits " ) , PRELOADS_6 , 0 , ABST_NONE } , /* new */
{ " l2itlbm " , " IC_itlb_L1_miss_L2_miss " , REGNO_ANY , STXT ( " L2 ITLB Misses " ) , PRELOADS_5 , 0 , ABST_NONE } , /* new */
{ " l2ir " , " BU_internal_L2_req~umask=0x1 " , REGNO_ANY , STXT ( " L2 I-cache Refs " ) , PRELOADS_6 , 0 , ABST_NONE } ,
{ " l2im " , " BU_fill_req_missed_L2~umask=0x1 " , REGNO_ANY , STXT ( " L2 I-cache Misses " ) , PRELOADS_4 , 0 , ABST_NONE } ,
{ " dcr " , " DC_access " , REGNO_ANY , STXT ( " L1 D-cache Refs " ) , PRELOADS_7 , 0 , ABST_NONE } , /* new */
{ " dcm " , " DC_miss " , REGNO_ANY , STXT ( " L1 D-cache Misses " ) , PRELOADS_65 , 0 , ABST_NONE } , /* new */
{ " l2dtlbh " , " DC_dtlb_L1_miss_L2_hit " , REGNO_ANY , STXT ( " L2 DTLB Hits " ) , PRELOADS_6 , 0 , ABST_NONE } , /* new */
{ " l2dtlbm " , " DC_dtlb_L1_miss_L2_miss " , REGNO_ANY , STXT ( " L2 DTLB Misses " ) , PRELOADS_5 , 0 , ABST_NONE } , /* new */
{ " l2dr " , " BU_internal_L2_req~umask=0x2 " , REGNO_ANY , STXT ( " L2 D-cache Refs " ) , PRELOADS_65 , 0 , ABST_NONE } , /* hwc_cache_load: 1.6x overcount on shanghai01 */
{ " l2dm " , " BU_fill_req_missed_L2~umask=0x2 " , REGNO_ANY , STXT ( " L2 D-cache Misses " ) , PRELOADS_6 , 0 , ABST_NONE } , /* new */
{ " fpadd " , " FP_dispatched_fpu_ops~umask=0x1 " , REGNO_ANY , STXT ( " FP Adds " ) , PRELOADS_7 , 0 , ABST_NONE } ,
{ " fpmul " , " FP_dispatched_fpu_ops~umask=0x2 " , REGNO_ANY , STXT ( " FP Muls " ) , PRELOADS_7 , 0 , ABST_NONE } ,
{ " fpustall " , " FR_dispatch_stall_fpu_full " , REGNO_ANY , STXT ( " FPU Stall Cycles " ) , PRELOADS_7 , 1 , ABST_NONE } ,
{ " memstall " , " FR_dispatch_stall_ls_full " , REGNO_ANY , STXT ( " Memory Unit Stall Cycles " ) , PRELOADS_7 , 1 , ABST_NONE } ,
// For PAPI mappings, see hwctable.README.family10h
// For PAPI mappings, see hwctable.README.opteron
/* explicit definitions of (hidden) entries for proper counters */
/* Only counters that can be time converted, or are load-store need to be in this table */
{ " BU_cpu_clk_unhalted " , NULL , REGNO_ANY , NULL , PRELOADS_75 , 1 , ABST_NONE } ,
{ " FP_cycles_no_fpu_ops_retired " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " FP_serialize_ops_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " FR_dispatch_stall_branch_abort_to_retire " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_TBD } ,
{ " FR_dispatch_stall_far_ctl_trsfr_resync_branch_pend " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_TBD } ,
{ " FR_dispatch_stall_fpu_full " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_TBD } ,
{ " FR_dispatch_stall_ls_full " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_TBD } ,
{ " FR_dispatch_stall_reorder_buffer_full " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_TBD } ,
{ " FR_dispatch_stall_resv_stations_full " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_TBD } ,
{ " FR_dispatch_stall_segment_load " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_TBD } ,
{ " FR_dispatch_stall_serialization " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_TBD } ,
{ " FR_dispatch_stall_waiting_all_quiet " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_TBD } ,
{ " FR_dispatch_stalls " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_TBD } ,
{ " FR_intr_masked_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_TBD } ,
{ " FR_intr_masked_while_pending_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_TBD } ,
{ " FR_nothing_to_dispatch " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_TBD } ,
{ " IC_instr_fetch_stall " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_TBD } ,
{ " LS_buffer_2_full " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_TBD } ,
{ " NB_mem_ctrlr_dram_cmd_slots_missed " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ " NB_mem_ctrlr_turnaround " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_TBD } ,
/* additional (hidden) aliases, for convenience */
{ " cycles0 " , " BU_cpu_clk_unhalted " , 0 , NULL , PRELOADS_8 , 1 , ABST_NONE } ,
{ " cycles1 " , " BU_cpu_clk_unhalted " , 1 , NULL , PRELOADS_8 , 1 , ABST_NONE } ,
{ " insts0 " , " FR_retired_x86_instr_w_excp_intr " , 0 , NULL , PRELOADS_8 , 0 , ABST_NONE } ,
{ " insts1 " , " FR_retired_x86_instr_w_excp_intr " , 1 , NULL , PRELOADS_8 , 0 , ABST_NONE } ,
{ NULL , NULL , 0 , NULL , 0 , 0 , 0 , 0 , ABST_NONE }
} ;
static Hwcentry amd_15h [ ] = {
{ " cycles " , " CU_cpu_clk_unhalted " , REGNO_ANY , STXT ( " CPU Cycles " ) , PRELOADS_75 , 1 , ABST_NONE } ,
{ " insts " , " EX_retired_instr_w_excp_intr " , REGNO_ANY , STXT ( " Instructions Executed " ) , PRELOADS_75 , 0 , ABST_NONE } ,
{ " icr " , " IC_fetch " , REGNO_ANY , STXT ( " L1 I-cache Refs " ) , PRELOADS_7 , 0 , ABST_NONE } , /* new */
{ " icm " , " IC_miss " , REGNO_ANY , STXT ( " L1 I-cache Misses " ) , PRELOADS_6 , 0 , ABST_NONE } ,
{ " l2im " , " IC_refill_from_system " , REGNO_ANY , STXT ( " L2 I-cache Misses " ) , PRELOADS_6 , 0 , ABST_NONE } ,
{ " dcr " , " DC_access " , REGNO_ANY , STXT ( " L1 D-cache Refs " ) , PRELOADS_7 , 0 , ABST_NONE } , /* new */
{ " dcm " , " DC_miss~umask=0x3 " , REGNO_ANY , STXT ( " L1 D-cache Misses " ) , PRELOADS_65 , 0 , ABST_NONE } , /* new */
{ " l2dm " , " DC_refill_from_system " , REGNO_ANY , STXT ( " L2 D-cache Misses " ) , PRELOADS_6 , 0 , ABST_NONE } , /* new */
{ " dtlbm " , " DC_unified_tlb_miss~umask=0x7 " , REGNO_ANY , STXT ( " L2 DTLB Misses " ) , PRELOADS_5 , 0 , ABST_NONE } , /* new */
// For PAPI mappings, see hwctable.README.family15h
/* explicit definitions of (hidden) entries for proper counters */
/* Only counters that can be time converted, or are load-store need to be in this table */
{ /*001.xx*/ " FP_scheduler_empty " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*006.xx*/ " FP_bottom_execute_uops_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*023.xx*/ " LS_ldq_stq_full " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*024.xx*/ " LS_locked_operation " , /*umask!=0*/ NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*069.xx*/ " CU_mab_wait_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*076.xx*/ " CU_cpu_clk_unhalted " , NULL , REGNO_ANY , NULL , PRELOADS_75 , 1 , ABST_NONE } ,
{ /*087.xx*/ " IC_instr_fetch_stall " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*0cd.xx*/ " EX_intr_masked_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*0ce.xx*/ " EX_intr_masked_while_pending_cycles " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*0d0.xx*/ " DE_nothing_to_dispatch " , /*future*/ NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*0d1.xx*/ " DE_dispatch_stalls " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*0d3.xx*/ " DE_dispatch_stall_serialization " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*0d5.xx*/ " DE_dispatch_stall_instr_retire_q_full " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*0d6.xx*/ " DE_dispatch_stall_int_scheduler_q_full " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*0d7.xx*/ " DE_dispatch_stall_fp_scheduler_q_full " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*0d8.xx*/ " DE_dispatch_stall_ldq_full " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*0d9.xx*/ " DE_dispatch_stall_waiting_all_quiet " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
{ /*1d8.xx*/ " EX_dispatch_stall_stq_full " , NULL , REGNO_ANY , NULL , PRELOAD_DEF , 1 , ABST_NONE } ,
/* additional (hidden) aliases, for convenience */
{ " cycles0 " , " CU_cpu_clk_unhalted " , 0 , NULL , PRELOADS_8 , 1 , ABST_NONE } ,
{ " cycles1 " , " CU_cpu_clk_unhalted " , 1 , NULL , PRELOADS_8 , 1 , ABST_NONE } ,
{ " insts0 " , " EX_retired_instr_w_excp_intr " , 0 , NULL , PRELOADS_8 , 0 , ABST_NONE } ,
{ " insts1 " , " EX_retired_instr_w_excp_intr " , 1 , NULL , PRELOADS_8 , 0 , ABST_NONE } ,
{ NULL , NULL , 0 , NULL , 0 , 0 , 0 , 0 , ABST_NONE }
} ;
# define USE_ARM_REF_CYCLES \
{ " usr_time " , " cycles " , REGNO_ANY , STXT ( " User CPU " ) , PRELOADS_85 , 1 , ABST_NONE } , \
{ " sys_time " , " cycles~system=1~user=0 " , REGNO_ANY , STXT ( " System CPU " ) , PRELOADS_85 , 1 , ABST_NONE } , \
static Hwcentry armlist [ ] = {
USE_ARM_REF_CYCLES
// Hardware event:
{ " branch-instructions " , NULL , REGNO_ANY , STXT ( " Branch-instructions " ) , PRELOADS_35 , 0 , ABST_NONE } ,
{ " branch-misses " , NULL , REGNO_ANY , STXT ( " Branch-misses " ) , PRELOADS_35 , 0 , ABST_NONE } ,
{ " bus-cycles " , NULL , REGNO_ANY , STXT ( " Bus Cycles " ) , PRELOADS_35 , 1 , ABST_NONE } ,
{ " cache-misses " , NULL , REGNO_ANY , STXT ( " Cache-misses " ) , PRELOADS_35 , 0 , ABST_NONE } ,
{ " cache-references " , NULL , REGNO_ANY , STXT ( " Cache-references " ) , PRELOADS_35 , 0 , ABST_NONE } ,
{ " cycles " , NULL , REGNO_ANY , STXT ( " CPU Cycles " ) , PRELOADS_85 , 1 , ABST_NONE } ,
{ " insts " , " instructions " , REGNO_ANY , STXT ( " Instructions Executed " ) , PRELOADS_75 , 0 , ABST_NONE } ,
{ " ref-cycles " , NULL , REGNO_ANY , STXT ( " Total Cycles " ) , PRELOADS_85 , 1 , ABST_NONE } ,
{ " stalled-cycles-backend " , NULL , REGNO_ANY , STXT ( " Stalled Cycles during issue. " ) , PRELOADS_85 , 1 , ABST_NONE } ,
{ " stalled-cycles-frontend " , NULL , REGNO_ANY , STXT ( " Stalled Cycles during retirement. " ) , PRELOADS_85 , 1 , ABST_NONE } ,
// Software event:
{ " alignment-faults " , NULL , REGNO_ANY , STXT ( " Alignment Faults " ) , PRELOADS_85 , 0 , ABST_NONE } ,
{ " context-switches " , NULL , REGNO_ANY , STXT ( " Context Switches " ) , PRELOADS_85 , 0 , ABST_NONE } ,
{ " cpu-clock " , NULL , REGNO_ANY , STXT ( " CPU Clock " ) , PRELOADS_85 , 1 , ABST_NONE } ,
{ " cpu-migrations " , NULL , REGNO_ANY , STXT ( " CPU Migrations " ) , PRELOADS_85 , 0 , ABST_NONE } ,
{ " emulation-faults " , NULL , REGNO_ANY , STXT ( " Emulation Faults " ) , PRELOADS_85 , 0 , ABST_NONE } ,
{ " major-faults " , NULL , REGNO_ANY , STXT ( " Major Page Faults " ) , PRELOADS_85 , 0 , ABST_NONE } ,
{ " minor-faults " , NULL , REGNO_ANY , STXT ( " Minor Page Faults " ) , PRELOADS_85 , 0 , ABST_NONE } ,
{ " page-faults " , NULL , REGNO_ANY , STXT ( " Page Faults " ) , PRELOADS_85 , 0 , ABST_NONE } ,
{ " task-clock " , NULL , REGNO_ANY , STXT ( " Clock Count Specific " ) , PRELOADS_85 , 1 , ABST_NONE } ,
// Hardware cache event
{ " L1-dcache-load-misses " , NULL , REGNO_ANY , STXT ( " L1 D-cache Load Misses " ) , PRELOADS_35 , 0 , ABST_NONE } ,
{ " L1-dcache-loads " , NULL , REGNO_ANY , STXT ( " L1 D-cache Loads " ) , PRELOADS_35 , 0 , ABST_NONE } ,
{ " L1-dcache-store-misses " , NULL , REGNO_ANY , STXT ( " L1 D-cache Store Misses " ) , PRELOADS_35 , 0 , ABST_NONE } ,
{ " L1-dcache-stores " , NULL , REGNO_ANY , STXT ( " L1 D-cache Store Stores " ) , PRELOADS_35 , 0 , ABST_NONE } ,
{ " L1-icache-load-misses " , NULL , REGNO_ANY , STXT ( " L1 Instructions Load Misses " ) , PRELOADS_35 , 0 , ABST_NONE } ,
{ " L1-icache-load-misses " , NULL , REGNO_ANY , STXT ( " L1 Instructions Loads " ) , PRELOADS_35 , 0 , ABST_NONE } ,
{ " dTLB-load-misses " , NULL , REGNO_ANY , STXT ( " D-TLB Load Misses " ) , PRELOADS_35 , 0 , ABST_NONE } ,
{ " dTLB-loads " , NULL , REGNO_ANY , STXT ( " D-TLB Loads " ) , PRELOADS_35 , 0 , ABST_NONE } ,
{ " iTLB-load-misses " , NULL , REGNO_ANY , STXT ( " The Instruction TLB Load Misses " ) , PRELOADS_35 , 0 , ABST_NONE } ,
{ " iTLB-loads " , NULL , REGNO_ANY , STXT ( " The Instruction TLB Loads " ) , PRELOADS_35 , 0 , ABST_NONE } ,
{ NULL , NULL , 0 , NULL , 0 , 0 , 0 , 0 , ABST_NONE }
} ;
static Hwcentry unknownlist [ ] =
/* used for unrecognized CPU type */ {
{ NULL , NULL , 0 , NULL , 0 , 0 , 0 , 0 , ABST_NONE }
} ;
/* structure defining the counters for a CPU type */
typedef struct
{
int cputag ;
Hwcentry * stdlist_table ;
# define MAX_DEFAULT_HWC_DEFS 4 // allows multiple defs to handle OS variations; extend as needed
char * default_exp_p [ MAX_DEFAULT_HWC_DEFS + 1 ] ; // end of list MUST be marked with NULL
} cpu_list_t ;
/* IMPORTANT NOTE:
*
* Any default HWC string must consist of counter names separated by - TWO - commas ,
* with a no trailing comma / value after the last counter name
*
* Only aliased counters should be specified ; non - aliased counters will
* not get the right overflow values set .
* If the string is not formatted that way , - h hi and - h lo will fail
*/
static cpu_list_t cputabs [ ] = {
{ CPC_ULTRA1 , usIlist , { NULL } } , /* bind will fail */
{ CPC_ULTRA2 , usIlist , { NULL } } , /* bind will fail */
{ CPC_ULTRA3 , usIIIlist , { " insts,,ecstall " , 0 } } ,
{ CPC_ULTRA3_PLUS , usIIIlist , { " insts,,ecstall " , 0 } } ,
{ CPC_ULTRA3_I , usIIIlist , { " insts,,ecstall " , 0 } } ,
{ CPC_ULTRA4_PLUS , usIVplist , { " insts,,ecstall " , 0 } } ,
{ CPC_ULTRA_T1 , niagara1 , { " insts " , 0 } } ,
{ CPC_ULTRA_T2 , niagara2 , { " insts,,+l2drm " , 0 } } ,
{ CPC_ULTRA_T2P , niagara2 , { " insts,,+l2drm " , 0 } } ,
{ CPC_ULTRA_T3 , niagara2 , { " insts,,+l2drm " , 0 } } ,
{ CPC_SPARC_T4 , sparc_t4 , { " insts,,cycles,,c_stalls,,dcm " , " c_stalls " , 0 } } ,
{ CPC_SPARC_M4 , sparc_t5_m6 , { " insts,,cycles,,c_stalls,,dcm " , " c_stalls " , 0 } } , // renamed to m5
{ CPC_SPARC_T5 , sparc_t5_m6 , { " insts,,cycles,,c_stalls,,dcm " , " c_stalls " , 0 } } ,
{ CPC_SPARC_M5 , sparc_t5_m6 , { " insts,,cycles,,c_stalls,,dcm " , " c_stalls " , 0 } } ,
{ CPC_SPARC_T6 , sparc_t5_m6 , { " insts,,cycles,,c_stalls,,dcm " , " c_stalls " , 0 } } , // no such processor
{ CPC_SPARC_M6 , sparc_t5_m6 , { " insts,,cycles,,c_stalls,,dcm " , " c_stalls " , 0 } } ,
{ CPC_SPARC_M7 , sparc_m7 , { " insts,,cycles,,c_stalls,,dcm " , " c_stalls " , 0 } } , // includes T7
{ CPC_SPARC_M8 , sparc_m8 , { " insts,,cycles,,c_stalls,,dcm " , " c_stalls " , 0 } } ,
{ CPC_PENTIUM_PRO_MMX , pentiumIIlist , { " insts " , 0 } } ,
{ CPC_PENTIUM_PRO , pentiumIIIlist , { " insts " , 0 } } ,
{ CPC_PENTIUM_4 , pentium4 , { " insts " , 0 } } ,
{ CPC_PENTIUM_4_HT , pentium4 , { " insts " , 0 } } ,
{ CPC_INTEL_CORE2 , intelCore2list , { " insts,,cycles " , 0 } } ,
{ CPC_INTEL_NEHALEM , intelNehalemList , { " insts,,cycles,,+l2m_latency,,dtlbm_stall " ,
" insts,,cycles,,l3m_stall,,dtlbm_stall " , 0 } } ,
{ CPC_INTEL_WESTMERE , intelNehalemList , { " insts,,cycles,,+l2m_latency,,dtlbm_stall " ,
" insts,,cycles,,l3m_stall,,dtlbm_stall " , 0 } } ,
{ CPC_INTEL_SANDYBRIDGE , intelSandyBridgeList , { " insts,,cycles,,+l2m_latency,,dtlbm_stall " ,
" insts,,cycles,,l3m,,dtlbm " , 0 } } ,
{ CPC_INTEL_IVYBRIDGE , intelSandyBridgeList , { " insts,,cycles,,+l2m_latency,,dtlbm_stall " ,
" insts,,cycles,,l3m,,dtlbm " , 0 } } ,
{ CPC_INTEL_HASWELL , intelHaswellList , { " insts,,cycles,,+l2m_latency,,dtlbm_stall " ,
" insts,,cycles,,l3m,,dtlbm " , 0 } } ,
{ CPC_INTEL_BROADWELL , intelBroadwellList , { " insts,,cycles,,+l2m_latency,,dtlbm " ,
" insts,,cycles,,l3m,,dtlbm " , 0 } } ,
{ CPC_INTEL_SKYLAKE , intelSkylakeList , { " insts,,cycles,,+l2m_latency,,dtlbm_stall " ,
" insts,,cycles,,l2m_stall,,dtlbm_stall " , 0 } } ,
{ CPC_INTEL_UNKNOWN , intelLinuxUnknown , { " cycles,,insts,,llm " ,
" user_time,,system_time,,cycles,,insts,,llm " , 0 } } ,
{ CPC_INTEL_ATOM , intelAtomList , { " insts " , 0 } } ,
{ CPC_AMD_K8C , amd_opteron_10h_11h , { " insts,,cycles,,l2dm,,l2dtlbm " , 0 } } ,
{ CPC_AMD_FAM_10H , amd_opteron_10h_11h , { " insts,,cycles,,l2dm,,l2dtlbm " , 0 } } ,
{ CPC_AMD_FAM_11H , amd_opteron_10h_11h , { " insts,,cycles,,l2dm,,l2dtlbm " , 0 } } ,
{ CPC_AMD_FAM_15H , amd_15h , { " insts,,cycles " , 0 } } ,
{ CPC_SPARC64_V , usfuji_V_list , { " insts,,cycles " , 0 } } ,
{ CPC_SPARC64_VI , usfuji_VI_VII_list , { " insts,,cycles,,dcstall " , 0 } } ,
{ CPC_SPARC64_VII , usfuji_VI_VII_list , { " insts,,cycles,,dcstall " , 0 } } ,
{ CPC_SPARC64_X , usfuji_X_list , { " insts,,cycles,,dcstall " , 0 } } ,
{ CPC_SPARC64_XII , usfuji_XII_list , { " insts,,cycles,,dcstall " , 0 } } ,
{ CPC_KPROF , kproflist , { NULL } } , // OBSOLETE (To support 12.3 and earlier, TBR)
{ ARM_CPU_IMP_APM , armlist , { " insts,,cycles " , 0 } } ,
{ 0 , unknownlist , { NULL } } /* processor is unknown, but experiment is allowed */
} ;
/*---------------------------------------------------------------------------*/
/* state variables */
static int initialized ;
static int signals_disabled ;
// Simple array list
typedef struct
{
void * * array ; // array of ptrs, last item set to null
int sz ; // num live elements in array
int max ; // array allocation size
} ptr_list ;
static void
ptr_list_init ( ptr_list * lst )
{
lst - > sz = 0 ;
lst - > max = 0 ;
lst - > array = 0 ;
}
static void
ptr_list_add ( ptr_list * lst , char * ptr )
{ // ptr must be freeable
if ( lst - > sz > = lst - > max - 1 )
{
void * * new ;
int newmax = lst - > max ? lst - > max * 2 : 16 ;
new = ( void * * ) realloc ( lst - > array , newmax * sizeof ( void * ) ) ;
if ( ! new ) return ; // failed, discard add
lst - > max = newmax ;
lst - > array = new ;
}
lst - > array [ lst - > sz + + ] = ptr ;
lst - > array [ lst - > sz ] = NULL ; // mark new end-of-list
}
static void
ptr_list_free ( ptr_list * lst )
{ // includes shallow free of all elements
if ( lst - > array )
{
for ( int ii = 0 ; lst - > array [ ii ] ; ii + + )
free ( lst - > array [ ii ] ) ;
free ( lst - > array ) ;
}
lst - > sz = 0 ;
lst - > max = 0 ;
lst - > array = 0 ;
}
// Capabilities of this machine (initialized by setup_cpc())
static int cpcx_cpuver = CPUVER_UNDEFINED ;
static uint_t cpcx_npics ;
static const char * cpcx_cciname ;
static const char * cpcx_docref ;
static uint64_t cpcx_support_bitmask ;
// cpcx_*[0]: collect lists
// cpcx_*[1]: er_kernel lists
// Each cpcx_*[] list is an array of ptrs with null ptr marking end of list
static char * * cpcx_attrs [ 2 ] ;
static Hwcentry * * cpcx_std [ 2 ] ;
static Hwcentry * * cpcx_raw [ 2 ] ;
static Hwcentry * * cpcx_hidden [ 2 ] ;
static uint_t cpcx_max_concurrent [ 2 ] ;
static char * cpcx_default_hwcs [ 2 ] ;
static char * cpcx_orig_default_hwcs [ 2 ] ;
static int cpcx_has_precise [ 2 ] ;
# define VALID_FOR_KERNEL(forKernel) ((forKernel)>=0 && (forKernel)<=1)
# define IS_KERNEL(forKernel) ((forKernel)==1)
// used to build lists:
static ptr_list unfiltered_attrs ;
static ptr_list unfiltered_raw ;
/*---------------------------------------------------------------------------*/
/* misc internal utilities */
/* compare 2 strings to either \0 or <termchar> */
# define IS_EOL(currchar, termchar) ((currchar)==(termchar) || (currchar)==0)
static int
is_same ( const char * regname , const char * int_name , char termchar )
{
do
{
char a = * regname ;
char b = * int_name ;
if ( IS_EOL ( a , termchar ) )
{
if ( IS_EOL ( b , termchar ) )
return 1 ; /* strings are the same up to terminating char */
else
break ; /* strings differ */
}
if ( a ! = b )
break ; /* strings differ */
regname + + ;
int_name + + ;
}
while ( 1 ) ;
return 0 ;
}
static int
is_numeric ( const char * name , uint64_t * pval )
{
char * endptr ;
uint64_t val = strtoull ( name , & endptr , 0 ) ;
if ( ! * name | | * endptr )
return 0 ; /* name does not specify a numeric value */
if ( pval )
* pval = val ;
return 1 ;
}
static int
is_visible_alias ( Hwcentry * pctr )
{
if ( ! pctr )
return 0 ;
if ( pctr - > name & & pctr - > int_name & & pctr - > metric )
return 1 ;
return 0 ;
}
static int
is_hidden_alias ( Hwcentry * pctr )
{
if ( ! pctr )
return 0 ;
if ( pctr - > name & & pctr - > int_name & & pctr - > metric = = NULL )
return 1 ;
return 0 ;
}
static int
is_numeric_alias ( Hwcentry * pctr )
{
int is_numeric_alias = 0 ;
regno_t regno ;
char * nameOnly = NULL ;
hwcfuncs_parse_ctr ( pctr - > int_name , NULL , & nameOnly , NULL , NULL , & regno ) ;
if ( is_numeric ( nameOnly , NULL ) )
is_numeric_alias = 1 ;
free ( nameOnly ) ;
return is_numeric_alias ;
}
/* print list of register to a buffer */
/*
* style e x a m p l e s
* 0 NONE 2 { 0 | 1 | 2 | 3 }
* 1 NONE 2 : 0 , 1 , 2 , or 3
* 2 0 1 2 3 6
*/
static char *
get_regnolist ( char * buf , size_t sz , const regno_t * reg_list , int style )
{
if ( ! buf | | ! sz )
return " INTERNAL ERROR " ;
buf [ 0 ] = 0 ;
if ( style = = 2 )
{
int ii ;
// width should be consistent with that in format_columns()
// the format will accommodate cpcx_npics regs
if ( cpcx_npics < 1 )
return " INTERNAL ERROR " ;
// clear out the buffer
for ( ii = 0 ; ii < sz ; ii + + )
buf [ ii ] = ' _ ' ;
if ( cpcx_npics < = 9 )
{
// one char per reg, plus terminating null char
if ( cpcx_npics + 1 > sz )
return " INTERNAL ERROR " ;
buf [ cpcx_npics ] = ' \0 ' ;
// fill buf with regnos
for ( ii = 0 ; ii < MAX_PICS ; ii + + )
{
regno_t regno = reg_list [ ii ] ;
if ( REG_LIST_EOL ( regno ) )
break ;
if ( regno < 0 | | regno > = cpcx_npics )
return " INTERNAL ERROR " ;
buf [ regno ] = ' 0 ' + regno ;
}
}
else
{
/* space between regs, which may be 1 or 2 digits each
* 1 char for reg 0
* 2 chars for regs 1 - 9 each
* 3 chars for regs 10 - each
* 1 char for terminating null char
*/
int nchars = 17 + 3 * ( cpcx_npics - 9 ) ;
if ( nchars > sz )
return " INTERNAL ERROR " ;
buf [ nchars - 1 ] = ' \0 ' ;
// fill buf with regnos
for ( ii = 0 ; ii < MAX_PICS ; ii + + )
{
regno_t regno = reg_list [ ii ] ;
if ( REG_LIST_EOL ( regno ) )
break ;
if ( regno < = 9 )
buf [ 2 * regno ] = ' 0 ' + regno ;
else
{
buf [ 3 * ( regno - 9 ) + 17 ] = ' 0 ' + ( regno / 10 ) ;
buf [ 3 * ( regno - 9 ) + 18 ] = ' 0 ' + ( regno % 10 ) ;
}
}
}
return buf ;
}
if ( REG_LIST_IS_EMPTY ( reg_list ) )
{
snprintf ( buf , sz , GTXT ( " NONE " ) ) ;
return buf ;
}
else if ( REG_LIST_EOL ( reg_list [ 1 ] ) )
{
/* 1 item in list */
snprintf ( buf , sz , " %d " , reg_list [ 0 ] ) ;
return buf ;
}
else
{
/* 2 more items in list */
int ii , num_regs ;
for ( ii = 0 ; ii < MAX_PICS ; ii + + )
{
regno_t regno = reg_list [ ii ] ;
if ( REG_LIST_EOL ( regno ) )
break ;
}
num_regs = ii ;
buf [ 0 ] = 0 ;
for ( ii = 0 ; ii < num_regs ; ii + + )
{
regno_t regno = reg_list [ ii ] ;
if ( style = = 0 )
snprintf ( buf + strlen ( buf ) , sz - strlen ( buf ) ,
" %c%d " , ii ? ' | ' : ' { ' , regno ) ;
else
{
if ( num_regs = = 2 )
snprintf ( buf + strlen ( buf ) , sz - strlen ( buf ) ,
" %d%s " , regno , ! ii ? " or " : " " ) ;
else
{
/* 3 or more items in list */
if ( ii < num_regs - 2 )
snprintf ( buf + strlen ( buf ) , sz - strlen ( buf ) ,
" %d, " , regno ) ;
else if ( ii = = num_regs - 2 )
snprintf ( buf + strlen ( buf ) , sz - strlen ( buf ) ,
" %d, or " , regno ) ;
else
snprintf ( buf + strlen ( buf ) , sz - strlen ( buf ) ,
" %d " , regno ) ;
}
}
}
if ( style = = 0 )
snprintf ( buf + strlen ( buf ) , sz - strlen ( buf ) , " } " ) ;
}
return buf ;
}
# if !HWC_DEBUG
# define hwcentry_print(lvl,x1,x2)
# else
/* print a Hwcentry */
static void
hwcentry_print ( int lvl , const char * header , const Hwcentry * pentry )
{
char buf [ 1024 ] ;
Tprintf ( lvl , " %s '%s', '%s', %d, '%s', %d, %d, %d, %d, %d, %d, / " ,
header ,
pentry - > name ? pentry - > name : " NULL " ,
pentry - > int_name ? pentry - > int_name : " NULL " ,
pentry - > reg_num ,
pentry - > metric ? pentry - > metric : " NULL " ,
pentry - > lval , /* low-resolution/long run */
pentry - > val , /* normal */
pentry - > hval , /* high-resolution/short run */
pentry - > timecvt ,
pentry - > memop , /* type of instruction that can trigger */
pentry - > sort_order ) ;
get_regnolist ( buf , sizeof ( buf ) , pentry - > reg_list , 0 ) ;
Tprintf ( lvl , " %s \n " , buf ) ;
}
# endif
/* add <regno> to a Hwcentry's list */
static void
regno_add ( Hwcentry * pctr , regno_t regno )
{
int jj ;
regno_t * reg_list ;
if ( ! pctr )
{
Tprintf ( 0 , " hwctable: regno_add(): ERROR: pctr==NULL \n " ) ;
return ;
}
reg_list = pctr - > reg_list ;
if ( ! reg_list )
{
/* create list */
reg_list = ( regno_t * ) malloc ( sizeof ( regno_t * ) * MAX_PICS ) ;
if ( ! reg_list )
{
hwcentry_print ( DBG_LT0 , " hwctable: regno_add: ERROR: "
" Out of memory: " , pctr ) ;
return ;
}
/* initialize list */
for ( jj = 0 ; jj < MAX_PICS ; jj + + )
reg_list [ jj ] = REGNO_ANY ;
pctr - > reg_list = reg_list ;
}
if ( regno = = REGNO_ANY )
{
/* add all counters up to cpcx_npics */
for ( jj = 0 ; jj < MAX_PICS & & jj < cpcx_npics ; jj + + )
reg_list [ jj ] = jj ;
}
else
{
/* add <regno> to list of registers */
for ( jj = 0 ; jj < MAX_PICS ; jj + + )
{
if ( reg_list [ jj ] = = regno )
{
hwcentry_print ( DBG_LT0 , " hwctable: regno_add: WARNING: "
" Duplicate regno: " , pctr ) ;
break ;
}
if ( reg_list [ jj ] = = REGNO_ANY )
{
reg_list [ jj ] = regno ;
break ;
}
}
}
if ( jj = = MAX_PICS )
hwcentry_print ( DBG_LT0 , " hwctable: regno_add: WARNING: "
" regno list is full: " , pctr ) ;
}
/*---------------------------------------------------------------------------*/
/* utilities for rawlist (list of raw counters with reglist[] filled in) */
/* search the 'raw' list of counters for <name> */
static Hwcentry *
ptrarray_find_by_name ( Hwcentry * * array , const char * name )
{
if ( name = = NULL )
return NULL ;
Tprintf ( DBG_LT3 , " hwctable: array_find_by_name(%s): \n " , name ) ;
for ( int ii = 0 ; array & & array [ ii ] ; ii + + )
if ( strcmp ( array [ ii ] - > name , name ) = = 0 )
return array [ ii ] ;
return NULL ; /* not found */
}
/* add Hwcentry to the 'raw' list of counters */
static Hwcentry *
alloc_shallow_copy ( const Hwcentry * pctr )
{
Hwcentry * node = ( Hwcentry * ) malloc ( sizeof ( Hwcentry ) ) ;
if ( ! node )
return NULL ; // fail
* node = * pctr ; /* shallow copy! */
if ( pctr - > name )
node - > name = strdup ( pctr - > name ) ;
return node ;
}
/* add Hwcentry to the 'raw' list of counters */
static Hwcentry *
list_append_shallow_copy ( ptr_list * list , const Hwcentry * pctr )
{
Hwcentry * node = alloc_shallow_copy ( pctr ) ;
if ( ! node )
return NULL ; // fail
ptr_list_add ( list , ( void * ) node ) ;
return node ;
}
static Hwcentry *
list_add ( ptr_list * list , uint_t regno , const char * name )
{
Hwcentry * praw ;
praw = ptrarray_find_by_name ( ( Hwcentry * * ) list - > array , name ) ;
if ( ! praw )
{
Hwcentry tmpctr = empty_ctr ;
tmpctr . name = ( char * ) name ;
praw = list_append_shallow_copy ( list , & tmpctr ) ;
}
if ( praw )
regno_add ( praw , regno ) ;
return praw ;
}
/*---------------------------------------------------------------------------*/
/* utilities for stdlist (table of aliased, hidden, & convenience, ctrs) */
/* find top level definition for <cpuid> */
static cpu_list_t *
cputabs_find_entry ( int cpuid )
{
int i ;
/* now search for the appropriate table */
for ( i = 0 ; ; i + + )
{
if ( cputabs [ i ] . cputag = = 0 )
break ;
if ( cpuid = = cputabs [ i ] . cputag )
return & cputabs [ i ] ;
}
Tprintf ( 0 , " hwctable: cputabs_find_entry: WARNING: "
" cpu_id = %d not defined. No 'standard' counters are available \n " ,
cpuid ) ;
return & cputabs [ i ] ;
}
/* find Hwcentry table for <cpuid> */
static Hwcentry *
stdlist_get_table ( int cpuid )
{
cpu_list_t * tmp = cputabs_find_entry ( cpuid ) ;
if ( tmp )
return tmp - > stdlist_table ;
return NULL ;
}
/* search the 'standard' list of counters for <name>,<regno> */
/* note: <regno>=REGNO_ANY is a wildcard that matches any value. */
/* note: int_name==NULL is a wildcard */
static const Hwcentry *
ptrarray_find ( const Hwcentry * * array , const char * name , const char * int_name ,
int check_regno , regno_t regno )
{
const Hwcentry * pctr ;
if ( ! array )
return NULL ;
for ( int ii = 0 ; array [ ii ] ; ii + + )
{
pctr = array [ ii ] ;
if ( strcmp ( pctr - > name , name ) )
continue ;
if ( int_name & & int_name [ 0 ] ! = 0 & & pctr - > int_name )
{
if ( NULL = = strstr ( int_name , pctr - > int_name ) )
continue ;
}
if ( ! check_regno )
return pctr ;
else
{
/* duplicates aliases are allowed in table because of 6759307 */
if ( REG_LIST_IS_EMPTY ( pctr - > reg_list ) )
{
/* skip aliases that don't have a valid list of registers */
hwcentry_print ( 1 , " hwctable: stdlist_find_by_name: "
" WARNING: alias found, but event not supported by HW: " ,
pctr ) ;
continue ;
}
if ( ! regno_is_valid ( pctr , regno ) )
{
hwcentry_print ( 1 , " hwctable: stdlist_find_by_name(): "
" WARNING: alias found, but regno doesn't match: " ,
pctr ) ;
continue ;
}
return pctr ;
}
}
return NULL ;
}
/* search the 'standard' list of counters for <name>,<regno> */
/* note: <regno>=REGNO_ANY is a wildcard that matches any value. */
static const Hwcentry *
static_table_find ( const Hwcentry * table , const char * name , const char * int_name ,
int check_regno , regno_t regno )
{
int sz ;
for ( sz = 0 ; table & & table [ sz ] . name ; sz + + )
;
if ( ! sz )
return NULL ;
const Hwcentry * * list = calloc ( sz + 1 , sizeof ( void * ) ) ;
if ( ! list )
return NULL ;
for ( int ii = 0 ; ii < sz ; ii + + )
list [ ii ] = & table [ ii ] ;
list [ sz ] = NULL ;
const Hwcentry * pctr = ptrarray_find ( list , name , int_name , check_regno , regno ) ;
free ( list ) ;
return pctr ;
}
# if !HWC_DEBUG
# define stdlist_print(dbg_lvl,table)
# else
/* print all Hwcentries in standard table. Check for weird stuff */
static void
stdlist_print ( int dbg_lvl , const Hwcentry * table )
{
const Hwcentry * pctr ;
if ( ! table )
{
Tprintf ( 0 , " hwctable: stdlist_print: ERROR: "
" table is invalid. \n " ) ;
return ;
}
for ( pctr = table ; pctr - > name ; pctr + + )
{
int ii ;
hwcentry_print ( dbg_lvl , " hwctable: stdlist: " , pctr ) ;
if ( REG_LIST_IS_EMPTY ( pctr - > reg_list ) )
{
if ( pctr - > int_name | | ! pctr - > metric )
hwcentry_print ( DBG_LT1 , " hwctable: stdlist_print: WARNING: "
" no hardware event found for table entry " , pctr ) ;
continue ;
}
/* check if incorrect reg_num used in table */
if ( ! regno_is_valid ( pctr , pctr - > reg_num ) )
{
hwcentry_print ( DBG_LT0 , " hwctable: stdlist_print: ERROR: "
" reg_num is not in table. " , pctr ) ;
continue ;
}
for ( ii = 0 ; ii < MAX_PICS ; ii + + )
{
regno_t regno = pctr - > reg_list [ ii ] ;
if ( REG_LIST_EOL ( regno ) )
break ;
}
if ( ii > 1 & & pctr - > reg_num ! = REGNO_ANY )
{
/* several regnos were valid, but only one can be specified */
if ( pctr - > metric | | ! pctr - > int_name )
{
/* pctr is standard or a raw definition */
/* (pctr is not an alias like cycles0) */
hwcentry_print ( DBG_LT0 , " hwctable: stdlist_print: ERROR: "
" regno in table should have been REGNO_ANY. " ,
pctr ) ;
}
}
}
}
# endif
/*---------------------------------------------------------------------------*/
/* utilities for init */
/* try to bind counters to hw. Return 0 on success, nonzero otherwise */
static int
test_hwcs ( const Hwcentry * entries [ ] , unsigned numctrs )
{
int rc = - 1 ;
hwc_event_t sample ;
int created = 0 ;
hwcdrv_api_t * hwcdrv = get_hwcdrv ( ) ;
Tprintf ( DBG_LT2 , " hwctable: test_hwcs()... \n " ) ;
rc = hwcfuncs_bind_hwcentry ( entries , numctrs ) ;
if ( rc )
{
Tprintf ( 0 , " hwctable: WARNING: test "
" counters could not be created \n " ) ;
goto end_test_hwcs ;
}
created = 1 ;
if ( ! signals_disabled )
{
( void ) signal ( HWCFUNCS_SIGNAL , SIG_IGN ) ;
signals_disabled = 1 ;
}
rc = hwcdrv - > hwcdrv_start ( ) ;
if ( rc )
{
Tprintf ( 0 , " hwctable: WARNING: test "
" counters could not be started \n " ) ;
goto end_test_hwcs ;
}
rc = hwcdrv - > hwcdrv_read_events ( & sample , NULL ) ;
if ( rc )
Tprintf ( 0 , " hwctable: WARNING: test sample failed \n " ) ;
rc = 0 ;
# if HWC_DEBUG
{
unsigned ii ;
Tprintf ( DBG_LT1 , " hwctable: test_hwcs( " ) ;
for ( ii = 0 ; ii < numctrs ; ii + + )
Tprintf ( DBG_LT1 , " %s%s " , ii ? " , " : " " , entries [ ii ] - > name ) ;
Tprintf ( DBG_LT1 , " ) PASS \n " ) ;
}
# endif
end_test_hwcs :
if ( created & & hwcdrv - > hwcdrv_free_counters ( ) )
Tprintf ( 0 , " hwctable: WARNING: test counters could not be freed \n " ) ;
return rc ;
}
# if !HWC_DEBUG
# define check_tables()
# else
/* check for typos in tables */
static void
check_tables ( )
{
int i ;
/* now search the known table of counters */
for ( i = 0 ; ; i + + )
{
Hwcentry * pentry ;
int cputag = cputabs [ i ] . cputag ;
if ( cputag = = 0 )
break ;
if ( cputag = = CPC_KPROF )
continue ;
pentry = cputabs [ i ] . stdlist_table ;
for ( ; pentry ; pentry + + )
{
if ( ! pentry - > name )
break ;
if ( ! pentry - > int_name )
{ /* internal, only to supply ABST and timecvt */
if ( pentry - > metric )
Tprintf ( DBG_LT0 , " hwctable: check_tables: ERROR: "
" internal && metric @%d, %s \n " , cputag , pentry - > name ) ;
if ( pentry - > reg_num ! = REGNO_ANY )
Tprintf ( DBG_LT1 , " hwctable: check_tables: WARNING: "
" internal && reg_num!=REGNO_ANY @%d, %s \n " ,
cputag , pentry - > name ) ;
if ( pentry - > val ! = PRELOAD_DEF
& & pentry - > memop ! = ABST_EXACT_PEBS_PLUS1 )
Tprintf ( DBG_LT2 , " hwctable: check_tables: INFO: "
" internal && custom val=%d @%d, %s \n " ,
pentry - > val , cputag , pentry - > name ) ;
#if 0
if ( ! pentry - > timecvt & & pentry - > memop = = ABST_NONE )
Tprintf ( DBG_LT0 , " hwctable: check_tables: ERROR: "
" internal && not special! @%d, %s \n " ,
cputag , pentry - > name ) ;
# endif
}
if ( pentry - > metric )
{ /* aliased */
if ( ! pentry - > int_name )
Tprintf ( DBG_LT0 , " hwctable: check_tables: ERROR: "
" aliased && !int_name @%d, %s \n " , cputag , pentry - > name ) ;
#if 0
else if ( ! strcmp ( pentry - > name , pentry - > int_name ) )
Tprintf ( DBG_LT0 , " hwctable: check_tables: ERROR: "
" name==int_name @%d, %s \n " ,
cputag , pentry - > name ) ;
# endif
if ( pentry - > reg_num ! = REGNO_ANY & & pentry - > reg_num ! = REGNO_INVALID )
Tprintf ( DBG_LT1 , " hwctable: check_tables: INFO: "
" aliased && custom reg_num==%d @%d, %s \n " ,
pentry - > reg_num , cputag , pentry - > name ) ;
if ( pentry - > reg_num = = REGNO_INVALID )
Tprintf ( DBG_LT2 , " hwctable: check_tables: INFO: "
" aliased && reg_num==REGNO_INVALID @%d, %s \n " ,
cputag , pentry - > name ) ;
}
if ( pentry - > int_name & & ! pentry - > metric )
{ /* convenience */
if ( ! strcmp ( pentry - > name , pentry - > int_name ) )
Tprintf ( DBG_LT0 , " hwctable: check_tables: ERROR: "
" convenience && name==int_name @%d, %s \n " ,
cputag , pentry - > name ) ;
if ( pentry - > reg_num = = REGNO_ANY )
Tprintf ( DBG_LT0 , " hwctable: check_tables: ERROR: "
" convenience && reg_num==REGNO_ANY @%d, %s \n " ,
cputag , pentry - > name ) ;
}
}
}
}
# endif
static int try_a_counter ( ) ;
static void hwc_process_raw_ctrs ( int forKernel , Hwcentry * * * pstd_out ,
Hwcentry * * * praw_out , Hwcentry * * * phidden_out ,
Hwcentry * * static_tables ,
Hwcentry * * raw_unfiltered_in ) ;
/* internal call to initialize libs, ctr tables */
static void
setup_cpc_general ( int skip_hwc_test )
{
const cpu_list_t * cputabs_entry ;
int rc = - 1 ;
Tprintf ( DBG_LT2 , " hwctable: setup_cpc()... \n " ) ;
if ( initialized )
{
Tprintf ( 0 , " hwctable: WARNING: setup_cpc() has already been called \n " ) ;
return ;
}
initialized = 1 ;
cpcx_cpuver = CPUVER_UNDEFINED ;
cpcx_cciname = NULL ;
cpcx_npics = 0 ;
cpcx_docref = NULL ;
cpcx_support_bitmask = 0 ;
for ( int kk = 0 ; kk < 2 ; kk + + )
{ // collect-0 and kernel-1
cpcx_attrs [ kk ] = NULL ;
cpcx_std [ kk ] = NULL ;
cpcx_raw [ kk ] = NULL ;
cpcx_hidden [ kk ] = NULL ;
cpcx_max_concurrent [ kk ] = 0 ;
cpcx_default_hwcs [ kk ] = NULL ;
cpcx_orig_default_hwcs [ kk ] = NULL ;
cpcx_has_precise [ kk ] = 0 ;
}
check_tables ( ) ;
hwcdrv_api_t * hwcdrv = get_hwcdrv ( ) ;
if ( hwcdrv - > hwcdrv_init_status )
{
Tprintf ( 0 , " WARNING: setup_cpc_general() failed. init_status=%d \n " ,
hwcdrv - > hwcdrv_init_status ) ;
goto setup_cpc_wrapup ;
}
hwcdrv - > hwcdrv_get_info ( & cpcx_cpuver , & cpcx_cciname , & cpcx_npics ,
& cpcx_docref , & cpcx_support_bitmask ) ;
# ifdef DISALLOW_USI_USII_6357446
if ( cpcx_cpuver = = CPC_ULTRA1 | | cpcx_cpuver = = CPC_ULTRA2 )
{
Tprintf ( 0 , " hwctable: WARNING: setup_cpc(): cpu=%d "
" US-I/US-II cannot provide profile interrupts \n " , cpcx_cpuver ) ;
/* profiling interrupts don't work on US-I, US-II */
hwcfuncs_int_logerr ( GTXT ( " UltraSPARC I and II cannot provide overflow interrupts \n " ) ) ;
goto setup_cpc_wrapup ;
}
# endif
# ifdef DISALLOW_PENTIUM_PRO_MMX_7007575
if ( cpcx_cpuver = = CPC_PENTIUM_PRO_MMX )
{
Tprintf ( 0 , " hwctable: WARNING: setup_cpc(): cpu=%d "
" `Pentium Pro with MMX, Pentium II' is not supported \n " , cpcx_cpuver ) ;
hwcfuncs_int_logerr ( GTXT ( " libcpc cannot identify processor type \n " ) ) ;
goto setup_cpc_wrapup ;
}
# endif
/* now search the known table of counters */
cputabs_entry = cputabs_find_entry ( cpcx_cpuver ) ;
if ( cputabs_entry = = NULL )
{
Tprintf ( 0 , " hwctable: WARNING: setup_cpc(): cpu=%d "
" could not be found in the tables \n " , cpcx_cpuver ) ;
/* strange, should have at least selected "unknownlist" */
hwcfuncs_int_logerr ( GTXT ( " Analyzer CPU table could not be found \n " ) ) ;
goto setup_cpc_wrapup ;
}
Hwcentry * valid_cpu_tables [ 2 ] ; // [0]:static table of counters, [1]:static table of generic counters
valid_cpu_tables [ 0 ] = cputabs_entry - > stdlist_table ;
if ( valid_cpu_tables [ 0 ] = = NULL )
{
Tprintf ( 0 , " hwctable: WARNING: setup_cpc(): "
" valid_cpu_tables was NULL?? \n " ) ;
/* strange, someone put a NULL in the lookup table? */
hwcfuncs_int_logerr ( GTXT ( " Analyzer CPU table is invalid \n " ) ) ;
goto setup_cpc_wrapup ;
}
valid_cpu_tables [ 1 ] = papi_generic_list ;
Tprintf ( DBG_LT2 , " hwctable: setup_cpc(): getting descriptions \n " ) ;
// populate cpcx_raw and cpcx_attr
hwcdrv - > hwcdrv_get_descriptions ( hwc_cb , attrs_cb ) ;
for ( int kk = 0 ; kk < 2 ; kk + + )
{ // collect and er_kernel
hwc_process_raw_ctrs ( kk , & cpcx_std [ kk ] , & cpcx_raw [ kk ] , & cpcx_hidden [ kk ] ,
valid_cpu_tables , ( Hwcentry * * ) unfiltered_raw . array ) ;
cpcx_has_precise [ kk ] = 0 ;
for ( int rr = 0 ; cpcx_raw [ kk ] & & cpcx_raw [ kk ] [ rr ] ; rr + + )
{
int memop = cpcx_raw [ kk ] [ rr ] - > memop ;
if ( ABST_MEMSPACE_ENABLED ( memop ) )
{
cpcx_has_precise [ kk ] = 1 ;
break ;
}
}
cpcx_attrs [ kk ] = ( char * * ) unfiltered_attrs . array ;
cpcx_max_concurrent [ kk ] = cpcx_npics ;
}
# if 1 // 22897042 - DTrace cpc provider does not support profiling on multiple ctrs on some systems
if ( ( cpcx_support_bitmask & HWCFUNCS_SUPPORT_OVERFLOW_CTR_ID ) ! = HWCFUNCS_SUPPORT_OVERFLOW_CTR_ID )
{
// kernel profiling only supports one counter if overflowing counter can't be identified
cpcx_max_concurrent [ 1 ] = cpcx_npics ? 1 : 0 ;
}
# endif
/* --- quick test of the cpc interface --- */
if ( skip_hwc_test )
rc = 0 ;
else
rc = try_a_counter ( 0 ) ;
/* initialize the default counter string definition */
for ( int kk = 0 ; kk < 2 ; kk + + )
{
char * default_exp = 0 ;
int jj ;
for ( jj = 0 ; ( default_exp = cputabs_entry - > default_exp_p [ jj ] ) ; jj + + )
{
int rc = hwc_lookup ( kk , 0 , default_exp , NULL , 0 , NULL , NULL ) ;
if ( rc > 0 )
break ;
}
if ( ! default_exp )
{
char * fallback [ 3 ] = { NTXT ( " insts,,cycles,,l3m " ) , NTXT ( " insts,,cycles " ) , NTXT ( " insts " ) } ;
for ( int ff = 0 ; ff < 3 ; ff + + )
{
int rc = hwc_lookup ( kk , 0 , fallback [ ff ] , NULL , 0 , NULL , NULL ) ;
if ( rc > 0 )
{
default_exp = strdup ( fallback [ ff ] ) ;
break ;
}
}
}
cpcx_default_hwcs [ kk ] = default_exp ;
cpcx_orig_default_hwcs [ kk ] = default_exp ;
}
setup_cpc_wrapup :
if ( rc )
{
cpcx_npics = 0 ;
/*
ptr_list_free ( & tmp_raw ) ; // free stuff... YXXX
ptr_list_free ( & unfiltered_attrs ) ;
*/
}
return ;
}
static void
setup_cpcx ( )
{
if ( initialized )
return ;
setup_cpc_general ( 0 ) ; // set up and include a hwc test run
}
static void
setup_cpc_skip_hwctest ( )
{
if ( initialized )
return ;
setup_cpc_general ( 1 ) ; // set up but skip hwc test run
}
static int
try_a_counter ( int forKernel )
{
if ( ! VALID_FOR_KERNEL ( forKernel ) )
return - 1 ;
int rc = - 1 ;
const Hwcentry * testevent ;
if ( cpcx_std [ forKernel ] = = NULL )
{
Tprintf ( 0 , " hwctable: WARNING: cpcx_std not initialized " ) ;
return 0 ; /* consider this an automatic PASS */
}
/* look for a valid table entry, only try valid_cpu_tables[0] */
{
testevent = cpcx_std [ forKernel ] [ 0 ] ;
if ( ! testevent | | ! testevent - > name )
{
Tprintf ( 0 , " hwctable: WARNING: no test metric "
" available to verify counters \n " ) ;
return 0 ; /* consider this an automatic PASS */
}
if ( REG_LIST_IS_EMPTY ( testevent - > reg_list ) )
return 0 ; // weird
}
Hwcentry tmp_testevent ;
tmp_testevent = * testevent ; /* shallow copy */
if ( tmp_testevent . int_name = = NULL )
{
/* counter is defined in 'hidden' section of table, supply int_name */
tmp_testevent . int_name = strdup ( tmp_testevent . name ) ;
}
Hwcentry * test_array [ 1 ] = { & tmp_testevent } ;
rc = hwcfuncs_assign_regnos ( test_array , 1 ) ; /* may modify test_array */
if ( rc )
return rc ;
rc = test_hwcs ( ( const Hwcentry * * ) test_array , 1 ) ;
if ( rc = = HWCFUNCS_ERROR_UNAVAIL )
{
// consider this a pass (allow HWC table to be printed)
Tprintf ( 0 , " hwctable: WARNING: "
" cpc_bind_event() shows counters busy; allow to continue \n " ) ;
return 0 ;
}
else if ( rc )
{
// failed to start for some other reason
Tprintf ( 0 , " hwctable: WARNING: "
" test of counter '%s' failed \n " ,
testevent - > name ) ;
return rc ;
}
return 0 ;
}
void
hwc_update_val ( Hwcentry * hwc )
{
if ( hwc - > ref_val = = 0 )
hwc - > ref_val = hwc - > val ; // save original reference
int64_t newVal ;
hrtime_t min_time_nsec = hwc - > min_time ;
if ( min_time_nsec = = HWCTIME_TBD )
min_time_nsec = hwc - > min_time_default ;
switch ( min_time_nsec )
{
case 0 : // disable time-based intervals
// do not modify val
return ;
case HWCTIME_ON :
case HWCTIME_TBD :
newVal = HWC_VAL_ON ( hwc - > ref_val ) ;
break ;
case HWCTIME_LO :
newVal = HWC_VAL_LO ( hwc - > ref_val ) ;
break ;
case HWCTIME_HI :
newVal = HWC_VAL_HI ( hwc - > ref_val ) ;
break ;
default :
newVal = HWC_VAL_CUSTOM ( hwc - > ref_val , min_time_nsec ) ;
break ;
}
# define MAX_INT_VAL (2*1000*1000*1000 + 1000100) // yuck, limited to signed int
if ( newVal > = MAX_INT_VAL )
newVal = MAX_INT_VAL ;
hwc - > val = newVal ;
}
/* convert value string to value and store result in hwc->val */
/* This function moved here from collctrl.cc */
/*
* Keep the HWCTIME_ * definitions in sync with those in
* collctrl . cc Coll_Ctrl : : add_hwcstring ( ) .
*/
static int
set_hwcval ( Hwcentry * hwc , hrtime_t global_min_time_nsec , const char * valptr )
{
hwc - > min_time_default = global_min_time_nsec ;
if ( hwc - > val = = 1 )
{
// An interval of 1 is used for certain types of count data.
// (er_bit, er_generic, er_rock ...)
// Hi and Lo do not apply.
/* use the default */
}
else if ( valptr = = NULL | | valptr [ 0 ] = = 0 | | strcmp ( valptr , " auto " ) = = 0 )
hwc - > min_time = HWCTIME_TBD ;
else if ( strcmp ( valptr , " on " ) = = 0 )
hwc - > min_time = HWCTIME_ON ;
else if ( strcmp ( valptr , " lo " ) = = 0 | | strcmp ( valptr , " low " ) = = 0 )
hwc - > min_time = HWCTIME_LO ;
else if ( strcmp ( valptr , " hi " ) = = 0 | | strcmp ( valptr , " high " ) = = 0
| | strcmp ( valptr , " h " ) = = 0 )
hwc - > min_time = HWCTIME_HI ;
else
{
/* the remaining string should be a number > 0 */
char * endchar = NULL ;
long long tmp = strtoll ( valptr , & endchar , 0 ) ;
int value = ( int ) tmp ;
if ( * endchar ! = 0 | | tmp < = 0 | | value ! = tmp )
{
// also covers errno == ERANGE
Tprintf ( 0 , " hwctable: set_hwcval(): ERROR: "
" Invalid counter value %s for counter `%s' \n " ,
valptr , hwc - > name ) ;
return - 1 ;
}
if ( tmp > UINT32_MAX / 2 )
{
/* Roch B. says that we MUST do this check for er_kernel
because some platforms deliver overflow interrupts without
identifying which counter overflowed . The only way to
determine which counter overflowed is to have enough
margin on 32 bit counters to make sure they don ' t
wrap .
*/
Tprintf ( 0 , " hwctable: set_hwcval(): ERROR: "
" Counter value %s exceeds %lu \n " ,
valptr , ( unsigned long ) UINT32_MAX / 2 ) ;
return - 1 ;
}
/* set the value */
if ( value ! = 0 )
{
if ( hwc - > ref_val = = 0 )
hwc - > ref_val = hwc - > val ; // save original reference
hwc - > val = value ;
hwc - > min_time = 0 ; // turn off auto-adjust
}
}
hwc_update_val ( hwc ) ;
return 0 ;
}
static char *
canonical_name ( const char * counter )
{
char * nameOnly = NULL ;
char * attrs = NULL ;
char tmpbuf [ 1024 ] ;
tmpbuf [ 0 ] = 0 ;
hwcfuncs_parse_ctr ( counter , NULL , & nameOnly , & attrs , NULL , NULL ) ;
snprintf ( tmpbuf + strlen ( tmpbuf ) , sizeof ( tmpbuf ) - strlen ( tmpbuf ) ,
" %s " , nameOnly ) ;
if ( attrs )
{
hwcfuncs_attr_t cpc2_attrs [ HWCFUNCS_MAX_ATTRS ] ;
void * attr_mem ;
unsigned nattrs ;
int ii , jj ;
/* extract attributes from counter */
attr_mem = hwcfuncs_parse_attrs ( counter , cpc2_attrs , HWCFUNCS_MAX_ATTRS ,
& nattrs , NULL ) ;
if ( ! attr_mem )
{
snprintf ( tmpbuf + strlen ( tmpbuf ) , sizeof ( tmpbuf ) - strlen ( tmpbuf ) ,
" ~UNKNOWN " ) ;
goto canonical_attrs_wrapup ;
}
/* sort the attributes */
for ( ii = 0 ; ii < ( int ) nattrs - 1 ; ii + + )
{
for ( jj = ii + 1 ; jj < nattrs ; jj + + )
{
int cmp = strcmp ( cpc2_attrs [ ii ] . ca_name ,
cpc2_attrs [ jj ] . ca_name ) ;
if ( cmp > 0 )
{
hwcfuncs_attr_t tmp = cpc2_attrs [ jj ] ;
cpc2_attrs [ jj ] = cpc2_attrs [ ii ] ;
cpc2_attrs [ ii ] = tmp ;
}
}
}
/* print attributes in canonical format */
for ( ii = 0 ; ii < nattrs ; ii + + )
snprintf ( tmpbuf + strlen ( tmpbuf ) , sizeof ( tmpbuf ) - strlen ( tmpbuf ) ,
" ~%s=0x%llx " , cpc2_attrs [ ii ] . ca_name , ( long long ) cpc2_attrs [ ii ] . ca_val ) ;
free ( attr_mem ) ;
}
canonical_attrs_wrapup :
free ( nameOnly ) ;
free ( attrs ) ;
return strdup ( tmpbuf ) ;
}
/* process counter and value strings - put results in <*pret_ctr> */
/* Print errors to UEbuf for any failure that results in nonzero return */
static int
process_ctr_def ( int forKernel , hrtime_t global_min_time_nsec ,
const char * counter , const char * value , Hwcentry * pret_ctr ,
char * UWbuf , size_t UWsz , char * UEbuf , size_t UEsz )
{
int rc = - 1 ;
char * nameOnly = NULL ;
char * attrs = NULL ;
char * regstr = NULL ;
int plus ;
regno_t regno ;
const Hwcentry * pfound = NULL ;
const char * uname = NULL ;
int disable_backtrack ;
UEbuf [ 0 ] = 0 ;
UWbuf [ 0 ] = 0 ;
Tprintf ( DBG_LT3 , " hwctable: process_ctr_def(): counter=%s value=%s \n " ,
counter , value ? value : " NULL " ) ;
hwcfuncs_parse_ctr ( counter , & plus , & nameOnly , & attrs , & regstr , & regno ) ;
/* search for the counter in the std and raw lists */
{
pfound = ptrarray_find ( ( const Hwcentry * * ) cpcx_std [ forKernel ] , nameOnly , NULL , 1 , regno ) ;
if ( pfound )
hwcentry_print ( DBG_LT1 , " hwctable: process_ctr_def: found in stdlist: " ,
pfound ) ;
}
if ( ! pfound )
{
pfound = ptrarray_find ( ( const Hwcentry * * ) cpcx_hidden [ forKernel ] , nameOnly , NULL , 1 , regno ) ;
if ( pfound )
hwcentry_print ( DBG_LT1 , " hwctable: process_ctr_def: found in stdlist(hidden): " , pfound ) ;
}
if ( ! pfound )
{
pfound = ptrarray_find_by_name ( cpcx_raw [ forKernel ] , nameOnly ) ; /* (regno match checked later) */
if ( pfound )
hwcentry_print ( DBG_LT1 , " hwctable: process_ctr_def: found in rawlist: " , pfound ) ;
}
if ( ! pfound )
{
pfound = ptrarray_find ( ( const Hwcentry * * ) cpcx_std [ forKernel ] , nameOnly , NULL , 1 , REGNO_ANY ) ;
if ( pfound )
hwcentry_print ( DBG_LT1 , " hwctable: process_ctr_def: found in stdlist but regno didn't match: " , pfound ) ;
}
if ( ! pfound )
{
pfound = ptrarray_find ( ( const Hwcentry * * ) cpcx_hidden [ forKernel ] , nameOnly , NULL , 1 , REGNO_ANY ) ;
if ( pfound )
hwcentry_print ( DBG_LT1 , " hwctable: process_ctr_def: found in stdlist(hidden) but regno didn't match: " , pfound ) ;
}
if ( ! pfound )
{
uint64_t val = 0 ;
if ( is_numeric ( nameOnly , & val ) )
{
Hwcentry * tmp = alloc_shallow_copy ( & empty_ctr ) ; // Leaks?
if ( tmp )
{
tmp - > name = strdup ( nameOnly ) ;
regno_add ( tmp , REGNO_ANY ) ;
pfound = tmp ;
}
}
if ( pfound )
hwcentry_print ( DBG_LT1 , " hwctable: process_ctr_def: counter specified by numeric value: " , pfound ) ;
}
if ( ! pfound )
{
snprintf ( UEbuf + strlen ( UEbuf ) , UEsz - strlen ( UEbuf ) ,
GTXT ( " Invalid HW counter name: %s \n " ) , nameOnly ) ;
snprintf ( UEbuf + strlen ( UEbuf ) , UEsz - strlen ( UEbuf ) ,
GTXT ( " Run \" %s -h \" with no other arguments for more information on HW counters on this system. \n " ) ,
( IS_KERNEL ( forKernel ) ? " er_kernel " : " collect " ) ) ;
goto process_ctr_def_wrapup ;
}
/* counter found */
* pret_ctr = * pfound ; /* shallow copy */
pret_ctr - > int_name = NULL ; /* so free doesn't try to free these pfound's ptrs */
pret_ctr - > name = NULL ; /* so free doesn't try to free these pfound's ptrs */
/* update uname,memop */
uname = counter ;
disable_backtrack = 0 ;
if ( plus ! = 0 | | ABST_PLUS_BY_DEFAULT ( pret_ctr - > memop ) )
{
// attempt to process memoryspace profiling
int message_printed = 0 ;
if ( cpcx_cpuver = = CPUVER_GENERIC )
{
// accept plus, since we don't know what this CPU is
snprintf ( UEbuf + strlen ( UEbuf ) , UEsz - strlen ( UEbuf ) ,
GTXT ( " `+' may not be correctly supported on `%s' because processor is not recognized. " ) ,
cpcx_cciname ) ;
pret_ctr - > memop = ABST_LDST ; // supply a backtracking data type - required for collector
}
else if ( cpcx_cpuver = = CPC_ULTRA1 | | cpcx_cpuver = = CPC_ULTRA2
| | cpcx_cpuver = = CPC_ULTRA3 | | cpcx_cpuver = = CPC_ULTRA3_PLUS
| | cpcx_cpuver = = CPC_ULTRA3_I | | cpcx_cpuver = = CPC_ULTRA4_PLUS
| | cpcx_cpuver = = CPC_ULTRA4 | | cpcx_cpuver = = CPC_ULTRA_T1
| | cpcx_cpuver = = CPC_ULTRA_T2 | | cpcx_cpuver = = CPC_ULTRA_T2P
| | cpcx_cpuver = = CPC_ULTRA_T3 )
{
if ( ! ABST_BACKTRACK_ENABLED ( pret_ctr - > memop ) )
disable_backtrack = 1 ;
}
else if ( cpcx_cpuver = = CPC_SPARC_T4 | | cpcx_cpuver = = CPC_SPARC_T5
| | cpcx_cpuver = = CPC_SPARC_T6 | | cpcx_cpuver = = CPC_SPARC_M4
| | cpcx_cpuver = = CPC_SPARC_M5 | | cpcx_cpuver = = CPC_SPARC_M6
| | cpcx_cpuver = = CPC_SPARC_M7 | | cpcx_cpuver = = CPC_SPARC_M8 )
{
if ( pret_ctr - > memop ! = ABST_EXACT )
disable_backtrack = 1 ;
}
else if ( cpcx_cpuver = = CPC_INTEL_NEHALEM | | cpcx_cpuver = = CPC_INTEL_WESTMERE
| | cpcx_cpuver = = CPC_INTEL_SANDYBRIDGE
| | cpcx_cpuver = = CPC_INTEL_IVYBRIDGE
| | cpcx_cpuver = = CPC_INTEL_HASWELL
| | cpcx_cpuver = = CPC_INTEL_BROADWELL
| | cpcx_cpuver = = CPC_INTEL_SKYLAKE )
{
if ( pret_ctr - > memop ! = ABST_EXACT_PEBS_PLUS1 )
disable_backtrack = 1 ;
else if ( plus < 0 )
{
// disabling memoryspace not supported for
// remove specified -
uname + + ;
plus = 0 ;
snprintf ( UWbuf + strlen ( UWbuf ) , UWsz - strlen ( UWbuf ) ,
GTXT ( " Warning: `-' is not supported on `%s' -- memory reference backtracking will remain enabled for this counter \n " ) ,
nameOnly ) ;
}
}
else
{
message_printed = 1 ;
snprintf ( UWbuf + strlen ( UWbuf ) , UWsz - strlen ( UWbuf ) ,
GTXT ( " Warning: `+' is not supported on `%s' -- memory reference backtracking will not be enabled for `%s' \n " ) ,
cpcx_cciname , nameOnly ) ;
disable_backtrack = 1 ;
}
if ( disable_backtrack )
{
if ( plus ! = 0 )
uname + + ; // remove specified + or -
if ( ! message_printed & & plus > 0 )
snprintf ( UWbuf + strlen ( UWbuf ) , UWsz - strlen ( UWbuf ) ,
GTXT ( " Warning: `+' is not supported on `%s' -- memory reference backtracking will not be enabled for this counter \n " ) ,
nameOnly ) ;
}
}
else
disable_backtrack = 1 ;
if ( disable_backtrack | | plus < 0 )
if ( pret_ctr - > memop ! = ABST_NOPC )
pret_ctr - > memop = ABST_NONE ;
if ( pret_ctr - > memop = = ABST_NOPC )
snprintf ( UWbuf + strlen ( UWbuf ) , UWsz - strlen ( UWbuf ) ,
GTXT ( " Warning: HW counter `%s' is not program-related -- callstacks will be not be recorded for this counter \n " ) ,
uname ) ;
/* update reg_num */
if ( ! regno_is_valid ( pfound , regno ) )
{
char buf [ 1024 ] ;
snprintf ( UEbuf + strlen ( UEbuf ) , UEsz - strlen ( UEbuf ) ,
GTXT ( " For counter `%s', %s is not a valid register; valid registers: %s \n " ) ,
nameOnly , regstr ? regstr + 1 : " ? " ,
get_regnolist ( buf , sizeof ( buf ) , pfound - > reg_list , 1 ) ) ;
goto process_ctr_def_wrapup ;
}
if ( pret_ctr - > reg_num = = REGNO_ANY )
{ /* table's regno is a wildcard */
if ( REG_LIST_EOL ( pfound - > reg_list [ 1 ] ) )
{
/* valid list only contains one regno, so use it */
pret_ctr - > reg_num = pfound - > reg_list [ 0 ] ;
}
else
pret_ctr - > reg_num = regno ; /* use user's selection */
}
/* update name and int_name */
{
// validate attributes
if ( attrs )
{
hwcfuncs_attr_t cpc2_attrs [ HWCFUNCS_MAX_ATTRS ] ;
void * attr_mem ;
unsigned nattrs ;
char * errbuf ;
/* extract attributes from uname */
attr_mem = hwcfuncs_parse_attrs ( uname , cpc2_attrs , HWCFUNCS_MAX_ATTRS ,
& nattrs , & errbuf ) ;
if ( ! attr_mem )
{
snprintf ( UEbuf + strlen ( UEbuf ) , UEsz - strlen ( UEbuf ) ,
" %s \n " , errbuf ) ;
free ( errbuf ) ;
goto process_ctr_def_wrapup ;
}
/* make sure all attributes are valid */
for ( unsigned ii = 0 ; ii < nattrs ; ii + + )
{
if ( ! attr_is_valid ( forKernel , cpc2_attrs [ ii ] . ca_name ) )
{
snprintf ( UEbuf + strlen ( UEbuf ) , UEsz - strlen ( UEbuf ) ,
GTXT ( " Invalid attribute specified for counter `%s': %s \n " ) ,
nameOnly , cpc2_attrs [ ii ] . ca_name ) ;
snprintf ( UEbuf + strlen ( UEbuf ) , UEsz - strlen ( UEbuf ) ,
GTXT ( " Run \" %s -h \" with no other arguments for more information on HW counters on this system. \n " ) ,
( IS_KERNEL ( forKernel ) ? " er_kernel " : " collect " ) ) ;
free ( attr_mem ) ;
goto process_ctr_def_wrapup ;
}
for ( unsigned jj = ii + 1 ; jj < nattrs ; jj + + )
{
if ( strcmp ( cpc2_attrs [ ii ] . ca_name ,
cpc2_attrs [ jj ] . ca_name ) = = 0 )
{
snprintf ( UEbuf + strlen ( UEbuf ) , UEsz - strlen ( UEbuf ) ,
GTXT ( " Duplicate attribute specified for counter `%s': %s \n " ) ,
nameOnly , cpc2_attrs [ ii ] . ca_name ) ;
free ( attr_mem ) ;
goto process_ctr_def_wrapup ;
}
}
}
free ( attr_mem ) ;
}
pret_ctr - > name = strdup ( uname ) ;
// assign int_name
if ( pfound - > int_name )
{
// Counter is one of the following:
// - aliased (e.g. cycles~system=1),
// - convenience (e.g. cycles0~system=1),
if ( ! attrs ) // convert alias to internal name
pret_ctr - > int_name = strdup ( pfound - > int_name ) ;
else
{
// convert alias to internal name and
// append user-supplied attributes
size_t sz = strlen ( pfound - > int_name ) + strlen ( attrs ) + 1 ;
char * tbuf = calloc ( sz , 1 ) ;
if ( tbuf )
snprintf ( tbuf , sz , " %s%s " , pfound - > int_name , attrs ) ;
pret_ctr - > int_name = tbuf ;
}
}
else
pret_ctr - > int_name = strdup ( uname ) ; // user-supplied name
}
/* update val */
if ( set_hwcval ( pret_ctr , global_min_time_nsec , value ) )
{
snprintf ( UEbuf + strlen ( UEbuf ) , UEsz - strlen ( UEbuf ) ,
GTXT ( " Invalid interval for HW counter `%s': %s \n " ) ,
nameOnly , value ) ;
goto process_ctr_def_wrapup ;
}
hwcentry_print ( DBG_LT2 , " hwctable: process_ctr_def: " , pret_ctr ) ;
rc = 0 ;
process_ctr_def_wrapup :
free ( regstr ) ;
free ( attrs ) ;
free ( nameOnly ) ;
return rc ;
}
/*---------------------------------------------------------------------------*/
/* external interfaces, see hwcentry.h for descriptions. */
extern int
hwc_lookup ( int forKernel , hrtime_t global_min_time_nsec , const char * instring ,
Hwcentry * caller_entries [ ] , unsigned maxctrs , char * * emsg , char * * wmsg )
{
unsigned ii ;
char * instr_copy = NULL , * ss = NULL ;
unsigned numctrs = 0 ;
int rc = 0 ;
char * tokenptr [ MAX_PICS * 2 ] ;
unsigned numtokens = 0 ;
char UEbuf [ 1024 * 5 ] ; /* error message buffer; strdup of it is passed back to user */
char UWbuf [ 1024 * 5 ] ; /* warning message buffer; strdup of it is passed back to user */
if ( emsg )
* emsg = NULL ;
if ( wmsg )
* wmsg = NULL ;
UEbuf [ 0 ] = 0 ;
UWbuf [ 0 ] = 0 ;
// supply temporary result buffers as needed
Hwcentry tmp_entry_table [ MAX_PICS ] ;
Hwcentry * tmp_entries [ MAX_PICS ] ;
Hwcentry * * entries ;
if ( caller_entries )
entries = caller_entries ;
else
{
// user doesn't care about results; provide temporary storage for results
for ( ii = 0 ; ii < MAX_PICS ; ii + + )
tmp_entries [ ii ] = & tmp_entry_table [ ii ] ;
entries = tmp_entries ;
maxctrs = MAX_PICS ;
}
Tprintf ( DBG_LT1 , " hwctable: hwc_lookup(%s) \n " ,
instring ? instring : " NULL " ) ;
/* clear <entries> first - prevent seg faults in hwc_lookup_wrapup */
for ( ii = 0 ; ii < maxctrs ; ii + + )
* entries [ ii ] = empty_ctr ;
if ( ! instring )
{
snprintf ( UEbuf + strlen ( UEbuf ) , sizeof ( UEbuf ) - strlen ( UEbuf ) ,
GTXT ( " No HW counters were specified. " ) ) ;
rc = - 1 ;
goto hwc_lookup_wrapup ;
}
/* make sure tables are initialized */
setup_cpc_skip_hwctest ( ) ;
if ( cpcx_npics = = 0 )
{
if ( cpcx_cpuver < 0 )
{
char buf [ 1024 ] ;
* buf = 0 ;
char * pch = hwcfuncs_errmsg_get ( buf , sizeof ( buf ) , 0 ) ; /* get first err msg, disable capture */
if ( * pch )
snprintf ( UEbuf + strlen ( UEbuf ) , sizeof ( UEbuf ) - strlen ( UEbuf ) ,
GTXT ( " HW counter profiling is not supported on this system: %s%s " ) ,
pch , pch [ strlen ( pch ) - 1 ] = = ' \n ' ? " " : " \n " ) ;
else
snprintf ( UEbuf + strlen ( UEbuf ) , sizeof ( UEbuf ) - strlen ( UEbuf ) ,
GTXT ( " HW counter profiling is not supported on this system \n " ) ) ;
}
else
snprintf ( UEbuf + strlen ( UEbuf ) , sizeof ( UEbuf ) - strlen ( UEbuf ) ,
GTXT ( " HW counter profiling is not supported on '%s' \n " ) ,
cpcx_cciname ) ;
rc = - 1 ;
goto hwc_lookup_wrapup ;
}
ss = instr_copy = strdup ( instring ) ;
while ( * ss ! = 0 & & ( * ss = = ' ' | | * ss = = ' \t ' ) )
ss + + ;
tokenptr [ numtokens + + ] = ss ;
do
{
/* find end of previous token, replace w/ NULL, skip whitespace, set <tokenptr>, repeat */
for ( ; * ss ; ss + + )
{
if ( * ss = = ' , ' | | * ss = = ' ' | | * ss = = ' \t ' )
{
/* end of previous token found */
* ss = 0 ; /* terminate the previous token */
ss + + ;
while ( * ss ! = 0 & & ( * ss = = ' ' | | * ss = = ' \t ' ) )
ss + + ;
if ( * ss )
tokenptr [ numtokens + + ] = ss ;
break ; // from for loop
}
}
}
while ( * ss & & numtokens < ( MAX_PICS * 2 ) ) ;
if ( * ss )
{
snprintf ( UEbuf + strlen ( UEbuf ) , sizeof ( UEbuf ) - strlen ( UEbuf ) ,
GTXT ( " The number of HW counters specified exceeds internal resources \n " ) ) ;
snprintf ( UEbuf + strlen ( UEbuf ) , sizeof ( UEbuf ) - strlen ( UEbuf ) ,
GTXT ( " Run \" %s -h \" with no other arguments for more information on HW counters on this system. \n " ) ,
( IS_KERNEL ( forKernel ) ? " er_kernel " : " collect " ) ) ;
rc = - 1 ;
goto hwc_lookup_wrapup ;
}
Tprintf ( DBG_LT3 , " hwctable: hwc_lookup(): numtokens=%d \n " , numtokens ) ;
/* look up individual counters */
{
int fail = 0 ;
for ( ii = 0 ; ii < numtokens & & numctrs < maxctrs ; ii + = 2 )
{
const char * counter ;
const char * value ;
Hwcentry * pret_ctr = entries [ numctrs ] ;
/* assign the tokens to ctrnames, timeoutValues. */
counter = tokenptr [ ii ] ;
if ( ii + 1 < numtokens )
value = tokenptr [ ii + 1 ] ;
else
value = 0 ;
if ( process_ctr_def ( forKernel , global_min_time_nsec , counter , value , pret_ctr ,
UWbuf + strlen ( UWbuf ) ,
sizeof ( UWbuf ) - strlen ( UWbuf ) ,
UEbuf + strlen ( UEbuf ) ,
sizeof ( UEbuf ) - strlen ( UEbuf ) ) )
{
/* could choose to set fail=1 and continue here,
but errmsgs would be aggregated ( messy ) */
rc = - 1 ;
goto hwc_lookup_wrapup ;
}
numctrs + + ;
}
if ( fail )
{
rc = - 1 ;
goto hwc_lookup_wrapup ;
}
}
if ( ! numctrs )
{
snprintf ( UEbuf + strlen ( UEbuf ) , sizeof ( UEbuf ) - strlen ( UEbuf ) ,
GTXT ( " No HW counters were specified. \n " ) ) ;
rc = - 1 ;
goto hwc_lookup_wrapup ;
}
if ( numctrs > cpcx_max_concurrent [ forKernel ] )
{
snprintf ( UEbuf + strlen ( UEbuf ) , sizeof ( UEbuf ) - strlen ( UEbuf ) ,
GTXT ( " The HW counter configuration could not be loaded: More than %d counters were specified \n " ) , cpcx_max_concurrent [ forKernel ] ) ;
snprintf ( UEbuf + strlen ( UEbuf ) , sizeof ( UEbuf ) - strlen ( UEbuf ) ,
GTXT ( " Run \" %s -h \" with no other arguments for more information on HW counters on this system. \n " ) ,
( IS_KERNEL ( forKernel ) ? " er_kernel " : " collect " ) ) ;
rc = - 1 ;
goto hwc_lookup_wrapup ;
}
hwc_lookup_wrapup :
free ( instr_copy ) ;
if ( wmsg & & strlen ( UWbuf ) )
* wmsg = strdup ( UWbuf ) ;
if ( emsg & & strlen ( UEbuf ) )
* emsg = strdup ( UEbuf ) ;
if ( rc = = 0 )
rc = numctrs ;
return rc ;
}
extern char *
hwc_validate_ctrs ( int forKernel , Hwcentry * entries [ ] , unsigned numctrs )
{
char UEbuf [ 1024 * 5 ] ;
UEbuf [ 0 ] = 0 ;
/* search for obvious duplicates*/
unsigned ii ;
for ( ii = 0 ; ii < numctrs ; ii + + )
{
regno_t reg_a = entries [ ii ] - > reg_num ;
if ( reg_a ! = REGNO_ANY )
{
unsigned jj ;
for ( jj = ii + 1 ; jj < numctrs ; jj + + )
{
int reg_b = entries [ jj ] - > reg_num ;
if ( reg_a = = reg_b )
{
snprintf ( UEbuf + strlen ( UEbuf ) , sizeof ( UEbuf ) - strlen ( UEbuf ) ,
GTXT ( " Only one HW counter is allowed per register. The following counters use register %d: \n " ) ,
reg_a ) ;
for ( jj = 0 ; jj < numctrs ; jj + + )
{
char buf [ 256 ] ;
int reg_b = entries [ jj ] - > reg_num ;
if ( reg_a = = reg_b )
snprintf ( UEbuf + strlen ( UEbuf ) , sizeof ( UEbuf ) - strlen ( UEbuf ) ,
GTXT ( " %d. %s \n " ) , jj + 1 ,
hwc_hwcentry_specd_string ( buf , sizeof ( buf ) ,
entries [ jj ] ) ) ;
}
return strdup ( UEbuf ) ;
}
}
}
}
/* test counters */
hwcfuncs_errmsg_get ( NULL , 0 , 1 ) ; /* enable errmsg capture */
int hwc_rc = hwcfuncs_assign_regnos ( entries , numctrs ) ;
if ( ! hwc_rc )
hwc_rc = test_hwcs ( ( const Hwcentry * * ) entries , numctrs ) ;
if ( hwc_rc )
{
if ( cpcx_cpuver = = CPC_PENTIUM_4_HT | | cpcx_cpuver = = CPC_PENTIUM_4 )
{
snprintf ( UEbuf + strlen ( UEbuf ) , sizeof ( UEbuf ) - strlen ( UEbuf ) ,
GTXT ( " HW counter profiling is disabled unless only one logical CPU per HyperThreaded processor is online (see psradm) \n " ) ) ;
return strdup ( UEbuf ) ;
}
char buf [ 1024 ] ;
* buf = 0 ;
char * pch = hwcfuncs_errmsg_get ( buf , sizeof ( buf ) , 0 ) ; /* get first err msg, disable capture */
if ( * pch )
snprintf ( UEbuf + strlen ( UEbuf ) , sizeof ( UEbuf ) - strlen ( UEbuf ) ,
GTXT ( " The HW counter configuration could not be loaded: %s%s " ) ,
pch , pch [ strlen ( pch ) - 1 ] = = ' \n ' ? " " : " \n " ) ;
else
snprintf ( UEbuf + strlen ( UEbuf ) , sizeof ( UEbuf ) - strlen ( UEbuf ) ,
GTXT ( " The HW counter configuration could not be loaded \n " ) ) ;
snprintf ( UEbuf + strlen ( UEbuf ) , sizeof ( UEbuf ) - strlen ( UEbuf ) ,
GTXT ( " Run \" %s -h \" with no other arguments for more information on HW counters on this system. \n " ) ,
( IS_KERNEL ( forKernel ) ? " er_kernel " : " collect " ) ) ;
return strdup ( UEbuf ) ;
}
return NULL ;
}
extern Hwcentry *
hwc_post_lookup ( Hwcentry * pret_ctr , char * counter , char * int_name , int cpuver )
{
const Hwcentry * pfound ;
regno_t regno ;
char * nameOnly = NULL ;
char * attrs = NULL ;
/* fields in pret_ctr (name and int_name) should already be free */
hwcfuncs_parse_ctr ( counter , NULL , & nameOnly , & attrs , NULL , & regno ) ;
/* look for it in the canonical list */
pfound = static_table_find ( stdlist_get_table ( cpuver ) ,
nameOnly , int_name , 0 , REGNO_ANY ) ;
if ( ! pfound ) /* try the generic list */
pfound = static_table_find ( papi_generic_list ,
nameOnly , int_name , 0 , REGNO_ANY ) ;
if ( pfound )
{
/* in standard list */
* pret_ctr = * pfound ; /* shallow copy */
if ( pret_ctr - > int_name )
{
// aliased counter
pret_ctr - > int_name = strdup ( pret_ctr - > int_name ) ;
if ( pret_ctr - > short_desc = = NULL )
{
// look for short_desc of corresponding raw counter
const Hwcentry * praw = static_table_find ( stdlist_get_table ( cpuver ) ,
pret_ctr - > int_name , NULL , 0 , REGNO_ANY ) ;
if ( praw & & praw - > short_desc )
pret_ctr - > short_desc = strdup ( praw - > short_desc ) ;
}
}
else
pret_ctr - > int_name = strdup ( counter ) ;
if ( pret_ctr - > reg_num = = REGNO_ANY )
pret_ctr - > reg_num = regno ; /* table's regno is a wildcard */
}
else
{
/* not a standard counter */
* pret_ctr = empty_ctr ;
pret_ctr - > int_name = strdup ( counter ) ;
pret_ctr - > reg_num = regno ;
}
/* update the name */
if ( attrs )
{
pret_ctr - > name = canonical_name ( counter ) ;
if ( pret_ctr - > metric )
{
// metric text is supplied from a table. (User supplied HWC alias)
// Append user-supplied attributes to metric name:
size_t len = strlen ( pret_ctr - > metric ) + strlen ( attrs ) + 4 ;
char * pch = calloc ( len , 1 ) ;
if ( pch )
snprintf ( pch , len , " %s (%s) " , pret_ctr - > metric , attrs ) ;
pret_ctr - > metric = pch ; // leaks
}
}
else
pret_ctr - > name = strdup ( nameOnly ) ;
if ( pfound )
hwcentry_print ( DBG_LT2 , " hwctable: hwc_post_lookup: found: " , pret_ctr ) ;
else
hwcentry_print ( DBG_LT2 , " hwctable: hwc_post_lookup: default: " , pret_ctr ) ;
free ( attrs ) ;
free ( nameOnly ) ;
return pret_ctr ;
}
static const char *
hwc_on_lo_hi ( const Hwcentry * pctr )
{
char * rate ;
{
switch ( pctr - > min_time )
{
case ( HWCTIME_LO ) :
rate = NTXT ( " lo " ) ;
break ;
case ( HWCTIME_ON ) :
rate = NTXT ( " on " ) ;
break ;
case ( HWCTIME_HI ) :
rate = NTXT ( " hi " ) ;
break ;
case ( 0 ) :
rate = NULL ; // null => use interval count
break ;
default :
case ( HWCTIME_TBD ) :
rate = NTXT ( " on " ) ;
break ;
}
}
return rate ; //strdup( rate );
}
extern char *
hwc_rate_string ( const Hwcentry * pctr , int force_numeric )
{
const char * rateString = hwc_on_lo_hi ( pctr ) ;
char buf [ 128 ] ;
if ( ! rateString | | force_numeric )
{
snprintf ( buf , sizeof ( buf ) , NTXT ( " %d " ) , pctr - > val ) ;
rateString = buf ;
}
return strdup ( rateString ) ;
}
static char metricbuf [ 2048 ] ;
extern char *
hwc_i18n_metric ( const Hwcentry * pctr )
{
if ( pctr - > metric ! = NULL )
snprintf ( metricbuf , sizeof ( metricbuf ) , NTXT ( " %s " ) , PTXT ( pctr - > metric ) ) ;
else if ( pctr - > name ! = NULL )
snprintf ( metricbuf , sizeof ( metricbuf ) , GTXT ( " %s Events " ) , pctr - > name ) ;
else if ( pctr - > int_name ! = NULL )
snprintf ( metricbuf , sizeof ( metricbuf ) , GTXT ( " %s Events " ) , pctr - > int_name ) ;
else
snprintf ( metricbuf , sizeof ( metricbuf ) , GTXT ( " Undefined Events " ) ) ;
return metricbuf ;
}
/* return cpu version, should only be called when about to generate an experiment,
not when reading back an experiment */
#if 0 /* called by ... */
. / perfan / collect / src / collect . cc : start : 245 : cpuver = hwc_get_cpc_cpuver ( ) ;
. / ccr_components / Collector_Interface / collctrl . cc : constructor : 202 : cpcx_cpuver = hwc_get_cpc_cpuver ( ) ;
. / perfan / dbe / src / Dbe . cc : 3041 : JApplication : : cpuver = hwc_get_cpc_cpuver ( ) ;
. / perfan / dbe / src / Dbe . cc : 3164 : JApplication : : cpuver = hwc_get_cpc_cpuver ( ) ;
note :
cpc_getcpuver ( ) : only papi , ostest , this and hwprofile . c call it
# endif
int
hwc_get_cpc_cpuver ( )
{
setup_cpcx ( ) ;
return cpcx_cpuver ;
}
extern char *
hwc_get_cpuname ( char * buf , size_t buflen )
{
setup_cpcx ( ) ;
if ( ! buf | | ! buflen )
return buf ;
buf [ 0 ] = 0 ;
if ( cpcx_cciname )
{
strncpy ( buf , cpcx_cciname , buflen - 1 ) ;
buf [ buflen - 1 ] = 0 ;
}
return buf ;
}
extern char *
hwc_get_docref ( char * buf , size_t buflen )
{
setup_cpcx ( ) ;
if ( ! buf | | ! buflen )
return buf ;
buf [ 0 ] = 0 ;
if ( cpcx_docref )
{
strncpy ( buf , cpcx_docref , buflen - 1 ) ;
buf [ buflen - 1 ] = 0 ;
}
return buf ;
}
//TBR:
extern char *
hwc_get_default_cntrs ( )
{
setup_cpcx ( ) ;
if ( cpcx_default_hwcs [ 0 ] ! = NULL )
return strdup ( cpcx_default_hwcs [ 0 ] ) ; // TBR deprecate this
return NULL ;
}
extern char *
hwc_get_default_cntrs2 ( int forKernel , int style )
{
setup_cpcx ( ) ;
if ( ! VALID_FOR_KERNEL ( forKernel ) )
return NULL ;
char * cpcx_default = cpcx_default_hwcs [ forKernel ] ;
if ( cpcx_default = = NULL | | cpcx_npics = = 0 )
return NULL ;
if ( style = = 1 )
return strdup ( cpcx_default ) ;
// style == 2
// we will replace "," delimiters with " -h " (an extra 3 chars per HWC)
char * s = ( char * ) malloc ( strlen ( cpcx_default ) + 3 * cpcx_npics ) ;
if ( s = = NULL ) return s ;
char * p = s ;
char * q = cpcx_default ;
int i ;
for ( i = 0 ; i < cpcx_npics ; i + + )
{
int qlen = strlen ( q ) ;
if ( qlen = = 0 )
{
p [ 0 ] = ' \0 ' ;
break ;
}
// add " -h " if not the first HWC
if ( i ! = 0 )
{
p [ 0 ] = ' ' ;
p [ 1 ] = ' - ' ;
p [ 2 ] = ' h ' ;
p [ 3 ] = ' ' ;
p + = 4 ;
}
// find second comma
char * r = strchr ( q , ' , ' ) ;
if ( r )
r = strchr ( r + 1 , ' , ' ) ;
// we didn't find one, so the rest of the string is the last HWC
if ( r = = NULL )
{
// EUGENE could check i==cpcx_npicx-1, but what if it isn't???
strcpy ( p , q ) ;
if ( p [ qlen - 1 ] = = ' , ' )
qlen - - ;
p [ qlen ] = ' \0 ' ;
break ;
}
// copy the HWC, trim trailing comma, add null char
qlen = r - q - 1 ;
strcpy ( p , q ) ;
if ( p [ qlen - 1 ] = = ' , ' )
qlen - - ;
p + = qlen ;
p [ 0 ] = ' \0 ' ;
q = r + 1 ;
}
return s ;
}
extern char *
hwc_get_orig_default_cntrs ( int forKernel )
{
setup_cpcx ( ) ;
if ( ! VALID_FOR_KERNEL ( forKernel ) )
return NULL ;
if ( cpcx_orig_default_hwcs [ forKernel ] ! = NULL )
return strdup ( cpcx_orig_default_hwcs [ forKernel ] ) ;
return NULL ;
}
extern const char *
hwc_memop_string ( ABST_type memop )
{
const char * s ;
switch ( memop )
{
case ABST_NONE :
s = " " ;
break ;
case ABST_LOAD :
s = GTXT ( " load " ) ;
break ;
case ABST_STORE :
s = GTXT ( " store " ) ;
break ;
case ABST_LDST :
case ABST_US_DTLBM :
case ABST_LDST_SPARC64 :
s = GTXT ( " load-store " ) ;
break ;
case ABST_EXACT_PEBS_PLUS1 :
case ABST_EXACT :
s = GTXT ( " memoryspace " ) ;
break ;
case ABST_COUNT :
s = GTXT ( " count " ) ;
break ;
case ABST_NOPC :
s = GTXT ( " not-program-related " ) ;
break ;
default :
s = " " ; // was "ABST_UNK", but that's meaningless to users
break ;
}
return s ;
}
static const char *
timecvt_string ( int timecvt )
{
if ( timecvt > 0 )
return GTXT ( " CPU-cycles " ) ;
if ( timecvt < 0 )
return GTXT ( " ref-cycles " ) ;
return GTXT ( " events " ) ;
}
int show_regs = 0 ; // The register setting is available on Solaris only
/*
* print the specified strings in aligned columns
*/
static void
format_columns ( char * buf , int bufsiz , char * s1 , char * s2 , const char * s3 ,
const char * s4 , char * s5 , const char * s6 )
{
// NULL strings are blanks
char * blank = NTXT ( " " ) ;
if ( s2 = = NULL )
s2 = blank ;
if ( s3 = = NULL )
s3 = blank ;
if ( s6 = = NULL )
s6 = blank ;
// get the lengths and target widths
// (s6 can be as wide as it likes)
int l1 = strlen ( s1 ) , n1 = 10 , l2 = strlen ( s2 ) , n2 = 13 ;
int l3 = strlen ( s3 ) , n3 = 20 , l4 = strlen ( s4 ) , n4 = 10 , n5 ;
char divide = ' ' ;
// adjust widths, stealing from one column to help a neighbor
// There's a ragged boundary between s2 and s3.
// So push this boundary to the right.
n2 + = n3 - l3 ;
n3 - = n3 - l3 ;
// If s3 is empty, push the boundary over to s4.
if ( l3 = = 0 )
{
n2 + = n4 - l4 ;
n4 - = n4 - l4 ;
}
// If there's enough room to fit s1 and s2, do so.
if ( n1 + n2 > = l1 + l2 )
{
if ( n1 < l1 )
{
n2 - = l1 - n1 ;
n1 + = l1 - n1 ;
}
if ( n2 < l2 )
{
n1 - = l2 - n2 ;
n2 + = l2 - n2 ;
}
}
else
{
// not enough room, so we need to divide the line
n3 + = 4 // 4-blank margin
+ n1 // 1st column
+ 1 // space between 1st and 2nd columns
+ n2 // 2nd column
+ 1 ; // space between 2nd and 3th columns
divide = ' \n ' ;
// make 1st column large enough
if ( n1 < l1 )
n1 = l1 ;
// width of 2nd column no longer matters since we divided the line
n2 = 0 ;
}
if ( show_regs )
{
// fifth column should be wide enough for regnolist
// see function get_regnolist()
if ( cpcx_npics < 10 )
n5 = cpcx_npics ; // one char per regno
else
n5 = 16 + 3 * ( cpcx_npics - 9 ) ; // spaces between regnos and some regnos are 2-char wide
// ... and be wide enough for header "regs"
if ( n5 < 4 )
n5 = 4 ;
// print to buffer
// (don't need a space before s4 since historical precedent to have a trailing space in s3)
snprintf ( buf , bufsiz , " %-*s %-*s%c%*s%*s %-*s %s " ,
n1 , s1 , n2 , s2 , divide , n3 , s3 , n4 , s4 , n5 , s5 , s6 ) ;
}
else
snprintf ( buf , bufsiz , " %-*s %-*s%c%*s%*s %s " ,
n1 , s1 , n2 , s2 , divide , n3 , s3 , n4 , s4 , s6 ) ;
for ( int i = strlen ( buf ) ; i > 0 ; i - - )
if ( buf [ i ] = = ' ' | | buf [ i ] = = ' \t ' )
buf [ i ] = 0 ;
else
break ;
}
/* routine to return HW counter string formatted and i18n'd */
static char *
hwc_hwcentry_string_internal ( char * buf , size_t buflen , const Hwcentry * ctr ,
int show_short_desc )
{
char regnolist [ 256 ] ;
if ( ! buf | | ! buflen )
return buf ;
if ( ctr = = NULL )
{
2022-06-16 12:31:05 -07:00
snprintf ( buf , buflen , GTXT ( " HW counter not available " ) ) ;
return buf ;
2022-03-11 08:58:31 +00:00
}
char * desc = NULL ;
if ( show_short_desc )
desc = ctr - > short_desc ;
if ( desc = = NULL )
desc = ctr - > metric ? hwc_i18n_metric ( ctr ) : NULL ;
2022-06-16 12:31:05 -07:00
format_columns ( buf , buflen , ctr - > name , ctr - > int_name ,
2022-03-11 08:58:31 +00:00
hwc_memop_string ( ctr - > memop ) , timecvt_string ( ctr - > timecvt ) ,
get_regnolist ( regnolist , sizeof ( regnolist ) , ctr - > reg_list , 2 ) ,
desc ) ;
return buf ;
}
/* routine to return HW counter string formatted and i18n'd */
extern char *
hwc_hwcentry_string ( char * buf , size_t buflen , const Hwcentry * ctr )
{
return hwc_hwcentry_string_internal ( buf , buflen , ctr , 0 ) ;
}
/* routine to return HW counter string formatted and i18n'd */
extern char *
hwc_hwcentry_specd_string ( char * buf , size_t buflen , const Hwcentry * ctr )
{
const char * memop , * timecvt ;
char descstr [ 1024 ] ;
if ( ! buf | | ! buflen )
return buf ;
if ( ctr = = NULL )
{
2022-06-16 12:31:05 -07:00
snprintf ( buf , buflen , GTXT ( " HW counter not available " ) ) ;
return buf ;
2022-03-11 08:58:31 +00:00
}
timecvt = timecvt_string ( ctr - > timecvt ) ;
if ( ctr - > memop )
memop = hwc_memop_string ( ctr - > memop ) ;
else
memop = " " ;
if ( ctr - > metric ! = NULL ) /* a standard counter for a specific register */
2022-06-16 12:31:05 -07:00
snprintf ( descstr , sizeof ( descstr ) , " (`%s'; %s%s) " ,
2022-03-11 08:58:31 +00:00
hwc_i18n_metric ( ctr ) , memop , timecvt ) ;
else /* raw counter */
2022-06-16 12:31:05 -07:00
snprintf ( descstr , sizeof ( descstr ) , " (%s%s) " , memop , timecvt ) ;
2022-03-11 08:58:31 +00:00
char * rateString = hwc_rate_string ( ctr , 1 ) ;
2022-06-16 12:31:05 -07:00
snprintf ( buf , buflen , " %s,%s%s " , ctr - > name ,
2022-03-11 08:58:31 +00:00
rateString ? rateString : " " , descstr ) ;
free ( rateString ) ;
return buf ;
}
unsigned
hwc_get_max_regs ( )
{
setup_cpcx ( ) ;
return cpcx_npics ;
}
unsigned
hwc_get_max_concurrent ( int forKernel )
{
setup_cpcx ( ) ;
if ( ! VALID_FOR_KERNEL ( forKernel ) )
return 0 ;
return cpcx_max_concurrent [ forKernel ] ;
}
char * *
hwc_get_attrs ( int forKernel )
{
setup_cpcx ( ) ;
if ( ! VALID_FOR_KERNEL ( forKernel ) )
return NULL ;
return cpcx_attrs [ forKernel ] ;
}
Hwcentry * *
hwc_get_std_ctrs ( int forKernel )
{
setup_cpcx ( ) ;
if ( ! VALID_FOR_KERNEL ( forKernel ) )
return NULL ;
return cpcx_std [ forKernel ] ;
}
Hwcentry * *
hwc_get_raw_ctrs ( int forKernel )
{
setup_cpcx ( ) ;
if ( ! VALID_FOR_KERNEL ( forKernel ) )
return NULL ;
return cpcx_raw [ forKernel ] ;
}
/* Call an action function for each attribute supported */
unsigned
hwc_scan_attrs ( void ( * action ) ( const char * attr , const char * desc ) )
{
setup_cpcx ( ) ;
int cnt = 0 ;
for ( int ii = 0 ; cpcx_attrs [ 0 ] & & cpcx_attrs [ 0 ] [ ii ] ; ii + + , cnt + + )
{
if ( action )
action ( cpcx_attrs [ 0 ] [ ii ] , NULL ) ;
}
if ( ! cnt & & action )
action ( NULL , NULL ) ;
return cnt ;
}
unsigned
hwc_scan_std_ctrs ( void ( * action ) ( const Hwcentry * ) )
{
setup_cpcx ( ) ;
Tprintf ( DBG_LT1 , " hwctable: hwc_scan_standard_ctrs()... \n " ) ;
int cnt = 0 ;
for ( int ii = 0 ; cpcx_std [ 0 ] & & cpcx_std [ 0 ] [ ii ] ; ii + + , cnt + + )
if ( action )
action ( cpcx_std [ 0 ] [ ii ] ) ;
if ( ! cnt & & action )
action ( NULL ) ;
return cnt ;
}
/* Call an action function for each counter supported */
/* action is called with NULL when all counters have been seen */
unsigned
hwc_scan_raw_ctrs ( void ( * action ) ( const Hwcentry * ) )
{
setup_cpcx ( ) ;
Tprintf ( DBG_LT1 , " hwctable: hwc_scan_raw_ctrs()... \n " ) ;
int cnt = 0 ;
for ( int ii = 0 ; cpcx_raw [ 0 ] & & cpcx_raw [ 0 ] [ ii ] ; ii + + , cnt + + )
if ( action )
action ( cpcx_raw [ 0 ] [ ii ] ) ;
if ( ! cnt & & action )
action ( NULL ) ;
return cnt ;
}
static void
hwc_usage_raw_overview_sparc ( FILE * f_usage , int cpuver )
{
/* All these cpuver's use cputabs[]==sparc_t5_m6 anyhow. */
if ( ( cpuver = = CPC_SPARC_M5 ) | | ( cpuver = = CPC_SPARC_M6 )
| | ( cpuver = = CPC_SPARC_T5 ) | | ( cpuver = = CPC_SPARC_T6 ) )
cpuver = CPC_SPARC_M4 ; // M4 was renamed to M5
/* While there are small differences between
* cputabs [ ] = = sparc_t4
* cputabs [ ] = = sparc_t5_m6
* they are in HWCs we don ' t discuss in the overview anyhow .
* So just lump them in with T4 .
*/
if ( cpuver = = CPC_SPARC_M4 )
cpuver = CPC_SPARC_T4 ;
/* Check for the cases we support. */
if ( cpuver ! = CPC_SPARC_T4 & & cpuver ! = CPC_SPARC_M7 & & cpuver ! = CPC_SPARC_M8 )
return ;
fprintf ( f_usage , GTXT ( " While the above aliases represent the most useful hardware counters \n "
" for this processor, a full list of raw (unaliased) counter names appears \n "
" below. First is an overview of some of these names. \n \n " ) ) ;
fprintf ( f_usage , GTXT ( " == Cycles. \n "
" Count active cycles with \n "
" Cycles_user \n "
" Set attributes to choose user, system, and/or hyperprivileged cycles. \n \n " ) ) ;
fprintf ( f_usage , GTXT ( " == Instructions. \n "
" Count instructions when they are committed with: \n " ) ) ;
fprintf ( f_usage , NTXT ( " Instr_all \n " ) ) ;
if ( cpuver ! = CPC_SPARC_M8 )
fprintf ( f_usage , GTXT ( " It is the total of these counters: \n " ) ) ;
else
fprintf ( f_usage , GTXT ( " Some subsets of instructions can be counted separately: \n " ) ) ;
fprintf ( f_usage , NTXT ( " Branches %s \n " ) , GTXT ( " branches " ) ) ;
fprintf ( f_usage , NTXT ( " Instr_FGU_crypto %s \n " ) , GTXT ( " Floating Point and Graphics Unit " ) ) ;
fprintf ( f_usage , NTXT ( " Instr_ld %s \n " ) , GTXT ( " loads " ) ) ;
fprintf ( f_usage , NTXT ( " Instr_st %s \n " ) , GTXT ( " stores " ) ) ;
fprintf ( f_usage , NTXT ( " %-19s %s \n " ) ,
cpuver = = CPC_SPARC_M7 ? NTXT ( " Instr_SPR_ring_ops " )
: NTXT ( " SPR_ring_ops " ) ,
GTXT ( " internal use of SPR ring " ) ) ;
fprintf ( f_usage , NTXT ( " Instr_other %s \n " ) , GTXT ( " basic arithmetic and logical instructions " ) ) ;
if ( cpuver ! = CPC_SPARC_M8 )
fprintf ( f_usage , GTXT ( " Some subsets of these instructions can be counted separately: \n " ) ) ;
fprintf ( f_usage , NTXT ( " Br_taken %s \n " ) , GTXT ( " Branches that are taken " ) ) ;
fprintf ( f_usage , NTXT ( " %-19s %s \n " ) ,
cpuver = = CPC_SPARC_M7 ? NTXT ( " Instr_block_ld_st " )
: NTXT ( " Block_ld_st " ) ,
GTXT ( " block load/store " ) ) ;
fprintf ( f_usage , NTXT ( " %-19s %s \n " ) ,
cpuver = = CPC_SPARC_M7 ? NTXT ( " Instr_atomic " )
: NTXT ( " Atomics " ) ,
GTXT ( " atomic instructions " ) ) ;
fprintf ( f_usage , NTXT ( " %-19s %s \n " ) ,
cpuver = = CPC_SPARC_M7 ? NTXT ( " Instr_SW_prefetch " )
: NTXT ( " SW_prefetch " ) ,
GTXT ( " prefetches " ) ) ;
fprintf ( f_usage , NTXT ( " %-19s %s \n " ) ,
cpuver = = CPC_SPARC_M7 ? NTXT ( " Instr_SW_count " )
: NTXT ( " Sw_count_intr " ) ,
GTXT ( " SW Count instructions (counts special no-op assembler instructions) " ) ) ;
fprintf ( f_usage , NTXT ( " \n " ) ) ;
# ifdef TMPLEN
compilation error : we ' re trying to use a macro that ' s already defined
# endif
# define TMPLEN 32
char s0 [ TMPLEN ] , s1 [ TMPLEN ] , s2 [ TMPLEN ] , s3 [ TMPLEN ] ;
if ( cpuver = = CPC_SPARC_M7 )
{
snprintf ( s0 , TMPLEN , " Commit_0_cyc " ) ;
snprintf ( s1 , TMPLEN , " Commit_1_cyc " ) ;
snprintf ( s2 , TMPLEN , " Commit_2_cyc " ) ;
snprintf ( s3 , TMPLEN , " Commit_1_or_2_cyc " ) ;
}
else
{
snprintf ( s0 , TMPLEN , " Commit_0 " ) ;
snprintf ( s1 , TMPLEN , " Commit_1 " ) ;
snprintf ( s2 , TMPLEN , " Commit_2 " ) ;
snprintf ( s3 , TMPLEN , " Commit_1_or_2 " ) ;
}
# undef TMPLEN
fprintf ( f_usage , GTXT ( " == Commit. \n "
" Instructions may be launched speculatively, executed out of order, etc. \n " ) ) ;
if ( cpuver ! = CPC_SPARC_M8 )
{
fprintf ( f_usage , GTXT ( " We can count the number of cycles during which 0, 1, or 2 instructions are \n "
" actually completed and their results committed: \n " ) ) ;
fprintf ( f_usage , GTXT ( " %s \n "
" %s \n "
" %s \n "
" %s \n "
" %s is a useful way of identifying parts of your application with \n "
" high-latency instructions. \n \n " ) ,
s0 , s1 , s2 , s3 , s0 ) ;
}
else
{
fprintf ( f_usage , GTXT ( " We can count the number of cycles during which no instructions were \n "
" able to commit results using: \n " ) ) ;
fprintf ( f_usage , GTXT ( " %s \n "
" %s is a useful way of identifying parts of your application with \n "
" high-latency instructions. \n \n " ) ,
s0 , s0 ) ;
}
fprintf ( f_usage , GTXT ( " == Cache/memory hierarchy. \n " ) ) ;
if ( cpuver = = CPC_SPARC_M7 )
{
fprintf ( f_usage , GTXT ( " In the cache hierarchy: \n "
" * Each socket has memory and multiple SPARC core clusters (scc). \n "
" * Each scc has an L3 cache and multiple L2 and L1 caches. \n " ) ) ;
fprintf ( f_usage , GTXT ( " Loads can be counted by where they hit on socket: \n " ) ) ;
fprintf ( f_usage , NTXT ( " %-22s %s \n " ) ,
NTXT ( " DC_hit " ) , GTXT ( " hit own L1 data cache " ) ) ;
fprintf ( f_usage , NTXT ( " %-22s %s \n " ) ,
NTXT ( " DC_miss_L2_hit " ) , GTXT ( " hit own L2 " ) ) ;
fprintf ( f_usage , NTXT ( " %-22s %s \n " ) ,
NTXT ( " DC_miss_L3_hit " ) , GTXT ( " hit own L3 " ) ) ;
fprintf ( f_usage , NTXT ( " %-22s %s \n " ) ,
NTXT ( " DC_miss_nbr_L2_hit " ) , GTXT ( " hit neighbor L2 (same scc) " ) ) ;
fprintf ( f_usage , NTXT ( " %-22s %s \n " ) ,
NTXT ( " DC_miss_nbr_scc_hit " ) , GTXT ( " hit neighbor scc (same socket) " ) ) ;
fprintf ( f_usage , NTXT ( " %-22s %s \n " ) ,
NTXT ( " DC_miss_nbr_scc_miss " ) , GTXT ( " miss all caches (same socket) " ) ) ;
fprintf ( f_usage , GTXT ( " These loads can also be grouped: \n " ) ) ;
fprintf ( f_usage , NTXT ( " %-22s %s \n " ) ,
NTXT ( " DC_miss " ) , GTXT ( " all - DC_hit " ) ) ;
fprintf ( f_usage , NTXT ( " %-22s %s \n " ) ,
NTXT ( " DC_miss_L2_miss " ) , GTXT ( " all - DC_hit - DC_miss_L2_hit " ) ) ;
fprintf ( f_usage , NTXT ( " %-22s %s \n " ) ,
NTXT ( " DC_miss_L3_miss " ) , GTXT ( " DC_miss_nbr_scc_hit + DC_miss_nbr_scc_miss " ) ) ;
fprintf ( f_usage , GTXT ( " Loads that miss all caches on this socket can be counted: \n " ) ) ;
fprintf ( f_usage , NTXT ( " %-22s %s \n " ) ,
NTXT ( " DC_miss_remote_scc_hit " ) , GTXT ( " hit cache on different socket " ) ) ;
fprintf ( f_usage , NTXT ( " %-22s %s \n " ) ,
NTXT ( " DC_miss_local_mem_hit " ) , GTXT ( " hit local memory (same socket) " ) ) ;
fprintf ( f_usage , NTXT ( " %-22s %s \n " ) ,
NTXT ( " DC_miss_remote_mem_hit " ) , GTXT ( " hit remote memory (off socket) " ) ) ;
fprintf ( f_usage , GTXT ( " These events are for speculative loads, launched in anticipation \n "
" of helping performance but whose results might not be committed. \n " ) ) ;
#if 0 // was: #if defined(linux). See 22236226 - sparc-Linux: Support basic Memoryspace and Dataspace profiling (capture VADDR)
/* 21869427 should not look like memoryspace profiling is supported on Linux */
/* 21869424 desire memoryspace profiling on Linux */
fprintf ( f_usage , GTXT ( " To count only data-cache misses that commit, use: \n " ) ) ;
fprintf ( f_usage , NTXT ( " DC_miss_commit \n " ) ) ;
# else
fprintf ( f_usage , GTXT ( " To count only data-cache misses that commit, or for memoryspace profiling, \n "
" use the 'memoryspace' counter: \n " ) ) ;
fprintf ( f_usage , NTXT ( " DC_miss_commit \n " ) ) ;
# endif
fprintf ( f_usage , NTXT ( " \n " ) ) ;
}
else if ( cpuver = = CPC_SPARC_M8 )
{
fprintf ( f_usage , GTXT ( " In the cache hierarchy: \n "
" * Each processor has 4 memory controllers and 2 quad core clusters (QCC). \n "
" * Each QCC contains 4 cache processor clusters (CPC). \n "
" * Each CPC contains 4 cores. \n "
" * Each core supports 8 hardware threads. \n "
" * The L3 consists of 2 partitions with 1 QCC per partition. \n "
) ) ;
fprintf ( f_usage , GTXT ( " Loads can be counted by where they hit on socket: \n " ) ) ;
fprintf ( f_usage , NTXT ( " %-22s %s \n " ) ,
NTXT ( " DC_miss_L2_hit " ) , GTXT ( " hit own L2 " ) ) ;
fprintf ( f_usage , NTXT ( " %-22s %s \n " ) ,
NTXT ( " DC_miss_L3_hit " ) , GTXT ( " hit own L3 " ) ) ;
fprintf ( f_usage , NTXT ( " %-22s %s \n " ) ,
NTXT ( " DC_miss_L3_dirty_copyback " ) , GTXT ( " hit own L3 but require copyback from L2D " ) ) ;
fprintf ( f_usage , NTXT ( " %-22s %s \n " ) ,
NTXT ( " DC_miss_nbr_L3_hit " ) , GTXT ( " hit neighbor L3 (same socket) " ) ) ;
fprintf ( f_usage , GTXT ( " Loads that miss all caches on this socket can be counted: \n " ) ) ;
fprintf ( f_usage , NTXT ( " %-22s %s \n " ) ,
NTXT ( " DC_miss_remote_L3_hit " ) , GTXT ( " hit cache on different socket " ) ) ;
fprintf ( f_usage , NTXT ( " %-22s %s \n " ) ,
NTXT ( " DC_miss_local_mem_hit " ) , GTXT ( " hit local memory (same socket) " ) ) ;
fprintf ( f_usage , NTXT ( " %-22s %s \n " ) ,
NTXT ( " DC_miss_remote_mem_hit " ) , GTXT ( " hit remote memory (off socket) " ) ) ;
fprintf ( f_usage , GTXT ( " These events are for speculative loads, launched in anticipation \n "
" of helping performance but whose results might not be committed. \n " ) ) ;
#if 0 // was: #if defined(linux). See 22236226 - sparc-Linux: Support basic Memoryspace and Dataspace profiling (capture VADDR)
/* 21869427 should not look like memoryspace profiling is supported on Linux */
/* 21869424 desire memoryspace profiling on Linux */
fprintf ( f_usage , GTXT ( " To count only data-cache misses that commit, use: \n " ) ) ;
fprintf ( f_usage , NTXT ( " DC_miss_commit \n " ) ) ;
# else
fprintf ( f_usage , GTXT ( " To count only data-cache misses that commit, or for memoryspace profiling, \n "
" use the 'memoryspace' counter: \n " ) ) ;
fprintf ( f_usage , NTXT ( " DC_miss_commit \n " ) ) ;
# endif
fprintf ( f_usage , NTXT ( " \n " ) ) ;
}
else
{
fprintf ( f_usage , GTXT ( " Total data-cache misses can be counted with: \n " ) ) ;
fprintf ( f_usage , NTXT ( " DC_miss DC_miss_nospec \n " ) ) ;
fprintf ( f_usage , GTXT ( " They are the totals of misses that hit in L2/L3 cache, local memory, or \n "
" remote memory: \n " ) ) ;
fprintf ( f_usage , NTXT ( " DC_miss_L2_L3_hit DC_miss_L2_L3_hit_nospec \n " ) ) ;
fprintf ( f_usage , NTXT ( " DC_miss_local_hit DC_miss_local_hit_nospec \n " ) ) ;
fprintf ( f_usage , NTXT ( " DC_miss_remote_L3_hit DC_miss_remote_L3_hit_nospec \n " ) ) ;
fprintf ( f_usage , GTXT ( " The events in the left column include speculative operations. Use the \n "
" right-hand _nospec events to count only data accesses that commit \n "
" or for memoryspace profiling. \n \n " ) ) ;
}
fprintf ( f_usage , GTXT ( " == TLB misses. \n "
" The Translation Lookaside Buffer (TLB) is a cache of virtual-to-physical \n "
" page translations. " ) ) ;
fprintf ( f_usage , GTXT ( " If a virtual address (VA) is not represented in the \n "
" TLB, an expensive hardware table walk (HWTW) must be conducted. " ) ) ;
fprintf ( f_usage , GTXT ( " If the \n "
" page is still not found, a trap results. There is a data TLB (DTLB) and \n "
" an instruction TLB (ITLB). \n \n " ) ) ;
fprintf ( f_usage , GTXT ( " TLB misses can be counted by: \n " ) ) ;
fprintf ( f_usage , NTXT ( " %s \n " ) ,
cpuver = = CPC_SPARC_M7 ?
NTXT ( " DTLB_HWTW_search ITLB_HWTW_search " ) :
cpuver = = CPC_SPARC_M8 ?
NTXT ( " DTLB_HWTW ITLB_HWTW " ) :
NTXT ( " DTLB_miss_asynch ITLB_miss_asynch " ) ) ;
fprintf ( f_usage , GTXT ( " or broken down by page size: \n " ) ) ;
fprintf ( f_usage , NTXT ( " %s " ) ,
cpuver = = CPC_SPARC_M7 ?
NTXT ( " DTLB_HWTW_hit_8K ITLB_HWTW_hit_8K \n "
" DTLB_HWTW_hit_64K ITLB_HWTW_hit_64K \n "
" DTLB_HWTW_hit_4M ITLB_HWTW_hit_4M \n " ) :
NTXT ( " DTLB_fill_8KB ITLB_fill_8KB \n "
" DTLB_fill_64KB ITLB_fill_64KB \n "
" DTLB_fill_4MB ITLB_fill_4MB \n " ) ) ;
fprintf ( f_usage , NTXT ( " %s \n \n " ) ,
cpuver = = CPC_SPARC_M7 ?
NTXT ( " DTLB_HWTW_hit_256M ITLB_HWTW_hit_256M \n "
" DTLB_HWTW_hit_2G_16G ITLB_HWTW_hit_2G_16G \n "
" DTLB_HWTW_miss_trap ITLB_HWTW_miss_trap " ) :
cpuver = = CPC_SPARC_M8 ?
NTXT ( " DTLB_HWTW_hit_256M ITLB_HWTW_hit_256M \n "
" DTLB_HWTW_hit_16G ITLB_HWTW_hit_16G \n "
" DTLB_HWTW_hit_1T ITLB_HWTW_hit_1T " ) :
NTXT ( " DTLB_fill_256MB ITLB_fill_256MB \n "
" DTLB_fill_2GB ITLB_fill_2GB \n "
" DTLB_fill_trap ITLB_fill_trap " ) ) ;
if ( cpuver = = CPC_SPARC_M8 )
{
fprintf ( f_usage , GTXT ( " TLB traps, which can require hundreds of cycles, can be counted with: \n " ) ) ;
fprintf ( f_usage , NTXT ( " %s \n \n " ) ,
NTXT ( " DTLB_fill_trap ITLB_fill_trap " ) ) ;
}
fprintf ( f_usage , GTXT ( " == Branch misprediction. \n "
" Count branch mispredictions with: \n "
" Br_mispred \n "
" It is the total of: \n "
" Br_dir_mispred direction was mispredicted \n "
" %s target was mispredicted \n "
" \n " ) , cpuver = = CPC_SPARC_M7 ? NTXT ( " Br_tgt_mispred " ) : NTXT ( " Br_trg_mispred " ) ) ;
fprintf ( f_usage , GTXT ( " == RAW hazards. \n "
" A read-after-write (RAW) delay occurs when we attempt to read a datum \n "
" before an earlier write has had time to complete: \n " ) ) ;
if ( cpuver = = CPC_SPARC_M8 )
{
fprintf ( f_usage , NTXT ( " RAW_hit \n " ) ) ;
fprintf ( f_usage , GTXT ( " RAW_hit events can be broken down into: \n " ) ) ;
}
else
{
fprintf ( f_usage , NTXT ( " RAW_hit_st_q~emask=0xf \n " ) ) ;
fprintf ( f_usage , GTXT ( " The mask 0xf counts the total of all types such as: \n " ) ) ;
}
fprintf ( f_usage , NTXT ( " RAW_hit_st_buf write is still in store buffer \n "
" RAW_hit_st_q write is still in store queue \n "
" \n " ) ) ;
if ( cpuver = = CPC_SPARC_M7 )
{
fprintf ( f_usage , GTXT ( " == Flush. \n "
" One can count the number of times the pipeline must be flushed: \n " ) ) ;
fprintf ( f_usage , NTXT ( " %-22s %s \n " ) ,
NTXT ( " Flush_L3_miss " ) , GTXT ( " load missed L3 and >1 strand is active on the core " ) ) ;
fprintf ( f_usage , NTXT ( " %-22s %s \n " ) ,
NTXT ( " Flush_br_mispred " ) , GTXT ( " branch misprediction " ) ) ;
fprintf ( f_usage , NTXT ( " %-22s %s \n " ) ,
NTXT ( " Flush_arch_exception " ) , GTXT ( " SPARC exceptions and trap entry/return " ) ) ;
fprintf ( f_usage , NTXT ( " %-22s %s \n " ) ,
NTXT ( " Flush_other " ) , GTXT ( " state change to/from halted/paused " ) ) ;
fprintf ( f_usage , NTXT ( " \n " ) ) ;
}
}
static void
hwc_usage_internal ( int forKernel , FILE * f_usage , const char * cmd , const char * dataspace_msg , int show_syntax , int show_short_desc )
{
if ( ! VALID_FOR_KERNEL ( forKernel ) )
return ;
char cpuname [ 128 ] ;
hwc_get_cpuname ( cpuname , 128 ) ;
Hwcentry * * raw_ctrs = hwc_get_raw_ctrs ( forKernel ) ;
int has_raw_ctrs = ( raw_ctrs & & raw_ctrs [ 0 ] ) ;
Hwcentry * * std_ctrs = hwc_get_std_ctrs ( forKernel ) ;
int has_std_ctrs = ( std_ctrs & & std_ctrs [ 0 ] ) ;
unsigned hwc_maxregs = hwc_get_max_concurrent ( forKernel ) ;
int cpuver = hwc_get_cpc_cpuver ( ) ;
if ( hwc_maxregs ! = 0 )
{
if ( show_syntax )
{
fprintf ( f_usage , GTXT ( " \n Specifying HW counters on `%s' (cpuver=%d): \n \n " ) , cpuname , cpuver ) ;
fprintf ( f_usage , GTXT ( " -h {auto|lo|on|hi} \n " ) ) ;
fprintf ( f_usage , GTXT ( " \t turn on default set of HW counters at the specified rate \n " ) ) ;
if ( hwc_maxregs = = 1 )
{
fprintf ( f_usage , GTXT ( " -h <ctr_def> \n " ) ) ;
fprintf ( f_usage , GTXT ( " \t specify HW counter profiling for one HW counter only \n " ) ) ;
}
else
{
fprintf ( f_usage , GTXT ( " -h <ctr_def> [-h <ctr_def>]... \n " ) ) ;
fprintf ( f_usage , GTXT ( " -h <ctr_def>[,<ctr_def>]... \n " ) ) ;
fprintf ( f_usage , GTXT ( " \t specify HW counter profiling for up to %u HW counters \n " ) , hwc_maxregs ) ;
}
fprintf ( f_usage , NTXT ( " \n " ) ) ;
}
else
{
fprintf ( f_usage , GTXT ( " \n Specifying HW counters on `%s' (cpuver=%d) \n \n " ) , cpuname , cpuver ) ;
if ( hwc_maxregs = = 1 )
fprintf ( f_usage , GTXT ( " Hardware counter profiling is supported for only one counter. \n " ) ) ;
else
fprintf ( f_usage , GTXT ( " Hardware counter profiling is supported for up to %u HW counters. \n " ) , hwc_maxregs ) ;
}
}
else
{
if ( ! IS_KERNEL ( forKernel ) )
{ // EUGENE I don't see why we don't also use this for er_kernel
char buf [ 1024 ] ;
* buf = 0 ;
char * pch = hwcfuncs_errmsg_get ( buf , sizeof ( buf ) , 0 ) ;
if ( * pch )
fprintf ( f_usage , GTXT ( " HW counter profiling is not supported on this system: %s%s " ) ,
pch , pch [ strlen ( pch ) - 1 ] = = ' \n ' ? " " : " \n " ) ;
else
fprintf ( f_usage , GTXT ( " HW counter profiling is not supported on this system \n " ) ) ;
}
return ;
}
/* At this point, we know we have counters */
char * * hwc_attrs = hwc_get_attrs ( forKernel ) ;
int has_attrs = ( hwc_attrs & & hwc_attrs [ 0 ] ) ;
if ( show_syntax )
{
const char * reg_s = show_regs ? " [/<reg#>] " : " " ;
const char * attr_s = has_attrs ? " [[~<attr>=<val>]...] " : " " ;
fprintf ( f_usage , GTXT ( " <ctr_def> == <ctr>%s%s,[<rate>] \n " ) , attr_s , reg_s ) ;
if ( dataspace_msg )
fprintf ( f_usage , NTXT ( " %s " ) , dataspace_msg ) ;
fprintf ( f_usage , GTXT ( " <ctr> \n " ) ) ;
fprintf ( f_usage , GTXT ( " counter name, " ) ) ;
}
else
fprintf ( f_usage , GTXT ( " Counter name " ) ) ;
fprintf ( f_usage , GTXT ( " must be selected from the available counters \n "
" listed below. On most systems, if a counter is not listed \n "
" below, it may still be specified by its numeric value. \n " ) ) ;
if ( cpcx_has_precise [ forKernel ] )
{
if ( ! forKernel )
fprintf ( f_usage , GTXT ( " Counters labeled as 'memoryspace' in the list below will \n "
" collect memoryspace data by default. \n " ) ) ;
}
fprintf ( f_usage , GTXT ( " \n " ) ) ;
if ( has_attrs )
{
if ( show_syntax )
{
fprintf ( f_usage , GTXT ( " ~<attr>=<val> \n " ) ) ;
fprintf ( f_usage , GTXT ( " optional attribute where <val> can be in decimal or hex \n "
" format, and <attr> can be one of: \n " ) ) ;
}
else
fprintf ( f_usage , GTXT ( " Optional attribute where <val> can be in decimal or hex \n "
" format, and <attr> can be one of: \n " ) ) ;
for ( char * * pattr = hwc_attrs ; * pattr ; pattr + + )
fprintf ( f_usage , NTXT ( " `%s' \n " ) , * pattr ) ;
if ( show_syntax )
fprintf ( f_usage , GTXT ( " Multiple attributes may be specified, and each must be preceded by a ~. \n \n " ) ) ;
else
fprintf ( f_usage , GTXT ( " Multiple attributes may be specified. \n \n " ) ) ;
if ( IS_KERNEL ( forKernel ) )
fprintf ( f_usage , GTXT ( " Other attributes may be supported by the chip, but are not supported by DTrace and will be ignored by er_kernel. \n \n " ) ) ;
}
if ( show_syntax )
{
if ( show_regs )
fprintf ( f_usage , GTXT ( " /<reg#> \n "
" forces use of a specific hardware register. (Solaris only) \n "
" If not specified, %s will attempt to place the counter into the first \n "
" available register and as a result may be unable to place \n "
" subsequent counters due to register conflicts. \n "
" The / in front of the register number is required if a register is specified. \n \n " ) ,
cmd ) ;
fprintf ( f_usage , GTXT ( " <rate> == {auto|lo|on|hi} \n " ) ) ;
fprintf ( f_usage , GTXT ( " `auto' (default) match the rate used by clock profiling. \n " ) ) ;
fprintf ( f_usage , GTXT ( " If clock profiling is disabled, use `on'. \n " ) ) ;
fprintf ( f_usage , GTXT ( " `lo' per-thread maximum rate of ~10 samples/second \n " ) ) ;
fprintf ( f_usage , GTXT ( " `on' per-thread maximum rate of ~100 samples/second \n " ) ) ;
fprintf ( f_usage , GTXT ( " `hi' per-thread maximum rate of ~1000 samples/second \n \n " ) ) ;
2022-06-14 14:16:24 -07:00
fprintf ( f_usage , GTXT ( " <rate> == <interval> \n "
" Fixed event interval value to trigger a sample. \n "
" Smaller intervals imply more frequent samples. \n "
" Example: when counting cycles on a 2 GHz processor, \n "
" an interval of 2,000,003 implies ~1000 samples/sec \n "
" \n "
" Use this feature with caution, because: \n "
" (1) Frequent sampling increases overhead and may disturb \n "
" other applications on your system. \n "
" (2) Event counts vary dramatically depending on the event \n "
" and depending on the application. \n "
" (3) A fixed event interval disables any other gprofng \n "
" internal mechanisms that may limit event rates. \n "
" \n "
" Guidelines: Aim at <1000 events per second. Start by \n "
" collecting with the 'hi' option; in the experiment overview, \n "
" notice how many events are recorded per second; divide by \n "
" 1000, and use that as your starting point. \n \n " ) ) ;
2022-03-11 08:58:31 +00:00
fprintf ( f_usage , GTXT ( " A comma ',' followed immediately by white space may be omitted. \n \n " ) ) ;
}
/* default counters */
fprintf ( f_usage , GTXT ( " Default set of HW counters: \n \n " ) ) ;
char * defctrs = hwc_get_default_cntrs2 ( forKernel , 1 ) ;
if ( defctrs = = NULL )
fprintf ( f_usage , GTXT ( " No default HW counter set defined for this system. \n " ) ) ;
else if ( strlen ( defctrs ) = = 0 )
{
char * s = hwc_get_orig_default_cntrs ( forKernel ) ;
fprintf ( f_usage , GTXT ( " The default HW counter set (%s) defined for %s cannot be loaded on this system. \n " ) ,
s , cpuname ) ;
free ( s ) ;
free ( defctrs ) ;
}
else
{
char * defctrs2 = hwc_get_default_cntrs2 ( forKernel , 2 ) ;
fprintf ( f_usage , GTXT ( " -h %s \n " ) , defctrs ) ;
free ( defctrs2 ) ;
free ( defctrs ) ;
}
/* long listings */
char tmp [ 1024 ] ;
if ( has_std_ctrs )
{
fprintf ( f_usage , GTXT ( " \n Aliases for most useful HW counters: \n \n " ) ) ;
format_columns ( tmp , 1024 , " alias " , " raw name " , " type " , " units " , " regs " , " description " ) ;
fprintf ( f_usage , NTXT ( " %s \n \n " ) , tmp ) ;
for ( Hwcentry * * pctr = std_ctrs ; * pctr ; pctr + + )
{
Hwcentry * ctr = * pctr ;
hwc_hwcentry_string_internal ( tmp , sizeof ( tmp ) , ctr , 0 ) ;
fprintf ( f_usage , NTXT ( " %s \n " ) , tmp ) ;
}
}
if ( has_raw_ctrs )
{
fprintf ( f_usage , GTXT ( " \n Raw HW counters: \n \n " ) ) ;
hwc_usage_raw_overview_sparc ( f_usage , cpuver ) ;
format_columns ( tmp , 1024 , " name " , NULL , " type " , " units " , " regs " , " description " ) ;
fprintf ( f_usage , NTXT ( " %s \n \n " ) , tmp ) ;
for ( Hwcentry * * pctr = raw_ctrs ; * pctr ; pctr + + )
{
Hwcentry * ctr = * pctr ;
hwc_hwcentry_string_internal ( tmp , sizeof ( tmp ) , ctr , show_short_desc ) ;
fprintf ( f_usage , NTXT ( " %s \n " ) , tmp ) ;
}
}
/* documentation notice */
hwc_get_docref ( tmp , 1024 ) ;
if ( strlen ( tmp ) )
fprintf ( f_usage , NTXT ( " \n %s \n " ) , tmp ) ;
}
/* Print a description of "-h" usage, largely common to collect and er_kernel. */
void
hwc_usage ( int forKernel , const char * cmd , const char * dataspace_msg )
{
hwc_usage_internal ( forKernel , stdout , cmd , dataspace_msg , 1 , 0 ) ;
}
void
hwc_usage_f ( int forKernel , FILE * f , const char * cmd , const char * dataspace_msg , int show_syntax , int show_short_desc )
{
hwc_usage_internal ( forKernel , f , cmd , dataspace_msg , show_syntax , show_short_desc ) ;
}
/*---------------------------------------------------------------------------*/
/* init functions */
static char * supported_pebs_counters [ ] = {
" mem_inst_retired.latency_above_threshold " ,
" mem_trans_retired.load_latency " ,
" mem_trans_retired.precise_store " ,
NULL
} ;
/* callback, (see setup_cpc()) called for each valid regno/name combo */
/* builds rawlist,, creates and updates reg_list[] arrays in stdlist table */
static void
hwc_cb ( uint_t cpc_regno , const char * name )
{
regno_t regno = cpc_regno ; /* convert type */
list_add ( & unfiltered_raw , regno , name ) ;
}
/* input:
* forKernel : 1 - generate lists for er_kernel , 0 - generate lists for collect
*
* raw_orig : HWCs as generated by hwc_cb ( )
* output :
* pstd_out [ ] , praw_out [ ] : malloc ' d array of pointers to malloc ' d hwcentry , or NULL
*/
static void
hwc_process_raw_ctrs ( int forKernel , Hwcentry * * * pstd_out ,
Hwcentry * * * praw_out , Hwcentry * * * phidden_out ,
Hwcentry * * static_tables , Hwcentry * * raw_unfiltered_in )
{
// set up output buffers
ptr_list s_outbufs [ 3 ] ;
ptr_list * std_out = & s_outbufs [ 0 ] ;
ptr_list_init ( std_out ) ;
ptr_list * raw_out = & s_outbufs [ 1 ] ;
ptr_list_init ( raw_out ) ;
ptr_list * hidden_out = & s_outbufs [ 2 ] ;
ptr_list_init ( hidden_out ) ;
# define NUM_TABLES 3
ptr_list table_copy [ NUM_TABLES ] ; // copy of data from static tables. [0]std, [1]generic, and [2]hidden
for ( int tt = 0 ; tt < NUM_TABLES ; tt + + )
ptr_list_init ( & table_copy [ tt ] ) ;
// copy records from std [0] and generic [1] static input tables into table_copy[0],[1],or[2]
for ( int tt = 0 ; tt < 2 ; tt + + )
for ( Hwcentry * pctr = static_tables [ tt ] ; pctr & & pctr - > name ; pctr + + )
if ( is_hidden_alias ( pctr ) )
list_append_shallow_copy ( & table_copy [ 2 ] , pctr ) ; // hidden list
else
list_append_shallow_copy ( & table_copy [ tt ] , pctr ) ;
// copy raw_unfiltered_in to raw_out
for ( int ii = 0 ; raw_unfiltered_in & & raw_unfiltered_in [ ii ] ; ii + + )
{
Hwcentry * pctr = raw_unfiltered_in [ ii ] ;
// filter out raw counters that don't work correctly
# ifdef WORKAROUND_6231196_NIAGARA1_NO_CTR_0
if ( cpcx_cpuver = = CPC_ULTRA_T1 )
if ( ! regno_is_valid ( pctr , 1 ) )
continue ; /* Niagara can not profile on register zero; skip this */
# endif
// remove specific PEBs counters when back end doesn't support sampling
const char * name = pctr - > name ;
if ( ( cpcx_support_bitmask & HWCFUNCS_SUPPORT_PEBS_SAMPLING ) = = 0 | | forKernel )
{
int skip = 0 ;
for ( int ii = 0 ; supported_pebs_counters [ ii ] ; ii + + )
if ( strcmp ( supported_pebs_counters [ ii ] , name ) = = 0 )
{
skip = 1 ;
break ;
}
if ( skip )
continue ;
}
Hwcentry * pnew = list_append_shallow_copy ( raw_out , pctr ) ;
# ifdef WORKAROUND_6231196_NIAGARA1_NO_CTR_0
if ( cpcx_cpuver = = CPC_ULTRA_T1 )
{
free ( pnew - > reg_list ) ;
pnew - > reg_list = NULL ;
regno_add ( pnew , 1 ) ; // only allow register 1
}
# endif
} // raw_unfiltered_in
// Scan raw counters to populate Hwcentry fields from matching static_tables entries
// Also populate reg_list for aliases found in table_copy[]
for ( int uu = 0 ; uu < raw_out - > sz ; uu + + )
{
Hwcentry * praw = ( Hwcentry * ) raw_out - > array [ uu ] ;
Hwcentry * pstd = NULL ; // set if non-alias entry from std table matches
char * name = praw - > name ;
/* in the standard counter and generic lists,
update reg_list for all matching items */
for ( int tt = 0 ; tt < NUM_TABLES ; tt + + )
{ // std, generic, and hidden
if ( table_copy [ tt ] . sz = = 0 )
continue ;
Hwcentry * * array = ( Hwcentry * * ) table_copy [ tt ] . array ;
for ( int jj = 0 ; array [ jj ] ; jj + + )
{ // all table counters
Hwcentry * pctr = array [ jj ] ;
char * pname ;
if ( pctr - > int_name )
pname = pctr - > int_name ;
else
pname = pctr - > name ;
if ( ! is_same ( name , pname , ' ~ ' ) )
continue ;
/* truncated pname matches <name>... */
// check to see if table entry applies only to specific register
int specific_reg_num_only = 0 ;
if ( pctr - > reg_num ! = REGNO_ANY )
{
// table entry applies only to specific register
if ( ! regno_is_valid ( praw , pctr - > reg_num ) )
continue ;
specific_reg_num_only = 1 ;
}
// Match!
// Update cpu_table_copy's supported registers
if ( specific_reg_num_only )
regno_add ( pctr , pctr - > reg_num ) ;
else
pctr - > reg_list = praw - > reg_list ;
if ( ! is_visible_alias ( pctr ) & & ! is_hidden_alias ( pctr ) )
{
// Note: we could expand criteria to also allow aliases to set default rates for raw HWCs
/* This is an 'internal' raw counter */
if ( ! pstd )
pstd = pctr ; /* use info as a template when adding to raw list */
else
hwcentry_print ( DBG_LT0 , " hwctable: hwc_cb: Warning: "
" counter %s appears in table more than once: " ,
pstd ) ;
}
} /* for table rows */
} /* for std and generic tables */
if ( pstd )
{
/* the main table had an entry that matched <name> exactly */
/* Apply the main table entry as a template */
* praw = * pstd ;
}
} /* for (raw_out) */
// update std_out and hidden_out
for ( int tt = 0 ; tt < NUM_TABLES ; tt + + )
{
if ( tt = = 1 /*skip std_raw*/ | | table_copy [ tt ] . sz = = 0 )
continue ;
Hwcentry * pctr ;
for ( int ii = 0 ; ( pctr = table_copy [ tt ] . array [ ii ] ) ; ii + + )
{
// prune unsupported rows from std table
if ( ! is_visible_alias ( pctr ) & & ! is_hidden_alias ( pctr ) )
continue ; // only aliases
if ( REG_LIST_IS_EMPTY ( pctr - > reg_list ) )
{
if ( is_numeric_alias ( pctr ) )
{
# if 1 //22844570 DTrace cpc provider does not accept numeric counter names
if ( forKernel )
continue ;
# endif
regno_add ( pctr , REGNO_ANY ) ; // hwcs specified by number allowed on any register
}
else
continue ;
}
ptr_list * dest = ( tt = = 0 ) ? std_out : hidden_out ;
Hwcentry * isInList ;
if ( pctr - > short_desc = = NULL )
{
isInList = ptrarray_find_by_name ( ( Hwcentry * * ) raw_out - > array , pctr - > int_name ) ;
if ( isInList )
pctr - > short_desc = isInList - > short_desc ; // copy the raw counter's detailed description
}
isInList = ptrarray_find_by_name ( ( Hwcentry * * ) dest - > array , pctr - > name ) ;
if ( isInList )
hwcentry_print ( DBG_LT0 , " hwctable: hwc_cb: Warning: "
" counter %s appears in alias list more than once: " ,
pctr ) ;
else
list_append_shallow_copy ( dest , pctr ) ;
}
}
for ( int tt = 0 ; tt < NUM_TABLES ; tt + + )
ptr_list_free ( & table_copy [ tt ] ) ;
if ( forKernel )
{
// for er_kernel, use baseline value of PRELOAD_DEF_ERKERNEL instead of PRELOAD_DEF
for ( int tt = 0 ; tt < 3 ; tt + + )
{ // std_out-0, raw_out-1, hidden_out-2
Hwcentry * * hwcs = ( Hwcentry * * ) ( s_outbufs [ tt ] . array ) ;
for ( int ii = 0 ; hwcs & & hwcs [ ii ] ; ii + + )
{
Hwcentry * hwc = hwcs [ ii ] ;
if ( hwc - > val = = PRELOAD_DEF )
hwc - > val = PRELOAD_DEF_ERKERNEL ;
}
}
}
* pstd_out = ( Hwcentry * * ) std_out - > array ;
* praw_out = ( Hwcentry * * ) raw_out - > array ;
* phidden_out = ( Hwcentry * * ) hidden_out - > array ;
}
/* callback, (see setup_cpc()) called for each valid attribute */
/* builds attrlist */
static void
attrs_cb ( const char * attr )
{
Tprintf ( DBG_LT3 , " hwctable: attrs_cb(): %s \n " , attr ) ;
if ( strcmp ( attr , " picnum " ) = = 0 )
return ; /* don't make this attribute available to users */
ptr_list_add ( & unfiltered_attrs , ( void * ) strdup ( attr ) ) ;
}
/* returns true if attribute is valid for this platform */
static int
attr_is_valid ( int forKernel , const char * attr )
{
setup_cpcx ( ) ;
if ( ! VALID_FOR_KERNEL ( forKernel ) | | ! cpcx_attrs [ forKernel ] )
return 0 ;
for ( int ii = 0 ; cpcx_attrs [ forKernel ] [ ii ] ; ii + + )
if ( strcmp ( attr , cpcx_attrs [ forKernel ] [ ii ] ) = = 0 )
return 1 ;
return 0 ;
}