vmm: Move the vmcall overrides to the VM struct
[akaros.git] / user / perfmon / events / intel_hsw_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: hsw (Intel Haswell)
25  */
26
27 static const intel_x86_umask_t hsw_baclears[]={
28    { .uname  = "ANY",
29      .udesc  = "Counts the number of times the front end is re-steered, mainly when the BPU cannot provide a correct prediction and this is corrected by other branch handling mechanisms at the front end",
30      .ucode = 0x1f00,
31      .uflags= INTEL_X86_NCOMBO | INTEL_X86_DFL,
32    },
33 };
34
35 static const intel_x86_umask_t hsw_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 hsw_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 hsw_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 hsw_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 hsw_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 hsw_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 hsw_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  = "STALLS_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  = "STALLS_LDM_PENDING",
326      .udesc  = "Execution stalls due to memory subsystem",
327      .ucode  = 0x0600 | (0x6 << INTEL_X86_CMASK_BIT),
328      .ucntmsk= 0xf,
329      .uflags = INTEL_X86_NCOMBO,
330    },
331    { .uname  = "CYCLES_NO_EXECUTE",
332      .udesc  = "Cycles during which no instructions were executed in the execution stage of the pipeline",
333      .ucode  = 0x0400 | (0x4 << INTEL_X86_CMASK_BIT),
334      .ucntmsk= 0xf,
335      .uflags = INTEL_X86_NCOMBO,
336    },
337 };
338
339 static const intel_x86_umask_t hsw_dtlb_load_misses[]={
340   { .uname = "MISS_CAUSES_A_WALK",
341     .udesc  = "Misses in all DTLB levels that cause page walks",
342     .ucode  = 0x100,
343     .uflags = INTEL_X86_NCOMBO,
344   },
345   { .uname = "WALK_COMPLETED_4K",
346     .udesc  = "Misses in all TLB levels causes a page walk that completes (4K)",
347     .ucode  = 0x200,
348     .uflags = INTEL_X86_NCOMBO,
349   },
350   { .uname = "WALK_COMPLETED_2M_4M",
351     .udesc  = "Misses in all TLB levels causes a page walk that completes (2M/4M)",
352     .ucode  = 0x400,
353     .uflags = INTEL_X86_NCOMBO,
354   },
355   { .uname = "WALK_COMPLETED",
356     .udesc  = "Misses in all TLB levels causes a page walk of any page size that completes",
357     .ucode  = 0xe00,
358     .uflags = INTEL_X86_NCOMBO,
359   },
360   { .uname = "WALK_DURATION",
361     .udesc  = "Cycles when PMH is busy with page walks",
362     .ucode  = 0x1000,
363     .uflags = INTEL_X86_NCOMBO,
364   },
365   { .uname = "STLB_HIT_4K",
366     .udesc  = "Misses that miss the DTLB and hit the STLB (4K)",
367     .ucode  = 0x2000,
368     .uflags = INTEL_X86_NCOMBO,
369   },
370   { .uname = "STLB_HIT_2M",
371     .udesc  = "Misses that miss the DTLB and hit the STLB (2M)",
372     .ucode  = 0x4000,
373     .uflags = INTEL_X86_NCOMBO,
374   },
375   { .uname = "STLB_HIT",
376     .udesc  = "Number of cache load STLB hits. No page walk",
377     .ucode  = 0x6000,
378     .uflags = INTEL_X86_NCOMBO,
379   },
380   { .uname = "PDE_CACHE_MISS",
381     .udesc  = "DTLB misses with low part of linear-to-physical address translation missed",
382     .ucode  = 0x8000,
383     .uflags = INTEL_X86_NCOMBO,
384   },
385 };
386
387 static const intel_x86_umask_t hsw_itlb_misses[]={
388   { .uname = "MISS_CAUSES_A_WALK",
389     .udesc  = "Misses in all DTLB levels that cause page walks",
390     .ucode  = 0x100,
391     .uflags = INTEL_X86_NCOMBO,
392   },
393   { .uname = "WALK_COMPLETED_4K",
394     .udesc  = "Misses in all TLB levels causes a page walk that completes (4K)",
395     .ucode  = 0x200,
396     .uflags = INTEL_X86_NCOMBO,
397   },
398   { .uname = "WALK_COMPLETED_2M_4M",
399     .udesc  = "Misses in all TLB levels causes a page walk that completes (2M/4M)",
400     .ucode  = 0x400,
401     .uflags = INTEL_X86_NCOMBO,
402   },
403   { .uname = "WALK_COMPLETED",
404     .udesc  = "Misses in all TLB levels causes a page walk of any page size that completes",
405     .ucode  = 0xe00,
406     .uflags = INTEL_X86_NCOMBO,
407   },
408   { .uname = "WALK_DURATION",
409     .udesc  = "Cycles when PMH is busy with page walks",
410     .ucode  = 0x1000,
411     .uflags = INTEL_X86_NCOMBO,
412   },
413   { .uname = "STLB_HIT_4K",
414     .udesc  = "Misses that miss the DTLB and hit the STLB (4K)",
415     .ucode  = 0x2000,
416     .uflags = INTEL_X86_NCOMBO,
417   },
418   { .uname = "STLB_HIT_2M",
419     .udesc  = "Misses that miss the DTLB and hit the STLB (2M)",
420     .ucode  = 0x4000,
421     .uflags = INTEL_X86_NCOMBO,
422   },
423   { .uname = "STLB_HIT",
424     .udesc  = "Number of cache load STLB hits. No page walk",
425     .ucode  = 0x6000,
426     .uflags = INTEL_X86_NCOMBO,
427   },
428 };
429
430 static const intel_x86_umask_t hsw_fp_assist[]={
431   { .uname = "X87_OUTPUT",
432     .udesc  = "Number of X87 FP assists due to output values",
433     .ucode  = 0x200,
434     .uflags = INTEL_X86_NCOMBO,
435   },
436   { .uname = "X87_INPUT",
437     .udesc  = "Number of X87 FP assists due to input values",
438     .ucode  = 0x400,
439     .uflags = INTEL_X86_NCOMBO,
440   },
441   { .uname = "SIMD_OUTPUT",
442     .udesc  = "Number of SIMD FP assists due to output values",
443     .ucode  = 0x800,
444     .uflags = INTEL_X86_NCOMBO,
445   },
446   { .uname = "SIMD_INPUT",
447     .udesc  = "Number of SIMD FP assists due to input values",
448     .ucode  = 0x1000,
449     .uflags = INTEL_X86_NCOMBO,
450   },
451   { .uname = "ANY",
452     .udesc  = "Cycles with any input/output SEE or FP assists",
453     .ucode  = 0x1e00 | (1 << INTEL_X86_CMASK_BIT), /* cnt=1 */
454     .uflags = INTEL_X86_NCOMBO,
455     .modhw  = _INTEL_X86_ATTR_C,
456   },
457   { .uname = "ALL",
458     .udesc  = "Cycles with any input and output SSE or FP assist",
459     .ucode  = 0x1e00 | (1 << INTEL_X86_CMASK_BIT), /* cnt=1 */
460     .uequiv = "ANY",
461     .uflags = INTEL_X86_NCOMBO,
462     .modhw  = _INTEL_X86_ATTR_C,
463   },
464 };
465
466 static const intel_x86_umask_t hsw_icache[]={
467   { .uname = "MISSES",
468     .udesc  = "Number of Instruction Cache, Streaming Buffer and Victim Cache Misses. Includes Uncacheable accesses",
469     .ucode  = 0x200,
470     .uflags = INTEL_X86_DFL,
471   },
472 };
473
474 static const intel_x86_umask_t hsw_idq[]={
475   { .uname = "EMPTY",
476     .udesc  = "Cycles the Instruction Decode Queue (IDQ) is empty",
477     .ucode  = 0x200,
478     .ucntmsk= 0xf,
479     .uflags = INTEL_X86_NCOMBO,
480   },
481   { .uname = "MITE_UOPS",
482     .udesc  = "Number of uops delivered to Instruction Decode Queue (IDQ) from MITE path",
483     .ucode  = 0x400,
484     .uflags = INTEL_X86_NCOMBO,
485   },
486   { .uname = "DSB_UOPS",
487     .udesc  = "Number of uops delivered to Instruction Decode Queue (IDQ) from Decode Stream Buffer (DSB) path",
488     .ucode  = 0x800,
489     .uflags = INTEL_X86_NCOMBO,
490   },
491   { .uname = "MS_DSB_UOPS",
492     .udesc  = "Uops initiated by Decode Stream Buffer (DSB) that are being delivered to Instruction Decode Queue (IDQ) while Microcode Sequencer (MS) is busy",
493     .ucode  = 0x1000,
494     .uflags = INTEL_X86_NCOMBO,
495   },
496   { .uname = "MS_MITE_UOPS",
497     .udesc  = "Uops initiated by MITE and delivered to Instruction Decode Queue (IDQ) while Microcode Sequencer (MS) is busy",
498     .ucode  = 0x2000,
499     .uflags = INTEL_X86_NCOMBO,
500   },
501   { .uname = "MS_UOPS",
502     .udesc  = "Number of Uops were delivered into Instruction Decode Queue (IDQ) from MS, initiated by Decode Stream Buffer (DSB) or MITE",
503     .ucode  = 0x3000,
504     .uflags = INTEL_X86_NCOMBO,
505   },
506   { .uname = "MS_UOPS_CYCLES",
507     .udesc  = "Number of cycles that Uops were delivered into Instruction Decode Queue (IDQ) when MS_Busy, initiated by Decode Stream Buffer (DSB) or MITE",
508     .ucode  = 0x3000 | (1 << INTEL_X86_CMASK_BIT), /* cnt=1 */
509     .uequiv = "MS_UOPS:c=1",
510     .uflags = INTEL_X86_NCOMBO,
511     .modhw  = _INTEL_X86_ATTR_C,
512   },
513   { .uname = "MITE_UOPS_CYCLES",
514     .udesc  = "Cycles when uops are being delivered to Instruction Decode Queue (IDQ) from MITE path",
515     .ucode  = 0x400 | (1 << INTEL_X86_CMASK_BIT), /* cnt=1 */
516     .uequiv = "MITE_UOPS:c=1",
517     .uflags = INTEL_X86_NCOMBO,
518     .modhw  = _INTEL_X86_ATTR_C,
519   },
520   { .uname = "DSB_UOPS_CYCLES",
521     .udesc  = "Cycles when uops are being delivered to Instruction Decode Queue (IDQ) from Decode Stream Buffer (DSB) path",
522     .ucode  = 0x800 | (1 << INTEL_X86_CMASK_BIT), /* cnt=1 */
523     .uequiv = "DSB_UOPS:c=1",
524     .uflags = INTEL_X86_NCOMBO,
525     .modhw  = _INTEL_X86_ATTR_C,
526   },
527   { .uname = "MS_DSB_UOPS_CYCLES",
528     .udesc  = "Cycles when uops initiated by Decode Stream Buffer (DSB) are being delivered to Instruction Decode Queue (IDQ) while Microcode Sequencer (MS) is busy",
529     .ucode  = 0x1000 | (1 << INTEL_X86_CMASK_BIT), /* cnt=1 */
530     .uequiv = "MS_DSB_UOPS:c=1",
531     .uflags = INTEL_X86_NCOMBO,
532     .modhw  = _INTEL_X86_ATTR_C,
533   },
534   { .uname = "MS_DSB_OCCUR",
535     .udesc  = "Deliveries to Instruction Decode Queue (IDQ) initiated by Decode Stream Buffer (DSB) while Microcode Sequencer (MS) is busy",
536     .ucode  = 0x1000 | INTEL_X86_MOD_EDGE | (1 << INTEL_X86_CMASK_BIT), /* edge=1 cnt=1 */
537     .uequiv = "MS_DSB_UOPS:c=1:e=1",
538     .uflags = INTEL_X86_NCOMBO,
539     .modhw  = _INTEL_X86_ATTR_E | _INTEL_X86_ATTR_C,
540   },
541   { .uname = "ALL_DSB_CYCLES_4_UOPS",
542     .udesc  = "Cycles Decode Stream Buffer (DSB) is delivering 4 Uops",
543     .ucode  = 0x1800 | (4 << INTEL_X86_CMASK_BIT), /* cnt=4 */
544     .uflags = INTEL_X86_NCOMBO,
545     .modhw  = _INTEL_X86_ATTR_C,
546   },
547   { .uname = "ALL_DSB_CYCLES_ANY_UOPS",
548     .udesc  = "Cycles Decode Stream Buffer (DSB) is delivering any Uop",
549     .ucode  = 0x1800 | (1 << INTEL_X86_CMASK_BIT), /* cnt=1 */
550     .uflags = INTEL_X86_NCOMBO,
551     .modhw  = _INTEL_X86_ATTR_C,
552   },
553   { .uname = "ALL_MITE_CYCLES_4_UOPS",
554     .udesc  = "Cycles MITE is delivering 4 Uops",
555     .ucode  = 0x2400 | (4 << INTEL_X86_CMASK_BIT), /* cnt=4 */
556     .uflags = INTEL_X86_NCOMBO,
557     .modhw  = _INTEL_X86_ATTR_C,
558   },
559   { .uname = "ALL_MITE_CYCLES_ANY_UOPS",
560     .udesc  = "Cycles MITE is delivering any Uop",
561     .ucode  = 0x2400 | (1 << INTEL_X86_CMASK_BIT), /* cnt=1 */
562     .uflags = INTEL_X86_NCOMBO,
563     .modhw  = _INTEL_X86_ATTR_C,
564   },
565   { .uname = "ALL_MITE_UOPS",
566     .udesc  = "Number of uops delivered to Instruction Decode Queue (IDQ) from any path",
567     .ucode  = 0x3c00,
568     .uflags = INTEL_X86_NCOMBO,
569   },
570 };
571
572 static const intel_x86_umask_t hsw_idq_uops_not_delivered[]={
573   { .uname = "CORE",
574     .udesc  = "Count number of non-delivered uops to Resource Allocation Table (RAT)",
575     .ucode  = 0x100,
576     .uflags = INTEL_X86_DFL,
577   },
578 };
579
580 static const intel_x86_umask_t hsw_inst_retired[]={
581   { .uname = "ANY_P",
582     .udesc  = "Number of instructions retired. General Counter - architectural event",
583     .ucode  = 0x000,
584     .uflags = INTEL_X86_NCOMBO | INTEL_X86_DFL,
585   },
586   { .uname = "ALL",
587     .udesc  = "Precise instruction retired event with HW to reduce effect of PEBS shadow in IP distribution (Precise Event)",
588     .ucode  = 0x100,
589     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS,
590   },
591   { .uname = "TOTAL_CYCLES",
592     .udesc  = "Number of cycles using always true condition",
593     .ucode  = 0x100 | INTEL_X86_MOD_INV | (10 << INTEL_X86_CMASK_BIT), /* inv=1 cnt=10 */
594     .uequiv = "ALL:i=1:c=10",
595     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS,
596     .modhw  = _INTEL_X86_ATTR_I | _INTEL_X86_ATTR_C,
597   },
598   { .uname = "PREC_DIST",
599     .udesc  = "Precise instruction retired event with HW to reduce effect of PEBS shadow in IP distribution",
600     .ucode  = 0x100,
601     .uequiv = "ALL",
602     .ucntmsk= 0x2,
603     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS,
604   },
605 };
606
607 static const intel_x86_umask_t hsw_int_misc[]={
608   { .uname = "RECOVERY_CYCLES",
609     .udesc  = "Number of cycles waiting for Machine Clears  except JEClear",
610     .ucode  = 0x300,
611     .uflags = INTEL_X86_NCOMBO,
612   },
613   { .uname = "RECOVERY_STALLS_COUNT",
614     .udesc  = "Number of occurrences waiting for Machine Clears",
615     .ucode  = 0x300 | INTEL_X86_MOD_EDGE | (1 << INTEL_X86_CMASK_BIT), /* edge=1 cnt=1 */
616     .uflags = INTEL_X86_NCOMBO,
617     .modhw  = _INTEL_X86_ATTR_E | _INTEL_X86_ATTR_C,
618   },
619 };
620
621 static const intel_x86_umask_t hsw_itlb[]={
622   { .uname = "ITLB_FLUSH",
623     .udesc  = "Flushing of the Instruction TLB (ITLB) pages independent of page size",
624     .ucode  = 0x100,
625     .uflags = INTEL_X86_NCOMBO | INTEL_X86_DFL,
626   },
627 };
628
629 static const intel_x86_umask_t hsw_l1d[]={
630   { .uname = "REPLACEMENT",
631     .udesc  = "L1D Data line replacements",
632     .ucode  = 0x100,
633     .uflags = INTEL_X86_DFL,
634   },
635 };
636
637 static const intel_x86_umask_t hsw_l1d_pend_miss[]={
638   { .uname = "PENDING",
639     .udesc  = "Cycles with L1D load misses outstanding",
640     .ucode  = 0x100,
641     .ucntmsk = 0x4,
642     .uflags = INTEL_X86_DFL,
643   },
644   { .uname = "PENDING_CYCLES",
645     .udesc  = "Cycles with L1D load misses outstanding",
646     .ucode  = 0x100 | (1 << INTEL_X86_CMASK_BIT), /* cnt=1 */
647     .uequiv = "PENDING:c=1",
648     .ucntmsk = 0x4,
649     .uflags = INTEL_X86_NCOMBO,
650     .modhw  = _INTEL_X86_ATTR_C,
651   },
652   { .uname = "OCCURRENCES",
653     .udesc  = "Number L1D miss outstanding",
654     .ucode  = 0x100 | INTEL_X86_MOD_EDGE | (1 << INTEL_X86_CMASK_BIT), /* edge=1 cnt=1 */
655     .uequiv = "PENDING:c=1:e=1",
656     .ucntmsk = 0x4,
657     .uflags = INTEL_X86_NCOMBO,
658     .modhw  = _INTEL_X86_ATTR_E | _INTEL_X86_ATTR_C,
659   },
660   { .uname = "EDGE",
661     .udesc  = "Number L1D miss outstanding",
662     .ucode  = 0x100 | INTEL_X86_MOD_EDGE | (1 << INTEL_X86_CMASK_BIT), /* edge=1 cnt=1 */
663     .uequiv = "PENDING:c=1:e=1",
664     .ucntmsk = 0x4,
665     .uflags = INTEL_X86_NCOMBO,
666     .modhw  = _INTEL_X86_ATTR_E | _INTEL_X86_ATTR_C,
667   },
668 };
669
670 static const intel_x86_umask_t hsw_l2_demand_rqsts[]={
671   { .uname = "WB_HIT",
672     .udesc  = "WB requests that hit L2 cache",
673     .ucode  = 0x5000,
674     .uflags = INTEL_X86_DFL,
675   },
676 };
677
678 static const intel_x86_umask_t hsw_l2_lines_in[]={
679   { .uname = "I",
680     .udesc  = "L2 cache lines in I state filling L2",
681     .ucode  = 0x100,
682     .uflags = INTEL_X86_NCOMBO,
683   },
684   { .uname = "S",
685     .udesc  = "L2 cache lines in S state filling L2",
686     .ucode  = 0x200,
687     .uflags = INTEL_X86_NCOMBO,
688   },
689   { .uname = "E",
690     .udesc  = "L2 cache lines in E state filling L2",
691     .ucode  = 0x400,
692     .uflags = INTEL_X86_NCOMBO,
693   },
694   { .uname = "ALL",
695     .udesc  = "L2 cache lines filling L2",
696     .ucode  = 0x700,
697     .uflags = INTEL_X86_NCOMBO | INTEL_X86_DFL,
698   },
699   { .uname = "ANY",
700     .udesc  = "L2 cache lines filling L2",
701     .uequiv = "ALL",
702     .ucode  = 0x700,
703     .uflags = INTEL_X86_NCOMBO,
704   },
705 };
706
707 static const intel_x86_umask_t hsw_l2_lines_out[]={
708   { .uname = "DEMAND_CLEAN",
709     .udesc  = "Number of clean L2 cachelines evicted by demand",
710     .ucode  = 0x500,
711     .uflags = INTEL_X86_NCOMBO,
712   },
713   { .uname = "DEMAND_DIRTY",
714     .udesc  = "Number of dirty L2 cachelines evicted by demand",
715     .ucode  = 0x600,
716     .uflags = INTEL_X86_NCOMBO,
717   },
718 };
719
720 static const intel_x86_umask_t hsw_l2_rqsts[]={
721   { .uname = "DEMAND_DATA_RD_MISS",
722     .udesc  = "Demand Data Read requests that miss L2 cache",
723     .ucode  = 0x2100,
724     .uflags = INTEL_X86_NCOMBO,
725   },
726   { .uname = "DEMAND_DATA_RD_HIT",
727     .udesc  = "Demand Data Read requests that hit L2 cache",
728     .ucode  = 0x4100,
729     .uflags = INTEL_X86_NCOMBO,
730   },
731   { .uname = "DEMAND_RFO_MISS",
732     .udesc  = "RFO requests that miss L2 cache",
733     .ucode  = 0x2200,
734     .uflags = INTEL_X86_NCOMBO,
735   },
736   { .uname = "RFO_MISS",
737     .udesc  = "RFO requests that miss L2 cache",
738     .ucode  = 0x2200,
739     .uequiv = "DEMAND_RFO_MISS",
740     .uflags = INTEL_X86_NCOMBO,
741   },
742   { .uname = "DEMAND_RFO_HIT",
743     .udesc  = "RFO requests that hit L2 cache",
744     .ucode  = 0x4200,
745     .uflags = INTEL_X86_NCOMBO,
746   },
747   { .uname = "RFO_HIT",
748     .udesc  = "RFO requests that hit L2 cache",
749     .ucode  = 0x4200,
750     .uequiv = "DEMAND_RFO_HIT",
751     .uflags = INTEL_X86_NCOMBO,
752   },
753   { .uname = "CODE_RD_MISS",
754     .udesc  = "L2 cache misses when fetching instructions",
755     .ucode  = 0x2400,
756     .uflags = INTEL_X86_NCOMBO,
757   },
758   { .uname = "ALL_DEMAND_MISS",
759     .udesc  = "All demand requests that miss the L2 cache",
760     .ucode  = 0x2700,
761     .uflags = INTEL_X86_NCOMBO,
762   },
763   { .uname = "CODE_RD_HIT",
764     .udesc  = "L2 cache hits when fetching instructions, code reads",
765     .ucode  = 0x4400,
766     .uflags = INTEL_X86_NCOMBO,
767   },
768   { .uname = "L2_PF_MISS",
769     .udesc  = "Requests from the L2 hardware prefetchers that miss L2 cache",
770     .ucode  = 0x3000,
771     .uflags = INTEL_X86_NCOMBO,
772   },
773   { .uname = "MISS",
774     .udesc  = "All requests that miss the L2 cache",
775     .ucode  = 0x3f00,
776     .uflags = INTEL_X86_NCOMBO,
777   },
778   { .uname = "L2_PF_HIT",
779     .udesc  = "Requests from the L2 hardware prefetchers that hit L2 cache",
780     .ucode  = 0x5000,
781     .uflags = INTEL_X86_NCOMBO,
782   },
783   { .uname = "ALL_DEMAND_DATA_RD",
784     .udesc  = "Any data read request to L2 cache",
785     .ucode  = 0xe100,
786     .uflags = INTEL_X86_NCOMBO,
787   },
788   { .uname = "ALL_RFO",
789     .udesc  = "Any data RFO request to L2 cache",
790     .ucode  = 0xe200,
791     .uflags = INTEL_X86_NCOMBO,
792   },
793   { .uname = "ALL_CODE_RD",
794     .udesc  = "Any code read request to L2 cache",
795     .ucode  = 0xe400,
796     .uflags = INTEL_X86_NCOMBO,
797   },
798   { .uname = "ALL_DEMAND_REFERENCES",
799     .udesc  = "All demand requests to L2 cache ",
800     .ucode  = 0xe700,
801     .uflags = INTEL_X86_NCOMBO,
802   },
803   { .uname = "ALL_PF",
804     .udesc  = "Any L2 HW prefetch request to L2 cache",
805     .ucode  = 0xf800,
806     .uflags = INTEL_X86_NCOMBO,
807   },
808   { .uname = "REFERENCES",
809     .udesc  = "All requests to L2 cache",
810     .ucode  = 0xff00,
811     .uflags = INTEL_X86_NCOMBO | INTEL_X86_DFL,
812   },
813 };
814
815 static const intel_x86_umask_t hsw_l2_trans[]={
816   { .uname = "DEMAND_DATA_RD",
817     .udesc  = "Demand Data Read requests that access L2 cache",
818     .ucode  = 0x100,
819     .uflags = INTEL_X86_NCOMBO,
820   },
821   { .uname = "RFO",
822     .udesc  = "RFO requests that access L2 cache",
823     .ucode  = 0x200,
824     .uflags = INTEL_X86_NCOMBO,
825   },
826   { .uname = "CODE_RD",
827     .udesc  = "L2 cache accesses when fetching instructions",
828     .ucode  = 0x400,
829     .uflags = INTEL_X86_NCOMBO,
830   },
831   { .uname = "ALL_PF",
832     .udesc  = "L2 or L3 HW prefetches that access L2 cache, including rejects",
833     .ucode  = 0x800,
834     .uflags = INTEL_X86_NCOMBO,
835   },
836   { .uname = "L1D_WB",
837     .udesc  = "L1D writebacks that access L2 cache",
838     .ucode  = 0x1000,
839     .uflags = INTEL_X86_NCOMBO,
840   },
841   { .uname = "L2_FILL",
842     .udesc  = "L2 fill requests that access L2 cache",
843     .ucode  = 0x2000,
844     .uflags = INTEL_X86_NCOMBO,
845   },
846   { .uname = "L2_WB",
847     .udesc  = "L2 writebacks that access L2 cache",
848     .ucode  = 0x4000,
849     .uflags = INTEL_X86_NCOMBO,
850   },
851   { .uname = "ALL_REQUESTS",
852     .udesc  = "Transactions accessing L2 pipe",
853     .ucode  = 0x8000,
854     .uflags = INTEL_X86_NCOMBO | INTEL_X86_DFL,
855   },
856 };
857
858 static const intel_x86_umask_t hsw_ld_blocks[]={
859   { .uname = "STORE_FORWARD",
860     .udesc  = "Counts the number of loads blocked by overlapping with store buffer entries that cannot be forwarded",
861     .ucode  = 0x200,
862     .uflags = INTEL_X86_NCOMBO,
863   },
864   { .uname = "NO_SR",
865     .udesc  = "number of times that split load operations are temporarily blocked because all resources for handling the split accesses are in use",
866     .ucode  = 0x800,
867     .uflags = INTEL_X86_NCOMBO,
868   },
869 };
870
871 static const intel_x86_umask_t hsw_ld_blocks_partial[]={
872   { .uname = "ADDRESS_ALIAS",
873     .udesc  = "False dependencies in MOB due to partial compare on address",
874     .ucode  = 0x100,
875     .uflags = INTEL_X86_DFL,
876   },
877 };
878
879 static const intel_x86_umask_t hsw_load_hit_pre[]={
880   { .uname = "SW_PF",
881     .udesc  = "Non software-prefetch load dispatches that hit FB allocated for software prefetch",
882     .ucode  = 0x100,
883     .uflags = INTEL_X86_NCOMBO,
884   },
885   { .uname = "HW_PF",
886     .udesc  = "Non software-prefetch load dispatches that hit FB allocated for hardware prefetch",
887     .ucode  = 0x200,
888     .uflags = INTEL_X86_NCOMBO,
889   },
890 };
891
892 static const intel_x86_umask_t hsw_lock_cycles[]={
893   { .uname = "SPLIT_LOCK_UC_LOCK_DURATION",
894     .udesc  = "Cycles in which the L1D and L2 are locked, due to a UC lock or split lock",
895     .ucode  = 0x100,
896     .uflags = INTEL_X86_NCOMBO,
897   },
898   { .uname = "CACHE_LOCK_DURATION",
899     .udesc  = "cycles that the L1D is locked",
900     .ucode  = 0x200,
901     .uflags = INTEL_X86_NCOMBO,
902   },
903 };
904
905 static const intel_x86_umask_t hsw_longest_lat_cache[]={
906   { .uname = "MISS",
907     .udesc  = "Core-originated cacheable demand requests missed LLC - architectural event",
908     .ucode  = 0x4100,
909     .uflags = INTEL_X86_NCOMBO,
910   },
911   { .uname = "REFERENCE",
912     .udesc  = "Core-originated cacheable demand requests that refer to LLC - architectural event",
913     .ucode  = 0x4f00,
914     .uflags = INTEL_X86_NCOMBO,
915   },
916 };
917
918 static const intel_x86_umask_t hsw_machine_clears[]={
919   { .uname = "CYCLES",
920     .udesc  = "Cycles there was a Nuke. Account for both thread-specific and All Thread Nukes",
921     .ucode  = 0x100,
922     .uflags = INTEL_X86_NCOMBO,
923   },
924   { .uname = "MEMORY_ORDERING",
925     .udesc  = "Number of Memory Ordering Machine Clears detected",
926     .ucode  = 0x200,
927     .uflags = INTEL_X86_NCOMBO,
928   },
929   { .uname = "SMC",
930     .udesc  = "Number of Self-modifying code (SMC) Machine Clears detected",
931     .ucode  = 0x400,
932     .uflags = INTEL_X86_NCOMBO,
933   },
934   { .uname = "MASKMOV",
935     .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",
936     .ucode  = 0x2000,
937     .uflags = INTEL_X86_NCOMBO,
938   },
939 };
940
941 static const intel_x86_umask_t hsw_mem_load_uops_l3_hit_retired[]={
942   { .uname = "XSNP_MISS",
943     .udesc  = "Retired load uops which data sources were L3 hit and cross-core snoop missed in on-pkg core cache",
944     .ucode  = 0x100,
945     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS,
946   },
947   { .uname = "XSNP_HIT",
948     .udesc  = "Retired load uops which data sources were L3 and cross-core snoop hits in on-pkg core cache",
949     .ucode  = 0x200,
950     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS,
951   },
952   { .uname = "XSNP_HITM",
953     .udesc  = "Load had HitM Response from a core on same socket (shared L3). (Non PEBS",
954     .ucode  = 0x400,
955     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS,
956   },
957   { .uname = "XSNP_NONE",
958     .udesc  = "Retired load uops which data sources were hits in L3 without snoops required",
959     .ucode  = 0x800,
960     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS,
961   },
962 };
963
964 static const intel_x86_umask_t hsw_mem_load_uops_l3_miss_retired[]={
965   { .uname = "LOCAL_DRAM",
966     .udesc  = "Retired load uops missing L3 cache but hitting local memory",
967     .ucode  = 0x100,
968     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS | INTEL_X86_DFL,
969   },
970    { .uname  = "REMOTE_DRAM",
971      .udesc  = "Number of retired load uops that missed L3 but were service by remote RAM, snoop not needed, snoop miss, snoop hit data not forwarded (Precise Event)",
972      .ucode = 0x400,
973      .umodel = PFM_PMU_INTEL_HSW_EP,
974      .uflags= INTEL_X86_NCOMBO | INTEL_X86_PEBS,
975    },
976    { .uname  = "REMOTE_HITM",
977      .udesc  = "Number of retired load uops whose data sources was remote HITM (Precise Event)",
978      .ucode = 0x1000,
979      .umodel = PFM_PMU_INTEL_HSW_EP,
980      .uflags= INTEL_X86_NCOMBO | INTEL_X86_PEBS,
981    },
982    { .uname  = "REMOTE_FWD",
983      .udesc  = "Load uops that miss in the L3 whose data source was forwarded from a remote cache (Precise Event)",
984      .ucode = 0x2000,
985      .umodel = PFM_PMU_INTEL_HSW_EP,
986      .uflags= INTEL_X86_NCOMBO | INTEL_X86_PEBS,
987    },
988 };
989
990 static const intel_x86_umask_t hsw_mem_load_uops_retired[]={
991   { .uname = "L1_HIT",
992     .udesc  = "Retired load uops with L1 cache hits as data source",
993     .ucode  = 0x100,
994     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS,
995   },
996   { .uname = "L2_HIT",
997     .udesc  = "Retired load uops with L2 cache hits as data source",
998     .ucode  = 0x200,
999     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS,
1000   },
1001   { .uname = "L3_HIT",
1002     .udesc  = "Retired load uops with L3 cache hits as data source",
1003     .ucode  = 0x400,
1004     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS,
1005   },
1006   { .uname = "L1_MISS",
1007     .udesc  = "Retired load uops which missed the L1D",
1008     .ucode  = 0x800,
1009     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS,
1010   },
1011   { .uname = "L2_MISS",
1012     .udesc  = "Retired load uops which missed the L2. Unknown data source excluded",
1013     .ucode  = 0x1000,
1014     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS,
1015   },
1016   { .uname = "L3_MISS",
1017     .udesc  = "Retired load uops which missed the L3",
1018     .ucode  = 0x2000,
1019     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS,
1020   },
1021   { .uname = "HIT_LFB",
1022     .udesc  = "Retired load uops which missed L1 but hit line fill buffer (LFB)",
1023     .ucode  = 0x4000,
1024     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS,
1025   },
1026 };
1027
1028 static const intel_x86_umask_t hsw_mem_trans_retired[]={
1029   { .uname  = "LOAD_LATENCY",
1030     .udesc  = "Memory load instructions retired above programmed clocks, minimum threshold value is 3 (Precise Event and ldlat required)",
1031     .ucode  = 0x100,
1032     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS | INTEL_X86_LDLAT | INTEL_X86_DFL,
1033   },
1034   { .uname  = "LATENCY_ABOVE_THRESHOLD",
1035     .udesc  = "Memory load instructions retired above programmed clocks, minimum threshold value is 3 (Precise Event and ldlat required)",
1036     .ucode  = 0x100,
1037     .uequiv = "LOAD_LATENCY",
1038     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS | INTEL_X86_LDLAT | INTEL_X86_NO_AUTOENCODE,
1039   },
1040 };
1041
1042 static const intel_x86_umask_t hsw_mem_uops_retired[]={
1043   { .uname = "STLB_MISS_LOADS",
1044     .udesc  = "Load uops with true STLB miss retired to architected path",
1045     .ucode  = 0x1100,
1046     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS,
1047   },
1048   { .uname = "STLB_MISS_STORES",
1049     .udesc  = "Store uops with true STLB miss retired to architected path",
1050     .ucode  = 0x1200,
1051     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS,
1052   },
1053   { .uname = "LOCK_LOADS",
1054     .udesc  = "Load uops with locked access retired",
1055     .ucode  = 0x2100,
1056     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS,
1057   },
1058   { .uname = "SPLIT_LOADS",
1059     .udesc  = "Line-splitted load uops retired",
1060     .ucode  = 0x4100,
1061     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS,
1062   },
1063   { .uname = "SPLIT_STORES",
1064     .udesc  = "Line-splitted store uops retired",
1065     .ucode  = 0x4200,
1066     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS,
1067   },
1068   { .uname = "ALL_LOADS",
1069     .udesc  = "All load uops retired",
1070     .ucode  = 0x8100,
1071     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS,
1072   },
1073   { .uname = "ALL_STORES",
1074     .udesc  = "All store uops retired",
1075     .ucode  = 0x8200,
1076     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS,
1077   },
1078 };
1079
1080 static const intel_x86_umask_t hsw_misalign_mem_ref[]={
1081   { .uname = "LOADS",
1082     .udesc  = "Speculative cache-line split load uops dispatched to the L1D",
1083     .ucode  = 0x100,
1084     .uflags = INTEL_X86_NCOMBO,
1085   },
1086   { .uname = "STORES",
1087     .udesc  = "Speculative cache-line split store-address uops dispatched to L1D",
1088     .ucode  = 0x200,
1089     .uflags = INTEL_X86_NCOMBO,
1090   },
1091 };
1092
1093 static const intel_x86_umask_t hsw_move_elimination[]={
1094   { .uname = "INT_ELIMINATED",
1095     .udesc  = "Number of integer Move Elimination candidate uops that were eliminated",
1096     .ucode  = 0x100,
1097     .uflags = INTEL_X86_NCOMBO,
1098   },
1099   { .uname = "SIMD_ELIMINATED",
1100     .udesc  = "Number of SIMD Move Elimination candidate uops that were eliminated",
1101     .ucode  = 0x200,
1102     .uflags = INTEL_X86_NCOMBO,
1103   },
1104   { .uname = "INT_NOT_ELIMINATED",
1105     .udesc  = "Number of integer Move Elimination candidate uops that were not eliminated",
1106     .ucode  = 0x400,
1107     .uflags = INTEL_X86_NCOMBO,
1108   },
1109   { .uname = "SIMD_NOT_ELIMINATED",
1110     .udesc  = "Number of SIMD Move Elimination candidate uops that were not eliminated",
1111     .ucode  = 0x800,
1112     .uflags = INTEL_X86_NCOMBO,
1113   },
1114 };
1115
1116 static const intel_x86_umask_t hsw_offcore_requests[]={
1117   { .uname  = "DEMAND_DATA_RD",
1118     .udesc  = "Demand data read requests sent to uncore (use with HT off only)",
1119     .ucode = 0x100,
1120     .uflags= INTEL_X86_NCOMBO,
1121   },
1122   { .uname = "DEMAND_CODE_RD",
1123     .udesc  = "Demand code read requests sent to uncore (use with HT off only)",
1124     .ucode  = 0x200,
1125     .uflags = INTEL_X86_NCOMBO,
1126   },
1127   { .uname = "DEMAND_RFO",
1128     .udesc  = "Demand RFOs requests sent to uncore (use with HT off only)",
1129     .ucode  = 0x400,
1130     .uflags = INTEL_X86_NCOMBO,
1131   },
1132   { .uname = "ALL_DATA_RD",
1133     .udesc  = "Data read requests sent to uncore (use with HT off only)",
1134     .ucode  = 0x800,
1135     .uflags = INTEL_X86_NCOMBO,
1136   },
1137 };
1138
1139 static const intel_x86_umask_t hsw_other_assists[]={
1140   { .uname = "AVX_TO_SSE",
1141     .udesc  = "Number of transitions from AVX-256 to legacy SSE when penalty applicable",
1142     .ucode  = 0x800,
1143     .uflags = INTEL_X86_NCOMBO,
1144   },
1145   { .uname = "SSE_TO_AVX",
1146     .udesc  = "Number of transitions from legacy SSE to AVX-256 when penalty applicable",
1147     .ucode  = 0x1000,
1148     .uflags = INTEL_X86_NCOMBO,
1149   },
1150   { .uname = "ANY_WB_ASSIST",
1151     .udesc  = "Number of times any microcode assist is invoked by HW upon uop writeback",
1152     .ucode  = 0x4000,
1153     .uflags = INTEL_X86_NCOMBO,
1154   },
1155 };
1156
1157 static const intel_x86_umask_t hsw_resource_stalls[]={
1158   { .uname = "ANY",
1159     .udesc  = "Cycles Allocation is stalled due to Resource Related reason",
1160     .ucode  = 0x100,
1161     .uflags = INTEL_X86_NCOMBO | INTEL_X86_DFL,
1162   },
1163   { .uname = "ALL",
1164     .udesc  = "Cycles Allocation is stalled due to Resource Related reason",
1165     .ucode  = 0x100,
1166     .uequiv = "ANY",
1167     .uflags = INTEL_X86_NCOMBO,
1168   },
1169   { .uname = "RS",
1170     .udesc  = "Stall cycles caused by absence of eligible entries in Reservation Station (RS)",
1171     .ucode  = 0x400,
1172     .uflags = INTEL_X86_NCOMBO,
1173   },
1174   { .uname = "SB",
1175     .udesc  = "Cycles Allocator is stalled due to Store Buffer full (not including draining from synch)",
1176     .ucode  = 0x800,
1177     .uflags = INTEL_X86_NCOMBO,
1178   },
1179   { .uname = "ROB",
1180     .udesc  = "ROB full stall cycles",
1181     .ucode  = 0x1000,
1182     .uflags = INTEL_X86_NCOMBO,
1183   },
1184 };
1185
1186 static const intel_x86_umask_t hsw_rob_misc_events[]={
1187   { .uname = "LBR_INSERTS",
1188     .udesc  = "Count each time an new Last Branch Record (LBR) is inserted",
1189     .ucode  = 0x2000,
1190     .uflags = INTEL_X86_NCOMBO | INTEL_X86_DFL,
1191   },
1192 };
1193
1194 static const intel_x86_umask_t hsw_rs_events[]={
1195   { .uname = "EMPTY_CYCLES",
1196     .udesc  = "Cycles the Reservation Station (RS) is empty for this thread",
1197     .ucode  = 0x100,
1198     .uflags = INTEL_X86_DFL,
1199   },
1200 };
1201
1202 static const intel_x86_umask_t hsw_tlb_flush[]={
1203   { .uname = "DTLB_THREAD",
1204     .udesc  = "Count number of DTLB flushes of thread-specific entries",
1205     .ucode  = 0x100,
1206     .uflags = INTEL_X86_NCOMBO,
1207   },
1208   { .uname = "STLB_ANY",
1209     .udesc  = "Count number of any STLB flushes",
1210     .ucode  = 0x2000,
1211     .uflags = INTEL_X86_NCOMBO,
1212   },
1213 };
1214
1215 static const intel_x86_umask_t hsw_uops_executed[]={
1216   { .uname = "CORE",
1217     .udesc  = "Number of uops executed from any thread",
1218     .ucode  = 0x200,
1219     .uflags = INTEL_X86_DFL,
1220   },
1221   { .uname = "STALL_CYCLES",
1222     .udesc  = "Number of cycles with no uops executed",
1223     .ucode  = 0x200 | INTEL_X86_MOD_INV | (1 << INTEL_X86_CMASK_BIT), /* inv=1 cnt=1 */
1224     .uequiv = "CORE:c=1:i=1",
1225     .uflags = INTEL_X86_NCOMBO,
1226     .modhw  = _INTEL_X86_ATTR_I | _INTEL_X86_ATTR_C,
1227   },
1228 };
1229
1230 static const intel_x86_umask_t hsw_uops_executed_port[]={
1231   { .uname = "PORT_0",
1232     .udesc  = "Cycles which a Uop is executed on port 0",
1233     .ucode  = 0x100,
1234     .uflags = INTEL_X86_NCOMBO,
1235   },
1236   { .uname = "PORT_1",
1237     .udesc  = "Cycles which a Uop is executed on port 1",
1238     .ucode  = 0x200,
1239     .uflags = INTEL_X86_NCOMBO,
1240   },
1241   { .uname = "PORT_2",
1242     .udesc  = "Cycles which a Uop is executed on port 2",
1243     .ucode  = 0x400,
1244     .uflags = INTEL_X86_NCOMBO,
1245   },
1246   { .uname = "PORT_3",
1247     .udesc  = "Cycles which a Uop is executed on port 3",
1248     .ucode  = 0x800,
1249     .uflags = INTEL_X86_NCOMBO,
1250   },
1251   { .uname = "PORT_4",
1252     .udesc  = "Cycles which a Uop is executed on port 4",
1253     .ucode  = 0x1000,
1254     .uflags = INTEL_X86_NCOMBO,
1255   },
1256   { .uname = "PORT_5",
1257     .udesc  = "Cycles which a Uop is executed on port 5",
1258     .ucode  = 0x2000,
1259     .uflags = INTEL_X86_NCOMBO,
1260   },
1261   { .uname = "PORT_6",
1262     .udesc  = "Cycles which a Uop is executed on port 6",
1263     .ucode  = 0x4000,
1264     .uflags = INTEL_X86_NCOMBO,
1265   },
1266   { .uname = "PORT_7",
1267     .udesc  = "Cycles which a Uop is executed on port 7",
1268     .ucode  = 0x8000,
1269     .uflags = INTEL_X86_NCOMBO,
1270   },
1271   { .uname = "PORT_0_CORE",
1272     .udesc  = "tbd",
1273     .ucode  = 0x100 | INTEL_X86_MOD_ANY, /* any=1 */
1274     .uequiv = "PORT_0:t=1",
1275     .uflags = INTEL_X86_NCOMBO,
1276     .modhw  = _INTEL_X86_ATTR_T,
1277   },
1278   { .uname = "PORT_1_CORE",
1279     .udesc  = "tbd",
1280     .ucode  = 0x200 | INTEL_X86_MOD_ANY, /* any=1 */
1281     .uequiv = "PORT_1:t=1",
1282     .uflags = INTEL_X86_NCOMBO,
1283     .modhw  = _INTEL_X86_ATTR_T,
1284   },
1285   { .uname = "PORT_2_CORE",
1286     .udesc  = "tbd",
1287     .ucode  = 0x400 | INTEL_X86_MOD_ANY, /* any=1 */
1288     .uequiv = "PORT_2:t=1",
1289     .uflags = INTEL_X86_NCOMBO,
1290     .modhw  = _INTEL_X86_ATTR_T,
1291   },
1292   { .uname = "PORT_3_CORE",
1293     .udesc  = "tbd",
1294     .ucode  = 0x800 | INTEL_X86_MOD_ANY, /* any=1 */
1295     .uequiv = "PORT_3:t=1",
1296     .uflags = INTEL_X86_NCOMBO,
1297     .modhw  = _INTEL_X86_ATTR_T,
1298   },
1299   { .uname = "PORT_4_CORE",
1300     .udesc  = "tbd",
1301     .ucode  = 0x1000 | INTEL_X86_MOD_ANY, /* any=1 */
1302     .uequiv = "PORT_4:t=1",
1303     .uflags = INTEL_X86_NCOMBO,
1304     .modhw  = _INTEL_X86_ATTR_T,
1305   },
1306   { .uname = "PORT_5_CORE",
1307     .udesc  = "tbd",
1308     .ucode  = 0x2000 | INTEL_X86_MOD_ANY, /* any=1 */
1309     .uequiv = "PORT_5:t=1",
1310     .uflags = INTEL_X86_NCOMBO,
1311     .modhw  = _INTEL_X86_ATTR_T,
1312   },
1313   { .uname = "PORT_6_CORE",
1314     .udesc  = "tbd",
1315     .ucode  = 0x4000 | INTEL_X86_MOD_ANY, /* any=1 */
1316     .uequiv = "PORT_6:t=1",
1317     .uflags = INTEL_X86_NCOMBO,
1318     .modhw  = _INTEL_X86_ATTR_T,
1319   },
1320   { .uname = "PORT_7_CORE",
1321     .udesc  = "tbd",
1322     .ucode  = 0x8000 | INTEL_X86_MOD_ANY, /* any=1 */
1323     .uequiv = "PORT_7:t=1",
1324     .uflags = INTEL_X86_NCOMBO,
1325     .modhw  = _INTEL_X86_ATTR_T,
1326   },
1327 };
1328
1329 static const intel_x86_umask_t hsw_uops_issued[]={
1330   { .uname = "ANY",
1331     .udesc  = "Number of Uops issued by the Resource Allocation Table (RAT) to the Reservation Station (RS)",
1332     .ucode  = 0x100,
1333     .uflags = INTEL_X86_NCOMBO | INTEL_X86_DFL,
1334   },
1335   { .uname = "ALL",
1336     .udesc  = "Number of Uops issued by the Resource Allocation Table (RAT) to the Reservation Station (RS)",
1337     .ucode  = 0x100,
1338     .uequiv = "ANY",
1339     .uflags = INTEL_X86_NCOMBO,
1340   },
1341   { .uname = "FLAGS_MERGE",
1342     .udesc  = "Number of flags-merge uops being allocated. Such uops adds delay",
1343     .ucode  = 0x1000,
1344     .uflags = INTEL_X86_NCOMBO,
1345   },
1346   { .uname = "SLOW_LEA",
1347     .udesc  = "Number of slow LEA or similar uops allocated. Such uop has 3 sources regardless if result of LEA instruction or not",
1348     .ucode  = 0x2000,
1349     .uflags = INTEL_X86_NCOMBO,
1350   },
1351   { .uname = "SINGLE_MUL",
1352     .udesc  = "Number of Multiply packed/scalar single precision uops allocated",
1353     .ucode  = 0x4000,
1354     .uflags = INTEL_X86_NCOMBO,
1355   },
1356   { .uname = "STALL_CYCLES",
1357     .udesc  = "Counts the number of cycles no uops issued by this thread",
1358     .ucode  = 0x100 | INTEL_X86_MOD_INV | (1 << INTEL_X86_CMASK_BIT), /* inv=1 cnt=1 */
1359     .uequiv = "ANY:c=1:i=1",
1360     .uflags = INTEL_X86_NCOMBO,
1361     .ucntmsk = 0xf,
1362     .modhw  = _INTEL_X86_ATTR_I | _INTEL_X86_ATTR_C,
1363   },
1364   { .uname = "CORE_STALL_CYCLES",
1365     .udesc  = "Counts the number of cycles no uops issued on this core",
1366     .ucode  = 0x100 | INTEL_X86_MOD_ANY | INTEL_X86_MOD_INV | (1 << INTEL_X86_CMASK_BIT), /* any=1 inv=1 cnt=1 */
1367     .uequiv = "ANY:c=1:i=1:t=1",
1368     .ucntmsk = 0xf,
1369     .uflags = INTEL_X86_NCOMBO,
1370     .modhw  = _INTEL_X86_ATTR_T | _INTEL_X86_ATTR_I | _INTEL_X86_ATTR_C,
1371   },
1372 };
1373
1374 static const intel_x86_umask_t hsw_uops_retired[]={
1375   { .uname = "ALL",
1376     .udesc  = "All uops that actually retired",
1377     .ucode  = 0x100,
1378     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS | INTEL_X86_DFL,
1379   },
1380   { .uname = "ANY",
1381     .udesc  = "All uops that actually retired",
1382     .ucode  = 0x100,
1383     .uequiv = "ALL",
1384     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS,
1385   },
1386   { .uname = "RETIRE_SLOTS",
1387     .udesc  = "number of retirement slots used non PEBS",
1388     .ucode  = 0x200,
1389     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS,
1390   },
1391   { .uname = "STALL_CYCLES",
1392     .udesc  = "Cycles no executable uops retired (Precise Event)",
1393     .ucode  = 0x100 | INTEL_X86_MOD_INV | (1 << INTEL_X86_CMASK_BIT), /* inv=1 cnt=1 */
1394     .uequiv = "ALL:i=1:c=1",
1395     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS,
1396     .modhw  = _INTEL_X86_ATTR_I | _INTEL_X86_ATTR_C,
1397   },
1398   { .uname = "TOTAL_CYCLES",
1399     .udesc  = "Number of cycles using always true condition applied to PEBS uops retired event",
1400     .ucode  = 0x100 | INTEL_X86_MOD_INV | (10 << INTEL_X86_CMASK_BIT), /* inv=1 cnt=10 */
1401     .uequiv = "ALL:i=1:c=10",
1402     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS,
1403     .modhw  = _INTEL_X86_ATTR_I | _INTEL_X86_ATTR_C,
1404   },
1405   { .uname = "CORE_STALL_CYCLES",
1406     .udesc  = "Cycles no executable uops retired on core (Precise Event)",
1407     .ucode  = 0x100 | INTEL_X86_MOD_INV | (1 << INTEL_X86_CMASK_BIT), /* inv=1 cnt=1 */
1408     .uequiv = "ALL:i=1:c=1:t=1",
1409     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS,
1410     .modhw  = _INTEL_X86_ATTR_I | _INTEL_X86_ATTR_C,
1411   },
1412   { .uname = "STALL_OCCURRENCES",
1413     .udesc  = "Number of transitions from stalled to unstalled execution (Precise Event)",
1414     .ucode  = 0x100 | INTEL_X86_MOD_INV | INTEL_X86_MOD_EDGE| (1 << INTEL_X86_CMASK_BIT), /* inv=1 edge=1 cnt=1 */
1415     .uequiv = "ALL:c=1:i=1:e=1",
1416     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS,
1417     .modhw  = _INTEL_X86_ATTR_I | _INTEL_X86_ATTR_C | _INTEL_X86_ATTR_E,
1418   },
1419 };
1420
1421 static const intel_x86_umask_t hsw_offcore_response[]={
1422    { .uname  = "DMND_DATA_RD",
1423      .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",
1424      .ucode = 1ULL << (0 + 8),
1425      .grpid = 0,
1426    },
1427    { .uname  = "DMND_RFO",
1428      .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",
1429      .ucode = 1ULL << (1 + 8),
1430      .grpid = 0,
1431    },
1432
1433    { .uname  = "DMND_CODE_RD",
1434      .udesc  = "Request: number of demand and DCU prefetch instruction cacheline reads. Does not count L2 code read prefetches",
1435      .ucode = 1ULL << (2 + 8),
1436      .grpid = 0,
1437    },
1438    { .uname  = "DMND_IFETCH",
1439      .udesc  = "Request: number of demand and DCU prefetch instruction cacheline reads. Does not count L2 code read prefetches",
1440      .ucode = 1ULL << (2 + 8),
1441      .uequiv = "DMND_CODE_RD",
1442      .grpid = 0,
1443    },
1444
1445    { .uname  = "WB",
1446      .udesc  = "Request: number of writebacks (modified to exclusive) transactions",
1447      .ucode = 1ULL << (3 + 8),
1448      .grpid = 0,
1449    },
1450    { .uname  = "PF_DATA_RD",
1451      .udesc  = "Request: number of data cacheline reads generated by L2 prefetchers",
1452      .ucode = 1ULL << (4 + 8),
1453      .grpid = 0,
1454    },
1455    { .uname  = "PF_RFO",
1456      .udesc  = "Request: number of RFO requests generated by L2 prefetchers",
1457      .ucode = 1ULL << (5 + 8),
1458      .grpid = 0,
1459    },
1460
1461    { .uname  = "PF_CODE_RD",
1462      .udesc  = "Request: number of code reads generated by L2 prefetchers",
1463      .ucode = 1ULL << (6 + 8),
1464      .grpid = 0,
1465    },
1466    { .uname  = "PF_IFETCH",
1467      .udesc  = "Request: number of code reads generated by L2 prefetchers",
1468      .ucode = 1ULL << (6 + 8),
1469      .grpid = 0,
1470      .uequiv= "PF_CODE_RD",
1471    },
1472
1473    { .uname  = "PF_L3_DATA_RD",
1474      .udesc  = "Request: number of L2 prefetcher requests to L3 for loads",
1475      .ucode = 1ULL << (7 + 8),
1476      .grpid = 0,
1477    },
1478    { .uname  = "PF_L3_RFO",
1479      .udesc  = "Request: number of RFO requests generated by L2 prefetcher",
1480      .ucode = 1ULL << (8 + 8),
1481      .grpid = 0,
1482    },
1483
1484    { .uname  = "PF_L3_CODE_RD",
1485      .udesc  = "Request: number of L2 prefetcher requests to L3 for instruction fetches",
1486      .ucode = 1ULL << (9 + 8),
1487      .grpid = 0,
1488    },
1489    { .uname  = "PF_L3_IFETCH",
1490      .udesc  = "Request: number of L2 prefetcher requests to L3 for instruction fetches",
1491      .ucode = 1ULL << (9 + 8),
1492      .grpid = 0,
1493      .uequiv= "PF_L3_CODE_RD",
1494    },
1495
1496    { .uname  = "SPLIT_LOCK_UC_LOCK",
1497      .udesc  = "Request: number of bus lock and split lock requests",
1498      .ucode = 1ULL << (10 + 8),
1499      .grpid = 0,
1500    },
1501    { .uname  = "BUS_LOCKS",
1502      .udesc  = "Request: number of bus lock and split lock requests",
1503      .ucode = 1ULL << (10 + 8),
1504      .grpid = 0,
1505      .uequiv= "SPLIT_LOCK_UC_LOCK",
1506    },
1507    { .uname  = "STRM_ST",
1508      .udesc  = "Request: number of streaming store requests",
1509      .ucode = 1ULL << (11 + 8),
1510      .grpid = 0,
1511    },
1512    { .uname  = "OTHER",
1513      .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",
1514      .ucode = 1ULL << (15+8),
1515      .grpid = 0,
1516    },
1517
1518    { .uname  = "ANY_CODE_RD",
1519      .udesc  = "Request: combination of PF_CODE_RD | DMND_CODE_RD | PF_L3_CODE_RD",
1520      .uequiv = "PF_CODE_RD:DMND_CODE_RD:PF_L3_CODE_RD",
1521      .ucode = 0x24400,
1522      .grpid = 0,
1523    },
1524    { .uname  = "ANY_IFETCH",
1525      .udesc  = "Request: combination of PF_CODE_RD | PF_L3_CODE_RD",
1526      .ucode = 0x24000,
1527      .grpid = 0,
1528    },
1529    { .uname  = "ANY_REQUEST",
1530      .udesc  = "Request: combination of all request umasks",
1531      .uequiv = "DMND_DATA_RD:DMND_RFO:DMND_CODE_RD:WB:PF_DATA_RD:PF_RFO:PF_CODE_RD:PF_L3_DATA_RD:PF_L3_RFO:PF_L3_CODE_RD:SPLIT_LOCK_UC_LOCK:STRM_ST:OTHER",
1532      .ucode = 0x8fff00,
1533      .uflags= INTEL_X86_NCOMBO | INTEL_X86_DFL,
1534      .grpid = 0,
1535    },
1536    { .uname  = "ANY_DATA",
1537      .udesc  = "Request: combination of DMND_DATA | PF_DATA_RD | PF_L3_DATA_RD",
1538      .uequiv = "DMND_DATA_RD:PF_DATA_RD:PF_L3_DATA_RD",
1539      .ucode = 0x9100,
1540      .grpid = 0,
1541    },
1542    { .uname  = "ANY_RFO",
1543      .udesc  = "Request: combination of DMND_RFO | PF_RFO | PF_L3_RFO",
1544      .uequiv = "DMND_RFO:PF_RFO:PF_L3_RFO",
1545      .ucode = 0x12200,
1546      .grpid = 0,
1547    },
1548
1549    { .uname  = "ANY_RESPONSE",
1550      .udesc  = "Response: count any response type",
1551      .ucode = 1ULL << (16+8),
1552      .uflags= INTEL_X86_NCOMBO | INTEL_X86_DFL | INTEL_X86_EXCL_GRP_GT,
1553      .grpid = 1,
1554    },
1555    { .uname  = "NO_SUPP",
1556      .udesc  = "Supplier: counts number of times supplier information is not available",
1557      .ucode = 1ULL << (17+8),
1558      .grpid = 1,
1559    },
1560    { .uname  = "L3_HITM",
1561      .udesc  = "Supplier: counts L3 hits in M-state (initial lookup)",
1562      .ucode = 1ULL << (18+8),
1563      .grpid = 1,
1564    },
1565    { .uname  = "L3_HITE",
1566      .udesc  = "Supplier: counts L3 hits in E-state",
1567      .ucode = 1ULL << (19+8),
1568      .grpid = 1,
1569    },
1570    { .uname  = "L3_HITS",
1571      .udesc  = "Supplier: counts L3 hits in S-state",
1572      .ucode = 1ULL << (20+8),
1573      .grpid = 1,
1574    },
1575    { .uname  = "L3_HITF",
1576      .udesc  = "Supplier: counts L3 hits in F-state",
1577      .ucode = 1ULL << (21+8),
1578      .umodel = PFM_PMU_INTEL_HSW_EP,
1579      .grpid = 1,
1580    },
1581    { .uname  = "L3_HIT",
1582      .udesc  = "Supplier: counts L3 hits in any state (M, E, S)",
1583      .ucode  = 0x7ULL << (18+8),
1584      .uequiv = "L3_HITM:L3_HITE:L3_HITS",
1585      .umodel = PFM_PMU_INTEL_HSW,
1586      .grpid  = 1,
1587    },
1588    { .uname  = "L3_HIT",
1589      .udesc  = "Supplier: counts L3 hits in any state (M, E, S, F)",
1590      .ucode  = 0xfULL << (18+8),
1591      .uequiv = "L3_HITM:L3_HITE:L3_HITS:L3_HITF",
1592      .umodel = PFM_PMU_INTEL_HSW_EP,
1593      .grpid  = 1,
1594    },
1595    { .uname  = "L3_MISS_LOCAL",
1596      .udesc  = "Supplier: counts L3 misses to local DRAM",
1597      .ucode = 1ULL << (22+8),
1598      .grpid = 1,
1599    },
1600    { .uname  = "L3_MISS_REMOTE_HOP0",
1601      .udesc  = "Supplier: counts L3 misses to remote DRAM with 0 hop",
1602      .ucode = 0x1ULL << (27+8),
1603      .umodel = PFM_PMU_INTEL_HSW_EP,
1604      .grpid = 1,
1605    },
1606    { .uname  = "L3_MISS_REMOTE_HOP1",
1607      .udesc  = "Supplier: counts L3 misses to remote DRAM with 1 hop",
1608      .ucode = 0x1ULL << (28+8),
1609      .umodel = PFM_PMU_INTEL_HSW_EP,
1610      .grpid = 1,
1611    },
1612    { .uname  = "L3_MISS_REMOTE_HOP2P",
1613      .udesc  = "Supplier: counts L3 misses to remote DRAM with 2P hops",
1614      .ucode = 0x1ULL << (29+8),
1615      .umodel = PFM_PMU_INTEL_HSW_EP,
1616      .grpid = 1,
1617    },
1618    { .uname  = "L3_MISS",
1619      .udesc  = "Supplier: counts L3 misses to local or remote DRAM",
1620      .ucode = 0xfULL << (26+8),
1621      .umodel = PFM_PMU_INTEL_HSW_EP,
1622      .grpid = 1,
1623    },
1624
1625    { .uname  = "SPL_HIT",
1626      .udesc  = "Supplier: counts L3 supplier hit",
1627      .ucode = 0x1ULL << (30+8),
1628      .grpid = 1,
1629    },
1630    { .uname  = "SNP_NONE",
1631      .udesc  = "Snoop: counts number of times no snoop-related information is available",
1632      .ucode = 1ULL << (31+8),
1633      .grpid = 2,
1634    },
1635    { .uname  = "SNP_NOT_NEEDED",
1636      .udesc  = "Snoop: counts the number of times no snoop was needed to satisfy the request",
1637      .ucode = 1ULL << (32+8),
1638      .grpid = 2,
1639    },
1640    { .uname  = "SNP_MISS",
1641      .udesc  = "Snoop: counts number of times a snoop was needed and it missed all snooped caches",
1642      .ucode = 1ULL << (33+8),
1643      .grpid = 2,
1644    },
1645    { .uname  = "SNP_NO_FWD",
1646      .udesc  = "Snoop: counts number of times a snoop was needed and it hit in at leas one snooped cache",
1647      .ucode = 1ULL << (34+8),
1648      .grpid = 2,
1649    },
1650    { .uname  = "SNP_FWD",
1651      .udesc  = "Snoop: counts number of times a snoop was needed and data was forwarded from a remote socket",
1652      .ucode = 1ULL << (35+8),
1653      .grpid = 2,
1654    },
1655    { .uname  = "SNP_HITM",
1656      .udesc  = "Snoop: counts number of times a snoop was needed and it hitM-ed in local or remote cache",
1657      .ucode = 1ULL << (36+8),
1658      .grpid = 2,
1659    },
1660    { .uname  = "SNP_NON_DRAM",
1661      .udesc  = "Snoop:  counts number of times target was a non-DRAM system address. This includes MMIO transactions",
1662      .ucode = 1ULL << (37+8),
1663      .grpid = 2,
1664    },
1665    { .uname  = "SNP_ANY",
1666      .udesc  = "Snoop: any snoop reason",
1667      .ucode = 0x7fULL << (31+8),
1668      .uequiv = "SNP_NONE:SNP_NOT_NEEDED:SNP_MISS:SNP_NO_FWD:SNP_FWD:SNP_HITM:SNP_NON_DRAM",
1669      .uflags= INTEL_X86_DFL,
1670      .grpid = 2,
1671    },
1672 };
1673
1674 static const intel_x86_umask_t hsw_hle_retired[]={
1675   { .uname = "START",
1676     .udesc  = "Number of times an HLE execution started",
1677     .ucode  = 0x100,
1678     .uflags = INTEL_X86_NCOMBO | INTEL_X86_DFL,
1679   },
1680   { .uname = "COMMIT",
1681     .udesc  = "Number of times an HLE execution successfully committed",
1682     .ucode  = 0x200,
1683     .uflags = INTEL_X86_NCOMBO,
1684   },
1685   { .uname = "ABORTED",
1686     .udesc  = "Number of times an HLE execution aborted due to any reasons (multiple categories may count as one) (Precise Event)",
1687     .ucode  = 0x400,
1688     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS,
1689   },
1690   { .uname = "ABORTED_MISC1",
1691     .udesc  = "Number of times an HLE execution aborted due to various memory events",
1692     .ucode  = 0x800,
1693     .uflags = INTEL_X86_NCOMBO,
1694   },
1695   { .uname = "ABORTED_MISC2",
1696     .udesc  = "Number of times an HLE execution aborted due to uncommon conditions",
1697     .ucode  = 0x1000,
1698     .uflags = INTEL_X86_NCOMBO,
1699   },
1700   { .uname = "ABORTED_MISC3",
1701     .udesc  = "Number of times an HLE execution aborted due to HLE-unfriendly instructions",
1702     .ucode  = 0x2000,
1703     .uflags = INTEL_X86_NCOMBO,
1704   },
1705   { .uname = "ABORTED_MISC4",
1706     .udesc  = "Number of times an HLE execution aborted due to incompatible memory type",
1707     .ucode  = 0x4000,
1708     .uflags = INTEL_X86_NCOMBO,
1709   },
1710   { .uname = "ABORTED_MISC5",
1711     .udesc  = "Number of times an HLE execution aborted due to none of the other 4 reasons (e.g., interrupt)",
1712     .ucode  = 0x8000,
1713     .uflags = INTEL_X86_NCOMBO,
1714   },
1715 };
1716
1717 static const intel_x86_umask_t hsw_rtm_retired[]={
1718   { .uname = "START",
1719     .udesc  = "Number of times an RTM execution started",
1720     .ucode  = 0x100,
1721     .uflags = INTEL_X86_NCOMBO | INTEL_X86_DFL,
1722   },
1723   { .uname = "COMMIT",
1724     .udesc  = "Number of times an RTM execution successfully committed",
1725     .ucode  = 0x200,
1726     .uflags = INTEL_X86_NCOMBO,
1727   },
1728   { .uname = "ABORTED",
1729     .udesc  = "Number of times an RTM execution aborted due to any reasons (multiple categories may count as one) (Precise Event)",
1730     .ucode  = 0x400,
1731     .uflags = INTEL_X86_NCOMBO | INTEL_X86_PEBS,
1732   },
1733   { .uname = "ABORTED_MISC1",
1734     .udesc  = "Number of times an RTM execution aborted due to various memory events",
1735     .ucode  = 0x800,
1736     .uflags = INTEL_X86_NCOMBO,
1737   },
1738   { .uname = "ABORTED_MISC2",
1739     .udesc  = "Number of times an RTM execution aborted due to uncommon conditions",
1740     .ucode  = 0x1000,
1741     .uflags = INTEL_X86_NCOMBO,
1742   },
1743   { .uname = "ABORTED_MISC3",
1744     .udesc  = "Number of times an RTM execution aborted due to RTM-unfriendly instructions",
1745     .ucode  = 0x2000,
1746     .uflags = INTEL_X86_NCOMBO,
1747   },
1748   { .uname = "ABORTED_MISC4",
1749     .udesc  = "Number of times an RTM execution aborted due to incompatible memory type",
1750     .ucode  = 0x4000,
1751     .uflags = INTEL_X86_NCOMBO,
1752   },
1753   { .uname = "ABORTED_MISC5",
1754     .udesc  = "Number of times an RTM execution aborted due to none of the other 4 reasons (e.g., interrupt)",
1755     .ucode  = 0x8000,
1756     .uflags = INTEL_X86_NCOMBO,
1757   },
1758 };
1759
1760 static const intel_x86_umask_t hsw_tx_mem[]={
1761   { .uname = "ABORT_CONFLICT",
1762     .udesc  = "Number of times a transactional abort was signaled due to data conflict on a transactionally accessed address",
1763     .ucode  = 0x100,
1764     .uflags = INTEL_X86_NCOMBO,
1765   },
1766   { .uname = "ABORT_CAPACITY_WRITE",
1767     .udesc  = "Number of times a transactional abort was signaled due to data capacity limitation for transactional writes",
1768     .ucode  = 0x200,
1769     .uflags = INTEL_X86_NCOMBO,
1770   },
1771   { .uname = "ABORT_HLE_STORE_TO_ELIDED_LOCK",
1772     .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",
1773     .ucode  = 0x400,
1774     .uflags = INTEL_X86_NCOMBO,
1775   },
1776   { .uname = "ABORT_HLE_ELISION_BUFFER_NOT_EMPTY",
1777     .udesc  = "Number of times a HLE transactional execution aborted due to NoAllocatedElisionBuffer being non-zero",
1778     .ucode  = 0x800,
1779     .uflags = INTEL_X86_NCOMBO,
1780   },
1781   { .uname = "ABORT_HLE_ELISION_BUFFER_MISMATCH",
1782     .udesc  = "Number of times a HLE transaction execution aborted due to xrelease lock not satisfying the address and value requirements in the elision buffer",
1783     .ucode  = 0x1000,
1784     .uflags = INTEL_X86_NCOMBO,
1785   },
1786   { .uname = "ABORT_HLE_ELISION_BUFFER_UNSUPPORTED_ALIGNMENT",
1787     .udesc  = "Number of times a HLE transaction execution aborted due to an unsupported read alignment from the elision buffer",
1788     .ucode  = 0x2000,
1789     .uflags = INTEL_X86_NCOMBO,
1790   },
1791   { .uname = "ABORT_HLE_ELISION_BUFFER_FULL",
1792     .udesc  = "Number of times a HLE clock could not be elided due to ElisionBufferAvailable being zero",
1793     .ucode  = 0x4000,
1794     .uflags = INTEL_X86_NCOMBO,
1795   },
1796 };
1797
1798 static const intel_x86_umask_t hsw_tx_exec[]={
1799   { .uname = "MISC1",
1800     .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",
1801     .ucode  = 0x100,
1802     .uflags = INTEL_X86_NCOMBO,
1803   },
1804   { .uname = "MISC2",
1805     .udesc  = "Number of times a class of instructions that may cause a transactional abort was executed inside a transactional region",
1806     .ucode  = 0x200,
1807     .uflags = INTEL_X86_NCOMBO,
1808   },
1809   { .uname = "MISC3",
1810     .udesc  = "Number of times an instruction execution caused the supported nest count to be exceeded",
1811     .ucode  = 0x400,
1812     .uflags = INTEL_X86_NCOMBO,
1813   },
1814   { .uname = "MISC4",
1815     .udesc  = "Number of times an instruction with HLE xacquire prefix was executed inside a RTM transactional region",
1816     .ucode  = 0x800,
1817     .uflags = INTEL_X86_NCOMBO,
1818   },
1819 };
1820
1821 static const intel_x86_umask_t hsw_offcore_requests_outstanding[]={
1822    { .uname  = "ALL_DATA_RD_CYCLES",
1823      .udesc  = "Cycles with cacheable data read transactions in the superQ (use with HT off only)",
1824      .uequiv = "ALL_DATA_RD:c=1",
1825      .ucode = 0x800 | (0x1 << INTEL_X86_CMASK_BIT),
1826      .uflags= INTEL_X86_NCOMBO,
1827    },
1828    { .uname  = "DEMAND_CODE_RD_CYCLES",
1829      .udesc  = "Cycles with demand code reads transactions in the superQ (use with HT off only)",
1830      .uequiv = "DEMAND_CODE_RD:c=1",
1831      .ucode = 0x200 | (0x1 << INTEL_X86_CMASK_BIT),
1832      .uflags= INTEL_X86_NCOMBO,
1833    },
1834    { .uname  = "DEMAND_DATA_RD_CYCLES",
1835      .udesc  = "Cycles with demand data read transactions in the superQ (use with HT off only)",
1836      .uequiv = "DEMAND_DATA_RD:c=1",
1837      .ucode = 0x100 | (0x1 << INTEL_X86_CMASK_BIT),
1838      .uflags= INTEL_X86_NCOMBO,
1839    },
1840    { .uname  = "ALL_DATA_RD",
1841      .udesc  = "Cacheable data read transactions in the superQ every cycle (use with HT off only)",
1842      .ucode = 0x800,
1843      .uflags= INTEL_X86_NCOMBO,
1844    },
1845    { .uname  = "DEMAND_CODE_RD",
1846      .udesc  = "Code read transactions in the superQ every cycle (use with HT off only)",
1847      .ucode = 0x200,
1848      .uflags= INTEL_X86_NCOMBO,
1849    },
1850    { .uname  = "DEMAND_DATA_RD",
1851      .udesc  = "Demand data read transactions in the superQ every cycle (use with HT off only)",
1852      .ucode = 0x100,
1853      .uflags= INTEL_X86_NCOMBO,
1854    },
1855    { .uname  = "DEMAND_RFO",
1856      .udesc  = "Outstanding RFO (store) transactions in the superQ every cycle (use with HT off only)",
1857      .ucode = 0x400,
1858      .uflags= INTEL_X86_NCOMBO,
1859    },
1860    { .uname  = "DEMAND_RFO_CYCLES",
1861      .udesc  = "Cycles with outstanding RFO (store) transactions in the superQ (use with HT off only)",
1862      .uequiv = "DEMAND_RFO:c=1",
1863      .ucode = 0x400 | (0x1 << INTEL_X86_CMASK_BIT),
1864      .uflags= INTEL_X86_NCOMBO,
1865    },
1866 };
1867
1868 static const intel_x86_umask_t hsw_ild_stall[]={
1869    { .uname  = "LCP",
1870      .udesc  = "Stall caused by changing prefix length of the instruction",
1871      .ucode = 0x100,
1872      .uflags= INTEL_X86_NCOMBO,
1873    },
1874    { .uname  = "IQ_FULL",
1875      .udesc  = "Stall cycles due to IQ full",
1876      .ucode = 0x400,
1877      .uflags= INTEL_X86_NCOMBO,
1878    },
1879 };
1880
1881 static const intel_x86_umask_t hsw_page_walker_loads[]={
1882    { .uname  = "DTLB_L1",
1883      .udesc  = "Number of DTLB page walker loads that hit in the L1D and line fill buffer",
1884      .ucode = 0x1100,
1885      .uflags= INTEL_X86_NCOMBO,
1886    },
1887    { .uname  = "ITLB_L1",
1888      .udesc  = "Number of ITLB page walker loads that hit in the L1I and line fill buffer",
1889      .ucode = 0x2100,
1890      .uflags= INTEL_X86_NCOMBO,
1891    },
1892    { .uname  = "DTLB_L2",
1893      .udesc  = "Number of DTLB page walker loads that hit in the L2",
1894      .ucode = 0x1200,
1895      .uflags= INTEL_X86_NCOMBO,
1896    },
1897    { .uname  = "ITLB_L2",
1898      .udesc  = "Number of ITLB page walker loads that hit in the L2",
1899      .ucode = 0x2200,
1900      .uflags= INTEL_X86_NCOMBO,
1901    },
1902    { .uname  = "DTLB_L3",
1903      .udesc  = "Number of DTLB page walker loads that hit in the L3",
1904      .ucode = 0x1400,
1905      .uflags= INTEL_X86_NCOMBO,
1906    },
1907    { .uname  = "ITLB_L3",
1908      .udesc  = "Number of ITLB page walker loads that hit in the L3",
1909      .ucode = 0x2400,
1910      .uflags= INTEL_X86_NCOMBO,
1911    },
1912    { .uname  = "EPT_DTLB_L1",
1913      .udesc  = "Number of extended page table walks from the DTLB that hit in the L1D and line fill buffer",
1914      .ucode = 0x4100,
1915      .uflags= INTEL_X86_NCOMBO,
1916    },
1917    { .uname  = "EPT_ITLB_L1",
1918      .udesc  = "Number of extended page table walks from the ITLB that hit in the L1D and line fill buffer",
1919      .ucode = 0x8100,
1920      .uflags= INTEL_X86_NCOMBO,
1921    },
1922    { .uname  = "EPT_DTLB_L2",
1923      .udesc  = "Number of extended page table walks from the DTLB that hit in the L2",
1924      .ucode = 0x4200,
1925      .uflags= INTEL_X86_NCOMBO,
1926    },
1927    { .uname  = "EPT_ITLB_L2",
1928      .udesc  = "Number of extended page table walks from the ITLB that hit in the L2",
1929      .ucode = 0x8200,
1930      .uflags= INTEL_X86_NCOMBO,
1931    },
1932    { .uname  = "EPT_DTLB_L3",
1933      .udesc  = "Number of extended page table walks from the DTLB that hit in the L3",
1934      .ucode = 0x4400,
1935      .uflags= INTEL_X86_NCOMBO,
1936    },
1937    { .uname  = "EPT_ITLB_L3",
1938      .udesc  = "Number of extended page table walks from the ITLB that hit in the L3",
1939      .ucode = 0x8400,
1940      .uflags= INTEL_X86_NCOMBO,
1941    },
1942    { .uname  = "DTLB_MEMORY",
1943      .udesc  = "Number of DTLB page walker loads that hit memory",
1944      .ucode = 0x1800,
1945      .uflags= INTEL_X86_NCOMBO,
1946    },
1947    { .uname  = "ITLB_MEMORY",
1948      .udesc  = "Number of ITLB page walker loads that hit memory",
1949      .ucode = 0x2800,
1950      .uflags= INTEL_X86_NCOMBO,
1951    },
1952    { .uname  = "EPT_DTLB_MEMORY",
1953      .udesc  = "Number of extended page table walks from the DTLB that hit memory",
1954      .ucode = 0x4800,
1955      .uflags= INTEL_X86_NCOMBO,
1956    },
1957    { .uname  = "EPT_ITLB_MEMORY",
1958      .udesc  = "Number of extended page table walks from the ITLB that hit memory",
1959      .ucode = 0x8800,
1960      .uflags= INTEL_X86_NCOMBO,
1961    },
1962 };
1963
1964 static const intel_x86_umask_t hsw_lsd[]={
1965    { .uname  = "UOPS",
1966      .udesc  = "Number of uops delivered by the Loop Stream Detector (LSD)",
1967      .ucode = 0x100,
1968      .uflags= INTEL_X86_DFL,
1969    },
1970 };
1971
1972 static const intel_x86_umask_t hsw_dsb2mite_switches[]={
1973    { .uname  = "PENALTY_CYCLES",
1974      .udesc  = "Number of DSB to MITE switch true penalty cycles",
1975      .ucode = 0x0200,
1976      .uflags= INTEL_X86_NCOMBO | INTEL_X86_DFL,
1977    },
1978 };
1979
1980 static const intel_x86_umask_t hsw_ept[]={
1981    { .uname  = "CYCLES",
1982      .udesc  = "Cycles for an extended page table walk",
1983      .ucode = 0x0200,
1984      .uflags= INTEL_X86_NCOMBO | INTEL_X86_DFL,
1985    },
1986 };
1987
1988 static const intel_x86_umask_t hsw_arith[]={
1989    { .uname  = "DIVIDER_UOPS",
1990      .udesc  = "Number of uops executed by divider",
1991      .ucode = 0x0200,
1992      .uflags= INTEL_X86_NCOMBO | INTEL_X86_DFL,
1993    },
1994 };
1995
1996 static const intel_x86_umask_t hsw_offcore_requests_buffer[]={
1997    { .uname  = "SQ_FULL",
1998      .udesc  = "Number of cycles the offcore requests buffer is full",
1999      .ucode = 0x0200,
2000      .uflags= INTEL_X86_NCOMBO | INTEL_X86_DFL,
2001    },
2002 };
2003
2004 static const intel_x86_entry_t intel_hsw_pe[]={
2005   { .name   = "UNHALTED_CORE_CYCLES",
2006     .desc   = "Count core clock cycles whenever the clock signal on the specific core is running (not halted)",
2007     .modmsk = INTEL_V4_ATTRS,
2008     .cntmsk = 0x20000000full,
2009     .code = 0x3c,
2010   },
2011   { .name   = "UNHALTED_REFERENCE_CYCLES",
2012     .desc   = "Unhalted reference cycles",
2013     .modmsk = INTEL_FIXED3_ATTRS,
2014     .cntmsk = 0x400000000ull,
2015     .code = 0x0300, /* pseudo encoding */
2016     .flags = INTEL_X86_FIXED,
2017   },
2018   { .name   = "INSTRUCTION_RETIRED",
2019     .desc   = "Number of instructions at retirement",
2020     .modmsk = INTEL_V4_ATTRS,
2021     .cntmsk = 0x10000000full,
2022     .code = 0xc0,
2023   },
2024   { .name   = "INSTRUCTIONS_RETIRED",
2025     .desc   = "This is an alias for INSTRUCTION_RETIRED",
2026     .modmsk = INTEL_V4_ATTRS,
2027     .equiv = "INSTRUCTION_RETIRED",
2028     .cntmsk = 0x10000000full,
2029     .code = 0xc0,
2030   },
2031   { .name   = "BRANCH_INSTRUCTIONS_RETIRED",
2032     .desc   = "Count branch instructions at retirement. Specifically, this event counts the retirement of the last micro-op of a branch instruction",
2033     .modmsk = INTEL_V4_ATTRS,
2034     .equiv = "BR_INST_RETIRED:ALL_BRANCHES",
2035     .cntmsk = 0xff,
2036     .code = 0xc4,
2037   },
2038   { .name   = "MISPREDICTED_BRANCH_RETIRED",
2039     .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",
2040     .modmsk = INTEL_V4_ATTRS,
2041     .equiv = "BR_MISP_RETIRED:ALL_BRANCHES",
2042     .cntmsk = 0xff,
2043     .code = 0xc5,
2044   },
2045   { .name = "BACLEARS",
2046     .desc   = "Branch re-steered",
2047     .code = 0xe6,
2048     .cntmsk = 0xff,
2049     .ngrp = 1,
2050     .modmsk = INTEL_V4_ATTRS,
2051     .numasks = LIBPFM_ARRAY_SIZE(hsw_baclears),
2052     .umasks  = hsw_baclears
2053   },
2054   { .name = "BR_INST_EXEC",
2055     .desc   = "Branch instructions executed",
2056     .code = 0x88,
2057     .cntmsk = 0xff,
2058     .ngrp = 1,
2059     .modmsk = INTEL_V4_ATTRS,
2060     .numasks = LIBPFM_ARRAY_SIZE(hsw_br_inst_exec),
2061     .umasks  = hsw_br_inst_exec
2062   },
2063   { .name = "BR_INST_RETIRED",
2064     .desc   = "Branch instructions retired (Precise Event)",
2065     .code = 0xc4,
2066     .cntmsk = 0xff,
2067     .ngrp = 1,
2068     .flags = INTEL_X86_PEBS,
2069     .modmsk = INTEL_V4_ATTRS,
2070     .numasks = LIBPFM_ARRAY_SIZE(hsw_br_inst_retired),
2071     .umasks  = hsw_br_inst_retired
2072   },
2073   { .name = "BR_MISP_EXEC",
2074     .desc   = "Mispredicted branches executed",
2075     .code = 0x89,
2076     .cntmsk = 0xff,
2077     .ngrp = 1,
2078     .modmsk = INTEL_V4_ATTRS,
2079     .numasks = LIBPFM_ARRAY_SIZE(hsw_br_misp_exec),
2080     .umasks  = hsw_br_misp_exec
2081   },
2082   { .name = "BR_MISP_RETIRED",
2083     .desc   = "Mispredicted retired branches (Precise Event)",
2084     .code = 0xc5,
2085     .cntmsk = 0xff,
2086     .ngrp = 1,
2087     .flags = INTEL_X86_PEBS,
2088     .modmsk = INTEL_V4_ATTRS,
2089     .numasks = LIBPFM_ARRAY_SIZE(hsw_br_misp_retired),
2090     .umasks  = hsw_br_misp_retired
2091   },
2092   { .name = "CPL_CYCLES",
2093     .desc   = "Unhalted core cycles at a specific ring level",
2094     .code = 0x5c,
2095     .cntmsk = 0xff,
2096     .ngrp = 1,
2097     .modmsk = INTEL_V4_ATTRS,
2098     .numasks = LIBPFM_ARRAY_SIZE(hsw_cpl_cycles),
2099     .umasks  = hsw_cpl_cycles
2100   },
2101   { .name = "CPU_CLK_THREAD_UNHALTED",
2102     .desc   = "Count core clock cycles whenever the clock signal on the specific core is running (not halted)",
2103     .code = 0x3c,
2104     .cntmsk = 0xff,
2105     .ngrp = 1,
2106     .modmsk = INTEL_V4_ATTRS,
2107     .numasks = LIBPFM_ARRAY_SIZE(hsw_cpu_clk_thread_unhalted),
2108     .umasks  = hsw_cpu_clk_thread_unhalted
2109   },
2110   { .name = "CPU_CLK_UNHALTED",
2111     .desc   = "Count core clock cycles whenever the clock signal on the specific core is running (not halted)",
2112     .code = 0x3c,
2113     .cntmsk = 0xff,
2114     .modmsk = INTEL_V4_ATTRS,
2115     .equiv = "CPU_CLK_THREAD_UNHALTED",
2116   },
2117   { .name = "CYCLE_ACTIVITY",
2118     .desc   = "Stalled cycles",
2119     .code = 0xa3,
2120     .cntmsk = 0xf,
2121     .ngrp = 1,
2122     .modmsk = INTEL_V4_ATTRS & ~_INTEL_X86_ATTR_C,
2123     .numasks = LIBPFM_ARRAY_SIZE(hsw_cycle_activity),
2124     .umasks  = hsw_cycle_activity
2125   },
2126   { .name = "DTLB_LOAD_MISSES",
2127     .desc   = "Data TLB load misses",
2128     .code = 0x8,
2129     .cntmsk = 0xff,
2130     .ngrp = 1,
2131     .modmsk = INTEL_V4_ATTRS,
2132     .numasks = LIBPFM_ARRAY_SIZE(hsw_dtlb_load_misses),
2133     .umasks  = hsw_dtlb_load_misses
2134   },
2135   { .name = "DTLB_STORE_MISSES",
2136     .desc = "Data TLB store misses",
2137     .code = 0x49,
2138     .cntmsk = 0xff,
2139     .ngrp = 1,
2140     .modmsk = INTEL_V4_ATTRS,
2141     .numasks = LIBPFM_ARRAY_SIZE(hsw_dtlb_load_misses),
2142     .umasks  = hsw_dtlb_load_misses /* shared */
2143   },
2144   { .name = "FP_ASSIST",
2145     .desc = "X87 floating-point assists",
2146     .code = 0xca,
2147     .cntmsk = 0xff,
2148     .ngrp = 1,
2149     .modmsk = INTEL_V4_ATTRS,
2150     .numasks = LIBPFM_ARRAY_SIZE(hsw_fp_assist),
2151     .umasks  = hsw_fp_assist
2152   },
2153   { .name = "HLE_RETIRED",
2154     .desc = "HLE execution (Precise Event)",
2155     .code = 0xc8,
2156     .cntmsk = 0xff,
2157     .ngrp = 1,
2158     .flags = INTEL_X86_PEBS,
2159     .modmsk = INTEL_V4_ATTRS,
2160     .numasks = LIBPFM_ARRAY_SIZE(hsw_hle_retired),
2161     .umasks  = hsw_hle_retired
2162   },
2163   { .name = "ICACHE",
2164     .desc = "Instruction Cache",
2165     .code = 0x80,
2166     .cntmsk = 0xff,
2167     .ngrp = 1,
2168     .modmsk = INTEL_V4_ATTRS,
2169     .numasks = LIBPFM_ARRAY_SIZE(hsw_icache),
2170     .umasks  = hsw_icache
2171   },
2172   { .name = "IDQ",
2173     .desc   = "IDQ operations",
2174     .code = 0x79,
2175     .cntmsk = 0xff,
2176     .ngrp = 1,
2177     .modmsk = INTEL_V4_ATTRS,
2178     .numasks = LIBPFM_ARRAY_SIZE(hsw_idq),
2179     .umasks  = hsw_idq
2180   },
2181   { .name = "IDQ_UOPS_NOT_DELIVERED",
2182     .desc   = "Uops not delivered",
2183     .code = 0x9c,
2184     .cntmsk = 0xf,
2185     .ngrp = 1,
2186     .modmsk = INTEL_V4_ATTRS,
2187     .numasks = LIBPFM_ARRAY_SIZE(hsw_idq_uops_not_delivered),
2188     .umasks  = hsw_idq_uops_not_delivered
2189   },
2190   { .name = "INST_RETIRED",
2191     .desc = "Number of instructions retired (Precise Event)",
2192     .code = 0xc0,
2193     .cntmsk = 0xff,
2194     .ngrp = 1,
2195     .flags = INTEL_X86_PEBS,
2196     .modmsk = INTEL_V4_ATTRS,
2197     .numasks = LIBPFM_ARRAY_SIZE(hsw_inst_retired),
2198     .umasks  = hsw_inst_retired
2199   },
2200   { .name = "INT_MISC",
2201     .desc = "Miscellaneous interruptions",
2202     .code = 0xd,
2203     .cntmsk = 0xff,
2204     .ngrp = 1,
2205     .modmsk = INTEL_V4_ATTRS,
2206     .numasks = LIBPFM_ARRAY_SIZE(hsw_int_misc),
2207     .umasks  = hsw_int_misc
2208   },
2209   { .name = "ITLB",
2210     .desc   = "Instruction TLB",
2211     .code = 0xae,
2212     .cntmsk = 0xff,
2213     .ngrp = 1,
2214     .modmsk = INTEL_V4_ATTRS,
2215     .numasks = LIBPFM_ARRAY_SIZE(hsw_itlb),
2216     .umasks  = hsw_itlb
2217   },
2218   { .name = "ITLB_MISSES",
2219     .desc = "Instruction TLB misses",
2220     .code = 0x85,
2221     .cntmsk = 0xff,
2222     .ngrp = 1,
2223     .modmsk = INTEL_V4_ATTRS,
2224     .numasks = LIBPFM_ARRAY_SIZE(hsw_itlb_misses),
2225     .umasks  = hsw_itlb_misses
2226   },
2227   { .name = "L1D",
2228     .desc   = "L1D cache",
2229     .code = 0x51,
2230     .cntmsk = 0xff,
2231     .ngrp = 1,
2232     .modmsk = INTEL_V4_ATTRS,
2233     .numasks = LIBPFM_ARRAY_SIZE(hsw_l1d),
2234     .umasks  = hsw_l1d
2235   },
2236   { .name = "L1D_PEND_MISS",
2237     .desc   = "L1D pending misses",
2238     .code = 0x48,
2239     .cntmsk = 0xff,
2240     .ngrp = 1,
2241     .modmsk = INTEL_V4_ATTRS,
2242     .numasks = LIBPFM_ARRAY_SIZE(hsw_l1d_pend_miss),
2243     .umasks  = hsw_l1d_pend_miss
2244   },
2245   { .name = "L2_DEMAND_RQSTS",
2246     .desc = "Demand Data Read requests to L2",
2247     .code = 0x27,
2248     .cntmsk = 0xff,
2249     .ngrp = 1,
2250     .modmsk = INTEL_V4_ATTRS,
2251     .numasks = LIBPFM_ARRAY_SIZE(hsw_l2_demand_rqsts),
2252     .umasks  = hsw_l2_demand_rqsts
2253   },
2254   { .name = "L2_LINES_IN",
2255     .desc   = "L2 lines allocated",
2256     .code = 0xf1,
2257     .cntmsk = 0xff,
2258     .ngrp = 1,
2259     .modmsk = INTEL_V4_ATTRS,
2260     .numasks = LIBPFM_ARRAY_SIZE(hsw_l2_lines_in),
2261     .umasks  = hsw_l2_lines_in
2262   },
2263   { .name = "L2_LINES_OUT",
2264     .desc   = "L2 lines evicted",
2265     .code = 0xf2,
2266     .cntmsk = 0xff,
2267     .ngrp = 1,
2268     .modmsk = INTEL_V4_ATTRS,
2269     .numasks = LIBPFM_ARRAY_SIZE(hsw_l2_lines_out),
2270     .umasks  = hsw_l2_lines_out
2271   },
2272   { .name = "L2_RQSTS",
2273     .desc   = "L2 requests",
2274     .code = 0x24,
2275     .cntmsk = 0xff,
2276     .ngrp = 1,
2277     .modmsk = INTEL_V4_ATTRS,
2278     .numasks = LIBPFM_ARRAY_SIZE(hsw_l2_rqsts),
2279     .umasks  = hsw_l2_rqsts
2280   },
2281   { .name = "L2_TRANS",
2282     .desc   = "L2 transactions",
2283     .code = 0xf0,
2284     .cntmsk = 0xff,
2285     .ngrp = 1,
2286     .modmsk = INTEL_V4_ATTRS,
2287     .numasks = LIBPFM_ARRAY_SIZE(hsw_l2_trans),
2288     .umasks  = hsw_l2_trans
2289   },
2290   { .name = "LD_BLOCKS",
2291     .desc   = "Blocking loads",
2292     .code = 0x3,
2293     .cntmsk = 0xff,
2294     .ngrp = 1,
2295     .modmsk = INTEL_V4_ATTRS,
2296     .numasks = LIBPFM_ARRAY_SIZE(hsw_ld_blocks),
2297     .umasks  = hsw_ld_blocks
2298   },
2299   { .name = "LD_BLOCKS_PARTIAL",
2300     .desc   = "Partial load blocks",
2301     .code = 0x7,
2302     .cntmsk = 0xff,
2303     .ngrp = 1,
2304     .modmsk = INTEL_V4_ATTRS,
2305     .numasks = LIBPFM_ARRAY_SIZE(hsw_ld_blocks_partial),
2306     .umasks  = hsw_ld_blocks_partial
2307   },
2308   { .name = "LOAD_HIT_PRE",
2309     .desc   = "Load dispatches",
2310     .code = 0x4c,
2311     .cntmsk = 0xff,
2312     .ngrp = 1,
2313     .modmsk = INTEL_V4_ATTRS,
2314     .numasks = LIBPFM_ARRAY_SIZE(hsw_load_hit_pre),
2315     .umasks  = hsw_load_hit_pre
2316   },
2317   { .name = "LOCK_CYCLES",
2318     .desc   = "Locked cycles in L1D and L2",
2319     .code = 0x63,
2320     .cntmsk = 0xff,
2321     .ngrp = 1,
2322     .modmsk = INTEL_V4_ATTRS,
2323     .numasks = LIBPFM_ARRAY_SIZE(hsw_lock_cycles),
2324     .umasks  = hsw_lock_cycles
2325   },
2326   { .name = "LONGEST_LAT_CACHE",
2327     .desc   = "L3 cache",
2328     .code = 0x2e,
2329     .cntmsk = 0xff,
2330     .ngrp = 1,
2331     .modmsk = INTEL_V4_ATTRS,
2332     .numasks = LIBPFM_ARRAY_SIZE(hsw_longest_lat_cache),
2333     .umasks  = hsw_longest_lat_cache
2334   },
2335   { .name = "MACHINE_CLEARS",
2336     .desc   = "Machine clear asserted",
2337     .code = 0xc3,
2338     .cntmsk = 0xff,
2339     .ngrp = 1,
2340     .modmsk = INTEL_V4_ATTRS,
2341     .numasks = LIBPFM_ARRAY_SIZE(hsw_machine_clears),
2342     .umasks  = hsw_machine_clears
2343   },
2344   { .name = "MEM_LOAD_UOPS_L3_HIT_RETIRED",
2345   .desc   = "L3 hit load uops retired (Precise Event)",
2346     .code = 0xd2,
2347     .cntmsk = 0xf,
2348     .ngrp = 1,
2349     .flags = INTEL_X86_PEBS,
2350     .modmsk = INTEL_V4_ATTRS,
2351     .numasks = LIBPFM_ARRAY_SIZE(hsw_mem_load_uops_l3_hit_retired),
2352     .umasks  = hsw_mem_load_uops_l3_hit_retired
2353   },
2354   { .name = "MEM_LOAD_UOPS_LLC_HIT_RETIRED",
2355   .desc   = "L3 hit load uops retired (Precise Event)",
2356     .equiv = "MEM_LOAD_UOPS_L3_HIT_RETIRED",
2357     .code = 0xd2,
2358     .cntmsk = 0xf,
2359     .ngrp = 1,
2360     .flags = INTEL_X86_PEBS,
2361     .modmsk = INTEL_V4_ATTRS,
2362     .numasks = LIBPFM_ARRAY_SIZE(hsw_mem_load_uops_l3_hit_retired),
2363     .umasks  = hsw_mem_load_uops_l3_hit_retired
2364   },
2365   { .name = "MEM_LOAD_UOPS_L3_MISS_RETIRED",
2366     .desc   = "Load uops retired that missed the L3 (Precise Event)",
2367     .code = 0xd3,
2368     .cntmsk = 0xf,
2369     .ngrp = 1,
2370     .flags = INTEL_X86_PEBS,
2371     .modmsk = INTEL_V4_ATTRS,
2372     .numasks = LIBPFM_ARRAY_SIZE(hsw_mem_load_uops_l3_miss_retired),
2373     .umasks  = hsw_mem_load_uops_l3_miss_retired
2374   },
2375   { .name = "MEM_LOAD_UOPS_LLC_MISS_RETIRED",
2376     .desc   = "Load uops retired that missed the L3 (Precise Event)",
2377     .equiv = "MEM_LOAD_UOPS_L3_MISS_RETIRED",
2378     .code = 0xd3,
2379     .cntmsk = 0xf,
2380     .ngrp = 1,
2381     .flags = INTEL_X86_PEBS,
2382     .modmsk = INTEL_V4_ATTRS,
2383     .numasks = LIBPFM_ARRAY_SIZE(hsw_mem_load_uops_l3_miss_retired),
2384     .umasks  = hsw_mem_load_uops_l3_miss_retired
2385   },
2386   { .name = "MEM_LOAD_UOPS_RETIRED",
2387     .desc = "Retired load uops (Precise Event)",
2388     .code = 0xd1,
2389     .cntmsk = 0xf,
2390     .ngrp = 1,
2391     .flags = INTEL_X86_PEBS,
2392     .modmsk = INTEL_V4_ATTRS,
2393     .numasks = LIBPFM_ARRAY_SIZE(hsw_mem_load_uops_retired),
2394     .umasks  = hsw_mem_load_uops_retired
2395   },
2396   { .name = "MEM_TRANS_RETIRED",
2397     .desc   = "Memory transactions retired (Precise Event)",
2398     .code = 0xcd,
2399     .cntmsk = 0x8,
2400     .ngrp = 1,
2401     .flags = INTEL_X86_PEBS,
2402     .modmsk = INTEL_V4_ATTRS | _INTEL_X86_ATTR_LDLAT,
2403     .numasks = LIBPFM_ARRAY_SIZE(hsw_mem_trans_retired),
2404     .umasks  = hsw_mem_trans_retired
2405   },
2406   { .name = "MEM_UOPS_RETIRED",
2407     .desc = "Memory uops retired (Precise Event)",
2408     .code = 0xd0,
2409     .cntmsk = 0xf,
2410     .ngrp = 1,
2411     .flags = INTEL_X86_PEBS,
2412     .modmsk = INTEL_V4_ATTRS,
2413     .numasks = LIBPFM_ARRAY_SIZE(hsw_mem_uops_retired),
2414     .umasks  = hsw_mem_uops_retired
2415   },
2416   { .name = "MISALIGN_MEM_REF",
2417     .desc = "Misaligned memory references",
2418     .code = 0x5,
2419     .cntmsk = 0xff,
2420     .ngrp = 1,
2421     .modmsk = INTEL_V4_ATTRS,
2422     .numasks = LIBPFM_ARRAY_SIZE(hsw_misalign_mem_ref),
2423     .umasks  = hsw_misalign_mem_ref
2424   },
2425   { .name = "MOVE_ELIMINATION",
2426     .desc = "Move Elimination",
2427     .code = 0x58,
2428     .cntmsk = 0xff,
2429     .ngrp = 1,
2430     .modmsk = INTEL_V4_ATTRS,
2431     .numasks = LIBPFM_ARRAY_SIZE(hsw_move_elimination),
2432     .umasks  = hsw_move_elimination
2433   },
2434   { .name = "OFFCORE_REQUESTS",
2435     .desc = "Demand Data Read requests sent to uncore",
2436     .code = 0xb0,
2437     .cntmsk = 0xff,
2438     .ngrp = 1,
2439     .modmsk = INTEL_V4_ATTRS,
2440     .numasks = LIBPFM_ARRAY_SIZE(hsw_offcore_requests),
2441     .umasks  = hsw_offcore_requests
2442   },
2443   { .name = "OTHER_ASSISTS",
2444     .desc = "Software assist",
2445     .code = 0xc1,
2446     .cntmsk = 0xff,
2447     .ngrp = 1,
2448     .modmsk = INTEL_V4_ATTRS,
2449     .numasks = LIBPFM_ARRAY_SIZE(hsw_other_assists),
2450     .umasks  = hsw_other_assists
2451   },
2452   { .name = "RESOURCE_STALLS",
2453     .desc = "Cycles Allocation is stalled due to Resource Related reason",
2454     .code = 0xa2,
2455     .cntmsk = 0xff,
2456     .ngrp = 1,
2457     .modmsk = INTEL_V4_ATTRS,
2458     .numasks = LIBPFM_ARRAY_SIZE(hsw_resource_stalls),
2459     .umasks  = hsw_resource_stalls
2460   },
2461   { .name = "ROB_MISC_EVENTS",
2462     .desc = "ROB miscellaneous events",
2463     .code = 0xcc,
2464     .cntmsk = 0xff,
2465     .ngrp = 1,
2466     .modmsk = INTEL_V4_ATTRS,
2467     .numasks = LIBPFM_ARRAY_SIZE(hsw_rob_misc_events),
2468     .umasks  = hsw_rob_misc_events
2469   },
2470   { .name = "RS_EVENTS",
2471     .desc = "Reservation Station",
2472     .code = 0x5e,
2473     .cntmsk = 0xf,
2474     .ngrp = 1,
2475     .modmsk = INTEL_V4_ATTRS,
2476     .numasks = LIBPFM_ARRAY_SIZE(hsw_rs_events),
2477     .umasks  = hsw_rs_events
2478   },
2479   { .name = "RTM_RETIRED",
2480     .desc = "Restricted Transaction Memory execution (Precise Event)",
2481     .code = 0xc9,
2482     .cntmsk = 0xf,
2483     .ngrp = 1,
2484     .flags = INTEL_X86_PEBS,
2485     .modmsk = INTEL_V4_ATTRS,
2486     .numasks = LIBPFM_ARRAY_SIZE(hsw_rtm_retired),
2487     .umasks  = hsw_rtm_retired
2488   },
2489   { .name = "TLB_FLUSH",
2490     .desc   = "TLB flushes",
2491     .code = 0xbd,
2492     .cntmsk = 0xff,
2493     .ngrp = 1,
2494     .modmsk = INTEL_V4_ATTRS,
2495     .numasks = LIBPFM_ARRAY_SIZE(hsw_tlb_flush),
2496     .umasks  = hsw_tlb_flush
2497   },
2498   { .name = "UOPS_EXECUTED",
2499     .desc   = "Uops executed",
2500     .code = 0xb1,
2501     .cntmsk = 0xff,
2502     .ngrp = 1,
2503     .modmsk = INTEL_V4_ATTRS,
2504     .numasks = LIBPFM_ARRAY_SIZE(hsw_uops_executed),
2505     .umasks  = hsw_uops_executed
2506   },
2507   { .name = "LSD",
2508     .desc   = "Loop stream detector",
2509     .code = 0xa8,
2510     .cntmsk = 0xff,
2511     .ngrp = 1,
2512     .modmsk = INTEL_V4_ATTRS,
2513     .numasks = LIBPFM_ARRAY_SIZE(hsw_lsd),
2514     .umasks  = hsw_lsd,
2515   },
2516
2517   { .name = "UOPS_EXECUTED_PORT",
2518     .desc   = "Uops dispatch to specific ports",
2519     .code = 0xa1,
2520     .cntmsk = 0xff,
2521     .ngrp = 1,
2522     .modmsk = INTEL_V4_ATTRS,
2523     .numasks = LIBPFM_ARRAY_SIZE(hsw_uops_executed_port),
2524     .umasks  = hsw_uops_executed_port
2525   },
2526   { .name = "UOPS_ISSUED",
2527     .desc   = "Uops issued",
2528     .code = 0xe,
2529     .cntmsk = 0xff,
2530     .ngrp = 1,
2531     .modmsk = INTEL_V4_ATTRS,
2532     .numasks = LIBPFM_ARRAY_SIZE(hsw_uops_issued),
2533     .umasks  = hsw_uops_issued
2534   },
2535   { .name = "UOPS_RETIRED",
2536     .desc = "Uops retired (Precise Event)",
2537     .code = 0xc2,
2538     .cntmsk = 0xff,
2539     .ngrp = 1,
2540     .flags = INTEL_X86_PEBS,
2541     .modmsk = INTEL_V4_ATTRS,
2542     .numasks = LIBPFM_ARRAY_SIZE(hsw_uops_retired),
2543     .umasks  = hsw_uops_retired
2544   },
2545   { .name = "TX_MEM",
2546     .desc = "Transactional memory aborts",
2547     .code = 0x54,
2548     .cntmsk = 0xff,
2549     .ngrp = 1,
2550     .modmsk = INTEL_V4_ATTRS,
2551     .numasks = LIBPFM_ARRAY_SIZE(hsw_tx_mem),
2552     .umasks  = hsw_tx_mem,
2553   },
2554   { .name = "TX_EXEC",
2555     .desc = "Transactional execution",
2556     .code = 0x5d,
2557     .cntmsk = 0xff,
2558     .ngrp = 1,
2559     .modmsk = INTEL_V4_ATTRS,
2560     .numasks = LIBPFM_ARRAY_SIZE(hsw_tx_exec),
2561     .umasks  = hsw_tx_exec
2562   },
2563   { .name   = "OFFCORE_REQUESTS_OUTSTANDING",
2564     .desc   = "Outstanding offcore requests",
2565     .modmsk = INTEL_V4_ATTRS,
2566     .cntmsk = 0xff,
2567     .code = 0x60,
2568     .numasks = LIBPFM_ARRAY_SIZE(hsw_offcore_requests_outstanding),
2569     .ngrp = 1,
2570     .umasks = hsw_offcore_requests_outstanding,
2571   },
2572   { .name   = "ILD_STALL",
2573     .desc   = "Instruction Length Decoder stalls",
2574     .modmsk = INTEL_V4_ATTRS,
2575     .cntmsk = 0xff,
2576     .code = 0x87,
2577     .numasks = LIBPFM_ARRAY_SIZE(hsw_ild_stall),
2578     .ngrp = 1,
2579     .umasks = hsw_ild_stall,
2580   },
2581   { .name   = "PAGE_WALKER_LOADS",
2582     .desc   = "Page walker loads",
2583     .modmsk = INTEL_V4_ATTRS,
2584     .cntmsk = 0xf,
2585     .code = 0xbc,
2586     .numasks = LIBPFM_ARRAY_SIZE(hsw_page_walker_loads),
2587     .ngrp = 1,
2588     .umasks = hsw_page_walker_loads,
2589   },
2590   { .name   = "DSB2MITE_SWITCHES",
2591     .desc   = "Number of DSB to MITE switches",
2592     .modmsk = INTEL_V4_ATTRS,
2593     .cntmsk = 0xff,
2594     .code = 0xab,
2595     .numasks = LIBPFM_ARRAY_SIZE(hsw_dsb2mite_switches),
2596     .ngrp = 1,
2597     .umasks = hsw_dsb2mite_switches,
2598   },
2599   { .name   = "EPT",
2600     .desc   = "Extended page table",
2601     .modmsk = INTEL_V4_ATTRS,
2602     .cntmsk = 0xff,
2603     .code = 0x4f,
2604     .numasks = LIBPFM_ARRAY_SIZE(hsw_ept),
2605     .ngrp = 1,
2606     .umasks = hsw_ept,
2607   },
2608   { .name   = "ARITH",
2609     .desc   = "Counts arithmetic multiply operations",
2610     .modmsk = INTEL_V4_ATTRS,
2611     .cntmsk = 0xff,
2612     .code = 0x14,
2613     .numasks = LIBPFM_ARRAY_SIZE(hsw_arith),
2614     .ngrp = 1,
2615     .umasks = hsw_arith,
2616   },
2617   { .name   = "OFFCORE_REQUESTS_BUFFER",
2618     .desc   = "Offcore reqest buffer",
2619     .modmsk = INTEL_V4_ATTRS,
2620     .cntmsk = 0xff,
2621     .code = 0xb2,
2622     .numasks = LIBPFM_ARRAY_SIZE(hsw_offcore_requests_buffer),
2623     .ngrp = 1,
2624     .umasks = hsw_offcore_requests_buffer,
2625   },
2626   { .name   = "OFFCORE_RESPONSE_0",
2627     .desc   = "Offcore response event (must provide at least one request type and either any_response or any combination of supplier + snoop)",
2628     .modmsk = INTEL_V4_ATTRS,
2629     .cntmsk = 0xf,
2630     .code = 0x1b7,
2631     .flags= INTEL_X86_NHM_OFFCORE,
2632     .numasks = LIBPFM_ARRAY_SIZE(hsw_offcore_response),
2633     .ngrp = 3,
2634     .umasks = hsw_offcore_response,
2635   },
2636   { .name   = "OFFCORE_RESPONSE_1",
2637     .desc   = "Offcore response event (must provide at least one request type and either any_response or any combination of supplier + snoop)",
2638     .modmsk = INTEL_V4_ATTRS,
2639     .cntmsk = 0xf,
2640     .code = 0x1bb,
2641     .flags= INTEL_X86_NHM_OFFCORE,
2642     .numasks =  LIBPFM_ARRAY_SIZE(hsw_offcore_response),
2643     .ngrp = 3,
2644     .umasks = hsw_offcore_response, /* identical to actual umasks list for this event */
2645   },
2646 };