The Gaudi Framework  master (da3d77e1)
pfmlib_amd64.h
Go to the documentation of this file.
1 /*
2  * AMD64 PMU specific types and definitions (64 and 32 bit modes)
3  *
4  * Copyright (c) 2005-2006 Hewlett-Packard Development Company, L.P.
5  * Contributed by Stephane Eranian <eranian@hpl.hp.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 
25 #ifndef __PFMLIB_AMD64_H__
26 #define __PFMLIB_AMD64_H__
27 
28 #include <stdint.h>
29 
30 /*
31  * privilege level mask usage for AMD64:
32  *
33  * PFM_PLM0 = OS (kernel, hypervisor, ..)
34  * PFM_PLM1 = invalid parameters
35  * PFM_PLM2 = invalid parameters
36  * PFM_PLM3 = USR (user level)
37  */
38 
39 #ifdef __cplusplus
40 extern "C" {
41 #endif
42 
43 #define PMU_AMD64_MAX_COUNTERS 4 /* total numbers of performance counters */
44 
45 /*
46  * AMD64 MSR definitions
47  */
48 
49 typedef union {
50  uint64_t val; /* complete register value */
51  struct {
52  uint64_t sel_event_mask : 8; /* event mask */
53  uint64_t sel_unit_mask : 8; /* unit mask */
54  uint64_t sel_usr : 1; /* user level */
55  uint64_t sel_os : 1; /* system level */
56  uint64_t sel_edge : 1; /* edge detec */
57  uint64_t sel_pc : 1; /* pin control */
58  uint64_t sel_int : 1; /* enable APIC intr */
59  uint64_t sel_res1 : 1; /* reserved */
60  uint64_t sel_en : 1; /* enable */
61  uint64_t sel_inv : 1; /* invert counter mask */
62  uint64_t sel_cnt_mask : 8; /* counter mask */
63  uint64_t sel_event_mask2 : 4; /* 10h only: event mask [11:8] */
64  uint64_t sel_res2 : 4; /* reserved */
65  uint64_t sel_guest : 1; /* 10h only: guest only counter */
66  uint64_t sel_host : 1; /* 10h only: host only counter */
67  uint64_t sel_res3 : 22; /* reserved */
68  } perfsel;
69 } pfm_amd64_sel_reg_t; /* MSR 0xc001000-0xc001003 */
70 
71 typedef union {
72  uint64_t val; /* complete register value */
73  struct {
74  uint64_t ctr_count : 48; /* 48-bit hardware counter */
75  uint64_t ctr_res1 : 16; /* reserved */
76  } perfctr;
77 } pfm_amd64_ctr_reg_t; /* MSR 0xc001004-0xc001007 */
78 
79 typedef union {
80  uint64_t val; /* complete register value */
81  struct {
82  uint64_t ibsfetchmaxcnt : 16;
83  uint64_t ibsfetchcnt : 16;
84  uint64_t ibsfetchlat : 16;
85  uint64_t ibsfetchen : 1;
86  uint64_t ibsfetchval : 1;
87  uint64_t ibsfetchcomp : 1;
88  uint64_t ibsicmiss : 1;
89  uint64_t ibsphyaddrvalid : 1;
90  uint64_t ibsl1tlbpgsz : 2;
91  uint64_t ibsl1tlbmiss : 1;
92  uint64_t ibsl2tlbmiss : 1;
93  uint64_t ibsranden : 1;
94  uint64_t reserved : 6;
95  } reg;
96 } ibsfetchctl_t; /* MSR 0xc0011030 */
97 
98 typedef union {
99  uint64_t val; /* complete register value */
100  struct {
101  uint64_t ibsopmaxcnt : 16;
102  uint64_t reserved1 : 1;
103  uint64_t ibsopen : 1;
104  uint64_t ibsopval : 1;
105  uint64_t ibsopcntl : 1;
106  uint64_t reserved2 : 44;
107  } reg;
108 } ibsopctl_t; /* MSR 0xc0011033 */
109 
110 typedef union {
111  uint64_t val; /* complete register value */
112  struct {
113  uint64_t ibscomptoretctr : 16;
114  uint64_t ibstagtoretctr : 16;
115  uint64_t ibsopbrnresync : 1;
116  uint64_t ibsopmispreturn : 1;
117  uint64_t ibsopreturn : 1;
118  uint64_t ibsopbrntaken : 1;
119  uint64_t ibsopbrnmisp : 1;
120  uint64_t ibsopbrnret : 1;
121  uint64_t reserved : 26;
122  } reg;
123 } ibsopdata_t; /* MSR 0xc0011035 */
124 
125 typedef union {
126  uint64_t val; /* complete register value */
127  struct {
128  uint64_t nbibsreqsrc : 3;
129  uint64_t reserved1 : 1;
130  uint64_t nbibsreqdstproc : 1;
131  uint64_t nbibsreqcachehitst : 1;
132  uint64_t reserved2 : 58;
133  } reg;
134 } ibsopdata2_t; /* MSR 0xc0011036 */
135 
136 typedef union {
137  uint64_t val; /* complete register value */
138  struct {
139  uint64_t ibsldop : 1;
140  uint64_t ibsstop : 1;
141  uint64_t ibsdcl1tlbmiss : 1;
142  uint64_t ibsdcl2tlbmiss : 1;
143  uint64_t ibsdcl1tlbhit2m : 1;
144  uint64_t ibsdcl1tlbhit1g : 1;
145  uint64_t ibsdcl2tlbhit2m : 1;
146  uint64_t ibsdcmiss : 1;
147  uint64_t ibsdcmissacc : 1;
148  uint64_t ibsdcldbnkcon : 1;
149  uint64_t ibsdcstbnkcon : 1;
150  uint64_t ibsdcsttoldfwd : 1;
151  uint64_t ibsdcsttoldcan : 1;
152  uint64_t ibsdcucmemacc : 1;
153  uint64_t ibsdcwcmemacc : 1;
154  uint64_t ibsdclockedop : 1;
155  uint64_t ibsdcmabhit : 1;
156  uint64_t ibsdclinaddrvalid : 1;
157  uint64_t ibsdcphyaddrvalid : 1;
158  uint64_t reserved1 : 13;
159  uint64_t ibsdcmisslat : 16;
160  uint64_t reserved2 : 16;
161  } reg;
162 } ibsopdata3_t; /* MSR 0xc0011037 */
163 
164 /*
165  * AMD64 specific input parameters for the library
166  */
167 
168 typedef struct {
169  uint32_t cnt_mask; /* threshold ([4-255] are reserved) */
170  uint32_t flags; /* counter specific flag */
172 
173 #define PFM_AMD64_SEL_INV 0x1 /* inverse */
174 #define PFM_AMD64_SEL_EDGE 0x2 /* edge detect */
175 #define PFM_AMD64_SEL_GUEST 0x4 /* guest only */
176 #define PFM_AMD64_SEL_HOST 0x8 /* host only */
177 
178 /*
179  * IBS input parameters
180  *
181  * Maxcnt specifies the maximum count value of the periodic counter,
182  * 20 bits, bits 3:0 are always set to zero.
183  */
184 typedef struct {
185  unsigned int maxcnt;
186  unsigned int options;
187 } ibs_param_t;
188 
189 /*
190  * values for ibs_param_t.options
191  */
192 #define IBS_OPTIONS_RANDEN 1 /* enable randomization (IBS fetch only) */
193 #define IBS_OPTIONS_UOPS 1 /* count dispatched uops (IBS op only) */
194 
195 typedef struct {
196  pfmlib_amd64_counter_t pfp_amd64_counters[PMU_AMD64_MAX_COUNTERS]; /* extended counter features */
197  uint32_t flags; /* use flags */
198  uint32_t reserved1; /* for future use */
199  ibs_param_t ibsfetch; /* IBS fetch control */
200  ibs_param_t ibsop; /* IBS execution control */
201  uint64_t reserved2; /* for future use */
203 
204 /* A bit mask, meaning multiple usage types may be defined */
205 #define PFMLIB_AMD64_USE_IBSFETCH 1
206 #define PFMLIB_AMD64_USE_IBSOP 2
207 
208 /*
209  * AMD64 specific output parameters for the library
210  *
211  * The values ibsfetch_base and ibsop_base pass back the index of the
212  * ibsopctl and ibsfetchctl register in pfp_pmds[].
213  */
214 
215 typedef struct {
216  uint32_t ibsfetch_base; /* Perfmon2 base register index */
217  uint32_t ibsop_base; /* Perfmon2 base register index */
218  uint64_t reserved[7]; /* for future use */
220 
221 /* Perfmon2 registers relative to base register */
222 #define PMD_IBSFETCHCTL 0
223 #define PMD_IBSFETCHLINAD 1
224 #define PMD_IBSFETCHPHYSAD 2
225 #define PMD_IBSOPCTL 0
226 #define PMD_IBSOPRIP 1
227 #define PMD_IBSOPDATA 2
228 #define PMD_IBSOPDATA2 3
229 #define PMD_IBSOPDATA3 4
230 #define PMD_IBSDCLINAD 5
231 #define PMD_IBSDCPHYSAD 6
232 
233 #ifdef __cplusplus /* extern C */
234 }
235 #endif
236 
237 #endif /* __PFMLIB_AMD64_H__ */
ibsopdata3_t::ibsdcsttoldcan
uint64_t ibsdcsttoldcan
Definition: pfmlib_amd64.h:151
ibsopdata3_t::ibsdcmabhit
uint64_t ibsdcmabhit
Definition: pfmlib_amd64.h:155
pfm_amd64_sel_reg_t::sel_res1
uint64_t sel_res1
Definition: pfmlib_amd64.h:59
ibsopdata3_t::reserved1
uint64_t reserved1
Definition: pfmlib_amd64.h:158
ibsopdata_t::ibscomptoretctr
uint64_t ibscomptoretctr
Definition: pfmlib_amd64.h:113
ibsopdata2_t::nbibsreqdstproc
uint64_t nbibsreqdstproc
Definition: pfmlib_amd64.h:130
ibsopdata2_t::reserved2
uint64_t reserved2
Definition: pfmlib_amd64.h:132
pfm_amd64_sel_reg_t::sel_inv
uint64_t sel_inv
Definition: pfmlib_amd64.h:61
ibsopdata3_t::ibsdcl2tlbmiss
uint64_t ibsdcl2tlbmiss
Definition: pfmlib_amd64.h:142
pfmlib_amd64_counter_t::flags
uint32_t flags
Definition: pfmlib_amd64.h:170
ibs_param_t::maxcnt
unsigned int maxcnt
Definition: pfmlib_amd64.h:185
pfm_amd64_sel_reg_t::sel_cnt_mask
uint64_t sel_cnt_mask
Definition: pfmlib_amd64.h:62
ibsopdata3_t::ibsdclockedop
uint64_t ibsdclockedop
Definition: pfmlib_amd64.h:154
ibsopdata3_t::val
uint64_t val
Definition: pfmlib_amd64.h:137
ibsopdata_t::ibsopbrntaken
uint64_t ibsopbrntaken
Definition: pfmlib_amd64.h:118
ibsfetchctl_t::ibsphyaddrvalid
uint64_t ibsphyaddrvalid
Definition: pfmlib_amd64.h:89
PMU_AMD64_MAX_COUNTERS
#define PMU_AMD64_MAX_COUNTERS
Definition: pfmlib_amd64.h:43
ibsfetchctl_t::ibsfetchval
uint64_t ibsfetchval
Definition: pfmlib_amd64.h:86
pfmlib_amd64_counter_t::cnt_mask
uint32_t cnt_mask
Definition: pfmlib_amd64.h:169
pfmlib_amd64_output_param_t::ibsfetch_base
uint32_t ibsfetch_base
Definition: pfmlib_amd64.h:216
ibsopdata3_t
Definition: pfmlib_amd64.h:136
pfm_amd64_sel_reg_t::sel_en
uint64_t sel_en
Definition: pfmlib_amd64.h:60
pfmlib_amd64_counter_t
Definition: pfmlib_amd64.h:168
ibsopdata_t::ibsopbrnret
uint64_t ibsopbrnret
Definition: pfmlib_amd64.h:120
ibsopdata2_t
Definition: pfmlib_amd64.h:125
ibsfetchctl_t::ibsl2tlbmiss
uint64_t ibsl2tlbmiss
Definition: pfmlib_amd64.h:92
pfm_amd64_sel_reg_t::sel_res2
uint64_t sel_res2
Definition: pfmlib_amd64.h:64
ibsopdata3_t::ibsdcl1tlbhit1g
uint64_t ibsdcl1tlbhit1g
Definition: pfmlib_amd64.h:144
pfmlib_amd64_input_param_t::reserved1
uint32_t reserved1
Definition: pfmlib_amd64.h:198
ibsopdata3_t::ibsldop
uint64_t ibsldop
Definition: pfmlib_amd64.h:139
ibs_param_t::options
unsigned int options
Definition: pfmlib_amd64.h:186
ibsopdata3_t::ibsdcmisslat
uint64_t ibsdcmisslat
Definition: pfmlib_amd64.h:159
ibsopdata_t::ibsopmispreturn
uint64_t ibsopmispreturn
Definition: pfmlib_amd64.h:116
ibsopdata_t::ibsopbrnmisp
uint64_t ibsopbrnmisp
Definition: pfmlib_amd64.h:119
ibsopdata3_t::ibsdcl1tlbhit2m
uint64_t ibsdcl1tlbhit2m
Definition: pfmlib_amd64.h:143
pfm_amd64_ctr_reg_t::ctr_res1
uint64_t ctr_res1
Definition: pfmlib_amd64.h:75
pfm_amd64_sel_reg_t::sel_res3
uint64_t sel_res3
Definition: pfmlib_amd64.h:67
ibsopdata_t::reserved
uint64_t reserved
Definition: pfmlib_amd64.h:121
pfm_amd64_ctr_reg_t
Definition: pfmlib_amd64.h:71
ibsopdata3_t::ibsdcstbnkcon
uint64_t ibsdcstbnkcon
Definition: pfmlib_amd64.h:149
pfmlib_amd64_output_param_t::ibsop_base
uint32_t ibsop_base
Definition: pfmlib_amd64.h:217
ibsopdata2_t::nbibsreqcachehitst
uint64_t nbibsreqcachehitst
Definition: pfmlib_amd64.h:131
ibsopctl_t::ibsopen
uint64_t ibsopen
Definition: pfmlib_amd64.h:103
pfmlib_amd64_input_param_t::ibsop
ibs_param_t ibsop
Definition: pfmlib_amd64.h:200
pfm_amd64_sel_reg_t::val
uint64_t val
Definition: pfmlib_amd64.h:50
ibsopdata3_t::reserved2
uint64_t reserved2
Definition: pfmlib_amd64.h:160
ibsopdata_t::ibsopbrnresync
uint64_t ibsopbrnresync
Definition: pfmlib_amd64.h:115
ibsopdata_t
Definition: pfmlib_amd64.h:110
ibsopctl_t::ibsopcntl
uint64_t ibsopcntl
Definition: pfmlib_amd64.h:105
ibsopdata3_t::ibsdcphyaddrvalid
uint64_t ibsdcphyaddrvalid
Definition: pfmlib_amd64.h:157
pfm_amd64_sel_reg_t::sel_pc
uint64_t sel_pc
Definition: pfmlib_amd64.h:57
ibsopdata3_t::ibsdcl1tlbmiss
uint64_t ibsdcl1tlbmiss
Definition: pfmlib_amd64.h:141
ibsopdata3_t::ibsdcl2tlbhit2m
uint64_t ibsdcl2tlbhit2m
Definition: pfmlib_amd64.h:145
ibsfetchctl_t::ibsfetchmaxcnt
uint64_t ibsfetchmaxcnt
Definition: pfmlib_amd64.h:82
pfmlib_amd64_input_param_t
Definition: pfmlib_amd64.h:195
ibsfetchctl_t::reserved
uint64_t reserved
Definition: pfmlib_amd64.h:94
pfmlib_amd64_input_param_t::reserved2
uint64_t reserved2
Definition: pfmlib_amd64.h:201
ibsopctl_t::val
uint64_t val
Definition: pfmlib_amd64.h:99
ibsopdata3_t::ibsdcwcmemacc
uint64_t ibsdcwcmemacc
Definition: pfmlib_amd64.h:153
ibsopctl_t::reserved2
uint64_t reserved2
Definition: pfmlib_amd64.h:106
pfm_amd64_sel_reg_t::sel_os
uint64_t sel_os
Definition: pfmlib_amd64.h:55
ibsopdata3_t::ibsdcmissacc
uint64_t ibsdcmissacc
Definition: pfmlib_amd64.h:147
pfm_amd64_sel_reg_t::sel_event_mask2
uint64_t sel_event_mask2
Definition: pfmlib_amd64.h:63
ibsopdata3_t::ibsdcucmemacc
uint64_t ibsdcucmemacc
Definition: pfmlib_amd64.h:152
ibsopctl_t::ibsopmaxcnt
uint64_t ibsopmaxcnt
Definition: pfmlib_amd64.h:101
pfmlib_amd64_output_param_t
Definition: pfmlib_amd64.h:215
ibs_param_t
Definition: pfmlib_amd64.h:184
pfmlib_amd64_input_param_t::ibsfetch
ibs_param_t ibsfetch
Definition: pfmlib_amd64.h:199
ibsfetchctl_t::ibsfetchlat
uint64_t ibsfetchlat
Definition: pfmlib_amd64.h:84
ibsopdata3_t::ibsstop
uint64_t ibsstop
Definition: pfmlib_amd64.h:140
ibsopctl_t::reserved1
uint64_t reserved1
Definition: pfmlib_amd64.h:102
pfm_amd64_ctr_reg_t::ctr_count
uint64_t ctr_count
Definition: pfmlib_amd64.h:74
pfm_amd64_sel_reg_t::sel_int
uint64_t sel_int
Definition: pfmlib_amd64.h:58
pfm_amd64_sel_reg_t::sel_event_mask
uint64_t sel_event_mask
Definition: pfmlib_amd64.h:52
ibsfetchctl_t::val
uint64_t val
Definition: pfmlib_amd64.h:80
ibsopdata2_t::val
uint64_t val
Definition: pfmlib_amd64.h:126
ibsfetchctl_t::ibsl1tlbmiss
uint64_t ibsl1tlbmiss
Definition: pfmlib_amd64.h:91
ibsfetchctl_t::ibsfetchcomp
uint64_t ibsfetchcomp
Definition: pfmlib_amd64.h:87
pfm_amd64_sel_reg_t::sel_host
uint64_t sel_host
Definition: pfmlib_amd64.h:66
ibsfetchctl_t::ibsl1tlbpgsz
uint64_t ibsl1tlbpgsz
Definition: pfmlib_amd64.h:90
ibsopdata2_t::nbibsreqsrc
uint64_t nbibsreqsrc
Definition: pfmlib_amd64.h:128
ibsopdata3_t::ibsdclinaddrvalid
uint64_t ibsdclinaddrvalid
Definition: pfmlib_amd64.h:156
pfm_amd64_sel_reg_t
Definition: pfmlib_amd64.h:49
ibsopctl_t
Definition: pfmlib_amd64.h:98
ibsfetchctl_t::ibsicmiss
uint64_t ibsicmiss
Definition: pfmlib_amd64.h:88
ibsopdata_t::ibsopreturn
uint64_t ibsopreturn
Definition: pfmlib_amd64.h:117
ibsopdata3_t::ibsdcsttoldfwd
uint64_t ibsdcsttoldfwd
Definition: pfmlib_amd64.h:150
ibsfetchctl_t::ibsranden
uint64_t ibsranden
Definition: pfmlib_amd64.h:93
pfmlib_amd64_input_param_t::flags
uint32_t flags
Definition: pfmlib_amd64.h:197
ibsfetchctl_t
Definition: pfmlib_amd64.h:79
pfm_amd64_sel_reg_t::sel_guest
uint64_t sel_guest
Definition: pfmlib_amd64.h:65
ibsfetchctl_t::ibsfetchen
uint64_t ibsfetchen
Definition: pfmlib_amd64.h:85
pfm_amd64_sel_reg_t::sel_edge
uint64_t sel_edge
Definition: pfmlib_amd64.h:56
ibsfetchctl_t::ibsfetchcnt
uint64_t ibsfetchcnt
Definition: pfmlib_amd64.h:83
pfm_amd64_sel_reg_t::sel_usr
uint64_t sel_usr
Definition: pfmlib_amd64.h:54
ibsopdata3_t::ibsdcmiss
uint64_t ibsdcmiss
Definition: pfmlib_amd64.h:146
ibsopdata2_t::reserved1
uint64_t reserved1
Definition: pfmlib_amd64.h:129
ibsopdata_t::ibstagtoretctr
uint64_t ibstagtoretctr
Definition: pfmlib_amd64.h:114
pfm_amd64_ctr_reg_t::val
uint64_t val
Definition: pfmlib_amd64.h:72
ibsopdata3_t::ibsdcldbnkcon
uint64_t ibsdcldbnkcon
Definition: pfmlib_amd64.h:148
ibsopdata_t::val
uint64_t val
Definition: pfmlib_amd64.h:111
ibsopctl_t::ibsopval
uint64_t ibsopval
Definition: pfmlib_amd64.h:104
pfm_amd64_sel_reg_t::sel_unit_mask
uint64_t sel_unit_mask
Definition: pfmlib_amd64.h:53