xref: /linux/tools/perf/util/bpf-filter.l (revision 3a39d672e7f48b8d6b91a09afa4b55352773b4b5)
1 %option prefix="perf_bpf_filter_"
2 %option noyywrap
3 
4 %{
5 #include <stdio.h>
6 #include <stdlib.h>
7 #include <linux/perf_event.h>
8 
9 #include "bpf-filter.h"
10 #include "bpf-filter-bison.h"
11 
12 extern int perf_bpf_filter_needs_path;
13 
sample(enum perf_bpf_filter_term term)14 static int sample(enum perf_bpf_filter_term term)
15 {
16 	perf_bpf_filter_needs_path = 0;
17 	perf_bpf_filter_lval.sample.term = term;
18 	perf_bpf_filter_lval.sample.part = 0;
19 	return BFT_SAMPLE;
20 }
21 
sample_part(enum perf_bpf_filter_term term,int part)22 static int sample_part(enum perf_bpf_filter_term term, int part)
23 {
24 	perf_bpf_filter_needs_path = 0;
25 	perf_bpf_filter_lval.sample.term = term;
26 	perf_bpf_filter_lval.sample.part = part;
27 	return BFT_SAMPLE;
28 }
29 
sample_path(enum perf_bpf_filter_term term)30 static int sample_path(enum perf_bpf_filter_term term)
31 {
32 	perf_bpf_filter_needs_path = 1;
33 	perf_bpf_filter_lval.sample.term = term;
34 	perf_bpf_filter_lval.sample.part = 0;
35 	return BFT_SAMPLE_PATH;
36 }
37 
operator(enum perf_bpf_filter_op op)38 static int operator(enum perf_bpf_filter_op op)
39 {
40 	perf_bpf_filter_lval.op = op;
41 	return BFT_OP;
42 }
43 
value(int base)44 static int value(int base)
45 {
46 	long num;
47 
48 	errno = 0;
49 	num = strtoul(perf_bpf_filter_text, NULL, base);
50 	if (errno)
51 		return BFT_ERROR;
52 
53 	perf_bpf_filter_lval.num = num;
54 	return BFT_NUM;
55 }
56 
constant(int val)57 static int constant(int val)
58 {
59 	perf_bpf_filter_lval.num = val;
60 	return BFT_NUM;
61 }
62 
path_or_error(void)63 static int path_or_error(void)
64 {
65 	if (!perf_bpf_filter_needs_path) {
66 		printf("perf_bpf_filter: Error: Unexpected item: %s\n",
67 			perf_bpf_filter_text);
68 		return BFT_ERROR;
69 	}
70 	perf_bpf_filter_lval.path = perf_bpf_filter_text;
71 	return BFT_PATH;
72 }
73 
74 %}
75 
76 num_dec		[0-9]+
77 num_hex		0[Xx][0-9a-fA-F]+
78 space		[ \t]+
79 path		[^ \t\n]+
80 ident		[_a-zA-Z][_a-zA-Z0-9]+
81 
82 %%
83 
84 {num_dec}	{ return value(10); }
85 {num_hex}	{ return value(16); }
86 {space}		{ }
87 
88 ip		{ return sample(PBF_TERM_IP); }
89 id		{ return sample(PBF_TERM_ID); }
90 tid		{ return sample(PBF_TERM_TID); }
91 pid		{ return sample_part(PBF_TERM_TID, 1); }
92 cpu		{ return sample(PBF_TERM_CPU); }
93 time		{ return sample(PBF_TERM_TIME); }
94 addr		{ return sample(PBF_TERM_ADDR); }
95 period		{ return sample(PBF_TERM_PERIOD); }
96 txn		{ return sample(PBF_TERM_TRANSACTION); }
97 weight		{ return sample(PBF_TERM_WEIGHT); }
98 weight1		{ return sample_part(PBF_TERM_WEIGHT_STRUCT, 1); }
99 weight2		{ return sample_part(PBF_TERM_WEIGHT_STRUCT, 2); }
100 weight3		{ return sample_part(PBF_TERM_WEIGHT_STRUCT, 3); }
101 ins_lat		{ return sample_part(PBF_TERM_WEIGHT_STRUCT, 2); } /* alias for weight2 */
102 p_stage_cyc	{ return sample_part(PBF_TERM_WEIGHT_STRUCT, 3); } /* alias for weight3 */
103 retire_lat	{ return sample_part(PBF_TERM_WEIGHT_STRUCT, 3); } /* alias for weight3 */
104 phys_addr	{ return sample(PBF_TERM_PHYS_ADDR); }
105 code_pgsz	{ return sample(PBF_TERM_CODE_PAGE_SIZE); }
106 data_pgsz	{ return sample(PBF_TERM_DATA_PAGE_SIZE); }
107 mem_op		{ return sample_part(PBF_TERM_DATA_SRC, 1); }
108 mem_lvlnum	{ return sample_part(PBF_TERM_DATA_SRC, 2); }
109 mem_lvl		{ return sample_part(PBF_TERM_DATA_SRC, 2); } /* alias for mem_lvlnum */
110 mem_snoop	{ return sample_part(PBF_TERM_DATA_SRC, 3); } /* include snoopx */
111 mem_remote	{ return sample_part(PBF_TERM_DATA_SRC, 4); }
112 mem_lock	{ return sample_part(PBF_TERM_DATA_SRC, 5); }
113 mem_dtlb	{ return sample_part(PBF_TERM_DATA_SRC, 6); }
114 mem_blk		{ return sample_part(PBF_TERM_DATA_SRC, 7); }
115 mem_hops	{ return sample_part(PBF_TERM_DATA_SRC, 8); }
116 uid		{ return sample(PBF_TERM_UID); }
117 gid		{ return sample(PBF_TERM_GID); }
118 cgroup		{ return sample_path(PBF_TERM_CGROUP); }
119 
120 "=="		{ return operator(PBF_OP_EQ); }
121 "!="		{ return operator(PBF_OP_NEQ); }
122 ">"		{ return operator(PBF_OP_GT); }
123 "<"		{ return operator(PBF_OP_LT); }
124 ">="		{ return operator(PBF_OP_GE); }
125 "<="		{ return operator(PBF_OP_LE); }
126 "&"		{ return operator(PBF_OP_AND); }
127 
128 na		{ return constant(PERF_MEM_OP_NA); }
129 load		{ return constant(PERF_MEM_OP_LOAD); }
130 store		{ return constant(PERF_MEM_OP_STORE); }
131 pfetch		{ return constant(PERF_MEM_OP_PFETCH); }
132 exec		{ return constant(PERF_MEM_OP_EXEC); }
133 
134 l1		{ return constant(PERF_MEM_LVLNUM_L1); }
135 l2		{ return constant(PERF_MEM_LVLNUM_L2); }
136 l3		{ return constant(PERF_MEM_LVLNUM_L3); }
137 l4		{ return constant(PERF_MEM_LVLNUM_L4); }
138 cxl		{ return constant(PERF_MEM_LVLNUM_CXL); }
139 io		{ return constant(PERF_MEM_LVLNUM_IO); }
140 any_cache	{ return constant(PERF_MEM_LVLNUM_ANY_CACHE); }
141 lfb		{ return constant(PERF_MEM_LVLNUM_LFB); }
142 ram		{ return constant(PERF_MEM_LVLNUM_RAM); }
143 pmem		{ return constant(PERF_MEM_LVLNUM_PMEM); }
144 
145 none		{ return constant(PERF_MEM_SNOOP_NONE); }
146 hit		{ return constant(PERF_MEM_SNOOP_HIT); }
147 miss		{ return constant(PERF_MEM_SNOOP_MISS); }
148 hitm		{ return constant(PERF_MEM_SNOOP_HITM); }
149 fwd		{ return constant(PERF_MEM_SNOOPX_FWD); }
150 peer		{ return constant(PERF_MEM_SNOOPX_PEER); }
151 
152 remote		{ return constant(PERF_MEM_REMOTE_REMOTE); }
153 
154 locked		{ return constant(PERF_MEM_LOCK_LOCKED); }
155 
156 l1_hit		{ return constant(PERF_MEM_TLB_L1 | PERF_MEM_TLB_HIT); }
157 l1_miss		{ return constant(PERF_MEM_TLB_L1 | PERF_MEM_TLB_MISS); }
158 l2_hit		{ return constant(PERF_MEM_TLB_L2 | PERF_MEM_TLB_HIT); }
159 l2_miss		{ return constant(PERF_MEM_TLB_L2 | PERF_MEM_TLB_MISS); }
160 any_hit		{ return constant(PERF_MEM_TLB_HIT); }
161 any_miss	{ return constant(PERF_MEM_TLB_MISS); }
162 walk		{ return constant(PERF_MEM_TLB_WK); }
163 os		{ return constant(PERF_MEM_TLB_OS); }
164 fault		{ return constant(PERF_MEM_TLB_OS); } /* alias for os */
165 
166 by_data		{ return constant(PERF_MEM_BLK_DATA); }
167 by_addr		{ return constant(PERF_MEM_BLK_ADDR); }
168 
169 hops0		{ return constant(PERF_MEM_HOPS_0); }
170 hops1		{ return constant(PERF_MEM_HOPS_1); }
171 hops2		{ return constant(PERF_MEM_HOPS_2); }
172 hops3		{ return constant(PERF_MEM_HOPS_3); }
173 
174 ","		{ return ','; }
175 "||"		{ return BFT_LOGICAL_OR; }
176 
177 {path}		{ return path_or_error(); }
178 
179 %%
180