|
@@ -20,6 +20,7 @@
|
|
|
#include "pmu.h"
|
|
|
#include "thread_map.h"
|
|
|
#include "cpumap.h"
|
|
|
+#include "probe-file.h"
|
|
|
#include "asm/bug.h"
|
|
|
|
|
|
#define MAX_NAME_LEN 100
|
|
@@ -1984,6 +1985,85 @@ static bool is_event_supported(u8 type, unsigned config)
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+void print_sdt_events(const char *subsys_glob, const char *event_glob,
|
|
|
+ bool name_only)
|
|
|
+{
|
|
|
+ struct probe_cache *pcache;
|
|
|
+ struct probe_cache_entry *ent;
|
|
|
+ struct strlist *bidlist, *sdtlist;
|
|
|
+ struct strlist_config cfg = {.dont_dupstr = true};
|
|
|
+ struct str_node *nd, *nd2;
|
|
|
+ char *buf, *path, *ptr = NULL;
|
|
|
+ bool show_detail = false;
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ sdtlist = strlist__new(NULL, &cfg);
|
|
|
+ if (!sdtlist) {
|
|
|
+ pr_debug("Failed to allocate new strlist for SDT\n");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ bidlist = build_id_cache__list_all(true);
|
|
|
+ if (!bidlist) {
|
|
|
+ pr_debug("Failed to get buildids: %d\n", errno);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ strlist__for_each_entry(nd, bidlist) {
|
|
|
+ pcache = probe_cache__new(nd->s);
|
|
|
+ if (!pcache)
|
|
|
+ continue;
|
|
|
+ list_for_each_entry(ent, &pcache->entries, node) {
|
|
|
+ if (!ent->sdt)
|
|
|
+ continue;
|
|
|
+ if (subsys_glob &&
|
|
|
+ !strglobmatch(ent->pev.group, subsys_glob))
|
|
|
+ continue;
|
|
|
+ if (event_glob &&
|
|
|
+ !strglobmatch(ent->pev.event, event_glob))
|
|
|
+ continue;
|
|
|
+ ret = asprintf(&buf, "%s:%s@%s", ent->pev.group,
|
|
|
+ ent->pev.event, nd->s);
|
|
|
+ if (ret > 0)
|
|
|
+ strlist__add(sdtlist, buf);
|
|
|
+ }
|
|
|
+ probe_cache__delete(pcache);
|
|
|
+ }
|
|
|
+ strlist__delete(bidlist);
|
|
|
+
|
|
|
+ strlist__for_each_entry(nd, sdtlist) {
|
|
|
+ buf = strchr(nd->s, '@');
|
|
|
+ if (buf)
|
|
|
+ *(buf++) = '\0';
|
|
|
+ if (name_only) {
|
|
|
+ printf("%s ", nd->s);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ nd2 = strlist__next(nd);
|
|
|
+ if (nd2) {
|
|
|
+ ptr = strchr(nd2->s, '@');
|
|
|
+ if (ptr)
|
|
|
+ *ptr = '\0';
|
|
|
+ if (strcmp(nd->s, nd2->s) == 0)
|
|
|
+ show_detail = true;
|
|
|
+ }
|
|
|
+ if (show_detail) {
|
|
|
+ path = build_id_cache__origname(buf);
|
|
|
+ ret = asprintf(&buf, "%s@%s(%.12s)", nd->s, path, buf);
|
|
|
+ if (ret > 0) {
|
|
|
+ printf(" %-50s [%s]\n", buf, "SDT event");
|
|
|
+ free(buf);
|
|
|
+ }
|
|
|
+ } else
|
|
|
+ printf(" %-50s [%s]\n", nd->s, "SDT event");
|
|
|
+ if (nd2) {
|
|
|
+ if (strcmp(nd->s, nd2->s) != 0)
|
|
|
+ show_detail = false;
|
|
|
+ if (ptr)
|
|
|
+ *ptr = '@';
|
|
|
+ }
|
|
|
+ }
|
|
|
+ strlist__delete(sdtlist);
|
|
|
+}
|
|
|
+
|
|
|
int print_hwcache_events(const char *event_glob, bool name_only)
|
|
|
{
|
|
|
unsigned int type, op, i, evt_i = 0, evt_num = 0;
|
|
@@ -2166,6 +2246,8 @@ void print_events(const char *event_glob, bool name_only)
|
|
|
}
|
|
|
|
|
|
print_tracepoint_events(NULL, NULL, name_only);
|
|
|
+
|
|
|
+ print_sdt_events(NULL, NULL, name_only);
|
|
|
}
|
|
|
|
|
|
int parse_events__is_hardcoded_term(struct parse_events_term *term)
|