#include <wrapper/types.h>
#include <lttng/kernel-version.h>
#include <lttng/events.h>
+#include <lttng/lttng-bytecode.h>
#include <lttng/tracer.h>
#include <lttng/event-notifier-notification.h>
#include <lttng/abi-old.h>
irq_work_sync(&event_notifier_group->wakeup_pending);
+ kfree(event_notifier_group->sc_filter);
+
list_for_each_entry_safe(event_notifier_enabler, tmp_event_notifier_enabler,
&event_notifier_group->enablers_head, node)
lttng_event_notifier_enabler_destroy(event_notifier_enabler);
event->id = chan->free_event_id++;
event->instrumentation = itype;
event->evtype = LTTNG_TYPE_EVENT;
- INIT_LIST_HEAD(&event->bytecode_runtime_head);
+ INIT_LIST_HEAD(&event->filter_bytecode_runtime_head);
INIT_LIST_HEAD(&event->enablers_ref_head);
switch (itype) {
event_notifier->instrumentation = itype;
event_notifier->evtype = LTTNG_TYPE_EVENT;
event_notifier->send_notification = lttng_event_notifier_notification_send;
- INIT_LIST_HEAD(&event_notifier->bytecode_runtime_head);
+ INIT_LIST_HEAD(&event_notifier->filter_bytecode_runtime_head);
INIT_LIST_HEAD(&event_notifier->enablers_ref_head);
switch (itype) {
event_notifier->enabled = 0;
event_notifier->registered = 0;
event_notifier->desc = event_desc;
+ switch (event_notifier_param->event.u.syscall.entryexit) {
+ case LTTNG_KERNEL_SYSCALL_ENTRYEXIT:
+ ret = -EINVAL;
+ goto register_error;
+ case LTTNG_KERNEL_SYSCALL_ENTRY:
+ event_notifier->u.syscall.entryexit = LTTNG_SYSCALL_ENTRY;
+ break;
+ case LTTNG_KERNEL_SYSCALL_EXIT:
+ event_notifier->u.syscall.entryexit = LTTNG_SYSCALL_EXIT;
+ break;
+ }
+ switch (event_notifier_param->event.u.syscall.abi) {
+ case LTTNG_KERNEL_SYSCALL_ABI_ALL:
+ ret = -EINVAL;
+ goto register_error;
+ case LTTNG_KERNEL_SYSCALL_ABI_NATIVE:
+ event_notifier->u.syscall.abi = LTTNG_SYSCALL_ABI_NATIVE;
+ break;
+ case LTTNG_KERNEL_SYSCALL_ABI_COMPAT:
+ event_notifier->u.syscall.abi = LTTNG_SYSCALL_ABI_COMPAT;
+ break;
+ }
+
if (!event_notifier->desc) {
ret = -EINVAL;
goto register_error;
return -EINVAL;
}
switch (enabler->event_param.u.syscall.match) {
- case LTTNG_SYSCALL_MATCH_NAME:
+ case LTTNG_KERNEL_SYSCALL_MATCH_NAME:
switch (enabler->format_type) {
case LTTNG_ENABLER_FORMAT_STAR_GLOB:
return lttng_match_enabler_star_glob(desc_name, enabler_name);
return -EINVAL;
}
break;
- case LTTNG_SYSCALL_MATCH_NR:
+ case LTTNG_KERNEL_SYSCALL_MATCH_NR:
return -EINVAL; /* Not implemented. */
default:
return -EINVAL;
if (base_enabler->event_param.instrumentation == LTTNG_KERNEL_SYSCALL &&
base_enabler->event_param.u.syscall.entryexit == LTTNG_KERNEL_SYSCALL_ENTRYEXIT &&
base_enabler->event_param.u.syscall.abi == LTTNG_KERNEL_SYSCALL_ABI_ALL &&
- base_enabler->event_param.u.syscall.match == LTTNG_SYSCALL_MATCH_NAME &&
+ base_enabler->event_param.u.syscall.match == LTTNG_KERNEL_SYSCALL_MATCH_NAME &&
!strcmp(base_enabler->event_param.name, "*")) {
if (base_enabler->enabled)
WRITE_ONCE(chan->syscall_all, 1);
*/
lttng_enabler_link_bytecode(event->desc,
lttng_static_ctx,
- &event->bytecode_runtime_head,
- lttng_event_enabler_as_enabler(event_enabler));
+ &event->filter_bytecode_runtime_head,
+ <tng_event_enabler_as_enabler(event_enabler)->filter_bytecode_head);
/* TODO: merge event context. */
}
* Create event_notifiers associated with a event_notifier enabler (if not already present).
*/
static
-int lttng_event_notifier_enabler_ref_event_notifiers(struct lttng_event_notifier_enabler *event_notifier_enabler)
+int lttng_event_notifier_enabler_ref_event_notifiers(
+ struct lttng_event_notifier_enabler *event_notifier_enabler)
{
struct lttng_event_notifier_group *event_notifier_group = event_notifier_enabler->group;
+ struct lttng_enabler *base_enabler = lttng_event_notifier_enabler_as_enabler(event_notifier_enabler);
struct lttng_event_notifier *event_notifier;
+ if (base_enabler->event_param.instrumentation == LTTNG_KERNEL_SYSCALL &&
+ base_enabler->event_param.u.syscall.abi == LTTNG_KERNEL_SYSCALL_ABI_ALL &&
+ base_enabler->event_param.u.syscall.match == LTTNG_KERNEL_SYSCALL_MATCH_NAME &&
+ !strcmp(base_enabler->event_param.name, "*")) {
+
+ int enabled = base_enabler->enabled;
+ enum lttng_kernel_syscall_entryexit entryexit = base_enabler->event_param.u.syscall.entryexit;
+
+ if (entryexit == LTTNG_KERNEL_SYSCALL_ENTRY || entryexit == LTTNG_KERNEL_SYSCALL_ENTRYEXIT)
+ WRITE_ONCE(event_notifier_group->syscall_all_entry, enabled);
+
+ if (entryexit == LTTNG_KERNEL_SYSCALL_EXIT || entryexit == LTTNG_KERNEL_SYSCALL_ENTRYEXIT)
+ WRITE_ONCE(event_notifier_group->syscall_all_exit, enabled);
+
+ }
+
/* First ensure that probe event_notifiers are created for this enabler. */
lttng_create_event_notifier_if_missing(event_notifier_enabler);
* Link filter bytecodes if not linked yet.
*/
lttng_enabler_link_bytecode(event_notifier->desc,
- lttng_static_ctx, &event_notifier->bytecode_runtime_head,
- lttng_event_notifier_enabler_as_enabler(event_notifier_enabler));
+ lttng_static_ctx, &event_notifier->filter_bytecode_runtime_head,
+ <tng_event_notifier_enabler_as_enabler(event_notifier_enabler)->filter_bytecode_head);
}
return 0;
}
}
static
-int lttng_enabler_attach_bytecode(struct lttng_enabler *enabler,
+int lttng_enabler_attach_filter_bytecode(struct lttng_enabler *enabler,
struct lttng_kernel_filter_bytecode __user *bytecode)
{
- struct lttng_filter_bytecode_node *bytecode_node;
+ struct lttng_bytecode_node *bytecode_node;
uint32_t bytecode_len;
int ret;
if (ret)
goto error_free;
+ bytecode_node->type = LTTNG_BYTECODE_NODE_TYPE_FILTER;
bytecode_node->enabler = enabler;
/* Enforce length based on allocated size */
bytecode_node->bc.len = bytecode_len;
return ret;
}
-int lttng_event_enabler_attach_bytecode(struct lttng_event_enabler *event_enabler,
+int lttng_event_enabler_attach_filter_bytecode(struct lttng_event_enabler *event_enabler,
struct lttng_kernel_filter_bytecode __user *bytecode)
{
int ret;
- ret = lttng_enabler_attach_bytecode(
+ ret = lttng_enabler_attach_filter_bytecode(
lttng_event_enabler_as_enabler(event_enabler), bytecode);
if (ret)
goto error;
static
void lttng_enabler_destroy(struct lttng_enabler *enabler)
{
- struct lttng_filter_bytecode_node *filter_node, *tmp_filter_node;
+ struct lttng_bytecode_node *filter_node, *tmp_filter_node;
/* Destroy filter bytecode */
list_for_each_entry_safe(filter_node, tmp_filter_node,
event_notifier_enabler->base.format_type = format_type;
INIT_LIST_HEAD(&event_notifier_enabler->base.filter_bytecode_head);
- memcpy(&event_notifier_enabler->base.event_param.name, event_notifier_param->event.name,
- sizeof(event_notifier_enabler->base.event_param.name));
- event_notifier_enabler->base.event_param.instrumentation = event_notifier_param->event.instrumentation;
+ memcpy(&event_notifier_enabler->base.event_param, &event_notifier_param->event,
+ sizeof(event_notifier_enabler->base.event_param));
event_notifier_enabler->base.evtype = LTTNG_TYPE_ENABLER;
event_notifier_enabler->base.enabled = 0;
return 0;
}
-int lttng_event_notifier_enabler_attach_bytecode(
+int lttng_event_notifier_enabler_attach_filter_bytecode(
struct lttng_event_notifier_enabler *event_notifier_enabler,
struct lttng_kernel_filter_bytecode __user *bytecode)
{
int ret;
- ret = lttng_enabler_attach_bytecode(
+ ret = lttng_enabler_attach_filter_bytecode(
lttng_event_notifier_enabler_as_enabler(event_notifier_enabler),
bytecode);
if (ret)
/* Enable filters */
list_for_each_entry(runtime,
- &event->bytecode_runtime_head, node)
- lttng_filter_sync_state(runtime);
+ &event->filter_bytecode_runtime_head, node)
+ lttng_bytecode_filter_sync_state(runtime);
}
}
/* Enable filters */
list_for_each_entry(runtime,
- &event_notifier->bytecode_runtime_head, node)
- lttng_filter_sync_state(runtime);
+ &event_notifier->filter_bytecode_runtime_head, node)
+ lttng_bytecode_filter_sync_state(runtime);
}
}