1.\" Copyright (c) 2003-2008 Joseph Koshy 2.\" Copyright (c) 2007 The FreeBSD Foundation 3.\" All rights reserved. 4.\" 5.\" Portions of this software were developed by A. Joseph Koshy under 6.\" sponsorship from the FreeBSD Foundation and Google, Inc. 7.\" 8.\" Redistribution and use in source and binary forms, with or without 9.\" modification, are permitted provided that the following conditions 10.\" are met: 11.\" 1. Redistributions of source code must retain the above copyright 12.\" notice, this list of conditions and the following disclaimer. 13.\" 2. Redistributions in binary form must reproduce the above copyright 14.\" notice, this list of conditions and the following disclaimer in the 15.\" documentation and/or other materials provided with the distribution. 16.\" 17.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 18.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 21.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27.\" SUCH DAMAGE. 28.\" 29.\" $FreeBSD$ 30.\" 31.Dd November 2, 2012 32.Dt HWPMC 4 33.Os 34.Sh NAME 35.Nm hwpmc 36.Nd "Hardware Performance Monitoring Counter support" 37.Sh SYNOPSIS 38.Cd "options HWPMC_HOOKS" 39.Cd "device hwpmc" 40.Pp 41Additionally, for i386 systems: 42.Cd "device apic" 43.Sh DESCRIPTION 44The 45.Nm 46driver virtualizes the hardware performance monitoring facilities in 47modern CPUs and provides support for using these facilities from 48user level processes. 49.Pp 50The driver supports multi-processor systems. 51.Pp 52PMCs are allocated using the 53.Dv PMC_OP_PMCALLOCATE 54request. 55A successful 56.Dv PMC_OP_PMCALLOCATE 57request will return a handle to the requesting process. 58Subsequent operations on the allocated PMC use this handle to denote 59the specific PMC. 60A process that has successfully allocated a PMC is termed an 61.Dq "owner process" . 62.Pp 63PMCs may be allocated with process or system scope. 64.Bl -tag -width ".Em Process-scope" 65.It Em "Process-scope" 66The PMC is active only when a thread belonging 67to a process it is attached to is scheduled on a CPU. 68.It Em "System-scope" 69The PMC operates independently of processes and 70measures hardware events for the system as a whole. 71.El 72.Pp 73PMCs may be allocated for counting or for sampling: 74.Bl -tag -width ".Em Counting" 75.It Em Counting 76In counting modes, the PMCs count hardware events. 77These counts are retrievable using the 78.Dv PMC_OP_PMCREAD 79system call on all architectures. 80Some architectures offer faster methods of reading these counts. 81.It Em Sampling 82In sampling modes, the PMCs are configured to sample the CPU 83instruction pointer (and optionally to capture the call chain leading 84up to the sampled instruction pointer) after a configurable number of 85hardware events have been observed. 86Instruction pointer samples and call chain records are usually 87directed to a log file for subsequent analysis. 88.El 89.Pp 90Scope and operational mode are orthogonal; a PMC may thus be 91configured to operate in one of the following four modes: 92.Bl -tag -width indent 93.It Process-scope, counting 94These PMCs count hardware events whenever a thread in their attached process is 95scheduled on a CPU. 96These PMCs normally count from zero, but the initial count may be 97set using the 98.Dv PMC_OP_SETCOUNT 99operation. 100Applications can read the value of the PMC anytime using the 101.Dv PMC_OP_PMCRW 102operation. 103.It Process-scope, sampling 104These PMCs sample the target processes instruction pointer after they 105have seen the configured number of hardware events. 106The PMCs only count events when a thread belonging to their attached 107process is active. 108The desired frequency of sampling is set using the 109.Dv PMC_OP_SETCOUNT 110operation prior to starting the PMC. 111Log files are configured using the 112.Dv PMC_OP_CONFIGURELOG 113operation. 114.It System-scope, counting 115These PMCs count hardware events seen by them independent of the 116processes that are executing. 117The current count on these PMCs can be read using the 118.Dv PMC_OP_PMCRW 119request. 120These PMCs normally count from zero, but the initial count may be 121set using the 122.Dv PMC_OP_SETCOUNT 123operation. 124.It System-scope, sampling 125These PMCs will periodically sample the instruction pointer of the CPU 126they are allocated on, and will write the sample to a log for further 127processing. 128The desired frequency of sampling is set using the 129.Dv PMC_OP_SETCOUNT 130operation prior to starting the PMC. 131Log files are configured using the 132.Dv PMC_OP_CONFIGURELOG 133operation. 134.Pp 135System-wide statistical sampling can only be enabled by a process with 136super-user privileges. 137.El 138.Pp 139Processes are allowed to allocate as many PMCs as the hardware and 140current operating conditions permit. 141Processes may mix allocations of system-wide and process-private 142PMCs. 143Multiple processes may be using PMCs simultaneously. 144.Pp 145Allocated PMCs are started using the 146.Dv PMC_OP_PMCSTART 147operation, and stopped using the 148.Dv PMC_OP_PMCSTOP 149operation. 150Stopping and starting a PMC is permitted at any time the owner process 151has a valid handle to the PMC. 152.Pp 153Process-private PMCs need to be attached to a target process before 154they can be used. 155Attaching a process to a PMC is done using the 156.Dv PMC_OP_PMCATTACH 157operation. 158An already attached PMC may be detached from its target process 159using the converse 160.Dv PMC_OP_PMCDETACH 161operation. 162Issuing a 163.Dv PMC_OP_PMCSTART 164operation on an as yet unattached PMC will cause it to be attached 165to its owner process. 166The following rules determine whether a given process may attach 167a PMC to another target process: 168.Bl -bullet -compact 169.It 170A non-jailed process with super-user privileges is allowed to attach 171to any other process in the system. 172.It 173Other processes are only allowed to attach to targets that they would 174be able to attach to for debugging (as determined by 175.Xr p_candebug 9 ) . 176.El 177.Pp 178PMCs are released using 179.Dv PMC_OP_PMCRELEASE . 180After a successful 181.Dv PMC_OP_PMCRELEASE 182operation the handle to the PMC will become invalid. 183.Ss Modifier Flags 184The 185.Dv PMC_OP_PMCALLOCATE 186operation supports the following flags that modify the behavior 187of an allocated PMC: 188.Bl -tag -width indent 189.It Dv PMC_F_CALLCHAIN 190This modifier informs sampling PMCs to record a callchain when 191capturing a sample. 192The maximum depth to which call chains are recorded is specified 193by the 194.Va "kern.hwpmc.callchaindepth" 195kernel tunable. 196.It Dv PMC_F_DESCENDANTS 197This modifier is valid only for a PMC being allocated in process-private 198mode. 199It signifies that the PMC will track hardware events for its 200target process and the target's current and future descendants. 201.It Dv PMC_F_KGMON 202This modifier is valid only for a PMC being allocated in system-wide 203sampling mode. 204It signifies that the PMC's sampling interrupt is to be used to drive 205kernel profiling via 206.Xr kgmon 8 . 207This functionality is currently unimplemented. 208.It Dv PMC_F_LOG_PROCCSW 209This modifier is valid only for a PMC being allocated in process-private 210mode. 211When this modifier is present, at every context switch, 212.Nm 213will log a record containing the number of hardware events 214seen by the target process when it was scheduled on the CPU. 215.It Dv PMC_F_LOG_PROCEXIT 216This modifier is valid only for a PMC being allocated in process-private 217mode. 218With this modifier present, 219.Nm 220will maintain per-process counts for each target process attached to 221a PMC. 222At process exit time, a record containing the target process' PID and 223the accumulated per-process count for that process will be written to the 224configured log file. 225.El 226.Pp 227Modifiers 228.Dv PMC_F_LOG_PROCEXIT 229and 230.Dv PMC_F_LOG_PROCCSW 231may be used in combination with modifier 232.Dv PMC_F_DESCENDANTS 233to track the behavior of complex pipelines of processes. 234PMCs with modifiers 235.Dv PMC_F_LOG_PROCEXIT 236and 237.Dv PMC_F_LOG_PROCCSW 238cannot be started until their owner process has configured a log file. 239.Ss Signals 240The 241.Nm 242driver may deliver signals to processes that have allocated PMCs: 243.Bl -tag -width ".Dv SIGBUS" 244.It Dv SIGIO 245A 246.Dv PMC_OP_PMCRW 247operation was attempted on a process-private PMC that does not have 248attached target processes. 249.It Dv SIGBUS 250The 251.Nm 252driver is being unloaded from the kernel. 253.El 254.Ss PMC ROW DISPOSITIONS 255A PMC row is defined as the set of PMC resources at the same hardware 256address in the CPUs in a system. 257Since process scope PMCs need to move between CPUs following their 258target threads, allocation of a process scope PMC reserves all PMCs in 259a PMC row for use only with process scope PMCs. 260Accordingly a PMC row will be in one of the following dispositions: 261.Bl -tag -width ".Dv PMC_DISP_STANDALONE" -compact 262.It Dv PMC_DISP_FREE 263Hardware counters in this row are free and may be use to satisfy 264either of system scope or process scope allocation requests. 265.It Dv PMC_DISP_THREAD 266Hardware counters in this row are in use by process scope PMCs 267and are only available for process scope allocation requests. 268.It Dv PMC_DISP_STANDALONE 269Some hardware counters in this row have been administratively 270disabled or are in use by system scope PMCs. 271Non-disabled hardware counters in such a row may be used 272for satisfying system scope allocation requests. 273No process scope PMCs will use hardware counters in this row. 274.El 275.Sh PROGRAMMING API 276The recommended way for application programs to use the facilities of 277the 278.Nm 279driver is using the API provided by the 280.Xr pmc 3 281library. 282.Pp 283The 284.Nm 285driver operates using a system call number that is dynamically 286allotted to it when it is loaded into the kernel. 287.Pp 288The 289.Nm 290driver supports the following operations: 291.Bl -tag -width indent 292.It Dv PMC_OP_CONFIGURELOG 293Configure a log file for PMCs that require a log file. 294The 295.Nm 296driver will write log data to this file asynchronously. 297If it encounters an error, logging will be stopped and the error code 298encountered will be saved for subsequent retrieval by a 299.Dv PMC_OP_FLUSHLOG 300request. 301.It Dv PMC_OP_FLUSHLOG 302Transfer buffered log data inside 303.Nm 304to a configured output file. 305This operation returns to the caller after the write operation 306has returned. 307The returned error code reflects any pending error state inside 308.Nm . 309.It Dv PMC_OP_GETCPUINFO 310Retrieve information about the highest possible CPU number for the system, 311and the number of hardware performance monitoring counters available per CPU. 312.It Dv PMC_OP_GETDRIVERSTATS 313Retrieve module statistics (for analyzing the behavior of 314.Nm 315itself). 316.It Dv PMC_OP_GETMODULEVERSION 317Retrieve the version number of API. 318.It Dv PMC_OP_GETPMCINFO 319Retrieve information about the current state of the PMCs on a 320given CPU. 321.It Dv PMC_OP_PMCADMIN 322Set the administrative state (i.e., whether enabled or disabled) for 323the hardware PMCs managed by the 324.Nm 325driver. 326The invoking process needs to possess the 327.Dv PRIV_PMC_MANAGE 328privilege. 329.It Dv PMC_OP_PMCALLOCATE 330Allocate and configure a PMC. 331On successful allocation, a handle to the PMC (a 32 bit value) 332is returned. 333.It Dv PMC_OP_PMCATTACH 334Attach a process mode PMC to a target process. 335The PMC will be active whenever a thread in the target process is 336scheduled on a CPU. 337.Pp 338If the 339.Dv PMC_F_DESCENDANTS 340flag had been specified at PMC allocation time, then the PMC is 341attached to all current and future descendants of the target process. 342.It Dv PMC_OP_PMCDETACH 343Detach a PMC from its target process. 344.It Dv PMC_OP_PMCRELEASE 345Release a PMC. 346.It Dv PMC_OP_PMCRW 347Read and write a PMC. 348This operation is valid only for PMCs configured in counting modes. 349.It Dv PMC_OP_SETCOUNT 350Set the initial count (for counting mode PMCs) or the desired sampling 351rate (for sampling mode PMCs). 352.It Dv PMC_OP_PMCSTART 353Start a PMC. 354.It Dv PMC_OP_PMCSTOP 355Stop a PMC. 356.It Dv PMC_OP_WRITELOG 357Insert a timestamped user record into the log file. 358.El 359.Ss i386 Specific API 360Some i386 family CPUs support the RDPMC instruction which allows a 361user process to read a PMC value without needing to invoke a 362.Dv PMC_OP_PMCRW 363operation. 364On such CPUs, the machine address associated with an allocated PMC is 365retrievable using the 366.Dv PMC_OP_PMCX86GETMSR 367system call. 368.Bl -tag -width indent 369.It Dv PMC_OP_PMCX86GETMSR 370Retrieve the MSR (machine specific register) number associated with 371the given PMC handle. 372.Pp 373The PMC needs to be in process-private mode and allocated without the 374.Dv PMC_F_DESCENDANTS 375modifier flag, and should be attached only to its owner process at the 376time of the call. 377.El 378.Ss amd64 Specific API 379AMD64 CPUs support the RDPMC instruction which allows a 380user process to read a PMC value without needing to invoke a 381.Dv PMC_OP_PMCRW 382operation. 383The machine address associated with an allocated PMC is 384retrievable using the 385.Dv PMC_OP_PMCX86GETMSR 386system call. 387.Bl -tag -width indent 388.It Dv PMC_OP_PMCX86GETMSR 389Retrieve the MSR (machine specific register) number associated with 390the given PMC handle. 391.Pp 392The PMC needs to be in process-private mode and allocated without the 393.Dv PMC_F_DESCENDANTS 394modifier flag, and should be attached only to its owner process at the 395time of the call. 396.El 397.Sh SYSCTL VARIABLES AND LOADER TUNABLES 398The behavior of 399.Nm 400is influenced by the following 401.Xr sysctl 8 402and 403.Xr loader 8 404tunables: 405.Bl -tag -width indent 406.It Va kern.hwpmc.callchaindepth Pq integer, read-only 407The maximum number of call chain records to capture per sample. 408The default is 8. 409.It Va kern.hwpmc.debugflags Pq string, read-write 410(Only available if the 411.Nm 412driver was compiled with 413.Fl DDEBUG . ) 414Control the verbosity of debug messages from the 415.Nm 416driver. 417.It Va kern.hwpmc.hashsize Pq integer, read-only 418The number of rows in the hash tables used to keep track of owner and 419target processes. 420The default is 16. 421.It Va kern.hwpmc.logbuffersize Pq integer, read-only 422The size in kilobytes of each log buffer used by 423.Nm Ns 's 424logging function. 425The default buffer size is 4KB. 426.It Va kern.hwpmc.mtxpoolsize Pq integer, read-only 427The size of the spin mutex pool used by the PMC driver. 428The default is 32. 429.It Va kern.hwpmc.nbuffers Pq integer, read-only 430The number of log buffers used by 431.Nm 432for logging. 433The default is 64. 434.It Va kern.hwpmc.nsamples Pq integer, read-only 435The number of entries in the per-CPU ring buffer used during sampling. 436The default is 512. 437.It Va security.bsd.unprivileged_syspmcs Pq boolean, read-write 438If set to non-zero, allow unprivileged processes to allocate system-wide 439PMCs. 440The default value is 0. 441.It Va security.bsd.unprivileged_proc_debug Pq boolean, read-write 442If set to 0, the 443.Nm 444driver will only allow privileged processes to attach PMCs to other 445processes. 446.El 447.Pp 448These variables may be set in the kernel environment using 449.Xr kenv 1 450before 451.Nm 452is loaded. 453.Sh IMPLEMENTATION NOTES 454.Ss SMP Symmetry 455The kernel driver requires all physical CPUs in an SMP system to have 456identical performance monitoring counter hardware. 457.Ss Sparse CPU Numbering 458On platforms that sparsely number CPUs and which support hot-plugging 459of CPUs, requests that specify non-existent or disabled CPUs will fail 460with an error. 461Applications allocating system-scope PMCs need to be aware of 462the possibility of such transient failures. 463.Ss x86 TSC Handling 464Historically, on the x86 architecture, 465.Fx 466has permitted user processes running at a processor CPL of 3 to 467read the TSC using the RDTSC instruction. 468The 469.Nm 470driver preserves this behavior. 471.Ss Intel P4/HTT Handling 472On CPUs with HTT support, Intel P4 PMCs are capable of qualifying 473only a subset of hardware events on a per-logical CPU basis. 474Consequently, if HTT is enabled on a system with Intel Pentium P4 475PMCs, then the 476.Nm 477driver will reject allocation requests for process-private PMCs that 478request counting of hardware events that cannot be counted separately 479for each logical CPU. 480.Ss Intel Pentium-Pro Handling 481Writing a value to the PMC MSRs found in Intel Pentium-Pro style PMCs 482(found in 483.Tn "Intel Pentium Pro" , 484.Tn "Pentium II" , 485.Tn "Pentium III" , 486.Tn "Pentium M" 487and 488.Tn "Celeron" 489processors) will replicate bit 31 of the 490value being written into the upper 8 bits of the MSR, 491bringing down the usable width of these PMCs to 31 bits. 492For process-virtual PMCs, the 493.Nm 494driver implements a workaround in software and makes the corrected 64 495bit count available via the 496.Dv PMC_OP_RW 497operation. 498Processes that intend to use RDPMC instructions directly or 499that intend to write values larger than 2^31 into these PMCs with 500.Dv PMC_OP_RW 501need to be aware of this hardware limitation. 502.Sh DIAGNOSTICS 503.Bl -diag 504.It "hwpmc: [class/npmc/capabilities]..." 505Announce the presence of 506.Va npmc 507PMCs of class 508.Va class , 509with capabilities described by bit string 510.Va capabilities . 511.It "hwpmc: kernel version (0x%x) does not match module version (0x%x)." 512The module loading process failed because a version mismatch was detected 513between the currently executing kernel and the module being loaded. 514.It "hwpmc: this kernel has not been compiled with 'options HWPMC_HOOKS'." 515The module loading process failed because the currently executing kernel 516was not configured with the required configuration option 517.Dv HWPMC_HOOKS . 518.It "hwpmc: tunable hashsize=%d must be greater than zero." 519A negative value was supplied for tunable 520.Va kern.hwpmc.hashsize . 521.It "hwpmc: tunable logbuffersize=%d must be greater than zero." 522A negative value was supplied for tunable 523.Va kern.hwpmc.logbuffersize . 524.It "hwpmc: tunable nlogbuffers=%d must be greater than zero." 525A negative value was supplied for tunable 526.Va kern.hwpmc.nlogbuffers . 527.It "hwpmc: tunable nsamples=%d out of range." 528The value for tunable 529.Va kern.hwpmc.nsamples 530was negative or greater than 65535. 531.El 532.Sh COMPATIBILITY 533The 534.Nm 535driver is 536.Ud 537The API and ABI documented in this manual page may change in 538the future. 539The recommended method of accessing this driver is using the 540.Xr pmc 3 541API. 542.Sh ERRORS 543A command issued to the 544.Nm 545driver may fail with the following errors: 546.Bl -tag -width Er 547.It Bq Er EAGAIN 548Helper process creation failed for a 549.Dv PMC_OP_CONFIGURELOG 550request due to a temporary resource shortage in the kernel. 551.It Bq Er EBUSY 552A 553.Dv PMC_OP_CONFIGURELOG 554operation was requested while an existing log was active. 555.It Bq Er EBUSY 556A DISABLE operation was requested using the 557.Dv PMC_OP_PMCADMIN 558request for a set of hardware resources currently in use for 559process-private PMCs. 560.It Bq Er EBUSY 561A 562.Dv PMC_OP_PMCADMIN 563operation was requested on an active system mode PMC. 564.It Bq Er EBUSY 565A 566.Dv PMC_OP_PMCATTACH 567operation was requested for a target process that already had another 568PMC using the same hardware resources attached to it. 569.It Bq Er EBUSY 570A 571.Dv PMC_OP_PMCRW 572request writing a new value was issued on a PMC that was active. 573.It Bq Er EBUSY 574A 575.Dv PMC_OP_PMCSETCOUNT 576request was issued on a PMC that was active. 577.It Bq Er EDOOFUS 578A 579.Dv PMC_OP_PMCSTART 580operation was requested without a log file being configured for a 581PMC allocated with 582.Dv PMC_F_LOG_PROCCSW 583and 584.Dv PMC_F_LOG_PROCEXIT 585modifiers. 586.It Bq Er EDOOFUS 587A 588.Dv PMC_OP_PMCSTART 589operation was requested on a system-wide sampling PMC without a log 590file being configured. 591.It Bq Er EEXIST 592A 593.Dv PMC_OP_PMCATTACH 594request was reissued for a target process that already is the target 595of this PMC. 596.It Bq Er EFAULT 597A bad address was passed in to the driver. 598.It Bq Er EINVAL 599An invalid PMC handle was specified. 600.It Bq Er EINVAL 601An invalid CPU number was passed in for a 602.Dv PMC_OP_GETPMCINFO 603operation. 604.It Bq Er EINVAL 605A 606.Dv PMC_OP_CONFIGURELOG 607request to de-configure a log file was issued without a log file 608being configured. 609.It Bq Er EINVAL 610A 611.Dv PMC_OP_FLUSHLOG 612request was issued without a log file being configured. 613.It Bq Er EINVAL 614An invalid CPU number was passed in for a 615.Dv PMC_OP_PMCADMIN 616operation. 617.It Bq Er EINVAL 618An invalid operation request was passed in for a 619.Dv PMC_OP_PMCADMIN 620operation. 621.It Bq Er EINVAL 622An invalid PMC ID was passed in for a 623.Dv PMC_OP_PMCADMIN 624operation. 625.It Bq Er EINVAL 626A suitable PMC matching the parameters passed in to a 627.Dv PMC_OP_PMCALLOCATE 628request could not be allocated. 629.It Bq Er EINVAL 630An invalid PMC mode was requested during a 631.Dv PMC_OP_PMCALLOCATE 632request. 633.It Bq Er EINVAL 634An invalid CPU number was specified during a 635.Dv PMC_OP_PMCALLOCATE 636request. 637.It Bq Er EINVAL 638A CPU other than 639.Dv PMC_CPU_ANY 640was specified in a 641.Dv PMC_OP_PMCALLOCATE 642request for a process-private PMC. 643.It Bq Er EINVAL 644A CPU number of 645.Dv PMC_CPU_ANY 646was specified in a 647.Dv PMC_OP_PMCALLOCATE 648request for a system-wide PMC. 649.It Bq Er EINVAL 650The 651.Ar pm_flags 652argument to an 653.Dv PMC_OP_PMCALLOCATE 654request contained unknown flags. 655.It Bq Er EINVAL 656(On Intel Pentium 4 CPUs with HTT support) 657A 658.Dv PMC_OP_PMCALLOCATE 659request for a process-private PMC was issued for an event that does 660not support counting on a per-logical CPU basis. 661.It Bq Er EINVAL 662A PMC allocated for system-wide operation was specified with a 663.Dv PMC_OP_PMCATTACH 664or 665.Dv PMC_OP_PMCDETACH 666request. 667.It Bq Er EINVAL 668The 669.Ar pm_pid 670argument to a 671.Dv PMC_OP_PMCATTACH 672or 673.Dv PMC_OP_PMCDETACH 674request specified an illegal process ID. 675.It Bq Er EINVAL 676A 677.Dv PMC_OP_PMCDETACH 678request was issued for a PMC not attached to the target process. 679.It Bq Er EINVAL 680Argument 681.Ar pm_flags 682to a 683.Dv PMC_OP_PMCRW 684request contained illegal flags. 685.It Bq Er EINVAL 686A 687.Dv PMC_OP_PMCX86GETMSR 688operation was requested for a PMC not in process-virtual mode, or 689for a PMC that is not solely attached to its owner process, or for 690a PMC that was allocated with flag 691.Dv PMC_F_DESCENDANTS . 692.It Bq Er EINVAL 693A 694.Dv PMC_OP_WRITELOG 695request was issued for an owner process without a log file 696configured. 697.It Bq Er ENOMEM 698The system was not able to allocate kernel memory. 699.It Bq Er ENOSYS 700(On i386 and amd64 architectures) 701A 702.Dv PMC_OP_PMCX86GETMSR 703operation was requested for hardware that does not support reading 704PMCs directly with the RDPMC instruction. 705.It Bq Er ENXIO 706A 707.Dv PMC_OP_GETPMCINFO 708operation was requested for an absent or disabled CPU. 709.It Bq Er ENXIO 710A 711.Dv PMC_OP_PMCALLOCATE 712operation specified allocation of a system-wide PMC on an absent or 713disabled CPU. 714.It Bq Er ENXIO 715A 716.Dv PMC_OP_PMCSTART 717or 718.Dv PMC_OP_PMCSTOP 719request was issued for a system-wide PMC that was allocated on a CPU 720that is currently absent or disabled. 721.It Bq Er EOPNOTSUPP 722A 723.Dv PMC_OP_PMCALLOCATE 724request was issued for PMC capabilities not supported 725by the specified PMC class. 726.It Bq Er EOPNOTSUPP 727(i386 architectures) 728A sampling mode PMC was requested on a CPU lacking an APIC. 729.It Bq Er EPERM 730A 731.Dv PMC_OP_PMCADMIN 732request was issued by a process without super-user 733privilege or by a jailed super-user process. 734.It Bq Er EPERM 735A 736.Dv PMC_OP_PMCATTACH 737operation was issued for a target process that the current process 738does not have permission to attach to. 739.It Bq Er EPERM 740(i386 and amd64 architectures) 741A 742.Dv PMC_OP_PMCATTACH 743operation was issued on a PMC whose MSR has been retrieved using 744.Dv PMC_OP_PMCX86GETMSR . 745.It Bq Er ESRCH 746A process issued a PMC operation request without having allocated any 747PMCs. 748.It Bq Er ESRCH 749A process issued a PMC operation request after the PMC was detached 750from all of its target processes. 751.It Bq Er ESRCH 752A 753.Dv PMC_OP_PMCATTACH 754or 755.Dv PMC_OP_PMCDETACH 756request specified a non-existent process ID. 757.It Bq Er ESRCH 758The target process for a 759.Dv PMC_OP_PMCDETACH 760operation is not being monitored by 761.Nm . 762.El 763.Sh SEE ALSO 764.Xr kenv 1 , 765.Xr pmc 3 , 766.Xr pmclog 3 , 767.Xr kgmon 8 , 768.Xr kldload 8 , 769.Xr pmccontrol 8 , 770.Xr pmcstat 8 , 771.Xr sysctl 8 , 772.Xr kproc_create 9 , 773.Xr p_candebug 9 774.Sh HISTORY 775The 776.Nm 777driver first appeared in 778.Fx 6.0 . 779.Sh AUTHORS 780The 781.Nm 782driver was written by 783.An Joseph Koshy Aq Mt jkoshy@FreeBSD.org . 784.Sh BUGS 785The driver samples the state of the kernel's logical processor support 786at the time of initialization (i.e., at module load time). 787On CPUs supporting logical processors, the driver could misbehave if 788logical processors are subsequently enabled or disabled while the 789driver is active. 790.Pp 791On the i386 architecture, the driver requires that the local APIC on the 792CPU be enabled for sampling mode to be supported. 793Many single-processor motherboards keep the APIC disabled in BIOS; on 794such systems 795.Nm 796will not support sampling PMCs. 797.Sh SECURITY CONSIDERATIONS 798PMCs may be used to monitor the actual behavior of the system on hardware. 799In situations where this constitutes an undesirable information leak, 800the following options are available: 801.Bl -enum 802.It 803Set the 804.Xr sysctl 8 805tunable 806.Va security.bsd.unprivileged_syspmcs 807to 0. 808This ensures that unprivileged processes cannot allocate system-wide 809PMCs and thus cannot observe the hardware behavior of the system 810as a whole. 811This tunable may also be set at boot time using 812.Xr loader 8 , 813or with 814.Xr kenv 1 815prior to loading the 816.Nm 817driver into the kernel. 818.It 819Set the 820.Xr sysctl 8 821tunable 822.Va security.bsd.unprivileged_proc_debug 823to 0. 824This will ensure that an unprivileged process cannot attach a PMC 825to any process other than itself and thus cannot observe the hardware 826behavior of other processes with the same credentials. 827.El 828.Pp 829System administrators should note that on IA-32 platforms 830.Fx 831makes the content of the IA-32 TSC counter available to all processes 832via the RDTSC instruction. 833