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 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 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 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 38 static int operator(enum perf_bpf_filter_op op) 39 { 40 perf_bpf_filter_lval.op = op; 41 return BFT_OP; 42 } 43 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 57 static int constant(int val) 58 { 59 perf_bpf_filter_lval.num = val; 60 return BFT_NUM; 61 } 62 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