|
@@ -121,6 +121,47 @@ struct filter_parse_state {
|
|
} operand;
|
|
} operand;
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+#define DEFINE_COMPARISON_PRED(type) \
|
|
|
|
+static int filter_pred_##type(struct filter_pred *pred, void *event, \
|
|
|
|
+ int val1, int val2) \
|
|
|
|
+{ \
|
|
|
|
+ type *addr = (type *)(event + pred->offset); \
|
|
|
|
+ type val = (type)pred->val; \
|
|
|
|
+ int match = 0; \
|
|
|
|
+ \
|
|
|
|
+ switch (pred->op) { \
|
|
|
|
+ case OP_LT: \
|
|
|
|
+ match = (*addr < val); \
|
|
|
|
+ break; \
|
|
|
|
+ case OP_LE: \
|
|
|
|
+ match = (*addr <= val); \
|
|
|
|
+ break; \
|
|
|
|
+ case OP_GT: \
|
|
|
|
+ match = (*addr > val); \
|
|
|
|
+ break; \
|
|
|
|
+ case OP_GE: \
|
|
|
|
+ match = (*addr >= val); \
|
|
|
|
+ break; \
|
|
|
|
+ default: \
|
|
|
|
+ break; \
|
|
|
|
+ } \
|
|
|
|
+ \
|
|
|
|
+ return match; \
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+#define DEFINE_EQUALITY_PRED(size) \
|
|
|
|
+static int filter_pred_##size(struct filter_pred *pred, void *event, \
|
|
|
|
+ int val1, int val2) \
|
|
|
|
+{ \
|
|
|
|
+ u##size *addr = (u##size *)(event + pred->offset); \
|
|
|
|
+ u##size val = (u##size)pred->val; \
|
|
|
|
+ int match; \
|
|
|
|
+ \
|
|
|
|
+ match = (val == *addr) ^ pred->not; \
|
|
|
|
+ \
|
|
|
|
+ return match; \
|
|
|
|
+}
|
|
|
|
+
|
|
DEFINE_COMPARISON_PRED(s64);
|
|
DEFINE_COMPARISON_PRED(s64);
|
|
DEFINE_COMPARISON_PRED(u64);
|
|
DEFINE_COMPARISON_PRED(u64);
|
|
DEFINE_COMPARISON_PRED(s32);
|
|
DEFINE_COMPARISON_PRED(s32);
|