xref: /freebsd/lib/libpmc/pmc.3 (revision 80f30b733bb45d4e372ba1bd83182272f8c10fdb)
1bcbe65a8SJoseph Koshy.\" Copyright (c) 2003-2008 Joseph Koshy.  All rights reserved.
2ebccf1e3SJoseph Koshy.\"
3ebccf1e3SJoseph Koshy.\" Redistribution and use in source and binary forms, with or without
4ebccf1e3SJoseph Koshy.\" modification, are permitted provided that the following conditions
5ebccf1e3SJoseph Koshy.\" are met:
6ebccf1e3SJoseph Koshy.\" 1. Redistributions of source code must retain the above copyright
7ebccf1e3SJoseph Koshy.\"    notice, this list of conditions and the following disclaimer.
8ebccf1e3SJoseph Koshy.\" 2. Redistributions in binary form must reproduce the above copyright
9ebccf1e3SJoseph Koshy.\"    notice, this list of conditions and the following disclaimer in the
10ebccf1e3SJoseph Koshy.\"    documentation and/or other materials provided with the distribution.
11ebccf1e3SJoseph Koshy.\"
12ebccf1e3SJoseph Koshy.\" This software is provided by Joseph Koshy ``as is'' and
13ebccf1e3SJoseph Koshy.\" any express or implied warranties, including, but not limited to, the
14ebccf1e3SJoseph Koshy.\" implied warranties of merchantability and fitness for a particular purpose
15ebccf1e3SJoseph Koshy.\" are disclaimed.  in no event shall Joseph Koshy be liable
16ebccf1e3SJoseph Koshy.\" for any direct, indirect, incidental, special, exemplary, or consequential
17ebccf1e3SJoseph Koshy.\" damages (including, but not limited to, procurement of substitute goods
18ebccf1e3SJoseph Koshy.\" or services; loss of use, data, or profits; or business interruption)
19ebccf1e3SJoseph Koshy.\" however caused and on any theory of liability, whether in contract, strict
20ebccf1e3SJoseph Koshy.\" liability, or tort (including negligence or otherwise) arising in any way
21ebccf1e3SJoseph Koshy.\" out of the use of this software, even if advised of the possibility of
22ebccf1e3SJoseph Koshy.\" such damage.
23ebccf1e3SJoseph Koshy.\"
24ebccf1e3SJoseph Koshy.\" $FreeBSD$
25ebccf1e3SJoseph Koshy.\"
2624f2c3f3SJoseph Koshy.Dd September 16, 2008
27ebccf1e3SJoseph Koshy.Os
28ebccf1e3SJoseph Koshy.Dt PMC 3
29ebccf1e3SJoseph Koshy.Sh NAME
30c89d1cf5SJoseph Koshy.Nm pmc
31c89d1cf5SJoseph Koshy.Nd library for accessing hardware performance monitoring counters
32ebccf1e3SJoseph Koshy.Sh LIBRARY
33ebccf1e3SJoseph Koshy.Lb libpmc
34ebccf1e3SJoseph Koshy.Sh SYNOPSIS
35ebccf1e3SJoseph Koshy.In pmc.h
36ebccf1e3SJoseph Koshy.Sh DESCRIPTION
37ebccf1e3SJoseph KoshyThe
38c89d1cf5SJoseph Koshy.Lb libpmc
39c89d1cf5SJoseph Koshyprovides a programming interface that allows applications to use
40c89d1cf5SJoseph Koshyhardware performance counters to gather performance data about
41c89d1cf5SJoseph Koshyspecific processes or for the system as a whole.
42c89d1cf5SJoseph KoshyThe library is implemented using the lower-level facilities offered by
43c89d1cf5SJoseph Koshythe
44ebccf1e3SJoseph Koshy.Xr hwpmc 4
45c89d1cf5SJoseph Koshydriver.
46c89d1cf5SJoseph Koshy.Ss Key Concepts
47c89d1cf5SJoseph KoshyPerformance monitoring counters (PMCs) are represented by the library
48c89d1cf5SJoseph Koshyusing a software abstraction.
49c89d1cf5SJoseph KoshyThese
50c89d1cf5SJoseph Koshy.Dq abstract
51c89d1cf5SJoseph KoshyPMCs can have one two scopes:
52c89d1cf5SJoseph Koshy.Bl -bullet
53c89d1cf5SJoseph Koshy.It
54c89d1cf5SJoseph KoshySystem scope.
55c89d1cf5SJoseph KoshyThese PMCs measure events in a whole-system manner, i.e., independent
56c89d1cf5SJoseph Koshyof the currently executing thread.
57c89d1cf5SJoseph KoshySystem scope PMCs are allocated on specific CPUs and do not
58c89d1cf5SJoseph Koshymigrate between CPUs.
59c89d1cf5SJoseph KoshyNon-privileged process are allowed to allocate system scope PMCs if the
60c89d1cf5SJoseph Koshy.Xr hwpmc 4
61c89d1cf5SJoseph Koshysysctl tunable:
62c89d1cf5SJoseph Koshy.Va security.bsd.unprivileged_syspmcs
63c89d1cf5SJoseph Koshyis non-zero.
64c89d1cf5SJoseph Koshy.It
65c89d1cf5SJoseph KoshyProcess scope.
66c89d1cf5SJoseph KoshyThese PMCs only measure hardware events when the processes they are
67c89d1cf5SJoseph Koshyattached to are executing on a CPU.
68c89d1cf5SJoseph KoshyIn an SMP system, process scope PMCs migrate between CPUs along with
69c89d1cf5SJoseph Koshytheir target processes.
70c89d1cf5SJoseph Koshy.El
71ebccf1e3SJoseph Koshy.Pp
72c89d1cf5SJoseph KoshyOrthogonal to PMC scope, PMCs may be allocated in one of two
73c89d1cf5SJoseph Koshyoperational modes:
74c89d1cf5SJoseph Koshy.Bl -bullet
75c89d1cf5SJoseph Koshy.It
76c89d1cf5SJoseph KoshyCounting PMCs measure events according to their scope
77c89d1cf5SJoseph Koshy(system or process).
78c89d1cf5SJoseph KoshyThe application needs to explicitly read these counters
79c89d1cf5SJoseph Koshyto retrieve their value.
80c89d1cf5SJoseph Koshy.It
81c89d1cf5SJoseph KoshySampling PMCs cause the CPU to be periodically interrupted
82c89d1cf5SJoseph Koshyand information about its state of execution to be collected.
83c89d1cf5SJoseph KoshySampling PMCs are used to profile specific processes and kernel
84c89d1cf5SJoseph Koshythreads or to profile the system as a whole.
85c89d1cf5SJoseph Koshy.El
86c89d1cf5SJoseph Koshy.Pp
87c89d1cf5SJoseph KoshyThe scope and operational mode for a software PMC are specified at
88c89d1cf5SJoseph KoshyPMC allocation time.
89c89d1cf5SJoseph KoshyAn application is allowed to allocate multiple PMCs subject
90c89d1cf5SJoseph Koshyto availability of hardware resources.
91c89d1cf5SJoseph Koshy.Pp
92c89d1cf5SJoseph KoshyThe library uses human-readable strings to name the event being
93c89d1cf5SJoseph Koshymeasured by hardware.
94c89d1cf5SJoseph KoshyThe syntax used for specifying a hardware event along with additional
95c89d1cf5SJoseph Koshyevent specific qualifiers (if any) is described in detail in section
96ebccf1e3SJoseph Koshy.Sx "EVENT SPECIFIERS"
97ebccf1e3SJoseph Koshybelow.
98ebccf1e3SJoseph Koshy.Pp
99c89d1cf5SJoseph KoshyPMCs are associated with the process that allocated them and
100c89d1cf5SJoseph Koshywill be automatically reclaimed by the system when the process exits.
101c89d1cf5SJoseph KoshyAdditionally, process-scope PMCs have to be attached to one or more
102c89d1cf5SJoseph Koshytarget processes before they can perform measurements.
103c89d1cf5SJoseph KoshyA process-scope PMC may be attached to those target processes
104c89d1cf5SJoseph Koshythat its owner process would otherwise be permitted to debug.
105c89d1cf5SJoseph KoshyAn owner process may attach PMCs to itself allowing
106c89d1cf5SJoseph Koshyit to measure its own behavior.
107c89d1cf5SJoseph KoshyAdditionally, on some machine architectures, such self-attached PMCs
108c89d1cf5SJoseph Koshymay be read cheaply using specialized instructions supported by the
109c89d1cf5SJoseph Koshyprocessor.
110ebccf1e3SJoseph Koshy.Pp
111c89d1cf5SJoseph KoshyCertain kinds of PMCs require that a log file be configured before
112c89d1cf5SJoseph Koshythey may be started.
113c89d1cf5SJoseph KoshyThese include:
114c89d1cf5SJoseph Koshy.Bl -bullet -compact
115c89d1cf5SJoseph Koshy.It
116c89d1cf5SJoseph KoshySystem scope sampling PMCs.
117c89d1cf5SJoseph Koshy.It
118c89d1cf5SJoseph KoshyProcess scope sampling PMCs.
119c89d1cf5SJoseph Koshy.It
120c89d1cf5SJoseph KoshyProcess scope counting PMCs that have been configured to report PMC
121c89d1cf5SJoseph Koshyreadings on process context switches or process exits.
122c89d1cf5SJoseph Koshy.El
123c89d1cf5SJoseph KoshyUpto one log file may be configured per owner process.
124c89d1cf5SJoseph KoshyEvents logged to a log file may be subsequently analyzed using the
125c89d1cf5SJoseph Koshy.Xr pmclog 3
126c89d1cf5SJoseph Koshyfamily of functions.
127c89d1cf5SJoseph Koshy.Ss Supported CPUs
128c89d1cf5SJoseph KoshyThe CPUs known to the PMC library are named by the
129c89d1cf5SJoseph Koshy.Vt "enum pmc_cputype"
130c89d1cf5SJoseph Koshyenumeration.
131c89d1cf5SJoseph KoshySupported CPUs include:
13280f30b73SJoseph Koshy.Bl -tag -width "Li PMC_CPU_INTEL_CORE2" -compact
13380f30b73SJoseph Koshy.It Li PMC_CPU_AMD_K7
134c89d1cf5SJoseph Koshy.Tn "AMD Athlon"
135c89d1cf5SJoseph KoshyCPUs.
13680f30b73SJoseph Koshy.It Li PMC_CPU_AMD_K8
137c89d1cf5SJoseph Koshy.Tn "AMD Athlon64"
138c89d1cf5SJoseph KoshyCPUs.
13980f30b73SJoseph Koshy.It Li PMC_CPU_INTEL_ATOM
14080f30b73SJoseph Koshy.Tn Intel
14180f30b73SJoseph Koshy.Tn Atom
14280f30b73SJoseph KoshyCPUs and other CPUs conforming to version 3 of the
14380f30b73SJoseph Koshy.Tn Intel
14480f30b73SJoseph Koshyperformance measurement architecture.
14580f30b73SJoseph Koshy.It Li PMC_CPU_INTEL_CORE
14680f30b73SJoseph Koshy.Tn Intel
14780f30b73SJoseph Koshy.Tn Core Solo
14880f30b73SJoseph Koshyand
14980f30b73SJoseph Koshy.Tn Core Duo
15080f30b73SJoseph KoshyCPUs, and other CPUs conforming to version 1 of the
15180f30b73SJoseph Koshy.Tn Intel
15280f30b73SJoseph Koshyperformance measurement architecture.
15380f30b73SJoseph Koshy.It Li PMC_CPU_INTEL_CORE2
15480f30b73SJoseph Koshy.Tn Intel
15580f30b73SJoseph Koshy.Tn "Core2 Solo" ,
15680f30b73SJoseph Koshy.Tn "Core2 Duo"
15780f30b73SJoseph Koshyand
15880f30b73SJoseph Koshy.Tn "Core2 Extreme"
15980f30b73SJoseph KoshyCPUs, and other CPUs conforming to version 2 of the
16080f30b73SJoseph Koshy.Tn Intel
16180f30b73SJoseph Koshyperformance measurement architecture.
16280f30b73SJoseph Koshy.It Li PMC_CPU_INTEL_P5
163bcbe65a8SJoseph Koshy.Tn Intel
164bcbe65a8SJoseph Koshy.Tn "Pentium"
165bcbe65a8SJoseph KoshyCPUs.
16680f30b73SJoseph Koshy.It Li PMC_CPU_INTEL_P6
167c89d1cf5SJoseph Koshy.Tn Intel
168c89d1cf5SJoseph Koshy.Tn "Pentium Pro"
169c89d1cf5SJoseph KoshyCPUs.
17080f30b73SJoseph Koshy.It Li PMC_CPU_INTEL_PII
171c89d1cf5SJoseph Koshy.Tn "Intel Pentium II"
172c89d1cf5SJoseph KoshyCPUs.
17380f30b73SJoseph Koshy.It Li PMC_CPU_INTEL_PIII
174c89d1cf5SJoseph Koshy.Tn "Intel Pentium III"
175c89d1cf5SJoseph KoshyCPUs.
17680f30b73SJoseph Koshy.It Li PMC_CPU_INTEL_PIV
177c89d1cf5SJoseph Koshy.Tn "Intel Pentium 4"
178c89d1cf5SJoseph KoshyCPUs.
17980f30b73SJoseph Koshy.It Li PMC_CPU_INTEL_PM
18080f30b73SJoseph Koshy.Tn "Intel Pentium M"
18180f30b73SJoseph KoshyCPUs.
182c89d1cf5SJoseph Koshy.El
183c89d1cf5SJoseph Koshy.Ss Supported PMCs
184c89d1cf5SJoseph KoshyPMC supported by this library are named by the
185c89d1cf5SJoseph Koshy.Vt enum pmc_class
186c89d1cf5SJoseph Koshyenumeration.
187c89d1cf5SJoseph KoshySupported PMC kinds include:
18880f30b73SJoseph Koshy.Bl -tag -width "Li PMC_CLASS_IA_FIXED" -compact
18980f30b73SJoseph Koshy.It Li PMC_CLASS_IA
19080f30b73SJoseph KoshyProgrammable hardware counters present in CPUs conforming to the
19180f30b73SJoseph Koshy.Tn Intel
19280f30b73SJoseph Koshyperformance measurement architecture version 1 and later.
19380f30b73SJoseph Koshy.It Li PMC_CLASS_IA_FIXED
19480f30b73SJoseph KoshyFixed function hardwre counters presents in CPUs conforming to the
19580f30b73SJoseph Koshy.Tn Intel
19680f30b73SJoseph Koshyperformance measurement architecture version 2 and later.
19780f30b73SJoseph Koshy.It Li PMC_CLASS_K7
198c89d1cf5SJoseph KoshyProgrammable hardware counters present in
199c89d1cf5SJoseph Koshy.Tn "AMD Athlon"
200c89d1cf5SJoseph KoshyCPUs.
20180f30b73SJoseph Koshy.It Li PMC_CLASS_K8
202c89d1cf5SJoseph KoshyProgrammable hardware counters present in
203c89d1cf5SJoseph Koshy.Tn "AMD Athlon64"
204c89d1cf5SJoseph KoshyCPUs.
20580f30b73SJoseph Koshy.It Li PMC_CLASS_P4
20624f2c3f3SJoseph KoshyProgrammable hardware counters present in
20724f2c3f3SJoseph Koshy.Tn "Intel Pentium 4"
20824f2c3f3SJoseph KoshyCPUs.
20980f30b73SJoseph Koshy.It Li PMC_CLASS_P5
210bcbe65a8SJoseph KoshyProgrammable hardware counters present in
211bcbe65a8SJoseph Koshy.Tn Intel
212bcbe65a8SJoseph Koshy.Tn Pentium
213bcbe65a8SJoseph KoshyCPUs.
21480f30b73SJoseph Koshy.It Li PMC_CLASS_P6
215c89d1cf5SJoseph KoshyProgrammable hardware counters present in
216c89d1cf5SJoseph Koshy.Tn Intel
217c89d1cf5SJoseph Koshy.Tn "Pentium Pro" ,
218c89d1cf5SJoseph Koshy.Tn "Pentium II" ,
219c89d1cf5SJoseph Koshy.Tn "Pentium III" ,
220c89d1cf5SJoseph Koshy.Tn "Celeron" ,
221ebccf1e3SJoseph Koshyand
222c89d1cf5SJoseph Koshy.Tn "Pentium M"
223c89d1cf5SJoseph KoshyCPUs.
22480f30b73SJoseph Koshy.It Li PMC_CLASS_TSC
22524f2c3f3SJoseph KoshyThe timestamp counter on i386 and amd64 architecture CPUs.
226c89d1cf5SJoseph Koshy.El
227c89d1cf5SJoseph Koshy.Ss PMC Capabilities
228ebccf1e3SJoseph Koshy.Pp
229c89d1cf5SJoseph KoshyCapabilities of performance monitoring hardware are denoted using
230c89d1cf5SJoseph Koshythe
231c89d1cf5SJoseph Koshy.Vt "enum pmc_caps"
232c89d1cf5SJoseph Koshyenumeration.
233c89d1cf5SJoseph KoshySupported capabilities include:
23480f30b73SJoseph Koshy.Bl -tag -width "Li PMC_CAP_INTERRUPT" -compact
23580f30b73SJoseph Koshy.It Li PMC_CAP_CASCADE
23680f30b73SJoseph KoshyThe ability to cascade counters.
23780f30b73SJoseph Koshy.It Li PMC_CAP_EDGE
238c89d1cf5SJoseph KoshyThe ability to count negated to asserted transitions of the hardware
239c89d1cf5SJoseph Koshyconditions being probed for.
24080f30b73SJoseph Koshy.It Li PMC_CAP_INTERRUPT
241c89d1cf5SJoseph KoshyThe ability to interrupt the CPU.
24280f30b73SJoseph Koshy.It Li PMC_CAP_INVERT
243c89d1cf5SJoseph KoshyThe ability to invert the sense of the hardware conditions being
244c89d1cf5SJoseph Koshymeasured.
24580f30b73SJoseph Koshy.It Li PMC_CAP_READ
246c89d1cf5SJoseph KoshyPMC hardware allows the CPU to read performance counters.
24780f30b73SJoseph Koshy.It Li PMC_CAP_QUALIFIER
248c89d1cf5SJoseph KoshyThe hardware allows monitored to be further qualified in some
249c89d1cf5SJoseph Koshysystem dependent way.
25080f30b73SJoseph Koshy.It Li PMC_CAP_PRECISE
25180f30b73SJoseph KoshyThe ability to perform precise sampling.
25280f30b73SJoseph Koshy.It Li PMC_CAP_SYSTEM
253c89d1cf5SJoseph KoshyThe ability to restrict counting of hardware events to when the CPU is
254c89d1cf5SJoseph Koshyrunning privileged code.
25580f30b73SJoseph Koshy.It Li PMC_CAP_THRESHOLD
256c89d1cf5SJoseph KoshyThe ability to ignore simultaneous hardware events below a
257c89d1cf5SJoseph Koshyprogrammable threshold.
25880f30b73SJoseph Koshy.It Li PMC_CAP_USER
259c89d1cf5SJoseph KoshyThe ability to restrict counting of hardware events to those when the
260c89d1cf5SJoseph KoshyCPU is running unprivileged code.
26180f30b73SJoseph Koshy.It Li PMC_CAP_WRITE
262c89d1cf5SJoseph KoshyPMC hardware allows CPUs write to counters.
263c89d1cf5SJoseph Koshy.El
264c89d1cf5SJoseph Koshy.Ss Functional Grouping
265c89d1cf5SJoseph KoshyThis section contains a brief overview of the available functionality
266c89d1cf5SJoseph Koshyin the PMC library.
267c89d1cf5SJoseph KoshyEach function listed here is described further in its own manual page.
268c89d1cf5SJoseph Koshy.Bl -tag -width indent
269c89d1cf5SJoseph Koshy.It Administration
270c89d1cf5SJoseph Koshy.Bl -tag -compact
271c89d1cf5SJoseph Koshy.It Fn pmc_disable , Fn pmc_enable
272c89d1cf5SJoseph KoshyAdministratively disable (enable) specific performance monitoring
273c89d1cf5SJoseph Koshycounter hardware.
274c89d1cf5SJoseph KoshyCounters that are disabled will not be available to applications to
275c89d1cf5SJoseph Koshyuse.
276c89d1cf5SJoseph Koshy.El
277c89d1cf5SJoseph Koshy.It "Convenience Functions"
278c89d1cf5SJoseph Koshy.Bl -tag -compact
279c89d1cf5SJoseph Koshy.It Fn pmc_event_names_of_class
280c89d1cf5SJoseph KoshyReturns a list of event names supported by a given PMC type.
281c89d1cf5SJoseph Koshy.It Fn pmc_name_of_capability
282c89d1cf5SJoseph KoshyConvert a
283c89d1cf5SJoseph Koshy.Dv PMC_CAP_*
284c89d1cf5SJoseph Koshyflag to a human-readable string.
285c89d1cf5SJoseph Koshy.It Fn pmc_name_of_class
286c89d1cf5SJoseph KoshyConvert a
287c89d1cf5SJoseph Koshy.Dv PMC_CLASS_*
288c89d1cf5SJoseph Koshyconstant to a human-readable string.
289c89d1cf5SJoseph Koshy.It Fn pmc_name_of_cputype
290c89d1cf5SJoseph KoshyReturn a human-readable name for a CPU type.
291c89d1cf5SJoseph Koshy.It Fn pmc_name_of_disposition
292c89d1cf5SJoseph KoshyReturn a human-readable string describing a PMC's disposition.
293c89d1cf5SJoseph Koshy.It Fn pmc_name_of_event
294c89d1cf5SJoseph KoshyConvert a numeric event code to a human-readable string.
295c89d1cf5SJoseph Koshy.It Fn pmc_name_of_mode
296c89d1cf5SJoseph KoshyConvert a
297c89d1cf5SJoseph Koshy.Dv PMC_MODE_*
298c89d1cf5SJoseph Koshyconstant to a human-readable name.
299c89d1cf5SJoseph Koshy.It Fn pmc_name_of_state
300c89d1cf5SJoseph KoshyReturn a human-readable string describing a PMC's current state.
301c89d1cf5SJoseph Koshy.El
302c89d1cf5SJoseph Koshy.It "Library Initialization"
303c89d1cf5SJoseph Koshy.Bl -tag -compact
304c89d1cf5SJoseph Koshy.It Fn pmc_init
305c89d1cf5SJoseph KoshyInitialize the library.
306c89d1cf5SJoseph KoshyThis function must be called before any other library function.
307c89d1cf5SJoseph Koshy.El
308c89d1cf5SJoseph Koshy.It "Log File Handling"
309c89d1cf5SJoseph Koshy.Bl -tag -compact
310c89d1cf5SJoseph Koshy.It Fn pmc_configure_logfile
311c89d1cf5SJoseph KoshyConfigure a log file for
312c89d1cf5SJoseph Koshy.Xr hwpmc 4
313c89d1cf5SJoseph Koshyto write logged events to.
314c89d1cf5SJoseph Koshy.It Fn pmc_flush_logfile
315c89d1cf5SJoseph KoshyFlush all pending log data in
316c89d1cf5SJoseph Koshy.Xr hwpmc 4 Ns Ap s
317c89d1cf5SJoseph Koshybuffers.
318c89d1cf5SJoseph Koshy.It Fn pmc_writelog
319c89d1cf5SJoseph KoshyAppend arbitrary user data to the current log file.
320c89d1cf5SJoseph Koshy.El
321c89d1cf5SJoseph Koshy.It "PMC Management"
322c89d1cf5SJoseph Koshy.Bl -tag -compact
323c89d1cf5SJoseph Koshy.It Fn pmc_allocate , Fn pmc_release
324c89d1cf5SJoseph KoshyAllocate (free) a PMC.
325c89d1cf5SJoseph Koshy.It Fn pmc_attach , Fn pmc_detach
326c89d1cf5SJoseph KoshyAttach (detach) a process scope PMC to a target.
327c89d1cf5SJoseph Koshy.It Fn pmc_read , Fn pmc_write , Fn pmc_rw
328c89d1cf5SJoseph KoshyRead (write) a value from (to) a PMC.
329c89d1cf5SJoseph Koshy.It Fn pmc_start , Fn pmc_stop
330c89d1cf5SJoseph KoshyStart (stop) a software PMC.
331c89d1cf5SJoseph Koshy.It Fn pmc_set
332c89d1cf5SJoseph KoshySet the reload value for a sampling PMC.
333c89d1cf5SJoseph Koshy.El
334c89d1cf5SJoseph Koshy.It "Queries"
335c89d1cf5SJoseph Koshy.Bl -tag -compact
336c89d1cf5SJoseph Koshy.It Fn pmc_capabilities
337c89d1cf5SJoseph KoshyRetrieve the capabilities for a given PMC.
338c89d1cf5SJoseph Koshy.It Fn pmc_cpuinfo
339c89d1cf5SJoseph KoshyRetrieve information about the CPUs and PMC hardware present in the
340c89d1cf5SJoseph Koshysystem.
341c89d1cf5SJoseph Koshy.It Fn pmc_get_driver_stats
342c89d1cf5SJoseph KoshyRetrieve statistics maintained by
343c89d1cf5SJoseph Koshy.Xr hwpmc 4 .
344c89d1cf5SJoseph Koshy.It Fn pmc_ncpu
345c89d1cf5SJoseph KoshyDetermine the number of CPUs in the system.
346c89d1cf5SJoseph Koshy.It Fn pmc_npmc
347c89d1cf5SJoseph KoshyReturn the number of hardware PMCs present in a given CPU.
348c89d1cf5SJoseph Koshy.It Fn pmc_pmcinfo
349c89d1cf5SJoseph KoshyReturn information about the state of a given CPU's PMCs.
350c89d1cf5SJoseph Koshy.It Fn pmc_width
351c89d1cf5SJoseph KoshyDetermine the width of a hardware counter in bits.
352c89d1cf5SJoseph Koshy.El
353c89d1cf5SJoseph Koshy.It "x86 Architecture Specific API"
354c89d1cf5SJoseph Koshy.Bl -tag -compact
355c89d1cf5SJoseph Koshy.It Fn pmc_get_msr
356c89d1cf5SJoseph KoshyReturns the processor model specific register number
357c89d1cf5SJoseph Koshyassociated with
358c5153e19SJoseph Koshy.Fa pmc .
359c89d1cf5SJoseph KoshyApplications may then use the x86
360c89d1cf5SJoseph Koshy.Ic RDPMC
361c89d1cf5SJoseph Koshyinstruction to directly read the contents of the PMC.
362c89d1cf5SJoseph Koshy.El
363c89d1cf5SJoseph Koshy.El
3649abe909bSRuslan Ermilov.Ss Signal Handling Requirements
365ebccf1e3SJoseph KoshyApplications using PMCs are required to handle the following signals:
366c89d1cf5SJoseph Koshy.Bl -tag -width ".Dv SIGBUS"
3679abe909bSRuslan Ermilov.It Dv SIGBUS
368ebccf1e3SJoseph KoshyWhen the
369ebccf1e3SJoseph Koshy.Xr hwpmc 4
370ebccf1e3SJoseph Koshymodule is unloaded using
371ebccf1e3SJoseph Koshy.Xr kldunload 8 ,
372ebccf1e3SJoseph Koshyprocesses that have PMCs allocated to them will be sent a
3739abe909bSRuslan Ermilov.Dv SIGBUS
3749abe909bSRuslan Ermilovsignal.
3759abe909bSRuslan Ermilov.It Dv SIGIO
376f263522aSJoseph KoshyThe
377f263522aSJoseph Koshy.Xr hwpmc 4
3789abe909bSRuslan Ermilovdriver will send a PMC owning process a
3799abe909bSRuslan Ermilov.Dv SIGIO
3809abe909bSRuslan Ermilovsignal if:
381f263522aSJoseph Koshy.Bl -bullet
382f263522aSJoseph Koshy.It
383f263522aSJoseph KoshyIf any process-mode PMC allocated by it loses all its
384f263522aSJoseph Koshytarget processes.
385f263522aSJoseph Koshy.It
386f263522aSJoseph KoshyIf the driver encounters an error when writing log data to a
387f263522aSJoseph Koshyconfigured log file.
388f263522aSJoseph KoshyThis error may be retrieved by a subsequent call to
389f263522aSJoseph Koshy.Fn pmc_flush_logfile .
390f263522aSJoseph Koshy.El
391ebccf1e3SJoseph Koshy.El
392c89d1cf5SJoseph Koshy.Ss Typical Program Flow
393c89d1cf5SJoseph Koshy.Bl -enum
394c89d1cf5SJoseph Koshy.It
395c89d1cf5SJoseph KoshyAn application would first invoke function
396c89d1cf5SJoseph Koshy.Fn pmc_init
397c89d1cf5SJoseph Koshyto allow the library to initialize itself.
398c89d1cf5SJoseph Koshy.It
399c89d1cf5SJoseph KoshySignal handling would then be set up.
400c89d1cf5SJoseph Koshy.It
401c89d1cf5SJoseph KoshyNext the application would allocate the PMCs it desires using function
402c89d1cf5SJoseph Koshy.Fn pmc_allocate .
403c89d1cf5SJoseph Koshy.It
404c89d1cf5SJoseph KoshyInitial values for PMCs may be set using function
405c89d1cf5SJoseph Koshy.Fn pmc_set .
406c89d1cf5SJoseph Koshy.It
407c89d1cf5SJoseph KoshyIf a log file is necessary for the PMCs to work, it would
408c89d1cf5SJoseph Koshybe configured using function
409c89d1cf5SJoseph Koshy.Fn pmc_configure_logfile .
410c89d1cf5SJoseph Koshy.It
411c89d1cf5SJoseph KoshyProcess scope PMCs would then be attached to their target processes
412c89d1cf5SJoseph Koshyusing function
413c89d1cf5SJoseph Koshy.Fn pmc_attach .
414c89d1cf5SJoseph Koshy.It
415c89d1cf5SJoseph KoshyThe PMCs would then be started using function
416c89d1cf5SJoseph Koshy.Fn pmc_start .
417c89d1cf5SJoseph Koshy.It
418c89d1cf5SJoseph KoshyOnce started, the values of counting PMCs may be read using function
419c89d1cf5SJoseph Koshy.Fn pmc_start .
420c89d1cf5SJoseph KoshyFor PMCs that write events to the log file, this logged data would be
421c89d1cf5SJoseph Koshyread and parsed using the
422c89d1cf5SJoseph Koshy.Xr pmclog 3
423c89d1cf5SJoseph Koshyfamily of functions.
424c89d1cf5SJoseph Koshy.It
425c89d1cf5SJoseph KoshyPMCs are stopped using function
426c89d1cf5SJoseph Koshy.Fn pmc_stop ,
427c89d1cf5SJoseph Koshyand process scope PMCs are detached from their targets using
428c89d1cf5SJoseph Koshyfunction
429c89d1cf5SJoseph Koshy.Fn pmc_detach .
430c89d1cf5SJoseph Koshy.It
431c89d1cf5SJoseph KoshyBefore the process exits, its may release its PMCs using function
432c89d1cf5SJoseph Koshy.Fn pmc_release .
433c89d1cf5SJoseph KoshyAny configured log file may be closed using function
434c89d1cf5SJoseph Koshy.Fn pmc_configure_logfile .
435c89d1cf5SJoseph Koshy.El
436ebccf1e3SJoseph Koshy.Sh EVENT SPECIFIERS
437ebccf1e3SJoseph KoshyEvent specifiers are strings comprising of an event name, followed by
438ebccf1e3SJoseph Koshyoptional parameters modifying the semantics of the hardware event
439ebccf1e3SJoseph Koshybeing probed.
4400b844226SJoseph KoshyEvent names are PMC architecture dependent, but the PMC library defines
4410b844226SJoseph Koshymachine independent aliases for commonly used events.
442ebccf1e3SJoseph Koshy.Ss Event Name Aliases
44324f2c3f3SJoseph KoshyEvent name aliases are PMC-independent names for commonly used events.
444ebccf1e3SJoseph KoshyThe following aliases are known to this version of the
445110e1704SRuslan Ermilov.Nm pmc
446ebccf1e3SJoseph Koshylibrary:
447ebccf1e3SJoseph Koshy.Bl -tag -width indent
448ebccf1e3SJoseph Koshy.It Li branches
449ebccf1e3SJoseph KoshyMeasure the number of branches retired.
450ebccf1e3SJoseph Koshy.It Li branch-mispredicts
451ebccf1e3SJoseph KoshyMeasure the number of retired branches that were mispredicted.
452ebccf1e3SJoseph Koshy.It Li cycles
453ebccf1e3SJoseph KoshyMeasure processor cycles.
454ebccf1e3SJoseph KoshyThis event is implemented using the processor's Time Stamp Counter
455ebccf1e3SJoseph Koshyregister.
456ebccf1e3SJoseph Koshy.It Li dc-misses
457ebccf1e3SJoseph KoshyMeasure the number of data cache misses.
458ebccf1e3SJoseph Koshy.It Li ic-misses
459ebccf1e3SJoseph KoshyMeasure the number of instruction cache misses.
460ebccf1e3SJoseph Koshy.It Li instructions
461ebccf1e3SJoseph KoshyMeasure the number of instructions retired.
462ebccf1e3SJoseph Koshy.It Li interrupts
463ebccf1e3SJoseph KoshyMeasure the number of interrupts seen.
464177a2f22SJoseph Koshy.It Li unhalted-cycles
465177a2f22SJoseph KoshyMeasure the number of cycles the processor is not in a halted
466177a2f22SJoseph Koshyor sleep state.
467ebccf1e3SJoseph Koshy.El
468ebccf1e3SJoseph Koshy.Pp
46924f2c3f3SJoseph Koshy.Ss PMC Architecture Dependent Events
47024f2c3f3SJoseph KoshyPMC architecture dependent event specifiers are described in their own
47124f2c3f3SJoseph Koshyindividual manual pages:
47224f2c3f3SJoseph Koshy.Bl -column " PMC_CLASS_TSC " "MANUAL PAGE "
47324f2c3f3SJoseph Koshy.It Em "PMC Class"      Ta Em "Manual Page"
47424f2c3f3SJoseph Koshy.It Li PMC_CLASS_K7     Ta Xr pmc.k7 3
47524f2c3f3SJoseph Koshy.It Li PMC_CLASS_K8     Ta Xr pmc.k8 3
47624f2c3f3SJoseph Koshy.It Li PMC_CLASS_P4     Ta Xr pmc.p4 3
47724f2c3f3SJoseph Koshy.It Li PMC_CLASS_P5     Ta Xr pmc.p5 3
47824f2c3f3SJoseph Koshy.It Li PMC_CLASS_P6     Ta Xr pmc.p6 3
47924f2c3f3SJoseph Koshy.It Li PMC_CLASS_TSC    Ta Xr pmc.tsc 3
480ebccf1e3SJoseph Koshy.El
4815138c36aSJoseph Koshy.Sh COMPATIBILITY
4825138c36aSJoseph KoshyThe interface between the
483110e1704SRuslan Ermilov.Nm pmc
4845138c36aSJoseph Koshylibrary and the
4855138c36aSJoseph Koshy.Xr hwpmc 4
4865138c36aSJoseph Koshydriver is intended to be private to the implementation and may
4875138c36aSJoseph Koshychange.
4885138c36aSJoseph KoshyIn order to ease forward compatibility with future versions of the
4895138c36aSJoseph Koshy.Xr hwpmc 4
4905138c36aSJoseph Koshydriver, applications are urged to dynamically link with the
491110e1704SRuslan Ermilov.Nm pmc
4925138c36aSJoseph Koshylibrary.
4935138c36aSJoseph Koshy.Pp
4945138c36aSJoseph KoshyThe
495110e1704SRuslan Ermilov.Nm pmc
4965138c36aSJoseph KoshyAPI is
4975138c36aSJoseph Koshy.Ud
498ebccf1e3SJoseph Koshy.Sh SEE ALSO
49924f2c3f3SJoseph Koshy.Xr pmc.k7 3 ,
50024f2c3f3SJoseph Koshy.Xr pmc.k8 3 ,
50124f2c3f3SJoseph Koshy.Xr pmc.p4 3 ,
50224f2c3f3SJoseph Koshy.Xr pmc.p5 3 ,
50324f2c3f3SJoseph Koshy.Xr pmc.p6 3 ,
50424f2c3f3SJoseph Koshy.Xr pmc.tsc 3 ,
505f263522aSJoseph Koshy.Xr pmclog 3 ,
506ebccf1e3SJoseph Koshy.Xr hwpmc 4 ,
507ebccf1e3SJoseph Koshy.Xr pmccontrol 8 ,
508ebccf1e3SJoseph Koshy.Xr pmcstat 8
5095138c36aSJoseph Koshy.Sh HISTORY
5105138c36aSJoseph KoshyThe
511110e1704SRuslan Ermilov.Nm pmc
5125138c36aSJoseph Koshylibrary first appeared in
5135138c36aSJoseph Koshy.Fx 6.0 .
514c89d1cf5SJoseph Koshy.Sh AUTHORS
515c89d1cf5SJoseph KoshyThe
516c89d1cf5SJoseph Koshy.Lb libpmc
517c89d1cf5SJoseph Koshylibrary was written by
518c89d1cf5SJoseph Koshy.An "Joseph Koshy"
519c89d1cf5SJoseph Koshy.Aq jkoshy@FreeBSD.org .
520