Lines Matching +full:rc +full:- +full:map +full:- +full:name
51 #include "pmu-events.h"
57 char *name; member
80 return -1; in convert()
103 static void addfield(char *map, char **dst, const char *sep, in addfield() argument
124 strncat(*dst, map + bt->start, blen); in addfield()
138 --e; in fixdesc()
140 --e; in fixdesc()
208 static void cut_comma(char *map, jsmntok_t *newval) in cut_comma() argument
213 for (i = newval->start; i < newval->end; i++) { in cut_comma()
214 if (map[i] == ',') in cut_comma()
215 newval->end = i; in cut_comma()
219 static int match_field(char *map, jsmntok_t *field, int nz, in match_field() argument
225 for (f = fields; f->field; f++) in match_field()
226 if (json_streq(map, field, f->field) && nz) { in match_field()
227 cut_comma(map, &newval); in match_field()
228 addfield(map, event, ",", f->kernel, &newval); in match_field()
234 static struct msrmap *lookup_msr(char *map, jsmntok_t *val) in lookup_msr() argument
240 cut_comma(map, &newval); in lookup_msr()
242 if (json_streq(map, &newval, msrmap[i].num)) in lookup_msr()
247 json_len(val), map + val->start); in lookup_msr()
252 static struct map { struct
259 { "iMPH-U", "uncore_arb" },
260 { "CPU-M-CF", "cpum_cf" },
261 { "CPU-M-SF", "cpum_sf" },
271 static const char *field_to_perf(struct map *table, char *map, jsmntok_t *val) in field_to_perf() argument
276 if (json_streq(map, val, table[i].json)) in field_to_perf()
284 if (!(t)->start && (t) > tokens) \
285 loc = (t) - 1; \
287 json_line(map, loc), \
289 err = -EIO; \
310 if (c == '-') in get_topic()
328 return -ENOMEM; in add_topic()
349 FILE *outfp = pd->outfp; in print_events_table_entry()
350 char *topic = pd->topic; in print_events_table_entry()
358 if (je->name) in print_events_table_entry()
359 fprintf(outfp, "\t.name = \"%s\",\n", je->name); in print_events_table_entry()
360 if (je->event) in print_events_table_entry()
361 fprintf(outfp, "\t.event = \"%s\",\n", je->event); in print_events_table_entry()
362 fprintf(outfp, "\t.desc = \"%s\",\n", je->desc); in print_events_table_entry()
364 if (je->long_desc && je->long_desc[0]) in print_events_table_entry()
365 fprintf(outfp, "\t.long_desc = \"%s\",\n", je->long_desc); in print_events_table_entry()
366 if (je->pmu) in print_events_table_entry()
367 fprintf(outfp, "\t.pmu = \"%s\",\n", je->pmu); in print_events_table_entry()
368 if (je->unit) in print_events_table_entry()
369 fprintf(outfp, "\t.unit = \"%s\",\n", je->unit); in print_events_table_entry()
370 if (je->perpkg) in print_events_table_entry()
371 fprintf(outfp, "\t.perpkg = \"%s\",\n", je->perpkg); in print_events_table_entry()
372 if (je->aggr_mode) in print_events_table_entry()
373 fprintf(outfp, "\t.aggr_mode = \"%d\",\n", convert(je->aggr_mode)); in print_events_table_entry()
374 if (je->metric_expr) in print_events_table_entry()
375 fprintf(outfp, "\t.metric_expr = \"%s\",\n", je->metric_expr); in print_events_table_entry()
376 if (je->metric_name) in print_events_table_entry()
377 fprintf(outfp, "\t.metric_name = \"%s\",\n", je->metric_name); in print_events_table_entry()
378 if (je->metric_group) in print_events_table_entry()
379 fprintf(outfp, "\t.metric_group = \"%s\",\n", je->metric_group); in print_events_table_entry()
380 if (je->deprecated) in print_events_table_entry()
381 fprintf(outfp, "\t.deprecated = \"%s\",\n", je->deprecated); in print_events_table_entry()
382 if (je->metric_constraint) in print_events_table_entry()
383 fprintf(outfp, "\t.metric_constraint = \"%s\",\n", je->metric_constraint); in print_events_table_entry()
391 char *name; member
406 #define ADD_EVENT_FIELD(field) do { if (je->field) { \
407 es->field = strdup(je->field); \
408 if (!es->field) \
412 #define FREE_EVENT_FIELD(field) free(es->field)
414 #define TRY_FIXUP_FIELD(field) do { if (es->field && !je->field) {\
415 je->field = strdup(es->field); \
416 if (!je->field) \
417 return -ENOMEM; \
421 op(name); \
443 list_del_init(&es->list); in free_arch_std_events()
454 return -ENOMEM; in save_arch_std_events()
457 list_add_tail(&es->list, &arch_std_events); in save_arch_std_events()
462 return -ENOMEM; in save_arch_std_events()
469 fprintf(outfp, "\t.name = 0,\n"); in print_events_table_suffix()
479 const char *name; member
494 static char *real_event(const char *name, char *event) in real_event() argument
498 if (!name) in real_event()
501 for (i = 0; fixed[i].name; i++) in real_event()
502 if (!strcasecmp(name, fixed[i].name)) in real_event()
514 if (!strcmp(arch_std, es->name)) { in try_fixup()
516 *event = je->event; in try_fixup()
523 return -1; in try_fixup()
535 char *map; in json_events() local
539 return -ENOENT; in json_events()
541 tokens = parse_json(fn, &map, &size, &len); in json_events()
543 return -EIO; in json_events()
544 EXPECT(tokens->type == JSMN_ARRAY, tokens, "expected top level array"); in json_events()
546 for (i = 0; i < tokens->size; i++) { in json_events()
558 EXPECT(obj->type == JSMN_OBJECT, obj, "expected object"); in json_events()
559 for (j = 0; j < obj->size; j += 2) { in json_events()
565 EXPECT(field->type == JSMN_STRING, tok + j, in json_events()
566 "Expected field name"); in json_events()
568 EXPECT(val->type == JSMN_STRING, tok + j + 1, in json_events()
571 nz = !json_streq(map, val, "0"); in json_events()
572 if (match_field(map, field, nz, &event, val)) { in json_events()
574 } else if (json_streq(map, field, "EventCode")) { in json_events()
576 addfield(map, &code, "", "", val); in json_events()
579 } else if (json_streq(map, field, "ExtSel")) { in json_events()
581 addfield(map, &code, "", "", val); in json_events()
584 } else if (json_streq(map, field, "EventName")) { in json_events()
585 addfield(map, &je.name, "", "", val); in json_events()
586 } else if (json_streq(map, field, "BriefDescription")) { in json_events()
587 addfield(map, &je.desc, "", "", val); in json_events()
589 } else if (json_streq(map, field, in json_events()
591 addfield(map, &je.long_desc, "", "", val); in json_events()
593 } else if (json_streq(map, field, "PEBS") && nz) { in json_events()
595 } else if (json_streq(map, field, "MSRIndex") && nz) { in json_events()
596 msr = lookup_msr(map, val); in json_events()
597 } else if (json_streq(map, field, "MSRValue")) { in json_events()
599 } else if (json_streq(map, field, "Errata") && in json_events()
600 !json_streq(map, val, "null")) { in json_events()
601 addfield(map, &extra_desc, ". ", in json_events()
603 } else if (json_streq(map, field, "Data_LA") && nz) { in json_events()
604 addfield(map, &extra_desc, ". ", in json_events()
607 } else if (json_streq(map, field, "Unit")) { in json_events()
610 ppmu = field_to_perf(unit_to_pmu, map, val); in json_events()
616 addfield(map, &je.pmu, "", "", val); in json_events()
620 addfield(map, &je.desc, ". ", "Unit: ", NULL); in json_events()
621 addfield(map, &je.desc, "", je.pmu, NULL); in json_events()
622 addfield(map, &je.desc, "", " ", NULL); in json_events()
623 } else if (json_streq(map, field, "Filter")) { in json_events()
624 addfield(map, &filter, "", "", val); in json_events()
625 } else if (json_streq(map, field, "ScaleUnit")) { in json_events()
626 addfield(map, &je.unit, "", "", val); in json_events()
627 } else if (json_streq(map, field, "PerPkg")) { in json_events()
628 addfield(map, &je.perpkg, "", "", val); in json_events()
629 } else if (json_streq(map, field, "AggregationMode")) { in json_events()
630 addfield(map, &je.aggr_mode, "", "", val); in json_events()
631 } else if (json_streq(map, field, "Deprecated")) { in json_events()
632 addfield(map, &je.deprecated, "", "", val); in json_events()
633 } else if (json_streq(map, field, "MetricName")) { in json_events()
634 addfield(map, &je.metric_name, "", "", val); in json_events()
635 } else if (json_streq(map, field, "MetricGroup")) { in json_events()
636 addfield(map, &je.metric_group, "", "", val); in json_events()
637 } else if (json_streq(map, field, "MetricConstraint")) { in json_events()
638 addfield(map, &je.metric_constraint, "", "", val); in json_events()
639 } else if (json_streq(map, field, "MetricExpr")) { in json_events()
640 addfield(map, &je.metric_expr, "", "", val); in json_events()
643 } else if (json_streq(map, field, "ArchStdEvent")) { in json_events()
644 addfield(map, &arch_std, "", "", val); in json_events()
651 if (json_streq(map, precise, "2")) in json_events()
652 addfield(map, &extra_desc, " ", in json_events()
655 addfield(map, &extra_desc, " ", in json_events()
659 addfield(map, &event, ",", buf, NULL); in json_events()
661 addfield(map, &je.desc, " ", extra_desc, NULL); in json_events()
663 addfield(map, &je.long_desc, " ", extra_desc, NULL); in json_events()
665 addfield(map, &event, ",", filter, NULL); in json_events()
667 addfield(map, &event, ",", msr->pname, msrval); in json_events()
668 if (je.name) in json_events()
669 fixname(je.name); in json_events()
680 je.event = real_event(je.name, event); in json_events()
685 free(je.name); in json_events()
704 EXPECT(tok - tokens == len, tok, "unexpected objects at end"); in json_events()
707 free_json(map, size, tokens); in json_events()
720 * Derive rest of table name from basename of the JSON file, in file_name_to_table_name()
733 if (c == '-' || c == '/') in file_name_to_table_name()
739 pr_err("%s: Invalid character '%c' in file name %s\n", in file_name_to_table_name()
798 return -1; in process_mapfile()
805 return -1; in process_mapfile()
827 if (line[strlen(line)-1] != '\n') { in process_mapfile()
831 ret = -1; in process_mapfile()
834 line[strlen(line)-1] = '\0'; in process_mapfile()
849 * table name. For us to do that, we need to somehow tweak in process_mapfile()
852 * of knowing these are "core" events unless file name has in process_mapfile()
869 * If we fail to locate/process JSON and map files, create a NULL mapping
886 fprintf(outfp, "#include \"pmu-events/pmu-events.h\"\n"); in create_empty_mapping()
920 if (!strcmp(dir->d_name, ".") || !strcmp(dir->d_name, "..")) in is_leaf_dir()
923 if (dir->d_type == DT_DIR) { in is_leaf_dir()
926 } else if (dir->d_type == DT_UNKNOWN) { in is_leaf_dir()
930 sprintf(path, "%s/%s", fpath, dir->d_name); in is_leaf_dir()
946 static int is_json_file(const char *name) in is_json_file() argument
950 if (strlen(name) < 5) in is_json_file()
953 suffix = name + strlen(name) - 5; in is_json_file()
963 int level = ftwbuf->level; in preprocess_arch_std_files()
978 int level = ftwbuf->level; in process_one_file()
983 * For level 2 directory, bname will include parent name, in process_one_file()
987 bname = (char *) fpath + ftwbuf->base - 2; in process_one_file()
991 bname--; in process_one_file()
995 bname = (char *) fpath + ftwbuf->base; in process_one_file()
997 pr_debug("%s %d %7jd %-20s %s\n", in process_one_file()
999 level, sb->st_size, bname, fpath); in process_one_file()
1013 * Drop file name suffix. Replace hyphens with underscores. in process_one_file()
1014 * Fail if file name contains any alphanum characters besides in process_one_file()
1019 pr_info("%s: Error determining table name for %s\n", prog, in process_one_file()
1021 return -1; in process_one_file()
1029 * Save the mapfile name for now. We will process mapfile in process_one_file()
1045 * If the file name does not have a .json extension, in process_one_file()
1057 return -ENOMEM; in process_one_file()
1068 * i.e. if JSON file name cannot be mapped to C-style table name, in process_one_file()
1093 * From each JSON file, create a C-style "PMU events table" from the
1099 * Write out the PMU events tables and the mapping table to pmu-event.c.
1103 int rc, ret = 0; in main() local
1139 /* Include pmu-events.h first */ in main()
1140 fprintf(eventsfp, "#include \"pmu-events/pmu-events.h\"\n"); in main()
1144 * so, not sure if there is a need for symlinks within the pmu-events in main()
1154 rc = nftw(ldirname, preprocess_arch_std_files, maxfds, 0); in main()
1155 if (rc && verbose) { in main()
1159 } else if (rc < 0) { in main()
1164 } else if (rc) { in main()
1168 rc = nftw(ldirname, process_one_file, maxfds, 0); in main()
1169 if (rc && verbose) { in main()
1172 } else if (rc < 0) { in main()
1178 } else if (rc) { in main()
1184 rc = nftw(ldirname, process_one_file, maxfds, 0); in main()
1185 if (rc && verbose) { in main()
1186 pr_info("%s: Error walking file tree %s rc=%d for test\n", in main()
1187 prog, ldirname, rc); in main()
1189 } else if (rc < 0) { in main()
1194 } else if (rc) { in main()
1202 pr_info("%s: No CPU->JSON mapping?\n", prog); in main()