|
@@ -877,3 +877,60 @@ int probe_cache__show_all_caches(struct strfilter *filter)
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
+
|
|
|
+static struct {
|
|
|
+ const char *pattern;
|
|
|
+ bool avail;
|
|
|
+ bool checked;
|
|
|
+} probe_type_table[] = {
|
|
|
+#define DEFINE_TYPE(idx, pat, def_avail) \
|
|
|
+ [idx] = {.pattern = pat, .avail = (def_avail)}
|
|
|
+ DEFINE_TYPE(PROBE_TYPE_U, "* u8/16/32/64,*", true),
|
|
|
+ DEFINE_TYPE(PROBE_TYPE_S, "* s8/16/32/64,*", true),
|
|
|
+ DEFINE_TYPE(PROBE_TYPE_X, "* x8/16/32/64,*", false),
|
|
|
+ DEFINE_TYPE(PROBE_TYPE_STRING, "* string,*", true),
|
|
|
+ DEFINE_TYPE(PROBE_TYPE_BITFIELD,
|
|
|
+ "* b<bit-width>@<bit-offset>/<container-size>", true),
|
|
|
+};
|
|
|
+
|
|
|
+bool probe_type_is_available(enum probe_type type)
|
|
|
+{
|
|
|
+ FILE *fp;
|
|
|
+ char *buf = NULL;
|
|
|
+ size_t len = 0;
|
|
|
+ bool target_line = false;
|
|
|
+ bool ret = probe_type_table[type].avail;
|
|
|
+
|
|
|
+ if (type >= PROBE_TYPE_END)
|
|
|
+ return false;
|
|
|
+ /* We don't have to check the type which supported by default */
|
|
|
+ if (ret || probe_type_table[type].checked)
|
|
|
+ return ret;
|
|
|
+
|
|
|
+ if (asprintf(&buf, "%s/README", tracing_path) < 0)
|
|
|
+ return ret;
|
|
|
+
|
|
|
+ fp = fopen(buf, "r");
|
|
|
+ if (!fp)
|
|
|
+ goto end;
|
|
|
+
|
|
|
+ zfree(&buf);
|
|
|
+ while (getline(&buf, &len, fp) > 0 && !ret) {
|
|
|
+ if (!target_line) {
|
|
|
+ target_line = !!strstr(buf, " type: ");
|
|
|
+ if (!target_line)
|
|
|
+ continue;
|
|
|
+ } else if (strstr(buf, "\t ") != buf)
|
|
|
+ break;
|
|
|
+ ret = strglobmatch(buf, probe_type_table[type].pattern);
|
|
|
+ }
|
|
|
+ /* Cache the result */
|
|
|
+ probe_type_table[type].checked = true;
|
|
|
+ probe_type_table[type].avail = ret;
|
|
|
+
|
|
|
+ fclose(fp);
|
|
|
+end:
|
|
|
+ free(buf);
|
|
|
+
|
|
|
+ return ret;
|
|
|
+}
|