Cleanup: Move instrumentation/ headers to include/instrumentation/
[lttng-modules.git] / include / instrumentation / syscalls / lttng-syscalls-extractor / lttng-syscalls-extractor.c
diff --git a/include/instrumentation/syscalls/lttng-syscalls-extractor/lttng-syscalls-extractor.c b/include/instrumentation/syscalls/lttng-syscalls-extractor/lttng-syscalls-extractor.c
new file mode 100644 (file)
index 0000000..0f68375
--- /dev/null
@@ -0,0 +1,98 @@
+/* SPDX-License-Identifier: (GPL-2.0-only or LGPL-2.1-only)
+ *
+ * lttng-syscalls-extractor.c
+ *
+ * Dump syscall metadata to console.
+ *
+ * Copyright 2011 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+ * Copyright 2011 Julien Desfossez <julien.desfossez@polymtl.ca>
+ */
+
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/types.h>
+#include <linux/list.h>
+#include <linux/err.h>
+#include <linux/slab.h>
+#include <linux/kallsyms.h>
+#include <linux/dcache.h>
+#include <linux/trace_events.h>
+#include <trace/syscall.h>
+#include <asm/syscall.h>
+
+#ifndef CONFIG_FTRACE_SYSCALLS
+#error "You need to set CONFIG_FTRACE_SYSCALLS=y"
+#endif
+
+#ifndef CONFIG_KALLSYMS_ALL
+#error "You need to set CONFIG_KALLSYMS_ALL=y"
+#endif
+
+/*
+ * The 'ident' parameter is prepended to each printk line to help
+ * extract the proper lines from dmesg.
+ */
+static char *ident = "";
+module_param(ident, charp, 0);
+
+static struct syscall_metadata **__start_syscalls_metadata;
+static struct syscall_metadata **__stop_syscalls_metadata;
+
+static __init
+struct syscall_metadata *find_syscall_meta(unsigned long syscall)
+{
+       struct syscall_metadata **iter;
+
+       for (iter = __start_syscalls_metadata;
+                       iter < __stop_syscalls_metadata; iter++) {
+               if ((*iter)->syscall_nr == syscall)
+                       return (*iter);
+       }
+       return NULL;
+}
+
+int init_module(void)
+{
+       struct syscall_metadata *meta;
+       int i;
+
+       __start_syscalls_metadata = (void *) kallsyms_lookup_name("__start_syscalls_metadata");
+       __stop_syscalls_metadata = (void *) kallsyms_lookup_name("__stop_syscalls_metadata");
+
+       printk("%s---START---\n", ident);
+       for (i = 0; i < NR_syscalls; i++) {
+               int j;
+
+               meta = find_syscall_meta(i);
+               if (!meta)
+                       continue;
+               printk("%ssyscall %s nr %d nbargs %d ",
+                       ident, meta->name, meta->syscall_nr, meta->nb_args);
+               printk(KERN_CONT "types: (");
+               for (j = 0; j < meta->nb_args; j++) {
+                       if (j > 0)
+                               printk(KERN_CONT ", ");
+                       printk(KERN_CONT "%s", meta->types[j]);
+               }
+               printk(KERN_CONT ") ");
+               printk(KERN_CONT "args: (");
+               for (j = 0; j < meta->nb_args; j++) {
+                       if (j > 0)
+                               printk(KERN_CONT ", ");
+                       printk(KERN_CONT "%s", meta->args[j]);
+               }
+               printk(KERN_CONT ")\n");
+       }
+       printk("%s---END---\n", ident);
+
+       /*
+        * This module always fails to load.
+        */
+       return -1;
+}
+
+void cleanup_module(void)
+{
+}
+
+MODULE_LICENSE("GPL");
This page took 0.02411 seconds and 4 git commands to generate.