Jiri Olsa | ce1e22b | 2016-02-15 09:34:35 +0100 | [diff] [blame^] | 1 | #include <stddef.h> |
| 2 | #include <stdlib.h> |
| 3 | #include <string.h> |
| 4 | #include <errno.h> |
Jiri Olsa | acbe613 | 2016-02-15 09:34:34 +0100 | [diff] [blame] | 5 | #include "mem-events.h" |
Jiri Olsa | ce1e22b | 2016-02-15 09:34:35 +0100 | [diff] [blame^] | 6 | #include "debug.h" |
Jiri Olsa | acbe613 | 2016-02-15 09:34:34 +0100 | [diff] [blame] | 7 | |
Jiri Olsa | ce1e22b | 2016-02-15 09:34:35 +0100 | [diff] [blame^] | 8 | #define E(t, n) { .tag = t, .name = n } |
Jiri Olsa | acbe613 | 2016-02-15 09:34:34 +0100 | [diff] [blame] | 9 | |
| 10 | struct perf_mem_event perf_mem_events[PERF_MEM_EVENTS__MAX] = { |
Jiri Olsa | ce1e22b | 2016-02-15 09:34:35 +0100 | [diff] [blame^] | 11 | E("ldlat-loads", "cpu/mem-loads,ldlat=30/P"), |
| 12 | E("ldlat-stores", "cpu/mem-stores/P"), |
Jiri Olsa | acbe613 | 2016-02-15 09:34:34 +0100 | [diff] [blame] | 13 | }; |
| 14 | |
| 15 | #undef E |
Jiri Olsa | ce1e22b | 2016-02-15 09:34:35 +0100 | [diff] [blame^] | 16 | |
| 17 | int perf_mem_events__parse(const char *str) |
| 18 | { |
| 19 | char *tok, *saveptr = NULL; |
| 20 | bool found = false; |
| 21 | char *buf; |
| 22 | int j; |
| 23 | |
| 24 | /* We need buffer that we know we can write to. */ |
| 25 | buf = malloc(strlen(str) + 1); |
| 26 | if (!buf) |
| 27 | return -ENOMEM; |
| 28 | |
| 29 | strcpy(buf, str); |
| 30 | |
| 31 | tok = strtok_r((char *)buf, ",", &saveptr); |
| 32 | |
| 33 | while (tok) { |
| 34 | for (j = 0; j < PERF_MEM_EVENTS__MAX; j++) { |
| 35 | struct perf_mem_event *e = &perf_mem_events[j]; |
| 36 | |
| 37 | if (strstr(e->tag, tok)) |
| 38 | e->record = found = true; |
| 39 | } |
| 40 | |
| 41 | tok = strtok_r(NULL, ",", &saveptr); |
| 42 | } |
| 43 | |
| 44 | free(buf); |
| 45 | |
| 46 | if (found) |
| 47 | return 0; |
| 48 | |
| 49 | pr_err("failed: event '%s' not found, use '-e list' to get list of available events\n", str); |
| 50 | return -1; |
| 51 | } |