162306a36Sopenharmony_ci 262306a36Sopenharmony_ci%option reentrant 362306a36Sopenharmony_ci%option bison-bridge 462306a36Sopenharmony_ci%option prefix="parse_events_" 562306a36Sopenharmony_ci%option stack 662306a36Sopenharmony_ci%option bison-locations 762306a36Sopenharmony_ci%option yylineno 862306a36Sopenharmony_ci%option reject 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci%{ 1162306a36Sopenharmony_ci#include <errno.h> 1262306a36Sopenharmony_ci#include <sys/types.h> 1362306a36Sopenharmony_ci#include <sys/stat.h> 1462306a36Sopenharmony_ci#include <unistd.h> 1562306a36Sopenharmony_ci#include "parse-events.h" 1662306a36Sopenharmony_ci#include "parse-events-bison.h" 1762306a36Sopenharmony_ci#include "evsel.h" 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_cichar *parse_events_get_text(yyscan_t yyscanner); 2062306a36Sopenharmony_ciYYSTYPE *parse_events_get_lval(yyscan_t yyscanner); 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_cistatic int __value(YYSTYPE *yylval, char *str, int base, int token) 2362306a36Sopenharmony_ci{ 2462306a36Sopenharmony_ci u64 num; 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci errno = 0; 2762306a36Sopenharmony_ci num = strtoull(str, NULL, base); 2862306a36Sopenharmony_ci if (errno) 2962306a36Sopenharmony_ci return PE_ERROR; 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci yylval->num = num; 3262306a36Sopenharmony_ci return token; 3362306a36Sopenharmony_ci} 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_cistatic int value(yyscan_t scanner, int base) 3662306a36Sopenharmony_ci{ 3762306a36Sopenharmony_ci YYSTYPE *yylval = parse_events_get_lval(scanner); 3862306a36Sopenharmony_ci char *text = parse_events_get_text(scanner); 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci return __value(yylval, text, base, PE_VALUE); 4162306a36Sopenharmony_ci} 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_cistatic int str(yyscan_t scanner, int token) 4462306a36Sopenharmony_ci{ 4562306a36Sopenharmony_ci YYSTYPE *yylval = parse_events_get_lval(scanner); 4662306a36Sopenharmony_ci char *text = parse_events_get_text(scanner); 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_ci if (text[0] != '\'') { 4962306a36Sopenharmony_ci yylval->str = strdup(text); 5062306a36Sopenharmony_ci } else { 5162306a36Sopenharmony_ci /* 5262306a36Sopenharmony_ci * If a text tag specified on the command line 5362306a36Sopenharmony_ci * contains opening single quite ' then it is 5462306a36Sopenharmony_ci * expected that the tag ends with single quote 5562306a36Sopenharmony_ci * as well, like this: 5662306a36Sopenharmony_ci * name=\'CPU_CLK_UNHALTED.THREAD:cmask=1\' 5762306a36Sopenharmony_ci * quotes need to be escaped to bypass shell 5862306a36Sopenharmony_ci * processing. 5962306a36Sopenharmony_ci */ 6062306a36Sopenharmony_ci yylval->str = strndup(&text[1], strlen(text) - 2); 6162306a36Sopenharmony_ci } 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_ci return token; 6462306a36Sopenharmony_ci} 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_cistatic int lc_str(yyscan_t scanner, const struct parse_events_state *state) 6762306a36Sopenharmony_ci{ 6862306a36Sopenharmony_ci return str(scanner, state->match_legacy_cache_terms ? PE_LEGACY_CACHE : PE_NAME); 6962306a36Sopenharmony_ci} 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ci/* 7262306a36Sopenharmony_ci * This function is called when the parser gets two kind of input: 7362306a36Sopenharmony_ci * 7462306a36Sopenharmony_ci * @cfg1 or @cfg2=config 7562306a36Sopenharmony_ci * 7662306a36Sopenharmony_ci * The leading '@' is stripped off before 'cfg1' and 'cfg2=config' are given to 7762306a36Sopenharmony_ci * bison. In the latter case it is necessary to keep the string intact so that 7862306a36Sopenharmony_ci * the PMU kernel driver can determine what configurable is associated to 7962306a36Sopenharmony_ci * 'config'. 8062306a36Sopenharmony_ci */ 8162306a36Sopenharmony_cistatic int drv_str(yyscan_t scanner, int token) 8262306a36Sopenharmony_ci{ 8362306a36Sopenharmony_ci YYSTYPE *yylval = parse_events_get_lval(scanner); 8462306a36Sopenharmony_ci char *text = parse_events_get_text(scanner); 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_ci /* Strip off the '@' */ 8762306a36Sopenharmony_ci yylval->str = strdup(text + 1); 8862306a36Sopenharmony_ci return token; 8962306a36Sopenharmony_ci} 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_ci#define REWIND(__alloc) \ 9262306a36Sopenharmony_cido { \ 9362306a36Sopenharmony_ci YYSTYPE *__yylval = parse_events_get_lval(yyscanner); \ 9462306a36Sopenharmony_ci char *text = parse_events_get_text(yyscanner); \ 9562306a36Sopenharmony_ci \ 9662306a36Sopenharmony_ci if (__alloc) \ 9762306a36Sopenharmony_ci __yylval->str = strdup(text); \ 9862306a36Sopenharmony_ci \ 9962306a36Sopenharmony_ci yycolumn -= strlen(text); \ 10062306a36Sopenharmony_ci yyless(0); \ 10162306a36Sopenharmony_ci} while (0) 10262306a36Sopenharmony_ci 10362306a36Sopenharmony_cistatic int sym(yyscan_t scanner, int type, int config) 10462306a36Sopenharmony_ci{ 10562306a36Sopenharmony_ci YYSTYPE *yylval = parse_events_get_lval(scanner); 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_ci yylval->num = (type << 16) + config; 10862306a36Sopenharmony_ci return type == PERF_TYPE_HARDWARE ? PE_VALUE_SYM_HW : PE_VALUE_SYM_SW; 10962306a36Sopenharmony_ci} 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_cistatic int tool(yyscan_t scanner, enum perf_tool_event event) 11262306a36Sopenharmony_ci{ 11362306a36Sopenharmony_ci YYSTYPE *yylval = parse_events_get_lval(scanner); 11462306a36Sopenharmony_ci 11562306a36Sopenharmony_ci yylval->num = event; 11662306a36Sopenharmony_ci return PE_VALUE_SYM_TOOL; 11762306a36Sopenharmony_ci} 11862306a36Sopenharmony_ci 11962306a36Sopenharmony_cistatic int term(yyscan_t scanner, enum parse_events__term_type type) 12062306a36Sopenharmony_ci{ 12162306a36Sopenharmony_ci YYSTYPE *yylval = parse_events_get_lval(scanner); 12262306a36Sopenharmony_ci 12362306a36Sopenharmony_ci yylval->num = type; 12462306a36Sopenharmony_ci return PE_TERM; 12562306a36Sopenharmony_ci} 12662306a36Sopenharmony_ci 12762306a36Sopenharmony_cistatic int hw_term(yyscan_t scanner, int config) 12862306a36Sopenharmony_ci{ 12962306a36Sopenharmony_ci YYSTYPE *yylval = parse_events_get_lval(scanner); 13062306a36Sopenharmony_ci char *text = parse_events_get_text(scanner); 13162306a36Sopenharmony_ci 13262306a36Sopenharmony_ci yylval->hardware_term.str = strdup(text); 13362306a36Sopenharmony_ci yylval->hardware_term.num = PERF_TYPE_HARDWARE + config; 13462306a36Sopenharmony_ci return PE_TERM_HW; 13562306a36Sopenharmony_ci} 13662306a36Sopenharmony_ci 13762306a36Sopenharmony_ci#define YY_USER_ACTION \ 13862306a36Sopenharmony_cido { \ 13962306a36Sopenharmony_ci yylloc->last_column = yylloc->first_column; \ 14062306a36Sopenharmony_ci yylloc->first_column = yycolumn; \ 14162306a36Sopenharmony_ci yycolumn += yyleng; \ 14262306a36Sopenharmony_ci} while (0); 14362306a36Sopenharmony_ci 14462306a36Sopenharmony_ci#define USER_REJECT \ 14562306a36Sopenharmony_ci yycolumn -= yyleng; \ 14662306a36Sopenharmony_ci REJECT 14762306a36Sopenharmony_ci 14862306a36Sopenharmony_ci%} 14962306a36Sopenharmony_ci 15062306a36Sopenharmony_ci%x mem 15162306a36Sopenharmony_ci%s config 15262306a36Sopenharmony_ci%x event 15362306a36Sopenharmony_ci 15462306a36Sopenharmony_cigroup [^,{}/]*[{][^}]*[}][^,{}/]* 15562306a36Sopenharmony_cievent_pmu [^,{}/]+[/][^/]*[/][^,{}/]* 15662306a36Sopenharmony_cievent [^,{}/]+ 15762306a36Sopenharmony_ci 15862306a36Sopenharmony_cinum_dec [0-9]+ 15962306a36Sopenharmony_cinum_hex 0x[a-fA-F0-9]+ 16062306a36Sopenharmony_cinum_raw_hex [a-fA-F0-9]+ 16162306a36Sopenharmony_ciname [a-zA-Z_*?\[\]][a-zA-Z0-9_*?.\[\]!\-]* 16262306a36Sopenharmony_ciname_tag [\'][a-zA-Z_*?\[\]][a-zA-Z0-9_*?\-,\.\[\]:=]*[\'] 16362306a36Sopenharmony_ciname_minus [a-zA-Z_*?][a-zA-Z0-9\-_*?.:]* 16462306a36Sopenharmony_cidrv_cfg_term [a-zA-Z0-9_\.]+(=[a-zA-Z0-9_*?\.:]+)? 16562306a36Sopenharmony_ci/* 16662306a36Sopenharmony_ci * If you add a modifier you need to update check_modifier(). 16762306a36Sopenharmony_ci * Also, the letters in modifier_event must not be in modifier_bp. 16862306a36Sopenharmony_ci */ 16962306a36Sopenharmony_cimodifier_event [ukhpPGHSDIWeb]+ 17062306a36Sopenharmony_cimodifier_bp [rwx]{1,3} 17162306a36Sopenharmony_cilc_type (L1-dcache|l1-d|l1d|L1-data|L1-icache|l1-i|l1i|L1-instruction|LLC|L2|dTLB|d-tlb|Data-TLB|iTLB|i-tlb|Instruction-TLB|branch|branches|bpu|btb|bpc|node) 17262306a36Sopenharmony_cilc_op_result (load|loads|read|store|stores|write|prefetch|prefetches|speculative-read|speculative-load|refs|Reference|ops|access|misses|miss) 17362306a36Sopenharmony_cidigit [0-9] 17462306a36Sopenharmony_cinon_digit [^0-9] 17562306a36Sopenharmony_ci 17662306a36Sopenharmony_ci%% 17762306a36Sopenharmony_ci 17862306a36Sopenharmony_ci%{ 17962306a36Sopenharmony_ci struct parse_events_state *_parse_state = parse_events_get_extra(yyscanner); 18062306a36Sopenharmony_ci { 18162306a36Sopenharmony_ci int start_token = _parse_state->stoken; 18262306a36Sopenharmony_ci 18362306a36Sopenharmony_ci if (start_token == PE_START_TERMS) 18462306a36Sopenharmony_ci BEGIN(config); 18562306a36Sopenharmony_ci else if (start_token == PE_START_EVENTS) 18662306a36Sopenharmony_ci BEGIN(event); 18762306a36Sopenharmony_ci 18862306a36Sopenharmony_ci if (start_token) { 18962306a36Sopenharmony_ci _parse_state->stoken = 0; 19062306a36Sopenharmony_ci /* 19162306a36Sopenharmony_ci * The flex parser does not init locations variable 19262306a36Sopenharmony_ci * via the scan_string interface, so we need do the 19362306a36Sopenharmony_ci * init in here. 19462306a36Sopenharmony_ci */ 19562306a36Sopenharmony_ci yycolumn = 0; 19662306a36Sopenharmony_ci return start_token; 19762306a36Sopenharmony_ci } 19862306a36Sopenharmony_ci } 19962306a36Sopenharmony_ci%} 20062306a36Sopenharmony_ci 20162306a36Sopenharmony_ci<event>{ 20262306a36Sopenharmony_ci 20362306a36Sopenharmony_ci{group} { 20462306a36Sopenharmony_ci BEGIN(INITIAL); 20562306a36Sopenharmony_ci REWIND(0); 20662306a36Sopenharmony_ci } 20762306a36Sopenharmony_ci 20862306a36Sopenharmony_ci{event_pmu} | 20962306a36Sopenharmony_ci{event} { 21062306a36Sopenharmony_ci BEGIN(INITIAL); 21162306a36Sopenharmony_ci REWIND(1); 21262306a36Sopenharmony_ci return PE_EVENT_NAME; 21362306a36Sopenharmony_ci } 21462306a36Sopenharmony_ci 21562306a36Sopenharmony_ci<<EOF>> { 21662306a36Sopenharmony_ci BEGIN(INITIAL); 21762306a36Sopenharmony_ci REWIND(0); 21862306a36Sopenharmony_ci } 21962306a36Sopenharmony_ci, { 22062306a36Sopenharmony_ci return ','; 22162306a36Sopenharmony_ci } 22262306a36Sopenharmony_ci} 22362306a36Sopenharmony_ci 22462306a36Sopenharmony_ci<config>{ 22562306a36Sopenharmony_ci /* 22662306a36Sopenharmony_ci * Please update config_term_names when new static term is added. 22762306a36Sopenharmony_ci */ 22862306a36Sopenharmony_ciconfig { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_CONFIG); } 22962306a36Sopenharmony_ciconfig1 { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_CONFIG1); } 23062306a36Sopenharmony_ciconfig2 { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_CONFIG2); } 23162306a36Sopenharmony_ciconfig3 { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_CONFIG3); } 23262306a36Sopenharmony_ciname { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_NAME); } 23362306a36Sopenharmony_ciperiod { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD); } 23462306a36Sopenharmony_cifreq { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_SAMPLE_FREQ); } 23562306a36Sopenharmony_cibranch_type { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_BRANCH_SAMPLE_TYPE); } 23662306a36Sopenharmony_citime { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_TIME); } 23762306a36Sopenharmony_cicall-graph { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_CALLGRAPH); } 23862306a36Sopenharmony_cistack-size { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_STACKSIZE); } 23962306a36Sopenharmony_cimax-stack { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_MAX_STACK); } 24062306a36Sopenharmony_cinr { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_MAX_EVENTS); } 24162306a36Sopenharmony_ciinherit { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_INHERIT); } 24262306a36Sopenharmony_cino-inherit { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_NOINHERIT); } 24362306a36Sopenharmony_cioverwrite { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_OVERWRITE); } 24462306a36Sopenharmony_cino-overwrite { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_NOOVERWRITE); } 24562306a36Sopenharmony_cipercore { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_PERCORE); } 24662306a36Sopenharmony_ciaux-output { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_AUX_OUTPUT); } 24762306a36Sopenharmony_ciaux-sample-size { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_AUX_SAMPLE_SIZE); } 24862306a36Sopenharmony_cimetric-id { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_METRIC_ID); } 24962306a36Sopenharmony_cicpu-cycles|cycles { return hw_term(yyscanner, PERF_COUNT_HW_CPU_CYCLES); } 25062306a36Sopenharmony_cistalled-cycles-frontend|idle-cycles-frontend { return hw_term(yyscanner, PERF_COUNT_HW_STALLED_CYCLES_FRONTEND); } 25162306a36Sopenharmony_cistalled-cycles-backend|idle-cycles-backend { return hw_term(yyscanner, PERF_COUNT_HW_STALLED_CYCLES_BACKEND); } 25262306a36Sopenharmony_ciinstructions { return hw_term(yyscanner, PERF_COUNT_HW_INSTRUCTIONS); } 25362306a36Sopenharmony_cicache-references { return hw_term(yyscanner, PERF_COUNT_HW_CACHE_REFERENCES); } 25462306a36Sopenharmony_cicache-misses { return hw_term(yyscanner, PERF_COUNT_HW_CACHE_MISSES); } 25562306a36Sopenharmony_cibranch-instructions|branches { return hw_term(yyscanner, PERF_COUNT_HW_BRANCH_INSTRUCTIONS); } 25662306a36Sopenharmony_cibranch-misses { return hw_term(yyscanner, PERF_COUNT_HW_BRANCH_MISSES); } 25762306a36Sopenharmony_cibus-cycles { return hw_term(yyscanner, PERF_COUNT_HW_BUS_CYCLES); } 25862306a36Sopenharmony_ciref-cycles { return hw_term(yyscanner, PERF_COUNT_HW_REF_CPU_CYCLES); } 25962306a36Sopenharmony_cir{num_raw_hex} { return str(yyscanner, PE_RAW); } 26062306a36Sopenharmony_cir0x{num_raw_hex} { return str(yyscanner, PE_RAW); } 26162306a36Sopenharmony_ci, { return ','; } 26262306a36Sopenharmony_ci"/" { BEGIN(INITIAL); return '/'; } 26362306a36Sopenharmony_ci{lc_type} { return lc_str(yyscanner, _parse_state); } 26462306a36Sopenharmony_ci{lc_type}-{lc_op_result} { return lc_str(yyscanner, _parse_state); } 26562306a36Sopenharmony_ci{lc_type}-{lc_op_result}-{lc_op_result} { return lc_str(yyscanner, _parse_state); } 26662306a36Sopenharmony_ci{name_minus} { return str(yyscanner, PE_NAME); } 26762306a36Sopenharmony_ci@{drv_cfg_term} { return drv_str(yyscanner, PE_DRV_CFG_TERM); } 26862306a36Sopenharmony_ci} 26962306a36Sopenharmony_ci 27062306a36Sopenharmony_ci<mem>{ 27162306a36Sopenharmony_ci{modifier_bp} { return str(yyscanner, PE_MODIFIER_BP); } 27262306a36Sopenharmony_ci /* 27362306a36Sopenharmony_ci * The colon before memory access modifiers can get mixed up with the 27462306a36Sopenharmony_ci * colon before event modifiers. Fortunately none of the option letters 27562306a36Sopenharmony_ci * are the same, so trailing context can be used disambiguate the two 27662306a36Sopenharmony_ci * cases. 27762306a36Sopenharmony_ci */ 27862306a36Sopenharmony_ci":"/{modifier_bp} { return PE_BP_COLON; } 27962306a36Sopenharmony_ci /* 28062306a36Sopenharmony_ci * The slash before memory length can get mixed up with the slash before 28162306a36Sopenharmony_ci * config terms. Fortunately config terms do not start with a numeric 28262306a36Sopenharmony_ci * digit, so trailing context can be used disambiguate the two cases. 28362306a36Sopenharmony_ci */ 28462306a36Sopenharmony_ci"/"/{digit} { return PE_BP_SLASH; } 28562306a36Sopenharmony_ci"/"/{non_digit} { BEGIN(config); return '/'; } 28662306a36Sopenharmony_ci{num_dec} { return value(yyscanner, 10); } 28762306a36Sopenharmony_ci{num_hex} { return value(yyscanner, 16); } 28862306a36Sopenharmony_ci /* 28962306a36Sopenharmony_ci * We need to separate 'mem:' scanner part, in order to get specific 29062306a36Sopenharmony_ci * modifier bits parsed out. Otherwise we would need to handle PE_NAME 29162306a36Sopenharmony_ci * and we'd need to parse it manually. During the escape from <mem> 29262306a36Sopenharmony_ci * state we need to put the escaping char back, so we dont miss it. 29362306a36Sopenharmony_ci */ 29462306a36Sopenharmony_ci. { unput(*yytext); BEGIN(INITIAL); } 29562306a36Sopenharmony_ci /* 29662306a36Sopenharmony_ci * We destroy the scanner after reaching EOF, 29762306a36Sopenharmony_ci * but anyway just to be sure get back to INIT state. 29862306a36Sopenharmony_ci */ 29962306a36Sopenharmony_ci<<EOF>> { BEGIN(INITIAL); } 30062306a36Sopenharmony_ci} 30162306a36Sopenharmony_ci 30262306a36Sopenharmony_cicpu-cycles|cycles { return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_CPU_CYCLES); } 30362306a36Sopenharmony_cistalled-cycles-frontend|idle-cycles-frontend { return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_STALLED_CYCLES_FRONTEND); } 30462306a36Sopenharmony_cistalled-cycles-backend|idle-cycles-backend { return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_STALLED_CYCLES_BACKEND); } 30562306a36Sopenharmony_ciinstructions { return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_INSTRUCTIONS); } 30662306a36Sopenharmony_cicache-references { return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_CACHE_REFERENCES); } 30762306a36Sopenharmony_cicache-misses { return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_CACHE_MISSES); } 30862306a36Sopenharmony_cibranch-instructions|branches { return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_BRANCH_INSTRUCTIONS); } 30962306a36Sopenharmony_cibranch-misses { return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_BRANCH_MISSES); } 31062306a36Sopenharmony_cibus-cycles { return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_BUS_CYCLES); } 31162306a36Sopenharmony_ciref-cycles { return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_REF_CPU_CYCLES); } 31262306a36Sopenharmony_cicpu-clock { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_CPU_CLOCK); } 31362306a36Sopenharmony_citask-clock { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_TASK_CLOCK); } 31462306a36Sopenharmony_cipage-faults|faults { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_PAGE_FAULTS); } 31562306a36Sopenharmony_ciminor-faults { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_PAGE_FAULTS_MIN); } 31662306a36Sopenharmony_cimajor-faults { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_PAGE_FAULTS_MAJ); } 31762306a36Sopenharmony_cicontext-switches|cs { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_CONTEXT_SWITCHES); } 31862306a36Sopenharmony_cicpu-migrations|migrations { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_CPU_MIGRATIONS); } 31962306a36Sopenharmony_cialignment-faults { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_ALIGNMENT_FAULTS); } 32062306a36Sopenharmony_ciemulation-faults { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_EMULATION_FAULTS); } 32162306a36Sopenharmony_cidummy { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_DUMMY); } 32262306a36Sopenharmony_ciduration_time { return tool(yyscanner, PERF_TOOL_DURATION_TIME); } 32362306a36Sopenharmony_ciuser_time { return tool(yyscanner, PERF_TOOL_USER_TIME); } 32462306a36Sopenharmony_cisystem_time { return tool(yyscanner, PERF_TOOL_SYSTEM_TIME); } 32562306a36Sopenharmony_cibpf-output { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_BPF_OUTPUT); } 32662306a36Sopenharmony_cicgroup-switches { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_CGROUP_SWITCHES); } 32762306a36Sopenharmony_ci 32862306a36Sopenharmony_ci{lc_type} { return str(yyscanner, PE_LEGACY_CACHE); } 32962306a36Sopenharmony_ci{lc_type}-{lc_op_result} { return str(yyscanner, PE_LEGACY_CACHE); } 33062306a36Sopenharmony_ci{lc_type}-{lc_op_result}-{lc_op_result} { return str(yyscanner, PE_LEGACY_CACHE); } 33162306a36Sopenharmony_cimem: { BEGIN(mem); return PE_PREFIX_MEM; } 33262306a36Sopenharmony_cir{num_raw_hex} { return str(yyscanner, PE_RAW); } 33362306a36Sopenharmony_ci{num_dec} { return value(yyscanner, 10); } 33462306a36Sopenharmony_ci{num_hex} { return value(yyscanner, 16); } 33562306a36Sopenharmony_ci 33662306a36Sopenharmony_ci{modifier_event} { return str(yyscanner, PE_MODIFIER_EVENT); } 33762306a36Sopenharmony_ci{name} { return str(yyscanner, PE_NAME); } 33862306a36Sopenharmony_ci{name_tag} { return str(yyscanner, PE_NAME); } 33962306a36Sopenharmony_ci"/" { BEGIN(config); return '/'; } 34062306a36Sopenharmony_ci, { BEGIN(event); return ','; } 34162306a36Sopenharmony_ci: { return ':'; } 34262306a36Sopenharmony_ci"{" { BEGIN(event); return '{'; } 34362306a36Sopenharmony_ci"}" { return '}'; } 34462306a36Sopenharmony_ci= { return '='; } 34562306a36Sopenharmony_ci\n { } 34662306a36Sopenharmony_ci. { } 34762306a36Sopenharmony_ci 34862306a36Sopenharmony_ci%% 34962306a36Sopenharmony_ci 35062306a36Sopenharmony_ciint parse_events_wrap(void *scanner __maybe_unused) 35162306a36Sopenharmony_ci{ 35262306a36Sopenharmony_ci return 1; 35362306a36Sopenharmony_ci} 354