lttng-context-vtid.o lttng-context-ppid.o \
lttng-context-vppid.o lttng-calibrate.o
-#add for testing lttng-syscalls.o
+ifneq ($(CONFIG_HAVE_SYSCALL_TRACEPOINTS),)
+ltt-relay-objs += lttng-syscalls.o
+endif
ifneq ($(CONFIG_PERF_EVENTS),)
ltt-relay-objs += $(shell \
--- /dev/null
+#undef TRACE_SYSTEM
+#define TRACE_SYSTEM syscalls_unknown
+
+#if !defined(_TRACE_SYSCALLS_UNKNOWN_H) || defined(TRACE_HEADER_MULTI_READ)
+#define _TRACE_SYSCALLS_UNKNOWN_H
+
+#include <linux/tracepoint.h>
+#include <linux/syscalls.h>
+
+#define UNKNOWN_SYSCALL_NRARGS 6
+
+TRACE_EVENT(sys_unknown,
+ TP_PROTO(unsigned int id, unsigned long *args),
+ TP_ARGS(id, args),
+ TP_STRUCT__entry(
+ __field(unsigned int, id)
+ __array(unsigned long, args, UNKNOWN_SYSCALL_NRARGS)
+ ),
+ TP_fast_assign(
+ tp_assign(id, id)
+ tp_memcpy(args, args, UNKNOWN_SYSCALL_NRARGS * sizeof(*args))
+ ),
+ TP_printk()
+)
+/*
+ * This is going to hook on sys_exit in the kernel.
+ * We change the name so we don't clash with the sys_exit syscall entry
+ * event.
+ */
+TRACE_EVENT(exit_syscall,
+ TP_PROTO(long errno),
+ TP_ARGS(errno),
+ TP_STRUCT__entry(
+ __field(long, errno)
+ ),
+ TP_fast_assign(
+ tp_assign(errno, errno)
+ ),
+ TP_printk()
+)
+
+#endif /* _TRACE_SYSCALLS_UNKNOWN_H */
+
+/* This part must be outside protection */
+#include "../../../probes/define_trace.h"
int ltt_probes_init(void);
void ltt_probes_exit(void);
-#ifdef SYSCALL_DETAIL
+#ifdef CONFIG_HAVE_SYSCALL_TRACEPOINTS
int lttng_syscalls_register(struct ltt_channel *chan, void *filter);
int lttng_syscalls_unregister(struct ltt_channel *chan);
#else
#define TRACE_INCLUDE_PATH ../instrumentation/syscalls/headers
#include "instrumentation/syscalls/headers/syscalls_integers.h"
#include "instrumentation/syscalls/headers/syscalls_pointers.h"
+#include "instrumentation/syscalls/headers/syscalls_unknown.h"
#undef TP_MODULE_OVERRIDE
#undef TP_PROBE_CB
#include "instrumentation/syscalls/headers/syscalls_pointers.h"
};
+static int sc_table_filled;
+
#undef CREATE_SYSCALL_TABLE
static void syscall_entry_probe(void *__data, struct pt_regs *regs, long id)
}
}
+static void fill_sc_table(void)
+{
+ int i;
+
+ if (sc_table_filled) {
+ smp_rmb(); /* read flag before table */
+ return;
+ }
+
+ for (i = 0; i < ARRAY_SIZE(sc_table); i++) {
+ if (sc_table[i].func)
+ continue;
+ sc_table[i].func = __event_probe__sys_unknown;
+ sc_table[i].nrargs = UNKNOWN_SYSCALL_NRARGS;
+ sc_table[i].fields = __event_fields___sys_unknown;
+ sc_table[i].desc = &__event_desc___sys_unknown;
+ }
+ smp_wmb(); /* Fill sc table before set flag to 1 */
+ sc_table_filled = 1;
+}
+
int lttng_syscalls_register(struct ltt_channel *chan, void *filter)
{
unsigned int i;
wrapper_vmalloc_sync_all();
+ fill_sc_table();
+
if (!chan->sc_table) {
/* create syscall table mapping syscall to events */
chan->sc_table = kzalloc(sizeof(struct ltt_event *)
struct lttng_kernel_event ev;
const struct lttng_event_desc *desc = sc_table[i].desc;
- if (!desc)
- continue;
+ WARN_ON_ONCE(!desc);
/*
* Skip those already populated by previous failed
* register for this channel.
}
ret = tracepoint_probe_register("sys_enter",
(void *) syscall_entry_probe, chan);
+ if (ret)
+ return ret;
+ /*
+ * We change the name of sys_exit tracepoint due to namespace
+ * conflict with sys_exit syscall entry.
+ */
+ ret = tracepoint_probe_register("sys_exit",
+ (void *) __event_probe__exit_syscall, chan);
+ if (ret) {
+ WARN_ON_ONCE(tracepoint_probe_unregister("sys_enter",
+ (void *) syscall_entry_probe, chan));
+ }
return ret;
}
if (!chan->sc_table)
return 0;
+ ret = tracepoint_probe_unregister("sys_exit",
+ (void *) __event_probe__exit_syscall, chan);
+ if (ret)
+ return ret;
ret = tracepoint_probe_unregister("sys_enter",
(void *) syscall_entry_probe, chan);
if (ret)
obj-m += lttng-probe-sched.o
obj-m += lttng-probe-irq.o
-ifneq ($(CONFIG_HAVE_SYSCALL_TRACEPOINTS),)
-obj-m += lttng-probe-syscalls.o
-endif
-
ifneq ($(CONFIG_KVM),)
obj-m += lttng-probe-kvm.o
endif
+++ /dev/null
-/*
- * probes/lttng-probe-syscalls.c
- *
- * Copyright 2010 (c) - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * LTTng syscalls probes.
- *
- * Dual LGPL v2.1/GPL v2 license.
- */
-
-#include <linux/module.h>
-#include "../ltt-events.h"
-
-/*
- * Create the tracepoint static inlines from the kernel to validate that our
- * trace event macros match the kernel we run on.
- */
-#include <trace/events/syscalls.h>
-
-/*
- * Create LTTng tracepoint probes.
- */
-#define LTTNG_PACKAGE_BUILD
-#define CREATE_TRACE_POINTS
-#define TRACE_INCLUDE_PATH ../instrumentation/events/lttng-module
-
-#include "../instrumentation/events/lttng-module/syscalls.h"
-
-MODULE_LICENSE("GPL and additional rights");
-MODULE_AUTHOR("Mathieu Desnoyers <mathieu.desnoyers@efficios.com>");
-MODULE_DESCRIPTION("LTTng generic syscall probes");