Linux Audio

Check our new training course

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%%