The Gaudi Framework  v29r0 (ff2e7097)
pfmlib_intel_nhm.h
Go to the documentation of this file.
1 /*
2  * Intel Nehalem PMU
3  *
4  * Copyright (c) 2008 Google, Inc
5  * Contributed by Stephane Eranian <eranian@gmail.com>
6  *
7  * Permission is hereby granted, free of charge, to any person obtaining a copy
8  * of this software and associated documentation files (the "Software"), to deal
9  * in the Software without restriction, including without limitation the rights
10  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
11  * of the Software, and to permit persons to whom the Software is furnished to do so,
12  * subject to the following conditions:
13  *
14  * The above copyright notice and this permission notice shall be included in all
15  * copies or substantial portions of the Software.
16  *
17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
18  * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
19  * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
20  * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
21  * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
22  * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23  */
24 #ifndef __PFMLIB_NHM_H__
25 #define __PFMLIB_NHM_H__
26 
27 #include <perfmon/pfmlib.h>
28 /*
29  * privilege level mask usage for Intel Core
30  *
31  * PFM_PLM0 = OS (kernel, hypervisor, ..)
32  * PFM_PLM1 = unused (ignored)
33  * PFM_PLM2 = unused (ignored)
34  * PFM_PLM3 = USR (user level)
35  */
36 
37 #ifdef __cplusplus
38 extern "C" {
39 #endif
40 
41 /*
42  * total number of counters:
43  * - 4 generic core
44  * - 3 fixed core
45  * - 1 uncore fixed
46  * - 8 uncore generic
47  */
48 #define PMU_NHM_NUM_COUNTERS 16
49 
50 typedef union {
51  unsigned long long val; /* complete register value */
52  struct {
53  unsigned long sel_event : 8; /* event mask */
54  unsigned long sel_umask : 8; /* unit mask */
55  unsigned long sel_usr : 1; /* user level */
56  unsigned long sel_os : 1; /* system level */
57  unsigned long sel_edge : 1; /* edge detec */
58  unsigned long sel_pc : 1; /* pin control */
59  unsigned long sel_int : 1; /* enable APIC intr */
60  unsigned long sel_anythr : 1; /* measure any thread */
61  unsigned long sel_en : 1; /* enable */
62  unsigned long sel_inv : 1; /* invert counter mask */
63  unsigned long sel_cnt_mask : 8; /* counter mask */
64  unsigned long sel_res2 : 32;
65  } perfevtsel;
66  struct {
67  unsigned long usel_event : 8; /* event select */
68  unsigned long usel_umask : 8; /* event unit mask */
69  unsigned long usel_res1 : 1; /* reserved */
70  unsigned long usel_occ : 1; /* occupancy reset */
71  unsigned long usel_edge : 1; /* edge detection */
72  unsigned long usel_res2 : 1; /* reserved */
73  unsigned long usel_int : 1; /* PMI enable */
74  unsigned long usel_res3 : 1; /* reserved */
75  unsigned long usel_en : 1; /* enable */
76  unsigned long usel_inv : 1; /* invert */
77  unsigned long usel_cnt_mask : 8; /* counter mask */
78  unsigned long usel_res4 : 32; /* reserved */
79  } unc_perfevtsel;
80  struct {
81  unsigned long cpl_eq0 : 1; /* filter out branches at pl0 */
82  unsigned long cpl_neq0 : 1; /* filter out branches at pl1-pl3 */
83  unsigned long jcc : 1; /* filter out condition branches */
84  unsigned long near_rel_call : 1; /* filter out near relative calls */
85  unsigned long near_ind_call : 1; /* filter out near indirect calls */
86  unsigned long near_ret : 1; /* filter out near returns */
87  unsigned long near_ind_jmp : 1; /* filter out near unconditional jmp/calls */
88  unsigned long near_rel_jmp : 1; /* filter out near uncoditional relative jmp */
89  unsigned long far_branch : 1; /* filter out far branches */
90  unsigned long reserved1 : 23; /* reserved */
91  unsigned long reserved2 : 32; /* reserved */
92  } lbr_select;
94 
95 typedef struct {
96  unsigned long cnt_mask; /* counter mask (occurences) */
97  unsigned int flags; /* counter specific flag */
99 
100 /*
101  * flags for pfmlib_nhm_counter_t
102  */
103 #define PFM_NHM_SEL_INV 0x1 /* inverse */
104 #define PFM_NHM_SEL_EDGE 0x2 /* edge detect */
105 #define PFM_NHM_SEL_ANYTHR 0x4 /* any thread (core only) */
106 #define PFM_NHM_SEL_OCC_RST 0x8 /* reset occupancy (uncore only) */
107 
108 typedef struct {
109  unsigned int lbr_used; /* set to 1 if LBR is used */
110  unsigned int lbr_plm; /* priv level PLM0 or PLM3 */
111  unsigned int lbr_filter; /* filters */
113 
114 /*
115  * lbr_filter: filter out branches
116  * refer to IA32 SDM vol3b section 18.6.2
117  */
118 #define PFM_NHM_LBR_JCC 0x4 /* do not capture conditional branches */
119 #define PFM_NHM_LBR_NEAR_REL_CALL 0x8 /* do not capture near calls */
120 #define PFM_NHM_LBR_NEAR_IND_CALL 0x10 /* do not capture indirect calls */
121 #define PFM_NHM_LBR_NEAR_RET 0x20 /* do not capture near returns */
122 #define PFM_NHM_LBR_NEAR_IND_JMP 0x40 /* do not capture indirect jumps */
123 #define PFM_NHM_LBR_NEAR_REL_JMP 0x80 /* do not capture near relative jumps */
124 #define PFM_NHM_LBR_FAR_BRANCH 0x100 /* do not capture far branches */
125 #define PFM_NHM_LBR_ALL 0x1fc /* filter out all branches */
126 
127 /*
128  * PEBS input parameters
129  */
130 typedef struct {
131  unsigned int pebs_used; /* set to 1 if PEBS is used */
132  unsigned int ld_lat_thres; /* load latency threshold (cycles) */
134 
135 /*
136  * model-specific input parameter to pfm_dispatch_events()
137  */
138 typedef struct {
140  pfmlib_nhm_pebs_t pfp_nhm_pebs; /* PEBS settings */
141  pfmlib_nhm_lbr_t pfp_nhm_lbr; /* LBR settings */
142  uint64_t reserved[4]; /* for future use */
144 
145 /*
146  * no pfmlib_nhm_output_param_t defined
147  */
148 
149 /*
150  * Model-specific interface
151  * can be called directly
152  */
153 extern int pfm_nhm_is_pebs( pfmlib_event_t* e );
154 extern int pfm_nhm_is_uncore( pfmlib_event_t* e );
155 extern int pfm_nhm_data_src_desc( unsigned int val, char** desc );
156 
157 #ifdef __cplusplus /* extern C */
158 }
159 #endif
160 
161 #endif /* __PFMLIB_NHM_H__ */
unsigned long long uint64_t
Definition: instrset.h:143
pfmlib_nhm_lbr_t pfp_nhm_lbr
int pfm_nhm_data_src_desc(unsigned int val, char **desc)
unsigned int ld_lat_thres
unsigned int lbr_used
#define PMU_NHM_NUM_COUNTERS
unsigned int pebs_used
unsigned int lbr_filter
pfmlib_nhm_pebs_t pfp_nhm_pebs
unsigned int lbr_plm
unsigned long cnt_mask
int pfm_nhm_is_uncore(pfmlib_event_t *e)
unsigned long long val
int pfm_nhm_is_pebs(pfmlib_event_t *e)