hc
2023-12-09 b22da3d8526a935aa31e086e63f60ff3246cb61c
kernel/tools/perf/util/parse-events.l
....@@ -15,6 +15,7 @@
1515 #include "../perf.h"
1616 #include "parse-events.h"
1717 #include "parse-events-bison.h"
18
+#include "evsel.h"
1819
1920 char *parse_events_get_text(yyscan_t yyscanner);
2021 YYSTYPE *parse_events_get_lval(yyscan_t yyscanner);
....@@ -40,14 +41,6 @@
4041 return __value(yylval, text, base, PE_VALUE);
4142 }
4243
43
-static int raw(yyscan_t scanner)
44
-{
45
- YYSTYPE *yylval = parse_events_get_lval(scanner);
46
- char *text = parse_events_get_text(scanner);
47
-
48
- return __value(yylval, text + 1, 16, PE_RAW);
49
-}
50
-
5144 static int str(yyscan_t scanner, int token)
5245 {
5346 YYSTYPE *yylval = parse_events_get_lval(scanner);
....@@ -69,6 +62,17 @@
6962 }
7063
7164 return token;
65
+}
66
+
67
+static int raw(yyscan_t scanner)
68
+{
69
+ YYSTYPE *yylval = parse_events_get_lval(scanner);
70
+ char *text = parse_events_get_text(scanner);
71
+
72
+ if (perf_pmu__parse_check(text) == PMU_EVENT_SYMBOL)
73
+ return str(scanner, PE_NAME);
74
+
75
+ return __value(yylval, text + 1, 16, PE_RAW);
7276 }
7377
7478 static bool isbpf_suffix(char *text)
....@@ -128,12 +132,16 @@
128132 yyless(0); \
129133 } while (0)
130134
131
-static int pmu_str_check(yyscan_t scanner)
135
+static int pmu_str_check(yyscan_t scanner, struct parse_events_state *parse_state)
132136 {
133137 YYSTYPE *yylval = parse_events_get_lval(scanner);
134138 char *text = parse_events_get_text(scanner);
135139
136140 yylval->str = strdup(text);
141
+
142
+ if (parse_state->fake_pmu)
143
+ return PE_PMU_EVENT_FAKE;
144
+
137145 switch (perf_pmu__parse_check(text)) {
138146 case PMU_EVENT_SYMBOL_PREFIX:
139147 return PE_PMU_EVENT_PRE;
....@@ -152,6 +160,14 @@
152160
153161 yylval->num = (type << 16) + config;
154162 return type == PERF_TYPE_HARDWARE ? PE_VALUE_SYM_HW : PE_VALUE_SYM_SW;
163
+}
164
+
165
+static int tool(yyscan_t scanner, enum perf_tool_event event)
166
+{
167
+ YYSTYPE *yylval = parse_events_get_lval(scanner);
168
+
169
+ yylval->num = event;
170
+ return PE_VALUE_SYM_TOOL;
155171 }
156172
157173 static int term(yyscan_t scanner, int type)
....@@ -194,16 +210,16 @@
194210 name_minus [a-zA-Z_*?][a-zA-Z0-9\-_*?.:]*
195211 drv_cfg_term [a-zA-Z0-9_\.]+(=[a-zA-Z0-9_*?\.:]+)?
196212 /* If you add a modifier you need to update check_modifier() */
197
-modifier_event [ukhpPGHSDIW]+
213
+modifier_event [ukhpPGHSDIWe]+
198214 modifier_bp [rwx]{1,3}
199215
200216 %%
201217
202218 %{
203
- {
204
- int start_token;
219
+ struct parse_events_state *_parse_state = parse_events_get_extra(yyscanner);
205220
206
- start_token = parse_events_get_extra(yyscanner);
221
+ {
222
+ int start_token = _parse_state->stoken;
207223
208224 if (start_token == PE_START_TERMS)
209225 BEGIN(config);
....@@ -211,7 +227,7 @@
211227 BEGIN(event);
212228
213229 if (start_token) {
214
- parse_events_set_extra(NULL, yyscanner);
230
+ _parse_state->stoken = 0;
215231 /*
216232 * The flex parser does not init locations variable
217233 * via the scan_string interface, so we need do the
....@@ -243,7 +259,9 @@
243259 BEGIN(INITIAL);
244260 REWIND(0);
245261 }
246
-
262
+, {
263
+ return ',';
264
+ }
247265 }
248266
249267 <array>{
....@@ -269,10 +287,16 @@
269287 call-graph { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_CALLGRAPH); }
270288 stack-size { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_STACKSIZE); }
271289 max-stack { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_MAX_STACK); }
290
+nr { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_MAX_EVENTS); }
272291 inherit { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_INHERIT); }
273292 no-inherit { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_NOINHERIT); }
274293 overwrite { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_OVERWRITE); }
275294 no-overwrite { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_NOOVERWRITE); }
295
+percore { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_PERCORE); }
296
+aux-output { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_AUX_OUTPUT); }
297
+aux-sample-size { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_AUX_SAMPLE_SIZE); }
298
+r{num_raw_hex} { return raw(yyscanner); }
299
+r0x{num_raw_hex} { return raw(yyscanner); }
276300 , { return ','; }
277301 "/" { BEGIN(INITIAL); return '/'; }
278302 {name_minus} { return str(yyscanner, PE_NAME); }
....@@ -321,7 +345,7 @@
321345 alignment-faults { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_ALIGNMENT_FAULTS); }
322346 emulation-faults { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_EMULATION_FAULTS); }
323347 dummy { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_DUMMY); }
324
-duration_time { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_DUMMY); }
348
+duration_time { return tool(yyscanner, PERF_TOOL_DURATION_TIME); }
325349 bpf-output { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_BPF_OUTPUT); }
326350
327351 /*
....@@ -329,11 +353,13 @@
329353 * Because the prefix cycles is mixed up with cpu-cycles.
330354 * loads and stores are mixed up with cache event
331355 */
332
-cycles-ct { return str(yyscanner, PE_KERNEL_PMU_EVENT); }
333
-cycles-t { return str(yyscanner, PE_KERNEL_PMU_EVENT); }
334
-mem-loads { return str(yyscanner, PE_KERNEL_PMU_EVENT); }
335
-mem-stores { return str(yyscanner, PE_KERNEL_PMU_EVENT); }
336
-topdown-[a-z-]+ { return str(yyscanner, PE_KERNEL_PMU_EVENT); }
356
+cycles-ct |
357
+cycles-t |
358
+mem-loads |
359
+mem-stores |
360
+topdown-[a-z-]+ |
361
+tx-capacity-[a-z-]+ |
362
+el-capacity-[a-z-]+ { return str(yyscanner, PE_KERNEL_PMU_EVENT); }
337363
338364 L1-dcache|l1-d|l1d|L1-data |
339365 L1-icache|l1-i|l1i|L1-instruction |
....@@ -358,7 +384,7 @@
358384 {modifier_event} { return str(yyscanner, PE_MODIFIER_EVENT); }
359385 {bpf_object} { if (!isbpf(yyscanner)) { USER_REJECT }; return str(yyscanner, PE_BPF_OBJECT); }
360386 {bpf_source} { if (!isbpf(yyscanner)) { USER_REJECT }; return str(yyscanner, PE_BPF_SOURCE); }
361
-{name} { return pmu_str_check(yyscanner); }
387
+{name} { return pmu_str_check(yyscanner, _parse_state); }
362388 {name_tag} { return str(yyscanner, PE_NAME); }
363389 "/" { BEGIN(config); return '/'; }
364390 - { return '-'; }