Loading...
Note: File does not exist in v4.17.
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
12extern int perf_bpf_filter_needs_path;
13
14static 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
22static 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
30static 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
38static int operator(enum perf_bpf_filter_op op)
39{
40 perf_bpf_filter_lval.op = op;
41 return BFT_OP;
42}
43
44static 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
57static int constant(int val)
58{
59 perf_bpf_filter_lval.num = val;
60 return BFT_NUM;
61}
62
63static 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
76num_dec [0-9]+
77num_hex 0[Xx][0-9a-fA-F]+
78space [ \t]+
79path [^ \t\n]+
80ident [_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
88ip { return sample(PBF_TERM_IP); }
89id { return sample(PBF_TERM_ID); }
90tid { return sample(PBF_TERM_TID); }
91pid { return sample_part(PBF_TERM_TID, 1); }
92cpu { return sample(PBF_TERM_CPU); }
93time { return sample(PBF_TERM_TIME); }
94addr { return sample(PBF_TERM_ADDR); }
95period { return sample(PBF_TERM_PERIOD); }
96txn { return sample(PBF_TERM_TRANSACTION); }
97weight { return sample(PBF_TERM_WEIGHT); }
98weight1 { return sample_part(PBF_TERM_WEIGHT_STRUCT, 1); }
99weight2 { return sample_part(PBF_TERM_WEIGHT_STRUCT, 2); }
100weight3 { return sample_part(PBF_TERM_WEIGHT_STRUCT, 3); }
101ins_lat { return sample_part(PBF_TERM_WEIGHT_STRUCT, 2); } /* alias for weight2 */
102p_stage_cyc { return sample_part(PBF_TERM_WEIGHT_STRUCT, 3); } /* alias for weight3 */
103retire_lat { return sample_part(PBF_TERM_WEIGHT_STRUCT, 3); } /* alias for weight3 */
104phys_addr { return sample(PBF_TERM_PHYS_ADDR); }
105code_pgsz { return sample(PBF_TERM_CODE_PAGE_SIZE); }
106data_pgsz { return sample(PBF_TERM_DATA_PAGE_SIZE); }
107mem_op { return sample_part(PBF_TERM_DATA_SRC, 1); }
108mem_lvlnum { return sample_part(PBF_TERM_DATA_SRC, 2); }
109mem_lvl { return sample_part(PBF_TERM_DATA_SRC, 2); } /* alias for mem_lvlnum */
110mem_snoop { return sample_part(PBF_TERM_DATA_SRC, 3); } /* include snoopx */
111mem_remote { return sample_part(PBF_TERM_DATA_SRC, 4); }
112mem_lock { return sample_part(PBF_TERM_DATA_SRC, 5); }
113mem_dtlb { return sample_part(PBF_TERM_DATA_SRC, 6); }
114mem_blk { return sample_part(PBF_TERM_DATA_SRC, 7); }
115mem_hops { return sample_part(PBF_TERM_DATA_SRC, 8); }
116uid { return sample(PBF_TERM_UID); }
117gid { return sample(PBF_TERM_GID); }
118cgroup { 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
128na { return constant(PERF_MEM_OP_NA); }
129load { return constant(PERF_MEM_OP_LOAD); }
130store { return constant(PERF_MEM_OP_STORE); }
131pfetch { return constant(PERF_MEM_OP_PFETCH); }
132exec { return constant(PERF_MEM_OP_EXEC); }
133
134l1 { return constant(PERF_MEM_LVLNUM_L1); }
135l2 { return constant(PERF_MEM_LVLNUM_L2); }
136l3 { return constant(PERF_MEM_LVLNUM_L3); }
137l4 { return constant(PERF_MEM_LVLNUM_L4); }
138cxl { return constant(PERF_MEM_LVLNUM_CXL); }
139io { return constant(PERF_MEM_LVLNUM_IO); }
140any_cache { return constant(PERF_MEM_LVLNUM_ANY_CACHE); }
141lfb { return constant(PERF_MEM_LVLNUM_LFB); }
142ram { return constant(PERF_MEM_LVLNUM_RAM); }
143pmem { return constant(PERF_MEM_LVLNUM_PMEM); }
144
145none { return constant(PERF_MEM_SNOOP_NONE); }
146hit { return constant(PERF_MEM_SNOOP_HIT); }
147miss { return constant(PERF_MEM_SNOOP_MISS); }
148hitm { return constant(PERF_MEM_SNOOP_HITM); }
149fwd { return constant(PERF_MEM_SNOOPX_FWD); }
150peer { return constant(PERF_MEM_SNOOPX_PEER); }
151
152remote { return constant(PERF_MEM_REMOTE_REMOTE); }
153
154locked { return constant(PERF_MEM_LOCK_LOCKED); }
155
156l1_hit { return constant(PERF_MEM_TLB_L1 | PERF_MEM_TLB_HIT); }
157l1_miss { return constant(PERF_MEM_TLB_L1 | PERF_MEM_TLB_MISS); }
158l2_hit { return constant(PERF_MEM_TLB_L2 | PERF_MEM_TLB_HIT); }
159l2_miss { return constant(PERF_MEM_TLB_L2 | PERF_MEM_TLB_MISS); }
160any_hit { return constant(PERF_MEM_TLB_HIT); }
161any_miss { return constant(PERF_MEM_TLB_MISS); }
162walk { return constant(PERF_MEM_TLB_WK); }
163os { return constant(PERF_MEM_TLB_OS); }
164fault { return constant(PERF_MEM_TLB_OS); } /* alias for os */
165
166by_data { return constant(PERF_MEM_BLK_DATA); }
167by_addr { return constant(PERF_MEM_BLK_ADDR); }
168
169hops0 { return constant(PERF_MEM_HOPS_0); }
170hops1 { return constant(PERF_MEM_HOPS_1); }
171hops2 { return constant(PERF_MEM_HOPS_2); }
172hops3 { return constant(PERF_MEM_HOPS_3); }
173
174"," { return ','; }
175"||" { return BFT_LOGICAL_OR; }
176
177{path} { return path_or_error(); }
178
179%%