Clean-up: sessiond: return an lttng_error_code from list_triggers
[lttng-tools.git] / src / bin / lttng-sessiond / trace-kernel.c
index 2623b2971a5273a0e84dd0a711243c99268e2a80..29a60cef5f8dbb715fde1a19be4e294d45a5a29e 100644 (file)
 #include <lttng/userspace-probe-internal.h>
 #include <lttng/event-rule/event-rule.h>
 #include <lttng/event-rule/event-rule-internal.h>
-#include <lttng/event-rule/kprobe.h>
-#include <lttng/event-rule/kprobe-internal.h>
-#include <lttng/event-rule/syscall.h>
-#include <lttng/event-rule/syscall-internal.h>
-#include <lttng/event-rule/tracepoint.h>
-#include <lttng/event-rule/tracepoint-internal.h>
-#include <lttng/event-rule/uprobe-internal.h>
+#include <lttng/event-rule/kernel-kprobe.h>
+#include <lttng/event-rule/kernel-kprobe-internal.h>
+#include <lttng/event-rule/kernel-syscall.h>
+#include <lttng/event-rule/kernel-syscall-internal.h>
+#include <lttng/event-rule/kernel-tracepoint.h>
+#include <lttng/event-rule/kernel-tracepoint-internal.h>
+#include <lttng/event-rule/kernel-uprobe.h>
+#include <lttng/event-rule/kernel-uprobe-internal.h>
 #include <common/common.h>
 #include <common/defaults.h>
 #include <common/trace-chunk.h>
@@ -251,7 +252,7 @@ struct ltt_kernel_channel *trace_kernel_create_channel(
                strncpy(lkc->channel->name, DEFAULT_CHANNEL_NAME,
                        sizeof(lkc->channel->name));
        }
-       lkc->channel->name[LTTNG_KERNEL_SYM_NAME_LEN - 1] = '\0';
+       lkc->channel->name[LTTNG_KERNEL_ABI_SYM_NAME_LEN - 1] = '\0';
 
        lkc->fd = -1;
        lkc->stream_count = 0;
