* to handle user-space read.
*/
static
-char get_char(struct estack_entry *reg, size_t offset)
+char get_char(const struct estack_entry *reg, size_t offset)
{
if (unlikely(offset >= reg->u.s.seq_len))
return '\0';
/* field is only used for types nested within variants. */
ptr->field = NULL;
- switch (field->type.atype) {
- case atype_integer:
+ switch (field->type.type) {
+ case lttng_kernel_type_integer:
ctx_field->get_value(ctx_field, lttng_probe_ctx, &v);
if (field->type.u.integer.signedness) {
ptr->object_type = OBJECT_TYPE_S64;
ptr->ptr = &ptr->u.u64;
}
break;
- case atype_enum_nestable:
+ case lttng_kernel_type_enum_nestable:
{
const struct lttng_integer_type *itype =
&field->type.u.enum_nestable.container_type->u.integer;
}
break;
}
- case atype_array_nestable:
+ case lttng_kernel_type_array_nestable:
if (!lttng_is_bytewise_integer(field->type.u.array_nestable.elem_type)) {
printk(KERN_WARNING "LTTng: bytecode: Array nesting only supports integer types.\n");
return -EINVAL;
ctx_field->get_value(ctx_field, lttng_probe_ctx, &v);
ptr->ptr = v.str;
break;
- case atype_sequence_nestable:
+ case lttng_kernel_type_sequence_nestable:
if (!lttng_is_bytewise_integer(field->type.u.sequence_nestable.elem_type)) {
printk(KERN_WARNING "LTTng: bytecode: Sequence nesting only supports integer types.\n");
return -EINVAL;
ctx_field->get_value(ctx_field, lttng_probe_ctx, &v);
ptr->ptr = v.str;
break;
- case atype_string:
+ case lttng_kernel_type_string:
ptr->object_type = OBJECT_TYPE_STRING;
ctx_field->get_value(ctx_field, lttng_probe_ctx, &v);
ptr->ptr = v.str;
break;
- case atype_struct_nestable:
+ case lttng_kernel_type_struct_nestable:
printk(KERN_WARNING "LTTng: bytecode: Structure type cannot be loaded.\n");
return -EINVAL;
- case atype_variant_nestable:
+ case lttng_kernel_type_variant_nestable:
printk(KERN_WARNING "LTTng: bytecode: Variant type cannot be loaded.\n");
return -EINVAL;
default:
- printk(KERN_WARNING "LTTng: bytecode: Unknown type: %d", (int) field->type.atype);
+ printk(KERN_WARNING "LTTng: bytecode: Unknown type: %d", (int) field->type.type);
return -EINVAL;
}
return 0;
stack_top->u.ptr.ptr = ptr;
stack_top->u.ptr.object_type = gid->elem.type;
stack_top->u.ptr.rev_bo = gid->elem.rev_bo;
- BUG_ON(stack_top->u.ptr.field->type.atype != atype_array_nestable);
+ BUG_ON(stack_top->u.ptr.field->type.type != lttng_kernel_type_array_nestable);
stack_top->u.ptr.field = NULL;
break;
}
stack_top->u.ptr.ptr = ptr;
stack_top->u.ptr.object_type = gid->elem.type;
stack_top->u.ptr.rev_bo = gid->elem.rev_bo;
- BUG_ON(stack_top->u.ptr.field->type.atype != atype_sequence_nestable);
+ BUG_ON(stack_top->u.ptr.field->type.type != lttng_kernel_type_sequence_nestable);
stack_top->u.ptr.field = NULL;
break;
}
return LTTNG_INTERPRETER_RECORD_FLAG;
}
+#ifdef DEBUG
+
+#define DBG_USER_STR_CUTOFF 32
+
+/*
+ * In debug mode, print user string (truncated, if necessary).
+ */
+static inline
+void dbg_load_ref_user_str_printk(const struct estack_entry *user_str_reg)
+{
+ size_t pos = 0;
+ char last_char;
+ char user_str[DBG_USER_STR_CUTOFF];
+
+ pagefault_disable();
+ do {
+ last_char = get_char(user_str_reg, pos);
+ user_str[pos] = last_char;
+ pos++;
+ } while (last_char != '\0' && pos < sizeof(user_str));
+ pagefault_enable();
+
+ user_str[sizeof(user_str) - 1] = '\0';
+ dbg_printk("load field ref user string: '%s%s'\n", user_str,
+ last_char != '\0' ? "[...]" : "");
+}
+#else
+static inline
+void dbg_load_ref_user_str_printk(const struct estack_entry *user_str_reg)
+{
+}
+#endif
+
/*
* Return 0 (discard), or raise the 0x1 flag (log event).
* Currently, other flags are kept for future extensions and have no
estack_push(stack, top, ax, bx, ax_t, bx_t);
estack_ax(stack, top)->u.s.user_str =
*(const char * const *) &interpreter_stack_data[ref->offset];
- if (unlikely(!estack_ax(stack, top)->u.s.str)) {
+ if (unlikely(!estack_ax(stack, top)->u.s.user_str)) {
dbg_printk("Bytecode warning: loading a NULL string.\n");
ret = -EINVAL;
goto end;
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);
+ dbg_load_ref_user_str_printk(estack_ax(stack, top));
next_pc += sizeof(struct load_op) + sizeof(struct field_ref);
PO;
}
estack_ax(stack, top)->u.s.user_str =
*(const char **) (&interpreter_stack_data[ref->offset
+ sizeof(unsigned long)]);
- if (unlikely(!estack_ax(stack, top)->u.s.str)) {
+ if (unlikely(!estack_ax(stack, top)->u.s.user_str)) {
dbg_printk("Bytecode warning: loading a NULL sequence.\n");
ret = -EINVAL;
goto end;