Version 2.9.15
[lttng-modules.git] / lttng-filter.c
index 6cd750cd6934c2a7a75d3e519950f99e995a5851..36c6db908227326599d158f9c48284edd07ae60c 100644 (file)
@@ -23,7 +23,7 @@
 #include <linux/list.h>
 #include <linux/slab.h>
 
-#include "lttng-filter.h"
+#include <lttng-filter.h>
 
 static const char *opnames[] = {
        [ FILTER_OP_UNKNOWN ] = "UNKNOWN",
@@ -126,6 +126,10 @@ static const char *opnames[] = {
        [ FILTER_OP_GET_CONTEXT_REF_STRING ] = "GET_CONTEXT_REF_STRING",
        [ FILTER_OP_GET_CONTEXT_REF_S64 ] = "GET_CONTEXT_REF_S64",
        [ FILTER_OP_GET_CONTEXT_REF_DOUBLE ] = "GET_CONTEXT_REF_DOUBLE",
+
+       /* load userspace field ref */
+       [ FILTER_OP_LOAD_FIELD_REF_USER_STRING ] = "LOAD_FIELD_REF_USER_STRING",
+       [ FILTER_OP_LOAD_FIELD_REF_USER_SEQUENCE ] = "LOAD_FIELD_REF_USER_SEQUENCE",
 };
 
 const char *lttng_filter_print_op(enum filter_op op)
@@ -179,6 +183,10 @@ int apply_field_reloc(struct lttng_event *event,
                case atype_string:
                        field_offset += sizeof(void *);
                        break;
+               case atype_struct:              /* Unsupported. */
+               case atype_array_compound:      /* Unsupported. */
+               case atype_sequence_compound:   /* Unsupported. */
+               case atype_variant:             /* Unsupported. */
                default:
                        return -EINVAL;
                }
@@ -187,7 +195,7 @@ int apply_field_reloc(struct lttng_event *event,
                return -EINVAL;
 
        /* Check if field offset is too large for 16-bit offset */
-       if (field_offset > FILTER_BYTECODE_MAX_LEN - 1)
+       if (field_offset > LTTNG_KERNEL_FILTER_BYTECODE_MAX_LEN - 1)
                return -EINVAL;
 
        /* set type */
@@ -200,11 +208,21 @@ int apply_field_reloc(struct lttng_event *event,
                break;
        case atype_array:
        case atype_sequence:
-               op->op = FILTER_OP_LOAD_FIELD_REF_SEQUENCE;
+               if (field->user)
+                       op->op = FILTER_OP_LOAD_FIELD_REF_USER_SEQUENCE;
+               else
+                       op->op = FILTER_OP_LOAD_FIELD_REF_SEQUENCE;
                break;
        case atype_string:
-               op->op = FILTER_OP_LOAD_FIELD_REF_STRING;
+               if (field->user)
+                       op->op = FILTER_OP_LOAD_FIELD_REF_USER_STRING;
+               else
+                       op->op = FILTER_OP_LOAD_FIELD_REF_STRING;
                break;
+       case atype_struct:              /* Unsupported. */
+       case atype_array_compound:      /* Unsupported. */
+       case atype_sequence_compound:   /* Unsupported. */
+       case atype_variant:             /* Unsupported. */
        default:
                return -EINVAL;
        }
@@ -233,7 +251,7 @@ int apply_context_reloc(struct lttng_event *event,
                return -ENOENT;
 
        /* Check if idx is too large for 16-bit offset */
-       if (idx > FILTER_BYTECODE_MAX_LEN - 1)
+       if (idx > LTTNG_KERNEL_FILTER_BYTECODE_MAX_LEN - 1)
                return -EINVAL;
 
        /* Get context return type */
@@ -249,8 +267,13 @@ int apply_context_reloc(struct lttng_event *event,
        case atype_string:
        case atype_array:
        case atype_sequence:
+               BUG_ON(ctx_field->event_field.user);
                op->op = FILTER_OP_GET_CONTEXT_REF_STRING;
                break;
+       case atype_struct:      /* Unsupported. */
+       case atype_array_compound:      /* Unsupported. */
+       case atype_sequence_compound:   /* Unsupported. */
+       case atype_variant:             /* Unsupported. */
        default:
                return -EINVAL;
        }
This page took 0.027655 seconds and 4 git commands to generate.