*/
#include <wrapper/uaccess.h>
-#include <wrapper/frame.h>
+#include <wrapper/objtool.h>
#include <wrapper/types.h>
#include <linux/swab.h>
int stack_star_glob_match(struct estack *stack, int top, const char *cmp_type)
{
bool has_user = false;
- mm_segment_t old_fs;
int result;
struct estack_entry *pattern_reg;
struct estack_entry *candidate_reg;
+ /* Disable the page fault handler when reading from userspace. */
if (estack_bx(stack, top)->u.s.user
|| estack_ax(stack, top)->u.s.user) {
has_user = true;
- old_fs = get_fs();
- set_fs(KERNEL_DS);
pagefault_disable();
}
/* Perform the match operation. */
result = !strutils_star_glob_match_char_cb(get_char_at_cb,
pattern_reg, get_char_at_cb, candidate_reg);
- if (has_user) {
+ if (has_user)
pagefault_enable();
- set_fs(old_fs);
- }
return result;
}
{
size_t offset_bx = 0, offset_ax = 0;
int diff, has_user = 0;
- mm_segment_t old_fs;
if (estack_bx(stack, top)->u.s.user
|| estack_ax(stack, top)->u.s.user) {
has_user = 1;
- old_fs = get_fs();
- set_fs(KERNEL_DS);
pagefault_disable();
}
offset_bx++;
offset_ax++;
}
- if (has_user) {
+ if (has_user)
pagefault_enable();
- set_fs(old_fs);
- }
+
return diff;
}
start_pc = &bytecode->data[0]; \
for (pc = next_pc = start_pc; pc - start_pc < bytecode->len; \
pc = next_pc) { \
- dbg_printk("Executing op %s (%u)\n", \
+ dbg_printk("LTTng: Executing op %s (%u)\n", \
lttng_filter_print_op((unsigned int) *(filter_opcode_t *) pc), \
(unsigned int) *(filter_opcode_t *) pc); \
switch (*(filter_opcode_t *) pc) {
#endif
+#define IS_INTEGER_REGISTER(reg_type) (reg_type == REG_S64)
+
static int context_get_index(struct lttng_probe_ctx *lttng_probe_ctx,
struct load_ptr *ptr,
uint32_t idx)
}
case atype_array_nestable:
if (!lttng_is_bytewise_integer(field->type.u.array_nestable.elem_type)) {
- printk(KERN_WARNING "Array nesting only supports integer types.\n");
+ printk(KERN_WARNING "LTTng: filter: Array nesting only supports integer types.\n");
return -EINVAL;
}
if (field->type.u.array_nestable.elem_type->u.integer.encoding == lttng_encode_none) {
- printk(KERN_WARNING "Only string arrays are supported for contexts.\n");
+ printk(KERN_WARNING "LTTng: filter: Only string arrays are supported for contexts.\n");
return -EINVAL;
}
ptr->object_type = OBJECT_TYPE_STRING;
break;
case atype_sequence_nestable:
if (!lttng_is_bytewise_integer(field->type.u.sequence_nestable.elem_type)) {
- printk(KERN_WARNING "Sequence nesting only supports integer types.\n");
+ printk(KERN_WARNING "LTTng: filter: Sequence nesting only supports integer types.\n");
return -EINVAL;
}
if (field->type.u.sequence_nestable.elem_type->u.integer.encoding == lttng_encode_none) {
- printk(KERN_WARNING "Only string sequences are supported for contexts.\n");
+ printk(KERN_WARNING "LTTng: filter: Only string sequences are supported for contexts.\n");
return -EINVAL;
}
ptr->object_type = OBJECT_TYPE_STRING;
ptr->ptr = v.str;
break;
case atype_struct_nestable:
- printk(KERN_WARNING "Structure type cannot be loaded.\n");
+ printk(KERN_WARNING "LTTng: filter: Structure type cannot be loaded.\n");
return -EINVAL;
case atype_variant_nestable:
- printk(KERN_WARNING "Variant type cannot be loaded.\n");
+ printk(KERN_WARNING "LTTng: filter: Variant type cannot be loaded.\n");
return -EINVAL;
default:
- printk(KERN_WARNING "Unknown type: %d", (int) field->type.atype);
+ printk(KERN_WARNING "LTTng: filter: Unknown type: %d", (int) field->type.atype);
return -EINVAL;
}
return 0;
break;
}
case OBJECT_TYPE_STRUCT:
- printk(KERN_WARNING "Nested structures are not supported yet.\n");
+ printk(KERN_WARNING "LTTng: filter: Nested structures are not supported yet.\n");
ret = -EINVAL;
goto end;
case OBJECT_TYPE_VARIANT:
default:
- printk(KERN_WARNING "Unexpected get index type %d",
+ printk(KERN_WARNING "LTTng: filter: Unexpected get index type %d",
(int) stack_top->u.ptr.object_type);
ret = -EINVAL;
goto end;
case OBJECT_TYPE_S8:
dbg_printk("op load field s8\n");
stack_top->u.v = *(int8_t *) stack_top->u.ptr.ptr;
+ stack_top->type = REG_S64;
break;
case OBJECT_TYPE_S16:
{
if (stack_top->u.ptr.rev_bo)
__swab16s(&tmp);
stack_top->u.v = tmp;
+ stack_top->type = REG_S64;
break;
}
case OBJECT_TYPE_S32:
if (stack_top->u.ptr.rev_bo)
__swab32s(&tmp);
stack_top->u.v = tmp;
+ stack_top->type = REG_S64;
break;
}
case OBJECT_TYPE_S64:
if (stack_top->u.ptr.rev_bo)
__swab64s(&tmp);
stack_top->u.v = tmp;
+ stack_top->type = REG_S64;
break;
}
case OBJECT_TYPE_U8:
dbg_printk("op load field u8\n");
stack_top->u.v = *(uint8_t *) stack_top->u.ptr.ptr;
+ stack_top->type = REG_S64;
break;
case OBJECT_TYPE_U16:
{
if (stack_top->u.ptr.rev_bo)
__swab16s(&tmp);
stack_top->u.v = tmp;
+ stack_top->type = REG_S64;
break;
}
case OBJECT_TYPE_U32:
if (stack_top->u.ptr.rev_bo)
__swab32s(&tmp);
stack_top->u.v = tmp;
+ stack_top->type = REG_S64;
break;
}
case OBJECT_TYPE_U64:
if (stack_top->u.ptr.rev_bo)
__swab64s(&tmp);
stack_top->u.v = tmp;
+ stack_top->type = REG_S64;
break;
}
case OBJECT_TYPE_STRING:
stack_top->u.s.seq_len = LTTNG_SIZE_MAX;
stack_top->u.s.literal_type =
ESTACK_STRING_LITERAL_TYPE_NONE;
+ stack_top->type = REG_STRING;
break;
}
case OBJECT_TYPE_STRING_SEQUENCE:
}
stack_top->u.s.literal_type =
ESTACK_STRING_LITERAL_TYPE_NONE;
+ stack_top->type = REG_STRING;
break;
}
case OBJECT_TYPE_DYNAMIC:
case OBJECT_TYPE_ARRAY:
case OBJECT_TYPE_STRUCT:
case OBJECT_TYPE_VARIANT:
- printk(KERN_WARNING "Sequences, arrays, struct and variant cannot be loaded (nested types).\n");
+ printk(KERN_WARNING "LTTng: filter: Sequences, arrays, struct and variant cannot be loaded (nested types).\n");
ret = -EINVAL;
goto end;
}
struct estack _stack;
struct estack *stack = &_stack;
register int64_t ax = 0, bx = 0;
+ register enum entry_type ax_t = REG_TYPE_UNKNOWN, bx_t = REG_TYPE_UNKNOWN;
register int top = FILTER_STACK_EMPTY;
#ifndef INTERPRETER_USE_SWITCH
static void *dispatch[NR_FILTER_OPS] = {
#ifdef INTERPRETER_USE_SWITCH
default:
#endif /* INTERPRETER_USE_SWITCH */
- printk(KERN_WARNING "unknown bytecode op %u\n",
+ printk(KERN_WARNING "LTTng: filter: unknown bytecode op %u\n",
(unsigned int) *(filter_opcode_t *) pc);
ret = -EINVAL;
goto end;
OP(FILTER_OP_RETURN):
OP(FILTER_OP_RETURN_S64):
/* LTTNG_FILTER_DISCARD or LTTNG_FILTER_RECORD_FLAG */
- retval = !!estack_ax_v;
+ switch (estack_ax_t) {
+ case REG_S64:
+ retval = !!estack_ax_v;
+ break;
+ case REG_DOUBLE:
+ case REG_STRING:
+ case REG_PTR:
+ case REG_STAR_GLOB_STRING:
+ case REG_TYPE_UNKNOWN:
+ ret = -EINVAL;
+ goto end;
+ }
ret = 0;
goto end;
OP(FILTER_OP_MOD):
OP(FILTER_OP_PLUS):
OP(FILTER_OP_MINUS):
- printk(KERN_WARNING "unsupported bytecode op %u\n",
+ printk(KERN_WARNING "LTTng: filter: unsupported bytecode op %u\n",
(unsigned int) *(filter_opcode_t *) pc);
ret = -EINVAL;
goto end;
OP(FILTER_OP_LT):
OP(FILTER_OP_GE):
OP(FILTER_OP_LE):
- printk(KERN_WARNING "unsupported non-specialized bytecode op %u\n",
+ printk(KERN_WARNING "LTTng: filter: unsupported non-specialized bytecode op %u\n",
(unsigned int) *(filter_opcode_t *) pc);
ret = -EINVAL;
goto end;
int res;
res = (stack_strcmp(stack, top, "==") == 0);
- estack_pop(stack, top, ax, bx);
+ estack_pop(stack, top, ax, bx, ax_t, bx_t);
estack_ax_v = res;
+ estack_ax_t = REG_S64;
next_pc += sizeof(struct binary_op);
PO;
}
int res;
res = (stack_strcmp(stack, top, "!=") != 0);
- estack_pop(stack, top, ax, bx);
+ estack_pop(stack, top, ax, bx, ax_t, bx_t);
estack_ax_v = res;
+ estack_ax_t = REG_S64;
next_pc += sizeof(struct binary_op);
PO;
}
int res;
res = (stack_strcmp(stack, top, ">") > 0);
- estack_pop(stack, top, ax, bx);
+ estack_pop(stack, top, ax, bx, ax_t, bx_t);
estack_ax_v = res;
+ estack_ax_t = REG_S64;
next_pc += sizeof(struct binary_op);
PO;
}
int res;
res = (stack_strcmp(stack, top, "<") < 0);
- estack_pop(stack, top, ax, bx);
+ estack_pop(stack, top, ax, bx, ax_t, bx_t);
estack_ax_v = res;
+ estack_ax_t = REG_S64;
next_pc += sizeof(struct binary_op);
PO;
}
int res;
res = (stack_strcmp(stack, top, ">=") >= 0);
- estack_pop(stack, top, ax, bx);
+ estack_pop(stack, top, ax, bx, ax_t, bx_t);
estack_ax_v = res;
+ estack_ax_t = REG_S64;
next_pc += sizeof(struct binary_op);
PO;
}
int res;
res = (stack_strcmp(stack, top, "<=") <= 0);
- estack_pop(stack, top, ax, bx);
+ estack_pop(stack, top, ax, bx, ax_t, bx_t);
estack_ax_v = res;
+ estack_ax_t = REG_S64;
next_pc += sizeof(struct binary_op);
PO;
}
int res;
res = (stack_star_glob_match(stack, top, "==") == 0);
- estack_pop(stack, top, ax, bx);
+ estack_pop(stack, top, ax, bx, ax_t, bx_t);
estack_ax_v = res;
+ estack_ax_t = REG_S64;
next_pc += sizeof(struct binary_op);
PO;
}
int res;
res = (stack_star_glob_match(stack, top, "!=") != 0);
- estack_pop(stack, top, ax, bx);
+ estack_pop(stack, top, ax, bx, ax_t, bx_t);
estack_ax_v = res;
+ estack_ax_t = REG_S64;
next_pc += sizeof(struct binary_op);
PO;
}
int res;
res = (estack_bx_v == estack_ax_v);
- estack_pop(stack, top, ax, bx);
+ estack_pop(stack, top, ax, bx, ax_t, bx_t);
estack_ax_v = res;
+ estack_ax_t = REG_S64;
next_pc += sizeof(struct binary_op);
PO;
}
int res;
res = (estack_bx_v != estack_ax_v);
- estack_pop(stack, top, ax, bx);
+ estack_pop(stack, top, ax, bx, ax_t, bx_t);
estack_ax_v = res;
+ estack_ax_t = REG_S64;
next_pc += sizeof(struct binary_op);
PO;
}
int res;
res = (estack_bx_v > estack_ax_v);
- estack_pop(stack, top, ax, bx);
+ estack_pop(stack, top, ax, bx, ax_t, bx_t);
estack_ax_v = res;
+ estack_ax_t = REG_S64;
next_pc += sizeof(struct binary_op);
PO;
}
int res;
res = (estack_bx_v < estack_ax_v);
- estack_pop(stack, top, ax, bx);
+ estack_pop(stack, top, ax, bx, ax_t, bx_t);
estack_ax_v = res;
+ estack_ax_t = REG_S64;
next_pc += sizeof(struct binary_op);
PO;
}
int res;
res = (estack_bx_v >= estack_ax_v);
- estack_pop(stack, top, ax, bx);
+ estack_pop(stack, top, ax, bx, ax_t, bx_t);
estack_ax_v = res;
+ estack_ax_t = REG_S64;
next_pc += sizeof(struct binary_op);
PO;
}
int res;
res = (estack_bx_v <= estack_ax_v);
- estack_pop(stack, top, ax, bx);
+ estack_pop(stack, top, ax, bx, ax_t, bx_t);
estack_ax_v = res;
+ estack_ax_t = REG_S64;
next_pc += sizeof(struct binary_op);
PO;
}
{
int64_t res;
+ if (!IS_INTEGER_REGISTER(estack_ax_t) || !IS_INTEGER_REGISTER(estack_bx_t)) {
+ ret = -EINVAL;
+ goto end;
+ }
+
/* Catch undefined behavior. */
if (unlikely(estack_ax_v < 0 || estack_ax_v >= 64)) {
ret = -EINVAL;
goto end;
}
res = ((uint64_t) estack_bx_v >> (uint32_t) estack_ax_v);
- estack_pop(stack, top, ax, bx);
+ estack_pop(stack, top, ax, bx, ax_t, bx_t);
estack_ax_v = res;
+ estack_ax_t = REG_S64;
next_pc += sizeof(struct binary_op);
PO;
}
{
int64_t res;
+ if (!IS_INTEGER_REGISTER(estack_ax_t) || !IS_INTEGER_REGISTER(estack_bx_t)) {
+ ret = -EINVAL;
+ goto end;
+ }
+
/* Catch undefined behavior. */
if (unlikely(estack_ax_v < 0 || estack_ax_v >= 64)) {
ret = -EINVAL;
goto end;
}
res = ((uint64_t) estack_bx_v << (uint32_t) estack_ax_v);
- estack_pop(stack, top, ax, bx);
+ estack_pop(stack, top, ax, bx, ax_t, bx_t);
estack_ax_v = res;
+ estack_ax_t = REG_S64;
next_pc += sizeof(struct binary_op);
PO;
}
{
int64_t res;
+ if (!IS_INTEGER_REGISTER(estack_ax_t) || !IS_INTEGER_REGISTER(estack_bx_t)) {
+ ret = -EINVAL;
+ goto end;
+ }
+
res = ((uint64_t) estack_bx_v & (uint64_t) estack_ax_v);
- estack_pop(stack, top, ax, bx);
+ estack_pop(stack, top, ax, bx, ax_t, bx_t);
estack_ax_v = res;
+ estack_ax_t = REG_S64;
next_pc += sizeof(struct binary_op);
PO;
}
{
int64_t res;
+ if (!IS_INTEGER_REGISTER(estack_ax_t) || !IS_INTEGER_REGISTER(estack_bx_t)) {
+ ret = -EINVAL;
+ goto end;
+ }
+
res = ((uint64_t) estack_bx_v | (uint64_t) estack_ax_v);
- estack_pop(stack, top, ax, bx);
+ estack_pop(stack, top, ax, bx, ax_t, bx_t);
estack_ax_v = res;
+ estack_ax_t = REG_S64;
next_pc += sizeof(struct binary_op);
PO;
}
{
int64_t res;
+ if (!IS_INTEGER_REGISTER(estack_ax_t) || !IS_INTEGER_REGISTER(estack_bx_t)) {
+ ret = -EINVAL;
+ goto end;
+ }
+
res = ((uint64_t) estack_bx_v ^ (uint64_t) estack_ax_v);
- estack_pop(stack, top, ax, bx);
+ estack_pop(stack, top, ax, bx, ax_t, bx_t);
estack_ax_v = res;
+ estack_ax_t = REG_S64;
next_pc += sizeof(struct binary_op);
PO;
}
OP(FILTER_OP_UNARY_PLUS):
OP(FILTER_OP_UNARY_MINUS):
OP(FILTER_OP_UNARY_NOT):
- printk(KERN_WARNING "unsupported non-specialized bytecode op %u\n",
+ printk(KERN_WARNING "LTTng: filter: unsupported non-specialized bytecode op %u\n",
(unsigned int) *(filter_opcode_t *) pc);
ret = -EINVAL;
goto end;
OP(FILTER_OP_UNARY_BIT_NOT):
{
estack_ax_v = ~(uint64_t) estack_ax_v;
+ estack_ax_t = REG_S64;
next_pc += sizeof(struct unary_op);
PO;
}
OP(FILTER_OP_UNARY_MINUS_S64):
{
estack_ax_v = -estack_ax_v;
+ estack_ax_t = REG_S64;
next_pc += sizeof(struct unary_op);
PO;
}
OP(FILTER_OP_UNARY_NOT_S64):
{
estack_ax_v = !estack_ax_v;
+ estack_ax_t = REG_S64;
next_pc += sizeof(struct unary_op);
PO;
}
next_pc = start_pc + insn->skip_offset;
} else {
/* Pop 1 when jump not taken */
- estack_pop(stack, top, ax, bx);
+ estack_pop(stack, top, ax, bx, ax_t, bx_t);
next_pc += sizeof(struct logical_op);
}
PO;
next_pc = start_pc + insn->skip_offset;
} else {
/* Pop 1 when jump not taken */
- estack_pop(stack, top, ax, bx);
+ estack_pop(stack, top, ax, bx, ax_t, bx_t);
next_pc += sizeof(struct logical_op);
}
PO;
dbg_printk("load field ref offset %u type string\n",
ref->offset);
- estack_push(stack, top, ax, bx);
+ estack_push(stack, top, ax, bx, ax_t, bx_t);
estack_ax(stack, top)->u.s.str =
*(const char * const *) &filter_stack_data[ref->offset];
if (unlikely(!estack_ax(stack, top)->u.s.str)) {
estack_ax(stack, top)->u.s.literal_type =
ESTACK_STRING_LITERAL_TYPE_NONE;
estack_ax(stack, top)->u.s.user = 0;
+ estack_ax(stack, top)->type = REG_STRING;
dbg_printk("ref load string %s\n", estack_ax(stack, top)->u.s.str);
next_pc += sizeof(struct load_op) + sizeof(struct field_ref);
PO;
dbg_printk("load field ref offset %u type sequence\n",
ref->offset);
- estack_push(stack, top, ax, bx);
+ estack_push(stack, top, ax, bx, ax_t, bx_t);
estack_ax(stack, top)->u.s.seq_len =
*(unsigned long *) &filter_stack_data[ref->offset];
estack_ax(stack, top)->u.s.str =
dbg_printk("load field ref offset %u type s64\n",
ref->offset);
- estack_push(stack, top, ax, bx);
+ estack_push(stack, top, ax, bx, ax_t, bx_t);
estack_ax_v =
((struct literal_numeric *) &filter_stack_data[ref->offset])->v;
+ estack_ax_t = REG_S64;
dbg_printk("ref load s64 %lld\n",
(long long) estack_ax_v);
next_pc += sizeof(struct load_op) + sizeof(struct field_ref);
struct load_op *insn = (struct load_op *) pc;
dbg_printk("load string %s\n", insn->data);
- estack_push(stack, top, ax, bx);
+ estack_push(stack, top, ax, bx, ax_t, bx_t);
estack_ax(stack, top)->u.s.str = insn->data;
estack_ax(stack, top)->u.s.seq_len = LTTNG_SIZE_MAX;
estack_ax(stack, top)->u.s.literal_type =
struct load_op *insn = (struct load_op *) pc;
dbg_printk("load globbing pattern %s\n", insn->data);
- estack_push(stack, top, ax, bx);
+ estack_push(stack, top, ax, bx, ax_t, bx_t);
estack_ax(stack, top)->u.s.str = insn->data;
estack_ax(stack, top)->u.s.seq_len = LTTNG_SIZE_MAX;
estack_ax(stack, top)->u.s.literal_type =
{
struct load_op *insn = (struct load_op *) pc;
- estack_push(stack, top, ax, bx);
+ estack_push(stack, top, ax, bx, ax_t, bx_t);
estack_ax_v = ((struct literal_numeric *) insn->data)->v;
+ estack_ax_t = REG_S64;
dbg_printk("load s64 %lld\n",
(long long) estack_ax_v);
next_pc += sizeof(struct load_op)
/* cast */
OP(FILTER_OP_CAST_TO_S64):
- printk(KERN_WARNING "unsupported non-specialized bytecode op %u\n",
+ printk(KERN_WARNING "LTTng: filter: unsupported non-specialized bytecode op %u\n",
(unsigned int) *(filter_opcode_t *) pc);
ret = -EINVAL;
goto end;
ref->offset);
ctx_field = <tng_static_ctx->fields[ref->offset];
ctx_field->get_value(ctx_field, lttng_probe_ctx, &v);
- estack_push(stack, top, ax, bx);
+ estack_push(stack, top, ax, bx, ax_t, bx_t);
estack_ax(stack, top)->u.s.str = v.str;
if (unlikely(!estack_ax(stack, top)->u.s.str)) {
dbg_printk("Filter warning: loading a NULL string.\n");
estack_ax(stack, top)->u.s.literal_type =
ESTACK_STRING_LITERAL_TYPE_NONE;
estack_ax(stack, top)->u.s.user = 0;
+ estack_ax(stack, top)->type = REG_STRING;
dbg_printk("ref get context string %s\n", estack_ax(stack, top)->u.s.str);
next_pc += sizeof(struct load_op) + sizeof(struct field_ref);
PO;
ref->offset);
ctx_field = <tng_static_ctx->fields[ref->offset];
ctx_field->get_value(ctx_field, lttng_probe_ctx, &v);
- estack_push(stack, top, ax, bx);
+ estack_push(stack, top, ax, bx, ax_t, bx_t);
estack_ax_v = v.s64;
+ estack_ax_t = REG_S64;
dbg_printk("ref get context s64 %lld\n",
(long long) estack_ax_v);
next_pc += sizeof(struct load_op) + sizeof(struct field_ref);
dbg_printk("load field ref offset %u type user string\n",
ref->offset);
- estack_push(stack, top, ax, bx);
+ estack_push(stack, top, ax, bx, ax_t, bx_t);
estack_ax(stack, top)->u.s.user_str =
*(const char * const *) &filter_stack_data[ref->offset];
if (unlikely(!estack_ax(stack, top)->u.s.str)) {
estack_ax(stack, top)->u.s.literal_type =
ESTACK_STRING_LITERAL_TYPE_NONE;
estack_ax(stack, top)->u.s.user = 1;
+ estack_ax(stack, top)->type = REG_STRING;
dbg_printk("ref load string %s\n", estack_ax(stack, top)->u.s.str);
next_pc += sizeof(struct load_op) + sizeof(struct field_ref);
PO;
dbg_printk("load field ref offset %u type user sequence\n",
ref->offset);
- estack_push(stack, top, ax, bx);
+ estack_push(stack, top, ax, bx, ax_t, bx_t);
estack_ax(stack, top)->u.s.seq_len =
*(unsigned long *) &filter_stack_data[ref->offset];
estack_ax(stack, top)->u.s.user_str =
OP(FILTER_OP_GET_CONTEXT_ROOT):
{
dbg_printk("op get context root\n");
- estack_push(stack, top, ax, bx);
+ estack_push(stack, top, ax, bx, ax_t, bx_t);
estack_ax(stack, top)->u.ptr.type = LOAD_ROOT_CONTEXT;
/* "field" only needed for variants. */
estack_ax(stack, top)->u.ptr.field = NULL;
+ estack_ax(stack, top)->type = REG_PTR;
next_pc += sizeof(struct load_op);
PO;
}
OP(FILTER_OP_GET_PAYLOAD_ROOT):
{
dbg_printk("op get app payload root\n");
- estack_push(stack, top, ax, bx);
+ estack_push(stack, top, ax, bx, ax_t, bx_t);
estack_ax(stack, top)->u.ptr.type = LOAD_ROOT_PAYLOAD;
estack_ax(stack, top)->u.ptr.ptr = filter_stack_data;
/* "field" only needed for variants. */
estack_ax(stack, top)->u.ptr.field = NULL;
+ estack_ax(stack, top)->type = REG_PTR;
next_pc += sizeof(struct load_op);
PO;
}
dbg_printk("op get symbol\n");
switch (estack_ax(stack, top)->u.ptr.type) {
case LOAD_OBJECT:
- printk(KERN_WARNING "Nested fields not implemented yet.\n");
+ printk(KERN_WARNING "LTTng: filter: Nested fields not implemented yet.\n");
ret = -EINVAL;
goto end;
case LOAD_ROOT_CONTEXT:
if (ret)
goto end;
estack_ax_v = estack_ax(stack, top)->u.v;
+ estack_ax_t = estack_ax(stack, top)->type;
next_pc += sizeof(struct load_op) + sizeof(struct get_index_u16);
PO;
}
if (ret)
goto end;
estack_ax_v = estack_ax(stack, top)->u.v;
+ estack_ax_t = estack_ax(stack, top)->type;
next_pc += sizeof(struct load_op) + sizeof(struct get_index_u64);
PO;
}
if (ret)
goto end;
estack_ax_v = estack_ax(stack, top)->u.v;
+ estack_ax_t = estack_ax(stack, top)->type;
next_pc += sizeof(struct load_op);
PO;
}
dbg_printk("op load field s8\n");
estack_ax_v = *(int8_t *) estack_ax(stack, top)->u.ptr.ptr;
+ estack_ax_t = REG_S64;
next_pc += sizeof(struct load_op);
PO;
}
dbg_printk("op load field s16\n");
estack_ax_v = *(int16_t *) estack_ax(stack, top)->u.ptr.ptr;
+ estack_ax_t = REG_S64;
next_pc += sizeof(struct load_op);
PO;
}
dbg_printk("op load field s32\n");
estack_ax_v = *(int32_t *) estack_ax(stack, top)->u.ptr.ptr;
+ estack_ax_t = REG_S64;
next_pc += sizeof(struct load_op);
PO;
}
dbg_printk("op load field s64\n");
estack_ax_v = *(int64_t *) estack_ax(stack, top)->u.ptr.ptr;
+ estack_ax_t = REG_S64;
next_pc += sizeof(struct load_op);
PO;
}
dbg_printk("op load field u8\n");
estack_ax_v = *(uint8_t *) estack_ax(stack, top)->u.ptr.ptr;
+ estack_ax_t = REG_S64;
next_pc += sizeof(struct load_op);
PO;
}
dbg_printk("op load field u16\n");
estack_ax_v = *(uint16_t *) estack_ax(stack, top)->u.ptr.ptr;
+ estack_ax_t = REG_S64;
next_pc += sizeof(struct load_op);
PO;
}
dbg_printk("op load field u32\n");
estack_ax_v = *(uint32_t *) estack_ax(stack, top)->u.ptr.ptr;
+ estack_ax_t = REG_S64;
next_pc += sizeof(struct load_op);
PO;
}
dbg_printk("op load field u64\n");
estack_ax_v = *(uint64_t *) estack_ax(stack, top)->u.ptr.ptr;
+ estack_ax_t = REG_S64;
next_pc += sizeof(struct load_op);
PO;
}
estack_ax(stack, top)->u.s.seq_len = LTTNG_SIZE_MAX;
estack_ax(stack, top)->u.s.literal_type =
ESTACK_STRING_LITERAL_TYPE_NONE;
+ estack_ax(stack, top)->type = REG_STRING;
next_pc += sizeof(struct load_op);
PO;
}
}
estack_ax(stack, top)->u.s.literal_type =
ESTACK_STRING_LITERAL_TYPE_NONE;
+ estack_ax(stack, top)->type = REG_STRING;
next_pc += sizeof(struct load_op);
PO;
}