at v6.19 179 lines 5.6 kB view raw
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%%