1cff7f956SJiri Olsa #include "parse-events.h" 2cff7f956SJiri Olsa #include "pmu.h" 3cff7f956SJiri Olsa #include "util.h" 4cff7f956SJiri Olsa #include "tests.h" 5cff7f956SJiri Olsa 6cff7f956SJiri Olsa /* Simulated format definitions. */ 7cff7f956SJiri Olsa static struct test_format { 8cff7f956SJiri Olsa const char *name; 9cff7f956SJiri Olsa const char *value; 10cff7f956SJiri Olsa } test_formats[] = { 11cff7f956SJiri Olsa { "krava01", "config:0-1,62-63\n", }, 12cff7f956SJiri Olsa { "krava02", "config:10-17\n", }, 13cff7f956SJiri Olsa { "krava03", "config:5\n", }, 14cff7f956SJiri Olsa { "krava11", "config1:0,2,4,6,8,20-28\n", }, 15cff7f956SJiri Olsa { "krava12", "config1:63\n", }, 16cff7f956SJiri Olsa { "krava13", "config1:45-47\n", }, 17cff7f956SJiri Olsa { "krava21", "config2:0-3,10-13,20-23,30-33,40-43,50-53,60-63\n", }, 18cff7f956SJiri Olsa { "krava22", "config2:8,18,48,58\n", }, 19cff7f956SJiri Olsa { "krava23", "config2:28-29,38\n", }, 20cff7f956SJiri Olsa }; 21cff7f956SJiri Olsa 22cff7f956SJiri Olsa /* Simulated users input. */ 236cee6cd3SArnaldo Carvalho de Melo static struct parse_events_term test_terms[] = { 24cff7f956SJiri Olsa { 25cff7f956SJiri Olsa .config = (char *) "krava01", 26cff7f956SJiri Olsa .val.num = 15, 27cff7f956SJiri Olsa .type_val = PARSE_EVENTS__TERM_TYPE_NUM, 28cff7f956SJiri Olsa .type_term = PARSE_EVENTS__TERM_TYPE_USER, 29cff7f956SJiri Olsa }, 30cff7f956SJiri Olsa { 31cff7f956SJiri Olsa .config = (char *) "krava02", 32cff7f956SJiri Olsa .val.num = 170, 33cff7f956SJiri Olsa .type_val = PARSE_EVENTS__TERM_TYPE_NUM, 34cff7f956SJiri Olsa .type_term = PARSE_EVENTS__TERM_TYPE_USER, 35cff7f956SJiri Olsa }, 36cff7f956SJiri Olsa { 37cff7f956SJiri Olsa .config = (char *) "krava03", 38cff7f956SJiri Olsa .val.num = 1, 39cff7f956SJiri Olsa .type_val = PARSE_EVENTS__TERM_TYPE_NUM, 40cff7f956SJiri Olsa .type_term = PARSE_EVENTS__TERM_TYPE_USER, 41cff7f956SJiri Olsa }, 42cff7f956SJiri Olsa { 43cff7f956SJiri Olsa .config = (char *) "krava11", 44cff7f956SJiri Olsa .val.num = 27, 45cff7f956SJiri Olsa .type_val = PARSE_EVENTS__TERM_TYPE_NUM, 46cff7f956SJiri Olsa .type_term = PARSE_EVENTS__TERM_TYPE_USER, 47cff7f956SJiri Olsa }, 48cff7f956SJiri Olsa { 49cff7f956SJiri Olsa .config = (char *) "krava12", 50cff7f956SJiri Olsa .val.num = 1, 51cff7f956SJiri Olsa .type_val = PARSE_EVENTS__TERM_TYPE_NUM, 52cff7f956SJiri Olsa .type_term = PARSE_EVENTS__TERM_TYPE_USER, 53cff7f956SJiri Olsa }, 54cff7f956SJiri Olsa { 55cff7f956SJiri Olsa .config = (char *) "krava13", 56cff7f956SJiri Olsa .val.num = 2, 57cff7f956SJiri Olsa .type_val = PARSE_EVENTS__TERM_TYPE_NUM, 58cff7f956SJiri Olsa .type_term = PARSE_EVENTS__TERM_TYPE_USER, 59cff7f956SJiri Olsa }, 60cff7f956SJiri Olsa { 61cff7f956SJiri Olsa .config = (char *) "krava21", 62cff7f956SJiri Olsa .val.num = 119, 63cff7f956SJiri Olsa .type_val = PARSE_EVENTS__TERM_TYPE_NUM, 64cff7f956SJiri Olsa .type_term = PARSE_EVENTS__TERM_TYPE_USER, 65cff7f956SJiri Olsa }, 66cff7f956SJiri Olsa { 67cff7f956SJiri Olsa .config = (char *) "krava22", 68cff7f956SJiri Olsa .val.num = 11, 69cff7f956SJiri Olsa .type_val = PARSE_EVENTS__TERM_TYPE_NUM, 70cff7f956SJiri Olsa .type_term = PARSE_EVENTS__TERM_TYPE_USER, 71cff7f956SJiri Olsa }, 72cff7f956SJiri Olsa { 73cff7f956SJiri Olsa .config = (char *) "krava23", 74cff7f956SJiri Olsa .val.num = 2, 75cff7f956SJiri Olsa .type_val = PARSE_EVENTS__TERM_TYPE_NUM, 76cff7f956SJiri Olsa .type_term = PARSE_EVENTS__TERM_TYPE_USER, 77cff7f956SJiri Olsa }, 78cff7f956SJiri Olsa }; 79cff7f956SJiri Olsa 80cff7f956SJiri Olsa /* 81cff7f956SJiri Olsa * Prepare format directory data, exported by kernel 82cff7f956SJiri Olsa * at /sys/bus/event_source/devices/<dev>/format. 83cff7f956SJiri Olsa */ 84cff7f956SJiri Olsa static char *test_format_dir_get(void) 85cff7f956SJiri Olsa { 86cff7f956SJiri Olsa static char dir[PATH_MAX]; 87cff7f956SJiri Olsa unsigned int i; 88cff7f956SJiri Olsa 89cff7f956SJiri Olsa snprintf(dir, PATH_MAX, "/tmp/perf-pmu-test-format-XXXXXX"); 90cff7f956SJiri Olsa if (!mkdtemp(dir)) 91cff7f956SJiri Olsa return NULL; 92cff7f956SJiri Olsa 93*be651ed9SArnaldo Carvalho de Melo for (i = 0; i < ARRAY_SIZE(test_formats); i++) { 94cff7f956SJiri Olsa static char name[PATH_MAX]; 95cff7f956SJiri Olsa struct test_format *format = &test_formats[i]; 96cff7f956SJiri Olsa FILE *file; 97cff7f956SJiri Olsa 98cff7f956SJiri Olsa snprintf(name, PATH_MAX, "%s/%s", dir, format->name); 99cff7f956SJiri Olsa 100cff7f956SJiri Olsa file = fopen(name, "w"); 101cff7f956SJiri Olsa if (!file) 102cff7f956SJiri Olsa return NULL; 103cff7f956SJiri Olsa 104cff7f956SJiri Olsa if (1 != fwrite(format->value, strlen(format->value), 1, file)) 105cff7f956SJiri Olsa break; 106cff7f956SJiri Olsa 107cff7f956SJiri Olsa fclose(file); 108cff7f956SJiri Olsa } 109cff7f956SJiri Olsa 110cff7f956SJiri Olsa return dir; 111cff7f956SJiri Olsa } 112cff7f956SJiri Olsa 113cff7f956SJiri Olsa /* Cleanup format directory. */ 114cff7f956SJiri Olsa static int test_format_dir_put(char *dir) 115cff7f956SJiri Olsa { 116cff7f956SJiri Olsa char buf[PATH_MAX]; 117cff7f956SJiri Olsa snprintf(buf, PATH_MAX, "rm -f %s/*\n", dir); 118cff7f956SJiri Olsa if (system(buf)) 119cff7f956SJiri Olsa return -1; 120cff7f956SJiri Olsa 121cff7f956SJiri Olsa snprintf(buf, PATH_MAX, "rmdir %s\n", dir); 122cff7f956SJiri Olsa return system(buf); 123cff7f956SJiri Olsa } 124cff7f956SJiri Olsa 125cff7f956SJiri Olsa static struct list_head *test_terms_list(void) 126cff7f956SJiri Olsa { 127cff7f956SJiri Olsa static LIST_HEAD(terms); 128cff7f956SJiri Olsa unsigned int i; 129cff7f956SJiri Olsa 130*be651ed9SArnaldo Carvalho de Melo for (i = 0; i < ARRAY_SIZE(test_terms); i++) 131cff7f956SJiri Olsa list_add_tail(&test_terms[i].list, &terms); 132cff7f956SJiri Olsa 133cff7f956SJiri Olsa return &terms; 134cff7f956SJiri Olsa } 135cff7f956SJiri Olsa 136cff7f956SJiri Olsa int test__pmu(void) 137cff7f956SJiri Olsa { 138cff7f956SJiri Olsa char *format = test_format_dir_get(); 139cff7f956SJiri Olsa LIST_HEAD(formats); 140cff7f956SJiri Olsa struct list_head *terms = test_terms_list(); 141cff7f956SJiri Olsa int ret; 142cff7f956SJiri Olsa 143cff7f956SJiri Olsa if (!format) 144cff7f956SJiri Olsa return -EINVAL; 145cff7f956SJiri Olsa 146cff7f956SJiri Olsa do { 147cff7f956SJiri Olsa struct perf_event_attr attr; 148cff7f956SJiri Olsa 149cff7f956SJiri Olsa memset(&attr, 0, sizeof(attr)); 150cff7f956SJiri Olsa 151cff7f956SJiri Olsa ret = perf_pmu__format_parse(format, &formats); 152cff7f956SJiri Olsa if (ret) 153cff7f956SJiri Olsa break; 154cff7f956SJiri Olsa 155cff7f956SJiri Olsa ret = perf_pmu__config_terms(&formats, &attr, terms); 156cff7f956SJiri Olsa if (ret) 157cff7f956SJiri Olsa break; 158cff7f956SJiri Olsa 159cff7f956SJiri Olsa ret = -EINVAL; 160cff7f956SJiri Olsa 161cff7f956SJiri Olsa if (attr.config != 0xc00000000002a823) 162cff7f956SJiri Olsa break; 163cff7f956SJiri Olsa if (attr.config1 != 0x8000400000000145) 164cff7f956SJiri Olsa break; 165cff7f956SJiri Olsa if (attr.config2 != 0x0400000020041d07) 166cff7f956SJiri Olsa break; 167cff7f956SJiri Olsa 168cff7f956SJiri Olsa ret = 0; 169cff7f956SJiri Olsa } while (0); 170cff7f956SJiri Olsa 171cff7f956SJiri Olsa test_format_dir_put(format); 172cff7f956SJiri Olsa return ret; 173cff7f956SJiri Olsa } 174