@@ -9,6 +9,7 @@
#include <ccan/list/list.h>
#include <uuid/uuid.h>
#include <traceevent/event-parse.h>
+#include <tracefs/tracefs.h>
#include "event_trace.h"
#define _GNU_SOURCE
@@ -191,3 +192,39 @@ err_jnode:
free(jnode);
return rc;
}
+
+static int cxl_event_parse(struct tep_event *event, struct tep_record *record,
+ int cpu, void *ctx)
+{
+ struct event_ctx *event_ctx = (struct event_ctx *)ctx;
+
+ /* Filter out all the events that the caller isn't interested in. */
+ if (strcmp(event->system, event_ctx->system) != 0)
+ return 0;
+
+ if (event_ctx->event_name) {
+ if (strcmp(event->name, event_ctx->event_name) != 0)
+ return 0;
+ }
+
+ if (event_ctx->parse_event)
+ return event_ctx->parse_event(event, record,
+ &event_ctx->jlist_head);
+
+ return cxl_event_to_json(event, record, &event_ctx->jlist_head);
+}
+
+int cxl_parse_events(struct tracefs_instance *inst, struct event_ctx *ectx)
+{
+ struct tep_handle *tep;
+ int rc;
+
+ tep = tracefs_local_events(NULL);
+ if (!tep)
+ return -ENOMEM;
+
+ rc = tracefs_iterate_raw_events(tep, inst, NULL, 0, cxl_event_parse,
+ ectx);
+ tep_free(tep);
+ return rc;
+}
@@ -11,4 +11,14 @@ struct jlist_node {
struct list_node list;
};
+struct event_ctx {
+ const char *system;
+ struct list_head jlist_head;
+ const char *event_name; /* optional */
+ int (*parse_event)(struct tep_event *event, struct tep_record *record,
+ struct list_head *jlist_head); /* optional */
+};
+
+int cxl_parse_events(struct tracefs_instance *inst, struct event_ctx *ectx);
+
#endif
@@ -21,6 +21,7 @@ cxl_tool = executable('cxl',
json,
versiondep,
traceevent,
+ tracefs,
],
install : true,
install_dir : rootbindir,
@@ -143,6 +143,8 @@ libudev = dependency('libudev')
uuid = dependency('uuid')
json = dependency('json-c')
traceevent = dependency('libtraceevent')
+tracefs = dependency('libtracefs')
+
if get_option('docs').enabled()
if get_option('asciidoctor').enabled()
asciidoc = find_program('asciidoctor', required : true)