Lines Matching +full:event +full:- +full:name
1 /* Parse event JSON files */
20 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
50 #include "pmu-events.h"
64 char *name; member
66 char *event; member
88 return -1; in convert()
103 free(et->soc_id); in free_sys_event_tables()
147 strncat(*dst, map + bt->start, blen); in addfield()
161 --e; in fixdesc()
163 --e; in fixdesc()
221 for (i = newval->start; i < newval->end; i++) { in cut_comma()
223 newval->end = i; in cut_comma()
239 pr_err("%s: Unknown MSR in event file %.*s\n", prog, in lookup_msr()
240 json_len(val), map + val->start); in lookup_msr()
252 { "iMPH-U", "uncore_arb" },
253 { "CPU-M-CF", "cpum_cf" },
254 { "CPU-M-SF", "cpum_sf" },
282 if (!(t)->start && (t) > tokens) \
283 loc = (t) - 1; \
287 err = -EIO; \
308 if (c == '-') in get_topic()
326 return -ENOMEM; in add_topic()
347 FILE *outfp = pd->outfp; in print_events_table_entry()
348 char *topic_local = pd->topic; in print_events_table_entry()
356 if (je->name) in print_events_table_entry()
357 fprintf(outfp, "\t.name = \"%s\",\n", je->name); in print_events_table_entry()
358 if (je->event) in print_events_table_entry()
359 fprintf(outfp, "\t.event = \"%s\",\n", je->event); in print_events_table_entry()
360 fprintf(outfp, "\t.desc = \"%s\",\n", je->desc); in print_events_table_entry()
361 if (je->compat) in print_events_table_entry()
362 fprintf(outfp, "\t.compat = \"%s\",\n", je->compat); 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
392 char *event; member
407 #define ADD_EVENT_FIELD(field) do { if (je->field) { \
408 es->field = strdup(je->field); \
409 if (!es->field) \
413 #define FREE_EVENT_FIELD(field) free(es->field)
415 #define TRY_FIXUP_FIELD(field) do { if (es->field && !je->field) {\
416 je->field = strdup(es->field); \
417 if (!je->field) \
418 return -ENOMEM; \
422 op(name); \
423 op(event); \
444 list_del_init(&es->list); in free_arch_std_events()
455 return -ENOMEM; in save_arch_std_events()
458 list_add_tail(&es->list, &arch_std_events); in save_arch_std_events()
463 return -ENOMEM; in save_arch_std_events()
470 fprintf(outfp, "\t.name = 0,\n"); in print_events_table_suffix()
471 fprintf(outfp, "\t.event = 0,\n"); in print_events_table_suffix()
480 const char *name; member
481 const char *event; member
484 { "inst_retired.any", "event=0xc0,period=2000003" },
485 { "inst_retired.any_p", "event=0xc0,period=2000003" },
486 { "cpu_clk_unhalted.ref", "event=0x0,umask=0x03,period=2000003" },
487 { "cpu_clk_unhalted.thread", "event=0x3c,period=2000003" },
488 { "cpu_clk_unhalted.core", "event=0x3c,period=2000003" },
489 { "cpu_clk_unhalted.thread_any", "event=0x3c,any=1,period=2000003" },
497 static char *real_event(const char *name, char *event) in real_event() argument
501 if (!name) in real_event()
504 for (i = 0; fixed[i].name; i++) in real_event()
505 if (!strcasecmp(name, fixed[i].name)) in real_event()
506 return (char *)fixed[i].event; in real_event()
507 return event; in real_event()
511 try_fixup(const char *fn, char *arch_std, struct json_event *je, char **event) in try_fixup() argument
513 /* try to find matching event from arch standard values */ in try_fixup()
517 if (!strcmp(arch_std, es->name)) { in try_fixup()
519 *event = je->event; in try_fixup()
526 return -1; in try_fixup()
529 /* Call func with each event in the json file */
542 return -ENOENT; in json_events()
546 return -EIO; in json_events()
547 EXPECT(tokens->type == JSMN_ARRAY, tokens, "expected top level array"); in json_events()
549 for (i = 0; i < tokens->size; i++) { in json_events()
550 char *event = NULL; in json_events() local
571 EXPECT(obj->type == JSMN_OBJECT, obj, "expected object"); in json_events()
572 for (j = 0; j < obj->size; j += 2) { in json_events()
578 EXPECT(field->type == JSMN_STRING, tok + j, in json_events()
579 "Expected field name"); in json_events()
581 EXPECT(val->type == JSMN_STRING, tok + j + 1, in json_events()
619 addfield(map, &je.name, "", "", val); in json_events()
681 if (precise && je.desc && !strstr(je.desc, "(Precise Event)")) { in json_events()
687 "(Precise event)", NULL); in json_events()
692 snprintf(buf, sizeof buf, "event=%#llx", eventcode); in json_events()
693 addfield(map, &event, ",", buf, NULL); in json_events()
695 addfield(map, &event, ",", any, NULL); in json_events()
697 addfield(map, &event, ",", ch_mask, NULL); in json_events()
699 addfield(map, &event, ",", cmask, NULL); in json_events()
701 addfield(map, &event, ",", edge, NULL); in json_events()
703 addfield(map, &event, ",", fc_mask, NULL); in json_events()
705 addfield(map, &event, ",", inv, NULL); in json_events()
707 addfield(map, &event, ",", period, NULL); in json_events()
709 addfield(map, &event, ",", umask, NULL); in json_events()
721 addfield(map, &event, ",", filter, NULL); in json_events()
723 addfield(map, &event, ",", msr->pname, msrval); in json_events()
724 if (je.name) in json_events()
725 fixname(je.name); in json_events()
729 * An arch standard event is referenced, so try to in json_events()
732 err = try_fixup(fn, arch_std, &je, &event); in json_events()
736 je.event = real_event(je.name, event); in json_events()
747 free(event); in json_events()
749 free(je.name); in json_events()
769 EXPECT(tok - tokens == len, tok, "unexpected objects at end"); in json_events()
785 * Derive rest of table name from basename of the JSON file, in file_name_to_table_name()
798 if (c == '-' || c == '/') in file_name_to_table_name()
804 pr_err("%s: Invalid character '%c' in file name '%s'\n", in file_name_to_table_name()
821 return !strcmp(fname+len-len2, "/sys"); in is_sys_dir()
876 fprintf(outfp, "\n\t{\n\t\t.table = %s,\n\t\t.name = \"%s\",\n\t},", in process_system_event_tables()
877 sys_event_table->soc_id, in process_system_event_tables()
878 sys_event_table->soc_id); in process_system_event_tables()
900 return -1; in process_mapfile()
907 return -1; in process_mapfile()
929 if (line[strlen(line)-1] != '\n') { in process_mapfile()
933 ret = -1; in process_mapfile()
936 line[strlen(line)-1] = '\0'; in process_mapfile()
951 * table name. For us to do that, we need to somehow tweak in process_mapfile()
954 * of knowing these are "core" events unless file name has in process_mapfile()
988 fprintf(outfp, "#include \"pmu-events/pmu-events.h\"\n"); in create_empty_mapping()
1027 if (!strcmp(dir->d_name, ".") || !strcmp(dir->d_name, "..")) in is_leaf_dir()
1030 if (dir->d_type == DT_DIR) { in is_leaf_dir()
1033 } else if (dir->d_type == DT_UNKNOWN) { in is_leaf_dir()
1037 snprintf(path, sizeof(path), "%s/%s", fpath, dir->d_name); in is_leaf_dir()
1053 static int is_json_file(const char *name) in is_json_file() argument
1057 if (strlen(name) < 5) in is_json_file()
1060 suffix = name + strlen(name) - 5; in is_json_file()
1070 int level = ftwbuf->level; in preprocess_arch_std_files()
1085 int level = ftwbuf->level; in process_one_file()
1091 * For level 2 directory, bname will include parent name, in process_one_file()
1097 bname = (char *) fpath + ftwbuf->base - 2; in process_one_file()
1101 if (count == level - 1) in process_one_file()
1103 bname--; in process_one_file()
1107 bname = (char *) fpath + ftwbuf->base; in process_one_file()
1109 pr_debug("%s %d %7jd %-20s %s\n", in process_one_file()
1111 level, sb->st_size, bname, fpath); in process_one_file()
1125 * Drop file name suffix. Replace hyphens with underscores. in process_one_file()
1126 * Fail if file name contains any alphanum characters besides in process_one_file()
1131 pr_info("%s: Error determining table name for %s\n", prog, in process_one_file()
1133 return -1; in process_one_file()
1141 return -1; in process_one_file()
1143 sys_event_table->soc_id = strdup(tblname); in process_one_file()
1144 if (!sys_event_table->soc_id) { in process_one_file()
1146 return -1; in process_one_file()
1148 list_add_tail(&sys_event_table->list, in process_one_file()
1157 * Save the mapfile name for now. We will process mapfile in process_one_file()
1175 * If the file name does not have a .json extension, in process_one_file()
1187 return -ENOMEM; in process_one_file()
1198 * i.e. if JSON file name cannot be mapped to C-style table name, in process_one_file()
1223 * From each JSON file, create a C-style "PMU events table" from the
1227 * PMU event tables (see struct pmu_events_map).
1229 * Write out the PMU events tables and the mapping table to pmu-event.c.
1264 /* If architecture does not have any event lists, bail out */ in main()
1266 pr_info("%s: Arch %s has no PMU event lists\n", prog, arch); in main()
1271 /* Include pmu-events.h first */ in main()
1272 fprintf(eventsfp, "#include \"pmu-events/pmu-events.h\"\n"); in main()
1276 * so, not sure if there is a need for symlinks within the pmu-events in main()
1307 pr_info("%s: No CPU->JSON mapping?\n", prog); in main()
1333 err_string_ext = " for std arch event"; in main()
1364 return (strcmp((*a)->fts_name, (*b)->fts_name)); in fts_compare()
1377 /* XXX - nfds is currently unused */ in nftw_ordered()
1380 return (-1); in nftw_ordered()
1395 return (-1); in nftw_ordered()
1397 switch (cur->fts_info) { in nftw_ordered()
1428 error = -1; in nftw_ordered()
1431 ftw.base = cur->fts_pathlen - cur->fts_namelen; in nftw_ordered()
1432 ftw.level = cur->fts_level; in nftw_ordered()
1433 error = fn(cur->fts_path, cur->fts_statp, fnflag, &ftw); in nftw_ordered()
1440 error = -1; in nftw_ordered()