Loading...
Note: File does not exist in v5.4.
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
12static int sample(unsigned long sample_flag)
13{
14 perf_bpf_filter_lval.sample.type = sample_flag;
15 perf_bpf_filter_lval.sample.part = 0;
16 return BFT_SAMPLE;
17}
18
19static int sample_part(unsigned long sample_flag, int part)
20{
21 perf_bpf_filter_lval.sample.type = sample_flag;
22 perf_bpf_filter_lval.sample.part = part;
23 return BFT_SAMPLE;
24}
25
26static int operator(enum perf_bpf_filter_op op)
27{
28 perf_bpf_filter_lval.op = op;
29 return BFT_OP;
30}
31
32static int value(int base)
33{
34 long num;
35
36 errno = 0;
37 num = strtoul(perf_bpf_filter_text, NULL, base);
38 if (errno)
39 return BFT_ERROR;
40
41 perf_bpf_filter_lval.num = num;
42 return BFT_NUM;
43}
44
45static int constant(int val)
46{
47 perf_bpf_filter_lval.num = val;
48 return BFT_NUM;
49}
50
51static int error(const char *str)
52{
53 printf("perf_bpf_filter: Unexpected filter %s: %s\n", str, perf_bpf_filter_text);
54 return BFT_ERROR;
55}
56
57%}
58
59num_dec [0-9]+
60num_hex 0[Xx][0-9a-fA-F]+
61space [ \t]+
62ident [_a-zA-Z][_a-zA-Z0-9]+
63
64%%
65
66{num_dec} { return value(10); }
67{num_hex} { return value(16); }
68{space} { }
69
70ip { return sample(PERF_SAMPLE_IP); }
71id { return sample(PERF_SAMPLE_ID); }
72tid { return sample(PERF_SAMPLE_TID); }
73pid { return sample_part(PERF_SAMPLE_TID, 1); }
74cpu { return sample(PERF_SAMPLE_CPU); }
75time { return sample(PERF_SAMPLE_TIME); }
76addr { return sample(PERF_SAMPLE_ADDR); }
77period { return sample(PERF_SAMPLE_PERIOD); }
78txn { return sample(PERF_SAMPLE_TRANSACTION); }
79weight { return sample(PERF_SAMPLE_WEIGHT); }
80weight1 { return sample_part(PERF_SAMPLE_WEIGHT_STRUCT, 1); }
81weight2 { return sample_part(PERF_SAMPLE_WEIGHT_STRUCT, 2); }
82weight3 { return sample_part(PERF_SAMPLE_WEIGHT_STRUCT, 3); }
83ins_lat { return sample_part(PERF_SAMPLE_WEIGHT_STRUCT, 2); } /* alias for weight2 */
84p_stage_cyc { return sample_part(PERF_SAMPLE_WEIGHT_STRUCT, 3); } /* alias for weight3 */
85retire_lat { return sample_part(PERF_SAMPLE_WEIGHT_STRUCT, 3); } /* alias for weight3 */
86phys_addr { return sample(PERF_SAMPLE_PHYS_ADDR); }
87code_pgsz { return sample(PERF_SAMPLE_CODE_PAGE_SIZE); }
88data_pgsz { return sample(PERF_SAMPLE_DATA_PAGE_SIZE); }
89mem_op { return sample_part(PERF_SAMPLE_DATA_SRC, 1); }
90mem_lvlnum { return sample_part(PERF_SAMPLE_DATA_SRC, 2); }
91mem_lvl { return sample_part(PERF_SAMPLE_DATA_SRC, 2); } /* alias for mem_lvlnum */
92mem_snoop { return sample_part(PERF_SAMPLE_DATA_SRC, 3); } /* include snoopx */
93mem_remote { return sample_part(PERF_SAMPLE_DATA_SRC, 4); }
94mem_lock { return sample_part(PERF_SAMPLE_DATA_SRC, 5); }
95mem_dtlb { return sample_part(PERF_SAMPLE_DATA_SRC, 6); }
96mem_blk { return sample_part(PERF_SAMPLE_DATA_SRC, 7); }
97mem_hops { return sample_part(PERF_SAMPLE_DATA_SRC, 8); }
98
99"==" { return operator(PBF_OP_EQ); }
100"!=" { return operator(PBF_OP_NEQ); }
101">" { return operator(PBF_OP_GT); }
102"<" { return operator(PBF_OP_LT); }
103">=" { return operator(PBF_OP_GE); }
104"<=" { return operator(PBF_OP_LE); }
105"&" { return operator(PBF_OP_AND); }
106
107na { return constant(PERF_MEM_OP_NA); }
108load { return constant(PERF_MEM_OP_LOAD); }
109store { return constant(PERF_MEM_OP_STORE); }
110pfetch { return constant(PERF_MEM_OP_PFETCH); }
111exec { return constant(PERF_MEM_OP_EXEC); }
112
113l1 { return constant(PERF_MEM_LVLNUM_L1); }
114l2 { return constant(PERF_MEM_LVLNUM_L2); }
115l3 { return constant(PERF_MEM_LVLNUM_L3); }
116l4 { return constant(PERF_MEM_LVLNUM_L4); }
117cxl { return constant(PERF_MEM_LVLNUM_CXL); }
118io { return constant(PERF_MEM_LVLNUM_IO); }
119any_cache { return constant(PERF_MEM_LVLNUM_ANY_CACHE); }
120lfb { return constant(PERF_MEM_LVLNUM_LFB); }
121ram { return constant(PERF_MEM_LVLNUM_RAM); }
122pmem { return constant(PERF_MEM_LVLNUM_PMEM); }
123
124none { return constant(PERF_MEM_SNOOP_NONE); }
125hit { return constant(PERF_MEM_SNOOP_HIT); }
126miss { return constant(PERF_MEM_SNOOP_MISS); }
127hitm { return constant(PERF_MEM_SNOOP_HITM); }
128fwd { return constant(PERF_MEM_SNOOPX_FWD); }
129peer { return constant(PERF_MEM_SNOOPX_PEER); }
130
131remote { return constant(PERF_MEM_REMOTE_REMOTE); }
132
133locked { return constant(PERF_MEM_LOCK_LOCKED); }
134
135l1_hit { return constant(PERF_MEM_TLB_L1 | PERF_MEM_TLB_HIT); }
136l1_miss { return constant(PERF_MEM_TLB_L1 | PERF_MEM_TLB_MISS); }
137l2_hit { return constant(PERF_MEM_TLB_L2 | PERF_MEM_TLB_HIT); }
138l2_miss { return constant(PERF_MEM_TLB_L2 | PERF_MEM_TLB_MISS); }
139any_hit { return constant(PERF_MEM_TLB_HIT); }
140any_miss { return constant(PERF_MEM_TLB_MISS); }
141walk { return constant(PERF_MEM_TLB_WK); }
142os { return constant(PERF_MEM_TLB_OS); }
143fault { return constant(PERF_MEM_TLB_OS); } /* alias for os */
144
145by_data { return constant(PERF_MEM_BLK_DATA); }
146by_addr { return constant(PERF_MEM_BLK_ADDR); }
147
148hops0 { return constant(PERF_MEM_HOPS_0); }
149hops1 { return constant(PERF_MEM_HOPS_1); }
150hops2 { return constant(PERF_MEM_HOPS_2); }
151hops3 { return constant(PERF_MEM_HOPS_3); }
152
153"," { return ','; }
154"||" { return BFT_LOGICAL_OR; }
155
156{ident} { return error("ident"); }
157. { return error("input"); }
158
159%%