summaryrefslogtreecommitdiff
path: root/static/openbsd/man4/kcov.4
diff options
context:
space:
mode:
Diffstat (limited to 'static/openbsd/man4/kcov.4')
-rw-r--r--static/openbsd/man4/kcov.4206
1 files changed, 206 insertions, 0 deletions
diff --git a/static/openbsd/man4/kcov.4 b/static/openbsd/man4/kcov.4
new file mode 100644
index 00000000..9cbce9ee
--- /dev/null
+++ b/static/openbsd/man4/kcov.4
@@ -0,0 +1,206 @@
+.\" $OpenBSD: kcov.4,v 1.10 2021/12/30 06:55:37 anton Exp $
+.\"
+.\" Copyright (c) 2018 Anton Lindqvist <anton@openbsd.org>
+.\"
+.\" Permission to use, copy, modify, and distribute this software for any
+.\" purpose with or without fee is hereby granted, provided that the above
+.\" copyright notice and this permission notice appear in all copies.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+.\"
+.Dd $Mdocdate: December 30 2021 $
+.Dt KCOV 4
+.Os
+.Sh NAME
+.Nm kcov
+.Nd kernel code coverage tracing
+.Sh SYNOPSIS
+.Cd pseudo-device kcov
+.Pp
+.In sys/kcov.h
+.Sh DESCRIPTION
+The
+.Nm
+driver implements collection of code coverage inside the kernel.
+It can be enabled on a per thread basis from user space,
+allowing the kernel program counter to be collected during syscalls triggered by
+the same thread.
+The collected coverage can be accessed by mapping the device
+using
+.Xr mmap 2 .
+.Pp
+By default,
+.Nm
+is not enabled but instead requires the following line to be present in the
+kernel configuration:
+.Bd -literal -offset indent
+pseudo-device kcov 1
+.Ed
+.Pp
+The following
+.Xr ioctl 2
+calls are provided:
+.Bl -tag -width 4n
+.It Dv KIOSETBUFSIZE Fa unsigned long *nentries
+Allocate a coverage buffer with a capacity of
+.Fa nentries .
+The buffer can be accessed using
+.Xr mmap 2 ,
+whereas the returned pointer must be interpreted as an array of
+.Vt unsigned long
+entries.
+The first entry contains the number of entries in the array,
+excluding the first entry.
+.It Dv KIOENABLE Fa int *mode
+Enable code coverage tracing for the current thread or any remote
+subsystem attached using
+.Dv KIOREMOTEATTACH .
+The
+.Fa mode
+must be one of the following:
+.Bl -ohang
+.It Dv KCOV_MODE_TRACE_PC
+Trace the kernel program counter.
+.It Dv KCOV_MODE_TRACE_CMP
+Trace comparison instructions and switch statements.
+For switch statements, the number of traced comparison instructions is equal to
+the number of switch cases.
+Each traced comparison instruction is represented by 4 entries in the coverage
+buffer:
+.Bl -enum
+.It
+A mask where the least significant bit is set if one of the comparison operands
+is a compile-time constant, which is always true for switch statements.
+The remaining bits represents the log2 size of the operands, ranging from 0 to
+3.
+.It
+First comparison operand.
+For switch statements, this operand corresponds to the case value.
+.It
+Second comparison operand.
+For switch statements, this operand corresponds to the value passed to switch.
+.It
+Kernel program counter where the comparison instruction took place.
+.El
+.Pp
+In this mode, the first entry in the coverage buffer reflects the number of
+traced comparison instructions.
+Thus, the effective number of entries in the coverage buffer is given by
+multiplying the first entry by 4.
+.El
+.It Dv KIODISABLE Fa void
+Disable code coverage tracing for the current thread.
+.It Dv KIOREMOTEATTACH Fa struct kio_remote_attach *remote
+Attach collection of remote coverage from other kernel threads, identified
+by a subsystem.
+Collection of remote coverage is mutually exclusive with coverage collection
+of the current thread.
+The
+.Va remote
+argument is a pointer to the following structure:
+.Bd -literal
+struct kio_remote_attach {
+ int subsystem;
+ int id;
+};
+.Ed
+.Pp
+The
+.Va subsystem
+field must be one of the following:
+.Bl -ohang
+.It Dv KCOV_REMOTE_COMMON
+Collect coverage from tasks and timeouts scheduled by the current process,
+see
+.Xr task_add 9
+and
+.Xr timeout 9 .
+The
+.Fa id
+field is ignored.
+.El
+.El
+.Sh FILES
+.Bl -tag -width /dev/kcov -compact
+.It Pa /dev/kcov
+Default device node.
+.El
+.Sh EXAMPLES
+In the following example,
+the
+.Xr read 2
+syscall is traced and the coverage displayed, which in turn can be passed to
+.Xr addr2line 1
+in order to translate the kernel program counter into the file name and line
+number it corresponds to.
+.Bd -literal
+#include <sys/ioctl.h>
+#include <sys/kcov.h>
+#include <sys/mman.h>
+
+#include <err.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+int
+main(void)
+{
+ unsigned long *cover, i;
+ unsigned long size = 1024;
+ int fd, mode;
+
+ fd = open("/dev/kcov", O_RDWR);
+ if (fd == -1)
+ err(1, "open");
+
+ if (ioctl(fd, KIOSETBUFSIZE, &size) == -1)
+ err(1, "ioctl: KIOSETBUFSIZE");
+ cover = mmap(NULL, size * sizeof(unsigned long),
+ PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+ if (cover == MAP_FAILED)
+ err(1, "mmap");
+
+ mode = KCOV_MODE_TRACE_PC;
+ if (ioctl(fd, KIOENABLE, &mode) == -1)
+ err(1, "ioctl: KIOENABLE");
+ read(-1, NULL, 0);
+ if (ioctl(fd, KIODISABLE) == -1)
+ err(1, "ioctl: KIODISABLE");
+
+ for (i = 0; i < cover[0]; i++)
+ printf("%p\en", (void *)cover[i + 1]);
+
+ if (munmap(cover, size * sizeof(unsigned long)) == -1)
+ err(1, "munmap");
+ close(fd);
+
+ return 0;
+}
+.Ed
+.Sh SEE ALSO
+.Xr files.conf 5 ,
+.Xr kcov_remote_register 9
+.Sh HISTORY
+The
+.Nm
+driver first appeared in
+.Ox 6.4 .
+.Sh AUTHORS
+The
+.Nm
+driver was written by
+.An Anton Lindqvist Aq Mt anton@openbsd.org .
+.Sh CAVEATS
+The
+.Nm
+driver is limited to architectures using
+.Xr clang 1
+as their default compiler.