- switch (type) {
- case SC_TYPE_ENTRY:
- desc = &__event_desc___syscall_entry_unknown;
- unknown_dispatch_list = &syscall_table->unknown_syscall_dispatch;
- break;
- case SC_TYPE_EXIT:
- desc = &__event_desc___syscall_exit_unknown;
- unknown_dispatch_list = &syscall_table->unknown_syscall_exit_dispatch;
- break;
- case SC_TYPE_COMPAT_ENTRY:
- desc = &__event_desc___compat_syscall_entry_unknown;
- unknown_dispatch_list = &syscall_table->compat_unknown_syscall_dispatch;
- break;
- case SC_TYPE_COMPAT_EXIT:
- desc = &__event_desc___compat_syscall_exit_unknown;
- unknown_dispatch_list = &syscall_table->compat_unknown_syscall_exit_dispatch;
- break;
- default:
- WARN_ON_ONCE(1);
- }
-
- /*
- * Check if already created.
- */
- head = utils_borrow_hash_table_bucket(events_ht->table, LTTNG_EVENT_HT_SIZE, desc->event_name);
- lttng_hlist_for_each_entry(event_priv, head, hlist_node) {
- if (lttng_event_enabler_desc_match_event(&event_notifier_enabler->parent, desc, event_priv->pub))
- found = true;
- }
- if (!found)
- lttng_syscall_event_enabler_create_event(&event_notifier_enabler->parent, desc, unknown_dispatch_list, type, -1U);
-}
-
-static
-void create_matching_event_notifiers(
- struct lttng_event_notifier_enabler *syscall_event_notifier_enabler,
- const struct trace_syscall_entry *table,
- size_t table_len, enum sc_type type)
-{
- struct lttng_event_ht *events_ht = lttng_get_event_ht_from_enabler(&syscall_event_notifier_enabler->parent);
- const struct lttng_kernel_event_desc *desc;
- unsigned int i;
-
- /* iterate over all syscall and create event_notifier that match */
- for (i = 0; i < table_len; i++) {
- struct lttng_kernel_event_common_private *event_priv;
- struct hlist_head *head;
- int found = 0;
-
- desc = table[i].desc;
- if (!desc) {
- /* Unknown syscall */
- continue;
- }
-
- if (!lttng_desc_match_enabler(desc,
- lttng_event_notifier_enabler_as_enabler(syscall_event_notifier_enabler)))
- continue;
-
- /*
- * Check if already created.
- */
- head = utils_borrow_hash_table_bucket(events_ht->table, LTTNG_EVENT_HT_SIZE, desc->event_name);
- lttng_hlist_for_each_entry(event_priv, head, hlist_node) {
- if (lttng_event_enabler_desc_match_event(&syscall_event_notifier_enabler->parent, desc, event_priv->pub))
- found = 1;
- }
- if (found)
- continue;
-
- lttng_syscall_event_enabler_create_event(&syscall_event_notifier_enabler->parent, desc, NULL, type, i);
- }
-}
-
-static
-int lttng_syscalls_create_matching_event_notifiers(struct lttng_event_enabler_common *event_enabler)
-{
- int ret;
- enum lttng_kernel_abi_syscall_entryexit entryexit =
- event_enabler->event_param.u.syscall.entryexit;
- struct lttng_event_notifier_enabler *event_notifier_enabler;
-
- if (event_enabler->enabler_type != LTTNG_EVENT_ENABLER_TYPE_NOTIFIER)
- return 0;
- event_notifier_enabler = container_of(event_enabler, struct lttng_event_notifier_enabler, parent);
-
- if (entryexit == LTTNG_KERNEL_ABI_SYSCALL_ENTRY || entryexit == LTTNG_KERNEL_ABI_SYSCALL_ENTRYEXIT) {
- create_matching_event_notifiers(event_notifier_enabler,
- sc_table.table, sc_table.len, SC_TYPE_ENTRY);
- create_matching_event_notifiers(event_notifier_enabler,
- compat_sc_table.table, compat_sc_table.len,
- SC_TYPE_COMPAT_ENTRY);
- create_unknown_event_notifier(event_notifier_enabler, SC_TYPE_ENTRY);
- create_unknown_event_notifier(event_notifier_enabler, SC_TYPE_COMPAT_ENTRY);
- }
-
- if (entryexit == LTTNG_KERNEL_ABI_SYSCALL_EXIT || entryexit == LTTNG_KERNEL_ABI_SYSCALL_ENTRYEXIT) {
- create_matching_event_notifiers(event_notifier_enabler,
- sc_exit_table.table, sc_exit_table.len,
- SC_TYPE_EXIT);
- create_matching_event_notifiers(event_notifier_enabler,
- compat_sc_exit_table.table, compat_sc_exit_table.len,
- SC_TYPE_COMPAT_EXIT);
- create_unknown_event_notifier(event_notifier_enabler, SC_TYPE_EXIT);
- create_unknown_event_notifier(event_notifier_enabler, SC_TYPE_COMPAT_EXIT);
- }
- return ret;