vmm: Fix use-after-free in load_elf()
[akaros.git] / user / perfmon / events / intel_bdw_events.h
1 /*
2  * Contributed by Stephane Eranian <eranian@gmail.com>
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a copy
5  * of this software and associated documentation files (the "Software"), to deal
6  * in the Software without restriction, including without limitation the rights
7  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
8  * of the Software, and to permit persons to whom the Software is furnished to do so,
9  * subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice shall be included in all
12  * copies or substantial portions of the Software.
13  *
14  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
15  * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
16  * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
17  * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
18  * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
19  * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
20  *
21  * This file is part of libpfm, a performance monitoring support library for
22  * applications on Linux.
23  *
24  * PMU: bdw (Intel Broadwell)
25  */
26
27 static const intel_x86_umask_t bdw_baclears[]={
28   { .uname = "ANY",
29     .udesc  = "Number of front-end re-steers due to BPU misprediction",
30     .ucode  = 0x1f00,
31     .uflags = INTEL_X86_NCOMBO | INTEL_X86_DFL,
32   },
33 };
34
35 static const intel_x86_umask_t bdw_br_inst_exec[]={
36   { .uname = "NONTAKEN_CONDITIONAL",
37     .udesc  = "All macro conditional nontaken branch instructions",
38     .ucode  = 0x4100,
39     .uflags = INTEL_X86_NCOMBO,
40   },
41   { .uname = "NONTAKEN_COND",
42     .udesc  = "All macro conditional nontaken branch instructions",
43     .ucode  = 0x4100,
44     .uequiv = "NONTAKEN_CONDITIONAL",
45     .uflags = INTEL_X86_NCOMBO,
46   },
47
48   { .uname = "TAKEN_CONDITIONAL",
49     .udesc  = "Taken speculative and retired macro-conditional branches",
50     .ucode  = 0x8100,
51     .uflags = INTEL_X86_NCOMBO,
52   },
53   { .uname = "TAKEN_COND",
54     .udesc  = "Taken speculative and retired macro-conditional branches",
55     .ucode  = 0x8100,
56     .uequiv = "TAKEN_CONDITIONAL",
57     .uflags = INTEL_X86_NCOMBO,
58   },
59   { .uname = "TAKEN_DIRECT_JUMP",
60     .udesc  = "Taken speculative and retired macro-conditional branch instructions excluding calls and indirects",
61     .ucode  = 0x8200,
62     .uflags = INTEL_X86_NCOMBO,
63   },
64   { .uname = "TAKEN_INDIRECT_JUMP_NON_CALL_RET",
65     .udesc  = "Taken speculative and retired indirect branches excluding calls and returns",
66     .ucode  = 0x8400,
67     .uflags = INTEL_X86_NCOMBO,
68   },
69   { .uname = "TAKEN_INDIRECT_NEAR_RETURN",
70     .udesc  = "Taken speculative and retired indirect branches with return mnemonic",
71     .ucode  = 0x8800,
72     .uflags = INTEL_X86_NCOMBO,
73   },
74   { .uname = "TAKEN_DIRECT_NEAR_CALL",
75     .udesc  = "Taken speculative and retired direct near calls",
76     .ucode  = 0x9000,
77     .uflags = INTEL_X86_NCOMBO,
78   },
79   { .uname = "ALL_CONDITIONAL",
80     .udesc  = "Speculative and retired macro-conditional branches",
81     .ucode  = 0xc100,
82     .uflags = INTEL_X86_NCOMBO,
83   },
84   { .uname = "ALL_COND",
85     .udesc  = "Speculative and retired macro-conditional branches",
86     .ucode  = 0xc100,
87     .uequiv = "ALL_CONDITIONAL",
88     .uflags = INTEL_X86_NCOMBO,
89   },
90   { .uname = "ANY_COND",
91     .udesc  = "Speculative and retired macro-conditional branches",
92     .ucode  = 0xc100,
93     .uequiv = "ALL_CONDITIONAL",
94     .uflags = INTEL_X86_NCOMBO,
95   },
96   { .uname = "ALL_DIRECT_JMP",
97     .udesc  = "Speculative and retired macro-unconditional branches excluding calls and indirects",
98     .ucode  = 0xc200,
99     .uflags = INTEL_X86_NCOMBO,
100   },
101   { .uname = "ALL_INDIRECT_JUMP_NON_CALL_RET",
102     .udesc  = "Speculative and retired indirect branches excluding calls and returns",
103     .ucode  = 0xc400,
104     .uflags = INTEL_X86_NCOMBO,
105   },
106   { .uname = "ALL_INDIRECT_NEAR_RETURN",
107     .udesc  = "Speculative and retired indirect return branches",
108     .ucode  = 0xc800,
109     .uflags = INTEL_X86_NCOMBO,
110   },
111   { .uname = "ALL_DIRECT_NEAR_CALL",
112     .udesc  = "Speculative and retired direct near calls",
113     .ucode  = 0xd000,
114     .uflags = INTEL_X86_NCOMBO,
115   },
116   { .uname = "TAKEN_INDIRECT_NEAR_CALL",
117     .udesc  = "All indirect calls, including both register and memory indirect",
118     .ucode  = 0xa000,
119     .uflags = INTEL_X86_NCOMBO,
120   },
121   { .uname = "ALL_BRANCHES",
122     .udesc  = "All branch instructions executed",
123     .ucode  = 0xff00,
124     .uflags = INTEL_X86_NCOMBO | INTEL_X86_DFL,
125   },
126 };
127
128 static const intel_x86_umask_t bdw_br_inst_retired[]={
129   { .uname = "CONDITIONAL",
130     .udesc  = "Counts all taken and not taken macro conditional branch instructions",
131     .ucode  = 0x100,
132     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS,
133   },
134   { .uname = "COND",
135     .udesc  = "Counts all taken and not taken macro conditional branch instructions",
136     .ucode  = 0x100,
137     .uequiv = "CONDITIONAL",
138     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS,
139   },
140   { .uname = "NEAR_CALL",
141     .udesc  = "Counts all macro direct and indirect near calls",
142     .ucode  = 0x200,
143     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS,
144   },
145   { .uname = "ALL_BRANCHES",
146     .udesc  = "Counts all taken and not taken macro branches including far branches (architectural event)",
147     .ucode  = 0x0,
148     .uflags = INTEL_X86_NCOMBO | INTEL_X86_DFL | INTEL_X86_PEBS,
149   },
150   { .uname = "NEAR_RETURN",
151     .udesc  = "Counts the number of near ret instructions retired",
152     .ucode  = 0x800,
153     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS,
154   },
155   { .uname = "NOT_TAKEN",
156     .udesc  = "Counts all not taken macro branch instructions retired",
157     .ucode  = 0x1000,
158     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS,
159   },
160   { .uname = "NEAR_TAKEN",
161     .udesc  = "Counts the number of near branch taken instructions retired",
162     .ucode  = 0x2000,
163     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS,
164   },
165   { .uname = "FAR_BRANCH",
166     .udesc  = "Counts the number of far branch instructions retired",
167     .ucode  = 0x4000,
168     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS,
169   },
170 };
171
172 static const intel_x86_umask_t bdw_br_misp_exec[]={
173   { .uname = "NONTAKEN_CONDITIONAL",
174     .udesc  = "Not taken speculative and retired mispredicted macro conditional branches",
175     .ucode  = 0x4100,
176     .uflags = INTEL_X86_NCOMBO,
177   },
178   { .uname = "NONTAKEN_COND",
179     .udesc  = "Not taken speculative and retired mispredicted macro conditional branches",
180     .ucode  = 0x4100,
181     .uequiv = "NONTAKEN_CONDITIONAL",
182     .uflags = INTEL_X86_NCOMBO,
183   },
184   { .uname = "TAKEN_CONDITIONAL",
185     .udesc  = "Taken speculative and retired mispredicted macro conditional branches",
186     .ucode  = 0x8100,
187     .uflags = INTEL_X86_NCOMBO,
188   },
189   { .uname = "TAKEN_COND",
190     .udesc  = "Taken speculative and retired mispredicted macro conditional branches",
191     .ucode  = 0x8100,
192     .uequiv = "TAKEN_CONDITIONAL",
193     .uflags = INTEL_X86_NCOMBO,
194   },
195   { .uname = "TAKEN_INDIRECT_JUMP_NON_CALL_RET",
196     .udesc  = "Taken speculative and retired mispredicted indirect branches excluding calls and returns",
197     .ucode  = 0x8400,
198     .uflags = INTEL_X86_NCOMBO,
199   },
200   { .uname = "TAKEN_RETURN_NEAR",
201     .udesc  = "Taken speculative and retired mispredicted indirect branches with return mnemonic",
202     .ucode  = 0x8800,
203     .uflags = INTEL_X86_NCOMBO,
204   },
205   { .uname = "ALL_CONDITIONAL",
206     .udesc  = "Speculative and retired mispredicted macro conditional branches",
207     .ucode  = 0xc100,
208     .uflags = INTEL_X86_NCOMBO,
209   },
210   { .uname = "ANY_COND",
211     .udesc  = "Speculative and retired mispredicted macro conditional branches",
212     .ucode  = 0xc100,
213     .uequiv = "ALL_CONDITIONAL",
214     .uflags = INTEL_X86_NCOMBO,
215   },
216   { .uname = "ALL_INDIRECT_JUMP_NON_CALL_RET",
217     .udesc  = "All mispredicted indirect branches that are not calls nor returns",
218     .ucode  = 0xc400,
219     .uflags = INTEL_X86_NCOMBO,
220   },
221   { .uname = "ALL_BRANCHES",
222     .udesc  = "Speculative and retired mispredicted macro conditional branches",
223     .ucode  = 0xff00,
224     .uflags = INTEL_X86_NCOMBO | INTEL_X86_DFL,
225   },
226   { .uname = "TAKEN_INDIRECT_NEAR_CALL",
227     .udesc  = "Taken speculative and retired mispredicted indirect calls",
228     .ucode  = 0xa000,
229     .uflags = INTEL_X86_NCOMBO,
230   },
231 };
232
233 static const intel_x86_umask_t bdw_br_misp_retired[]={
234   { .uname = "CONDITIONAL",
235     .udesc  = "All mispredicted macro conditional branch instructions",
236     .ucode  = 0x100,
237     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS,
238   },
239   { .uname = "COND",
240     .udesc  = "All mispredicted macro conditional branch instructions",
241     .ucode  = 0x100,
242     .uequiv = "CONDITIONAL",
243     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS,
244   },
245   { .uname = "ALL_BRANCHES",
246     .udesc  = "All mispredicted macro branches (architectural event)",
247     .ucode  = 0x0, /* architectural encoding */
248     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS | INTEL_X86_DFL,
249   },
250   { .uname = "NEAR_TAKEN",
251     .udesc  = "number of near branch instructions retired that were mispredicted and taken",
252     .ucode  = 0x2000,
253     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS,
254   },
255 };
256
257 static const intel_x86_umask_t bdw_cpl_cycles[]={
258   { .uname = "RING0",
259     .udesc  = "Unhalted core cycles when the thread is in ring 0",
260     .ucode  = 0x100,
261     .uflags = INTEL_X86_NCOMBO,
262   },
263   { .uname = "RING123",
264     .udesc  = "Unhalted core cycles when thread is in rings 1, 2, or 3",
265     .ucode  = 0x200,
266     .uflags = INTEL_X86_NCOMBO,
267   },
268   { .uname = "RING0_TRANS",
269     .udesc  = "Number of intervals between processor halts while thread is in ring 0",
270     .ucode  = 0x100 | INTEL_X86_MOD_EDGE | (1 << INTEL_X86_CMASK_BIT), /* edge=1 cnt=1 */
271     .uflags = INTEL_X86_NCOMBO,
272     .modhw  = _INTEL_X86_ATTR_E | _INTEL_X86_ATTR_C,
273   },
274 };
275
276 static const intel_x86_umask_t bdw_cpu_clk_thread_unhalted[]={
277   { .uname = "REF_XCLK",
278     .udesc  = "Cases when the core is unhalted at 100Mhz",
279     .ucode  = 0x100,
280     .uflags = INTEL_X86_NCOMBO,
281   },
282   { .uname  = "REF_P",
283     .udesc  = "Cycles when the core is unhalted (count at 100 Mhz)",
284     .ucode = 0x100,
285     .uequiv = "REF_XCLK",
286     .uflags= INTEL_X86_NCOMBO,
287   },
288   { .uname  = "THREAD_P",
289     .udesc  = "Cycles when thread is not halted",
290     .ucode = 0x000,
291     .uflags= INTEL_X86_NCOMBO | INTEL_X86_DFL,
292   },
293 };
294
295 static const intel_x86_umask_t bdw_cycle_activity[]={
296    { .uname  = "CYCLES_L2_PENDING",
297      .udesc  = "Cycles with pending L2 miss loads (must use with HT off only)",
298      .ucode  = 0x0100 | (0x1 << INTEL_X86_CMASK_BIT),
299      .uflags = INTEL_X86_NCOMBO,
300      .ucntmsk= 0xf,
301    },
302    { .uname  = "CYCLES_LDM_PENDING",
303      .udesc  = "Cycles with pending memory loads",
304      .ucode  = 0x0200 | (0x2 << INTEL_X86_CMASK_BIT),
305      .uflags = INTEL_X86_NCOMBO,
306    },
307    { .uname  = "CYCLES_L1D_PENDING",
308      .udesc  = "Cycles with pending L1D load cache misses",
309      .ucode  = 0x0800 | (0x8 << INTEL_X86_CMASK_BIT),
310      .ucntmsk= 0x4,
311      .uflags = INTEL_X86_NCOMBO,
312    },
313    { .uname  = "STALL_L1D_PENDING",
314      .udesc  = "Executions stalls due to pending L1D load cache misses",
315      .ucode  = 0x0c00 | (0xc << INTEL_X86_CMASK_BIT),
316      .ucntmsk= 0x4,
317      .uflags = INTEL_X86_NCOMBO,
318    },
319    { .uname  = "STALLS_L2_PENDING",
320      .udesc  = "Execution stalls due to L2 pending loads (must use with HT off only)",
321      .ucode  = 0x0500 | (0x5 << INTEL_X86_CMASK_BIT),
322      .ucntmsk= 0xf,
323      .uflags = INTEL_X86_NCOMBO,
324    },
325    { .uname  = "CYCLES_NO_EXECUTE",
326      .udesc  = "Cycles during which no instructions were executed in the execution stage of the pipeline",
327      .ucode  = 0x0400 | (0x4 << INTEL_X86_CMASK_BIT),
328      .ucntmsk= 0xf,
329      .uflags = INTEL_X86_NCOMBO,
330    },
331 };
332
333 static const intel_x86_umask_t bdw_dtlb_load_misses[]={
334   { .uname = "MISS_CAUSES_A_WALK",
335     .udesc  = "Misses in all DTLB levels that cause page walks",
336     .ucode  = 0x100,
337     .uflags = INTEL_X86_NCOMBO,
338   },
339   { .uname = "WALK_COMPLETED_4K",
340     .udesc  = "Misses in all TLB levels causes a page walk that completes (4K)",
341     .ucode  = 0x200,
342     .uflags = INTEL_X86_NCOMBO,
343   },
344   { .uname = "WALK_COMPLETED",
345     .udesc  = "Misses in all TLB levels causes a page walk of any page size that completes",
346     .ucode  = 0xe00,
347     .uflags = INTEL_X86_NCOMBO,
348   },
349   { .uname = "WALK_DURATION",
350     .udesc  = "Cycles when PMH is busy with page walks",
351     .ucode  = 0x1000,
352     .uflags = INTEL_X86_NCOMBO,
353   },
354   { .uname = "STLB_HIT_4K",
355     .udesc  = "Misses that miss the DTLB and hit the STLB (4K)",
356     .ucode  = 0x2000,
357     .uflags = INTEL_X86_NCOMBO,
358   },
359   { .uname = "STLB_HIT",
360     .udesc  = "Number of cache load STLB hits. No page walk",
361     .ucode  = 0x6000,
362     .uflags = INTEL_X86_NCOMBO,
363   },
364 };
365
366 static const intel_x86_umask_t bdw_itlb_misses[]={
367   { .uname = "MISS_CAUSES_A_WALK",
368     .udesc  = "Misses in all DTLB levels that cause page walks",
369     .ucode  = 0x100,
370     .uflags = INTEL_X86_NCOMBO,
371   },
372   { .uname = "WALK_COMPLETED_4K",
373     .udesc  = "Misses in all TLB levels causes a page walk that completes (4K)",
374     .ucode  = 0x200,
375     .uflags = INTEL_X86_NCOMBO,
376   },
377   { .uname = "WALK_COMPLETED",
378     .udesc  = "Misses in all TLB levels causes a page walk of any page size that completes",
379     .ucode  = 0xe00,
380     .uflags = INTEL_X86_NCOMBO,
381   },
382   { .uname = "WALK_DURATION",
383     .udesc  = "Cycles when PMH is busy with page walks",
384     .ucode  = 0x1000,
385     .uflags = INTEL_X86_NCOMBO,
386   },
387   { .uname = "STLB_HIT_4K",
388     .udesc  = "Misses that miss the DTLB and hit the STLB (4K)",
389     .ucode  = 0x2000,
390     .uflags = INTEL_X86_NCOMBO,
391   },
392   { .uname = "STLB_HIT",
393     .udesc  = "Number of cache load STLB hits. No page walk",
394     .ucode  = 0x6000,
395     .uflags = INTEL_X86_NCOMBO,
396   },
397 };
398
399 static const intel_x86_umask_t bdw_fp_assist[]={
400   { .uname = "X87_OUTPUT",
401     .udesc  = "Number of X87 FP assists due to output values",
402     .ucode  = 0x200,
403     .uflags = INTEL_X86_NCOMBO,
404   },
405   { .uname = "X87_INPUT",
406     .udesc  = "Number of X87 FP assists due to input values",
407     .ucode  = 0x400,
408     .uflags = INTEL_X86_NCOMBO,
409   },
410   { .uname = "SIMD_OUTPUT",
411     .udesc  = "Number of SIMD FP assists due to output values",
412     .ucode  = 0x800,
413     .uflags = INTEL_X86_NCOMBO,
414   },
415   { .uname = "SIMD_INPUT",
416     .udesc  = "Number of SIMD FP assists due to input values",
417     .ucode  = 0x1000,
418     .uflags = INTEL_X86_NCOMBO,
419   },
420   { .uname = "ANY",
421     .udesc  = "Cycles with any input/output SEE or FP assists",
422     .ucode  = 0x1e00 | (1 << INTEL_X86_CMASK_BIT), /* cnt=1 */
423     .uflags = INTEL_X86_NCOMBO,
424     .modhw  = _INTEL_X86_ATTR_C,
425   },
426   { .uname = "ALL",
427     .udesc  = "Cycles with any input and output SSE or FP assist",
428     .ucode  = 0x1e00 | (1 << INTEL_X86_CMASK_BIT), /* cnt=1 */
429     .uequiv = "ANY",
430     .uflags = INTEL_X86_NCOMBO,
431     .modhw  = _INTEL_X86_ATTR_C,
432   },
433 };
434
435 static const intel_x86_umask_t bdw_icache[]={
436   { .uname = "MISSES",
437     .udesc  = "Number of Instruction Cache, Streaming Buffer and Victim Cache Misses. Includes Uncacheable accesses",
438     .ucode  = 0x200,
439     .uflags = INTEL_X86_DFL,
440   },
441 };
442
443 static const intel_x86_umask_t bdw_idq[]={
444   { .uname = "EMPTY",
445     .udesc  = "Cycles the Instruction Decode Queue (IDQ) is empty",
446     .ucode  = 0x200,
447     .ucntmsk= 0xf,
448     .uflags = INTEL_X86_NCOMBO,
449   },
450   { .uname = "MITE_UOPS",
451     .udesc  = "Number of uops delivered to Instruction Decode Queue (IDQ) from MITE path",
452     .ucode  = 0x400,
453     .uflags = INTEL_X86_NCOMBO,
454   },
455   { .uname = "DSB_UOPS",
456     .udesc  = "Number of uops delivered to Instruction Decode Queue (IDQ) from Decode Stream Buffer (DSB) path",
457     .ucode  = 0x800,
458     .uflags = INTEL_X86_NCOMBO,
459   },
460   { .uname = "MS_DSB_UOPS",
461     .udesc  = "Uops initiated by Decode Stream Buffer (DSB) that are being delivered to Instruction Decode Queue (IDQ) while Microcode Sequencer (MS) is busy",
462     .ucode  = 0x1000,
463     .uflags = INTEL_X86_NCOMBO,
464   },
465   { .uname = "MS_MITE_UOPS",
466     .udesc  = "Uops initiated by MITE and delivered to Instruction Decode Queue (IDQ) while Microcode Sequencer (MS) is busy",
467     .ucode  = 0x2000,
468     .uflags = INTEL_X86_NCOMBO,
469   },
470   { .uname = "MS_UOPS",
471     .udesc  = "Number of Uops were delivered into Instruction Decode Queue (IDQ) from MS, initiated by Decode Stream Buffer (DSB) or MITE",
472     .ucode  = 0x3000,
473     .uflags = INTEL_X86_NCOMBO,
474   },
475   { .uname = "MS_UOPS_CYCLES",
476     .udesc  = "Number of cycles that Uops were delivered into Instruction Decode Queue (IDQ) when MS_Busy, initiated by Decode Stream Buffer (DSB) or MITE",
477     .ucode  = 0x3000 | (1 << INTEL_X86_CMASK_BIT), /* cnt=1 */
478     .uequiv = "MS_UOPS:c=1",
479     .uflags = INTEL_X86_NCOMBO,
480     .modhw  = _INTEL_X86_ATTR_C,
481   },
482   { .uname = "MITE_UOPS_CYCLES",
483     .udesc  = "Cycles when uops are being delivered to Instruction Decode Queue (IDQ) from MITE path",
484     .ucode  = 0x400 | (1 << INTEL_X86_CMASK_BIT), /* cnt=1 */
485     .uequiv = "MITE_UOPS:c=1",
486     .uflags = INTEL_X86_NCOMBO,
487     .modhw  = _INTEL_X86_ATTR_C,
488   },
489   { .uname = "DSB_UOPS_CYCLES",
490     .udesc  = "Cycles when uops are being delivered to Instruction Decode Queue (IDQ) from Decode Stream Buffer (DSB) path",
491     .ucode  = 0x800 | (1 << INTEL_X86_CMASK_BIT), /* cnt=1 */
492     .uequiv = "DSB_UOPS:c=1",
493     .uflags = INTEL_X86_NCOMBO,
494     .modhw  = _INTEL_X86_ATTR_C,
495   },
496   { .uname = "MS_DSB_UOPS_CYCLES",
497     .udesc  = "Cycles when uops initiated by Decode Stream Buffer (DSB) are being delivered to Instruction Decode Queue (IDQ) while Microcode Sequencer (MS) is busy",
498     .ucode  = 0x1000 | (1 << INTEL_X86_CMASK_BIT), /* cnt=1 */
499     .uequiv = "MS_DSB_UOPS:c=1",
500     .uflags = INTEL_X86_NCOMBO,
501     .modhw  = _INTEL_X86_ATTR_C,
502   },
503   { .uname = "MS_DSB_OCCUR",
504     .udesc  = "Deliveries to Instruction Decode Queue (IDQ) initiated by Decode Stream Buffer (DSB) while Microcode Sequencer (MS) is busy",
505     .ucode  = 0x1000 | INTEL_X86_MOD_EDGE | (1 << INTEL_X86_CMASK_BIT), /* edge=1 cnt=1 */
506     .uequiv = "MS_DSB_UOPS:c=1:e=1",
507     .uflags = INTEL_X86_NCOMBO,
508     .modhw  = _INTEL_X86_ATTR_E | _INTEL_X86_ATTR_C,
509   },
510   { .uname = "ALL_DSB_CYCLES_4_UOPS",
511     .udesc  = "Cycles Decode Stream Buffer (DSB) is delivering 4 Uops",
512     .ucode  = 0x1800 | (4 << INTEL_X86_CMASK_BIT), /* cnt=4 */
513     .uflags = INTEL_X86_NCOMBO,
514     .modhw  = _INTEL_X86_ATTR_C,
515   },
516   { .uname = "ALL_DSB_CYCLES_ANY_UOPS",
517     .udesc  = "Cycles Decode Stream Buffer (DSB) is delivering any Uop",
518     .ucode  = 0x1800 | (1 << INTEL_X86_CMASK_BIT), /* cnt=1 */
519     .uflags = INTEL_X86_NCOMBO,
520     .modhw  = _INTEL_X86_ATTR_C,
521   },
522   { .uname = "ALL_MITE_CYCLES_4_UOPS",
523     .udesc  = "Cycles MITE is delivering 4 Uops",
524     .ucode  = 0x2400 | (4 << INTEL_X86_CMASK_BIT), /* cnt=4 */
525     .uflags = INTEL_X86_NCOMBO,
526     .modhw  = _INTEL_X86_ATTR_C,
527   },
528   { .uname = "ALL_MITE_CYCLES_ANY_UOPS",
529     .udesc  = "Cycles MITE is delivering any Uop",
530     .ucode  = 0x2400 | (1 << INTEL_X86_CMASK_BIT), /* cnt=1 */
531     .uflags = INTEL_X86_NCOMBO,
532     .modhw  = _INTEL_X86_ATTR_C,
533   },
534   { .uname = "ALL_MITE_UOPS",
535     .udesc  = "Number of uops delivered to Instruction Decode Queue (IDQ) from any path",
536     .ucode  = 0x3c00,
537     .uflags = INTEL_X86_NCOMBO,
538   },
539 };
540
541 static const intel_x86_umask_t bdw_idq_uops_not_delivered[]={
542   { .uname = "CORE",
543     .udesc  = "Count number of non-delivered uops to Resource Allocation Table (RAT)",
544     .ucode  = 0x100,
545     .uflags = INTEL_X86_DFL,
546   },
547 };
548
549 static const intel_x86_umask_t bdw_inst_retired[]={
550   { .uname = "ANY_P",
551     .udesc  = "Number of instructions retired. General Counter - architectural event",
552     .ucode  = 0x000,
553     .uflags = INTEL_X86_NCOMBO | INTEL_X86_DFL,
554   },
555   { .uname = "ALL",
556     .udesc  = "Precise instruction retired event with HW to reduce effect of PEBS shadow in IP distribution (Precise Event)",
557     .ucode  = 0x100,
558     .uequiv = "PREC_DIST",
559     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS,
560   },
561   { .uname = "TOTAL_CYCLES",
562     .udesc  = "Number of cycles using always true condition",
563     .ucode  = 0x100 | INTEL_X86_MOD_INV | (10 << INTEL_X86_CMASK_BIT), /* inv=1 cnt=10 */
564     .uequiv = "PREC_DIST:i=1:c=10",
565     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS,
566     .modhw  = _INTEL_X86_ATTR_I | _INTEL_X86_ATTR_C,
567   },
568   { .uname = "PREC_DIST",
569     .udesc  = "Precise instruction retired event with HW to reduce effect of PEBS shadow in IP distribution (Precise event)",
570     .ucode  = 0x100,
571     .ucntmsk= 0x2,
572     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS,
573   },
574   { .uname = "X87",
575     .udesc  = "NUmber of FPU operations retired (instructions with no exceptions)",
576     .ucode  = 0x200,
577     .ucntmsk= 0x2,
578     .uflags = INTEL_X86_NCOMBO,
579   },
580 };
581
582 static const intel_x86_umask_t bdw_int_misc[]={
583   { .uname = "RECOVERY_CYCLES",
584     .udesc  = "Number of cycles waiting for Machine Clears  except JEClear",
585     .ucode  = 0x300,
586     .uflags = INTEL_X86_NCOMBO,
587   },
588   { .uname = "RECOVERY_STALLS_COUNT",
589     .udesc  = "Number of occurrences waiting for Machine Clears",
590     .ucode  = 0x300 | INTEL_X86_MOD_EDGE | (1 << INTEL_X86_CMASK_BIT), /* edge=1 cnt=1 */
591     .uflags = INTEL_X86_NCOMBO,
592     .modhw  = _INTEL_X86_ATTR_E | _INTEL_X86_ATTR_C,
593   },
594 };
595
596 static const intel_x86_umask_t bdw_itlb[]={
597   { .uname = "ITLB_FLUSH",
598     .udesc  = "Flushing of the Instruction TLB (ITLB) pages independent of page size",
599     .ucode  = 0x100,
600     .uflags = INTEL_X86_NCOMBO | INTEL_X86_DFL,
601   },
602 };
603
604 static const intel_x86_umask_t bdw_l1d[]={
605   { .uname = "REPLACEMENT",
606     .udesc  = "L1D Data line replacements",
607     .ucode  = 0x100,
608     .uflags = INTEL_X86_DFL,
609   },
610 };
611
612 static const intel_x86_umask_t bdw_l1d_pend_miss[]={
613   { .uname = "PENDING",
614     .udesc  = "Cycles with L1D load misses outstanding",
615     .ucode  = 0x100,
616     .ucntmsk = 0x4,
617     .uflags = INTEL_X86_DFL,
618   },
619   { .uname = "PENDING_CYCLES",
620     .udesc  = "Cycles with L1D load misses outstanding",
621     .ucode  = 0x100 | (1 << INTEL_X86_CMASK_BIT), /* cnt=1 */
622     .uequiv = "PENDING:c=1",
623     .ucntmsk = 0x4,
624     .uflags = INTEL_X86_NCOMBO,
625     .modhw  = _INTEL_X86_ATTR_C,
626   },
627   { .uname = "OCCURRENCES",
628     .udesc  = "Number L1D miss outstanding",
629     .ucode  = 0x100 | INTEL_X86_MOD_EDGE | (1 << INTEL_X86_CMASK_BIT), /* edge=1 cnt=1 */
630     .uequiv = "PENDING:c=1:e=1",
631     .ucntmsk = 0x4,
632     .uflags = INTEL_X86_NCOMBO,
633     .modhw  = _INTEL_X86_ATTR_E | _INTEL_X86_ATTR_C,
634   },
635   { .uname = "EDGE",
636     .udesc  = "Number L1D miss outstanding",
637     .ucode  = 0x100 | INTEL_X86_MOD_EDGE | (1 << INTEL_X86_CMASK_BIT), /* edge=1 cnt=1 */
638     .uequiv = "PENDING:c=1:e=1",
639     .ucntmsk = 0x4,
640     .uflags = INTEL_X86_NCOMBO,
641     .modhw  = _INTEL_X86_ATTR_E | _INTEL_X86_ATTR_C,
642   },
643 };
644
645 static const intel_x86_umask_t bdw_l2_demand_rqsts[]={
646   { .uname = "WB_HIT",
647     .udesc  = "WB requests that hit L2 cache",
648     .ucode  = 0x5000,
649     .uflags = INTEL_X86_DFL,
650   },
651 };
652
653 static const intel_x86_umask_t bdw_l2_lines_in[]={
654   { .uname = "I",
655     .udesc  = "L2 cache lines in I state filling L2",
656     .ucode  = 0x100,
657     .uflags = INTEL_X86_NCOMBO,
658   },
659   { .uname = "S",
660     .udesc  = "L2 cache lines in S state filling L2",
661     .ucode  = 0x200,
662     .uflags = INTEL_X86_NCOMBO,
663   },
664   { .uname = "E",
665     .udesc  = "L2 cache lines in E state filling L2",
666     .ucode  = 0x400,
667     .uflags = INTEL_X86_NCOMBO,
668   },
669   { .uname = "ALL",
670     .udesc  = "L2 cache lines filling L2",
671     .ucode  = 0x700,
672     .uflags = INTEL_X86_NCOMBO | INTEL_X86_DFL,
673   },
674   { .uname = "ANY",
675     .udesc  = "L2 cache lines filling L2",
676     .uequiv = "ALL",
677     .ucode  = 0x700,
678     .uflags = INTEL_X86_NCOMBO,
679   },
680 };
681
682 static const intel_x86_umask_t bdw_l2_lines_out[]={
683   { .uname = "DEMAND_CLEAN",
684     .udesc  = "Number of clean L2 cachelines evicted by demand",
685     .ucode  = 0x500,
686     .uflags = INTEL_X86_NCOMBO | INTEL_X86_DFL,
687   },
688 };
689
690 static const intel_x86_umask_t bdw_l2_rqsts[]={
691   { .uname = "DEMAND_DATA_RD_MISS",
692     .udesc  = "Demand Data Read requests that miss L2 cache",
693     .ucode  = 0x2100,
694     .uflags = INTEL_X86_NCOMBO,
695   },
696   { .uname = "DEMAND_DATA_RD_HIT",
697     .udesc  = "Demand Data Read requests that hit L2 cache",
698     .ucode  = 0x4100,
699     .uflags = INTEL_X86_NCOMBO,
700   },
701   { .uname = "DEMAND_RFO_MISS",
702     .udesc  = "RFO requests that miss L2 cache",
703     .ucode  = 0x2200,
704     .uflags = INTEL_X86_NCOMBO,
705   },
706   { .uname = "RFO_MISS",
707     .udesc  = "RFO requests that miss L2 cache",
708     .ucode  = 0x2200,
709     .uequiv = "DEMAND_RFO_MISS",
710     .uflags = INTEL_X86_NCOMBO,
711   },
712   { .uname = "DEMAND_RFO_HIT",
713     .udesc  = "RFO requests that hit L2 cache",
714     .ucode  = 0x4200,
715     .uflags = INTEL_X86_NCOMBO,
716   },
717   { .uname = "RFO_HIT",
718     .udesc  = "RFO requests that hit L2 cache",
719     .ucode  = 0x4200,
720     .uequiv = "DEMAND_RFO_HIT",
721     .uflags = INTEL_X86_NCOMBO,
722   },
723   { .uname = "CODE_RD_MISS",
724     .udesc  = "L2 cache misses when fetching instructions",
725     .ucode  = 0x2400,
726     .uflags = INTEL_X86_NCOMBO,
727   },
728   { .uname = "ALL_DEMAND_MISS",
729     .udesc  = "All demand requests that miss the L2 cache",
730     .ucode  = 0x2700,
731     .uflags = INTEL_X86_NCOMBO,
732   },
733   { .uname = "CODE_RD_HIT",
734     .udesc  = "L2 cache hits when fetching instructions, code reads",
735     .ucode  = 0x4400,
736     .uflags = INTEL_X86_NCOMBO,
737   },
738   { .uname = "L2_PF_MISS",
739     .udesc  = "Requests from the L2 hardware prefetchers that miss L2 cache",
740     .ucode  = 0x3000,
741     .uflags = INTEL_X86_NCOMBO,
742   },
743   { .uname = "MISS",
744     .udesc  = "All requests that miss the L2 cache",
745     .ucode  = 0x3f00,
746     .uflags = INTEL_X86_NCOMBO,
747   },
748   { .uname = "L2_PF_HIT",
749     .udesc  = "Requests from the L2 hardware prefetchers that hit L2 cache",
750     .ucode  = 0x5000,
751     .uflags = INTEL_X86_NCOMBO,
752   },
753   { .uname = "ALL_DEMAND_DATA_RD",
754     .udesc  = "Any data read request to L2 cache",
755     .ucode  = 0xe100,
756     .uflags = INTEL_X86_NCOMBO,
757   },
758   { .uname = "ALL_RFO",
759     .udesc  = "Any data RFO request to L2 cache",
760     .ucode  = 0xe200,
761     .uflags = INTEL_X86_NCOMBO,
762   },
763   { .uname = "ALL_CODE_RD",
764     .udesc  = "Any code read request to L2 cache",
765     .ucode  = 0xe400,
766     .uflags = INTEL_X86_NCOMBO,
767   },
768   { .uname = "ALL_DEMAND_REFERENCES",
769     .udesc  = "All demand requests to L2 cache ",
770     .ucode  = 0xe700,
771     .uflags = INTEL_X86_NCOMBO,
772   },
773   { .uname = "ALL_PF",
774     .udesc  = "Any L2 HW prefetch request to L2 cache",
775     .ucode  = 0xf800,
776     .uflags = INTEL_X86_NCOMBO,
777   },
778   { .uname = "REFERENCES",
779     .udesc  = "All requests to L2 cache",
780     .ucode  = 0xff00,
781     .uflags = INTEL_X86_NCOMBO | INTEL_X86_DFL,
782   },
783 };
784
785 static const intel_x86_umask_t bdw_l2_trans[]={
786   { .uname = "DEMAND_DATA_RD",
787     .udesc  = "Demand Data Read requests that access L2 cache",
788     .ucode  = 0x100,
789     .uflags = INTEL_X86_NCOMBO,
790   },
791   { .uname = "RFO",
792     .udesc  = "RFO requests that access L2 cache",
793     .ucode  = 0x200,
794     .uflags = INTEL_X86_NCOMBO,
795   },
796   { .uname = "CODE_RD",
797     .udesc  = "L2 cache accesses when fetching instructions",
798     .ucode  = 0x400,
799     .uflags = INTEL_X86_NCOMBO,
800   },
801   { .uname = "ALL_PF",
802     .udesc  = "L2 or L3 HW prefetches that access L2 cache, including rejects",
803     .ucode  = 0x800,
804     .uflags = INTEL_X86_NCOMBO,
805   },
806   { .uname = "L1D_WB",
807     .udesc  = "L1D writebacks that access L2 cache",
808     .ucode  = 0x1000,
809     .uflags = INTEL_X86_NCOMBO,
810   },
811   { .uname = "L2_FILL",
812     .udesc  = "L2 fill requests that access L2 cache",
813     .ucode  = 0x2000,
814     .uflags = INTEL_X86_NCOMBO,
815   },
816   { .uname = "L2_WB",
817     .udesc  = "L2 writebacks that access L2 cache",
818     .ucode  = 0x4000,
819     .uflags = INTEL_X86_NCOMBO,
820   },
821   { .uname = "ALL_REQUESTS",
822     .udesc  = "Transactions accessing L2 pipe",
823     .ucode  = 0x8000,
824     .uflags = INTEL_X86_NCOMBO | INTEL_X86_DFL,
825   },
826 };
827
828 static const intel_x86_umask_t bdw_ld_blocks[]={
829   { .uname = "STORE_FORWARD",
830     .udesc  = "Counts the number of loads blocked by overlapping with store buffer entries that cannot be forwarded",
831     .ucode  = 0x200,
832     .uflags = INTEL_X86_NCOMBO,
833   },
834   { .uname = "NO_SR",
835     .udesc  = "number of times that split load operations are temporarily blocked because all resources for handling the split accesses are in use",
836     .ucode  = 0x800,
837     .uflags = INTEL_X86_NCOMBO,
838   },
839 };
840
841 static const intel_x86_umask_t bdw_ld_blocks_partial[]={
842   { .uname = "ADDRESS_ALIAS",
843     .udesc  = "False dependencies in MOB due to partial compare on address",
844     .ucode  = 0x100,
845     .uflags = INTEL_X86_DFL,
846   },
847 };
848
849 static const intel_x86_umask_t bdw_load_hit_pre[]={
850   { .uname = "HW_PF",
851     .udesc  = "Non software-prefetch load dispatches that hit FB allocated for hardware prefetch",
852     .ucode  = 0x200,
853     .uflags = INTEL_X86_DFL,
854   },
855 };
856
857 static const intel_x86_umask_t bdw_lock_cycles[]={
858   { .uname = "SPLIT_LOCK_UC_LOCK_DURATION",
859     .udesc  = "Cycles in which the L1D and L2 are locked, due to a UC lock or split lock",
860     .ucode  = 0x100,
861     .uflags = INTEL_X86_NCOMBO,
862   },
863   { .uname = "CACHE_LOCK_DURATION",
864     .udesc  = "cycles that the L1D is locked",
865     .ucode  = 0x200,
866     .uflags = INTEL_X86_NCOMBO,
867   },
868 };
869
870 static const intel_x86_umask_t bdw_longest_lat_cache[]={
871   { .uname = "MISS",
872     .udesc  = "Core-originated cacheable demand requests missed LLC - architectural event",
873     .ucode  = 0x4100,
874     .uflags = INTEL_X86_NCOMBO,
875   },
876   { .uname = "REFERENCE",
877     .udesc  = "Core-originated cacheable demand requests that refer to LLC - architectural event",
878     .ucode  = 0x4f00,
879     .uflags = INTEL_X86_NCOMBO,
880   },
881 };
882
883 static const intel_x86_umask_t bdw_machine_clears[]={
884   { .uname = "CYCLES",
885     .udesc  = "Cycles there was a Nuke. Account for both thread-specific and All Thread Nukes",
886     .ucode  = 0x100,
887     .uflags = INTEL_X86_NCOMBO,
888   },
889   { .uname = "MEMORY_ORDERING",
890     .udesc  = "Number of Memory Ordering Machine Clears detected",
891     .ucode  = 0x200,
892     .uflags = INTEL_X86_NCOMBO,
893   },
894   { .uname = "SMC",
895     .udesc  = "Number of Self-modifying code (SMC) Machine Clears detected",
896     .ucode  = 0x400,
897     .uflags = INTEL_X86_NCOMBO,
898   },
899   { .uname = "MASKMOV",
900     .udesc  = "This event counts the number of executed Intel AVX masked load operations that refer to an illegal address range with the mask bits set to 0",
901     .ucode  = 0x2000,
902     .uflags = INTEL_X86_NCOMBO,
903   },
904 };
905
906 static const intel_x86_umask_t bdw_mem_load_uops_l3_hit_retired[]={
907   { .uname = "XSNP_MISS",
908     .udesc  = "Retired load uops which data sources were L3 hit and cross-core snoop missed in on-pkg core cache",
909     .ucode  = 0x100,
910     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS,
911   },
912   { .uname = "XSNP_HIT",
913     .udesc  = "Retired load uops which data sources were L3 and cross-core snoop hits in on-pkg core cache",
914     .ucode  = 0x200,
915     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS,
916   },
917   { .uname = "XSNP_HITM",
918     .udesc  = "Load had HitM Response from a core on same socket (shared L3). (Non PEBS",
919     .ucode  = 0x400,
920     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS,
921   },
922   { .uname = "XSNP_NONE",
923     .udesc  = "Retired load uops which data sources were hits in L3 without snoops required",
924     .ucode  = 0x800,
925     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS,
926   },
927 };
928
929 static const intel_x86_umask_t bdw_mem_load_uops_l3_miss_retired[]={
930   { .uname = "LOCAL_DRAM",
931     .udesc  = "Retired load uops missing L3 cache but hitting local memory",
932     .ucode  = 0x100,
933     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS | INTEL_X86_DFL,
934   },
935 };
936
937 static const intel_x86_umask_t bdw_mem_load_uops_retired[]={
938   { .uname = "L1_HIT",
939     .udesc  = "Retired load uops with L1 cache hits as data source",
940     .ucode  = 0x100,
941     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS,
942   },
943   { .uname = "L2_HIT",
944     .udesc  = "Retired load uops with L2 cache hits as data source",
945     .ucode  = 0x200,
946     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS,
947   },
948   { .uname = "L3_HIT",
949     .udesc  = "Retired load uops with L3 cache hits as data source",
950     .ucode  = 0x400,
951     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS,
952   },
953   { .uname = "L1_MISS",
954     .udesc  = "Retired load uops which missed the L1D",
955     .ucode  = 0x800,
956     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS,
957   },
958   { .uname = "L2_MISS",
959     .udesc  = "Retired load uops which missed the L2. Unknown data source excluded",
960     .ucode  = 0x1000,
961     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS,
962   },
963   { .uname = "L3_MISS",
964     .udesc  = "Retired load uops which missed the L3",
965     .ucode  = 0x2000,
966     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS,
967   },
968   { .uname = "HIT_LFB",
969     .udesc  = "Retired load uops which missed L1 but hit line fill buffer (LFB)",
970     .ucode  = 0x4000,
971     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS,
972   },
973 };
974
975 static const intel_x86_umask_t bdw_mem_trans_retired[]={
976   { .uname  = "LOAD_LATENCY",
977     .udesc  = "Memory load instructions retired above programmed clocks, minimum threshold value is 3 (Precise Event and ldlat required)",
978     .ucode  = 0x100,
979     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS | INTEL_X86_LDLAT | INTEL_X86_DFL,
980   },
981   { .uname  = "LATENCY_ABOVE_THRESHOLD",
982     .udesc  = "Memory load instructions retired above programmed clocks, minimum threshold value is 3 (Precise Event and ldlat required)",
983     .ucode  = 0x100,
984     .uequiv = "LOAD_LATENCY",
985     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS | INTEL_X86_LDLAT | INTEL_X86_NO_AUTOENCODE,
986   },
987 };
988
989 static const intel_x86_umask_t bdw_mem_uops_retired[]={
990   { .uname = "STLB_MISS_LOADS",
991     .udesc  = "Load uops with true STLB miss retired to architected path",
992     .ucode  = 0x1100,
993     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS,
994   },
995   { .uname = "STLB_MISS_STORES",
996     .udesc  = "Store uops with true STLB miss retired to architected path",
997     .ucode  = 0x1200,
998     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS,
999   },
1000   { .uname = "LOCK_LOADS",
1001     .udesc  = "Load uops with locked access retired",
1002     .ucode  = 0x2100,
1003     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS,
1004   },
1005   { .uname = "SPLIT_LOADS",
1006     .udesc  = "Line-splitted load uops retired",
1007     .ucode  = 0x4100,
1008     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS,
1009   },
1010   { .uname = "SPLIT_STORES",
1011     .udesc  = "Line-splitted store uops retired",
1012     .ucode  = 0x4200,
1013     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS,
1014   },
1015   { .uname = "ALL_LOADS",
1016     .udesc  = "All load uops retired",
1017     .ucode  = 0x8100,
1018     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS,
1019   },
1020   { .uname = "ALL_STORES",
1021     .udesc  = "All store uops retired",
1022     .ucode  = 0x8200,
1023     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS,
1024   },
1025 };
1026
1027 static const intel_x86_umask_t bdw_misalign_mem_ref[]={
1028   { .uname = "LOADS",
1029     .udesc  = "Speculative cache-line split load uops dispatched to the L1D",
1030     .ucode  = 0x100,
1031     .uflags = INTEL_X86_NCOMBO,
1032   },
1033   { .uname = "STORES",
1034     .udesc  = "Speculative cache-line split store-address uops dispatched to L1D",
1035     .ucode  = 0x200,
1036     .uflags = INTEL_X86_NCOMBO,
1037   },
1038 };
1039
1040 static const intel_x86_umask_t bdw_move_elimination[]={
1041   { .uname = "INT_ELIMINATED",
1042     .udesc  = "Number of integer Move Elimination candidate uops that were eliminated",
1043     .ucode  = 0x100,
1044     .uflags = INTEL_X86_NCOMBO,
1045   },
1046   { .uname = "SIMD_ELIMINATED",
1047     .udesc  = "Number of SIMD Move Elimination candidate uops that were eliminated",
1048     .ucode  = 0x200,
1049     .uflags = INTEL_X86_NCOMBO,
1050   },
1051   { .uname = "INT_NOT_ELIMINATED",
1052     .udesc  = "Number of integer Move Elimination candidate uops that were not eliminated",
1053     .ucode  = 0x400,
1054     .uflags = INTEL_X86_NCOMBO,
1055   },
1056   { .uname = "SIMD_NOT_ELIMINATED",
1057     .udesc  = "Number of SIMD Move Elimination candidate uops that were not eliminated",
1058     .ucode  = 0x800,
1059     .uflags = INTEL_X86_NCOMBO,
1060   },
1061 };
1062
1063 static const intel_x86_umask_t bdw_offcore_requests[]={
1064   { .uname  = "DEMAND_DATA_RD",
1065     .udesc  = "Demand data read requests sent to uncore (use with HT off only)",
1066     .ucode = 0x100,
1067     .uflags= INTEL_X86_NCOMBO,
1068   },
1069   { .uname = "DEMAND_CODE_RD",
1070     .udesc  = "Demand code read requests sent to uncore (use with HT off only)",
1071     .ucode  = 0x200,
1072     .uflags = INTEL_X86_NCOMBO,
1073   },
1074   { .uname = "DEMAND_RFO",
1075     .udesc  = "Demand RFOs requests sent to uncore (use with HT off only)",
1076     .ucode  = 0x400,
1077     .uflags = INTEL_X86_NCOMBO,
1078   },
1079   { .uname = "ALL_DATA_RD",
1080     .udesc  = "Data read requests sent to uncore (use with HT off only)",
1081     .ucode  = 0x800,
1082     .uflags = INTEL_X86_NCOMBO,
1083   },
1084 };
1085
1086 static const intel_x86_umask_t bdw_other_assists[]={
1087   { .uname = "AVX_TO_SSE",
1088     .udesc  = "Number of transitions from AVX-256 to legacy SSE when penalty applicable",
1089     .ucode  = 0x800,
1090     .uflags = INTEL_X86_NCOMBO,
1091   },
1092   { .uname = "SSE_TO_AVX",
1093     .udesc  = "Number of transitions from legacy SSE to AVX-256 when penalty applicable",
1094     .ucode  = 0x1000,
1095     .uflags = INTEL_X86_NCOMBO,
1096   },
1097   { .uname = "ANY_WB_ASSIST",
1098     .udesc  = "Number of times any microcode assist is invoked by HW upon uop writeback",
1099     .ucode  = 0x4000,
1100     .uflags = INTEL_X86_NCOMBO,
1101   },
1102 };
1103
1104 static const intel_x86_umask_t bdw_resource_stalls[]={
1105   { .uname = "ANY",
1106     .udesc  = "Cycles Allocation is stalled due to Resource Related reason",
1107     .ucode  = 0x100,
1108     .uflags = INTEL_X86_NCOMBO | INTEL_X86_DFL,
1109   },
1110   { .uname = "ALL",
1111     .udesc  = "Cycles Allocation is stalled due to Resource Related reason",
1112     .ucode  = 0x100,
1113     .uequiv = "ANY",
1114     .uflags = INTEL_X86_NCOMBO,
1115   },
1116   { .uname = "RS",
1117     .udesc  = "Stall cycles caused by absence of eligible entries in Reservation Station (RS)",
1118     .ucode  = 0x400,
1119     .uflags = INTEL_X86_NCOMBO,
1120   },
1121   { .uname = "SB",
1122     .udesc  = "Cycles Allocator is stalled due to Store Buffer full (not including draining from synch)",
1123     .ucode  = 0x800,
1124     .uflags = INTEL_X86_NCOMBO,
1125   },
1126   { .uname = "ROB",
1127     .udesc  = "ROB full stall cycles",
1128     .ucode  = 0x1000,
1129     .uflags = INTEL_X86_NCOMBO,
1130   },
1131 };
1132
1133 static const intel_x86_umask_t bdw_rob_misc_events[]={
1134   { .uname = "LBR_INSERTS",
1135     .udesc  = "Count each time an new Last Branch Record (LBR) is inserted",
1136     .ucode  = 0x2000,
1137     .uflags = INTEL_X86_NCOMBO | INTEL_X86_DFL,
1138   },
1139 };
1140
1141 static const intel_x86_umask_t bdw_rs_events[]={
1142   { .uname = "EMPTY_CYCLES",
1143     .udesc  = "Cycles the Reservation Station (RS) is empty for this thread",
1144     .ucode  = 0x100,
1145     .uflags = INTEL_X86_DFL,
1146   },
1147   { .uname = "EMPTY_END",
1148     .udesc  = "Number of times the reservation station (RS) was empty",
1149     .ucode  = 0x100 | INTEL_X86_MOD_INV |  (1 << INTEL_X86_CMASK_BIT) | INTEL_X86_MOD_EDGE, /* inv=1, cmask=1,edge=1 */
1150     .modhw  = _INTEL_X86_ATTR_I | _INTEL_X86_ATTR_C | _INTEL_X86_ATTR_E,
1151   },
1152 };
1153
1154 static const intel_x86_umask_t bdw_tlb_flush[]={
1155   { .uname = "DTLB_THREAD",
1156     .udesc  = "Count number of DTLB flushes of thread-specific entries",
1157     .ucode  = 0x100,
1158     .uflags = INTEL_X86_NCOMBO,
1159   },
1160   { .uname = "STLB_ANY",
1161     .udesc  = "Count number of any STLB flushes",
1162     .ucode  = 0x2000,
1163     .uflags = INTEL_X86_NCOMBO,
1164   },
1165 };
1166
1167 static const intel_x86_umask_t bdw_uops_executed[]={
1168   { .uname = "CORE",
1169     .udesc  = "Number of uops executed from any thread",
1170     .ucode  = 0x200,
1171     .uflags = INTEL_X86_DFL,
1172   },
1173   { .uname = "STALL_CYCLES",
1174     .udesc  = "Number of cycles with no uops executed",
1175     .ucode  = 0x200 | INTEL_X86_MOD_INV | (1 << INTEL_X86_CMASK_BIT), /* inv=1 cnt=1 */
1176     .uequiv = "CORE:c=1:i=1",
1177     .uflags = INTEL_X86_NCOMBO,
1178     .modhw  = _INTEL_X86_ATTR_I | _INTEL_X86_ATTR_C,
1179   },
1180 };
1181
1182 static const intel_x86_umask_t bdw_uops_executed_port[]={
1183   { .uname = "PORT_0",
1184     .udesc  = "Cycles which a Uop is executed on port 0",
1185     .ucode  = 0x100,
1186     .uflags = INTEL_X86_NCOMBO,
1187   },
1188   { .uname = "PORT_1",
1189     .udesc  = "Cycles which a Uop is executed on port 1",
1190     .ucode  = 0x200,
1191     .uflags = INTEL_X86_NCOMBO,
1192   },
1193   { .uname = "PORT_2",
1194     .udesc  = "Cycles which a Uop is executed on port 2",
1195     .ucode  = 0x400,
1196     .uflags = INTEL_X86_NCOMBO,
1197   },
1198   { .uname = "PORT_3",
1199     .udesc  = "Cycles which a Uop is executed on port 3",
1200     .ucode  = 0x800,
1201     .uflags = INTEL_X86_NCOMBO,
1202   },
1203   { .uname = "PORT_4",
1204     .udesc  = "Cycles which a Uop is executed on port 4",
1205     .ucode  = 0x1000,
1206     .uflags = INTEL_X86_NCOMBO,
1207   },
1208   { .uname = "PORT_5",
1209     .udesc  = "Cycles which a Uop is executed on port 5",
1210     .ucode  = 0x2000,
1211     .uflags = INTEL_X86_NCOMBO,
1212   },
1213   { .uname = "PORT_6",
1214     .udesc  = "Cycles which a Uop is executed on port 6",
1215     .ucode  = 0x4000,
1216     .uflags = INTEL_X86_NCOMBO,
1217   },
1218   { .uname = "PORT_7",
1219     .udesc  = "Cycles which a Uop is executed on port 7",
1220     .ucode  = 0x8000,
1221     .uflags = INTEL_X86_NCOMBO,
1222   },
1223   { .uname = "PORT_0_CORE",
1224     .udesc  = "tbd",
1225     .ucode  = 0x100 | INTEL_X86_MOD_ANY, /* any=1 */
1226     .uequiv = "PORT_0:t=1",
1227     .uflags = INTEL_X86_NCOMBO,
1228     .modhw  = _INTEL_X86_ATTR_T,
1229   },
1230   { .uname = "PORT_1_CORE",
1231     .udesc  = "tbd",
1232     .ucode  = 0x200 | INTEL_X86_MOD_ANY, /* any=1 */
1233     .uequiv = "PORT_1:t=1",
1234     .uflags = INTEL_X86_NCOMBO,
1235     .modhw  = _INTEL_X86_ATTR_T,
1236   },
1237   { .uname = "PORT_2_CORE",
1238     .udesc  = "tbd",
1239     .ucode  = 0x400 | INTEL_X86_MOD_ANY, /* any=1 */
1240     .uequiv = "PORT_2:t=1",
1241     .uflags = INTEL_X86_NCOMBO,
1242     .modhw  = _INTEL_X86_ATTR_T,
1243   },
1244   { .uname = "PORT_3_CORE",
1245     .udesc  = "tbd",
1246     .ucode  = 0x800 | INTEL_X86_MOD_ANY, /* any=1 */
1247     .uequiv = "PORT_3:t=1",
1248     .uflags = INTEL_X86_NCOMBO,
1249     .modhw  = _INTEL_X86_ATTR_T,
1250   },
1251   { .uname = "PORT_4_CORE",
1252     .udesc  = "tbd",
1253     .ucode  = 0x1000 | INTEL_X86_MOD_ANY, /* any=1 */
1254     .uequiv = "PORT_4:t=1",
1255     .uflags = INTEL_X86_NCOMBO,
1256     .modhw  = _INTEL_X86_ATTR_T,
1257   },
1258   { .uname = "PORT_5_CORE",
1259     .udesc  = "tbd",
1260     .ucode  = 0x2000 | INTEL_X86_MOD_ANY, /* any=1 */
1261     .uequiv = "PORT_5:t=1",
1262     .uflags = INTEL_X86_NCOMBO,
1263     .modhw  = _INTEL_X86_ATTR_T,
1264   },
1265   { .uname = "PORT_6_CORE",
1266     .udesc  = "tbd",
1267     .ucode  = 0x4000 | INTEL_X86_MOD_ANY, /* any=1 */
1268     .uequiv = "PORT_6:t=1",
1269     .uflags = INTEL_X86_NCOMBO,
1270     .modhw  = _INTEL_X86_ATTR_T,
1271   },
1272   { .uname = "PORT_7_CORE",
1273     .udesc  = "tbd",
1274     .ucode  = 0x8000 | INTEL_X86_MOD_ANY, /* any=1 */
1275     .uequiv = "PORT_7:t=1",
1276     .uflags = INTEL_X86_NCOMBO,
1277     .modhw  = _INTEL_X86_ATTR_T,
1278   },
1279 };
1280
1281 static const intel_x86_umask_t bdw_uops_issued[]={
1282   { .uname = "ANY",
1283     .udesc  = "Number of Uops issued by the Resource Allocation Table (RAT) to the Reservation Station (RS)",
1284     .ucode  = 0x100,
1285     .uflags = INTEL_X86_NCOMBO | INTEL_X86_DFL,
1286   },
1287   { .uname = "ALL",
1288     .udesc  = "Number of Uops issued by the Resource Allocation Table (RAT) to the Reservation Station (RS)",
1289     .ucode  = 0x100,
1290     .uequiv = "ANY",
1291     .uflags = INTEL_X86_NCOMBO,
1292   },
1293   { .uname = "FLAGS_MERGE",
1294     .udesc  = "Number of flags-merge uops being allocated. Such uops adds delay",
1295     .ucode  = 0x1000,
1296     .uflags = INTEL_X86_NCOMBO,
1297   },
1298   { .uname = "SLOW_LEA",
1299     .udesc  = "Number of slow LEA or similar uops allocated. Such uop has 3 sources regardless if result of LEA instruction or not",
1300     .ucode  = 0x2000,
1301     .uflags = INTEL_X86_NCOMBO,
1302   },
1303   { .uname = "SINGLE_MUL",
1304     .udesc  = "Number of Multiply packed/scalar single precision uops allocated",
1305     .ucode  = 0x4000,
1306     .uflags = INTEL_X86_NCOMBO,
1307   },
1308   { .uname = "STALL_CYCLES",
1309     .udesc  = "Counts the number of cycles no uops issued by this thread",
1310     .ucode  = 0x100 | INTEL_X86_MOD_INV | (1 << INTEL_X86_CMASK_BIT), /* inv=1 cnt=1 */
1311     .uequiv = "ANY:c=1:i=1",
1312     .uflags = INTEL_X86_NCOMBO,
1313     .ucntmsk = 0xf,
1314     .modhw  = _INTEL_X86_ATTR_I | _INTEL_X86_ATTR_C,
1315   },
1316   { .uname = "CORE_STALL_CYCLES",
1317     .udesc  = "Counts the number of cycles no uops issued on this core",
1318     .ucode  = 0x100 | INTEL_X86_MOD_ANY | INTEL_X86_MOD_INV | (1 << INTEL_X86_CMASK_BIT), /* any=1 inv=1 cnt=1 */
1319     .uequiv = "ANY:c=1:i=1:t=1",
1320     .ucntmsk = 0xf,
1321     .uflags = INTEL_X86_NCOMBO,
1322     .modhw  = _INTEL_X86_ATTR_T | _INTEL_X86_ATTR_I | _INTEL_X86_ATTR_C,
1323   },
1324 };
1325
1326 static const intel_x86_umask_t bdw_uops_retired[]={
1327   { .uname = "ALL",
1328     .udesc  = "All uops that actually retired",
1329     .ucode  = 0x100,
1330     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS | INTEL_X86_DFL,
1331   },
1332   { .uname = "ANY",
1333     .udesc  = "All uops that actually retired",
1334     .ucode  = 0x100,
1335     .uequiv = "ALL",
1336     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS,
1337   },
1338   { .uname = "RETIRE_SLOTS",
1339     .udesc  = "number of retirement slots used non PEBS",
1340     .ucode  = 0x200,
1341     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS,
1342   },
1343   { .uname = "STALL_CYCLES",
1344     .udesc  = "Cycles no executable uops retired (Precise Event)",
1345     .ucode  = 0x100 | INTEL_X86_MOD_INV | (1 << INTEL_X86_CMASK_BIT), /* inv=1 cnt=1 */
1346     .uequiv = "ALL:i=1:c=1",
1347     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS,
1348     .modhw  = _INTEL_X86_ATTR_I | _INTEL_X86_ATTR_C,
1349   },
1350   { .uname = "TOTAL_CYCLES",
1351     .udesc  = "Number of cycles using always true condition applied to PEBS uops retired event",
1352     .ucode  = 0x100 | INTEL_X86_MOD_INV | (10 << INTEL_X86_CMASK_BIT), /* inv=1 cnt=10 */
1353     .uequiv = "ALL:i=1:c=10",
1354     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS,
1355     .modhw  = _INTEL_X86_ATTR_I | _INTEL_X86_ATTR_C,
1356   },
1357   { .uname = "CORE_STALL_CYCLES",
1358     .udesc  = "Cycles no executable uops retired on core (Precise Event)",
1359     .ucode  = 0x100 | INTEL_X86_MOD_INV | (1 << INTEL_X86_CMASK_BIT), /* inv=1 cnt=1 */
1360     .uequiv = "ALL:i=1:c=1:t=1",
1361     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS,
1362     .modhw  = _INTEL_X86_ATTR_I | _INTEL_X86_ATTR_C,
1363   },
1364   { .uname = "STALL_OCCURRENCES",
1365     .udesc  = "Number of transitions from stalled to unstalled execution (Precise Event)",
1366     .ucode  = 0x100 | INTEL_X86_MOD_INV | INTEL_X86_MOD_EDGE| (1 << INTEL_X86_CMASK_BIT), /* inv=1 edge=1 cnt=1 */
1367     .uequiv = "ALL:c=1:i=1:e=1",
1368     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS,
1369     .modhw  = _INTEL_X86_ATTR_I | _INTEL_X86_ATTR_C | _INTEL_X86_ATTR_E,
1370   },
1371 };
1372
1373 static const intel_x86_umask_t bdw_offcore_response[]={
1374    { .uname  = "DMND_DATA_RD",
1375      .udesc  = "Request: number of demand and DCU prefetch data reads of full and partial cachelines as well as demand data page table entry cacheline reads. Does not count L2 data read prefetches or instruction fetches",
1376      .ucode = 1ULL << (0 + 8),
1377      .grpid = 0,
1378    },
1379    { .uname  = "DMND_RFO",
1380      .udesc  = "Request: number of demand and DCU prefetch reads for ownership (RFO) requests generated by a write to data cacheline. Does not count L2 RFO prefetches",
1381      .ucode = 1ULL << (1 + 8),
1382      .grpid = 0,
1383    },
1384    { .uname  = "DMND_IFETCH",
1385      .udesc  = "Request: number of demand and DCU prefetch instruction cacheline reads. Does not count L2 code read prefetches",
1386      .ucode = 1ULL << (2 + 8),
1387      .grpid = 0,
1388    },
1389    { .uname  = "WB",
1390      .udesc  = "Request: number of writebacks (modified to exclusive) transactions",
1391      .ucode = 1ULL << (3 + 8),
1392      .grpid = 0,
1393    },
1394    { .uname  = "PF_DATA_RD",
1395      .udesc  = "Request: number of data cacheline reads generated by L2 prefetchers",
1396      .ucode = 1ULL << (4 + 8),
1397      .grpid = 0,
1398    },
1399    { .uname  = "PF_RFO",
1400      .udesc  = "Request: number of RFO requests generated by L2 prefetchers",
1401      .ucode = 1ULL << (5 + 8),
1402      .grpid = 0,
1403    },
1404    { .uname  = "PF_IFETCH",
1405      .udesc  = "Request: number of code reads generated by L2 prefetchers",
1406      .ucode = 1ULL << (6 + 8),
1407      .grpid = 0,
1408    },
1409    { .uname  = "PF_LLC_DATA_RD",
1410      .udesc  = "Request: number of L3 prefetcher requests to L2 for loads",
1411      .ucode = 1ULL << (7 + 8),
1412      .grpid = 0,
1413    },
1414    { .uname  = "PF_LLC_RFO",
1415      .udesc  = "Request: number of RFO requests generated by L2 prefetcher",
1416      .ucode = 1ULL << (8 + 8),
1417      .grpid = 0,
1418    },
1419    { .uname  = "PF_LLC_IFETCH",
1420      .udesc  = "Request: number of L2 prefetcher requests to L3 for instruction fetches",
1421      .ucode = 1ULL << (9 + 8),
1422      .grpid = 0,
1423    },
1424    { .uname  = "BUS_LOCKS",
1425      .udesc  = "Request: number bus lock and split lock requests",
1426      .ucode = 1ULL << (10 + 8),
1427      .grpid = 0,
1428    },
1429    { .uname  = "STRM_ST",
1430      .udesc  = "Request: number of streaming store requests",
1431      .ucode = 1ULL << (11 + 8),
1432      .grpid = 0,
1433    },
1434    { .uname  = "OTHER",
1435      .udesc  = "Request: counts one of the following transaction types, including L3 invalidate, I/O, full or partial writes, WC or non-temporal stores, CLFLUSH, Fences, lock, unlock, split lock",
1436      .ucode = 1ULL << (15+8),
1437      .grpid = 0,
1438    },
1439    { .uname  = "ANY_IFETCH",
1440      .udesc  = "Request: combination of PF_IFETCH | DMND_IFETCH | PF_LLC_IFETCH",
1441      .uequiv = "PF_IFETCH:DMND_IFETCH:PF_LLC_IFETCH",
1442      .ucode = 0x24100,
1443      .grpid = 0,
1444    },
1445    { .uname  = "ANY_REQUEST",
1446      .udesc  = "Request: combination of all request umasks",
1447      .uequiv = "DMND_DATA_RD:DMND_RFO:DMND_IFETCH:WB:PF_DATA_RD:PF_RFO:PF_IFETCH:PF_LLC_DATA_RD:PF_LLC_RFO:PF_LLC_IFETCH:BUS_LOCKS:STRM_ST:OTHER",
1448      .ucode = 0x8fff00,
1449      .uflags= INTEL_X86_NCOMBO | INTEL_X86_DFL,
1450      .grpid = 0,
1451    },
1452    { .uname  = "ANY_DATA",
1453      .udesc  = "Request: combination of DMND_DATA | PF_DATA_RD | PF_LLC_DATA_RD",
1454      .uequiv = "DMND_DATA_RD:PF_DATA_RD:PF_LLC_DATA_RD",
1455      .ucode = 0x9100,
1456      .grpid = 0,
1457    },
1458    { .uname  = "ANY_RFO",
1459      .udesc  = "Request: combination of DMND_RFO | PF_RFO | PF_LLC_RFO",
1460      .uequiv = "DMND_RFO:PF_RFO:PF_LLC_RFO",
1461      .ucode = 0x10300,
1462      .grpid = 0,
1463    },
1464
1465    { .uname  = "ANY_RESPONSE",
1466      .udesc  = "Response: count any response type",
1467      .ucode = 1ULL << (16+8),
1468      .uflags= INTEL_X86_NCOMBO | INTEL_X86_DFL | INTEL_X86_EXCL_GRP_GT,
1469      .grpid = 1,
1470    },
1471    { .uname  = "NO_SUPP",
1472      .udesc  = "Supplier: counts number of times supplier information is not available",
1473      .ucode = 1ULL << (17+8),
1474      .grpid = 1,
1475    },
1476    { .uname  = "LLC_HITM",
1477      .udesc  = "Supplier: counts L3 hits in M-state (initial lookup)",
1478      .ucode = 1ULL << (18+8),
1479      .umodel = PFM_PMU_INTEL_BDW,
1480      .grpid = 1,
1481    },
1482    { .uname  = "LLC_HITE",
1483      .udesc  = "Supplier: counts L3 hits in E-state",
1484      .ucode = 1ULL << (19+8),
1485      .umodel = PFM_PMU_INTEL_BDW,
1486      .grpid = 1,
1487    },
1488    { .uname  = "LLC_HITS",
1489      .udesc  = "Supplier: counts L3 hits in S-state",
1490      .ucode = 1ULL << (20+8),
1491      .umodel = PFM_PMU_INTEL_BDW,
1492      .grpid = 1,
1493    },
1494    { .uname  = "LLC_HITF",
1495      .udesc  = "Supplier: counts L3 hits in F-state",
1496      .ucode = 1ULL << (21+8),
1497      .umodel = PFM_PMU_INTEL_BDW,
1498      .grpid = 1,
1499    },
1500    { .uname  = "LLC_HITMESF",
1501      .udesc  = "Supplier: counts L3 hits in any state (M, E, S, F)",
1502      .ucode  = 0xfULL << (18+8),
1503      .uequiv = "LLC_HITM:LLC_HITE:LLC_HITS:LLC_HITF",
1504      .umodel = PFM_PMU_INTEL_BDW,
1505      .grpid  = 1,
1506    },
1507    { .uname  = "LLC_HIT",
1508      .udesc  = "Alias for LLC_HITMESF",
1509      .ucode  = 0xfULL << (18+8),
1510      .uequiv = "LLC_HITM:LLC_HITE:LLC_HITS:LLC_HITF",
1511      .umodel = PFM_PMU_INTEL_BDW,
1512      .grpid  = 1,
1513    },
1514    { .uname  = "LLC_MISS_LOCAL",
1515      .udesc  = "Supplier: counts L3 misses to local DRAM",
1516      .ucode = 1ULL << (22+8),
1517      .umodel = PFM_PMU_INTEL_BDW,
1518      .grpid = 1,
1519    },
1520    { .uname  = "SNP_NONE",
1521      .udesc  = "Snoop: counts number of times no snoop-related information is available",
1522      .ucode = 1ULL << (31+8),
1523      .grpid = 2,
1524    },
1525    { .uname  = "SNP_NOT_NEEDED",
1526      .udesc  = "Snoop: counts the number of times no snoop was needed to satisfy the request",
1527      .ucode = 1ULL << (32+8),
1528      .grpid = 2,
1529    },
1530    { .uname  = "SNP_MISS",
1531      .udesc  = "Snoop: counts number of times a snoop was needed and it missed all snooped caches",
1532      .ucode = 1ULL << (33+8),
1533      .grpid = 2,
1534    },
1535    { .uname  = "SNP_NO_FWD",
1536      .udesc  = "Snoop: counts number of times a snoop was needed and it hit in at leas one snooped cache",
1537      .ucode = 1ULL << (34+8),
1538      .grpid = 2,
1539    },
1540    { .uname  = "SNP_FWD",
1541      .udesc  = "Snoop: counts number of times a snoop was needed and data was forwarded from a remote socket",
1542      .ucode = 1ULL << (35+8),
1543      .grpid = 2,
1544    },
1545    { .uname  = "HITM",
1546      .udesc  = "Snoop: counts number of times a snoop was needed and it hitM-ed in local or remote cache",
1547      .ucode = 1ULL << (36+8),
1548      .grpid = 2,
1549    },
1550    { .uname  = "NON_DRAM",
1551      .udesc  = "Snoop:  counts number of times target was a non-DRAM system address. This includes MMIO transactions",
1552      .ucode = 1ULL << (37+8),
1553      .grpid = 2,
1554    },
1555    { .uname  = "SNP_ANY",
1556      .udesc  = "Snoop: any snoop reason",
1557      .ucode = 0x7fULL << (31+8),
1558      .uequiv = "SNP_NONE:SNP_NOT_NEEDED:SNP_MISS:SNP_NO_FWD:SNP_FWD:HITM:NON_DRAM",
1559      .uflags= INTEL_X86_DFL,
1560      .grpid = 2,
1561    },
1562 };
1563
1564 static const intel_x86_umask_t bdw_hle_retired[]={
1565   { .uname = "START",
1566     .udesc  = "Number of times an HLE execution started",
1567     .ucode  = 0x100,
1568     .uflags = INTEL_X86_NCOMBO | INTEL_X86_DFL,
1569   },
1570   { .uname = "COMMIT",
1571     .udesc  = "Number of times an HLE execution successfully committed",
1572     .ucode  = 0x200,
1573     .uflags = INTEL_X86_NCOMBO,
1574   },
1575   { .uname = "ABORTED",
1576     .udesc  = "Number of times an HLE execution aborted due to any reasons (multiple categories may count as one) (Precise Event)",
1577     .ucode  = 0x400,
1578     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS,
1579   },
1580   { .uname = "ABORTED_MISC1",
1581     .udesc  = "Number of times an HLE execution aborted due to various memory events",
1582     .ucode  = 0x800,
1583     .uflags = INTEL_X86_NCOMBO,
1584   },
1585   { .uname = "ABORTED_MISC2",
1586     .udesc  = "Number of times an HLE execution aborted due to uncommon conditions",
1587     .ucode  = 0x1000,
1588     .uflags = INTEL_X86_NCOMBO,
1589   },
1590   { .uname = "ABORTED_MISC3",
1591     .udesc  = "Number of times an HLE execution aborted due to HLE-unfriendly instructions",
1592     .ucode  = 0x2000,
1593     .uflags = INTEL_X86_NCOMBO,
1594   },
1595   { .uname = "ABORTED_MISC4",
1596     .udesc  = "Number of times an HLE execution aborted due to incompatible memory type",
1597     .ucode  = 0x4000,
1598     .uflags = INTEL_X86_NCOMBO,
1599   },
1600   { .uname = "ABORTED_MISC5",
1601     .udesc  = "Number of times an HLE execution aborted due to none of the other 4 reasons (e.g., interrupt)",
1602     .ucode  = 0x8000,
1603     .uflags = INTEL_X86_NCOMBO,
1604   },
1605 };
1606
1607 static const intel_x86_umask_t bdw_rtm_retired[]={
1608   { .uname = "START",
1609     .udesc  = "Number of times an RTM execution started",
1610     .ucode  = 0x100,
1611     .uflags = INTEL_X86_NCOMBO | INTEL_X86_DFL,
1612   },
1613   { .uname = "COMMIT",
1614     .udesc  = "Number of times an RTM execution successfully committed",
1615     .ucode  = 0x200,
1616     .uflags = INTEL_X86_NCOMBO,
1617   },
1618   { .uname = "ABORTED",
1619     .udesc  = "Number of times an RTM execution aborted due to any reasons (multiple categories may count as one) (Precise Event)",
1620     .ucode  = 0x400,
1621     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS,
1622   },
1623   { .uname = "ABORTED_MISC1",
1624     .udesc  = "Number of times an RTM execution aborted due to various memory events",
1625     .ucode  = 0x800,
1626     .uflags = INTEL_X86_NCOMBO,
1627   },
1628   { .uname = "ABORTED_MISC2",
1629     .udesc  = "Number of times an RTM execution aborted due to uncommon conditions",
1630     .ucode  = 0x1000,
1631     .uflags = INTEL_X86_NCOMBO,
1632   },
1633   { .uname = "ABORTED_MISC3",
1634     .udesc  = "Number of times an RTM execution aborted due to RTM-unfriendly instructions",
1635     .ucode  = 0x2000,
1636     .uflags = INTEL_X86_NCOMBO,
1637   },
1638   { .uname = "ABORTED_MISC4",
1639     .udesc  = "Number of times an RTM execution aborted due to incompatible memory type",
1640     .ucode  = 0x4000,
1641     .uflags = INTEL_X86_NCOMBO,
1642   },
1643   { .uname = "ABORTED_MISC5",
1644     .udesc  = "Number of times an RTM execution aborted due to none of the other 4 reasons (e.g., interrupt)",
1645     .ucode  = 0x8000,
1646     .uflags = INTEL_X86_NCOMBO,
1647   },
1648 };
1649
1650 static const intel_x86_umask_t bdw_tx_mem[]={
1651   { .uname = "ABORT_CONFLICT",
1652     .udesc  = "Number of times a transactional abort was signaled due to data conflict on a transactionally accessed address",
1653     .ucode  = 0x100,
1654     .uflags = INTEL_X86_NCOMBO,
1655   },
1656   { .uname = "ABORT_CAPACITY",
1657     .udesc  = "Number of times a transactional abort was signaled due to data capacity limitation",
1658     .ucode  = 0x200,
1659     .uflags = INTEL_X86_NCOMBO,
1660   },
1661   { .uname = "ABORT_HLE_STORE_TO_ELIDED_LOCK",
1662     .udesc  = "Number of times a HLE transactional execution aborted due to a non xrelease prefixed instruction writing to an elided lock in the elision buffer",
1663     .ucode  = 0x400,
1664     .uflags = INTEL_X86_NCOMBO,
1665   },
1666   { .uname = "ABORT_HLE_ELISION_BUFFER_NOT_EMPTY",
1667     .udesc  = "Number of times a HLE transactional execution aborted due to NoAllocatedElisionBuffer being non-zero",
1668     .ucode  = 0x800,
1669     .uflags = INTEL_X86_NCOMBO,
1670   },
1671   { .uname = "ABORT_HLE_ELISION_BUFFER_MISMATCH",
1672     .udesc  = "Number of times a HLE transaction execution aborted due to xrelease lock not satisfying the address and value requirements in the elision buffer",
1673     .ucode  = 0x1000,
1674     .uflags = INTEL_X86_NCOMBO,
1675   },
1676   { .uname = "ABORT_HLE_ELISION_BUFFER_UNSUPPORTED_ALIGNMENT",
1677     .udesc  = "Number of times a HLE transaction execution aborted due to an unsupported read alignment from the elision buffer",
1678     .ucode  = 0x2000,
1679     .uflags = INTEL_X86_NCOMBO,
1680   },
1681   { .uname = "ABORT_HLE_ELISION_BUFFER_FULL",
1682     .udesc  = "Number of times a HLE clock could not be elided due to ElisionBufferAvailable being zero",
1683     .ucode  = 0x4000,
1684     .uflags = INTEL_X86_NCOMBO,
1685   },
1686 };
1687
1688 static const intel_x86_umask_t bdw_tx_exec[]={
1689   { .uname = "MISC1",
1690     .udesc  = "Number of times a class of instructions that may cause a transactional abort was executed. Since this is the count of execution, it may not always cause a transactional abort",
1691     .ucode  = 0x100,
1692     .uflags = INTEL_X86_NCOMBO,
1693   },
1694   { .uname = "MISC2",
1695     .udesc  = "Number of times a class of instructions that may cause a transactional abort was executed inside a transactional region",
1696     .ucode  = 0x200,
1697     .uflags = INTEL_X86_NCOMBO,
1698   },
1699   { .uname = "MISC3",
1700     .udesc  = "Number of times an instruction execution caused the supported nest count to be exceeded",
1701     .ucode  = 0x400,
1702     .uflags = INTEL_X86_NCOMBO,
1703   },
1704   { .uname = "MISC4",
1705     .udesc  = "Number of times an instruction a xbegin instruction was executed inside HLE transactional region",
1706     .ucode  = 0x800,
1707     .uflags = INTEL_X86_NCOMBO,
1708   },
1709   { .uname = "MISC5",
1710     .udesc  = "Number of times an instruction with HLE xacquire prefix was executed inside a RTM transactional region",
1711     .ucode  = 0x1000,
1712     .uflags = INTEL_X86_NCOMBO,
1713   },
1714 };
1715
1716 static const intel_x86_umask_t bdw_offcore_requests_outstanding[]={
1717    { .uname  = "ALL_DATA_RD_CYCLES",
1718      .udesc  = "Cycles with cacheable data read transactions in the superQ (use with HT off only)",
1719      .uequiv = "ALL_DATA_RD:c=1",
1720      .ucode = 0x800 | (0x1 << INTEL_X86_CMASK_BIT),
1721      .uflags= INTEL_X86_NCOMBO,
1722    },
1723    { .uname  = "DEMAND_CODE_RD_CYCLES",
1724      .udesc  = "Cycles with demand code reads transactions in the superQ (use with HT off only)",
1725      .uequiv = "DEMAND_CODE_RD:c=1",
1726      .ucode = 0x200 | (0x1 << INTEL_X86_CMASK_BIT),
1727      .uflags= INTEL_X86_NCOMBO,
1728    },
1729    { .uname  = "DEMAND_DATA_RD_CYCLES",
1730      .udesc  = "Cycles with demand data read transactions in the superQ (use with HT off only)",
1731      .uequiv = "DEMAND_DATA_RD:c=1",
1732      .ucode = 0x100 | (0x1 << INTEL_X86_CMASK_BIT),
1733      .uflags= INTEL_X86_NCOMBO,
1734    },
1735    { .uname  = "ALL_DATA_RD",
1736      .udesc  = "Cacheable data read transactions in the superQ every cycle (use with HT off only)",
1737      .ucode = 0x800,
1738      .uflags= INTEL_X86_NCOMBO,
1739    },
1740    { .uname  = "DEMAND_CODE_RD",
1741      .udesc  = "Code read transactions in the superQ every cycle (use with HT off only)",
1742      .ucode = 0x200,
1743      .uflags= INTEL_X86_NCOMBO,
1744    },
1745    { .uname  = "DEMAND_DATA_RD",
1746      .udesc  = "Demand data read transactions in the superQ every cycle (use with HT off only)",
1747      .ucode = 0x100,
1748      .uflags= INTEL_X86_NCOMBO,
1749    },
1750    { .uname  = "DEMAND_RFO",
1751      .udesc  = "Outstanding RFO (store) transactions in the superQ every cycle (use with HT off only)",
1752      .ucode = 0x400,
1753      .uflags= INTEL_X86_NCOMBO,
1754    },
1755    { .uname  = "DEMAND_RFO_CYCLES",
1756      .udesc  = "Cycles with outstanding RFO (store) transactions in the superQ (use with HT off only)",
1757      .uequiv = "DEMAND_RFO:c=1",
1758      .ucode = 0x400 | (0x1 << INTEL_X86_CMASK_BIT),
1759      .uflags= INTEL_X86_NCOMBO,
1760    },
1761 };
1762
1763 static const intel_x86_umask_t bdw_ild_stall[]={
1764    { .uname  = "LCP",
1765      .udesc  = "Stall caused by changing prefix length of the instruction",
1766      .ucode = 0x100,
1767      .uflags= INTEL_X86_NCOMBO | INTEL_X86_DFL,
1768    },
1769 };
1770
1771 static const intel_x86_umask_t bdw_page_walker_loads[]={
1772    { .uname  = "DTLB_L1",
1773      .udesc  = "Number of DTLB page walker loads that hit in the L1D and line fill buffer",
1774      .ucode = 0x1100,
1775      .uflags= INTEL_X86_NCOMBO,
1776    },
1777    { .uname  = "ITLB_L1",
1778      .udesc  = "Number of ITLB page walker loads that hit in the L1I and line fill buffer",
1779      .ucode = 0x2100,
1780      .uflags= INTEL_X86_NCOMBO,
1781    },
1782    { .uname  = "DTLB_L2",
1783      .udesc  = "Number of DTLB page walker loads that hit in the L2",
1784      .ucode = 0x1200,
1785      .uflags= INTEL_X86_NCOMBO,
1786    },
1787    { .uname  = "ITLB_L2",
1788      .udesc  = "Number of ITLB page walker loads that hit in the L2",
1789      .ucode = 0x2200,
1790      .uflags= INTEL_X86_NCOMBO,
1791    },
1792    { .uname  = "DTLB_L3",
1793      .udesc  = "Number of DTLB page walker loads that hit in the L3",
1794      .ucode = 0x1400,
1795      .uflags= INTEL_X86_NCOMBO,
1796    },
1797    { .uname  = "ITLB_L3",
1798      .udesc  = "Number of ITLB page walker loads that hit in the L3",
1799      .ucode = 0x2400,
1800      .uflags= INTEL_X86_NCOMBO,
1801    },
1802    { .uname  = "DTLB_MEMORY",
1803      .udesc  = "Number of DTLB page walker loads that hit memory",
1804      .ucode = 0x1800,
1805      .uflags= INTEL_X86_NCOMBO,
1806    },
1807    { .uname  = "ITLB_MEMORY",
1808      .udesc  = "Number of ITLB page walker loads that hit memory",
1809      .ucode = 0x2800,
1810      .uflags= INTEL_X86_NCOMBO,
1811    },
1812 };
1813
1814 static const intel_x86_umask_t bdw_lsd[]={
1815    { .uname  = "UOPS",
1816      .udesc  = "Number of uops delivered by the Loop Stream Detector (LSD)",
1817      .ucode = 0x100,
1818      .uflags= INTEL_X86_DFL,
1819    },
1820 };
1821
1822 static const intel_x86_umask_t bdw_dsb2mite_switches[]={
1823    { .uname  = "PENALTY_CYCLES",
1824      .udesc  = "Number of DSB to MITE switch true penalty cycles",
1825      .ucode = 0x0200,
1826      .uflags= INTEL_X86_NCOMBO | INTEL_X86_DFL,
1827    },
1828 };
1829
1830 static const intel_x86_umask_t bdw_ept[]={
1831    { .uname  = "CYCLES",
1832      .udesc  = "Cycles for an extended page table walk",
1833      .ucode = 0x0200,
1834      .uequiv = "WALK_CYCLES",
1835      .uflags= INTEL_X86_NCOMBO,
1836    },
1837    { .uname  = "WALK_CYCLES",
1838      .udesc  = "Cycles for an extended page table walk",
1839      .ucode = 0x0200,
1840      .uflags= INTEL_X86_NCOMBO | INTEL_X86_DFL,
1841    },
1842 };
1843
1844 static const intel_x86_umask_t bdw_arith[]={
1845    { .uname  = "FPU_DIV_ACTIVE",
1846      .udesc  = "Cycles when divider is busy execuing divide operations",
1847      .ucode = 0x0100,
1848      .uflags= INTEL_X86_DFL,
1849    },
1850 };
1851
1852 static const intel_x86_entry_t intel_bdw_pe[]={
1853   { .name   = "UNHALTED_CORE_CYCLES",
1854     .desc   = "Count core clock cycles whenever the clock signal on the specific core is running (not halted)",
1855     .modmsk = INTEL_V4_ATTRS,
1856     .cntmsk = 0x20000000full,
1857     .code = 0x3c,
1858   },
1859   { .name   = "UNHALTED_REFERENCE_CYCLES",
1860     .desc   = "Unhalted reference cycles",
1861     .modmsk = INTEL_FIXED3_ATTRS,
1862     .cntmsk = 0x400000000ull,
1863     .code = 0x0300, /* pseudo encoding */
1864     .flags = INTEL_X86_FIXED,
1865   },
1866   { .name   = "INSTRUCTION_RETIRED",
1867     .desc   = "Number of instructions at retirement",
1868     .modmsk = INTEL_V4_ATTRS,
1869     .cntmsk = 0x10000000full,
1870     .code = 0xc0,
1871   },
1872   { .name   = "INSTRUCTIONS_RETIRED",
1873     .desc   = "This is an alias for INSTRUCTION_RETIRED",
1874     .modmsk = INTEL_V4_ATTRS,
1875     .equiv = "INSTRUCTION_RETIRED",
1876     .cntmsk = 0x10000000full,
1877     .code = 0xc0,
1878   },
1879   { .name   = "BRANCH_INSTRUCTIONS_RETIRED",
1880     .desc   = "Count branch instructions at retirement. Specifically, this event counts the retirement of the last micro-op of a branch instruction",
1881     .modmsk = INTEL_V4_ATTRS,
1882     .equiv = "BR_INST_RETIRED:ALL_BRANCHES",
1883     .cntmsk = 0xff,
1884     .code = 0xc4,
1885   },
1886   { .name   = "MISPREDICTED_BRANCH_RETIRED",
1887     .desc   = "Count mispredicted branch instructions at retirement. Specifically, this event counts at retirement of the last micro-op of a branch instruction in the architectural path of the execution and experienced misprediction in the branch prediction hardware",
1888     .modmsk = INTEL_V4_ATTRS,
1889     .equiv = "BR_MISP_RETIRED:ALL_BRANCHES",
1890     .cntmsk = 0xff,
1891     .code = 0xc5,
1892   },
1893   { .name = "BACLEARS",
1894     .desc   = "Branch re-steered",
1895     .code = 0xe6,
1896     .cntmsk = 0xff,
1897     .ngrp = 1,
1898     .modmsk = INTEL_V4_ATTRS,
1899     .numasks = LIBPFM_ARRAY_SIZE(bdw_baclears),
1900     .umasks  = bdw_baclears
1901   },
1902   { .name = "BR_INST_EXEC",
1903     .desc   = "Branch instructions executed",
1904     .code = 0x88,
1905     .cntmsk = 0xff,
1906     .ngrp = 1,
1907     .modmsk = INTEL_V4_ATTRS,
1908     .numasks = LIBPFM_ARRAY_SIZE(bdw_br_inst_exec),
1909     .umasks  = bdw_br_inst_exec
1910   },
1911   { .name = "BR_INST_RETIRED",
1912     .desc   = "Branch instructions retired (Precise Event)",
1913     .code = 0xc4,
1914     .cntmsk = 0xff,
1915     .ngrp = 1,
1916     .flags = INTEL_X86_PEBS,
1917     .modmsk = INTEL_V4_ATTRS,
1918     .numasks = LIBPFM_ARRAY_SIZE(bdw_br_inst_retired),
1919     .umasks  = bdw_br_inst_retired
1920   },
1921   { .name = "BR_MISP_EXEC",
1922     .desc   = "Mispredicted branches executed",
1923     .code = 0x89,
1924     .cntmsk = 0xff,
1925     .ngrp = 1,
1926     .modmsk = INTEL_V4_ATTRS,
1927     .numasks = LIBPFM_ARRAY_SIZE(bdw_br_misp_exec),
1928     .umasks  = bdw_br_misp_exec
1929   },
1930   { .name = "BR_MISP_RETIRED",
1931     .desc   = "Mispredicted retired branches (Precise Event)",
1932     .code = 0xc5,
1933     .cntmsk = 0xff,
1934     .ngrp = 1,
1935     .flags = INTEL_X86_PEBS,
1936     .modmsk = INTEL_V4_ATTRS,
1937     .numasks = LIBPFM_ARRAY_SIZE(bdw_br_misp_retired),
1938     .umasks  = bdw_br_misp_retired
1939   },
1940   { .name = "CPL_CYCLES",
1941     .desc   = "Unhalted core cycles at a specific ring level",
1942     .code = 0x5c,
1943     .cntmsk = 0xff,
1944     .ngrp = 1,
1945     .modmsk = INTEL_V4_ATTRS,
1946     .numasks = LIBPFM_ARRAY_SIZE(bdw_cpl_cycles),
1947     .umasks  = bdw_cpl_cycles
1948   },
1949   { .name = "CPU_CLK_THREAD_UNHALTED",
1950     .desc   = "Count core clock cycles whenever the clock signal on the specific core is running (not halted)",
1951     .code = 0x3c,
1952     .cntmsk = 0xff,
1953     .ngrp = 1,
1954     .modmsk = INTEL_V4_ATTRS,
1955     .numasks = LIBPFM_ARRAY_SIZE(bdw_cpu_clk_thread_unhalted),
1956     .umasks  = bdw_cpu_clk_thread_unhalted
1957   },
1958   { .name = "CPU_CLK_UNHALTED",
1959     .desc   = "Count core clock cycles whenever the clock signal on the specific core is running (not halted)",
1960     .code = 0x3c,
1961     .cntmsk = 0xff,
1962     .modmsk = INTEL_V4_ATTRS,
1963     .equiv = "CPU_CLK_THREAD_UNHALTED",
1964   },
1965   { .name = "CYCLE_ACTIVITY",
1966     .desc   = "Stalled cycles",
1967     .code = 0xa3,
1968     .cntmsk = 0xf,
1969     .ngrp = 1,
1970     .modmsk = INTEL_V4_ATTRS & ~_INTEL_X86_ATTR_C,
1971     .numasks = LIBPFM_ARRAY_SIZE(bdw_cycle_activity),
1972     .umasks  = bdw_cycle_activity
1973   },
1974   { .name = "DTLB_LOAD_MISSES",
1975     .desc   = "Data TLB load misses",
1976     .code = 0x8,
1977     .cntmsk = 0xff,
1978     .ngrp = 1,
1979     .modmsk = INTEL_V4_ATTRS,
1980     .numasks = LIBPFM_ARRAY_SIZE(bdw_dtlb_load_misses),
1981     .umasks  = bdw_dtlb_load_misses
1982   },
1983   { .name = "DTLB_STORE_MISSES",
1984     .desc = "Data TLB store misses",
1985     .code = 0x49,
1986     .cntmsk = 0xff,
1987     .ngrp = 1,
1988     .modmsk = INTEL_V4_ATTRS,
1989     .numasks = LIBPFM_ARRAY_SIZE(bdw_dtlb_load_misses),
1990     .umasks  = bdw_dtlb_load_misses /* shared */
1991   },
1992   { .name = "FP_ASSIST",
1993     .desc = "X87 floating-point assists",
1994     .code = 0xca,
1995     .cntmsk = 0xff,
1996     .ngrp = 1,
1997     .modmsk = INTEL_V4_ATTRS,
1998     .numasks = LIBPFM_ARRAY_SIZE(bdw_fp_assist),
1999     .umasks  = bdw_fp_assist
2000   },
2001   { .name = "HLE_RETIRED",
2002     .desc = "HLE execution (Precise Event)",
2003     .code = 0xc8,
2004     .cntmsk = 0xff,
2005     .ngrp = 1,
2006     .flags = INTEL_X86_PEBS,
2007     .modmsk = INTEL_V4_ATTRS,
2008     .numasks = LIBPFM_ARRAY_SIZE(bdw_hle_retired),
2009     .umasks  = bdw_hle_retired
2010   },
2011   { .name = "ICACHE",
2012     .desc = "Instruction Cache",
2013     .code = 0x80,
2014     .cntmsk = 0xff,
2015     .ngrp = 1,
2016     .modmsk = INTEL_V4_ATTRS,
2017     .numasks = LIBPFM_ARRAY_SIZE(bdw_icache),
2018     .umasks  = bdw_icache
2019   },
2020   { .name = "IDQ",
2021     .desc   = "IDQ operations",
2022     .code = 0x79,
2023     .cntmsk = 0xff,
2024     .ngrp = 1,
2025     .modmsk = INTEL_V4_ATTRS,
2026     .numasks = LIBPFM_ARRAY_SIZE(bdw_idq),
2027     .umasks  = bdw_idq
2028   },
2029   { .name = "IDQ_UOPS_NOT_DELIVERED",
2030     .desc   = "Uops not delivered",
2031     .code = 0x9c,
2032     .cntmsk = 0xf,
2033     .ngrp = 1,
2034     .modmsk = INTEL_V4_ATTRS,
2035     .numasks = LIBPFM_ARRAY_SIZE(bdw_idq_uops_not_delivered),
2036     .umasks  = bdw_idq_uops_not_delivered
2037   },
2038   { .name = "INST_RETIRED",
2039     .desc = "Number of instructions retired (Precise Event)",
2040     .code = 0xc0,
2041     .cntmsk = 0xff,
2042     .ngrp = 1,
2043     .flags = INTEL_X86_PEBS,
2044     .modmsk = INTEL_V4_ATTRS,
2045     .numasks = LIBPFM_ARRAY_SIZE(bdw_inst_retired),
2046     .umasks  = bdw_inst_retired
2047   },
2048   { .name = "INT_MISC",
2049     .desc = "Miscellaneous interruptions",
2050     .code = 0xd,
2051     .cntmsk = 0xff,
2052     .ngrp = 1,
2053     .modmsk = INTEL_V4_ATTRS,
2054     .numasks = LIBPFM_ARRAY_SIZE(bdw_int_misc),
2055     .umasks  = bdw_int_misc
2056   },
2057   { .name = "ITLB",
2058     .desc   = "Instruction TLB",
2059     .code = 0xae,
2060     .cntmsk = 0xff,
2061     .ngrp = 1,
2062     .modmsk = INTEL_V4_ATTRS,
2063     .numasks = LIBPFM_ARRAY_SIZE(bdw_itlb),
2064     .umasks  = bdw_itlb
2065   },
2066   { .name = "ITLB_MISSES",
2067     .desc = "Instruction TLB misses",
2068     .code = 0x85,
2069     .cntmsk = 0xff,
2070     .ngrp = 1,
2071     .modmsk = INTEL_V4_ATTRS,
2072     .numasks = LIBPFM_ARRAY_SIZE(bdw_itlb_misses),
2073     .umasks  = bdw_itlb_misses
2074   },
2075   { .name = "L1D",
2076     .desc   = "L1D cache",
2077     .code = 0x51,
2078     .cntmsk = 0xff,
2079     .ngrp = 1,
2080     .modmsk = INTEL_V4_ATTRS,
2081     .numasks = LIBPFM_ARRAY_SIZE(bdw_l1d),
2082     .umasks  = bdw_l1d
2083   },
2084   { .name = "L1D_PEND_MISS",
2085     .desc   = "L1D pending misses",
2086     .code = 0x48,
2087     .cntmsk = 0xff,
2088     .ngrp = 1,
2089     .modmsk = INTEL_V4_ATTRS,
2090     .numasks = LIBPFM_ARRAY_SIZE(bdw_l1d_pend_miss),
2091     .umasks  = bdw_l1d_pend_miss
2092   },
2093   { .name = "L2_DEMAND_RQSTS",
2094     .desc = "Demand Data Read requests to L2",
2095     .code = 0x27,
2096     .cntmsk = 0xff,
2097     .ngrp = 1,
2098     .modmsk = INTEL_V4_ATTRS,
2099     .numasks = LIBPFM_ARRAY_SIZE(bdw_l2_demand_rqsts),
2100     .umasks  = bdw_l2_demand_rqsts
2101   },
2102   { .name = "L2_LINES_IN",
2103     .desc   = "L2 lines allocated",
2104     .code = 0xf1,
2105     .cntmsk = 0xff,
2106     .ngrp = 1,
2107     .modmsk = INTEL_V4_ATTRS,
2108     .numasks = LIBPFM_ARRAY_SIZE(bdw_l2_lines_in),
2109     .umasks  = bdw_l2_lines_in
2110   },
2111   { .name = "L2_LINES_OUT",
2112     .desc   = "L2 lines evicted",
2113     .code = 0xf2,
2114     .cntmsk = 0xff,
2115     .ngrp = 1,
2116     .modmsk = INTEL_V4_ATTRS,
2117     .numasks = LIBPFM_ARRAY_SIZE(bdw_l2_lines_out),
2118     .umasks  = bdw_l2_lines_out
2119   },
2120   { .name = "L2_RQSTS",
2121     .desc   = "L2 requests",
2122     .code = 0x24,
2123     .cntmsk = 0xff,
2124     .ngrp = 1,
2125     .modmsk = INTEL_V4_ATTRS,
2126     .numasks = LIBPFM_ARRAY_SIZE(bdw_l2_rqsts),
2127     .umasks  = bdw_l2_rqsts
2128   },
2129   { .name = "L2_TRANS",
2130     .desc   = "L2 transactions",
2131     .code = 0xf0,
2132     .cntmsk = 0xff,
2133     .ngrp = 1,
2134     .modmsk = INTEL_V4_ATTRS,
2135     .numasks = LIBPFM_ARRAY_SIZE(bdw_l2_trans),
2136     .umasks  = bdw_l2_trans
2137   },
2138   { .name = "LD_BLOCKS",
2139     .desc   = "Blocking loads",
2140     .code = 0x3,
2141     .cntmsk = 0xff,
2142     .ngrp = 1,
2143     .modmsk = INTEL_V4_ATTRS,
2144     .numasks = LIBPFM_ARRAY_SIZE(bdw_ld_blocks),
2145     .umasks  = bdw_ld_blocks
2146   },
2147   { .name = "LD_BLOCKS_PARTIAL",
2148     .desc   = "Partial load blocks",
2149     .code = 0x7,
2150     .cntmsk = 0xff,
2151     .ngrp = 1,
2152     .modmsk = INTEL_V4_ATTRS,
2153     .numasks = LIBPFM_ARRAY_SIZE(bdw_ld_blocks_partial),
2154     .umasks  = bdw_ld_blocks_partial
2155   },
2156   { .name = "LOAD_HIT_PRE",
2157     .desc   = "Load dispatches",
2158     .code = 0x4c,
2159     .cntmsk = 0xff,
2160     .ngrp = 1,
2161     .modmsk = INTEL_V4_ATTRS,
2162     .numasks = LIBPFM_ARRAY_SIZE(bdw_load_hit_pre),
2163     .umasks  = bdw_load_hit_pre
2164   },
2165   { .name = "LOCK_CYCLES",
2166     .desc   = "Locked cycles in L1D and L2",
2167     .code = 0x63,
2168     .cntmsk = 0xff,
2169     .ngrp = 1,
2170     .modmsk = INTEL_V4_ATTRS,
2171     .numasks = LIBPFM_ARRAY_SIZE(bdw_lock_cycles),
2172     .umasks  = bdw_lock_cycles
2173   },
2174   { .name = "LONGEST_LAT_CACHE",
2175     .desc   = "L3 cache",
2176     .code = 0x2e,
2177     .cntmsk = 0xff,
2178     .ngrp = 1,
2179     .modmsk = INTEL_V4_ATTRS,
2180     .numasks = LIBPFM_ARRAY_SIZE(bdw_longest_lat_cache),
2181     .umasks  = bdw_longest_lat_cache
2182   },
2183   { .name = "MACHINE_CLEARS",
2184     .desc   = "Machine clear asserted",
2185     .code = 0xc3,
2186     .cntmsk = 0xff,
2187     .ngrp = 1,
2188     .modmsk = INTEL_V4_ATTRS,
2189     .numasks = LIBPFM_ARRAY_SIZE(bdw_machine_clears),
2190     .umasks  = bdw_machine_clears
2191   },
2192   { .name = "MEM_LOAD_UOPS_L3_HIT_RETIRED",
2193     .desc   = "L3 hit load uops retired (Precise Event)",
2194     .code = 0xd2,
2195     .cntmsk = 0xf,
2196     .ngrp = 1,
2197     .flags = INTEL_X86_PEBS,
2198     .modmsk = INTEL_V4_ATTRS,
2199     .numasks = LIBPFM_ARRAY_SIZE(bdw_mem_load_uops_l3_hit_retired),
2200     .umasks  = bdw_mem_load_uops_l3_hit_retired
2201   },
2202   { .name = "MEM_LOAD_UOPS_LLC_HIT_RETIRED",
2203     .desc   = "L3 hit load uops retired (Precise Event)",
2204     .equiv = "MEM_LOAD_UOPS_L3_HIT_RETIRED",
2205     .code = 0xd2,
2206     .cntmsk = 0xf,
2207     .ngrp = 1,
2208     .flags = INTEL_X86_PEBS,
2209     .modmsk = INTEL_V4_ATTRS,
2210     .numasks = LIBPFM_ARRAY_SIZE(bdw_mem_load_uops_l3_hit_retired),
2211     .umasks  = bdw_mem_load_uops_l3_hit_retired
2212   },
2213   { .name = "MEM_LOAD_UOPS_L3_MISS_RETIRED",
2214     .desc   = "Load uops retired that missed the L3 (Precise Event)",
2215     .code = 0xd3,
2216     .cntmsk = 0xf,
2217     .ngrp = 1,
2218     .flags = INTEL_X86_PEBS,
2219     .modmsk = INTEL_V4_ATTRS,
2220     .numasks = LIBPFM_ARRAY_SIZE(bdw_mem_load_uops_l3_miss_retired),
2221     .umasks  = bdw_mem_load_uops_l3_miss_retired
2222   },
2223   { .name = "MEM_LOAD_UOPS_LLC_MISS_RETIRED",
2224     .desc   = "Load uops retired that missed the L3 (Precise Event)",
2225     .equiv = "MEM_LOAD_UOPS_L3_MISS_RETIRED",
2226     .code = 0xd3,
2227     .cntmsk = 0xf,
2228     .ngrp = 1,
2229     .flags = INTEL_X86_PEBS,
2230     .modmsk = INTEL_V4_ATTRS,
2231     .numasks = LIBPFM_ARRAY_SIZE(bdw_mem_load_uops_l3_miss_retired),
2232     .umasks  = bdw_mem_load_uops_l3_miss_retired
2233   },
2234   { .name = "MEM_LOAD_UOPS_RETIRED",
2235     .desc = "Retired load uops (Precise Event)",
2236     .code = 0xd1,
2237     .cntmsk = 0xf,
2238     .ngrp = 1,
2239     .flags = INTEL_X86_PEBS,
2240     .modmsk = INTEL_V4_ATTRS,
2241     .numasks = LIBPFM_ARRAY_SIZE(bdw_mem_load_uops_retired),
2242     .umasks  = bdw_mem_load_uops_retired
2243   },
2244   { .name = "MEM_TRANS_RETIRED",
2245     .desc   = "Memory transactions retired (Precise Event)",
2246     .code = 0xcd,
2247     .cntmsk = 0x8,
2248     .ngrp = 1,
2249     .flags = INTEL_X86_PEBS,
2250     .modmsk = INTEL_V4_ATTRS | _INTEL_X86_ATTR_LDLAT,
2251     .numasks = LIBPFM_ARRAY_SIZE(bdw_mem_trans_retired),
2252     .umasks  = bdw_mem_trans_retired
2253   },
2254   { .name = "MEM_UOPS_RETIRED",
2255     .desc = "Memory uops retired (Precise Event)",
2256     .code = 0xd0,
2257     .cntmsk = 0xf,
2258     .ngrp = 1,
2259     .flags = INTEL_X86_PEBS,
2260     .modmsk = INTEL_V4_ATTRS,
2261     .numasks = LIBPFM_ARRAY_SIZE(bdw_mem_uops_retired),
2262     .umasks  = bdw_mem_uops_retired
2263   },
2264   { .name = "MISALIGN_MEM_REF",
2265     .desc = "Misaligned memory references",
2266     .code = 0x5,
2267     .cntmsk = 0xff,
2268     .ngrp = 1,
2269     .modmsk = INTEL_V4_ATTRS,
2270     .numasks = LIBPFM_ARRAY_SIZE(bdw_misalign_mem_ref),
2271     .umasks  = bdw_misalign_mem_ref
2272   },
2273   { .name = "MOVE_ELIMINATION",
2274     .desc = "Move Elimination",
2275     .code = 0x58,
2276     .cntmsk = 0xff,
2277     .ngrp = 1,
2278     .modmsk = INTEL_V4_ATTRS,
2279     .numasks = LIBPFM_ARRAY_SIZE(bdw_move_elimination),
2280     .umasks  = bdw_move_elimination
2281   },
2282   { .name = "OFFCORE_REQUESTS",
2283     .desc = "Demand Data Read requests sent to uncore",
2284     .code = 0xb0,
2285     .cntmsk = 0xff,
2286     .ngrp = 1,
2287     .modmsk = INTEL_V4_ATTRS,
2288     .numasks = LIBPFM_ARRAY_SIZE(bdw_offcore_requests),
2289     .umasks  = bdw_offcore_requests
2290   },
2291   { .name = "OTHER_ASSISTS",
2292     .desc = "Software assist",
2293     .code = 0xc1,
2294     .cntmsk = 0xff,
2295     .ngrp = 1,
2296     .modmsk = INTEL_V4_ATTRS,
2297     .numasks = LIBPFM_ARRAY_SIZE(bdw_other_assists),
2298     .umasks  = bdw_other_assists
2299   },
2300   { .name = "RESOURCE_STALLS",
2301     .desc = "Cycles Allocation is stalled due to Resource Related reason",
2302     .code = 0xa2,
2303     .cntmsk = 0xff,
2304     .ngrp = 1,
2305     .modmsk = INTEL_V4_ATTRS,
2306     .numasks = LIBPFM_ARRAY_SIZE(bdw_resource_stalls),
2307     .umasks  = bdw_resource_stalls
2308   },
2309   { .name = "ROB_MISC_EVENTS",
2310     .desc = "ROB miscellaneous events",
2311     .code = 0xcc,
2312     .cntmsk = 0xff,
2313     .ngrp = 1,
2314     .modmsk = INTEL_V4_ATTRS,
2315     .numasks = LIBPFM_ARRAY_SIZE(bdw_rob_misc_events),
2316     .umasks  = bdw_rob_misc_events
2317   },
2318   { .name = "RS_EVENTS",
2319     .desc = "Reservation Station",
2320     .code = 0x5e,
2321     .cntmsk = 0xf,
2322     .ngrp = 1,
2323     .modmsk = INTEL_V4_ATTRS,
2324     .numasks = LIBPFM_ARRAY_SIZE(bdw_rs_events),
2325     .umasks  = bdw_rs_events
2326   },
2327   { .name = "RTM_RETIRED",
2328     .desc = "Restricted Transaction Memory execution (Precise Event)",
2329     .code = 0xc9,
2330     .cntmsk = 0xf,
2331     .ngrp = 1,
2332     .flags = INTEL_X86_PEBS,
2333     .modmsk = INTEL_V4_ATTRS,
2334     .numasks = LIBPFM_ARRAY_SIZE(bdw_rtm_retired),
2335     .umasks  = bdw_rtm_retired
2336   },
2337   { .name = "TLB_FLUSH",
2338     .desc   = "TLB flushes",
2339     .code = 0xbd,
2340     .cntmsk = 0xff,
2341     .ngrp = 1,
2342     .modmsk = INTEL_V4_ATTRS,
2343     .numasks = LIBPFM_ARRAY_SIZE(bdw_tlb_flush),
2344     .umasks  = bdw_tlb_flush
2345   },
2346   { .name = "UOPS_EXECUTED",
2347     .desc   = "Uops executed",
2348     .code = 0xb1,
2349     .cntmsk = 0xff,
2350     .ngrp = 1,
2351     .modmsk = INTEL_V4_ATTRS,
2352     .numasks = LIBPFM_ARRAY_SIZE(bdw_uops_executed),
2353     .umasks  = bdw_uops_executed
2354   },
2355   { .name = "LSD",
2356     .desc   = "Loop stream detector",
2357     .code = 0xa8,
2358     .cntmsk = 0xff,
2359     .ngrp = 1,
2360     .modmsk = INTEL_V4_ATTRS,
2361     .numasks = LIBPFM_ARRAY_SIZE(bdw_lsd),
2362     .umasks  = bdw_lsd,
2363   },
2364
2365   { .name = "UOPS_EXECUTED_PORT",
2366     .desc   = "Uops dispatch to specific ports",
2367     .code = 0xa1,
2368     .cntmsk = 0xff,
2369     .ngrp = 1,
2370     .modmsk = INTEL_V4_ATTRS,
2371     .numasks = LIBPFM_ARRAY_SIZE(bdw_uops_executed_port),
2372     .umasks  = bdw_uops_executed_port
2373   },
2374   { .name = "UOPS_ISSUED",
2375     .desc   = "Uops issued",
2376     .code = 0xe,
2377     .cntmsk = 0xff,
2378     .ngrp = 1,
2379     .modmsk = INTEL_V4_ATTRS,
2380     .numasks = LIBPFM_ARRAY_SIZE(bdw_uops_issued),
2381     .umasks  = bdw_uops_issued
2382   },
2383   { .name = "ARITH",
2384     .desc   = "Arithmetic uop",
2385     .code = 0x14,
2386     .cntmsk = 0xff,
2387     .ngrp = 1,
2388     .modmsk = INTEL_V4_ATTRS,
2389     .numasks = LIBPFM_ARRAY_SIZE(bdw_arith),
2390     .umasks  = bdw_arith
2391   },
2392   { .name = "UOPS_RETIRED",
2393     .desc = "Uops retired (Precise Event)",
2394     .code = 0xc2,
2395     .cntmsk = 0xff,
2396     .ngrp = 1,
2397     .flags = INTEL_X86_PEBS,
2398     .modmsk = INTEL_V4_ATTRS,
2399     .numasks = LIBPFM_ARRAY_SIZE(bdw_uops_retired),
2400     .umasks  = bdw_uops_retired
2401   },
2402   { .name = "TX_MEM",
2403     .desc = "Transactional memory aborts",
2404     .code = 0x54,
2405     .cntmsk = 0xff,
2406     .ngrp = 1,
2407     .modmsk = INTEL_V4_ATTRS,
2408     .numasks = LIBPFM_ARRAY_SIZE(bdw_tx_mem),
2409     .umasks  = bdw_tx_mem,
2410   },
2411   { .name = "TX_EXEC",
2412     .desc = "Transactional execution",
2413     .code = 0x5d,
2414     .cntmsk = 0xff,
2415     .ngrp = 1,
2416     .modmsk = INTEL_V4_ATTRS,
2417     .numasks = LIBPFM_ARRAY_SIZE(bdw_tx_exec),
2418     .umasks  = bdw_tx_exec
2419   },
2420   { .name   = "OFFCORE_REQUESTS_OUTSTANDING",
2421     .desc   = "Outstanding offcore requests",
2422     .modmsk = INTEL_V4_ATTRS,
2423     .cntmsk = 0xff,
2424     .code = 0x60,
2425     .numasks = LIBPFM_ARRAY_SIZE(bdw_offcore_requests_outstanding),
2426     .ngrp = 1,
2427     .umasks = bdw_offcore_requests_outstanding,
2428   },
2429   { .name   = "ILD_STALL",
2430     .desc   = "Instruction Length Decoder stalls",
2431     .modmsk = INTEL_V4_ATTRS,
2432     .cntmsk = 0xff,
2433     .code = 0x87,
2434     .numasks = LIBPFM_ARRAY_SIZE(bdw_ild_stall),
2435     .ngrp = 1,
2436     .umasks = bdw_ild_stall,
2437   },
2438   { .name   = "PAGE_WALKER_LOADS",
2439     .desc   = "Page walker loads",
2440     .modmsk = INTEL_V4_ATTRS,
2441     .cntmsk = 0xf,
2442     .code = 0xbc,
2443     .numasks = LIBPFM_ARRAY_SIZE(bdw_page_walker_loads),
2444     .ngrp = 1,
2445     .umasks = bdw_page_walker_loads,
2446   },
2447   { .name   = "DSB2MITE_SWITCHES",
2448     .desc   = "Number of DSB to MITE switches",
2449     .modmsk = INTEL_V4_ATTRS,
2450     .cntmsk = 0xff,
2451     .code = 0xab,
2452     .numasks = LIBPFM_ARRAY_SIZE(bdw_dsb2mite_switches),
2453     .ngrp = 1,
2454     .umasks = bdw_dsb2mite_switches,
2455   },
2456   { .name   = "EPT",
2457     .desc   = "Extended page table",
2458     .modmsk = INTEL_V4_ATTRS,
2459     .cntmsk = 0xff,
2460     .code = 0x4f,
2461     .numasks = LIBPFM_ARRAY_SIZE(bdw_ept),
2462     .ngrp = 1,
2463     .umasks = bdw_ept,
2464   },
2465   { .name   = "OFFCORE_RESPONSE_0",
2466     .desc   = "Offcore response event (must provide at least one request type and either any_response or any combination of supplier + snoop)",
2467     .modmsk = INTEL_V4_ATTRS,
2468     .cntmsk = 0xf,
2469     .code = 0x1b7,
2470     .flags= INTEL_X86_NHM_OFFCORE,
2471     .numasks = LIBPFM_ARRAY_SIZE(bdw_offcore_response),
2472     .ngrp = 3,
2473     .umasks = bdw_offcore_response,
2474   },
2475   { .name   = "OFFCORE_RESPONSE_1",
2476     .desc   = "Offcore response event (must provide at least one request type and either any_response or any combination of supplier + snoop)",
2477     .modmsk = INTEL_V4_ATTRS,
2478     .cntmsk = 0xf,
2479     .code = 0x1bb,
2480     .flags= INTEL_X86_NHM_OFFCORE,
2481     .numasks =  LIBPFM_ARRAY_SIZE(bdw_offcore_response),
2482     .ngrp = 3,
2483     .umasks = bdw_offcore_response, /* identical to actual umasks list for this event */
2484   },
2485 };