+ lttng_hlist_for_each_entry_rcu(event, unknown_action_list_head, u.syscall.node) {
+ if (unlikely(in_compat_syscall()))
+ __event_probe__compat_syscall_exit_unknown(event, id, ret,
+ args);
+ else
+ __event_probe__syscall_exit_unknown(event, id, ret, args);
+ }
+}
+
+static __always_inline
+void syscall_exit_call_func(struct hlist_head *action_list,
+ void *func, unsigned int nrargs,
+ struct pt_regs *regs, long ret)
+{
+ struct lttng_event *event;
+
+ switch (nrargs) {
+ case 0:
+ {
+ void (*fptr)(void *__data, long ret) = func;
+
+ lttng_hlist_for_each_entry_rcu(event, action_list, u.syscall.node)
+ fptr(event, ret);
+ break;
+ }
+ case 1:
+ {
+ void (*fptr)(void *__data,
+ long ret,
+ unsigned long arg0) = func;
+ unsigned long args[LTTNG_SYSCALL_NR_ARGS];
+
+ lttng_syscall_get_arguments(current, regs, args);
+ lttng_hlist_for_each_entry_rcu(event, action_list, u.syscall.node)
+ fptr(event, ret, args[0]);
+ break;
+ }
+ case 2:
+ {
+ void (*fptr)(void *__data,
+ long ret,
+ unsigned long arg0,
+ unsigned long arg1) = func;
+ unsigned long args[LTTNG_SYSCALL_NR_ARGS];
+
+ lttng_syscall_get_arguments(current, regs, args);
+ lttng_hlist_for_each_entry_rcu(event, action_list, u.syscall.node)
+ fptr(event, ret, args[0], args[1]);
+ break;
+ }
+ case 3:
+ {
+ void (*fptr)(void *__data,
+ long ret,
+ unsigned long arg0,
+ unsigned long arg1,
+ unsigned long arg2) = func;
+ unsigned long args[LTTNG_SYSCALL_NR_ARGS];
+
+ lttng_syscall_get_arguments(current, regs, args);
+ lttng_hlist_for_each_entry_rcu(event, action_list, u.syscall.node)
+ fptr(event, ret, args[0], args[1], args[2]);
+ break;
+ }
+ case 4:
+ {
+ void (*fptr)(void *__data,
+ long ret,
+ unsigned long arg0,
+ unsigned long arg1,
+ unsigned long arg2,
+ unsigned long arg3) = func;
+ unsigned long args[LTTNG_SYSCALL_NR_ARGS];
+
+ lttng_syscall_get_arguments(current, regs, args);
+ lttng_hlist_for_each_entry_rcu(event, action_list, u.syscall.node)
+ fptr(event, ret, args[0], args[1], args[2], args[3]);
+ break;
+ }
+ case 5:
+ {
+ void (*fptr)(void *__data,
+ long ret,
+ unsigned long arg0,
+ unsigned long arg1,
+ unsigned long arg2,
+ unsigned long arg3,
+ unsigned long arg4) = func;
+ unsigned long args[LTTNG_SYSCALL_NR_ARGS];
+
+ lttng_syscall_get_arguments(current, regs, args);
+ lttng_hlist_for_each_entry_rcu(event, action_list, u.syscall.node)
+ fptr(event, ret, args[0], args[1], args[2], args[3], args[4]);
+ break;
+ }
+ case 6:
+ {
+ void (*fptr)(void *__data,
+ long ret,
+ unsigned long arg0,
+ unsigned long arg1,
+ unsigned long arg2,
+ unsigned long arg3,
+ unsigned long arg4,
+ unsigned long arg5) = func;
+ unsigned long args[LTTNG_SYSCALL_NR_ARGS];
+
+ lttng_syscall_get_arguments(current, regs, args);
+ lttng_hlist_for_each_entry_rcu(event, action_list, u.syscall.node)
+ fptr(event, ret, args[0], args[1], args[2],
+ args[3], args[4], args[5]);
+ break;
+ }
+ default:
+ break;
+ }