Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef __PFMLIB_H__
00023 #define __PFMLIB_H__
00024
00025 #ifdef __cplusplus
00026 extern "C" {
00027 #endif
00028 #include <stdio.h>
00029 #include <inttypes.h>
00030
00031 #include <perfmon/pfmlib_os.h>
00032 #include <perfmon/pfmlib_comp.h>
00033
00034 #define PFMLIB_VERSION (3 << 16 | 9)
00035 #define PFMLIB_MAJ_VERSION(v) ((v)>>16)
00036 #define PFMLIB_MIN_VERSION(v) ((v) & 0xffff)
00037
00038
00039
00040
00041 #define PFMLIB_MAX_PMCS 512
00042 #define PFMLIB_MAX_PMDS 512
00043
00044
00045
00046
00047
00048
00049
00050 #define PFM_PLM0 0x1
00051 #define PFM_PLM1 0x2
00052 #define PFM_PLM2 0x4
00053 #define PFM_PLM3 0x8
00054
00055
00056
00057
00058 typedef unsigned long pfmlib_regmask_bits_t;
00059
00060
00061
00062
00063 #if PFMLIB_MAX_PMCS > PFMLIB_MAX_PMDS
00064 #define PFMLIB_REG_MAX PFMLIB_MAX_PMCS
00065 #else
00066 #define PFMLIB_REG_MAX PFMLIB_MAX_PMDS
00067 #endif
00068
00069 #ifndef SWIG
00070 #define __PFMLIB_REG_BV_BITS (sizeof(pfmlib_regmask_bits_t)<<3)
00071 #define PFMLIB_BVSIZE(x) (((x)+(__PFMLIB_REG_BV_BITS)-1) / __PFMLIB_REG_BV_BITS)
00072 #define PFMLIB_REG_BV PFMLIB_BVSIZE(PFMLIB_REG_MAX)
00073 #endif
00074
00075 typedef struct {
00076 pfmlib_regmask_bits_t bits[PFMLIB_REG_BV];
00077 } pfmlib_regmask_t;
00078
00079
00080 #define PFMLIB_MAX_MASKS_PER_EVENT 48
00081
00082
00083
00084
00085 typedef struct {
00086 unsigned int event;
00087 unsigned int plm;
00088 unsigned long flags;
00089 unsigned int unit_masks[PFMLIB_MAX_MASKS_PER_EVENT];
00090 unsigned int num_masks;
00091 unsigned long reserved[2];
00092 } pfmlib_event_t;
00093
00094
00095
00096
00097 typedef struct {
00098 unsigned long long reg_value;
00099 unsigned long long reg_addr;
00100 unsigned int reg_num;
00101 unsigned int reg_reserved1;
00102 unsigned long reg_alt_addr;
00103 } pfmlib_reg_t;
00104
00105
00106
00107
00108 typedef struct {
00109 unsigned int pfp_event_count;
00110 unsigned int pfp_dfl_plm;
00111 unsigned int pfp_flags;
00112 unsigned int reserved1;
00113 pfmlib_event_t pfp_events[PFMLIB_MAX_PMCS];
00114 pfmlib_regmask_t pfp_unavail_pmcs;
00115 unsigned long reserved[6];
00116 } pfmlib_input_param_t;
00117
00118
00119
00120
00121 #define PFMLIB_PFP_SYSTEMWIDE 0x1
00122
00123
00124
00125
00126 typedef struct {
00127 unsigned int pfp_pmc_count;
00128 unsigned int pfp_pmd_count;
00129 pfmlib_reg_t pfp_pmcs[PFMLIB_MAX_PMCS];
00130 pfmlib_reg_t pfp_pmds[PFMLIB_MAX_PMDS];
00131 unsigned long reserved[7];
00132 } pfmlib_output_param_t;
00133
00134
00135
00136
00137 typedef struct {
00138 unsigned int pfm_debug:1;
00139 unsigned int pfm_verbose:1;
00140 unsigned int pfm_reserved:30;
00141 } pfmlib_options_t;
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151 typedef int pfm_err_t;
00152
00153 extern pfm_err_t pfm_set_options(pfmlib_options_t *opt);
00154 extern pfm_err_t pfm_initialize(void);
00155
00156 extern pfm_err_t pfm_list_supported_pmus(int (*pf)(const char *fmt,...));
00157 extern pfm_err_t pfm_get_pmu_name(char *name, int maxlen);
00158 extern pfm_err_t pfm_get_pmu_type(int *type);
00159 extern pfm_err_t pfm_get_pmu_name_bytype(int type, char *name, size_t maxlen);
00160 extern pfm_err_t pfm_is_pmu_supported(int type);
00161 extern pfm_err_t pfm_force_pmu(int type);
00162
00163
00164
00165
00166 extern pfm_err_t pfm_find_event(const char *str, unsigned int *idx);
00167 extern pfm_err_t pfm_find_event_byname(const char *name, unsigned int *idx);
00168 extern pfm_err_t pfm_find_event_bycode(int code, unsigned int *idx);
00169 extern pfm_err_t pfm_find_event_bycode_next(int code, unsigned int start,
00170 unsigned int *next);
00171 extern pfm_err_t pfm_find_event_mask(unsigned int event_idx, const char *str,
00172 unsigned int *mask_idx);
00173 extern pfm_err_t pfm_find_full_event(const char *str, pfmlib_event_t *e);
00174
00175 extern pfm_err_t pfm_get_max_event_name_len(size_t *len);
00176
00177 extern pfm_err_t pfm_get_num_events(unsigned int *count);
00178 extern pfm_err_t pfm_get_num_event_masks(unsigned int event_idx,
00179 unsigned int *count);
00180 extern pfm_err_t pfm_get_event_name(unsigned int idx, char *name,
00181 size_t maxlen);
00182 extern pfm_err_t pfm_get_full_event_name(pfmlib_event_t *e, char *name,
00183 size_t maxlen);
00184 extern pfm_err_t pfm_get_event_code(unsigned int idx, int *code);
00185 extern pfm_err_t pfm_get_event_mask_code(unsigned int idx,
00186 unsigned int mask_idx,
00187 unsigned int *code);
00188 extern pfm_err_t pfm_get_event_counters(unsigned int idx,
00189 pfmlib_regmask_t *counters);
00190 extern pfm_err_t pfm_get_event_description(unsigned int idx, char **str);
00191 extern pfm_err_t pfm_get_event_code_counter(unsigned int idx, unsigned int cnt,
00192 int *code);
00193 extern pfm_err_t pfm_get_event_mask_name(unsigned int event_idx,
00194 unsigned int mask_idx,
00195 char *name, size_t maxlen);
00196 extern pfm_err_t pfm_get_event_mask_description(unsigned int event_idx,
00197 unsigned int mask_idx,
00198 char **desc);
00199
00200 extern pfm_err_t pfm_dispatch_events(pfmlib_input_param_t *p,
00201 void *model_in,
00202 pfmlib_output_param_t *q,
00203 void *model_out);
00204
00205 extern pfm_err_t pfm_get_impl_pmcs(pfmlib_regmask_t *impl_pmcs);
00206 extern pfm_err_t pfm_get_impl_pmds(pfmlib_regmask_t *impl_pmds);
00207 extern pfm_err_t pfm_get_impl_counters(pfmlib_regmask_t *impl_counters);
00208 extern pfm_err_t pfm_get_num_pmds(unsigned int *num);
00209 extern pfm_err_t pfm_get_num_pmcs(unsigned int *num);
00210 extern pfm_err_t pfm_get_num_counters(unsigned int *num);
00211
00212 extern pfm_err_t pfm_get_hw_counter_width(unsigned int *width);
00213 extern pfm_err_t pfm_get_version(unsigned int *version);
00214 extern char *pfm_strerror(int code);
00215 extern pfm_err_t pfm_get_cycle_event(pfmlib_event_t *e);
00216 extern pfm_err_t pfm_get_inst_retired_event(pfmlib_event_t *e);
00217
00218
00219
00220
00221 #define PFMLIB_NO_PMU -1
00222 #define PFMLIB_UNKNOWN_PMU 0
00223 #define PFMLIB_GEN_IA64_PMU 1
00224 #define PFMLIB_ITANIUM_PMU 2
00225 #define PFMLIB_ITANIUM2_PMU 3
00226 #define PFMLIB_MONTECITO_PMU 4
00227 #define PFMLIB_AMD64_PMU 16
00228 #define PFMLIB_GEN_IA32_PMU 63
00229 #define PFMLIB_I386_P6_PMU 32
00230 #define PFMLIB_PENTIUM4_PMU 33
00231 #define PFMLIB_COREDUO_PMU 34
00232 #define PFMLIB_I386_PM_PMU 35
00233 #define PFMLIB_CORE_PMU 36
00234 #define PFMLIB_INTEL_CORE_PMU 36
00235 #define PFMLIB_INTEL_PPRO_PMU 37
00236 #define PFMLIB_INTEL_PII_PMU 38
00237 #define PFMLIB_INTEL_ATOM_PMU 39
00238 #define PFMLIB_INTEL_NHM_PMU 40
00239 #define PFMLIB_INTEL_WSM_PMU 41
00240
00241 #define PFMLIB_MIPS_20KC_PMU 64
00242 #define PFMLIB_MIPS_24K_PMU 65
00243 #define PFMLIB_MIPS_25KF_PMU 66
00244 #define PFMLIB_MIPS_34K_PMU 67
00245 #define PFMLIB_MIPS_5KC_PMU 68
00246 #define PFMLIB_MIPS_74K_PMU 69
00247 #define PFMLIB_MIPS_R10000_PMU 70
00248 #define PFMLIB_MIPS_R12000_PMU 71
00249 #define PFMLIB_MIPS_RM7000_PMU 72
00250 #define PFMLIB_MIPS_RM9000_PMU 73
00251 #define PFMLIB_MIPS_SB1_PMU 74
00252 #define PFMLIB_MIPS_VR5432_PMU 75
00253 #define PFMLIB_MIPS_VR5500_PMU 76
00254 #define PFMLIB_MIPS_ICE9A_PMU 77
00255 #define PFMLIB_MIPS_ICE9B_PMU 78
00256
00257 #define PFMLIB_POWERPC_PMU 90
00258
00259 #define PFMLIB_CRAYX2_PMU 96
00260
00261 #define PFMLIB_CELL_PMU 100
00262
00263 #define PFMLIB_PPC970_PMU 110
00264 #define PFMLIB_PPC970MP_PMU 111
00265 #define PFMLIB_POWER3_PMU 112
00266 #define PFMLIB_POWER4_PMU 113
00267 #define PFMLIB_POWER5_PMU 114
00268 #define PFMLIB_POWER5p_PMU 115
00269 #define PFMLIB_POWER6_PMU 116
00270 #define PFMLIB_POWER7_PMU 117
00271
00272 #define PFMLIB_SPARC_ULTRA12_PMU 130
00273 #define PFMLIB_SPARC_ULTRA3_PMU 131
00274 #define PFMLIB_SPARC_ULTRA3I_PMU 132
00275 #define PFMLIB_SPARC_ULTRA3PLUS_PMU 133
00276 #define PFMLIB_SPARC_ULTRA4PLUS_PMU 134
00277 #define PFMLIB_SPARC_NIAGARA1_PMU 135
00278 #define PFMLIB_SPARC_NIAGARA2_PMU 136
00279
00280
00281
00282
00283 #define PFMLIB_SUCCESS 0
00284 #define PFMLIB_ERR_NOTSUPP -1
00285 #define PFMLIB_ERR_INVAL -2
00286 #define PFMLIB_ERR_NOINIT -3
00287 #define PFMLIB_ERR_NOTFOUND -4
00288 #define PFMLIB_ERR_NOASSIGN -5
00289 #define PFMLIB_ERR_FULL -6
00290 #define PFMLIB_ERR_EVTMANY -7
00291 #define PFMLIB_ERR_MAGIC -8
00292 #define PFMLIB_ERR_FEATCOMB -9
00293 #define PFMLIB_ERR_EVTSET -10
00294 #define PFMLIB_ERR_EVTINCOMP -11
00295 #define PFMLIB_ERR_TOOMANY -12
00296
00297 #define PFMLIB_ERR_IRRTOOBIG -13
00298 #define PFMLIB_ERR_IRREMPTY -14
00299 #define PFMLIB_ERR_IRRINVAL -15
00300 #define PFMLIB_ERR_IRRTOOMANY -16
00301 #define PFMLIB_ERR_DRRINVAL -17
00302 #define PFMLIB_ERR_DRRTOOMANY -18
00303 #define PFMLIB_ERR_BADHOST -19
00304 #define PFMLIB_ERR_IRRALIGN -20
00305 #define PFMLIB_ERR_IRRFLAGS -21
00306 #define PFMLIB_ERR_UMASK -22
00307 #define PFMLIB_ERR_NOMEM -23
00308
00309 #define __PFMLIB_REGMASK_EL(g) ((g)/__PFMLIB_REG_BV_BITS)
00310 #define __PFMLIB_REGMASK_MASK(g) (((pfmlib_regmask_bits_t)1) << ((g) % __PFMLIB_REG_BV_BITS))
00311
00312 static inline int
00313 pfm_regmask_isset(pfmlib_regmask_t *h, unsigned int b)
00314 {
00315 if (b >= PFMLIB_REG_MAX)
00316 return 0;
00317 return (h->bits[__PFMLIB_REGMASK_EL(b)] & __PFMLIB_REGMASK_MASK(b)) != 0;
00318 }
00319
00320 static inline int
00321 pfm_regmask_set(pfmlib_regmask_t *h, unsigned int b)
00322 {
00323 if (b >= PFMLIB_REG_MAX)
00324 return PFMLIB_ERR_INVAL;
00325
00326 h->bits[__PFMLIB_REGMASK_EL(b)] |= __PFMLIB_REGMASK_MASK(b);
00327
00328 return PFMLIB_SUCCESS;
00329 }
00330
00331 static inline int
00332 pfm_regmask_clr(pfmlib_regmask_t *h, unsigned int b)
00333 {
00334 if (h == NULL || b >= PFMLIB_REG_MAX)
00335 return PFMLIB_ERR_INVAL;
00336
00337 h->bits[__PFMLIB_REGMASK_EL(b)] &= ~ __PFMLIB_REGMASK_MASK(b);
00338
00339 return PFMLIB_SUCCESS;
00340 }
00341
00342 static inline int
00343 pfm_regmask_weight(pfmlib_regmask_t *h, unsigned int *w)
00344 {
00345 unsigned int pos;
00346 unsigned int weight = 0;
00347
00348 if (h == NULL || w == NULL)
00349 return PFMLIB_ERR_INVAL;
00350
00351 for (pos = 0; pos < PFMLIB_REG_BV; pos++) {
00352 weight += (unsigned int)pfmlib_popcnt(h->bits[pos]);
00353 }
00354 *w = weight;
00355 return PFMLIB_SUCCESS;
00356 }
00357
00358 static inline int
00359 pfm_regmask_eq(pfmlib_regmask_t *h1, pfmlib_regmask_t *h2)
00360 {
00361 unsigned int pos;
00362
00363 if (h1 == NULL || h2 == NULL)
00364 return 0;
00365
00366 for (pos = 0; pos < PFMLIB_REG_BV; pos++) {
00367 if (h1->bits[pos] != h2->bits[pos]) return 0;
00368 }
00369 return 1;
00370 }
00371
00372 static inline int
00373 pfm_regmask_and(pfmlib_regmask_t *dst, pfmlib_regmask_t *h1, pfmlib_regmask_t *h2)
00374 {
00375 unsigned int pos;
00376 if (dst == NULL || h1 == NULL || h2 == NULL)
00377 return PFMLIB_ERR_INVAL;
00378
00379 for (pos = 0; pos < PFMLIB_REG_BV; pos++) {
00380 dst->bits[pos] = h1->bits[pos] & h2->bits[pos];
00381 }
00382 return PFMLIB_SUCCESS;
00383 }
00384
00385 static inline int
00386 pfm_regmask_andnot(pfmlib_regmask_t *dst, pfmlib_regmask_t *h1, pfmlib_regmask_t *h2)
00387 {
00388 unsigned int pos;
00389 if (dst == NULL || h1 == NULL || h2 == NULL)
00390 return PFMLIB_ERR_INVAL;
00391
00392 for (pos = 0; pos < PFMLIB_REG_BV; pos++) {
00393 dst->bits[pos] = h1->bits[pos] & ~h2->bits[pos];
00394 }
00395 return PFMLIB_SUCCESS;
00396 }
00397
00398 static inline int
00399 pfm_regmask_or(pfmlib_regmask_t *dst, pfmlib_regmask_t *h1, pfmlib_regmask_t *h2)
00400 {
00401 unsigned int pos;
00402 if (dst == NULL || h1 == NULL || h2 == NULL)
00403 return PFMLIB_ERR_INVAL;
00404
00405 for (pos = 0; pos < PFMLIB_REG_BV; pos++) {
00406 dst->bits[pos] = h1->bits[pos] | h2->bits[pos];
00407 }
00408 return PFMLIB_SUCCESS;
00409 }
00410
00411 static inline int
00412 pfm_regmask_copy(pfmlib_regmask_t *dst, pfmlib_regmask_t *src)
00413 {
00414 unsigned int pos;
00415 if (dst == NULL || src == NULL)
00416 return PFMLIB_ERR_INVAL;
00417
00418 for (pos = 0; pos < PFMLIB_REG_BV; pos++) {
00419 dst->bits[pos] = src->bits[pos];
00420 }
00421 return PFMLIB_SUCCESS;
00422 }
00423 static inline int
00424 pfm_regmask_not(pfmlib_regmask_t *dst)
00425 {
00426 unsigned int pos;
00427 if (dst == NULL)
00428 return PFMLIB_ERR_INVAL;
00429
00430 for (pos = 0; pos < PFMLIB_REG_BV; pos++) {
00431 dst->bits[pos] = ~dst->bits[pos];
00432 }
00433 return PFMLIB_SUCCESS;
00434 }
00435
00436 #ifdef __cplusplus
00437 }
00438 #endif
00439
00440 #endif