|
@@ -53,7 +53,21 @@ static int str(yyscan_t scanner, int token)
|
|
|
YYSTYPE *yylval = parse_events_get_lval(scanner);
|
|
|
char *text = parse_events_get_text(scanner);
|
|
|
|
|
|
- yylval->str = strdup(text);
|
|
|
+ if (text[0] != '\'') {
|
|
|
+ yylval->str = strdup(text);
|
|
|
+ } else {
|
|
|
+ /*
|
|
|
+ * If a text tag specified on the command line
|
|
|
+ * contains opening single quite ' then it is
|
|
|
+ * expected that the tag ends with single quote
|
|
|
+ * as well, like this:
|
|
|
+ * name=\'CPU_CLK_UNHALTED.THREAD:cmask=1\'
|
|
|
+ * quotes need to be escaped to bypass shell
|
|
|
+ * processing.
|
|
|
+ */
|
|
|
+ yylval->str = strndup(&text[1], strlen(text) - 2);
|
|
|
+ }
|
|
|
+
|
|
|
return token;
|
|
|
}
|
|
|
|
|
@@ -176,6 +190,7 @@ num_dec [0-9]+
|
|
|
num_hex 0x[a-fA-F0-9]+
|
|
|
num_raw_hex [a-fA-F0-9]+
|
|
|
name [a-zA-Z_*?\[\]][a-zA-Z0-9_*?.\[\]]*
|
|
|
+name_tag [\'][a-zA-Z_*?\[\]][a-zA-Z0-9_*?\-,\.\[\]:=]*[\']
|
|
|
name_minus [a-zA-Z_*?][a-zA-Z0-9\-_*?.:]*
|
|
|
drv_cfg_term [a-zA-Z0-9_\.]+(=[a-zA-Z0-9_*?\.:]+)?
|
|
|
/* If you add a modifier you need to update check_modifier() */
|
|
@@ -344,6 +359,7 @@ r{num_raw_hex} { return raw(yyscanner); }
|
|
|
{bpf_object} { if (!isbpf(yyscanner)) { USER_REJECT }; return str(yyscanner, PE_BPF_OBJECT); }
|
|
|
{bpf_source} { if (!isbpf(yyscanner)) { USER_REJECT }; return str(yyscanner, PE_BPF_SOURCE); }
|
|
|
{name} { return pmu_str_check(yyscanner); }
|
|
|
+{name_tag} { return str(yyscanner, PE_NAME); }
|
|
|
"/" { BEGIN(config); return '/'; }
|
|
|
- { return '-'; }
|
|
|
, { BEGIN(event); return ','; }
|