1ac20de6fSZheng Yan %pure-parser 25d9cdc11SArnaldo Carvalho de Melo %parse-param {void *_parse_state} 3ac20de6fSZheng Yan %parse-param {void *scanner} 4ac20de6fSZheng Yan %lex-param {void* scanner} 56297d423SJiri Olsa %locations 689812fc8SJiri Olsa 789812fc8SJiri Olsa %{ 889812fc8SJiri Olsa 989812fc8SJiri Olsa #define YYDEBUG 1 1089812fc8SJiri Olsa 11b2b9d3a3SAgustin Vega-Frias #include <fnmatch.h> 1289812fc8SJiri Olsa #include <linux/compiler.h> 1389812fc8SJiri Olsa #include <linux/list.h> 14d944c4eeSBorislav Petkov #include <linux/types.h> 1589812fc8SJiri Olsa #include "util.h" 16231bb2aaSAndi Kleen #include "pmu.h" 17f2361024SAndi Kleen #include "debug.h" 1889812fc8SJiri Olsa #include "parse-events.h" 19ac20de6fSZheng Yan #include "parse-events-bison.h" 2089812fc8SJiri Olsa 215d9cdc11SArnaldo Carvalho de Melo void parse_events_error(YYLTYPE *loc, void *parse_state, void *scanner, char const *msg); 2234a0548fSArnaldo Carvalho de Melo 2389812fc8SJiri Olsa #define ABORT_ON(val) \ 2489812fc8SJiri Olsa do { \ 2589812fc8SJiri Olsa if (val) \ 2689812fc8SJiri Olsa YYABORT; \ 2789812fc8SJiri Olsa } while (0) 2889812fc8SJiri Olsa 29c5cd8ac0SDavid Ahern #define ALLOC_LIST(list) \ 30c5cd8ac0SDavid Ahern do { \ 31c5cd8ac0SDavid Ahern list = malloc(sizeof(*list)); \ 32c5cd8ac0SDavid Ahern ABORT_ON(!list); \ 33c5cd8ac0SDavid Ahern INIT_LIST_HEAD(list); \ 34c5cd8ac0SDavid Ahern } while (0) 35c5cd8ac0SDavid Ahern 3607ef7574SColin Ian King static void inc_group_count(struct list_head *list, 375d9cdc11SArnaldo Carvalho de Melo struct parse_events_state *parse_state) 3897f63e4aSNamhyung Kim { 3997f63e4aSNamhyung Kim /* Count groups only have more than 1 members */ 4097f63e4aSNamhyung Kim if (!list_is_last(list->next, list)) 415d9cdc11SArnaldo Carvalho de Melo parse_state->nr_groups++; 4297f63e4aSNamhyung Kim } 4397f63e4aSNamhyung Kim 4489812fc8SJiri Olsa %} 4589812fc8SJiri Olsa 4690e2b22dSJiri Olsa %token PE_START_EVENTS PE_START_TERMS 47cf3506dcSJiri Olsa %token PE_VALUE PE_VALUE_SYM_HW PE_VALUE_SYM_SW PE_RAW PE_TERM 48ac2ba9f3SRobert Richter %token PE_EVENT_NAME 4989812fc8SJiri Olsa %token PE_NAME 50d509db04SWang Nan %token PE_BPF_OBJECT PE_BPF_SOURCE 5189812fc8SJiri Olsa %token PE_MODIFIER_EVENT PE_MODIFIER_BP 5289812fc8SJiri Olsa %token PE_NAME_CACHE_TYPE PE_NAME_CACHE_OP_RESULT 5389efb029SJiri Olsa %token PE_PREFIX_MEM PE_PREFIX_RAW PE_PREFIX_GROUP 5489812fc8SJiri Olsa %token PE_ERROR 55ba32a451SKan Liang %token PE_PMU_EVENT_PRE PE_PMU_EVENT_SUF PE_KERNEL_PMU_EVENT 56e571e029SWang Nan %token PE_ARRAY_ALL PE_ARRAY_RANGE 57dd60fba7SMathieu Poirier %token PE_DRV_CFG_TERM 5889812fc8SJiri Olsa %type <num> PE_VALUE 59cf3506dcSJiri Olsa %type <num> PE_VALUE_SYM_HW 60cf3506dcSJiri Olsa %type <num> PE_VALUE_SYM_SW 6189812fc8SJiri Olsa %type <num> PE_RAW 628f707d84SJiri Olsa %type <num> PE_TERM 6389812fc8SJiri Olsa %type <str> PE_NAME 6484c86ca1SWang Nan %type <str> PE_BPF_OBJECT 65d509db04SWang Nan %type <str> PE_BPF_SOURCE 6689812fc8SJiri Olsa %type <str> PE_NAME_CACHE_TYPE 6789812fc8SJiri Olsa %type <str> PE_NAME_CACHE_OP_RESULT 6889812fc8SJiri Olsa %type <str> PE_MODIFIER_EVENT 6989812fc8SJiri Olsa %type <str> PE_MODIFIER_BP 70ac2ba9f3SRobert Richter %type <str> PE_EVENT_NAME 71ba32a451SKan Liang %type <str> PE_PMU_EVENT_PRE PE_PMU_EVENT_SUF PE_KERNEL_PMU_EVENT 72dd60fba7SMathieu Poirier %type <str> PE_DRV_CFG_TERM 73cf3506dcSJiri Olsa %type <num> value_sym 748f707d84SJiri Olsa %type <head> event_config 751d55e8efSArnaldo Carvalho de Melo %type <head> opt_event_config 768f707d84SJiri Olsa %type <term> event_term 77b847cbdcSJiri Olsa %type <head> event_pmu 78b847cbdcSJiri Olsa %type <head> event_legacy_symbol 79b847cbdcSJiri Olsa %type <head> event_legacy_cache 80b847cbdcSJiri Olsa %type <head> event_legacy_mem 81b847cbdcSJiri Olsa %type <head> event_legacy_tracepoint 82865582c3SHe Kuang %type <tracepoint_name> tracepoint_name 83b847cbdcSJiri Olsa %type <head> event_legacy_numeric 84b847cbdcSJiri Olsa %type <head> event_legacy_raw 8584c86ca1SWang Nan %type <head> event_bpf_file 86b847cbdcSJiri Olsa %type <head> event_def 87ac2ba9f3SRobert Richter %type <head> event_mod 88ac2ba9f3SRobert Richter %type <head> event_name 8989efb029SJiri Olsa %type <head> event 9089efb029SJiri Olsa %type <head> events 9189efb029SJiri Olsa %type <head> group_def 9289efb029SJiri Olsa %type <head> group 9389efb029SJiri Olsa %type <head> groups 94e571e029SWang Nan %type <array> array 95e571e029SWang Nan %type <array> array_term 96e571e029SWang Nan %type <array> array_terms 9789812fc8SJiri Olsa 9889812fc8SJiri Olsa %union 9989812fc8SJiri Olsa { 10089812fc8SJiri Olsa char *str; 101b527bab5SRobert Richter u64 num; 1028f707d84SJiri Olsa struct list_head *head; 1036cee6cd3SArnaldo Carvalho de Melo struct parse_events_term *term; 104865582c3SHe Kuang struct tracepoint_name { 105865582c3SHe Kuang char *sys; 106865582c3SHe Kuang char *event; 107865582c3SHe Kuang } tracepoint_name; 108e571e029SWang Nan struct parse_events_array array; 10989812fc8SJiri Olsa } 11089812fc8SJiri Olsa %% 11189812fc8SJiri Olsa 11290e2b22dSJiri Olsa start: 11389efb029SJiri Olsa PE_START_EVENTS start_events 11490e2b22dSJiri Olsa | 11589efb029SJiri Olsa PE_START_TERMS start_terms 11689efb029SJiri Olsa 11789efb029SJiri Olsa start_events: groups 11889efb029SJiri Olsa { 1195d9cdc11SArnaldo Carvalho de Melo struct parse_events_state *parse_state = _parse_state; 12089efb029SJiri Olsa 1215d9cdc11SArnaldo Carvalho de Melo parse_events_update_lists($1, &parse_state->list); 12289efb029SJiri Olsa } 12389efb029SJiri Olsa 12489efb029SJiri Olsa groups: 12589efb029SJiri Olsa groups ',' group 12689efb029SJiri Olsa { 12789efb029SJiri Olsa struct list_head *list = $1; 12889efb029SJiri Olsa struct list_head *group = $3; 12989efb029SJiri Olsa 13089efb029SJiri Olsa parse_events_update_lists(group, list); 13189efb029SJiri Olsa $$ = list; 13289efb029SJiri Olsa } 13389efb029SJiri Olsa | 13489efb029SJiri Olsa groups ',' event 13589efb029SJiri Olsa { 13689efb029SJiri Olsa struct list_head *list = $1; 13789efb029SJiri Olsa struct list_head *event = $3; 13889efb029SJiri Olsa 13989efb029SJiri Olsa parse_events_update_lists(event, list); 14089efb029SJiri Olsa $$ = list; 14189efb029SJiri Olsa } 14289efb029SJiri Olsa | 14389efb029SJiri Olsa group 14489efb029SJiri Olsa | 14589efb029SJiri Olsa event 14689efb029SJiri Olsa 14789efb029SJiri Olsa group: 14889efb029SJiri Olsa group_def ':' PE_MODIFIER_EVENT 14989efb029SJiri Olsa { 15089efb029SJiri Olsa struct list_head *list = $1; 15189efb029SJiri Olsa 15289efb029SJiri Olsa ABORT_ON(parse_events__modifier_group(list, $3)); 15389efb029SJiri Olsa $$ = list; 15489efb029SJiri Olsa } 15589efb029SJiri Olsa | 15689efb029SJiri Olsa group_def 15789efb029SJiri Olsa 15889efb029SJiri Olsa group_def: 15989efb029SJiri Olsa PE_NAME '{' events '}' 16089efb029SJiri Olsa { 16189efb029SJiri Olsa struct list_head *list = $3; 16289efb029SJiri Olsa 1635d9cdc11SArnaldo Carvalho de Melo inc_group_count(list, _parse_state); 16463dab225SArnaldo Carvalho de Melo parse_events__set_leader($1, list); 16589efb029SJiri Olsa $$ = list; 16689efb029SJiri Olsa } 16789efb029SJiri Olsa | 16889efb029SJiri Olsa '{' events '}' 16989efb029SJiri Olsa { 17089efb029SJiri Olsa struct list_head *list = $2; 17189efb029SJiri Olsa 1725d9cdc11SArnaldo Carvalho de Melo inc_group_count(list, _parse_state); 17363dab225SArnaldo Carvalho de Melo parse_events__set_leader(NULL, list); 17489efb029SJiri Olsa $$ = list; 17589efb029SJiri Olsa } 17690e2b22dSJiri Olsa 17789812fc8SJiri Olsa events: 17889efb029SJiri Olsa events ',' event 17989efb029SJiri Olsa { 18089efb029SJiri Olsa struct list_head *event = $3; 18189efb029SJiri Olsa struct list_head *list = $1; 18289efb029SJiri Olsa 18389efb029SJiri Olsa parse_events_update_lists(event, list); 18489efb029SJiri Olsa $$ = list; 18589efb029SJiri Olsa } 18689efb029SJiri Olsa | 18789efb029SJiri Olsa event 18889812fc8SJiri Olsa 189ac2ba9f3SRobert Richter event: event_mod 190ac2ba9f3SRobert Richter 191ac2ba9f3SRobert Richter event_mod: 192ac2ba9f3SRobert Richter event_name PE_MODIFIER_EVENT 19389812fc8SJiri Olsa { 19489efb029SJiri Olsa struct list_head *list = $1; 19546010ab2SJiri Olsa 1965d7be90eSJiri Olsa /* 1975d7be90eSJiri Olsa * Apply modifier on all events added by single event definition 1985d7be90eSJiri Olsa * (there could be more events added for multiple tracepoint 1995d7be90eSJiri Olsa * definitions via '*?'. 2005d7be90eSJiri Olsa */ 201f5b1135bSJiri Olsa ABORT_ON(parse_events__modifier_event(list, $2, false)); 20289efb029SJiri Olsa $$ = list; 20389812fc8SJiri Olsa } 20489812fc8SJiri Olsa | 205ac2ba9f3SRobert Richter event_name 206ac2ba9f3SRobert Richter 207ac2ba9f3SRobert Richter event_name: 208ac2ba9f3SRobert Richter PE_EVENT_NAME event_def 209ac2ba9f3SRobert Richter { 210ac2ba9f3SRobert Richter ABORT_ON(parse_events_name($2, $1)); 211ac2ba9f3SRobert Richter free($1); 212ac2ba9f3SRobert Richter $$ = $2; 213ac2ba9f3SRobert Richter } 214ac2ba9f3SRobert Richter | 21589812fc8SJiri Olsa event_def 21689812fc8SJiri Olsa 2175f537a26SJiri Olsa event_def: event_pmu | 2185f537a26SJiri Olsa event_legacy_symbol | 21989812fc8SJiri Olsa event_legacy_cache sep_dc | 22089812fc8SJiri Olsa event_legacy_mem | 22189812fc8SJiri Olsa event_legacy_tracepoint sep_dc | 22289812fc8SJiri Olsa event_legacy_numeric sep_dc | 22384c86ca1SWang Nan event_legacy_raw sep_dc | 22484c86ca1SWang Nan event_bpf_file 22589812fc8SJiri Olsa 2265f537a26SJiri Olsa event_pmu: 227*4a35a902SArnaldo Carvalho de Melo PE_NAME opt_event_config 2285f537a26SJiri Olsa { 2298255718fSAndi Kleen struct list_head *list, *orig_terms, *terms; 2308255718fSAndi Kleen 231*4a35a902SArnaldo Carvalho de Melo if (parse_events_copy_term_list($2, &orig_terms)) 2328255718fSAndi Kleen YYABORT; 233b847cbdcSJiri Olsa 234c5cd8ac0SDavid Ahern ALLOC_LIST(list); 235*4a35a902SArnaldo Carvalho de Melo if (parse_events_add_pmu(_parse_state, list, $1, $2, false)) { 2368255718fSAndi Kleen struct perf_pmu *pmu = NULL; 2378255718fSAndi Kleen int ok = 0; 238b2b9d3a3SAgustin Vega-Frias char *pattern; 239b2b9d3a3SAgustin Vega-Frias 240b2b9d3a3SAgustin Vega-Frias if (asprintf(&pattern, "%s*", $1) < 0) 241b2b9d3a3SAgustin Vega-Frias YYABORT; 2428255718fSAndi Kleen 2438255718fSAndi Kleen while ((pmu = perf_pmu__scan(pmu)) != NULL) { 2448255718fSAndi Kleen char *name = pmu->name; 2458255718fSAndi Kleen 246a820e335SAndi Kleen if (!strncmp(name, "uncore_", 7) && 247a820e335SAndi Kleen strncmp($1, "uncore_", 7)) 248a820e335SAndi Kleen name += 7; 249b2b9d3a3SAgustin Vega-Frias if (!fnmatch(pattern, name, 0)) { 250b2b9d3a3SAgustin Vega-Frias if (parse_events_copy_term_list(orig_terms, &terms)) { 251b2b9d3a3SAgustin Vega-Frias free(pattern); 2528255718fSAndi Kleen YYABORT; 253b2b9d3a3SAgustin Vega-Frias } 254c199c11dSAgustin Vega-Frias if (!parse_events_add_pmu(_parse_state, list, pmu->name, terms, true)) 2558255718fSAndi Kleen ok++; 2568255718fSAndi Kleen parse_events_terms__delete(terms); 2578255718fSAndi Kleen } 2588255718fSAndi Kleen } 259b2b9d3a3SAgustin Vega-Frias 260b2b9d3a3SAgustin Vega-Frias free(pattern); 261b2b9d3a3SAgustin Vega-Frias 2628255718fSAndi Kleen if (!ok) 2638255718fSAndi Kleen YYABORT; 2648255718fSAndi Kleen } 265*4a35a902SArnaldo Carvalho de Melo parse_events_terms__delete($2); 2668255718fSAndi Kleen parse_events_terms__delete(orig_terms); 267b847cbdcSJiri Olsa $$ = list; 2685f537a26SJiri Olsa } 269ad962273SAdrian Hunter | 270ba32a451SKan Liang PE_KERNEL_PMU_EVENT sep_dc 271ba32a451SKan Liang { 272ba32a451SKan Liang struct list_head *list; 273ba32a451SKan Liang 2745d9cdc11SArnaldo Carvalho de Melo if (parse_events_multi_pmu_add(_parse_state, $1, &list) < 0) 275231bb2aaSAndi Kleen YYABORT; 276ba32a451SKan Liang $$ = list; 277ba32a451SKan Liang } 278ba32a451SKan Liang | 279ba32a451SKan Liang PE_PMU_EVENT_PRE '-' PE_PMU_EVENT_SUF sep_dc 280ba32a451SKan Liang { 281ba32a451SKan Liang struct list_head *list; 282ba32a451SKan Liang char pmu_name[128]; 2838255718fSAndi Kleen 284ba32a451SKan Liang snprintf(&pmu_name, 128, "%s-%s", $1, $3); 2855d9cdc11SArnaldo Carvalho de Melo if (parse_events_multi_pmu_add(_parse_state, pmu_name, &list) < 0) 2868255718fSAndi Kleen YYABORT; 287ba32a451SKan Liang $$ = list; 288ba32a451SKan Liang } 2895f537a26SJiri Olsa 290cf3506dcSJiri Olsa value_sym: 291cf3506dcSJiri Olsa PE_VALUE_SYM_HW 292cf3506dcSJiri Olsa | 293cf3506dcSJiri Olsa PE_VALUE_SYM_SW 294cf3506dcSJiri Olsa 29589812fc8SJiri Olsa event_legacy_symbol: 296cf3506dcSJiri Olsa value_sym '/' event_config '/' 29789812fc8SJiri Olsa { 298c5cd8ac0SDavid Ahern struct list_head *list; 29989812fc8SJiri Olsa int type = $1 >> 16; 30089812fc8SJiri Olsa int config = $1 & 255; 30189812fc8SJiri Olsa 302c5cd8ac0SDavid Ahern ALLOC_LIST(list); 3035d9cdc11SArnaldo Carvalho de Melo ABORT_ON(parse_events_add_numeric(_parse_state, list, type, config, $3)); 3042146afc6SArnaldo Carvalho de Melo parse_events_terms__delete($3); 305b847cbdcSJiri Olsa $$ = list; 3068f707d84SJiri Olsa } 3078f707d84SJiri Olsa | 308cf3506dcSJiri Olsa value_sym sep_slash_dc 3098f707d84SJiri Olsa { 310c5cd8ac0SDavid Ahern struct list_head *list; 3118f707d84SJiri Olsa int type = $1 >> 16; 3128f707d84SJiri Olsa int config = $1 & 255; 3138f707d84SJiri Olsa 314c5cd8ac0SDavid Ahern ALLOC_LIST(list); 3155d9cdc11SArnaldo Carvalho de Melo ABORT_ON(parse_events_add_numeric(_parse_state, list, type, config, NULL)); 316b847cbdcSJiri Olsa $$ = list; 31789812fc8SJiri Olsa } 31889812fc8SJiri Olsa 31989812fc8SJiri Olsa event_legacy_cache: 32043d0b978SWang Nan PE_NAME_CACHE_TYPE '-' PE_NAME_CACHE_OP_RESULT '-' PE_NAME_CACHE_OP_RESULT opt_event_config 32189812fc8SJiri Olsa { 3225d9cdc11SArnaldo Carvalho de Melo struct parse_events_state *parse_state = _parse_state; 3235d9cdc11SArnaldo Carvalho de Melo struct parse_events_error *error = parse_state->error; 324c5cd8ac0SDavid Ahern struct list_head *list; 325b847cbdcSJiri Olsa 326c5cd8ac0SDavid Ahern ALLOC_LIST(list); 3275d9cdc11SArnaldo Carvalho de Melo ABORT_ON(parse_events_add_cache(list, &parse_state->idx, $1, $3, $5, error, $6)); 32843d0b978SWang Nan parse_events_terms__delete($6); 329b847cbdcSJiri Olsa $$ = list; 33089812fc8SJiri Olsa } 33189812fc8SJiri Olsa | 33243d0b978SWang Nan PE_NAME_CACHE_TYPE '-' PE_NAME_CACHE_OP_RESULT opt_event_config 33389812fc8SJiri Olsa { 3345d9cdc11SArnaldo Carvalho de Melo struct parse_events_state *parse_state = _parse_state; 3355d9cdc11SArnaldo Carvalho de Melo struct parse_events_error *error = parse_state->error; 336c5cd8ac0SDavid Ahern struct list_head *list; 337b847cbdcSJiri Olsa 338c5cd8ac0SDavid Ahern ALLOC_LIST(list); 3395d9cdc11SArnaldo Carvalho de Melo ABORT_ON(parse_events_add_cache(list, &parse_state->idx, $1, $3, NULL, error, $4)); 34043d0b978SWang Nan parse_events_terms__delete($4); 341b847cbdcSJiri Olsa $$ = list; 34289812fc8SJiri Olsa } 34389812fc8SJiri Olsa | 34443d0b978SWang Nan PE_NAME_CACHE_TYPE opt_event_config 34589812fc8SJiri Olsa { 3465d9cdc11SArnaldo Carvalho de Melo struct parse_events_state *parse_state = _parse_state; 3475d9cdc11SArnaldo Carvalho de Melo struct parse_events_error *error = parse_state->error; 348c5cd8ac0SDavid Ahern struct list_head *list; 349b847cbdcSJiri Olsa 350c5cd8ac0SDavid Ahern ALLOC_LIST(list); 3515d9cdc11SArnaldo Carvalho de Melo ABORT_ON(parse_events_add_cache(list, &parse_state->idx, $1, NULL, NULL, error, $2)); 35243d0b978SWang Nan parse_events_terms__delete($2); 353b847cbdcSJiri Olsa $$ = list; 35489812fc8SJiri Olsa } 35589812fc8SJiri Olsa 35689812fc8SJiri Olsa event_legacy_mem: 3573741eb9fSJacob Shin PE_PREFIX_MEM PE_VALUE '/' PE_VALUE ':' PE_MODIFIER_BP sep_dc 3583741eb9fSJacob Shin { 3595d9cdc11SArnaldo Carvalho de Melo struct parse_events_state *parse_state = _parse_state; 3603741eb9fSJacob Shin struct list_head *list; 3613741eb9fSJacob Shin 3623741eb9fSJacob Shin ALLOC_LIST(list); 3635d9cdc11SArnaldo Carvalho de Melo ABORT_ON(parse_events_add_breakpoint(list, &parse_state->idx, 3643741eb9fSJacob Shin (void *) $2, $6, $4)); 3653741eb9fSJacob Shin $$ = list; 3663741eb9fSJacob Shin } 3673741eb9fSJacob Shin | 3683741eb9fSJacob Shin PE_PREFIX_MEM PE_VALUE '/' PE_VALUE sep_dc 3693741eb9fSJacob Shin { 3705d9cdc11SArnaldo Carvalho de Melo struct parse_events_state *parse_state = _parse_state; 3713741eb9fSJacob Shin struct list_head *list; 3723741eb9fSJacob Shin 3733741eb9fSJacob Shin ALLOC_LIST(list); 3745d9cdc11SArnaldo Carvalho de Melo ABORT_ON(parse_events_add_breakpoint(list, &parse_state->idx, 3753741eb9fSJacob Shin (void *) $2, NULL, $4)); 3763741eb9fSJacob Shin $$ = list; 3773741eb9fSJacob Shin } 3783741eb9fSJacob Shin | 37989812fc8SJiri Olsa PE_PREFIX_MEM PE_VALUE ':' PE_MODIFIER_BP sep_dc 38089812fc8SJiri Olsa { 3815d9cdc11SArnaldo Carvalho de Melo struct parse_events_state *parse_state = _parse_state; 382c5cd8ac0SDavid Ahern struct list_head *list; 383b847cbdcSJiri Olsa 384c5cd8ac0SDavid Ahern ALLOC_LIST(list); 3855d9cdc11SArnaldo Carvalho de Melo ABORT_ON(parse_events_add_breakpoint(list, &parse_state->idx, 3863741eb9fSJacob Shin (void *) $2, $4, 0)); 387b847cbdcSJiri Olsa $$ = list; 38889812fc8SJiri Olsa } 38989812fc8SJiri Olsa | 39089812fc8SJiri Olsa PE_PREFIX_MEM PE_VALUE sep_dc 39189812fc8SJiri Olsa { 3925d9cdc11SArnaldo Carvalho de Melo struct parse_events_state *parse_state = _parse_state; 393c5cd8ac0SDavid Ahern struct list_head *list; 394b847cbdcSJiri Olsa 395c5cd8ac0SDavid Ahern ALLOC_LIST(list); 3965d9cdc11SArnaldo Carvalho de Melo ABORT_ON(parse_events_add_breakpoint(list, &parse_state->idx, 3973741eb9fSJacob Shin (void *) $2, NULL, 0)); 398b847cbdcSJiri Olsa $$ = list; 39989812fc8SJiri Olsa } 40089812fc8SJiri Olsa 40189812fc8SJiri Olsa event_legacy_tracepoint: 4021d55e8efSArnaldo Carvalho de Melo tracepoint_name opt_event_config 4032b9032e0SAlexander Yarygin { 4045d9cdc11SArnaldo Carvalho de Melo struct parse_events_state *parse_state = _parse_state; 4055d9cdc11SArnaldo Carvalho de Melo struct parse_events_error *error = parse_state->error; 4062b9032e0SAlexander Yarygin struct list_head *list; 4072b9032e0SAlexander Yarygin 4082b9032e0SAlexander Yarygin ALLOC_LIST(list); 40919658171SJiri Olsa if (error) 41019658171SJiri Olsa error->idx = @1.first_column; 411e637d177SHe Kuang 4125d9cdc11SArnaldo Carvalho de Melo if (parse_events_add_tracepoint(list, &parse_state->idx, $1.sys, $1.event, 4131d55e8efSArnaldo Carvalho de Melo error, $2)) 414e637d177SHe Kuang return -1; 415e637d177SHe Kuang 4162b9032e0SAlexander Yarygin $$ = list; 4172b9032e0SAlexander Yarygin } 418865582c3SHe Kuang 419865582c3SHe Kuang tracepoint_name: 420865582c3SHe Kuang PE_NAME '-' PE_NAME ':' PE_NAME 421865582c3SHe Kuang { 422865582c3SHe Kuang char sys_name[128]; 423865582c3SHe Kuang struct tracepoint_name tracepoint; 424865582c3SHe Kuang 425865582c3SHe Kuang snprintf(&sys_name, 128, "%s-%s", $1, $3); 426865582c3SHe Kuang tracepoint.sys = &sys_name; 427865582c3SHe Kuang tracepoint.event = $5; 428865582c3SHe Kuang 429865582c3SHe Kuang $$ = tracepoint; 430865582c3SHe Kuang } 4312b9032e0SAlexander Yarygin | 43289812fc8SJiri Olsa PE_NAME ':' PE_NAME 43389812fc8SJiri Olsa { 434865582c3SHe Kuang struct tracepoint_name tracepoint = {$1, $3}; 435b847cbdcSJiri Olsa 436865582c3SHe Kuang $$ = tracepoint; 43789812fc8SJiri Olsa } 43889812fc8SJiri Olsa 43989812fc8SJiri Olsa event_legacy_numeric: 44010bf358aSWang Nan PE_VALUE ':' PE_VALUE opt_event_config 44189812fc8SJiri Olsa { 442c5cd8ac0SDavid Ahern struct list_head *list; 443b847cbdcSJiri Olsa 444c5cd8ac0SDavid Ahern ALLOC_LIST(list); 4455d9cdc11SArnaldo Carvalho de Melo ABORT_ON(parse_events_add_numeric(_parse_state, list, (u32)$1, $3, $4)); 44610bf358aSWang Nan parse_events_terms__delete($4); 447b847cbdcSJiri Olsa $$ = list; 44889812fc8SJiri Olsa } 44989812fc8SJiri Olsa 45089812fc8SJiri Olsa event_legacy_raw: 45110bf358aSWang Nan PE_RAW opt_event_config 45289812fc8SJiri Olsa { 453c5cd8ac0SDavid Ahern struct list_head *list; 454b847cbdcSJiri Olsa 455c5cd8ac0SDavid Ahern ALLOC_LIST(list); 4565d9cdc11SArnaldo Carvalho de Melo ABORT_ON(parse_events_add_numeric(_parse_state, list, PERF_TYPE_RAW, $1, $2)); 45710bf358aSWang Nan parse_events_terms__delete($2); 458b847cbdcSJiri Olsa $$ = list; 4598f707d84SJiri Olsa } 4608f707d84SJiri Olsa 46184c86ca1SWang Nan event_bpf_file: 462a34f3be7SWang Nan PE_BPF_OBJECT opt_event_config 46384c86ca1SWang Nan { 4645d9cdc11SArnaldo Carvalho de Melo struct parse_events_state *parse_state = _parse_state; 4655d9cdc11SArnaldo Carvalho de Melo struct parse_events_error *error = parse_state->error; 46684c86ca1SWang Nan struct list_head *list; 46784c86ca1SWang Nan 46884c86ca1SWang Nan ALLOC_LIST(list); 4695d9cdc11SArnaldo Carvalho de Melo ABORT_ON(parse_events_load_bpf(parse_state, list, $1, false, $2)); 470a34f3be7SWang Nan parse_events_terms__delete($2); 471d509db04SWang Nan $$ = list; 472d509db04SWang Nan } 473d509db04SWang Nan | 474a34f3be7SWang Nan PE_BPF_SOURCE opt_event_config 475d509db04SWang Nan { 476d509db04SWang Nan struct list_head *list; 477d509db04SWang Nan 478d509db04SWang Nan ALLOC_LIST(list); 4795d9cdc11SArnaldo Carvalho de Melo ABORT_ON(parse_events_load_bpf(_parse_state, list, $1, true, $2)); 480a34f3be7SWang Nan parse_events_terms__delete($2); 48184c86ca1SWang Nan $$ = list; 48284c86ca1SWang Nan } 48384c86ca1SWang Nan 4841d55e8efSArnaldo Carvalho de Melo opt_event_config: 4851d55e8efSArnaldo Carvalho de Melo '/' event_config '/' 4861d55e8efSArnaldo Carvalho de Melo { 4871d55e8efSArnaldo Carvalho de Melo $$ = $2; 4881d55e8efSArnaldo Carvalho de Melo } 4891d55e8efSArnaldo Carvalho de Melo | 4901d55e8efSArnaldo Carvalho de Melo '/' '/' 4911d55e8efSArnaldo Carvalho de Melo { 4921d55e8efSArnaldo Carvalho de Melo $$ = NULL; 4931d55e8efSArnaldo Carvalho de Melo } 4941d55e8efSArnaldo Carvalho de Melo | 4951d55e8efSArnaldo Carvalho de Melo { 4961d55e8efSArnaldo Carvalho de Melo $$ = NULL; 4971d55e8efSArnaldo Carvalho de Melo } 4981d55e8efSArnaldo Carvalho de Melo 49989efb029SJiri Olsa start_terms: event_config 50090e2b22dSJiri Olsa { 5015d9cdc11SArnaldo Carvalho de Melo struct parse_events_state *parse_state = _parse_state; 5025d9cdc11SArnaldo Carvalho de Melo parse_state->terms = $1; 50390e2b22dSJiri Olsa } 50490e2b22dSJiri Olsa 5058f707d84SJiri Olsa event_config: 5068f707d84SJiri Olsa event_config ',' event_term 5078f707d84SJiri Olsa { 5088f707d84SJiri Olsa struct list_head *head = $1; 5096cee6cd3SArnaldo Carvalho de Melo struct parse_events_term *term = $3; 5108f707d84SJiri Olsa 5118f707d84SJiri Olsa ABORT_ON(!head); 5128f707d84SJiri Olsa list_add_tail(&term->list, head); 5138f707d84SJiri Olsa $$ = $1; 5148f707d84SJiri Olsa } 5158f707d84SJiri Olsa | 5168f707d84SJiri Olsa event_term 5178f707d84SJiri Olsa { 5188f707d84SJiri Olsa struct list_head *head = malloc(sizeof(*head)); 5196cee6cd3SArnaldo Carvalho de Melo struct parse_events_term *term = $1; 5208f707d84SJiri Olsa 5218f707d84SJiri Olsa ABORT_ON(!head); 5228f707d84SJiri Olsa INIT_LIST_HEAD(head); 5238f707d84SJiri Olsa list_add_tail(&term->list, head); 5248f707d84SJiri Olsa $$ = head; 5258f707d84SJiri Olsa } 5268f707d84SJiri Olsa 5278f707d84SJiri Olsa event_term: 5288f707d84SJiri Olsa PE_NAME '=' PE_NAME 5298f707d84SJiri Olsa { 5306cee6cd3SArnaldo Carvalho de Melo struct parse_events_term *term; 5318f707d84SJiri Olsa 5326cee6cd3SArnaldo Carvalho de Melo ABORT_ON(parse_events_term__str(&term, PARSE_EVENTS__TERM_TYPE_USER, 533cecf3a2eSJiri Olsa $1, $3, &@1, &@3)); 5348f707d84SJiri Olsa $$ = term; 5358f707d84SJiri Olsa } 5368f707d84SJiri Olsa | 5378f707d84SJiri Olsa PE_NAME '=' PE_VALUE 5388f707d84SJiri Olsa { 5396cee6cd3SArnaldo Carvalho de Melo struct parse_events_term *term; 5408f707d84SJiri Olsa 5416cee6cd3SArnaldo Carvalho de Melo ABORT_ON(parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER, 54299e7138eSJiri Olsa $1, $3, false, &@1, &@3)); 5438f707d84SJiri Olsa $$ = term; 5448f707d84SJiri Olsa } 5458f707d84SJiri Olsa | 5461d33d6dcSJiri Olsa PE_NAME '=' PE_VALUE_SYM_HW 5471d33d6dcSJiri Olsa { 5486cee6cd3SArnaldo Carvalho de Melo struct parse_events_term *term; 5491d33d6dcSJiri Olsa int config = $3 & 255; 5501d33d6dcSJiri Olsa 5516cee6cd3SArnaldo Carvalho de Melo ABORT_ON(parse_events_term__sym_hw(&term, $1, config)); 5521d33d6dcSJiri Olsa $$ = term; 5531d33d6dcSJiri Olsa } 5541d33d6dcSJiri Olsa | 5558f707d84SJiri Olsa PE_NAME 5568f707d84SJiri Olsa { 5576cee6cd3SArnaldo Carvalho de Melo struct parse_events_term *term; 5588f707d84SJiri Olsa 5596cee6cd3SArnaldo Carvalho de Melo ABORT_ON(parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER, 56099e7138eSJiri Olsa $1, 1, true, &@1, NULL)); 5618f707d84SJiri Olsa $$ = term; 5628f707d84SJiri Olsa } 5638f707d84SJiri Olsa | 5641d33d6dcSJiri Olsa PE_VALUE_SYM_HW 5651d33d6dcSJiri Olsa { 5666cee6cd3SArnaldo Carvalho de Melo struct parse_events_term *term; 5671d33d6dcSJiri Olsa int config = $1 & 255; 5681d33d6dcSJiri Olsa 5696cee6cd3SArnaldo Carvalho de Melo ABORT_ON(parse_events_term__sym_hw(&term, NULL, config)); 5701d33d6dcSJiri Olsa $$ = term; 5711d33d6dcSJiri Olsa } 5721d33d6dcSJiri Olsa | 5736b5fc39bSJiri Olsa PE_TERM '=' PE_NAME 5746b5fc39bSJiri Olsa { 5756cee6cd3SArnaldo Carvalho de Melo struct parse_events_term *term; 5766b5fc39bSJiri Olsa 577cecf3a2eSJiri Olsa ABORT_ON(parse_events_term__str(&term, (int)$1, NULL, $3, &@1, &@3)); 5786b5fc39bSJiri Olsa $$ = term; 5796b5fc39bSJiri Olsa } 5806b5fc39bSJiri Olsa | 5818f707d84SJiri Olsa PE_TERM '=' PE_VALUE 5828f707d84SJiri Olsa { 5836cee6cd3SArnaldo Carvalho de Melo struct parse_events_term *term; 5848f707d84SJiri Olsa 58599e7138eSJiri Olsa ABORT_ON(parse_events_term__num(&term, (int)$1, NULL, $3, false, &@1, &@3)); 5868f707d84SJiri Olsa $$ = term; 5878f707d84SJiri Olsa } 5888f707d84SJiri Olsa | 5898f707d84SJiri Olsa PE_TERM 5908f707d84SJiri Olsa { 5916cee6cd3SArnaldo Carvalho de Melo struct parse_events_term *term; 5928f707d84SJiri Olsa 59399e7138eSJiri Olsa ABORT_ON(parse_events_term__num(&term, (int)$1, NULL, 1, true, &@1, NULL)); 5948f707d84SJiri Olsa $$ = term; 59589812fc8SJiri Olsa } 596e571e029SWang Nan | 597e571e029SWang Nan PE_NAME array '=' PE_NAME 598e571e029SWang Nan { 599e571e029SWang Nan struct parse_events_term *term; 600e571e029SWang Nan int i; 601e571e029SWang Nan 602e571e029SWang Nan ABORT_ON(parse_events_term__str(&term, PARSE_EVENTS__TERM_TYPE_USER, 603e571e029SWang Nan $1, $4, &@1, &@4)); 604e571e029SWang Nan 605e571e029SWang Nan term->array = $2; 606e571e029SWang Nan $$ = term; 607e571e029SWang Nan } 608e571e029SWang Nan | 609e571e029SWang Nan PE_NAME array '=' PE_VALUE 610e571e029SWang Nan { 611e571e029SWang Nan struct parse_events_term *term; 612e571e029SWang Nan 613e571e029SWang Nan ABORT_ON(parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER, 61499e7138eSJiri Olsa $1, $4, false, &@1, &@4)); 615e571e029SWang Nan term->array = $2; 616e571e029SWang Nan $$ = term; 617e571e029SWang Nan } 618dd60fba7SMathieu Poirier | 619dd60fba7SMathieu Poirier PE_DRV_CFG_TERM 620dd60fba7SMathieu Poirier { 621dd60fba7SMathieu Poirier struct parse_events_term *term; 622dd60fba7SMathieu Poirier 623dd60fba7SMathieu Poirier ABORT_ON(parse_events_term__str(&term, PARSE_EVENTS__TERM_TYPE_DRV_CFG, 624dd60fba7SMathieu Poirier $1, $1, &@1, NULL)); 625dd60fba7SMathieu Poirier $$ = term; 626dd60fba7SMathieu Poirier } 627e571e029SWang Nan 628e571e029SWang Nan array: 629e571e029SWang Nan '[' array_terms ']' 630e571e029SWang Nan { 631e571e029SWang Nan $$ = $2; 632e571e029SWang Nan } 633e571e029SWang Nan | 634e571e029SWang Nan PE_ARRAY_ALL 635e571e029SWang Nan { 636e571e029SWang Nan $$.nr_ranges = 0; 637e571e029SWang Nan $$.ranges = NULL; 638e571e029SWang Nan } 639e571e029SWang Nan 640e571e029SWang Nan array_terms: 641e571e029SWang Nan array_terms ',' array_term 642e571e029SWang Nan { 643e571e029SWang Nan struct parse_events_array new_array; 644e571e029SWang Nan 645e571e029SWang Nan new_array.nr_ranges = $1.nr_ranges + $3.nr_ranges; 646e571e029SWang Nan new_array.ranges = malloc(sizeof(new_array.ranges[0]) * 647e571e029SWang Nan new_array.nr_ranges); 648e571e029SWang Nan ABORT_ON(!new_array.ranges); 649e571e029SWang Nan memcpy(&new_array.ranges[0], $1.ranges, 650e571e029SWang Nan $1.nr_ranges * sizeof(new_array.ranges[0])); 651e571e029SWang Nan memcpy(&new_array.ranges[$1.nr_ranges], $3.ranges, 652e571e029SWang Nan $3.nr_ranges * sizeof(new_array.ranges[0])); 653e571e029SWang Nan free($1.ranges); 654e571e029SWang Nan free($3.ranges); 655e571e029SWang Nan $$ = new_array; 656e571e029SWang Nan } 657e571e029SWang Nan | 658e571e029SWang Nan array_term 659e571e029SWang Nan 660e571e029SWang Nan array_term: 661e571e029SWang Nan PE_VALUE 662e571e029SWang Nan { 663e571e029SWang Nan struct parse_events_array array; 664e571e029SWang Nan 665e571e029SWang Nan array.nr_ranges = 1; 666e571e029SWang Nan array.ranges = malloc(sizeof(array.ranges[0])); 667e571e029SWang Nan ABORT_ON(!array.ranges); 668e571e029SWang Nan array.ranges[0].start = $1; 669e571e029SWang Nan array.ranges[0].length = 1; 670e571e029SWang Nan $$ = array; 671e571e029SWang Nan } 672e571e029SWang Nan | 673e571e029SWang Nan PE_VALUE PE_ARRAY_RANGE PE_VALUE 674e571e029SWang Nan { 675e571e029SWang Nan struct parse_events_array array; 676e571e029SWang Nan 677e571e029SWang Nan ABORT_ON($3 < $1); 678e571e029SWang Nan array.nr_ranges = 1; 679e571e029SWang Nan array.ranges = malloc(sizeof(array.ranges[0])); 680e571e029SWang Nan ABORT_ON(!array.ranges); 681e571e029SWang Nan array.ranges[0].start = $1; 682e571e029SWang Nan array.ranges[0].length = $3 - $1 + 1; 683e571e029SWang Nan $$ = array; 684e571e029SWang Nan } 68589812fc8SJiri Olsa 68689812fc8SJiri Olsa sep_dc: ':' | 68789812fc8SJiri Olsa 6888f707d84SJiri Olsa sep_slash_dc: '/' | ':' | 6898f707d84SJiri Olsa 69089812fc8SJiri Olsa %% 69189812fc8SJiri Olsa 6925d9cdc11SArnaldo Carvalho de Melo void parse_events_error(YYLTYPE *loc, void *parse_state, 6936297d423SJiri Olsa void *scanner __maybe_unused, 6941d037ca1SIrina Tirdea char const *msg __maybe_unused) 69589812fc8SJiri Olsa { 6965d9cdc11SArnaldo Carvalho de Melo parse_events_evlist_error(parse_state, loc->last_column, "parser error"); 69789812fc8SJiri Olsa } 698