#include <linux/bitmap.h>
#include <linux/in.h>
#include <linux/in6.h>
+#include <linux/seq_file.h>
#include <asm/ptrace.h>
#include <asm/syscall.h>
/* Hijack probe callback for system call enter */
#undef TP_PROBE_CB
#define TP_PROBE_CB(_template) &syscall_entry_probe
-#define SC_TRACE_EVENT(_name, _proto, _args, _struct, _assign, _printk) \
+#define SC_LTTNG_TRACEPOINT_EVENT(_name, _proto, _args, _struct, _assign, _printk) \
LTTNG_TRACEPOINT_EVENT(syscall_enter_##_name, PARAMS(_proto), PARAMS(_args), \
PARAMS(_struct), PARAMS(_assign), PARAMS(_printk))
-#define SC_LTTNG_TRACE_EVENT(_name, _proto, _args, _locvar, _code, _struct, _assign, _printk) \
- LTTNG_TRACEPOINT_EVENT_CODE(syscall_enter_##_name, PARAMS(_proto), PARAMS(_args),\
- PARAMS(_locvar), PARAMS(_code),\
+#define SC_LTTNG_TRACEPOINT_EVENT_CODE(_name, _proto, _args, _locvar, _code, _struct, _assign, _printk) \
+ LTTNG_TRACEPOINT_EVENT_CODE(syscall_enter_##_name, PARAMS(_proto), PARAMS(_args), \
+ PARAMS(_locvar), PARAMS(_code), \
PARAMS(_struct), PARAMS(_assign), PARAMS(_printk))
-#define SC_DECLARE_EVENT_CLASS_NOARGS(_name, _struct, _assign, _printk) \
+#define SC_LTTNG_TRACEPOINT_EVENT_CLASS_NOARGS(_name, _struct, _assign, _printk) \
LTTNG_TRACEPOINT_EVENT_CLASS_NOARGS(syscall_enter_##_name, PARAMS(_struct), PARAMS(_assign), \
PARAMS(_printk))
-#define SC_DEFINE_EVENT_NOARGS(_template, _name) \
+#define SC_LTTNG_TRACEPOINT_EVENT_INSTANCE_NOARGS(_template, _name) \
LTTNG_TRACEPOINT_EVENT_INSTANCE_NOARGS(syscall_enter_##_template, syscall_enter_##_name)
#undef TRACE_SYSTEM
#define TRACE_SYSTEM syscall_enter_integers
#include "instrumentation/syscalls/headers/syscalls_pointers.h"
#undef TRACE_INCLUDE_FILE
#undef TRACE_SYSTEM
-#undef SC_LTTNG_TRACE_EVENT
-#undef SC_TRACE_EVENT
-#undef SC_DECLARE_EVENT_CLASS_NOARGS
-#undef SC_DEFINE_EVENT_NOARGS
+#undef SC_LTTNG_TRACEPOINT_EVENT_CODE
+#undef SC_LTTNG_TRACEPOINT_EVENT
+#undef SC_LTTNG_TRACEPOINT_EVENT_CLASS_NOARGS
+#undef SC_LTTNG_TRACEPOINT_EVENT_INSTANCE_NOARGS
#undef TP_PROBE_CB
#undef _TRACE_SYSCALLS_INTEGERS_H
#undef _TRACE_SYSCALLS_POINTERS_H
/* Hijack probe callback for compat system call enter */
#define TP_PROBE_CB(_template) &syscall_entry_probe
-#define SC_TRACE_EVENT(_name, _proto, _args, _struct, _assign, _printk) \
+#define SC_LTTNG_TRACEPOINT_EVENT(_name, _proto, _args, _struct, _assign, _printk) \
LTTNG_TRACEPOINT_EVENT(compat_syscall_enter_##_name, PARAMS(_proto), PARAMS(_args), \
- PARAMS(_struct), PARAMS(_assign), \
+ PARAMS(_struct), PARAMS(_assign), \
PARAMS(_printk))
-#define SC_LTTNG_TRACE_EVENT(_name, _proto, _args, _locvar, _code, _struct, _assign, _printk) \
+#define SC_LTTNG_TRACEPOINT_EVENT_CODE(_name, _proto, _args, _locvar, _code, _struct, _assign, _printk) \
LTTNG_TRACEPOINT_EVENT_CODE(compat_syscall_enter_##_name, PARAMS(_proto), PARAMS(_args), \
- PARAMS(_locvar), PARAMS(_code),\
+ PARAMS(_locvar), PARAMS(_code), \
PARAMS(_struct), PARAMS(_assign), PARAMS(_printk))
-#define SC_DECLARE_EVENT_CLASS_NOARGS(_name, _struct, _assign, _printk) \
+#define SC_LTTNG_TRACEPOINT_EVENT_CLASS_NOARGS(_name, _struct, _assign, _printk) \
LTTNG_TRACEPOINT_EVENT_CLASS_NOARGS(compat_syscall_enter_##_name, PARAMS(_struct), \
PARAMS(_assign), PARAMS(_printk))
-#define SC_DEFINE_EVENT_NOARGS(_template, _name) \
+#define SC_LTTNG_TRACEPOINT_EVENT_INSTANCE_NOARGS(_template, _name) \
LTTNG_TRACEPOINT_EVENT_INSTANCE_NOARGS(compat_syscall_enter_##_template, \
compat_syscall_enter_##_name)
#define TRACE_SYSTEM compat_syscall_enter_integers
#include "instrumentation/syscalls/headers/compat_syscalls_pointers.h"
#undef TRACE_INCLUDE_FILE
#undef TRACE_SYSTEM
-#undef SC_LTTNG_TRACE_EVENT
-#undef SC_TRACE_EVENT
-#undef SC_DECLARE_EVENT_CLASS_NOARGS
-#undef SC_DEFINE_EVENT_NOARGS
+#undef SC_LTTNG_TRACEPOINT_EVENT_CODE
+#undef SC_LTTNG_TRACEPOINT_EVENT
+#undef SC_LTTNG_TRACEPOINT_EVENT_CLASS_NOARGS
+#undef SC_LTTNG_TRACEPOINT_EVENT_INSTANCE_NOARGS
#undef TP_PROBE_CB
#undef _TRACE_SYSCALLS_INTEGERS_H
#undef _TRACE_SYSCALLS_POINTERS_H
/* Hijack probe callback for system call exit */
#define TP_PROBE_CB(_template) &syscall_exit_probe
-#define SC_TRACE_EVENT(_name, _proto, _args, _struct, _assign, _printk) \
+#define SC_LTTNG_TRACEPOINT_EVENT(_name, _proto, _args, _struct, _assign, _printk) \
LTTNG_TRACEPOINT_EVENT(syscall_exit_##_name, PARAMS(_proto), PARAMS(_args), \
PARAMS(_struct), PARAMS(_assign), PARAMS(_printk))
-#define SC_LTTNG_TRACE_EVENT(_name, _proto, _args, _locvar, _code, _struct, _assign, _printk) \
+#define SC_LTTNG_TRACEPOINT_EVENT_CODE(_name, _proto, _args, _locvar, _code, _struct, _assign, _printk) \
LTTNG_TRACEPOINT_EVENT_CODE(syscall_exit_##_name, PARAMS(_proto), PARAMS(_args), \
- PARAMS(_locvar), PARAMS(_code), \
+ PARAMS(_locvar), PARAMS(_code), \
PARAMS(_struct), PARAMS(_assign), PARAMS(_printk))
-#define SC_DECLARE_EVENT_CLASS_NOARGS(_name, _struct, _assign, _printk) \
+#define SC_LTTNG_TRACEPOINT_EVENT_CLASS_NOARGS(_name, _struct, _assign, _printk) \
LTTNG_TRACEPOINT_EVENT_CLASS_NOARGS(syscall_exit_##_name, PARAMS(_struct), \
PARAMS(_assign), PARAMS(_printk))
-#define SC_DEFINE_EVENT_NOARGS(_template, _name) \
- LTTNG_TRACEPOINT_EVENT_INSTANCE_NOARGS(syscall_exit_##_template, \
+#define SC_LTTNG_TRACEPOINT_EVENT_INSTANCE_NOARGS(_template, _name) \
+ LTTNG_TRACEPOINT_EVENT_INSTANCE_NOARGS(syscall_exit_##_template, \
syscall_exit_##_name)
#define TRACE_SYSTEM syscall_exit_integers
#define TRACE_INCLUDE_FILE syscalls_integers
#include "instrumentation/syscalls/headers/syscalls_pointers.h"
#undef TRACE_INCLUDE_FILE
#undef TRACE_SYSTEM
-#undef SC_LTTNG_TRACE_EVENT
-#undef SC_TRACE_EVENT
-#undef SC_DECLARE_EVENT_CLASS_NOARGS
-#undef SC_DEFINE_EVENT_NOARGS
+#undef SC_LTTNG_TRACEPOINT_EVENT_CODE
+#undef SC_LTTNG_TRACEPOINT_EVENT
+#undef SC_LTTNG_TRACEPOINT_EVENT_CLASS_NOARGS
+#undef SC_LTTNG_TRACEPOINT_EVENT_INSTANCE_NOARGS
#undef TP_PROBE_CB
#undef _TRACE_SYSCALLS_INTEGERS_H
#undef _TRACE_SYSCALLS_POINTERS_H
/* Hijack probe callback for compat system call exit */
#define TP_PROBE_CB(_template) &syscall_exit_probe
-#define SC_TRACE_EVENT(_name, _proto, _args, _struct, _assign, _printk) \
+#define SC_LTTNG_TRACEPOINT_EVENT(_name, _proto, _args, _struct, _assign, _printk) \
LTTNG_TRACEPOINT_EVENT(compat_syscall_exit_##_name, PARAMS(_proto), PARAMS(_args), \
PARAMS(_struct), PARAMS(_assign), PARAMS(_printk))
-#define SC_LTTNG_TRACE_EVENT(_name, _proto, _args, _locvar, _code, _struct, _assign, _printk) \
+#define SC_LTTNG_TRACEPOINT_EVENT_CODE(_name, _proto, _args, _locvar, _code, _struct, _assign, _printk) \
LTTNG_TRACEPOINT_EVENT_CODE(compat_syscall_exit_##_name, PARAMS(_proto), PARAMS(_args), \
- PARAMS(_locvar), PARAMS(_code), \
+ PARAMS(_locvar), PARAMS(_code), \
PARAMS(_struct), PARAMS(_assign), PARAMS(_printk))
-#define SC_DECLARE_EVENT_CLASS_NOARGS(_name, _struct, _assign, _printk) \
+#define SC_LTTNG_TRACEPOINT_EVENT_CLASS_NOARGS(_name, _struct, _assign, _printk) \
LTTNG_TRACEPOINT_EVENT_CLASS_NOARGS(compat_syscall_exit_##_name, PARAMS(_struct), \
PARAMS(_assign), PARAMS(_printk))
-#define SC_DEFINE_EVENT_NOARGS(_template, _name) \
+#define SC_LTTNG_TRACEPOINT_EVENT_INSTANCE_NOARGS(_template, _name) \
LTTNG_TRACEPOINT_EVENT_INSTANCE_NOARGS(compat_syscall_exit_##_template, \
compat_syscall_exit_##_name)
#define TRACE_SYSTEM compat_syscall_exit_integers
#include "instrumentation/syscalls/headers/compat_syscalls_pointers.h"
#undef TRACE_INCLUDE_FILE
#undef TRACE_SYSTEM
-#undef SC_LTTNG_TRACE_EVENT
-#undef SC_TRACE_EVENT
-#undef SC_DECLARE_EVENT_CLASS_NOARGS
-#undef SC_DEFINE_EVENT_NOARGS
+#undef SC_LTTNG_TRACEPOINT_EVENT_CODE
+#undef SC_LTTNG_TRACEPOINT_EVENT
+#undef SC_LTTNG_TRACEPOINT_EVENT_CLASS_NOARGS
+#undef SC_LTTNG_TRACEPOINT_EVENT_INSTANCE_NOARGS
#undef TP_PROBE_CB
#undef _TRACE_SYSCALLS_INTEGERS_H
#undef _TRACE_SYSCALLS_POINTERS_H
filter = chan->sc_filter;
}
+ if (!name) {
+ /* Disable all system calls */
+ bitmap_clear(filter->sc, 0, NR_syscalls);
+ bitmap_clear(filter->sc_compat, 0, NR_compat_syscalls);
+ goto apply_filter;
+ }
syscall_nr = get_syscall_nr(name);
compat_syscall_nr = get_compat_syscall_nr(name);
if (syscall_nr < 0 && compat_syscall_nr < 0) {
}
bitmap_clear(chan->sc_filter->sc_compat, compat_syscall_nr, 1);
}
+apply_filter:
if (!chan->sc_filter)
rcu_assign_pointer(chan->sc_filter, filter);
chan->syscall_all = 0;
kfree(filter);
return ret;
}
+
+static
+const struct trace_syscall_entry *syscall_list_get_entry(loff_t *pos)
+{
+ const struct trace_syscall_entry *entry;
+ int iter = 0;
+
+ for (entry = sc_table;
+ entry < sc_table + ARRAY_SIZE(sc_table);
+ entry++) {
+ if (iter++ >= *pos)
+ return entry;
+ }
+ for (entry = compat_sc_table;
+ entry < compat_sc_table + ARRAY_SIZE(compat_sc_table);
+ entry++) {
+ if (iter++ >= *pos)
+ return entry;
+ }
+ /* End of list */
+ return NULL;
+}
+
+static
+void *syscall_list_start(struct seq_file *m, loff_t *pos)
+{
+ return (void *) syscall_list_get_entry(pos);
+}
+
+static
+void *syscall_list_next(struct seq_file *m, void *p, loff_t *ppos)
+{
+ (*ppos)++;
+ return (void *) syscall_list_get_entry(ppos);
+}
+
+static
+void syscall_list_stop(struct seq_file *m, void *p)
+{
+}
+
+static
+int syscall_list_show(struct seq_file *m, void *p)
+{
+ const struct trace_syscall_entry *table, *entry = p;
+ unsigned int bitness;
+
+ if (entry >= sc_table && entry < sc_table + ARRAY_SIZE(sc_table)) {
+ bitness = BITS_PER_LONG;
+ table = sc_table;
+ } else {
+ bitness = 32;
+ table = compat_sc_table;
+ WARN_ON_ONCE(!(entry >= compat_sc_table
+ && entry < compat_sc_table + ARRAY_SIZE(compat_sc_table)));
+ }
+ seq_printf(m, "syscall { name = %s; bitness = %u; };\n",
+ entry->desc->name,
+ bitness);
+ return 0;
+}
+
+static
+const struct seq_operations lttng_syscall_list_seq_ops = {
+ .start = syscall_list_start,
+ .next = syscall_list_next,
+ .stop = syscall_list_stop,
+ .show = syscall_list_show,
+};
+
+static
+int lttng_syscall_list_open(struct inode *inode, struct file *file)
+{
+ return seq_open(file, <tng_syscall_list_seq_ops);
+}
+
+const struct file_operations lttng_syscall_list_fops = {
+ .owner = THIS_MODULE,
+ .open = lttng_syscall_list_open,
+ .read = seq_read,
+ .llseek = seq_lseek,
+ .release = seq_release,
+};