[go: up one dir, main page]

File: filter.h

package info (click to toggle)
uftrace 0.18.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 5,356 kB
  • sloc: ansic: 49,770; python: 11,181; asm: 837; makefile: 769; sh: 637; cpp: 627; javascript: 191
file content (196 lines) | stat: -rw-r--r-- 5,574 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
#ifndef UFTRACE_FILTER_H
#define UFTRACE_FILTER_H

#include <regex.h>
#include <stdint.h>
#include <stdio.h>

#include "utils/arch.h"
#include "utils/argspec.h"
#include "utils/list.h"
#include "utils/rbtree.h"

/**
 * REGEX_CHARS: characters for regex matching.
 *
 * When one of these characters is in filter strings,
 * treat them as regex expressions.
 */
#define REGEX_CHARS ".?*+-^$|()[]{}"

enum trigger_flag {
	TRIGGER_FL_DEPTH = (1U << 0),
	TRIGGER_FL_FILTER = (1U << 1),
	TRIGGER_FL_BACKTRACE = (1U << 2),
	TRIGGER_FL_TRACE = (1U << 3),
	TRIGGER_FL_TRACE_ON = (1U << 4),
	TRIGGER_FL_TRACE_OFF = (1U << 5),
	TRIGGER_FL_ARGUMENT = (1U << 6),
	TRIGGER_FL_RECOVER = (1U << 7),
	TRIGGER_FL_RETVAL = (1U << 8),
	TRIGGER_FL_COLOR = (1U << 9),
	TRIGGER_FL_TIME_FILTER = (1U << 10),
	TRIGGER_FL_READ = (1U << 11),
	TRIGGER_FL_FINISH = (1U << 13),
	TRIGGER_FL_AUTO_ARGS = (1U << 14),
	TRIGGER_FL_CALLER = (1U << 15),
	TRIGGER_FL_SIGNAL = (1U << 16),
	TRIGGER_FL_HIDE = (1U << 17),
	TRIGGER_FL_LOC = (1U << 18),
	TRIGGER_FL_SIZE_FILTER = (1U << 19),
	TRIGGER_FL_CLEAR = (1U << 20), /* Reverse other flags when set */
};

/**
 * filter_mode - opt-in or opt-out mode
 *
 * When in opt-in mode, only trace functions that have an explicit filter. When
 * in opt-out mode, trace all but explicitly excluded functions.

 * @FILTER_MODE_NONE is neutral and is only used for initialization in the
 * location filter.
 */
enum filter_mode {
	FILTER_MODE_NONE,
	FILTER_MODE_IN,
	FILTER_MODE_OUT,
};

enum trigger_read_type {
	TRIGGER_READ_NONE = 0,
	TRIGGER_READ_PROC_STATM = 1,
	TRIGGER_READ_PAGE_FAULT = 2,
	TRIGGER_READ_PMU_CYCLE = 4,
	TRIGGER_READ_PMU_CACHE = 8,
	TRIGGER_READ_PMU_BRANCH = 16,
};

enum filter_cond_op {
	FILTER_OP_EQ,
	FILTER_OP_NE,
	FILTER_OP_GT,
	FILTER_OP_GE,
	FILTER_OP_LT,
	FILTER_OP_LE,
};

struct uftrace_filter_cond {
	int idx; /* argument index, 0 if disabled */
	enum filter_cond_op op;
	long val;
};

struct uftrace_trigger {
	enum trigger_flag flags;
	enum trigger_flag clear_flags;
	int depth;
	char color;
	uint64_t time;
	unsigned size;
	enum filter_mode fmode;
	enum filter_mode lmode;
	enum trigger_read_type read;
	struct uftrace_filter_cond cond;
	struct list_head *pargs;
};

struct uftrace_filter {
	struct rb_node node;
	char *name;
	uint64_t start;
	uint64_t end;
	struct list_head args;
	struct uftrace_trigger trigger;
};

enum uftrace_pattern_type {
	PATT_NONE,
	PATT_SIMPLE,
	PATT_REGEX,
	PATT_GLOB,
};

struct uftrace_pattern {
	enum uftrace_pattern_type type;
	char *patt;
	regex_t re;
};

enum uftrace_trace_state {
	TRACE_STATE_NONE,
	TRACE_STATE_OFF,
	TRACE_STATE_ON,
};

struct uftrace_filter_setting {
	enum uftrace_pattern_type ptype;
	enum uftrace_cpu_arch arch;
	bool auto_args;
	bool allow_kernel;
	bool lp64;
	bool plt_only;
	/* caller-defined data */
	void *info_str;
};

struct uftrace_triggers_info {
	/* filters, trigger actions, arg/retval specs */
	/* container type: struct uftrace_filter */
	struct rb_root root;

	/* count of registered opt-in filters (-F) */
	int filter_count;
	/* count of registered caller filters */
	int caller_count;
	/* count of registered opt-in location filters (-L) */
	int loc_count;
};

typedef void (*trigger_fn_t)(struct uftrace_trigger *tr, void *arg);

struct uftrace_sym_info;

void uftrace_setup_filter(char *filter_str, struct uftrace_sym_info *sinfo,
			  struct uftrace_triggers_info *triggers,
			  struct uftrace_filter_setting *setting);
void uftrace_setup_trigger(char *trigger_str, struct uftrace_sym_info *sinfo,
			   struct uftrace_triggers_info *triggers,
			   struct uftrace_filter_setting *setting);
void uftrace_setup_argument(char *args_str, struct uftrace_sym_info *sinfo,
			    struct uftrace_triggers_info *triggers,
			    struct uftrace_filter_setting *setting);
void uftrace_setup_retval(char *retval_str, struct uftrace_sym_info *sinfo,
			  struct uftrace_triggers_info *triggers,
			  struct uftrace_filter_setting *setting);
void uftrace_setup_caller_filter(char *filter_str, struct uftrace_sym_info *sinfo,
				 struct uftrace_triggers_info *triggers,
				 struct uftrace_filter_setting *setting);
void uftrace_setup_hide_filter(char *filter_str, struct uftrace_sym_info *sinfo,
			       struct uftrace_triggers_info *triggers,
			       struct uftrace_filter_setting *setting);
void uftrace_setup_loc_filter(char *filter_str, struct uftrace_sym_info *sinfo,
			      struct uftrace_triggers_info *triggers,
			      struct uftrace_filter_setting *setting);

struct uftrace_triggers_info uftrace_deep_copy_triggers(struct uftrace_triggers_info *src);
struct uftrace_filter *uftrace_match_filter(uint64_t ip, struct rb_root *root,
					    struct uftrace_trigger *tr);
void uftrace_cleanup_filter(struct rb_root *root);
void uftrace_cleanup_triggers(struct uftrace_triggers_info *triggers);
void uftrace_print_filter(struct rb_root *root);
int uftrace_count_filter(struct rb_root *root, unsigned long flag);

bool uftrace_eval_cond(struct uftrace_filter_cond *cond, long val);

void init_filter_pattern(enum uftrace_pattern_type type, struct uftrace_pattern *p, char *str);
bool match_filter_pattern(struct uftrace_pattern *p, char *name);
void free_filter_pattern(struct uftrace_pattern *p);
enum uftrace_pattern_type parse_filter_pattern(const char *str);
const char *get_filter_pattern(enum uftrace_pattern_type ptype);

char *uftrace_clear_kernel(char *filter_str);

int setup_trigger_action(char *str, struct uftrace_trigger *tr, char **module,
			 unsigned long orig_flags, struct uftrace_filter_setting *setting);

#endif /* UFTRACE_FILTER_H */