-void syscall_entry_event_notifier_probe(void *__data, struct pt_regs *regs,
- long id)
-{
- struct lttng_event_notifier_group *group = __data;
- const struct trace_syscall_entry *table, *entry;
- struct hlist_head *dispatch_list, *unknown_dispatch_list;
- size_t table_len;
-
- if (unlikely(in_compat_syscall())) {
- struct lttng_syscall_filter *filter = group->sc_filter;
-
- if (id < 0 || id >= NR_compat_syscalls
- || (!READ_ONCE(group->syscall_all_entry) &&
- !test_bit(id, filter->sc_compat_entry))) {
- /* System call filtered out. */
- return;
- }
- table = compat_sc_table.table;
- table_len = compat_sc_table.len;
- unknown_dispatch_list = &group->event_notifier_compat_unknown_syscall_dispatch;
- } else {
- struct lttng_syscall_filter *filter = group->sc_filter;
-
- if (id < 0 || id >= NR_syscalls
- || (!READ_ONCE(group->syscall_all_entry) &&
- !test_bit(id, filter->sc_entry))) {
- /* System call filtered out. */
- return;
- }
- table = sc_table.table;
- table_len = sc_table.len;
- unknown_dispatch_list = &group->event_notifier_unknown_syscall_dispatch;
- }
- /* Check if the syscall id is out of bound. */
- if (unlikely(id < 0 || id >= table_len)) {
- syscall_entry_event_unknown(unknown_dispatch_list,
- regs, id);
- return;
- }
-
- entry = &table[id];
- if (!entry->event_func) {
- syscall_entry_event_unknown(unknown_dispatch_list,
- regs, id);
- return;
- }
-
- if (unlikely(in_compat_syscall())) {
- dispatch_list = &group->event_notifier_compat_syscall_dispatch[id];
- } else {
- dispatch_list = &group->event_notifier_syscall_dispatch[id];
- }
- if (unlikely(hlist_empty(dispatch_list)))
- return;
-
- syscall_entry_event_call_func(dispatch_list,
- entry->event_func, entry->nrargs, regs);
-}
-