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