aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tools/perf/util/probe-event.c28
1 files changed, 25 insertions, 3 deletions
diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
index f7bacbb98865..926bcecc4a44 100644
--- a/tools/perf/util/probe-event.c
+++ b/tools/perf/util/probe-event.c
@@ -1519,9 +1519,31 @@ int parse_probe_trace_command(const char *cmd, struct probe_trace_event *tev)
1519 } else 1519 } else
1520 p = argv[1]; 1520 p = argv[1];
1521 fmt1_str = strtok_r(p, "+", &fmt); 1521 fmt1_str = strtok_r(p, "+", &fmt);
1522 if (fmt1_str[0] == '0') /* only the address started with 0x */ 1522 /* only the address started with 0x */
1523 tp->address = strtoul(fmt1_str, NULL, 0); 1523 if (fmt1_str[0] == '0') {
1524 else { 1524 /*
1525 * Fix a special case:
1526 * if address == 0, kernel reports something like:
1527 * p:probe_libc/abs_0 /lib/libc-2.18.so:0x (null) arg1=%ax
1528 * Newer kernel may fix that, but we want to
1529 * support old kernel also.
1530 */
1531 if (strcmp(fmt1_str, "0x") == 0) {
1532 if (!argv[2] || strcmp(argv[2], "(null)")) {
1533 ret = -EINVAL;
1534 goto out;
1535 }
1536 tp->address = 0;
1537
1538 free(argv[2]);
1539 for (i = 2; argv[i + 1] != NULL; i++)
1540 argv[i] = argv[i + 1];
1541
1542 argv[i] = NULL;
1543 argc -= 1;
1544 } else
1545 tp->address = strtoul(fmt1_str, NULL, 0);
1546 } else {
1525 /* Only the symbol-based probe has offset */ 1547 /* Only the symbol-based probe has offset */
1526 tp->symbol = strdup(fmt1_str); 1548 tp->symbol = strdup(fmt1_str);
1527 if (tp->symbol == NULL) { 1549 if (tp->symbol == NULL) {