const char *field_name,
enum bytecode_op bytecode_op)
{
- const struct lttng_kernel_event_field **fields, *field = NULL;
+ const struct lttng_kernel_event_field * const *fields, *field = NULL;
unsigned int nr_fields, i;
struct load_op *op;
uint32_t field_offset = 0;
{
const struct lttng_kernel_type_array *array_type = lttng_kernel_get_type_array(field->type);
const struct lttng_kernel_type_common *elem_type = array_type->elem_type;
+ const struct lttng_kernel_type_integer *elem_integer_type;
if (!lttng_kernel_type_is_bytewise_integer(elem_type) || array_type->encoding == lttng_kernel_string_encoding_none)
return -EINVAL;
- if (field->user)
+ elem_integer_type = container_of(elem_type, const struct lttng_kernel_type_integer, parent);
+ if (elem_integer_type->user)
op->op = BYTECODE_OP_LOAD_FIELD_REF_USER_SEQUENCE;
else
op->op = BYTECODE_OP_LOAD_FIELD_REF_SEQUENCE;
{
const struct lttng_kernel_type_sequence *sequence_type = lttng_kernel_get_type_sequence(field->type);
const struct lttng_kernel_type_common *elem_type = sequence_type->elem_type;
+ const struct lttng_kernel_type_integer *elem_integer_type;
if (!lttng_kernel_type_is_bytewise_integer(elem_type) || sequence_type->encoding == lttng_kernel_string_encoding_none)
return -EINVAL;
- if (field->user)
+ elem_integer_type = container_of(elem_type, const struct lttng_kernel_type_integer, parent);
+ if (elem_integer_type->user)
op->op = BYTECODE_OP_LOAD_FIELD_REF_USER_SEQUENCE;
else
op->op = BYTECODE_OP_LOAD_FIELD_REF_SEQUENCE;
break;
}
case lttng_kernel_type_string:
- if (field->user)
+ {
+ const struct lttng_kernel_type_string *string_type = lttng_kernel_get_type_string(field->type);
+
+ if (string_type->user)
op->op = BYTECODE_OP_LOAD_FIELD_REF_USER_STRING;
else
op->op = BYTECODE_OP_LOAD_FIELD_REF_STRING;
break;
+ }
case lttng_kernel_type_struct: /* Unsupported. */
case lttng_kernel_type_variant: /* Unsupported. */
default:
break;
/* Sequence and array supported as string */
case lttng_kernel_type_string:
- BUG_ON(ctx_field->event_field->user);
+ {
+ const struct lttng_kernel_type_string *string_type = lttng_kernel_get_type_string(ctx_field->event_field->type);
+
+ BUG_ON(string_type->user);
op->op = BYTECODE_OP_GET_CONTEXT_REF_STRING;
break;
+ }
case lttng_kernel_type_array:
{
const struct lttng_kernel_type_array *array_type = lttng_kernel_get_type_array(ctx_field->event_field->type);
const struct lttng_kernel_type_common *elem_type = array_type->elem_type;
+ const struct lttng_kernel_type_integer *elem_integer_type;
if (!lttng_kernel_type_is_bytewise_integer(elem_type) || array_type->encoding == lttng_kernel_string_encoding_none)
return -EINVAL;
- BUG_ON(ctx_field->event_field->user);
+ elem_integer_type = container_of(elem_type, const struct lttng_kernel_type_integer, parent);
+ BUG_ON(elem_integer_type->user);
op->op = BYTECODE_OP_GET_CONTEXT_REF_STRING;
break;
}
{
const struct lttng_kernel_type_sequence *sequence_type = lttng_kernel_get_type_sequence(ctx_field->event_field->type);
const struct lttng_kernel_type_common *elem_type = sequence_type->elem_type;
+ const struct lttng_kernel_type_integer *elem_integer_type;
if (!lttng_kernel_type_is_bytewise_integer(elem_type) || sequence_type->encoding == lttng_kernel_string_encoding_none)
return -EINVAL;
- BUG_ON(ctx_field->event_field->user);
+ elem_integer_type = container_of(elem_type, const struct lttng_kernel_type_integer, parent);
+ BUG_ON(elem_integer_type->user);
op->op = BYTECODE_OP_GET_CONTEXT_REF_STRING;
break;
}
runtime->len = bytecode->bc.reloc_offset;
/* copy original bytecode */
memcpy(runtime->code, bytecode->bc.data, runtime->len);
+ /* Validate bytecode load instructions before relocs. */
+ ret = lttng_bytecode_validate_load(runtime);
+ if (ret) {
+ goto link_error;
+ }
/*
* apply relocs. Those are a uint16_t (offset in bytecode)
* followed by a string (field name).
}
}
-/*
- * We own the filter_bytecode if we return success.
- */
-int lttng_filter_enabler_attach_bytecode(struct lttng_enabler *enabler,
- struct lttng_kernel_bytecode_node *filter_bytecode)
-{
- list_add(&filter_bytecode->node, &enabler->filter_bytecode_head);
- return 0;
-}
-
-void lttng_free_enabler_filter_bytecode(struct lttng_enabler *enabler)
-{
- struct lttng_kernel_bytecode_node *filter_bytecode, *tmp;
-
- list_for_each_entry_safe(filter_bytecode, tmp,
- &enabler->filter_bytecode_head, node) {
- kfree(filter_bytecode);
- }
-}
-
void lttng_free_event_filter_runtime(struct lttng_kernel_event_common *event)
{
struct bytecode_runtime *runtime, *tmp;