PERFMON isn't operational on amd64
John Baldwin
jhb at freebsd.org
Tue Jul 27 19:42:15 UTC 2010
On Tuesday, July 27, 2010 3:06:50 pm Bruce Evans wrote:
> On Tue, 27 Jul 2010, John Baldwin wrote:
>
> > On Tuesday, July 27, 2010 8:43:00 am pluknet wrote:
> >> Hi.
> >>
> >> What is a status of "options PERFMON" on amd64?
> >> ...
> >> Looking at cvs I see amd64/include/perfmon.h was never here.
> >
> > PERFMON in general is obsoleted by hwpmc(4) which is far more useful and
> > featureful. It should probably just be axed.
>
> Nothing should just be axed.
>
> hwpmc(4) is far too featureful for me, yet perfmon(4) still does things
> for me that hwpmc cannot do:
> - from userland, without using the library, try undocumented unnamed
> counters. There are a few useful ones for k7. E.g.:
> 0xc8 (k8-fr-retired-near-returns) and
> 0xc9 (k8-fr-retired-near-returns-mispredicted)
> are k8-only according to hwpmc and amd docs, but also work on my k7
> (after a 4-line fix for perfmon on kx).
I believe this is not too terribly hard to fix. For the two above I think
this will suffice (manpage would also need to be updated for a full patch):
(I think the misordering in pmc_events.h is required to preserve userland
ABI.)
Index: hwpmc_amd.c
===================================================================
--- hwpmc_amd.c (revision 210547)
+++ hwpmc_amd.c (working copy)
@@ -137,6 +137,8 @@
{ PMC_EV_K7_RETIRED_TAKEN_BRANCHES_MISPREDICTED, 0xC5, 0 },
{ PMC_EV_K7_RETIRED_FAR_CONTROL_TRANSFERS, 0xC6, 0 },
{ PMC_EV_K7_RETIRED_RESYNC_BRANCHES, 0xC7, 0 },
+ { PMC_EV_K7_RETIRED_NEAR_RETURNS, 0xC8, 0 },
+ { PMC_EV_K7_RETIRED_NEAR_RETURNS_MISPREDICTED, 0xC9, 0 },
{ PMC_EV_K7_INTERRUPTS_MASKED_CYCLES, 0xCD, 0 },
{ PMC_EV_K7_INTERRUPTS_MASKED_WHILE_PENDING_CYCLES, 0xCE, 0 },
{ PMC_EV_K7_HARDWARE_INTERRUPTS, 0xCF, 0 },
Index: pmc_events.h
===================================================================
--- pmc_events.h (revision 210547)
+++ pmc_events.h (working copy)
@@ -74,10 +74,12 @@
__PMC_EV(K7, RETIRED_RESYNC_BRANCHES) \
__PMC_EV(K7, INTERRUPTS_MASKED_CYCLES) \
__PMC_EV(K7, INTERRUPTS_MASKED_WHILE_PENDING_CYCLES) \
-__PMC_EV(K7, HARDWARE_INTERRUPTS)
+__PMC_EV(K7, HARDWARE_INTERRUPTS) \
+__PMC_EV(K7, RETIRED_NEAR_RETURNS) \
+__PMC_EV(K7, RETIRED_NEAR_RETURNS_MISPREDICTED)
#define PMC_EV_K7_FIRST PMC_EV_K7_DC_ACCESSES
-#define PMC_EV_K7_LAST PMC_EV_K7_HARDWARE_INTERRUPTS
+#define PMC_EV_K7_LAST PMC_EV_K7_RETIRED_NEAR_RETURNS_MISPREDICTED
/*
> - in the kernel count, events at the level of individual functions, non-
> statistically using high resolution kernel profiling. This may result
> in more time spent counting than doing useful work, but provides
> high resolution.
I would rather us provide this via hwpmc(4). perfmon(4) does not support
programmable events on modern Intel CPUs nor does it support non-x86 CPUs.
--
John Baldwin
More information about the freebsd-amd64
mailing list