diff options
| author | Jacob McDonnell <jacob@jacobmcdonnell.com> | 2026-04-25 14:02:27 -0400 |
|---|---|---|
| committer | Jacob McDonnell <jacob@jacobmcdonnell.com> | 2026-04-25 14:02:27 -0400 |
| commit | 6d8bdc65446a704d0750217efd05532fc641ea7d (patch) | |
| tree | 8ae6d698b3c9801750a8b117b3842fb369872a3a /static/openbsd/man4/man4.amd64/pctr.4 | |
| parent | 2f467bd7ff8f8db0dafa40426166491d7f57f368 (diff) | |
docs: OpenBSD Man Pages Added
Diffstat (limited to 'static/openbsd/man4/man4.amd64/pctr.4')
| -rw-r--r-- | static/openbsd/man4/man4.amd64/pctr.4 | 234 |
1 files changed, 234 insertions, 0 deletions
diff --git a/static/openbsd/man4/man4.amd64/pctr.4 b/static/openbsd/man4/man4.amd64/pctr.4 new file mode 100644 index 00000000..c024acc4 --- /dev/null +++ b/static/openbsd/man4/man4.amd64/pctr.4 @@ -0,0 +1,234 @@ +.\" $OpenBSD: pctr.4,v 1.8 2019/10/05 20:53:49 matthieu Exp $ +.\" +.\" Pentium performance counter driver for OpenBSD. +.\" Copyright 1996 David Mazieres <dm@lcs.mit.edu>. +.\" +.\" Modification and redistribution in source and binary forms is +.\" permitted provided that due credit is given to the author and the +.\" OpenBSD project by leaving this copyright notice intact. +.\" +.Dd $Mdocdate: October 5 2019 $ +.Dt PCTR 4 amd64 +.Os +.Sh NAME +.Nm pctr +.Nd driver for CPU performance counters +.Sh SYNOPSIS +.Cd "pseudo-device pctr 1" +.Sh DESCRIPTION +The +.Nm +device provides access to the performance counters on AMD and Intel brand +processors, and to the TSC on others. +.Pp +Intel processors have two 40-bit performance counters which can be +programmed to count events such as cache misses, branch target buffer hits, +TLB misses, dual-issues, interrupts, pipeline flushes, and more. +While AMD processors have four 48-bit counters, their precision is decreased +to 40 bits. +.Pp +There is one +.Em ioctl +call to read the status of all counters, and one +.Em ioctl +call to program the function of each counter. +All require the following includes: +.Bd -literal -offset indent +#include <sys/types.h> +#include <machine/cpu.h> +#include <machine/pctr.h> +.Ed +.Pp +The current state of all counters can be read with the +.Dv PCIOCRD +.Em ioctl , +which takes an argument of type +.Dv "struct pctrst" : +.Bd -literal -offset indent +#define PCTR_NUM 4 +struct pctrst { + u_int pctr_fn[PCTR_NUM]; + pctrval pctr_tsc; + pctrval pctr_hwc[PCTR_NUM]; +}; +.Ed +.Pp +In this structure, +.Em ctr_fn +contains the functions of the counters, as previously set by the +.Dv PCIOCS0 , +.Dv PCIOCS1 , +.Dv PCIOCS2 +and +.Dv PCIOCS3 +ioctls (see below). +.Em pctr_hwc +contains the actual value of the hardware counters. +.Em pctr_tsc +is a free-running, 64-bit cycle counter. +.Pp +The functions of the counters can be programmed with ioctls +.Dv PCIOCS0 , +.Dv PCIOCS1 , +.Dv PCIOCS2 +and +.Dv PCIOCS3 +which require a writeable file descriptor and take an argument of type +.Dv "unsigned int" . \& +The meaning of this integer is dependent on the particular CPU. +.Ss Time stamp counter +The time stamp counter is available on most of the AMD and Intel CPUs. +It is set to zero at boot time, and then increments with each cycle. +Because the counter is 64-bits wide, it does not overflow. +.Pp +The value of the time stamp counter is returned by the +.Dv PCIOCRD +.Em ioctl , +so that one can get an exact timestamp on readings of the hardware +event counters. +.Pp +The performance counters can be read directly from user-mode without +need to invoke the kernel. +The macro +.Fn rdpmc ctr +takes 0, 1, 2 or 3 as an argument to specify a counter, and returns that +counter's 40-bit value (which will be of type +.Em pctrval ) . +This is generally preferable to making a system call as it introduces +less distortion in measurements. +.Pp +Counter functions supported by these CPUs contain several parts. +The most significant byte (an 8-bit integer shifted left by +.Dv PCTR_CM_SHIFT ) +contains a +.Em "counter mask" . +If non-zero, this sets a threshold for the number of times an event +must occur in one cycle for the counter to be incremented. +The +.Em "counter mask" +can therefore be used to count cycles in which an event +occurs at least some number of times. +The next byte contains several flags: +.Bl -tag -width PCTR_EN +.It Dv PCTR_U +Enables counting of events that occur in user mode. +.It Dv PCTR_K +Enables counting of events that occur in kernel mode. +You must set at least one of +.Dv PCTR_K +and +.Dv PCTR_U +to count anything. +.It Dv PCTR_E +Counts edges rather than cycles. +For some functions this allows you +to get an estimate of the number of events rather than the number of +cycles occupied by those events. +.It Dv PCTR_EN +Enable counters. +This bit must be set in the function for counter 0 +in order for either of the counters to be enabled. +This bit should probably be set in counter 1 as well. +.It Dv PCTR_I +Inverts the sense of the +.Em "counter mask" . \& +When this bit is set, the counter only increments on cycles in which +there are no +.Em more +events than specified in the +.Em "counter mask" . +.El +.Pp +The next byte (shifted left by the +.Dv PCTR_UM_SHIFT ) +contains flags specific to the event being counted, also known as the +.Em "unit mask" . +.Pp +For events dealing with the L2 cache, the following flags are valid +on Intel brand processors: +.Bl -tag -width PCTR_UM_M +.It Dv PCTR_UM_M +Count events involving modified cache coherency state lines. +.It Dv PCTR_UM_E +Count events involving exclusive cache coherency state lines. +.It Dv PCTR_UM_S +Count events involving shared cache coherency state lines. +.It Dv PCTR_UM_I +Count events involving invalid cache coherency state lines. +.El +.Pp +To measure all L2 cache activity, all these bits should be set. +They can be set with the macro +.Dv PCTR_UM_MESI +which contains the bitwise or of all of the above. +.Pp +For event types dealing with bus transactions, there is another flag +that can be set in the +.Em "unit mask" : +.Bl -tag -width PCTR_UM_A +.It Dv PCTR_UM_A +Count all appropriate bus events, not just those initiated by the +processor. +.El +.Pp +Events marked +.Em (MESI) +require the +.Dv PCTR_UM_[MESI] +bits in the +.Em "unit mask" . \& +Events marked +.Em (A) +can take the +.Dv PCTR_UM_A +bit. +.Pp +Finally, the least significant byte of the counter function is the +event type to count. +A list of possible event functions could be obtained by running a +.Xr pctr 1 +command with +.Fl l +option. +.Sh FILES +.Bl -tag -width /dev/pctr -compact +.It Pa /dev/pctr +.El +.Sh ERRORS +.Bl -tag -width "[ENODEV]" +.It Bq Er ENODEV +An attempt was made to set the counter functions on a CPU that does +not support counters. +.It Bq Er EINVAL +An invalid counter function was provided as an argument to the +.Dv PCIOCSx +.Em ioctl . +.It Bq Er EPERM +An attempt was made to set the counter functions, but the device was +not open for writing. +.El +.Sh SEE ALSO +.Xr pctr 1 , +.Xr ioctl 2 +.Sh HISTORY +A +.Nm +device first appeared in +.Ox 2.0 . +Support for amd64 architecture appeared in +.Ox 4.3 . +.Sh AUTHORS +.An -nosplit +The +.Nm +device was written by +.An David Mazieres Aq Mt dm@lcs.mit.edu . +Support for amd64 architecture was written by +.An Mike Belopuhov Aq Mt mikeb@openbsd.org . +.Sh BUGS +Not all counter functions are completely accurate. +Some of the functions may not make any sense at all. +Also you should be aware of the possibility of an interrupt between +invocations of +.Fn rdpmc +that can potentially decrease the accuracy of measurements. |
