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.\" 12026dbd29SChristian Brueffer.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 13026dbd29SChristian Brueffer.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 14026dbd29SChristian Brueffer.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 15026dbd29SChristian Brueffer.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 16026dbd29SChristian Brueffer.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 17026dbd29SChristian Brueffer.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 18026dbd29SChristian Brueffer.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 19026dbd29SChristian Brueffer.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 20026dbd29SChristian Brueffer.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 21026dbd29SChristian Brueffer.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 22026dbd29SChristian Brueffer.\" SUCH DAMAGE. 23ebccf1e3SJoseph Koshy.\" 24ebccf1e3SJoseph Koshy.\" $FreeBSD$ 25ebccf1e3SJoseph Koshy.\" 26*7a40330bSEnji Cooper.Dd April 6, 2017 27ebccf1e3SJoseph Koshy.Dt PMC 3 28aa12cea2SUlrich Spörlein.Os 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 51c2025a76SJoel DahlPMCs can have 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: 1149ee2158bSJoel Dahl.Bl -bullet 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 1239ee2158bSJoel Dahl.Pp 124c89d1cf5SJoseph KoshyUp to one log file may be configured per owner process. 125c89d1cf5SJoseph KoshyEvents logged to a log file may be subsequently analyzed using the 126c89d1cf5SJoseph Koshy.Xr pmclog 3 127c89d1cf5SJoseph Koshyfamily of functions. 128c89d1cf5SJoseph Koshy.Ss Supported CPUs 129c89d1cf5SJoseph KoshyThe CPUs known to the PMC library are named by the 130c89d1cf5SJoseph Koshy.Vt "enum pmc_cputype" 131c89d1cf5SJoseph Koshyenumeration. 132c89d1cf5SJoseph KoshySupported CPUs include: 1339ee2158bSJoel Dahl.Pp 13480f30b73SJoseph Koshy.Bl -tag -width "Li PMC_CPU_INTEL_CORE2" -compact 13580f30b73SJoseph Koshy.It Li PMC_CPU_AMD_K7 136c89d1cf5SJoseph Koshy.Tn "AMD Athlon" 137c89d1cf5SJoseph KoshyCPUs. 13880f30b73SJoseph Koshy.It Li PMC_CPU_AMD_K8 139c89d1cf5SJoseph Koshy.Tn "AMD Athlon64" 140c89d1cf5SJoseph KoshyCPUs. 14180f30b73SJoseph Koshy.It Li PMC_CPU_INTEL_ATOM 14280f30b73SJoseph Koshy.Tn Intel 14380f30b73SJoseph Koshy.Tn Atom 14480f30b73SJoseph KoshyCPUs and other CPUs conforming to version 3 of the 14580f30b73SJoseph Koshy.Tn Intel 14680f30b73SJoseph Koshyperformance measurement architecture. 14780f30b73SJoseph Koshy.It Li PMC_CPU_INTEL_CORE 14880f30b73SJoseph Koshy.Tn Intel 14980f30b73SJoseph Koshy.Tn Core Solo 15080f30b73SJoseph Koshyand 15180f30b73SJoseph Koshy.Tn Core Duo 15280f30b73SJoseph KoshyCPUs, and other CPUs conforming to version 1 of the 15380f30b73SJoseph Koshy.Tn Intel 15480f30b73SJoseph Koshyperformance measurement architecture. 15580f30b73SJoseph Koshy.It Li PMC_CPU_INTEL_CORE2 15680f30b73SJoseph Koshy.Tn Intel 15780f30b73SJoseph Koshy.Tn "Core2 Solo" , 15880f30b73SJoseph Koshy.Tn "Core2 Duo" 15980f30b73SJoseph Koshyand 16080f30b73SJoseph Koshy.Tn "Core2 Extreme" 16180f30b73SJoseph KoshyCPUs, and other CPUs conforming to version 2 of the 16280f30b73SJoseph Koshy.Tn Intel 16380f30b73SJoseph Koshyperformance measurement architecture. 16480f30b73SJoseph Koshy.It Li PMC_CPU_INTEL_P5 165bcbe65a8SJoseph Koshy.Tn Intel 166bcbe65a8SJoseph Koshy.Tn "Pentium" 167bcbe65a8SJoseph KoshyCPUs. 16880f30b73SJoseph Koshy.It Li PMC_CPU_INTEL_P6 169c89d1cf5SJoseph Koshy.Tn Intel 170c89d1cf5SJoseph Koshy.Tn "Pentium Pro" 171c89d1cf5SJoseph KoshyCPUs. 17280f30b73SJoseph Koshy.It Li PMC_CPU_INTEL_PII 173c89d1cf5SJoseph Koshy.Tn "Intel Pentium II" 174c89d1cf5SJoseph KoshyCPUs. 17580f30b73SJoseph Koshy.It Li PMC_CPU_INTEL_PIII 176c89d1cf5SJoseph Koshy.Tn "Intel Pentium III" 177c89d1cf5SJoseph KoshyCPUs. 17880f30b73SJoseph Koshy.It Li PMC_CPU_INTEL_PIV 179c89d1cf5SJoseph Koshy.Tn "Intel Pentium 4" 180c89d1cf5SJoseph KoshyCPUs. 18180f30b73SJoseph Koshy.It Li PMC_CPU_INTEL_PM 18280f30b73SJoseph Koshy.Tn "Intel Pentium M" 18380f30b73SJoseph KoshyCPUs. 184c89d1cf5SJoseph Koshy.El 185c89d1cf5SJoseph Koshy.Ss Supported PMCs 186c89d1cf5SJoseph KoshyPMC supported by this library are named by the 187c89d1cf5SJoseph Koshy.Vt enum pmc_class 188c89d1cf5SJoseph Koshyenumeration. 189c89d1cf5SJoseph KoshySupported PMC kinds include: 1909ee2158bSJoel Dahl.Pp 19172cf78b8SJoseph Koshy.Bl -tag -width "Li PMC_CLASS_IAF" -compact 19272cf78b8SJoseph Koshy.It Li PMC_CLASS_IAF 193f20a61ffSJoseph KoshyFixed function hardware counters presents in CPUs conforming to the 19480f30b73SJoseph Koshy.Tn Intel 19580f30b73SJoseph Koshyperformance measurement architecture version 2 and later. 19672cf78b8SJoseph Koshy.It Li PMC_CLASS_IAP 19772cf78b8SJoseph KoshyProgrammable hardware counters present in CPUs conforming to the 19872cf78b8SJoseph Koshy.Tn Intel 19972cf78b8SJoseph Koshyperformance measurement architecture version 1 and later. 20080f30b73SJoseph Koshy.It Li PMC_CLASS_K7 201c89d1cf5SJoseph KoshyProgrammable hardware counters present in 202c89d1cf5SJoseph Koshy.Tn "AMD Athlon" 203c89d1cf5SJoseph KoshyCPUs. 20480f30b73SJoseph Koshy.It Li PMC_CLASS_K8 205c89d1cf5SJoseph KoshyProgrammable hardware counters present in 206c89d1cf5SJoseph Koshy.Tn "AMD Athlon64" 207c89d1cf5SJoseph KoshyCPUs. 20880f30b73SJoseph Koshy.It Li PMC_CLASS_P4 20924f2c3f3SJoseph KoshyProgrammable hardware counters present in 21024f2c3f3SJoseph Koshy.Tn "Intel Pentium 4" 21124f2c3f3SJoseph KoshyCPUs. 21280f30b73SJoseph Koshy.It Li PMC_CLASS_P5 213bcbe65a8SJoseph KoshyProgrammable hardware counters present in 214bcbe65a8SJoseph Koshy.Tn Intel 215bcbe65a8SJoseph Koshy.Tn Pentium 216bcbe65a8SJoseph KoshyCPUs. 21780f30b73SJoseph Koshy.It Li PMC_CLASS_P6 218c89d1cf5SJoseph KoshyProgrammable hardware counters present in 219c89d1cf5SJoseph Koshy.Tn Intel 220c89d1cf5SJoseph Koshy.Tn "Pentium Pro" , 221c89d1cf5SJoseph Koshy.Tn "Pentium II" , 222c89d1cf5SJoseph Koshy.Tn "Pentium III" , 223c89d1cf5SJoseph Koshy.Tn "Celeron" , 224ebccf1e3SJoseph Koshyand 225c89d1cf5SJoseph Koshy.Tn "Pentium M" 226c89d1cf5SJoseph KoshyCPUs. 22780f30b73SJoseph Koshy.It Li PMC_CLASS_TSC 22824f2c3f3SJoseph KoshyThe timestamp counter on i386 and amd64 architecture CPUs. 229f5f9340bSFabien Thomas.It Li PMC_CLASS_SOFT 230f5f9340bSFabien ThomasSoftware events. 231c89d1cf5SJoseph Koshy.El 232c89d1cf5SJoseph Koshy.Ss PMC Capabilities 233c89d1cf5SJoseph KoshyCapabilities of performance monitoring hardware are denoted using 234c89d1cf5SJoseph Koshythe 235c89d1cf5SJoseph Koshy.Vt "enum pmc_caps" 236c89d1cf5SJoseph Koshyenumeration. 237c89d1cf5SJoseph KoshySupported capabilities include: 2389ee2158bSJoel Dahl.Pp 23980f30b73SJoseph Koshy.Bl -tag -width "Li PMC_CAP_INTERRUPT" -compact 24080f30b73SJoseph Koshy.It Li PMC_CAP_CASCADE 24180f30b73SJoseph KoshyThe ability to cascade counters. 24280f30b73SJoseph Koshy.It Li PMC_CAP_EDGE 243c89d1cf5SJoseph KoshyThe ability to count negated to asserted transitions of the hardware 244c89d1cf5SJoseph Koshyconditions being probed for. 24580f30b73SJoseph Koshy.It Li PMC_CAP_INTERRUPT 246c89d1cf5SJoseph KoshyThe ability to interrupt the CPU. 24780f30b73SJoseph Koshy.It Li PMC_CAP_INVERT 248c89d1cf5SJoseph KoshyThe ability to invert the sense of the hardware conditions being 249c89d1cf5SJoseph Koshymeasured. 250624f6965SJoseph Koshy.It Li PMC_CAP_PRECISE 251624f6965SJoseph KoshyThe ability to perform precise sampling. 25280f30b73SJoseph Koshy.It Li PMC_CAP_QUALIFIER 253c89d1cf5SJoseph KoshyThe hardware allows monitored to be further qualified in some 254c89d1cf5SJoseph Koshysystem dependent way. 255624f6965SJoseph Koshy.It Li PMC_CAP_READ 256624f6965SJoseph KoshyThe ability to read from performance counters. 25780f30b73SJoseph Koshy.It Li PMC_CAP_SYSTEM 258c89d1cf5SJoseph KoshyThe ability to restrict counting of hardware events to when the CPU is 259c89d1cf5SJoseph Koshyrunning privileged code. 26080f30b73SJoseph Koshy.It Li PMC_CAP_THRESHOLD 261c89d1cf5SJoseph KoshyThe ability to ignore simultaneous hardware events below a 262c89d1cf5SJoseph Koshyprogrammable threshold. 26380f30b73SJoseph Koshy.It Li PMC_CAP_USER 264c89d1cf5SJoseph KoshyThe ability to restrict counting of hardware events to those when the 265c89d1cf5SJoseph KoshyCPU is running unprivileged code. 26680f30b73SJoseph Koshy.It Li PMC_CAP_WRITE 2670f3866faSJoseph KoshyThe ability to write to performance counters. 268c89d1cf5SJoseph Koshy.El 2696455febbSJoseph Koshy.Ss CPU Naming Conventions 270dd1259daSJoseph KoshyCPUs are named using small integers from zero up to, but 2716455febbSJoseph Koshyexcluding, the value returned by function 2726455febbSJoseph Koshy.Fn pmc_ncpu . 2736455febbSJoseph KoshyOn platforms supporting sparsely numbered CPUs not all the numbers in 2746455febbSJoseph Koshythis range will denote valid CPUs. 2756455febbSJoseph KoshyOperations on non-existent CPUs will return an error. 2766455febbSJoseph Koshy.Ss Functional Grouping of the API 277c89d1cf5SJoseph KoshyThis section contains a brief overview of the available functionality 278c89d1cf5SJoseph Koshyin the PMC library. 279c89d1cf5SJoseph KoshyEach function listed here is described further in its own manual page. 2809ee2158bSJoel Dahl.Bl -tag -width 2n 281c89d1cf5SJoseph Koshy.It Administration 2829ee2158bSJoel Dahl.Bl -tag -width 6n -compact 283c89d1cf5SJoseph Koshy.It Fn pmc_disable , Fn pmc_enable 284c89d1cf5SJoseph KoshyAdministratively disable (enable) specific performance monitoring 285c89d1cf5SJoseph Koshycounter hardware. 286c89d1cf5SJoseph KoshyCounters that are disabled will not be available to applications to 287c89d1cf5SJoseph Koshyuse. 288c89d1cf5SJoseph Koshy.El 289c89d1cf5SJoseph Koshy.It "Convenience Functions" 2909ee2158bSJoel Dahl.Bl -tag -width 6n -compact 291c89d1cf5SJoseph Koshy.It Fn pmc_event_names_of_class 292c89d1cf5SJoseph KoshyReturns a list of event names supported by a given PMC type. 293c89d1cf5SJoseph Koshy.It Fn pmc_name_of_capability 294c89d1cf5SJoseph KoshyConvert a 295c89d1cf5SJoseph Koshy.Dv PMC_CAP_* 296c89d1cf5SJoseph Koshyflag to a human-readable string. 297c89d1cf5SJoseph Koshy.It Fn pmc_name_of_class 298c89d1cf5SJoseph KoshyConvert a 299c89d1cf5SJoseph Koshy.Dv PMC_CLASS_* 300c89d1cf5SJoseph Koshyconstant to a human-readable string. 301c89d1cf5SJoseph Koshy.It Fn pmc_name_of_cputype 302c89d1cf5SJoseph KoshyReturn a human-readable name for a CPU type. 303c89d1cf5SJoseph Koshy.It Fn pmc_name_of_disposition 304c89d1cf5SJoseph KoshyReturn a human-readable string describing a PMC's disposition. 305c89d1cf5SJoseph Koshy.It Fn pmc_name_of_event 306c89d1cf5SJoseph KoshyConvert a numeric event code to a human-readable string. 307c89d1cf5SJoseph Koshy.It Fn pmc_name_of_mode 308c89d1cf5SJoseph KoshyConvert a 309c89d1cf5SJoseph Koshy.Dv PMC_MODE_* 310c89d1cf5SJoseph Koshyconstant to a human-readable name. 311c89d1cf5SJoseph Koshy.It Fn pmc_name_of_state 312c89d1cf5SJoseph KoshyReturn a human-readable string describing a PMC's current state. 313c89d1cf5SJoseph Koshy.El 314c89d1cf5SJoseph Koshy.It "Library Initialization" 3159ee2158bSJoel Dahl.Bl -tag -width 6n -compact 316c89d1cf5SJoseph Koshy.It Fn pmc_init 317c89d1cf5SJoseph KoshyInitialize the library. 318c89d1cf5SJoseph KoshyThis function must be called before any other library function. 319c89d1cf5SJoseph Koshy.El 320c89d1cf5SJoseph Koshy.It "Log File Handling" 3219ee2158bSJoel Dahl.Bl -tag -width 6n -compact 322c89d1cf5SJoseph Koshy.It Fn pmc_configure_logfile 323c89d1cf5SJoseph KoshyConfigure a log file for 324c89d1cf5SJoseph Koshy.Xr hwpmc 4 325c89d1cf5SJoseph Koshyto write logged events to. 326c89d1cf5SJoseph Koshy.It Fn pmc_flush_logfile 327c89d1cf5SJoseph KoshyFlush all pending log data in 328c89d1cf5SJoseph Koshy.Xr hwpmc 4 Ns Ap s 329c89d1cf5SJoseph Koshybuffers. 330dceed24aSFabien Thomas.It Fn pmc_close_logfile 331dceed24aSFabien ThomasFlush all pending log data and close 332dceed24aSFabien Thomas.Xr hwpmc 4 Ns Ap s 333dceed24aSFabien Thomasside of the stream. 334c89d1cf5SJoseph Koshy.It Fn pmc_writelog 335c89d1cf5SJoseph KoshyAppend arbitrary user data to the current log file. 336c89d1cf5SJoseph Koshy.El 337c89d1cf5SJoseph Koshy.It "PMC Management" 3389ee2158bSJoel Dahl.Bl -tag -width 6n -compact 339c89d1cf5SJoseph Koshy.It Fn pmc_allocate , Fn pmc_release 340c89d1cf5SJoseph KoshyAllocate (free) a PMC. 341c89d1cf5SJoseph Koshy.It Fn pmc_attach , Fn pmc_detach 342c89d1cf5SJoseph KoshyAttach (detach) a process scope PMC to a target. 343c89d1cf5SJoseph Koshy.It Fn pmc_read , Fn pmc_write , Fn pmc_rw 344c89d1cf5SJoseph KoshyRead (write) a value from (to) a PMC. 345c89d1cf5SJoseph Koshy.It Fn pmc_start , Fn pmc_stop 346c89d1cf5SJoseph KoshyStart (stop) a software PMC. 347c89d1cf5SJoseph Koshy.It Fn pmc_set 348c89d1cf5SJoseph KoshySet the reload value for a sampling PMC. 349c89d1cf5SJoseph Koshy.El 350c89d1cf5SJoseph Koshy.It "Queries" 3519ee2158bSJoel Dahl.Bl -tag -width 6n -compact 352c89d1cf5SJoseph Koshy.It Fn pmc_capabilities 353c89d1cf5SJoseph KoshyRetrieve the capabilities for a given PMC. 354c89d1cf5SJoseph Koshy.It Fn pmc_cpuinfo 355c89d1cf5SJoseph KoshyRetrieve information about the CPUs and PMC hardware present in the 356c89d1cf5SJoseph Koshysystem. 357c89d1cf5SJoseph Koshy.It Fn pmc_get_driver_stats 358c89d1cf5SJoseph KoshyRetrieve statistics maintained by 359c89d1cf5SJoseph Koshy.Xr hwpmc 4 . 360c89d1cf5SJoseph Koshy.It Fn pmc_ncpu 3616455febbSJoseph KoshyDetermine the greatest possible CPU number on the system. 362c89d1cf5SJoseph Koshy.It Fn pmc_npmc 363c89d1cf5SJoseph KoshyReturn the number of hardware PMCs present in a given CPU. 364c89d1cf5SJoseph Koshy.It Fn pmc_pmcinfo 365c89d1cf5SJoseph KoshyReturn information about the state of a given CPU's PMCs. 366c89d1cf5SJoseph Koshy.It Fn pmc_width 367c89d1cf5SJoseph KoshyDetermine the width of a hardware counter in bits. 368c89d1cf5SJoseph Koshy.El 369c89d1cf5SJoseph Koshy.It "x86 Architecture Specific API" 3709ee2158bSJoel Dahl.Bl -tag -width 6n -compact 371c89d1cf5SJoseph Koshy.It Fn pmc_get_msr 372c89d1cf5SJoseph KoshyReturns the processor model specific register number 373c89d1cf5SJoseph Koshyassociated with 374c5153e19SJoseph Koshy.Fa pmc . 375c89d1cf5SJoseph KoshyApplications may then use the x86 376c89d1cf5SJoseph Koshy.Ic RDPMC 377c89d1cf5SJoseph Koshyinstruction to directly read the contents of the PMC. 378c89d1cf5SJoseph Koshy.El 379c89d1cf5SJoseph Koshy.El 3809abe909bSRuslan Ermilov.Ss Signal Handling Requirements 381ebccf1e3SJoseph KoshyApplications using PMCs are required to handle the following signals: 382c89d1cf5SJoseph Koshy.Bl -tag -width ".Dv SIGBUS" 3839abe909bSRuslan Ermilov.It Dv SIGBUS 384ebccf1e3SJoseph KoshyWhen the 385ebccf1e3SJoseph Koshy.Xr hwpmc 4 386ebccf1e3SJoseph Koshymodule is unloaded using 387ebccf1e3SJoseph Koshy.Xr kldunload 8 , 388ebccf1e3SJoseph Koshyprocesses that have PMCs allocated to them will be sent a 3899abe909bSRuslan Ermilov.Dv SIGBUS 3909abe909bSRuslan Ermilovsignal. 3919abe909bSRuslan Ermilov.It Dv SIGIO 392f263522aSJoseph KoshyThe 393f263522aSJoseph Koshy.Xr hwpmc 4 3949abe909bSRuslan Ermilovdriver will send a PMC owning process a 3959abe909bSRuslan Ermilov.Dv SIGIO 3969abe909bSRuslan Ermilovsignal if: 397f263522aSJoseph Koshy.Bl -bullet 398f263522aSJoseph Koshy.It 399f263522aSJoseph KoshyIf any process-mode PMC allocated by it loses all its 400f263522aSJoseph Koshytarget processes. 401f263522aSJoseph Koshy.It 402f263522aSJoseph KoshyIf the driver encounters an error when writing log data to a 403f263522aSJoseph Koshyconfigured log file. 404f263522aSJoseph KoshyThis error may be retrieved by a subsequent call to 405f263522aSJoseph Koshy.Fn pmc_flush_logfile . 406f263522aSJoseph Koshy.El 407ebccf1e3SJoseph Koshy.El 408c89d1cf5SJoseph Koshy.Ss Typical Program Flow 409c89d1cf5SJoseph Koshy.Bl -enum 410c89d1cf5SJoseph Koshy.It 411c89d1cf5SJoseph KoshyAn application would first invoke function 412c89d1cf5SJoseph Koshy.Fn pmc_init 413c89d1cf5SJoseph Koshyto allow the library to initialize itself. 414c89d1cf5SJoseph Koshy.It 415c89d1cf5SJoseph KoshySignal handling would then be set up. 416c89d1cf5SJoseph Koshy.It 417c89d1cf5SJoseph KoshyNext the application would allocate the PMCs it desires using function 418c89d1cf5SJoseph Koshy.Fn pmc_allocate . 419c89d1cf5SJoseph Koshy.It 420c89d1cf5SJoseph KoshyInitial values for PMCs may be set using function 421c89d1cf5SJoseph Koshy.Fn pmc_set . 422c89d1cf5SJoseph Koshy.It 423c89d1cf5SJoseph KoshyIf a log file is necessary for the PMCs to work, it would 424c89d1cf5SJoseph Koshybe configured using function 425c89d1cf5SJoseph Koshy.Fn pmc_configure_logfile . 426c89d1cf5SJoseph Koshy.It 427c89d1cf5SJoseph KoshyProcess scope PMCs would then be attached to their target processes 428c89d1cf5SJoseph Koshyusing function 429c89d1cf5SJoseph Koshy.Fn pmc_attach . 430c89d1cf5SJoseph Koshy.It 431c89d1cf5SJoseph KoshyThe PMCs would then be started using function 432c89d1cf5SJoseph Koshy.Fn pmc_start . 433c89d1cf5SJoseph Koshy.It 434c89d1cf5SJoseph KoshyOnce started, the values of counting PMCs may be read using function 435b53a052dSJoseph Koshy.Fn pmc_read . 436c89d1cf5SJoseph KoshyFor PMCs that write events to the log file, this logged data would be 437c89d1cf5SJoseph Koshyread and parsed using the 438c89d1cf5SJoseph Koshy.Xr pmclog 3 439c89d1cf5SJoseph Koshyfamily of functions. 440c89d1cf5SJoseph Koshy.It 441c89d1cf5SJoseph KoshyPMCs are stopped using function 442c89d1cf5SJoseph Koshy.Fn pmc_stop , 443c89d1cf5SJoseph Koshyand process scope PMCs are detached from their targets using 444c89d1cf5SJoseph Koshyfunction 445c89d1cf5SJoseph Koshy.Fn pmc_detach . 446c89d1cf5SJoseph Koshy.It 447c89d1cf5SJoseph KoshyBefore the process exits, its may release its PMCs using function 448c89d1cf5SJoseph Koshy.Fn pmc_release . 449c89d1cf5SJoseph KoshyAny configured log file may be closed using function 450c89d1cf5SJoseph Koshy.Fn pmc_configure_logfile . 451c89d1cf5SJoseph Koshy.El 452ebccf1e3SJoseph Koshy.Sh EVENT SPECIFIERS 453ebccf1e3SJoseph KoshyEvent specifiers are strings comprising of an event name, followed by 454ebccf1e3SJoseph Koshyoptional parameters modifying the semantics of the hardware event 455ebccf1e3SJoseph Koshybeing probed. 4560b844226SJoseph KoshyEvent names are PMC architecture dependent, but the PMC library defines 4570b844226SJoseph Koshymachine independent aliases for commonly used events. 4580f7668cbSJoseph Koshy.Pp 4590f7668cbSJoseph KoshyEvent specifiers spellings are case-insensitive and space characters, 4600f7668cbSJoseph Koshyperiods, underscores and hyphens are considered equivalent to each other. 4610f7668cbSJoseph KoshyThus the event specifiers 4620f7668cbSJoseph Koshy.Qq "Example Event" , 4630f7668cbSJoseph Koshy.Qq "example-event" , 4640f7668cbSJoseph Koshyand 4650f7668cbSJoseph Koshy.Qq "EXAMPLE_EVENT" 4660f7668cbSJoseph Koshyare equivalent. 4670f7668cbSJoseph Koshy.Ss PMC Architecture Dependent Events 4680f7668cbSJoseph KoshyPMC architecture dependent event specifiers are described in the 4690f7668cbSJoseph Koshyfollowing manual pages: 4700f7668cbSJoseph Koshy.Bl -column " PMC_CLASS_TSC " "MANUAL PAGE " 4710f7668cbSJoseph Koshy.It Em "PMC Class" Ta Em "Manual Page" 4720f7668cbSJoseph Koshy.It Li PMC_CLASS_IAF Ta Xr pmc.iaf 3 4730f7668cbSJoseph Koshy.It Li PMC_CLASS_IAP Ta Xr pmc.atom 3 , Xr pmc.core 3 , Xr pmc.core2 3 4740f7668cbSJoseph Koshy.It Li PMC_CLASS_K7 Ta Xr pmc.k7 3 4750f7668cbSJoseph Koshy.It Li PMC_CLASS_K8 Ta Xr pmc.k8 3 4760f7668cbSJoseph Koshy.It Li PMC_CLASS_P4 Ta Xr pmc.p4 3 4770f7668cbSJoseph Koshy.It Li PMC_CLASS_P5 Ta Xr pmc.p5 3 4780f7668cbSJoseph Koshy.It Li PMC_CLASS_P6 Ta Xr pmc.p6 3 4790f7668cbSJoseph Koshy.It Li PMC_CLASS_TSC Ta Xr pmc.tsc 3 4800f7668cbSJoseph Koshy.El 481ebccf1e3SJoseph Koshy.Ss Event Name Aliases 48224f2c3f3SJoseph KoshyEvent name aliases are PMC-independent names for commonly used events. 483ebccf1e3SJoseph KoshyThe following aliases are known to this version of the 484110e1704SRuslan Ermilov.Nm pmc 485ebccf1e3SJoseph Koshylibrary: 486ebccf1e3SJoseph Koshy.Bl -tag -width indent 487ebccf1e3SJoseph Koshy.It Li branches 488ebccf1e3SJoseph KoshyMeasure the number of branches retired. 489ebccf1e3SJoseph Koshy.It Li branch-mispredicts 490ebccf1e3SJoseph KoshyMeasure the number of retired branches that were mispredicted. 491ebccf1e3SJoseph Koshy.It Li cycles 492ebccf1e3SJoseph KoshyMeasure processor cycles. 493ebccf1e3SJoseph KoshyThis event is implemented using the processor's Time Stamp Counter 494ebccf1e3SJoseph Koshyregister. 495ebccf1e3SJoseph Koshy.It Li dc-misses 496ebccf1e3SJoseph KoshyMeasure the number of data cache misses. 497ebccf1e3SJoseph Koshy.It Li ic-misses 498ebccf1e3SJoseph KoshyMeasure the number of instruction cache misses. 499ebccf1e3SJoseph Koshy.It Li instructions 500ebccf1e3SJoseph KoshyMeasure the number of instructions retired. 501ebccf1e3SJoseph Koshy.It Li interrupts 502ebccf1e3SJoseph KoshyMeasure the number of interrupts seen. 503177a2f22SJoseph Koshy.It Li unhalted-cycles 504177a2f22SJoseph KoshyMeasure the number of cycles the processor is not in a halted 505177a2f22SJoseph Koshyor sleep state. 506ebccf1e3SJoseph Koshy.El 5075138c36aSJoseph Koshy.Sh COMPATIBILITY 5085138c36aSJoseph KoshyThe interface between the 509110e1704SRuslan Ermilov.Nm pmc 5105138c36aSJoseph Koshylibrary and the 5115138c36aSJoseph Koshy.Xr hwpmc 4 5125138c36aSJoseph Koshydriver is intended to be private to the implementation and may 5135138c36aSJoseph Koshychange. 5145138c36aSJoseph KoshyIn order to ease forward compatibility with future versions of the 5155138c36aSJoseph Koshy.Xr hwpmc 4 5165138c36aSJoseph Koshydriver, applications are urged to dynamically link with the 517110e1704SRuslan Ermilov.Nm pmc 5185138c36aSJoseph Koshylibrary. 5195138c36aSJoseph Koshy.Pp 5205138c36aSJoseph KoshyThe 521110e1704SRuslan Ermilov.Nm pmc 5225138c36aSJoseph KoshyAPI is 5235138c36aSJoseph Koshy.Ud 524ebccf1e3SJoseph Koshy.Sh SEE ALSO 52572cf78b8SJoseph Koshy.Xr pmc.atom 3 , 52672cf78b8SJoseph Koshy.Xr pmc.core 3 , 52772cf78b8SJoseph Koshy.Xr pmc.core2 3 , 52856e39702SGeorge V. Neville-Neil.Xr pmc.haswell 3 , 52956e39702SGeorge V. Neville-Neil.Xr pmc.haswelluc 3 , 530f1ec0939SRyan Stone.Xr pmc.haswellxeon 3 , 53172cf78b8SJoseph Koshy.Xr pmc.iaf 3 , 53256e39702SGeorge V. Neville-Neil.Xr pmc.ivybridge 3 , 53356e39702SGeorge V. Neville-Neil.Xr pmc.ivybridgexeon 3 , 53424f2c3f3SJoseph Koshy.Xr pmc.k7 3 , 53524f2c3f3SJoseph Koshy.Xr pmc.k8 3 , 53656e39702SGeorge V. Neville-Neil.Xr pmc.mips24k 3 , 53756e39702SGeorge V. Neville-Neil.Xr pmc.octeon 3 , 53824f2c3f3SJoseph Koshy.Xr pmc.p4 3 , 53924f2c3f3SJoseph Koshy.Xr pmc.p5 3 , 54024f2c3f3SJoseph Koshy.Xr pmc.p6 3 , 54156e39702SGeorge V. Neville-Neil.Xr pmc.sandybridge 3 , 54256e39702SGeorge V. Neville-Neil.Xr pmc.sandybridgeuc 3 , 54356e39702SGeorge V. Neville-Neil.Xr pmc.sandybridgexeon 3 , 544f5f9340bSFabien Thomas.Xr pmc.soft 3 , 54524f2c3f3SJoseph Koshy.Xr pmc.tsc 3 , 54656e39702SGeorge V. Neville-Neil.Xr pmc.westmere 3 , 54756e39702SGeorge V. Neville-Neil.Xr pmc.westmereuc 3 , 54856e39702SGeorge V. Neville-Neil.Xr pmc.xscale 3 , 549*7a40330bSEnji Cooper.Xr pmc_allocate 3 , 550*7a40330bSEnji Cooper.Xr pmc_attach 3 , 551*7a40330bSEnji Cooper.Xr pmc_capabilities 3 , 552*7a40330bSEnji Cooper.Xr pmc_configure_logfile 3 , 553*7a40330bSEnji Cooper.Xr pmc_disable 3 , 554*7a40330bSEnji Cooper.Xr pmc_event_names_of_class 3 , 555*7a40330bSEnji Cooper.Xr pmc_get_driver_stats 3 , 556*7a40330bSEnji Cooper.Xr pmc_get_msr 3 , 557*7a40330bSEnji Cooper.Xr pmc_init 3 , 558*7a40330bSEnji Cooper.Xr pmc_name_of_capability 3 , 559*7a40330bSEnji Cooper.Xr pmc_read 3 , 560*7a40330bSEnji Cooper.Xr pmc_set 3 , 561*7a40330bSEnji Cooper.Xr pmc_start 3 , 562f263522aSJoseph Koshy.Xr pmclog 3 , 563ebccf1e3SJoseph Koshy.Xr hwpmc 4 , 564ebccf1e3SJoseph Koshy.Xr pmccontrol 8 , 565ebccf1e3SJoseph Koshy.Xr pmcstat 8 5665138c36aSJoseph Koshy.Sh HISTORY 5675138c36aSJoseph KoshyThe 568110e1704SRuslan Ermilov.Nm pmc 5695138c36aSJoseph Koshylibrary first appeared in 5705138c36aSJoseph Koshy.Fx 6.0 . 571c89d1cf5SJoseph Koshy.Sh AUTHORS 572c89d1cf5SJoseph KoshyThe 573c89d1cf5SJoseph Koshy.Lb libpmc 574c89d1cf5SJoseph Koshylibrary was written by 5752b7af31cSBaptiste Daroussin.An Joseph Koshy Aq Mt jkoshy@FreeBSD.org . 576