Gaudi Framework, version v23r2

Home   Generated: Thu Jun 28 2012

pfmlib_intel_nhm.h

Go to the documentation of this file.
00001 /*
00002  * Intel Nehalem PMU
00003  *
00004  * Copyright (c) 2008 Google, Inc
00005  * Contributed by Stephane Eranian <eranian@gmail.com>
00006  *
00007  * Permission is hereby granted, free of charge, to any person obtaining a copy
00008  * of this software and associated documentation files (the "Software"), to deal
00009  * in the Software without restriction, including without limitation the rights
00010  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
00011  * of the Software, and to permit persons to whom the Software is furnished to do so,
00012  * subject to the following conditions:
00013  *
00014  * The above copyright notice and this permission notice shall be included in all
00015  * copies or substantial portions of the Software.
00016  *
00017  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
00018  * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
00019  * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
00020  * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
00021  * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
00022  * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
00023  */
00024 #ifndef __PFMLIB_NHM_H__
00025 #define __PFMLIB_NHM_H__
00026 
00027 #include <perfmon/pfmlib.h>
00028 /*
00029  * privilege level mask usage for Intel Core
00030  *
00031  * PFM_PLM0 = OS (kernel, hypervisor, ..)
00032  * PFM_PLM1 = unused (ignored)
00033  * PFM_PLM2 = unused (ignored)
00034  * PFM_PLM3 = USR (user level)
00035  */
00036 
00037 #ifdef __cplusplus
00038 extern "C" {
00039 #endif
00040 
00041 /*
00042  * total number of counters:
00043  *      - 4 generic core
00044  *      - 3 fixed core
00045  *      - 1 uncore fixed
00046  *      - 8 uncore generic
00047  */
00048 #define PMU_NHM_NUM_COUNTERS 16
00049 
00050 typedef union {
00051         unsigned long long val;                 /* complete register value */
00052         struct {
00053                 unsigned long sel_event:8;      /* event mask */
00054                 unsigned long sel_umask:8;      /* unit mask */
00055                 unsigned long sel_usr:1;        /* user level */
00056                 unsigned long sel_os:1;         /* system level */
00057                 unsigned long sel_edge:1;       /* edge detec */
00058                 unsigned long sel_pc:1;         /* pin control */
00059                 unsigned long sel_int:1;        /* enable APIC intr */
00060                 unsigned long sel_anythr:1;     /* measure any thread */
00061                 unsigned long sel_en:1;         /* enable */
00062                 unsigned long sel_inv:1;        /* invert counter mask */
00063                 unsigned long sel_cnt_mask:8;   /* counter mask */
00064                 unsigned long sel_res2:32;
00065         } perfevtsel;
00066         struct {
00067                 unsigned long usel_event:8;     /* event select */
00068                 unsigned long usel_umask:8;     /* event unit mask */
00069                 unsigned long usel_res1:1;      /* reserved */
00070                 unsigned long usel_occ:1;       /* occupancy reset */
00071                 unsigned long usel_edge:1;      /* edge detection */
00072                 unsigned long usel_res2:1;      /* reserved */
00073                 unsigned long usel_int:1;       /* PMI enable */
00074                 unsigned long usel_res3:1;      /* reserved */
00075                 unsigned long usel_en:1;                /* enable */
00076                 unsigned long usel_inv:1;       /* invert */
00077                 unsigned long usel_cnt_mask:8;  /* counter mask */
00078                 unsigned long usel_res4:32;     /* reserved */
00079         } unc_perfevtsel;
00080         struct {
00081                 unsigned long cpl_eq0:1;        /* filter out branches at pl0 */
00082                 unsigned long cpl_neq0:1;       /* filter out branches at pl1-pl3 */
00083                 unsigned long jcc:1;            /* filter out condition branches */
00084                 unsigned long near_rel_call:1;  /* filter out near relative calls */
00085                 unsigned long near_ind_call:1;  /* filter out near indirect calls */
00086                 unsigned long near_ret:1;       /* filter out near returns */
00087                 unsigned long near_ind_jmp:1;   /* filter out near unconditional jmp/calls */
00088                 unsigned long near_rel_jmp:1;   /* filter out near uncoditional relative jmp */
00089                 unsigned long far_branch:1;     /* filter out far branches */ 
00090                 unsigned long reserved1:23;     /* reserved */
00091                 unsigned long reserved2:32;     /* reserved */
00092         } lbr_select;
00093 } pfm_nhm_sel_reg_t;
00094 
00095 typedef struct {
00096         unsigned long           cnt_mask;       /* counter mask (occurences) */
00097         unsigned int            flags;          /* counter specific flag */
00098 } pfmlib_nhm_counter_t;
00099 
00100 /*
00101  * flags for pfmlib_nhm_counter_t
00102  */
00103 #define PFM_NHM_SEL_INV         0x1     /* inverse */
00104 #define PFM_NHM_SEL_EDGE        0x2     /* edge detect */
00105 #define PFM_NHM_SEL_ANYTHR      0x4     /* any thread (core only) */
00106 #define PFM_NHM_SEL_OCC_RST     0x8     /* reset occupancy (uncore only) */
00107 
00108 typedef struct {
00109         unsigned int lbr_used;  /* set to 1 if LBR is used */
00110         unsigned int lbr_plm;   /* priv level PLM0 or PLM3 */
00111         unsigned int lbr_filter;/* filters */
00112 } pfmlib_nhm_lbr_t;
00113 
00114 /*
00115  * lbr_filter: filter out branches
00116  * refer to IA32 SDM vol3b section 18.6.2
00117  */
00118 #define PFM_NHM_LBR_JCC                 0x4  /* do not capture conditional branches */
00119 #define PFM_NHM_LBR_NEAR_REL_CALL       0x8  /* do not capture near calls */
00120 #define PFM_NHM_LBR_NEAR_IND_CALL       0x10 /* do not capture indirect calls */
00121 #define PFM_NHM_LBR_NEAR_RET            0x20 /* do not capture near returns */
00122 #define PFM_NHM_LBR_NEAR_IND_JMP        0x40 /* do not capture indirect jumps */
00123 #define PFM_NHM_LBR_NEAR_REL_JMP        0x80 /* do not capture near relative jumps */
00124 #define PFM_NHM_LBR_FAR_BRANCH          0x100/* do not capture far branches */
00125 #define PFM_NHM_LBR_ALL                 0x1fc /* filter out all branches */
00126 
00127 /*
00128  * PEBS input parameters
00129  */
00130 typedef struct {
00131         unsigned int pebs_used;         /* set to 1 if PEBS is used */
00132         unsigned int ld_lat_thres;      /* load latency threshold (cycles) */
00133 } pfmlib_nhm_pebs_t;
00134 
00135 
00136 /*
00137  * model-specific input parameter to pfm_dispatch_events()
00138  */
00139 typedef struct {
00140         pfmlib_nhm_counter_t    pfp_nhm_counters[PMU_NHM_NUM_COUNTERS];
00141         pfmlib_nhm_pebs_t       pfp_nhm_pebs;   /* PEBS settings */
00142         pfmlib_nhm_lbr_t        pfp_nhm_lbr;    /* LBR settings */
00143         uint64_t                reserved[4];    /* for future use */
00144 } pfmlib_nhm_input_param_t;
00145 
00146 /*
00147  * no pfmlib_nhm_output_param_t defined
00148  */
00149 
00150 /*
00151  * Model-specific interface
00152  * can be called directly
00153  */
00154 extern int pfm_nhm_is_pebs(pfmlib_event_t *e);
00155 extern int pfm_nhm_is_uncore(pfmlib_event_t *e);
00156 extern int pfm_nhm_data_src_desc(unsigned int val, char **desc);
00157 
00158 #ifdef __cplusplus /* extern C */
00159 }
00160 #endif
00161 
00162 #endif /* __PFMLIB_NHM_H__ */
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines

Generated at Thu Jun 28 2012 23:27:27 for Gaudi Framework, version v23r2 by Doxygen version 1.7.2 written by Dimitri van Heesch, © 1997-2004