|
@@ -51,6 +51,24 @@ static int str(yyscan_t scanner, int token)
|
|
return token;
|
|
return token;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static int pmu_str_check(yyscan_t scanner)
|
|
|
|
+{
|
|
|
|
+ YYSTYPE *yylval = parse_events_get_lval(scanner);
|
|
|
|
+ char *text = parse_events_get_text(scanner);
|
|
|
|
+
|
|
|
|
+ yylval->str = strdup(text);
|
|
|
|
+ switch (perf_pmu__parse_check(text)) {
|
|
|
|
+ case PMU_EVENT_SYMBOL_PREFIX:
|
|
|
|
+ return PE_PMU_EVENT_PRE;
|
|
|
|
+ case PMU_EVENT_SYMBOL_SUFFIX:
|
|
|
|
+ return PE_PMU_EVENT_SUF;
|
|
|
|
+ case PMU_EVENT_SYMBOL:
|
|
|
|
+ return PE_KERNEL_PMU_EVENT;
|
|
|
|
+ default:
|
|
|
|
+ return PE_NAME;
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
static int sym(yyscan_t scanner, int type, int config)
|
|
static int sym(yyscan_t scanner, int type, int config)
|
|
{
|
|
{
|
|
YYSTYPE *yylval = parse_events_get_lval(scanner);
|
|
YYSTYPE *yylval = parse_events_get_lval(scanner);
|
|
@@ -178,6 +196,16 @@ alignment-faults { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_AL
|
|
emulation-faults { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_EMULATION_FAULTS); }
|
|
emulation-faults { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_EMULATION_FAULTS); }
|
|
dummy { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_DUMMY); }
|
|
dummy { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_DUMMY); }
|
|
|
|
|
|
|
|
+ /*
|
|
|
|
+ * We have to handle the kernel PMU event cycles-ct/cycles-t/mem-loads/mem-stores separately.
|
|
|
|
+ * Because the prefix cycles is mixed up with cpu-cycles.
|
|
|
|
+ * loads and stores are mixed up with cache event
|
|
|
|
+ */
|
|
|
|
+cycles-ct { return str(yyscanner, PE_KERNEL_PMU_EVENT); }
|
|
|
|
+cycles-t { return str(yyscanner, PE_KERNEL_PMU_EVENT); }
|
|
|
|
+mem-loads { return str(yyscanner, PE_KERNEL_PMU_EVENT); }
|
|
|
|
+mem-stores { return str(yyscanner, PE_KERNEL_PMU_EVENT); }
|
|
|
|
+
|
|
L1-dcache|l1-d|l1d|L1-data |
|
|
L1-dcache|l1-d|l1d|L1-data |
|
|
L1-icache|l1-i|l1i|L1-instruction |
|
|
L1-icache|l1-i|l1i|L1-instruction |
|
|
LLC|L2 |
|
|
LLC|L2 |
|
|
@@ -199,7 +227,7 @@ r{num_raw_hex} { return raw(yyscanner); }
|
|
{num_hex} { return value(yyscanner, 16); }
|
|
{num_hex} { return value(yyscanner, 16); }
|
|
|
|
|
|
{modifier_event} { return str(yyscanner, PE_MODIFIER_EVENT); }
|
|
{modifier_event} { return str(yyscanner, PE_MODIFIER_EVENT); }
|
|
-{name} { return str(yyscanner, PE_NAME); }
|
|
|
|
|
|
+{name} { return pmu_str_check(yyscanner); }
|
|
"/" { BEGIN(config); return '/'; }
|
|
"/" { BEGIN(config); return '/'; }
|
|
- { return '-'; }
|
|
- { return '-'; }
|
|
, { BEGIN(event); return ','; }
|
|
, { BEGIN(event); return ','; }
|