PAPI 7.1.0.0
Loading...
Searching...
No Matches
pfmlib_i386_p6.c
Go to the documentation of this file.
1/*
2 * pfmlib_i386_pm.c : support for the P6 processor family (family=6)
3 * incl. Pentium II, Pentium III, Pentium Pro, Pentium M
4 *
5 * Copyright (c) 2005-2007 Hewlett-Packard Development Company, L.P.
6 * Contributed by Stephane Eranian <eranian@hpl.hp.com>
7 *
8 * Permission is hereby granted, free of charge, to any person obtaining a copy
9 * of this software and associated documentation files (the "Software"), to deal
10 * in the Software without restriction, including without limitation the rights
11 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
12 * of the Software, and to permit persons to whom the Software is furnished to do so,
13 * subject to the following conditions:
14 *
15 * The above copyright notice and this permission notice shall be included in all
16 * copies or substantial portions of the Software.
17 *
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
19 * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
20 * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
21 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
22 * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
23 * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24 */
25#include <sys/types.h>
26#include <ctype.h>
27#include <string.h>
28#include <stdio.h>
29#include <stdlib.h>
30/* public headers */
32
33/* private headers */
34#include "pfmlib_priv.h" /* library private */
35#include "pfmlib_i386_p6_priv.h" /* architecture private */
36#include "i386_p6_events.h" /* event tables */
37
38/* let's define some handy shortcuts! */
39#define sel_event_mask perfsel.sel_event_mask
40#define sel_unit_mask perfsel.sel_unit_mask
41#define sel_usr perfsel.sel_usr
42#define sel_os perfsel.sel_os
43#define sel_edge perfsel.sel_edge
44#define sel_pc perfsel.sel_pc
45#define sel_int perfsel.sel_int
46#define sel_en perfsel.sel_en
47#define sel_inv perfsel.sel_inv
48#define sel_cnt_mask perfsel.sel_cnt_mask
49
50static char * pfm_i386_p6_get_event_name(unsigned int i);
53
54#define PFMLIB_I386_P6_HAS_COMBO(_e) ((i386_pe[_e].pme_flags & PFMLIB_I386_P6_UMASK_COMBO) != 0)
55
56#define PFMLIB_I386_P6_ALL_FLAGS \
57 (PFM_I386_P6_SEL_INV|PFM_I386_P6_SEL_EDGE)
58/*
59 * Description of the PMC register mappings use by
60 * this module.
61 * pfp_pmcs[].reg_num:
62 * 0 -> PMC0 -> PERFEVTSEL0 -> MSR @ 0x186
63 * 1 -> PMC1 -> PERFEVTSEL1 -> MSR @ 0x187
64 * pfp_pmds[].reg_num:
65 * 0 -> PMD0 -> PERFCTR0 -> MSR @ 0xc1
66 * 1 -> PMD1 -> PERFCTR1 -> MSR @ 0xc2
67 */
68#define I386_P6_SEL_BASE 0x186
69#define I386_P6_CTR_BASE 0xc1
70
71static void pfm_i386_p6_get_impl_counters(pfmlib_regmask_t *impl_counters);
72
73static int
75{
76 int ret, family;
77 char buffer[128];
78
79 ret = __pfm_getcpuinfo_attr("vendor_id", buffer, sizeof(buffer));
80 if (ret == -1)
81 return PFMLIB_ERR_NOTSUPP;
82
83 if (strcmp(buffer, "GenuineIntel"))
84 return PFMLIB_ERR_NOTSUPP;
85
86 ret = __pfm_getcpuinfo_attr("cpu family", buffer, sizeof(buffer));
87 if (ret == -1)
88 return PFMLIB_ERR_NOTSUPP;
89
90 family = atoi(buffer);
91
93}
94/*
95 * detect Pentium Pro
96 */
97static int
99{
100 int ret, model;
101 char buffer[128];
102
104 if (ret != PFMLIB_SUCCESS)
105 return ret;
106
107 ret = __pfm_getcpuinfo_attr("model", buffer, sizeof(buffer));
108 if (ret == -1)
109 return PFMLIB_ERR_NOTSUPP;
110
111 model = atoi(buffer);
112
113 if (model != 1)
114 return PFMLIB_ERR_NOTSUPP;
115
116 return PFMLIB_SUCCESS;
117}
118
119static int
121{
125
126 return PFMLIB_SUCCESS;
127}
128
129/*
130 * detect Pentium II
131 */
132static int
134{
135 int ret, model;
136 char buffer[128];
137
139 if (ret != PFMLIB_SUCCESS)
140 return ret;
141
142 ret = __pfm_getcpuinfo_attr("model", buffer, sizeof(buffer));
143 if (ret == -1)
144 return PFMLIB_ERR_NOTSUPP;
145
146 model = atoi(buffer);
147 switch(model) {
148 case 3: /* Pentium II */
149 case 5: /* Pentium II Deschutes */
150 case 6: /* Pentium II Mendocino */
151 break;
152 default:
153 return PFMLIB_ERR_NOTSUPP;
154 }
155 return PFMLIB_SUCCESS;
156}
157
158static int
160{
161
165 return PFMLIB_SUCCESS;
166}
167
168/*
169 * detect Pentium III
170 */
171static int
173{
174 int ret, model;
175 char buffer[128];
176
178 if (ret != PFMLIB_SUCCESS)
179 return ret;
180
181 ret = __pfm_getcpuinfo_attr("model", buffer, sizeof(buffer));
182 if (ret == -1)
183 return PFMLIB_ERR_NOTSUPP;
184
185 model = atoi(buffer);
186
187 switch(model) {
188 case 7: /* Pentium III Katmai */
189 case 8: /* Pentium III Coppermine */
190 case 10:/* Pentium III Cascades */
191 case 11:/* Pentium III Tualatin */
192 break;
193 default:
194 return PFMLIB_ERR_NOTSUPP;
195 }
196 return PFMLIB_SUCCESS;
197}
198
199static int
201{
205
206 return PFMLIB_SUCCESS;
207}
208
209/*
210 * detect Pentium M
211 */
212static int
214{
215 int ret, model;
216 char buffer[128];
217
219 if (ret != PFMLIB_SUCCESS)
220 return ret;
221
222 ret = __pfm_getcpuinfo_attr("model", buffer, sizeof(buffer));
223 if (ret == -1)
224 return PFMLIB_ERR_NOTSUPP;
225
226 model = atoi(buffer);
227 switch (model) {
228 case 9:
229 case 13:
230 break;
231 default:
232 return PFMLIB_ERR_NOTSUPP;
233 }
234
235 return PFMLIB_SUCCESS;
236}
237
238static int
240{
244
245 return PFMLIB_SUCCESS;
246}
247
248/*
249 * Automatically dispatch events to corresponding counters following constraints.
250 * Upon return the pfarg_regt structure is ready to be submitted to kernel
251 */
252static int
254{
255 pfmlib_i386_p6_input_param_t *param = mod_in;
259 pfmlib_reg_t *pc, *pd;
260 pfmlib_regmask_t impl_cntrs, avail_cntrs;
261 unsigned long plm;
262 unsigned int i, j, cnt, k, umask;
263 unsigned int assign[PMU_I386_P6_NUM_COUNTERS];
264
265 e = inp->pfp_events;
266 pc = outp->pfp_pmcs;
267 pd = outp->pfp_pmds;
268 cnt = inp->pfp_event_count;
269 cntrs = param ? param->pfp_i386_p6_counters : NULL;
270
271 if (PFMLIB_DEBUG()) {
272 for (j=0; j < cnt; j++) {
273 DPRINT("ev[%d]=%s\n", j, i386_pe[e[j].event].pme_name);
274 }
275 }
276
277 if (cnt > PMU_I386_P6_NUM_COUNTERS)
278 return PFMLIB_ERR_TOOMANY;
279
281 pfm_regmask_andnot(&avail_cntrs, &impl_cntrs, &inp->pfp_unavail_pmcs);
282
283 DPRINT("impl=0x%lx avail=0x%lx unavail=0x%lx\n", impl_cntrs.bits[0], avail_cntrs.bits[0], inp->pfp_unavail_pmcs.bits[0]);
284
285 for(j=0; j < cnt; j++) {
286 /*
287 * P6 only supports two priv levels for perf counters
288 */
289 if (e[j].plm & (PFM_PLM1|PFM_PLM2)) {
290 DPRINT("event=%d invalid plm=%d\n", e[j].event, e[j].plm);
291 return PFMLIB_ERR_INVAL;
292 }
293
294 if (cntrs && cntrs[j].flags & ~PFMLIB_I386_P6_ALL_FLAGS) {
295 DPRINT("event=%d invalid flags=0x%lx\n", e[j].event, e[j].flags);
296 return PFMLIB_ERR_INVAL;
297 }
298
299 /*
300 * check illegal unit masks combination
301 */
302 if (e[j].num_masks > 1 && PFMLIB_I386_P6_HAS_COMBO(e[j].event) == 0) {
303 DPRINT("event does not support unit mask combination\n");
304 return PFMLIB_ERR_FEATCOMB;
305 }
306 }
307 /*
308 * first pass: events for fixed counters
309 */
310 for(j=0; j < cnt; j++) {
311 if (i386_pe[e[j].event].pme_flags & PFMLIB_I386_P6_CTR0_ONLY) {
312 if (!pfm_regmask_isset(&avail_cntrs, 0))
313 return PFMLIB_ERR_NOASSIGN;
314 assign[j] = 0;
315 pfm_regmask_clr(&avail_cntrs, 0);
316 } else if (i386_pe[e[j].event].pme_flags & PFMLIB_I386_P6_CTR1_ONLY) {
317 if (!pfm_regmask_isset(&avail_cntrs, 1))
318 return PFMLIB_ERR_NOASSIGN;
319 assign[j] = 1;
320 pfm_regmask_clr(&avail_cntrs, 1);
321 }
322 }
323 /*
324 * second pass: events with no constraints
325 */
326 for (j=0, i=0; j < cnt ; j++ ) {
327 if (i386_pe[e[j].event].pme_flags & (PFMLIB_I386_P6_CTR0_ONLY|PFMLIB_I386_P6_CTR1_ONLY))
328 continue;
329
330 while (i < PMU_I386_P6_NUM_COUNTERS && !pfm_regmask_isset(&avail_cntrs, i))
331 i++;
333 return PFMLIB_ERR_NOASSIGN;
334 pfm_regmask_clr(&avail_cntrs, i);
335 assign[j] = i++;
336 }
337 /*
338 * final pass: assign value to registers
339 */
340 for (j=0; j < cnt ; j++) {
341 reg.val = 0; /* assume reserved bits are zeroed */
342
343 /* if plm is 0, then assume not specified per-event and use default */
344 plm = e[j].plm ? e[j].plm : inp->pfp_dfl_plm;
345
347 /*
348 * some events have only a single umask. We do not create
349 * specific umask entry in this case. The umask code is taken
350 * out of the (extended) event code (2nd byte)
351 */
352 umask = (i386_pe[e[j].event].pme_code >> 8) & 0xff;
353
354 for(k=0; k < e[j].num_masks; k++) {
355 umask |= i386_pe[e[j].event].pme_umasks[e[j].unit_masks[k]].pme_ucode;
356 }
357 reg.sel_unit_mask = umask;
358 reg.sel_usr = plm & PFM_PLM3 ? 1 : 0;
359 reg.sel_os = plm & PFM_PLM0 ? 1 : 0;
360 reg.sel_int = 1; /* force APIC int to 1 */
361 /*
362 * only perfevtsel0 has an enable bit (allows atomic start/stop)
363 */
364 if (assign[j] == 0)
365 reg.sel_en = 1; /* force enable bit to 1 */
366
367 if (cntrs) {
368 reg.sel_cnt_mask = cntrs[j].cnt_mask;
369 reg.sel_edge = cntrs[j].flags & PFM_I386_P6_SEL_EDGE ? 1 : 0;
370 reg.sel_inv = cntrs[j].flags & PFM_I386_P6_SEL_INV ? 1 : 0;
371 }
372
373 pc[j].reg_num = assign[j];
374 pc[j].reg_value = reg.val;
375 pc[j].reg_addr = I386_P6_SEL_BASE+assign[j];
376 pc[j].reg_alt_addr= I386_P6_SEL_BASE+assign[j];
377
378
379 pd[j].reg_num = assign[j];
380 pd[j].reg_addr = I386_P6_CTR_BASE+assign[j];
381 /* index to use with RDPMC */
382 pd[j].reg_alt_addr = assign[j];
383
384 __pfm_vbprintf("[PERFEVTSEL%u(pmc%u)=0x%lx emask=0x%x umask=0x%x os=%d usr=%d en=%d int=%d inv=%d edge=%d cnt_mask=%d] %s\n",
385 assign[j],
386 assign[j],
387 reg.val,
388 reg.sel_event_mask,
389 reg.sel_unit_mask,
390 reg.sel_os,
391 reg.sel_usr,
392 reg.sel_en,
393 reg.sel_int,
394 reg.sel_inv,
395 reg.sel_edge,
396 reg.sel_cnt_mask,
397 i386_pe[e[j].event].pme_name);
398
399 __pfm_vbprintf("[PMC%u(pmd%u)]\n", pd[j].reg_num, pd[j].reg_num);
400 }
401 /*
402 * add perfsel0 if not used. This is required as it holds
403 * the enable bit for all counters
404 */
405 if (pfm_regmask_isset(&avail_cntrs, 0)) {
406 reg.val = 0;
407 reg.sel_en = 1; /* force enable bit to 1 */
408 pc[j].reg_num = 0;
409 pc[j].reg_value = reg.val;
412 j++;
413
414 __pfm_vbprintf("[PERFEVTSEL0(pmc0)=0x%lx] required for enabling counters\n", reg.val);
415 }
416 /* number of evtsel registers programmed */
417 outp->pfp_pmc_count = j;
418 outp->pfp_pmd_count = cnt;
419
420 return PFMLIB_SUCCESS;
421}
422
423static int
424pfm_i386_p6_dispatch_events(pfmlib_input_param_t *inp, void *model_in, pfmlib_output_param_t *outp, void *model_out)
425{
427
428 if (inp->pfp_dfl_plm & (PFM_PLM1|PFM_PLM2)) {
429 DPRINT("invalid plm=%x\n", inp->pfp_dfl_plm);
430 return PFMLIB_ERR_INVAL;
431 }
432 return pfm_i386_p6_dispatch_counters(inp, mod_in, outp);
433}
434
435static int
436pfm_i386_p6_get_event_code(unsigned int i, unsigned int cnt, int *code)
437{
438 if (cnt != PFMLIB_CNT_FIRST && cnt > 2)
439 return PFMLIB_ERR_INVAL;
440
441 *code = i386_pe[i].pme_code;
442
443 return PFMLIB_SUCCESS;
444}
445
446static void
448{
449 unsigned int i;
450
451 memset(counters, 0, sizeof(*counters));
452
453 if (i386_pe[j].pme_flags & PFMLIB_I386_P6_CTR0_ONLY) {
454 pfm_regmask_set(counters, 0);
455 } else if (i386_pe[j].pme_flags & PFMLIB_I386_P6_CTR1_ONLY) {
456 pfm_regmask_set(counters, 1);
457 } else {
458 for(i=0; i < PMU_I386_P6_NUM_COUNTERS; i++)
459 pfm_regmask_set(counters, i);
460 }
461}
462
463static void
465{
466 unsigned int i = 0;
467
468 /* all pmcs are contiguous */
469 for(i=0; i < PMU_I386_P6_NUM_PERFSEL; i++)
470 pfm_regmask_set(impl_pmcs, i);
471}
472
473static void
475{
476 unsigned int i = 0;
477
478 /* all pmds are contiguous */
479 for(i=0; i < PMU_I386_P6_NUM_PERFCTR; i++)
480 pfm_regmask_set(impl_pmds, i);
481}
482
483static void
485{
486 unsigned int i = 0;
487
488 /* counting pmds are contiguous */
489 for(i=0; i < PMU_I386_P6_NUM_COUNTERS; i++)
490 pfm_regmask_set(impl_counters, i);
491}
492
493static void
495{
497}
498
499static char *
501{
502 return i386_pe[i].pme_name;
503}
504
505static int
506pfm_i386_p6_get_event_description(unsigned int ev, char **str)
507{
508 char *s;
509 s = i386_pe[ev].pme_desc;
510 if (s) {
511 *str = strdup(s);
512 } else {
513 *str = NULL;
514 }
515 return PFMLIB_SUCCESS;
516}
517
518static char *
519pfm_i386_p6_get_event_mask_name(unsigned int ev, unsigned int midx)
520{
521 return i386_pe[ev].pme_umasks[midx].pme_uname;
522}
523
524static int
525pfm_i386_p6_get_event_mask_desc(unsigned int ev, unsigned int midx, char **str)
526{
527 char *s;
528
529 s = i386_pe[ev].pme_umasks[midx].pme_udesc;
530 if (s) {
531 *str = strdup(s);
532 } else {
533 *str = NULL;
534 }
535 return PFMLIB_SUCCESS;
536}
537
538static unsigned int
540{
541 return i386_pe[ev].pme_numasks;
542}
543
544static int
545pfm_i386_p6_get_event_mask_code(unsigned int ev, unsigned int midx, unsigned int *code)
546{
547 *code = i386_pe[ev].pme_umasks[midx].pme_ucode;
548 return PFMLIB_SUCCESS;
549}
550
551static int
553{
555 return PFMLIB_SUCCESS;
556
557}
558
559static int
561{
563 return PFMLIB_SUCCESS;
564}
565/* Pentium II support */
567 .pmu_name = "Intel Pentium II",
568 .pmu_type = PFMLIB_INTEL_PII_PMU,
569 .pme_count = PME_I386_PII_EVENT_COUNT,
570 .pmc_count = PMU_I386_P6_NUM_PERFSEL,
571 .pmd_count = PMU_I386_P6_NUM_PERFCTR,
572 .num_cnt = PMU_I386_P6_NUM_COUNTERS,
573 .get_event_code = pfm_i386_p6_get_event_code,
574 .get_event_name = pfm_i386_p6_get_event_name,
575 .get_event_counters = pfm_i386_p6_get_event_counters,
576 .dispatch_events = pfm_i386_p6_dispatch_events,
577 .pmu_detect = pfm_i386_p6_detect_pii,
578 .pmu_init = pfm_i386_p6_init_pii,
579 .get_impl_pmcs = pfm_i386_p6_get_impl_perfsel,
580 .get_impl_pmds = pfm_i386_p6_get_impl_perfctr,
581 .get_impl_counters = pfm_i386_p6_get_impl_counters,
582 .get_hw_counter_width = pfm_i386_p6_get_hw_counter_width,
583 .get_event_desc = pfm_i386_p6_get_event_description,
584 .get_num_event_masks = pfm_i386_p6_get_num_event_masks,
585 .get_event_mask_name = pfm_i386_p6_get_event_mask_name,
586 .get_event_mask_code = pfm_i386_p6_get_event_mask_code,
587 .get_event_mask_desc = pfm_i386_p6_get_event_mask_desc,
588 .get_cycle_event = pfm_i386_p6_get_cycle_event,
589 .get_inst_retired_event = pfm_i386_p6_get_inst_retired
590};
591
592/* Generic P6 processor support (not incl. Pentium M) */
594 .pmu_name = "Intel P6 Processor Family",
595 .pmu_type = PFMLIB_I386_P6_PMU,
596 .pme_count = PME_I386_PIII_EVENT_COUNT,
597 .pmc_count = PMU_I386_P6_NUM_PERFSEL,
598 .pmd_count = PMU_I386_P6_NUM_PERFCTR,
599 .num_cnt = PMU_I386_P6_NUM_COUNTERS,
600 .get_event_code = pfm_i386_p6_get_event_code,
601 .get_event_name = pfm_i386_p6_get_event_name,
602 .get_event_counters = pfm_i386_p6_get_event_counters,
603 .dispatch_events = pfm_i386_p6_dispatch_events,
604 .pmu_detect = pfm_i386_p6_detect_piii,
605 .pmu_init = pfm_i386_p6_init_piii,
606 .get_impl_pmcs = pfm_i386_p6_get_impl_perfsel,
607 .get_impl_pmds = pfm_i386_p6_get_impl_perfctr,
608 .get_impl_counters = pfm_i386_p6_get_impl_counters,
609 .get_hw_counter_width = pfm_i386_p6_get_hw_counter_width,
610 .get_event_desc = pfm_i386_p6_get_event_description,
611 .get_num_event_masks = pfm_i386_p6_get_num_event_masks,
612 .get_event_mask_name = pfm_i386_p6_get_event_mask_name,
613 .get_event_mask_code = pfm_i386_p6_get_event_mask_code,
614 .get_event_mask_desc = pfm_i386_p6_get_event_mask_desc,
615 .get_cycle_event = pfm_i386_p6_get_cycle_event,
616 .get_inst_retired_event = pfm_i386_p6_get_inst_retired
617};
618
620 .pmu_name = "Intel Pentium Pro",
621 .pmu_type = PFMLIB_INTEL_PPRO_PMU,
622 .pme_count = PME_I386_PPRO_EVENT_COUNT,
623 .pmc_count = PMU_I386_P6_NUM_PERFSEL,
624 .pmd_count = PMU_I386_P6_NUM_PERFCTR,
625 .num_cnt = PMU_I386_P6_NUM_COUNTERS,
626 .get_event_code = pfm_i386_p6_get_event_code,
627 .get_event_name = pfm_i386_p6_get_event_name,
628 .get_event_counters = pfm_i386_p6_get_event_counters,
629 .dispatch_events = pfm_i386_p6_dispatch_events,
630 .pmu_detect = pfm_i386_p6_detect_ppro,
631 .pmu_init = pfm_i386_p6_init_ppro,
632 .get_impl_pmcs = pfm_i386_p6_get_impl_perfsel,
633 .get_impl_pmds = pfm_i386_p6_get_impl_perfctr,
634 .get_impl_counters = pfm_i386_p6_get_impl_counters,
635 .get_hw_counter_width = pfm_i386_p6_get_hw_counter_width,
636 .get_event_desc = pfm_i386_p6_get_event_description,
637 .get_num_event_masks = pfm_i386_p6_get_num_event_masks,
638 .get_event_mask_name = pfm_i386_p6_get_event_mask_name,
639 .get_event_mask_code = pfm_i386_p6_get_event_mask_code,
640 .get_event_mask_desc = pfm_i386_p6_get_event_mask_desc,
641 .get_cycle_event = pfm_i386_p6_get_cycle_event,
642 .get_inst_retired_event = pfm_i386_p6_get_inst_retired
643};
644
645
646/* Pentium M support */
648 .pmu_name = "Intel Pentium M",
649 .pmu_type = PFMLIB_I386_PM_PMU,
650 .pme_count = PME_I386_PM_EVENT_COUNT,
651 .pmc_count = PMU_I386_P6_NUM_PERFSEL,
652 .pmd_count = PMU_I386_P6_NUM_PERFCTR,
653 .num_cnt = PMU_I386_P6_NUM_COUNTERS,
654 .get_event_code = pfm_i386_p6_get_event_code,
655 .get_event_name = pfm_i386_p6_get_event_name,
656 .get_event_counters = pfm_i386_p6_get_event_counters,
657 .dispatch_events = pfm_i386_p6_dispatch_events,
658 .pmu_detect = pfm_i386_p6_detect_pm,
659 .pmu_init = pfm_i386_p6_init_pm,
660 .get_impl_pmcs = pfm_i386_p6_get_impl_perfsel,
661 .get_impl_pmds = pfm_i386_p6_get_impl_perfctr,
662 .get_impl_counters = pfm_i386_p6_get_impl_counters,
663 .get_hw_counter_width = pfm_i386_p6_get_hw_counter_width,
664 .get_event_desc = pfm_i386_p6_get_event_description,
665 .get_num_event_masks = pfm_i386_p6_get_num_event_masks,
666 .get_event_mask_name = pfm_i386_p6_get_event_mask_name,
667 .get_event_mask_code = pfm_i386_p6_get_event_mask_code,
668 .get_event_mask_desc = pfm_i386_p6_get_event_mask_desc,
669 .get_cycle_event = pfm_i386_p6_get_cycle_event,
670 .get_inst_retired_event = pfm_i386_p6_get_inst_retired
671};
int i
double s
Definition: byte_profile.c:36
static pme_i386_p6_entry_t i386_ppro_pe[]
#define PME_I386_PM_CPU_CLK_UNHALTED
#define PME_I386_PM_INST_RETIRED
#define PME_I386_PII_INST_RETIRED
#define PME_I386_PIII_CPU_CLK_UNHALTED
#define PME_I386_PPRO_EVENT_COUNT
#define PME_I386_PII_EVENT_COUNT
static pme_i386_p6_entry_t i386_pII_pe[]
static pme_i386_p6_entry_t i386_pIII_pe[]
#define PME_I386_PPRO_CPU_CLK_UNHALTED
#define PME_I386_PII_CPU_CLK_UNHALTED
#define PME_I386_PIII_EVENT_COUNT
#define PME_I386_PM_EVENT_COUNT
#define PME_I386_PIII_INST_RETIRED
static pme_i386_p6_entry_t i386_pm_pe[]
#define PME_I386_PPRO_INST_RETIRED
#define PFMLIB_ERR_FEATCOMB
Definition: pfmlib.h:292
#define PFM_PLM2
Definition: pfmlib.h:52
#define PFMLIB_I386_PM_PMU
Definition: pfmlib.h:232
static int pfm_regmask_set(pfmlib_regmask_t *h, unsigned int b)
Definition: pfmlib.h:321
#define PFMLIB_SUCCESS
Definition: pfmlib.h:283
#define PFM_PLM3
Definition: pfmlib.h:53
#define PFMLIB_INTEL_PPRO_PMU
Definition: pfmlib.h:235
#define PFMLIB_INTEL_PII_PMU
Definition: pfmlib.h:236
#define PFMLIB_ERR_INVAL
Definition: pfmlib.h:285
static int pfm_regmask_clr(pfmlib_regmask_t *h, unsigned int b)
Definition: pfmlib.h:332
static int pfm_regmask_andnot(pfmlib_regmask_t *dst, pfmlib_regmask_t *h1, pfmlib_regmask_t *h2)
Definition: pfmlib.h:386
#define PFMLIB_ERR_TOOMANY
Definition: pfmlib.h:295
#define PFM_PLM0
Definition: pfmlib.h:50
static int pfm_regmask_isset(pfmlib_regmask_t *h, unsigned int b)
Definition: pfmlib.h:313
#define PFMLIB_ERR_NOASSIGN
Definition: pfmlib.h:288
#define PFM_PLM1
Definition: pfmlib.h:51
#define PFMLIB_I386_P6_PMU
Definition: pfmlib.h:229
#define PFMLIB_ERR_NOTSUPP
Definition: pfmlib.h:284
int model
Definition: pfmlib_amd64.c:86
int family
Definition: pfmlib_amd64.c:85
static int pfm_i386_p6_get_event_description(unsigned int ev, char **str)
static void pfm_i386_p6_get_impl_perfctr(pfmlib_regmask_t *impl_pmds)
static int pfm_i386_p6_get_event_code(unsigned int i, unsigned int cnt, int *code)
static int pfm_i386_p6_dispatch_counters(pfmlib_input_param_t *inp, pfmlib_i386_p6_input_param_t *mod_in, pfmlib_output_param_t *outp)
static void pfm_i386_p6_get_impl_perfsel(pfmlib_regmask_t *impl_pmcs)
static char * pfm_i386_p6_get_event_mask_name(unsigned int ev, unsigned int midx)
static void pfm_i386_p6_get_event_counters(unsigned int j, pfmlib_regmask_t *counters)
static int pfm_i386_p6_get_inst_retired(pfmlib_event_t *e)
static int i386_p6_inst_retired_event
static void pfm_i386_p6_get_hw_counter_width(unsigned int *width)
pfm_pmu_support_t i386_pii_support
static int pfm_i386_p6_detect_ppro(void)
static unsigned int pfm_i386_p6_get_num_event_masks(unsigned int ev)
pfm_pmu_support_t i386_pm_support
static int pfm_i386_p6_detect_pm(void)
static int pfm_i386_p6_dispatch_events(pfmlib_input_param_t *inp, void *model_in, pfmlib_output_param_t *outp, void *model_out)
#define PFMLIB_I386_P6_ALL_FLAGS
static char * pfm_i386_p6_get_event_name(unsigned int i)
static int i386_p6_cycle_event
static int pfm_i386_p6_init_piii(void)
pfm_pmu_support_t i386_ppro_support
static int pfm_i386_detect_common(void)
pfm_pmu_support_t i386_p6_support
static int pfm_i386_p6_get_event_mask_desc(unsigned int ev, unsigned int midx, char **str)
static void pfm_i386_p6_get_impl_counters(pfmlib_regmask_t *impl_counters)
static int pfm_i386_p6_init_pii(void)
static int pfm_i386_p6_init_ppro(void)
#define PFMLIB_I386_P6_HAS_COMBO(_e)
static int pfm_i386_p6_detect_piii(void)
#define I386_P6_CTR_BASE
static int pfm_i386_p6_get_cycle_event(pfmlib_event_t *e)
static int pfm_i386_p6_get_event_mask_code(unsigned int ev, unsigned int midx, unsigned int *code)
static pme_i386_p6_entry_t * i386_pe
#define I386_P6_SEL_BASE
static int pfm_i386_p6_detect_pii(void)
static int pfm_i386_p6_init_pm(void)
#define PMU_I386_P6_COUNTER_WIDTH
#define PFM_I386_P6_SEL_INV
#define PMU_I386_P6_NUM_COUNTERS
#define PFM_I386_P6_SEL_EDGE
#define PMU_I386_P6_NUM_PERFCTR
#define PMU_I386_P6_NUM_PERFSEL
#define PFMLIB_I386_P6_CTR0_ONLY
#define PFMLIB_I386_P6_CTR1_ONLY
int __pfm_getcpuinfo_attr(const char *attr, char *ret_buf, size_t maxlen)
void __pfm_vbprintf(const char *fmt,...)
Definition: pfmlib_priv.c:52
#define DPRINT(fmt, a...)
Definition: pfmlib_priv.h:90
#define PFMLIB_DEBUG()
Definition: pfmlib_priv.h:76
#define PFMLIB_CNT_FIRST
Definition: pfmlib_priv.h:62
unsigned int num_masks
Definition: pfmlib.h:90
unsigned int plm
Definition: pfmlib.h:87
unsigned int unit_masks[PFMLIB_MAX_MASKS_PER_EVENT]
Definition: pfmlib.h:89
unsigned int event
Definition: pfmlib.h:86
pfm_i386_p6_cnt_mask_t cnt_mask
pfmlib_i386_p6_counter_t pfp_i386_p6_counters[PMU_I386_P6_NUM_COUNTERS]
unsigned int pfp_dfl_plm
Definition: pfmlib.h:110
pfmlib_regmask_t pfp_unavail_pmcs
Definition: pfmlib.h:114
pfmlib_event_t pfp_events[PFMLIB_MAX_PMCS]
Definition: pfmlib.h:113
unsigned int pfp_event_count
Definition: pfmlib.h:109
pfmlib_reg_t pfp_pmds[PFMLIB_MAX_PMDS]
Definition: pfmlib.h:130
pfmlib_reg_t pfp_pmcs[PFMLIB_MAX_PMCS]
Definition: pfmlib.h:129
unsigned int pfp_pmc_count
Definition: pfmlib.h:127
unsigned int pfp_pmd_count
Definition: pfmlib.h:128
unsigned long long reg_value
Definition: pfmlib.h:98
unsigned int reg_num
Definition: pfmlib.h:100
unsigned long reg_alt_addr
Definition: pfmlib.h:102
unsigned long long reg_addr
Definition: pfmlib.h:99
pfmlib_regmask_bits_t bits[PFMLIB_REG_BV]
Definition: pfmlib.h:76
unsigned int pme_code
unsigned int pme_numasks
char * pme_name
pme_i386_p6_umask_t pme_umasks[PFMLIB_I386_P6_MAX_UMASK]
char * pme_desc
unsigned long sel_en
unsigned long sel_int
unsigned long sel_os
unsigned long sel_unit_mask
unsigned long sel_usr
unsigned long sel_cnt_mask
unsigned long sel_event_mask
unsigned long sel_edge
unsigned long sel_inv