summaryrefslogtreecommitdiff
path: root/lib/libsysdecode/linux.c
diff options
context:
space:
mode:
authorDmitry Chagin <dchagin@FreeBSD.org>2022-06-22 10:58:53 +0000
committerDmitry Chagin <dchagin@FreeBSD.org>2022-06-22 10:58:53 +0000
commitb69ae1a34c6f918118693490f18a81ecd7163f83 (patch)
treec3f2abdc8b3c2248920ee70e5be5caf3dc51a144 /lib/libsysdecode/linux.c
parent9dac609629d4e0ba813df6169f8bd8383fca024f (diff)
Diffstat (limited to 'lib/libsysdecode/linux.c')
-rw-r--r--lib/libsysdecode/linux.c106
1 files changed, 106 insertions, 0 deletions
diff --git a/lib/libsysdecode/linux.c b/lib/libsysdecode/linux.c
new file mode 100644
index 000000000000..68b6c3fa9472
--- /dev/null
+++ b/lib/libsysdecode/linux.c
@@ -0,0 +1,106 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright (c) 2022 Dmitry Chagin <dchagin@FreeBSD.orf>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/types.h>
+#include <sys/proc.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <sysdecode.h>
+
+#include "support.h"
+
+#ifdef __aarch64__
+#include <arm64/linux/linux.h>
+#elif __i386__
+#include <i386/linux/linux.h>
+#elif __amd64__
+#ifdef COMPAT_32BIT
+#include <amd64/linux32/linux.h>
+#else
+#include <amd64/linux/linux.h>
+#endif
+#else
+#error "Unsupported Linux arch"
+#endif
+
+#include <compat/linux/linux.h>
+#include <compat/linux/linux_timer.h>
+
+#define X(a,b) { a, #b },
+#define XEND { 0, NULL }
+
+#define TABLE_START(n) static struct name_table n[] = {
+#define TABLE_ENTRY X
+#define TABLE_END XEND };
+
+#include "tables_linux.h"
+
+#undef TABLE_START
+#undef TABLE_ENTRY
+#undef TABLE_END
+
+void
+sysdecode_linux_clockid(FILE *fp, clockid_t which)
+{
+ const char *str;
+ clockid_t ci;
+ pid_t pid;
+
+ if (which >= 0) {
+ str = lookup_value(clockids, which);
+ if (str == NULL)
+ fprintf(fp, "UNKNOWN(%d)", which);
+ else
+ fputs(str, fp);
+ return;
+ }
+ if ((which & LINUX_CLOCKFD_MASK) == LINUX_CLOCKFD_MASK) {
+ fputs("INVALID PERTHREAD|CLOCKFD", fp);
+ goto pidp;
+ }
+ ci = LINUX_CPUCLOCK_WHICH(which);
+ if (LINUX_CPUCLOCK_PERTHREAD(which) == true)
+ fputs("THREAD|", fp);
+ else
+ fputs("PROCESS|", fp);
+ str = lookup_value(clockcpuids, ci);
+ if (str != NULL)
+ fputs(str, fp);
+ else {
+ if (ci == LINUX_CLOCKFD)
+ fputs("CLOCKFD", fp);
+ else
+ fprintf(fp, "UNKNOWN(%d)", which);
+ }
+
+pidp:
+ pid = LINUX_CPUCLOCK_ID(which);
+ fprintf(fp, "(%d)", pid);
+}