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