@@ -280,7 +281,7 @@ error:
  * Return the allocated object or NULL on error.
  */
 struct ltt_kernel_context *trace_kernel_create_context(
-               struct lttng_kernel_context *ctx)
+               struct lttng_kernel_abi_context *ctx)
 {
        struct ltt_kernel_context *kctx;
 
@@ -334,14 +335,14 @@ enum lttng_error_code trace_kernel_create_event(
                struct ltt_kernel_event **kernel_event)
 {
        enum lttng_error_code ret;
-       struct lttng_kernel_event *attr;
+       struct lttng_kernel_abi_event *attr;
        struct ltt_kernel_event *local_kernel_event;
        struct lttng_userspace_probe_location *userspace_probe_location = NULL;
 
        assert(ev);
 
        local_kernel_event = zmalloc(sizeof(struct ltt_kernel_event));
-       attr = zmalloc(sizeof(struct lttng_kernel_event));
+       attr = zmalloc(sizeof(struct lttng_kernel_abi_event));
        if (local_kernel_event == NULL || attr == NULL) {
                PERROR("kernel event zmalloc");
                ret = LTTNG_ERR_NOMEM;
@@ -350,12 +351,12 @@ enum lttng_error_code trace_kernel_create_event(
 
        switch (ev->type) {
        case LTTNG_EVENT_PROBE:
-               attr->instrumentation = LTTNG_KERNEL_KPROBE;
+               attr->instrumentation = LTTNG_KERNEL_ABI_KPROBE;
                attr->u.kprobe.addr = ev->attr.probe.addr;
                attr->u.kprobe.offset = ev->attr.probe.offset;
                strncpy(attr->u.kprobe.symbol_name,
-                               ev->attr.probe.symbol_name, LTTNG_KERNEL_SYM_NAME_LEN);
-               attr->u.kprobe.symbol_name[LTTNG_KERNEL_SYM_NAME_LEN - 1] = '\0';
+                               ev->attr.probe.symbol_name, LTTNG_KERNEL_ABI_SYM_NAME_LEN);
+               attr->u.kprobe.symbol_name[LTTNG_KERNEL_ABI_SYM_NAME_LEN - 1] = '\0';
                break;
        case LTTNG_EVENT_USERSPACE_PROBE:
        {
@@ -376,7 +377,7 @@ enum lttng_error_code trace_kernel_create_event(
                 * In the interactions with the kernel tracer, we use the
                 * uprobe term.
                 */
-               attr->instrumentation = LTTNG_KERNEL_UPROBE;
+               attr->instrumentation = LTTNG_KERNEL_ABI_UPROBE;
 
                lookup = lttng_userspace_probe_location_get_lookup_method(
                                location);
@@ -422,30 +423,30 @@ enum lttng_error_code trace_kernel_create_event(
                break;
        }
        case LTTNG_EVENT_FUNCTION:
-               attr->instrumentation = LTTNG_KERNEL_KRETPROBE;
+               attr->instrumentation = LTTNG_KERNEL_ABI_KRETPROBE;
                attr->u.kretprobe.addr = ev->attr.probe.addr;
                attr->u.kretprobe.offset = ev->attr.probe.offset;
                strncpy(attr->u.kretprobe.symbol_name,
-                               ev->attr.probe.symbol_name, LTTNG_KERNEL_SYM_NAME_LEN);
-               attr->u.kretprobe.symbol_name[LTTNG_KERNEL_SYM_NAME_LEN - 1] = '\0';
+                               ev->attr.probe.symbol_name, LTTNG_KERNEL_ABI_SYM_NAME_LEN);
+               attr->u.kretprobe.symbol_name[LTTNG_KERNEL_ABI_SYM_NAME_LEN - 1] = '\0';
                break;
        case LTTNG_EVENT_FUNCTION_ENTRY:
-               attr->instrumentation = LTTNG_KERNEL_FUNCTION;
+               attr->instrumentation = LTTNG_KERNEL_ABI_FUNCTION;
                strncpy(attr->u.ftrace.symbol_name,
-                               ev->attr.ftrace.symbol_name, LTTNG_KERNEL_SYM_NAME_LEN);
-               attr->u.ftrace.symbol_name[LTTNG_KERNEL_SYM_NAME_LEN - 1] = '\0';
+                               ev->attr.ftrace.symbol_name, LTTNG_KERNEL_ABI_SYM_NAME_LEN);
+               attr->u.ftrace.symbol_name[LTTNG_KERNEL_ABI_SYM_NAME_LEN - 1] = '\0';
                break;
        case LTTNG_EVENT_TRACEPOINT:
-               attr->instrumentation = LTTNG_KERNEL_TRACEPOINT;
+               attr->instrumentation = LTTNG_KERNEL_ABI_TRACEPOINT;
                break;
        case LTTNG_EVENT_SYSCALL:
-               attr->instrumentation = LTTNG_KERNEL_SYSCALL;
-               attr->u.syscall.abi = LTTNG_KERNEL_SYSCALL_ABI_ALL;
-               attr->u.syscall.entryexit = LTTNG_KERNEL_SYSCALL_ENTRYEXIT;
-               attr->u.syscall.match = LTTNG_KERNEL_SYSCALL_MATCH_NAME;
+               attr->instrumentation = LTTNG_KERNEL_ABI_SYSCALL;
+               attr->u.syscall.abi = LTTNG_KERNEL_ABI_SYSCALL_ABI_ALL;
+               attr->u.syscall.entryexit = LTTNG_KERNEL_ABI_SYSCALL_ENTRYEXIT;
+               attr->u.syscall.match = LTTNG_KERNEL_ABI_SYSCALL_MATCH_NAME;
                break;
        case LTTNG_EVENT_ALL:
-               attr->instrumentation = LTTNG_KERNEL_ALL;
+               attr->instrumentation = LTTNG_KERNEL_ABI_ALL;
                break;
        default:
                ERR("Unknown kernel instrumentation type (%d)", ev->type);
@@ -454,8 +455,8 @@ enum lttng_error_code trace_kernel_create_event(
        }
 
        /* Copy event name */
-       strncpy(attr->name, ev->name, LTTNG_KERNEL_SYM_NAME_LEN);
-       attr->name[LTTNG_KERNEL_SYM_NAME_LEN - 1] = '\0';
+       strncpy(attr->name, ev->name, LTTNG_KERNEL_ABI_SYM_NAME_LEN);
+       attr->name[LTTNG_KERNEL_ABI_SYM_NAME_LEN - 1] = '\0';
 
        /* Setting up a kernel event */
        local_kernel_event->fd = -1;
@@ -485,6 +486,7 @@ error:
 enum lttng_error_code trace_kernel_create_event_notifier_rule(
                struct lttng_trigger *trigger,
                uint64_t token,
+               uint64_t error_counter_index,
                struct ltt_kernel_event_notifier_rule **event_notifier_rule)
 {
        enum lttng_error_code ret = LTTNG_OK;
@@ -497,13 +499,13 @@ enum lttng_error_code trace_kernel_create_event_notifier_rule(
 
        assert(event_notifier_rule);
 
-       condition = lttng_trigger_get_condition(trigger);
+       condition = lttng_trigger_get_const_condition(trigger);
        assert(condition);
 
        condition_type = lttng_condition_get_type(condition);
-       assert(condition_type == LTTNG_CONDITION_TYPE_EVENT_RULE_HIT);
+       assert(condition_type == LTTNG_CONDITION_TYPE_EVENT_RULE_MATCHES);
 
-       condition_status = lttng_condition_event_rule_get_rule(
+       condition_status = lttng_condition_event_rule_matches_get_rule(
                        condition, &event_rule);
        assert(condition_status == LTTNG_CONDITION_STATUS_OK);
        assert(event_rule);
@@ -522,6 +524,7 @@ enum lttng_error_code trace_kernel_create_event_notifier_rule(
        local_kernel_token_event_rule->fd = -1;
        local_kernel_token_event_rule->enabled = 1;
        local_kernel_token_event_rule->token = token;
+       local_kernel_token_event_rule->error_counter_index = error_counter_index;
 
        /* Get the reference of the event rule. */
        lttng_trigger_get(trigger);
@@ -543,14 +546,14 @@ error:
  */
 enum lttng_error_code trace_kernel_init_event_notifier_from_event_rule(
                const struct lttng_event_rule *rule,
-               struct lttng_kernel_event_notifier *kernel_event_notifier)
+               struct lttng_kernel_abi_event_notifier *kernel_event_notifier)
 {
        enum lttng_error_code ret_code;
        const char *name;
        int strncpy_ret;
 
        switch (lttng_event_rule_get_type(rule)) {
-       case LTTNG_EVENT_RULE_TYPE_KPROBE:
+       case LTTNG_EVENT_RULE_TYPE_KERNEL_KPROBE:
        {
                uint64_t address = 0, offset = 0;
                const char *symbol_name = NULL;
@@ -558,7 +561,7 @@ enum lttng_error_code trace_kernel_init_event_notifier_from_event_rule(
                enum lttng_kernel_probe_location_status k_status;
                enum lttng_event_rule_status status;
 
-               status = lttng_event_rule_kprobe_get_location(rule, &location);
+               status = lttng_event_rule_kernel_kprobe_get_location(rule, &location);
                if (status != LTTNG_EVENT_RULE_STATUS_OK) {
                        ret_code = LTTNG_ERR_PROBE_LOCATION_INVAL;
                        goto error;
@@ -585,13 +588,13 @@ enum lttng_error_code trace_kernel_init_event_notifier_from_event_rule(
                        abort();
                }
 
-               kernel_event_notifier->event.instrumentation = LTTNG_KERNEL_KPROBE;
+               kernel_event_notifier->event.instrumentation = LTTNG_KERNEL_ABI_KPROBE;
                kernel_event_notifier->event.u.kprobe.addr = address;
                kernel_event_notifier->event.u.kprobe.offset = offset;
                if (symbol_name) {
                        strncpy_ret = lttng_strncpy(
                                        kernel_event_notifier->event.u.kprobe.symbol_name,
-                                       symbol_name, LTTNG_KERNEL_SYM_NAME_LEN);
+                                       symbol_name, LTTNG_KERNEL_ABI_SYM_NAME_LEN);
 
                        if (strncpy_ret) {
                                ret_code = LTTNG_ERR_INVALID;
@@ -599,25 +602,26 @@ enum lttng_error_code trace_kernel_init_event_notifier_from_event_rule(
                        }
                }
 
-               kernel_event_notifier->event.u.kprobe.symbol_name[LTTNG_KERNEL_SYM_NAME_LEN - 1] = '\0';
-               status = lttng_event_rule_kprobe_get_name(rule, &name);
+               kernel_event_notifier->event.u.kprobe.symbol_name[LTTNG_KERNEL_ABI_SYM_NAME_LEN - 1] = '\0';
+
+               status = lttng_event_rule_kernel_kprobe_get_event_name(rule, &name);
                assert(status == LTTNG_EVENT_RULE_STATUS_OK);
                ret_code = LTTNG_OK;
                break;
        }
-       case LTTNG_EVENT_RULE_TYPE_UPROBE:
+       case LTTNG_EVENT_RULE_TYPE_KERNEL_UPROBE:
        {
                const struct lttng_userspace_probe_location* location = NULL;
                const struct lttng_userspace_probe_location_lookup_method *lookup = NULL;
                enum lttng_event_rule_status status;
 
-               status = lttng_event_rule_uprobe_get_location(rule, &location);
+               status = lttng_event_rule_kernel_uprobe_get_location(rule, &location);
                if (status != LTTNG_EVENT_RULE_STATUS_OK) {
                        ret_code = LTTNG_ERR_PROBE_LOCATION_INVAL;
                        goto error;
                }
 
-               kernel_event_notifier->event.instrumentation = LTTNG_KERNEL_UPROBE;
+               kernel_event_notifier->event.instrumentation = LTTNG_KERNEL_ABI_UPROBE;
 
                lookup = lttng_userspace_probe_location_get_lookup_method(
                                location);
@@ -646,54 +650,71 @@ enum lttng_error_code trace_kernel_init_event_notifier_from_event_rule(
                        abort();
                }
 
-               status = lttng_event_rule_uprobe_get_name(rule, &name);
+               status = lttng_event_rule_kernel_uprobe_get_event_name(
+                               rule, &name);
                assert(status == LTTNG_EVENT_RULE_STATUS_OK);
                ret_code = LTTNG_OK;
                break;
        }
-       case LTTNG_EVENT_RULE_TYPE_TRACEPOINT:
+       case LTTNG_EVENT_RULE_TYPE_KERNEL_TRACEPOINT:
        {
-               const enum lttng_domain_type domain =
-                               lttng_event_rule_get_domain_type(rule);
                const enum lttng_event_rule_status status =
-                               lttng_event_rule_tracepoint_get_pattern(
+                               lttng_event_rule_kernel_tracepoint_get_name_pattern(
                                                rule, &name);
 
-               assert(domain == LTTNG_DOMAIN_KERNEL);
                assert(status == LTTNG_EVENT_RULE_STATUS_OK);
                kernel_event_notifier->event.instrumentation =
-                               LTTNG_KERNEL_TRACEPOINT;
+                               LTTNG_KERNEL_ABI_TRACEPOINT;
 
                ret_code = LTTNG_OK;
                break;
        }
-       case LTTNG_EVENT_RULE_TYPE_SYSCALL:
+       case LTTNG_EVENT_RULE_TYPE_KERNEL_SYSCALL:
        {
                const enum lttng_event_rule_status status =
-                               lttng_event_rule_syscall_get_pattern(
+                               lttng_event_rule_kernel_syscall_get_name_pattern(
                                                rule, &name);
+               const enum lttng_event_rule_kernel_syscall_emission_site
+                       emission_site =
+                       lttng_event_rule_kernel_syscall_get_emission_site(rule);
+               enum lttng_kernel_abi_syscall_entryexit entryexit;
 
                assert(status == LTTNG_EVENT_RULE_STATUS_OK);
+               assert(emission_site != LTTNG_EVENT_RULE_KERNEL_SYSCALL_EMISSION_SITE_UNKNOWN);
+
+               switch(emission_site) {
+               case LTTNG_EVENT_RULE_KERNEL_SYSCALL_EMISSION_SITE_ENTRY:
+                       entryexit = LTTNG_KERNEL_ABI_SYSCALL_ENTRY;
+                       break;
+               case LTTNG_EVENT_RULE_KERNEL_SYSCALL_EMISSION_SITE_EXIT:
+                       entryexit = LTTNG_KERNEL_ABI_SYSCALL_EXIT;
+                       break;
+               case LTTNG_EVENT_RULE_KERNEL_SYSCALL_EMISSION_SITE_ENTRY_EXIT:
+                       entryexit = LTTNG_KERNEL_ABI_SYSCALL_ENTRYEXIT;
+                       break;
+               default:
+                       abort();
+                       break;
+               }
 
                kernel_event_notifier->event.instrumentation =
-                               LTTNG_KERNEL_SYSCALL;
+                               LTTNG_KERNEL_ABI_SYSCALL;
                kernel_event_notifier->event.u.syscall.abi =
-                               LTTNG_KERNEL_SYSCALL_ABI_ALL;
+                               LTTNG_KERNEL_ABI_SYSCALL_ABI_ALL;
                kernel_event_notifier->event.u.syscall.entryexit =
-                               LTTNG_KERNEL_SYSCALL_ENTRY;
+                               entryexit;
                kernel_event_notifier->event.u.syscall.match =
-                               LTTNG_KERNEL_SYSCALL_MATCH_NAME;
+                               LTTNG_KERNEL_ABI_SYSCALL_MATCH_NAME;
                ret_code = LTTNG_OK;
                break;
        }
-       case LTTNG_EVENT_RULE_TYPE_KRETPROBE:
        default:
                abort();
                break;
        }
 
        strncpy_ret = lttng_strncpy(kernel_event_notifier->event.name, name,
-                       LTTNG_KERNEL_SYM_NAME_LEN);
+                       LTTNG_KERNEL_ABI_SYM_NAME_LEN);
        if (strncpy_ret) {
                ret_code = LTTNG_ERR_INVALID;
                goto error;
@@ -942,11 +963,11 @@ void trace_kernel_destroy_channel(struct ltt_kernel_channel *channel)
        /* Remove from channel list */
        cds_list_del(&channel->list);
 
-       if (notification_thread_handle
-                       && channel->published_to_notification_thread) {
+       if (the_notification_thread_handle &&
+                       channel->published_to_notification_thread) {
                status = notification_thread_command_remove_channel(
-                               notification_thread_handle,
-                               channel->key, LTTNG_DOMAIN_KERNEL);
+                               the_notification_thread_handle, channel->key,
+                               LTTNG_DOMAIN_KERNEL);
                assert(status == LTTNG_OK);
        }
        free(channel->channel->attr.extended.ptr);
This page took 0.028539 seconds and 4 git commands to generate.