2022-11-30 06:35:58

by Ian Rogers

[permalink] [raw]
Subject: [PATCH v2 0/4] perf use system libtraceevent

Detect whether libtraceevent is installed and if so build against
it. If not installed, warn and build a subset of perf that works
without libtraceevent. With nothing using the now out-of-date
tools/lib/traceevent remove it.

Discussed on LKML here:
https://lore.kernel.org/lkml/CAP-5=fWxAjEia-Qbm0RVzKOxyiod8rUOBieqaGK=DtQboDe3Qw@mail.gmail.com/

Builds upon:
https://lore.kernel.org/lkml/[email protected]/

Based on discussion of the v1 patch set:
https://lore.kernel.org/lkml/[email protected]/
v2 conditionally compiles a subset of perf that doesn't require
libtraceevent to avoid having to have libtraceevent installed on a
system.

The changes build upon the fix in:
https://lore.kernel.org/lkml/[email protected]/

Ian Rogers (4):
perf util: Make header guard consistent with tool
perf util: Add host_is_bigendian to util.h
perf build: Use libtraceevent from the system
tools lib traceevent: Remove libtraceevent

tools/lib/traceevent/.gitignore | 4 -
tools/lib/traceevent/Build | 8 -
tools/lib/traceevent/Documentation/Makefile | 207 -
.../traceevent/Documentation/asciidoc.conf | 120 -
.../Documentation/libtraceevent-commands.txt | 153 -
.../Documentation/libtraceevent-cpus.txt | 77 -
.../libtraceevent-endian_read.txt | 78 -
.../libtraceevent-event_find.txt | 103 -
.../Documentation/libtraceevent-event_get.txt | 99 -
.../libtraceevent-event_list.txt | 122 -
.../libtraceevent-event_print.txt | 130 -
.../libtraceevent-field_find.txt | 118 -
.../libtraceevent-field_get_val.txt | 122 -
.../libtraceevent-field_print.txt | 126 -
.../libtraceevent-field_read.txt | 81 -
.../Documentation/libtraceevent-fields.txt | 105 -
.../libtraceevent-file_endian.txt | 91 -
.../Documentation/libtraceevent-filter.txt | 209 -
.../Documentation/libtraceevent-func_apis.txt | 183 -
.../Documentation/libtraceevent-func_find.txt | 88 -
.../Documentation/libtraceevent-handle.txt | 101 -
.../libtraceevent-header_page.txt | 102 -
.../libtraceevent-host_endian.txt | 104 -
.../Documentation/libtraceevent-long_size.txt | 78 -
.../Documentation/libtraceevent-page_size.txt | 82 -
.../libtraceevent-parse_event.txt | 90 -
.../libtraceevent-parse_head.txt | 82 -
.../Documentation/libtraceevent-plugins.txt | 122 -
.../libtraceevent-record_parse.txt | 137 -
.../libtraceevent-reg_event_handler.txt | 156 -
.../libtraceevent-reg_print_func.txt | 155 -
.../Documentation/libtraceevent-set_flag.txt | 104 -
.../Documentation/libtraceevent-strerror.txt | 85 -
.../Documentation/libtraceevent-tseq.txt | 158 -
.../Documentation/libtraceevent.txt | 192 -
.../traceevent/Documentation/manpage-1.72.xsl | 14 -
.../traceevent/Documentation/manpage-base.xsl | 35 -
.../Documentation/manpage-bold-literal.xsl | 17 -
.../Documentation/manpage-normal.xsl | 13 -
.../Documentation/manpage-suppress-sp.xsl | 21 -
tools/lib/traceevent/Makefile | 300 -
tools/lib/traceevent/event-parse-api.c | 333 -
tools/lib/traceevent/event-parse-local.h | 123 -
tools/lib/traceevent/event-parse.c | 7624 -----------------
tools/lib/traceevent/event-parse.h | 750 --
tools/lib/traceevent/event-plugin.c | 711 --
tools/lib/traceevent/event-utils.h | 67 -
tools/lib/traceevent/kbuffer-parse.c | 809 --
tools/lib/traceevent/kbuffer.h | 68 -
.../lib/traceevent/libtraceevent.pc.template | 10 -
tools/lib/traceevent/parse-filter.c | 2281 -----
tools/lib/traceevent/parse-utils.c | 71 -
tools/lib/traceevent/plugins/Build | 12 -
tools/lib/traceevent/plugins/Makefile | 225 -
.../lib/traceevent/plugins/plugin_cfg80211.c | 43 -
.../lib/traceevent/plugins/plugin_function.c | 282 -
tools/lib/traceevent/plugins/plugin_futex.c | 123 -
tools/lib/traceevent/plugins/plugin_hrtimer.c | 74 -
tools/lib/traceevent/plugins/plugin_jbd2.c | 61 -
tools/lib/traceevent/plugins/plugin_kmem.c | 80 -
tools/lib/traceevent/plugins/plugin_kvm.c | 527 --
.../lib/traceevent/plugins/plugin_mac80211.c | 88 -
.../traceevent/plugins/plugin_sched_switch.c | 146 -
tools/lib/traceevent/plugins/plugin_scsi.c | 434 -
tools/lib/traceevent/plugins/plugin_tlb.c | 66 -
tools/lib/traceevent/plugins/plugin_xen.c | 138 -
tools/lib/traceevent/tep_strerror.c | 53 -
tools/lib/traceevent/trace-seq.c | 249 -
tools/lib/traceevent/trace-seq.h | 55 -
tools/perf/Build | 11 +-
tools/perf/Makefile.config | 37 +-
tools/perf/Makefile.perf | 99 +-
tools/perf/arch/x86/util/Build | 2 +-
tools/perf/arch/x86/util/intel-pt.c | 4 +
tools/perf/builtin-annotate.c | 2 +
tools/perf/builtin-inject.c | 8 +
tools/perf/builtin-kmem.c | 1 +
tools/perf/builtin-kvm.c | 12 +-
tools/perf/builtin-kwork.c | 1 +
tools/perf/builtin-record.c | 2 +
tools/perf/builtin-report.c | 9 +-
tools/perf/builtin-script.c | 19 +-
tools/perf/builtin-timechart.c | 1 +
tools/perf/builtin-trace.c | 5 +-
tools/perf/builtin-version.c | 1 +
tools/perf/perf.c | 24 +-
.../perf/scripts/python/Perf-Trace-Util/Build | 2 +-
tools/perf/tests/Build | 12 +-
tools/perf/tests/builtin-test.c | 6 +
tools/perf/tests/code-reading.c | 4 +-
tools/perf/tests/parse-events.c | 20 +
tools/perf/tests/sample-parsing.c | 4 +-
tools/perf/util/Build | 10 +-
tools/perf/util/data-convert-bt.c | 5 +-
tools/perf/util/data-convert-json.c | 9 +-
tools/perf/util/evlist.c | 6 +-
tools/perf/util/evlist.h | 4 +
tools/perf/util/evsel.c | 16 +-
tools/perf/util/evsel.h | 12 +-
tools/perf/util/evsel_fprintf.c | 7 +-
tools/perf/util/header.c | 19 +
tools/perf/util/header.h | 2 +
tools/perf/util/intel-pt.c | 7 +-
tools/perf/util/parse-events.c | 15 +
tools/perf/util/parse-events.h | 1 -
tools/perf/util/python.c | 4 +
tools/perf/util/scripting-engines/Build | 6 +-
.../scripting-engines/trace-event-python.c | 1 +
tools/perf/util/session.c | 2 +
tools/perf/util/session.h | 2 +
tools/perf/util/sort.c | 60 +-
tools/perf/util/synthetic-events.c | 6 +
tools/perf/util/trace-event-info.c | 14 +-
tools/perf/util/trace-event-parse.c | 2 +
tools/perf/util/trace-event-read.c | 4 +-
tools/perf/util/trace-event-scripting.c | 1 +
tools/perf/util/trace-event.c | 1 -
tools/perf/util/trace-event.h | 13 +-
tools/perf/util/util.h | 25 +-
119 files changed, 344 insertions(+), 20071 deletions(-)
delete mode 100644 tools/lib/traceevent/.gitignore
delete mode 100644 tools/lib/traceevent/Build
delete mode 100644 tools/lib/traceevent/Documentation/Makefile
delete mode 100644 tools/lib/traceevent/Documentation/asciidoc.conf
delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-commands.txt
delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-cpus.txt
delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-endian_read.txt
delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-event_find.txt
delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-event_get.txt
delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-event_list.txt
delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-event_print.txt
delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-field_find.txt
delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-field_get_val.txt
delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-field_print.txt
delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-field_read.txt
delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-fields.txt
delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-file_endian.txt
delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-filter.txt
delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-func_apis.txt
delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-func_find.txt
delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-handle.txt
delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-header_page.txt
delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-host_endian.txt
delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-long_size.txt
delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-page_size.txt
delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-parse_event.txt
delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-parse_head.txt
delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-plugins.txt
delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-record_parse.txt
delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-reg_event_handler.txt
delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-reg_print_func.txt
delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-set_flag.txt
delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-strerror.txt
delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-tseq.txt
delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent.txt
delete mode 100644 tools/lib/traceevent/Documentation/manpage-1.72.xsl
delete mode 100644 tools/lib/traceevent/Documentation/manpage-base.xsl
delete mode 100644 tools/lib/traceevent/Documentation/manpage-bold-literal.xsl
delete mode 100644 tools/lib/traceevent/Documentation/manpage-normal.xsl
delete mode 100644 tools/lib/traceevent/Documentation/manpage-suppress-sp.xsl
delete mode 100644 tools/lib/traceevent/Makefile
delete mode 100644 tools/lib/traceevent/event-parse-api.c
delete mode 100644 tools/lib/traceevent/event-parse-local.h
delete mode 100644 tools/lib/traceevent/event-parse.c
delete mode 100644 tools/lib/traceevent/event-parse.h
delete mode 100644 tools/lib/traceevent/event-plugin.c
delete mode 100644 tools/lib/traceevent/event-utils.h
delete mode 100644 tools/lib/traceevent/kbuffer-parse.c
delete mode 100644 tools/lib/traceevent/kbuffer.h
delete mode 100644 tools/lib/traceevent/libtraceevent.pc.template
delete mode 100644 tools/lib/traceevent/parse-filter.c
delete mode 100644 tools/lib/traceevent/parse-utils.c
delete mode 100644 tools/lib/traceevent/plugins/Build
delete mode 100644 tools/lib/traceevent/plugins/Makefile
delete mode 100644 tools/lib/traceevent/plugins/plugin_cfg80211.c
delete mode 100644 tools/lib/traceevent/plugins/plugin_function.c
delete mode 100644 tools/lib/traceevent/plugins/plugin_futex.c
delete mode 100644 tools/lib/traceevent/plugins/plugin_hrtimer.c
delete mode 100644 tools/lib/traceevent/plugins/plugin_jbd2.c
delete mode 100644 tools/lib/traceevent/plugins/plugin_kmem.c
delete mode 100644 tools/lib/traceevent/plugins/plugin_kvm.c
delete mode 100644 tools/lib/traceevent/plugins/plugin_mac80211.c
delete mode 100644 tools/lib/traceevent/plugins/plugin_sched_switch.c
delete mode 100644 tools/lib/traceevent/plugins/plugin_scsi.c
delete mode 100644 tools/lib/traceevent/plugins/plugin_tlb.c
delete mode 100644 tools/lib/traceevent/plugins/plugin_xen.c
delete mode 100644 tools/lib/traceevent/tep_strerror.c
delete mode 100644 tools/lib/traceevent/trace-seq.c
delete mode 100644 tools/lib/traceevent/trace-seq.h

--
2.38.1.584.g0f3c55d4c2-goog


2022-11-30 06:37:53

by Ian Rogers

[permalink] [raw]
Subject: [PATCH v2 2/4] perf util: Add host_is_bigendian to util.h

Avoid libtraceevent dependency for tep_is_bigendian or trace-event.h
dependency for bigendian. Add a new host_is_bigendian to util.h, using
the compiler defined __BYTE_ORDER__ when available.

Signed-off-by: Ian Rogers <[email protected]>
---
tools/perf/tests/code-reading.c | 4 ++--
tools/perf/tests/sample-parsing.c | 4 ++--
tools/perf/util/evsel.c | 5 +----
tools/perf/util/trace-event-info.c | 14 +++-----------
tools/perf/util/trace-event-read.c | 3 ++-
tools/perf/util/trace-event.h | 2 --
tools/perf/util/util.h | 19 +++++++++++++++++++
7 files changed, 29 insertions(+), 22 deletions(-)

diff --git a/tools/perf/tests/code-reading.c b/tools/perf/tests/code-reading.c
index 95feb6ef34a0..cb8cd09938d5 100644
--- a/tools/perf/tests/code-reading.c
+++ b/tools/perf/tests/code-reading.c
@@ -16,7 +16,6 @@
#include "dso.h"
#include "env.h"
#include "parse-events.h"
-#include "trace-event.h"
#include "evlist.h"
#include "evsel.h"
#include "thread_map.h"
@@ -28,6 +27,7 @@
#include "util/mmap.h"
#include "util/string2.h"
#include "util/synthetic-events.h"
+#include "util/util.h"
#include "thread.h"

#include "tests.h"
@@ -79,7 +79,7 @@ static size_t read_objdump_chunk(const char **line, unsigned char **buf,
* see disassemble_bytes() at binutils/objdump.c for details
* how objdump chooses display endian)
*/
- if (bytes_read > 1 && !bigendian()) {
+ if (bytes_read > 1 && !host_is_bigendian()) {
unsigned char *chunk_end = chunk_start + bytes_read - 1;
unsigned char tmp;

diff --git a/tools/perf/tests/sample-parsing.c b/tools/perf/tests/sample-parsing.c
index 20930dd48ee0..927c7f0cc4cc 100644
--- a/tools/perf/tests/sample-parsing.c
+++ b/tools/perf/tests/sample-parsing.c
@@ -13,7 +13,7 @@
#include "evsel.h"
#include "debug.h"
#include "util/synthetic-events.h"
-#include "util/trace-event.h"
+#include "util/util.h"

#include "tests.h"

@@ -117,7 +117,7 @@ static bool samples_same(const struct perf_sample *s1,
COMP(branch_stack->hw_idx);
for (i = 0; i < s1->branch_stack->nr; i++) {
if (needs_swap)
- return ((tep_is_bigendian()) ?
+ return ((host_is_bigendian()) ?
(FLAG(s2).value == BS_EXPECTED_BE) :
(FLAG(s2).value == BS_EXPECTED_LE));
else
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
index 45f4f08399ae..0f617359a82f 100644
--- a/tools/perf/util/evsel.c
+++ b/tools/perf/util/evsel.c
@@ -2320,11 +2320,8 @@ u64 evsel__bitfield_swap_branch_flags(u64 value)
* as it has variable bit-field sizes. Instead the
* macro takes the bit-field position/size,
* swaps it based on the host endianness.
- *
- * tep_is_bigendian() is used here instead of
- * bigendian() to avoid python test fails.
*/
- if (tep_is_bigendian()) {
+ if (host_is_bigendian()) {
new_val = bitfield_swap(value, 0, 1);
new_val |= bitfield_swap(value, 1, 1);
new_val |= bitfield_swap(value, 2, 1);
diff --git a/tools/perf/util/trace-event-info.c b/tools/perf/util/trace-event-info.c
index 892c323b4ac9..c24b3a15e319 100644
--- a/tools/perf/util/trace-event-info.c
+++ b/tools/perf/util/trace-event-info.c
@@ -26,6 +26,7 @@
#include <api/fs/tracing_path.h>
#include "evsel.h"
#include "debug.h"
+#include "util.h"

#define VERSION "0.6"
#define MAX_EVENT_LENGTH 512
@@ -38,15 +39,6 @@ struct tracepoint_path {
struct tracepoint_path *next;
};

-int bigendian(void)
-{
- unsigned char str[] = { 0x1, 0x2, 0x3, 0x4, 0x0, 0x0, 0x0, 0x0};
- unsigned int *ptr;
-
- ptr = (unsigned int *)(void *)str;
- return *ptr == 0x01020304;
-}
-
/* unfortunately, you can not stat debugfs or proc files for size */
static int record_file(const char *file, ssize_t hdr_sz)
{
@@ -79,7 +71,7 @@ static int record_file(const char *file, ssize_t hdr_sz)

/* ugh, handle big-endian hdr_size == 4 */
sizep = (char*)&size;
- if (bigendian())
+ if (host_is_bigendian())
sizep += sizeof(u64) - hdr_sz;

if (hdr_sz && pwrite(output_fd, sizep, hdr_sz, hdr_pos) < 0) {
@@ -564,7 +556,7 @@ static int tracing_data_header(void)
return -1;

/* save endian */
- if (bigendian())
+ if (host_is_bigendian())
buf[0] = 1;
else
buf[0] = 0;
diff --git a/tools/perf/util/trace-event-read.c b/tools/perf/util/trace-event-read.c
index 8a01af783310..43146a4ce2fb 100644
--- a/tools/perf/util/trace-event-read.c
+++ b/tools/perf/util/trace-event-read.c
@@ -17,6 +17,7 @@

#include "trace-event.h"
#include "debug.h"
+#include "util.h"

static int input_fd;

@@ -414,7 +415,7 @@ ssize_t trace_report(int fd, struct trace_event *tevent, bool __repipe)
return -1;
}
file_bigendian = buf[0];
- host_bigendian = bigendian();
+ host_bigendian = host_is_bigendian() ? 1 : 0;

if (trace_event__init(tevent)) {
pr_debug("trace_event__init failed");
diff --git a/tools/perf/util/trace-event.h b/tools/perf/util/trace-event.h
index 640981105788..8f39f5bcb2c2 100644
--- a/tools/perf/util/trace-event.h
+++ b/tools/perf/util/trace-event.h
@@ -27,8 +27,6 @@ trace_event__tp_format(const char *sys, const char *name);

struct tep_event *trace_event__tp_format_id(int id);

-int bigendian(void);
-
void event_format__fprintf(struct tep_event *event,
int cpu, void *data, int size, FILE *fp);

diff --git a/tools/perf/util/util.h b/tools/perf/util/util.h
index 63cdab0e5314..87d418cb6792 100644
--- a/tools/perf/util/util.h
+++ b/tools/perf/util/util.h
@@ -94,4 +94,23 @@ int do_realloc_array_as_needed(void **arr, size_t *arr_sz, size_t x,
0; \
})

+static inline bool host_is_bigendian(void)
+{
+#ifdef __BYTE_ORDER__
+#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
+ return false;
+#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
+ return true;
+#else
+#error "Unrecognized __BYTE_ORDER__"
+#endif
+#else
+ unsigned char str[] = { 0x1, 0x2, 0x3, 0x4, 0x0, 0x0, 0x0, 0x0};
+ unsigned int *ptr;
+
+ ptr = (unsigned int *)(void *)str;
+ return *ptr == 0x01020304;
+#endif
+}
+
#endif /* __PERF_UTIL_H */
--
2.38.1.584.g0f3c55d4c2-goog

2022-11-30 06:40:39

by Ian Rogers

[permalink] [raw]
Subject: [PATCH v2 4/4] tools lib traceevent: Remove libtraceevent

libtraceevent is now out-of-date and it is better to depend on the
system version. Remove this code that is no longer depended upon by
any builds.

Signed-off-by: Ian Rogers <[email protected]>
---
tools/lib/traceevent/.gitignore | 4 -
tools/lib/traceevent/Build | 8 -
tools/lib/traceevent/Documentation/Makefile | 207 -
.../traceevent/Documentation/asciidoc.conf | 120 -
.../Documentation/libtraceevent-commands.txt | 153 -
.../Documentation/libtraceevent-cpus.txt | 77 -
.../libtraceevent-endian_read.txt | 78 -
.../libtraceevent-event_find.txt | 103 -
.../Documentation/libtraceevent-event_get.txt | 99 -
.../libtraceevent-event_list.txt | 122 -
.../libtraceevent-event_print.txt | 130 -
.../libtraceevent-field_find.txt | 118 -
.../libtraceevent-field_get_val.txt | 122 -
.../libtraceevent-field_print.txt | 126 -
.../libtraceevent-field_read.txt | 81 -
.../Documentation/libtraceevent-fields.txt | 105 -
.../libtraceevent-file_endian.txt | 91 -
.../Documentation/libtraceevent-filter.txt | 209 -
.../Documentation/libtraceevent-func_apis.txt | 183 -
.../Documentation/libtraceevent-func_find.txt | 88 -
.../Documentation/libtraceevent-handle.txt | 101 -
.../libtraceevent-header_page.txt | 102 -
.../libtraceevent-host_endian.txt | 104 -
.../Documentation/libtraceevent-long_size.txt | 78 -
.../Documentation/libtraceevent-page_size.txt | 82 -
.../libtraceevent-parse_event.txt | 90 -
.../libtraceevent-parse_head.txt | 82 -
.../Documentation/libtraceevent-plugins.txt | 122 -
.../libtraceevent-record_parse.txt | 137 -
.../libtraceevent-reg_event_handler.txt | 156 -
.../libtraceevent-reg_print_func.txt | 155 -
.../Documentation/libtraceevent-set_flag.txt | 104 -
.../Documentation/libtraceevent-strerror.txt | 85 -
.../Documentation/libtraceevent-tseq.txt | 158 -
.../Documentation/libtraceevent.txt | 192 -
.../traceevent/Documentation/manpage-1.72.xsl | 14 -
.../traceevent/Documentation/manpage-base.xsl | 35 -
.../Documentation/manpage-bold-literal.xsl | 17 -
.../Documentation/manpage-normal.xsl | 13 -
.../Documentation/manpage-suppress-sp.xsl | 21 -
tools/lib/traceevent/Makefile | 300 -
tools/lib/traceevent/event-parse-api.c | 333 -
tools/lib/traceevent/event-parse-local.h | 123 -
tools/lib/traceevent/event-parse.c | 7624 -----------------
tools/lib/traceevent/event-parse.h | 750 --
tools/lib/traceevent/event-plugin.c | 711 --
tools/lib/traceevent/event-utils.h | 67 -
tools/lib/traceevent/kbuffer-parse.c | 809 --
tools/lib/traceevent/kbuffer.h | 68 -
.../lib/traceevent/libtraceevent.pc.template | 10 -
tools/lib/traceevent/parse-filter.c | 2281 -----
tools/lib/traceevent/parse-utils.c | 71 -
tools/lib/traceevent/plugins/Build | 12 -
tools/lib/traceevent/plugins/Makefile | 225 -
.../lib/traceevent/plugins/plugin_cfg80211.c | 43 -
.../lib/traceevent/plugins/plugin_function.c | 282 -
tools/lib/traceevent/plugins/plugin_futex.c | 123 -
tools/lib/traceevent/plugins/plugin_hrtimer.c | 74 -
tools/lib/traceevent/plugins/plugin_jbd2.c | 61 -
tools/lib/traceevent/plugins/plugin_kmem.c | 80 -
tools/lib/traceevent/plugins/plugin_kvm.c | 527 --
.../lib/traceevent/plugins/plugin_mac80211.c | 88 -
.../traceevent/plugins/plugin_sched_switch.c | 146 -
tools/lib/traceevent/plugins/plugin_scsi.c | 434 -
tools/lib/traceevent/plugins/plugin_tlb.c | 66 -
tools/lib/traceevent/plugins/plugin_xen.c | 138 -
tools/lib/traceevent/tep_strerror.c | 53 -
tools/lib/traceevent/trace-seq.c | 249 -
tools/lib/traceevent/trace-seq.h | 55 -
69 files changed, 19875 deletions(-)
delete mode 100644 tools/lib/traceevent/.gitignore
delete mode 100644 tools/lib/traceevent/Build
delete mode 100644 tools/lib/traceevent/Documentation/Makefile
delete mode 100644 tools/lib/traceevent/Documentation/asciidoc.conf
delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-commands.txt
delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-cpus.txt
delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-endian_read.txt
delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-event_find.txt
delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-event_get.txt
delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-event_list.txt
delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-event_print.txt
delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-field_find.txt
delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-field_get_val.txt
delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-field_print.txt
delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-field_read.txt
delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-fields.txt
delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-file_endian.txt
delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-filter.txt
delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-func_apis.txt
delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-func_find.txt
delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-handle.txt
delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-header_page.txt
delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-host_endian.txt
delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-long_size.txt
delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-page_size.txt
delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-parse_event.txt
delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-parse_head.txt
delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-plugins.txt
delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-record_parse.txt
delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-reg_event_handler.txt
delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-reg_print_func.txt
delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-set_flag.txt
delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-strerror.txt
delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-tseq.txt
delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent.txt
delete mode 100644 tools/lib/traceevent/Documentation/manpage-1.72.xsl
delete mode 100644 tools/lib/traceevent/Documentation/manpage-base.xsl
delete mode 100644 tools/lib/traceevent/Documentation/manpage-bold-literal.xsl
delete mode 100644 tools/lib/traceevent/Documentation/manpage-normal.xsl
delete mode 100644 tools/lib/traceevent/Documentation/manpage-suppress-sp.xsl
delete mode 100644 tools/lib/traceevent/Makefile
delete mode 100644 tools/lib/traceevent/event-parse-api.c
delete mode 100644 tools/lib/traceevent/event-parse-local.h
delete mode 100644 tools/lib/traceevent/event-parse.c
delete mode 100644 tools/lib/traceevent/event-parse.h
delete mode 100644 tools/lib/traceevent/event-plugin.c
delete mode 100644 tools/lib/traceevent/event-utils.h
delete mode 100644 tools/lib/traceevent/kbuffer-parse.c
delete mode 100644 tools/lib/traceevent/kbuffer.h
delete mode 100644 tools/lib/traceevent/libtraceevent.pc.template
delete mode 100644 tools/lib/traceevent/parse-filter.c
delete mode 100644 tools/lib/traceevent/parse-utils.c
delete mode 100644 tools/lib/traceevent/plugins/Build
delete mode 100644 tools/lib/traceevent/plugins/Makefile
delete mode 100644 tools/lib/traceevent/plugins/plugin_cfg80211.c
delete mode 100644 tools/lib/traceevent/plugins/plugin_function.c
delete mode 100644 tools/lib/traceevent/plugins/plugin_futex.c
delete mode 100644 tools/lib/traceevent/plugins/plugin_hrtimer.c
delete mode 100644 tools/lib/traceevent/plugins/plugin_jbd2.c
delete mode 100644 tools/lib/traceevent/plugins/plugin_kmem.c
delete mode 100644 tools/lib/traceevent/plugins/plugin_kvm.c
delete mode 100644 tools/lib/traceevent/plugins/plugin_mac80211.c
delete mode 100644 tools/lib/traceevent/plugins/plugin_sched_switch.c
delete mode 100644 tools/lib/traceevent/plugins/plugin_scsi.c
delete mode 100644 tools/lib/traceevent/plugins/plugin_tlb.c
delete mode 100644 tools/lib/traceevent/plugins/plugin_xen.c
delete mode 100644 tools/lib/traceevent/tep_strerror.c
delete mode 100644 tools/lib/traceevent/trace-seq.c
delete mode 100644 tools/lib/traceevent/trace-seq.h

diff --git a/tools/lib/traceevent/.gitignore b/tools/lib/traceevent/.gitignore
deleted file mode 100644
index 7123c70b9ebc..000000000000
--- a/tools/lib/traceevent/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-# SPDX-License-Identifier: GPL-2.0-only
-TRACEEVENT-CFLAGS
-libtraceevent-dynamic-list
-libtraceevent.so.*
diff --git a/tools/lib/traceevent/Build b/tools/lib/traceevent/Build
deleted file mode 100644
index f9a5d79578f5..000000000000
--- a/tools/lib/traceevent/Build
+++ /dev/null
@@ -1,8 +0,0 @@
-libtraceevent-y += event-parse.o
-libtraceevent-y += event-plugin.o
-libtraceevent-y += trace-seq.o
-libtraceevent-y += parse-filter.o
-libtraceevent-y += parse-utils.o
-libtraceevent-y += kbuffer-parse.o
-libtraceevent-y += tep_strerror.o
-libtraceevent-y += event-parse-api.o
diff --git a/tools/lib/traceevent/Documentation/Makefile b/tools/lib/traceevent/Documentation/Makefile
deleted file mode 100644
index aa72ab96c3c1..000000000000
--- a/tools/lib/traceevent/Documentation/Makefile
+++ /dev/null
@@ -1,207 +0,0 @@
-include ../../../scripts/Makefile.include
-include ../../../scripts/utilities.mak
-
-# This Makefile and manpage XSL files were taken from tools/perf/Documentation
-# and modified for libtraceevent.
-
-MAN3_TXT= \
- $(wildcard libtraceevent-*.txt) \
- libtraceevent.txt
-
-MAN_TXT = $(MAN3_TXT)
-_MAN_XML=$(patsubst %.txt,%.xml,$(MAN_TXT))
-_MAN_HTML=$(patsubst %.txt,%.html,$(MAN_TXT))
-_DOC_MAN3=$(patsubst %.txt,%.3,$(MAN3_TXT))
-
-MAN_XML=$(addprefix $(OUTPUT),$(_MAN_XML))
-MAN_HTML=$(addprefix $(OUTPUT),$(_MAN_HTML))
-DOC_MAN3=$(addprefix $(OUTPUT),$(_DOC_MAN3))
-
-# Make the path relative to DESTDIR, not prefix
-ifndef DESTDIR
-prefix?=$(HOME)
-endif
-bindir?=$(prefix)/bin
-htmldir?=$(prefix)/share/doc/libtraceevent-doc
-pdfdir?=$(prefix)/share/doc/libtraceevent-doc
-mandir?=$(prefix)/share/man
-man3dir=$(mandir)/man3
-
-ASCIIDOC=asciidoc
-ASCIIDOC_EXTRA = --unsafe -f asciidoc.conf
-ASCIIDOC_HTML = xhtml11
-MANPAGE_XSL = manpage-normal.xsl
-XMLTO_EXTRA =
-INSTALL?=install
-RM ?= rm -f
-
-ifdef USE_ASCIIDOCTOR
-ASCIIDOC = asciidoctor
-ASCIIDOC_EXTRA = -a compat-mode
-ASCIIDOC_EXTRA += -I. -rasciidoctor-extensions
-ASCIIDOC_EXTRA += -a mansource="libtraceevent" -a manmanual="libtraceevent Manual"
-ASCIIDOC_HTML = xhtml5
-endif
-
-XMLTO=xmlto
-
-_tmp_tool_path := $(call get-executable,$(ASCIIDOC))
-ifeq ($(_tmp_tool_path),)
- missing_tools = $(ASCIIDOC)
-endif
-
-ifndef USE_ASCIIDOCTOR
-_tmp_tool_path := $(call get-executable,$(XMLTO))
-ifeq ($(_tmp_tool_path),)
- missing_tools += $(XMLTO)
-endif
-endif
-
-#
-# For asciidoc ...
-# -7.1.2, no extra settings are needed.
-# 8.0-, set ASCIIDOC8.
-#
-
-#
-# For docbook-xsl ...
-# -1.68.1, set ASCIIDOC_NO_ROFF? (based on changelog from 1.73.0)
-# 1.69.0, no extra settings are needed?
-# 1.69.1-1.71.0, set DOCBOOK_SUPPRESS_SP?
-# 1.71.1, no extra settings are needed?
-# 1.72.0, set DOCBOOK_XSL_172.
-# 1.73.0-, set ASCIIDOC_NO_ROFF
-#
-
-#
-# If you had been using DOCBOOK_XSL_172 in an attempt to get rid
-# of 'the ".ft C" problem' in your generated manpages, and you
-# instead ended up with weird characters around callouts, try
-# using ASCIIDOC_NO_ROFF instead (it works fine with ASCIIDOC8).
-#
-
-ifdef ASCIIDOC8
-ASCIIDOC_EXTRA += -a asciidoc7compatible
-endif
-ifdef DOCBOOK_XSL_172
-ASCIIDOC_EXTRA += -a libtraceevent-asciidoc-no-roff
-MANPAGE_XSL = manpage-1.72.xsl
-else
- ifdef ASCIIDOC_NO_ROFF
- # docbook-xsl after 1.72 needs the regular XSL, but will not
- # pass-thru raw roff codes from asciidoc.conf, so turn them off.
- ASCIIDOC_EXTRA += -a libtraceevent-asciidoc-no-roff
- endif
-endif
-ifdef MAN_BOLD_LITERAL
-XMLTO_EXTRA += -m manpage-bold-literal.xsl
-endif
-ifdef DOCBOOK_SUPPRESS_SP
-XMLTO_EXTRA += -m manpage-suppress-sp.xsl
-endif
-
-SHELL_PATH ?= $(SHELL)
-# Shell quote;
-SHELL_PATH_SQ = $(subst ','\'',$(SHELL_PATH))
-
-DESTDIR ?=
-DESTDIR_SQ = '$(subst ','\'',$(DESTDIR))'
-
-export DESTDIR DESTDIR_SQ
-
-#
-# Please note that there is a minor bug in asciidoc.
-# The version after 6.0.3 _will_ include the patch found here:
-# http://marc.theaimsgroup.com/?l=libtraceevent&m=111558757202243&w=2
-#
-# Until that version is released you may have to apply the patch
-# yourself - yes, all 6 characters of it!
-#
-QUIET_SUBDIR0 = +$(MAKE) -C # space to separate -C and subdir
-QUIET_SUBDIR1 =
-
-ifneq ($(findstring $(MAKEFLAGS),w),w)
-PRINT_DIR = --no-print-directory
-else # "make -w"
-NO_SUBDIR = :
-endif
-
-ifneq ($(findstring $(MAKEFLAGS),s),s)
-ifneq ($(V),1)
- QUIET_ASCIIDOC = @echo ' ASCIIDOC '$@;
- QUIET_XMLTO = @echo ' XMLTO '$@;
- QUIET_SUBDIR0 = +@subdir=
- QUIET_SUBDIR1 = ;$(NO_SUBDIR) \
- echo ' SUBDIR ' $$subdir; \
- $(MAKE) $(PRINT_DIR) -C $$subdir
- export V
-endif
-endif
-
-all: html man
-
-man: man3
-man3: $(DOC_MAN3)
-
-html: $(MAN_HTML)
-
-$(MAN_HTML) $(DOC_MAN3): asciidoc.conf
-
-install: install-man
-
-check-man-tools:
-ifdef missing_tools
- $(error "You need to install $(missing_tools) for man pages")
-endif
-
-do-install-man: man
- $(call QUIET_INSTALL, Documentation-man) \
- $(INSTALL) -d -m 755 $(DESTDIR)$(man3dir); \
- $(INSTALL) -m 644 $(DOC_MAN3) $(DESTDIR)$(man3dir);
-
-install-man: check-man-tools man do-install-man
-
-uninstall: uninstall-man
-
-uninstall-man:
- $(call QUIET_UNINST, Documentation-man) \
- $(Q)$(RM) $(addprefix $(DESTDIR)$(man3dir)/,$(DOC_MAN3))
-
-
-ifdef missing_tools
- DO_INSTALL_MAN = $(warning Please install $(missing_tools) to have the man pages installed)
-else
- DO_INSTALL_MAN = do-install-man
-endif
-
-CLEAN_FILES = \
- $(MAN_XML) $(addsuffix +,$(MAN_XML)) \
- $(MAN_HTML) $(addsuffix +,$(MAN_HTML)) \
- $(DOC_MAN3) *.3
-
-clean:
- $(call QUIET_CLEAN, Documentation) $(RM) $(CLEAN_FILES)
-
-ifdef USE_ASCIIDOCTOR
-$(OUTPUT)%.3 : $(OUTPUT)%.txt
- $(QUIET_ASCIIDOC)$(RM) $@+ $@ && \
- $(ASCIIDOC) -b manpage -d manpage \
- $(ASCIIDOC_EXTRA) -alibtraceevent_version=$(EVENT_PARSE_VERSION) -o $@+ $< && \
- mv $@+ $@
-endif
-
-$(OUTPUT)%.3 : $(OUTPUT)%.xml
- $(QUIET_XMLTO)$(RM) $@ && \
- $(XMLTO) -o $(OUTPUT). -m $(MANPAGE_XSL) $(XMLTO_EXTRA) man $<
-
-$(OUTPUT)%.xml : %.txt
- $(QUIET_ASCIIDOC)$(RM) $@+ $@ && \
- $(ASCIIDOC) -b docbook -d manpage \
- $(ASCIIDOC_EXTRA) -alibtraceevent_version=$(EVENT_PARSE_VERSION) -o $@+ $< && \
- mv $@+ $@
-
-$(MAN_HTML): $(OUTPUT)%.html : %.txt
- $(QUIET_ASCIIDOC)$(RM) $@+ $@ && \
- $(ASCIIDOC) -b $(ASCIIDOC_HTML) -d manpage \
- $(ASCIIDOC_EXTRA) -aperf_version=$(EVENT_PARSE_VERSION) -o $@+ $< && \
- mv $@+ $@
diff --git a/tools/lib/traceevent/Documentation/asciidoc.conf b/tools/lib/traceevent/Documentation/asciidoc.conf
deleted file mode 100644
index 07595717f06e..000000000000
--- a/tools/lib/traceevent/Documentation/asciidoc.conf
+++ /dev/null
@@ -1,120 +0,0 @@
-## linktep: macro
-#
-# Usage: linktep:command[manpage-section]
-#
-# Note, {0} is the manpage section, while {target} is the command.
-#
-# Show TEP link as: <command>(<section>); if section is defined, else just show
-# the command.
-
-[macros]
-(?su)[\\]?(?P<name>linktep):(?P<target>\S*?)\[(?P<attrlist>.*?)\]=
-
-[attributes]
-asterisk=&#42;
-plus=&#43;
-caret=&#94;
-startsb=&#91;
-endsb=&#93;
-tilde=&#126;
-
-ifdef::backend-docbook[]
-[linktep-inlinemacro]
-{0%{target}}
-{0#<citerefentry>}
-{0#<refentrytitle>{target}</refentrytitle><manvolnum>{0}</manvolnum>}
-{0#</citerefentry>}
-endif::backend-docbook[]
-
-ifdef::backend-docbook[]
-ifndef::tep-asciidoc-no-roff[]
-# "unbreak" docbook-xsl v1.68 for manpages. v1.69 works with or without this.
-# v1.72 breaks with this because it replaces dots not in roff requests.
-[listingblock]
-<example><title>{title}</title>
-<literallayout>
-ifdef::doctype-manpage[]
-&#10;.ft C&#10;
-endif::doctype-manpage[]
-|
-ifdef::doctype-manpage[]
-&#10;.ft&#10;
-endif::doctype-manpage[]
-</literallayout>
-{title#}</example>
-endif::tep-asciidoc-no-roff[]
-
-ifdef::tep-asciidoc-no-roff[]
-ifdef::doctype-manpage[]
-# The following two small workarounds insert a simple paragraph after screen
-[listingblock]
-<example><title>{title}</title>
-<literallayout>
-|
-</literallayout><simpara></simpara>
-{title#}</example>
-
-[verseblock]
-<formalpara{id? id="{id}"}><title>{title}</title><para>
-{title%}<literallayout{id? id="{id}"}>
-{title#}<literallayout>
-|
-</literallayout>
-{title#}</para></formalpara>
-{title%}<simpara></simpara>
-endif::doctype-manpage[]
-endif::tep-asciidoc-no-roff[]
-endif::backend-docbook[]
-
-ifdef::doctype-manpage[]
-ifdef::backend-docbook[]
-[header]
-template::[header-declarations]
-<refentry>
-<refmeta>
-<refentrytitle>{mantitle}</refentrytitle>
-<manvolnum>{manvolnum}</manvolnum>
-<refmiscinfo class="source">libtraceevent</refmiscinfo>
-<refmiscinfo class="version">{libtraceevent_version}</refmiscinfo>
-<refmiscinfo class="manual">libtraceevent Manual</refmiscinfo>
-</refmeta>
-<refnamediv>
- <refname>{manname1}</refname>
- <refname>{manname2}</refname>
- <refname>{manname3}</refname>
- <refname>{manname4}</refname>
- <refname>{manname5}</refname>
- <refname>{manname6}</refname>
- <refname>{manname7}</refname>
- <refname>{manname8}</refname>
- <refname>{manname9}</refname>
- <refname>{manname10}</refname>
- <refname>{manname11}</refname>
- <refname>{manname12}</refname>
- <refname>{manname13}</refname>
- <refname>{manname14}</refname>
- <refname>{manname15}</refname>
- <refname>{manname16}</refname>
- <refname>{manname17}</refname>
- <refname>{manname18}</refname>
- <refname>{manname19}</refname>
- <refname>{manname20}</refname>
- <refname>{manname21}</refname>
- <refname>{manname22}</refname>
- <refname>{manname23}</refname>
- <refname>{manname24}</refname>
- <refname>{manname25}</refname>
- <refname>{manname26}</refname>
- <refname>{manname27}</refname>
- <refname>{manname28}</refname>
- <refname>{manname29}</refname>
- <refname>{manname30}</refname>
- <refpurpose>{manpurpose}</refpurpose>
-</refnamediv>
-endif::backend-docbook[]
-endif::doctype-manpage[]
-
-ifdef::backend-xhtml11[]
-[linktep-inlinemacro]
-<a href="{target}.html">{target}{0?({0})}</a>
-endif::backend-xhtml11[]
diff --git a/tools/lib/traceevent/Documentation/libtraceevent-commands.txt b/tools/lib/traceevent/Documentation/libtraceevent-commands.txt
deleted file mode 100644
index bec552001f8e..000000000000
--- a/tools/lib/traceevent/Documentation/libtraceevent-commands.txt
+++ /dev/null
@@ -1,153 +0,0 @@
-libtraceevent(3)
-================
-
-NAME
-----
-tep_register_comm, tep_override_comm, tep_pid_is_registered,
-tep_data_comm_from_pid, tep_data_pid_from_comm, tep_cmdline_pid -
-Manage pid to process name mappings.
-
-SYNOPSIS
---------
-[verse]
---
-*#include <event-parse.h>*
-
-int *tep_register_comm*(struct tep_handle pass:[*]_tep_, const char pass:[*]_comm_, int _pid_);
-int *tep_override_comm*(struct tep_handle pass:[*]_tep_, const char pass:[*]_comm_, int _pid_);
-bool *tep_is_pid_registered*(struct tep_handle pass:[*]_tep_, int _pid_);
-const char pass:[*]*tep_data_comm_from_pid*(struct tep_handle pass:[*]_pevent_, int _pid_);
-struct cmdline pass:[*]*tep_data_pid_from_comm*(struct tep_handle pass:[*]_pevent_, const char pass:[*]_comm_, struct cmdline pass:[*]_next_);
-int *tep_cmdline_pid*(struct tep_handle pass:[*]_pevent_, struct cmdline pass:[*]_cmdline_);
---
-
-DESCRIPTION
------------
-These functions can be used to handle the mapping between pid and process name.
-The library builds a cache of these mappings, which is used to display the name
-of the process, instead of its pid. This information can be retrieved from
-tracefs/saved_cmdlines file.
-
-The _tep_register_comm()_ function registers a _pid_ / process name mapping.
-If a command with the same _pid_ is already registered, an error is returned.
-The _pid_ argument is the process ID, the _comm_ argument is the process name,
-_tep_ is the event context. The _comm_ is duplicated internally.
-
-The _tep_override_comm()_ function registers a _pid_ / process name mapping.
-If a process with the same pid is already registered, the process name string is
-udapted with the new one. The _pid_ argument is the process ID, the _comm_
-argument is the process name, _tep_ is the event context. The _comm_ is
-duplicated internally.
-
-The _tep_is_pid_registered()_ function checks if a pid has a process name
-mapping registered. The _pid_ argument is the process ID, _tep_ is the event
-context.
-
-The _tep_data_comm_from_pid()_ function returns the process name for a given
-pid. The _pid_ argument is the process ID, _tep_ is the event context.
-The returned string should not be freed, but will be freed when the _tep_
-handler is closed.
-
-The _tep_data_pid_from_comm()_ function returns a pid for a given process name.
-The _comm_ argument is the process name, _tep_ is the event context.
-The argument _next_ is the cmdline structure to search for the next pid.
-As there may be more than one pid for a given process, the result of this call
-can be passed back into a recurring call in the _next_ parameter, to search for
-the next pid. If _next_ is NULL, it will return the first pid associated with
-the _comm_. The function performs a linear search, so it may be slow.
-
-The _tep_cmdline_pid()_ function returns the pid associated with a given
-_cmdline_. The _tep_ argument is the event context.
-
-RETURN VALUE
-------------
-_tep_register_comm()_ function returns 0 on success. In case of an error -1 is
-returned and errno is set to indicate the cause of the problem: ENOMEM, if there
-is not enough memory to duplicate the _comm_ or EEXIST if a mapping for this
-_pid_ is already registered.
-
-_tep_override_comm()_ function returns 0 on success. In case of an error -1 is
-returned and errno is set to indicate the cause of the problem: ENOMEM, if there
-is not enough memory to duplicate the _comm_.
-
-_tep_is_pid_registered()_ function returns true if the _pid_ has a process name
-mapped to it, false otherwise.
-
-_tep_data_comm_from_pid()_ function returns the process name as string, or the
-string "<...>" if there is no mapping for the given pid.
-
-_tep_data_pid_from_comm()_ function returns a pointer to a struct cmdline, that
-holds a pid for a given process, or NULL if none is found. This result can be
-passed back into a recurring call as the _next_ parameter of the function.
-
-_tep_cmdline_pid()_ functions returns the pid for the give cmdline. If _cmdline_
- is NULL, then -1 is returned.
-
-EXAMPLE
--------
-The following example registers pid for command "ls", in context of event _tep_
-and performs various searches for pid / process name mappings:
-[source,c]
---
-#include <event-parse.h>
-...
-int ret;
-int ls_pid = 1021;
-struct tep_handle *tep = tep_alloc();
-...
- ret = tep_register_comm(tep, "ls", ls_pid);
- if (ret != 0 && errno == EEXIST)
- ret = tep_override_comm(tep, "ls", ls_pid);
- if (ret != 0) {
- /* Failed to register pid / command mapping */
- }
-...
- if (tep_is_pid_registered(tep, ls_pid) == 0) {
- /* Command mapping for ls_pid is not registered */
- }
-...
- const char *comm = tep_data_comm_from_pid(tep, ls_pid);
- if (comm) {
- /* Found process name for ls_pid */
- }
-...
- int pid;
- struct cmdline *cmd = tep_data_pid_from_comm(tep, "ls", NULL);
- while (cmd) {
- pid = tep_cmdline_pid(tep, cmd);
- /* Found pid for process "ls" */
- cmd = tep_data_pid_from_comm(tep, "ls", cmd);
- }
---
-FILES
------
-[verse]
---
-*event-parse.h*
- Header file to include in order to have access to the library APIs.
-*-ltraceevent*
- Linker switch to add when building a program that uses the library.
---
-
-SEE ALSO
---------
-_libtraceevent(3)_, _trace-cmd(1)_
-
-AUTHOR
-------
-[verse]
---
-*Steven Rostedt* <[email protected]>, author of *libtraceevent*.
-*Tzvetomir Stoyanov* <[email protected]>, author of this man page.
---
-REPORTING BUGS
---------------
-Report bugs to <[email protected]>
-
-LICENSE
--------
-libtraceevent is Free Software licensed under the GNU LGPL 2.1
-
-RESOURCES
----------
-https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
diff --git a/tools/lib/traceevent/Documentation/libtraceevent-cpus.txt b/tools/lib/traceevent/Documentation/libtraceevent-cpus.txt
deleted file mode 100644
index 5ad70e43b752..000000000000
--- a/tools/lib/traceevent/Documentation/libtraceevent-cpus.txt
+++ /dev/null
@@ -1,77 +0,0 @@
-libtraceevent(3)
-================
-
-NAME
-----
-tep_get_cpus, tep_set_cpus - Get / set the number of CPUs, which have a tracing
-buffer representing it. Note, the buffer may be empty.
-
-SYNOPSIS
---------
-[verse]
---
-*#include <event-parse.h>*
-
-int *tep_get_cpus*(struct tep_handle pass:[*]_tep_);
-void *tep_set_cpus*(struct tep_handle pass:[*]_tep_, int _cpus_);
---
-
-DESCRIPTION
------------
-The _tep_get_cpus()_ function gets the number of CPUs, which have a tracing
-buffer representing it. The _tep_ argument is trace event parser context.
-
-The _tep_set_cpus()_ function sets the number of CPUs, which have a tracing
-buffer representing it. The _tep_ argument is trace event parser context.
-The _cpu_ argument is the number of CPUs with tracing data.
-
-RETURN VALUE
-------------
-The _tep_get_cpus()_ functions returns the number of CPUs, which have tracing
-data recorded.
-
-EXAMPLE
--------
-[source,c]
---
-#include <event-parse.h>
-...
-struct tep_handle *tep = tep_alloc();
-...
- tep_set_cpus(tep, 5);
-...
- printf("We have tracing data for %d CPUs", tep_get_cpus(tep));
---
-
-FILES
------
-[verse]
---
-*event-parse.h*
- Header file to include in order to have access to the library APIs.
-*-ltraceevent*
- Linker switch to add when building a program that uses the library.
---
-
-SEE ALSO
---------
-_libtraceevent(3)_, _trace-cmd(1)_
-
-AUTHOR
-------
-[verse]
---
-*Steven Rostedt* <[email protected]>, author of *libtraceevent*.
-*Tzvetomir Stoyanov* <[email protected]>, author of this man page.
---
-REPORTING BUGS
---------------
-Report bugs to <[email protected]>
-
-LICENSE
--------
-libtraceevent is Free Software licensed under the GNU LGPL 2.1
-
-RESOURCES
----------
-https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
diff --git a/tools/lib/traceevent/Documentation/libtraceevent-endian_read.txt b/tools/lib/traceevent/Documentation/libtraceevent-endian_read.txt
deleted file mode 100644
index e64851b6e189..000000000000
--- a/tools/lib/traceevent/Documentation/libtraceevent-endian_read.txt
+++ /dev/null
@@ -1,78 +0,0 @@
-libtraceevent(3)
-================
-
-NAME
-----
-tep_read_number - Reads a number from raw data.
-
-SYNOPSIS
---------
-[verse]
---
-*#include <event-parse.h>*
-
-unsigned long long *tep_read_number*(struct tep_handle pass:[*]_tep_, const void pass:[*]_ptr_, int _size_);
---
-
-DESCRIPTION
------------
-The _tep_read_number()_ function reads an integer from raw data, taking into
-account the endianness of the raw data and the current host. The _tep_ argument
-is the trace event parser context. The _ptr_ is a pointer to the raw data, where
-the integer is, and the _size_ is the size of the integer.
-
-RETURN VALUE
-------------
-The _tep_read_number()_ function returns the integer in the byte order of
-the current host. In case of an error, 0 is returned.
-
-EXAMPLE
--------
-[source,c]
---
-#include <event-parse.h>
-...
-struct tep_handle *tep = tep_alloc();
-...
-void process_record(struct tep_record *record)
-{
- int offset = 24;
- int data = tep_read_number(tep, record->data + offset, 4);
-
- /* Read the 4 bytes at the offset 24 of data as an integer */
-}
-...
---
-
-FILES
------
-[verse]
---
-*event-parse.h*
- Header file to include in order to have access to the library APIs.
-*-ltraceevent*
- Linker switch to add when building a program that uses the library.
---
-
-SEE ALSO
---------
-_libtraceevent(3)_, _trace-cmd(1)_
-
-AUTHOR
-------
-[verse]
---
-*Steven Rostedt* <[email protected]>, author of *libtraceevent*.
-*Tzvetomir Stoyanov* <[email protected]>, author of this man page.
---
-REPORTING BUGS
---------------
-Report bugs to <[email protected]>
-
-LICENSE
--------
-libtraceevent is Free Software licensed under the GNU LGPL 2.1
-
-RESOURCES
----------
-https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
diff --git a/tools/lib/traceevent/Documentation/libtraceevent-event_find.txt b/tools/lib/traceevent/Documentation/libtraceevent-event_find.txt
deleted file mode 100644
index 7bc062c9f76f..000000000000
--- a/tools/lib/traceevent/Documentation/libtraceevent-event_find.txt
+++ /dev/null
@@ -1,103 +0,0 @@
-libtraceevent(3)
-================
-
-NAME
-----
-tep_find_event,tep_find_event_by_name,tep_find_event_by_record -
-Find events by given key.
-
-SYNOPSIS
---------
-[verse]
---
-*#include <event-parse.h>*
-
-struct tep_event pass:[*]*tep_find_event*(struct tep_handle pass:[*]_tep_, int _id_);
-struct tep_event pass:[*]*tep_find_event_by_name*(struct tep_handle pass:[*]_tep_, const char pass:[*]_sys_, const char pass:[*]_name_);
-struct tep_event pass:[*]*tep_find_event_by_record*(struct tep_handle pass:[*]_tep_, struct tep_record pass:[*]_record_);
---
-
-DESCRIPTION
------------
-This set of functions can be used to search for an event, based on a given
-criteria. All functions require a pointer to a _tep_, trace event parser
-context.
-
-The _tep_find_event()_ function searches for an event by given event _id_. The
-event ID is assigned dynamically and can be viewed in event's format file,
-"ID" field.
-
-The tep_find_event_by_name()_ function searches for an event by given
-event _name_, under the system _sys_. If the _sys_ is NULL (not specified),
-the first event with _name_ is returned.
-
-The tep_find_event_by_record()_ function searches for an event from a given
-_record_.
-
-RETURN VALUE
-------------
-All these functions return a pointer to the found event, or NULL if there is no
-such event.
-
-EXAMPLE
--------
-[source,c]
---
-#include <event-parse.h>
-...
-struct tep_handle *tep = tep_alloc();
-...
-struct tep_event *event;
-
-event = tep_find_event(tep, 1857);
-if (event == NULL) {
- /* There is no event with ID 1857 */
-}
-
-event = tep_find_event_by_name(tep, "kvm", "kvm_exit");
-if (event == NULL) {
- /* There is no kvm_exit event, from kvm system */
-}
-
-void event_from_record(struct tep_record *record)
-{
- struct tep_event *event = tep_find_event_by_record(tep, record);
- if (event == NULL) {
- /* There is no event from given record */
- }
-}
-...
---
-
-FILES
------
-[verse]
---
-*event-parse.h*
- Header file to include in order to have access to the library APIs.
-*-ltraceevent*
- Linker switch to add when building a program that uses the library.
---
-
-SEE ALSO
---------
-_libtraceevent(3)_, _trace-cmd(1)_
-
-AUTHOR
-------
-[verse]
---
-*Steven Rostedt* <[email protected]>, author of *libtraceevent*.
-*Tzvetomir Stoyanov* <[email protected]>, author of this man page.
---
-REPORTING BUGS
---------------
-Report bugs to <[email protected]>
-
-LICENSE
--------
-libtraceevent is Free Software licensed under the GNU LGPL 2.1
-
-RESOURCES
----------
-https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
diff --git a/tools/lib/traceevent/Documentation/libtraceevent-event_get.txt b/tools/lib/traceevent/Documentation/libtraceevent-event_get.txt
deleted file mode 100644
index 6525092fc417..000000000000
--- a/tools/lib/traceevent/Documentation/libtraceevent-event_get.txt
+++ /dev/null
@@ -1,99 +0,0 @@
-libtraceevent(3)
-================
-
-NAME
-----
-tep_get_event, tep_get_first_event, tep_get_events_count - Access events.
-
-SYNOPSIS
---------
-[verse]
---
-*#include <event-parse.h>*
-
-struct tep_event pass:[*]*tep_get_event*(struct tep_handle pass:[*]_tep_, int _index_);
-struct tep_event pass:[*]*tep_get_first_event*(struct tep_handle pass:[*]_tep_);
-int *tep_get_events_count*(struct tep_handle pass:[*]_tep_);
---
-
-DESCRIPTION
------------
-The _tep_get_event()_ function returns a pointer to event at the given _index_.
-The _tep_ argument is trace event parser context, the _index_ is the index of
-the requested event.
-
-The _tep_get_first_event()_ function returns a pointer to the first event.
-As events are stored in an array, this function returns the pointer to the
-beginning of the array. The _tep_ argument is trace event parser context.
-
-The _tep_get_events_count()_ function returns the number of the events
-in the array. The _tep_ argument is trace event parser context.
-
-RETURN VALUE
-------------
-The _tep_get_event()_ returns a pointer to the event located at _index_.
-NULL is returned in case of error, in case there are no events or _index_ is
-out of range.
-
-The _tep_get_first_event()_ returns a pointer to the first event. NULL is
-returned in case of error, or in case there are no events.
-
-The _tep_get_events_count()_ returns the number of the events. 0 is
-returned in case of error, or in case there are no events.
-
-EXAMPLE
--------
-[source,c]
---
-#include <event-parse.h>
-...
-struct tep_handle *tep = tep_alloc();
-...
-int i,count = tep_get_events_count(tep);
-struct tep_event *event, *events = tep_get_first_event(tep);
-
-if (events == NULL) {
- /* There are no events */
-} else {
- for (i = 0; i < count; i++) {
- event = (events+i);
- /* process events[i] */
- }
-
- /* Get the last event */
- event = tep_get_event(tep, count-1);
-}
---
-
-FILES
------
-[verse]
---
-*event-parse.h*
- Header file to include in order to have access to the library APIs.
-*-ltraceevent*
- Linker switch to add when building a program that uses the library.
---
-
-SEE ALSO
---------
-_libtraceevent(3)_, _trace-cmd(1)_
-
-AUTHOR
-------
-[verse]
---
-*Steven Rostedt* <[email protected]>, author of *libtraceevent*.
-*Tzvetomir Stoyanov* <[email protected]>, author of this man page.
---
-REPORTING BUGS
---------------
-Report bugs to <[email protected]>
-
-LICENSE
--------
-libtraceevent is Free Software licensed under the GNU LGPL 2.1
-
-RESOURCES
----------
-https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
diff --git a/tools/lib/traceevent/Documentation/libtraceevent-event_list.txt b/tools/lib/traceevent/Documentation/libtraceevent-event_list.txt
deleted file mode 100644
index fba350e5a4cb..000000000000
--- a/tools/lib/traceevent/Documentation/libtraceevent-event_list.txt
+++ /dev/null
@@ -1,122 +0,0 @@
-libtraceevent(3)
-================
-
-NAME
-----
-tep_list_events, tep_list_events_copy -
-Get list of events, sorted by given criteria.
-
-SYNOPSIS
---------
-[verse]
---
-*#include <event-parse.h>*
-
-enum *tep_event_sort_type* {
- _TEP_EVENT_SORT_ID_,
- _TEP_EVENT_SORT_NAME_,
- _TEP_EVENT_SORT_SYSTEM_,
-};
-
-struct tep_event pass:[*]pass:[*]*tep_list_events*(struct tep_handle pass:[*]_tep_, enum tep_event_sort_type _sort_type_);
-struct tep_event pass:[*]pass:[*]*tep_list_events_copy*(struct tep_handle pass:[*]_tep_, enum tep_event_sort_type _sort_type_);
---
-
-DESCRIPTION
------------
-The _tep_list_events()_ function returns an array of pointers to the events,
-sorted by the _sort_type_ criteria. The last element of the array is NULL.
-The returned memory must not be freed, it is managed by the library.
-The function is not thread safe. The _tep_ argument is trace event parser
-context. The _sort_type_ argument is the required sort criteria:
-[verse]
---
- _TEP_EVENT_SORT_ID_ - sort by the event ID.
- _TEP_EVENT_SORT_NAME_ - sort by the event (name, system, id) triplet.
- _TEP_EVENT_SORT_SYSTEM_ - sort by the event (system, name, id) triplet.
---
-
-The _tep_list_events_copy()_ is a thread safe version of _tep_list_events()_.
-It has the same behavior, but the returned array is allocated internally and
-must be freed by the caller. Note that the content of the array must not be
-freed (see the EXAMPLE below).
-
-RETURN VALUE
-------------
-The _tep_list_events()_ function returns an array of pointers to events.
-In case of an error, NULL is returned. The returned array must not be freed,
-it is managed by the library.
-
-The _tep_list_events_copy()_ function returns an array of pointers to events.
-In case of an error, NULL is returned. The returned array must be freed by
-the caller.
-
-EXAMPLE
--------
-[source,c]
---
-#include <event-parse.h>
-...
-struct tep_handle *tep = tep_alloc();
-...
-int i;
-struct tep_event_format **events;
-
-i=0;
-events = tep_list_events(tep, TEP_EVENT_SORT_ID);
-if (events == NULL) {
- /* Failed to get the events, sorted by ID */
-} else {
- while(events[i]) {
- /* walk through the list of the events, sorted by ID */
- i++;
- }
-}
-
-i=0;
-events = tep_list_events_copy(tep, TEP_EVENT_SORT_NAME);
-if (events == NULL) {
- /* Failed to get the events, sorted by name */
-} else {
- while(events[i]) {
- /* walk through the list of the events, sorted by name */
- i++;
- }
- free(events);
-}
-
-...
---
-
-FILES
------
-[verse]
---
-*event-parse.h*
- Header file to include in order to have access to the library APIs.
-*-ltraceevent*
- Linker switch to add when building a program that uses the library.
---
-
-SEE ALSO
---------
-_libtraceevent(3)_, _trace-cmd(1)_
-
-AUTHOR
-------
-[verse]
---
-*Steven Rostedt* <[email protected]>, author of *libtraceevent*.
-*Tzvetomir Stoyanov* <[email protected]>, author of this man page.
---
-REPORTING BUGS
---------------
-Report bugs to <[email protected]>
-
-LICENSE
--------
-libtraceevent is Free Software licensed under the GNU LGPL 2.1
-
-RESOURCES
----------
-https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
diff --git a/tools/lib/traceevent/Documentation/libtraceevent-event_print.txt b/tools/lib/traceevent/Documentation/libtraceevent-event_print.txt
deleted file mode 100644
index 2c6a61811118..000000000000
--- a/tools/lib/traceevent/Documentation/libtraceevent-event_print.txt
+++ /dev/null
@@ -1,130 +0,0 @@
-libtraceevent(3)
-================
-
-NAME
-----
-tep_print_event - Writes event information into a trace sequence.
-
-SYNOPSIS
---------
-[verse]
---
-*#include <event-parse.h>*
-*#include <trace-seq.h>*
-
-void *tep_print_event*(struct tep_handle pass:[*]_tep_, struct trace_seqpass:[*]_s_, struct tep_record pass:[*]_record_, const char pass:[*]_fmt_, _..._)
---
-
-DESCRIPTION
------------
-
-The _tep_print_event()_ function parses the event information of the given
-_record_ and writes it into the trace sequence _s_, according to the format
-string _fmt_. The desired information is specified after the format string.
-The _fmt_ is printf-like format string, following arguments are supported:
-[verse]
---
- TEP_PRINT_PID, "%d" - PID of the event.
- TEP_PRINT_CPU, "%d" - Event CPU.
- TEP_PRINT_COMM, "%s" - Event command string.
- TEP_PRINT_NAME, "%s" - Event name.
- TEP_PRINT_LATENCY, "%s" - Latency of the event. It prints 4 or more
- fields - interrupt state, scheduling state,
- current context, and preemption count.
- Field 1 is the interrupt enabled state:
- d : Interrupts are disabled
- . : Interrupts are enabled
- X : The architecture does not support this
- information
- Field 2 is the "need resched" state.
- N : The task is set to call the scheduler when
- possible, as another higher priority task
- may need to be scheduled in.
- . : The task is not set to call the scheduler.
- Field 3 is the context state.
- . : Normal context
- s : Soft interrupt context
- h : Hard interrupt context
- H : Hard interrupt context which triggered
- during soft interrupt context.
- z : NMI context
- Z : NMI context which triggered during hard
- interrupt context
- Field 4 is the preemption count.
- . : The preempt count is zero.
- On preemptible kernels (where the task can be scheduled
- out in arbitrary locations while in kernel context), the
- preempt count, when non zero, will prevent the kernel
- from scheduling out the current task. The preempt count
- number is displayed when it is not zero.
- Depending on the kernel, it may show other fields
- (lock depth, or migration disabled, which are unique to
- specialized kernels).
- TEP_PRINT_TIME, %d - event time stamp. A divisor and precision can be
- specified as part of this format string:
- "%precision.divisord". Example:
- "%3.1000d" - divide the time by 1000 and print the first
- 3 digits before the dot. Thus, the time stamp
- "123456000" will be printed as "123.456"
- TEP_PRINT_INFO, "%s" - event information.
- TEP_PRINT_INFO_RAW, "%s" - event information, in raw format.
-
---
-EXAMPLE
--------
-[source,c]
---
-#include <event-parse.h>
-#include <trace-seq.h>
-...
-struct trace_seq seq;
-trace_seq_init(&seq);
-struct tep_handle *tep = tep_alloc();
-...
-void print_my_event(struct tep_record *record)
-{
- trace_seq_reset(&seq);
- tep_print_event(tep, s, record, "%16s-%-5d [%03d] %s %6.1000d %s %s",
- TEP_PRINT_COMM, TEP_PRINT_PID, TEP_PRINT_CPU,
- TEP_PRINT_LATENCY, TEP_PRINT_TIME, TEP_PRINT_NAME,
- TEP_PRINT_INFO);
-}
-...
---
-
-FILES
------
-[verse]
---
-*event-parse.h*
- Header file to include in order to have access to the library APIs.
-*trace-seq.h*
- Header file to include in order to have access to trace sequences related APIs.
- Trace sequences are used to allow a function to call several other functions
- to create a string of data to use.
-*-ltraceevent*
- Linker switch to add when building a program that uses the library.
---
-
-SEE ALSO
---------
-_libtraceevent(3)_, _trace-cmd(1)_
-
-AUTHOR
-------
-[verse]
---
-*Steven Rostedt* <[email protected]>, author of *libtraceevent*.
-*Tzvetomir Stoyanov* <[email protected]>, author of this man page.
---
-REPORTING BUGS
---------------
-Report bugs to <[email protected]>
-
-LICENSE
--------
-libtraceevent is Free Software licensed under the GNU LGPL 2.1
-
-RESOURCES
----------
-https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
diff --git a/tools/lib/traceevent/Documentation/libtraceevent-field_find.txt b/tools/lib/traceevent/Documentation/libtraceevent-field_find.txt
deleted file mode 100644
index 0896af5b9eff..000000000000
--- a/tools/lib/traceevent/Documentation/libtraceevent-field_find.txt
+++ /dev/null
@@ -1,118 +0,0 @@
-libtraceevent(3)
-================
-
-NAME
-----
-tep_find_common_field, tep_find_field, tep_find_any_field -
-Search for a field in an event.
-
-SYNOPSIS
---------
-[verse]
---
-*#include <event-parse.h>*
-
-struct tep_format_field pass:[*]*tep_find_common_field*(struct tep_event pass:[*]_event_, const char pass:[*]_name_);
-struct tep_format_field pass:[*]*tep_find_field*(struct tep_event_ormat pass:[*]_event_, const char pass:[*]_name_);
-struct tep_format_field pass:[*]*tep_find_any_field*(struct tep_event pass:[*]_event_, const char pass:[*]_name_);
---
-
-DESCRIPTION
------------
-These functions search for a field with given name in an event. The field
-returned can be used to find the field content from within a data record.
-
-The _tep_find_common_field()_ function searches for a common field with _name_
-in the _event_.
-
-The _tep_find_field()_ function searches for an event specific field with
-_name_ in the _event_.
-
-The _tep_find_any_field()_ function searches for any field with _name_ in the
-_event_.
-
-RETURN VALUE
-------------
-The _tep_find_common_field(), _tep_find_field()_ and _tep_find_any_field()_
-functions return a pointer to the found field, or NULL in case there is no field
-with the requested name.
-
-EXAMPLE
--------
-[source,c]
---
-#include <event-parse.h>
-...
-void get_htimer_info(struct tep_handle *tep, struct tep_record *record)
-{
- struct tep_format_field *field;
- struct tep_event *event;
- long long softexpires;
- int mode;
- int pid;
-
- event = tep_find_event_by_name(tep, "timer", "hrtimer_start");
-
- field = tep_find_common_field(event, "common_pid");
- if (field == NULL) {
- /* Cannot find "common_pid" field in the event */
- } else {
- /* Get pid from the data record */
- pid = tep_read_number(tep, record->data + field->offset,
- field->size);
- }
-
- field = tep_find_field(event, "softexpires");
- if (field == NULL) {
- /* Cannot find "softexpires" event specific field in the event */
- } else {
- /* Get softexpires parameter from the data record */
- softexpires = tep_read_number(tep, record->data + field->offset,
- field->size);
- }
-
- field = tep_find_any_field(event, "mode");
- if (field == NULL) {
- /* Cannot find "mode" field in the event */
- } else
- {
- /* Get mode parameter from the data record */
- mode = tep_read_number(tep, record->data + field->offset,
- field->size);
- }
-}
-...
---
-
-FILES
------
-[verse]
---
-*event-parse.h*
- Header file to include in order to have access to the library APIs.
-*-ltraceevent*
- Linker switch to add when building a program that uses the library.
---
-
-SEE ALSO
---------
-_libtraceevent(3)_, _trace-cmd(1)_
-
-AUTHOR
-------
-[verse]
---
-*Steven Rostedt* <[email protected]>, author of *libtraceevent*.
-*Tzvetomir Stoyanov* <[email protected]>, author of this man page.
---
-REPORTING BUGS
---------------
-Report bugs to <[email protected]>
-
-LICENSE
--------
-libtraceevent is Free Software licensed under the GNU LGPL 2.1
-
-RESOURCES
----------
-https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
diff --git a/tools/lib/traceevent/Documentation/libtraceevent-field_get_val.txt b/tools/lib/traceevent/Documentation/libtraceevent-field_get_val.txt
deleted file mode 100644
index 6324f0d48aeb..000000000000
--- a/tools/lib/traceevent/Documentation/libtraceevent-field_get_val.txt
+++ /dev/null
@@ -1,122 +0,0 @@
-libtraceevent(3)
-================
-
-NAME
-----
-tep_get_any_field_val, tep_get_common_field_val, tep_get_field_val,
-tep_get_field_raw - Get value of a field.
-
-SYNOPSIS
---------
-[verse]
---
-*#include <event-parse.h>*
-*#include <trace-seq.h>*
-
-int *tep_get_any_field_val*(struct trace_seq pass:[*]_s_, struct tep_event pass:[*]_event_, const char pass:[*]_name_, struct tep_record pass:[*]_record_, unsigned long long pass:[*]_val_, int _err_);
-int *tep_get_common_field_val*(struct trace_seq pass:[*]_s_, struct tep_event pass:[*]_event_, const char pass:[*]_name_, struct tep_record pass:[*]_record_, unsigned long long pass:[*]_val_, int _err_);
-int *tep_get_field_val*(struct trace_seq pass:[*]_s_, struct tep_event pass:[*]_event_, const char pass:[*]_name_, struct tep_record pass:[*]_record_, unsigned long long pass:[*]_val_, int _err_);
-void pass:[*]*tep_get_field_raw*(struct trace_seq pass:[*]_s_, struct tep_event pass:[*]_event_, const char pass:[*]_name_, struct tep_record pass:[*]_record_, int pass:[*]_len_, int _err_);
---
-
-DESCRIPTION
------------
-These functions can be used to find a field and retrieve its value.
-
-The _tep_get_any_field_val()_ function searches in the _record_ for a field
-with _name_, part of the _event_. If the field is found, its value is stored in
-_val_. If there is an error and _err_ is not zero, then an error string is
-written into _s_.
-
-The _tep_get_common_field_val()_ function does the same as
-_tep_get_any_field_val()_, but searches only in the common fields. This works
-for any event as all events include the common fields.
-
-The _tep_get_field_val()_ function does the same as _tep_get_any_field_val()_,
-but searches only in the event specific fields.
-
-The _tep_get_field_raw()_ function searches in the _record_ for a field with
-_name_, part of the _event_. If the field is found, a pointer to where the field
-exists in the record's raw data is returned. The size of the data is stored in
-_len_. If there is an error and _err_ is not zero, then an error string is
-written into _s_.
-
-RETURN VALUE
-------------
-The _tep_get_any_field_val()_, _tep_get_common_field_val()_ and
-_tep_get_field_val()_ functions return 0 on success, or -1 in case of an error.
-
-The _tep_get_field_raw()_ function returns a pointer to field's raw data, and
-places the length of this data in _len_. In case of an error NULL is returned.
-
-EXAMPLE
--------
-[source,c]
---
-#include <event-parse.h>
-#include <trace-seq.h>
-...
-struct tep_handle *tep = tep_alloc();
-...
-struct tep_event *event = tep_find_event_by_name(tep, "kvm", "kvm_exit");
-...
-void process_record(struct tep_record *record)
-{
- int len;
- char *comm;
- struct tep_event_format *event;
- unsigned long long val;
-
- event = tep_find_event_by_record(pevent, record);
- if (event != NULL) {
- if (tep_get_common_field_val(NULL, event, "common_type",
- record, &val, 0) == 0) {
- /* Got the value of common type field */
- }
- if (tep_get_field_val(NULL, event, "pid", record, &val, 0) == 0) {
- /* Got the value of pid specific field */
- }
- comm = tep_get_field_raw(NULL, event, "comm", record, &len, 0);
- if (comm != NULL) {
- /* Got a pointer to the comm event specific field */
- }
- }
-}
---
-
-FILES
------
-[verse]
---
-*event-parse.h*
- Header file to include in order to have access to the library APIs.
-*trace-seq.h*
- Header file to include in order to have access to trace sequences
- related APIs. Trace sequences are used to allow a function to call
- several other functions to create a string of data to use.
-*-ltraceevent*
- Linker switch to add when building a program that uses the library.
---
-
-SEE ALSO
---------
-_libtraceevent(3)_, _trace-cmd(1)_
-
-AUTHOR
-------
-[verse]
---
-*Steven Rostedt* <[email protected]>, author of *libtraceevent*.
-*Tzvetomir Stoyanov* <[email protected]>, author of this man page.
---
-REPORTING BUGS
---------------
-Report bugs to <[email protected]>
-
-LICENSE
--------
-libtraceevent is Free Software licensed under the GNU LGPL 2.1
-
-RESOURCES
----------
-https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
diff --git a/tools/lib/traceevent/Documentation/libtraceevent-field_print.txt b/tools/lib/traceevent/Documentation/libtraceevent-field_print.txt
deleted file mode 100644
index 9a9df98ac44d..000000000000
--- a/tools/lib/traceevent/Documentation/libtraceevent-field_print.txt
+++ /dev/null
@@ -1,126 +0,0 @@
-libtraceevent(3)
-================
-
-NAME
-----
-tep_print_field, tep_print_fields, tep_print_num_field, tep_print_func_field -
-Print the field content.
-
-SYNOPSIS
---------
-[verse]
---
-*#include <event-parse.h>*
-*#include <trace-seq.h>*
-
-void *tep_print_field*(struct trace_seq pass:[*]_s_, void pass:[*]_data_, struct tep_format_field pass:[*]_field_);
-void *tep_print_fields*(struct trace_seq pass:[*]_s_, void pass:[*]_data_, int _size_, struct tep_event pass:[*]_event_);
-int *tep_print_num_field*(struct trace_seq pass:[*]_s_, const char pass:[*]_fmt_, struct tep_event pass:[*]_event_, const char pass:[*]_name_, struct tep_record pass:[*]_record_, int _err_);
-int *tep_print_func_field*(struct trace_seq pass:[*]_s_, const char pass:[*]_fmt_, struct tep_event pass:[*]_event_, const char pass:[*]_name_, struct tep_record pass:[*]_record_, int _err_);
---
-
-DESCRIPTION
------------
-These functions print recorded field's data, according to the field's type.
-
-The _tep_print_field()_ function extracts from the recorded raw _data_ value of
-the _field_ and prints it into _s_, according to the field type.
-
-The _tep_print_fields()_ prints each field name followed by the record's field
-value according to the field's type:
-[verse]
---
-"field1_name=field1_value field2_name=field2_value ..."
---
-It iterates all fields of the _event_, and calls _tep_print_field()_ for each of
-them.
-
-The _tep_print_num_field()_ function prints a numeric field with given format
-string. A search is performed in the _event_ for a field with _name_. If such
-field is found, its value is extracted from the _record_ and is printed in the
-_s_, according to the given format string _fmt_. If the argument _err_ is
-non-zero, and an error occures - it is printed in the _s_.
-
-The _tep_print_func_field()_ function prints a function field with given format
-string. A search is performed in the _event_ for a field with _name_. If such
-field is found, its value is extracted from the _record_. The value is assumed
-to be a function address, and a search is perform to find the name of this
-function. The function name (if found) and its address are printed in the _s_,
-according to the given format string _fmt_. If the argument _err_ is non-zero,
-and an error occures - it is printed in _s_.
-
-RETURN VALUE
-------------
-The _tep_print_num_field()_ and _tep_print_func_field()_ functions return 1
-on success, -1 in case of an error or 0 if the print buffer _s_ is full.
-
-EXAMPLE
--------
-[source,c]
---
-#include <event-parse.h>
-#include <trace-seq.h>
-...
-struct tep_handle *tep = tep_alloc();
-...
-struct trace_seq seq;
-trace_seq_init(&seq);
-struct tep_event *event = tep_find_event_by_name(tep, "timer", "hrtimer_start");
-...
-void process_record(struct tep_record *record)
-{
- struct tep_format_field *field_pid = tep_find_common_field(event, "common_pid");
-
- trace_seq_reset(&seq);
-
- /* Print the value of "common_pid" */
- tep_print_field(&seq, record->data, field_pid);
-
- /* Print all fields of the "hrtimer_start" event */
- tep_print_fields(&seq, record->data, record->size, event);
-
- /* Print the value of "expires" field with custom format string */
- tep_print_num_field(&seq, " timer expires in %llu ", event, "expires", record, 0);
-
- /* Print the address and the name of "function" field with custom format string */
- tep_print_func_field(&seq, " timer function is %s ", event, "function", record, 0);
- }
- ...
---
-
-FILES
------
-[verse]
---
-*event-parse.h*
- Header file to include in order to have access to the library APIs.
-*trace-seq.h*
- Header file to include in order to have access to trace sequences related APIs.
- Trace sequences are used to allow a function to call several other functions
- to create a string of data to use.
-*-ltraceevent*
- Linker switch to add when building a program that uses the library.
---
-
-SEE ALSO
---------
-_libtraceevent(3)_, _trace-cmd(1)_
-
-AUTHOR
-------
-[verse]
---
-*Steven Rostedt* <[email protected]>, author of *libtraceevent*.
-*Tzvetomir Stoyanov* <[email protected]>, author of this man page.
---
-REPORTING BUGS
---------------
-Report bugs to <[email protected]>
-
-LICENSE
--------
-libtraceevent is Free Software licensed under the GNU LGPL 2.1
-
-RESOURCES
----------
-https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
diff --git a/tools/lib/traceevent/Documentation/libtraceevent-field_read.txt b/tools/lib/traceevent/Documentation/libtraceevent-field_read.txt
deleted file mode 100644
index 64e9e25d3fd9..000000000000
--- a/tools/lib/traceevent/Documentation/libtraceevent-field_read.txt
+++ /dev/null
@@ -1,81 +0,0 @@
-libtraceevent(3)
-================
-
-NAME
-----
-tep_read_number_field - Reads a number from raw data.
-
-SYNOPSIS
---------
-[verse]
---
-*#include <event-parse.h>*
-
-int *tep_read_number_field*(struct tep_format_field pass:[*]_field_, const void pass:[*]_data_, unsigned long long pass:[*]_value_);
---
-
-DESCRIPTION
------------
-The _tep_read_number_field()_ function reads the value of the _field_ from the
-raw _data_ and stores it in the _value_. The function sets the _value_ according
-to the endianness of the raw data and the current machine and stores it in
-_value_.
-
-RETURN VALUE
-------------
-The _tep_read_number_field()_ function retunrs 0 in case of success, or -1 in
-case of an error.
-
-EXAMPLE
--------
-[source,c]
---
-#include <event-parse.h>
-...
-struct tep_handle *tep = tep_alloc();
-...
-struct tep_event *event = tep_find_event_by_name(tep, "timer", "hrtimer_start");
-...
-void process_record(struct tep_record *record)
-{
- unsigned long long pid;
- struct tep_format_field *field_pid = tep_find_common_field(event, "common_pid");
-
- if (tep_read_number_field(field_pid, record->data, &pid) != 0) {
- /* Failed to get "common_pid" value */
- }
-}
-...
---
-FILES
------
-[verse]
---
-*event-parse.h*
- Header file to include in order to have access to the library APIs.
-*-ltraceevent*
- Linker switch to add when building a program that uses the library.
---
-
-SEE ALSO
---------
-_libtraceevent(3)_, _trace-cmd(1)_
-
-AUTHOR
-------
-[verse]
---
-*Steven Rostedt* <[email protected]>, author of *libtraceevent*.
-*Tzvetomir Stoyanov* <[email protected]>, author of this man page.
---
-REPORTING BUGS
---------------
-Report bugs to <[email protected]>
-
-LICENSE
--------
-libtraceevent is Free Software licensed under the GNU LGPL 2.1
-
-RESOURCES
----------
-https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
diff --git a/tools/lib/traceevent/Documentation/libtraceevent-fields.txt b/tools/lib/traceevent/Documentation/libtraceevent-fields.txt
deleted file mode 100644
index 1ccb531d5114..000000000000
--- a/tools/lib/traceevent/Documentation/libtraceevent-fields.txt
+++ /dev/null
@@ -1,105 +0,0 @@
-libtraceevent(3)
-================
-
-NAME
-----
-tep_event_common_fields, tep_event_fields - Get a list of fields for an event.
-
-SYNOPSIS
---------
-[verse]
---
-*#include <event-parse.h>*
-
-struct tep_format_field pass:[*]pass:[*]*tep_event_common_fields*(struct tep_event pass:[*]_event_);
-struct tep_format_field pass:[*]pass:[*]*tep_event_fields*(struct tep_event pass:[*]_event_);
---
-
-DESCRIPTION
------------
-The _tep_event_common_fields()_ function returns an array of pointers to common
-fields for the _event_. The array is allocated in the function and must be freed
-by free(). The last element of the array is NULL.
-
-The _tep_event_fields()_ function returns an array of pointers to event specific
-fields for the _event_. The array is allocated in the function and must be freed
-by free(). The last element of the array is NULL.
-
-RETURN VALUE
-------------
-Both _tep_event_common_fields()_ and _tep_event_fields()_ functions return
-an array of pointers to tep_format_field structures in case of success, or
-NULL in case of an error.
-
-EXAMPLE
--------
-[source,c]
---
-#include <event-parse.h>
-...
-struct tep_handle *tep = tep_alloc();
-...
-int i;
-struct tep_format_field **fields;
-struct tep_event *event = tep_find_event_by_name(tep, "kvm", "kvm_exit");
-if (event != NULL) {
- fields = tep_event_common_fields(event);
- if (fields != NULL) {
- i = 0;
- while (fields[i]) {
- /*
- walk through the list of the common fields
- of the kvm_exit event
- */
- i++;
- }
- free(fields);
- }
- fields = tep_event_fields(event);
- if (fields != NULL) {
- i = 0;
- while (fields[i]) {
- /*
- walk through the list of the event specific
- fields of the kvm_exit event
- */
- i++;
- }
- free(fields);
- }
-}
-...
---
-
-FILES
------
-[verse]
---
-*event-parse.h*
- Header file to include in order to have access to the library APIs.
-*-ltraceevent*
- Linker switch to add when building a program that uses the library.
---
-
-SEE ALSO
---------
-_libtraceevent(3)_, _trace-cmd(1)_
-
-AUTHOR
-------
-[verse]
---
-*Steven Rostedt* <[email protected]>, author of *libtraceevent*.
-*Tzvetomir Stoyanov* <[email protected]>, author of this man page.
---
-REPORTING BUGS
---------------
-Report bugs to <[email protected]>
-
-LICENSE
--------
-libtraceevent is Free Software licensed under the GNU LGPL 2.1
-
-RESOURCES
----------
-https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
diff --git a/tools/lib/traceevent/Documentation/libtraceevent-file_endian.txt b/tools/lib/traceevent/Documentation/libtraceevent-file_endian.txt
deleted file mode 100644
index f401ad311047..000000000000
--- a/tools/lib/traceevent/Documentation/libtraceevent-file_endian.txt
+++ /dev/null
@@ -1,91 +0,0 @@
-libtraceevent(3)
-================
-
-NAME
-----
-tep_is_file_bigendian, tep_set_file_bigendian - Get / set the endianness of the
-raw data being accessed by the tep handler.
-
-SYNOPSIS
---------
-[verse]
---
-*#include <event-parse.h>*
-
-enum *tep_endian* {
- TEP_LITTLE_ENDIAN = 0,
- TEP_BIG_ENDIAN
-};
-
-bool *tep_is_file_bigendian*(struct tep_handle pass:[*]_tep_);
-void *tep_set_file_bigendian*(struct tep_handle pass:[*]_tep_, enum tep_endian _endian_);
-
---
-DESCRIPTION
------------
-The _tep_is_file_bigendian()_ function gets the endianness of the raw data,
-being accessed by the tep handler. The _tep_ argument is trace event parser
-context.
-
-The _tep_set_file_bigendian()_ function sets the endianness of raw data being
-accessed by the tep handler. The _tep_ argument is trace event parser context.
-[verse]
---
-The _endian_ argument is the endianness:
- _TEP_LITTLE_ENDIAN_ - the raw data is in little endian format,
- _TEP_BIG_ENDIAN_ - the raw data is in big endian format.
---
-RETURN VALUE
-------------
-The _tep_is_file_bigendian()_ function returns true if the data is in bigendian
-format, false otherwise.
-
-EXAMPLE
--------
-[source,c]
---
-#include <event-parse.h>
-...
-struct tep_handle *tep = tep_alloc();
-...
- tep_set_file_bigendian(tep, TEP_LITTLE_ENDIAN);
-...
- if (tep_is_file_bigendian(tep)) {
- /* The raw data is in big endian */
- } else {
- /* The raw data is in little endian */
- }
---
-
-FILES
------
-[verse]
---
-*event-parse.h*
- Header file to include in order to have access to the library APIs.
-*-ltraceevent*
- Linker switch to add when building a program that uses the library.
---
-
-SEE ALSO
---------
-_libtraceevent(3)_, _trace-cmd(1)_
-
-AUTHOR
-------
-[verse]
---
-*Steven Rostedt* <[email protected]>, author of *libtraceevent*.
-*Tzvetomir Stoyanov* <[email protected]>, author of this man page.
---
-REPORTING BUGS
---------------
-Report bugs to <[email protected]>
-
-LICENSE
--------
-libtraceevent is Free Software licensed under the GNU LGPL 2.1
-
-RESOURCES
----------
-https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
diff --git a/tools/lib/traceevent/Documentation/libtraceevent-filter.txt b/tools/lib/traceevent/Documentation/libtraceevent-filter.txt
deleted file mode 100644
index 4a9962d8cb59..000000000000
--- a/tools/lib/traceevent/Documentation/libtraceevent-filter.txt
+++ /dev/null
@@ -1,209 +0,0 @@
-libtraceevent(3)
-================
-
-NAME
-----
-tep_filter_alloc, tep_filter_free, tep_filter_reset, tep_filter_make_string,
-tep_filter_copy, tep_filter_compare, tep_filter_match, tep_event_filtered,
-tep_filter_remove_event, tep_filter_strerror, tep_filter_add_filter_str -
-Event filter related APIs.
-
-SYNOPSIS
---------
-[verse]
---
-*#include <event-parse.h>*
-
-struct tep_event_filter pass:[*]*tep_filter_alloc*(struct tep_handle pass:[*]_tep_);
-void *tep_filter_free*(struct tep_event_filter pass:[*]_filter_);
-void *tep_filter_reset*(struct tep_event_filter pass:[*]_filter_);
-enum tep_errno *tep_filter_add_filter_str*(struct tep_event_filter pass:[*]_filter_, const char pass:[*]_filter_str_);
-int *tep_event_filtered*(struct tep_event_filter pass:[*]_filter_, int _event_id_);
-int *tep_filter_remove_event*(struct tep_event_filter pass:[*]_filter_, int _event_id_);
-enum tep_errno *tep_filter_match*(struct tep_event_filter pass:[*]_filter_, struct tep_record pass:[*]_record_);
-int *tep_filter_copy*(struct tep_event_filter pass:[*]_dest_, struct tep_event_filter pass:[*]_source_);
-int *tep_filter_compare*(struct tep_event_filter pass:[*]_filter1_, struct tep_event_filter pass:[*]_filter2_);
-char pass:[*]*tep_filter_make_string*(struct tep_event_filter pass:[*]_filter_, int _event_id_);
-int *tep_filter_strerror*(struct tep_event_filter pass:[*]_filter_, enum tep_errno _err_, char pass:[*]buf, size_t _buflen_);
---
-
-DESCRIPTION
------------
-Filters can be attached to traced events. They can be used to filter out various
-events when outputting them. Each event can be filtered based on its parameters,
-described in the event's format file. This set of functions can be used to
-create, delete, modify and attach event filters.
-
-The _tep_filter_alloc()_ function creates a new event filter. The _tep_ argument
-is the trace event parser context.
-
-The _tep_filter_free()_ function frees an event filter and all resources that it
-had used.
-
-The _tep_filter_reset()_ function removes all rules from an event filter and
-resets it.
-
-The _tep_filter_add_filter_str()_ function adds a new rule to the _filter_. The
-_filter_str_ argument is the filter string, that contains the rule.
-
-The _tep_event_filtered()_ function checks if the event with _event_id_ has
-_filter_.
-
-The _tep_filter_remove_event()_ function removes a _filter_ for an event with
-_event_id_.
-
-The _tep_filter_match()_ function tests if a _record_ matches given _filter_.
-
-The _tep_filter_copy()_ function copies a _source_ filter into a _dest_ filter.
-
-The _tep_filter_compare()_ function compares two filers - _filter1_ and _filter2_.
-
-The _tep_filter_make_string()_ function constructs a string, displaying
-the _filter_ contents for given _event_id_.
-
-The _tep_filter_strerror()_ function copies the _filter_ error buffer into the
-given _buf_ with the size _buflen_. If the error buffer is empty, in the _buf_
-is copied a string, describing the error _err_.
-
-RETURN VALUE
-------------
-The _tep_filter_alloc()_ function returns a pointer to the newly created event
-filter, or NULL in case of an error.
-
-The _tep_filter_add_filter_str()_ function returns 0 if the rule was
-successfully added or a negative error code. Use _tep_filter_strerror()_ to see
-actual error message in case of an error.
-
-The _tep_event_filtered()_ function returns 1 if the filter is found for given
-event, or 0 otherwise.
-
-The _tep_filter_remove_event()_ function returns 1 if the vent was removed, or
-0 if the event was not found.
-
-The _tep_filter_match()_ function returns _tep_errno_, according to the result:
-[verse]
---
-_pass:[TEP_ERRNO__FILTER_MATCH]_ - filter found for event, the record matches.
-_pass:[TEP_ERRNO__FILTER_MISS]_ - filter found for event, the record does not match.
-_pass:[TEP_ERRNO__FILTER_NOT_FOUND]_ - no filter found for record's event.
-_pass:[TEP_ERRNO__NO_FILTER]_ - no rules in the filter.
---
-or any other _tep_errno_, if an error occurred during the test.
-
-The _tep_filter_copy()_ function returns 0 on success or -1 if not all rules
- were copied.
-
-The _tep_filter_compare()_ function returns 1 if the two filters hold the same
-content, or 0 if they do not.
-
-The _tep_filter_make_string()_ function returns a string, which must be freed
-with free(), or NULL in case of an error.
-
-The _tep_filter_strerror()_ function returns 0 if message was filled
-successfully, or -1 in case of an error.
-
-EXAMPLE
--------
-[source,c]
---
-#include <event-parse.h>
-...
-struct tep_handle *tep = tep_alloc();
-...
-char errstr[200];
-int ret;
-
-struct tep_event_filter *filter = tep_filter_alloc(tep);
-struct tep_event_filter *filter1 = tep_filter_alloc(tep);
-ret = tep_filter_add_filter_str(filter, "sched/sched_wakeup:target_cpu==1");
-if(ret < 0) {
- tep_filter_strerror(filter, ret, errstr, sizeof(errstr));
- /* Failed to add a new rule to the filter, the error string is in errstr */
-}
-if (tep_filter_copy(filter1, filter) != 0) {
- /* Failed to copy filter in filter1 */
-}
-...
-if (tep_filter_compare(filter, filter1) != 1) {
- /* Both filters are different */
-}
-...
-void process_record(struct tep_handle *tep, struct tep_record *record)
-{
- struct tep_event *event;
- char *fstring;
-
- event = tep_find_event_by_record(tep, record);
-
- if (tep_event_filtered(filter, event->id) == 1) {
- /* The event has filter */
- fstring = tep_filter_make_string(filter, event->id);
- if (fstring != NULL) {
- /* The filter for the event is in fstring */
- free(fstring);
- }
- }
-
- switch (tep_filter_match(filter, record)) {
- case TEP_ERRNO__FILTER_MATCH:
- /* The filter matches the record */
- break;
- case TEP_ERRNO__FILTER_MISS:
- /* The filter does not match the record */
- break;
- case TEP_ERRNO__FILTER_NOT_FOUND:
- /* No filter found for record's event */
- break;
- case TEP_ERRNO__NO_FILTER:
- /* There are no rules in the filter */
- break
- default:
- /* An error occurred during the test */
- break;
- }
-
- if (tep_filter_remove_event(filter, event->id) == 1) {
- /* The event was removed from the filter */
- }
-}
-
-...
-tep_filter_reset(filter);
-...
-tep_filter_free(filter);
-tep_filter_free(filter1);
-...
---
-
-FILES
------
-[verse]
---
-*event-parse.h*
- Header file to include in order to have access to the library APIs.
-*-ltraceevent*
- Linker switch to add when building a program that uses the library.
---
-
-SEE ALSO
---------
-_libtraceevent(3)_, _trace-cmd(1)_
-
-AUTHOR
-------
-[verse]
---
-*Steven Rostedt* <[email protected]>, author of *libtraceevent*.
-*Tzvetomir Stoyanov* <[email protected]>, author of this man page.
---
-REPORTING BUGS
---------------
-Report bugs to <[email protected]>
-
-LICENSE
--------
-libtraceevent is Free Software licensed under the GNU LGPL 2.1
-
-RESOURCES
----------
-https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
diff --git a/tools/lib/traceevent/Documentation/libtraceevent-func_apis.txt b/tools/lib/traceevent/Documentation/libtraceevent-func_apis.txt
deleted file mode 100644
index f6aca0df2151..000000000000
--- a/tools/lib/traceevent/Documentation/libtraceevent-func_apis.txt
+++ /dev/null
@@ -1,183 +0,0 @@
-libtraceevent(3)
-================
-
-NAME
-----
-tep_find_function, tep_find_function_address, tep_set_function_resolver,
-tep_reset_function_resolver, tep_register_function, tep_register_print_string -
-function related tep APIs
-
-SYNOPSIS
---------
-[verse]
---
-*#include <event-parse.h>*
-
-typedef char pass:[*](*tep_func_resolver_t*)(void pass:[*]_priv_, unsigned long long pass:[*]_addrp_, char pass:[**]_modp_);
-int *tep_set_function_resolver*(struct tep_handle pass:[*]_tep_, tep_func_resolver_t pass:[*]_func_, void pass:[*]_priv_);
-void *tep_reset_function_resolver*(struct tep_handle pass:[*]_tep_);
-const char pass:[*]*tep_find_function*(struct tep_handle pass:[*]_tep_, unsigned long long _addr_);
-unsigned long long *tep_find_function_address*(struct tep_handle pass:[*]_tep_, unsigned long long _addr_);
-int *tep_register_function*(struct tep_handle pass:[*]_tep_, char pass:[*]_name_, unsigned long long _addr_, char pass:[*]_mod_);
-int *tep_register_print_string*(struct tep_handle pass:[*]_tep_, const char pass:[*]_fmt_, unsigned long long _addr_);
---
-
-DESCRIPTION
------------
-Some tools may have already a way to resolve the kernel functions. These APIs
-allow them to keep using it instead of duplicating all the entries inside.
-
-The _tep_func_resolver_t_ type is the prototype of the alternative kernel
-functions resolver. This function receives a pointer to its custom context
-(set with the _tep_set_function_resolver()_ call ) and the address of a kernel
-function, which has to be resolved. In case of success, it should return
-the name of the function and its module (if any) in _modp_.
-
-The _tep_set_function_resolver()_ function registers _func_ as an alternative
-kernel functions resolver. The _tep_ argument is trace event parser context.
-The _priv_ argument is a custom context of the _func_ function. The function
-resolver is used by the APIs _tep_find_function()_,
-_tep_find_function_address()_, and _tep_print_func_field()_ to resolve
-a function address to a function name.
-
-The _tep_reset_function_resolver()_ function resets the kernel functions
-resolver to the default function. The _tep_ argument is trace event parser
-context.
-
-
-These APIs can be used to find function name and start address, by given
-address. The given address does not have to be exact, it will select
-the function that would contain it.
-
-The _tep_find_function()_ function returns the function name, which contains the
-given address _addr_. The _tep_ argument is the trace event parser context.
-
-The _tep_find_function_address()_ function returns the function start address,
-by given address _addr_. The _addr_ does not have to be exact, it will select
-the function that would contain it. The _tep_ argument is the trace event
-parser context.
-
-The _tep_register_function()_ function registers a function name mapped to an
-address and (optional) module. This mapping is used in case the function tracer
-or events have "%pS" parameter in its format string. It is common to pass in
-the kallsyms function names with their corresponding addresses with this
-function. The _tep_ argument is the trace event parser context. The _name_ is
-the name of the function, the string is copied internally. The _addr_ is the
-start address of the function. The _mod_ is the kernel module the function may
-be in (NULL for none).
-
-The _tep_register_print_string()_ function registers a string by the address
-it was stored in the kernel. Some strings internal to the kernel with static
-address are passed to certain events. The "%s" in the event's format field
-which has an address needs to know what string would be at that address. The
-tep_register_print_string() supplies the parsing with the mapping between kernel
-addresses and those strings. The _tep_ argument is the trace event parser
-context. The _fmt_ is the string to register, it is copied internally.
-The _addr_ is the address the string was located at.
-
-
-RETURN VALUE
-------------
-The _tep_set_function_resolver()_ function returns 0 in case of success, or -1
-in case of an error.
-
-The _tep_find_function()_ function returns the function name, or NULL in case
-it cannot be found.
-
-The _tep_find_function_address()_ function returns the function start address,
-or 0 in case it cannot be found.
-
-The _tep_register_function()_ function returns 0 in case of success. In case of
-an error -1 is returned, and errno is set to the appropriate error number.
-
-The _tep_register_print_string()_ function returns 0 in case of success. In case
-of an error -1 is returned, and errno is set to the appropriate error number.
-
-EXAMPLE
--------
-[source,c]
---
-#include <event-parse.h>
-...
-struct tep_handle *tep = tep_alloc();
-...
-char *my_resolve_kernel_addr(void *context,
- unsigned long long *addrp, char **modp)
-{
- struct db *function_database = context;
- struct symbol *sym = sql_lookup(function_database, *addrp);
-
- if (!sym)
- return NULL;
-
- *modp = sym->module_name;
- return sym->name;
-}
-
-void show_function( unsigned long long addr)
-{
- unsigned long long fstart;
- const char *fname;
-
- if (tep_set_function_resolver(tep, my_resolve_kernel_addr,
- function_database) != 0) {
- /* failed to register my_resolve_kernel_addr */
- }
-
- /* These APIs use my_resolve_kernel_addr() to resolve the addr */
- fname = tep_find_function(tep, addr);
- fstart = tep_find_function_address(tep, addr);
-
- /*
- addr is in function named fname, starting at fstart address,
- at offset (addr - fstart)
- */
-
- tep_reset_function_resolver(tep);
-
-}
-...
- if (tep_register_function(tep, "kvm_exit",
- (unsigned long long) 0x12345678, "kvm") != 0) {
- /* Failed to register kvm_exit address mapping */
- }
-...
- if (tep_register_print_string(tep, "print string",
- (unsigned long long) 0x87654321, NULL) != 0) {
- /* Failed to register "print string" address mapping */
- }
-...
---
-
-FILES
------
-[verse]
---
-*event-parse.h*
- Header file to include in order to have access to the library APIs.
-*-ltraceevent*
- Linker switch to add when building a program that uses the library.
---
-
-SEE ALSO
---------
-_libtraceevent(3)_, _trace-cmd(1)_
-
-AUTHOR
-------
-[verse]
---
-*Steven Rostedt* <[email protected]>, author of *libtraceevent*.
-*Tzvetomir Stoyanov* <[email protected]>, author of this man page.
---
-REPORTING BUGS
---------------
-Report bugs to <[email protected]>
-
-LICENSE
--------
-libtraceevent is Free Software licensed under the GNU LGPL 2.1
-
-RESOURCES
----------
-https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
diff --git a/tools/lib/traceevent/Documentation/libtraceevent-func_find.txt b/tools/lib/traceevent/Documentation/libtraceevent-func_find.txt
deleted file mode 100644
index 04840e244445..000000000000
--- a/tools/lib/traceevent/Documentation/libtraceevent-func_find.txt
+++ /dev/null
@@ -1,88 +0,0 @@
-libtraceevent(3)
-================
-
-NAME
-----
-tep_find_function,tep_find_function_address - Find function name / start address.
-
-SYNOPSIS
---------
-[verse]
---
-*#include <event-parse.h>*
-
-const char pass:[*]*tep_find_function*(struct tep_handle pass:[*]_tep_, unsigned long long _addr_);
-unsigned long long *tep_find_function_address*(struct tep_handle pass:[*]_tep_, unsigned long long _addr_);
---
-
-DESCRIPTION
------------
-These functions can be used to find function name and start address, by given
-address. The given address does not have to be exact, it will select the function
-that would contain it.
-
-The _tep_find_function()_ function returns the function name, which contains the
-given address _addr_. The _tep_ argument is the trace event parser context.
-
-The _tep_find_function_address()_ function returns the function start address,
-by given address _addr_. The _addr_ does not have to be exact, it will select the
-function that would contain it. The _tep_ argument is the trace event parser context.
-
-RETURN VALUE
-------------
-The _tep_find_function()_ function returns the function name, or NULL in case
-it cannot be found.
-
-The _tep_find_function_address()_ function returns the function start address,
-or 0 in case it cannot be found.
-
-EXAMPLE
--------
-[source,c]
---
-#include <event-parse.h>
-...
-struct tep_handle *tep = tep_alloc();
-...
-void show_function( unsigned long long addr)
-{
- const char *fname = tep_find_function(tep, addr);
- unsigned long long fstart = tep_find_function_address(tep, addr);
-
- /* addr is in function named fname, starting at fstart address, at offset (addr - fstart) */
-}
-...
---
-
-FILES
------
-[verse]
---
-*event-parse.h*
- Header file to include in order to have access to the library APIs.
-*-ltraceevent*
- Linker switch to add when building a program that uses the library.
---
-
-SEE ALSO
---------
-_libtraceevent(3)_, _trace-cmd(1)_
-
-AUTHOR
-------
-[verse]
---
-*Steven Rostedt* <[email protected]>, author of *libtraceevent*.
-*Tzvetomir Stoyanov* <[email protected]>, author of this man page.
---
-REPORTING BUGS
---------------
-Report bugs to <[email protected]>
-
-LICENSE
--------
-libtraceevent is Free Software licensed under the GNU LGPL 2.1
-
-RESOURCES
----------
-https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
diff --git a/tools/lib/traceevent/Documentation/libtraceevent-handle.txt b/tools/lib/traceevent/Documentation/libtraceevent-handle.txt
deleted file mode 100644
index 45b20172e262..000000000000
--- a/tools/lib/traceevent/Documentation/libtraceevent-handle.txt
+++ /dev/null
@@ -1,101 +0,0 @@
-libtraceevent(3)
-================
-
-NAME
-----
-tep_alloc, tep_free,tep_ref, tep_unref,tep_get_ref - Create, destroy, manage
-references of trace event parser context.
-
-SYNOPSIS
---------
-[verse]
---
-*#include <event-parse.h>*
-
-struct tep_handle pass:[*]*tep_alloc*(void);
-void *tep_free*(struct tep_handle pass:[*]_tep_);
-void *tep_ref*(struct tep_handle pass:[*]_tep_);
-void *tep_unref*(struct tep_handle pass:[*]_tep_);
-int *tep_get_ref*(struct tep_handle pass:[*]_tep_);
---
-
-DESCRIPTION
------------
-These are the main functions to create and destroy tep_handle - the main
-structure, representing the trace event parser context. This context is used as
-the input parameter of most library APIs.
-
-The _tep_alloc()_ function allocates and initializes the tep context.
-
-The _tep_free()_ function will decrement the reference of the _tep_ handler.
-When there is no more references, then it will free the handler, as well
-as clean up all its resources that it had used. The argument _tep_ is
-the pointer to the trace event parser context.
-
-The _tep_ref()_ function adds a reference to the _tep_ handler.
-
-The _tep_unref()_ function removes a reference from the _tep_ handler. When
-the last reference is removed, the _tep_ is destroyed, and all resources that
-it had used are cleaned up.
-
-The _tep_ref_get()_ functions gets the current references of the _tep_ handler.
-
-RETURN VALUE
-------------
-_tep_alloc()_ returns a pointer to a newly created tep_handle structure.
-NULL is returned in case there is not enough free memory to allocate it.
-
-_tep_ref_get()_ returns the current references of _tep_.
-If _tep_ is NULL, 0 is returned.
-
-EXAMPLE
--------
-[source,c]
---
-#include <event-parse.h>
-
-...
-struct tep_handle *tep = tep_alloc();
-...
-int ref = tep_get_ref(tep);
-tep_ref(tep);
-if ( (ref+1) != tep_get_ref(tep)) {
- /* Something wrong happened, the counter is not incremented by 1 */
-}
-tep_unref(tep);
-...
-tep_free(tep);
-...
---
-FILES
------
-[verse]
---
-*event-parse.h*
- Header file to include in order to have access to the library APIs.
-*-ltraceevent*
- Linker switch to add when building a program that uses the library.
---
-
-SEE ALSO
---------
-_libtraceevent(3)_, _trace-cmd(1)_
-
-AUTHOR
-------
-[verse]
---
-*Steven Rostedt* <[email protected]>, author of *libtraceevent*.
-*Tzvetomir Stoyanov* <[email protected]>, author of this man page.
---
-REPORTING BUGS
---------------
-Report bugs to <[email protected]>
-
-LICENSE
--------
-libtraceevent is Free Software licensed under the GNU LGPL 2.1
-
-RESOURCES
----------
-https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
diff --git a/tools/lib/traceevent/Documentation/libtraceevent-header_page.txt b/tools/lib/traceevent/Documentation/libtraceevent-header_page.txt
deleted file mode 100644
index 615d117dc39f..000000000000
--- a/tools/lib/traceevent/Documentation/libtraceevent-header_page.txt
+++ /dev/null
@@ -1,102 +0,0 @@
-libtraceevent(3)
-================
-
-NAME
-----
-tep_get_header_page_size, tep_get_header_timestamp_size, tep_is_old_format -
-Get the data stored in the header page, in kernel context.
-
-SYNOPSIS
---------
-[verse]
---
-*#include <event-parse.h>*
-
-int *tep_get_header_page_size*(struct tep_handle pass:[*]_tep_);
-int *tep_get_header_timestamp_size*(struct tep_handle pass:[*]_tep_);
-bool *tep_is_old_format*(struct tep_handle pass:[*]_tep_);
---
-DESCRIPTION
------------
-These functions retrieve information from kernel context, stored in tracefs
-events/header_page. Old kernels do not have header page info, so default values
-from user space context are used.
-
-The _tep_get_header_page_size()_ function returns the size of a long integer,
-in kernel context. The _tep_ argument is trace event parser context.
-This information is retrieved from tracefs events/header_page, "commit" field.
-
-The _tep_get_header_timestamp_size()_ function returns the size of timestamps,
-in kernel context. The _tep_ argument is trace event parser context. This
-information is retrieved from tracefs events/header_page, "timestamp" field.
-
-The _tep_is_old_format()_ function returns true if the kernel predates
-the addition of events/header_page, otherwise it returns false.
-
-RETURN VALUE
-------------
-The _tep_get_header_page_size()_ function returns the size of a long integer,
-in bytes.
-
-The _tep_get_header_timestamp_size()_ function returns the size of timestamps,
-in bytes.
-
-The _tep_is_old_format()_ function returns true, if an old kernel is used to
-generate the tracing data, which has no event/header_page. If the kernel is new,
-or _tep_ is NULL, false is returned.
-
-EXAMPLE
--------
-[source,c]
---
-#include <event-parse.h>
-...
-struct tep_handle *tep = tep_alloc();
-...
- int longsize;
- int timesize;
- bool old;
-
- longsize = tep_get_header_page_size(tep);
- timesize = tep_get_header_timestamp_size(tep);
- old = tep_is_old_format(tep);
-
- printf ("%s kernel is used to generate the tracing data.\n",
- old?"Old":"New");
- printf("The size of a long integer is %d bytes.\n", longsize);
- printf("The timestamps size is %d bytes.\n", timesize);
-...
---
-
-FILES
------
-[verse]
---
-*event-parse.h*
- Header file to include in order to have access to the library APIs.
-*-ltraceevent*
- Linker switch to add when building a program that uses the library.
---
-
-SEE ALSO
---------
-_libtraceevent(3)_, _trace-cmd(1)_
-
-AUTHOR
-------
-[verse]
---
-*Steven Rostedt* <[email protected]>, author of *libtraceevent*.
-*Tzvetomir Stoyanov* <[email protected]>, author of this man page.
---
-REPORTING BUGS
---------------
-Report bugs to <[email protected]>
-
-LICENSE
--------
-libtraceevent is Free Software licensed under the GNU LGPL 2.1
-
-RESOURCES
----------
-https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
diff --git a/tools/lib/traceevent/Documentation/libtraceevent-host_endian.txt b/tools/lib/traceevent/Documentation/libtraceevent-host_endian.txt
deleted file mode 100644
index d5d375eb8d1e..000000000000
--- a/tools/lib/traceevent/Documentation/libtraceevent-host_endian.txt
+++ /dev/null
@@ -1,104 +0,0 @@
-libtraceevent(3)
-================
-
-NAME
-----
-tep_is_bigendian, tep_is_local_bigendian, tep_set_local_bigendian - Get / set
-the endianness of the local machine.
-
-SYNOPSIS
---------
-[verse]
---
-*#include <event-parse.h>*
-
-enum *tep_endian* {
- TEP_LITTLE_ENDIAN = 0,
- TEP_BIG_ENDIAN
-};
-
-int *tep_is_bigendian*(void);
-bool *tep_is_local_bigendian*(struct tep_handle pass:[*]_tep_);
-void *tep_set_local_bigendian*(struct tep_handle pass:[*]_tep_, enum tep_endian _endian_);
---
-
-DESCRIPTION
------------
-
-The _tep_is_bigendian()_ gets the endianness of the machine, executing
-the function.
-
-The _tep_is_local_bigendian()_ function gets the endianness of the local
-machine, saved in the _tep_ handler. The _tep_ argument is the trace event
-parser context. This API is a bit faster than _tep_is_bigendian()_, as it
-returns cached endianness of the local machine instead of checking it each time.
-
-The _tep_set_local_bigendian()_ function sets the endianness of the local
-machine in the _tep_ handler. The _tep_ argument is trace event parser context.
-The _endian_ argument is the endianness:
-[verse]
---
- _TEP_LITTLE_ENDIAN_ - the machine is little endian,
- _TEP_BIG_ENDIAN_ - the machine is big endian.
---
-
-RETURN VALUE
-------------
-The _tep_is_bigendian()_ function returns non zero if the endianness of the
-machine, executing the code, is big endian and zero otherwise.
-
-The _tep_is_local_bigendian()_ function returns true, if the endianness of the
-local machine, saved in the _tep_ handler, is big endian, or false otherwise.
-
-EXAMPLE
--------
-[source,c]
---
-#include <event-parse.h>
-...
-struct tep_handle *tep = tep_alloc();
-...
- if (tep_is_bigendian())
- tep_set_local_bigendian(tep, TEP_BIG_ENDIAN);
- else
- tep_set_local_bigendian(tep, TEP_LITTLE_ENDIAN);
-...
- if (tep_is_local_bigendian(tep))
- printf("This machine you are running on is bigendian\n");
- else
- printf("This machine you are running on is little endian\n");
-
---
-
-FILES
------
-[verse]
---
-*event-parse.h*
- Header file to include in order to have access to the library APIs.
-*-ltraceevent*
- Linker switch to add when building a program that uses the library.
---
-
-SEE ALSO
---------
-_libtraceevent(3)_, _trace-cmd(1)_
-
-AUTHOR
-------
-[verse]
---
-*Steven Rostedt* <[email protected]>, author of *libtraceevent*.
-*Tzvetomir Stoyanov* <[email protected]>, author of this man page.
---
-REPORTING BUGS
---------------
-Report bugs to <[email protected]>
-
-LICENSE
--------
-libtraceevent is Free Software licensed under the GNU LGPL 2.1
-
-RESOURCES
----------
-https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
diff --git a/tools/lib/traceevent/Documentation/libtraceevent-long_size.txt b/tools/lib/traceevent/Documentation/libtraceevent-long_size.txt
deleted file mode 100644
index 01d78ea2519a..000000000000
--- a/tools/lib/traceevent/Documentation/libtraceevent-long_size.txt
+++ /dev/null
@@ -1,78 +0,0 @@
-libtraceevent(3)
-================
-
-NAME
-----
-tep_get_long_size, tep_set_long_size - Get / set the size of a long integer on
-the machine, where the trace is generated, in bytes
-
-SYNOPSIS
---------
-[verse]
---
-*#include <event-parse.h>*
-
-int *tep_get_long_size*(strucqt tep_handle pass:[*]_tep_);
-void *tep_set_long_size*(struct tep_handle pass:[*]_tep_, int _long_size_);
---
-
-DESCRIPTION
------------
-The _tep_get_long_size()_ function returns the size of a long integer on the machine,
-where the trace is generated. The _tep_ argument is trace event parser context.
-
-The _tep_set_long_size()_ function sets the size of a long integer on the machine,
-where the trace is generated. The _tep_ argument is trace event parser context.
-The _long_size_ is the size of a long integer, in bytes.
-
-RETURN VALUE
-------------
-The _tep_get_long_size()_ function returns the size of a long integer on the machine,
-where the trace is generated, in bytes.
-
-EXAMPLE
--------
-[source,c]
---
-#include <event-parse.h>
-...
-struct tep_handle *tep = tep_alloc();
-...
-tep_set_long_size(tep, 4);
-...
-int long_size = tep_get_long_size(tep);
-...
---
-
-FILES
------
-[verse]
---
-*event-parse.h*
- Header file to include in order to have access to the library APIs.
-*-ltraceevent*
- Linker switch to add when building a program that uses the library.
---
-
-SEE ALSO
---------
-_libtraceevent(3)_, _trace-cmd(1)_
-
-AUTHOR
-------
-[verse]
---
-*Steven Rostedt* <[email protected]>, author of *libtraceevent*.
-*Tzvetomir Stoyanov* <[email protected]>, author of this man page.
---
-REPORTING BUGS
---------------
-Report bugs to <[email protected]>
-
-LICENSE
--------
-libtraceevent is Free Software licensed under the GNU LGPL 2.1
-
-RESOURCES
----------
-https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
diff --git a/tools/lib/traceevent/Documentation/libtraceevent-page_size.txt b/tools/lib/traceevent/Documentation/libtraceevent-page_size.txt
deleted file mode 100644
index 452c0cfa1822..000000000000
--- a/tools/lib/traceevent/Documentation/libtraceevent-page_size.txt
+++ /dev/null
@@ -1,82 +0,0 @@
-libtraceevent(3)
-================
-
-NAME
-----
-tep_get_page_size, tep_set_page_size - Get / set the size of a memory page on
-the machine, where the trace is generated
-
-SYNOPSIS
---------
-[verse]
---
-*#include <event-parse.h>*
-
-int *tep_get_page_size*(struct tep_handle pass:[*]_tep_);
-void *tep_set_page_size*(struct tep_handle pass:[*]_tep_, int _page_size_);
---
-
-DESCRIPTION
------------
-The _tep_get_page_size()_ function returns the size of a memory page on
-the machine, where the trace is generated. The _tep_ argument is trace
-event parser context.
-
-The _tep_set_page_size()_ function stores in the _tep_ context the size of a
-memory page on the machine, where the trace is generated.
-The _tep_ argument is trace event parser context.
-The _page_size_ argument is the size of a memory page, in bytes.
-
-RETURN VALUE
-------------
-The _tep_get_page_size()_ function returns size of the memory page, in bytes.
-
-EXAMPLE
--------
-[source,c]
---
-#include <unistd.h>
-#include <event-parse.h>
-...
-struct tep_handle *tep = tep_alloc();
-...
- int page_size = getpagesize();
-
- tep_set_page_size(tep, page_size);
-
- printf("The page size for this machine is %d\n", tep_get_page_size(tep));
-
---
-
-FILES
------
-[verse]
---
-*event-parse.h*
- Header file to include in order to have access to the library APIs.
-*-ltraceevent*
- Linker switch to add when building a program that uses the library.
---
-
-SEE ALSO
---------
-_libtraceevent(3)_, _trace-cmd(1)_
-
-AUTHOR
-------
-[verse]
---
-*Steven Rostedt* <[email protected]>, author of *libtraceevent*.
-*Tzvetomir Stoyanov* <[email protected]>, author of this man page.
---
-REPORTING BUGS
---------------
-Report bugs to <[email protected]>
-
-LICENSE
--------
-libtraceevent is Free Software licensed under the GNU LGPL 2.1
-
-RESOURCES
----------
-https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
diff --git a/tools/lib/traceevent/Documentation/libtraceevent-parse_event.txt b/tools/lib/traceevent/Documentation/libtraceevent-parse_event.txt
deleted file mode 100644
index f248114ca1ff..000000000000
--- a/tools/lib/traceevent/Documentation/libtraceevent-parse_event.txt
+++ /dev/null
@@ -1,90 +0,0 @@
-libtraceevent(3)
-================
-
-NAME
-----
-tep_parse_event, tep_parse_format - Parse the event format information
-
-SYNOPSIS
---------
-[verse]
---
-*#include <event-parse.h>*
-
-enum tep_errno *tep_parse_event*(struct tep_handle pass:[*]_tep_, const char pass:[*]_buf_, unsigned long _size_, const char pass:[*]_sys_);
-enum tep_errno *tep_parse_format*(struct tep_handle pass:[*]_tep_, struct tep_event pass:[*]pass:[*]_eventp_, const char pass:[*]_buf_, unsigned long _size_, const char pass:[*]_sys_);
---
-
-DESCRIPTION
------------
-The _tep_parse_event()_ function parses the event format and creates an event
-structure to quickly parse raw data for a given event. The _tep_ argument is
-the trace event parser context. The created event structure is stored in the
-_tep_ context. The _buf_ argument is a buffer with _size_, where the event
-format data is. The event format data can be taken from
-tracefs/events/.../.../format files. The _sys_ argument is the system of
-the event.
-
-The _tep_parse_format()_ function does the same as _tep_parse_event()_. The only
-difference is in the extra _eventp_ argument, where the newly created event
-structure is returned.
-
-RETURN VALUE
-------------
-Both _tep_parse_event()_ and _tep_parse_format()_ functions return 0 on success,
-or TEP_ERRNO__... in case of an error.
-
-EXAMPLE
--------
-[source,c]
---
-#include <event-parse.h>
-...
-struct tep_handle *tep = tep_alloc();
-...
-char *buf;
-int size;
-struct tep_event *event = NULL;
-buf = read_file("/sys/kernel/tracing/events/ftrace/print/format", &size);
-if (tep_parse_event(tep, buf, size, "ftrace") != 0) {
- /* Failed to parse the ftrace print format */
-}
-
-if (tep_parse_format(tep, &event, buf, size, "ftrace") != 0) {
- /* Failed to parse the ftrace print format */
-}
-...
---
-
-FILES
------
-[verse]
---
-*event-parse.h*
- Header file to include in order to have access to the library APIs.
-*-ltraceevent*
- Linker switch to add when building a program that uses the library.
---
-
-SEE ALSO
---------
-_libtraceevent(3)_, _trace-cmd(1)_
-
-AUTHOR
-------
-[verse]
---
-*Steven Rostedt* <[email protected]>, author of *libtraceevent*.
-*Tzvetomir Stoyanov* <[email protected]>, author of this man page.
---
-REPORTING BUGS
---------------
-Report bugs to <[email protected]>
-
-LICENSE
--------
-libtraceevent is Free Software licensed under the GNU LGPL 2.1
-
-RESOURCES
----------
-https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
diff --git a/tools/lib/traceevent/Documentation/libtraceevent-parse_head.txt b/tools/lib/traceevent/Documentation/libtraceevent-parse_head.txt
deleted file mode 100644
index c90f16c7d8e6..000000000000
--- a/tools/lib/traceevent/Documentation/libtraceevent-parse_head.txt
+++ /dev/null
@@ -1,82 +0,0 @@
-libtraceevent(3)
-================
-
-NAME
-----
-tep_parse_header_page - Parses the data stored in the header page.
-
-SYNOPSIS
---------
-[verse]
---
-*#include <event-parse.h>*
-
-int *tep_parse_header_page*(struct tep_handle pass:[*]_tep_, char pass:[*]_buf_, unsigned long _size_, int _long_size_);
---
-
-DESCRIPTION
------------
-The _tep_parse_header_page()_ function parses the header page data from _buf_,
-and initializes the _tep_, trace event parser context, with it. The buffer
-_buf_ is with _size_, and is supposed to be copied from
-tracefs/events/header_page.
-
-Some old kernels do not have header page info, in this case the
-_tep_parse_header_page()_ function can be called with _size_ equal to 0. The
-_tep_ context is initialized with default values. The _long_size_ can be used in
-this use case, to set the size of a long integer to be used.
-
-RETURN VALUE
-------------
-The _tep_parse_header_page()_ function returns 0 in case of success, or -1
-in case of an error.
-
-EXAMPLE
--------
-[source,c]
---
-#include <event-parse.h>
-...
-struct tep_handle *tep = tep_alloc();
-...
-char *buf;
-int size;
-buf = read_file("/sys/kernel/tracing/events/header_page", &size);
-if (tep_parse_header_page(tep, buf, size, sizeof(unsigned long)) != 0) {
- /* Failed to parse the header page */
-}
-...
---
-
-FILES
------
-[verse]
---
-*event-parse.h*
- Header file to include in order to have access to the library APIs.
-*-ltraceevent*
- Linker switch to add when building a program that uses the library.
---
-
-SEE ALSO
---------
-_libtraceevent(3)_, _trace-cmd(1)_
-
-AUTHOR
-------
-[verse]
---
-*Steven Rostedt* <[email protected]>, author of *libtraceevent*.
-*Tzvetomir Stoyanov* <[email protected]>, author of this man page.
---
-REPORTING BUGS
---------------
-Report bugs to <[email protected]>
-
-LICENSE
--------
-libtraceevent is Free Software licensed under the GNU LGPL 2.1
-
-RESOURCES
----------
-https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
diff --git a/tools/lib/traceevent/Documentation/libtraceevent-plugins.txt b/tools/lib/traceevent/Documentation/libtraceevent-plugins.txt
deleted file mode 100644
index 4d6394397d92..000000000000
--- a/tools/lib/traceevent/Documentation/libtraceevent-plugins.txt
+++ /dev/null
@@ -1,122 +0,0 @@
-libtraceevent(3)
-================
-
-NAME
-----
-tep_load_plugins, tep_unload_plugins, tep_load_plugins_hook - Load / unload traceevent plugins.
-
-SYNOPSIS
---------
-[verse]
---
-*#include <event-parse.h>*
-
-struct tep_plugin_list pass:[*]*tep_load_plugins*(struct tep_handle pass:[*]_tep_);
-void *tep_unload_plugins*(struct tep_plugin_list pass:[*]_plugin_list_, struct tep_handle pass:[*]_tep_);
-void *tep_load_plugins_hook*(struct tep_handle pass:[*]_tep_, const char pass:[*]_suffix_,
- void (pass:[*]_load_plugin_)(struct tep_handle pass:[*]tep,
- const char pass:[*]path,
- const char pass:[*]name,
- void pass:[*]data),
- void pass:[*]_data_);
---
-
-DESCRIPTION
------------
-The _tep_load_plugins()_ function loads all plugins, located in the plugin
-directories. The _tep_ argument is trace event parser context.
-The plugin directories are :
-[verse]
---
- - Directories, specified in _tep_->plugins_dir with priority TEP_PLUGIN_FIRST
- - System's plugin directory, defined at the library compile time. It
- depends on the library installation prefix and usually is
- _(install_preffix)/lib/traceevent/plugins_
- - Directory, defined by the environment variable _TRACEEVENT_PLUGIN_DIR_
- - User's plugin directory, located at _~/.local/lib/traceevent/plugins_
- - Directories, specified in _tep_->plugins_dir with priority TEP_PLUGIN_LAST
---
-Loading of plugins can be controlled by the _tep_flags_, using the
-_tep_set_flag()_ API:
-[verse]
---
- _TEP_DISABLE_SYS_PLUGINS_ - do not load plugins, located in
- the system's plugin directory.
- _TEP_DISABLE_PLUGINS_ - do not load any plugins.
---
-The _tep_set_flag()_ API needs to be called before _tep_load_plugins()_, if
-loading of all plugins is not the desired case.
-
-The _tep_unload_plugins()_ function unloads the plugins, previously loaded by
-_tep_load_plugins()_. The _tep_ argument is trace event parser context. The
-_plugin_list_ is the list of loaded plugins, returned by
-the _tep_load_plugins()_ function.
-
-The _tep_load_plugins_hook_ function walks through all directories with plugins
-and calls user specified _load_plugin()_ hook for each plugin file. Only files
-with given _suffix_ are considered to be plugins. The _data_ is a user specified
-context, passed to _load_plugin()_. Directories and the walk order are the same
-as in _tep_load_plugins()_ API.
-
-RETURN VALUE
-------------
-The _tep_load_plugins()_ function returns a list of successfully loaded plugins,
-or NULL in case no plugins are loaded.
-
-EXAMPLE
--------
-[source,c]
---
-#include <event-parse.h>
-...
-struct tep_handle *tep = tep_alloc();
-...
-struct tep_plugin_list *plugins = tep_load_plugins(tep);
-if (plugins == NULL) {
- /* no plugins are loaded */
-}
-...
-tep_unload_plugins(plugins, tep);
-...
-void print_plugin(struct tep_handle *tep, const char *path,
- const char *name, void *data)
-{
- pritnf("Found libtraceevent plugin %s/%s\n", path, name);
-}
-...
-tep_load_plugins_hook(tep, ".so", print_plugin, NULL);
-...
---
-
-FILES
------
-[verse]
---
-*event-parse.h*
- Header file to include in order to have access to the library APIs.
-*-ltraceevent*
- Linker switch to add when building a program that uses the library.
---
-
-SEE ALSO
---------
-_libtraceevent(3)_, _trace-cmd(1)_, _tep_set_flag(3)_
-
-AUTHOR
-------
-[verse]
---
-*Steven Rostedt* <[email protected]>, author of *libtraceevent*.
-*Tzvetomir Stoyanov* <[email protected]>, author of this man page.
---
-REPORTING BUGS
---------------
-Report bugs to <[email protected]>
-
-LICENSE
--------
-libtraceevent is Free Software licensed under the GNU LGPL 2.1
-
-RESOURCES
----------
-https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
diff --git a/tools/lib/traceevent/Documentation/libtraceevent-record_parse.txt b/tools/lib/traceevent/Documentation/libtraceevent-record_parse.txt
deleted file mode 100644
index e9a69116c78b..000000000000
--- a/tools/lib/traceevent/Documentation/libtraceevent-record_parse.txt
+++ /dev/null
@@ -1,137 +0,0 @@
-libtraceevent(3)
-================
-
-NAME
-----
-tep_data_type, tep_data_pid,tep_data_preempt_count, tep_data_flags -
-Extract common fields from a record.
-
-SYNOPSIS
---------
-[verse]
---
-*#include <event-parse.h>*
-
-enum *trace_flag_type* {
- _TRACE_FLAG_IRQS_OFF_,
- _TRACE_FLAG_IRQS_NOSUPPORT_,
- _TRACE_FLAG_NEED_RESCHED_,
- _TRACE_FLAG_HARDIRQ_,
- _TRACE_FLAG_SOFTIRQ_,
-};
-
-int *tep_data_type*(struct tep_handle pass:[*]_tep_, struct tep_record pass:[*]_rec_);
-int *tep_data_pid*(struct tep_handle pass:[*]_tep_, struct tep_record pass:[*]_rec_);
-int *tep_data_preempt_count*(struct tep_handle pass:[*]_tep_, struct tep_record pass:[*]_rec_);
-int *tep_data_flags*(struct tep_handle pass:[*]_tep_, struct tep_record pass:[*]_rec_);
---
-
-DESCRIPTION
------------
-This set of functions can be used to extract common fields from a record.
-
-The _tep_data_type()_ function gets the event id from the record _rec_.
-It reads the "common_type" field. The _tep_ argument is the trace event parser
-context.
-
-The _tep_data_pid()_ function gets the process id from the record _rec_.
-It reads the "common_pid" field. The _tep_ argument is the trace event parser
-context.
-
-The _tep_data_preempt_count()_ function gets the preemption count from the
-record _rec_. It reads the "common_preempt_count" field. The _tep_ argument is
-the trace event parser context.
-
-The _tep_data_flags()_ function gets the latency flags from the record _rec_.
-It reads the "common_flags" field. The _tep_ argument is the trace event parser
-context. Supported latency flags are:
-[verse]
---
- _TRACE_FLAG_IRQS_OFF_, Interrupts are disabled.
- _TRACE_FLAG_IRQS_NOSUPPORT_, Reading IRQ flag is not supported by the architecture.
- _TRACE_FLAG_NEED_RESCHED_, Task needs rescheduling.
- _TRACE_FLAG_HARDIRQ_, Hard IRQ is running.
- _TRACE_FLAG_SOFTIRQ_, Soft IRQ is running.
---
-
-RETURN VALUE
-------------
-The _tep_data_type()_ function returns an integer, representing the event id.
-
-The _tep_data_pid()_ function returns an integer, representing the process id
-
-The _tep_data_preempt_count()_ function returns an integer, representing the
-preemption count.
-
-The _tep_data_flags()_ function returns an integer, representing the latency
-flags. Look at the _trace_flag_type_ enum for supported flags.
-
-All these functions in case of an error return a negative integer.
-
-EXAMPLE
--------
-[source,c]
---
-#include <event-parse.h>
-...
-struct tep_handle *tep = tep_alloc();
-...
-void process_record(struct tep_record *record)
-{
- int data;
-
- data = tep_data_type(tep, record);
- if (data >= 0) {
- /* Got the ID of the event */
- }
-
- data = tep_data_pid(tep, record);
- if (data >= 0) {
- /* Got the process ID */
- }
-
- data = tep_data_preempt_count(tep, record);
- if (data >= 0) {
- /* Got the preemption count */
- }
-
- data = tep_data_flags(tep, record);
- if (data >= 0) {
- /* Got the latency flags */
- }
-}
-...
---
-
-FILES
------
-[verse]
---
-*event-parse.h*
- Header file to include in order to have access to the library APIs.
-*-ltraceevent*
- Linker switch to add when building a program that uses the library.
---
-
-SEE ALSO
---------
-_libtraceevent(3)_, _trace-cmd(1)_
-
-AUTHOR
-------
-[verse]
---
-*Steven Rostedt* <[email protected]>, author of *libtraceevent*.
-*Tzvetomir Stoyanov* <[email protected]>, author of this man page.
---
-REPORTING BUGS
---------------
-Report bugs to <[email protected]>
-
-LICENSE
--------
-libtraceevent is Free Software licensed under the GNU LGPL 2.1
-
-RESOURCES
----------
-https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
diff --git a/tools/lib/traceevent/Documentation/libtraceevent-reg_event_handler.txt b/tools/lib/traceevent/Documentation/libtraceevent-reg_event_handler.txt
deleted file mode 100644
index 53d37d72a1c1..000000000000
--- a/tools/lib/traceevent/Documentation/libtraceevent-reg_event_handler.txt
+++ /dev/null
@@ -1,156 +0,0 @@
-libtraceevent(3)
-================
-
-NAME
-----
-tep_register_event_handler, tep_unregister_event_handler - Register /
-unregisters a callback function to parse an event information.
-
-SYNOPSIS
---------
-[verse]
---
-*#include <event-parse.h>*
-
-enum *tep_reg_handler* {
- _TEP_REGISTER_SUCCESS_,
- _TEP_REGISTER_SUCCESS_OVERWRITE_,
-};
-
-int *tep_register_event_handler*(struct tep_handle pass:[*]_tep_, int _id_, const char pass:[*]_sys_name_, const char pass:[*]_event_name_, tep_event_handler_func _func_, void pass:[*]_context_);
-int *tep_unregister_event_handler*(struct tep_handle pass:[*]tep, int id, const char pass:[*]sys_name, const char pass:[*]event_name, tep_event_handler_func func, void pass:[*]_context_);
-
-typedef int (*pass:[*]tep_event_handler_func*)(struct trace_seq pass:[*]s, struct tep_record pass:[*]record, struct tep_event pass:[*]event, void pass:[*]context);
---
-
-DESCRIPTION
------------
-The _tep_register_event_handler()_ function registers a handler function,
-which is going to be called to parse the information for a given event.
-The _tep_ argument is the trace event parser context. The _id_ argument is
-the id of the event. The _sys_name_ argument is the name of the system,
-the event belongs to. The _event_name_ argument is the name of the event.
-If _id_ is >= 0, it is used to find the event, otherwise _sys_name_ and
-_event_name_ are used. The _func_ is a pointer to the function, which is going
-to be called to parse the event information. The _context_ argument is a pointer
-to the context data, which will be passed to the _func_. If a handler function
-for the same event is already registered, it will be overridden with the new
-one. This mechanism allows a developer to override the parsing of a given event.
-If for some reason the default print format is not sufficient, the developer
-can register a function for an event to be used to parse the data instead.
-
-The _tep_unregister_event_handler()_ function unregisters the handler function,
-previously registered with _tep_register_event_handler()_. The _tep_ argument
-is the trace event parser context. The _id_, _sys_name_, _event_name_, _func_,
-and _context_ are the same arguments, as when the callback function _func_ was
-registered.
-
-The _tep_event_handler_func_ is the type of the custom event handler
-function. The _s_ argument is the trace sequence, it can be used to create a
-custom string, describing the event. A _record_ to get the event from is passed
-as input parameter and also the _event_ - the handle to the record's event. The
-_context_ is custom context, set when the custom event handler is registered.
-
-RETURN VALUE
-------------
-The _tep_register_event_handler()_ function returns _TEP_REGISTER_SUCCESS_
-if the new handler is registered successfully or
-_TEP_REGISTER_SUCCESS_OVERWRITE_ if an existing handler is overwritten.
-If there is not enough memory to complete the registration,
-TEP_ERRNO__MEM_ALLOC_FAILED is returned.
-
-The _tep_unregister_event_handler()_ function returns 0 if _func_ was removed
-successful or, -1 if the event was not found.
-
-The _tep_event_handler_func_ should return -1 in case of an error,
-or 0 otherwise.
-
-EXAMPLE
--------
-[source,c]
---
-#include <event-parse.h>
-#include <trace-seq.h>
-...
-struct tep_handle *tep = tep_alloc();
-...
-int timer_expire_handler(struct trace_seq *s, struct tep_record *record,
- struct tep_event *event, void *context)
-{
- trace_seq_printf(s, "hrtimer=");
-
- if (tep_print_num_field(s, "0x%llx", event, "timer", record, 0) == -1)
- tep_print_num_field(s, "0x%llx", event, "hrtimer", record, 1);
-
- trace_seq_printf(s, " now=");
-
- tep_print_num_field(s, "%llu", event, "now", record, 1);
-
- tep_print_func_field(s, " function=%s", event, "function", record, 0);
-
- return 0;
-}
-...
- int ret;
-
- ret = tep_register_event_handler(tep, -1, "timer", "hrtimer_expire_entry",
- timer_expire_handler, NULL);
- if (ret < 0) {
- char buf[32];
-
- tep_strerror(tep, ret, buf, 32)
- printf("Failed to register handler for hrtimer_expire_entry: %s\n", buf);
- } else {
- switch (ret) {
- case TEP_REGISTER_SUCCESS:
- printf ("Registered handler for hrtimer_expire_entry\n");
- break;
- case TEP_REGISTER_SUCCESS_OVERWRITE:
- printf ("Overwrote handler for hrtimer_expire_entry\n");
- break;
- }
- }
-...
- ret = tep_unregister_event_handler(tep, -1, "timer", "hrtimer_expire_entry",
- timer_expire_handler, NULL);
- if ( ret )
- printf ("Failed to unregister handler for hrtimer_expire_entry\n");
-
---
-
-FILES
------
-[verse]
---
-*event-parse.h*
- Header file to include in order to have access to the library APIs.
-*trace-seq.h*
- Header file to include in order to have access to trace sequences
- related APIs. Trace sequences are used to allow a function to call
- several other functions to create a string of data to use.
-*-ltraceevent*
- Linker switch to add when building a program that uses the library.
---
-
-SEE ALSO
---------
-_libtraceevent(3)_, _trace-cmd(1)_
-
-AUTHOR
-------
-[verse]
---
-*Steven Rostedt* <[email protected]>, author of *libtraceevent*.
-*Tzvetomir Stoyanov* <[email protected]>, author of this man page.
---
-REPORTING BUGS
---------------
-Report bugs to <[email protected]>
-
-LICENSE
--------
-libtraceevent is Free Software licensed under the GNU LGPL 2.1
-
-RESOURCES
----------
-https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
diff --git a/tools/lib/traceevent/Documentation/libtraceevent-reg_print_func.txt b/tools/lib/traceevent/Documentation/libtraceevent-reg_print_func.txt
deleted file mode 100644
index 708dce91ebd8..000000000000
--- a/tools/lib/traceevent/Documentation/libtraceevent-reg_print_func.txt
+++ /dev/null
@@ -1,155 +0,0 @@
-libtraceevent(3)
-================
-
-NAME
-----
-tep_register_print_function,tep_unregister_print_function -
-Registers / Unregisters a helper function.
-
-SYNOPSIS
---------
-[verse]
---
-*#include <event-parse.h>*
-
-enum *tep_func_arg_type* {
- TEP_FUNC_ARG_VOID,
- TEP_FUNC_ARG_INT,
- TEP_FUNC_ARG_LONG,
- TEP_FUNC_ARG_STRING,
- TEP_FUNC_ARG_PTR,
- TEP_FUNC_ARG_MAX_TYPES
-};
-
-typedef unsigned long long (*pass:[*]tep_func_handler*)(struct trace_seq pass:[*]s, unsigned long long pass:[*]args);
-
-int *tep_register_print_function*(struct tep_handle pass:[*]_tep_, tep_func_handler _func_, enum tep_func_arg_type _ret_type_, char pass:[*]_name_, _..._);
-int *tep_unregister_print_function*(struct tep_handle pass:[*]_tep_, tep_func_handler _func_, char pass:[*]_name_);
---
-
-DESCRIPTION
------------
-Some events may have helper functions in the print format arguments.
-This allows a plugin to dynamically create a way to process one of
-these functions.
-
-The _tep_register_print_function()_ registers such helper function. The _tep_
-argument is the trace event parser context. The _func_ argument is a pointer
-to the helper function. The _ret_type_ argument is the return type of the
-helper function, value from the _tep_func_arg_type_ enum. The _name_ is the name
-of the helper function, as seen in the print format arguments. The _..._ is a
-variable list of _tep_func_arg_type_ enums, the _func_ function arguments.
-This list must end with _TEP_FUNC_ARG_VOID_. See 'EXAMPLE' section.
-
-The _tep_unregister_print_function()_ unregisters a helper function, previously
-registered with _tep_register_print_function()_. The _tep_ argument is the
-trace event parser context. The _func_ and _name_ arguments are the same, used
-when the helper function was registered.
-
-The _tep_func_handler_ is the type of the helper function. The _s_ argument is
-the trace sequence, it can be used to create a custom string.
-The _args_ is a list of arguments, defined when the helper function was
-registered.
-
-RETURN VALUE
-------------
-The _tep_register_print_function()_ function returns 0 in case of success.
-In case of an error, TEP_ERRNO_... code is returned.
-
-The _tep_unregister_print_function()_ returns 0 in case of success, or -1 in
-case of an error.
-
-EXAMPLE
--------
-Some events have internal functions calls, that appear in the print format
-output. For example "tracefs/events/i915/g4x_wm/format" has:
-[source,c]
---
-print fmt: "pipe %c, frame=%u, scanline=%u, wm %d/%d/%d, sr %s/%d/%d/%d, hpll %s/%d/%d/%d, fbc %s",
- ((REC->pipe) + 'A'), REC->frame, REC->scanline, REC->primary,
- REC->sprite, REC->cursor, yesno(REC->cxsr), REC->sr_plane,
- REC->sr_cursor, REC->sr_fbc, yesno(REC->hpll), REC->hpll_plane,
- REC->hpll_cursor, REC->hpll_fbc, yesno(REC->fbc)
---
-Notice the call to function _yesno()_ in the print arguments. In the kernel
-context, this function has the following implementation:
-[source,c]
---
-static const char *yesno(int x)
-{
- static const char *yes = "yes";
- static const char *no = "no";
-
- return x ? yes : no;
-}
---
-The user space event parser has no idea how to handle this _yesno()_ function.
-The _tep_register_print_function()_ API can be used to register a user space
-helper function, mapped to the kernel's _yesno()_:
-[source,c]
---
-#include <event-parse.h>
-#include <trace-seq.h>
-...
-struct tep_handle *tep = tep_alloc();
-...
-static const char *yes_no_helper(int x)
-{
- return x ? "yes" : "no";
-}
-...
- if ( tep_register_print_function(tep,
- yes_no_helper,
- TEP_FUNC_ARG_STRING,
- "yesno",
- TEP_FUNC_ARG_INT,
- TEP_FUNC_ARG_VOID) != 0) {
- /* Failed to register yes_no_helper function */
- }
-
-/*
- Now, when the event parser encounters this yesno() function, it will know
- how to handle it.
-*/
-...
- if (tep_unregister_print_function(tep, yes_no_helper, "yesno") != 0) {
- /* Failed to unregister yes_no_helper function */
- }
---
-
-FILES
------
-[verse]
---
-*event-parse.h*
- Header file to include in order to have access to the library APIs.
-*trace-seq.h*
- Header file to include in order to have access to trace sequences
- related APIs. Trace sequences are used to allow a function to call
- several other functions to create a string of data to use.
-*-ltraceevent*
- Linker switch to add when building a program that uses the library.
---
-
-SEE ALSO
---------
-_libtraceevent(3)_, _trace-cmd(1)_
-
-AUTHOR
-------
-[verse]
---
-*Steven Rostedt* <[email protected]>, author of *libtraceevent*.
-*Tzvetomir Stoyanov* <[email protected]>, author of this man page.
---
-REPORTING BUGS
---------------
-Report bugs to <[email protected]>
-
-LICENSE
--------
-libtraceevent is Free Software licensed under the GNU LGPL 2.1
-
-RESOURCES
----------
-https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
diff --git a/tools/lib/traceevent/Documentation/libtraceevent-set_flag.txt b/tools/lib/traceevent/Documentation/libtraceevent-set_flag.txt
deleted file mode 100644
index b0599780b9a6..000000000000
--- a/tools/lib/traceevent/Documentation/libtraceevent-set_flag.txt
+++ /dev/null
@@ -1,104 +0,0 @@
-libtraceevent(3)
-================
-
-NAME
-----
-tep_set_flag, tep_clear_flag, tep_test_flag -
-Manage flags of trace event parser context.
-
-SYNOPSIS
---------
-[verse]
---
-*#include <event-parse.h>*
-
-enum *tep_flag* {
- _TEP_NSEC_OUTPUT_,
- _TEP_DISABLE_SYS_PLUGINS_,
- _TEP_DISABLE_PLUGINS_
-};
-void *tep_set_flag*(struct tep_handle pass:[*]_tep_, enum tep_flag _flag_);
-void *tep_clear_flag*(struct tep_handle pass:[*]_tep_, enum tep_flag _flag_);
-bool *tep_test_flag*(struct tep_handle pass:[*]_tep_, enum tep_flag _flag_);
---
-
-DESCRIPTION
------------
-Trace event parser context flags are defined in *enum tep_flag*:
-[verse]
---
-_TEP_NSEC_OUTPUT_ - print event's timestamp in nano seconds, instead of micro seconds.
-_TEP_DISABLE_SYS_PLUGINS_ - disable plugins, located in system's plugin
- directory. This directory is defined at library compile
- time, and usually depends on library installation
- prefix: (install_preffix)/lib/traceevent/plugins
-_TEP_DISABLE_PLUGINS_ - disable all library plugins:
- - in system's plugin directory
- - in directory, defined by the environment variable _TRACEEVENT_PLUGIN_DIR_
- - in user's home directory, _~/.traceevent/plugins_
---
-Note: plugin related flags must me set before calling _tep_load_plugins()_ API.
-
-The _tep_set_flag()_ function sets _flag_ to _tep_ context.
-
-The _tep_clear_flag()_ function clears _flag_ from _tep_ context.
-
-The _tep_test_flag()_ function tests if _flag_ is set to _tep_ context.
-
-RETURN VALUE
-------------
-_tep_test_flag()_ function returns true if _flag_ is set, false otherwise.
-
-EXAMPLE
--------
-[source,c]
---
-#include <event-parse.h>
-...
-struct tep_handle *tep = tep_alloc();
-...
-/* Print timestamps in nanoseconds */
-tep_set_flag(tep, TEP_NSEC_OUTPUT);
-...
-if (tep_test_flag(tep, TEP_NSEC_OUTPUT)) {
- /* print timestamps in nanoseconds */
-} else {
- /* print timestamps in microseconds */
-}
-...
-/* Print timestamps in microseconds */
-tep_clear_flag(tep, TEP_NSEC_OUTPUT);
-...
---
-FILES
------
-[verse]
---
-*event-parse.h*
- Header file to include in order to have access to the library APIs.
-*-ltraceevent*
- Linker switch to add when building a program that uses the library.
---
-
-SEE ALSO
---------
-_libtraceevent(3)_, _trace-cmd(1)_
-
-AUTHOR
-------
-[verse]
---
-*Steven Rostedt* <[email protected]>, author of *libtraceevent*.
-*Tzvetomir Stoyanov* <[email protected]>, author of this man page.
---
-REPORTING BUGS
---------------
-Report bugs to <[email protected]>
-
-LICENSE
--------
-libtraceevent is Free Software licensed under the GNU LGPL 2.1
-
-RESOURCES
----------
-https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
diff --git a/tools/lib/traceevent/Documentation/libtraceevent-strerror.txt b/tools/lib/traceevent/Documentation/libtraceevent-strerror.txt
deleted file mode 100644
index ee4062a00c9f..000000000000
--- a/tools/lib/traceevent/Documentation/libtraceevent-strerror.txt
+++ /dev/null
@@ -1,85 +0,0 @@
-libtraceevent(3)
-================
-
-NAME
-----
-tep_strerror - Returns a string describing regular errno and tep error number.
-
-SYNOPSIS
---------
-[verse]
---
-*#include <event-parse.h>*
-
-int *tep_strerror*(struct tep_handle pass:[*]_tep_, enum tep_errno _errnum_, char pass:[*]_buf_, size_t _buflen_);
-
---
-DESCRIPTION
------------
-The _tep_strerror()_ function converts tep error number into a human
-readable string.
-The _tep_ argument is trace event parser context. The _errnum_ is a regular
-errno, defined in errno.h, or a tep error number. The string, describing this
-error number is copied in the _buf_ argument. The _buflen_ argument is
-the size of the _buf_.
-
-It as a thread safe wrapper around strerror_r(). The library function has two
-different behaviors - POSIX and GNU specific. The _tep_strerror()_ API always
-behaves as the POSIX version - the error string is copied in the user supplied
-buffer.
-
-RETURN VALUE
-------------
-The _tep_strerror()_ function returns 0, if a valid _errnum_ is passed and the
-string is copied into _buf_. If _errnum_ is not a valid error number,
--1 is returned and _buf_ is not modified.
-
-EXAMPLE
--------
-[source,c]
---
-#include <event-parse.h>
-...
-struct tep_handle *tep = tep_alloc();
-...
-char buf[32];
-char *pool = calloc(1, 128);
-if (tep == NULL) {
- tep_strerror(tep, TEP_ERRNO__MEM_ALLOC_FAILED, buf, 32);
- printf ("The pool is not initialized, %s", buf);
-}
-...
---
-
-FILES
------
-[verse]
---
-*event-parse.h*
- Header file to include in order to have access to the library APIs.
-*-ltraceevent*
- Linker switch to add when building a program that uses the library.
---
-
-SEE ALSO
---------
-_libtraceevent(3)_, _trace-cmd(1)_
-
-AUTHOR
-------
-[verse]
---
-*Steven Rostedt* <[email protected]>, author of *libtraceevent*.
-*Tzvetomir Stoyanov* <[email protected]>, author of this man page.
---
-REPORTING BUGS
---------------
-Report bugs to <[email protected]>
-
-LICENSE
--------
-libtraceevent is Free Software licensed under the GNU LGPL 2.1
-
-RESOURCES
----------
-https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
diff --git a/tools/lib/traceevent/Documentation/libtraceevent-tseq.txt b/tools/lib/traceevent/Documentation/libtraceevent-tseq.txt
deleted file mode 100644
index 8ac6aa174e12..000000000000
--- a/tools/lib/traceevent/Documentation/libtraceevent-tseq.txt
+++ /dev/null
@@ -1,158 +0,0 @@
-libtraceevent(3)
-================
-
-NAME
-----
-trace_seq_init, trace_seq_destroy, trace_seq_reset, trace_seq_terminate,
-trace_seq_putc, trace_seq_puts, trace_seq_printf, trace_seq_vprintf,
-trace_seq_do_fprintf, trace_seq_do_printf -
-Initialize / destroy a trace sequence.
-
-SYNOPSIS
---------
-[verse]
---
-*#include <event-parse.h>*
-*#include <trace-seq.h>*
-
-void *trace_seq_init*(struct trace_seq pass:[*]_s_);
-void *trace_seq_destroy*(struct trace_seq pass:[*]_s_);
-void *trace_seq_reset*(struct trace_seq pass:[*]_s_);
-void *trace_seq_terminate*(struct trace_seq pass:[*]_s_);
-int *trace_seq_putc*(struct trace_seq pass:[*]_s_, unsigned char _c_);
-int *trace_seq_puts*(struct trace_seq pass:[*]_s_, const char pass:[*]_str_);
-int *trace_seq_printf*(struct trace_seq pass:[*]_s_, const char pass:[*]_fmt_, _..._);
-int *trace_seq_vprintf*(struct trace_seq pass:[*]_s_, const char pass:[*]_fmt_, va_list _args_);
-int *trace_seq_do_printf*(struct trace_seq pass:[*]_s_);
-int *trace_seq_do_fprintf*(struct trace_seq pass:[*]_s_, FILE pass:[*]_fp_);
---
-
-DESCRIPTION
------------
-Trace sequences are used to allow a function to call several other functions
-to create a string of data to use.
-
-The _trace_seq_init()_ function initializes the trace sequence _s_.
-
-The _trace_seq_destroy()_ function destroys the trace sequence _s_ and frees
-all its resources that it had used.
-
-The _trace_seq_reset()_ function re-initializes the trace sequence _s_. All
-characters already written in _s_ will be deleted.
-
-The _trace_seq_terminate()_ function terminates the trace sequence _s_. It puts
-the null character pass:['\0'] at the end of the buffer.
-
-The _trace_seq_putc()_ function puts a single character _c_ in the trace
-sequence _s_.
-
-The _trace_seq_puts()_ function puts a NULL terminated string _str_ in the
-trace sequence _s_.
-
-The _trace_seq_printf()_ function puts a formated string _fmt _with
-variable arguments _..._ in the trace sequence _s_.
-
-The _trace_seq_vprintf()_ function puts a formated string _fmt _with
-list of arguments _args_ in the trace sequence _s_.
-
-The _trace_seq_do_printf()_ function prints the buffer of trace sequence _s_ to
-the standard output stdout.
-
-The _trace_seq_do_fprintf()_ function prints the buffer of trace sequence _s_
-to the given file _fp_.
-
-RETURN VALUE
-------------
-Both _trace_seq_putc()_ and _trace_seq_puts()_ functions return the number of
-characters put in the trace sequence, or 0 in case of an error
-
-Both _trace_seq_printf()_ and _trace_seq_vprintf()_ functions return 0 if the
-trace oversizes the buffer's free space, the number of characters printed, or
-a negative value in case of an error.
-
-Both _trace_seq_do_printf()_ and _trace_seq_do_fprintf()_ functions return the
-number of printed characters, or -1 in case of an error.
-
-EXAMPLE
--------
-[source,c]
---
-#include <event-parse.h>
-#include <trace-seq.h>
-...
-struct trace_seq seq;
-trace_seq_init(&seq);
-...
-void foo_seq_print(struct trace_seq *tseq, char *format, ...)
-{
- va_list ap;
- va_start(ap, format);
- if (trace_seq_vprintf(tseq, format, ap) <= 0) {
- /* Failed to print in the trace sequence */
- }
- va_end(ap);
-}
-
-trace_seq_reset(&seq);
-
-char *str = " MAN page example";
-if (trace_seq_puts(&seq, str) != strlen(str)) {
- /* Failed to put str in the trace sequence */
-}
-if (trace_seq_putc(&seq, ':') != 1) {
- /* Failed to put ':' in the trace sequence */
-}
-if (trace_seq_printf(&seq, " trace sequence: %d", 1) <= 0) {
- /* Failed to print in the trace sequence */
-}
-foo_seq_print( &seq, " %d\n", 2);
-
-trace_seq_terminate(&seq);
-...
-
-if (trace_seq_do_printf(&seq) < 0 ) {
- /* Failed to print the sequence buffer to the standard output */
-}
-FILE *fp = fopen("trace.txt", "w");
-if (trace_seq_do_fprintf(&seq, fp) < 0 ) [
- /* Failed to print the sequence buffer to the trace.txt file */
-}
-
-trace_seq_destroy(&seq);
-...
---
-
-FILES
------
-[verse]
---
-*event-parse.h*
- Header file to include in order to have access to the library APIs.
-*trace-seq.h*
- Header file to include in order to have access to trace sequences related APIs.
-*-ltraceevent*
- Linker switch to add when building a program that uses the library.
---
-
-SEE ALSO
---------
-_libtraceevent(3)_, _trace-cmd(1)_
-
-AUTHOR
-------
-[verse]
---
-*Steven Rostedt* <[email protected]>, author of *libtraceevent*.
-*Tzvetomir Stoyanov* <[email protected]>, author of this man page.
---
-REPORTING BUGS
---------------
-Report bugs to <[email protected]>
-
-LICENSE
--------
-libtraceevent is Free Software licensed under the GNU LGPL 2.1
-
-RESOURCES
----------
-https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
diff --git a/tools/lib/traceevent/Documentation/libtraceevent.txt b/tools/lib/traceevent/Documentation/libtraceevent.txt
deleted file mode 100644
index d530a7ce8fb2..000000000000
--- a/tools/lib/traceevent/Documentation/libtraceevent.txt
+++ /dev/null
@@ -1,192 +0,0 @@
-libtraceevent(3)
-================
-
-NAME
-----
-libtraceevent - Linux kernel trace event library
-
-SYNOPSIS
---------
-[verse]
---
-*#include <event-parse.h>*
-
-Management of tep handler data structure and access of its members:
- struct tep_handle pass:[*]*tep_alloc*(void);
- void *tep_free*(struct tep_handle pass:[*]_tep_);
- void *tep_ref*(struct tep_handle pass:[*]_tep_);
- void *tep_unref*(struct tep_handle pass:[*]_tep_);
- int *tep_get_ref*(struct tep_handle pass:[*]_tep_);
- void *tep_set_flag*(struct tep_handle pass:[*]_tep_, enum tep_flag _flag_);
- void *tep_clear_flag*(struct tep_handle pass:[*]_tep_, enum tep_flag _flag_);
- bool *tep_test_flag*(struct tep_handle pass:[*]_tep_, enum tep_flag _flags_);
- int *tep_get_cpus*(struct tep_handle pass:[*]_tep_);
- void *tep_set_cpus*(struct tep_handle pass:[*]_tep_, int _cpus_);
- int *tep_get_long_size*(strucqt tep_handle pass:[*]_tep_);
- void *tep_set_long_size*(struct tep_handle pass:[*]_tep_, int _long_size_);
- int *tep_get_page_size*(struct tep_handle pass:[*]_tep_);
- void *tep_set_page_size*(struct tep_handle pass:[*]_tep_, int _page_size_);
- int *tep_get_header_page_size*(struct tep_handle pass:[*]_tep_);
- int *tep_get_header_timestamp_size*(struct tep_handle pass:[*]_tep_);
- bool *tep_is_old_format*(struct tep_handle pass:[*]_tep_);
- int *tep_strerror*(struct tep_handle pass:[*]_tep_, enum tep_errno _errnum_, char pass:[*]_buf_, size_t _buflen_);
-
-Register / unregister APIs:
- int *tep_register_function*(struct tep_handle pass:[*]_tep_, char pass:[*]_name_, unsigned long long _addr_, char pass:[*]_mod_);
- int *tep_register_event_handler*(struct tep_handle pass:[*]_tep_, int _id_, const char pass:[*]_sys_name_, const char pass:[*]_event_name_, tep_event_handler_func _func_, void pass:[*]_context_);
- int *tep_unregister_event_handler*(struct tep_handle pass:[*]tep, int id, const char pass:[*]sys_name, const char pass:[*]event_name, tep_event_handler_func func, void pass:[*]_context_);
- int *tep_register_print_string*(struct tep_handle pass:[*]_tep_, const char pass:[*]_fmt_, unsigned long long _addr_);
- int *tep_register_print_function*(struct tep_handle pass:[*]_tep_, tep_func_handler _func_, enum tep_func_arg_type _ret_type_, char pass:[*]_name_, _..._);
- int *tep_unregister_print_function*(struct tep_handle pass:[*]_tep_, tep_func_handler _func_, char pass:[*]_name_);
-
-Plugins management:
- struct tep_plugin_list pass:[*]*tep_load_plugins*(struct tep_handle pass:[*]_tep_);
- void *tep_unload_plugins*(struct tep_plugin_list pass:[*]_plugin_list_, struct tep_handle pass:[*]_tep_);
- char pass:[*]pass:[*]*tep_plugin_list_options*(void);
- void *tep_plugin_free_options_list*(char pass:[*]pass:[*]_list_);
- int *tep_plugin_add_options*(const char pass:[*]_name_, struct tep_plugin_option pass:[*]_options_);
- void *tep_plugin_remove_options*(struct tep_plugin_option pass:[*]_options_);
- void *tep_print_plugins*(struct trace_seq pass:[*]_s_, const char pass:[*]_prefix_, const char pass:[*]_suffix_, const struct tep_plugin_list pass:[*]_list_);
-
-Event related APIs:
- struct tep_event pass:[*]*tep_get_event*(struct tep_handle pass:[*]_tep_, int _index_);
- struct tep_event pass:[*]*tep_get_first_event*(struct tep_handle pass:[*]_tep_);
- int *tep_get_events_count*(struct tep_handle pass:[*]_tep_);
- struct tep_event pass:[*]pass:[*]*tep_list_events*(struct tep_handle pass:[*]_tep_, enum tep_event_sort_type _sort_type_);
- struct tep_event pass:[*]pass:[*]*tep_list_events_copy*(struct tep_handle pass:[*]_tep_, enum tep_event_sort_type _sort_type_);
- void *tep_print_event*(struct tep_handle pass:[*]_tep_, struct trace_seq pass:[*]_s_, struct tep_record pass:[*]_record_, const char pass:[*]_fmt_, _..._);
-
-Event finding:
- struct tep_event pass:[*]*tep_find_event*(struct tep_handle pass:[*]_tep_, int _id_);
- struct tep_event pass:[*]*tep_find_event_by_name*(struct tep_handle pass:[*]_tep_, const char pass:[*]_sys_, const char pass:[*]_name_);
- struct tep_event pass:[*]*tep_find_event_by_record*(struct tep_handle pass:[*]_tep_, struct tep_record pass:[*]_record_);
-
-Parsing of event files:
- int *tep_parse_header_page*(struct tep_handle pass:[*]_tep_, char pass:[*]_buf_, unsigned long _size_, int _long_size_);
- enum tep_errno *tep_parse_event*(struct tep_handle pass:[*]_tep_, const char pass:[*]_buf_, unsigned long _size_, const char pass:[*]_sys_);
- enum tep_errno *tep_parse_format*(struct tep_handle pass:[*]_tep_, struct tep_event pass:[*]pass:[*]_eventp_, const char pass:[*]_buf_, unsigned long _size_, const char pass:[*]_sys_);
-
-APIs related to fields from event's format files:
- struct tep_format_field pass:[*]pass:[*]*tep_event_common_fields*(struct tep_event pass:[*]_event_);
- struct tep_format_field pass:[*]pass:[*]*tep_event_fields*(struct tep_event pass:[*]_event_);
- void pass:[*]*tep_get_field_raw*(struct trace_seq pass:[*]_s_, struct tep_event pass:[*]_event_, const char pass:[*]_name_, struct tep_record pass:[*]_record_, int pass:[*]_len_, int _err_);
- int *tep_get_field_val*(struct trace_seq pass:[*]_s_, struct tep_event pass:[*]_event_, const char pass:[*]_name_, struct tep_record pass:[*]_record_, unsigned long long pass:[*]_val_, int _err_);
- int *tep_get_common_field_val*(struct trace_seq pass:[*]_s_, struct tep_event pass:[*]_event_, const char pass:[*]_name_, struct tep_record pass:[*]_record_, unsigned long long pass:[*]_val_, int _err_);
- int *tep_get_any_field_val*(struct trace_seq pass:[*]_s_, struct tep_event pass:[*]_event_, const char pass:[*]_name_, struct tep_record pass:[*]_record_, unsigned long long pass:[*]_val_, int _err_);
- int *tep_read_number_field*(struct tep_format_field pass:[*]_field_, const void pass:[*]_data_, unsigned long long pass:[*]_value_);
-
-Event fields printing:
- void *tep_print_field*(struct trace_seq pass:[*]_s_, void pass:[*]_data_, struct tep_format_field pass:[*]_field_);
- void *tep_print_fields*(struct trace_seq pass:[*]_s_, void pass:[*]_data_, int _size_, struct tep_event pass:[*]_event_);
- int *tep_print_num_field*(struct trace_seq pass:[*]_s_, const char pass:[*]_fmt_, struct tep_event pass:[*]_event_, const char pass:[*]_name_, struct tep_record pass:[*]_record_, int _err_);
- int *tep_print_func_field*(struct trace_seq pass:[*]_s_, const char pass:[*]_fmt_, struct tep_event pass:[*]_event_, const char pass:[*]_name_, struct tep_record pass:[*]_record_, int _err_);
-
-Event fields finding:
- struct tep_format_field pass:[*]*tep_find_common_field*(struct tep_event pass:[*]_event_, const char pass:[*]_name_);
- struct tep_format_field pass:[*]*tep_find_field*(struct tep_event_ormat pass:[*]_event_, const char pass:[*]_name_);
- struct tep_format_field pass:[*]*tep_find_any_field*(struct tep_event pass:[*]_event_, const char pass:[*]_name_);
-
-Functions resolver:
- int *tep_set_function_resolver*(struct tep_handle pass:[*]_tep_, tep_func_resolver_t pass:[*]_func_, void pass:[*]_priv_);
- void *tep_reset_function_resolver*(struct tep_handle pass:[*]_tep_);
- const char pass:[*]*tep_find_function*(struct tep_handle pass:[*]_tep_, unsigned long long _addr_);
- unsigned long long *tep_find_function_address*(struct tep_handle pass:[*]_tep_, unsigned long long _addr_);
-
-Filter management:
- struct tep_event_filter pass:[*]*tep_filter_alloc*(struct tep_handle pass:[*]_tep_);
- enum tep_errno *tep_filter_add_filter_str*(struct tep_event_filter pass:[*]_filter_, const char pass:[*]_filter_str_);
- enum tep_errno *tep_filter_match*(struct tep_event_filter pass:[*]_filter_, struct tep_record pass:[*]_record_);
- int *tep_filter_strerror*(struct tep_event_filter pass:[*]_filter_, enum tep_errno _err_, char pass:[*]buf, size_t _buflen_);
- int *tep_event_filtered*(struct tep_event_filter pass:[*]_filter_, int _event_id_);
- void *tep_filter_reset*(struct tep_event_filter pass:[*]_filter_);
- void *tep_filter_free*(struct tep_event_filter pass:[*]_filter_);
- char pass:[*]*tep_filter_make_string*(struct tep_event_filter pass:[*]_filter_, int _event_id_);
- int *tep_filter_remove_event*(struct tep_event_filter pass:[*]_filter_, int _event_id_);
- int *tep_filter_copy*(struct tep_event_filter pass:[*]_dest_, struct tep_event_filter pass:[*]_source_);
- int *tep_filter_compare*(struct tep_event_filter pass:[*]_filter1_, struct tep_event_filter pass:[*]_filter2_);
-
-Parsing various data from the records:
- int *tep_data_type*(struct tep_handle pass:[*]_tep_, struct tep_record pass:[*]_rec_);
- int *tep_data_pid*(struct tep_handle pass:[*]_tep_, struct tep_record pass:[*]_rec_);
- int *tep_data_preempt_count*(struct tep_handle pass:[*]_tep_, struct tep_record pass:[*]_rec_);
- int *tep_data_flags*(struct tep_handle pass:[*]_tep_, struct tep_record pass:[*]_rec_);
-
-Command and task related APIs:
- const char pass:[*]*tep_data_comm_from_pid*(struct tep_handle pass:[*]_tep_, int _pid_);
- struct cmdline pass:[*]*tep_data_pid_from_comm*(struct tep_handle pass:[*]_tep_, const char pass:[*]_comm_, struct cmdline pass:[*]_next_);
- int *tep_register_comm*(struct tep_handle pass:[*]_tep_, const char pass:[*]_comm_, int _pid_);
- int *tep_override_comm*(struct tep_handle pass:[*]_tep_, const char pass:[*]_comm_, int _pid_);
- bool *tep_is_pid_registered*(struct tep_handle pass:[*]_tep_, int _pid_);
- int *tep_cmdline_pid*(struct tep_handle pass:[*]_tep_, struct cmdline pass:[*]_cmdline_);
-
-Endian related APIs:
- int *tep_is_bigendian*(void);
- unsigned long long *tep_read_number*(struct tep_handle pass:[*]_tep_, const void pass:[*]_ptr_, int _size_);
- bool *tep_is_file_bigendian*(struct tep_handle pass:[*]_tep_);
- void *tep_set_file_bigendian*(struct tep_handle pass:[*]_tep_, enum tep_endian _endian_);
- bool *tep_is_local_bigendian*(struct tep_handle pass:[*]_tep_);
- void *tep_set_local_bigendian*(struct tep_handle pass:[*]_tep_, enum tep_endian _endian_);
-
-Trace sequences:
-*#include <trace-seq.h>*
- void *trace_seq_init*(struct trace_seq pass:[*]_s_);
- void *trace_seq_reset*(struct trace_seq pass:[*]_s_);
- void *trace_seq_destroy*(struct trace_seq pass:[*]_s_);
- int *trace_seq_printf*(struct trace_seq pass:[*]_s_, const char pass:[*]_fmt_, ...);
- int *trace_seq_vprintf*(struct trace_seq pass:[*]_s_, const char pass:[*]_fmt_, va_list _args_);
- int *trace_seq_puts*(struct trace_seq pass:[*]_s_, const char pass:[*]_str_);
- int *trace_seq_putc*(struct trace_seq pass:[*]_s_, unsigned char _c_);
- void *trace_seq_terminate*(struct trace_seq pass:[*]_s_);
- int *trace_seq_do_fprintf*(struct trace_seq pass:[*]_s_, FILE pass:[*]_fp_);
- int *trace_seq_do_printf*(struct trace_seq pass:[*]_s_);
---
-
-DESCRIPTION
------------
-The libtraceevent(3) library provides APIs to access kernel tracepoint events,
-located in the tracefs file system under the events directory.
-
-ENVIRONMENT
------------
-[verse]
---
-TRACEEVENT_PLUGIN_DIR
- Additional plugin directory. All shared object files, located in this directory will be loaded as traceevent plugins.
---
-
-FILES
------
-[verse]
---
-*event-parse.h*
- Header file to include in order to have access to the library APIs.
-*trace-seq.h*
- Header file to include in order to have access to trace sequences related APIs.
- Trace sequences are used to allow a function to call several other functions
- to create a string of data to use.
-*-ltraceevent*
- Linker switch to add when building a program that uses the library.
---
-
-SEE ALSO
---------
-_trace-cmd(1)_
-
-AUTHOR
-------
-[verse]
---
-*Steven Rostedt* <[email protected]>, author of *libtraceevent*.
-*Tzvetomir Stoyanov* <[email protected]>, author of this man page.
---
-REPORTING BUGS
---------------
-Report bugs to <[email protected]>
-
-LICENSE
--------
-libtraceevent is Free Software licensed under the GNU LGPL 2.1
-
-RESOURCES
----------
-https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
diff --git a/tools/lib/traceevent/Documentation/manpage-1.72.xsl b/tools/lib/traceevent/Documentation/manpage-1.72.xsl
deleted file mode 100644
index b4d315cb8c47..000000000000
--- a/tools/lib/traceevent/Documentation/manpage-1.72.xsl
+++ /dev/null
@@ -1,14 +0,0 @@
-<!-- manpage-1.72.xsl:
- special settings for manpages rendered from asciidoc+docbook
- handles peculiarities in docbook-xsl 1.72.0 -->
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
- version="1.0">
-
-<xsl:import href="manpage-base.xsl"/>
-
-<!-- these are the special values for the roff control characters
- needed for docbook-xsl 1.72.0 -->
-<xsl:param name="git.docbook.backslash">&#x2593;</xsl:param>
-<xsl:param name="git.docbook.dot" >&#x2302;</xsl:param>
-
-</xsl:stylesheet>
diff --git a/tools/lib/traceevent/Documentation/manpage-base.xsl b/tools/lib/traceevent/Documentation/manpage-base.xsl
deleted file mode 100644
index a264fa616093..000000000000
--- a/tools/lib/traceevent/Documentation/manpage-base.xsl
+++ /dev/null
@@ -1,35 +0,0 @@
-<!-- manpage-base.xsl:
- special formatting for manpages rendered from asciidoc+docbook -->
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
- version="1.0">
-
-<!-- these params silence some output from xmlto -->
-<xsl:param name="man.output.quietly" select="1"/>
-<xsl:param name="refentry.meta.get.quietly" select="1"/>
-
-<!-- convert asciidoc callouts to man page format;
- git.docbook.backslash and git.docbook.dot params
- must be supplied by another XSL file or other means -->
-<xsl:template match="co">
- <xsl:value-of select="concat(
- $git.docbook.backslash,'fB(',
- substring-after(@id,'-'),')',
- $git.docbook.backslash,'fR')"/>
-</xsl:template>
-<xsl:template match="calloutlist">
- <xsl:value-of select="$git.docbook.dot"/>
- <xsl:text>sp&#10;</xsl:text>
- <xsl:apply-templates/>
- <xsl:text>&#10;</xsl:text>
-</xsl:template>
-<xsl:template match="callout">
- <xsl:value-of select="concat(
- $git.docbook.backslash,'fB',
- substring-after(@arearefs,'-'),
- '. ',$git.docbook.backslash,'fR')"/>
- <xsl:apply-templates/>
- <xsl:value-of select="$git.docbook.dot"/>
- <xsl:text>br&#10;</xsl:text>
-</xsl:template>
-
-</xsl:stylesheet>
diff --git a/tools/lib/traceevent/Documentation/manpage-bold-literal.xsl b/tools/lib/traceevent/Documentation/manpage-bold-literal.xsl
deleted file mode 100644
index 608eb5df6281..000000000000
--- a/tools/lib/traceevent/Documentation/manpage-bold-literal.xsl
+++ /dev/null
@@ -1,17 +0,0 @@
-<!-- manpage-bold-literal.xsl:
- special formatting for manpages rendered from asciidoc+docbook -->
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
- version="1.0">
-
-<!-- render literal text as bold (instead of plain or monospace);
- this makes literal text easier to distinguish in manpages
- viewed on a tty -->
-<xsl:template match="literal">
- <xsl:value-of select="$git.docbook.backslash"/>
- <xsl:text>fB</xsl:text>
- <xsl:apply-templates/>
- <xsl:value-of select="$git.docbook.backslash"/>
- <xsl:text>fR</xsl:text>
-</xsl:template>
-
-</xsl:stylesheet>
diff --git a/tools/lib/traceevent/Documentation/manpage-normal.xsl b/tools/lib/traceevent/Documentation/manpage-normal.xsl
deleted file mode 100644
index a48f5b11f3dc..000000000000
--- a/tools/lib/traceevent/Documentation/manpage-normal.xsl
+++ /dev/null
@@ -1,13 +0,0 @@
-<!-- manpage-normal.xsl:
- special settings for manpages rendered from asciidoc+docbook
- handles anything we want to keep away from docbook-xsl 1.72.0 -->
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
- version="1.0">
-
-<xsl:import href="manpage-base.xsl"/>
-
-<!-- these are the normal values for the roff control characters -->
-<xsl:param name="git.docbook.backslash">\</xsl:param>
-<xsl:param name="git.docbook.dot" >.</xsl:param>
-
-</xsl:stylesheet>
diff --git a/tools/lib/traceevent/Documentation/manpage-suppress-sp.xsl b/tools/lib/traceevent/Documentation/manpage-suppress-sp.xsl
deleted file mode 100644
index a63c7632a87d..000000000000
--- a/tools/lib/traceevent/Documentation/manpage-suppress-sp.xsl
+++ /dev/null
@@ -1,21 +0,0 @@
-<!-- manpage-suppress-sp.xsl:
- special settings for manpages rendered from asciidoc+docbook
- handles erroneous, inline .sp in manpage output of some
- versions of docbook-xsl -->
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
- version="1.0">
-
-<!-- attempt to work around spurious .sp at the tail of the line
- that some versions of docbook stylesheets seem to add -->
-<xsl:template match="simpara">
- <xsl:variable name="content">
- <xsl:apply-templates/>
- </xsl:variable>
- <xsl:value-of select="normalize-space($content)"/>
- <xsl:if test="not(ancestor::authorblurb) and
- not(ancestor::personblurb)">
- <xsl:text>&#10;&#10;</xsl:text>
- </xsl:if>
-</xsl:template>
-
-</xsl:stylesheet>
diff --git a/tools/lib/traceevent/Makefile b/tools/lib/traceevent/Makefile
deleted file mode 100644
index 98dfd4badea3..000000000000
--- a/tools/lib/traceevent/Makefile
+++ /dev/null
@@ -1,300 +0,0 @@
-# SPDX-License-Identifier: GPL-2.0
-# trace-cmd version
-EP_VERSION = 1
-EP_PATCHLEVEL = 1
-EP_EXTRAVERSION = 0
-
-# file format version
-FILE_VERSION = 6
-
-MAKEFLAGS += --no-print-directory
-
-
-# Makefiles suck: This macro sets a default value of $(2) for the
-# variable named by $(1), unless the variable has been set by
-# environment or command line. This is necessary for CC and AR
-# because make sets default values, so the simpler ?= approach
-# won't work as expected.
-define allow-override
- $(if $(or $(findstring environment,$(origin $(1))),\
- $(findstring command line,$(origin $(1)))),,\
- $(eval $(1) = $(2)))
-endef
-
-# Allow setting CC and AR, or setting CROSS_COMPILE as a prefix.
-$(call allow-override,CC,$(CROSS_COMPILE)gcc)
-$(call allow-override,AR,$(CROSS_COMPILE)ar)
-$(call allow-override,NM,$(CROSS_COMPILE)nm)
-$(call allow-override,PKG_CONFIG,pkg-config)
-
-EXT = -std=gnu99
-INSTALL = install
-
-# Use DESTDIR for installing into a different root directory.
-# This is useful for building a package. The program will be
-# installed in this directory as if it was the root directory.
-# Then the build tool can move it later.
-DESTDIR ?=
-DESTDIR_SQ = '$(subst ','\'',$(DESTDIR))'
-
-LP64 := $(shell echo __LP64__ | ${CC} ${CFLAGS} -E -x c - | tail -n 1)
-ifeq ($(LP64), 1)
- libdir_relative_temp = lib64
-else
- libdir_relative_temp = lib
-endif
-
-libdir_relative ?= $(libdir_relative_temp)
-prefix ?= /usr/local
-libdir = $(prefix)/$(libdir_relative)
-man_dir = $(prefix)/share/man
-man_dir_SQ = '$(subst ','\'',$(man_dir))'
-pkgconfig_dir ?= $(word 1,$(shell $(PKG_CONFIG) \
- --variable pc_path pkg-config | tr ":" " "))
-includedir_relative = traceevent
-includedir = $(prefix)/include/$(includedir_relative)
-includedir_SQ = '$(subst ','\'',$(includedir))'
-
-export man_dir man_dir_SQ INSTALL
-export DESTDIR DESTDIR_SQ
-export EVENT_PARSE_VERSION
-
-include ../../scripts/Makefile.include
-
-# copy a bit from Linux kbuild
-
-ifeq ("$(origin V)", "command line")
- VERBOSE = $(V)
-endif
-ifndef VERBOSE
- VERBOSE = 0
-endif
-
-ifeq ($(srctree),)
-srctree := $(patsubst %/,%,$(dir $(CURDIR)))
-srctree := $(patsubst %/,%,$(dir $(srctree)))
-srctree := $(patsubst %/,%,$(dir $(srctree)))
-#$(info Determined 'srctree' to be $(srctree))
-endif
-
-export prefix libdir src obj
-
-# Shell quotes
-libdir_SQ = $(subst ','\'',$(libdir))
-libdir_relative_SQ = $(subst ','\'',$(libdir_relative))
-
-CONFIG_INCLUDES =
-CONFIG_LIBS =
-CONFIG_FLAGS =
-
-VERSION = $(EP_VERSION)
-PATCHLEVEL = $(EP_PATCHLEVEL)
-EXTRAVERSION = $(EP_EXTRAVERSION)
-
-OBJ = $@
-N =
-
-EVENT_PARSE_VERSION = $(EP_VERSION).$(EP_PATCHLEVEL).$(EP_EXTRAVERSION)
-
-LIB_TARGET = libtraceevent.a libtraceevent.so.$(EVENT_PARSE_VERSION)
-LIB_INSTALL = libtraceevent.a libtraceevent.so*
-LIB_INSTALL := $(addprefix $(OUTPUT),$(LIB_INSTALL))
-
-INCLUDES = -I. -I $(srctree)/tools/include $(CONFIG_INCLUDES)
-
-# Set compile option CFLAGS
-ifdef EXTRA_CFLAGS
- CFLAGS := $(EXTRA_CFLAGS)
-else
- CFLAGS := -g -Wall
-endif
-
-# Append required CFLAGS
-override CFLAGS += -fPIC
-override CFLAGS += $(CONFIG_FLAGS) $(INCLUDES) $(PLUGIN_DIR_SQ)
-override CFLAGS += $(udis86-flags) -D_GNU_SOURCE
-
-ifeq ($(VERBOSE),1)
- Q =
-else
- Q = @
-endif
-
-# Disable command line variables (CFLAGS) override from top
-# level Makefile (perf), otherwise build Makefile will get
-# the same command line setup.
-MAKEOVERRIDES=
-
-export srctree OUTPUT CC LD CFLAGS V
-build := -f $(srctree)/tools/build/Makefile.build dir=. obj
-
-TE_IN := $(OUTPUT)libtraceevent-in.o
-LIB_TARGET := $(addprefix $(OUTPUT),$(LIB_TARGET))
-
-CMD_TARGETS = $(LIB_TARGET)
-
-TARGETS = $(CMD_TARGETS)
-
-all: all_cmd plugins
-
-all_cmd: $(CMD_TARGETS)
-
-$(TE_IN): force
- $(Q)$(MAKE) $(build)=libtraceevent
-
-$(OUTPUT)libtraceevent.so.$(EVENT_PARSE_VERSION): $(TE_IN)
- $(QUIET_LINK)$(CC) --shared $(LDFLAGS) $^ -Wl,-soname,libtraceevent.so.$(EP_VERSION) -o $@
- @ln -sf $(@F) $(OUTPUT)libtraceevent.so
- @ln -sf $(@F) $(OUTPUT)libtraceevent.so.$(EP_VERSION)
-
-$(OUTPUT)libtraceevent.a: $(TE_IN)
- $(QUIET_LINK)$(RM) $@; $(AR) rcs $@ $^
-
-$(OUTPUT)%.so: $(OUTPUT)%-in.o
- $(QUIET_LINK)$(CC) $(CFLAGS) -shared $(LDFLAGS) -nostartfiles -o $@ $^
-
-define make_version.h
- (echo '/* This file is automatically generated. Do not modify. */'; \
- echo \#define VERSION_CODE $(shell \
- expr $(VERSION) \* 256 + $(PATCHLEVEL)); \
- echo '#define EXTRAVERSION ' $(EXTRAVERSION); \
- echo '#define VERSION_STRING "'$(VERSION).$(PATCHLEVEL).$(EXTRAVERSION)'"'; \
- echo '#define FILE_VERSION '$(FILE_VERSION); \
- ) > $1
-endef
-
-define update_version.h
- ($(call make_version.h, [email protected]); \
- if [ -r $@ ] && cmp -s $@ [email protected]; then \
- rm -f [email protected]; \
- else \
- echo ' UPDATE $@'; \
- mv -f [email protected] $@; \
- fi);
-endef
-
-ep_version.h: force
- $(Q)$(N)$(call update_version.h)
-
-VERSION_FILES = ep_version.h
-
-define update_dir
- (echo $1 > [email protected]; \
- if [ -r $@ ] && cmp -s $@ [email protected]; then \
- rm -f [email protected]; \
- else \
- echo ' UPDATE $@'; \
- mv -f [email protected] $@; \
- fi);
-endef
-
-tags: force
- $(RM) tags
- find . -name '*.[ch]' | xargs ctags --extra=+f --c-kinds=+px \
- --regex-c++='/_PE\(([^,)]*).*/TEP_ERRNO__\1/'
-
-TAGS: force
- $(RM) TAGS
- find . -name '*.[ch]' | xargs etags \
- --regex='/_PE(\([^,)]*\).*/TEP_ERRNO__\1/'
-
-define do_install_mkdir
- if [ ! -d '$(DESTDIR_SQ)$1' ]; then \
- $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$1'; \
- fi
-endef
-
-define do_install
- $(call do_install_mkdir,$2); \
- $(INSTALL) $(if $3,-m $3,) $1 '$(DESTDIR_SQ)$2'
-endef
-
-PKG_CONFIG_SOURCE_FILE = libtraceevent.pc
-PKG_CONFIG_FILE := $(addprefix $(OUTPUT),$(PKG_CONFIG_SOURCE_FILE))
-define do_install_pkgconfig_file
- if [ -n "${pkgconfig_dir}" ]; then \
- cp -f ${PKG_CONFIG_SOURCE_FILE}.template ${PKG_CONFIG_FILE}; \
- sed -i "s|INSTALL_PREFIX|${1}|g" ${PKG_CONFIG_FILE}; \
- sed -i "s|LIB_VERSION|${EVENT_PARSE_VERSION}|g" ${PKG_CONFIG_FILE}; \
- sed -i "s|LIB_DIR|${libdir}|g" ${PKG_CONFIG_FILE}; \
- sed -i "s|HEADER_DIR|$(includedir)|g" ${PKG_CONFIG_FILE}; \
- $(call do_install,$(PKG_CONFIG_FILE),$(pkgconfig_dir),644); \
- else \
- (echo Failed to locate pkg-config directory) 1>&2; \
- fi
-endef
-
-install_lib: all_cmd install_plugins install_headers install_pkgconfig
- $(call QUIET_INSTALL, $(LIB_TARGET)) \
- $(call do_install_mkdir,$(libdir_SQ)); \
- cp -fpR $(LIB_INSTALL) $(DESTDIR)$(libdir_SQ)
-
-install_pkgconfig:
- $(call QUIET_INSTALL, $(PKG_CONFIG_FILE)) \
- $(call do_install_pkgconfig_file,$(prefix))
-
-install_headers:
- $(call QUIET_INSTALL, traceevent_headers) \
- $(call do_install,event-parse.h,$(includedir_SQ),644); \
- $(call do_install,event-utils.h,$(includedir_SQ),644); \
- $(call do_install,trace-seq.h,$(includedir_SQ),644); \
- $(call do_install,kbuffer.h,$(includedir_SQ),644);
-
-install: install_lib
-
-clean: clean_plugins
- $(call QUIET_CLEAN, libtraceevent) \
- $(RM) *.o *~ $(TARGETS) *.a *.so $(VERSION_FILES) .*.d .*.cmd; \
- $(RM) TRACEEVENT-CFLAGS tags TAGS; \
- $(RM) $(PKG_CONFIG_FILE)
-
-PHONY += doc
-doc:
- $(call descend,Documentation)
-
-PHONY += doc-clean
-doc-clean:
- $(call descend,Documentation,clean)
-
-PHONY += doc-install
-doc-install:
- $(call descend,Documentation,install)
-
-PHONY += doc-uninstall
-doc-uninstall:
- $(call descend,Documentation,uninstall)
-
-PHONY += help
-help:
- @echo 'Possible targets:'
- @echo''
- @echo ' all - default, compile the library and the'\
- 'plugins'
- @echo ' plugins - compile the plugins'
- @echo ' install - install the library, the plugins,'\
- 'the header and pkgconfig files'
- @echo ' clean - clean the library and the plugins object files'
- @echo ' doc - compile the documentation files - man'\
- 'and html pages, in the Documentation directory'
- @echo ' doc-clean - clean the documentation files'
- @echo ' doc-install - install the man pages'
- @echo ' doc-uninstall - uninstall the man pages'
- @echo''
-
-PHONY += plugins
-plugins:
- $(call descend,plugins)
-
-PHONY += install_plugins
-install_plugins:
- $(call descend,plugins,install)
-
-PHONY += clean_plugins
-clean_plugins:
- $(call descend,plugins,clean)
-
-force:
-
-# Declare the contents of the .PHONY variable as phony. We keep that
-# information in a variable so we can use it in if_changed and friends.
-.PHONY: $(PHONY)
diff --git a/tools/lib/traceevent/event-parse-api.c b/tools/lib/traceevent/event-parse-api.c
deleted file mode 100644
index f8361e45d446..000000000000
--- a/tools/lib/traceevent/event-parse-api.c
+++ /dev/null
@@ -1,333 +0,0 @@
-// SPDX-License-Identifier: LGPL-2.1
-/*
- * Copyright (C) 2009, 2010 Red Hat Inc, Steven Rostedt <[email protected]>
- *
- */
-
-#include "event-parse.h"
-#include "event-parse-local.h"
-#include "event-utils.h"
-
-/**
- * tep_get_event - returns the event with the given index
- * @tep: a handle to the tep_handle
- * @index: index of the requested event, in the range 0 .. nr_events
- *
- * This returns pointer to the element of the events array with the given index
- * If @tep is NULL, or @index is not in the range 0 .. nr_events, NULL is returned.
- */
-struct tep_event *tep_get_event(struct tep_handle *tep, int index)
-{
- if (tep && tep->events && index < tep->nr_events)
- return tep->events[index];
-
- return NULL;
-}
-
-/**
- * tep_get_first_event - returns the first event in the events array
- * @tep: a handle to the tep_handle
- *
- * This returns pointer to the first element of the events array
- * If @tep is NULL, NULL is returned.
- */
-struct tep_event *tep_get_first_event(struct tep_handle *tep)
-{
- return tep_get_event(tep, 0);
-}
-
-/**
- * tep_get_events_count - get the number of defined events
- * @tep: a handle to the tep_handle
- *
- * This returns number of elements in event array
- * If @tep is NULL, 0 is returned.
- */
-int tep_get_events_count(struct tep_handle *tep)
-{
- if (tep)
- return tep->nr_events;
- return 0;
-}
-
-/**
- * tep_set_flag - set event parser flag
- * @tep: a handle to the tep_handle
- * @flag: flag, or combination of flags to be set
- * can be any combination from enum tep_flag
- *
- * This sets a flag or combination of flags from enum tep_flag
- */
-void tep_set_flag(struct tep_handle *tep, int flag)
-{
- if (tep)
- tep->flags |= flag;
-}
-
-/**
- * tep_clear_flag - clear event parser flag
- * @tep: a handle to the tep_handle
- * @flag: flag to be cleared
- *
- * This clears a tep flag
- */
-void tep_clear_flag(struct tep_handle *tep, enum tep_flag flag)
-{
- if (tep)
- tep->flags &= ~flag;
-}
-
-/**
- * tep_test_flag - check the state of event parser flag
- * @tep: a handle to the tep_handle
- * @flag: flag to be checked
- *
- * This returns the state of the requested tep flag.
- * Returns: true if the flag is set, false otherwise.
- */
-bool tep_test_flag(struct tep_handle *tep, enum tep_flag flag)
-{
- if (tep)
- return tep->flags & flag;
- return false;
-}
-
-__hidden unsigned short data2host2(struct tep_handle *tep, unsigned short data)
-{
- unsigned short swap;
-
- if (!tep || tep->host_bigendian == tep->file_bigendian)
- return data;
-
- swap = ((data & 0xffULL) << 8) |
- ((data & (0xffULL << 8)) >> 8);
-
- return swap;
-}
-
-__hidden unsigned int data2host4(struct tep_handle *tep, unsigned int data)
-{
- unsigned int swap;
-
- if (!tep || tep->host_bigendian == tep->file_bigendian)
- return data;
-
- swap = ((data & 0xffULL) << 24) |
- ((data & (0xffULL << 8)) << 8) |
- ((data & (0xffULL << 16)) >> 8) |
- ((data & (0xffULL << 24)) >> 24);
-
- return swap;
-}
-
-__hidden unsigned long long
-data2host8(struct tep_handle *tep, unsigned long long data)
-{
- unsigned long long swap;
-
- if (!tep || tep->host_bigendian == tep->file_bigendian)
- return data;
-
- swap = ((data & 0xffULL) << 56) |
- ((data & (0xffULL << 8)) << 40) |
- ((data & (0xffULL << 16)) << 24) |
- ((data & (0xffULL << 24)) << 8) |
- ((data & (0xffULL << 32)) >> 8) |
- ((data & (0xffULL << 40)) >> 24) |
- ((data & (0xffULL << 48)) >> 40) |
- ((data & (0xffULL << 56)) >> 56);
-
- return swap;
-}
-
-/**
- * tep_get_header_page_size - get size of the header page
- * @tep: a handle to the tep_handle
- *
- * This returns size of the header page
- * If @tep is NULL, 0 is returned.
- */
-int tep_get_header_page_size(struct tep_handle *tep)
-{
- if (tep)
- return tep->header_page_size_size;
- return 0;
-}
-
-/**
- * tep_get_header_timestamp_size - get size of the timestamp in the header page
- * @tep: a handle to the tep_handle
- *
- * This returns size of the timestamp in the header page
- * If @tep is NULL, 0 is returned.
- */
-int tep_get_header_timestamp_size(struct tep_handle *tep)
-{
- if (tep)
- return tep->header_page_ts_size;
- return 0;
-}
-
-/**
- * tep_get_cpus - get the number of CPUs
- * @tep: a handle to the tep_handle
- *
- * This returns the number of CPUs
- * If @tep is NULL, 0 is returned.
- */
-int tep_get_cpus(struct tep_handle *tep)
-{
- if (tep)
- return tep->cpus;
- return 0;
-}
-
-/**
- * tep_set_cpus - set the number of CPUs
- * @tep: a handle to the tep_handle
- *
- * This sets the number of CPUs
- */
-void tep_set_cpus(struct tep_handle *tep, int cpus)
-{
- if (tep)
- tep->cpus = cpus;
-}
-
-/**
- * tep_get_long_size - get the size of a long integer on the traced machine
- * @tep: a handle to the tep_handle
- *
- * This returns the size of a long integer on the traced machine
- * If @tep is NULL, 0 is returned.
- */
-int tep_get_long_size(struct tep_handle *tep)
-{
- if (tep)
- return tep->long_size;
- return 0;
-}
-
-/**
- * tep_set_long_size - set the size of a long integer on the traced machine
- * @tep: a handle to the tep_handle
- * @size: size, in bytes, of a long integer
- *
- * This sets the size of a long integer on the traced machine
- */
-void tep_set_long_size(struct tep_handle *tep, int long_size)
-{
- if (tep)
- tep->long_size = long_size;
-}
-
-/**
- * tep_get_page_size - get the size of a memory page on the traced machine
- * @tep: a handle to the tep_handle
- *
- * This returns the size of a memory page on the traced machine
- * If @tep is NULL, 0 is returned.
- */
-int tep_get_page_size(struct tep_handle *tep)
-{
- if (tep)
- return tep->page_size;
- return 0;
-}
-
-/**
- * tep_set_page_size - set the size of a memory page on the traced machine
- * @tep: a handle to the tep_handle
- * @_page_size: size of a memory page, in bytes
- *
- * This sets the size of a memory page on the traced machine
- */
-void tep_set_page_size(struct tep_handle *tep, int _page_size)
-{
- if (tep)
- tep->page_size = _page_size;
-}
-
-/**
- * tep_is_file_bigendian - return the endian of the file
- * @tep: a handle to the tep_handle
- *
- * This returns true if the file is in big endian order
- * If @tep is NULL, false is returned.
- */
-bool tep_is_file_bigendian(struct tep_handle *tep)
-{
- if (tep)
- return (tep->file_bigendian == TEP_BIG_ENDIAN);
- return false;
-}
-
-/**
- * tep_set_file_bigendian - set if the file is in big endian order
- * @tep: a handle to the tep_handle
- * @endian: non zero, if the file is in big endian order
- *
- * This sets if the file is in big endian order
- */
-void tep_set_file_bigendian(struct tep_handle *tep, enum tep_endian endian)
-{
- if (tep)
- tep->file_bigendian = endian;
-}
-
-/**
- * tep_is_local_bigendian - return the endian of the saved local machine
- * @tep: a handle to the tep_handle
- *
- * This returns true if the saved local machine in @tep is big endian.
- * If @tep is NULL, false is returned.
- */
-bool tep_is_local_bigendian(struct tep_handle *tep)
-{
- if (tep)
- return (tep->host_bigendian == TEP_BIG_ENDIAN);
- return 0;
-}
-
-/**
- * tep_set_local_bigendian - set the stored local machine endian order
- * @tep: a handle to the tep_handle
- * @endian: non zero, if the local host has big endian order
- *
- * This sets the endian order for the local machine.
- */
-void tep_set_local_bigendian(struct tep_handle *tep, enum tep_endian endian)
-{
- if (tep)
- tep->host_bigendian = endian;
-}
-
-/**
- * tep_is_old_format - get if an old kernel is used
- * @tep: a handle to the tep_handle
- *
- * This returns true, if an old kernel is used to generate the tracing events or
- * false if a new kernel is used. Old kernels did not have header page info.
- * If @tep is NULL, false is returned.
- */
-bool tep_is_old_format(struct tep_handle *tep)
-{
- if (tep)
- return tep->old_format;
- return false;
-}
-
-/**
- * tep_set_test_filters - set a flag to test a filter string
- * @tep: a handle to the tep_handle
- * @test_filters: the new value of the test_filters flag
- *
- * This sets a flag to test a filter string. If this flag is set, when
- * tep_filter_add_filter_str() API as called,it will print the filter string
- * instead of adding it.
- */
-void tep_set_test_filters(struct tep_handle *tep, int test_filters)
-{
- if (tep)
- tep->test_filters = test_filters;
-}
diff --git a/tools/lib/traceevent/event-parse-local.h b/tools/lib/traceevent/event-parse-local.h
deleted file mode 100644
index fd4bbcfbb849..000000000000
--- a/tools/lib/traceevent/event-parse-local.h
+++ /dev/null
@@ -1,123 +0,0 @@
-// SPDX-License-Identifier: LGPL-2.1
-/*
- * Copyright (C) 2009, 2010 Red Hat Inc, Steven Rostedt <[email protected]>
- *
- */
-
-#ifndef _PARSE_EVENTS_INT_H
-#define _PARSE_EVENTS_INT_H
-
-struct tep_cmdline;
-struct cmdline_list;
-struct func_map;
-struct func_list;
-struct event_handler;
-struct func_resolver;
-struct tep_plugins_dir;
-
-#define __hidden __attribute__((visibility ("hidden")))
-
-struct tep_handle {
- int ref_count;
-
- int header_page_ts_offset;
- int header_page_ts_size;
- int header_page_size_offset;
- int header_page_size_size;
- int header_page_data_offset;
- int header_page_data_size;
- int header_page_overwrite;
-
- enum tep_endian file_bigendian;
- enum tep_endian host_bigendian;
-
- int old_format;
-
- int cpus;
- int long_size;
- int page_size;
-
- struct tep_cmdline *cmdlines;
- struct cmdline_list *cmdlist;
- int cmdline_count;
-
- struct func_map *func_map;
- struct func_resolver *func_resolver;
- struct func_list *funclist;
- unsigned int func_count;
-
- struct printk_map *printk_map;
- struct printk_list *printklist;
- unsigned int printk_count;
-
- struct tep_event **events;
- int nr_events;
- struct tep_event **sort_events;
- enum tep_event_sort_type last_type;
-
- int type_offset;
- int type_size;
-
- int pid_offset;
- int pid_size;
-
- int pc_offset;
- int pc_size;
-
- int flags_offset;
- int flags_size;
-
- int ld_offset;
- int ld_size;
-
- int test_filters;
-
- int flags;
-
- struct tep_format_field *bprint_ip_field;
- struct tep_format_field *bprint_fmt_field;
- struct tep_format_field *bprint_buf_field;
-
- struct event_handler *handlers;
- struct tep_function_handler *func_handlers;
-
- /* cache */
- struct tep_event *last_event;
-
- struct tep_plugins_dir *plugins_dir;
-};
-
-enum tep_print_parse_type {
- PRINT_FMT_STRING,
- PRINT_FMT_ARG_DIGIT,
- PRINT_FMT_ARG_POINTER,
- PRINT_FMT_ARG_STRING,
-};
-
-struct tep_print_parse {
- struct tep_print_parse *next;
-
- char *format;
- int ls;
- enum tep_print_parse_type type;
- struct tep_print_arg *arg;
- struct tep_print_arg *len_as_arg;
-};
-
-void free_tep_event(struct tep_event *event);
-void free_tep_format_field(struct tep_format_field *field);
-void free_tep_plugin_paths(struct tep_handle *tep);
-
-unsigned short data2host2(struct tep_handle *tep, unsigned short data);
-unsigned int data2host4(struct tep_handle *tep, unsigned int data);
-unsigned long long data2host8(struct tep_handle *tep, unsigned long long data);
-
-/* access to the internal parser */
-int peek_char(void);
-void init_input_buf(const char *buf, unsigned long long size);
-unsigned long long get_input_buf_ptr(void);
-const char *get_input_buf(void);
-enum tep_event_type read_token(char **tok);
-void free_token(char *tok);
-
-#endif /* _PARSE_EVENTS_INT_H */
diff --git a/tools/lib/traceevent/event-parse.c b/tools/lib/traceevent/event-parse.c
deleted file mode 100644
index 8e24c4c78c7f..000000000000
--- a/tools/lib/traceevent/event-parse.c
+++ /dev/null
@@ -1,7624 +0,0 @@
-// SPDX-License-Identifier: LGPL-2.1
-/*
- * Copyright (C) 2009, 2010 Red Hat Inc, Steven Rostedt <[email protected]>
- *
- *
- * The parts for function graph printing was taken and modified from the
- * Linux Kernel that were written by
- * - Copyright (C) 2009 Frederic Weisbecker,
- * Frederic Weisbecker gave his permission to relicense the code to
- * the Lesser General Public License.
- */
-#include <inttypes.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdarg.h>
-#include <ctype.h>
-#include <errno.h>
-#include <stdint.h>
-#include <limits.h>
-#include <linux/time64.h>
-
-#include <netinet/in.h>
-#include "event-parse.h"
-
-#include "event-parse-local.h"
-#include "event-utils.h"
-#include "trace-seq.h"
-
-static const char *input_buf;
-static unsigned long long input_buf_ptr;
-static unsigned long long input_buf_siz;
-
-static int is_flag_field;
-static int is_symbolic_field;
-
-static int show_warning = 1;
-
-#define do_warning(fmt, ...) \
- do { \
- if (show_warning) \
- warning(fmt, ##__VA_ARGS__); \
- } while (0)
-
-#define do_warning_event(event, fmt, ...) \
- do { \
- if (!show_warning) \
- continue; \
- \
- if (event) \
- warning("[%s:%s] " fmt, event->system, \
- event->name, ##__VA_ARGS__); \
- else \
- warning(fmt, ##__VA_ARGS__); \
- } while (0)
-
-/**
- * init_input_buf - init buffer for parsing
- * @buf: buffer to parse
- * @size: the size of the buffer
- *
- * Initializes the internal buffer that tep_read_token() will parse.
- */
-__hidden void init_input_buf(const char *buf, unsigned long long size)
-{
- input_buf = buf;
- input_buf_siz = size;
- input_buf_ptr = 0;
-}
-
-__hidden const char *get_input_buf(void)
-{
- return input_buf;
-}
-
-__hidden unsigned long long get_input_buf_ptr(void)
-{
- return input_buf_ptr;
-}
-
-struct event_handler {
- struct event_handler *next;
- int id;
- const char *sys_name;
- const char *event_name;
- tep_event_handler_func func;
- void *context;
-};
-
-struct func_params {
- struct func_params *next;
- enum tep_func_arg_type type;
-};
-
-struct tep_function_handler {
- struct tep_function_handler *next;
- enum tep_func_arg_type ret_type;
- char *name;
- tep_func_handler func;
- struct func_params *params;
- int nr_args;
-};
-
-static unsigned long long
-process_defined_func(struct trace_seq *s, void *data, int size,
- struct tep_event *event, struct tep_print_arg *arg);
-
-static void free_func_handle(struct tep_function_handler *func);
-
-void breakpoint(void)
-{
- static int x;
- x++;
-}
-
-static struct tep_print_arg *alloc_arg(void)
-{
- return calloc(1, sizeof(struct tep_print_arg));
-}
-
-struct tep_cmdline {
- char *comm;
- int pid;
-};
-
-static int cmdline_cmp(const void *a, const void *b)
-{
- const struct tep_cmdline *ca = a;
- const struct tep_cmdline *cb = b;
-
- if (ca->pid < cb->pid)
- return -1;
- if (ca->pid > cb->pid)
- return 1;
-
- return 0;
-}
-
-/* Looking for where to place the key */
-static int cmdline_slot_cmp(const void *a, const void *b)
-{
- const struct tep_cmdline *ca = a;
- const struct tep_cmdline *cb = b;
- const struct tep_cmdline *cb1 = cb + 1;
-
- if (ca->pid < cb->pid)
- return -1;
-
- if (ca->pid > cb->pid) {
- if (ca->pid <= cb1->pid)
- return 0;
- return 1;
- }
-
- return 0;
-}
-
-struct cmdline_list {
- struct cmdline_list *next;
- char *comm;
- int pid;
-};
-
-static int cmdline_init(struct tep_handle *tep)
-{
- struct cmdline_list *cmdlist = tep->cmdlist;
- struct cmdline_list *item;
- struct tep_cmdline *cmdlines;
- int i;
-
- cmdlines = malloc(sizeof(*cmdlines) * tep->cmdline_count);
- if (!cmdlines)
- return -1;
-
- i = 0;
- while (cmdlist) {
- cmdlines[i].pid = cmdlist->pid;
- cmdlines[i].comm = cmdlist->comm;
- i++;
- item = cmdlist;
- cmdlist = cmdlist->next;
- free(item);
- }
-
- qsort(cmdlines, tep->cmdline_count, sizeof(*cmdlines), cmdline_cmp);
-
- tep->cmdlines = cmdlines;
- tep->cmdlist = NULL;
-
- return 0;
-}
-
-static const char *find_cmdline(struct tep_handle *tep, int pid)
-{
- const struct tep_cmdline *comm;
- struct tep_cmdline key;
-
- if (!pid)
- return "<idle>";
-
- if (!tep->cmdlines && cmdline_init(tep))
- return "<not enough memory for cmdlines!>";
-
- key.pid = pid;
-
- comm = bsearch(&key, tep->cmdlines, tep->cmdline_count,
- sizeof(*tep->cmdlines), cmdline_cmp);
-
- if (comm)
- return comm->comm;
- return "<...>";
-}
-
-/**
- * tep_is_pid_registered - return if a pid has a cmdline registered
- * @tep: a handle to the trace event parser context
- * @pid: The pid to check if it has a cmdline registered with.
- *
- * Returns true if the pid has a cmdline mapped to it
- * false otherwise.
- */
-bool tep_is_pid_registered(struct tep_handle *tep, int pid)
-{
- const struct tep_cmdline *comm;
- struct tep_cmdline key;
-
- if (!pid)
- return true;
-
- if (!tep->cmdlines && cmdline_init(tep))
- return false;
-
- key.pid = pid;
-
- comm = bsearch(&key, tep->cmdlines, tep->cmdline_count,
- sizeof(*tep->cmdlines), cmdline_cmp);
-
- if (comm)
- return true;
- return false;
-}
-
-/*
- * If the command lines have been converted to an array, then
- * we must add this pid. This is much slower than when cmdlines
- * are added before the array is initialized.
- */
-static int add_new_comm(struct tep_handle *tep,
- const char *comm, int pid, bool override)
-{
- struct tep_cmdline *cmdlines = tep->cmdlines;
- struct tep_cmdline *cmdline;
- struct tep_cmdline key;
- char *new_comm;
- int cnt;
-
- if (!pid)
- return 0;
-
- /* avoid duplicates */
- key.pid = pid;
-
- cmdline = bsearch(&key, tep->cmdlines, tep->cmdline_count,
- sizeof(*tep->cmdlines), cmdline_cmp);
- if (cmdline) {
- if (!override) {
- errno = EEXIST;
- return -1;
- }
- new_comm = strdup(comm);
- if (!new_comm) {
- errno = ENOMEM;
- return -1;
- }
- free(cmdline->comm);
- cmdline->comm = new_comm;
-
- return 0;
- }
-
- cmdlines = realloc(cmdlines, sizeof(*cmdlines) * (tep->cmdline_count + 1));
- if (!cmdlines) {
- errno = ENOMEM;
- return -1;
- }
- tep->cmdlines = cmdlines;
-
- key.comm = strdup(comm);
- if (!key.comm) {
- errno = ENOMEM;
- return -1;
- }
-
- if (!tep->cmdline_count) {
- /* no entries yet */
- tep->cmdlines[0] = key;
- tep->cmdline_count++;
- return 0;
- }
-
- /* Now find where we want to store the new cmdline */
- cmdline = bsearch(&key, tep->cmdlines, tep->cmdline_count - 1,
- sizeof(*tep->cmdlines), cmdline_slot_cmp);
-
- cnt = tep->cmdline_count;
- if (cmdline) {
- /* cmdline points to the one before the spot we want */
- cmdline++;
- cnt -= cmdline - tep->cmdlines;
-
- } else {
- /* The new entry is either before or after the list */
- if (key.pid > tep->cmdlines[tep->cmdline_count - 1].pid) {
- tep->cmdlines[tep->cmdline_count++] = key;
- return 0;
- }
- cmdline = &tep->cmdlines[0];
- }
- memmove(cmdline + 1, cmdline, (cnt * sizeof(*cmdline)));
- *cmdline = key;
-
- tep->cmdline_count++;
-
- return 0;
-}
-
-static int _tep_register_comm(struct tep_handle *tep,
- const char *comm, int pid, bool override)
-{
- struct cmdline_list *item;
-
- if (tep->cmdlines)
- return add_new_comm(tep, comm, pid, override);
-
- item = malloc(sizeof(*item));
- if (!item)
- return -1;
-
- if (comm)
- item->comm = strdup(comm);
- else
- item->comm = strdup("<...>");
- if (!item->comm) {
- free(item);
- return -1;
- }
- item->pid = pid;
- item->next = tep->cmdlist;
-
- tep->cmdlist = item;
- tep->cmdline_count++;
-
- return 0;
-}
-
-/**
- * tep_register_comm - register a pid / comm mapping
- * @tep: a handle to the trace event parser context
- * @comm: the command line to register
- * @pid: the pid to map the command line to
- *
- * This adds a mapping to search for command line names with
- * a given pid. The comm is duplicated. If a command with the same pid
- * already exist, -1 is returned and errno is set to EEXIST
- */
-int tep_register_comm(struct tep_handle *tep, const char *comm, int pid)
-{
- return _tep_register_comm(tep, comm, pid, false);
-}
-
-/**
- * tep_override_comm - register a pid / comm mapping
- * @tep: a handle to the trace event parser context
- * @comm: the command line to register
- * @pid: the pid to map the command line to
- *
- * This adds a mapping to search for command line names with
- * a given pid. The comm is duplicated. If a command with the same pid
- * already exist, the command string is udapted with the new one
- */
-int tep_override_comm(struct tep_handle *tep, const char *comm, int pid)
-{
- if (!tep->cmdlines && cmdline_init(tep)) {
- errno = ENOMEM;
- return -1;
- }
- return _tep_register_comm(tep, comm, pid, true);
-}
-
-struct func_map {
- unsigned long long addr;
- char *func;
- char *mod;
-};
-
-struct func_list {
- struct func_list *next;
- unsigned long long addr;
- char *func;
- char *mod;
-};
-
-static int func_cmp(const void *a, const void *b)
-{
- const struct func_map *fa = a;
- const struct func_map *fb = b;
-
- if (fa->addr < fb->addr)
- return -1;
- if (fa->addr > fb->addr)
- return 1;
-
- return 0;
-}
-
-/*
- * We are searching for a record in between, not an exact
- * match.
- */
-static int func_bcmp(const void *a, const void *b)
-{
- const struct func_map *fa = a;
- const struct func_map *fb = b;
-
- if ((fa->addr == fb->addr) ||
-
- (fa->addr > fb->addr &&
- fa->addr < (fb+1)->addr))
- return 0;
-
- if (fa->addr < fb->addr)
- return -1;
-
- return 1;
-}
-
-static int func_map_init(struct tep_handle *tep)
-{
- struct func_list *funclist;
- struct func_list *item;
- struct func_map *func_map;
- int i;
-
- func_map = malloc(sizeof(*func_map) * (tep->func_count + 1));
- if (!func_map)
- return -1;
-
- funclist = tep->funclist;
-
- i = 0;
- while (funclist) {
- func_map[i].func = funclist->func;
- func_map[i].addr = funclist->addr;
- func_map[i].mod = funclist->mod;
- i++;
- item = funclist;
- funclist = funclist->next;
- free(item);
- }
-
- qsort(func_map, tep->func_count, sizeof(*func_map), func_cmp);
-
- /*
- * Add a special record at the end.
- */
- func_map[tep->func_count].func = NULL;
- func_map[tep->func_count].addr = 0;
- func_map[tep->func_count].mod = NULL;
-
- tep->func_map = func_map;
- tep->funclist = NULL;
-
- return 0;
-}
-
-static struct func_map *
-__find_func(struct tep_handle *tep, unsigned long long addr)
-{
- struct func_map *func;
- struct func_map key;
-
- if (!tep->func_map)
- func_map_init(tep);
-
- key.addr = addr;
-
- func = bsearch(&key, tep->func_map, tep->func_count,
- sizeof(*tep->func_map), func_bcmp);
-
- return func;
-}
-
-struct func_resolver {
- tep_func_resolver_t *func;
- void *priv;
- struct func_map map;
-};
-
-/**
- * tep_set_function_resolver - set an alternative function resolver
- * @tep: a handle to the trace event parser context
- * @resolver: function to be used
- * @priv: resolver function private state.
- *
- * Some tools may have already a way to resolve kernel functions, allow them to
- * keep using it instead of duplicating all the entries inside tep->funclist.
- */
-int tep_set_function_resolver(struct tep_handle *tep,
- tep_func_resolver_t *func, void *priv)
-{
- struct func_resolver *resolver = malloc(sizeof(*resolver));
-
- if (resolver == NULL)
- return -1;
-
- resolver->func = func;
- resolver->priv = priv;
-
- free(tep->func_resolver);
- tep->func_resolver = resolver;
-
- return 0;
-}
-
-/**
- * tep_reset_function_resolver - reset alternative function resolver
- * @tep: a handle to the trace event parser context
- *
- * Stop using whatever alternative resolver was set, use the default
- * one instead.
- */
-void tep_reset_function_resolver(struct tep_handle *tep)
-{
- free(tep->func_resolver);
- tep->func_resolver = NULL;
-}
-
-static struct func_map *
-find_func(struct tep_handle *tep, unsigned long long addr)
-{
- struct func_map *map;
-
- if (!tep->func_resolver)
- return __find_func(tep, addr);
-
- map = &tep->func_resolver->map;
- map->mod = NULL;
- map->addr = addr;
- map->func = tep->func_resolver->func(tep->func_resolver->priv,
- &map->addr, &map->mod);
- if (map->func == NULL)
- return NULL;
-
- return map;
-}
-
-/**
- * tep_find_function - find a function by a given address
- * @tep: a handle to the trace event parser context
- * @addr: the address to find the function with
- *
- * Returns a pointer to the function stored that has the given
- * address. Note, the address does not have to be exact, it
- * will select the function that would contain the address.
- */
-const char *tep_find_function(struct tep_handle *tep, unsigned long long addr)
-{
- struct func_map *map;
-
- map = find_func(tep, addr);
- if (!map)
- return NULL;
-
- return map->func;
-}
-
-/**
- * tep_find_function_address - find a function address by a given address
- * @tep: a handle to the trace event parser context
- * @addr: the address to find the function with
- *
- * Returns the address the function starts at. This can be used in
- * conjunction with tep_find_function to print both the function
- * name and the function offset.
- */
-unsigned long long
-tep_find_function_address(struct tep_handle *tep, unsigned long long addr)
-{
- struct func_map *map;
-
- map = find_func(tep, addr);
- if (!map)
- return 0;
-
- return map->addr;
-}
-
-/**
- * tep_register_function - register a function with a given address
- * @tep: a handle to the trace event parser context
- * @function: the function name to register
- * @addr: the address the function starts at
- * @mod: the kernel module the function may be in (NULL for none)
- *
- * This registers a function name with an address and module.
- * The @func passed in is duplicated.
- */
-int tep_register_function(struct tep_handle *tep, char *func,
- unsigned long long addr, char *mod)
-{
- struct func_list *item = malloc(sizeof(*item));
-
- if (!item)
- return -1;
-
- item->next = tep->funclist;
- item->func = strdup(func);
- if (!item->func)
- goto out_free;
-
- if (mod) {
- item->mod = strdup(mod);
- if (!item->mod)
- goto out_free_func;
- } else
- item->mod = NULL;
- item->addr = addr;
-
- tep->funclist = item;
- tep->func_count++;
-
- return 0;
-
-out_free_func:
- free(item->func);
- item->func = NULL;
-out_free:
- free(item);
- errno = ENOMEM;
- return -1;
-}
-
-/**
- * tep_print_funcs - print out the stored functions
- * @tep: a handle to the trace event parser context
- *
- * This prints out the stored functions.
- */
-void tep_print_funcs(struct tep_handle *tep)
-{
- int i;
-
- if (!tep->func_map)
- func_map_init(tep);
-
- for (i = 0; i < (int)tep->func_count; i++) {
- printf("%016llx %s",
- tep->func_map[i].addr,
- tep->func_map[i].func);
- if (tep->func_map[i].mod)
- printf(" [%s]\n", tep->func_map[i].mod);
- else
- printf("\n");
- }
-}
-
-struct printk_map {
- unsigned long long addr;
- char *printk;
-};
-
-struct printk_list {
- struct printk_list *next;
- unsigned long long addr;
- char *printk;
-};
-
-static int printk_cmp(const void *a, const void *b)
-{
- const struct printk_map *pa = a;
- const struct printk_map *pb = b;
-
- if (pa->addr < pb->addr)
- return -1;
- if (pa->addr > pb->addr)
- return 1;
-
- return 0;
-}
-
-static int printk_map_init(struct tep_handle *tep)
-{
- struct printk_list *printklist;
- struct printk_list *item;
- struct printk_map *printk_map;
- int i;
-
- printk_map = malloc(sizeof(*printk_map) * (tep->printk_count + 1));
- if (!printk_map)
- return -1;
-
- printklist = tep->printklist;
-
- i = 0;
- while (printklist) {
- printk_map[i].printk = printklist->printk;
- printk_map[i].addr = printklist->addr;
- i++;
- item = printklist;
- printklist = printklist->next;
- free(item);
- }
-
- qsort(printk_map, tep->printk_count, sizeof(*printk_map), printk_cmp);
-
- tep->printk_map = printk_map;
- tep->printklist = NULL;
-
- return 0;
-}
-
-static struct printk_map *
-find_printk(struct tep_handle *tep, unsigned long long addr)
-{
- struct printk_map *printk;
- struct printk_map key;
-
- if (!tep->printk_map && printk_map_init(tep))
- return NULL;
-
- key.addr = addr;
-
- printk = bsearch(&key, tep->printk_map, tep->printk_count,
- sizeof(*tep->printk_map), printk_cmp);
-
- return printk;
-}
-
-/**
- * tep_register_print_string - register a string by its address
- * @tep: a handle to the trace event parser context
- * @fmt: the string format to register
- * @addr: the address the string was located at
- *
- * This registers a string by the address it was stored in the kernel.
- * The @fmt passed in is duplicated.
- */
-int tep_register_print_string(struct tep_handle *tep, const char *fmt,
- unsigned long long addr)
-{
- struct printk_list *item = malloc(sizeof(*item));
- char *p;
-
- if (!item)
- return -1;
-
- item->next = tep->printklist;
- item->addr = addr;
-
- /* Strip off quotes and '\n' from the end */
- if (fmt[0] == '"')
- fmt++;
- item->printk = strdup(fmt);
- if (!item->printk)
- goto out_free;
-
- p = item->printk + strlen(item->printk) - 1;
- if (*p == '"')
- *p = 0;
-
- p -= 2;
- if (strcmp(p, "\\n") == 0)
- *p = 0;
-
- tep->printklist = item;
- tep->printk_count++;
-
- return 0;
-
-out_free:
- free(item);
- errno = ENOMEM;
- return -1;
-}
-
-/**
- * tep_print_printk - print out the stored strings
- * @tep: a handle to the trace event parser context
- *
- * This prints the string formats that were stored.
- */
-void tep_print_printk(struct tep_handle *tep)
-{
- int i;
-
- if (!tep->printk_map)
- printk_map_init(tep);
-
- for (i = 0; i < (int)tep->printk_count; i++) {
- printf("%016llx %s\n",
- tep->printk_map[i].addr,
- tep->printk_map[i].printk);
- }
-}
-
-static struct tep_event *alloc_event(void)
-{
- return calloc(1, sizeof(struct tep_event));
-}
-
-static int add_event(struct tep_handle *tep, struct tep_event *event)
-{
- int i;
- struct tep_event **events = realloc(tep->events, sizeof(event) *
- (tep->nr_events + 1));
- if (!events)
- return -1;
-
- tep->events = events;
-
- for (i = 0; i < tep->nr_events; i++) {
- if (tep->events[i]->id > event->id)
- break;
- }
- if (i < tep->nr_events)
- memmove(&tep->events[i + 1],
- &tep->events[i],
- sizeof(event) * (tep->nr_events - i));
-
- tep->events[i] = event;
- tep->nr_events++;
-
- event->tep = tep;
-
- return 0;
-}
-
-static int event_item_type(enum tep_event_type type)
-{
- switch (type) {
- case TEP_EVENT_ITEM ... TEP_EVENT_SQUOTE:
- return 1;
- case TEP_EVENT_ERROR ... TEP_EVENT_DELIM:
- default:
- return 0;
- }
-}
-
-static void free_flag_sym(struct tep_print_flag_sym *fsym)
-{
- struct tep_print_flag_sym *next;
-
- while (fsym) {
- next = fsym->next;
- free(fsym->value);
- free(fsym->str);
- free(fsym);
- fsym = next;
- }
-}
-
-static void free_arg(struct tep_print_arg *arg)
-{
- struct tep_print_arg *farg;
-
- if (!arg)
- return;
-
- switch (arg->type) {
- case TEP_PRINT_ATOM:
- free(arg->atom.atom);
- break;
- case TEP_PRINT_FIELD:
- free(arg->field.name);
- break;
- case TEP_PRINT_FLAGS:
- free_arg(arg->flags.field);
- free(arg->flags.delim);
- free_flag_sym(arg->flags.flags);
- break;
- case TEP_PRINT_SYMBOL:
- free_arg(arg->symbol.field);
- free_flag_sym(arg->symbol.symbols);
- break;
- case TEP_PRINT_HEX:
- case TEP_PRINT_HEX_STR:
- free_arg(arg->hex.field);
- free_arg(arg->hex.size);
- break;
- case TEP_PRINT_INT_ARRAY:
- free_arg(arg->int_array.field);
- free_arg(arg->int_array.count);
- free_arg(arg->int_array.el_size);
- break;
- case TEP_PRINT_TYPE:
- free(arg->typecast.type);
- free_arg(arg->typecast.item);
- break;
- case TEP_PRINT_STRING:
- case TEP_PRINT_BSTRING:
- free(arg->string.string);
- break;
- case TEP_PRINT_BITMASK:
- free(arg->bitmask.bitmask);
- break;
- case TEP_PRINT_DYNAMIC_ARRAY:
- case TEP_PRINT_DYNAMIC_ARRAY_LEN:
- free(arg->dynarray.index);
- break;
- case TEP_PRINT_OP:
- free(arg->op.op);
- free_arg(arg->op.left);
- free_arg(arg->op.right);
- break;
- case TEP_PRINT_FUNC:
- while (arg->func.args) {
- farg = arg->func.args;
- arg->func.args = farg->next;
- free_arg(farg);
- }
- break;
-
- case TEP_PRINT_NULL:
- default:
- break;
- }
-
- free(arg);
-}
-
-static enum tep_event_type get_type(int ch)
-{
- if (ch == '\n')
- return TEP_EVENT_NEWLINE;
- if (isspace(ch))
- return TEP_EVENT_SPACE;
- if (isalnum(ch) || ch == '_')
- return TEP_EVENT_ITEM;
- if (ch == '\'')
- return TEP_EVENT_SQUOTE;
- if (ch == '"')
- return TEP_EVENT_DQUOTE;
- if (!isprint(ch))
- return TEP_EVENT_NONE;
- if (ch == '(' || ch == ')' || ch == ',')
- return TEP_EVENT_DELIM;
-
- return TEP_EVENT_OP;
-}
-
-static int __read_char(void)
-{
- if (input_buf_ptr >= input_buf_siz)
- return -1;
-
- return input_buf[input_buf_ptr++];
-}
-
-/**
- * peek_char - peek at the next character that will be read
- *
- * Returns the next character read, or -1 if end of buffer.
- */
-__hidden int peek_char(void)
-{
- if (input_buf_ptr >= input_buf_siz)
- return -1;
-
- return input_buf[input_buf_ptr];
-}
-
-static int extend_token(char **tok, char *buf, int size)
-{
- char *newtok = realloc(*tok, size);
-
- if (!newtok) {
- free(*tok);
- *tok = NULL;
- return -1;
- }
-
- if (!*tok)
- strcpy(newtok, buf);
- else
- strcat(newtok, buf);
- *tok = newtok;
-
- return 0;
-}
-
-static enum tep_event_type force_token(const char *str, char **tok);
-
-static enum tep_event_type __read_token(char **tok)
-{
- char buf[BUFSIZ];
- int ch, last_ch, quote_ch, next_ch;
- int i = 0;
- int tok_size = 0;
- enum tep_event_type type;
-
- *tok = NULL;
-
-
- ch = __read_char();
- if (ch < 0)
- return TEP_EVENT_NONE;
-
- type = get_type(ch);
- if (type == TEP_EVENT_NONE)
- return type;
-
- buf[i++] = ch;
-
- switch (type) {
- case TEP_EVENT_NEWLINE:
- case TEP_EVENT_DELIM:
- if (asprintf(tok, "%c", ch) < 0)
- return TEP_EVENT_ERROR;
-
- return type;
-
- case TEP_EVENT_OP:
- switch (ch) {
- case '-':
- next_ch = peek_char();
- if (next_ch == '>') {
- buf[i++] = __read_char();
- break;
- }
- /* fall through */
- case '+':
- case '|':
- case '&':
- case '>':
- case '<':
- last_ch = ch;
- ch = peek_char();
- if (ch != last_ch)
- goto test_equal;
- buf[i++] = __read_char();
- switch (last_ch) {
- case '>':
- case '<':
- goto test_equal;
- default:
- break;
- }
- break;
- case '!':
- case '=':
- goto test_equal;
- default: /* what should we do instead? */
- break;
- }
- buf[i] = 0;
- *tok = strdup(buf);
- return type;
-
- test_equal:
- ch = peek_char();
- if (ch == '=')
- buf[i++] = __read_char();
- goto out;
-
- case TEP_EVENT_DQUOTE:
- case TEP_EVENT_SQUOTE:
- /* don't keep quotes */
- i--;
- quote_ch = ch;
- last_ch = 0;
- concat:
- do {
- if (i == (BUFSIZ - 1)) {
- buf[i] = 0;
- tok_size += BUFSIZ;
-
- if (extend_token(tok, buf, tok_size) < 0)
- return TEP_EVENT_NONE;
- i = 0;
- }
- last_ch = ch;
- ch = __read_char();
- buf[i++] = ch;
- /* the '\' '\' will cancel itself */
- if (ch == '\\' && last_ch == '\\')
- last_ch = 0;
- } while (ch != quote_ch || last_ch == '\\');
- /* remove the last quote */
- i--;
-
- /*
- * For strings (double quotes) check the next token.
- * If it is another string, concatinate the two.
- */
- if (type == TEP_EVENT_DQUOTE) {
- unsigned long long save_input_buf_ptr = input_buf_ptr;
-
- do {
- ch = __read_char();
- } while (isspace(ch));
- if (ch == '"')
- goto concat;
- input_buf_ptr = save_input_buf_ptr;
- }
-
- goto out;
-
- case TEP_EVENT_ERROR ... TEP_EVENT_SPACE:
- case TEP_EVENT_ITEM:
- default:
- break;
- }
-
- while (get_type(peek_char()) == type) {
- if (i == (BUFSIZ - 1)) {
- buf[i] = 0;
- tok_size += BUFSIZ;
-
- if (extend_token(tok, buf, tok_size) < 0)
- return TEP_EVENT_NONE;
- i = 0;
- }
- ch = __read_char();
- buf[i++] = ch;
- }
-
- out:
- buf[i] = 0;
- if (extend_token(tok, buf, tok_size + i + 1) < 0)
- return TEP_EVENT_NONE;
-
- if (type == TEP_EVENT_ITEM) {
- /*
- * Older versions of the kernel has a bug that
- * creates invalid symbols and will break the mac80211
- * parsing. This is a work around to that bug.
- *
- * See Linux kernel commit:
- * 811cb50baf63461ce0bdb234927046131fc7fa8b
- */
- if (strcmp(*tok, "LOCAL_PR_FMT") == 0) {
- free(*tok);
- *tok = NULL;
- return force_token("\"%s\" ", tok);
- } else if (strcmp(*tok, "STA_PR_FMT") == 0) {
- free(*tok);
- *tok = NULL;
- return force_token("\" sta:%pM\" ", tok);
- } else if (strcmp(*tok, "VIF_PR_FMT") == 0) {
- free(*tok);
- *tok = NULL;
- return force_token("\" vif:%p(%d)\" ", tok);
- }
- }
-
- return type;
-}
-
-static enum tep_event_type force_token(const char *str, char **tok)
-{
- const char *save_input_buf;
- unsigned long long save_input_buf_ptr;
- unsigned long long save_input_buf_siz;
- enum tep_event_type type;
-
- /* save off the current input pointers */
- save_input_buf = input_buf;
- save_input_buf_ptr = input_buf_ptr;
- save_input_buf_siz = input_buf_siz;
-
- init_input_buf(str, strlen(str));
-
- type = __read_token(tok);
-
- /* reset back to original token */
- input_buf = save_input_buf;
- input_buf_ptr = save_input_buf_ptr;
- input_buf_siz = save_input_buf_siz;
-
- return type;
-}
-
-/**
- * free_token - free a token returned by tep_read_token
- * @token: the token to free
- */
-__hidden void free_token(char *tok)
-{
- if (tok)
- free(tok);
-}
-
-/**
- * read_token - access to utilities to use the tep parser
- * @tok: The token to return
- *
- * This will parse tokens from the string given by
- * tep_init_data().
- *
- * Returns the token type.
- */
-__hidden enum tep_event_type read_token(char **tok)
-{
- enum tep_event_type type;
-
- for (;;) {
- type = __read_token(tok);
- if (type != TEP_EVENT_SPACE)
- return type;
-
- free_token(*tok);
- }
-
- /* not reached */
- *tok = NULL;
- return TEP_EVENT_NONE;
-}
-
-/* no newline */
-static enum tep_event_type read_token_item(char **tok)
-{
- enum tep_event_type type;
-
- for (;;) {
- type = __read_token(tok);
- if (type != TEP_EVENT_SPACE && type != TEP_EVENT_NEWLINE)
- return type;
- free_token(*tok);
- *tok = NULL;
- }
-
- /* not reached */
- *tok = NULL;
- return TEP_EVENT_NONE;
-}
-
-static int test_type(enum tep_event_type type, enum tep_event_type expect)
-{
- if (type != expect) {
- do_warning("Error: expected type %d but read %d",
- expect, type);
- return -1;
- }
- return 0;
-}
-
-static int test_type_token(enum tep_event_type type, const char *token,
- enum tep_event_type expect, const char *expect_tok)
-{
- if (type != expect) {
- do_warning("Error: expected type %d but read %d",
- expect, type);
- return -1;
- }
-
- if (strcmp(token, expect_tok) != 0) {
- do_warning("Error: expected '%s' but read '%s'",
- expect_tok, token);
- return -1;
- }
- return 0;
-}
-
-static int __read_expect_type(enum tep_event_type expect, char **tok, int newline_ok)
-{
- enum tep_event_type type;
-
- if (newline_ok)
- type = read_token(tok);
- else
- type = read_token_item(tok);
- return test_type(type, expect);
-}
-
-static int read_expect_type(enum tep_event_type expect, char **tok)
-{
- return __read_expect_type(expect, tok, 1);
-}
-
-static int __read_expected(enum tep_event_type expect, const char *str,
- int newline_ok)
-{
- enum tep_event_type type;
- char *token;
- int ret;
-
- if (newline_ok)
- type = read_token(&token);
- else
- type = read_token_item(&token);
-
- ret = test_type_token(type, token, expect, str);
-
- free_token(token);
-
- return ret;
-}
-
-static int read_expected(enum tep_event_type expect, const char *str)
-{
- return __read_expected(expect, str, 1);
-}
-
-static int read_expected_item(enum tep_event_type expect, const char *str)
-{
- return __read_expected(expect, str, 0);
-}
-
-static char *event_read_name(void)
-{
- char *token;
-
- if (read_expected(TEP_EVENT_ITEM, "name") < 0)
- return NULL;
-
- if (read_expected(TEP_EVENT_OP, ":") < 0)
- return NULL;
-
- if (read_expect_type(TEP_EVENT_ITEM, &token) < 0)
- goto fail;
-
- return token;
-
- fail:
- free_token(token);
- return NULL;
-}
-
-static int event_read_id(void)
-{
- char *token;
- int id;
-
- if (read_expected_item(TEP_EVENT_ITEM, "ID") < 0)
- return -1;
-
- if (read_expected(TEP_EVENT_OP, ":") < 0)
- return -1;
-
- if (read_expect_type(TEP_EVENT_ITEM, &token) < 0)
- goto fail;
-
- id = strtoul(token, NULL, 0);
- free_token(token);
- return id;
-
- fail:
- free_token(token);
- return -1;
-}
-
-static int field_is_string(struct tep_format_field *field)
-{
- if ((field->flags & TEP_FIELD_IS_ARRAY) &&
- (strstr(field->type, "char") || strstr(field->type, "u8") ||
- strstr(field->type, "s8")))
- return 1;
-
- return 0;
-}
-
-static int field_is_dynamic(struct tep_format_field *field)
-{
- if (strncmp(field->type, "__data_loc", 10) == 0)
- return 1;
-
- return 0;
-}
-
-static int field_is_relative_dynamic(struct tep_format_field *field)
-{
- if (strncmp(field->type, "__rel_loc", 9) == 0)
- return 1;
-
- return 0;
-}
-
-static int field_is_long(struct tep_format_field *field)
-{
- /* includes long long */
- if (strstr(field->type, "long"))
- return 1;
-
- return 0;
-}
-
-static unsigned int type_size(const char *name)
-{
- /* This covers all TEP_FIELD_IS_STRING types. */
- static struct {
- const char *type;
- unsigned int size;
- } table[] = {
- { "u8", 1 },
- { "u16", 2 },
- { "u32", 4 },
- { "u64", 8 },
- { "s8", 1 },
- { "s16", 2 },
- { "s32", 4 },
- { "s64", 8 },
- { "char", 1 },
- { },
- };
- int i;
-
- for (i = 0; table[i].type; i++) {
- if (!strcmp(table[i].type, name))
- return table[i].size;
- }
-
- return 0;
-}
-
-static int append(char **buf, const char *delim, const char *str)
-{
- char *new_buf;
-
- new_buf = realloc(*buf, strlen(*buf) + strlen(delim) + strlen(str) + 1);
- if (!new_buf)
- return -1;
- strcat(new_buf, delim);
- strcat(new_buf, str);
- *buf = new_buf;
- return 0;
-}
-
-static int event_read_fields(struct tep_event *event, struct tep_format_field **fields)
-{
- struct tep_format_field *field = NULL;
- enum tep_event_type type;
- char *token;
- char *last_token;
- char *delim = " ";
- int count = 0;
- int ret;
-
- do {
- unsigned int size_dynamic = 0;
-
- type = read_token(&token);
- if (type == TEP_EVENT_NEWLINE) {
- free_token(token);
- return count;
- }
-
- count++;
-
- if (test_type_token(type, token, TEP_EVENT_ITEM, "field"))
- goto fail;
- free_token(token);
-
- type = read_token(&token);
- /*
- * The ftrace fields may still use the "special" name.
- * Just ignore it.
- */
- if (event->flags & TEP_EVENT_FL_ISFTRACE &&
- type == TEP_EVENT_ITEM && strcmp(token, "special") == 0) {
- free_token(token);
- type = read_token(&token);
- }
-
- if (test_type_token(type, token, TEP_EVENT_OP, ":") < 0)
- goto fail;
-
- free_token(token);
- if (read_expect_type(TEP_EVENT_ITEM, &token) < 0)
- goto fail;
-
- last_token = token;
-
- field = calloc(1, sizeof(*field));
- if (!field)
- goto fail;
-
- field->event = event;
-
- /* read the rest of the type */
- for (;;) {
- type = read_token(&token);
- if (type == TEP_EVENT_ITEM ||
- (type == TEP_EVENT_OP && strcmp(token, "*") == 0) ||
- /*
- * Some of the ftrace fields are broken and have
- * an illegal "." in them.
- */
- (event->flags & TEP_EVENT_FL_ISFTRACE &&
- type == TEP_EVENT_OP && strcmp(token, ".") == 0)) {
-
- if (strcmp(token, "*") == 0)
- field->flags |= TEP_FIELD_IS_POINTER;
-
- if (field->type) {
- ret = append(&field->type, delim, last_token);
- free(last_token);
- if (ret < 0)
- goto fail;
- } else
- field->type = last_token;
- last_token = token;
- delim = " ";
- continue;
- }
-
- /* Handle __attribute__((user)) */
- if ((type == TEP_EVENT_DELIM) &&
- strcmp("__attribute__", last_token) == 0 &&
- token[0] == '(') {
- int depth = 1;
- int ret;
-
- ret = append(&field->type, " ", last_token);
- ret |= append(&field->type, "", "(");
- if (ret < 0)
- goto fail;
-
- delim = " ";
- while ((type = read_token(&token)) != TEP_EVENT_NONE) {
- if (type == TEP_EVENT_DELIM) {
- if (token[0] == '(')
- depth++;
- else if (token[0] == ')')
- depth--;
- if (!depth)
- break;
- ret = append(&field->type, "", token);
- delim = "";
- } else {
- ret = append(&field->type, delim, token);
- delim = " ";
- }
- if (ret < 0)
- goto fail;
- free(last_token);
- last_token = token;
- }
- continue;
- }
- break;
- }
-
- if (!field->type) {
- do_warning_event(event, "%s: no type found", __func__);
- goto fail;
- }
- field->name = field->alias = last_token;
-
- if (test_type(type, TEP_EVENT_OP))
- goto fail;
-
- if (strcmp(token, "[") == 0) {
- enum tep_event_type last_type = type;
- char *brackets = token;
-
- field->flags |= TEP_FIELD_IS_ARRAY;
-
- type = read_token(&token);
-
- if (type == TEP_EVENT_ITEM)
- field->arraylen = strtoul(token, NULL, 0);
- else
- field->arraylen = 0;
-
- while (strcmp(token, "]") != 0) {
- const char *delim;
-
- if (last_type == TEP_EVENT_ITEM &&
- type == TEP_EVENT_ITEM)
- delim = " ";
- else
- delim = "";
-
- last_type = type;
-
- ret = append(&brackets, delim, token);
- if (ret < 0) {
- free(brackets);
- goto fail;
- }
- /* We only care about the last token */
- field->arraylen = strtoul(token, NULL, 0);
- free_token(token);
- type = read_token(&token);
- if (type == TEP_EVENT_NONE) {
- free(brackets);
- do_warning_event(event, "failed to find token");
- goto fail;
- }
- }
-
- free_token(token);
-
- ret = append(&brackets, "", "]");
- if (ret < 0) {
- free(brackets);
- goto fail;
- }
-
- /* add brackets to type */
-
- type = read_token(&token);
- /*
- * If the next token is not an OP, then it is of
- * the format: type [] item;
- */
- if (type == TEP_EVENT_ITEM) {
- ret = append(&field->type, " ", field->name);
- if (ret < 0) {
- free(brackets);
- goto fail;
- }
- ret = append(&field->type, "", brackets);
-
- size_dynamic = type_size(field->name);
- free_token(field->name);
- field->name = field->alias = token;
- type = read_token(&token);
- } else {
- ret = append(&field->type, "", brackets);
- if (ret < 0) {
- free(brackets);
- goto fail;
- }
- }
- free(brackets);
- }
-
- if (field_is_string(field))
- field->flags |= TEP_FIELD_IS_STRING;
- if (field_is_dynamic(field))
- field->flags |= TEP_FIELD_IS_DYNAMIC;
- if (field_is_relative_dynamic(field))
- field->flags |= TEP_FIELD_IS_DYNAMIC | TEP_FIELD_IS_RELATIVE;
- if (field_is_long(field))
- field->flags |= TEP_FIELD_IS_LONG;
-
- if (test_type_token(type, token, TEP_EVENT_OP, ";"))
- goto fail;
- free_token(token);
-
- if (read_expected(TEP_EVENT_ITEM, "offset") < 0)
- goto fail_expect;
-
- if (read_expected(TEP_EVENT_OP, ":") < 0)
- goto fail_expect;
-
- if (read_expect_type(TEP_EVENT_ITEM, &token))
- goto fail;
- field->offset = strtoul(token, NULL, 0);
- free_token(token);
-
- if (read_expected(TEP_EVENT_OP, ";") < 0)
- goto fail_expect;
-
- if (read_expected(TEP_EVENT_ITEM, "size") < 0)
- goto fail_expect;
-
- if (read_expected(TEP_EVENT_OP, ":") < 0)
- goto fail_expect;
-
- if (read_expect_type(TEP_EVENT_ITEM, &token))
- goto fail;
- field->size = strtoul(token, NULL, 0);
- free_token(token);
-
- if (read_expected(TEP_EVENT_OP, ";") < 0)
- goto fail_expect;
-
- type = read_token(&token);
- if (type != TEP_EVENT_NEWLINE) {
- /* newer versions of the kernel have a "signed" type */
- if (test_type_token(type, token, TEP_EVENT_ITEM, "signed"))
- goto fail;
-
- free_token(token);
-
- if (read_expected(TEP_EVENT_OP, ":") < 0)
- goto fail_expect;
-
- if (read_expect_type(TEP_EVENT_ITEM, &token))
- goto fail;
-
- if (strtoul(token, NULL, 0))
- field->flags |= TEP_FIELD_IS_SIGNED;
-
- free_token(token);
- if (read_expected(TEP_EVENT_OP, ";") < 0)
- goto fail_expect;
-
- if (read_expect_type(TEP_EVENT_NEWLINE, &token))
- goto fail;
- }
-
- free_token(token);
-
- if (field->flags & TEP_FIELD_IS_ARRAY) {
- if (field->arraylen)
- field->elementsize = field->size / field->arraylen;
- else if (field->flags & TEP_FIELD_IS_DYNAMIC)
- field->elementsize = size_dynamic;
- else if (field->flags & TEP_FIELD_IS_STRING)
- field->elementsize = 1;
- else if (field->flags & TEP_FIELD_IS_LONG)
- field->elementsize = event->tep ?
- event->tep->long_size :
- sizeof(long);
- } else
- field->elementsize = field->size;
-
- *fields = field;
- fields = &field->next;
-
- } while (1);
-
- return 0;
-
-fail:
- free_token(token);
-fail_expect:
- if (field) {
- free(field->type);
- free(field->name);
- free(field);
- }
- return -1;
-}
-
-static int event_read_format(struct tep_event *event)
-{
- char *token;
- int ret;
-
- if (read_expected_item(TEP_EVENT_ITEM, "format") < 0)
- return -1;
-
- if (read_expected(TEP_EVENT_OP, ":") < 0)
- return -1;
-
- if (read_expect_type(TEP_EVENT_NEWLINE, &token))
- goto fail;
- free_token(token);
-
- ret = event_read_fields(event, &event->format.common_fields);
- if (ret < 0)
- return ret;
- event->format.nr_common = ret;
-
- ret = event_read_fields(event, &event->format.fields);
- if (ret < 0)
- return ret;
- event->format.nr_fields = ret;
-
- return 0;
-
- fail:
- free_token(token);
- return -1;
-}
-
-static enum tep_event_type
-process_arg_token(struct tep_event *event, struct tep_print_arg *arg,
- char **tok, enum tep_event_type type);
-
-static enum tep_event_type
-process_arg(struct tep_event *event, struct tep_print_arg *arg, char **tok)
-{
- enum tep_event_type type;
- char *token;
-
- type = read_token(&token);
- *tok = token;
-
- return process_arg_token(event, arg, tok, type);
-}
-
-static enum tep_event_type
-process_op(struct tep_event *event, struct tep_print_arg *arg, char **tok);
-
-/*
- * For __print_symbolic() and __print_flags, we need to completely
- * evaluate the first argument, which defines what to print next.
- */
-static enum tep_event_type
-process_field_arg(struct tep_event *event, struct tep_print_arg *arg, char **tok)
-{
- enum tep_event_type type;
-
- type = process_arg(event, arg, tok);
-
- while (type == TEP_EVENT_OP) {
- type = process_op(event, arg, tok);
- }
-
- return type;
-}
-
-static enum tep_event_type
-process_cond(struct tep_event *event, struct tep_print_arg *top, char **tok)
-{
- struct tep_print_arg *arg, *left, *right;
- enum tep_event_type type;
- char *token = NULL;
-
- arg = alloc_arg();
- left = alloc_arg();
- right = alloc_arg();
-
- if (!arg || !left || !right) {
- do_warning_event(event, "%s: not enough memory!", __func__);
- /* arg will be freed at out_free */
- free_arg(left);
- free_arg(right);
- goto out_free;
- }
-
- arg->type = TEP_PRINT_OP;
- arg->op.left = left;
- arg->op.right = right;
-
- *tok = NULL;
- type = process_arg(event, left, &token);
-
- again:
- if (type == TEP_EVENT_ERROR)
- goto out_free;
-
- /* Handle other operations in the arguments */
- if (type == TEP_EVENT_OP && strcmp(token, ":") != 0) {
- type = process_op(event, left, &token);
- goto again;
- }
-
- if (test_type_token(type, token, TEP_EVENT_OP, ":"))
- goto out_free;
-
- arg->op.op = token;
-
- type = process_arg(event, right, &token);
-
- top->op.right = arg;
-
- *tok = token;
- return type;
-
-out_free:
- /* Top may point to itself */
- top->op.right = NULL;
- free_token(token);
- free_arg(arg);
- return TEP_EVENT_ERROR;
-}
-
-static enum tep_event_type
-process_array(struct tep_event *event, struct tep_print_arg *top, char **tok)
-{
- struct tep_print_arg *arg;
- enum tep_event_type type;
- char *token = NULL;
-
- arg = alloc_arg();
- if (!arg) {
- do_warning_event(event, "%s: not enough memory!", __func__);
- /* '*tok' is set to top->op.op. No need to free. */
- *tok = NULL;
- return TEP_EVENT_ERROR;
- }
-
- *tok = NULL;
- type = process_arg(event, arg, &token);
- if (test_type_token(type, token, TEP_EVENT_OP, "]"))
- goto out_free;
-
- top->op.right = arg;
-
- free_token(token);
- type = read_token_item(&token);
- *tok = token;
-
- return type;
-
-out_free:
- free_token(token);
- free_arg(arg);
- return TEP_EVENT_ERROR;
-}
-
-static int get_op_prio(char *op)
-{
- if (!op[1]) {
- switch (op[0]) {
- case '~':
- case '!':
- return 4;
- case '*':
- case '/':
- case '%':
- return 6;
- case '+':
- case '-':
- return 7;
- /* '>>' and '<<' are 8 */
- case '<':
- case '>':
- return 9;
- /* '==' and '!=' are 10 */
- case '&':
- return 11;
- case '^':
- return 12;
- case '|':
- return 13;
- case '?':
- return 16;
- default:
- do_warning("unknown op '%c'", op[0]);
- return -1;
- }
- } else {
- if (strcmp(op, "++") == 0 ||
- strcmp(op, "--") == 0) {
- return 3;
- } else if (strcmp(op, ">>") == 0 ||
- strcmp(op, "<<") == 0) {
- return 8;
- } else if (strcmp(op, ">=") == 0 ||
- strcmp(op, "<=") == 0) {
- return 9;
- } else if (strcmp(op, "==") == 0 ||
- strcmp(op, "!=") == 0) {
- return 10;
- } else if (strcmp(op, "&&") == 0) {
- return 14;
- } else if (strcmp(op, "||") == 0) {
- return 15;
- } else {
- do_warning("unknown op '%s'", op);
- return -1;
- }
- }
-}
-
-static int set_op_prio(struct tep_print_arg *arg)
-{
-
- /* single ops are the greatest */
- if (!arg->op.left || arg->op.left->type == TEP_PRINT_NULL)
- arg->op.prio = 0;
- else
- arg->op.prio = get_op_prio(arg->op.op);
-
- return arg->op.prio;
-}
-
-/* Note, *tok does not get freed, but will most likely be saved */
-static enum tep_event_type
-process_op(struct tep_event *event, struct tep_print_arg *arg, char **tok)
-{
- struct tep_print_arg *left, *right = NULL;
- enum tep_event_type type;
- char *token;
-
- /* the op is passed in via tok */
- token = *tok;
-
- if (arg->type == TEP_PRINT_OP && !arg->op.left) {
- /* handle single op */
- if (token[1]) {
- do_warning_event(event, "bad op token %s", token);
- goto out_free;
- }
- switch (token[0]) {
- case '~':
- case '!':
- case '+':
- case '-':
- break;
- default:
- do_warning_event(event, "bad op token %s", token);
- goto out_free;
-
- }
-
- /* make an empty left */
- left = alloc_arg();
- if (!left)
- goto out_warn_free;
-
- left->type = TEP_PRINT_NULL;
- arg->op.left = left;
-
- right = alloc_arg();
- if (!right)
- goto out_warn_free;
-
- arg->op.right = right;
-
- /* do not free the token, it belongs to an op */
- *tok = NULL;
- type = process_arg(event, right, tok);
-
- } else if (strcmp(token, "?") == 0) {
-
- left = alloc_arg();
- if (!left)
- goto out_warn_free;
-
- /* copy the top arg to the left */
- *left = *arg;
-
- arg->type = TEP_PRINT_OP;
- arg->op.op = token;
- arg->op.left = left;
- arg->op.prio = 0;
-
- /* it will set arg->op.right */
- type = process_cond(event, arg, tok);
-
- } else if (strcmp(token, ">>") == 0 ||
- strcmp(token, "<<") == 0 ||
- strcmp(token, "&") == 0 ||
- strcmp(token, "|") == 0 ||
- strcmp(token, "&&") == 0 ||
- strcmp(token, "||") == 0 ||
- strcmp(token, "-") == 0 ||
- strcmp(token, "+") == 0 ||
- strcmp(token, "*") == 0 ||
- strcmp(token, "^") == 0 ||
- strcmp(token, "/") == 0 ||
- strcmp(token, "%") == 0 ||
- strcmp(token, "<") == 0 ||
- strcmp(token, ">") == 0 ||
- strcmp(token, "<=") == 0 ||
- strcmp(token, ">=") == 0 ||
- strcmp(token, "==") == 0 ||
- strcmp(token, "!=") == 0) {
-
- left = alloc_arg();
- if (!left)
- goto out_warn_free;
-
- /* copy the top arg to the left */
- *left = *arg;
-
- arg->type = TEP_PRINT_OP;
- arg->op.op = token;
- arg->op.left = left;
- arg->op.right = NULL;
-
- if (set_op_prio(arg) == -1) {
- event->flags |= TEP_EVENT_FL_FAILED;
- /* arg->op.op (= token) will be freed at out_free */
- arg->op.op = NULL;
- goto out_free;
- }
-
- type = read_token_item(&token);
- *tok = token;
-
- /* could just be a type pointer */
- if ((strcmp(arg->op.op, "*") == 0) &&
- type == TEP_EVENT_DELIM && (strcmp(token, ")") == 0)) {
- int ret;
-
- if (left->type != TEP_PRINT_ATOM) {
- do_warning_event(event, "bad pointer type");
- goto out_free;
- }
- ret = append(&left->atom.atom, " ", "*");
- if (ret < 0)
- goto out_warn_free;
-
- free(arg->op.op);
- *arg = *left;
- free(left);
-
- return type;
- }
-
- right = alloc_arg();
- if (!right)
- goto out_warn_free;
-
- type = process_arg_token(event, right, tok, type);
- if (type == TEP_EVENT_ERROR) {
- free_arg(right);
- /* token was freed in process_arg_token() via *tok */
- token = NULL;
- goto out_free;
- }
-
- if (right->type == TEP_PRINT_OP &&
- get_op_prio(arg->op.op) < get_op_prio(right->op.op)) {
- struct tep_print_arg tmp;
-
- /* rotate ops according to the priority */
- arg->op.right = right->op.left;
-
- tmp = *arg;
- *arg = *right;
- *right = tmp;
-
- arg->op.left = right;
- } else {
- arg->op.right = right;
- }
-
- } else if (strcmp(token, "[") == 0) {
-
- left = alloc_arg();
- if (!left)
- goto out_warn_free;
-
- *left = *arg;
-
- arg->type = TEP_PRINT_OP;
- arg->op.op = token;
- arg->op.left = left;
-
- arg->op.prio = 0;
-
- /* it will set arg->op.right */
- type = process_array(event, arg, tok);
-
- } else {
- do_warning_event(event, "unknown op '%s'", token);
- event->flags |= TEP_EVENT_FL_FAILED;
- /* the arg is now the left side */
- goto out_free;
- }
-
- if (type == TEP_EVENT_OP && strcmp(*tok, ":") != 0) {
- int prio;
-
- /* higher prios need to be closer to the root */
- prio = get_op_prio(*tok);
-
- if (prio > arg->op.prio)
- return process_op(event, arg, tok);
-
- return process_op(event, right, tok);
- }
-
- return type;
-
-out_warn_free:
- do_warning_event(event, "%s: not enough memory!", __func__);
-out_free:
- free_token(token);
- *tok = NULL;
- return TEP_EVENT_ERROR;
-}
-
-static enum tep_event_type
-process_entry(struct tep_event *event __maybe_unused, struct tep_print_arg *arg,
- char **tok)
-{
- enum tep_event_type type;
- char *field;
- char *token;
-
- if (read_expected(TEP_EVENT_OP, "->") < 0)
- goto out_err;
-
- if (read_expect_type(TEP_EVENT_ITEM, &token) < 0)
- goto out_free;
- field = token;
-
- arg->type = TEP_PRINT_FIELD;
- arg->field.name = field;
-
- if (is_flag_field) {
- arg->field.field = tep_find_any_field(event, arg->field.name);
- arg->field.field->flags |= TEP_FIELD_IS_FLAG;
- is_flag_field = 0;
- } else if (is_symbolic_field) {
- arg->field.field = tep_find_any_field(event, arg->field.name);
- arg->field.field->flags |= TEP_FIELD_IS_SYMBOLIC;
- is_symbolic_field = 0;
- }
-
- type = read_token(&token);
- *tok = token;
-
- return type;
-
- out_free:
- free_token(token);
- out_err:
- *tok = NULL;
- return TEP_EVENT_ERROR;
-}
-
-static int alloc_and_process_delim(struct tep_event *event, char *next_token,
- struct tep_print_arg **print_arg)
-{
- struct tep_print_arg *field;
- enum tep_event_type type;
- char *token;
- int ret = 0;
-
- field = alloc_arg();
- if (!field) {
- do_warning_event(event, "%s: not enough memory!", __func__);
- errno = ENOMEM;
- return -1;
- }
-
- type = process_arg(event, field, &token);
-
- if (test_type_token(type, token, TEP_EVENT_DELIM, next_token)) {
- errno = EINVAL;
- ret = -1;
- free_arg(field);
- goto out_free_token;
- }
-
- *print_arg = field;
-
-out_free_token:
- free_token(token);
-
- return ret;
-}
-
-static char *arg_eval (struct tep_print_arg *arg);
-
-static unsigned long long
-eval_type_str(unsigned long long val, const char *type, int pointer)
-{
- int sign = 0;
- char *ref;
- int len;
-
- len = strlen(type);
-
- if (pointer) {
-
- if (type[len-1] != '*') {
- do_warning("pointer expected with non pointer type");
- return val;
- }
-
- ref = malloc(len);
- if (!ref) {
- do_warning("%s: not enough memory!", __func__);
- return val;
- }
- memcpy(ref, type, len);
-
- /* chop off the " *" */
- ref[len - 2] = 0;
-
- val = eval_type_str(val, ref, 0);
- free(ref);
- return val;
- }
-
- /* check if this is a pointer */
- if (type[len - 1] == '*')
- return val;
-
- /* Try to figure out the arg size*/
- if (strncmp(type, "struct", 6) == 0)
- /* all bets off */
- return val;
-
- if (strcmp(type, "u8") == 0)
- return val & 0xff;
-
- if (strcmp(type, "u16") == 0)
- return val & 0xffff;
-
- if (strcmp(type, "u32") == 0)
- return val & 0xffffffff;
-
- if (strcmp(type, "u64") == 0 ||
- strcmp(type, "s64") == 0)
- return val;
-
- if (strcmp(type, "s8") == 0)
- return (unsigned long long)(char)val & 0xff;
-
- if (strcmp(type, "s16") == 0)
- return (unsigned long long)(short)val & 0xffff;
-
- if (strcmp(type, "s32") == 0)
- return (unsigned long long)(int)val & 0xffffffff;
-
- if (strncmp(type, "unsigned ", 9) == 0) {
- sign = 0;
- type += 9;
- }
-
- if (strcmp(type, "char") == 0) {
- if (sign)
- return (unsigned long long)(char)val & 0xff;
- else
- return val & 0xff;
- }
-
- if (strcmp(type, "short") == 0) {
- if (sign)
- return (unsigned long long)(short)val & 0xffff;
- else
- return val & 0xffff;
- }
-
- if (strcmp(type, "int") == 0) {
- if (sign)
- return (unsigned long long)(int)val & 0xffffffff;
- else
- return val & 0xffffffff;
- }
-
- return val;
-}
-
-/*
- * Try to figure out the type.
- */
-static unsigned long long
-eval_type(unsigned long long val, struct tep_print_arg *arg, int pointer)
-{
- if (arg->type != TEP_PRINT_TYPE) {
- do_warning("expected type argument");
- return 0;
- }
-
- return eval_type_str(val, arg->typecast.type, pointer);
-}
-
-static int arg_num_eval(struct tep_print_arg *arg, long long *val)
-{
- long long left, right;
- int ret = 1;
-
- switch (arg->type) {
- case TEP_PRINT_ATOM:
- *val = strtoll(arg->atom.atom, NULL, 0);
- break;
- case TEP_PRINT_TYPE:
- ret = arg_num_eval(arg->typecast.item, val);
- if (!ret)
- break;
- *val = eval_type(*val, arg, 0);
- break;
- case TEP_PRINT_OP:
- switch (arg->op.op[0]) {
- case '|':
- ret = arg_num_eval(arg->op.left, &left);
- if (!ret)
- break;
- ret = arg_num_eval(arg->op.right, &right);
- if (!ret)
- break;
- if (arg->op.op[1])
- *val = left || right;
- else
- *val = left | right;
- break;
- case '&':
- ret = arg_num_eval(arg->op.left, &left);
- if (!ret)
- break;
- ret = arg_num_eval(arg->op.right, &right);
- if (!ret)
- break;
- if (arg->op.op[1])
- *val = left && right;
- else
- *val = left & right;
- break;
- case '<':
- ret = arg_num_eval(arg->op.left, &left);
- if (!ret)
- break;
- ret = arg_num_eval(arg->op.right, &right);
- if (!ret)
- break;
- switch (arg->op.op[1]) {
- case 0:
- *val = left < right;
- break;
- case '<':
- *val = left << right;
- break;
- case '=':
- *val = left <= right;
- break;
- default:
- do_warning("unknown op '%s'", arg->op.op);
- ret = 0;
- }
- break;
- case '>':
- ret = arg_num_eval(arg->op.left, &left);
- if (!ret)
- break;
- ret = arg_num_eval(arg->op.right, &right);
- if (!ret)
- break;
- switch (arg->op.op[1]) {
- case 0:
- *val = left > right;
- break;
- case '>':
- *val = left >> right;
- break;
- case '=':
- *val = left >= right;
- break;
- default:
- do_warning("unknown op '%s'", arg->op.op);
- ret = 0;
- }
- break;
- case '=':
- ret = arg_num_eval(arg->op.left, &left);
- if (!ret)
- break;
- ret = arg_num_eval(arg->op.right, &right);
- if (!ret)
- break;
-
- if (arg->op.op[1] != '=') {
- do_warning("unknown op '%s'", arg->op.op);
- ret = 0;
- } else
- *val = left == right;
- break;
- case '!':
- ret = arg_num_eval(arg->op.left, &left);
- if (!ret)
- break;
- ret = arg_num_eval(arg->op.right, &right);
- if (!ret)
- break;
-
- switch (arg->op.op[1]) {
- case '=':
- *val = left != right;
- break;
- default:
- do_warning("unknown op '%s'", arg->op.op);
- ret = 0;
- }
- break;
- case '-':
- /* check for negative */
- if (arg->op.left->type == TEP_PRINT_NULL)
- left = 0;
- else
- ret = arg_num_eval(arg->op.left, &left);
- if (!ret)
- break;
- ret = arg_num_eval(arg->op.right, &right);
- if (!ret)
- break;
- *val = left - right;
- break;
- case '+':
- if (arg->op.left->type == TEP_PRINT_NULL)
- left = 0;
- else
- ret = arg_num_eval(arg->op.left, &left);
- if (!ret)
- break;
- ret = arg_num_eval(arg->op.right, &right);
- if (!ret)
- break;
- *val = left + right;
- break;
- case '~':
- ret = arg_num_eval(arg->op.right, &right);
- if (!ret)
- break;
- *val = ~right;
- break;
- default:
- do_warning("unknown op '%s'", arg->op.op);
- ret = 0;
- }
- break;
-
- case TEP_PRINT_NULL:
- case TEP_PRINT_FIELD ... TEP_PRINT_SYMBOL:
- case TEP_PRINT_STRING:
- case TEP_PRINT_BSTRING:
- case TEP_PRINT_BITMASK:
- default:
- do_warning("invalid eval type %d", arg->type);
- ret = 0;
-
- }
- return ret;
-}
-
-static char *arg_eval (struct tep_print_arg *arg)
-{
- long long val;
- static char buf[24];
-
- switch (arg->type) {
- case TEP_PRINT_ATOM:
- return arg->atom.atom;
- case TEP_PRINT_TYPE:
- return arg_eval(arg->typecast.item);
- case TEP_PRINT_OP:
- if (!arg_num_eval(arg, &val))
- break;
- sprintf(buf, "%lld", val);
- return buf;
-
- case TEP_PRINT_NULL:
- case TEP_PRINT_FIELD ... TEP_PRINT_SYMBOL:
- case TEP_PRINT_STRING:
- case TEP_PRINT_BSTRING:
- case TEP_PRINT_BITMASK:
- default:
- do_warning("invalid eval type %d", arg->type);
- break;
- }
-
- return NULL;
-}
-
-static enum tep_event_type
-process_fields(struct tep_event *event, struct tep_print_flag_sym **list, char **tok)
-{
- enum tep_event_type type;
- struct tep_print_arg *arg = NULL;
- struct tep_print_flag_sym *field;
- char *token = *tok;
- char *value;
-
- do {
- free_token(token);
- type = read_token_item(&token);
- if (test_type_token(type, token, TEP_EVENT_OP, "{"))
- break;
-
- arg = alloc_arg();
- if (!arg)
- goto out_free;
-
- free_token(token);
- type = process_arg(event, arg, &token);
-
- if (type == TEP_EVENT_OP)
- type = process_op(event, arg, &token);
-
- if (type == TEP_EVENT_ERROR)
- goto out_free;
-
- if (test_type_token(type, token, TEP_EVENT_DELIM, ","))
- goto out_free;
-
- field = calloc(1, sizeof(*field));
- if (!field)
- goto out_free;
-
- value = arg_eval(arg);
- if (value == NULL)
- goto out_free_field;
- field->value = strdup(value);
- if (field->value == NULL)
- goto out_free_field;
-
- free_arg(arg);
- arg = alloc_arg();
- if (!arg)
- goto out_free;
-
- free_token(token);
- type = process_arg(event, arg, &token);
- if (test_type_token(type, token, TEP_EVENT_OP, "}"))
- goto out_free_field;
-
- value = arg_eval(arg);
- if (value == NULL)
- goto out_free_field;
- field->str = strdup(value);
- if (field->str == NULL)
- goto out_free_field;
- free_arg(arg);
- arg = NULL;
-
- *list = field;
- list = &field->next;
-
- free_token(token);
- type = read_token_item(&token);
- } while (type == TEP_EVENT_DELIM && strcmp(token, ",") == 0);
-
- *tok = token;
- return type;
-
-out_free_field:
- free_flag_sym(field);
-out_free:
- free_arg(arg);
- free_token(token);
- *tok = NULL;
-
- return TEP_EVENT_ERROR;
-}
-
-static enum tep_event_type
-process_flags(struct tep_event *event, struct tep_print_arg *arg, char **tok)
-{
- struct tep_print_arg *field;
- enum tep_event_type type;
- char *token = NULL;
-
- memset(arg, 0, sizeof(*arg));
- arg->type = TEP_PRINT_FLAGS;
-
- field = alloc_arg();
- if (!field) {
- do_warning_event(event, "%s: not enough memory!", __func__);
- goto out_free;
- }
-
- type = process_field_arg(event, field, &token);
-
- /* Handle operations in the first argument */
- while (type == TEP_EVENT_OP)
- type = process_op(event, field, &token);
-
- if (test_type_token(type, token, TEP_EVENT_DELIM, ","))
- goto out_free_field;
- free_token(token);
-
- arg->flags.field = field;
-
- type = read_token_item(&token);
- if (event_item_type(type)) {
- arg->flags.delim = token;
- type = read_token_item(&token);
- }
-
- if (test_type_token(type, token, TEP_EVENT_DELIM, ","))
- goto out_free;
-
- type = process_fields(event, &arg->flags.flags, &token);
- if (test_type_token(type, token, TEP_EVENT_DELIM, ")"))
- goto out_free;
-
- free_token(token);
- type = read_token_item(tok);
- return type;
-
-out_free_field:
- free_arg(field);
-out_free:
- free_token(token);
- *tok = NULL;
- return TEP_EVENT_ERROR;
-}
-
-static enum tep_event_type
-process_symbols(struct tep_event *event, struct tep_print_arg *arg, char **tok)
-{
- struct tep_print_arg *field;
- enum tep_event_type type;
- char *token = NULL;
-
- memset(arg, 0, sizeof(*arg));
- arg->type = TEP_PRINT_SYMBOL;
-
- field = alloc_arg();
- if (!field) {
- do_warning_event(event, "%s: not enough memory!", __func__);
- goto out_free;
- }
-
- type = process_field_arg(event, field, &token);
-
- if (test_type_token(type, token, TEP_EVENT_DELIM, ","))
- goto out_free_field;
-
- arg->symbol.field = field;
-
- type = process_fields(event, &arg->symbol.symbols, &token);
- if (test_type_token(type, token, TEP_EVENT_DELIM, ")"))
- goto out_free;
-
- free_token(token);
- type = read_token_item(tok);
- return type;
-
-out_free_field:
- free_arg(field);
-out_free:
- free_token(token);
- *tok = NULL;
- return TEP_EVENT_ERROR;
-}
-
-static enum tep_event_type
-process_hex_common(struct tep_event *event, struct tep_print_arg *arg,
- char **tok, enum tep_print_arg_type type)
-{
- memset(arg, 0, sizeof(*arg));
- arg->type = type;
-
- if (alloc_and_process_delim(event, ",", &arg->hex.field))
- goto out;
-
- if (alloc_and_process_delim(event, ")", &arg->hex.size))
- goto free_field;
-
- return read_token_item(tok);
-
-free_field:
- free_arg(arg->hex.field);
- arg->hex.field = NULL;
-out:
- *tok = NULL;
- return TEP_EVENT_ERROR;
-}
-
-static enum tep_event_type
-process_hex(struct tep_event *event, struct tep_print_arg *arg, char **tok)
-{
- return process_hex_common(event, arg, tok, TEP_PRINT_HEX);
-}
-
-static enum tep_event_type
-process_hex_str(struct tep_event *event, struct tep_print_arg *arg,
- char **tok)
-{
- return process_hex_common(event, arg, tok, TEP_PRINT_HEX_STR);
-}
-
-static enum tep_event_type
-process_int_array(struct tep_event *event, struct tep_print_arg *arg, char **tok)
-{
- memset(arg, 0, sizeof(*arg));
- arg->type = TEP_PRINT_INT_ARRAY;
-
- if (alloc_and_process_delim(event, ",", &arg->int_array.field))
- goto out;
-
- if (alloc_and_process_delim(event, ",", &arg->int_array.count))
- goto free_field;
-
- if (alloc_and_process_delim(event, ")", &arg->int_array.el_size))
- goto free_size;
-
- return read_token_item(tok);
-
-free_size:
- free_arg(arg->int_array.count);
- arg->int_array.count = NULL;
-free_field:
- free_arg(arg->int_array.field);
- arg->int_array.field = NULL;
-out:
- *tok = NULL;
- return TEP_EVENT_ERROR;
-}
-
-static enum tep_event_type
-process_dynamic_array(struct tep_event *event, struct tep_print_arg *arg, char **tok)
-{
- struct tep_format_field *field;
- enum tep_event_type type;
- char *token;
-
- memset(arg, 0, sizeof(*arg));
- arg->type = TEP_PRINT_DYNAMIC_ARRAY;
-
- /*
- * The item within the parenthesis is another field that holds
- * the index into where the array starts.
- */
- type = read_token(&token);
- *tok = token;
- if (type != TEP_EVENT_ITEM)
- goto out_free;
-
- /* Find the field */
-
- field = tep_find_field(event, token);
- if (!field)
- goto out_free;
-
- arg->dynarray.field = field;
- arg->dynarray.index = 0;
-
- if (read_expected(TEP_EVENT_DELIM, ")") < 0)
- goto out_free;
-
- free_token(token);
- type = read_token_item(&token);
- *tok = token;
- if (type != TEP_EVENT_OP || strcmp(token, "[") != 0)
- return type;
-
- free_token(token);
- arg = alloc_arg();
- if (!arg) {
- do_warning_event(event, "%s: not enough memory!", __func__);
- *tok = NULL;
- return TEP_EVENT_ERROR;
- }
-
- type = process_arg(event, arg, &token);
- if (type == TEP_EVENT_ERROR)
- goto out_free_arg;
-
- if (!test_type_token(type, token, TEP_EVENT_OP, "]"))
- goto out_free_arg;
-
- free_token(token);
- type = read_token_item(tok);
- return type;
-
- out_free_arg:
- free_arg(arg);
- out_free:
- free_token(token);
- *tok = NULL;
- return TEP_EVENT_ERROR;
-}
-
-static enum tep_event_type
-process_dynamic_array_len(struct tep_event *event, struct tep_print_arg *arg,
- char **tok)
-{
- struct tep_format_field *field;
- enum tep_event_type type;
- char *token;
-
- if (read_expect_type(TEP_EVENT_ITEM, &token) < 0)
- goto out_free;
-
- arg->type = TEP_PRINT_DYNAMIC_ARRAY_LEN;
-
- /* Find the field */
- field = tep_find_field(event, token);
- if (!field)
- goto out_free;
-
- arg->dynarray.field = field;
- arg->dynarray.index = 0;
-
- if (read_expected(TEP_EVENT_DELIM, ")") < 0)
- goto out_err;
-
- free_token(token);
- type = read_token(&token);
- *tok = token;
-
- return type;
-
- out_free:
- free_token(token);
- out_err:
- *tok = NULL;
- return TEP_EVENT_ERROR;
-}
-
-static enum tep_event_type
-process_paren(struct tep_event *event, struct tep_print_arg *arg, char **tok)
-{
- struct tep_print_arg *item_arg;
- enum tep_event_type type;
- char *token;
-
- type = process_arg(event, arg, &token);
-
- if (type == TEP_EVENT_ERROR)
- goto out_free;
-
- if (type == TEP_EVENT_OP)
- type = process_op(event, arg, &token);
-
- if (type == TEP_EVENT_ERROR)
- goto out_free;
-
- if (test_type_token(type, token, TEP_EVENT_DELIM, ")"))
- goto out_free;
-
- free_token(token);
- type = read_token_item(&token);
-
- /*
- * If the next token is an item or another open paren, then
- * this was a typecast.
- */
- if (event_item_type(type) ||
- (type == TEP_EVENT_DELIM && strcmp(token, "(") == 0)) {
-
- /* make this a typecast and contine */
-
- /* prevous must be an atom */
- if (arg->type != TEP_PRINT_ATOM) {
- do_warning_event(event, "previous needed to be TEP_PRINT_ATOM");
- goto out_free;
- }
-
- item_arg = alloc_arg();
- if (!item_arg) {
- do_warning_event(event, "%s: not enough memory!",
- __func__);
- goto out_free;
- }
-
- arg->type = TEP_PRINT_TYPE;
- arg->typecast.type = arg->atom.atom;
- arg->typecast.item = item_arg;
- type = process_arg_token(event, item_arg, &token, type);
-
- }
-
- *tok = token;
- return type;
-
- out_free:
- free_token(token);
- *tok = NULL;
- return TEP_EVENT_ERROR;
-}
-
-
-static enum tep_event_type
-process_str(struct tep_event *event __maybe_unused, struct tep_print_arg *arg,
- char **tok)
-{
- enum tep_event_type type;
- char *token;
-
- if (read_expect_type(TEP_EVENT_ITEM, &token) < 0)
- goto out_free;
-
- arg->type = TEP_PRINT_STRING;
- arg->string.string = token;
- arg->string.field = NULL;
-
- if (read_expected(TEP_EVENT_DELIM, ")") < 0)
- goto out_err;
-
- type = read_token(&token);
- *tok = token;
-
- return type;
-
- out_free:
- free_token(token);
- out_err:
- *tok = NULL;
- return TEP_EVENT_ERROR;
-}
-
-static enum tep_event_type
-process_bitmask(struct tep_event *event __maybe_unused, struct tep_print_arg *arg,
- char **tok)
-{
- enum tep_event_type type;
- char *token;
-
- if (read_expect_type(TEP_EVENT_ITEM, &token) < 0)
- goto out_free;
-
- arg->type = TEP_PRINT_BITMASK;
- arg->bitmask.bitmask = token;
- arg->bitmask.field = NULL;
-
- if (read_expected(TEP_EVENT_DELIM, ")") < 0)
- goto out_err;
-
- type = read_token(&token);
- *tok = token;
-
- return type;
-
- out_free:
- free_token(token);
- out_err:
- *tok = NULL;
- return TEP_EVENT_ERROR;
-}
-
-static struct tep_function_handler *
-find_func_handler(struct tep_handle *tep, char *func_name)
-{
- struct tep_function_handler *func;
-
- if (!tep)
- return NULL;
-
- for (func = tep->func_handlers; func; func = func->next) {
- if (strcmp(func->name, func_name) == 0)
- break;
- }
-
- return func;
-}
-
-static void remove_func_handler(struct tep_handle *tep, char *func_name)
-{
- struct tep_function_handler *func;
- struct tep_function_handler **next;
-
- next = &tep->func_handlers;
- while ((func = *next)) {
- if (strcmp(func->name, func_name) == 0) {
- *next = func->next;
- free_func_handle(func);
- break;
- }
- next = &func->next;
- }
-}
-
-static enum tep_event_type
-process_func_handler(struct tep_event *event, struct tep_function_handler *func,
- struct tep_print_arg *arg, char **tok)
-{
- struct tep_print_arg **next_arg;
- struct tep_print_arg *farg;
- enum tep_event_type type;
- char *token;
- int i;
-
- arg->type = TEP_PRINT_FUNC;
- arg->func.func = func;
-
- *tok = NULL;
-
- next_arg = &(arg->func.args);
- for (i = 0; i < func->nr_args; i++) {
- farg = alloc_arg();
- if (!farg) {
- do_warning_event(event, "%s: not enough memory!",
- __func__);
- return TEP_EVENT_ERROR;
- }
-
- type = process_arg(event, farg, &token);
- if (i < (func->nr_args - 1)) {
- if (type != TEP_EVENT_DELIM || strcmp(token, ",") != 0) {
- do_warning_event(event,
- "Error: function '%s()' expects %d arguments but event %s only uses %d",
- func->name, func->nr_args,
- event->name, i + 1);
- goto err;
- }
- } else {
- if (type != TEP_EVENT_DELIM || strcmp(token, ")") != 0) {
- do_warning_event(event,
- "Error: function '%s()' only expects %d arguments but event %s has more",
- func->name, func->nr_args, event->name);
- goto err;
- }
- }
-
- *next_arg = farg;
- next_arg = &(farg->next);
- free_token(token);
- }
-
- type = read_token(&token);
- *tok = token;
-
- return type;
-
-err:
- free_arg(farg);
- free_token(token);
- return TEP_EVENT_ERROR;
-}
-
-static enum tep_event_type
-process_builtin_expect(struct tep_event *event, struct tep_print_arg *arg, char **tok)
-{
- enum tep_event_type type;
- char *token = NULL;
-
- /* Handle __builtin_expect( cond, #) */
- type = process_arg(event, arg, &token);
-
- if (type != TEP_EVENT_DELIM || token[0] != ',')
- goto out_free;
-
- free_token(token);
-
- /* We don't care what the second parameter is of the __builtin_expect() */
- if (read_expect_type(TEP_EVENT_ITEM, &token) < 0)
- goto out_free;
-
- if (read_expected(TEP_EVENT_DELIM, ")") < 0)
- goto out_free;
-
- free_token(token);
- type = read_token_item(tok);
- return type;
-
-out_free:
- free_token(token);
- *tok = NULL;
- return TEP_EVENT_ERROR;
-}
-
-static enum tep_event_type
-process_function(struct tep_event *event, struct tep_print_arg *arg,
- char *token, char **tok)
-{
- struct tep_function_handler *func;
-
- if (strcmp(token, "__print_flags") == 0) {
- free_token(token);
- is_flag_field = 1;
- return process_flags(event, arg, tok);
- }
- if (strcmp(token, "__print_symbolic") == 0) {
- free_token(token);
- is_symbolic_field = 1;
- return process_symbols(event, arg, tok);
- }
- if (strcmp(token, "__print_hex") == 0) {
- free_token(token);
- return process_hex(event, arg, tok);
- }
- if (strcmp(token, "__print_hex_str") == 0) {
- free_token(token);
- return process_hex_str(event, arg, tok);
- }
- if (strcmp(token, "__print_array") == 0) {
- free_token(token);
- return process_int_array(event, arg, tok);
- }
- if (strcmp(token, "__get_str") == 0 ||
- strcmp(token, "__get_rel_str") == 0) {
- free_token(token);
- return process_str(event, arg, tok);
- }
- if (strcmp(token, "__get_bitmask") == 0 ||
- strcmp(token, "__get_rel_bitmask") == 0) {
- free_token(token);
- return process_bitmask(event, arg, tok);
- }
- if (strcmp(token, "__get_dynamic_array") == 0 ||
- strcmp(token, "__get_rel_dynamic_array") == 0) {
- free_token(token);
- return process_dynamic_array(event, arg, tok);
- }
- if (strcmp(token, "__get_dynamic_array_len") == 0 ||
- strcmp(token, "__get_rel_dynamic_array_len") == 0) {
- free_token(token);
- return process_dynamic_array_len(event, arg, tok);
- }
- if (strcmp(token, "__builtin_expect") == 0) {
- free_token(token);
- return process_builtin_expect(event, arg, tok);
- }
-
- func = find_func_handler(event->tep, token);
- if (func) {
- free_token(token);
- return process_func_handler(event, func, arg, tok);
- }
-
- do_warning_event(event, "function %s not defined", token);
- free_token(token);
- return TEP_EVENT_ERROR;
-}
-
-static enum tep_event_type
-process_arg_token(struct tep_event *event, struct tep_print_arg *arg,
- char **tok, enum tep_event_type type)
-{
- char *token;
- char *atom;
-
- token = *tok;
-
- switch (type) {
- case TEP_EVENT_ITEM:
- if (strcmp(token, "REC") == 0) {
- free_token(token);
- type = process_entry(event, arg, &token);
- break;
- }
- atom = token;
- /* test the next token */
- type = read_token_item(&token);
-
- /*
- * If the next token is a parenthesis, then this
- * is a function.
- */
- if (type == TEP_EVENT_DELIM && strcmp(token, "(") == 0) {
- free_token(token);
- token = NULL;
- /* this will free atom. */
- type = process_function(event, arg, atom, &token);
- break;
- }
- /* atoms can be more than one token long */
- while (type == TEP_EVENT_ITEM) {
- int ret;
-
- ret = append(&atom, " ", token);
- if (ret < 0) {
- free(atom);
- *tok = NULL;
- free_token(token);
- return TEP_EVENT_ERROR;
- }
- free_token(token);
- type = read_token_item(&token);
- }
-
- arg->type = TEP_PRINT_ATOM;
- arg->atom.atom = atom;
- break;
-
- case TEP_EVENT_DQUOTE:
- case TEP_EVENT_SQUOTE:
- arg->type = TEP_PRINT_ATOM;
- arg->atom.atom = token;
- type = read_token_item(&token);
- break;
- case TEP_EVENT_DELIM:
- if (strcmp(token, "(") == 0) {
- free_token(token);
- type = process_paren(event, arg, &token);
- break;
- }
- case TEP_EVENT_OP:
- /* handle single ops */
- arg->type = TEP_PRINT_OP;
- arg->op.op = token;
- arg->op.left = NULL;
- type = process_op(event, arg, &token);
-
- /* On error, the op is freed */
- if (type == TEP_EVENT_ERROR)
- arg->op.op = NULL;
-
- /* return error type if errored */
- break;
-
- case TEP_EVENT_ERROR ... TEP_EVENT_NEWLINE:
- default:
- do_warning_event(event, "unexpected type %d", type);
- return TEP_EVENT_ERROR;
- }
- *tok = token;
-
- return type;
-}
-
-static int event_read_print_args(struct tep_event *event, struct tep_print_arg **list)
-{
- enum tep_event_type type = TEP_EVENT_ERROR;
- struct tep_print_arg *arg;
- char *token;
- int args = 0;
-
- do {
- if (type == TEP_EVENT_NEWLINE) {
- type = read_token_item(&token);
- continue;
- }
-
- arg = alloc_arg();
- if (!arg) {
- do_warning_event(event, "%s: not enough memory!",
- __func__);
- return -1;
- }
-
- type = process_arg(event, arg, &token);
-
- if (type == TEP_EVENT_ERROR) {
- free_token(token);
- free_arg(arg);
- return -1;
- }
-
- *list = arg;
- args++;
-
- if (type == TEP_EVENT_OP) {
- type = process_op(event, arg, &token);
- free_token(token);
- if (type == TEP_EVENT_ERROR) {
- *list = NULL;
- free_arg(arg);
- return -1;
- }
- list = &arg->next;
- continue;
- }
-
- if (type == TEP_EVENT_DELIM && strcmp(token, ",") == 0) {
- free_token(token);
- *list = arg;
- list = &arg->next;
- continue;
- }
- break;
- } while (type != TEP_EVENT_NONE);
-
- if (type != TEP_EVENT_NONE && type != TEP_EVENT_ERROR)
- free_token(token);
-
- return args;
-}
-
-static int event_read_print(struct tep_event *event)
-{
- enum tep_event_type type;
- char *token;
- int ret;
-
- if (read_expected_item(TEP_EVENT_ITEM, "print") < 0)
- return -1;
-
- if (read_expected(TEP_EVENT_ITEM, "fmt") < 0)
- return -1;
-
- if (read_expected(TEP_EVENT_OP, ":") < 0)
- return -1;
-
- if (read_expect_type(TEP_EVENT_DQUOTE, &token) < 0)
- goto fail;
-
- concat:
- event->print_fmt.format = token;
- event->print_fmt.args = NULL;
-
- /* ok to have no arg */
- type = read_token_item(&token);
-
- if (type == TEP_EVENT_NONE)
- return 0;
-
- /* Handle concatenation of print lines */
- if (type == TEP_EVENT_DQUOTE) {
- char *cat;
-
- if (asprintf(&cat, "%s%s", event->print_fmt.format, token) < 0)
- goto fail;
- free_token(token);
- free_token(event->print_fmt.format);
- event->print_fmt.format = NULL;
- token = cat;
- goto concat;
- }
-
- if (test_type_token(type, token, TEP_EVENT_DELIM, ","))
- goto fail;
-
- free_token(token);
-
- ret = event_read_print_args(event, &event->print_fmt.args);
- if (ret < 0)
- return -1;
-
- return ret;
-
- fail:
- free_token(token);
- return -1;
-}
-
-/**
- * tep_find_common_field - return a common field by event
- * @event: handle for the event
- * @name: the name of the common field to return
- *
- * Returns a common field from the event by the given @name.
- * This only searches the common fields and not all field.
- */
-struct tep_format_field *
-tep_find_common_field(struct tep_event *event, const char *name)
-{
- struct tep_format_field *format;
-
- for (format = event->format.common_fields;
- format; format = format->next) {
- if (strcmp(format->name, name) == 0)
- break;
- }
-
- return format;
-}
-
-/**
- * tep_find_field - find a non-common field
- * @event: handle for the event
- * @name: the name of the non-common field
- *
- * Returns a non-common field by the given @name.
- * This does not search common fields.
- */
-struct tep_format_field *
-tep_find_field(struct tep_event *event, const char *name)
-{
- struct tep_format_field *format;
-
- for (format = event->format.fields;
- format; format = format->next) {
- if (strcmp(format->name, name) == 0)
- break;
- }
-
- return format;
-}
-
-/**
- * tep_find_any_field - find any field by name
- * @event: handle for the event
- * @name: the name of the field
- *
- * Returns a field by the given @name.
- * This searches the common field names first, then
- * the non-common ones if a common one was not found.
- */
-struct tep_format_field *
-tep_find_any_field(struct tep_event *event, const char *name)
-{
- struct tep_format_field *format;
-
- format = tep_find_common_field(event, name);
- if (format)
- return format;
- return tep_find_field(event, name);
-}
-
-/**
- * tep_read_number - read a number from data
- * @tep: a handle to the trace event parser context
- * @ptr: the raw data
- * @size: the size of the data that holds the number
- *
- * Returns the number (converted to host) from the
- * raw data.
- */
-unsigned long long tep_read_number(struct tep_handle *tep,
- const void *ptr, int size)
-{
- unsigned long long val;
-
- switch (size) {
- case 1:
- return *(unsigned char *)ptr;
- case 2:
- return data2host2(tep, *(unsigned short *)ptr);
- case 4:
- return data2host4(tep, *(unsigned int *)ptr);
- case 8:
- memcpy(&val, (ptr), sizeof(unsigned long long));
- return data2host8(tep, val);
- default:
- /* BUG! */
- return 0;
- }
-}
-
-/**
- * tep_read_number_field - read a number from data
- * @field: a handle to the field
- * @data: the raw data to read
- * @value: the value to place the number in
- *
- * Reads raw data according to a field offset and size,
- * and translates it into @value.
- *
- * Returns 0 on success, -1 otherwise.
- */
-int tep_read_number_field(struct tep_format_field *field, const void *data,
- unsigned long long *value)
-{
- if (!field)
- return -1;
- switch (field->size) {
- case 1:
- case 2:
- case 4:
- case 8:
- *value = tep_read_number(field->event->tep,
- data + field->offset, field->size);
- return 0;
- default:
- return -1;
- }
-}
-
-static int get_common_info(struct tep_handle *tep,
- const char *type, int *offset, int *size)
-{
- struct tep_event *event;
- struct tep_format_field *field;
-
- /*
- * All events should have the same common elements.
- * Pick any event to find where the type is;
- */
- if (!tep->events) {
- do_warning("no event_list!");
- return -1;
- }
-
- event = tep->events[0];
- field = tep_find_common_field(event, type);
- if (!field)
- return -1;
-
- *offset = field->offset;
- *size = field->size;
-
- return 0;
-}
-
-static int __parse_common(struct tep_handle *tep, void *data,
- int *size, int *offset, const char *name)
-{
- int ret;
-
- if (!*size) {
- ret = get_common_info(tep, name, offset, size);
- if (ret < 0)
- return ret;
- }
- return tep_read_number(tep, data + *offset, *size);
-}
-
-static int trace_parse_common_type(struct tep_handle *tep, void *data)
-{
- return __parse_common(tep, data,
- &tep->type_size, &tep->type_offset,
- "common_type");
-}
-
-static int parse_common_pid(struct tep_handle *tep, void *data)
-{
- return __parse_common(tep, data,
- &tep->pid_size, &tep->pid_offset,
- "common_pid");
-}
-
-static int parse_common_pc(struct tep_handle *tep, void *data)
-{
- return __parse_common(tep, data,
- &tep->pc_size, &tep->pc_offset,
- "common_preempt_count");
-}
-
-static int parse_common_flags(struct tep_handle *tep, void *data)
-{
- return __parse_common(tep, data,
- &tep->flags_size, &tep->flags_offset,
- "common_flags");
-}
-
-static int parse_common_lock_depth(struct tep_handle *tep, void *data)
-{
- return __parse_common(tep, data,
- &tep->ld_size, &tep->ld_offset,
- "common_lock_depth");
-}
-
-static int parse_common_migrate_disable(struct tep_handle *tep, void *data)
-{
- return __parse_common(tep, data,
- &tep->ld_size, &tep->ld_offset,
- "common_migrate_disable");
-}
-
-static int events_id_cmp(const void *a, const void *b);
-
-/**
- * tep_find_event - find an event by given id
- * @tep: a handle to the trace event parser context
- * @id: the id of the event
- *
- * Returns an event that has a given @id.
- */
-struct tep_event *tep_find_event(struct tep_handle *tep, int id)
-{
- struct tep_event **eventptr;
- struct tep_event key;
- struct tep_event *pkey = &key;
-
- /* Check cache first */
- if (tep->last_event && tep->last_event->id == id)
- return tep->last_event;
-
- key.id = id;
-
- eventptr = bsearch(&pkey, tep->events, tep->nr_events,
- sizeof(*tep->events), events_id_cmp);
-
- if (eventptr) {
- tep->last_event = *eventptr;
- return *eventptr;
- }
-
- return NULL;
-}
-
-/**
- * tep_find_event_by_name - find an event by given name
- * @tep: a handle to the trace event parser context
- * @sys: the system name to search for
- * @name: the name of the event to search for
- *
- * This returns an event with a given @name and under the system
- * @sys. If @sys is NULL the first event with @name is returned.
- */
-struct tep_event *
-tep_find_event_by_name(struct tep_handle *tep,
- const char *sys, const char *name)
-{
- struct tep_event *event = NULL;
- int i;
-
- if (tep->last_event &&
- strcmp(tep->last_event->name, name) == 0 &&
- (!sys || strcmp(tep->last_event->system, sys) == 0))
- return tep->last_event;
-
- for (i = 0; i < tep->nr_events; i++) {
- event = tep->events[i];
- if (strcmp(event->name, name) == 0) {
- if (!sys)
- break;
- if (strcmp(event->system, sys) == 0)
- break;
- }
- }
- if (i == tep->nr_events)
- event = NULL;
-
- tep->last_event = event;
- return event;
-}
-
-static unsigned long long
-eval_num_arg(void *data, int size, struct tep_event *event, struct tep_print_arg *arg)
-{
- struct tep_handle *tep = event->tep;
- unsigned long long val = 0;
- unsigned long long left, right;
- struct tep_print_arg *typearg = NULL;
- struct tep_print_arg *larg;
- unsigned long offset;
- unsigned int field_size;
-
- switch (arg->type) {
- case TEP_PRINT_NULL:
- /* ?? */
- return 0;
- case TEP_PRINT_ATOM:
- return strtoull(arg->atom.atom, NULL, 0);
- case TEP_PRINT_FIELD:
- if (!arg->field.field) {
- arg->field.field = tep_find_any_field(event, arg->field.name);
- if (!arg->field.field)
- goto out_warning_field;
-
- }
- /* must be a number */
- val = tep_read_number(tep, data + arg->field.field->offset,
- arg->field.field->size);
- break;
- case TEP_PRINT_FLAGS:
- case TEP_PRINT_SYMBOL:
- case TEP_PRINT_INT_ARRAY:
- case TEP_PRINT_HEX:
- case TEP_PRINT_HEX_STR:
- break;
- case TEP_PRINT_TYPE:
- val = eval_num_arg(data, size, event, arg->typecast.item);
- return eval_type(val, arg, 0);
- case TEP_PRINT_STRING:
- case TEP_PRINT_BSTRING:
- case TEP_PRINT_BITMASK:
- return 0;
- case TEP_PRINT_FUNC: {
- struct trace_seq s;
- trace_seq_init(&s);
- val = process_defined_func(&s, data, size, event, arg);
- trace_seq_destroy(&s);
- return val;
- }
- case TEP_PRINT_OP:
- if (strcmp(arg->op.op, "[") == 0) {
- /*
- * Arrays are special, since we don't want
- * to read the arg as is.
- */
- right = eval_num_arg(data, size, event, arg->op.right);
-
- /* handle typecasts */
- larg = arg->op.left;
- while (larg->type == TEP_PRINT_TYPE) {
- if (!typearg)
- typearg = larg;
- larg = larg->typecast.item;
- }
-
- /* Default to long size */
- field_size = tep->long_size;
-
- switch (larg->type) {
- case TEP_PRINT_DYNAMIC_ARRAY:
- offset = tep_read_number(tep,
- data + larg->dynarray.field->offset,
- larg->dynarray.field->size);
- if (larg->dynarray.field->elementsize)
- field_size = larg->dynarray.field->elementsize;
- /*
- * The actual length of the dynamic array is stored
- * in the top half of the field, and the offset
- * is in the bottom half of the 32 bit field.
- */
- offset &= 0xffff;
- offset += right;
- break;
- case TEP_PRINT_FIELD:
- if (!larg->field.field) {
- larg->field.field =
- tep_find_any_field(event, larg->field.name);
- if (!larg->field.field) {
- arg = larg;
- goto out_warning_field;
- }
- }
- field_size = larg->field.field->elementsize;
- offset = larg->field.field->offset +
- right * larg->field.field->elementsize;
- break;
- default:
- goto default_op; /* oops, all bets off */
- }
- val = tep_read_number(tep,
- data + offset, field_size);
- if (typearg)
- val = eval_type(val, typearg, 1);
- break;
- } else if (strcmp(arg->op.op, "?") == 0) {
- left = eval_num_arg(data, size, event, arg->op.left);
- arg = arg->op.right;
- if (left)
- val = eval_num_arg(data, size, event, arg->op.left);
- else
- val = eval_num_arg(data, size, event, arg->op.right);
- break;
- }
- default_op:
- left = eval_num_arg(data, size, event, arg->op.left);
- right = eval_num_arg(data, size, event, arg->op.right);
- switch (arg->op.op[0]) {
- case '!':
- switch (arg->op.op[1]) {
- case 0:
- val = !right;
- break;
- case '=':
- val = left != right;
- break;
- default:
- goto out_warning_op;
- }
- break;
- case '~':
- val = ~right;
- break;
- case '|':
- if (arg->op.op[1])
- val = left || right;
- else
- val = left | right;
- break;
- case '&':
- if (arg->op.op[1])
- val = left && right;
- else
- val = left & right;
- break;
- case '<':
- switch (arg->op.op[1]) {
- case 0:
- val = left < right;
- break;
- case '<':
- val = left << right;
- break;
- case '=':
- val = left <= right;
- break;
- default:
- goto out_warning_op;
- }
- break;
- case '>':
- switch (arg->op.op[1]) {
- case 0:
- val = left > right;
- break;
- case '>':
- val = left >> right;
- break;
- case '=':
- val = left >= right;
- break;
- default:
- goto out_warning_op;
- }
- break;
- case '=':
- if (arg->op.op[1] != '=')
- goto out_warning_op;
-
- val = left == right;
- break;
- case '-':
- val = left - right;
- break;
- case '+':
- val = left + right;
- break;
- case '/':
- val = left / right;
- break;
- case '%':
- val = left % right;
- break;
- case '*':
- val = left * right;
- break;
- default:
- goto out_warning_op;
- }
- break;
- case TEP_PRINT_DYNAMIC_ARRAY_LEN:
- offset = tep_read_number(tep,
- data + arg->dynarray.field->offset,
- arg->dynarray.field->size);
- /*
- * The total allocated length of the dynamic array is
- * stored in the top half of the field, and the offset
- * is in the bottom half of the 32 bit field.
- */
- val = (unsigned long long)(offset >> 16);
- break;
- case TEP_PRINT_DYNAMIC_ARRAY:
- /* Without [], we pass the address to the dynamic data */
- offset = tep_read_number(tep,
- data + arg->dynarray.field->offset,
- arg->dynarray.field->size);
- /*
- * The total allocated length of the dynamic array is
- * stored in the top half of the field, and the offset
- * is in the bottom half of the 32 bit field.
- */
- offset &= 0xffff;
- val = (unsigned long long)((unsigned long)data + offset);
- break;
- default: /* not sure what to do there */
- return 0;
- }
- return val;
-
-out_warning_op:
- do_warning_event(event, "%s: unknown op '%s'", __func__, arg->op.op);
- return 0;
-
-out_warning_field:
- do_warning_event(event, "%s: field %s not found",
- __func__, arg->field.name);
- return 0;
-}
-
-struct flag {
- const char *name;
- unsigned long long value;
-};
-
-static const struct flag flags[] = {
- { "HI_SOFTIRQ", 0 },
- { "TIMER_SOFTIRQ", 1 },
- { "NET_TX_SOFTIRQ", 2 },
- { "NET_RX_SOFTIRQ", 3 },
- { "BLOCK_SOFTIRQ", 4 },
- { "IRQ_POLL_SOFTIRQ", 5 },
- { "TASKLET_SOFTIRQ", 6 },
- { "SCHED_SOFTIRQ", 7 },
- { "HRTIMER_SOFTIRQ", 8 },
- { "RCU_SOFTIRQ", 9 },
-
- { "HRTIMER_NORESTART", 0 },
- { "HRTIMER_RESTART", 1 },
-};
-
-static long long eval_flag(const char *flag)
-{
- int i;
-
- /*
- * Some flags in the format files do not get converted.
- * If the flag is not numeric, see if it is something that
- * we already know about.
- */
- if (isdigit(flag[0]))
- return strtoull(flag, NULL, 0);
-
- for (i = 0; i < (int)(sizeof(flags)/sizeof(flags[0])); i++)
- if (strcmp(flags[i].name, flag) == 0)
- return flags[i].value;
-
- return -1LL;
-}
-
-static void print_str_to_seq(struct trace_seq *s, const char *format,
- int len_arg, const char *str)
-{
- if (len_arg >= 0)
- trace_seq_printf(s, format, len_arg, str);
- else
- trace_seq_printf(s, format, str);
-}
-
-static void print_bitmask_to_seq(struct tep_handle *tep,
- struct trace_seq *s, const char *format,
- int len_arg, const void *data, int size)
-{
- int nr_bits = size * 8;
- int str_size = (nr_bits + 3) / 4;
- int len = 0;
- char buf[3];
- char *str;
- int index;
- int i;
-
- /*
- * The kernel likes to put in commas every 32 bits, we
- * can do the same.
- */
- str_size += (nr_bits - 1) / 32;
-
- str = malloc(str_size + 1);
- if (!str) {
- do_warning("%s: not enough memory!", __func__);
- return;
- }
- str[str_size] = 0;
-
- /* Start out with -2 for the two chars per byte */
- for (i = str_size - 2; i >= 0; i -= 2) {
- /*
- * data points to a bit mask of size bytes.
- * In the kernel, this is an array of long words, thus
- * endianness is very important.
- */
- if (tep->file_bigendian)
- index = size - (len + 1);
- else
- index = len;
-
- snprintf(buf, 3, "%02x", *((unsigned char *)data + index));
- memcpy(str + i, buf, 2);
- len++;
- if (!(len & 3) && i > 0) {
- i--;
- str[i] = ',';
- }
- }
-
- if (len_arg >= 0)
- trace_seq_printf(s, format, len_arg, str);
- else
- trace_seq_printf(s, format, str);
-
- free(str);
-}
-
-static void print_str_arg(struct trace_seq *s, void *data, int size,
- struct tep_event *event, const char *format,
- int len_arg, struct tep_print_arg *arg)
-{
- struct tep_handle *tep = event->tep;
- struct tep_print_flag_sym *flag;
- struct tep_format_field *field;
- struct printk_map *printk;
- long long val, fval;
- unsigned long long addr;
- char *str;
- unsigned char *hex;
- int print;
- int i, len;
-
- switch (arg->type) {
- case TEP_PRINT_NULL:
- /* ?? */
- return;
- case TEP_PRINT_ATOM:
- print_str_to_seq(s, format, len_arg, arg->atom.atom);
- return;
- case TEP_PRINT_FIELD:
- field = arg->field.field;
- if (!field) {
- field = tep_find_any_field(event, arg->field.name);
- if (!field) {
- str = arg->field.name;
- goto out_warning_field;
- }
- arg->field.field = field;
- }
- /* Zero sized fields, mean the rest of the data */
- len = field->size ? : size - field->offset;
-
- /*
- * Some events pass in pointers. If this is not an array
- * and the size is the same as long_size, assume that it
- * is a pointer.
- */
- if (!(field->flags & TEP_FIELD_IS_ARRAY) &&
- field->size == tep->long_size) {
-
- /* Handle heterogeneous recording and processing
- * architectures
- *
- * CASE I:
- * Traces recorded on 32-bit devices (32-bit
- * addressing) and processed on 64-bit devices:
- * In this case, only 32 bits should be read.
- *
- * CASE II:
- * Traces recorded on 64 bit devices and processed
- * on 32-bit devices:
- * In this case, 64 bits must be read.
- */
- addr = (tep->long_size == 8) ?
- *(unsigned long long *)(data + field->offset) :
- (unsigned long long)*(unsigned int *)(data + field->offset);
-
- /* Check if it matches a print format */
- printk = find_printk(tep, addr);
- if (printk)
- trace_seq_puts(s, printk->printk);
- else
- trace_seq_printf(s, "%llx", addr);
- break;
- }
- str = malloc(len + 1);
- if (!str) {
- do_warning_event(event, "%s: not enough memory!",
- __func__);
- return;
- }
- memcpy(str, data + field->offset, len);
- str[len] = 0;
- print_str_to_seq(s, format, len_arg, str);
- free(str);
- break;
- case TEP_PRINT_FLAGS:
- val = eval_num_arg(data, size, event, arg->flags.field);
- print = 0;
- for (flag = arg->flags.flags; flag; flag = flag->next) {
- fval = eval_flag(flag->value);
- if (!val && fval < 0) {
- print_str_to_seq(s, format, len_arg, flag->str);
- break;
- }
- if (fval > 0 && (val & fval) == fval) {
- if (print && arg->flags.delim)
- trace_seq_puts(s, arg->flags.delim);
- print_str_to_seq(s, format, len_arg, flag->str);
- print = 1;
- val &= ~fval;
- }
- }
- if (val) {
- if (print && arg->flags.delim)
- trace_seq_puts(s, arg->flags.delim);
- trace_seq_printf(s, "0x%llx", val);
- }
- break;
- case TEP_PRINT_SYMBOL:
- val = eval_num_arg(data, size, event, arg->symbol.field);
- for (flag = arg->symbol.symbols; flag; flag = flag->next) {
- fval = eval_flag(flag->value);
- if (val == fval) {
- print_str_to_seq(s, format, len_arg, flag->str);
- break;
- }
- }
- if (!flag)
- trace_seq_printf(s, "0x%llx", val);
- break;
- case TEP_PRINT_HEX:
- case TEP_PRINT_HEX_STR:
- if (arg->hex.field->type == TEP_PRINT_DYNAMIC_ARRAY) {
- unsigned long offset;
- offset = tep_read_number(tep,
- data + arg->hex.field->dynarray.field->offset,
- arg->hex.field->dynarray.field->size);
- hex = data + (offset & 0xffff);
- } else {
- field = arg->hex.field->field.field;
- if (!field) {
- str = arg->hex.field->field.name;
- field = tep_find_any_field(event, str);
- if (!field)
- goto out_warning_field;
- arg->hex.field->field.field = field;
- }
- hex = data + field->offset;
- }
- len = eval_num_arg(data, size, event, arg->hex.size);
- for (i = 0; i < len; i++) {
- if (i && arg->type == TEP_PRINT_HEX)
- trace_seq_putc(s, ' ');
- trace_seq_printf(s, "%02x", hex[i]);
- }
- break;
-
- case TEP_PRINT_INT_ARRAY: {
- void *num;
- int el_size;
-
- if (arg->int_array.field->type == TEP_PRINT_DYNAMIC_ARRAY) {
- unsigned long offset;
- struct tep_format_field *field =
- arg->int_array.field->dynarray.field;
- offset = tep_read_number(tep,
- data + field->offset,
- field->size);
- num = data + (offset & 0xffff);
- } else {
- field = arg->int_array.field->field.field;
- if (!field) {
- str = arg->int_array.field->field.name;
- field = tep_find_any_field(event, str);
- if (!field)
- goto out_warning_field;
- arg->int_array.field->field.field = field;
- }
- num = data + field->offset;
- }
- len = eval_num_arg(data, size, event, arg->int_array.count);
- el_size = eval_num_arg(data, size, event,
- arg->int_array.el_size);
- for (i = 0; i < len; i++) {
- if (i)
- trace_seq_putc(s, ' ');
-
- if (el_size == 1) {
- trace_seq_printf(s, "%u", *(uint8_t *)num);
- } else if (el_size == 2) {
- trace_seq_printf(s, "%u", *(uint16_t *)num);
- } else if (el_size == 4) {
- trace_seq_printf(s, "%u", *(uint32_t *)num);
- } else if (el_size == 8) {
- trace_seq_printf(s, "%"PRIu64, *(uint64_t *)num);
- } else {
- trace_seq_printf(s, "BAD SIZE:%d 0x%x",
- el_size, *(uint8_t *)num);
- el_size = 1;
- }
-
- num += el_size;
- }
- break;
- }
- case TEP_PRINT_TYPE:
- break;
- case TEP_PRINT_STRING: {
- int str_offset;
-
- if (!arg->string.field)
- arg->string.field = tep_find_any_field(event, arg->string.string);
- if (!arg->string.field)
- break;
-
- str_offset = data2host4(tep,
- *(unsigned int *)(data + arg->string.field->offset));
- str_offset &= 0xffff;
- if (arg->string.field->flags & TEP_FIELD_IS_RELATIVE)
- str_offset += arg->string.field->offset + arg->string.field->size;
- print_str_to_seq(s, format, len_arg, ((char *)data) + str_offset);
- break;
- }
- case TEP_PRINT_BSTRING:
- print_str_to_seq(s, format, len_arg, arg->string.string);
- break;
- case TEP_PRINT_BITMASK: {
- int bitmask_offset;
- int bitmask_size;
-
- if (!arg->bitmask.field)
- arg->bitmask.field = tep_find_any_field(event, arg->bitmask.bitmask);
- if (!arg->bitmask.field)
- break;
- bitmask_offset = data2host4(tep,
- *(unsigned int *)(data + arg->bitmask.field->offset));
- bitmask_size = bitmask_offset >> 16;
- bitmask_offset &= 0xffff;
- if (arg->bitmask.field->flags & TEP_FIELD_IS_RELATIVE)
- bitmask_offset += arg->bitmask.field->offset + arg->bitmask.field->size;
- print_bitmask_to_seq(tep, s, format, len_arg,
- data + bitmask_offset, bitmask_size);
- break;
- }
- case TEP_PRINT_OP:
- /*
- * The only op for string should be ? :
- */
- if (arg->op.op[0] != '?')
- return;
- val = eval_num_arg(data, size, event, arg->op.left);
- if (val)
- print_str_arg(s, data, size, event,
- format, len_arg, arg->op.right->op.left);
- else
- print_str_arg(s, data, size, event,
- format, len_arg, arg->op.right->op.right);
- break;
- case TEP_PRINT_FUNC:
- process_defined_func(s, data, size, event, arg);
- break;
- default:
- /* well... */
- break;
- }
-
- return;
-
-out_warning_field:
- do_warning_event(event, "%s: field %s not found",
- __func__, arg->field.name);
-}
-
-static unsigned long long
-process_defined_func(struct trace_seq *s, void *data, int size,
- struct tep_event *event, struct tep_print_arg *arg)
-{
- struct tep_function_handler *func_handle = arg->func.func;
- struct func_params *param;
- unsigned long long *args;
- unsigned long long ret;
- struct tep_print_arg *farg;
- struct trace_seq str;
- struct save_str {
- struct save_str *next;
- char *str;
- } *strings = NULL, *string;
- int i;
-
- if (!func_handle->nr_args) {
- ret = (*func_handle->func)(s, NULL);
- goto out;
- }
-
- farg = arg->func.args;
- param = func_handle->params;
-
- ret = ULLONG_MAX;
- args = malloc(sizeof(*args) * func_handle->nr_args);
- if (!args)
- goto out;
-
- for (i = 0; i < func_handle->nr_args; i++) {
- switch (param->type) {
- case TEP_FUNC_ARG_INT:
- case TEP_FUNC_ARG_LONG:
- case TEP_FUNC_ARG_PTR:
- args[i] = eval_num_arg(data, size, event, farg);
- break;
- case TEP_FUNC_ARG_STRING:
- trace_seq_init(&str);
- print_str_arg(&str, data, size, event, "%s", -1, farg);
- trace_seq_terminate(&str);
- string = malloc(sizeof(*string));
- if (!string) {
- do_warning_event(event, "%s(%d): malloc str",
- __func__, __LINE__);
- goto out_free;
- }
- string->next = strings;
- string->str = strdup(str.buffer);
- if (!string->str) {
- free(string);
- do_warning_event(event, "%s(%d): malloc str",
- __func__, __LINE__);
- goto out_free;
- }
- args[i] = (uintptr_t)string->str;
- strings = string;
- trace_seq_destroy(&str);
- break;
- default:
- /*
- * Something went totally wrong, this is not
- * an input error, something in this code broke.
- */
- do_warning_event(event, "Unexpected end of arguments\n");
- goto out_free;
- }
- farg = farg->next;
- param = param->next;
- }
-
- ret = (*func_handle->func)(s, args);
-out_free:
- free(args);
- while (strings) {
- string = strings;
- strings = string->next;
- free(string->str);
- free(string);
- }
-
- out:
- /* TBD : handle return type here */
- return ret;
-}
-
-static void free_args(struct tep_print_arg *args)
-{
- struct tep_print_arg *next;
-
- while (args) {
- next = args->next;
-
- free_arg(args);
- args = next;
- }
-}
-
-static struct tep_print_arg *make_bprint_args(char *fmt, void *data, int size, struct tep_event *event)
-{
- struct tep_handle *tep = event->tep;
- struct tep_format_field *field, *ip_field;
- struct tep_print_arg *args, *arg, **next;
- unsigned long long ip, val;
- char *ptr;
- void *bptr;
- int vsize = 0;
-
- field = tep->bprint_buf_field;
- ip_field = tep->bprint_ip_field;
-
- if (!field) {
- field = tep_find_field(event, "buf");
- if (!field) {
- do_warning_event(event, "can't find buffer field for binary printk");
- return NULL;
- }
- ip_field = tep_find_field(event, "ip");
- if (!ip_field) {
- do_warning_event(event, "can't find ip field for binary printk");
- return NULL;
- }
- tep->bprint_buf_field = field;
- tep->bprint_ip_field = ip_field;
- }
-
- ip = tep_read_number(tep, data + ip_field->offset, ip_field->size);
-
- /*
- * The first arg is the IP pointer.
- */
- args = alloc_arg();
- if (!args) {
- do_warning_event(event, "%s(%d): not enough memory!",
- __func__, __LINE__);
- return NULL;
- }
- arg = args;
- arg->next = NULL;
- next = &arg->next;
-
- arg->type = TEP_PRINT_ATOM;
-
- if (asprintf(&arg->atom.atom, "%lld", ip) < 0)
- goto out_free;
-
- /* skip the first "%ps: " */
- for (ptr = fmt + 5, bptr = data + field->offset;
- bptr < data + size && *ptr; ptr++) {
- int ls = 0;
-
- if (*ptr == '%') {
- process_again:
- ptr++;
- switch (*ptr) {
- case '%':
- break;
- case 'l':
- ls++;
- goto process_again;
- case 'L':
- ls = 2;
- goto process_again;
- case '0' ... '9':
- goto process_again;
- case '.':
- goto process_again;
- case 'z':
- case 'Z':
- ls = 1;
- goto process_again;
- case 'p':
- ls = 1;
- if (isalnum(ptr[1])) {
- ptr++;
- /* Check for special pointers */
- switch (*ptr) {
- case 's':
- case 'S':
- case 'x':
- break;
- case 'f':
- case 'F':
- /*
- * Pre-5.5 kernels use %pf and
- * %pF for printing symbols
- * while kernels since 5.5 use
- * %pfw for fwnodes. So check
- * %p[fF] isn't followed by 'w'.
- */
- if (ptr[1] != 'w')
- break;
- /* fall through */
- default:
- /*
- * Older kernels do not process
- * dereferenced pointers.
- * Only process if the pointer
- * value is a printable.
- */
- if (isprint(*(char *)bptr))
- goto process_string;
- }
- }
- /* fall through */
- case 'd':
- case 'u':
- case 'i':
- case 'x':
- case 'X':
- case 'o':
- switch (ls) {
- case 0:
- vsize = 4;
- break;
- case 1:
- vsize = tep->long_size;
- break;
- case 2:
- vsize = 8;
- break;
- default:
- vsize = ls; /* ? */
- break;
- }
- /* fall through */
- case '*':
- if (*ptr == '*')
- vsize = 4;
-
- /* the pointers are always 4 bytes aligned */
- bptr = (void *)(((unsigned long)bptr + 3) &
- ~3);
- val = tep_read_number(tep, bptr, vsize);
- bptr += vsize;
- arg = alloc_arg();
- if (!arg) {
- do_warning_event(event, "%s(%d): not enough memory!",
- __func__, __LINE__);
- goto out_free;
- }
- arg->next = NULL;
- arg->type = TEP_PRINT_ATOM;
- if (asprintf(&arg->atom.atom, "%lld", val) < 0) {
- free(arg);
- goto out_free;
- }
- *next = arg;
- next = &arg->next;
- /*
- * The '*' case means that an arg is used as the length.
- * We need to continue to figure out for what.
- */
- if (*ptr == '*')
- goto process_again;
-
- break;
- case 's':
- process_string:
- arg = alloc_arg();
- if (!arg) {
- do_warning_event(event, "%s(%d): not enough memory!",
- __func__, __LINE__);
- goto out_free;
- }
- arg->next = NULL;
- arg->type = TEP_PRINT_BSTRING;
- arg->string.string = strdup(bptr);
- if (!arg->string.string)
- goto out_free;
- bptr += strlen(bptr) + 1;
- *next = arg;
- next = &arg->next;
- default:
- break;
- }
- }
- }
-
- return args;
-
-out_free:
- free_args(args);
- return NULL;
-}
-
-static char *
-get_bprint_format(void *data, int size __maybe_unused,
- struct tep_event *event)
-{
- struct tep_handle *tep = event->tep;
- unsigned long long addr;
- struct tep_format_field *field;
- struct printk_map *printk;
- char *format;
-
- field = tep->bprint_fmt_field;
-
- if (!field) {
- field = tep_find_field(event, "fmt");
- if (!field) {
- do_warning_event(event, "can't find format field for binary printk");
- return NULL;
- }
- tep->bprint_fmt_field = field;
- }
-
- addr = tep_read_number(tep, data + field->offset, field->size);
-
- printk = find_printk(tep, addr);
- if (!printk) {
- if (asprintf(&format, "%%ps: (NO FORMAT FOUND at %llx)\n", addr) < 0)
- return NULL;
- return format;
- }
-
- if (asprintf(&format, "%s: %s", "%ps", printk->printk) < 0)
- return NULL;
-
- return format;
-}
-
-static int print_mac_arg(struct trace_seq *s, const char *format,
- void *data, int size, struct tep_event *event,
- struct tep_print_arg *arg)
-{
- const char *fmt = "%.2x:%.2x:%.2x:%.2x:%.2x:%.2x";
- bool reverse = false;
- unsigned char *buf;
- int ret = 0;
-
- if (arg->type == TEP_PRINT_FUNC) {
- process_defined_func(s, data, size, event, arg);
- return 0;
- }
-
- if (arg->type != TEP_PRINT_FIELD) {
- trace_seq_printf(s, "ARG TYPE NOT FIELD BUT %d",
- arg->type);
- return 0;
- }
-
- if (format[0] == 'm') {
- fmt = "%.2x%.2x%.2x%.2x%.2x%.2x";
- } else if (format[0] == 'M' && format[1] == 'F') {
- fmt = "%.2x-%.2x-%.2x-%.2x-%.2x-%.2x";
- ret++;
- }
- if (format[1] == 'R') {
- reverse = true;
- ret++;
- }
-
- if (!arg->field.field) {
- arg->field.field =
- tep_find_any_field(event, arg->field.name);
- if (!arg->field.field) {
- do_warning_event(event, "%s: field %s not found",
- __func__, arg->field.name);
- return ret;
- }
- }
- if (arg->field.field->size != 6) {
- trace_seq_printf(s, "INVALIDMAC");
- return ret;
- }
-
- buf = data + arg->field.field->offset;
- if (reverse)
- trace_seq_printf(s, fmt, buf[5], buf[4], buf[3], buf[2], buf[1], buf[0]);
- else
- trace_seq_printf(s, fmt, buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]);
-
- return ret;
-}
-
-static int parse_ip4_print_args(struct tep_handle *tep,
- const char *ptr, bool *reverse)
-{
- int ret = 0;
-
- *reverse = false;
-
- /* hnbl */
- switch (*ptr) {
- case 'h':
- if (tep->file_bigendian)
- *reverse = false;
- else
- *reverse = true;
- ret++;
- break;
- case 'l':
- *reverse = true;
- ret++;
- break;
- case 'n':
- case 'b':
- ret++;
- /* fall through */
- default:
- *reverse = false;
- break;
- }
-
- return ret;
-}
-
-static void print_ip4_addr(struct trace_seq *s, char i, bool reverse, unsigned char *buf)
-{
- const char *fmt;
-
- if (i == 'i')
- fmt = "%03d.%03d.%03d.%03d";
- else
- fmt = "%d.%d.%d.%d";
-
- if (reverse)
- trace_seq_printf(s, fmt, buf[3], buf[2], buf[1], buf[0]);
- else
- trace_seq_printf(s, fmt, buf[0], buf[1], buf[2], buf[3]);
-
-}
-
-static inline bool ipv6_addr_v4mapped(const struct in6_addr *a)
-{
- return ((unsigned long)(a->s6_addr32[0] | a->s6_addr32[1]) |
- (unsigned long)(a->s6_addr32[2] ^ htonl(0x0000ffff))) == 0UL;
-}
-
-static inline bool ipv6_addr_is_isatap(const struct in6_addr *addr)
-{
- return (addr->s6_addr32[2] | htonl(0x02000000)) == htonl(0x02005EFE);
-}
-
-static void print_ip6c_addr(struct trace_seq *s, unsigned char *addr)
-{
- int i, j, range;
- unsigned char zerolength[8];
- int longest = 1;
- int colonpos = -1;
- uint16_t word;
- uint8_t hi, lo;
- bool needcolon = false;
- bool useIPv4;
- struct in6_addr in6;
-
- memcpy(&in6, addr, sizeof(struct in6_addr));
-
- useIPv4 = ipv6_addr_v4mapped(&in6) || ipv6_addr_is_isatap(&in6);
-
- memset(zerolength, 0, sizeof(zerolength));
-
- if (useIPv4)
- range = 6;
- else
- range = 8;
-
- /* find position of longest 0 run */
- for (i = 0; i < range; i++) {
- for (j = i; j < range; j++) {
- if (in6.s6_addr16[j] != 0)
- break;
- zerolength[i]++;
- }
- }
- for (i = 0; i < range; i++) {
- if (zerolength[i] > longest) {
- longest = zerolength[i];
- colonpos = i;
- }
- }
- if (longest == 1) /* don't compress a single 0 */
- colonpos = -1;
-
- /* emit address */
- for (i = 0; i < range; i++) {
- if (i == colonpos) {
- if (needcolon || i == 0)
- trace_seq_printf(s, ":");
- trace_seq_printf(s, ":");
- needcolon = false;
- i += longest - 1;
- continue;
- }
- if (needcolon) {
- trace_seq_printf(s, ":");
- needcolon = false;
- }
- /* hex u16 without leading 0s */
- word = ntohs(in6.s6_addr16[i]);
- hi = word >> 8;
- lo = word & 0xff;
- if (hi)
- trace_seq_printf(s, "%x%02x", hi, lo);
- else
- trace_seq_printf(s, "%x", lo);
-
- needcolon = true;
- }
-
- if (useIPv4) {
- if (needcolon)
- trace_seq_printf(s, ":");
- print_ip4_addr(s, 'I', false, &in6.s6_addr[12]);
- }
-
- return;
-}
-
-static void print_ip6_addr(struct trace_seq *s, char i, unsigned char *buf)
-{
- int j;
-
- for (j = 0; j < 16; j += 2) {
- trace_seq_printf(s, "%02x%02x", buf[j], buf[j+1]);
- if (i == 'I' && j < 14)
- trace_seq_printf(s, ":");
- }
-}
-
-/*
- * %pi4 print an IPv4 address with leading zeros
- * %pI4 print an IPv4 address without leading zeros
- * %pi6 print an IPv6 address without colons
- * %pI6 print an IPv6 address with colons
- * %pI6c print an IPv6 address in compressed form with colons
- * %pISpc print an IP address based on sockaddr; p adds port.
- */
-static int print_ipv4_arg(struct trace_seq *s, const char *ptr, char i,
- void *data, int size, struct tep_event *event,
- struct tep_print_arg *arg)
-{
- bool reverse = false;
- unsigned char *buf;
- int ret;
-
- ret = parse_ip4_print_args(event->tep, ptr, &reverse);
-
- if (arg->type == TEP_PRINT_FUNC) {
- process_defined_func(s, data, size, event, arg);
- return ret;
- }
-
- if (arg->type != TEP_PRINT_FIELD) {
- trace_seq_printf(s, "ARG TYPE NOT FIELD BUT %d", arg->type);
- return ret;
- }
-
- if (!arg->field.field) {
- arg->field.field =
- tep_find_any_field(event, arg->field.name);
- if (!arg->field.field) {
- do_warning("%s: field %s not found",
- __func__, arg->field.name);
- return ret;
- }
- }
-
- buf = data + arg->field.field->offset;
-
- if (arg->field.field->size != 4) {
- trace_seq_printf(s, "INVALIDIPv4");
- return ret;
- }
-
- print_ip4_addr(s, i, reverse, buf);
- return ret;
-
-}
-
-static int print_ipv6_arg(struct trace_seq *s, const char *ptr, char i,
- void *data, int size, struct tep_event *event,
- struct tep_print_arg *arg)
-{
- char have_c = 0;
- unsigned char *buf;
- int rc = 0;
-
- /* pI6c */
- if (i == 'I' && *ptr == 'c') {
- have_c = 1;
- ptr++;
- rc++;
- }
-
- if (arg->type == TEP_PRINT_FUNC) {
- process_defined_func(s, data, size, event, arg);
- return rc;
- }
-
- if (arg->type != TEP_PRINT_FIELD) {
- trace_seq_printf(s, "ARG TYPE NOT FIELD BUT %d", arg->type);
- return rc;
- }
-
- if (!arg->field.field) {
- arg->field.field =
- tep_find_any_field(event, arg->field.name);
- if (!arg->field.field) {
- do_warning("%s: field %s not found",
- __func__, arg->field.name);
- return rc;
- }
- }
-
- buf = data + arg->field.field->offset;
-
- if (arg->field.field->size != 16) {
- trace_seq_printf(s, "INVALIDIPv6");
- return rc;
- }
-
- if (have_c)
- print_ip6c_addr(s, buf);
- else
- print_ip6_addr(s, i, buf);
-
- return rc;
-}
-
-static int print_ipsa_arg(struct trace_seq *s, const char *ptr, char i,
- void *data, int size, struct tep_event *event,
- struct tep_print_arg *arg)
-{
- char have_c = 0, have_p = 0;
- unsigned char *buf;
- struct sockaddr_storage *sa;
- bool reverse = false;
- int rc = 0;
- int ret;
-
- /* pISpc */
- if (i == 'I') {
- if (*ptr == 'p') {
- have_p = 1;
- ptr++;
- rc++;
- }
- if (*ptr == 'c') {
- have_c = 1;
- ptr++;
- rc++;
- }
- }
- ret = parse_ip4_print_args(event->tep, ptr, &reverse);
- ptr += ret;
- rc += ret;
-
- if (arg->type == TEP_PRINT_FUNC) {
- process_defined_func(s, data, size, event, arg);
- return rc;
- }
-
- if (arg->type != TEP_PRINT_FIELD) {
- trace_seq_printf(s, "ARG TYPE NOT FIELD BUT %d", arg->type);
- return rc;
- }
-
- if (!arg->field.field) {
- arg->field.field =
- tep_find_any_field(event, arg->field.name);
- if (!arg->field.field) {
- do_warning("%s: field %s not found",
- __func__, arg->field.name);
- return rc;
- }
- }
-
- sa = (struct sockaddr_storage *) (data + arg->field.field->offset);
-
- if (sa->ss_family == AF_INET) {
- struct sockaddr_in *sa4 = (struct sockaddr_in *) sa;
-
- if (arg->field.field->size < sizeof(struct sockaddr_in)) {
- trace_seq_printf(s, "INVALIDIPv4");
- return rc;
- }
-
- print_ip4_addr(s, i, reverse, (unsigned char *) &sa4->sin_addr);
- if (have_p)
- trace_seq_printf(s, ":%d", ntohs(sa4->sin_port));
-
-
- } else if (sa->ss_family == AF_INET6) {
- struct sockaddr_in6 *sa6 = (struct sockaddr_in6 *) sa;
-
- if (arg->field.field->size < sizeof(struct sockaddr_in6)) {
- trace_seq_printf(s, "INVALIDIPv6");
- return rc;
- }
-
- if (have_p)
- trace_seq_printf(s, "[");
-
- buf = (unsigned char *) &sa6->sin6_addr;
- if (have_c)
- print_ip6c_addr(s, buf);
- else
- print_ip6_addr(s, i, buf);
-
- if (have_p)
- trace_seq_printf(s, "]:%d", ntohs(sa6->sin6_port));
- }
-
- return rc;
-}
-
-static int print_ip_arg(struct trace_seq *s, const char *ptr,
- void *data, int size, struct tep_event *event,
- struct tep_print_arg *arg)
-{
- char i = *ptr; /* 'i' or 'I' */
- int rc = 1;
-
- /* IP version */
- ptr++;
-
- switch (*ptr) {
- case '4':
- rc += print_ipv4_arg(s, ptr + 1, i, data, size, event, arg);
- break;
- case '6':
- rc += print_ipv6_arg(s, ptr + 1, i, data, size, event, arg);
- break;
- case 'S':
- rc += print_ipsa_arg(s, ptr + 1, i, data, size, event, arg);
- break;
- default:
- return 0;
- }
-
- return rc;
-}
-
-static const int guid_index[16] = {3, 2, 1, 0, 5, 4, 7, 6, 8, 9, 10, 11, 12, 13, 14, 15};
-static const int uuid_index[16] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
-
-static int print_uuid_arg(struct trace_seq *s, const char *ptr,
- void *data, int size, struct tep_event *event,
- struct tep_print_arg *arg)
-{
- const int *index = uuid_index;
- char *format = "%02x";
- int ret = 0;
- char *buf;
- int i;
-
- switch (*(ptr + 1)) {
- case 'L':
- format = "%02X";
- /* fall through */
- case 'l':
- index = guid_index;
- ret++;
- break;
- case 'B':
- format = "%02X";
- /* fall through */
- case 'b':
- ret++;
- break;
- }
-
- if (arg->type == TEP_PRINT_FUNC) {
- process_defined_func(s, data, size, event, arg);
- return ret;
- }
-
- if (arg->type != TEP_PRINT_FIELD) {
- trace_seq_printf(s, "ARG TYPE NOT FIELD BUT %d", arg->type);
- return ret;
- }
-
- if (!arg->field.field) {
- arg->field.field =
- tep_find_any_field(event, arg->field.name);
- if (!arg->field.field) {
- do_warning("%s: field %s not found",
- __func__, arg->field.name);
- return ret;
- }
- }
-
- if (arg->field.field->size != 16) {
- trace_seq_printf(s, "INVALIDUUID");
- return ret;
- }
-
- buf = data + arg->field.field->offset;
-
- for (i = 0; i < 16; i++) {
- trace_seq_printf(s, format, buf[index[i]] & 0xff);
- switch (i) {
- case 3:
- case 5:
- case 7:
- case 9:
- trace_seq_printf(s, "-");
- break;
- }
- }
-
- return ret;
-}
-
-static int print_raw_buff_arg(struct trace_seq *s, const char *ptr,
- void *data, int size, struct tep_event *event,
- struct tep_print_arg *arg, int print_len)
-{
- int plen = print_len;
- char *delim = " ";
- int ret = 0;
- char *buf;
- int i;
- unsigned long offset;
- int arr_len;
-
- switch (*(ptr + 1)) {
- case 'C':
- delim = ":";
- ret++;
- break;
- case 'D':
- delim = "-";
- ret++;
- break;
- case 'N':
- delim = "";
- ret++;
- break;
- }
-
- if (arg->type == TEP_PRINT_FUNC) {
- process_defined_func(s, data, size, event, arg);
- return ret;
- }
-
- if (arg->type != TEP_PRINT_DYNAMIC_ARRAY) {
- trace_seq_printf(s, "ARG TYPE NOT FIELD BUT %d", arg->type);
- return ret;
- }
-
- offset = tep_read_number(event->tep,
- data + arg->dynarray.field->offset,
- arg->dynarray.field->size);
- arr_len = (unsigned long long)(offset >> 16);
- buf = data + (offset & 0xffff);
-
- if (arr_len < plen)
- plen = arr_len;
-
- if (plen < 1)
- return ret;
-
- trace_seq_printf(s, "%02x", buf[0] & 0xff);
- for (i = 1; i < plen; i++)
- trace_seq_printf(s, "%s%02x", delim, buf[i] & 0xff);
-
- return ret;
-}
-
-static int is_printable_array(char *p, unsigned int len)
-{
- unsigned int i;
-
- for (i = 0; i < len && p[i]; i++)
- if (!isprint(p[i]) && !isspace(p[i]))
- return 0;
- return 1;
-}
-
-void tep_print_field(struct trace_seq *s, void *data,
- struct tep_format_field *field)
-{
- unsigned long long val;
- unsigned int offset, len, i;
- struct tep_handle *tep = field->event->tep;
-
- if (field->flags & TEP_FIELD_IS_ARRAY) {
- offset = field->offset;
- len = field->size;
- if (field->flags & TEP_FIELD_IS_DYNAMIC) {
- val = tep_read_number(tep, data + offset, len);
- offset = val;
- len = offset >> 16;
- offset &= 0xffff;
- if (field->flags & TEP_FIELD_IS_RELATIVE)
- offset += field->offset + field->size;
- }
- if (field->flags & TEP_FIELD_IS_STRING &&
- is_printable_array(data + offset, len)) {
- trace_seq_printf(s, "%s", (char *)data + offset);
- } else {
- trace_seq_puts(s, "ARRAY[");
- for (i = 0; i < len; i++) {
- if (i)
- trace_seq_puts(s, ", ");
- trace_seq_printf(s, "%02x",
- *((unsigned char *)data + offset + i));
- }
- trace_seq_putc(s, ']');
- field->flags &= ~TEP_FIELD_IS_STRING;
- }
- } else {
- val = tep_read_number(tep, data + field->offset,
- field->size);
- if (field->flags & TEP_FIELD_IS_POINTER) {
- trace_seq_printf(s, "0x%llx", val);
- } else if (field->flags & TEP_FIELD_IS_SIGNED) {
- switch (field->size) {
- case 4:
- /*
- * If field is long then print it in hex.
- * A long usually stores pointers.
- */
- if (field->flags & TEP_FIELD_IS_LONG)
- trace_seq_printf(s, "0x%x", (int)val);
- else
- trace_seq_printf(s, "%d", (int)val);
- break;
- case 2:
- trace_seq_printf(s, "%2d", (short)val);
- break;
- case 1:
- trace_seq_printf(s, "%1d", (char)val);
- break;
- default:
- trace_seq_printf(s, "%lld", val);
- }
- } else {
- if (field->flags & TEP_FIELD_IS_LONG)
- trace_seq_printf(s, "0x%llx", val);
- else
- trace_seq_printf(s, "%llu", val);
- }
- }
-}
-
-void tep_print_fields(struct trace_seq *s, void *data,
- int size __maybe_unused, struct tep_event *event)
-{
- struct tep_format_field *field;
-
- field = event->format.fields;
- while (field) {
- trace_seq_printf(s, " %s=", field->name);
- tep_print_field(s, data, field);
- field = field->next;
- }
-}
-
-static int print_function(struct trace_seq *s, const char *format,
- void *data, int size, struct tep_event *event,
- struct tep_print_arg *arg)
-{
- struct func_map *func;
- unsigned long long val;
-
- val = eval_num_arg(data, size, event, arg);
- func = find_func(event->tep, val);
- if (func) {
- trace_seq_puts(s, func->func);
- if (*format == 'F' || *format == 'S')
- trace_seq_printf(s, "+0x%llx", val - func->addr);
- } else {
- if (event->tep->long_size == 4)
- trace_seq_printf(s, "0x%lx", (long)val);
- else
- trace_seq_printf(s, "0x%llx", (long long)val);
- }
-
- return 0;
-}
-
-static int print_arg_pointer(struct trace_seq *s, const char *format, int plen,
- void *data, int size,
- struct tep_event *event, struct tep_print_arg *arg)
-{
- unsigned long long val;
- int ret = 1;
-
- if (arg->type == TEP_PRINT_BSTRING) {
- trace_seq_puts(s, arg->string.string);
- return 0;
- }
- while (*format) {
- if (*format == 'p') {
- format++;
- break;
- }
- format++;
- }
-
- switch (*format) {
- case 'F':
- case 'f':
- case 'S':
- case 's':
- ret += print_function(s, format, data, size, event, arg);
- break;
- case 'M':
- case 'm':
- ret += print_mac_arg(s, format, data, size, event, arg);
- break;
- case 'I':
- case 'i':
- ret += print_ip_arg(s, format, data, size, event, arg);
- break;
- case 'U':
- ret += print_uuid_arg(s, format, data, size, event, arg);
- break;
- case 'h':
- ret += print_raw_buff_arg(s, format, data, size, event, arg, plen);
- break;
- default:
- ret = 0;
- val = eval_num_arg(data, size, event, arg);
- trace_seq_printf(s, "%p", (void *)(intptr_t)val);
- break;
- }
-
- return ret;
-
-}
-
-static int print_arg_number(struct trace_seq *s, const char *format, int plen,
- void *data, int size, int ls,
- struct tep_event *event, struct tep_print_arg *arg)
-{
- unsigned long long val;
-
- val = eval_num_arg(data, size, event, arg);
-
- switch (ls) {
- case -2:
- if (plen >= 0)
- trace_seq_printf(s, format, plen, (char)val);
- else
- trace_seq_printf(s, format, (char)val);
- break;
- case -1:
- if (plen >= 0)
- trace_seq_printf(s, format, plen, (short)val);
- else
- trace_seq_printf(s, format, (short)val);
- break;
- case 0:
- if (plen >= 0)
- trace_seq_printf(s, format, plen, (int)val);
- else
- trace_seq_printf(s, format, (int)val);
- break;
- case 1:
- if (plen >= 0)
- trace_seq_printf(s, format, plen, (long)val);
- else
- trace_seq_printf(s, format, (long)val);
- break;
- case 2:
- if (plen >= 0)
- trace_seq_printf(s, format, plen, (long long)val);
- else
- trace_seq_printf(s, format, (long long)val);
- break;
- default:
- do_warning_event(event, "bad count (%d)", ls);
- event->flags |= TEP_EVENT_FL_FAILED;
- }
- return 0;
-}
-
-
-static void print_arg_string(struct trace_seq *s, const char *format, int plen,
- void *data, int size,
- struct tep_event *event, struct tep_print_arg *arg)
-{
- struct trace_seq p;
-
- /* Use helper trace_seq */
- trace_seq_init(&p);
- print_str_arg(&p, data, size, event,
- format, plen, arg);
- trace_seq_terminate(&p);
- trace_seq_puts(s, p.buffer);
- trace_seq_destroy(&p);
-}
-
-static int parse_arg_format_pointer(const char *format)
-{
- int ret = 0;
- int index;
- int loop;
-
- switch (*format) {
- case 'F':
- case 'S':
- case 'f':
- case 's':
- ret++;
- break;
- case 'M':
- case 'm':
- /* [mM]R , [mM]F */
- switch (format[1]) {
- case 'R':
- case 'F':
- ret++;
- break;
- }
- ret++;
- break;
- case 'I':
- case 'i':
- index = 2;
- loop = 1;
- switch (format[1]) {
- case 'S':
- /*[S][pfs]*/
- while (loop) {
- switch (format[index]) {
- case 'p':
- case 'f':
- case 's':
- ret++;
- index++;
- break;
- default:
- loop = 0;
- break;
- }
- }
- /* fall through */
- case '4':
- /* [4S][hnbl] */
- switch (format[index]) {
- case 'h':
- case 'n':
- case 'l':
- case 'b':
- ret++;
- index++;
- break;
- }
- if (format[1] == '4') {
- ret++;
- break;
- }
- /* fall through */
- case '6':
- /* [6S]c */
- if (format[index] == 'c')
- ret++;
- ret++;
- break;
- }
- ret++;
- break;
- case 'U':
- switch (format[1]) {
- case 'L':
- case 'l':
- case 'B':
- case 'b':
- ret++;
- break;
- }
- ret++;
- break;
- case 'h':
- switch (format[1]) {
- case 'C':
- case 'D':
- case 'N':
- ret++;
- break;
- }
- ret++;
- break;
- default:
- break;
- }
-
- return ret;
-}
-
-static void free_parse_args(struct tep_print_parse *arg)
-{
- struct tep_print_parse *del;
-
- while (arg) {
- del = arg;
- arg = del->next;
- free(del->format);
- free(del);
- }
-}
-
-static int parse_arg_add(struct tep_print_parse **parse, char *format,
- enum tep_print_parse_type type,
- struct tep_print_arg *arg,
- struct tep_print_arg *len_as_arg,
- int ls)
-{
- struct tep_print_parse *parg = NULL;
-
- parg = calloc(1, sizeof(*parg));
- if (!parg)
- goto error;
- parg->format = strdup(format);
- if (!parg->format)
- goto error;
- parg->type = type;
- parg->arg = arg;
- parg->len_as_arg = len_as_arg;
- parg->ls = ls;
- *parse = parg;
- return 0;
-error:
- if (parg) {
- free(parg->format);
- free(parg);
- }
- return -1;
-}
-
-static int parse_arg_format(struct tep_print_parse **parse,
- struct tep_event *event,
- const char *format, struct tep_print_arg **arg)
-{
- struct tep_print_arg *len_arg = NULL;
- char print_format[32];
- const char *start = format;
- int ret = 0;
- int ls = 0;
- int res;
- int len;
-
- format++;
- ret++;
- for (; *format; format++) {
- switch (*format) {
- case '#':
- /* FIXME: need to handle properly */
- break;
- case 'h':
- ls--;
- break;
- case 'l':
- ls++;
- break;
- case 'L':
- ls = 2;
- break;
- case '.':
- case 'z':
- case 'Z':
- case '0' ... '9':
- case '-':
- break;
- case '*':
- /* The argument is the length. */
- if (!*arg) {
- do_warning_event(event, "no argument match");
- event->flags |= TEP_EVENT_FL_FAILED;
- goto out_failed;
- }
- if (len_arg) {
- do_warning_event(event, "argument already matched");
- event->flags |= TEP_EVENT_FL_FAILED;
- goto out_failed;
- }
- len_arg = *arg;
- *arg = (*arg)->next;
- break;
- case 'p':
- if (!*arg) {
- do_warning_event(event, "no argument match");
- event->flags |= TEP_EVENT_FL_FAILED;
- goto out_failed;
- }
- res = parse_arg_format_pointer(format + 1);
- if (res > 0) {
- format += res;
- ret += res;
- }
- len = ((unsigned long)format + 1) -
- (unsigned long)start;
- /* should never happen */
- if (len > 31) {
- do_warning_event(event, "bad format!");
- event->flags |= TEP_EVENT_FL_FAILED;
- len = 31;
- }
- memcpy(print_format, start, len);
- print_format[len] = 0;
-
- parse_arg_add(parse, print_format,
- PRINT_FMT_ARG_POINTER, *arg, len_arg, ls);
- *arg = (*arg)->next;
- ret++;
- return ret;
- case 'd':
- case 'u':
- case 'i':
- case 'x':
- case 'X':
- case 'o':
- if (!*arg) {
- do_warning_event(event, "no argument match");
- event->flags |= TEP_EVENT_FL_FAILED;
- goto out_failed;
- }
-
- len = ((unsigned long)format + 1) -
- (unsigned long)start;
-
- /* should never happen */
- if (len > 30) {
- do_warning_event(event, "bad format!");
- event->flags |= TEP_EVENT_FL_FAILED;
- len = 31;
- }
- memcpy(print_format, start, len);
- print_format[len] = 0;
-
- if (event->tep->long_size == 8 && ls == 1 &&
- sizeof(long) != 8) {
- char *p;
-
- /* make %l into %ll */
- if (ls == 1 && (p = strchr(print_format, 'l')))
- memmove(p+1, p, strlen(p)+1);
- ls = 2;
- }
- if (ls < -2 || ls > 2) {
- do_warning_event(event, "bad count (%d)", ls);
- event->flags |= TEP_EVENT_FL_FAILED;
- }
- parse_arg_add(parse, print_format,
- PRINT_FMT_ARG_DIGIT, *arg, len_arg, ls);
- *arg = (*arg)->next;
- ret++;
- return ret;
- case 's':
- if (!*arg) {
- do_warning_event(event, "no matching argument");
- event->flags |= TEP_EVENT_FL_FAILED;
- goto out_failed;
- }
-
- len = ((unsigned long)format + 1) -
- (unsigned long)start;
-
- /* should never happen */
- if (len > 31) {
- do_warning_event(event, "bad format!");
- event->flags |= TEP_EVENT_FL_FAILED;
- len = 31;
- }
-
- memcpy(print_format, start, len);
- print_format[len] = 0;
-
- parse_arg_add(parse, print_format,
- PRINT_FMT_ARG_STRING, *arg, len_arg, 0);
- *arg = (*arg)->next;
- ret++;
- return ret;
- default:
- snprintf(print_format, 32, ">%c<", *format);
- parse_arg_add(parse, print_format,
- PRINT_FMT_STRING, NULL, NULL, 0);
- ret++;
- return ret;
- }
- ret++;
- }
-
-out_failed:
- return ret;
-
-}
-
-static int parse_arg_string(struct tep_print_parse **parse, const char *format)
-{
- struct trace_seq s;
- int ret = 0;
-
- trace_seq_init(&s);
- for (; *format; format++) {
- if (*format == '\\') {
- format++;
- ret++;
- switch (*format) {
- case 'n':
- trace_seq_putc(&s, '\n');
- break;
- case 't':
- trace_seq_putc(&s, '\t');
- break;
- case 'r':
- trace_seq_putc(&s, '\r');
- break;
- case '\\':
- trace_seq_putc(&s, '\\');
- break;
- default:
- trace_seq_putc(&s, *format);
- break;
- }
- } else if (*format == '%') {
- if (*(format + 1) == '%') {
- trace_seq_putc(&s, '%');
- format++;
- ret++;
- } else
- break;
- } else
- trace_seq_putc(&s, *format);
-
- ret++;
- }
- trace_seq_terminate(&s);
- parse_arg_add(parse, s.buffer, PRINT_FMT_STRING, NULL, NULL, 0);
- trace_seq_destroy(&s);
-
- return ret;
-}
-
-static struct tep_print_parse *
-parse_args(struct tep_event *event, const char *format, struct tep_print_arg *arg)
-{
- struct tep_print_parse *parse_ret = NULL;
- struct tep_print_parse **parse = NULL;
- int ret;
- int len;
-
- len = strlen(format);
- while (*format) {
- if (!parse_ret)
- parse = &parse_ret;
- if (*format == '%' && *(format + 1) != '%')
- ret = parse_arg_format(parse, event, format, &arg);
- else
- ret = parse_arg_string(parse, format);
- if (*parse)
- parse = &((*parse)->next);
-
- len -= ret;
- if (len > 0)
- format += ret;
- else
- break;
- }
- return parse_ret;
-}
-
-static void print_event_cache(struct tep_print_parse *parse, struct trace_seq *s,
- void *data, int size, struct tep_event *event)
-{
- int len_arg;
-
- while (parse) {
- if (parse->len_as_arg)
- len_arg = eval_num_arg(data, size, event, parse->len_as_arg);
- switch (parse->type) {
- case PRINT_FMT_ARG_DIGIT:
- print_arg_number(s, parse->format,
- parse->len_as_arg ? len_arg : -1, data,
- size, parse->ls, event, parse->arg);
- break;
- case PRINT_FMT_ARG_POINTER:
- print_arg_pointer(s, parse->format,
- parse->len_as_arg ? len_arg : 1,
- data, size, event, parse->arg);
- break;
- case PRINT_FMT_ARG_STRING:
- print_arg_string(s, parse->format,
- parse->len_as_arg ? len_arg : -1,
- data, size, event, parse->arg);
- break;
- case PRINT_FMT_STRING:
- default:
- trace_seq_printf(s, "%s", parse->format);
- break;
- }
- parse = parse->next;
- }
-}
-
-static void pretty_print(struct trace_seq *s, void *data, int size, struct tep_event *event)
-{
- struct tep_print_parse *parse = event->print_fmt.print_cache;
- struct tep_print_arg *args = NULL;
- char *bprint_fmt = NULL;
-
- if (event->flags & TEP_EVENT_FL_FAILED) {
- trace_seq_printf(s, "[FAILED TO PARSE]");
- tep_print_fields(s, data, size, event);
- return;
- }
-
- if (event->flags & TEP_EVENT_FL_ISBPRINT) {
- bprint_fmt = get_bprint_format(data, size, event);
- args = make_bprint_args(bprint_fmt, data, size, event);
- parse = parse_args(event, bprint_fmt, args);
- }
-
- print_event_cache(parse, s, data, size, event);
-
- if (event->flags & TEP_EVENT_FL_ISBPRINT) {
- free_parse_args(parse);
- free_args(args);
- free(bprint_fmt);
- }
-}
-
-/*
- * This parses out the Latency format (interrupts disabled,
- * need rescheduling, in hard/soft interrupt, preempt count
- * and lock depth) and places it into the trace_seq.
- */
-static void data_latency_format(struct tep_handle *tep, struct trace_seq *s,
- char *format, struct tep_record *record)
-{
- static int check_lock_depth = 1;
- static int check_migrate_disable = 1;
- static int lock_depth_exists;
- static int migrate_disable_exists;
- unsigned int lat_flags;
- struct trace_seq sq;
- unsigned int pc;
- int lock_depth = 0;
- int migrate_disable = 0;
- int hardirq;
- int softirq;
- void *data = record->data;
-
- trace_seq_init(&sq);
- lat_flags = parse_common_flags(tep, data);
- pc = parse_common_pc(tep, data);
- /* lock_depth may not always exist */
- if (lock_depth_exists)
- lock_depth = parse_common_lock_depth(tep, data);
- else if (check_lock_depth) {
- lock_depth = parse_common_lock_depth(tep, data);
- if (lock_depth < 0)
- check_lock_depth = 0;
- else
- lock_depth_exists = 1;
- }
-
- /* migrate_disable may not always exist */
- if (migrate_disable_exists)
- migrate_disable = parse_common_migrate_disable(tep, data);
- else if (check_migrate_disable) {
- migrate_disable = parse_common_migrate_disable(tep, data);
- if (migrate_disable < 0)
- check_migrate_disable = 0;
- else
- migrate_disable_exists = 1;
- }
-
- hardirq = lat_flags & TRACE_FLAG_HARDIRQ;
- softirq = lat_flags & TRACE_FLAG_SOFTIRQ;
-
- trace_seq_printf(&sq, "%c%c%c",
- (lat_flags & TRACE_FLAG_IRQS_OFF) ? 'd' :
- (lat_flags & TRACE_FLAG_IRQS_NOSUPPORT) ?
- 'X' : '.',
- (lat_flags & TRACE_FLAG_NEED_RESCHED) ?
- 'N' : '.',
- (hardirq && softirq) ? 'H' :
- hardirq ? 'h' : softirq ? 's' : '.');
-
- if (pc)
- trace_seq_printf(&sq, "%x", pc);
- else
- trace_seq_printf(&sq, ".");
-
- if (migrate_disable_exists) {
- if (migrate_disable < 0)
- trace_seq_printf(&sq, ".");
- else
- trace_seq_printf(&sq, "%d", migrate_disable);
- }
-
- if (lock_depth_exists) {
- if (lock_depth < 0)
- trace_seq_printf(&sq, ".");
- else
- trace_seq_printf(&sq, "%d", lock_depth);
- }
-
- if (sq.state == TRACE_SEQ__MEM_ALLOC_FAILED) {
- s->state = TRACE_SEQ__MEM_ALLOC_FAILED;
- return;
- }
-
- trace_seq_terminate(&sq);
- trace_seq_puts(s, sq.buffer);
- trace_seq_destroy(&sq);
- trace_seq_terminate(s);
-}
-
-/**
- * tep_data_type - parse out the given event type
- * @tep: a handle to the trace event parser context
- * @rec: the record to read from
- *
- * This returns the event id from the @rec.
- */
-int tep_data_type(struct tep_handle *tep, struct tep_record *rec)
-{
- return trace_parse_common_type(tep, rec->data);
-}
-
-/**
- * tep_data_pid - parse the PID from record
- * @tep: a handle to the trace event parser context
- * @rec: the record to parse
- *
- * This returns the PID from a record.
- */
-int tep_data_pid(struct tep_handle *tep, struct tep_record *rec)
-{
- return parse_common_pid(tep, rec->data);
-}
-
-/**
- * tep_data_preempt_count - parse the preempt count from the record
- * @tep: a handle to the trace event parser context
- * @rec: the record to parse
- *
- * This returns the preempt count from a record.
- */
-int tep_data_preempt_count(struct tep_handle *tep, struct tep_record *rec)
-{
- return parse_common_pc(tep, rec->data);
-}
-
-/**
- * tep_data_flags - parse the latency flags from the record
- * @tep: a handle to the trace event parser context
- * @rec: the record to parse
- *
- * This returns the latency flags from a record.
- *
- * Use trace_flag_type enum for the flags (see event-parse.h).
- */
-int tep_data_flags(struct tep_handle *tep, struct tep_record *rec)
-{
- return parse_common_flags(tep, rec->data);
-}
-
-/**
- * tep_data_comm_from_pid - return the command line from PID
- * @tep: a handle to the trace event parser context
- * @pid: the PID of the task to search for
- *
- * This returns a pointer to the command line that has the given
- * @pid.
- */
-const char *tep_data_comm_from_pid(struct tep_handle *tep, int pid)
-{
- const char *comm;
-
- comm = find_cmdline(tep, pid);
- return comm;
-}
-
-static struct tep_cmdline *
-pid_from_cmdlist(struct tep_handle *tep, const char *comm, struct tep_cmdline *next)
-{
- struct cmdline_list *cmdlist = (struct cmdline_list *)next;
-
- if (cmdlist)
- cmdlist = cmdlist->next;
- else
- cmdlist = tep->cmdlist;
-
- while (cmdlist && strcmp(cmdlist->comm, comm) != 0)
- cmdlist = cmdlist->next;
-
- return (struct tep_cmdline *)cmdlist;
-}
-
-/**
- * tep_data_pid_from_comm - return the pid from a given comm
- * @tep: a handle to the trace event parser context
- * @comm: the cmdline to find the pid from
- * @next: the cmdline structure to find the next comm
- *
- * This returns the cmdline structure that holds a pid for a given
- * comm, or NULL if none found. As there may be more than one pid for
- * a given comm, the result of this call can be passed back into
- * a recurring call in the @next parameter, and then it will find the
- * next pid.
- * Also, it does a linear search, so it may be slow.
- */
-struct tep_cmdline *tep_data_pid_from_comm(struct tep_handle *tep, const char *comm,
- struct tep_cmdline *next)
-{
- struct tep_cmdline *cmdline;
-
- /*
- * If the cmdlines have not been converted yet, then use
- * the list.
- */
- if (!tep->cmdlines)
- return pid_from_cmdlist(tep, comm, next);
-
- if (next) {
- /*
- * The next pointer could have been still from
- * a previous call before cmdlines were created
- */
- if (next < tep->cmdlines ||
- next >= tep->cmdlines + tep->cmdline_count)
- next = NULL;
- else
- cmdline = next++;
- }
-
- if (!next)
- cmdline = tep->cmdlines;
-
- while (cmdline < tep->cmdlines + tep->cmdline_count) {
- if (strcmp(cmdline->comm, comm) == 0)
- return cmdline;
- cmdline++;
- }
- return NULL;
-}
-
-/**
- * tep_cmdline_pid - return the pid associated to a given cmdline
- * @tep: a handle to the trace event parser context
- * @cmdline: The cmdline structure to get the pid from
- *
- * Returns the pid for a give cmdline. If @cmdline is NULL, then
- * -1 is returned.
- */
-int tep_cmdline_pid(struct tep_handle *tep, struct tep_cmdline *cmdline)
-{
- struct cmdline_list *cmdlist = (struct cmdline_list *)cmdline;
-
- if (!cmdline)
- return -1;
-
- /*
- * If cmdlines have not been created yet, or cmdline is
- * not part of the array, then treat it as a cmdlist instead.
- */
- if (!tep->cmdlines ||
- cmdline < tep->cmdlines ||
- cmdline >= tep->cmdlines + tep->cmdline_count)
- return cmdlist->pid;
-
- return cmdline->pid;
-}
-
-/*
- * This parses the raw @data using the given @event information and
- * writes the print format into the trace_seq.
- */
-static void print_event_info(struct trace_seq *s, char *format, bool raw,
- struct tep_event *event, struct tep_record *record)
-{
- int print_pretty = 1;
-
- if (raw || (event->flags & TEP_EVENT_FL_PRINTRAW))
- tep_print_fields(s, record->data, record->size, event);
- else {
-
- if (event->handler && !(event->flags & TEP_EVENT_FL_NOHANDLE))
- print_pretty = event->handler(s, record, event,
- event->context);
-
- if (print_pretty)
- pretty_print(s, record->data, record->size, event);
- }
-
- trace_seq_terminate(s);
-}
-
-/**
- * tep_find_event_by_record - return the event from a given record
- * @tep: a handle to the trace event parser context
- * @record: The record to get the event from
- *
- * Returns the associated event for a given record, or NULL if non is
- * is found.
- */
-struct tep_event *
-tep_find_event_by_record(struct tep_handle *tep, struct tep_record *record)
-{
- int type;
-
- if (record->size < 0) {
- do_warning("ug! negative record size %d", record->size);
- return NULL;
- }
-
- type = trace_parse_common_type(tep, record->data);
-
- return tep_find_event(tep, type);
-}
-
-/*
- * Writes the timestamp of the record into @s. Time divisor and precision can be
- * specified as part of printf @format string. Example:
- * "%3.1000d" - divide the time by 1000 and print the first 3 digits
- * before the dot. Thus, the timestamp "123456000" will be printed as
- * "123.456"
- */
-static void print_event_time(struct tep_handle *tep, struct trace_seq *s,
- char *format, struct tep_event *event,
- struct tep_record *record)
-{
- unsigned long long time;
- char *divstr;
- int prec = 0, pr;
- int div = 0;
- int p10 = 1;
-
- if (isdigit(*(format + 1)))
- prec = atoi(format + 1);
- divstr = strchr(format, '.');
- if (divstr && isdigit(*(divstr + 1)))
- div = atoi(divstr + 1);
- time = record->ts;
- if (div) {
- time += div / 2;
- time /= div;
- }
- pr = prec;
- while (pr--)
- p10 *= 10;
-
- if (p10 > 1 && p10 < time)
- trace_seq_printf(s, "%5llu.%0*llu", time / p10, prec, time % p10);
- else
- trace_seq_printf(s, "%12llu", time);
-}
-
-struct print_event_type {
- enum {
- EVENT_TYPE_INT = 1,
- EVENT_TYPE_STRING,
- EVENT_TYPE_UNKNOWN,
- } type;
- char format[32];
-};
-
-static void print_string(struct tep_handle *tep, struct trace_seq *s,
- struct tep_record *record, struct tep_event *event,
- const char *arg, struct print_event_type *type)
-{
- const char *comm;
- int pid;
-
- if (strncmp(arg, TEP_PRINT_LATENCY, strlen(TEP_PRINT_LATENCY)) == 0) {
- data_latency_format(tep, s, type->format, record);
- } else if (strncmp(arg, TEP_PRINT_COMM, strlen(TEP_PRINT_COMM)) == 0) {
- pid = parse_common_pid(tep, record->data);
- comm = find_cmdline(tep, pid);
- trace_seq_printf(s, type->format, comm);
- } else if (strncmp(arg, TEP_PRINT_INFO_RAW, strlen(TEP_PRINT_INFO_RAW)) == 0) {
- print_event_info(s, type->format, true, event, record);
- } else if (strncmp(arg, TEP_PRINT_INFO, strlen(TEP_PRINT_INFO)) == 0) {
- print_event_info(s, type->format, false, event, record);
- } else if (strncmp(arg, TEP_PRINT_NAME, strlen(TEP_PRINT_NAME)) == 0) {
- trace_seq_printf(s, type->format, event->name);
- } else {
- trace_seq_printf(s, "[UNKNOWN TEP TYPE %s]", arg);
- }
-
-}
-
-static void print_int(struct tep_handle *tep, struct trace_seq *s,
- struct tep_record *record, struct tep_event *event,
- int arg, struct print_event_type *type)
-{
- int param;
-
- switch (arg) {
- case TEP_PRINT_CPU:
- param = record->cpu;
- break;
- case TEP_PRINT_PID:
- param = parse_common_pid(tep, record->data);
- break;
- case TEP_PRINT_TIME:
- return print_event_time(tep, s, type->format, event, record);
- default:
- return;
- }
- trace_seq_printf(s, type->format, param);
-}
-
-static int tep_print_event_param_type(char *format,
- struct print_event_type *type)
-{
- char *str = format + 1;
- int i = 1;
-
- type->type = EVENT_TYPE_UNKNOWN;
- while (*str) {
- switch (*str) {
- case 'd':
- case 'u':
- case 'i':
- case 'x':
- case 'X':
- case 'o':
- type->type = EVENT_TYPE_INT;
- break;
- case 's':
- type->type = EVENT_TYPE_STRING;
- break;
- }
- str++;
- i++;
- if (type->type != EVENT_TYPE_UNKNOWN)
- break;
- }
- memset(type->format, 0, 32);
- memcpy(type->format, format, i < 32 ? i : 31);
- return i;
-}
-
-/**
- * tep_print_event - Write various event information
- * @tep: a handle to the trace event parser context
- * @s: the trace_seq to write to
- * @record: The record to get the event from
- * @format: a printf format string. Supported event fileds:
- * TEP_PRINT_PID, "%d" - event PID
- * TEP_PRINT_CPU, "%d" - event CPU
- * TEP_PRINT_COMM, "%s" - event command string
- * TEP_PRINT_NAME, "%s" - event name
- * TEP_PRINT_LATENCY, "%s" - event latency
- * TEP_PRINT_TIME, %d - event time stamp. A divisor and precision
- * can be specified as part of this format string:
- * "%precision.divisord". Example:
- * "%3.1000d" - divide the time by 1000 and print the first
- * 3 digits before the dot. Thus, the time stamp
- * "123456000" will be printed as "123.456"
- * TEP_PRINT_INFO, "%s" - event information. If any width is specified in
- * the format string, the event information will be printed
- * in raw format.
- * Writes the specified event information into @s.
- */
-void tep_print_event(struct tep_handle *tep, struct trace_seq *s,
- struct tep_record *record, const char *fmt, ...)
-{
- struct print_event_type type;
- char *format = strdup(fmt);
- char *current = format;
- char *str = format;
- int offset;
- va_list args;
- struct tep_event *event;
-
- if (!format)
- return;
-
- event = tep_find_event_by_record(tep, record);
- va_start(args, fmt);
- while (*current) {
- current = strchr(str, '%');
- if (!current) {
- trace_seq_puts(s, str);
- break;
- }
- memset(&type, 0, sizeof(type));
- offset = tep_print_event_param_type(current, &type);
- *current = '\0';
- trace_seq_puts(s, str);
- current += offset;
- switch (type.type) {
- case EVENT_TYPE_STRING:
- print_string(tep, s, record, event,
- va_arg(args, char*), &type);
- break;
- case EVENT_TYPE_INT:
- print_int(tep, s, record, event,
- va_arg(args, int), &type);
- break;
- case EVENT_TYPE_UNKNOWN:
- default:
- trace_seq_printf(s, "[UNKNOWN TYPE]");
- break;
- }
- str = current;
-
- }
- va_end(args);
- free(format);
-}
-
-static int events_id_cmp(const void *a, const void *b)
-{
- struct tep_event * const * ea = a;
- struct tep_event * const * eb = b;
-
- if ((*ea)->id < (*eb)->id)
- return -1;
-
- if ((*ea)->id > (*eb)->id)
- return 1;
-
- return 0;
-}
-
-static int events_name_cmp(const void *a, const void *b)
-{
- struct tep_event * const * ea = a;
- struct tep_event * const * eb = b;
- int res;
-
- res = strcmp((*ea)->name, (*eb)->name);
- if (res)
- return res;
-
- res = strcmp((*ea)->system, (*eb)->system);
- if (res)
- return res;
-
- return events_id_cmp(a, b);
-}
-
-static int events_system_cmp(const void *a, const void *b)
-{
- struct tep_event * const * ea = a;
- struct tep_event * const * eb = b;
- int res;
-
- res = strcmp((*ea)->system, (*eb)->system);
- if (res)
- return res;
-
- res = strcmp((*ea)->name, (*eb)->name);
- if (res)
- return res;
-
- return events_id_cmp(a, b);
-}
-
-static struct tep_event **list_events_copy(struct tep_handle *tep)
-{
- struct tep_event **events;
-
- if (!tep)
- return NULL;
-
- events = malloc(sizeof(*events) * (tep->nr_events + 1));
- if (!events)
- return NULL;
-
- memcpy(events, tep->events, sizeof(*events) * tep->nr_events);
- events[tep->nr_events] = NULL;
- return events;
-}
-
-static void list_events_sort(struct tep_event **events, int nr_events,
- enum tep_event_sort_type sort_type)
-{
- int (*sort)(const void *a, const void *b);
-
- switch (sort_type) {
- case TEP_EVENT_SORT_ID:
- sort = events_id_cmp;
- break;
- case TEP_EVENT_SORT_NAME:
- sort = events_name_cmp;
- break;
- case TEP_EVENT_SORT_SYSTEM:
- sort = events_system_cmp;
- break;
- default:
- sort = NULL;
- }
-
- if (sort)
- qsort(events, nr_events, sizeof(*events), sort);
-}
-
-/**
- * tep_list_events - Get events, sorted by given criteria.
- * @tep: a handle to the tep context
- * @sort_type: desired sort order of the events in the array
- *
- * Returns an array of pointers to all events, sorted by the given
- * @sort_type criteria. The last element of the array is NULL. The returned
- * memory must not be freed, it is managed by the library.
- * The function is not thread safe.
- */
-struct tep_event **tep_list_events(struct tep_handle *tep,
- enum tep_event_sort_type sort_type)
-{
- struct tep_event **events;
-
- if (!tep)
- return NULL;
-
- events = tep->sort_events;
- if (events && tep->last_type == sort_type)
- return events;
-
- if (!events) {
- events = list_events_copy(tep);
- if (!events)
- return NULL;
-
- tep->sort_events = events;
-
- /* the internal events are sorted by id */
- if (sort_type == TEP_EVENT_SORT_ID) {
- tep->last_type = sort_type;
- return events;
- }
- }
-
- list_events_sort(events, tep->nr_events, sort_type);
- tep->last_type = sort_type;
-
- return events;
-}
-
-
-/**
- * tep_list_events_copy - Thread safe version of tep_list_events()
- * @tep: a handle to the tep context
- * @sort_type: desired sort order of the events in the array
- *
- * Returns an array of pointers to all events, sorted by the given
- * @sort_type criteria. The last element of the array is NULL. The returned
- * array is newly allocated inside the function and must be freed by the caller
- */
-struct tep_event **tep_list_events_copy(struct tep_handle *tep,
- enum tep_event_sort_type sort_type)
-{
- struct tep_event **events;
-
- if (!tep)
- return NULL;
-
- events = list_events_copy(tep);
- if (!events)
- return NULL;
-
- /* the internal events are sorted by id */
- if (sort_type == TEP_EVENT_SORT_ID)
- return events;
-
- list_events_sort(events, tep->nr_events, sort_type);
-
- return events;
-}
-
-static struct tep_format_field **
-get_event_fields(const char *type, const char *name,
- int count, struct tep_format_field *list)
-{
- struct tep_format_field **fields;
- struct tep_format_field *field;
- int i = 0;
-
- fields = malloc(sizeof(*fields) * (count + 1));
- if (!fields)
- return NULL;
-
- for (field = list; field; field = field->next) {
- fields[i++] = field;
- if (i == count + 1) {
- do_warning("event %s has more %s fields than specified",
- name, type);
- i--;
- break;
- }
- }
-
- if (i != count)
- do_warning("event %s has less %s fields than specified",
- name, type);
-
- fields[i] = NULL;
-
- return fields;
-}
-
-/**
- * tep_event_common_fields - return a list of common fields for an event
- * @event: the event to return the common fields of.
- *
- * Returns an allocated array of fields. The last item in the array is NULL.
- * The array must be freed with free().
- */
-struct tep_format_field **tep_event_common_fields(struct tep_event *event)
-{
- return get_event_fields("common", event->name,
- event->format.nr_common,
- event->format.common_fields);
-}
-
-/**
- * tep_event_fields - return a list of event specific fields for an event
- * @event: the event to return the fields of.
- *
- * Returns an allocated array of fields. The last item in the array is NULL.
- * The array must be freed with free().
- */
-struct tep_format_field **tep_event_fields(struct tep_event *event)
-{
- return get_event_fields("event", event->name,
- event->format.nr_fields,
- event->format.fields);
-}
-
-static void print_fields(struct trace_seq *s, struct tep_print_flag_sym *field)
-{
- trace_seq_printf(s, "{ %s, %s }", field->value, field->str);
- if (field->next) {
- trace_seq_puts(s, ", ");
- print_fields(s, field->next);
- }
-}
-
-/* for debugging */
-static void print_args(struct tep_print_arg *args)
-{
- int print_paren = 1;
- struct trace_seq s;
-
- switch (args->type) {
- case TEP_PRINT_NULL:
- printf("null");
- break;
- case TEP_PRINT_ATOM:
- printf("%s", args->atom.atom);
- break;
- case TEP_PRINT_FIELD:
- printf("REC->%s", args->field.name);
- break;
- case TEP_PRINT_FLAGS:
- printf("__print_flags(");
- print_args(args->flags.field);
- printf(", %s, ", args->flags.delim);
- trace_seq_init(&s);
- print_fields(&s, args->flags.flags);
- trace_seq_do_printf(&s);
- trace_seq_destroy(&s);
- printf(")");
- break;
- case TEP_PRINT_SYMBOL:
- printf("__print_symbolic(");
- print_args(args->symbol.field);
- printf(", ");
- trace_seq_init(&s);
- print_fields(&s, args->symbol.symbols);
- trace_seq_do_printf(&s);
- trace_seq_destroy(&s);
- printf(")");
- break;
- case TEP_PRINT_HEX:
- printf("__print_hex(");
- print_args(args->hex.field);
- printf(", ");
- print_args(args->hex.size);
- printf(")");
- break;
- case TEP_PRINT_HEX_STR:
- printf("__print_hex_str(");
- print_args(args->hex.field);
- printf(", ");
- print_args(args->hex.size);
- printf(")");
- break;
- case TEP_PRINT_INT_ARRAY:
- printf("__print_array(");
- print_args(args->int_array.field);
- printf(", ");
- print_args(args->int_array.count);
- printf(", ");
- print_args(args->int_array.el_size);
- printf(")");
- break;
- case TEP_PRINT_STRING:
- case TEP_PRINT_BSTRING:
- printf("__get_str(%s)", args->string.string);
- break;
- case TEP_PRINT_BITMASK:
- printf("__get_bitmask(%s)", args->bitmask.bitmask);
- break;
- case TEP_PRINT_TYPE:
- printf("(%s)", args->typecast.type);
- print_args(args->typecast.item);
- break;
- case TEP_PRINT_OP:
- if (strcmp(args->op.op, ":") == 0)
- print_paren = 0;
- if (print_paren)
- printf("(");
- print_args(args->op.left);
- printf(" %s ", args->op.op);
- print_args(args->op.right);
- if (print_paren)
- printf(")");
- break;
- default:
- /* we should warn... */
- return;
- }
- if (args->next) {
- printf("\n");
- print_args(args->next);
- }
-}
-
-static void parse_header_field(const char *field,
- int *offset, int *size, int mandatory)
-{
- unsigned long long save_input_buf_ptr;
- unsigned long long save_input_buf_siz;
- char *token;
- int type;
-
- save_input_buf_ptr = input_buf_ptr;
- save_input_buf_siz = input_buf_siz;
-
- if (read_expected(TEP_EVENT_ITEM, "field") < 0)
- return;
- if (read_expected(TEP_EVENT_OP, ":") < 0)
- return;
-
- /* type */
- if (read_expect_type(TEP_EVENT_ITEM, &token) < 0)
- goto fail;
- free_token(token);
-
- /*
- * If this is not a mandatory field, then test it first.
- */
- if (mandatory) {
- if (read_expected(TEP_EVENT_ITEM, field) < 0)
- return;
- } else {
- if (read_expect_type(TEP_EVENT_ITEM, &token) < 0)
- goto fail;
- if (strcmp(token, field) != 0)
- goto discard;
- free_token(token);
- }
-
- if (read_expected(TEP_EVENT_OP, ";") < 0)
- return;
- if (read_expected(TEP_EVENT_ITEM, "offset") < 0)
- return;
- if (read_expected(TEP_EVENT_OP, ":") < 0)
- return;
- if (read_expect_type(TEP_EVENT_ITEM, &token) < 0)
- goto fail;
- *offset = atoi(token);
- free_token(token);
- if (read_expected(TEP_EVENT_OP, ";") < 0)
- return;
- if (read_expected(TEP_EVENT_ITEM, "size") < 0)
- return;
- if (read_expected(TEP_EVENT_OP, ":") < 0)
- return;
- if (read_expect_type(TEP_EVENT_ITEM, &token) < 0)
- goto fail;
- *size = atoi(token);
- free_token(token);
- if (read_expected(TEP_EVENT_OP, ";") < 0)
- return;
- type = read_token(&token);
- if (type != TEP_EVENT_NEWLINE) {
- /* newer versions of the kernel have a "signed" type */
- if (type != TEP_EVENT_ITEM)
- goto fail;
-
- if (strcmp(token, "signed") != 0)
- goto fail;
-
- free_token(token);
-
- if (read_expected(TEP_EVENT_OP, ":") < 0)
- return;
-
- if (read_expect_type(TEP_EVENT_ITEM, &token))
- goto fail;
-
- free_token(token);
- if (read_expected(TEP_EVENT_OP, ";") < 0)
- return;
-
- if (read_expect_type(TEP_EVENT_NEWLINE, &token))
- goto fail;
- }
- fail:
- free_token(token);
- return;
-
- discard:
- input_buf_ptr = save_input_buf_ptr;
- input_buf_siz = save_input_buf_siz;
- *offset = 0;
- *size = 0;
- free_token(token);
-}
-
-/**
- * tep_parse_header_page - parse the data stored in the header page
- * @tep: a handle to the trace event parser context
- * @buf: the buffer storing the header page format string
- * @size: the size of @buf
- * @long_size: the long size to use if there is no header
- *
- * This parses the header page format for information on the
- * ring buffer used. The @buf should be copied from
- *
- * /sys/kernel/debug/tracing/events/header_page
- */
-int tep_parse_header_page(struct tep_handle *tep, char *buf, unsigned long size,
- int long_size)
-{
- int ignore;
-
- if (!size) {
- /*
- * Old kernels did not have header page info.
- * Sorry but we just use what we find here in user space.
- */
- tep->header_page_ts_size = sizeof(long long);
- tep->header_page_size_size = long_size;
- tep->header_page_data_offset = sizeof(long long) + long_size;
- tep->old_format = 1;
- return -1;
- }
- init_input_buf(buf, size);
-
- parse_header_field("timestamp", &tep->header_page_ts_offset,
- &tep->header_page_ts_size, 1);
- parse_header_field("commit", &tep->header_page_size_offset,
- &tep->header_page_size_size, 1);
- parse_header_field("overwrite", &tep->header_page_overwrite,
- &ignore, 0);
- parse_header_field("data", &tep->header_page_data_offset,
- &tep->header_page_data_size, 1);
-
- return 0;
-}
-
-static int event_matches(struct tep_event *event,
- int id, const char *sys_name,
- const char *event_name)
-{
- if (id >= 0 && id != event->id)
- return 0;
-
- if (event_name && (strcmp(event_name, event->name) != 0))
- return 0;
-
- if (sys_name && (strcmp(sys_name, event->system) != 0))
- return 0;
-
- return 1;
-}
-
-static void free_handler(struct event_handler *handle)
-{
- free((void *)handle->sys_name);
- free((void *)handle->event_name);
- free(handle);
-}
-
-static int find_event_handle(struct tep_handle *tep, struct tep_event *event)
-{
- struct event_handler *handle, **next;
-
- for (next = &tep->handlers; *next;
- next = &(*next)->next) {
- handle = *next;
- if (event_matches(event, handle->id,
- handle->sys_name,
- handle->event_name))
- break;
- }
-
- if (!(*next))
- return 0;
-
- pr_stat("overriding event (%d) %s:%s with new print handler",
- event->id, event->system, event->name);
-
- event->handler = handle->func;
- event->context = handle->context;
-
- *next = handle->next;
- free_handler(handle);
-
- return 1;
-}
-
-/**
- * parse_format - parse the event format
- * @buf: the buffer storing the event format string
- * @size: the size of @buf
- * @sys: the system the event belongs to
- *
- * This parses the event format and creates an event structure
- * to quickly parse raw data for a given event.
- *
- * These files currently come from:
- *
- * /sys/kernel/debug/tracing/events/.../.../format
- */
-static enum tep_errno parse_format(struct tep_event **eventp,
- struct tep_handle *tep, const char *buf,
- unsigned long size, const char *sys)
-{
- struct tep_event *event;
- int ret;
-
- init_input_buf(buf, size);
-
- *eventp = event = alloc_event();
- if (!event)
- return TEP_ERRNO__MEM_ALLOC_FAILED;
-
- event->name = event_read_name();
- if (!event->name) {
- /* Bad event? */
- ret = TEP_ERRNO__MEM_ALLOC_FAILED;
- goto event_alloc_failed;
- }
-
- if (strcmp(sys, "ftrace") == 0) {
- event->flags |= TEP_EVENT_FL_ISFTRACE;
-
- if (strcmp(event->name, "bprint") == 0)
- event->flags |= TEP_EVENT_FL_ISBPRINT;
- }
-
- event->id = event_read_id();
- if (event->id < 0) {
- ret = TEP_ERRNO__READ_ID_FAILED;
- /*
- * This isn't an allocation error actually.
- * But as the ID is critical, just bail out.
- */
- goto event_alloc_failed;
- }
-
- event->system = strdup(sys);
- if (!event->system) {
- ret = TEP_ERRNO__MEM_ALLOC_FAILED;
- goto event_alloc_failed;
- }
-
- /* Add tep to event so that it can be referenced */
- event->tep = tep;
-
- ret = event_read_format(event);
- if (ret < 0) {
- ret = TEP_ERRNO__READ_FORMAT_FAILED;
- goto event_parse_failed;
- }
-
- /*
- * If the event has an override, don't print warnings if the event
- * print format fails to parse.
- */
- if (tep && find_event_handle(tep, event))
- show_warning = 0;
-
- ret = event_read_print(event);
- show_warning = 1;
-
- if (ret < 0) {
- ret = TEP_ERRNO__READ_PRINT_FAILED;
- goto event_parse_failed;
- }
-
- if (!ret && (event->flags & TEP_EVENT_FL_ISFTRACE)) {
- struct tep_format_field *field;
- struct tep_print_arg *arg, **list;
-
- /* old ftrace had no args */
- list = &event->print_fmt.args;
- for (field = event->format.fields; field; field = field->next) {
- arg = alloc_arg();
- if (!arg) {
- event->flags |= TEP_EVENT_FL_FAILED;
- return TEP_ERRNO__OLD_FTRACE_ARG_FAILED;
- }
- arg->type = TEP_PRINT_FIELD;
- arg->field.name = strdup(field->name);
- if (!arg->field.name) {
- event->flags |= TEP_EVENT_FL_FAILED;
- free_arg(arg);
- return TEP_ERRNO__OLD_FTRACE_ARG_FAILED;
- }
- arg->field.field = field;
- *list = arg;
- list = &arg->next;
- }
- }
-
- if (!(event->flags & TEP_EVENT_FL_ISBPRINT))
- event->print_fmt.print_cache = parse_args(event,
- event->print_fmt.format,
- event->print_fmt.args);
-
- return 0;
-
- event_parse_failed:
- event->flags |= TEP_EVENT_FL_FAILED;
- return ret;
-
- event_alloc_failed:
- free(event->system);
- free(event->name);
- free(event);
- *eventp = NULL;
- return ret;
-}
-
-static enum tep_errno
-__parse_event(struct tep_handle *tep,
- struct tep_event **eventp,
- const char *buf, unsigned long size,
- const char *sys)
-{
- int ret = parse_format(eventp, tep, buf, size, sys);
- struct tep_event *event = *eventp;
-
- if (event == NULL)
- return ret;
-
- if (tep && add_event(tep, event)) {
- ret = TEP_ERRNO__MEM_ALLOC_FAILED;
- goto event_add_failed;
- }
-
-#define PRINT_ARGS 0
- if (PRINT_ARGS && event->print_fmt.args)
- print_args(event->print_fmt.args);
-
- return 0;
-
-event_add_failed:
- free_tep_event(event);
- return ret;
-}
-
-/**
- * tep_parse_format - parse the event format
- * @tep: a handle to the trace event parser context
- * @eventp: returned format
- * @buf: the buffer storing the event format string
- * @size: the size of @buf
- * @sys: the system the event belongs to
- *
- * This parses the event format and creates an event structure
- * to quickly parse raw data for a given event.
- *
- * These files currently come from:
- *
- * /sys/kernel/debug/tracing/events/.../.../format
- */
-enum tep_errno tep_parse_format(struct tep_handle *tep,
- struct tep_event **eventp,
- const char *buf,
- unsigned long size, const char *sys)
-{
- return __parse_event(tep, eventp, buf, size, sys);
-}
-
-/**
- * tep_parse_event - parse the event format
- * @tep: a handle to the trace event parser context
- * @buf: the buffer storing the event format string
- * @size: the size of @buf
- * @sys: the system the event belongs to
- *
- * This parses the event format and creates an event structure
- * to quickly parse raw data for a given event.
- *
- * These files currently come from:
- *
- * /sys/kernel/debug/tracing/events/.../.../format
- */
-enum tep_errno tep_parse_event(struct tep_handle *tep, const char *buf,
- unsigned long size, const char *sys)
-{
- struct tep_event *event = NULL;
- return __parse_event(tep, &event, buf, size, sys);
-}
-
-int get_field_val(struct trace_seq *s, struct tep_format_field *field,
- const char *name, struct tep_record *record,
- unsigned long long *val, int err)
-{
- if (!field) {
- if (err)
- trace_seq_printf(s, "<CANT FIND FIELD %s>", name);
- return -1;
- }
-
- if (tep_read_number_field(field, record->data, val)) {
- if (err)
- trace_seq_printf(s, " %s=INVALID", name);
- return -1;
- }
-
- return 0;
-}
-
-/**
- * tep_get_field_raw - return the raw pointer into the data field
- * @s: The seq to print to on error
- * @event: the event that the field is for
- * @name: The name of the field
- * @record: The record with the field name.
- * @len: place to store the field length.
- * @err: print default error if failed.
- *
- * Returns a pointer into record->data of the field and places
- * the length of the field in @len.
- *
- * On failure, it returns NULL.
- */
-void *tep_get_field_raw(struct trace_seq *s, struct tep_event *event,
- const char *name, struct tep_record *record,
- int *len, int err)
-{
- struct tep_format_field *field;
- void *data = record->data;
- unsigned offset;
- int dummy;
-
- if (!event)
- return NULL;
-
- field = tep_find_field(event, name);
-
- if (!field) {
- if (err)
- trace_seq_printf(s, "<CANT FIND FIELD %s>", name);
- return NULL;
- }
-
- /* Allow @len to be NULL */
- if (!len)
- len = &dummy;
-
- offset = field->offset;
- if (field->flags & TEP_FIELD_IS_DYNAMIC) {
- offset = tep_read_number(event->tep,
- data + offset, field->size);
- *len = offset >> 16;
- offset &= 0xffff;
- if (field->flags & TEP_FIELD_IS_RELATIVE)
- offset += field->offset + field->size;
- } else
- *len = field->size;
-
- return data + offset;
-}
-
-/**
- * tep_get_field_val - find a field and return its value
- * @s: The seq to print to on error
- * @event: the event that the field is for
- * @name: The name of the field
- * @record: The record with the field name.
- * @val: place to store the value of the field.
- * @err: print default error if failed.
- *
- * Returns 0 on success -1 on field not found.
- */
-int tep_get_field_val(struct trace_seq *s, struct tep_event *event,
- const char *name, struct tep_record *record,
- unsigned long long *val, int err)
-{
- struct tep_format_field *field;
-
- if (!event)
- return -1;
-
- field = tep_find_field(event, name);
-
- return get_field_val(s, field, name, record, val, err);
-}
-
-/**
- * tep_get_common_field_val - find a common field and return its value
- * @s: The seq to print to on error
- * @event: the event that the field is for
- * @name: The name of the field
- * @record: The record with the field name.
- * @val: place to store the value of the field.
- * @err: print default error if failed.
- *
- * Returns 0 on success -1 on field not found.
- */
-int tep_get_common_field_val(struct trace_seq *s, struct tep_event *event,
- const char *name, struct tep_record *record,
- unsigned long long *val, int err)
-{
- struct tep_format_field *field;
-
- if (!event)
- return -1;
-
- field = tep_find_common_field(event, name);
-
- return get_field_val(s, field, name, record, val, err);
-}
-
-/**
- * tep_get_any_field_val - find a any field and return its value
- * @s: The seq to print to on error
- * @event: the event that the field is for
- * @name: The name of the field
- * @record: The record with the field name.
- * @val: place to store the value of the field.
- * @err: print default error if failed.
- *
- * Returns 0 on success -1 on field not found.
- */
-int tep_get_any_field_val(struct trace_seq *s, struct tep_event *event,
- const char *name, struct tep_record *record,
- unsigned long long *val, int err)
-{
- struct tep_format_field *field;
-
- if (!event)
- return -1;
-
- field = tep_find_any_field(event, name);
-
- return get_field_val(s, field, name, record, val, err);
-}
-
-/**
- * tep_print_num_field - print a field and a format
- * @s: The seq to print to
- * @fmt: The printf format to print the field with.
- * @event: the event that the field is for
- * @name: The name of the field
- * @record: The record with the field name.
- * @err: print default error if failed.
- *
- * Returns positive value on success, negative in case of an error,
- * or 0 if buffer is full.
- */
-int tep_print_num_field(struct trace_seq *s, const char *fmt,
- struct tep_event *event, const char *name,
- struct tep_record *record, int err)
-{
- struct tep_format_field *field = tep_find_field(event, name);
- unsigned long long val;
-
- if (!field)
- goto failed;
-
- if (tep_read_number_field(field, record->data, &val))
- goto failed;
-
- return trace_seq_printf(s, fmt, val);
-
- failed:
- if (err)
- trace_seq_printf(s, "CAN'T FIND FIELD \"%s\"", name);
- return -1;
-}
-
-/**
- * tep_print_func_field - print a field and a format for function pointers
- * @s: The seq to print to
- * @fmt: The printf format to print the field with.
- * @event: the event that the field is for
- * @name: The name of the field
- * @record: The record with the field name.
- * @err: print default error if failed.
- *
- * Returns positive value on success, negative in case of an error,
- * or 0 if buffer is full.
- */
-int tep_print_func_field(struct trace_seq *s, const char *fmt,
- struct tep_event *event, const char *name,
- struct tep_record *record, int err)
-{
- struct tep_format_field *field = tep_find_field(event, name);
- struct tep_handle *tep = event->tep;
- unsigned long long val;
- struct func_map *func;
- char tmp[128];
-
- if (!field)
- goto failed;
-
- if (tep_read_number_field(field, record->data, &val))
- goto failed;
-
- func = find_func(tep, val);
-
- if (func)
- snprintf(tmp, 128, "%s/0x%llx", func->func, func->addr - val);
- else
- sprintf(tmp, "0x%08llx", val);
-
- return trace_seq_printf(s, fmt, tmp);
-
- failed:
- if (err)
- trace_seq_printf(s, "CAN'T FIND FIELD \"%s\"", name);
- return -1;
-}
-
-static void free_func_handle(struct tep_function_handler *func)
-{
- struct func_params *params;
-
- free(func->name);
-
- while (func->params) {
- params = func->params;
- func->params = params->next;
- free(params);
- }
-
- free(func);
-}
-
-/**
- * tep_register_print_function - register a helper function
- * @tep: a handle to the trace event parser context
- * @func: the function to process the helper function
- * @ret_type: the return type of the helper function
- * @name: the name of the helper function
- * @parameters: A list of enum tep_func_arg_type
- *
- * Some events may have helper functions in the print format arguments.
- * This allows a plugin to dynamically create a way to process one
- * of these functions.
- *
- * The @parameters is a variable list of tep_func_arg_type enums that
- * must end with TEP_FUNC_ARG_VOID.
- */
-int tep_register_print_function(struct tep_handle *tep,
- tep_func_handler func,
- enum tep_func_arg_type ret_type,
- char *name, ...)
-{
- struct tep_function_handler *func_handle;
- struct func_params **next_param;
- struct func_params *param;
- enum tep_func_arg_type type;
- va_list ap;
- int ret;
-
- func_handle = find_func_handler(tep, name);
- if (func_handle) {
- /*
- * This is most like caused by the users own
- * plugins updating the function. This overrides the
- * system defaults.
- */
- pr_stat("override of function helper '%s'", name);
- remove_func_handler(tep, name);
- }
-
- func_handle = calloc(1, sizeof(*func_handle));
- if (!func_handle) {
- do_warning("Failed to allocate function handler");
- return TEP_ERRNO__MEM_ALLOC_FAILED;
- }
-
- func_handle->ret_type = ret_type;
- func_handle->name = strdup(name);
- func_handle->func = func;
- if (!func_handle->name) {
- do_warning("Failed to allocate function name");
- free(func_handle);
- return TEP_ERRNO__MEM_ALLOC_FAILED;
- }
-
- next_param = &(func_handle->params);
- va_start(ap, name);
- for (;;) {
- type = va_arg(ap, enum tep_func_arg_type);
- if (type == TEP_FUNC_ARG_VOID)
- break;
-
- if (type >= TEP_FUNC_ARG_MAX_TYPES) {
- do_warning("Invalid argument type %d", type);
- ret = TEP_ERRNO__INVALID_ARG_TYPE;
- goto out_free;
- }
-
- param = malloc(sizeof(*param));
- if (!param) {
- do_warning("Failed to allocate function param");
- ret = TEP_ERRNO__MEM_ALLOC_FAILED;
- goto out_free;
- }
- param->type = type;
- param->next = NULL;
-
- *next_param = param;
- next_param = &(param->next);
-
- func_handle->nr_args++;
- }
- va_end(ap);
-
- func_handle->next = tep->func_handlers;
- tep->func_handlers = func_handle;
-
- return 0;
- out_free:
- va_end(ap);
- free_func_handle(func_handle);
- return ret;
-}
-
-/**
- * tep_unregister_print_function - unregister a helper function
- * @tep: a handle to the trace event parser context
- * @func: the function to process the helper function
- * @name: the name of the helper function
- *
- * This function removes existing print handler for function @name.
- *
- * Returns 0 if the handler was removed successully, -1 otherwise.
- */
-int tep_unregister_print_function(struct tep_handle *tep,
- tep_func_handler func, char *name)
-{
- struct tep_function_handler *func_handle;
-
- func_handle = find_func_handler(tep, name);
- if (func_handle && func_handle->func == func) {
- remove_func_handler(tep, name);
- return 0;
- }
- return -1;
-}
-
-static struct tep_event *search_event(struct tep_handle *tep, int id,
- const char *sys_name,
- const char *event_name)
-{
- struct tep_event *event;
-
- if (id >= 0) {
- /* search by id */
- event = tep_find_event(tep, id);
- if (!event)
- return NULL;
- if (event_name && (strcmp(event_name, event->name) != 0))
- return NULL;
- if (sys_name && (strcmp(sys_name, event->system) != 0))
- return NULL;
- } else {
- event = tep_find_event_by_name(tep, sys_name, event_name);
- if (!event)
- return NULL;
- }
- return event;
-}
-
-/**
- * tep_register_event_handler - register a way to parse an event
- * @tep: a handle to the trace event parser context
- * @id: the id of the event to register
- * @sys_name: the system name the event belongs to
- * @event_name: the name of the event
- * @func: the function to call to parse the event information
- * @context: the data to be passed to @func
- *
- * This function allows a developer to override the parsing of
- * a given event. If for some reason the default print format
- * is not sufficient, this function will register a function
- * for an event to be used to parse the data instead.
- *
- * If @id is >= 0, then it is used to find the event.
- * else @sys_name and @event_name are used.
- *
- * Returns:
- * TEP_REGISTER_SUCCESS_OVERWRITE if an existing handler is overwritten
- * TEP_REGISTER_SUCCESS if a new handler is registered successfully
- * negative TEP_ERRNO_... in case of an error
- *
- */
-int tep_register_event_handler(struct tep_handle *tep, int id,
- const char *sys_name, const char *event_name,
- tep_event_handler_func func, void *context)
-{
- struct tep_event *event;
- struct event_handler *handle;
-
- event = search_event(tep, id, sys_name, event_name);
- if (event == NULL)
- goto not_found;
-
- pr_stat("overriding event (%d) %s:%s with new print handler",
- event->id, event->system, event->name);
-
- event->handler = func;
- event->context = context;
- return TEP_REGISTER_SUCCESS_OVERWRITE;
-
- not_found:
- /* Save for later use. */
- handle = calloc(1, sizeof(*handle));
- if (!handle) {
- do_warning("Failed to allocate event handler");
- return TEP_ERRNO__MEM_ALLOC_FAILED;
- }
-
- handle->id = id;
- if (event_name)
- handle->event_name = strdup(event_name);
- if (sys_name)
- handle->sys_name = strdup(sys_name);
-
- if ((event_name && !handle->event_name) ||
- (sys_name && !handle->sys_name)) {
- do_warning("Failed to allocate event/sys name");
- free((void *)handle->event_name);
- free((void *)handle->sys_name);
- free(handle);
- return TEP_ERRNO__MEM_ALLOC_FAILED;
- }
-
- handle->func = func;
- handle->next = tep->handlers;
- tep->handlers = handle;
- handle->context = context;
-
- return TEP_REGISTER_SUCCESS;
-}
-
-static int handle_matches(struct event_handler *handler, int id,
- const char *sys_name, const char *event_name,
- tep_event_handler_func func, void *context)
-{
- if (id >= 0 && id != handler->id)
- return 0;
-
- if (event_name && (strcmp(event_name, handler->event_name) != 0))
- return 0;
-
- if (sys_name && (strcmp(sys_name, handler->sys_name) != 0))
- return 0;
-
- if (func != handler->func || context != handler->context)
- return 0;
-
- return 1;
-}
-
-/**
- * tep_unregister_event_handler - unregister an existing event handler
- * @tep: a handle to the trace event parser context
- * @id: the id of the event to unregister
- * @sys_name: the system name the handler belongs to
- * @event_name: the name of the event handler
- * @func: the function to call to parse the event information
- * @context: the data to be passed to @func
- *
- * This function removes existing event handler (parser).
- *
- * If @id is >= 0, then it is used to find the event.
- * else @sys_name and @event_name are used.
- *
- * Returns 0 if handler was removed successfully, -1 if event was not found.
- */
-int tep_unregister_event_handler(struct tep_handle *tep, int id,
- const char *sys_name, const char *event_name,
- tep_event_handler_func func, void *context)
-{
- struct tep_event *event;
- struct event_handler *handle;
- struct event_handler **next;
-
- event = search_event(tep, id, sys_name, event_name);
- if (event == NULL)
- goto not_found;
-
- if (event->handler == func && event->context == context) {
- pr_stat("removing override handler for event (%d) %s:%s. Going back to default handler.",
- event->id, event->system, event->name);
-
- event->handler = NULL;
- event->context = NULL;
- return 0;
- }
-
-not_found:
- for (next = &tep->handlers; *next; next = &(*next)->next) {
- handle = *next;
- if (handle_matches(handle, id, sys_name, event_name,
- func, context))
- break;
- }
-
- if (!(*next))
- return -1;
-
- *next = handle->next;
- free_handler(handle);
-
- return 0;
-}
-
-/**
- * tep_alloc - create a tep handle
- */
-struct tep_handle *tep_alloc(void)
-{
- struct tep_handle *tep = calloc(1, sizeof(*tep));
-
- if (tep) {
- tep->ref_count = 1;
- tep->host_bigendian = tep_is_bigendian();
- }
-
- return tep;
-}
-
-void tep_ref(struct tep_handle *tep)
-{
- tep->ref_count++;
-}
-
-int tep_get_ref(struct tep_handle *tep)
-{
- if (tep)
- return tep->ref_count;
- return 0;
-}
-
-__hidden void free_tep_format_field(struct tep_format_field *field)
-{
- free(field->type);
- if (field->alias != field->name)
- free(field->alias);
- free(field->name);
- free(field);
-}
-
-static void free_format_fields(struct tep_format_field *field)
-{
- struct tep_format_field *next;
-
- while (field) {
- next = field->next;
- free_tep_format_field(field);
- field = next;
- }
-}
-
-static void free_formats(struct tep_format *format)
-{
- free_format_fields(format->common_fields);
- free_format_fields(format->fields);
-}
-
-__hidden void free_tep_event(struct tep_event *event)
-{
- free(event->name);
- free(event->system);
-
- free_formats(&event->format);
-
- free(event->print_fmt.format);
- free_args(event->print_fmt.args);
- free_parse_args(event->print_fmt.print_cache);
- free(event);
-}
-
-/**
- * tep_free - free a tep handle
- * @tep: the tep handle to free
- */
-void tep_free(struct tep_handle *tep)
-{
- struct cmdline_list *cmdlist, *cmdnext;
- struct func_list *funclist, *funcnext;
- struct printk_list *printklist, *printknext;
- struct tep_function_handler *func_handler;
- struct event_handler *handle;
- int i;
-
- if (!tep)
- return;
-
- cmdlist = tep->cmdlist;
- funclist = tep->funclist;
- printklist = tep->printklist;
-
- tep->ref_count--;
- if (tep->ref_count)
- return;
-
- if (tep->cmdlines) {
- for (i = 0; i < tep->cmdline_count; i++)
- free(tep->cmdlines[i].comm);
- free(tep->cmdlines);
- }
-
- while (cmdlist) {
- cmdnext = cmdlist->next;
- free(cmdlist->comm);
- free(cmdlist);
- cmdlist = cmdnext;
- }
-
- if (tep->func_map) {
- for (i = 0; i < (int)tep->func_count; i++) {
- free(tep->func_map[i].func);
- free(tep->func_map[i].mod);
- }
- free(tep->func_map);
- }
-
- while (funclist) {
- funcnext = funclist->next;
- free(funclist->func);
- free(funclist->mod);
- free(funclist);
- funclist = funcnext;
- }
-
- while (tep->func_handlers) {
- func_handler = tep->func_handlers;
- tep->func_handlers = func_handler->next;
- free_func_handle(func_handler);
- }
-
- if (tep->printk_map) {
- for (i = 0; i < (int)tep->printk_count; i++)
- free(tep->printk_map[i].printk);
- free(tep->printk_map);
- }
-
- while (printklist) {
- printknext = printklist->next;
- free(printklist->printk);
- free(printklist);
- printklist = printknext;
- }
-
- for (i = 0; i < tep->nr_events; i++)
- free_tep_event(tep->events[i]);
-
- while (tep->handlers) {
- handle = tep->handlers;
- tep->handlers = handle->next;
- free_handler(handle);
- }
-
- free(tep->events);
- free(tep->sort_events);
- free(tep->func_resolver);
- free_tep_plugin_paths(tep);
-
- free(tep);
-}
-
-void tep_unref(struct tep_handle *tep)
-{
- tep_free(tep);
-}
diff --git a/tools/lib/traceevent/event-parse.h b/tools/lib/traceevent/event-parse.h
deleted file mode 100644
index 41d4f9f6a843..000000000000
--- a/tools/lib/traceevent/event-parse.h
+++ /dev/null
@@ -1,750 +0,0 @@
-/* SPDX-License-Identifier: LGPL-2.1 */
-/*
- * Copyright (C) 2009, 2010 Red Hat Inc, Steven Rostedt <[email protected]>
- *
- */
-#ifndef _PARSE_EVENTS_H
-#define _PARSE_EVENTS_H
-
-#include <stdbool.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <regex.h>
-#include <string.h>
-
-#include "trace-seq.h"
-
-#ifndef __maybe_unused
-#define __maybe_unused __attribute__((unused))
-#endif
-
-#ifndef DEBUG_RECORD
-#define DEBUG_RECORD 0
-#endif
-
-struct tep_record {
- unsigned long long ts;
- unsigned long long offset;
- long long missed_events; /* buffer dropped events before */
- int record_size; /* size of binary record */
- int size; /* size of data */
- void *data;
- int cpu;
- int ref_count;
- int locked; /* Do not free, even if ref_count is zero */
- void *priv;
-#if DEBUG_RECORD
- struct tep_record *prev;
- struct tep_record *next;
- long alloc_addr;
-#endif
-};
-
-/* ----------------------- tep ----------------------- */
-
-struct tep_handle;
-struct tep_event;
-
-typedef int (*tep_event_handler_func)(struct trace_seq *s,
- struct tep_record *record,
- struct tep_event *event,
- void *context);
-
-typedef int (*tep_plugin_load_func)(struct tep_handle *tep);
-typedef int (*tep_plugin_unload_func)(struct tep_handle *tep);
-
-struct tep_plugin_option {
- struct tep_plugin_option *next;
- void *handle;
- char *file;
- char *name;
- char *plugin_alias;
- char *description;
- const char *value;
- void *priv;
- int set;
-};
-
-/*
- * Plugin hooks that can be called:
- *
- * TEP_PLUGIN_LOADER: (required)
- * The function name to initialized the plugin.
- *
- * int TEP_PLUGIN_LOADER(struct tep_handle *tep)
- *
- * TEP_PLUGIN_UNLOADER: (optional)
- * The function called just before unloading
- *
- * int TEP_PLUGIN_UNLOADER(struct tep_handle *tep)
- *
- * TEP_PLUGIN_OPTIONS: (optional)
- * Plugin options that can be set before loading
- *
- * struct tep_plugin_option TEP_PLUGIN_OPTIONS[] = {
- * {
- * .name = "option-name",
- * .plugin_alias = "override-file-name", (optional)
- * .description = "description of option to show users",
- * },
- * {
- * .name = NULL,
- * },
- * };
- *
- * Array must end with .name = NULL;
- *
- *
- * .plugin_alias is used to give a shorter name to access
- * the vairable. Useful if a plugin handles more than one event.
- *
- * If .value is not set, then it is considered a boolean and only
- * .set will be processed. If .value is defined, then it is considered
- * a string option and .set will be ignored.
- *
- * TEP_PLUGIN_ALIAS: (optional)
- * The name to use for finding options (uses filename if not defined)
- */
-#define TEP_PLUGIN_LOADER tep_plugin_loader
-#define TEP_PLUGIN_UNLOADER tep_plugin_unloader
-#define TEP_PLUGIN_OPTIONS tep_plugin_options
-#define TEP_PLUGIN_ALIAS tep_plugin_alias
-#define _MAKE_STR(x) #x
-#define MAKE_STR(x) _MAKE_STR(x)
-#define TEP_PLUGIN_LOADER_NAME MAKE_STR(TEP_PLUGIN_LOADER)
-#define TEP_PLUGIN_UNLOADER_NAME MAKE_STR(TEP_PLUGIN_UNLOADER)
-#define TEP_PLUGIN_OPTIONS_NAME MAKE_STR(TEP_PLUGIN_OPTIONS)
-#define TEP_PLUGIN_ALIAS_NAME MAKE_STR(TEP_PLUGIN_ALIAS)
-
-enum tep_format_flags {
- TEP_FIELD_IS_ARRAY = 1,
- TEP_FIELD_IS_POINTER = 2,
- TEP_FIELD_IS_SIGNED = 4,
- TEP_FIELD_IS_STRING = 8,
- TEP_FIELD_IS_DYNAMIC = 16,
- TEP_FIELD_IS_LONG = 32,
- TEP_FIELD_IS_FLAG = 64,
- TEP_FIELD_IS_SYMBOLIC = 128,
- TEP_FIELD_IS_RELATIVE = 256,
-};
-
-struct tep_format_field {
- struct tep_format_field *next;
- struct tep_event *event;
- char *type;
- char *name;
- char *alias;
- int offset;
- int size;
- unsigned int arraylen;
- unsigned int elementsize;
- unsigned long flags;
-};
-
-struct tep_format {
- int nr_common;
- int nr_fields;
- struct tep_format_field *common_fields;
- struct tep_format_field *fields;
-};
-
-struct tep_print_arg_atom {
- char *atom;
-};
-
-struct tep_print_arg_string {
- char *string;
- struct tep_format_field *field;
-};
-
-struct tep_print_arg_bitmask {
- char *bitmask;
- struct tep_format_field *field;
-};
-
-struct tep_print_arg_field {
- char *name;
- struct tep_format_field *field;
-};
-
-struct tep_print_flag_sym {
- struct tep_print_flag_sym *next;
- char *value;
- char *str;
-};
-
-struct tep_print_arg_typecast {
- char *type;
- struct tep_print_arg *item;
-};
-
-struct tep_print_arg_flags {
- struct tep_print_arg *field;
- char *delim;
- struct tep_print_flag_sym *flags;
-};
-
-struct tep_print_arg_symbol {
- struct tep_print_arg *field;
- struct tep_print_flag_sym *symbols;
-};
-
-struct tep_print_arg_hex {
- struct tep_print_arg *field;
- struct tep_print_arg *size;
-};
-
-struct tep_print_arg_int_array {
- struct tep_print_arg *field;
- struct tep_print_arg *count;
- struct tep_print_arg *el_size;
-};
-
-struct tep_print_arg_dynarray {
- struct tep_format_field *field;
- struct tep_print_arg *index;
-};
-
-struct tep_print_arg;
-
-struct tep_print_arg_op {
- char *op;
- int prio;
- struct tep_print_arg *left;
- struct tep_print_arg *right;
-};
-
-struct tep_function_handler;
-
-struct tep_print_arg_func {
- struct tep_function_handler *func;
- struct tep_print_arg *args;
-};
-
-enum tep_print_arg_type {
- TEP_PRINT_NULL,
- TEP_PRINT_ATOM,
- TEP_PRINT_FIELD,
- TEP_PRINT_FLAGS,
- TEP_PRINT_SYMBOL,
- TEP_PRINT_HEX,
- TEP_PRINT_INT_ARRAY,
- TEP_PRINT_TYPE,
- TEP_PRINT_STRING,
- TEP_PRINT_BSTRING,
- TEP_PRINT_DYNAMIC_ARRAY,
- TEP_PRINT_OP,
- TEP_PRINT_FUNC,
- TEP_PRINT_BITMASK,
- TEP_PRINT_DYNAMIC_ARRAY_LEN,
- TEP_PRINT_HEX_STR,
-};
-
-struct tep_print_arg {
- struct tep_print_arg *next;
- enum tep_print_arg_type type;
- union {
- struct tep_print_arg_atom atom;
- struct tep_print_arg_field field;
- struct tep_print_arg_typecast typecast;
- struct tep_print_arg_flags flags;
- struct tep_print_arg_symbol symbol;
- struct tep_print_arg_hex hex;
- struct tep_print_arg_int_array int_array;
- struct tep_print_arg_func func;
- struct tep_print_arg_string string;
- struct tep_print_arg_bitmask bitmask;
- struct tep_print_arg_op op;
- struct tep_print_arg_dynarray dynarray;
- };
-};
-
-struct tep_print_parse;
-
-struct tep_print_fmt {
- char *format;
- struct tep_print_arg *args;
- struct tep_print_parse *print_cache;
-};
-
-struct tep_event {
- struct tep_handle *tep;
- char *name;
- int id;
- int flags;
- struct tep_format format;
- struct tep_print_fmt print_fmt;
- char *system;
- tep_event_handler_func handler;
- void *context;
-};
-
-enum {
- TEP_EVENT_FL_ISFTRACE = 0x01,
- TEP_EVENT_FL_ISPRINT = 0x02,
- TEP_EVENT_FL_ISBPRINT = 0x04,
- TEP_EVENT_FL_ISFUNCENT = 0x10,
- TEP_EVENT_FL_ISFUNCRET = 0x20,
- TEP_EVENT_FL_NOHANDLE = 0x40,
- TEP_EVENT_FL_PRINTRAW = 0x80,
-
- TEP_EVENT_FL_FAILED = 0x80000000
-};
-
-enum tep_event_sort_type {
- TEP_EVENT_SORT_ID,
- TEP_EVENT_SORT_NAME,
- TEP_EVENT_SORT_SYSTEM,
-};
-
-enum tep_event_type {
- TEP_EVENT_ERROR,
- TEP_EVENT_NONE,
- TEP_EVENT_SPACE,
- TEP_EVENT_NEWLINE,
- TEP_EVENT_OP,
- TEP_EVENT_DELIM,
- TEP_EVENT_ITEM,
- TEP_EVENT_DQUOTE,
- TEP_EVENT_SQUOTE,
-};
-
-typedef unsigned long long (*tep_func_handler)(struct trace_seq *s,
- unsigned long long *args);
-
-enum tep_func_arg_type {
- TEP_FUNC_ARG_VOID,
- TEP_FUNC_ARG_INT,
- TEP_FUNC_ARG_LONG,
- TEP_FUNC_ARG_STRING,
- TEP_FUNC_ARG_PTR,
- TEP_FUNC_ARG_MAX_TYPES
-};
-
-enum tep_flag {
- TEP_NSEC_OUTPUT = 1, /* output in NSECS */
- TEP_DISABLE_SYS_PLUGINS = 1 << 1,
- TEP_DISABLE_PLUGINS = 1 << 2,
-};
-
-#define TEP_ERRORS \
- _PE(MEM_ALLOC_FAILED, "failed to allocate memory"), \
- _PE(PARSE_EVENT_FAILED, "failed to parse event"), \
- _PE(READ_ID_FAILED, "failed to read event id"), \
- _PE(READ_FORMAT_FAILED, "failed to read event format"), \
- _PE(READ_PRINT_FAILED, "failed to read event print fmt"), \
- _PE(OLD_FTRACE_ARG_FAILED,"failed to allocate field name for ftrace"),\
- _PE(INVALID_ARG_TYPE, "invalid argument type"), \
- _PE(INVALID_EXP_TYPE, "invalid expression type"), \
- _PE(INVALID_OP_TYPE, "invalid operator type"), \
- _PE(INVALID_EVENT_NAME, "invalid event name"), \
- _PE(EVENT_NOT_FOUND, "no event found"), \
- _PE(SYNTAX_ERROR, "syntax error"), \
- _PE(ILLEGAL_RVALUE, "illegal rvalue"), \
- _PE(ILLEGAL_LVALUE, "illegal lvalue for string comparison"), \
- _PE(INVALID_REGEX, "regex did not compute"), \
- _PE(ILLEGAL_STRING_CMP, "illegal comparison for string"), \
- _PE(ILLEGAL_INTEGER_CMP,"illegal comparison for integer"), \
- _PE(REPARENT_NOT_OP, "cannot reparent other than OP"), \
- _PE(REPARENT_FAILED, "failed to reparent filter OP"), \
- _PE(BAD_FILTER_ARG, "bad arg in filter tree"), \
- _PE(UNEXPECTED_TYPE, "unexpected type (not a value)"), \
- _PE(ILLEGAL_TOKEN, "illegal token"), \
- _PE(INVALID_PAREN, "open parenthesis cannot come here"), \
- _PE(UNBALANCED_PAREN, "unbalanced number of parenthesis"), \
- _PE(UNKNOWN_TOKEN, "unknown token"), \
- _PE(FILTER_NOT_FOUND, "no filter found"), \
- _PE(NOT_A_NUMBER, "must have number field"), \
- _PE(NO_FILTER, "no filters exists"), \
- _PE(FILTER_MISS, "record does not match to filter")
-
-#undef _PE
-#define _PE(__code, __str) TEP_ERRNO__ ## __code
-enum tep_errno {
- TEP_ERRNO__SUCCESS = 0,
- TEP_ERRNO__FILTER_MATCH = TEP_ERRNO__SUCCESS,
-
- /*
- * Choose an arbitrary negative big number not to clash with standard
- * errno since SUS requires the errno has distinct positive values.
- * See 'Issue 6' in the link below.
- *
- * https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/errno.h.html
- */
- __TEP_ERRNO__START = -100000,
-
- TEP_ERRORS,
-
- __TEP_ERRNO__END,
-};
-#undef _PE
-
-struct tep_plugin_list;
-
-#define INVALID_PLUGIN_LIST_OPTION ((char **)((unsigned long)-1))
-
-enum tep_plugin_load_priority {
- TEP_PLUGIN_FIRST,
- TEP_PLUGIN_LAST,
-};
-
-int tep_add_plugin_path(struct tep_handle *tep, char *path,
- enum tep_plugin_load_priority prio);
-struct tep_plugin_list *tep_load_plugins(struct tep_handle *tep);
-void tep_unload_plugins(struct tep_plugin_list *plugin_list,
- struct tep_handle *tep);
-void tep_load_plugins_hook(struct tep_handle *tep, const char *suffix,
- void (*load_plugin)(struct tep_handle *tep,
- const char *path,
- const char *name,
- void *data),
- void *data);
-char **tep_plugin_list_options(void);
-void tep_plugin_free_options_list(char **list);
-int tep_plugin_add_options(const char *name,
- struct tep_plugin_option *options);
-int tep_plugin_add_option(const char *name, const char *val);
-void tep_plugin_remove_options(struct tep_plugin_option *options);
-void tep_plugin_print_options(struct trace_seq *s);
-void tep_print_plugins(struct trace_seq *s,
- const char *prefix, const char *suffix,
- const struct tep_plugin_list *list);
-
-/* tep_handle */
-typedef char *(tep_func_resolver_t)(void *priv,
- unsigned long long *addrp, char **modp);
-void tep_set_flag(struct tep_handle *tep, int flag);
-void tep_clear_flag(struct tep_handle *tep, enum tep_flag flag);
-bool tep_test_flag(struct tep_handle *tep, enum tep_flag flags);
-
-static inline int tep_is_bigendian(void)
-{
- unsigned char str[] = { 0x1, 0x2, 0x3, 0x4 };
- unsigned int val;
-
- memcpy(&val, str, 4);
- return val == 0x01020304;
-}
-
-/* taken from kernel/trace/trace.h */
-enum trace_flag_type {
- TRACE_FLAG_IRQS_OFF = 0x01,
- TRACE_FLAG_IRQS_NOSUPPORT = 0x02,
- TRACE_FLAG_NEED_RESCHED = 0x04,
- TRACE_FLAG_HARDIRQ = 0x08,
- TRACE_FLAG_SOFTIRQ = 0x10,
-};
-
-int tep_set_function_resolver(struct tep_handle *tep,
- tep_func_resolver_t *func, void *priv);
-void tep_reset_function_resolver(struct tep_handle *tep);
-int tep_register_comm(struct tep_handle *tep, const char *comm, int pid);
-int tep_override_comm(struct tep_handle *tep, const char *comm, int pid);
-int tep_register_function(struct tep_handle *tep, char *name,
- unsigned long long addr, char *mod);
-int tep_register_print_string(struct tep_handle *tep, const char *fmt,
- unsigned long long addr);
-bool tep_is_pid_registered(struct tep_handle *tep, int pid);
-
-struct tep_event *tep_get_event(struct tep_handle *tep, int index);
-
-#define TEP_PRINT_INFO "INFO"
-#define TEP_PRINT_INFO_RAW "INFO_RAW"
-#define TEP_PRINT_COMM "COMM"
-#define TEP_PRINT_LATENCY "LATENCY"
-#define TEP_PRINT_NAME "NAME"
-#define TEP_PRINT_PID 1U
-#define TEP_PRINT_TIME 2U
-#define TEP_PRINT_CPU 3U
-
-void tep_print_event(struct tep_handle *tep, struct trace_seq *s,
- struct tep_record *record, const char *fmt, ...)
- __attribute__ ((format (printf, 4, 5)));
-
-int tep_parse_header_page(struct tep_handle *tep, char *buf, unsigned long size,
- int long_size);
-
-enum tep_errno tep_parse_event(struct tep_handle *tep, const char *buf,
- unsigned long size, const char *sys);
-enum tep_errno tep_parse_format(struct tep_handle *tep,
- struct tep_event **eventp,
- const char *buf,
- unsigned long size, const char *sys);
-
-void *tep_get_field_raw(struct trace_seq *s, struct tep_event *event,
- const char *name, struct tep_record *record,
- int *len, int err);
-
-int tep_get_field_val(struct trace_seq *s, struct tep_event *event,
- const char *name, struct tep_record *record,
- unsigned long long *val, int err);
-int tep_get_common_field_val(struct trace_seq *s, struct tep_event *event,
- const char *name, struct tep_record *record,
- unsigned long long *val, int err);
-int tep_get_any_field_val(struct trace_seq *s, struct tep_event *event,
- const char *name, struct tep_record *record,
- unsigned long long *val, int err);
-
-int tep_print_num_field(struct trace_seq *s, const char *fmt,
- struct tep_event *event, const char *name,
- struct tep_record *record, int err);
-
-int tep_print_func_field(struct trace_seq *s, const char *fmt,
- struct tep_event *event, const char *name,
- struct tep_record *record, int err);
-
-enum tep_reg_handler {
- TEP_REGISTER_SUCCESS = 0,
- TEP_REGISTER_SUCCESS_OVERWRITE,
-};
-
-int tep_register_event_handler(struct tep_handle *tep, int id,
- const char *sys_name, const char *event_name,
- tep_event_handler_func func, void *context);
-int tep_unregister_event_handler(struct tep_handle *tep, int id,
- const char *sys_name, const char *event_name,
- tep_event_handler_func func, void *context);
-int tep_register_print_function(struct tep_handle *tep,
- tep_func_handler func,
- enum tep_func_arg_type ret_type,
- char *name, ...);
-int tep_unregister_print_function(struct tep_handle *tep,
- tep_func_handler func, char *name);
-
-struct tep_format_field *tep_find_common_field(struct tep_event *event, const char *name);
-struct tep_format_field *tep_find_field(struct tep_event *event, const char *name);
-struct tep_format_field *tep_find_any_field(struct tep_event *event, const char *name);
-
-const char *tep_find_function(struct tep_handle *tep, unsigned long long addr);
-unsigned long long
-tep_find_function_address(struct tep_handle *tep, unsigned long long addr);
-unsigned long long tep_read_number(struct tep_handle *tep, const void *ptr, int size);
-int tep_read_number_field(struct tep_format_field *field, const void *data,
- unsigned long long *value);
-
-struct tep_event *tep_get_first_event(struct tep_handle *tep);
-int tep_get_events_count(struct tep_handle *tep);
-struct tep_event *tep_find_event(struct tep_handle *tep, int id);
-
-struct tep_event *
-tep_find_event_by_name(struct tep_handle *tep, const char *sys, const char *name);
-struct tep_event *
-tep_find_event_by_record(struct tep_handle *tep, struct tep_record *record);
-
-int tep_data_type(struct tep_handle *tep, struct tep_record *rec);
-int tep_data_pid(struct tep_handle *tep, struct tep_record *rec);
-int tep_data_preempt_count(struct tep_handle *tep, struct tep_record *rec);
-int tep_data_flags(struct tep_handle *tep, struct tep_record *rec);
-const char *tep_data_comm_from_pid(struct tep_handle *tep, int pid);
-struct tep_cmdline;
-struct tep_cmdline *tep_data_pid_from_comm(struct tep_handle *tep, const char *comm,
- struct tep_cmdline *next);
-int tep_cmdline_pid(struct tep_handle *tep, struct tep_cmdline *cmdline);
-
-void tep_print_field(struct trace_seq *s, void *data,
- struct tep_format_field *field);
-void tep_print_fields(struct trace_seq *s, void *data,
- int size __maybe_unused, struct tep_event *event);
-int tep_strerror(struct tep_handle *tep, enum tep_errno errnum,
- char *buf, size_t buflen);
-
-struct tep_event **tep_list_events(struct tep_handle *tep, enum tep_event_sort_type);
-struct tep_event **tep_list_events_copy(struct tep_handle *tep,
- enum tep_event_sort_type);
-struct tep_format_field **tep_event_common_fields(struct tep_event *event);
-struct tep_format_field **tep_event_fields(struct tep_event *event);
-
-enum tep_endian {
- TEP_LITTLE_ENDIAN = 0,
- TEP_BIG_ENDIAN
-};
-int tep_get_cpus(struct tep_handle *tep);
-void tep_set_cpus(struct tep_handle *tep, int cpus);
-int tep_get_long_size(struct tep_handle *tep);
-void tep_set_long_size(struct tep_handle *tep, int long_size);
-int tep_get_page_size(struct tep_handle *tep);
-void tep_set_page_size(struct tep_handle *tep, int _page_size);
-bool tep_is_file_bigendian(struct tep_handle *tep);
-void tep_set_file_bigendian(struct tep_handle *tep, enum tep_endian endian);
-bool tep_is_local_bigendian(struct tep_handle *tep);
-void tep_set_local_bigendian(struct tep_handle *tep, enum tep_endian endian);
-int tep_get_header_page_size(struct tep_handle *tep);
-int tep_get_header_timestamp_size(struct tep_handle *tep);
-bool tep_is_old_format(struct tep_handle *tep);
-void tep_set_test_filters(struct tep_handle *tep, int test_filters);
-
-struct tep_handle *tep_alloc(void);
-void tep_free(struct tep_handle *tep);
-void tep_ref(struct tep_handle *tep);
-void tep_unref(struct tep_handle *tep);
-int tep_get_ref(struct tep_handle *tep);
-
-/* for debugging */
-void tep_print_funcs(struct tep_handle *tep);
-void tep_print_printk(struct tep_handle *tep);
-
-/* ----------------------- filtering ----------------------- */
-
-enum tep_filter_boolean_type {
- TEP_FILTER_FALSE,
- TEP_FILTER_TRUE,
-};
-
-enum tep_filter_op_type {
- TEP_FILTER_OP_AND = 1,
- TEP_FILTER_OP_OR,
- TEP_FILTER_OP_NOT,
-};
-
-enum tep_filter_cmp_type {
- TEP_FILTER_CMP_NONE,
- TEP_FILTER_CMP_EQ,
- TEP_FILTER_CMP_NE,
- TEP_FILTER_CMP_GT,
- TEP_FILTER_CMP_LT,
- TEP_FILTER_CMP_GE,
- TEP_FILTER_CMP_LE,
- TEP_FILTER_CMP_MATCH,
- TEP_FILTER_CMP_NOT_MATCH,
- TEP_FILTER_CMP_REGEX,
- TEP_FILTER_CMP_NOT_REGEX,
-};
-
-enum tep_filter_exp_type {
- TEP_FILTER_EXP_NONE,
- TEP_FILTER_EXP_ADD,
- TEP_FILTER_EXP_SUB,
- TEP_FILTER_EXP_MUL,
- TEP_FILTER_EXP_DIV,
- TEP_FILTER_EXP_MOD,
- TEP_FILTER_EXP_RSHIFT,
- TEP_FILTER_EXP_LSHIFT,
- TEP_FILTER_EXP_AND,
- TEP_FILTER_EXP_OR,
- TEP_FILTER_EXP_XOR,
- TEP_FILTER_EXP_NOT,
-};
-
-enum tep_filter_arg_type {
- TEP_FILTER_ARG_NONE,
- TEP_FILTER_ARG_BOOLEAN,
- TEP_FILTER_ARG_VALUE,
- TEP_FILTER_ARG_FIELD,
- TEP_FILTER_ARG_EXP,
- TEP_FILTER_ARG_OP,
- TEP_FILTER_ARG_NUM,
- TEP_FILTER_ARG_STR,
-};
-
-enum tep_filter_value_type {
- TEP_FILTER_NUMBER,
- TEP_FILTER_STRING,
- TEP_FILTER_CHAR
-};
-
-struct tep_filter_arg;
-
-struct tep_filter_arg_boolean {
- enum tep_filter_boolean_type value;
-};
-
-struct tep_filter_arg_field {
- struct tep_format_field *field;
-};
-
-struct tep_filter_arg_value {
- enum tep_filter_value_type type;
- union {
- char *str;
- unsigned long long val;
- };
-};
-
-struct tep_filter_arg_op {
- enum tep_filter_op_type type;
- struct tep_filter_arg *left;
- struct tep_filter_arg *right;
-};
-
-struct tep_filter_arg_exp {
- enum tep_filter_exp_type type;
- struct tep_filter_arg *left;
- struct tep_filter_arg *right;
-};
-
-struct tep_filter_arg_num {
- enum tep_filter_cmp_type type;
- struct tep_filter_arg *left;
- struct tep_filter_arg *right;
-};
-
-struct tep_filter_arg_str {
- enum tep_filter_cmp_type type;
- struct tep_format_field *field;
- char *val;
- char *buffer;
- regex_t reg;
-};
-
-struct tep_filter_arg {
- enum tep_filter_arg_type type;
- union {
- struct tep_filter_arg_boolean boolean;
- struct tep_filter_arg_field field;
- struct tep_filter_arg_value value;
- struct tep_filter_arg_op op;
- struct tep_filter_arg_exp exp;
- struct tep_filter_arg_num num;
- struct tep_filter_arg_str str;
- };
-};
-
-struct tep_filter_type {
- int event_id;
- struct tep_event *event;
- struct tep_filter_arg *filter;
-};
-
-#define TEP_FILTER_ERROR_BUFSZ 1024
-
-struct tep_event_filter {
- struct tep_handle *tep;
- int filters;
- struct tep_filter_type *event_filters;
- char error_buffer[TEP_FILTER_ERROR_BUFSZ];
-};
-
-struct tep_event_filter *tep_filter_alloc(struct tep_handle *tep);
-
-/* for backward compatibility */
-#define FILTER_NONE TEP_ERRNO__NO_FILTER
-#define FILTER_NOEXIST TEP_ERRNO__FILTER_NOT_FOUND
-#define FILTER_MISS TEP_ERRNO__FILTER_MISS
-#define FILTER_MATCH TEP_ERRNO__FILTER_MATCH
-
-enum tep_errno tep_filter_add_filter_str(struct tep_event_filter *filter,
- const char *filter_str);
-
-enum tep_errno tep_filter_match(struct tep_event_filter *filter,
- struct tep_record *record);
-
-int tep_filter_strerror(struct tep_event_filter *filter, enum tep_errno err,
- char *buf, size_t buflen);
-
-int tep_event_filtered(struct tep_event_filter *filter,
- int event_id);
-
-void tep_filter_reset(struct tep_event_filter *filter);
-
-void tep_filter_free(struct tep_event_filter *filter);
-
-char *tep_filter_make_string(struct tep_event_filter *filter, int event_id);
-
-int tep_filter_remove_event(struct tep_event_filter *filter,
- int event_id);
-
-int tep_filter_copy(struct tep_event_filter *dest, struct tep_event_filter *source);
-
-int tep_filter_compare(struct tep_event_filter *filter1, struct tep_event_filter *filter2);
-
-#endif /* _PARSE_EVENTS_H */
diff --git a/tools/lib/traceevent/event-plugin.c b/tools/lib/traceevent/event-plugin.c
deleted file mode 100644
index e7f93d5fe4fd..000000000000
--- a/tools/lib/traceevent/event-plugin.c
+++ /dev/null
@@ -1,711 +0,0 @@
-// SPDX-License-Identifier: LGPL-2.1
-/*
- * Copyright (C) 2009, 2010 Red Hat Inc, Steven Rostedt <[email protected]>
- *
- */
-
-#include <ctype.h>
-#include <stdio.h>
-#include <string.h>
-#include <dlfcn.h>
-#include <stdlib.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#include <dirent.h>
-#include <errno.h>
-#include "event-parse.h"
-#include "event-parse-local.h"
-#include "event-utils.h"
-#include "trace-seq.h"
-
-#define LOCAL_PLUGIN_DIR ".local/lib/traceevent/plugins/"
-
-static struct registered_plugin_options {
- struct registered_plugin_options *next;
- struct tep_plugin_option *options;
-} *registered_options;
-
-static struct trace_plugin_options {
- struct trace_plugin_options *next;
- char *plugin;
- char *option;
- char *value;
-} *trace_plugin_options;
-
-struct tep_plugin_list {
- struct tep_plugin_list *next;
- char *name;
- void *handle;
-};
-
-struct tep_plugins_dir {
- struct tep_plugins_dir *next;
- char *path;
- enum tep_plugin_load_priority prio;
-};
-
-static void lower_case(char *str)
-{
- if (!str)
- return;
- for (; *str; str++)
- *str = tolower(*str);
-}
-
-static int update_option_value(struct tep_plugin_option *op, const char *val)
-{
- char *op_val;
-
- if (!val) {
- /* toggle, only if option is boolean */
- if (op->value)
- /* Warn? */
- return 0;
- op->set ^= 1;
- return 0;
- }
-
- /*
- * If the option has a value then it takes a string
- * otherwise the option is a boolean.
- */
- if (op->value) {
- op->value = val;
- return 0;
- }
-
- /* Option is boolean, must be either "1", "0", "true" or "false" */
-
- op_val = strdup(val);
- if (!op_val)
- return -1;
- lower_case(op_val);
-
- if (strcmp(val, "1") == 0 || strcmp(val, "true") == 0)
- op->set = 1;
- else if (strcmp(val, "0") == 0 || strcmp(val, "false") == 0)
- op->set = 0;
- free(op_val);
-
- return 0;
-}
-
-/**
- * tep_plugin_list_options - get list of plugin options
- *
- * Returns an array of char strings that list the currently registered
- * plugin options in the format of <plugin>:<option>. This list can be
- * used by toggling the option.
- *
- * Returns NULL if there's no options registered. On error it returns
- * INVALID_PLUGIN_LIST_OPTION
- *
- * Must be freed with tep_plugin_free_options_list().
- */
-char **tep_plugin_list_options(void)
-{
- struct registered_plugin_options *reg;
- struct tep_plugin_option *op;
- char **list = NULL;
- char *name;
- int count = 0;
-
- for (reg = registered_options; reg; reg = reg->next) {
- for (op = reg->options; op->name; op++) {
- char *alias = op->plugin_alias ? op->plugin_alias : op->file;
- char **temp = list;
- int ret;
-
- ret = asprintf(&name, "%s:%s", alias, op->name);
- if (ret < 0)
- goto err;
-
- list = realloc(list, count + 2);
- if (!list) {
- list = temp;
- free(name);
- goto err;
- }
- list[count++] = name;
- list[count] = NULL;
- }
- }
- return list;
-
- err:
- while (--count >= 0)
- free(list[count]);
- free(list);
-
- return INVALID_PLUGIN_LIST_OPTION;
-}
-
-void tep_plugin_free_options_list(char **list)
-{
- int i;
-
- if (!list)
- return;
-
- if (list == INVALID_PLUGIN_LIST_OPTION)
- return;
-
- for (i = 0; list[i]; i++)
- free(list[i]);
-
- free(list);
-}
-
-static int
-update_option(const char *file, struct tep_plugin_option *option)
-{
- struct trace_plugin_options *op;
- char *plugin;
- int ret = 0;
-
- if (option->plugin_alias) {
- plugin = strdup(option->plugin_alias);
- if (!plugin)
- return -1;
- } else {
- char *p;
- plugin = strdup(file);
- if (!plugin)
- return -1;
- p = strstr(plugin, ".");
- if (p)
- *p = '\0';
- }
-
- /* first look for named options */
- for (op = trace_plugin_options; op; op = op->next) {
- if (!op->plugin)
- continue;
- if (strcmp(op->plugin, plugin) != 0)
- continue;
- if (strcmp(op->option, option->name) != 0)
- continue;
-
- ret = update_option_value(option, op->value);
- if (ret)
- goto out;
- break;
- }
-
- /* first look for unnamed options */
- for (op = trace_plugin_options; op; op = op->next) {
- if (op->plugin)
- continue;
- if (strcmp(op->option, option->name) != 0)
- continue;
-
- ret = update_option_value(option, op->value);
- break;
- }
-
- out:
- free(plugin);
- return ret;
-}
-
-/**
- * tep_plugin_add_options - Add a set of options by a plugin
- * @name: The name of the plugin adding the options
- * @options: The set of options being loaded
- *
- * Sets the options with the values that have been added by user.
- */
-int tep_plugin_add_options(const char *name,
- struct tep_plugin_option *options)
-{
- struct registered_plugin_options *reg;
-
- reg = malloc(sizeof(*reg));
- if (!reg)
- return -1;
- reg->next = registered_options;
- reg->options = options;
- registered_options = reg;
-
- while (options->name) {
- update_option(name, options);
- options++;
- }
- return 0;
-}
-
-/**
- * tep_plugin_remove_options - remove plugin options that were registered
- * @options: Options to removed that were registered with tep_plugin_add_options
- */
-void tep_plugin_remove_options(struct tep_plugin_option *options)
-{
- struct registered_plugin_options **last;
- struct registered_plugin_options *reg;
-
- for (last = &registered_options; *last; last = &(*last)->next) {
- if ((*last)->options == options) {
- reg = *last;
- *last = reg->next;
- free(reg);
- return;
- }
- }
-}
-
-static int parse_option_name(char **option, char **plugin)
-{
- char *p;
-
- *plugin = NULL;
-
- if ((p = strstr(*option, ":"))) {
- *plugin = *option;
- *p = '\0';
- *option = strdup(p + 1);
- if (!*option)
- return -1;
- }
- return 0;
-}
-
-static struct tep_plugin_option *
-find_registered_option(const char *plugin, const char *option)
-{
- struct registered_plugin_options *reg;
- struct tep_plugin_option *op;
- const char *op_plugin;
-
- for (reg = registered_options; reg; reg = reg->next) {
- for (op = reg->options; op->name; op++) {
- if (op->plugin_alias)
- op_plugin = op->plugin_alias;
- else
- op_plugin = op->file;
-
- if (plugin && strcmp(plugin, op_plugin) != 0)
- continue;
- if (strcmp(option, op->name) != 0)
- continue;
-
- return op;
- }
- }
-
- return NULL;
-}
-
-static int process_option(const char *plugin, const char *option, const char *val)
-{
- struct tep_plugin_option *op;
-
- op = find_registered_option(plugin, option);
- if (!op)
- return 0;
-
- return update_option_value(op, val);
-}
-
-/**
- * tep_plugin_add_option - add an option/val pair to set plugin options
- * @name: The name of the option (format: <plugin>:<option> or just <option>)
- * @val: (optional) the value for the option
- *
- * Modify a plugin option. If @val is given than the value of the option
- * is set (note, some options just take a boolean, so @val must be either
- * "1" or "0" or "true" or "false").
- */
-int tep_plugin_add_option(const char *name, const char *val)
-{
- struct trace_plugin_options *op;
- char *option_str;
- char *plugin;
-
- option_str = strdup(name);
- if (!option_str)
- return -ENOMEM;
-
- if (parse_option_name(&option_str, &plugin) < 0)
- return -ENOMEM;
-
- /* If the option exists, update the val */
- for (op = trace_plugin_options; op; op = op->next) {
- /* Both must be NULL or not NULL */
- if ((!plugin || !op->plugin) && plugin != op->plugin)
- continue;
- if (plugin && strcmp(plugin, op->plugin) != 0)
- continue;
- if (strcmp(op->option, option_str) != 0)
- continue;
-
- /* update option */
- free(op->value);
- if (val) {
- op->value = strdup(val);
- if (!op->value)
- goto out_free;
- } else
- op->value = NULL;
-
- /* plugin and option_str don't get freed at the end */
- free(plugin);
- free(option_str);
-
- plugin = op->plugin;
- option_str = op->option;
- break;
- }
-
- /* If not found, create */
- if (!op) {
- op = malloc(sizeof(*op));
- if (!op)
- goto out_free;
- memset(op, 0, sizeof(*op));
- op->plugin = plugin;
- op->option = option_str;
- if (val) {
- op->value = strdup(val);
- if (!op->value) {
- free(op);
- goto out_free;
- }
- }
- op->next = trace_plugin_options;
- trace_plugin_options = op;
- }
-
- return process_option(plugin, option_str, val);
-
-out_free:
- free(plugin);
- free(option_str);
- return -ENOMEM;
-}
-
-static void print_op_data(struct trace_seq *s, const char *name,
- const char *op)
-{
- if (op)
- trace_seq_printf(s, "%8s:\t%s\n", name, op);
-}
-
-/**
- * tep_plugin_print_options - print out the registered plugin options
- * @s: The trace_seq descriptor to write the plugin options into
- *
- * Writes a list of options into trace_seq @s.
- */
-void tep_plugin_print_options(struct trace_seq *s)
-{
- struct registered_plugin_options *reg;
- struct tep_plugin_option *op;
-
- for (reg = registered_options; reg; reg = reg->next) {
- if (reg != registered_options)
- trace_seq_printf(s, "============\n");
- for (op = reg->options; op->name; op++) {
- if (op != reg->options)
- trace_seq_printf(s, "------------\n");
- print_op_data(s, "file", op->file);
- print_op_data(s, "plugin", op->plugin_alias);
- print_op_data(s, "option", op->name);
- print_op_data(s, "desc", op->description);
- print_op_data(s, "value", op->value);
- trace_seq_printf(s, "%8s:\t%d\n", "set", op->set);
- }
- }
-}
-
-/**
- * tep_print_plugins - print out the list of plugins loaded
- * @s: the trace_seq descripter to write to
- * @prefix: The prefix string to add before listing the option name
- * @suffix: The suffix string ot append after the option name
- * @list: The list of plugins (usually returned by tep_load_plugins()
- *
- * Writes to the trace_seq @s the list of plugins (files) that is
- * returned by tep_load_plugins(). Use @prefix and @suffix for formating:
- * @prefix = " ", @suffix = "\n".
- */
-void tep_print_plugins(struct trace_seq *s,
- const char *prefix, const char *suffix,
- const struct tep_plugin_list *list)
-{
- while (list) {
- trace_seq_printf(s, "%s%s%s", prefix, list->name, suffix);
- list = list->next;
- }
-}
-
-static void
-load_plugin(struct tep_handle *tep, const char *path,
- const char *file, void *data)
-{
- struct tep_plugin_list **plugin_list = data;
- struct tep_plugin_option *options;
- tep_plugin_load_func func;
- struct tep_plugin_list *list;
- const char *alias;
- char *plugin;
- void *handle;
- int ret;
-
- ret = asprintf(&plugin, "%s/%s", path, file);
- if (ret < 0) {
- warning("could not allocate plugin memory\n");
- return;
- }
-
- handle = dlopen(plugin, RTLD_NOW | RTLD_GLOBAL);
- if (!handle) {
- warning("could not load plugin '%s'\n%s\n",
- plugin, dlerror());
- goto out_free;
- }
-
- alias = dlsym(handle, TEP_PLUGIN_ALIAS_NAME);
- if (!alias)
- alias = file;
-
- options = dlsym(handle, TEP_PLUGIN_OPTIONS_NAME);
- if (options) {
- while (options->name) {
- ret = update_option(alias, options);
- if (ret < 0)
- goto out_free;
- options++;
- }
- }
-
- func = dlsym(handle, TEP_PLUGIN_LOADER_NAME);
- if (!func) {
- warning("could not find func '%s' in plugin '%s'\n%s\n",
- TEP_PLUGIN_LOADER_NAME, plugin, dlerror());
- goto out_free;
- }
-
- list = malloc(sizeof(*list));
- if (!list) {
- warning("could not allocate plugin memory\n");
- goto out_free;
- }
-
- list->next = *plugin_list;
- list->handle = handle;
- list->name = plugin;
- *plugin_list = list;
-
- pr_stat("registering plugin: %s", plugin);
- func(tep);
- return;
-
- out_free:
- free(plugin);
-}
-
-static void
-load_plugins_dir(struct tep_handle *tep, const char *suffix,
- const char *path,
- void (*load_plugin)(struct tep_handle *tep,
- const char *path,
- const char *name,
- void *data),
- void *data)
-{
- struct dirent *dent;
- struct stat st;
- DIR *dir;
- int ret;
-
- ret = stat(path, &st);
- if (ret < 0)
- return;
-
- if (!S_ISDIR(st.st_mode))
- return;
-
- dir = opendir(path);
- if (!dir)
- return;
-
- while ((dent = readdir(dir))) {
- const char *name = dent->d_name;
-
- if (strcmp(name, ".") == 0 ||
- strcmp(name, "..") == 0)
- continue;
-
- /* Only load plugins that end in suffix */
- if (strcmp(name + (strlen(name) - strlen(suffix)), suffix) != 0)
- continue;
-
- load_plugin(tep, path, name, data);
- }
-
- closedir(dir);
-}
-
-/**
- * tep_load_plugins_hook - call a user specified callback to load a plugin
- * @tep: handler to traceevent context
- * @suffix: filter only plugin files with given suffix
- * @load_plugin: user specified callback, called for each plugin file
- * @data: custom context, passed to @load_plugin
- *
- * Searches for traceevent plugin files and calls @load_plugin for each
- * The order of plugins search is:
- * - Directories, specified in @tep->plugins_dir and priority TEP_PLUGIN_FIRST
- * - Directory, specified at compile time with PLUGIN_TRACEEVENT_DIR
- * - Directory, specified by environment variable TRACEEVENT_PLUGIN_DIR
- * - In user's home: ~/.local/lib/traceevent/plugins/
- * - Directories, specified in @tep->plugins_dir and priority TEP_PLUGIN_LAST
- *
- */
-void tep_load_plugins_hook(struct tep_handle *tep, const char *suffix,
- void (*load_plugin)(struct tep_handle *tep,
- const char *path,
- const char *name,
- void *data),
- void *data)
-{
- struct tep_plugins_dir *dir = NULL;
- char *home;
- char *path;
- char *envdir;
- int ret;
-
- if (tep && tep->flags & TEP_DISABLE_PLUGINS)
- return;
-
- if (tep)
- dir = tep->plugins_dir;
- while (dir) {
- if (dir->prio == TEP_PLUGIN_FIRST)
- load_plugins_dir(tep, suffix, dir->path,
- load_plugin, data);
- dir = dir->next;
- }
-
- /*
- * If a system plugin directory was defined,
- * check that first.
- */
-#ifdef PLUGIN_DIR
- if (!tep || !(tep->flags & TEP_DISABLE_SYS_PLUGINS))
- load_plugins_dir(tep, suffix, PLUGIN_DIR,
- load_plugin, data);
-#endif
-
- /*
- * Next let the environment-set plugin directory
- * override the system defaults.
- */
- envdir = getenv("TRACEEVENT_PLUGIN_DIR");
- if (envdir)
- load_plugins_dir(tep, suffix, envdir, load_plugin, data);
-
- /*
- * Now let the home directory override the environment
- * or system defaults.
- */
- home = getenv("HOME");
- if (!home)
- return;
-
- ret = asprintf(&path, "%s/%s", home, LOCAL_PLUGIN_DIR);
- if (ret < 0) {
- warning("could not allocate plugin memory\n");
- return;
- }
-
- load_plugins_dir(tep, suffix, path, load_plugin, data);
-
- if (tep)
- dir = tep->plugins_dir;
- while (dir) {
- if (dir->prio == TEP_PLUGIN_LAST)
- load_plugins_dir(tep, suffix, dir->path,
- load_plugin, data);
- dir = dir->next;
- }
-
- free(path);
-}
-
-struct tep_plugin_list*
-tep_load_plugins(struct tep_handle *tep)
-{
- struct tep_plugin_list *list = NULL;
-
- tep_load_plugins_hook(tep, ".so", load_plugin, &list);
- return list;
-}
-
-/**
- * tep_add_plugin_path - Add a new plugin directory.
- * @tep: Trace event handler.
- * @path: Path to a directory. All plugin files in that
- * directory will be loaded.
- *@prio: Load priority of the plugins in that directory.
- *
- * Returns -1 in case of an error, 0 otherwise.
- */
-int tep_add_plugin_path(struct tep_handle *tep, char *path,
- enum tep_plugin_load_priority prio)
-{
- struct tep_plugins_dir *dir;
-
- if (!tep || !path)
- return -1;
-
- dir = calloc(1, sizeof(*dir));
- if (!dir)
- return -1;
-
- dir->path = strdup(path);
- if (!dir->path) {
- free(dir);
- return -1;
- }
- dir->prio = prio;
- dir->next = tep->plugins_dir;
- tep->plugins_dir = dir;
-
- return 0;
-}
-
-__hidden void free_tep_plugin_paths(struct tep_handle *tep)
-{
- struct tep_plugins_dir *dir;
-
- if (!tep)
- return;
-
- dir = tep->plugins_dir;
- while (dir) {
- tep->plugins_dir = tep->plugins_dir->next;
- free(dir->path);
- free(dir);
- dir = tep->plugins_dir;
- }
-}
-
-void
-tep_unload_plugins(struct tep_plugin_list *plugin_list, struct tep_handle *tep)
-{
- tep_plugin_unload_func func;
- struct tep_plugin_list *list;
-
- while (plugin_list) {
- list = plugin_list;
- plugin_list = list->next;
- func = dlsym(list->handle, TEP_PLUGIN_UNLOADER_NAME);
- if (func)
- func(tep);
- dlclose(list->handle);
- free(list->name);
- free(list);
- }
-}
diff --git a/tools/lib/traceevent/event-utils.h b/tools/lib/traceevent/event-utils.h
deleted file mode 100644
index 0560b96a31d1..000000000000
--- a/tools/lib/traceevent/event-utils.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/* SPDX-License-Identifier: LGPL-2.1 */
-/*
- * Copyright (C) 2010 Red Hat Inc, Steven Rostedt <[email protected]>
- *
- */
-#ifndef __UTIL_H
-#define __UTIL_H
-
-#include <ctype.h>
-
-/* Can be overridden */
-void warning(const char *fmt, ...);
-void pr_stat(const char *fmt, ...);
-void vpr_stat(const char *fmt, va_list ap);
-
-/* Always available */
-void __warning(const char *fmt, ...);
-void __pr_stat(const char *fmt, ...);
-
-void __vwarning(const char *fmt, ...);
-void __vpr_stat(const char *fmt, ...);
-
-#define min(x, y) ({ \
- typeof(x) _min1 = (x); \
- typeof(y) _min2 = (y); \
- (void) (&_min1 == &_min2); \
- _min1 < _min2 ? _min1 : _min2; })
-
-static inline char *strim(char *string)
-{
- char *ret;
-
- if (!string)
- return NULL;
- while (*string) {
- if (!isspace(*string))
- break;
- string++;
- }
- ret = string;
-
- string = ret + strlen(ret) - 1;
- while (string > ret) {
- if (!isspace(*string))
- break;
- string--;
- }
- string[1] = 0;
-
- return ret;
-}
-
-static inline int has_text(const char *text)
-{
- if (!text)
- return 0;
-
- while (*text) {
- if (!isspace(*text))
- return 1;
- text++;
- }
-
- return 0;
-}
-
-#endif
diff --git a/tools/lib/traceevent/kbuffer-parse.c b/tools/lib/traceevent/kbuffer-parse.c
deleted file mode 100644
index f1640d651c8a..000000000000
--- a/tools/lib/traceevent/kbuffer-parse.c
+++ /dev/null
@@ -1,809 +0,0 @@
-// SPDX-License-Identifier: LGPL-2.1
-/*
- * Copyright (C) 2009, 2010 Red Hat Inc, Steven Rostedt <[email protected]>
- *
- */
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "kbuffer.h"
-
-#define MISSING_EVENTS (1UL << 31)
-#define MISSING_STORED (1UL << 30)
-
-#define COMMIT_MASK ((1 << 27) - 1)
-
-enum {
- KBUFFER_FL_HOST_BIG_ENDIAN = (1<<0),
- KBUFFER_FL_BIG_ENDIAN = (1<<1),
- KBUFFER_FL_LONG_8 = (1<<2),
- KBUFFER_FL_OLD_FORMAT = (1<<3),
-};
-
-#define ENDIAN_MASK (KBUFFER_FL_HOST_BIG_ENDIAN | KBUFFER_FL_BIG_ENDIAN)
-
-/** kbuffer
- * @timestamp - timestamp of current event
- * @lost_events - # of lost events between this subbuffer and previous
- * @flags - special flags of the kbuffer
- * @subbuffer - pointer to the sub-buffer page
- * @data - pointer to the start of data on the sub-buffer page
- * @index - index from @data to the @curr event data
- * @curr - offset from @data to the start of current event
- * (includes metadata)
- * @next - offset from @data to the start of next event
- * @size - The size of data on @data
- * @start - The offset from @subbuffer where @data lives
- *
- * @read_4 - Function to read 4 raw bytes (may swap)
- * @read_8 - Function to read 8 raw bytes (may swap)
- * @read_long - Function to read a long word (4 or 8 bytes with needed swap)
- */
-struct kbuffer {
- unsigned long long timestamp;
- long long lost_events;
- unsigned long flags;
- void *subbuffer;
- void *data;
- unsigned int index;
- unsigned int curr;
- unsigned int next;
- unsigned int size;
- unsigned int start;
-
- unsigned int (*read_4)(void *ptr);
- unsigned long long (*read_8)(void *ptr);
- unsigned long long (*read_long)(struct kbuffer *kbuf, void *ptr);
- int (*next_event)(struct kbuffer *kbuf);
-};
-
-static void *zmalloc(size_t size)
-{
- return calloc(1, size);
-}
-
-static int host_is_bigendian(void)
-{
- unsigned char str[] = { 0x1, 0x2, 0x3, 0x4 };
- unsigned int *ptr;
-
- ptr = (unsigned int *)str;
- return *ptr == 0x01020304;
-}
-
-static int do_swap(struct kbuffer *kbuf)
-{
- return ((kbuf->flags & KBUFFER_FL_HOST_BIG_ENDIAN) + kbuf->flags) &
- ENDIAN_MASK;
-}
-
-static unsigned long long __read_8(void *ptr)
-{
- unsigned long long data = *(unsigned long long *)ptr;
-
- return data;
-}
-
-static unsigned long long __read_8_sw(void *ptr)
-{
- unsigned long long data = *(unsigned long long *)ptr;
- unsigned long long swap;
-
- swap = ((data & 0xffULL) << 56) |
- ((data & (0xffULL << 8)) << 40) |
- ((data & (0xffULL << 16)) << 24) |
- ((data & (0xffULL << 24)) << 8) |
- ((data & (0xffULL << 32)) >> 8) |
- ((data & (0xffULL << 40)) >> 24) |
- ((data & (0xffULL << 48)) >> 40) |
- ((data & (0xffULL << 56)) >> 56);
-
- return swap;
-}
-
-static unsigned int __read_4(void *ptr)
-{
- unsigned int data = *(unsigned int *)ptr;
-
- return data;
-}
-
-static unsigned int __read_4_sw(void *ptr)
-{
- unsigned int data = *(unsigned int *)ptr;
- unsigned int swap;
-
- swap = ((data & 0xffULL) << 24) |
- ((data & (0xffULL << 8)) << 8) |
- ((data & (0xffULL << 16)) >> 8) |
- ((data & (0xffULL << 24)) >> 24);
-
- return swap;
-}
-
-static unsigned long long read_8(struct kbuffer *kbuf, void *ptr)
-{
- return kbuf->read_8(ptr);
-}
-
-static unsigned int read_4(struct kbuffer *kbuf, void *ptr)
-{
- return kbuf->read_4(ptr);
-}
-
-static unsigned long long __read_long_8(struct kbuffer *kbuf, void *ptr)
-{
- return kbuf->read_8(ptr);
-}
-
-static unsigned long long __read_long_4(struct kbuffer *kbuf, void *ptr)
-{
- return kbuf->read_4(ptr);
-}
-
-static unsigned long long read_long(struct kbuffer *kbuf, void *ptr)
-{
- return kbuf->read_long(kbuf, ptr);
-}
-
-static int calc_index(struct kbuffer *kbuf, void *ptr)
-{
- return (unsigned long)ptr - (unsigned long)kbuf->data;
-}
-
-static int __next_event(struct kbuffer *kbuf);
-
-/**
- * kbuffer_alloc - allocat a new kbuffer
- * @size; enum to denote size of word
- * @endian: enum to denote endianness
- *
- * Allocates and returns a new kbuffer.
- */
-struct kbuffer *
-kbuffer_alloc(enum kbuffer_long_size size, enum kbuffer_endian endian)
-{
- struct kbuffer *kbuf;
- int flags = 0;
-
- switch (size) {
- case KBUFFER_LSIZE_4:
- break;
- case KBUFFER_LSIZE_8:
- flags |= KBUFFER_FL_LONG_8;
- break;
- default:
- return NULL;
- }
-
- switch (endian) {
- case KBUFFER_ENDIAN_LITTLE:
- break;
- case KBUFFER_ENDIAN_BIG:
- flags |= KBUFFER_FL_BIG_ENDIAN;
- break;
- default:
- return NULL;
- }
-
- kbuf = zmalloc(sizeof(*kbuf));
- if (!kbuf)
- return NULL;
-
- kbuf->flags = flags;
-
- if (host_is_bigendian())
- kbuf->flags |= KBUFFER_FL_HOST_BIG_ENDIAN;
-
- if (do_swap(kbuf)) {
- kbuf->read_8 = __read_8_sw;
- kbuf->read_4 = __read_4_sw;
- } else {
- kbuf->read_8 = __read_8;
- kbuf->read_4 = __read_4;
- }
-
- if (kbuf->flags & KBUFFER_FL_LONG_8)
- kbuf->read_long = __read_long_8;
- else
- kbuf->read_long = __read_long_4;
-
- /* May be changed by kbuffer_set_old_format() */
- kbuf->next_event = __next_event;
-
- return kbuf;
-}
-
-/** kbuffer_free - free an allocated kbuffer
- * @kbuf: The kbuffer to free
- *
- * Can take NULL as a parameter.
- */
-void kbuffer_free(struct kbuffer *kbuf)
-{
- free(kbuf);
-}
-
-static unsigned int type4host(struct kbuffer *kbuf,
- unsigned int type_len_ts)
-{
- if (kbuf->flags & KBUFFER_FL_BIG_ENDIAN)
- return (type_len_ts >> 29) & 3;
- else
- return type_len_ts & 3;
-}
-
-static unsigned int len4host(struct kbuffer *kbuf,
- unsigned int type_len_ts)
-{
- if (kbuf->flags & KBUFFER_FL_BIG_ENDIAN)
- return (type_len_ts >> 27) & 7;
- else
- return (type_len_ts >> 2) & 7;
-}
-
-static unsigned int type_len4host(struct kbuffer *kbuf,
- unsigned int type_len_ts)
-{
- if (kbuf->flags & KBUFFER_FL_BIG_ENDIAN)
- return (type_len_ts >> 27) & ((1 << 5) - 1);
- else
- return type_len_ts & ((1 << 5) - 1);
-}
-
-static unsigned int ts4host(struct kbuffer *kbuf,
- unsigned int type_len_ts)
-{
- if (kbuf->flags & KBUFFER_FL_BIG_ENDIAN)
- return type_len_ts & ((1 << 27) - 1);
- else
- return type_len_ts >> 5;
-}
-
-/*
- * Linux 2.6.30 and earlier (not much ealier) had a different
- * ring buffer format. It should be obsolete, but we handle it anyway.
- */
-enum old_ring_buffer_type {
- OLD_RINGBUF_TYPE_PADDING,
- OLD_RINGBUF_TYPE_TIME_EXTEND,
- OLD_RINGBUF_TYPE_TIME_STAMP,
- OLD_RINGBUF_TYPE_DATA,
-};
-
-static unsigned int old_update_pointers(struct kbuffer *kbuf)
-{
- unsigned long long extend;
- unsigned int type_len_ts;
- unsigned int type;
- unsigned int len;
- unsigned int delta;
- unsigned int length;
- void *ptr = kbuf->data + kbuf->curr;
-
- type_len_ts = read_4(kbuf, ptr);
- ptr += 4;
-
- type = type4host(kbuf, type_len_ts);
- len = len4host(kbuf, type_len_ts);
- delta = ts4host(kbuf, type_len_ts);
-
- switch (type) {
- case OLD_RINGBUF_TYPE_PADDING:
- kbuf->next = kbuf->size;
- return 0;
-
- case OLD_RINGBUF_TYPE_TIME_EXTEND:
- extend = read_4(kbuf, ptr);
- extend <<= TS_SHIFT;
- extend += delta;
- delta = extend;
- ptr += 4;
- length = 0;
- break;
-
- case OLD_RINGBUF_TYPE_TIME_STAMP:
- /* should never happen! */
- kbuf->curr = kbuf->size;
- kbuf->next = kbuf->size;
- kbuf->index = kbuf->size;
- return -1;
- default:
- if (len)
- length = len * 4;
- else {
- length = read_4(kbuf, ptr);
- length -= 4;
- ptr += 4;
- }
- break;
- }
-
- kbuf->timestamp += delta;
- kbuf->index = calc_index(kbuf, ptr);
- kbuf->next = kbuf->index + length;
-
- return type;
-}
-
-static int __old_next_event(struct kbuffer *kbuf)
-{
- int type;
-
- do {
- kbuf->curr = kbuf->next;
- if (kbuf->next >= kbuf->size)
- return -1;
- type = old_update_pointers(kbuf);
- } while (type == OLD_RINGBUF_TYPE_TIME_EXTEND || type == OLD_RINGBUF_TYPE_PADDING);
-
- return 0;
-}
-
-static unsigned int
-translate_data(struct kbuffer *kbuf, void *data, void **rptr,
- unsigned long long *delta, int *length)
-{
- unsigned long long extend;
- unsigned int type_len_ts;
- unsigned int type_len;
-
- type_len_ts = read_4(kbuf, data);
- data += 4;
-
- type_len = type_len4host(kbuf, type_len_ts);
- *delta = ts4host(kbuf, type_len_ts);
-
- switch (type_len) {
- case KBUFFER_TYPE_PADDING:
- *length = read_4(kbuf, data);
- break;
-
- case KBUFFER_TYPE_TIME_EXTEND:
- case KBUFFER_TYPE_TIME_STAMP:
- extend = read_4(kbuf, data);
- data += 4;
- extend <<= TS_SHIFT;
- extend += *delta;
- *delta = extend;
- *length = 0;
- break;
-
- case 0:
- *length = read_4(kbuf, data) - 4;
- *length = (*length + 3) & ~3;
- data += 4;
- break;
- default:
- *length = type_len * 4;
- break;
- }
-
- *rptr = data;
-
- return type_len;
-}
-
-static unsigned int update_pointers(struct kbuffer *kbuf)
-{
- unsigned long long delta;
- unsigned int type_len;
- int length;
- void *ptr = kbuf->data + kbuf->curr;
-
- type_len = translate_data(kbuf, ptr, &ptr, &delta, &length);
-
- if (type_len == KBUFFER_TYPE_TIME_STAMP)
- kbuf->timestamp = delta;
- else
- kbuf->timestamp += delta;
-
- kbuf->index = calc_index(kbuf, ptr);
- kbuf->next = kbuf->index + length;
-
- return type_len;
-}
-
-/**
- * kbuffer_translate_data - read raw data to get a record
- * @swap: Set to 1 if bytes in words need to be swapped when read
- * @data: The raw data to read
- * @size: Address to store the size of the event data.
- *
- * Returns a pointer to the event data. To determine the entire
- * record size (record metadata + data) just add the difference between
- * @data and the returned value to @size.
- */
-void *kbuffer_translate_data(int swap, void *data, unsigned int *size)
-{
- unsigned long long delta;
- struct kbuffer kbuf;
- int type_len;
- int length;
- void *ptr;
-
- if (swap) {
- kbuf.read_8 = __read_8_sw;
- kbuf.read_4 = __read_4_sw;
- kbuf.flags = host_is_bigendian() ? 0 : KBUFFER_FL_BIG_ENDIAN;
- } else {
- kbuf.read_8 = __read_8;
- kbuf.read_4 = __read_4;
- kbuf.flags = host_is_bigendian() ? KBUFFER_FL_BIG_ENDIAN: 0;
- }
-
- type_len = translate_data(&kbuf, data, &ptr, &delta, &length);
- switch (type_len) {
- case KBUFFER_TYPE_PADDING:
- case KBUFFER_TYPE_TIME_EXTEND:
- case KBUFFER_TYPE_TIME_STAMP:
- return NULL;
- }
-
- *size = length;
-
- return ptr;
-}
-
-static int __next_event(struct kbuffer *kbuf)
-{
- int type;
-
- do {
- kbuf->curr = kbuf->next;
- if (kbuf->next >= kbuf->size)
- return -1;
- type = update_pointers(kbuf);
- } while (type == KBUFFER_TYPE_TIME_EXTEND ||
- type == KBUFFER_TYPE_TIME_STAMP ||
- type == KBUFFER_TYPE_PADDING);
-
- return 0;
-}
-
-static int next_event(struct kbuffer *kbuf)
-{
- return kbuf->next_event(kbuf);
-}
-
-/**
- * kbuffer_next_event - increment the current pointer
- * @kbuf: The kbuffer to read
- * @ts: Address to store the next record's timestamp (may be NULL to ignore)
- *
- * Increments the pointers into the subbuffer of the kbuffer to point to the
- * next event so that the next kbuffer_read_event() will return a
- * new event.
- *
- * Returns the data of the next event if a new event exists on the subbuffer,
- * NULL otherwise.
- */
-void *kbuffer_next_event(struct kbuffer *kbuf, unsigned long long *ts)
-{
- int ret;
-
- if (!kbuf || !kbuf->subbuffer)
- return NULL;
-
- ret = next_event(kbuf);
- if (ret < 0)
- return NULL;
-
- if (ts)
- *ts = kbuf->timestamp;
-
- return kbuf->data + kbuf->index;
-}
-
-/**
- * kbuffer_load_subbuffer - load a new subbuffer into the kbuffer
- * @kbuf: The kbuffer to load
- * @subbuffer: The subbuffer to load into @kbuf.
- *
- * Load a new subbuffer (page) into @kbuf. This will reset all
- * the pointers and update the @kbuf timestamp. The next read will
- * return the first event on @subbuffer.
- *
- * Returns 0 on succes, -1 otherwise.
- */
-int kbuffer_load_subbuffer(struct kbuffer *kbuf, void *subbuffer)
-{
- unsigned long long flags;
- void *ptr = subbuffer;
-
- if (!kbuf || !subbuffer)
- return -1;
-
- kbuf->subbuffer = subbuffer;
-
- kbuf->timestamp = read_8(kbuf, ptr);
- ptr += 8;
-
- kbuf->curr = 0;
-
- if (kbuf->flags & KBUFFER_FL_LONG_8)
- kbuf->start = 16;
- else
- kbuf->start = 12;
-
- kbuf->data = subbuffer + kbuf->start;
-
- flags = read_long(kbuf, ptr);
- kbuf->size = (unsigned int)flags & COMMIT_MASK;
-
- if (flags & MISSING_EVENTS) {
- if (flags & MISSING_STORED) {
- ptr = kbuf->data + kbuf->size;
- kbuf->lost_events = read_long(kbuf, ptr);
- } else
- kbuf->lost_events = -1;
- } else
- kbuf->lost_events = 0;
-
- kbuf->index = 0;
- kbuf->next = 0;
-
- next_event(kbuf);
-
- return 0;
-}
-
-/**
- * kbuffer_subbuf_timestamp - read the timestamp from a sub buffer
- * @kbuf: The kbuffer to load
- * @subbuf: The subbuffer to read from.
- *
- * Return the timestamp from a subbuffer.
- */
-unsigned long long kbuffer_subbuf_timestamp(struct kbuffer *kbuf, void *subbuf)
-{
- return kbuf->read_8(subbuf);
-}
-
-/**
- * kbuffer_ptr_delta - read the delta field from a record
- * @kbuf: The kbuffer to load
- * @ptr: The record in the buffe.
- *
- * Return the timestamp delta from a record
- */
-unsigned int kbuffer_ptr_delta(struct kbuffer *kbuf, void *ptr)
-{
- unsigned int type_len_ts;
-
- type_len_ts = read_4(kbuf, ptr);
- return ts4host(kbuf, type_len_ts);
-}
-
-
-/**
- * kbuffer_read_event - read the next event in the kbuffer subbuffer
- * @kbuf: The kbuffer to read from
- * @ts: The address to store the timestamp of the event (may be NULL to ignore)
- *
- * Returns a pointer to the data part of the current event.
- * NULL if no event is left on the subbuffer.
- */
-void *kbuffer_read_event(struct kbuffer *kbuf, unsigned long long *ts)
-{
- if (!kbuf || !kbuf->subbuffer)
- return NULL;
-
- if (kbuf->curr >= kbuf->size)
- return NULL;
-
- if (ts)
- *ts = kbuf->timestamp;
- return kbuf->data + kbuf->index;
-}
-
-/**
- * kbuffer_timestamp - Return the timestamp of the current event
- * @kbuf: The kbuffer to read from
- *
- * Returns the timestamp of the current (next) event.
- */
-unsigned long long kbuffer_timestamp(struct kbuffer *kbuf)
-{
- return kbuf->timestamp;
-}
-
-/**
- * kbuffer_read_at_offset - read the event that is at offset
- * @kbuf: The kbuffer to read from
- * @offset: The offset into the subbuffer
- * @ts: The address to store the timestamp of the event (may be NULL to ignore)
- *
- * The @offset must be an index from the @kbuf subbuffer beginning.
- * If @offset is bigger than the stored subbuffer, NULL will be returned.
- *
- * Returns the data of the record that is at @offset. Note, @offset does
- * not need to be the start of the record, the offset just needs to be
- * in the record (or beginning of it).
- *
- * Note, the kbuf timestamp and pointers are updated to the
- * returned record. That is, kbuffer_read_event() will return the same
- * data and timestamp, and kbuffer_next_event() will increment from
- * this record.
- */
-void *kbuffer_read_at_offset(struct kbuffer *kbuf, int offset,
- unsigned long long *ts)
-{
- void *data;
-
- if (offset < kbuf->start)
- offset = 0;
- else
- offset -= kbuf->start;
-
- /* Reset the buffer */
- kbuffer_load_subbuffer(kbuf, kbuf->subbuffer);
- data = kbuffer_read_event(kbuf, ts);
-
- while (kbuf->curr < offset) {
- data = kbuffer_next_event(kbuf, ts);
- if (!data)
- break;
- }
-
- return data;
-}
-
-/**
- * kbuffer_subbuffer_size - the size of the loaded subbuffer
- * @kbuf: The kbuffer to read from
- *
- * Returns the size of the subbuffer. Note, this size is
- * where the last event resides. The stored subbuffer may actually be
- * bigger due to padding and such.
- */
-int kbuffer_subbuffer_size(struct kbuffer *kbuf)
-{
- return kbuf->size;
-}
-
-/**
- * kbuffer_curr_index - Return the index of the record
- * @kbuf: The kbuffer to read from
- *
- * Returns the index from the start of the data part of
- * the subbuffer to the current location. Note this is not
- * from the start of the subbuffer. An index of zero will
- * point to the first record. Use kbuffer_curr_offset() for
- * the actually offset (that can be used by kbuffer_read_at_offset())
- */
-int kbuffer_curr_index(struct kbuffer *kbuf)
-{
- return kbuf->curr;
-}
-
-/**
- * kbuffer_curr_offset - Return the offset of the record
- * @kbuf: The kbuffer to read from
- *
- * Returns the offset from the start of the subbuffer to the
- * current location.
- */
-int kbuffer_curr_offset(struct kbuffer *kbuf)
-{
- return kbuf->curr + kbuf->start;
-}
-
-/**
- * kbuffer_event_size - return the size of the event data
- * @kbuf: The kbuffer to read
- *
- * Returns the size of the event data (the payload not counting
- * the meta data of the record) of the current event.
- */
-int kbuffer_event_size(struct kbuffer *kbuf)
-{
- return kbuf->next - kbuf->index;
-}
-
-/**
- * kbuffer_curr_size - return the size of the entire record
- * @kbuf: The kbuffer to read
- *
- * Returns the size of the entire record (meta data and payload)
- * of the current event.
- */
-int kbuffer_curr_size(struct kbuffer *kbuf)
-{
- return kbuf->next - kbuf->curr;
-}
-
-/**
- * kbuffer_missed_events - return the # of missed events from last event.
- * @kbuf: The kbuffer to read from
- *
- * Returns the # of missed events (if recorded) before the current
- * event. Note, only events on the beginning of a subbuffer can
- * have missed events, all other events within the buffer will be
- * zero.
- */
-int kbuffer_missed_events(struct kbuffer *kbuf)
-{
- /* Only the first event can have missed events */
- if (kbuf->curr)
- return 0;
-
- return kbuf->lost_events;
-}
-
-/**
- * kbuffer_set_old_forma - set the kbuffer to use the old format parsing
- * @kbuf: The kbuffer to set
- *
- * This is obsolete (or should be). The first kernels to use the
- * new ring buffer had a slightly different ring buffer format
- * (2.6.30 and earlier). It is still somewhat supported by kbuffer,
- * but should not be counted on in the future.
- */
-void kbuffer_set_old_format(struct kbuffer *kbuf)
-{
- kbuf->flags |= KBUFFER_FL_OLD_FORMAT;
-
- kbuf->next_event = __old_next_event;
-}
-
-/**
- * kbuffer_start_of_data - return offset of where data starts on subbuffer
- * @kbuf: The kbuffer
- *
- * Returns the location on the subbuffer where the data starts.
- */
-int kbuffer_start_of_data(struct kbuffer *kbuf)
-{
- return kbuf->start;
-}
-
-/**
- * kbuffer_raw_get - get raw buffer info
- * @kbuf: The kbuffer
- * @subbuf: Start of mapped subbuffer
- * @info: Info descriptor to fill in
- *
- * For debugging. This can return internals of the ring buffer.
- * Expects to have info->next set to what it will read.
- * The type, length and timestamp delta will be filled in, and
- * @info->next will be updated to the next element.
- * The @subbuf is used to know if the info is passed the end of
- * data and NULL will be returned if it is.
- */
-struct kbuffer_raw_info *
-kbuffer_raw_get(struct kbuffer *kbuf, void *subbuf, struct kbuffer_raw_info *info)
-{
- unsigned long long flags;
- unsigned long long delta;
- unsigned int type_len;
- unsigned int size;
- int start;
- int length;
- void *ptr = info->next;
-
- if (!kbuf || !subbuf)
- return NULL;
-
- if (kbuf->flags & KBUFFER_FL_LONG_8)
- start = 16;
- else
- start = 12;
-
- flags = read_long(kbuf, subbuf + 8);
- size = (unsigned int)flags & COMMIT_MASK;
-
- if (ptr < subbuf || ptr >= subbuf + start + size)
- return NULL;
-
- type_len = translate_data(kbuf, ptr, &ptr, &delta, &length);
-
- info->next = ptr + length;
-
- info->type = type_len;
- info->delta = delta;
- info->length = length;
-
- return info;
-}
diff --git a/tools/lib/traceevent/kbuffer.h b/tools/lib/traceevent/kbuffer.h
deleted file mode 100644
index a2b522093cfd..000000000000
--- a/tools/lib/traceevent/kbuffer.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/* SPDX-License-Identifier: LGPL-2.1 */
-/*
- * Copyright (C) 2012 Red Hat Inc, Steven Rostedt <[email protected]>
- *
- */
-#ifndef _KBUFFER_H
-#define _KBUFFER_H
-
-#ifndef TS_SHIFT
-#define TS_SHIFT 27
-#endif
-
-enum kbuffer_endian {
- KBUFFER_ENDIAN_BIG,
- KBUFFER_ENDIAN_LITTLE,
-};
-
-enum kbuffer_long_size {
- KBUFFER_LSIZE_4,
- KBUFFER_LSIZE_8,
-};
-
-enum {
- KBUFFER_TYPE_PADDING = 29,
- KBUFFER_TYPE_TIME_EXTEND = 30,
- KBUFFER_TYPE_TIME_STAMP = 31,
-};
-
-struct kbuffer;
-
-struct kbuffer *kbuffer_alloc(enum kbuffer_long_size size, enum kbuffer_endian endian);
-void kbuffer_free(struct kbuffer *kbuf);
-int kbuffer_load_subbuffer(struct kbuffer *kbuf, void *subbuffer);
-void *kbuffer_read_event(struct kbuffer *kbuf, unsigned long long *ts);
-void *kbuffer_next_event(struct kbuffer *kbuf, unsigned long long *ts);
-unsigned long long kbuffer_timestamp(struct kbuffer *kbuf);
-unsigned long long kbuffer_subbuf_timestamp(struct kbuffer *kbuf, void *subbuf);
-unsigned int kbuffer_ptr_delta(struct kbuffer *kbuf, void *ptr);
-
-void *kbuffer_translate_data(int swap, void *data, unsigned int *size);
-
-void *kbuffer_read_at_offset(struct kbuffer *kbuf, int offset, unsigned long long *ts);
-
-int kbuffer_curr_index(struct kbuffer *kbuf);
-
-int kbuffer_curr_offset(struct kbuffer *kbuf);
-int kbuffer_curr_size(struct kbuffer *kbuf);
-int kbuffer_event_size(struct kbuffer *kbuf);
-int kbuffer_missed_events(struct kbuffer *kbuf);
-int kbuffer_subbuffer_size(struct kbuffer *kbuf);
-
-void kbuffer_set_old_format(struct kbuffer *kbuf);
-int kbuffer_start_of_data(struct kbuffer *kbuf);
-
-/* Debugging */
-
-struct kbuffer_raw_info {
- int type;
- int length;
- unsigned long long delta;
- void *next;
-};
-
-/* Read raw data */
-struct kbuffer_raw_info *kbuffer_raw_get(struct kbuffer *kbuf, void *subbuf,
- struct kbuffer_raw_info *info);
-
-#endif /* _K_BUFFER_H */
diff --git a/tools/lib/traceevent/libtraceevent.pc.template b/tools/lib/traceevent/libtraceevent.pc.template
deleted file mode 100644
index 86384fcd57f1..000000000000
--- a/tools/lib/traceevent/libtraceevent.pc.template
+++ /dev/null
@@ -1,10 +0,0 @@
-prefix=INSTALL_PREFIX
-libdir=LIB_DIR
-includedir=HEADER_DIR
-
-Name: libtraceevent
-URL: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
-Description: Linux kernel trace event library
-Version: LIB_VERSION
-Cflags: -I${includedir}
-Libs: -L${libdir} -ltraceevent
diff --git a/tools/lib/traceevent/parse-filter.c b/tools/lib/traceevent/parse-filter.c
deleted file mode 100644
index 5df177070d53..000000000000
--- a/tools/lib/traceevent/parse-filter.c
+++ /dev/null
@@ -1,2281 +0,0 @@
-// SPDX-License-Identifier: LGPL-2.1
-/*
- * Copyright (C) 2010 Red Hat Inc, Steven Rostedt <[email protected]>
- *
- */
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdarg.h>
-#include <errno.h>
-#include <sys/types.h>
-
-#include "event-parse.h"
-#include "event-parse-local.h"
-#include "event-utils.h"
-
-#define COMM "COMM"
-#define CPU "CPU"
-
-static struct tep_format_field comm = {
- .name = "COMM",
-};
-
-static struct tep_format_field cpu = {
- .name = "CPU",
-};
-
-struct event_list {
- struct event_list *next;
- struct tep_event *event;
-};
-
-static void show_error(char *error_buf, const char *fmt, ...)
-{
- unsigned long long index;
- const char *input;
- va_list ap;
- int len;
- int i;
-
- input = get_input_buf();
- index = get_input_buf_ptr();
- len = input ? strlen(input) : 0;
-
- if (len) {
- strcpy(error_buf, input);
- error_buf[len] = '\n';
- for (i = 1; i < len && i < index; i++)
- error_buf[len+i] = ' ';
- error_buf[len + i] = '^';
- error_buf[len + i + 1] = '\n';
- len += i+2;
- }
-
- va_start(ap, fmt);
- vsnprintf(error_buf + len, TEP_FILTER_ERROR_BUFSZ - len, fmt, ap);
- va_end(ap);
-}
-
-static enum tep_event_type filter_read_token(char **tok)
-{
- enum tep_event_type type;
- char *token = NULL;
-
- do {
- free_token(token);
- type = read_token(&token);
- } while (type == TEP_EVENT_NEWLINE || type == TEP_EVENT_SPACE);
-
- /* If token is = or ! check to see if the next char is ~ */
- if (token &&
- (strcmp(token, "=") == 0 || strcmp(token, "!") == 0) &&
- peek_char() == '~') {
- /* append it */
- *tok = malloc(3);
- if (*tok == NULL) {
- free_token(token);
- return TEP_EVENT_ERROR;
- }
- sprintf(*tok, "%c%c", *token, '~');
- free_token(token);
- /* Now remove the '~' from the buffer */
- read_token(&token);
- free_token(token);
- } else
- *tok = token;
-
- return type;
-}
-
-static int filter_cmp(const void *a, const void *b)
-{
- const struct tep_filter_type *ea = a;
- const struct tep_filter_type *eb = b;
-
- if (ea->event_id < eb->event_id)
- return -1;
-
- if (ea->event_id > eb->event_id)
- return 1;
-
- return 0;
-}
-
-static struct tep_filter_type *
-find_filter_type(struct tep_event_filter *filter, int id)
-{
- struct tep_filter_type *filter_type;
- struct tep_filter_type key;
-
- key.event_id = id;
-
- filter_type = bsearch(&key, filter->event_filters,
- filter->filters,
- sizeof(*filter->event_filters),
- filter_cmp);
-
- return filter_type;
-}
-
-static struct tep_filter_type *
-add_filter_type(struct tep_event_filter *filter, int id)
-{
- struct tep_filter_type *filter_type;
- int i;
-
- filter_type = find_filter_type(filter, id);
- if (filter_type)
- return filter_type;
-
- filter_type = realloc(filter->event_filters,
- sizeof(*filter->event_filters) *
- (filter->filters + 1));
- if (!filter_type)
- return NULL;
-
- filter->event_filters = filter_type;
-
- for (i = 0; i < filter->filters; i++) {
- if (filter->event_filters[i].event_id > id)
- break;
- }
-
- if (i < filter->filters)
- memmove(&filter->event_filters[i+1],
- &filter->event_filters[i],
- sizeof(*filter->event_filters) *
- (filter->filters - i));
-
- filter_type = &filter->event_filters[i];
- filter_type->event_id = id;
- filter_type->event = tep_find_event(filter->tep, id);
- filter_type->filter = NULL;
-
- filter->filters++;
-
- return filter_type;
-}
-
-/**
- * tep_filter_alloc - create a new event filter
- * @tep: The tep that this filter is associated with
- */
-struct tep_event_filter *tep_filter_alloc(struct tep_handle *tep)
-{
- struct tep_event_filter *filter;
-
- filter = malloc(sizeof(*filter));
- if (filter == NULL)
- return NULL;
-
- memset(filter, 0, sizeof(*filter));
- filter->tep = tep;
- tep_ref(tep);
-
- return filter;
-}
-
-static struct tep_filter_arg *allocate_arg(void)
-{
- return calloc(1, sizeof(struct tep_filter_arg));
-}
-
-static void free_arg(struct tep_filter_arg *arg)
-{
- if (!arg)
- return;
-
- switch (arg->type) {
- case TEP_FILTER_ARG_NONE:
- case TEP_FILTER_ARG_BOOLEAN:
- break;
-
- case TEP_FILTER_ARG_NUM:
- free_arg(arg->num.left);
- free_arg(arg->num.right);
- break;
-
- case TEP_FILTER_ARG_EXP:
- free_arg(arg->exp.left);
- free_arg(arg->exp.right);
- break;
-
- case TEP_FILTER_ARG_STR:
- free(arg->str.val);
- regfree(&arg->str.reg);
- free(arg->str.buffer);
- break;
-
- case TEP_FILTER_ARG_VALUE:
- if (arg->value.type == TEP_FILTER_STRING ||
- arg->value.type == TEP_FILTER_CHAR)
- free(arg->value.str);
- break;
-
- case TEP_FILTER_ARG_OP:
- free_arg(arg->op.left);
- free_arg(arg->op.right);
- default:
- break;
- }
-
- free(arg);
-}
-
-static int add_event(struct event_list **events,
- struct tep_event *event)
-{
- struct event_list *list;
-
- list = malloc(sizeof(*list));
- if (list == NULL)
- return -1;
-
- list->next = *events;
- *events = list;
- list->event = event;
- return 0;
-}
-
-static int event_match(struct tep_event *event,
- regex_t *sreg, regex_t *ereg)
-{
- if (sreg) {
- return !regexec(sreg, event->system, 0, NULL, 0) &&
- !regexec(ereg, event->name, 0, NULL, 0);
- }
-
- return !regexec(ereg, event->system, 0, NULL, 0) ||
- !regexec(ereg, event->name, 0, NULL, 0);
-}
-
-static enum tep_errno
-find_event(struct tep_handle *tep, struct event_list **events,
- char *sys_name, char *event_name)
-{
- struct tep_event *event;
- regex_t ereg;
- regex_t sreg;
- int match = 0;
- int fail = 0;
- char *reg;
- int ret;
- int i;
-
- if (!event_name) {
- /* if no name is given, then swap sys and name */
- event_name = sys_name;
- sys_name = NULL;
- }
-
- ret = asprintf(&reg, "^%s$", event_name);
- if (ret < 0)
- return TEP_ERRNO__MEM_ALLOC_FAILED;
-
- ret = regcomp(&ereg, reg, REG_ICASE|REG_NOSUB);
- free(reg);
-
- if (ret)
- return TEP_ERRNO__INVALID_EVENT_NAME;
-
- if (sys_name) {
- ret = asprintf(&reg, "^%s$", sys_name);
- if (ret < 0) {
- regfree(&ereg);
- return TEP_ERRNO__MEM_ALLOC_FAILED;
- }
-
- ret = regcomp(&sreg, reg, REG_ICASE|REG_NOSUB);
- free(reg);
- if (ret) {
- regfree(&ereg);
- return TEP_ERRNO__INVALID_EVENT_NAME;
- }
- }
-
- for (i = 0; i < tep->nr_events; i++) {
- event = tep->events[i];
- if (event_match(event, sys_name ? &sreg : NULL, &ereg)) {
- match = 1;
- if (add_event(events, event) < 0) {
- fail = 1;
- break;
- }
- }
- }
-
- regfree(&ereg);
- if (sys_name)
- regfree(&sreg);
-
- if (!match)
- return TEP_ERRNO__EVENT_NOT_FOUND;
- if (fail)
- return TEP_ERRNO__MEM_ALLOC_FAILED;
-
- return 0;
-}
-
-static void free_events(struct event_list *events)
-{
- struct event_list *event;
-
- while (events) {
- event = events;
- events = events->next;
- free(event);
- }
-}
-
-static enum tep_errno
-create_arg_item(struct tep_event *event, const char *token,
- enum tep_event_type type, struct tep_filter_arg **parg, char *error_str)
-{
- struct tep_format_field *field;
- struct tep_filter_arg *arg;
-
- arg = allocate_arg();
- if (arg == NULL) {
- show_error(error_str, "failed to allocate filter arg");
- return TEP_ERRNO__MEM_ALLOC_FAILED;
- }
-
- switch (type) {
-
- case TEP_EVENT_SQUOTE:
- case TEP_EVENT_DQUOTE:
- arg->type = TEP_FILTER_ARG_VALUE;
- arg->value.type =
- type == TEP_EVENT_DQUOTE ? TEP_FILTER_STRING : TEP_FILTER_CHAR;
- arg->value.str = strdup(token);
- if (!arg->value.str) {
- free_arg(arg);
- show_error(error_str, "failed to allocate string filter arg");
- return TEP_ERRNO__MEM_ALLOC_FAILED;
- }
- break;
- case TEP_EVENT_ITEM:
- /* if it is a number, then convert it */
- if (isdigit(token[0])) {
- arg->type = TEP_FILTER_ARG_VALUE;
- arg->value.type = TEP_FILTER_NUMBER;
- arg->value.val = strtoull(token, NULL, 0);
- break;
- }
- /* Consider this a field */
- field = tep_find_any_field(event, token);
- if (!field) {
- /* If token is 'COMM' or 'CPU' then it is special */
- if (strcmp(token, COMM) == 0) {
- field = &comm;
- } else if (strcmp(token, CPU) == 0) {
- field = &cpu;
- } else {
- /* not a field, Make it false */
- arg->type = TEP_FILTER_ARG_BOOLEAN;
- arg->boolean.value = TEP_FILTER_FALSE;
- break;
- }
- }
- arg->type = TEP_FILTER_ARG_FIELD;
- arg->field.field = field;
- break;
- default:
- free_arg(arg);
- show_error(error_str, "expected a value but found %s", token);
- return TEP_ERRNO__UNEXPECTED_TYPE;
- }
- *parg = arg;
- return 0;
-}
-
-static struct tep_filter_arg *
-create_arg_op(enum tep_filter_op_type btype)
-{
- struct tep_filter_arg *arg;
-
- arg = allocate_arg();
- if (!arg)
- return NULL;
-
- arg->type = TEP_FILTER_ARG_OP;
- arg->op.type = btype;
-
- return arg;
-}
-
-static struct tep_filter_arg *
-create_arg_exp(enum tep_filter_exp_type etype)
-{
- struct tep_filter_arg *arg;
-
- arg = allocate_arg();
- if (!arg)
- return NULL;
-
- arg->type = TEP_FILTER_ARG_EXP;
- arg->exp.type = etype;
-
- return arg;
-}
-
-static struct tep_filter_arg *
-create_arg_cmp(enum tep_filter_cmp_type ctype)
-{
- struct tep_filter_arg *arg;
-
- arg = allocate_arg();
- if (!arg)
- return NULL;
-
- /* Use NUM and change if necessary */
- arg->type = TEP_FILTER_ARG_NUM;
- arg->num.type = ctype;
-
- return arg;
-}
-
-static enum tep_errno
-add_right(struct tep_filter_arg *op, struct tep_filter_arg *arg, char *error_str)
-{
- struct tep_filter_arg *left;
- char *str;
- int op_type;
- int ret;
-
- switch (op->type) {
- case TEP_FILTER_ARG_EXP:
- if (op->exp.right)
- goto out_fail;
- op->exp.right = arg;
- break;
-
- case TEP_FILTER_ARG_OP:
- if (op->op.right)
- goto out_fail;
- op->op.right = arg;
- break;
-
- case TEP_FILTER_ARG_NUM:
- if (op->op.right)
- goto out_fail;
- /*
- * The arg must be num, str, or field
- */
- switch (arg->type) {
- case TEP_FILTER_ARG_VALUE:
- case TEP_FILTER_ARG_FIELD:
- break;
- default:
- show_error(error_str, "Illegal rvalue");
- return TEP_ERRNO__ILLEGAL_RVALUE;
- }
-
- /*
- * Depending on the type, we may need to
- * convert this to a string or regex.
- */
- switch (arg->value.type) {
- case TEP_FILTER_CHAR:
- /*
- * A char should be converted to number if
- * the string is 1 byte, and the compare
- * is not a REGEX.
- */
- if (strlen(arg->value.str) == 1 &&
- op->num.type != TEP_FILTER_CMP_REGEX &&
- op->num.type != TEP_FILTER_CMP_NOT_REGEX) {
- arg->value.type = TEP_FILTER_NUMBER;
- goto do_int;
- }
- /* fall through */
- case TEP_FILTER_STRING:
-
- /* convert op to a string arg */
- op_type = op->num.type;
- left = op->num.left;
- str = arg->value.str;
-
- /* reset the op for the new field */
- memset(op, 0, sizeof(*op));
-
- /*
- * If left arg was a field not found then
- * NULL the entire op.
- */
- if (left->type == TEP_FILTER_ARG_BOOLEAN) {
- free_arg(left);
- free_arg(arg);
- op->type = TEP_FILTER_ARG_BOOLEAN;
- op->boolean.value = TEP_FILTER_FALSE;
- break;
- }
-
- /* Left arg must be a field */
- if (left->type != TEP_FILTER_ARG_FIELD) {
- show_error(error_str,
- "Illegal lvalue for string comparison");
- return TEP_ERRNO__ILLEGAL_LVALUE;
- }
-
- /* Make sure this is a valid string compare */
- switch (op_type) {
- case TEP_FILTER_CMP_EQ:
- op_type = TEP_FILTER_CMP_MATCH;
- break;
- case TEP_FILTER_CMP_NE:
- op_type = TEP_FILTER_CMP_NOT_MATCH;
- break;
-
- case TEP_FILTER_CMP_REGEX:
- case TEP_FILTER_CMP_NOT_REGEX:
- ret = regcomp(&op->str.reg, str, REG_ICASE|REG_NOSUB);
- if (ret) {
- show_error(error_str,
- "RegEx '%s' did not compute",
- str);
- return TEP_ERRNO__INVALID_REGEX;
- }
- break;
- default:
- show_error(error_str,
- "Illegal comparison for string");
- return TEP_ERRNO__ILLEGAL_STRING_CMP;
- }
-
- op->type = TEP_FILTER_ARG_STR;
- op->str.type = op_type;
- op->str.field = left->field.field;
- op->str.val = strdup(str);
- if (!op->str.val) {
- show_error(error_str, "Failed to allocate string filter");
- return TEP_ERRNO__MEM_ALLOC_FAILED;
- }
- /*
- * Need a buffer to copy data for tests
- */
- op->str.buffer = malloc(op->str.field->size + 1);
- if (!op->str.buffer) {
- show_error(error_str, "Failed to allocate string filter");
- return TEP_ERRNO__MEM_ALLOC_FAILED;
- }
- /* Null terminate this buffer */
- op->str.buffer[op->str.field->size] = 0;
-
- /* We no longer have left or right args */
- free_arg(arg);
- free_arg(left);
-
- break;
-
- case TEP_FILTER_NUMBER:
-
- do_int:
- switch (op->num.type) {
- case TEP_FILTER_CMP_REGEX:
- case TEP_FILTER_CMP_NOT_REGEX:
- show_error(error_str,
- "Op not allowed with integers");
- return TEP_ERRNO__ILLEGAL_INTEGER_CMP;
-
- default:
- break;
- }
-
- /* numeric compare */
- op->num.right = arg;
- break;
- default:
- goto out_fail;
- }
- break;
- default:
- goto out_fail;
- }
-
- return 0;
-
- out_fail:
- show_error(error_str, "Syntax error");
- return TEP_ERRNO__SYNTAX_ERROR;
-}
-
-static struct tep_filter_arg *
-rotate_op_right(struct tep_filter_arg *a, struct tep_filter_arg *b)
-{
- struct tep_filter_arg *arg;
-
- arg = a->op.right;
- a->op.right = b;
- return arg;
-}
-
-static enum tep_errno add_left(struct tep_filter_arg *op, struct tep_filter_arg *arg)
-{
- switch (op->type) {
- case TEP_FILTER_ARG_EXP:
- if (arg->type == TEP_FILTER_ARG_OP)
- arg = rotate_op_right(arg, op);
- op->exp.left = arg;
- break;
-
- case TEP_FILTER_ARG_OP:
- op->op.left = arg;
- break;
- case TEP_FILTER_ARG_NUM:
- if (arg->type == TEP_FILTER_ARG_OP)
- arg = rotate_op_right(arg, op);
-
- /* left arg of compares must be a field */
- if (arg->type != TEP_FILTER_ARG_FIELD &&
- arg->type != TEP_FILTER_ARG_BOOLEAN)
- return TEP_ERRNO__INVALID_ARG_TYPE;
- op->num.left = arg;
- break;
- default:
- return TEP_ERRNO__INVALID_ARG_TYPE;
- }
- return 0;
-}
-
-enum op_type {
- OP_NONE,
- OP_BOOL,
- OP_NOT,
- OP_EXP,
- OP_CMP,
-};
-
-static enum op_type process_op(const char *token,
- enum tep_filter_op_type *btype,
- enum tep_filter_cmp_type *ctype,
- enum tep_filter_exp_type *etype)
-{
- *btype = TEP_FILTER_OP_NOT;
- *etype = TEP_FILTER_EXP_NONE;
- *ctype = TEP_FILTER_CMP_NONE;
-
- if (strcmp(token, "&&") == 0)
- *btype = TEP_FILTER_OP_AND;
- else if (strcmp(token, "||") == 0)
- *btype = TEP_FILTER_OP_OR;
- else if (strcmp(token, "!") == 0)
- return OP_NOT;
-
- if (*btype != TEP_FILTER_OP_NOT)
- return OP_BOOL;
-
- /* Check for value expressions */
- if (strcmp(token, "+") == 0) {
- *etype = TEP_FILTER_EXP_ADD;
- } else if (strcmp(token, "-") == 0) {
- *etype = TEP_FILTER_EXP_SUB;
- } else if (strcmp(token, "*") == 0) {
- *etype = TEP_FILTER_EXP_MUL;
- } else if (strcmp(token, "/") == 0) {
- *etype = TEP_FILTER_EXP_DIV;
- } else if (strcmp(token, "%") == 0) {
- *etype = TEP_FILTER_EXP_MOD;
- } else if (strcmp(token, ">>") == 0) {
- *etype = TEP_FILTER_EXP_RSHIFT;
- } else if (strcmp(token, "<<") == 0) {
- *etype = TEP_FILTER_EXP_LSHIFT;
- } else if (strcmp(token, "&") == 0) {
- *etype = TEP_FILTER_EXP_AND;
- } else if (strcmp(token, "|") == 0) {
- *etype = TEP_FILTER_EXP_OR;
- } else if (strcmp(token, "^") == 0) {
- *etype = TEP_FILTER_EXP_XOR;
- } else if (strcmp(token, "~") == 0)
- *etype = TEP_FILTER_EXP_NOT;
-
- if (*etype != TEP_FILTER_EXP_NONE)
- return OP_EXP;
-
- /* Check for compares */
- if (strcmp(token, "==") == 0)
- *ctype = TEP_FILTER_CMP_EQ;
- else if (strcmp(token, "!=") == 0)
- *ctype = TEP_FILTER_CMP_NE;
- else if (strcmp(token, "<") == 0)
- *ctype = TEP_FILTER_CMP_LT;
- else if (strcmp(token, ">") == 0)
- *ctype = TEP_FILTER_CMP_GT;
- else if (strcmp(token, "<=") == 0)
- *ctype = TEP_FILTER_CMP_LE;
- else if (strcmp(token, ">=") == 0)
- *ctype = TEP_FILTER_CMP_GE;
- else if (strcmp(token, "=~") == 0)
- *ctype = TEP_FILTER_CMP_REGEX;
- else if (strcmp(token, "!~") == 0)
- *ctype = TEP_FILTER_CMP_NOT_REGEX;
- else
- return OP_NONE;
-
- return OP_CMP;
-}
-
-static int check_op_done(struct tep_filter_arg *arg)
-{
- switch (arg->type) {
- case TEP_FILTER_ARG_EXP:
- return arg->exp.right != NULL;
-
- case TEP_FILTER_ARG_OP:
- return arg->op.right != NULL;
-
- case TEP_FILTER_ARG_NUM:
- return arg->num.right != NULL;
-
- case TEP_FILTER_ARG_STR:
- /* A string conversion is always done */
- return 1;
-
- case TEP_FILTER_ARG_BOOLEAN:
- /* field not found, is ok */
- return 1;
-
- default:
- return 0;
- }
-}
-
-enum filter_vals {
- FILTER_VAL_NORM,
- FILTER_VAL_FALSE,
- FILTER_VAL_TRUE,
-};
-
-static enum tep_errno
-reparent_op_arg(struct tep_filter_arg *parent, struct tep_filter_arg *old_child,
- struct tep_filter_arg *arg, char *error_str)
-{
- struct tep_filter_arg *other_child;
- struct tep_filter_arg **ptr;
-
- if (parent->type != TEP_FILTER_ARG_OP &&
- arg->type != TEP_FILTER_ARG_OP) {
- show_error(error_str, "can not reparent other than OP");
- return TEP_ERRNO__REPARENT_NOT_OP;
- }
-
- /* Get the sibling */
- if (old_child->op.right == arg) {
- ptr = &old_child->op.right;
- other_child = old_child->op.left;
- } else if (old_child->op.left == arg) {
- ptr = &old_child->op.left;
- other_child = old_child->op.right;
- } else {
- show_error(error_str, "Error in reparent op, find other child");
- return TEP_ERRNO__REPARENT_FAILED;
- }
-
- /* Detach arg from old_child */
- *ptr = NULL;
-
- /* Check for root */
- if (parent == old_child) {
- free_arg(other_child);
- *parent = *arg;
- /* Free arg without recussion */
- free(arg);
- return 0;
- }
-
- if (parent->op.right == old_child)
- ptr = &parent->op.right;
- else if (parent->op.left == old_child)
- ptr = &parent->op.left;
- else {
- show_error(error_str, "Error in reparent op");
- return TEP_ERRNO__REPARENT_FAILED;
- }
-
- *ptr = arg;
-
- free_arg(old_child);
- return 0;
-}
-
-/* Returns either filter_vals (success) or tep_errno (failfure) */
-static int test_arg(struct tep_filter_arg *parent, struct tep_filter_arg *arg,
- char *error_str)
-{
- int lval, rval;
-
- switch (arg->type) {
-
- /* bad case */
- case TEP_FILTER_ARG_BOOLEAN:
- return FILTER_VAL_FALSE + arg->boolean.value;
-
- /* good cases: */
- case TEP_FILTER_ARG_STR:
- case TEP_FILTER_ARG_VALUE:
- case TEP_FILTER_ARG_FIELD:
- return FILTER_VAL_NORM;
-
- case TEP_FILTER_ARG_EXP:
- lval = test_arg(arg, arg->exp.left, error_str);
- if (lval != FILTER_VAL_NORM)
- return lval;
- rval = test_arg(arg, arg->exp.right, error_str);
- if (rval != FILTER_VAL_NORM)
- return rval;
- return FILTER_VAL_NORM;
-
- case TEP_FILTER_ARG_NUM:
- lval = test_arg(arg, arg->num.left, error_str);
- if (lval != FILTER_VAL_NORM)
- return lval;
- rval = test_arg(arg, arg->num.right, error_str);
- if (rval != FILTER_VAL_NORM)
- return rval;
- return FILTER_VAL_NORM;
-
- case TEP_FILTER_ARG_OP:
- if (arg->op.type != TEP_FILTER_OP_NOT) {
- lval = test_arg(arg, arg->op.left, error_str);
- switch (lval) {
- case FILTER_VAL_NORM:
- break;
- case FILTER_VAL_TRUE:
- if (arg->op.type == TEP_FILTER_OP_OR)
- return FILTER_VAL_TRUE;
- rval = test_arg(arg, arg->op.right, error_str);
- if (rval != FILTER_VAL_NORM)
- return rval;
-
- return reparent_op_arg(parent, arg, arg->op.right,
- error_str);
-
- case FILTER_VAL_FALSE:
- if (arg->op.type == TEP_FILTER_OP_AND)
- return FILTER_VAL_FALSE;
- rval = test_arg(arg, arg->op.right, error_str);
- if (rval != FILTER_VAL_NORM)
- return rval;
-
- return reparent_op_arg(parent, arg, arg->op.right,
- error_str);
-
- default:
- return lval;
- }
- }
-
- rval = test_arg(arg, arg->op.right, error_str);
- switch (rval) {
- case FILTER_VAL_NORM:
- default:
- break;
-
- case FILTER_VAL_TRUE:
- if (arg->op.type == TEP_FILTER_OP_OR)
- return FILTER_VAL_TRUE;
- if (arg->op.type == TEP_FILTER_OP_NOT)
- return FILTER_VAL_FALSE;
-
- return reparent_op_arg(parent, arg, arg->op.left,
- error_str);
-
- case FILTER_VAL_FALSE:
- if (arg->op.type == TEP_FILTER_OP_AND)
- return FILTER_VAL_FALSE;
- if (arg->op.type == TEP_FILTER_OP_NOT)
- return FILTER_VAL_TRUE;
-
- return reparent_op_arg(parent, arg, arg->op.left,
- error_str);
- }
-
- return rval;
- default:
- show_error(error_str, "bad arg in filter tree");
- return TEP_ERRNO__BAD_FILTER_ARG;
- }
- return FILTER_VAL_NORM;
-}
-
-/* Remove any unknown event fields */
-static int collapse_tree(struct tep_filter_arg *arg,
- struct tep_filter_arg **arg_collapsed, char *error_str)
-{
- int ret;
-
- ret = test_arg(arg, arg, error_str);
- switch (ret) {
- case FILTER_VAL_NORM:
- break;
-
- case FILTER_VAL_TRUE:
- case FILTER_VAL_FALSE:
- free_arg(arg);
- arg = allocate_arg();
- if (arg) {
- arg->type = TEP_FILTER_ARG_BOOLEAN;
- arg->boolean.value = ret == FILTER_VAL_TRUE;
- } else {
- show_error(error_str, "Failed to allocate filter arg");
- ret = TEP_ERRNO__MEM_ALLOC_FAILED;
- }
- break;
-
- default:
- /* test_arg() already set the error_str */
- free_arg(arg);
- arg = NULL;
- break;
- }
-
- *arg_collapsed = arg;
- return ret;
-}
-
-static enum tep_errno
-process_filter(struct tep_event *event, struct tep_filter_arg **parg,
- char *error_str, int not)
-{
- enum tep_event_type type;
- char *token = NULL;
- struct tep_filter_arg *current_op = NULL;
- struct tep_filter_arg *current_exp = NULL;
- struct tep_filter_arg *left_item = NULL;
- struct tep_filter_arg *arg = NULL;
- enum op_type op_type;
- enum tep_filter_op_type btype;
- enum tep_filter_exp_type etype;
- enum tep_filter_cmp_type ctype;
- enum tep_errno ret;
-
- *parg = NULL;
-
- do {
- free(token);
- type = filter_read_token(&token);
- switch (type) {
- case TEP_EVENT_SQUOTE:
- case TEP_EVENT_DQUOTE:
- case TEP_EVENT_ITEM:
- ret = create_arg_item(event, token, type, &arg, error_str);
- if (ret < 0)
- goto fail;
- if (!left_item)
- left_item = arg;
- else if (current_exp) {
- ret = add_right(current_exp, arg, error_str);
- if (ret < 0)
- goto fail;
- left_item = NULL;
- /* Not's only one one expression */
- if (not) {
- arg = NULL;
- if (current_op)
- goto fail_syntax;
- free(token);
- *parg = current_exp;
- return 0;
- }
- } else
- goto fail_syntax;
- arg = NULL;
- break;
-
- case TEP_EVENT_DELIM:
- if (*token == ',') {
- show_error(error_str, "Illegal token ','");
- ret = TEP_ERRNO__ILLEGAL_TOKEN;
- goto fail;
- }
-
- if (*token == '(') {
- if (left_item) {
- show_error(error_str,
- "Open paren can not come after item");
- ret = TEP_ERRNO__INVALID_PAREN;
- goto fail;
- }
- if (current_exp) {
- show_error(error_str,
- "Open paren can not come after expression");
- ret = TEP_ERRNO__INVALID_PAREN;
- goto fail;
- }
-
- ret = process_filter(event, &arg, error_str, 0);
- if (ret != TEP_ERRNO__UNBALANCED_PAREN) {
- if (ret == 0) {
- show_error(error_str,
- "Unbalanced number of '('");
- ret = TEP_ERRNO__UNBALANCED_PAREN;
- }
- goto fail;
- }
- ret = 0;
-
- /* A not wants just one expression */
- if (not) {
- if (current_op)
- goto fail_syntax;
- *parg = arg;
- return 0;
- }
-
- if (current_op)
- ret = add_right(current_op, arg, error_str);
- else
- current_exp = arg;
-
- if (ret < 0)
- goto fail;
-
- } else { /* ')' */
- if (!current_op && !current_exp)
- goto fail_syntax;
-
- /* Make sure everything is finished at this level */
- if (current_exp && !check_op_done(current_exp))
- goto fail_syntax;
- if (current_op && !check_op_done(current_op))
- goto fail_syntax;
-
- if (current_op)
- *parg = current_op;
- else
- *parg = current_exp;
- free(token);
- return TEP_ERRNO__UNBALANCED_PAREN;
- }
- break;
-
- case TEP_EVENT_OP:
- op_type = process_op(token, &btype, &ctype, &etype);
-
- /* All expect a left arg except for NOT */
- switch (op_type) {
- case OP_BOOL:
- /* Logic ops need a left expression */
- if (!current_exp && !current_op)
- goto fail_syntax;
- /* fall through */
- case OP_NOT:
- /* logic only processes ops and exp */
- if (left_item)
- goto fail_syntax;
- break;
- case OP_EXP:
- case OP_CMP:
- if (!left_item)
- goto fail_syntax;
- break;
- case OP_NONE:
- show_error(error_str,
- "Unknown op token %s", token);
- ret = TEP_ERRNO__UNKNOWN_TOKEN;
- goto fail;
- }
-
- ret = 0;
- switch (op_type) {
- case OP_BOOL:
- arg = create_arg_op(btype);
- if (arg == NULL)
- goto fail_alloc;
- if (current_op)
- ret = add_left(arg, current_op);
- else
- ret = add_left(arg, current_exp);
- current_op = arg;
- current_exp = NULL;
- break;
-
- case OP_NOT:
- arg = create_arg_op(btype);
- if (arg == NULL)
- goto fail_alloc;
- if (current_op)
- ret = add_right(current_op, arg, error_str);
- if (ret < 0)
- goto fail;
- current_exp = arg;
- ret = process_filter(event, &arg, error_str, 1);
- if (ret < 0)
- goto fail;
- ret = add_right(current_exp, arg, error_str);
- if (ret < 0)
- goto fail;
- break;
-
- case OP_EXP:
- case OP_CMP:
- if (op_type == OP_EXP)
- arg = create_arg_exp(etype);
- else
- arg = create_arg_cmp(ctype);
- if (arg == NULL)
- goto fail_alloc;
-
- if (current_op)
- ret = add_right(current_op, arg, error_str);
- if (ret < 0)
- goto fail;
- ret = add_left(arg, left_item);
- if (ret < 0) {
- arg = NULL;
- goto fail_syntax;
- }
- current_exp = arg;
- break;
- default:
- break;
- }
- arg = NULL;
- if (ret < 0)
- goto fail_syntax;
- break;
- case TEP_EVENT_NONE:
- break;
- case TEP_EVENT_ERROR:
- goto fail_alloc;
- default:
- goto fail_syntax;
- }
- } while (type != TEP_EVENT_NONE);
-
- if (!current_op && !current_exp)
- goto fail_syntax;
-
- if (!current_op)
- current_op = current_exp;
-
- ret = collapse_tree(current_op, parg, error_str);
- /* collapse_tree() may free current_op, and updates parg accordingly */
- current_op = NULL;
- if (ret < 0)
- goto fail;
-
- free(token);
- return 0;
-
- fail_alloc:
- show_error(error_str, "failed to allocate filter arg");
- ret = TEP_ERRNO__MEM_ALLOC_FAILED;
- goto fail;
- fail_syntax:
- show_error(error_str, "Syntax error");
- ret = TEP_ERRNO__SYNTAX_ERROR;
- fail:
- free_arg(current_op);
- free_arg(current_exp);
- free_arg(arg);
- free(token);
- return ret;
-}
-
-static enum tep_errno
-process_event(struct tep_event *event, const char *filter_str,
- struct tep_filter_arg **parg, char *error_str)
-{
- int ret;
-
- init_input_buf(filter_str, strlen(filter_str));
-
- ret = process_filter(event, parg, error_str, 0);
- if (ret < 0)
- return ret;
-
- /* If parg is NULL, then make it into FALSE */
- if (!*parg) {
- *parg = allocate_arg();
- if (*parg == NULL)
- return TEP_ERRNO__MEM_ALLOC_FAILED;
-
- (*parg)->type = TEP_FILTER_ARG_BOOLEAN;
- (*parg)->boolean.value = TEP_FILTER_FALSE;
- }
-
- return 0;
-}
-
-static enum tep_errno
-filter_event(struct tep_event_filter *filter, struct tep_event *event,
- const char *filter_str, char *error_str)
-{
- struct tep_filter_type *filter_type;
- struct tep_filter_arg *arg;
- enum tep_errno ret;
-
- if (filter_str) {
- ret = process_event(event, filter_str, &arg, error_str);
- if (ret < 0)
- return ret;
-
- } else {
- /* just add a TRUE arg */
- arg = allocate_arg();
- if (arg == NULL)
- return TEP_ERRNO__MEM_ALLOC_FAILED;
-
- arg->type = TEP_FILTER_ARG_BOOLEAN;
- arg->boolean.value = TEP_FILTER_TRUE;
- }
-
- filter_type = add_filter_type(filter, event->id);
- if (filter_type == NULL) {
- free_arg(arg);
- return TEP_ERRNO__MEM_ALLOC_FAILED;
- }
-
- if (filter_type->filter)
- free_arg(filter_type->filter);
- filter_type->filter = arg;
-
- return 0;
-}
-
-static void filter_init_error_buf(struct tep_event_filter *filter)
-{
- /* clear buffer to reset show error */
- init_input_buf("", 0);
- filter->error_buffer[0] = '\0';
-}
-
-/**
- * tep_filter_add_filter_str - add a new filter
- * @filter: the event filter to add to
- * @filter_str: the filter string that contains the filter
- *
- * Returns 0 if the filter was successfully added or a
- * negative error code. Use tep_filter_strerror() to see
- * actual error message in case of error.
- */
-enum tep_errno tep_filter_add_filter_str(struct tep_event_filter *filter,
- const char *filter_str)
-{
- struct tep_handle *tep = filter->tep;
- struct event_list *event;
- struct event_list *events = NULL;
- const char *filter_start;
- const char *next_event;
- char *this_event;
- char *event_name = NULL;
- char *sys_name = NULL;
- char *sp;
- enum tep_errno rtn = 0; /* TEP_ERRNO__SUCCESS */
- int len;
- int ret;
-
- filter_init_error_buf(filter);
-
- filter_start = strchr(filter_str, ':');
- if (filter_start)
- len = filter_start - filter_str;
- else
- len = strlen(filter_str);
-
- do {
- next_event = strchr(filter_str, ',');
- if (next_event &&
- (!filter_start || next_event < filter_start))
- len = next_event - filter_str;
- else if (filter_start)
- len = filter_start - filter_str;
- else
- len = strlen(filter_str);
-
- this_event = malloc(len + 1);
- if (this_event == NULL) {
- /* This can only happen when events is NULL, but still */
- free_events(events);
- return TEP_ERRNO__MEM_ALLOC_FAILED;
- }
- memcpy(this_event, filter_str, len);
- this_event[len] = 0;
-
- if (next_event)
- next_event++;
-
- filter_str = next_event;
-
- sys_name = strtok_r(this_event, "/", &sp);
- event_name = strtok_r(NULL, "/", &sp);
-
- if (!sys_name) {
- /* This can only happen when events is NULL, but still */
- free_events(events);
- free(this_event);
- return TEP_ERRNO__FILTER_NOT_FOUND;
- }
-
- /* Find this event */
- ret = find_event(tep, &events, strim(sys_name), strim(event_name));
- if (ret < 0) {
- free_events(events);
- free(this_event);
- return ret;
- }
- free(this_event);
- } while (filter_str);
-
- /* Skip the ':' */
- if (filter_start)
- filter_start++;
-
- /* filter starts here */
- for (event = events; event; event = event->next) {
- ret = filter_event(filter, event->event, filter_start,
- filter->error_buffer);
- /* Failures are returned if a parse error happened */
- if (ret < 0)
- rtn = ret;
-
- if (ret >= 0 && tep->test_filters) {
- char *test;
- test = tep_filter_make_string(filter, event->event->id);
- if (test) {
- printf(" '%s: %s'\n", event->event->name, test);
- free(test);
- }
- }
- }
-
- free_events(events);
-
- return rtn;
-}
-
-static void free_filter_type(struct tep_filter_type *filter_type)
-{
- free_arg(filter_type->filter);
-}
-
-/**
- * tep_filter_strerror - fill error message in a buffer
- * @filter: the event filter contains error
- * @err: the error code
- * @buf: the buffer to be filled in
- * @buflen: the size of the buffer
- *
- * Returns 0 if message was filled successfully, -1 if error
- */
-int tep_filter_strerror(struct tep_event_filter *filter, enum tep_errno err,
- char *buf, size_t buflen)
-{
- if (err <= __TEP_ERRNO__START || err >= __TEP_ERRNO__END)
- return -1;
-
- if (strlen(filter->error_buffer) > 0) {
- size_t len = snprintf(buf, buflen, "%s", filter->error_buffer);
-
- if (len > buflen)
- return -1;
- return 0;
- }
-
- return tep_strerror(filter->tep, err, buf, buflen);
-}
-
-/**
- * tep_filter_remove_event - remove a filter for an event
- * @filter: the event filter to remove from
- * @event_id: the event to remove a filter for
- *
- * Removes the filter saved for an event defined by @event_id
- * from the @filter.
- *
- * Returns 1: if an event was removed
- * 0: if the event was not found
- */
-int tep_filter_remove_event(struct tep_event_filter *filter,
- int event_id)
-{
- struct tep_filter_type *filter_type;
- unsigned long len;
-
- if (!filter->filters)
- return 0;
-
- filter_type = find_filter_type(filter, event_id);
-
- if (!filter_type)
- return 0;
-
- free_filter_type(filter_type);
-
- /* The filter_type points into the event_filters array */
- len = (unsigned long)(filter->event_filters + filter->filters) -
- (unsigned long)(filter_type + 1);
-
- memmove(filter_type, filter_type + 1, len);
- filter->filters--;
-
- memset(&filter->event_filters[filter->filters], 0,
- sizeof(*filter_type));
-
- return 1;
-}
-
-/**
- * tep_filter_reset - clear all filters in a filter
- * @filter: the event filter to reset
- *
- * Removes all filters from a filter and resets it.
- */
-void tep_filter_reset(struct tep_event_filter *filter)
-{
- int i;
-
- for (i = 0; i < filter->filters; i++)
- free_filter_type(&filter->event_filters[i]);
-
- free(filter->event_filters);
- filter->filters = 0;
- filter->event_filters = NULL;
-}
-
-void tep_filter_free(struct tep_event_filter *filter)
-{
- tep_unref(filter->tep);
-
- tep_filter_reset(filter);
-
- free(filter);
-}
-
-static char *arg_to_str(struct tep_event_filter *filter, struct tep_filter_arg *arg);
-
-static int copy_filter_type(struct tep_event_filter *filter,
- struct tep_event_filter *source,
- struct tep_filter_type *filter_type)
-{
- struct tep_filter_arg *arg;
- struct tep_event *event;
- const char *sys;
- const char *name;
- char *str;
-
- /* Can't assume that the tep's are the same */
- sys = filter_type->event->system;
- name = filter_type->event->name;
- event = tep_find_event_by_name(filter->tep, sys, name);
- if (!event)
- return -1;
-
- str = arg_to_str(source, filter_type->filter);
- if (!str)
- return -1;
-
- if (strcmp(str, "TRUE") == 0 || strcmp(str, "FALSE") == 0) {
- /* Add trivial event */
- arg = allocate_arg();
- if (arg == NULL) {
- free(str);
- return -1;
- }
-
- arg->type = TEP_FILTER_ARG_BOOLEAN;
- if (strcmp(str, "TRUE") == 0)
- arg->boolean.value = 1;
- else
- arg->boolean.value = 0;
-
- filter_type = add_filter_type(filter, event->id);
- if (filter_type == NULL) {
- free(str);
- free_arg(arg);
- return -1;
- }
-
- filter_type->filter = arg;
-
- free(str);
- return 0;
- }
-
- filter_event(filter, event, str, NULL);
- free(str);
-
- return 0;
-}
-
-/**
- * tep_filter_copy - copy a filter using another filter
- * @dest - the filter to copy to
- * @source - the filter to copy from
- *
- * Returns 0 on success and -1 if not all filters were copied
- */
-int tep_filter_copy(struct tep_event_filter *dest, struct tep_event_filter *source)
-{
- int ret = 0;
- int i;
-
- tep_filter_reset(dest);
-
- for (i = 0; i < source->filters; i++) {
- if (copy_filter_type(dest, source, &source->event_filters[i]))
- ret = -1;
- }
- return ret;
-}
-
-static int test_filter(struct tep_event *event, struct tep_filter_arg *arg,
- struct tep_record *record, enum tep_errno *err);
-
-static const char *
-get_comm(struct tep_event *event, struct tep_record *record)
-{
- const char *comm;
- int pid;
-
- pid = tep_data_pid(event->tep, record);
- comm = tep_data_comm_from_pid(event->tep, pid);
- return comm;
-}
-
-static unsigned long long
-get_value(struct tep_event *event,
- struct tep_format_field *field, struct tep_record *record)
-{
- unsigned long long val;
-
- /* Handle our dummy "comm" field */
- if (field == &comm) {
- const char *name;
-
- name = get_comm(event, record);
- return (unsigned long)name;
- }
-
- /* Handle our dummy "cpu" field */
- if (field == &cpu)
- return record->cpu;
-
- tep_read_number_field(field, record->data, &val);
-
- if (!(field->flags & TEP_FIELD_IS_SIGNED))
- return val;
-
- switch (field->size) {
- case 1:
- return (char)val;
- case 2:
- return (short)val;
- case 4:
- return (int)val;
- case 8:
- return (long long)val;
- }
- return val;
-}
-
-static unsigned long long
-get_arg_value(struct tep_event *event, struct tep_filter_arg *arg,
- struct tep_record *record, enum tep_errno *err);
-
-static unsigned long long
-get_exp_value(struct tep_event *event, struct tep_filter_arg *arg,
- struct tep_record *record, enum tep_errno *err)
-{
- unsigned long long lval, rval;
-
- lval = get_arg_value(event, arg->exp.left, record, err);
- rval = get_arg_value(event, arg->exp.right, record, err);
-
- if (*err) {
- /*
- * There was an error, no need to process anymore.
- */
- return 0;
- }
-
- switch (arg->exp.type) {
- case TEP_FILTER_EXP_ADD:
- return lval + rval;
-
- case TEP_FILTER_EXP_SUB:
- return lval - rval;
-
- case TEP_FILTER_EXP_MUL:
- return lval * rval;
-
- case TEP_FILTER_EXP_DIV:
- return lval / rval;
-
- case TEP_FILTER_EXP_MOD:
- return lval % rval;
-
- case TEP_FILTER_EXP_RSHIFT:
- return lval >> rval;
-
- case TEP_FILTER_EXP_LSHIFT:
- return lval << rval;
-
- case TEP_FILTER_EXP_AND:
- return lval & rval;
-
- case TEP_FILTER_EXP_OR:
- return lval | rval;
-
- case TEP_FILTER_EXP_XOR:
- return lval ^ rval;
-
- case TEP_FILTER_EXP_NOT:
- default:
- if (!*err)
- *err = TEP_ERRNO__INVALID_EXP_TYPE;
- }
- return 0;
-}
-
-static unsigned long long
-get_arg_value(struct tep_event *event, struct tep_filter_arg *arg,
- struct tep_record *record, enum tep_errno *err)
-{
- switch (arg->type) {
- case TEP_FILTER_ARG_FIELD:
- return get_value(event, arg->field.field, record);
-
- case TEP_FILTER_ARG_VALUE:
- if (arg->value.type != TEP_FILTER_NUMBER) {
- if (!*err)
- *err = TEP_ERRNO__NOT_A_NUMBER;
- }
- return arg->value.val;
-
- case TEP_FILTER_ARG_EXP:
- return get_exp_value(event, arg, record, err);
-
- default:
- if (!*err)
- *err = TEP_ERRNO__INVALID_ARG_TYPE;
- }
- return 0;
-}
-
-static int test_num(struct tep_event *event, struct tep_filter_arg *arg,
- struct tep_record *record, enum tep_errno *err)
-{
- unsigned long long lval, rval;
-
- lval = get_arg_value(event, arg->num.left, record, err);
- rval = get_arg_value(event, arg->num.right, record, err);
-
- if (*err) {
- /*
- * There was an error, no need to process anymore.
- */
- return 0;
- }
-
- switch (arg->num.type) {
- case TEP_FILTER_CMP_EQ:
- return lval == rval;
-
- case TEP_FILTER_CMP_NE:
- return lval != rval;
-
- case TEP_FILTER_CMP_GT:
- return lval > rval;
-
- case TEP_FILTER_CMP_LT:
- return lval < rval;
-
- case TEP_FILTER_CMP_GE:
- return lval >= rval;
-
- case TEP_FILTER_CMP_LE:
- return lval <= rval;
-
- default:
- if (!*err)
- *err = TEP_ERRNO__ILLEGAL_INTEGER_CMP;
- return 0;
- }
-}
-
-static const char *get_field_str(struct tep_filter_arg *arg, struct tep_record *record)
-{
- struct tep_event *event;
- struct tep_handle *tep;
- unsigned long long addr;
- const char *val = NULL;
- unsigned int size;
- char hex[64];
-
- /* If the field is not a string convert it */
- if (arg->str.field->flags & TEP_FIELD_IS_STRING) {
- val = record->data + arg->str.field->offset;
- size = arg->str.field->size;
-
- if (arg->str.field->flags & TEP_FIELD_IS_DYNAMIC) {
- addr = *(unsigned int *)val;
- size = addr >> 16;
- addr &= 0xffff;
- if (arg->str.field->flags & TEP_FIELD_IS_RELATIVE)
- addr += arg->str.field->offset + arg->str.field->size;
- val = record->data + addr;
- }
-
- /*
- * We need to copy the data since we can't be sure the field
- * is null terminated.
- */
- if (*(val + size - 1)) {
- /* copy it */
- memcpy(arg->str.buffer, val, arg->str.field->size);
- /* the buffer is already NULL terminated */
- val = arg->str.buffer;
- }
-
- } else {
- event = arg->str.field->event;
- tep = event->tep;
- addr = get_value(event, arg->str.field, record);
-
- if (arg->str.field->flags & (TEP_FIELD_IS_POINTER | TEP_FIELD_IS_LONG))
- /* convert to a kernel symbol */
- val = tep_find_function(tep, addr);
-
- if (val == NULL) {
- /* just use the hex of the string name */
- snprintf(hex, 64, "0x%llx", addr);
- val = hex;
- }
- }
-
- return val;
-}
-
-static int test_str(struct tep_event *event, struct tep_filter_arg *arg,
- struct tep_record *record, enum tep_errno *err)
-{
- const char *val;
-
- if (arg->str.field == &comm)
- val = get_comm(event, record);
- else
- val = get_field_str(arg, record);
-
- switch (arg->str.type) {
- case TEP_FILTER_CMP_MATCH:
- return strcmp(val, arg->str.val) == 0;
-
- case TEP_FILTER_CMP_NOT_MATCH:
- return strcmp(val, arg->str.val) != 0;
-
- case TEP_FILTER_CMP_REGEX:
- /* Returns zero on match */
- return !regexec(&arg->str.reg, val, 0, NULL, 0);
-
- case TEP_FILTER_CMP_NOT_REGEX:
- return regexec(&arg->str.reg, val, 0, NULL, 0);
-
- default:
- if (!*err)
- *err = TEP_ERRNO__ILLEGAL_STRING_CMP;
- return 0;
- }
-}
-
-static int test_op(struct tep_event *event, struct tep_filter_arg *arg,
- struct tep_record *record, enum tep_errno *err)
-{
- switch (arg->op.type) {
- case TEP_FILTER_OP_AND:
- return test_filter(event, arg->op.left, record, err) &&
- test_filter(event, arg->op.right, record, err);
-
- case TEP_FILTER_OP_OR:
- return test_filter(event, arg->op.left, record, err) ||
- test_filter(event, arg->op.right, record, err);
-
- case TEP_FILTER_OP_NOT:
- return !test_filter(event, arg->op.right, record, err);
-
- default:
- if (!*err)
- *err = TEP_ERRNO__INVALID_OP_TYPE;
- return 0;
- }
-}
-
-static int test_filter(struct tep_event *event, struct tep_filter_arg *arg,
- struct tep_record *record, enum tep_errno *err)
-{
- if (*err) {
- /*
- * There was an error, no need to process anymore.
- */
- return 0;
- }
-
- switch (arg->type) {
- case TEP_FILTER_ARG_BOOLEAN:
- /* easy case */
- return arg->boolean.value;
-
- case TEP_FILTER_ARG_OP:
- return test_op(event, arg, record, err);
-
- case TEP_FILTER_ARG_NUM:
- return test_num(event, arg, record, err);
-
- case TEP_FILTER_ARG_STR:
- return test_str(event, arg, record, err);
-
- case TEP_FILTER_ARG_EXP:
- case TEP_FILTER_ARG_VALUE:
- case TEP_FILTER_ARG_FIELD:
- /*
- * Expressions, fields and values evaluate
- * to true if they return non zero
- */
- return !!get_arg_value(event, arg, record, err);
-
- default:
- if (!*err)
- *err = TEP_ERRNO__INVALID_ARG_TYPE;
- return 0;
- }
-}
-
-/**
- * tep_event_filtered - return true if event has filter
- * @filter: filter struct with filter information
- * @event_id: event id to test if filter exists
- *
- * Returns 1 if filter found for @event_id
- * otherwise 0;
- */
-int tep_event_filtered(struct tep_event_filter *filter, int event_id)
-{
- struct tep_filter_type *filter_type;
-
- if (!filter->filters)
- return 0;
-
- filter_type = find_filter_type(filter, event_id);
-
- return filter_type ? 1 : 0;
-}
-
-/**
- * tep_filter_match - test if a record matches a filter
- * @filter: filter struct with filter information
- * @record: the record to test against the filter
- *
- * Returns: match result or error code (prefixed with TEP_ERRNO__)
- * FILTER_MATCH - filter found for event and @record matches
- * FILTER_MISS - filter found for event and @record does not match
- * FILTER_NOT_FOUND - no filter found for @record's event
- * NO_FILTER - if no filters exist
- * otherwise - error occurred during test
- */
-enum tep_errno tep_filter_match(struct tep_event_filter *filter,
- struct tep_record *record)
-{
- struct tep_handle *tep = filter->tep;
- struct tep_filter_type *filter_type;
- int event_id;
- int ret;
- enum tep_errno err = 0;
-
- filter_init_error_buf(filter);
-
- if (!filter->filters)
- return TEP_ERRNO__NO_FILTER;
-
- event_id = tep_data_type(tep, record);
-
- filter_type = find_filter_type(filter, event_id);
- if (!filter_type)
- return TEP_ERRNO__FILTER_NOT_FOUND;
-
- ret = test_filter(filter_type->event, filter_type->filter, record, &err);
- if (err)
- return err;
-
- return ret ? TEP_ERRNO__FILTER_MATCH : TEP_ERRNO__FILTER_MISS;
-}
-
-static char *op_to_str(struct tep_event_filter *filter, struct tep_filter_arg *arg)
-{
- char *str = NULL;
- char *left = NULL;
- char *right = NULL;
- char *op = NULL;
- int left_val = -1;
- int right_val = -1;
- int val;
-
- switch (arg->op.type) {
- case TEP_FILTER_OP_AND:
- op = "&&";
- /* fall through */
- case TEP_FILTER_OP_OR:
- if (!op)
- op = "||";
-
- left = arg_to_str(filter, arg->op.left);
- right = arg_to_str(filter, arg->op.right);
- if (!left || !right)
- break;
-
- /* Try to consolidate boolean values */
- if (strcmp(left, "TRUE") == 0)
- left_val = 1;
- else if (strcmp(left, "FALSE") == 0)
- left_val = 0;
-
- if (strcmp(right, "TRUE") == 0)
- right_val = 1;
- else if (strcmp(right, "FALSE") == 0)
- right_val = 0;
-
- if (left_val >= 0) {
- if ((arg->op.type == TEP_FILTER_OP_AND && !left_val) ||
- (arg->op.type == TEP_FILTER_OP_OR && left_val)) {
- /* Just return left value */
- str = left;
- left = NULL;
- break;
- }
- if (right_val >= 0) {
- /* just evaluate this. */
- val = 0;
- switch (arg->op.type) {
- case TEP_FILTER_OP_AND:
- val = left_val && right_val;
- break;
- case TEP_FILTER_OP_OR:
- val = left_val || right_val;
- break;
- default:
- break;
- }
- if (asprintf(&str, val ? "TRUE" : "FALSE") < 0)
- str = NULL;
- break;
- }
- }
- if (right_val >= 0) {
- if ((arg->op.type == TEP_FILTER_OP_AND && !right_val) ||
- (arg->op.type == TEP_FILTER_OP_OR && right_val)) {
- /* Just return right value */
- str = right;
- right = NULL;
- break;
- }
- /* The right value is meaningless */
- str = left;
- left = NULL;
- break;
- }
-
- if (asprintf(&str, "(%s) %s (%s)", left, op, right) < 0)
- str = NULL;
- break;
-
- case TEP_FILTER_OP_NOT:
- op = "!";
- right = arg_to_str(filter, arg->op.right);
- if (!right)
- break;
-
- /* See if we can consolidate */
- if (strcmp(right, "TRUE") == 0)
- right_val = 1;
- else if (strcmp(right, "FALSE") == 0)
- right_val = 0;
- if (right_val >= 0) {
- /* just return the opposite */
- if (asprintf(&str, right_val ? "FALSE" : "TRUE") < 0)
- str = NULL;
- break;
- }
- if (asprintf(&str, "%s(%s)", op, right) < 0)
- str = NULL;
- break;
-
- default:
- /* ?? */
- break;
- }
- free(left);
- free(right);
- return str;
-}
-
-static char *val_to_str(struct tep_event_filter *filter, struct tep_filter_arg *arg)
-{
- char *str = NULL;
-
- if (asprintf(&str, "%lld", arg->value.val) < 0)
- str = NULL;
-
- return str;
-}
-
-static char *field_to_str(struct tep_event_filter *filter, struct tep_filter_arg *arg)
-{
- return strdup(arg->field.field->name);
-}
-
-static char *exp_to_str(struct tep_event_filter *filter, struct tep_filter_arg *arg)
-{
- char *lstr;
- char *rstr;
- char *op;
- char *str = NULL;
-
- lstr = arg_to_str(filter, arg->exp.left);
- rstr = arg_to_str(filter, arg->exp.right);
- if (!lstr || !rstr)
- goto out;
-
- switch (arg->exp.type) {
- case TEP_FILTER_EXP_ADD:
- op = "+";
- break;
- case TEP_FILTER_EXP_SUB:
- op = "-";
- break;
- case TEP_FILTER_EXP_MUL:
- op = "*";
- break;
- case TEP_FILTER_EXP_DIV:
- op = "/";
- break;
- case TEP_FILTER_EXP_MOD:
- op = "%";
- break;
- case TEP_FILTER_EXP_RSHIFT:
- op = ">>";
- break;
- case TEP_FILTER_EXP_LSHIFT:
- op = "<<";
- break;
- case TEP_FILTER_EXP_AND:
- op = "&";
- break;
- case TEP_FILTER_EXP_OR:
- op = "|";
- break;
- case TEP_FILTER_EXP_XOR:
- op = "^";
- break;
- default:
- op = "[ERROR IN EXPRESSION TYPE]";
- break;
- }
-
- if (asprintf(&str, "%s %s %s", lstr, op, rstr) < 0)
- str = NULL;
-out:
- free(lstr);
- free(rstr);
-
- return str;
-}
-
-static char *num_to_str(struct tep_event_filter *filter, struct tep_filter_arg *arg)
-{
- char *lstr;
- char *rstr;
- char *str = NULL;
- char *op = NULL;
-
- lstr = arg_to_str(filter, arg->num.left);
- rstr = arg_to_str(filter, arg->num.right);
- if (!lstr || !rstr)
- goto out;
-
- switch (arg->num.type) {
- case TEP_FILTER_CMP_EQ:
- op = "==";
- /* fall through */
- case TEP_FILTER_CMP_NE:
- if (!op)
- op = "!=";
- /* fall through */
- case TEP_FILTER_CMP_GT:
- if (!op)
- op = ">";
- /* fall through */
- case TEP_FILTER_CMP_LT:
- if (!op)
- op = "<";
- /* fall through */
- case TEP_FILTER_CMP_GE:
- if (!op)
- op = ">=";
- /* fall through */
- case TEP_FILTER_CMP_LE:
- if (!op)
- op = "<=";
-
- if (asprintf(&str, "%s %s %s", lstr, op, rstr) < 0)
- str = NULL;
- break;
-
- default:
- /* ?? */
- break;
- }
-
-out:
- free(lstr);
- free(rstr);
- return str;
-}
-
-static char *str_to_str(struct tep_event_filter *filter, struct tep_filter_arg *arg)
-{
- char *str = NULL;
- char *op = NULL;
-
- switch (arg->str.type) {
- case TEP_FILTER_CMP_MATCH:
- op = "==";
- /* fall through */
- case TEP_FILTER_CMP_NOT_MATCH:
- if (!op)
- op = "!=";
- /* fall through */
- case TEP_FILTER_CMP_REGEX:
- if (!op)
- op = "=~";
- /* fall through */
- case TEP_FILTER_CMP_NOT_REGEX:
- if (!op)
- op = "!~";
-
- if (asprintf(&str, "%s %s \"%s\"",
- arg->str.field->name, op, arg->str.val) < 0)
- str = NULL;
- break;
-
- default:
- /* ?? */
- break;
- }
- return str;
-}
-
-static char *arg_to_str(struct tep_event_filter *filter, struct tep_filter_arg *arg)
-{
- char *str = NULL;
-
- switch (arg->type) {
- case TEP_FILTER_ARG_BOOLEAN:
- if (asprintf(&str, arg->boolean.value ? "TRUE" : "FALSE") < 0)
- str = NULL;
- return str;
-
- case TEP_FILTER_ARG_OP:
- return op_to_str(filter, arg);
-
- case TEP_FILTER_ARG_NUM:
- return num_to_str(filter, arg);
-
- case TEP_FILTER_ARG_STR:
- return str_to_str(filter, arg);
-
- case TEP_FILTER_ARG_VALUE:
- return val_to_str(filter, arg);
-
- case TEP_FILTER_ARG_FIELD:
- return field_to_str(filter, arg);
-
- case TEP_FILTER_ARG_EXP:
- return exp_to_str(filter, arg);
-
- default:
- /* ?? */
- return NULL;
- }
-
-}
-
-/**
- * tep_filter_make_string - return a string showing the filter
- * @filter: filter struct with filter information
- * @event_id: the event id to return the filter string with
- *
- * Returns a string that displays the filter contents.
- * This string must be freed with free(str).
- * NULL is returned if no filter is found or allocation failed.
- */
-char *
-tep_filter_make_string(struct tep_event_filter *filter, int event_id)
-{
- struct tep_filter_type *filter_type;
-
- if (!filter->filters)
- return NULL;
-
- filter_type = find_filter_type(filter, event_id);
-
- if (!filter_type)
- return NULL;
-
- return arg_to_str(filter, filter_type->filter);
-}
-
-/**
- * tep_filter_compare - compare two filters and return if they are the same
- * @filter1: Filter to compare with @filter2
- * @filter2: Filter to compare with @filter1
- *
- * Returns:
- * 1 if the two filters hold the same content.
- * 0 if they do not.
- */
-int tep_filter_compare(struct tep_event_filter *filter1, struct tep_event_filter *filter2)
-{
- struct tep_filter_type *filter_type1;
- struct tep_filter_type *filter_type2;
- char *str1, *str2;
- int result;
- int i;
-
- /* Do the easy checks first */
- if (filter1->filters != filter2->filters)
- return 0;
- if (!filter1->filters && !filter2->filters)
- return 1;
-
- /*
- * Now take a look at each of the events to see if they have the same
- * filters to them.
- */
- for (i = 0; i < filter1->filters; i++) {
- filter_type1 = &filter1->event_filters[i];
- filter_type2 = find_filter_type(filter2, filter_type1->event_id);
- if (!filter_type2)
- break;
- if (filter_type1->filter->type != filter_type2->filter->type)
- break;
- /* The best way to compare complex filters is with strings */
- str1 = arg_to_str(filter1, filter_type1->filter);
- str2 = arg_to_str(filter2, filter_type2->filter);
- if (str1 && str2)
- result = strcmp(str1, str2) != 0;
- else
- /* bail out if allocation fails */
- result = 1;
-
- free(str1);
- free(str2);
- if (result)
- break;
- }
-
- if (i < filter1->filters)
- return 0;
- return 1;
-}
-
diff --git a/tools/lib/traceevent/parse-utils.c b/tools/lib/traceevent/parse-utils.c
deleted file mode 100644
index e99867111387..000000000000
--- a/tools/lib/traceevent/parse-utils.c
+++ /dev/null
@@ -1,71 +0,0 @@
-// SPDX-License-Identifier: LGPL-2.1
-/*
- * Copyright (C) 2010 Red Hat Inc, Steven Rostedt <[email protected]>
- *
- */
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdarg.h>
-#include <errno.h>
-
-#define __weak __attribute__((weak))
-
-void __vwarning(const char *fmt, va_list ap)
-{
- if (errno)
- perror("libtraceevent");
- errno = 0;
-
- fprintf(stderr, " ");
- vfprintf(stderr, fmt, ap);
-
- fprintf(stderr, "\n");
-}
-
-void __warning(const char *fmt, ...)
-{
- va_list ap;
-
- va_start(ap, fmt);
- __vwarning(fmt, ap);
- va_end(ap);
-}
-
-void __weak warning(const char *fmt, ...)
-{
- va_list ap;
-
- va_start(ap, fmt);
- __vwarning(fmt, ap);
- va_end(ap);
-}
-
-void __vpr_stat(const char *fmt, va_list ap)
-{
- vprintf(fmt, ap);
- printf("\n");
-}
-
-void __pr_stat(const char *fmt, ...)
-{
- va_list ap;
-
- va_start(ap, fmt);
- __vpr_stat(fmt, ap);
- va_end(ap);
-}
-
-void __weak vpr_stat(const char *fmt, va_list ap)
-{
- __vpr_stat(fmt, ap);
-}
-
-void __weak pr_stat(const char *fmt, ...)
-{
- va_list ap;
-
- va_start(ap, fmt);
- __vpr_stat(fmt, ap);
- va_end(ap);
-}
diff --git a/tools/lib/traceevent/plugins/Build b/tools/lib/traceevent/plugins/Build
deleted file mode 100644
index dd4da823c38f..000000000000
--- a/tools/lib/traceevent/plugins/Build
+++ /dev/null
@@ -1,12 +0,0 @@
-plugin_jbd2-y += plugin_jbd2.o
-plugin_hrtimer-y += plugin_hrtimer.o
-plugin_kmem-y += plugin_kmem.o
-plugin_kvm-y += plugin_kvm.o
-plugin_mac80211-y += plugin_mac80211.o
-plugin_sched_switch-y += plugin_sched_switch.o
-plugin_function-y += plugin_function.o
-plugin_futex-y += plugin_futex.o
-plugin_xen-y += plugin_xen.o
-plugin_scsi-y += plugin_scsi.o
-plugin_cfg80211-y += plugin_cfg80211.o
-plugin_tlb-y += plugin_tlb.o
\ No newline at end of file
diff --git a/tools/lib/traceevent/plugins/Makefile b/tools/lib/traceevent/plugins/Makefile
deleted file mode 100644
index 47e802553250..000000000000
--- a/tools/lib/traceevent/plugins/Makefile
+++ /dev/null
@@ -1,225 +0,0 @@
-# SPDX-License-Identifier: GPL-2.0
-
-#MAKEFLAGS += --no-print-directory
-
-
-# Makefiles suck: This macro sets a default value of $(2) for the
-# variable named by $(1), unless the variable has been set by
-# environment or command line. This is necessary for CC and AR
-# because make sets default values, so the simpler ?= approach
-# won't work as expected.
-define allow-override
- $(if $(or $(findstring environment,$(origin $(1))),\
- $(findstring command line,$(origin $(1)))),,\
- $(eval $(1) = $(2)))
-endef
-
-# Allow setting CC and AR, or setting CROSS_COMPILE as a prefix.
-$(call allow-override,CC,$(CROSS_COMPILE)gcc)
-$(call allow-override,AR,$(CROSS_COMPILE)ar)
-$(call allow-override,NM,$(CROSS_COMPILE)nm)
-$(call allow-override,PKG_CONFIG,pkg-config)
-
-EXT = -std=gnu99
-INSTALL = install
-
-# Use DESTDIR for installing into a different root directory.
-# This is useful for building a package. The program will be
-# installed in this directory as if it was the root directory.
-# Then the build tool can move it later.
-DESTDIR ?=
-DESTDIR_SQ = '$(subst ','\'',$(DESTDIR))'
-
-LP64 := $(shell echo __LP64__ | ${CC} ${CFLAGS} -E -x c - | tail -n 1)
-ifeq ($(LP64), 1)
- libdir_relative_tmp = lib64
-else
- libdir_relative_tmp = lib
-endif
-
-libdir_relative ?= $(libdir_relative_tmp)
-prefix ?= /usr/local
-libdir = $(prefix)/$(libdir_relative)
-
-set_plugin_dir := 1
-
-# Set plugin_dir to preffered global plugin location
-# If we install under $HOME directory we go under
-# $(HOME)/.local/lib/traceevent/plugins
-#
-# We dont set PLUGIN_DIR in case we install under $HOME
-# directory, because by default the code looks under:
-# $(HOME)/.local/lib/traceevent/plugins by default.
-#
-ifeq ($(plugin_dir),)
-ifeq ($(prefix),$(HOME))
-override plugin_dir = $(HOME)/.local/lib/traceevent/plugins
-set_plugin_dir := 0
-else
-override plugin_dir = $(libdir)/traceevent/plugins
-endif
-endif
-
-ifeq ($(set_plugin_dir),1)
-PLUGIN_DIR = -DPLUGIN_DIR="$(plugin_dir)"
-PLUGIN_DIR_SQ = '$(subst ','\'',$(PLUGIN_DIR))'
-endif
-
-include ../../../scripts/Makefile.include
-
-# copy a bit from Linux kbuild
-
-ifeq ("$(origin V)", "command line")
- VERBOSE = $(V)
-endif
-ifndef VERBOSE
- VERBOSE = 0
-endif
-
-ifeq ($(srctree),)
-srctree := $(patsubst %/,%,$(dir $(CURDIR)))
-srctree := $(patsubst %/,%,$(dir $(srctree)))
-srctree := $(patsubst %/,%,$(dir $(srctree)))
-srctree := $(patsubst %/,%,$(dir $(srctree)))
-#$(info Determined 'srctree' to be $(srctree))
-endif
-
-export prefix libdir src obj
-
-# Shell quotes
-plugin_dir_SQ = $(subst ','\'',$(plugin_dir))
-
-CONFIG_INCLUDES =
-CONFIG_LIBS =
-CONFIG_FLAGS =
-
-OBJ = $@
-N =
-
-INCLUDES = -I. -I.. -I $(srctree)/tools/include $(CONFIG_INCLUDES)
-
-# Set compile option CFLAGS
-ifdef EXTRA_CFLAGS
- CFLAGS := $(EXTRA_CFLAGS)
-else
- CFLAGS := -g -Wall
-endif
-
-# Append required CFLAGS
-override CFLAGS += -fPIC
-override CFLAGS += $(CONFIG_FLAGS) $(INCLUDES) $(PLUGIN_DIR_SQ)
-override CFLAGS += $(udis86-flags) -D_GNU_SOURCE
-
-ifeq ($(VERBOSE),1)
- Q =
-else
- Q = @
-endif
-
-# Disable command line variables (CFLAGS) override from top
-# level Makefile (perf), otherwise build Makefile will get
-# the same command line setup.
-MAKEOVERRIDES=
-
-export srctree OUTPUT CC LD CFLAGS V
-
-build := -f $(srctree)/tools/build/Makefile.build dir=. obj
-
-DYNAMIC_LIST_FILE := $(OUTPUT)libtraceevent-dynamic-list
-
-PLUGINS = plugin_jbd2.so
-PLUGINS += plugin_hrtimer.so
-PLUGINS += plugin_kmem.so
-PLUGINS += plugin_kvm.so
-PLUGINS += plugin_mac80211.so
-PLUGINS += plugin_sched_switch.so
-PLUGINS += plugin_function.so
-PLUGINS += plugin_futex.so
-PLUGINS += plugin_xen.so
-PLUGINS += plugin_scsi.so
-PLUGINS += plugin_cfg80211.so
-PLUGINS += plugin_tlb.so
-
-PLUGINS := $(addprefix $(OUTPUT),$(PLUGINS))
-PLUGINS_IN := $(PLUGINS:.so=-in.o)
-
-plugins: $(PLUGINS) $(DYNAMIC_LIST_FILE)
-
-__plugin_obj = $(notdir $@)
- plugin_obj = $(__plugin_obj:-in.o=)
-
-$(PLUGINS_IN): force
- $(Q)$(MAKE) $(build)=$(plugin_obj)
-
-$(OUTPUT)libtraceevent-dynamic-list: $(PLUGINS)
- $(QUIET_GEN)$(call do_generate_dynamic_list_file, $(PLUGINS), $@)
-
-$(OUTPUT)%.so: $(OUTPUT)%-in.o
- $(QUIET_LINK)$(CC) $(CFLAGS) -shared $(LDFLAGS) -nostartfiles -o $@ $^
-
-define update_dir
- (echo $1 > [email protected]; \
- if [ -r $@ ] && cmp -s $@ [email protected]; then \
- rm -f [email protected]; \
- else \
- echo ' UPDATE $@'; \
- mv -f [email protected] $@; \
- fi);
-endef
-
-tags: force
- $(RM) tags
- find . -name '*.[ch]' | xargs ctags --extra=+f --c-kinds=+px \
- --regex-c++='/_PE\(([^,)]*).*/TEP_ERRNO__\1/'
-
-TAGS: force
- $(RM) TAGS
- find . -name '*.[ch]' | xargs etags \
- --regex='/_PE(\([^,)]*\).*/TEP_ERRNO__\1/'
-
-define do_install_mkdir
- if [ ! -d '$(DESTDIR_SQ)$1' ]; then \
- $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$1'; \
- fi
-endef
-
-define do_install
- $(call do_install_mkdir,$2); \
- $(INSTALL) $(if $3,-m $3,) $1 '$(DESTDIR_SQ)$2'
-endef
-
-define do_install_plugins
- for plugin in $1; do \
- $(call do_install,$$plugin,$(plugin_dir_SQ)); \
- done
-endef
-
-define do_generate_dynamic_list_file
- symbol_type=`$(NM) -u -D $1 | awk 'NF>1 {print $$1}' | \
- xargs echo "U w W" | tr 'w ' 'W\n' | sort -u | xargs echo`;\
- if [ "$$symbol_type" = "U W" ];then \
- (echo '{'; \
- $(NM) -u -D $1 | awk 'NF>1 {sub("@.*", "", $$2); print "\t"$$2";"}' | sort -u;\
- echo '};'; \
- ) > $2; \
- else \
- (echo Either missing one of [$1] or bad version of $(NM)) 1>&2;\
- fi
-endef
-
-install: $(PLUGINS)
- $(call QUIET_INSTALL, trace_plugins) \
- $(call do_install_plugins, $(PLUGINS))
-
-clean:
- $(call QUIET_CLEAN, trace_plugins) \
- $(RM) *.o *~ $(TARGETS) *.a *.so $(VERSION_FILES) .*.d .*.cmd; \
- $(RM) $(OUTPUT)libtraceevent-dynamic-list \
- $(RM) TRACEEVENT-CFLAGS tags TAGS;
-
-PHONY += force plugins
-force:
-
-# Declare the contents of the .PHONY variable as phony. We keep that
-# information in a variable so we can use it in if_changed and friends.
-.PHONY: $(PHONY)
diff --git a/tools/lib/traceevent/plugins/plugin_cfg80211.c b/tools/lib/traceevent/plugins/plugin_cfg80211.c
deleted file mode 100644
index 3d43b56a6c98..000000000000
--- a/tools/lib/traceevent/plugins/plugin_cfg80211.c
+++ /dev/null
@@ -1,43 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-#include <stdio.h>
-#include <string.h>
-#include <inttypes.h>
-#include <endian.h>
-#include "event-parse.h"
-
-/*
- * From glibc endian.h, for older systems where it is not present, e.g.: RHEL5,
- * Fedora6.
- */
-#ifndef le16toh
-# if __BYTE_ORDER == __LITTLE_ENDIAN
-# define le16toh(x) (x)
-# else
-# define le16toh(x) __bswap_16 (x)
-# endif
-#endif
-
-
-static unsigned long long
-process___le16_to_cpup(struct trace_seq *s, unsigned long long *args)
-{
- uint16_t *val = (uint16_t *) (unsigned long) args[0];
- return val ? (long long) le16toh(*val) : 0;
-}
-
-int TEP_PLUGIN_LOADER(struct tep_handle *tep)
-{
- tep_register_print_function(tep,
- process___le16_to_cpup,
- TEP_FUNC_ARG_INT,
- "__le16_to_cpup",
- TEP_FUNC_ARG_PTR,
- TEP_FUNC_ARG_VOID);
- return 0;
-}
-
-void TEP_PLUGIN_UNLOADER(struct tep_handle *tep)
-{
- tep_unregister_print_function(tep, process___le16_to_cpup,
- "__le16_to_cpup");
-}
diff --git a/tools/lib/traceevent/plugins/plugin_function.c b/tools/lib/traceevent/plugins/plugin_function.c
deleted file mode 100644
index 807b16e1bf0f..000000000000
--- a/tools/lib/traceevent/plugins/plugin_function.c
+++ /dev/null
@@ -1,282 +0,0 @@
-// SPDX-License-Identifier: LGPL-2.1
-/*
- * Copyright (C) 2009, 2010 Red Hat Inc, Steven Rostedt <[email protected]>
- */
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "event-parse.h"
-#include "event-utils.h"
-#include "trace-seq.h"
-
-static struct func_stack {
- int size;
- char **stack;
-} *fstack;
-
-static int cpus = -1;
-
-#define STK_BLK 10
-
-struct tep_plugin_option plugin_options[] =
-{
- {
- .name = "parent",
- .plugin_alias = "ftrace",
- .description =
- "Print parent of functions for function events",
- },
- {
- .name = "indent",
- .plugin_alias = "ftrace",
- .description =
- "Try to show function call indents, based on parents",
- .set = 1,
- },
- {
- .name = "offset",
- .plugin_alias = "ftrace",
- .description =
- "Show function names as well as their offsets",
- .set = 0,
- },
- {
- .name = NULL,
- }
-};
-
-static struct tep_plugin_option *ftrace_parent = &plugin_options[0];
-static struct tep_plugin_option *ftrace_indent = &plugin_options[1];
-static struct tep_plugin_option *ftrace_offset = &plugin_options[2];
-
-static void add_child(struct func_stack *stack, const char *child, int pos)
-{
- int i;
-
- if (!child)
- return;
-
- if (pos < stack->size)
- free(stack->stack[pos]);
- else {
- char **ptr;
-
- ptr = realloc(stack->stack, sizeof(char *) *
- (stack->size + STK_BLK));
- if (!ptr) {
- warning("could not allocate plugin memory\n");
- return;
- }
-
- stack->stack = ptr;
-
- for (i = stack->size; i < stack->size + STK_BLK; i++)
- stack->stack[i] = NULL;
- stack->size += STK_BLK;
- }
-
- stack->stack[pos] = strdup(child);
-}
-
-static int add_and_get_index(const char *parent, const char *child, int cpu)
-{
- int i;
-
- if (cpu < 0)
- return 0;
-
- if (cpu > cpus) {
- struct func_stack *ptr;
-
- ptr = realloc(fstack, sizeof(*fstack) * (cpu + 1));
- if (!ptr) {
- warning("could not allocate plugin memory\n");
- return 0;
- }
-
- fstack = ptr;
-
- /* Account for holes in the cpu count */
- for (i = cpus + 1; i <= cpu; i++)
- memset(&fstack[i], 0, sizeof(fstack[i]));
- cpus = cpu;
- }
-
- for (i = 0; i < fstack[cpu].size && fstack[cpu].stack[i]; i++) {
- if (strcmp(parent, fstack[cpu].stack[i]) == 0) {
- add_child(&fstack[cpu], child, i+1);
- return i;
- }
- }
-
- /* Not found */
- add_child(&fstack[cpu], parent, 0);
- add_child(&fstack[cpu], child, 1);
- return 0;
-}
-
-static void show_function(struct trace_seq *s, struct tep_handle *tep,
- const char *func, unsigned long long function)
-{
- unsigned long long offset;
-
- trace_seq_printf(s, "%s", func);
- if (ftrace_offset->set) {
- offset = tep_find_function_address(tep, function);
- trace_seq_printf(s, "+0x%x ", (int)(function - offset));
- }
-}
-
-static int function_handler(struct trace_seq *s, struct tep_record *record,
- struct tep_event *event, void *context)
-{
- struct tep_handle *tep = event->tep;
- unsigned long long function;
- unsigned long long pfunction;
- const char *func;
- const char *parent;
- int index = 0;
-
- if (tep_get_field_val(s, event, "ip", record, &function, 1))
- return trace_seq_putc(s, '!');
-
- func = tep_find_function(tep, function);
-
- if (tep_get_field_val(s, event, "parent_ip", record, &pfunction, 1))
- return trace_seq_putc(s, '!');
-
- parent = tep_find_function(tep, pfunction);
-
- if (parent && ftrace_indent->set)
- index = add_and_get_index(parent, func, record->cpu);
-
- trace_seq_printf(s, "%*s", index*3, "");
-
- if (func)
- show_function(s, tep, func, function);
- else
- trace_seq_printf(s, "0x%llx", function);
-
- if (ftrace_parent->set) {
- trace_seq_printf(s, " <-- ");
- if (parent)
- show_function(s, tep, parent, pfunction);
- else
- trace_seq_printf(s, "0x%llx", pfunction);
- }
-
- return 0;
-}
-
-static int
-trace_stack_handler(struct trace_seq *s, struct tep_record *record,
- struct tep_event *event, void *context)
-{
- struct tep_format_field *field;
- unsigned long long addr;
- const char *func;
- int long_size;
- void *data = record->data;
-
- field = tep_find_any_field(event, "caller");
- if (!field) {
- trace_seq_printf(s, "<CANT FIND FIELD %s>", "caller");
- return 0;
- }
-
- trace_seq_puts(s, "<stack trace >\n");
-
- long_size = tep_get_long_size(event->tep);
-
- for (data += field->offset; data < record->data + record->size;
- data += long_size) {
- addr = tep_read_number(event->tep, data, long_size);
-
- if ((long_size == 8 && addr == (unsigned long long)-1) ||
- ((int)addr == -1))
- break;
-
- func = tep_find_function(event->tep, addr);
- if (func)
- trace_seq_printf(s, "=> %s (%llx)\n", func, addr);
- else
- trace_seq_printf(s, "=> %llx\n", addr);
- }
-
- return 0;
-}
-
-static int
-trace_raw_data_handler(struct trace_seq *s, struct tep_record *record,
- struct tep_event *event, void *context)
-{
- struct tep_format_field *field;
- unsigned long long id;
- int long_size;
- void *data = record->data;
-
- if (tep_get_field_val(s, event, "id", record, &id, 1))
- return trace_seq_putc(s, '!');
-
- trace_seq_printf(s, "# %llx", id);
-
- field = tep_find_any_field(event, "buf");
- if (!field) {
- trace_seq_printf(s, "<CANT FIND FIELD %s>", "buf");
- return 0;
- }
-
- long_size = tep_get_long_size(event->tep);
-
- for (data += field->offset; data < record->data + record->size;
- data += long_size) {
- int size = sizeof(long);
- int left = (record->data + record->size) - data;
- int i;
-
- if (size > left)
- size = left;
-
- for (i = 0; i < size; i++)
- trace_seq_printf(s, " %02x", *(unsigned char *)(data + i));
- }
-
- return 0;
-}
-
-int TEP_PLUGIN_LOADER(struct tep_handle *tep)
-{
- tep_register_event_handler(tep, -1, "ftrace", "function",
- function_handler, NULL);
-
- tep_register_event_handler(tep, -1, "ftrace", "kernel_stack",
- trace_stack_handler, NULL);
-
- tep_register_event_handler(tep, -1, "ftrace", "raw_data",
- trace_raw_data_handler, NULL);
-
- tep_plugin_add_options("ftrace", plugin_options);
-
- return 0;
-}
-
-void TEP_PLUGIN_UNLOADER(struct tep_handle *tep)
-{
- int i, x;
-
- tep_unregister_event_handler(tep, -1, "ftrace", "function",
- function_handler, NULL);
-
- for (i = 0; i <= cpus; i++) {
- for (x = 0; x < fstack[i].size && fstack[i].stack[x]; x++)
- free(fstack[i].stack[x]);
- free(fstack[i].stack);
- }
-
- tep_plugin_remove_options(plugin_options);
-
- free(fstack);
- fstack = NULL;
- cpus = -1;
-}
diff --git a/tools/lib/traceevent/plugins/plugin_futex.c b/tools/lib/traceevent/plugins/plugin_futex.c
deleted file mode 100644
index eb7c9f8a850a..000000000000
--- a/tools/lib/traceevent/plugins/plugin_futex.c
+++ /dev/null
@@ -1,123 +0,0 @@
-// SPDX-License-Identifier: LGPL-2.1
-/*
- * Copyright (C) 2017 National Instruments Corp.
- *
- * Author: Julia Cartwright <[email protected]>
- *
- */
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <linux/futex.h>
-
-#include "event-parse.h"
-
-#define ARRAY_SIZE(_a) (sizeof(_a) / sizeof((_a)[0]))
-
-struct futex_args {
- unsigned long long uaddr;
- unsigned long long op;
- unsigned long long val;
- unsigned long long utime; /* or val2 */
- unsigned long long uaddr2;
- unsigned long long val3;
-};
-
-struct futex_op {
- const char *name;
- const char *fmt_val;
- const char *fmt_utime;
- const char *fmt_uaddr2;
- const char *fmt_val3;
-};
-
-static const struct futex_op futex_op_tbl[] = {
- { "FUTEX_WAIT", " val=0x%08llx", " utime=0x%08llx", NULL, NULL },
- { "FUTEX_WAKE", " val=%llu", NULL, NULL, NULL },
- { "FUTEX_FD", " val=%llu", NULL, NULL, NULL },
- { "FUTEX_REQUEUE", " val=%llu", " val2=%llu", " uaddr2=0x%08llx", NULL },
- { "FUTEX_CMP_REQUEUE", " val=%llu", " val2=%llu", " uaddr2=0x%08llx", " val3=0x%08llx" },
- { "FUTEX_WAKE_OP", " val=%llu", " val2=%llu", " uaddr2=0x%08llx", " val3=0x%08llx" },
- { "FUTEX_LOCK_PI", NULL, " utime=0x%08llx", NULL, NULL },
- { "FUTEX_UNLOCK_PI", NULL, NULL, NULL, NULL },
- { "FUTEX_TRYLOCK_PI", NULL, NULL, NULL, NULL },
- { "FUTEX_WAIT_BITSET", " val=0x%08llx", " utime=0x%08llx", NULL, " val3=0x%08llx" },
- { "FUTEX_WAKE_BITSET", " val=%llu", NULL, NULL, " val3=0x%08llx" },
- { "FUTEX_WAIT_REQUEUE_PI", " val=0x%08llx", " utime=0x%08llx", " uaddr2=0x%08llx", " val3=0x%08llx" },
- { "FUTEX_CMP_REQUEUE_PI", " val=%llu", " val2=%llu", " uaddr2=0x%08llx", " val3=0x%08llx" },
-};
-
-
-static void futex_print(struct trace_seq *s, const struct futex_args *args,
- const struct futex_op *fop)
-{
- trace_seq_printf(s, " uaddr=0x%08llx", args->uaddr);
-
- if (fop->fmt_val)
- trace_seq_printf(s, fop->fmt_val, args->val);
-
- if (fop->fmt_utime)
- trace_seq_printf(s,fop->fmt_utime, args->utime);
-
- if (fop->fmt_uaddr2)
- trace_seq_printf(s, fop->fmt_uaddr2, args->uaddr2);
-
- if (fop->fmt_val3)
- trace_seq_printf(s, fop->fmt_val3, args->val3);
-}
-
-static int futex_handler(struct trace_seq *s, struct tep_record *record,
- struct tep_event *event, void *context)
-{
- const struct futex_op *fop;
- struct futex_args args;
- unsigned long long cmd;
-
- if (tep_get_field_val(s, event, "uaddr", record, &args.uaddr, 1))
- return 1;
-
- if (tep_get_field_val(s, event, "op", record, &args.op, 1))
- return 1;
-
- if (tep_get_field_val(s, event, "val", record, &args.val, 1))
- return 1;
-
- if (tep_get_field_val(s, event, "utime", record, &args.utime, 1))
- return 1;
-
- if (tep_get_field_val(s, event, "uaddr2", record, &args.uaddr2, 1))
- return 1;
-
- if (tep_get_field_val(s, event, "val3", record, &args.val3, 1))
- return 1;
-
- cmd = args.op & FUTEX_CMD_MASK;
- if (cmd >= ARRAY_SIZE(futex_op_tbl))
- return 1;
-
- fop = &futex_op_tbl[cmd];
-
- trace_seq_printf(s, "op=%s", fop->name);
-
- if (args.op & FUTEX_PRIVATE_FLAG)
- trace_seq_puts(s, "|FUTEX_PRIVATE_FLAG");
-
- if (args.op & FUTEX_CLOCK_REALTIME)
- trace_seq_puts(s, "|FUTEX_CLOCK_REALTIME");
-
- futex_print(s, &args, fop);
- return 0;
-}
-
-int TEP_PLUGIN_LOADER(struct tep_handle *tep)
-{
- tep_register_event_handler(tep, -1, "syscalls", "sys_enter_futex",
- futex_handler, NULL);
- return 0;
-}
-
-void TEP_PLUGIN_UNLOADER(struct tep_handle *tep)
-{
- tep_unregister_event_handler(tep, -1, "syscalls", "sys_enter_futex",
- futex_handler, NULL);
-}
diff --git a/tools/lib/traceevent/plugins/plugin_hrtimer.c b/tools/lib/traceevent/plugins/plugin_hrtimer.c
deleted file mode 100644
index d98466788f14..000000000000
--- a/tools/lib/traceevent/plugins/plugin_hrtimer.c
+++ /dev/null
@@ -1,74 +0,0 @@
-// SPDX-License-Identifier: LGPL-2.1
-/*
- * Copyright (C) 2009 Red Hat Inc, Steven Rostedt <[email protected]>
- * Copyright (C) 2009 Johannes Berg <[email protected]>
- */
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "event-parse.h"
-#include "trace-seq.h"
-
-static int timer_expire_handler(struct trace_seq *s,
- struct tep_record *record,
- struct tep_event *event, void *context)
-{
- trace_seq_printf(s, "hrtimer=");
-
- if (tep_print_num_field(s, "0x%llx", event, "timer",
- record, 0) == -1)
- tep_print_num_field(s, "0x%llx", event, "hrtimer",
- record, 1);
-
- trace_seq_printf(s, " now=");
-
- tep_print_num_field(s, "%llu", event, "now", record, 1);
-
- tep_print_func_field(s, " function=%s", event, "function",
- record, 0);
- return 0;
-}
-
-static int timer_start_handler(struct trace_seq *s,
- struct tep_record *record,
- struct tep_event *event, void *context)
-{
- trace_seq_printf(s, "hrtimer=");
-
- if (tep_print_num_field(s, "0x%llx", event, "timer",
- record, 0) == -1)
- tep_print_num_field(s, "0x%llx", event, "hrtimer",
- record, 1);
-
- tep_print_func_field(s, " function=%s", event, "function",
- record, 0);
-
- trace_seq_printf(s, " expires=");
- tep_print_num_field(s, "%llu", event, "expires", record, 1);
-
- trace_seq_printf(s, " softexpires=");
- tep_print_num_field(s, "%llu", event, "softexpires", record, 1);
- return 0;
-}
-
-int TEP_PLUGIN_LOADER(struct tep_handle *tep)
-{
- tep_register_event_handler(tep, -1,
- "timer", "hrtimer_expire_entry",
- timer_expire_handler, NULL);
-
- tep_register_event_handler(tep, -1, "timer", "hrtimer_start",
- timer_start_handler, NULL);
- return 0;
-}
-
-void TEP_PLUGIN_UNLOADER(struct tep_handle *tep)
-{
- tep_unregister_event_handler(tep, -1,
- "timer", "hrtimer_expire_entry",
- timer_expire_handler, NULL);
-
- tep_unregister_event_handler(tep, -1, "timer", "hrtimer_start",
- timer_start_handler, NULL);
-}
diff --git a/tools/lib/traceevent/plugins/plugin_jbd2.c b/tools/lib/traceevent/plugins/plugin_jbd2.c
deleted file mode 100644
index 69111a68d3cf..000000000000
--- a/tools/lib/traceevent/plugins/plugin_jbd2.c
+++ /dev/null
@@ -1,61 +0,0 @@
-// SPDX-License-Identifier: LGPL-2.1
-/*
- * Copyright (C) 2010 Red Hat Inc, Steven Rostedt <[email protected]>
- */
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "event-parse.h"
-#include "trace-seq.h"
-
-#define MINORBITS 20
-#define MINORMASK ((1U << MINORBITS) - 1)
-
-#define MAJOR(dev) ((unsigned int) ((dev) >> MINORBITS))
-#define MINOR(dev) ((unsigned int) ((dev) & MINORMASK))
-
-static unsigned long long
-process_jbd2_dev_to_name(struct trace_seq *s, unsigned long long *args)
-{
- unsigned int dev = args[0];
-
- trace_seq_printf(s, "%d:%d", MAJOR(dev), MINOR(dev));
- return 0;
-}
-
-static unsigned long long
-process_jiffies_to_msecs(struct trace_seq *s, unsigned long long *args)
-{
- unsigned long long jiffies = args[0];
-
- trace_seq_printf(s, "%lld", jiffies);
- return jiffies;
-}
-
-int TEP_PLUGIN_LOADER(struct tep_handle *tep)
-{
- tep_register_print_function(tep,
- process_jbd2_dev_to_name,
- TEP_FUNC_ARG_STRING,
- "jbd2_dev_to_name",
- TEP_FUNC_ARG_INT,
- TEP_FUNC_ARG_VOID);
-
- tep_register_print_function(tep,
- process_jiffies_to_msecs,
- TEP_FUNC_ARG_LONG,
- "jiffies_to_msecs",
- TEP_FUNC_ARG_LONG,
- TEP_FUNC_ARG_VOID);
- return 0;
-}
-
-void TEP_PLUGIN_UNLOADER(struct tep_handle *tep)
-{
- tep_unregister_print_function(tep, process_jbd2_dev_to_name,
- "jbd2_dev_to_name");
-
- tep_unregister_print_function(tep, process_jiffies_to_msecs,
- "jiffies_to_msecs");
-}
diff --git a/tools/lib/traceevent/plugins/plugin_kmem.c b/tools/lib/traceevent/plugins/plugin_kmem.c
deleted file mode 100644
index 4b4f7f9616e3..000000000000
--- a/tools/lib/traceevent/plugins/plugin_kmem.c
+++ /dev/null
@@ -1,80 +0,0 @@
-// SPDX-License-Identifier: LGPL-2.1
-/*
- * Copyright (C) 2009 Red Hat Inc, Steven Rostedt <[email protected]>
- */
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "event-parse.h"
-#include "trace-seq.h"
-
-static int call_site_handler(struct trace_seq *s, struct tep_record *record,
- struct tep_event *event, void *context)
-{
- struct tep_format_field *field;
- unsigned long long val, addr;
- void *data = record->data;
- const char *func;
-
- field = tep_find_field(event, "call_site");
- if (!field)
- return 1;
-
- if (tep_read_number_field(field, data, &val))
- return 1;
-
- func = tep_find_function(event->tep, val);
- if (!func)
- return 1;
-
- addr = tep_find_function_address(event->tep, val);
-
- trace_seq_printf(s, "(%s+0x%x) ", func, (int)(val - addr));
- return 1;
-}
-
-int TEP_PLUGIN_LOADER(struct tep_handle *tep)
-{
- tep_register_event_handler(tep, -1, "kmem", "kfree",
- call_site_handler, NULL);
-
- tep_register_event_handler(tep, -1, "kmem", "kmalloc",
- call_site_handler, NULL);
-
- tep_register_event_handler(tep, -1, "kmem", "kmalloc_node",
- call_site_handler, NULL);
-
- tep_register_event_handler(tep, -1, "kmem", "kmem_cache_alloc",
- call_site_handler, NULL);
-
- tep_register_event_handler(tep, -1, "kmem",
- "kmem_cache_alloc_node",
- call_site_handler, NULL);
-
- tep_register_event_handler(tep, -1, "kmem", "kmem_cache_free",
- call_site_handler, NULL);
- return 0;
-}
-
-void TEP_PLUGIN_UNLOADER(struct tep_handle *tep)
-{
- tep_unregister_event_handler(tep, -1, "kmem", "kfree",
- call_site_handler, NULL);
-
- tep_unregister_event_handler(tep, -1, "kmem", "kmalloc",
- call_site_handler, NULL);
-
- tep_unregister_event_handler(tep, -1, "kmem", "kmalloc_node",
- call_site_handler, NULL);
-
- tep_unregister_event_handler(tep, -1, "kmem", "kmem_cache_alloc",
- call_site_handler, NULL);
-
- tep_unregister_event_handler(tep, -1, "kmem",
- "kmem_cache_alloc_node",
- call_site_handler, NULL);
-
- tep_unregister_event_handler(tep, -1, "kmem", "kmem_cache_free",
- call_site_handler, NULL);
-}
diff --git a/tools/lib/traceevent/plugins/plugin_kvm.c b/tools/lib/traceevent/plugins/plugin_kvm.c
deleted file mode 100644
index 9ce7b4b68e3f..000000000000
--- a/tools/lib/traceevent/plugins/plugin_kvm.c
+++ /dev/null
@@ -1,527 +0,0 @@
-// SPDX-License-Identifier: LGPL-2.1
-/*
- * Copyright (C) 2009 Red Hat Inc, Steven Rostedt <[email protected]>
- */
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdint.h>
-
-#include "event-parse.h"
-#include "trace-seq.h"
-
-#ifdef HAVE_UDIS86
-
-#include <udis86.h>
-
-static ud_t ud;
-
-static void init_disassembler(void)
-{
- ud_init(&ud);
- ud_set_syntax(&ud, UD_SYN_ATT);
-}
-
-static const char *disassemble(unsigned char *insn, int len, uint64_t rip,
- int cr0_pe, int eflags_vm,
- int cs_d, int cs_l)
-{
- int mode;
-
- if (!cr0_pe)
- mode = 16;
- else if (eflags_vm)
- mode = 16;
- else if (cs_l)
- mode = 64;
- else if (cs_d)
- mode = 32;
- else
- mode = 16;
-
- ud_set_pc(&ud, rip);
- ud_set_mode(&ud, mode);
- ud_set_input_buffer(&ud, insn, len);
- ud_disassemble(&ud);
- return ud_insn_asm(&ud);
-}
-
-#else
-
-static void init_disassembler(void)
-{
-}
-
-static const char *disassemble(unsigned char *insn, int len, uint64_t rip,
- int cr0_pe, int eflags_vm,
- int cs_d, int cs_l)
-{
- static char out[15*3+1];
- int i;
-
- for (i = 0; i < len; ++i)
- sprintf(out + i * 3, "%02x ", insn[i]);
- out[len*3-1] = '\0';
- return out;
-}
-
-#endif
-
-
-#define VMX_EXIT_REASONS \
- _ER(EXCEPTION_NMI, 0) \
- _ER(EXTERNAL_INTERRUPT, 1) \
- _ER(TRIPLE_FAULT, 2) \
- _ER(PENDING_INTERRUPT, 7) \
- _ER(NMI_WINDOW, 8) \
- _ER(TASK_SWITCH, 9) \
- _ER(CPUID, 10) \
- _ER(HLT, 12) \
- _ER(INVD, 13) \
- _ER(INVLPG, 14) \
- _ER(RDPMC, 15) \
- _ER(RDTSC, 16) \
- _ER(VMCALL, 18) \
- _ER(VMCLEAR, 19) \
- _ER(VMLAUNCH, 20) \
- _ER(VMPTRLD, 21) \
- _ER(VMPTRST, 22) \
- _ER(VMREAD, 23) \
- _ER(VMRESUME, 24) \
- _ER(VMWRITE, 25) \
- _ER(VMOFF, 26) \
- _ER(VMON, 27) \
- _ER(CR_ACCESS, 28) \
- _ER(DR_ACCESS, 29) \
- _ER(IO_INSTRUCTION, 30) \
- _ER(MSR_READ, 31) \
- _ER(MSR_WRITE, 32) \
- _ER(MWAIT_INSTRUCTION, 36) \
- _ER(MONITOR_INSTRUCTION, 39) \
- _ER(PAUSE_INSTRUCTION, 40) \
- _ER(MCE_DURING_VMENTRY, 41) \
- _ER(TPR_BELOW_THRESHOLD, 43) \
- _ER(APIC_ACCESS, 44) \
- _ER(EOI_INDUCED, 45) \
- _ER(EPT_VIOLATION, 48) \
- _ER(EPT_MISCONFIG, 49) \
- _ER(INVEPT, 50) \
- _ER(PREEMPTION_TIMER, 52) \
- _ER(WBINVD, 54) \
- _ER(XSETBV, 55) \
- _ER(APIC_WRITE, 56) \
- _ER(INVPCID, 58) \
- _ER(PML_FULL, 62) \
- _ER(XSAVES, 63) \
- _ER(XRSTORS, 64)
-
-#define SVM_EXIT_REASONS \
- _ER(EXIT_READ_CR0, 0x000) \
- _ER(EXIT_READ_CR3, 0x003) \
- _ER(EXIT_READ_CR4, 0x004) \
- _ER(EXIT_READ_CR8, 0x008) \
- _ER(EXIT_WRITE_CR0, 0x010) \
- _ER(EXIT_WRITE_CR3, 0x013) \
- _ER(EXIT_WRITE_CR4, 0x014) \
- _ER(EXIT_WRITE_CR8, 0x018) \
- _ER(EXIT_READ_DR0, 0x020) \
- _ER(EXIT_READ_DR1, 0x021) \
- _ER(EXIT_READ_DR2, 0x022) \
- _ER(EXIT_READ_DR3, 0x023) \
- _ER(EXIT_READ_DR4, 0x024) \
- _ER(EXIT_READ_DR5, 0x025) \
- _ER(EXIT_READ_DR6, 0x026) \
- _ER(EXIT_READ_DR7, 0x027) \
- _ER(EXIT_WRITE_DR0, 0x030) \
- _ER(EXIT_WRITE_DR1, 0x031) \
- _ER(EXIT_WRITE_DR2, 0x032) \
- _ER(EXIT_WRITE_DR3, 0x033) \
- _ER(EXIT_WRITE_DR4, 0x034) \
- _ER(EXIT_WRITE_DR5, 0x035) \
- _ER(EXIT_WRITE_DR6, 0x036) \
- _ER(EXIT_WRITE_DR7, 0x037) \
- _ER(EXIT_EXCP_DE, 0x040) \
- _ER(EXIT_EXCP_DB, 0x041) \
- _ER(EXIT_EXCP_BP, 0x043) \
- _ER(EXIT_EXCP_OF, 0x044) \
- _ER(EXIT_EXCP_BR, 0x045) \
- _ER(EXIT_EXCP_UD, 0x046) \
- _ER(EXIT_EXCP_NM, 0x047) \
- _ER(EXIT_EXCP_DF, 0x048) \
- _ER(EXIT_EXCP_TS, 0x04a) \
- _ER(EXIT_EXCP_NP, 0x04b) \
- _ER(EXIT_EXCP_SS, 0x04c) \
- _ER(EXIT_EXCP_GP, 0x04d) \
- _ER(EXIT_EXCP_PF, 0x04e) \
- _ER(EXIT_EXCP_MF, 0x050) \
- _ER(EXIT_EXCP_AC, 0x051) \
- _ER(EXIT_EXCP_MC, 0x052) \
- _ER(EXIT_EXCP_XF, 0x053) \
- _ER(EXIT_INTR, 0x060) \
- _ER(EXIT_NMI, 0x061) \
- _ER(EXIT_SMI, 0x062) \
- _ER(EXIT_INIT, 0x063) \
- _ER(EXIT_VINTR, 0x064) \
- _ER(EXIT_CR0_SEL_WRITE, 0x065) \
- _ER(EXIT_IDTR_READ, 0x066) \
- _ER(EXIT_GDTR_READ, 0x067) \
- _ER(EXIT_LDTR_READ, 0x068) \
- _ER(EXIT_TR_READ, 0x069) \
- _ER(EXIT_IDTR_WRITE, 0x06a) \
- _ER(EXIT_GDTR_WRITE, 0x06b) \
- _ER(EXIT_LDTR_WRITE, 0x06c) \
- _ER(EXIT_TR_WRITE, 0x06d) \
- _ER(EXIT_RDTSC, 0x06e) \
- _ER(EXIT_RDPMC, 0x06f) \
- _ER(EXIT_PUSHF, 0x070) \
- _ER(EXIT_POPF, 0x071) \
- _ER(EXIT_CPUID, 0x072) \
- _ER(EXIT_RSM, 0x073) \
- _ER(EXIT_IRET, 0x074) \
- _ER(EXIT_SWINT, 0x075) \
- _ER(EXIT_INVD, 0x076) \
- _ER(EXIT_PAUSE, 0x077) \
- _ER(EXIT_HLT, 0x078) \
- _ER(EXIT_INVLPG, 0x079) \
- _ER(EXIT_INVLPGA, 0x07a) \
- _ER(EXIT_IOIO, 0x07b) \
- _ER(EXIT_MSR, 0x07c) \
- _ER(EXIT_TASK_SWITCH, 0x07d) \
- _ER(EXIT_FERR_FREEZE, 0x07e) \
- _ER(EXIT_SHUTDOWN, 0x07f) \
- _ER(EXIT_VMRUN, 0x080) \
- _ER(EXIT_VMMCALL, 0x081) \
- _ER(EXIT_VMLOAD, 0x082) \
- _ER(EXIT_VMSAVE, 0x083) \
- _ER(EXIT_STGI, 0x084) \
- _ER(EXIT_CLGI, 0x085) \
- _ER(EXIT_SKINIT, 0x086) \
- _ER(EXIT_RDTSCP, 0x087) \
- _ER(EXIT_ICEBP, 0x088) \
- _ER(EXIT_WBINVD, 0x089) \
- _ER(EXIT_MONITOR, 0x08a) \
- _ER(EXIT_MWAIT, 0x08b) \
- _ER(EXIT_MWAIT_COND, 0x08c) \
- _ER(EXIT_XSETBV, 0x08d) \
- _ER(EXIT_NPF, 0x400) \
- _ER(EXIT_AVIC_INCOMPLETE_IPI, 0x401) \
- _ER(EXIT_AVIC_UNACCELERATED_ACCESS, 0x402) \
- _ER(EXIT_ERR, -1)
-
-#define _ER(reason, val) { #reason, val },
-struct str_values {
- const char *str;
- int val;
-};
-
-static struct str_values vmx_exit_reasons[] = {
- VMX_EXIT_REASONS
- { NULL, -1}
-};
-
-static struct str_values svm_exit_reasons[] = {
- SVM_EXIT_REASONS
- { NULL, -1}
-};
-
-static struct isa_exit_reasons {
- unsigned isa;
- struct str_values *strings;
-} isa_exit_reasons[] = {
- { .isa = 1, .strings = vmx_exit_reasons },
- { .isa = 2, .strings = svm_exit_reasons },
- { }
-};
-
-static const char *find_exit_reason(unsigned isa, int val)
-{
- struct str_values *strings = NULL;
- int i;
-
- for (i = 0; isa_exit_reasons[i].strings; ++i)
- if (isa_exit_reasons[i].isa == isa) {
- strings = isa_exit_reasons[i].strings;
- break;
- }
- if (!strings)
- return "UNKNOWN-ISA";
- for (i = 0; strings[i].str; i++)
- if (strings[i].val == val)
- break;
-
- return strings[i].str;
-}
-
-static int print_exit_reason(struct trace_seq *s, struct tep_record *record,
- struct tep_event *event, const char *field)
-{
- unsigned long long isa;
- unsigned long long val;
- const char *reason;
-
- if (tep_get_field_val(s, event, field, record, &val, 1) < 0)
- return -1;
-
- if (tep_get_field_val(s, event, "isa", record, &isa, 0) < 0)
- isa = 1;
-
- reason = find_exit_reason(isa, val);
- if (reason)
- trace_seq_printf(s, "reason %s", reason);
- else
- trace_seq_printf(s, "reason UNKNOWN (%llu)", val);
- return 0;
-}
-
-static int kvm_exit_handler(struct trace_seq *s, struct tep_record *record,
- struct tep_event *event, void *context)
-{
- unsigned long long info1 = 0, info2 = 0;
-
- if (print_exit_reason(s, record, event, "exit_reason") < 0)
- return -1;
-
- tep_print_num_field(s, " rip 0x%lx", event, "guest_rip", record, 1);
-
- if (tep_get_field_val(s, event, "info1", record, &info1, 0) >= 0
- && tep_get_field_val(s, event, "info2", record, &info2, 0) >= 0)
- trace_seq_printf(s, " info %llx %llx", info1, info2);
-
- return 0;
-}
-
-#define KVM_EMUL_INSN_F_CR0_PE (1 << 0)
-#define KVM_EMUL_INSN_F_EFL_VM (1 << 1)
-#define KVM_EMUL_INSN_F_CS_D (1 << 2)
-#define KVM_EMUL_INSN_F_CS_L (1 << 3)
-
-static int kvm_emulate_insn_handler(struct trace_seq *s,
- struct tep_record *record,
- struct tep_event *event, void *context)
-{
- unsigned long long rip, csbase, len, flags, failed;
- int llen;
- uint8_t *insn;
- const char *disasm;
-
- if (tep_get_field_val(s, event, "rip", record, &rip, 1) < 0)
- return -1;
-
- if (tep_get_field_val(s, event, "csbase", record, &csbase, 1) < 0)
- return -1;
-
- if (tep_get_field_val(s, event, "len", record, &len, 1) < 0)
- return -1;
-
- if (tep_get_field_val(s, event, "flags", record, &flags, 1) < 0)
- return -1;
-
- if (tep_get_field_val(s, event, "failed", record, &failed, 1) < 0)
- return -1;
-
- insn = tep_get_field_raw(s, event, "insn", record, &llen, 1);
- if (!insn)
- return -1;
-
- disasm = disassemble(insn, len, rip,
- flags & KVM_EMUL_INSN_F_CR0_PE,
- flags & KVM_EMUL_INSN_F_EFL_VM,
- flags & KVM_EMUL_INSN_F_CS_D,
- flags & KVM_EMUL_INSN_F_CS_L);
-
- trace_seq_printf(s, "%llx:%llx: %s%s", csbase, rip, disasm,
- failed ? " FAIL" : "");
- return 0;
-}
-
-
-static int kvm_nested_vmexit_inject_handler(struct trace_seq *s, struct tep_record *record,
- struct tep_event *event, void *context)
-{
- if (print_exit_reason(s, record, event, "exit_code") < 0)
- return -1;
-
- tep_print_num_field(s, " info1 %llx", event, "exit_info1", record, 1);
- tep_print_num_field(s, " info2 %llx", event, "exit_info2", record, 1);
- tep_print_num_field(s, " int_info %llx", event, "exit_int_info", record, 1);
- tep_print_num_field(s, " int_info_err %llx", event, "exit_int_info_err", record, 1);
-
- return 0;
-}
-
-static int kvm_nested_vmexit_handler(struct trace_seq *s, struct tep_record *record,
- struct tep_event *event, void *context)
-{
- tep_print_num_field(s, "rip %llx ", event, "rip", record, 1);
-
- return kvm_nested_vmexit_inject_handler(s, record, event, context);
-}
-
-union kvm_mmu_page_role {
- unsigned word;
- struct {
- unsigned level:4;
- unsigned cr4_pae:1;
- unsigned quadrant:2;
- unsigned direct:1;
- unsigned access:3;
- unsigned invalid:1;
- unsigned efer_nx:1;
- unsigned cr0_wp:1;
- unsigned smep_and_not_wp:1;
- unsigned smap_and_not_wp:1;
- unsigned pad_for_nice_hex_output:8;
- unsigned smm:8;
- };
-};
-
-static int kvm_mmu_print_role(struct trace_seq *s, struct tep_record *record,
- struct tep_event *event, void *context)
-{
- unsigned long long val;
- static const char *access_str[] = {
- "---", "--x", "w--", "w-x", "-u-", "-ux", "wu-", "wux"
- };
- union kvm_mmu_page_role role;
-
- if (tep_get_field_val(s, event, "role", record, &val, 1) < 0)
- return -1;
-
- role.word = (int)val;
-
- /*
- * We can only use the structure if file is of the same
- * endianness.
- */
- if (tep_is_file_bigendian(event->tep) ==
- tep_is_local_bigendian(event->tep)) {
-
- trace_seq_printf(s, "%u q%u%s %s%s %spae %snxe %swp%s%s%s",
- role.level,
- role.quadrant,
- role.direct ? " direct" : "",
- access_str[role.access],
- role.invalid ? " invalid" : "",
- role.cr4_pae ? "" : "!",
- role.efer_nx ? "" : "!",
- role.cr0_wp ? "" : "!",
- role.smep_and_not_wp ? " smep" : "",
- role.smap_and_not_wp ? " smap" : "",
- role.smm ? " smm" : "");
- } else
- trace_seq_printf(s, "WORD: %08x", role.word);
-
- tep_print_num_field(s, " root %u ", event,
- "root_count", record, 1);
-
- if (tep_get_field_val(s, event, "unsync", record, &val, 1) < 0)
- return -1;
-
- trace_seq_printf(s, "%s%c", val ? "unsync" : "sync", 0);
- return 0;
-}
-
-static int kvm_mmu_get_page_handler(struct trace_seq *s,
- struct tep_record *record,
- struct tep_event *event, void *context)
-{
- unsigned long long val;
-
- if (tep_get_field_val(s, event, "created", record, &val, 1) < 0)
- return -1;
-
- trace_seq_printf(s, "%s ", val ? "new" : "existing");
-
- if (tep_get_field_val(s, event, "gfn", record, &val, 1) < 0)
- return -1;
-
- trace_seq_printf(s, "sp gfn %llx ", val);
- return kvm_mmu_print_role(s, record, event, context);
-}
-
-#define PT_WRITABLE_SHIFT 1
-#define PT_WRITABLE_MASK (1ULL << PT_WRITABLE_SHIFT)
-
-static unsigned long long
-process_is_writable_pte(struct trace_seq *s, unsigned long long *args)
-{
- unsigned long pte = args[0];
- return pte & PT_WRITABLE_MASK;
-}
-
-int TEP_PLUGIN_LOADER(struct tep_handle *tep)
-{
- init_disassembler();
-
- tep_register_event_handler(tep, -1, "kvm", "kvm_exit",
- kvm_exit_handler, NULL);
-
- tep_register_event_handler(tep, -1, "kvm", "kvm_emulate_insn",
- kvm_emulate_insn_handler, NULL);
-
- tep_register_event_handler(tep, -1, "kvm", "kvm_nested_vmexit",
- kvm_nested_vmexit_handler, NULL);
-
- tep_register_event_handler(tep, -1, "kvm", "kvm_nested_vmexit_inject",
- kvm_nested_vmexit_inject_handler, NULL);
-
- tep_register_event_handler(tep, -1, "kvmmmu", "kvm_mmu_get_page",
- kvm_mmu_get_page_handler, NULL);
-
- tep_register_event_handler(tep, -1, "kvmmmu", "kvm_mmu_sync_page",
- kvm_mmu_print_role, NULL);
-
- tep_register_event_handler(tep, -1,
- "kvmmmu", "kvm_mmu_unsync_page",
- kvm_mmu_print_role, NULL);
-
- tep_register_event_handler(tep, -1, "kvmmmu", "kvm_mmu_zap_page",
- kvm_mmu_print_role, NULL);
-
- tep_register_event_handler(tep, -1, "kvmmmu",
- "kvm_mmu_prepare_zap_page", kvm_mmu_print_role,
- NULL);
-
- tep_register_print_function(tep,
- process_is_writable_pte,
- TEP_FUNC_ARG_INT,
- "is_writable_pte",
- TEP_FUNC_ARG_LONG,
- TEP_FUNC_ARG_VOID);
- return 0;
-}
-
-void TEP_PLUGIN_UNLOADER(struct tep_handle *tep)
-{
- tep_unregister_event_handler(tep, -1, "kvm", "kvm_exit",
- kvm_exit_handler, NULL);
-
- tep_unregister_event_handler(tep, -1, "kvm", "kvm_emulate_insn",
- kvm_emulate_insn_handler, NULL);
-
- tep_unregister_event_handler(tep, -1, "kvm", "kvm_nested_vmexit",
- kvm_nested_vmexit_handler, NULL);
-
- tep_unregister_event_handler(tep, -1, "kvm", "kvm_nested_vmexit_inject",
- kvm_nested_vmexit_inject_handler, NULL);
-
- tep_unregister_event_handler(tep, -1, "kvmmmu", "kvm_mmu_get_page",
- kvm_mmu_get_page_handler, NULL);
-
- tep_unregister_event_handler(tep, -1, "kvmmmu", "kvm_mmu_sync_page",
- kvm_mmu_print_role, NULL);
-
- tep_unregister_event_handler(tep, -1,
- "kvmmmu", "kvm_mmu_unsync_page",
- kvm_mmu_print_role, NULL);
-
- tep_unregister_event_handler(tep, -1, "kvmmmu", "kvm_mmu_zap_page",
- kvm_mmu_print_role, NULL);
-
- tep_unregister_event_handler(tep, -1, "kvmmmu",
- "kvm_mmu_prepare_zap_page", kvm_mmu_print_role,
- NULL);
-
- tep_unregister_print_function(tep, process_is_writable_pte,
- "is_writable_pte");
-}
diff --git a/tools/lib/traceevent/plugins/plugin_mac80211.c b/tools/lib/traceevent/plugins/plugin_mac80211.c
deleted file mode 100644
index f48071e3cfb8..000000000000
--- a/tools/lib/traceevent/plugins/plugin_mac80211.c
+++ /dev/null
@@ -1,88 +0,0 @@
-// SPDX-License-Identifier: LGPL-2.1
-/*
- * Copyright (C) 2009 Johannes Berg <[email protected]>
- */
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "event-parse.h"
-#include "trace-seq.h"
-
-#define INDENT 65
-
-static void print_string(struct trace_seq *s, struct tep_event *event,
- const char *name, const void *data)
-{
- struct tep_format_field *f = tep_find_field(event, name);
- int offset;
- int length;
-
- if (!f) {
- trace_seq_printf(s, "NOTFOUND:%s", name);
- return;
- }
-
- offset = f->offset;
- length = f->size;
-
- if (!strncmp(f->type, "__data_loc", 10)) {
- unsigned long long v;
- if (tep_read_number_field(f, data, &v)) {
- trace_seq_printf(s, "invalid_data_loc");
- return;
- }
- offset = v & 0xffff;
- length = v >> 16;
- }
-
- trace_seq_printf(s, "%.*s", length, (char *)data + offset);
-}
-
-#define SF(fn) tep_print_num_field(s, fn ":%d", event, fn, record, 0)
-#define SFX(fn) tep_print_num_field(s, fn ":%#x", event, fn, record, 0)
-#define SP() trace_seq_putc(s, ' ')
-
-static int drv_bss_info_changed(struct trace_seq *s,
- struct tep_record *record,
- struct tep_event *event, void *context)
-{
- void *data = record->data;
-
- print_string(s, event, "wiphy_name", data);
- trace_seq_printf(s, " vif:");
- print_string(s, event, "vif_name", data);
- tep_print_num_field(s, "(%d)", event, "vif_type", record, 1);
-
- trace_seq_printf(s, "\n%*s", INDENT, "");
- SF("assoc"); SP();
- SF("aid"); SP();
- SF("cts"); SP();
- SF("shortpre"); SP();
- SF("shortslot"); SP();
- SF("dtimper"); SP();
- trace_seq_printf(s, "\n%*s", INDENT, "");
- SF("bcnint"); SP();
- SFX("assoc_cap"); SP();
- SFX("basic_rates"); SP();
- SF("enable_beacon");
- trace_seq_printf(s, "\n%*s", INDENT, "");
- SF("ht_operation_mode");
-
- return 0;
-}
-
-int TEP_PLUGIN_LOADER(struct tep_handle *tep)
-{
- tep_register_event_handler(tep, -1, "mac80211",
- "drv_bss_info_changed",
- drv_bss_info_changed, NULL);
- return 0;
-}
-
-void TEP_PLUGIN_UNLOADER(struct tep_handle *tep)
-{
- tep_unregister_event_handler(tep, -1, "mac80211",
- "drv_bss_info_changed",
- drv_bss_info_changed, NULL);
-}
diff --git a/tools/lib/traceevent/plugins/plugin_sched_switch.c b/tools/lib/traceevent/plugins/plugin_sched_switch.c
deleted file mode 100644
index e12fa103820a..000000000000
--- a/tools/lib/traceevent/plugins/plugin_sched_switch.c
+++ /dev/null
@@ -1,146 +0,0 @@
-// SPDX-License-Identifier: LGPL-2.1
-/*
- * Copyright (C) 2009, 2010 Red Hat Inc, Steven Rostedt <[email protected]>
- */
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "event-parse.h"
-#include "trace-seq.h"
-
-static void write_state(struct trace_seq *s, int val)
-{
- const char states[] = "SDTtZXxW";
- int found = 0;
- int i;
-
- for (i = 0; i < (sizeof(states) - 1); i++) {
- if (!(val & (1 << i)))
- continue;
-
- if (found)
- trace_seq_putc(s, '|');
-
- found = 1;
- trace_seq_putc(s, states[i]);
- }
-
- if (!found)
- trace_seq_putc(s, 'R');
-}
-
-static void write_and_save_comm(struct tep_format_field *field,
- struct tep_record *record,
- struct trace_seq *s, int pid)
-{
- const char *comm;
- int len;
-
- comm = (char *)(record->data + field->offset);
- len = s->len;
- trace_seq_printf(s, "%.*s",
- field->size, comm);
-
- /* make sure the comm has a \0 at the end. */
- trace_seq_terminate(s);
- comm = &s->buffer[len];
-
- /* Help out the comm to ids. This will handle dups */
- tep_register_comm(field->event->tep, comm, pid);
-}
-
-static int sched_wakeup_handler(struct trace_seq *s,
- struct tep_record *record,
- struct tep_event *event, void *context)
-{
- struct tep_format_field *field;
- unsigned long long val;
-
- if (tep_get_field_val(s, event, "pid", record, &val, 1))
- return trace_seq_putc(s, '!');
-
- field = tep_find_any_field(event, "comm");
- if (field) {
- write_and_save_comm(field, record, s, val);
- trace_seq_putc(s, ':');
- }
- trace_seq_printf(s, "%lld", val);
-
- if (tep_get_field_val(s, event, "prio", record, &val, 0) == 0)
- trace_seq_printf(s, " [%lld]", val);
-
- if (tep_get_field_val(s, event, "success", record, &val, 1) == 0)
- trace_seq_printf(s, " success=%lld", val);
-
- if (tep_get_field_val(s, event, "target_cpu", record, &val, 0) == 0)
- trace_seq_printf(s, " CPU:%03llu", val);
-
- return 0;
-}
-
-static int sched_switch_handler(struct trace_seq *s,
- struct tep_record *record,
- struct tep_event *event, void *context)
-{
- struct tep_format_field *field;
- unsigned long long val;
-
- if (tep_get_field_val(s, event, "prev_pid", record, &val, 1))
- return trace_seq_putc(s, '!');
-
- field = tep_find_any_field(event, "prev_comm");
- if (field) {
- write_and_save_comm(field, record, s, val);
- trace_seq_putc(s, ':');
- }
- trace_seq_printf(s, "%lld ", val);
-
- if (tep_get_field_val(s, event, "prev_prio", record, &val, 0) == 0)
- trace_seq_printf(s, "[%d] ", (int) val);
-
- if (tep_get_field_val(s, event, "prev_state", record, &val, 0) == 0)
- write_state(s, val);
-
- trace_seq_puts(s, " ==> ");
-
- if (tep_get_field_val(s, event, "next_pid", record, &val, 1))
- return trace_seq_putc(s, '!');
-
- field = tep_find_any_field(event, "next_comm");
- if (field) {
- write_and_save_comm(field, record, s, val);
- trace_seq_putc(s, ':');
- }
- trace_seq_printf(s, "%lld", val);
-
- if (tep_get_field_val(s, event, "next_prio", record, &val, 0) == 0)
- trace_seq_printf(s, " [%d]", (int) val);
-
- return 0;
-}
-
-int TEP_PLUGIN_LOADER(struct tep_handle *tep)
-{
- tep_register_event_handler(tep, -1, "sched", "sched_switch",
- sched_switch_handler, NULL);
-
- tep_register_event_handler(tep, -1, "sched", "sched_wakeup",
- sched_wakeup_handler, NULL);
-
- tep_register_event_handler(tep, -1, "sched", "sched_wakeup_new",
- sched_wakeup_handler, NULL);
- return 0;
-}
-
-void TEP_PLUGIN_UNLOADER(struct tep_handle *tep)
-{
- tep_unregister_event_handler(tep, -1, "sched", "sched_switch",
- sched_switch_handler, NULL);
-
- tep_unregister_event_handler(tep, -1, "sched", "sched_wakeup",
- sched_wakeup_handler, NULL);
-
- tep_unregister_event_handler(tep, -1, "sched", "sched_wakeup_new",
- sched_wakeup_handler, NULL);
-}
diff --git a/tools/lib/traceevent/plugins/plugin_scsi.c b/tools/lib/traceevent/plugins/plugin_scsi.c
deleted file mode 100644
index 5d0387a4b65a..000000000000
--- a/tools/lib/traceevent/plugins/plugin_scsi.c
+++ /dev/null
@@ -1,434 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-#include <stdio.h>
-#include <string.h>
-#include <inttypes.h>
-#include "event-parse.h"
-#include "trace-seq.h"
-
-typedef unsigned long sector_t;
-typedef uint64_t u64;
-typedef unsigned int u32;
-
-/*
- * SCSI opcodes
- */
-#define TEST_UNIT_READY 0x00
-#define REZERO_UNIT 0x01
-#define REQUEST_SENSE 0x03
-#define FORMAT_UNIT 0x04
-#define READ_BLOCK_LIMITS 0x05
-#define REASSIGN_BLOCKS 0x07
-#define INITIALIZE_ELEMENT_STATUS 0x07
-#define READ_6 0x08
-#define WRITE_6 0x0a
-#define SEEK_6 0x0b
-#define READ_REVERSE 0x0f
-#define WRITE_FILEMARKS 0x10
-#define SPACE 0x11
-#define INQUIRY 0x12
-#define RECOVER_BUFFERED_DATA 0x14
-#define MODE_SELECT 0x15
-#define RESERVE 0x16
-#define RELEASE 0x17
-#define COPY 0x18
-#define ERASE 0x19
-#define MODE_SENSE 0x1a
-#define START_STOP 0x1b
-#define RECEIVE_DIAGNOSTIC 0x1c
-#define SEND_DIAGNOSTIC 0x1d
-#define ALLOW_MEDIUM_REMOVAL 0x1e
-
-#define READ_FORMAT_CAPACITIES 0x23
-#define SET_WINDOW 0x24
-#define READ_CAPACITY 0x25
-#define READ_10 0x28
-#define WRITE_10 0x2a
-#define SEEK_10 0x2b
-#define POSITION_TO_ELEMENT 0x2b
-#define WRITE_VERIFY 0x2e
-#define VERIFY 0x2f
-#define SEARCH_HIGH 0x30
-#define SEARCH_EQUAL 0x31
-#define SEARCH_LOW 0x32
-#define SET_LIMITS 0x33
-#define PRE_FETCH 0x34
-#define READ_POSITION 0x34
-#define SYNCHRONIZE_CACHE 0x35
-#define LOCK_UNLOCK_CACHE 0x36
-#define READ_DEFECT_DATA 0x37
-#define MEDIUM_SCAN 0x38
-#define COMPARE 0x39
-#define COPY_VERIFY 0x3a
-#define WRITE_BUFFER 0x3b
-#define READ_BUFFER 0x3c
-#define UPDATE_BLOCK 0x3d
-#define READ_LONG 0x3e
-#define WRITE_LONG 0x3f
-#define CHANGE_DEFINITION 0x40
-#define WRITE_SAME 0x41
-#define UNMAP 0x42
-#define READ_TOC 0x43
-#define READ_HEADER 0x44
-#define GET_EVENT_STATUS_NOTIFICATION 0x4a
-#define LOG_SELECT 0x4c
-#define LOG_SENSE 0x4d
-#define XDWRITEREAD_10 0x53
-#define MODE_SELECT_10 0x55
-#define RESERVE_10 0x56
-#define RELEASE_10 0x57
-#define MODE_SENSE_10 0x5a
-#define PERSISTENT_RESERVE_IN 0x5e
-#define PERSISTENT_RESERVE_OUT 0x5f
-#define VARIABLE_LENGTH_CMD 0x7f
-#define REPORT_LUNS 0xa0
-#define SECURITY_PROTOCOL_IN 0xa2
-#define MAINTENANCE_IN 0xa3
-#define MAINTENANCE_OUT 0xa4
-#define MOVE_MEDIUM 0xa5
-#define EXCHANGE_MEDIUM 0xa6
-#define READ_12 0xa8
-#define SERVICE_ACTION_OUT_12 0xa9
-#define WRITE_12 0xaa
-#define SERVICE_ACTION_IN_12 0xab
-#define WRITE_VERIFY_12 0xae
-#define VERIFY_12 0xaf
-#define SEARCH_HIGH_12 0xb0
-#define SEARCH_EQUAL_12 0xb1
-#define SEARCH_LOW_12 0xb2
-#define SECURITY_PROTOCOL_OUT 0xb5
-#define READ_ELEMENT_STATUS 0xb8
-#define SEND_VOLUME_TAG 0xb6
-#define WRITE_LONG_2 0xea
-#define EXTENDED_COPY 0x83
-#define RECEIVE_COPY_RESULTS 0x84
-#define ACCESS_CONTROL_IN 0x86
-#define ACCESS_CONTROL_OUT 0x87
-#define READ_16 0x88
-#define WRITE_16 0x8a
-#define READ_ATTRIBUTE 0x8c
-#define WRITE_ATTRIBUTE 0x8d
-#define VERIFY_16 0x8f
-#define SYNCHRONIZE_CACHE_16 0x91
-#define WRITE_SAME_16 0x93
-#define SERVICE_ACTION_BIDIRECTIONAL 0x9d
-#define SERVICE_ACTION_IN_16 0x9e
-#define SERVICE_ACTION_OUT_16 0x9f
-/* values for service action in */
-#define SAI_READ_CAPACITY_16 0x10
-#define SAI_GET_LBA_STATUS 0x12
-/* values for VARIABLE_LENGTH_CMD service action codes
- * see spc4r17 Section D.3.5, table D.7 and D.8 */
-#define VLC_SA_RECEIVE_CREDENTIAL 0x1800
-/* values for maintenance in */
-#define MI_REPORT_IDENTIFYING_INFORMATION 0x05
-#define MI_REPORT_TARGET_PGS 0x0a
-#define MI_REPORT_ALIASES 0x0b
-#define MI_REPORT_SUPPORTED_OPERATION_CODES 0x0c
-#define MI_REPORT_SUPPORTED_TASK_MANAGEMENT_FUNCTIONS 0x0d
-#define MI_REPORT_PRIORITY 0x0e
-#define MI_REPORT_TIMESTAMP 0x0f
-#define MI_MANAGEMENT_PROTOCOL_IN 0x10
-/* value for MI_REPORT_TARGET_PGS ext header */
-#define MI_EXT_HDR_PARAM_FMT 0x20
-/* values for maintenance out */
-#define MO_SET_IDENTIFYING_INFORMATION 0x06
-#define MO_SET_TARGET_PGS 0x0a
-#define MO_CHANGE_ALIASES 0x0b
-#define MO_SET_PRIORITY 0x0e
-#define MO_SET_TIMESTAMP 0x0f
-#define MO_MANAGEMENT_PROTOCOL_OUT 0x10
-/* values for variable length command */
-#define XDREAD_32 0x03
-#define XDWRITE_32 0x04
-#define XPWRITE_32 0x06
-#define XDWRITEREAD_32 0x07
-#define READ_32 0x09
-#define VERIFY_32 0x0a
-#define WRITE_32 0x0b
-#define WRITE_SAME_32 0x0d
-
-#define SERVICE_ACTION16(cdb) (cdb[1] & 0x1f)
-#define SERVICE_ACTION32(cdb) ((cdb[8] << 8) | cdb[9])
-
-static const char *
-scsi_trace_misc(struct trace_seq *, unsigned char *, int);
-
-static const char *
-scsi_trace_rw6(struct trace_seq *p, unsigned char *cdb, int len)
-{
- const char *ret = p->buffer + p->len;
- sector_t lba = 0, txlen = 0;
-
- lba |= ((cdb[1] & 0x1F) << 16);
- lba |= (cdb[2] << 8);
- lba |= cdb[3];
- txlen = cdb[4];
-
- trace_seq_printf(p, "lba=%llu txlen=%llu",
- (unsigned long long)lba, (unsigned long long)txlen);
- trace_seq_putc(p, 0);
- return ret;
-}
-
-static const char *
-scsi_trace_rw10(struct trace_seq *p, unsigned char *cdb, int len)
-{
- const char *ret = p->buffer + p->len;
- sector_t lba = 0, txlen = 0;
-
- lba |= (cdb[2] << 24);
- lba |= (cdb[3] << 16);
- lba |= (cdb[4] << 8);
- lba |= cdb[5];
- txlen |= (cdb[7] << 8);
- txlen |= cdb[8];
-
- trace_seq_printf(p, "lba=%llu txlen=%llu protect=%u",
- (unsigned long long)lba, (unsigned long long)txlen,
- cdb[1] >> 5);
-
- if (cdb[0] == WRITE_SAME)
- trace_seq_printf(p, " unmap=%u", cdb[1] >> 3 & 1);
-
- trace_seq_putc(p, 0);
- return ret;
-}
-
-static const char *
-scsi_trace_rw12(struct trace_seq *p, unsigned char *cdb, int len)
-{
- const char *ret = p->buffer + p->len;
- sector_t lba = 0, txlen = 0;
-
- lba |= (cdb[2] << 24);
- lba |= (cdb[3] << 16);
- lba |= (cdb[4] << 8);
- lba |= cdb[5];
- txlen |= (cdb[6] << 24);
- txlen |= (cdb[7] << 16);
- txlen |= (cdb[8] << 8);
- txlen |= cdb[9];
-
- trace_seq_printf(p, "lba=%llu txlen=%llu protect=%u",
- (unsigned long long)lba, (unsigned long long)txlen,
- cdb[1] >> 5);
- trace_seq_putc(p, 0);
- return ret;
-}
-
-static const char *
-scsi_trace_rw16(struct trace_seq *p, unsigned char *cdb, int len)
-{
- const char *ret = p->buffer + p->len;
- sector_t lba = 0, txlen = 0;
-
- lba |= ((u64)cdb[2] << 56);
- lba |= ((u64)cdb[3] << 48);
- lba |= ((u64)cdb[4] << 40);
- lba |= ((u64)cdb[5] << 32);
- lba |= (cdb[6] << 24);
- lba |= (cdb[7] << 16);
- lba |= (cdb[8] << 8);
- lba |= cdb[9];
- txlen |= (cdb[10] << 24);
- txlen |= (cdb[11] << 16);
- txlen |= (cdb[12] << 8);
- txlen |= cdb[13];
-
- trace_seq_printf(p, "lba=%llu txlen=%llu protect=%u",
- (unsigned long long)lba, (unsigned long long)txlen,
- cdb[1] >> 5);
-
- if (cdb[0] == WRITE_SAME_16)
- trace_seq_printf(p, " unmap=%u", cdb[1] >> 3 & 1);
-
- trace_seq_putc(p, 0);
- return ret;
-}
-
-static const char *
-scsi_trace_rw32(struct trace_seq *p, unsigned char *cdb, int len)
-{
- const char *ret = p->buffer + p->len, *cmd;
- sector_t lba = 0, txlen = 0;
- u32 ei_lbrt = 0;
-
- switch (SERVICE_ACTION32(cdb)) {
- case READ_32:
- cmd = "READ";
- break;
- case VERIFY_32:
- cmd = "VERIFY";
- break;
- case WRITE_32:
- cmd = "WRITE";
- break;
- case WRITE_SAME_32:
- cmd = "WRITE_SAME";
- break;
- default:
- trace_seq_printf(p, "UNKNOWN");
- goto out;
- }
-
- lba |= ((u64)cdb[12] << 56);
- lba |= ((u64)cdb[13] << 48);
- lba |= ((u64)cdb[14] << 40);
- lba |= ((u64)cdb[15] << 32);
- lba |= (cdb[16] << 24);
- lba |= (cdb[17] << 16);
- lba |= (cdb[18] << 8);
- lba |= cdb[19];
- ei_lbrt |= (cdb[20] << 24);
- ei_lbrt |= (cdb[21] << 16);
- ei_lbrt |= (cdb[22] << 8);
- ei_lbrt |= cdb[23];
- txlen |= (cdb[28] << 24);
- txlen |= (cdb[29] << 16);
- txlen |= (cdb[30] << 8);
- txlen |= cdb[31];
-
- trace_seq_printf(p, "%s_32 lba=%llu txlen=%llu protect=%u ei_lbrt=%u",
- cmd, (unsigned long long)lba,
- (unsigned long long)txlen, cdb[10] >> 5, ei_lbrt);
-
- if (SERVICE_ACTION32(cdb) == WRITE_SAME_32)
- trace_seq_printf(p, " unmap=%u", cdb[10] >> 3 & 1);
-
-out:
- trace_seq_putc(p, 0);
- return ret;
-}
-
-static const char *
-scsi_trace_unmap(struct trace_seq *p, unsigned char *cdb, int len)
-{
- const char *ret = p->buffer + p->len;
- unsigned int regions = cdb[7] << 8 | cdb[8];
-
- trace_seq_printf(p, "regions=%u", (regions - 8) / 16);
- trace_seq_putc(p, 0);
- return ret;
-}
-
-static const char *
-scsi_trace_service_action_in(struct trace_seq *p, unsigned char *cdb, int len)
-{
- const char *ret = p->buffer + p->len, *cmd;
- sector_t lba = 0;
- u32 alloc_len = 0;
-
- switch (SERVICE_ACTION16(cdb)) {
- case SAI_READ_CAPACITY_16:
- cmd = "READ_CAPACITY_16";
- break;
- case SAI_GET_LBA_STATUS:
- cmd = "GET_LBA_STATUS";
- break;
- default:
- trace_seq_printf(p, "UNKNOWN");
- goto out;
- }
-
- lba |= ((u64)cdb[2] << 56);
- lba |= ((u64)cdb[3] << 48);
- lba |= ((u64)cdb[4] << 40);
- lba |= ((u64)cdb[5] << 32);
- lba |= (cdb[6] << 24);
- lba |= (cdb[7] << 16);
- lba |= (cdb[8] << 8);
- lba |= cdb[9];
- alloc_len |= (cdb[10] << 24);
- alloc_len |= (cdb[11] << 16);
- alloc_len |= (cdb[12] << 8);
- alloc_len |= cdb[13];
-
- trace_seq_printf(p, "%s lba=%llu alloc_len=%u", cmd,
- (unsigned long long)lba, alloc_len);
-
-out:
- trace_seq_putc(p, 0);
- return ret;
-}
-
-static const char *
-scsi_trace_varlen(struct trace_seq *p, unsigned char *cdb, int len)
-{
- switch (SERVICE_ACTION32(cdb)) {
- case READ_32:
- case VERIFY_32:
- case WRITE_32:
- case WRITE_SAME_32:
- return scsi_trace_rw32(p, cdb, len);
- default:
- return scsi_trace_misc(p, cdb, len);
- }
-}
-
-static const char *
-scsi_trace_misc(struct trace_seq *p, unsigned char *cdb, int len)
-{
- const char *ret = p->buffer + p->len;
-
- trace_seq_printf(p, "-");
- trace_seq_putc(p, 0);
- return ret;
-}
-
-const char *
-scsi_trace_parse_cdb(struct trace_seq *p, unsigned char *cdb, int len)
-{
- switch (cdb[0]) {
- case READ_6:
- case WRITE_6:
- return scsi_trace_rw6(p, cdb, len);
- case READ_10:
- case VERIFY:
- case WRITE_10:
- case WRITE_SAME:
- return scsi_trace_rw10(p, cdb, len);
- case READ_12:
- case VERIFY_12:
- case WRITE_12:
- return scsi_trace_rw12(p, cdb, len);
- case READ_16:
- case VERIFY_16:
- case WRITE_16:
- case WRITE_SAME_16:
- return scsi_trace_rw16(p, cdb, len);
- case UNMAP:
- return scsi_trace_unmap(p, cdb, len);
- case SERVICE_ACTION_IN_16:
- return scsi_trace_service_action_in(p, cdb, len);
- case VARIABLE_LENGTH_CMD:
- return scsi_trace_varlen(p, cdb, len);
- default:
- return scsi_trace_misc(p, cdb, len);
- }
-}
-
-unsigned long long process_scsi_trace_parse_cdb(struct trace_seq *s,
- unsigned long long *args)
-{
- scsi_trace_parse_cdb(s, (unsigned char *) (unsigned long) args[1], args[2]);
- return 0;
-}
-
-int TEP_PLUGIN_LOADER(struct tep_handle *tep)
-{
- tep_register_print_function(tep,
- process_scsi_trace_parse_cdb,
- TEP_FUNC_ARG_STRING,
- "scsi_trace_parse_cdb",
- TEP_FUNC_ARG_PTR,
- TEP_FUNC_ARG_PTR,
- TEP_FUNC_ARG_INT,
- TEP_FUNC_ARG_VOID);
- return 0;
-}
-
-void TEP_PLUGIN_UNLOADER(struct tep_handle *tep)
-{
- tep_unregister_print_function(tep, process_scsi_trace_parse_cdb,
- "scsi_trace_parse_cdb");
-}
diff --git a/tools/lib/traceevent/plugins/plugin_tlb.c b/tools/lib/traceevent/plugins/plugin_tlb.c
deleted file mode 100644
index 43657fb60504..000000000000
--- a/tools/lib/traceevent/plugins/plugin_tlb.c
+++ /dev/null
@@ -1,66 +0,0 @@
-// SPDX-License-Identifier: LGPL-2.1
-/*
- * Copyright (C) 2015 Red Hat Inc, Steven Rostedt <[email protected]>
- */
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "event-parse.h"
-
-enum tlb_flush_reason {
- TLB_FLUSH_ON_TASK_SWITCH,
- TLB_REMOTE_SHOOTDOWN,
- TLB_LOCAL_SHOOTDOWN,
- TLB_LOCAL_MM_SHOOTDOWN,
- NR_TLB_FLUSH_REASONS,
-};
-
-static int tlb_flush_handler(struct trace_seq *s, struct tep_record *record,
- struct tep_event *event, void *context)
-{
- unsigned long long val;
-
- trace_seq_printf(s, "pages=");
-
- tep_print_num_field(s, "%ld", event, "pages", record, 1);
-
- if (tep_get_field_val(s, event, "reason", record, &val, 1) < 0)
- return -1;
-
- trace_seq_puts(s, " reason=");
-
- switch (val) {
- case TLB_FLUSH_ON_TASK_SWITCH:
- trace_seq_puts(s, "flush on task switch");
- break;
- case TLB_REMOTE_SHOOTDOWN:
- trace_seq_puts(s, "remote shootdown");
- break;
- case TLB_LOCAL_SHOOTDOWN:
- trace_seq_puts(s, "local shootdown");
- break;
- case TLB_LOCAL_MM_SHOOTDOWN:
- trace_seq_puts(s, "local mm shootdown");
- break;
- }
-
- trace_seq_printf(s, " (%lld)", val);
-
- return 0;
-}
-
-int TEP_PLUGIN_LOADER(struct tep_handle *tep)
-{
- tep_register_event_handler(tep, -1, "tlb", "tlb_flush",
- tlb_flush_handler, NULL);
-
- return 0;
-}
-
-void TEP_PLUGIN_UNLOADER(struct tep_handle *tep)
-{
- tep_unregister_event_handler(tep, -1,
- "tlb", "tlb_flush",
- tlb_flush_handler, NULL);
-}
diff --git a/tools/lib/traceevent/plugins/plugin_xen.c b/tools/lib/traceevent/plugins/plugin_xen.c
deleted file mode 100644
index 993b208d0323..000000000000
--- a/tools/lib/traceevent/plugins/plugin_xen.c
+++ /dev/null
@@ -1,138 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include "event-parse.h"
-#include "trace-seq.h"
-
-#define __HYPERVISOR_set_trap_table 0
-#define __HYPERVISOR_mmu_update 1
-#define __HYPERVISOR_set_gdt 2
-#define __HYPERVISOR_stack_switch 3
-#define __HYPERVISOR_set_callbacks 4
-#define __HYPERVISOR_fpu_taskswitch 5
-#define __HYPERVISOR_sched_op_compat 6
-#define __HYPERVISOR_dom0_op 7
-#define __HYPERVISOR_set_debugreg 8
-#define __HYPERVISOR_get_debugreg 9
-#define __HYPERVISOR_update_descriptor 10
-#define __HYPERVISOR_memory_op 12
-#define __HYPERVISOR_multicall 13
-#define __HYPERVISOR_update_va_mapping 14
-#define __HYPERVISOR_set_timer_op 15
-#define __HYPERVISOR_event_channel_op_compat 16
-#define __HYPERVISOR_xen_version 17
-#define __HYPERVISOR_console_io 18
-#define __HYPERVISOR_physdev_op_compat 19
-#define __HYPERVISOR_grant_table_op 20
-#define __HYPERVISOR_vm_assist 21
-#define __HYPERVISOR_update_va_mapping_otherdomain 22
-#define __HYPERVISOR_iret 23 /* x86 only */
-#define __HYPERVISOR_vcpu_op 24
-#define __HYPERVISOR_set_segment_base 25 /* x86/64 only */
-#define __HYPERVISOR_mmuext_op 26
-#define __HYPERVISOR_acm_op 27
-#define __HYPERVISOR_nmi_op 28
-#define __HYPERVISOR_sched_op 29
-#define __HYPERVISOR_callback_op 30
-#define __HYPERVISOR_xenoprof_op 31
-#define __HYPERVISOR_event_channel_op 32
-#define __HYPERVISOR_physdev_op 33
-#define __HYPERVISOR_hvm_op 34
-#define __HYPERVISOR_tmem_op 38
-
-/* Architecture-specific hypercall definitions. */
-#define __HYPERVISOR_arch_0 48
-#define __HYPERVISOR_arch_1 49
-#define __HYPERVISOR_arch_2 50
-#define __HYPERVISOR_arch_3 51
-#define __HYPERVISOR_arch_4 52
-#define __HYPERVISOR_arch_5 53
-#define __HYPERVISOR_arch_6 54
-#define __HYPERVISOR_arch_7 55
-
-#define N(x) [__HYPERVISOR_##x] = "("#x")"
-static const char *xen_hypercall_names[] = {
- N(set_trap_table),
- N(mmu_update),
- N(set_gdt),
- N(stack_switch),
- N(set_callbacks),
- N(fpu_taskswitch),
- N(sched_op_compat),
- N(dom0_op),
- N(set_debugreg),
- N(get_debugreg),
- N(update_descriptor),
- N(memory_op),
- N(multicall),
- N(update_va_mapping),
- N(set_timer_op),
- N(event_channel_op_compat),
- N(xen_version),
- N(console_io),
- N(physdev_op_compat),
- N(grant_table_op),
- N(vm_assist),
- N(update_va_mapping_otherdomain),
- N(iret),
- N(vcpu_op),
- N(set_segment_base),
- N(mmuext_op),
- N(acm_op),
- N(nmi_op),
- N(sched_op),
- N(callback_op),
- N(xenoprof_op),
- N(event_channel_op),
- N(physdev_op),
- N(hvm_op),
-
-/* Architecture-specific hypercall definitions. */
- N(arch_0),
- N(arch_1),
- N(arch_2),
- N(arch_3),
- N(arch_4),
- N(arch_5),
- N(arch_6),
- N(arch_7),
-};
-#undef N
-
-#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
-
-static const char *xen_hypercall_name(unsigned op)
-{
- if (op < ARRAY_SIZE(xen_hypercall_names) &&
- xen_hypercall_names[op] != NULL)
- return xen_hypercall_names[op];
-
- return "";
-}
-
-unsigned long long process_xen_hypercall_name(struct trace_seq *s,
- unsigned long long *args)
-{
- unsigned int op = args[0];
-
- trace_seq_printf(s, "%s", xen_hypercall_name(op));
- return 0;
-}
-
-int TEP_PLUGIN_LOADER(struct tep_handle *tep)
-{
- tep_register_print_function(tep,
- process_xen_hypercall_name,
- TEP_FUNC_ARG_STRING,
- "xen_hypercall_name",
- TEP_FUNC_ARG_INT,
- TEP_FUNC_ARG_VOID);
- return 0;
-}
-
-void TEP_PLUGIN_UNLOADER(struct tep_handle *tep)
-{
- tep_unregister_print_function(tep, process_xen_hypercall_name,
- "xen_hypercall_name");
-}
diff --git a/tools/lib/traceevent/tep_strerror.c b/tools/lib/traceevent/tep_strerror.c
deleted file mode 100644
index 4ac26445b2f6..000000000000
--- a/tools/lib/traceevent/tep_strerror.c
+++ /dev/null
@@ -1,53 +0,0 @@
-// SPDX-License-Identifier: LGPL-2.1
-#undef _GNU_SOURCE
-#include <string.h>
-#include <stdio.h>
-
-#include "event-parse.h"
-
-#undef _PE
-#define _PE(code, str) str
-static const char * const tep_error_str[] = {
- TEP_ERRORS
-};
-#undef _PE
-
-/*
- * The tools so far have been using the strerror_r() GNU variant, that returns
- * a string, be it the buffer passed or something else.
- *
- * But that, besides being tricky in cases where we expect that the function
- * using strerror_r() returns the error formatted in a provided buffer (we have
- * to check if it returned something else and copy that instead), breaks the
- * build on systems not using glibc, like Alpine Linux, where musl libc is
- * used.
- *
- * So, introduce yet another wrapper, str_error_r(), that has the GNU
- * interface, but uses the portable XSI variant of strerror_r(), so that users
- * rest asured that the provided buffer is used and it is what is returned.
- */
-int tep_strerror(struct tep_handle *tep __maybe_unused,
- enum tep_errno errnum, char *buf, size_t buflen)
-{
- const char *msg;
- int idx;
-
- if (!buflen)
- return 0;
-
- if (errnum >= 0) {
- int err = strerror_r(errnum, buf, buflen);
- buf[buflen - 1] = 0;
- return err;
- }
-
- if (errnum <= __TEP_ERRNO__START ||
- errnum >= __TEP_ERRNO__END)
- return -1;
-
- idx = errnum - __TEP_ERRNO__START - 1;
- msg = tep_error_str[idx];
- snprintf(buf, buflen, "%s", msg);
-
- return 0;
-}
diff --git a/tools/lib/traceevent/trace-seq.c b/tools/lib/traceevent/trace-seq.c
deleted file mode 100644
index 8d5ecd2bf877..000000000000
--- a/tools/lib/traceevent/trace-seq.c
+++ /dev/null
@@ -1,249 +0,0 @@
-// SPDX-License-Identifier: LGPL-2.1
-/*
- * Copyright (C) 2009 Red Hat Inc, Steven Rostedt <[email protected]>
- *
- */
-#include "trace-seq.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdarg.h>
-
-#include <asm/bug.h>
-#include "event-parse.h"
-#include "event-utils.h"
-
-/*
- * The TRACE_SEQ_POISON is to catch the use of using
- * a trace_seq structure after it was destroyed.
- */
-#define TRACE_SEQ_POISON ((void *)0xdeadbeef)
-#define TRACE_SEQ_CHECK(s) \
-do { \
- if (WARN_ONCE((s)->buffer == TRACE_SEQ_POISON, \
- "Usage of trace_seq after it was destroyed")) \
- (s)->state = TRACE_SEQ__BUFFER_POISONED; \
-} while (0)
-
-#define TRACE_SEQ_CHECK_RET_N(s, n) \
-do { \
- TRACE_SEQ_CHECK(s); \
- if ((s)->state != TRACE_SEQ__GOOD) \
- return n; \
-} while (0)
-
-#define TRACE_SEQ_CHECK_RET(s) TRACE_SEQ_CHECK_RET_N(s, )
-#define TRACE_SEQ_CHECK_RET0(s) TRACE_SEQ_CHECK_RET_N(s, 0)
-
-/**
- * trace_seq_init - initialize the trace_seq structure
- * @s: a pointer to the trace_seq structure to initialize
- */
-void trace_seq_init(struct trace_seq *s)
-{
- s->len = 0;
- s->readpos = 0;
- s->buffer_size = TRACE_SEQ_BUF_SIZE;
- s->buffer = malloc(s->buffer_size);
- if (s->buffer != NULL)
- s->state = TRACE_SEQ__GOOD;
- else
- s->state = TRACE_SEQ__MEM_ALLOC_FAILED;
-}
-
-/**
- * trace_seq_reset - re-initialize the trace_seq structure
- * @s: a pointer to the trace_seq structure to reset
- */
-void trace_seq_reset(struct trace_seq *s)
-{
- if (!s)
- return;
- TRACE_SEQ_CHECK(s);
- s->len = 0;
- s->readpos = 0;
-}
-
-/**
- * trace_seq_destroy - free up memory of a trace_seq
- * @s: a pointer to the trace_seq to free the buffer
- *
- * Only frees the buffer, not the trace_seq struct itself.
- */
-void trace_seq_destroy(struct trace_seq *s)
-{
- if (!s)
- return;
- TRACE_SEQ_CHECK_RET(s);
- free(s->buffer);
- s->buffer = TRACE_SEQ_POISON;
-}
-
-static void expand_buffer(struct trace_seq *s)
-{
- char *buf;
-
- buf = realloc(s->buffer, s->buffer_size + TRACE_SEQ_BUF_SIZE);
- if (WARN_ONCE(!buf, "Can't allocate trace_seq buffer memory")) {
- s->state = TRACE_SEQ__MEM_ALLOC_FAILED;
- return;
- }
-
- s->buffer = buf;
- s->buffer_size += TRACE_SEQ_BUF_SIZE;
-}
-
-/**
- * trace_seq_printf - sequence printing of trace information
- * @s: trace sequence descriptor
- * @fmt: printf format string
- *
- * It returns 0 if the trace oversizes the buffer's free
- * space, the number of characters printed, or a negative
- * value in case of an error.
- *
- * The tracer may use either sequence operations or its own
- * copy to user routines. To simplify formating of a trace
- * trace_seq_printf is used to store strings into a special
- * buffer (@s). Then the output may be either used by
- * the sequencer or pulled into another buffer.
- */
-int
-trace_seq_printf(struct trace_seq *s, const char *fmt, ...)
-{
- va_list ap;
- int len;
- int ret;
-
- try_again:
- TRACE_SEQ_CHECK_RET0(s);
-
- len = (s->buffer_size - 1) - s->len;
-
- va_start(ap, fmt);
- ret = vsnprintf(s->buffer + s->len, len, fmt, ap);
- va_end(ap);
-
- if (ret >= len) {
- expand_buffer(s);
- goto try_again;
- }
-
- if (ret > 0)
- s->len += ret;
-
- return ret;
-}
-
-/**
- * trace_seq_vprintf - sequence printing of trace information
- * @s: trace sequence descriptor
- * @fmt: printf format string
- *
- * It returns 0 if the trace oversizes the buffer's free
- * space, the number of characters printed, or a negative
- * value in case of an error.
- * *
- * The tracer may use either sequence operations or its own
- * copy to user routines. To simplify formating of a trace
- * trace_seq_printf is used to store strings into a special
- * buffer (@s). Then the output may be either used by
- * the sequencer or pulled into another buffer.
- */
-int
-trace_seq_vprintf(struct trace_seq *s, const char *fmt, va_list args)
-{
- int len;
- int ret;
-
- try_again:
- TRACE_SEQ_CHECK_RET0(s);
-
- len = (s->buffer_size - 1) - s->len;
-
- ret = vsnprintf(s->buffer + s->len, len, fmt, args);
-
- if (ret >= len) {
- expand_buffer(s);
- goto try_again;
- }
-
- if (ret > 0)
- s->len += ret;
-
- return ret;
-}
-
-/**
- * trace_seq_puts - trace sequence printing of simple string
- * @s: trace sequence descriptor
- * @str: simple string to record
- *
- * The tracer may use either the sequence operations or its own
- * copy to user routines. This function records a simple string
- * into a special buffer (@s) for later retrieval by a sequencer
- * or other mechanism.
- */
-int trace_seq_puts(struct trace_seq *s, const char *str)
-{
- int len;
-
- TRACE_SEQ_CHECK_RET0(s);
-
- len = strlen(str);
-
- while (len > ((s->buffer_size - 1) - s->len))
- expand_buffer(s);
-
- TRACE_SEQ_CHECK_RET0(s);
-
- memcpy(s->buffer + s->len, str, len);
- s->len += len;
-
- return len;
-}
-
-int trace_seq_putc(struct trace_seq *s, unsigned char c)
-{
- TRACE_SEQ_CHECK_RET0(s);
-
- while (s->len >= (s->buffer_size - 1))
- expand_buffer(s);
-
- TRACE_SEQ_CHECK_RET0(s);
-
- s->buffer[s->len++] = c;
-
- return 1;
-}
-
-void trace_seq_terminate(struct trace_seq *s)
-{
- TRACE_SEQ_CHECK_RET(s);
-
- /* There's always one character left on the buffer */
- s->buffer[s->len] = 0;
-}
-
-int trace_seq_do_fprintf(struct trace_seq *s, FILE *fp)
-{
- TRACE_SEQ_CHECK(s);
-
- switch (s->state) {
- case TRACE_SEQ__GOOD:
- return fprintf(fp, "%.*s", s->len, s->buffer);
- case TRACE_SEQ__BUFFER_POISONED:
- fprintf(fp, "%s\n", "Usage of trace_seq after it was destroyed");
- break;
- case TRACE_SEQ__MEM_ALLOC_FAILED:
- fprintf(fp, "%s\n", "Can't allocate trace_seq buffer memory");
- break;
- }
- return -1;
-}
-
-int trace_seq_do_printf(struct trace_seq *s)
-{
- return trace_seq_do_fprintf(s, stdout);
-}
diff --git a/tools/lib/traceevent/trace-seq.h b/tools/lib/traceevent/trace-seq.h
deleted file mode 100644
index d68ec69f8d1a..000000000000
--- a/tools/lib/traceevent/trace-seq.h
+++ /dev/null
@@ -1,55 +0,0 @@
-// SPDX-License-Identifier: LGPL-2.1
-/*
- * Copyright (C) 2009, 2010 Red Hat Inc, Steven Rostedt <[email protected]>
- *
- */
-
-#ifndef _TRACE_SEQ_H
-#define _TRACE_SEQ_H
-
-#include <stdarg.h>
-#include <stdio.h>
-
-/* ----------------------- trace_seq ----------------------- */
-
-#ifndef TRACE_SEQ_BUF_SIZE
-#define TRACE_SEQ_BUF_SIZE 4096
-#endif
-
-enum trace_seq_fail {
- TRACE_SEQ__GOOD,
- TRACE_SEQ__BUFFER_POISONED,
- TRACE_SEQ__MEM_ALLOC_FAILED,
-};
-
-/*
- * Trace sequences are used to allow a function to call several other functions
- * to create a string of data to use (up to a max of PAGE_SIZE).
- */
-
-struct trace_seq {
- char *buffer;
- unsigned int buffer_size;
- unsigned int len;
- unsigned int readpos;
- enum trace_seq_fail state;
-};
-
-void trace_seq_init(struct trace_seq *s);
-void trace_seq_reset(struct trace_seq *s);
-void trace_seq_destroy(struct trace_seq *s);
-
-extern int trace_seq_printf(struct trace_seq *s, const char *fmt, ...)
- __attribute__ ((format (printf, 2, 3)));
-extern int trace_seq_vprintf(struct trace_seq *s, const char *fmt, va_list args)
- __attribute__ ((format (printf, 2, 0)));
-
-extern int trace_seq_puts(struct trace_seq *s, const char *str);
-extern int trace_seq_putc(struct trace_seq *s, unsigned char c);
-
-extern void trace_seq_terminate(struct trace_seq *s);
-
-extern int trace_seq_do_fprintf(struct trace_seq *s, FILE *fp);
-extern int trace_seq_do_printf(struct trace_seq *s);
-
-#endif /* _TRACE_SEQ_H */
--
2.38.1.584.g0f3c55d4c2-goog

2022-11-30 06:42:42

by Ian Rogers

[permalink] [raw]
Subject: [PATCH v2 3/4] perf build: Use libtraceevent from the system

Remove the LIBTRACEEVENT_DYNAMIC and LIBTRACEFS_DYNAMIC. If
libtraceevent isn't installed or NO_LIBTRACEEVENT=1 is passed to the
build, don't compile in libtraceevent and libtracefs support. This
also disables CONFIG_TRACE that controls "perf
trace". CONFIG_TRACEEVENT is used to control enablement in
Build/Makefiles, HAVE_LIBTRACEEVENT is used in C code. Without
HAVE_LIBTRACEEVENT tracepoints are disabled and as such the commands
kmem, kwork, lock, sched and timechart are removed. The majority of
commands continue to work including "perf test".

Signed-off-by: Ian Rogers <[email protected]>
---
tools/perf/Build | 11 ++-
tools/perf/Makefile.config | 37 +++----
tools/perf/Makefile.perf | 99 +------------------
tools/perf/arch/x86/util/Build | 2 +-
tools/perf/arch/x86/util/intel-pt.c | 4 +
tools/perf/builtin-annotate.c | 2 +
tools/perf/builtin-inject.c | 8 ++
tools/perf/builtin-kmem.c | 1 +
tools/perf/builtin-kvm.c | 12 +--
tools/perf/builtin-kwork.c | 1 +
tools/perf/builtin-record.c | 2 +
tools/perf/builtin-report.c | 9 +-
tools/perf/builtin-script.c | 19 +++-
tools/perf/builtin-timechart.c | 1 +
tools/perf/builtin-trace.c | 5 +-
tools/perf/builtin-version.c | 1 +
tools/perf/perf.c | 24 +++--
.../perf/scripts/python/Perf-Trace-Util/Build | 2 +-
tools/perf/tests/Build | 12 +--
tools/perf/tests/builtin-test.c | 6 ++
tools/perf/tests/parse-events.c | 20 ++++
tools/perf/util/Build | 10 +-
tools/perf/util/data-convert-bt.c | 5 +-
tools/perf/util/data-convert-json.c | 9 +-
tools/perf/util/evlist.c | 6 +-
tools/perf/util/evlist.h | 4 +
tools/perf/util/evsel.c | 11 ++-
tools/perf/util/evsel.h | 12 ++-
tools/perf/util/evsel_fprintf.c | 7 +-
tools/perf/util/header.c | 19 ++++
tools/perf/util/header.h | 2 +
tools/perf/util/intel-pt.c | 7 +-
tools/perf/util/parse-events.c | 15 +++
tools/perf/util/parse-events.h | 1 -
tools/perf/util/python.c | 4 +
tools/perf/util/scripting-engines/Build | 6 +-
.../scripting-engines/trace-event-python.c | 1 +
tools/perf/util/session.c | 2 +
tools/perf/util/session.h | 2 +
tools/perf/util/sort.c | 60 +++++++++--
tools/perf/util/synthetic-events.c | 6 ++
tools/perf/util/trace-event-parse.c | 2 +
tools/perf/util/trace-event-read.c | 1 +
tools/perf/util/trace-event-scripting.c | 1 +
tools/perf/util/trace-event.c | 1 -
tools/perf/util/trace-event.h | 11 ++-
46 files changed, 312 insertions(+), 171 deletions(-)

diff --git a/tools/perf/Build b/tools/perf/Build
index 496b096153bb..edafe3cb3d07 100644
--- a/tools/perf/Build
+++ b/tools/perf/Build
@@ -5,7 +5,6 @@ perf-y += builtin-diff.o
perf-y += builtin-evlist.o
perf-y += builtin-ftrace.o
perf-y += builtin-help.o
-perf-y += builtin-sched.o
perf-y += builtin-buildid-list.o
perf-y += builtin-buildid-cache.o
perf-y += builtin-kallsyms.o
@@ -13,11 +12,8 @@ perf-y += builtin-list.o
perf-y += builtin-record.o
perf-y += builtin-report.o
perf-y += builtin-stat.o
-perf-y += builtin-timechart.o
perf-y += builtin-top.o
perf-y += builtin-script.o
-perf-y += builtin-kmem.o
-perf-y += builtin-lock.o
perf-y += builtin-kvm.o
perf-y += builtin-inject.o
perf-y += builtin-mem.o
@@ -25,7 +21,12 @@ perf-y += builtin-data.o
perf-y += builtin-version.o
perf-y += builtin-c2c.o
perf-y += builtin-daemon.o
-perf-y += builtin-kwork.o
+
+perf-$(CONFIG_TRACEEVENT) += builtin-kmem.o
+perf-$(CONFIG_TRACEEVENT) += builtin-kwork.o
+perf-$(CONFIG_TRACEEVENT) += builtin-lock.o
+perf-$(CONFIG_TRACEEVENT) += builtin-sched.o
+perf-$(CONFIG_TRACEEVENT) += builtin-timechart.o

perf-$(CONFIG_TRACE) += builtin-trace.o
perf-$(CONFIG_LIBELF) += builtin-probe.o
diff --git a/tools/perf/Makefile.config b/tools/perf/Makefile.config
index 9cc3c48f3288..b34288cb1900 100644
--- a/tools/perf/Makefile.config
+++ b/tools/perf/Makefile.config
@@ -763,18 +763,20 @@ ifndef NO_LIBUNWIND
EXTLIBS += $(EXTLIBS_LIBUNWIND)
endif

-ifeq ($(NO_SYSCALL_TABLE),0)
- $(call detected,CONFIG_TRACE)
-else
- ifndef NO_LIBAUDIT
- $(call feature_check,libaudit)
- ifneq ($(feature-libaudit), 1)
- msg := $(warning No libaudit.h found, disables 'trace' tool, please install audit-libs-devel or libaudit-dev);
- NO_LIBAUDIT := 1
- else
- CFLAGS += -DHAVE_LIBAUDIT_SUPPORT
- EXTLIBS += -laudit
- $(call detected,CONFIG_TRACE)
+ifneq ($(NO_LIBTRACEEVENT),1)
+ ifeq ($(NO_SYSCALL_TABLE),0)
+ $(call detected,CONFIG_TRACE)
+ else
+ ifndef NO_LIBAUDIT
+ $(call feature_check,libaudit)
+ ifneq ($(feature-libaudit), 1)
+ msg := $(warning No libaudit.h found, disables 'trace' tool, please install audit-libs-devel or libaudit-dev);
+ NO_LIBAUDIT := 1
+ else
+ CFLAGS += -DHAVE_LIBAUDIT_SUPPORT
+ EXTLIBS += -laudit
+ $(call detected,CONFIG_TRACE)
+ endif
endif
endif
endif
@@ -1182,9 +1184,11 @@ ifdef LIBPFM4
endif
endif

-ifdef LIBTRACEEVENT_DYNAMIC
+# libtraceevent is a recommended dependency picked up from the system.
+ifneq ($(NO_LIBTRACEEVENT),1)
$(call feature_check,libtraceevent)
ifeq ($(feature-libtraceevent), 1)
+ CFLAGS += -DHAVE_LIBTRACEEVENT
EXTLIBS += -ltraceevent
LIBTRACEEVENT_VERSION := $(shell $(PKG_CONFIG) --modversion libtraceevent)
LIBTRACEEVENT_VERSION_1 := $(word 1, $(subst ., ,$(LIBTRACEEVENT_VERSION)))
@@ -1192,12 +1196,11 @@ ifdef LIBTRACEEVENT_DYNAMIC
LIBTRACEEVENT_VERSION_3 := $(word 3, $(subst ., ,$(LIBTRACEEVENT_VERSION)))
LIBTRACEEVENT_VERSION_CPP := $(shell expr $(LIBTRACEEVENT_VERSION_1) \* 255 \* 255 + $(LIBTRACEEVENT_VERSION_2) \* 255 + $(LIBTRACEEVENT_VERSION_3))
CFLAGS += -DLIBTRACEEVENT_VERSION=$(LIBTRACEEVENT_VERSION_CPP)
+ $(call detected,CONFIG_TRACEEVENT)
else
- dummy := $(error Error: No libtraceevent devel library found, please install libtraceevent-devel);
+ dummy := $(warning Warning: libtraceevent is missing limiting functionality, please install libtraceevent-dev)
endif
-endif

-ifdef LIBTRACEFS_DYNAMIC
$(call feature_check,libtracefs)
ifeq ($(feature-libtracefs), 1)
EXTLIBS += -ltracefs
@@ -1207,8 +1210,6 @@ ifdef LIBTRACEFS_DYNAMIC
LIBTRACEFS_VERSION_3 := $(word 3, $(subst ., ,$(LIBTRACEFS_VERSION)))
LIBTRACEFS_VERSION_CPP := $(shell expr $(LIBTRACEFS_VERSION_1) \* 255 \* 255 + $(LIBTRACEFS_VERSION_2) \* 255 + $(LIBTRACEFS_VERSION_3))
CFLAGS += -DLIBTRACEFS_VERSION=$(LIBTRACEFS_VERSION_CPP)
- else
- dummy := $(error Error: No libtracefs devel library found, please install libtracefs-dev);
endif
endif

diff --git a/tools/perf/Makefile.perf b/tools/perf/Makefile.perf
index f4cd946fe91a..f0e4daeef812 100644
--- a/tools/perf/Makefile.perf
+++ b/tools/perf/Makefile.perf
@@ -128,10 +128,6 @@ include ../scripts/utilities.mak
#
# Define BUILD_BPF_SKEL to enable BPF skeletons
#
-# Define LIBTRACEEVENT_DYNAMIC to enable libtraceevent dynamic linking
-#
-# Define LIBTRACEFS_DYNAMIC to enable libtracefs dynamic linking
-#

# As per kernel Makefile, avoid funny character set dependencies
unexport LC_ALL
@@ -242,10 +238,6 @@ sub-make: fixdep
else # force_fixdep

LIBAPI_DIR = $(srctree)/tools/lib/api/
-ifndef LIBTRACEEVENT_DYNAMIC
-LIBTRACEEVENT_DIR = $(srctree)/tools/lib/traceevent/
-LIBTRACEEVENT_PLUGINS_DIR = $(LIBTRACEEVENT_DIR)/plugins
-endif
LIBBPF_DIR = $(srctree)/tools/lib/bpf/
LIBSUBCMD_DIR = $(srctree)/tools/lib/subcmd/
LIBSYMBOL_DIR = $(srctree)/tools/lib/symbol/
@@ -295,31 +287,6 @@ SCRIPT_SH += perf-iostat.sh
grep-libs = $(filter -l%,$(1))
strip-libs = $(filter-out -l%,$(1))

-ifndef LIBTRACEEVENT_DYNAMIC
-ifneq ($(OUTPUT),)
- LIBTRACEEVENT_OUTPUT = $(abspath $(OUTPUT))/libtraceevent
-else
- LIBTRACEEVENT_OUTPUT = $(CURDIR)/libtraceevent
-endif
-LIBTRACEEVENT_PLUGINS_OUTPUT = $(LIBTRACEEVENT_OUTPUT)_plugins
-LIBTRACEEVENT_DESTDIR = $(LIBTRACEEVENT_OUTPUT)
-LIBTRACEEVENT_PLUGINS_DESTDIR = $(LIBTRACEEVENT_PLUGINS_OUTPUT)
-LIBTRACEEVENT_INCLUDE = $(LIBTRACEEVENT_DESTDIR)/include
-LIBTRACEEVENT = $(LIBTRACEEVENT_OUTPUT)/libtraceevent.a
-export LIBTRACEEVENT
-LIBTRACEEVENT_DYNAMIC_LIST = $(LIBTRACEEVENT_PLUGINS_OUTPUT)/libtraceevent-dynamic-list
-CFLAGS += -I$(LIBTRACEEVENT_OUTPUT)/include
-#
-# The static build has no dynsym table, so this does not work for
-# static build. Looks like linker starts to scream about that now
-# (in Fedora 26) so we need to switch it off for static build.
-DYNAMIC_LIST_LDFLAGS = -Xlinker --dynamic-list=$(LIBTRACEEVENT_DYNAMIC_LIST)
-LIBTRACEEVENT_DYNAMIC_LIST_LDFLAGS = $(if $(findstring -static,$(LDFLAGS)),,$(DYNAMIC_LIST_LDFLAGS))
-else
-LIBTRACEEVENT_DYNAMIC_LIST =
-LIBTRACEEVENT_DYNAMIC_LIST_LDFLAGS =
-endif
-
ifneq ($(OUTPUT),)
LIBAPI_OUTPUT = $(abspath $(OUTPUT))/libapi
else
@@ -381,11 +348,7 @@ export PYTHON_EXTBUILD_LIB PYTHON_EXTBUILD_TMP
python-clean := $(call QUIET_CLEAN, python) $(RM) -r $(PYTHON_EXTBUILD) $(OUTPUT)python/perf*.so

PYTHON_EXT_SRCS := $(shell grep -v ^\# util/python-ext-sources)
-ifndef LIBTRACEEVENT_DYNAMIC
-PYTHON_EXT_DEPS := util/python-ext-sources util/setup.py $(LIBTRACEEVENT) $(LIBAPI)
-else
PYTHON_EXT_DEPS := util/python-ext-sources util/setup.py $(LIBAPI)
-endif

SCRIPTS = $(patsubst %.sh,%,$(SCRIPT_SH))

@@ -430,9 +393,6 @@ ifndef NO_LIBBPF
PERFLIBS += $(LIBBPF)
endif
endif
-ifndef LIBTRACEEVENT_DYNAMIC
- PERFLIBS += $(LIBTRACEEVENT)
-endif

# We choose to avoid "if .. else if .. else .. endif endif"
# because maintaining the nesting to match is a pain. If
@@ -682,9 +642,9 @@ all: shell_compatibility_test $(ALL_PROGRAMS) $(LANG_BINDINGS) $(OTHER_PROGRAMS)
# Create python binding output directory if not already present
_dummy := $(shell [ -d '$(OUTPUT)python' ] || mkdir -p '$(OUTPUT)python')

-$(OUTPUT)python/perf.so: $(PYTHON_EXT_SRCS) $(PYTHON_EXT_DEPS) $(LIBTRACEEVENT_DYNAMIC_LIST) $(LIBPERF)
+$(OUTPUT)python/perf.so: $(PYTHON_EXT_SRCS) $(PYTHON_EXT_DEPS) $(LIBPERF)
$(QUIET_GEN)LDSHARED="$(CC) -pthread -shared" \
- CFLAGS='$(CFLAGS)' LDFLAGS='$(LDFLAGS) $(LIBTRACEEVENT_DYNAMIC_LIST_LDFLAGS)' \
+ CFLAGS='$(CFLAGS)' LDFLAGS='$(LDFLAGS)' \
$(PYTHON_WORD) util/setup.py \
--quiet build_ext; \
cp $(PYTHON_EXTBUILD_LIB)perf*.so $(OUTPUT)python/
@@ -710,8 +670,8 @@ $(PERF_IN): prepare FORCE
$(PMU_EVENTS_IN): FORCE prepare
$(Q)$(MAKE) -f $(srctree)/tools/build/Makefile.build dir=pmu-events obj=pmu-events

-$(OUTPUT)perf: $(PERFLIBS) $(PERF_IN) $(PMU_EVENTS_IN) $(LIBTRACEEVENT_DYNAMIC_LIST)
- $(QUIET_LINK)$(CC) $(CFLAGS) $(LDFLAGS) $(LIBTRACEEVENT_DYNAMIC_LIST_LDFLAGS) \
+$(OUTPUT)perf: $(PERFLIBS) $(PERF_IN) $(PMU_EVENTS_IN)
+ $(QUIET_LINK)$(CC) $(CFLAGS) $(LDFLAGS) \
$(PERF_IN) $(PMU_EVENTS_IN) $(LIBS) -o $@

$(GTK_IN): FORCE prepare
@@ -797,10 +757,6 @@ prepare: $(OUTPUT)PERF-VERSION-FILE $(OUTPUT)common-cmds.h archheaders $(drm_ioc
$(LIBSYMBOL) \
bpf-skel

-ifndef LIBTRACEEVENT_DYNAMIC
-prepare: $(LIBTRACEEVENT)
-endif
-
$(OUTPUT)%.o: %.c prepare FORCE
$(Q)$(MAKE) -f $(srctree)/tools/build/Makefile.build dir=$(build-dir) $@

@@ -856,38 +812,6 @@ endif

$(patsubst perf-%,%.o,$(PROGRAMS)): $(wildcard */*.h)

-ifndef LIBTRACEEVENT_DYNAMIC
-LIBTRACEEVENT_FLAGS += plugin_dir=$(plugindir_SQ) 'EXTRA_CFLAGS=$(EXTRA_CFLAGS)' 'LDFLAGS=$(filter-out -static,$(LDFLAGS))'
-
-$(LIBTRACEEVENT): FORCE | $(LIBTRACEEVENT_OUTPUT)
- $(Q)$(MAKE) -C $(LIBTRACEEVENT_DIR) O=$(LIBTRACEEVENT_OUTPUT) \
- DESTDIR=$(LIBTRACEEVENT_DESTDIR) prefix= \
- $@ install_headers
-
-$(LIBTRACEEVENT)-clean:
- $(call QUIET_CLEAN, libtraceevent)
- $(Q)$(RM) -r -- $(LIBTRACEEVENT_OUTPUT)
-
-libtraceevent_plugins: FORCE | $(LIBTRACEEVENT_PLUGINS_OUTPUT)
- $(Q)$(MAKE) -C $(LIBTRACEEVENT_PLUGINS_DIR) O=$(LIBTRACEEVENT_PLUGINS_OUTPUT) \
- DESTDIR=$(LIBTRACEEVENT_PLUGINS_DESTDIR) prefix= \
- plugins
-
-libtraceevent_plugins-clean:
- $(call QUIET_CLEAN, libtraceevent_plugins)
- $(Q)$(RM) -r -- $(LIBTRACEEVENT_PLUGINS_OUTPUT)
-
-$(LIBTRACEEVENT_DYNAMIC_LIST): libtraceevent_plugins
- $(Q)$(MAKE) -C $(LIBTRACEEVENT_PLUGINS_DIR) O=$(LIBTRACEEVENT_PLUGINS_OUTPUT) \
- DESTDIR=$(LIBTRACEEVENT_PLUGINS_DESTDIR) prefix= \
- $(LIBTRACEEVENT_FLAGS) $@
-
-install-traceevent-plugins: libtraceevent_plugins
- $(Q)$(MAKE) -C $(LIBTRACEEVENT_PLUGINS_DIR) O=$(LIBTRACEEVENT_PLUGINS_OUTPUT) \
- DESTDIR=$(DESTDIR_SQ) prefix= \
- $(LIBTRACEEVENT_FLAGS) install
-endif
-
$(LIBAPI): FORCE | $(LIBAPI_OUTPUT)
$(Q)$(MAKE) -C $(LIBAPI_DIR) O=$(LIBAPI_OUTPUT) \
DESTDIR=$(LIBAPI_DESTDIR) prefix= \
@@ -1095,10 +1019,6 @@ install-tests: all install-gtk

install-bin: install-tools install-tests

-ifndef LIBTRACEEVENT_DYNAMIC
-install-bin: install-traceevent-plugins
-endif
-
install: install-bin try-install-man

install-python_ext:
@@ -1124,11 +1044,6 @@ SKELETONS += $(SKEL_OUT)/kwork_trace.skel.h
$(SKEL_TMP_OUT) $(LIBAPI_OUTPUT) $(LIBBPF_OUTPUT) $(LIBPERF_OUTPUT) $(LIBSUBCMD_OUTPUT) $(LIBSYMBOL_OUTPUT):
$(Q)$(MKDIR) -p $@

-ifndef LIBTRACEEVENT_DYNAMIC
-$(LIBTRACEEVENT_OUTPUT) $(LIBTRACEEVENT_PLUGINS_OUTPUT):
- $(Q)$(MKDIR) -p $@
-endif
-
ifdef BUILD_BPF_SKEL
BPFTOOL := $(SKEL_TMP_OUT)/bootstrap/bpftool
BPF_INCLUDE := -I$(SKEL_TMP_OUT)/.. -I$(LIBBPF_INCLUDE)
@@ -1211,10 +1126,6 @@ clean:: $(LIBAPI)-clean $(LIBBPF)-clean $(LIBSUBCMD)-clean $(LIBSYMBOL)-clean $(
$(call QUIET_CLEAN, Documentation) \
$(MAKE) -C $(DOC_DIR) O=$(OUTPUT) clean >/dev/null

-ifndef LIBTRACEEVENT_DYNAMIC
-clean:: $(LIBTRACEEVENT)-clean libtraceevent_plugins-clean
-endif
-
#
# To provide FEATURE-DUMP into $(FEATURE_DUMP_COPY)
# file if defined, with no further action.
@@ -1232,6 +1143,6 @@ FORCE:
.PHONY: all install clean config-clean strip install-gtk
.PHONY: shell_compatibility_test please_set_SHELL_PATH_to_a_more_modern_shell
.PHONY: .FORCE-PERF-VERSION-FILE TAGS tags cscope FORCE prepare
-.PHONY: libtraceevent_plugins archheaders
+.PHONY: archheaders

endif # force_fixdep
diff --git a/tools/perf/arch/x86/util/Build b/tools/perf/arch/x86/util/Build
index dbeb04cb336e..a92644f12eec 100644
--- a/tools/perf/arch/x86/util/Build
+++ b/tools/perf/arch/x86/util/Build
@@ -1,7 +1,7 @@
perf-y += header.o
perf-y += tsc.o
perf-y += pmu.o
-perf-y += kvm-stat.o
+perf-$(CONFIG_TRACEEVENT) += kvm-stat.o
perf-y += perf_regs.o
perf-y += topdown.o
perf-y += machine.o
diff --git a/tools/perf/arch/x86/util/intel-pt.c b/tools/perf/arch/x86/util/intel-pt.c
index af102f471e9f..1e39a034cee9 100644
--- a/tools/perf/arch/x86/util/intel-pt.c
+++ b/tools/perf/arch/x86/util/intel-pt.c
@@ -418,6 +418,7 @@ static int intel_pt_info_fill(struct auxtrace_record *itr,
return 0;
}

+#ifdef HAVE_LIBTRACEEVENT
static int intel_pt_track_switches(struct evlist *evlist)
{
const char *sched_switch = "sched:sched_switch";
@@ -439,6 +440,7 @@ static int intel_pt_track_switches(struct evlist *evlist)

return 0;
}
+#endif

static void intel_pt_valid_str(char *str, size_t len, u64 valid)
{
@@ -829,6 +831,7 @@ static int intel_pt_recording_options(struct auxtrace_record *itr,
ptr->have_sched_switch = 2;
}
} else {
+#ifdef HAVE_LIBTRACEEVENT
err = intel_pt_track_switches(evlist);
if (err == -EPERM)
pr_debug2("Unable to select sched:sched_switch\n");
@@ -836,6 +839,7 @@ static int intel_pt_recording_options(struct auxtrace_record *itr,
return err;
else
ptr->have_sched_switch = 1;
+#endif
}
}

diff --git a/tools/perf/builtin-annotate.c b/tools/perf/builtin-annotate.c
index 517d928c00e3..90458ca6933f 100644
--- a/tools/perf/builtin-annotate.c
+++ b/tools/perf/builtin-annotate.c
@@ -499,7 +499,9 @@ int cmd_annotate(int argc, const char **argv)
.namespaces = perf_event__process_namespaces,
.attr = perf_event__process_attr,
.build_id = perf_event__process_build_id,
+#ifdef HAVE_LIBTRACEEVENT
.tracing_data = perf_event__process_tracing_data,
+#endif
.id_index = perf_event__process_id_index,
.auxtrace_info = perf_event__process_auxtrace_info,
.auxtrace = perf_event__process_auxtrace,
diff --git a/tools/perf/builtin-inject.c b/tools/perf/builtin-inject.c
index e254f18986f7..3f4e4dd5abf3 100644
--- a/tools/perf/builtin-inject.c
+++ b/tools/perf/builtin-inject.c
@@ -607,6 +607,7 @@ static int perf_event__repipe_exit(struct perf_tool *tool,
return err;
}

+#ifdef HAVE_LIBTRACEEVENT
static int perf_event__repipe_tracing_data(struct perf_session *session,
union perf_event *event)
{
@@ -614,6 +615,7 @@ static int perf_event__repipe_tracing_data(struct perf_session *session,

return perf_event__process_tracing_data(session, event);
}
+#endif

static int dso__read_build_id(struct dso *dso)
{
@@ -807,6 +809,7 @@ static int perf_inject__sched_switch(struct perf_tool *tool,
return 0;
}

+#ifdef HAVE_LIBTRACEEVENT
static int perf_inject__sched_stat(struct perf_tool *tool,
union perf_event *event __maybe_unused,
struct perf_sample *sample,
@@ -836,6 +839,7 @@ static int perf_inject__sched_stat(struct perf_tool *tool,
build_id__mark_dso_hit(tool, event_sw, &sample_sw, evsel, machine);
return perf_event__repipe(tool, event_sw, &sample_sw, machine);
}
+#endif

static struct guest_vcpu *guest_session__vcpu(struct guest_session *gs, u32 vcpu)
{
@@ -1961,7 +1965,9 @@ static int __cmd_inject(struct perf_inject *inject)
inject->tool.mmap = perf_event__repipe_mmap;
inject->tool.mmap2 = perf_event__repipe_mmap2;
inject->tool.fork = perf_event__repipe_fork;
+#ifdef HAVE_LIBTRACEEVENT
inject->tool.tracing_data = perf_event__repipe_tracing_data;
+#endif
}

output_data_offset = perf_session__data_offset(session->evlist);
@@ -1984,8 +1990,10 @@ static int __cmd_inject(struct perf_inject *inject)
evsel->handler = perf_inject__sched_switch;
} else if (!strcmp(name, "sched:sched_process_exit"))
evsel->handler = perf_inject__sched_process_exit;
+#ifdef HAVE_LIBTRACEEVENT
else if (!strncmp(name, "sched:sched_stat_", 17))
evsel->handler = perf_inject__sched_stat;
+#endif
}
} else if (inject->itrace_synth_opts.vm_time_correlation) {
session->itrace_synth_opts = &inject->itrace_synth_opts;
diff --git a/tools/perf/builtin-kmem.c b/tools/perf/builtin-kmem.c
index ebfab2ca1702..e20656c431a4 100644
--- a/tools/perf/builtin-kmem.c
+++ b/tools/perf/builtin-kmem.c
@@ -35,6 +35,7 @@
#include <regex.h>

#include <linux/ctype.h>
+#include <traceevent/event-parse.h>

static int kmem_slab;
static int kmem_page;
diff --git a/tools/perf/builtin-kvm.c b/tools/perf/builtin-kvm.c
index 7d9ec1bac1a2..641e739c717c 100644
--- a/tools/perf/builtin-kvm.c
+++ b/tools/perf/builtin-kvm.c
@@ -63,7 +63,7 @@ static const char *get_filename_for_perf_kvm(void)
return filename;
}

-#ifdef HAVE_KVM_STAT_SUPPORT
+#if defined(HAVE_KVM_STAT_SUPPORT) && defined(HAVE_LIBTRACEEVENT)

void exit_event_get_key(struct evsel *evsel,
struct perf_sample *sample,
@@ -654,7 +654,7 @@ static void print_result(struct perf_kvm_stat *kvm)
pr_info("\nLost events: %" PRIu64 "\n\n", kvm->lost_events);
}

-#ifdef HAVE_TIMERFD_SUPPORT
+#if defined(HAVE_TIMERFD_SUPPORT) && defined(HAVE_LIBTRACEEVENT)
static int process_lost_event(struct perf_tool *tool,
union perf_event *event __maybe_unused,
struct perf_sample *sample __maybe_unused,
@@ -742,7 +742,7 @@ static bool verify_vcpu(int vcpu)
return true;
}

-#ifdef HAVE_TIMERFD_SUPPORT
+#if defined(HAVE_TIMERFD_SUPPORT) && defined(HAVE_LIBTRACEEVENT)
/* keeping the max events to a modest level to keep
* the processing of samples per mmap smooth.
*/
@@ -1290,7 +1290,7 @@ kvm_events_report(struct perf_kvm_stat *kvm, int argc, const char **argv)
return kvm_events_report_vcpu(kvm);
}

-#ifdef HAVE_TIMERFD_SUPPORT
+#if defined(HAVE_TIMERFD_SUPPORT) && defined(HAVE_LIBTRACEEVENT)
static struct evlist *kvm_live_event_list(void)
{
struct evlist *evlist;
@@ -1507,7 +1507,7 @@ static int kvm_cmd_stat(const char *file_name, int argc, const char **argv)
if (strlen(argv[1]) > 2 && strstarts("report", argv[1]))
return kvm_events_report(&kvm, argc - 1 , argv + 1);

-#ifdef HAVE_TIMERFD_SUPPORT
+#if defined(HAVE_TIMERFD_SUPPORT) && defined(HAVE_LIBTRACEEVENT)
if (!strncmp(argv[1], "live", 4))
return kvm_events_live(&kvm, argc - 1 , argv + 1);
#endif
@@ -1644,7 +1644,7 @@ int cmd_kvm(int argc, const char **argv)
return cmd_top(argc, argv);
else if (strlen(argv[0]) > 2 && strstarts("buildid-list", argv[0]))
return __cmd_buildid_list(file_name, argc, argv);
-#ifdef HAVE_KVM_STAT_SUPPORT
+#if defined(HAVE_KVM_STAT_SUPPORT) && defined(HAVE_LIBTRACEEVENT)
else if (strlen(argv[0]) > 2 && strstarts("stat", argv[0]))
return kvm_cmd_stat(file_name, argc, argv);
#endif
diff --git a/tools/perf/builtin-kwork.c b/tools/perf/builtin-kwork.c
index 4ffbf5908070..024a6a949829 100644
--- a/tools/perf/builtin-kwork.c
+++ b/tools/perf/builtin-kwork.c
@@ -23,6 +23,7 @@

#include <subcmd/pager.h>
#include <subcmd/parse-options.h>
+#include <traceevent/event-parse.h>

#include <errno.h>
#include <inttypes.h>
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
index bd462a3f2bbd..50ce5adab897 100644
--- a/tools/perf/builtin-record.c
+++ b/tools/perf/builtin-record.c
@@ -1701,8 +1701,10 @@ static void record__init_features(struct record *rec)
if (rec->no_buildid)
perf_header__clear_feat(&session->header, HEADER_BUILD_ID);

+#ifdef HAVE_LIBTRACEEVENT
if (!have_tracepoints(&rec->evlist->core.entries))
perf_header__clear_feat(&session->header, HEADER_TRACING_DATA);
+#endif

if (!rec->opts.branch_stack)
perf_header__clear_feat(&session->header, HEADER_BRANCH_STACK);
diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c
index b6d77d3da64f..2ee2ecca208e 100644
--- a/tools/perf/builtin-report.c
+++ b/tools/perf/builtin-report.c
@@ -67,6 +67,10 @@
#include <unistd.h>
#include <linux/mman.h>

+#ifdef HAVE_LIBTRACEEVENT
+#include <traceevent/event-parse.h>
+#endif
+
struct report {
struct perf_tool tool;
struct perf_session *session;
@@ -1199,7 +1203,9 @@ int cmd_report(int argc, const char **argv)
.lost = perf_event__process_lost,
.read = process_read_event,
.attr = process_attr,
+#ifdef HAVE_LIBTRACEEVENT
.tracing_data = perf_event__process_tracing_data,
+#endif
.build_id = perf_event__process_build_id,
.id_index = perf_event__process_id_index,
.auxtrace_info = perf_event__process_auxtrace_info,
@@ -1660,6 +1666,7 @@ int cmd_report(int argc, const char **argv)
report.range_num);
}

+#ifdef HAVE_LIBTRACEEVENT
if (session->tevent.pevent &&
tep_set_function_resolver(session->tevent.pevent,
machine__resolve_kernel_addr,
@@ -1668,7 +1675,7 @@ int cmd_report(int argc, const char **argv)
__func__);
return -1;
}
-
+#endif
sort__setup_elide(stdout);

ret = __cmd_report(&report);
diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c
index d7ec8c1af293..88888fb885c8 100644
--- a/tools/perf/builtin-script.c
+++ b/tools/perf/builtin-script.c
@@ -62,6 +62,9 @@
#include "perf.h"

#include <linux/ctype.h>
+#ifdef HAVE_LIBTRACEEVENT
+#include <traceevent/event-parse.h>
+#endif

static char const *script_name;
static char const *generate_script_lang;
@@ -2154,12 +2157,12 @@ static void process_event(struct perf_script *script,
perf_sample__fprintf_bts(sample, evsel, thread, al, addr_al, machine, fp);
return;
}
-
+#ifdef HAVE_LIBTRACEEVENT
if (PRINT_FIELD(TRACE) && sample->raw_data) {
event_format__fprintf(evsel->tp_format, sample->cpu,
sample->raw_data, sample->raw_size, fp);
}
-
+#endif
if (attr->type == PERF_TYPE_SYNTH && PRINT_FIELD(SYNTH))
perf_sample__fprintf_synth(sample, evsel, fp);

@@ -2283,8 +2286,10 @@ static void process_stat_interval(u64 tstamp)

static void setup_scripting(void)
{
+#ifdef HAVE_LIBTRACEEVENT
setup_perl_scripting();
setup_python_scripting();
+#endif
}

static int flush_scripting(void)
@@ -3784,7 +3789,9 @@ int cmd_script(int argc, const char **argv)
.fork = perf_event__process_fork,
.attr = process_attr,
.event_update = perf_event__process_event_update,
+#ifdef HAVE_LIBTRACEEVENT
.tracing_data = perf_event__process_tracing_data,
+#endif
.feature = process_feature_event,
.build_id = perf_event__process_build_id,
.id_index = perf_event__process_id_index,
@@ -4215,6 +4222,7 @@ int cmd_script(int argc, const char **argv)
else
symbol_conf.use_callchain = false;

+#ifdef HAVE_LIBTRACEEVENT
if (session->tevent.pevent &&
tep_set_function_resolver(session->tevent.pevent,
machine__resolve_kernel_addr,
@@ -4223,7 +4231,7 @@ int cmd_script(int argc, const char **argv)
err = -1;
goto out_delete;
}
-
+#endif
if (generate_script_lang) {
struct stat perf_stat;
int input;
@@ -4259,9 +4267,12 @@ int cmd_script(int argc, const char **argv)
err = -ENOENT;
goto out_delete;
}
-
+#ifdef HAVE_LIBTRACEEVENT
err = scripting_ops->generate_script(session->tevent.pevent,
"perf-script");
+#else
+ err = scripting_ops->generate_script(NULL, "perf-script");
+#endif
goto out_delete;
}

diff --git a/tools/perf/builtin-timechart.c b/tools/perf/builtin-timechart.c
index c36296bb7637..6c629e7d370a 100644
--- a/tools/perf/builtin-timechart.c
+++ b/tools/perf/builtin-timechart.c
@@ -38,6 +38,7 @@
#include "util/string2.h"
#include "util/tracepoint.h"
#include <linux/err.h>
+#include <traceevent/event-parse.h>

#ifdef LACKS_OPEN_MEMSTREAM_PROTOTYPE
FILE *open_memstream(char **ptr, size_t *sizeloc);
diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c
index 543c379d2a57..6909cd9f48d1 100644
--- a/tools/perf/builtin-trace.c
+++ b/tools/perf/builtin-trace.c
@@ -15,7 +15,6 @@
*/

#include "util/record.h"
-#include <traceevent/event-parse.h>
#include <api/fs/tracing_path.h>
#include <bpf/bpf.h>
#include "util/bpf_map.h"
@@ -80,6 +79,10 @@
#include <linux/ctype.h>
#include <perf/mmap.h>

+#ifdef HAVE_LIBTRACEEVENT
+#include <traceevent/event-parse.h>
+#endif
+
#ifndef O_CLOEXEC
# define O_CLOEXEC 02000000
#endif
diff --git a/tools/perf/builtin-version.c b/tools/perf/builtin-version.c
index a71f491224da..a886929ec6e5 100644
--- a/tools/perf/builtin-version.c
+++ b/tools/perf/builtin-version.c
@@ -82,6 +82,7 @@ static void library_status(void)
STATUS(HAVE_AIO_SUPPORT, aio);
STATUS(HAVE_ZSTD_SUPPORT, zstd);
STATUS(HAVE_LIBPFM, libpfm4);
+ STATUS(HAVE_LIBTRACEEVENT, libtraceevent);
}

int cmd_version(int argc, const char **argv)
diff --git a/tools/perf/perf.c b/tools/perf/perf.c
index 7af135dea1cd..82bbe0ca858b 100644
--- a/tools/perf/perf.c
+++ b/tools/perf/perf.c
@@ -70,20 +70,26 @@ static struct cmd_struct commands[] = {
{ "report", cmd_report, 0 },
{ "bench", cmd_bench, 0 },
{ "stat", cmd_stat, 0 },
+#ifdef HAVE_LIBTRACEEVENT
{ "timechart", cmd_timechart, 0 },
+#endif
{ "top", cmd_top, 0 },
{ "annotate", cmd_annotate, 0 },
{ "version", cmd_version, 0 },
{ "script", cmd_script, 0 },
+#ifdef HAVE_LIBTRACEEVENT
{ "sched", cmd_sched, 0 },
+#endif
#ifdef HAVE_LIBELF_SUPPORT
{ "probe", cmd_probe, 0 },
#endif
+#ifdef HAVE_LIBTRACEEVENT
{ "kmem", cmd_kmem, 0 },
{ "lock", cmd_lock, 0 },
+#endif
{ "kvm", cmd_kvm, 0 },
{ "test", cmd_test, 0 },
-#if defined(HAVE_LIBAUDIT_SUPPORT) || defined(HAVE_SYSCALL_TABLE_SUPPORT)
+#if defined(HAVE_LIBTRACEEVENT) && (defined(HAVE_LIBAUDIT_SUPPORT) || defined(HAVE_SYSCALL_TABLE_SUPPORT))
{ "trace", cmd_trace, 0 },
#endif
{ "inject", cmd_inject, 0 },
@@ -91,7 +97,9 @@ static struct cmd_struct commands[] = {
{ "data", cmd_data, 0 },
{ "ftrace", cmd_ftrace, 0 },
{ "daemon", cmd_daemon, 0 },
+#ifdef HAVE_LIBTRACEEVENT
{ "kwork", cmd_kwork, 0 },
+#endif
};

struct pager_config {
@@ -500,14 +508,18 @@ int main(int argc, const char **argv)
argv[0] = cmd;
}
if (strstarts(cmd, "trace")) {
-#if defined(HAVE_LIBAUDIT_SUPPORT) || defined(HAVE_SYSCALL_TABLE_SUPPORT)
- setup_path();
- argv[0] = "trace";
- return cmd_trace(argc, argv);
-#else
+#ifndef HAVE_LIBTRACEEVENT
+ fprintf(stderr,
+ "trace command not available: missing libtraceevent devel package at build time.\n");
+ goto out;
+#elif !defined(HAVE_LIBAUDIT_SUPPORT) && !defined(HAVE_SYSCALL_TABLE_SUPPORT)
fprintf(stderr,
"trace command not available: missing audit-libs devel package at build time.\n");
goto out;
+#else
+ setup_path();
+ argv[0] = "trace";
+ return cmd_trace(argc, argv);
#endif
}
/* Look for flags.. */
diff --git a/tools/perf/scripts/python/Perf-Trace-Util/Build b/tools/perf/scripts/python/Perf-Trace-Util/Build
index 7d0e33ce6aba..f65625a60704 100644
--- a/tools/perf/scripts/python/Perf-Trace-Util/Build
+++ b/tools/perf/scripts/python/Perf-Trace-Util/Build
@@ -1,3 +1,3 @@
-perf-y += Context.o
+perf-$(CONFIG_TRACEEVENT) += Context.o

CFLAGS_Context.o += $(PYTHON_EMBED_CCOPTS) -Wno-redundant-decls -Wno-strict-prototypes -Wno-unused-parameter -Wno-nested-externs
diff --git a/tools/perf/tests/Build b/tools/perf/tests/Build
index 11b69023011b..34ebc009e05a 100644
--- a/tools/perf/tests/Build
+++ b/tools/perf/tests/Build
@@ -6,13 +6,13 @@ perf-y += parse-events.o
perf-y += dso-data.o
perf-y += attr.o
perf-y += vmlinux-kallsyms.o
-perf-y += openat-syscall.o
-perf-y += openat-syscall-all-cpus.o
-perf-y += openat-syscall-tp-fields.o
-perf-y += mmap-basic.o
+perf-$(CONFIG_TRACEEVENT) += openat-syscall.o
+perf-$(CONFIG_TRACEEVENT) += openat-syscall-all-cpus.o
+perf-$(CONFIG_TRACEEVENT) += openat-syscall-tp-fields.o
+perf-$(CONFIG_TRACEEVENT) += mmap-basic.o
perf-y += perf-record.o
perf-y += evsel-roundtrip-name.o
-perf-y += evsel-tp-sched.o
+perf-$(CONFIG_TRACEEVENT) += evsel-tp-sched.o
perf-y += fdarray.o
perf-y += pmu.o
perf-y += pmu-events.o
@@ -30,7 +30,7 @@ perf-y += task-exit.o
perf-y += sw-clock.o
perf-y += mmap-thread-lookup.o
perf-y += thread-maps-share.o
-perf-y += switch-tracking.o
+perf-$(CONFIG_TRACEEVENT) += switch-tracking.o
perf-y += keep-tracking.o
perf-y += code-reading.o
perf-y += sample-parsing.o
diff --git a/tools/perf/tests/builtin-test.c b/tools/perf/tests/builtin-test.c
index 4c6ae59a4dfd..658449204ce5 100644
--- a/tools/perf/tests/builtin-test.c
+++ b/tools/perf/tests/builtin-test.c
@@ -38,9 +38,11 @@ struct test_suite *__weak arch_tests[] = {

static struct test_suite *generic_tests[] = {
&suite__vmlinux_matches_kallsyms,
+#ifdef HAVE_LIBTRACEEVENT
&suite__openat_syscall_event,
&suite__openat_syscall_event_on_all_cpus,
&suite__basic_mmap,
+#endif
&suite__mem,
&suite__parse_events,
&suite__expr,
@@ -51,8 +53,10 @@ static struct test_suite *generic_tests[] = {
&suite__dso_data_cache,
&suite__dso_data_reopen,
&suite__perf_evsel__roundtrip_name_test,
+#ifdef HAVE_LIBTRACEEVENT
&suite__perf_evsel__tp_sched_test,
&suite__syscall_openat_tp_fields,
+#endif
&suite__attr,
&suite__hists_link,
&suite__python_use,
@@ -71,7 +75,9 @@ static struct test_suite *generic_tests[] = {
&suite__thread_maps_share,
&suite__hists_output,
&suite__hists_cumulate,
+#ifdef HAVE_LIBTRACEEVENT
&suite__switch_tracking,
+#endif
&suite__fdarray__filter,
&suite__fdarray__add,
&suite__kmod_path__parse,
diff --git a/tools/perf/tests/parse-events.c b/tools/perf/tests/parse-events.c
index 3440dd2616b0..dcbfb93287e8 100644
--- a/tools/perf/tests/parse-events.c
+++ b/tools/perf/tests/parse-events.c
@@ -46,6 +46,7 @@ static bool kvm_s390_create_vm_valid(void)
}
#endif

+#ifdef HAVE_LIBTRACEEVENT
static int test__checkevent_tracepoint(struct evlist *evlist)
{
struct evsel *evsel = evlist__first(evlist);
@@ -76,6 +77,7 @@ static int test__checkevent_tracepoint_multi(struct evlist *evlist)
}
return TEST_OK;
}
+#endif /* HAVE_LIBTRACEEVENT */

static int test__checkevent_raw(struct evlist *evlist)
{
@@ -222,6 +224,7 @@ static int test__checkevent_breakpoint_rw(struct evlist *evlist)
return TEST_OK;
}

+#ifdef HAVE_LIBTRACEEVENT
static int test__checkevent_tracepoint_modifier(struct evlist *evlist)
{
struct evsel *evsel = evlist__first(evlist);
@@ -252,6 +255,7 @@ test__checkevent_tracepoint_multi_modifier(struct evlist *evlist)

return test__checkevent_tracepoint_multi(evlist);
}
+#endif /* HAVE_LIBTRACEEVENT */

static int test__checkevent_raw_modifier(struct evlist *evlist)
{
@@ -453,6 +457,7 @@ static int test__checkevent_pmu(struct evlist *evlist)
return TEST_OK;
}

+#ifdef HAVE_LIBTRACEEVENT
static int test__checkevent_list(struct evlist *evlist)
{
struct evsel *evsel = evlist__first(evlist);
@@ -491,6 +496,7 @@ static int test__checkevent_list(struct evlist *evlist)

return TEST_OK;
}
+#endif

static int test__checkevent_pmu_name(struct evlist *evlist)
{
@@ -762,6 +768,7 @@ static int test__group2(struct evlist *evlist)
return TEST_OK;
}

+#ifdef HAVE_LIBTRACEEVENT
static int test__group3(struct evlist *evlist __maybe_unused)
{
struct evsel *evsel, *leader;
@@ -853,6 +860,7 @@ static int test__group3(struct evlist *evlist __maybe_unused)

return TEST_OK;
}
+#endif

static int test__group4(struct evlist *evlist __maybe_unused)
{
@@ -1460,6 +1468,7 @@ static int test__sym_event_dc(struct evlist *evlist)
return TEST_OK;
}

+#ifdef HAVE_LIBTRACEEVENT
static int count_tracepoints(void)
{
struct dirent *events_ent;
@@ -1513,6 +1522,7 @@ static int test__all_tracepoints(struct evlist *evlist)

return test__checkevent_tracepoint_multi(evlist);
}
+#endif /* HAVE_LIBTRACEVENT */

static int test__hybrid_hw_event_with_pmu(struct evlist *evlist)
{
@@ -1642,6 +1652,7 @@ struct evlist_test {
};

static const struct evlist_test test__events[] = {
+#ifdef HAVE_LIBTRACEEVENT
{
.name = "syscalls:sys_enter_openat",
.check = test__checkevent_tracepoint,
@@ -1652,6 +1663,7 @@ static const struct evlist_test test__events[] = {
.check = test__checkevent_tracepoint_multi,
/* 1 */
},
+#endif
{
.name = "r1a",
.check = test__checkevent_raw,
@@ -1702,6 +1714,7 @@ static const struct evlist_test test__events[] = {
.check = test__checkevent_breakpoint_w,
/* 1 */
},
+#ifdef HAVE_LIBTRACEEVENT
{
.name = "syscalls:sys_enter_openat:k",
.check = test__checkevent_tracepoint_modifier,
@@ -1712,6 +1725,7 @@ static const struct evlist_test test__events[] = {
.check = test__checkevent_tracepoint_multi_modifier,
/* 3 */
},
+#endif
{
.name = "r1a:kp",
.check = test__checkevent_raw_modifier,
@@ -1757,11 +1771,13 @@ static const struct evlist_test test__events[] = {
.check = test__checkevent_breakpoint_w_modifier,
/* 2 */
},
+#ifdef HAVE_LIBTRACEEVENT
{
.name = "r1,syscalls:sys_enter_openat:k,1:1:hp",
.check = test__checkevent_list,
/* 3 */
},
+#endif
{
.name = "instructions:G",
.check = test__checkevent_exclude_host_modifier,
@@ -1792,11 +1808,13 @@ static const struct evlist_test test__events[] = {
.check = test__group2,
/* 9 */
},
+#ifdef HAVE_LIBTRACEEVENT
{
.name = "group1{syscalls:sys_enter_openat:H,cycles:kppp},group2{cycles,1:3}:G,instructions:u",
.check = test__group3,
/* 0 */
},
+#endif
{
.name = "{cycles:u,instructions:kp}:p",
.check = test__group4,
@@ -1807,11 +1825,13 @@ static const struct evlist_test test__events[] = {
.check = test__group5,
/* 2 */
},
+#ifdef HAVE_LIBTRACEEVENT
{
.name = "*:*",
.check = test__all_tracepoints,
/* 3 */
},
+#endif
{
.name = "{cycles,cache-misses:G}:H",
.check = test__group_gh1,
diff --git a/tools/perf/util/Build b/tools/perf/util/Build
index ab37f588ee8b..612406311e27 100644
--- a/tools/perf/util/Build
+++ b/tools/perf/util/Build
@@ -69,17 +69,17 @@ perf-y += namespaces.o
perf-y += comm.o
perf-y += thread.o
perf-y += thread_map.o
-perf-y += trace-event-parse.o
perf-y += parse-events-flex.o
perf-y += parse-events-bison.o
perf-y += pmu.o
perf-y += pmu-flex.o
perf-y += pmu-bison.o
perf-y += pmu-hybrid.o
-perf-y += trace-event-read.o
-perf-y += trace-event-info.o
-perf-y += trace-event-scripting.o
-perf-y += trace-event.o
+perf-$(CONFIG_TRACEEVENT) += trace-event-info.o
+perf-$(CONFIG_TRACEEVENT) += trace-event-scripting.o
+perf-$(CONFIG_TRACEEVENT) += trace-event.o
+perf-$(CONFIG_TRACEEVENT) += trace-event-parse.o
+perf-$(CONFIG_TRACEEVENT) += trace-event-read.o
perf-y += svghelper.o
perf-y += sort.o
perf-y += hist.o
diff --git a/tools/perf/util/data-convert-bt.c b/tools/perf/util/data-convert-bt.c
index c65cdaf6975e..8031b586e813 100644
--- a/tools/perf/util/data-convert-bt.c
+++ b/tools/perf/util/data-convert-bt.c
@@ -19,7 +19,6 @@
#include <babeltrace/ctf-writer/event-fields.h>
#include <babeltrace/ctf-ir/utils.h>
#include <babeltrace/ctf/events.h>
-#include <traceevent/event-parse.h>
#include "asm/bug.h"
#include "data-convert.h"
#include "session.h"
@@ -36,6 +35,10 @@
#include "clockid.h"
#include "util/sample.h"

+#ifdef HAVE_LIBTRACEEVENT
+#include <traceevent/event-parse.h>
+#endif
+
#define pr_N(n, fmt, ...) \
eprintf(n, debug_data_convert, fmt, ##__VA_ARGS__)

diff --git a/tools/perf/util/data-convert-json.c b/tools/perf/util/data-convert-json.c
index 57db59068cb6..ba9d93ce9463 100644
--- a/tools/perf/util/data-convert-json.c
+++ b/tools/perf/util/data-convert-json.c
@@ -27,6 +27,10 @@
#include "util/thread.h"
#include "util/tool.h"

+#ifdef HAVE_LIBTRACEEVENT
+#include <traceevent/event-parse.h>
+#endif
+
struct convert_json {
struct perf_tool tool;
FILE *out;
@@ -217,6 +221,7 @@ static int process_sample_event(struct perf_tool *tool,
}
output_json_format(out, false, 3, "]");

+#ifdef HAVE_LIBTRACEEVENT
if (sample->raw_data) {
int i;
struct tep_format_field **fields;
@@ -236,7 +241,7 @@ static int process_sample_event(struct perf_tool *tool,
free(fields);
}
}
-
+#endif
output_json_format(out, false, 2, "}");
return 0;
}
@@ -313,7 +318,9 @@ int bt_convert__perf2json(const char *input_name, const char *output_name,
.exit = perf_event__process_exit,
.fork = perf_event__process_fork,
.lost = perf_event__process_lost,
+#ifdef HAVE_LIBTRACEEVENT
.tracing_data = perf_event__process_tracing_data,
+#endif
.build_id = perf_event__process_build_id,
.id_index = perf_event__process_id_index,
.auxtrace_info = perf_event__process_auxtrace_info,
diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c
index fbf3192bced9..590d4e77effc 100644
--- a/tools/perf/util/evlist.c
+++ b/tools/perf/util/evlist.c
@@ -290,6 +290,7 @@ struct evsel *evlist__add_aux_dummy(struct evlist *evlist, bool system_wide)
return evsel;
}

+#ifdef HAVE_LIBTRACEEVENT
struct evsel *evlist__add_sched_switch(struct evlist *evlist, bool system_wide)
{
struct evsel *evsel = evsel__newtp_idx("sched", "sched_switch", 0);
@@ -305,7 +306,8 @@ struct evsel *evlist__add_sched_switch(struct evlist *evlist, bool system_wide)

evlist__add(evlist, evsel);
return evsel;
-};
+}
+#endif

int evlist__add_attrs(struct evlist *evlist, struct perf_event_attr *attrs, size_t nr_attrs)
{
@@ -376,6 +378,7 @@ struct evsel *evlist__find_tracepoint_by_name(struct evlist *evlist, const char
return NULL;
}

+#ifdef HAVE_LIBTRACEEVENT
int evlist__add_newtp(struct evlist *evlist, const char *sys, const char *name, void *handler)
{
struct evsel *evsel = evsel__newtp(sys, name);
@@ -387,6 +390,7 @@ int evlist__add_newtp(struct evlist *evlist, const char *sys, const char *name,
evlist__add(evlist, evsel);
return 0;
}
+#endif

struct evlist_cpu_iterator evlist__cpu_begin(struct evlist *evlist, struct affinity *affinity)
{
diff --git a/tools/perf/util/evlist.h b/tools/perf/util/evlist.h
index 16734c6756b3..e5b84ead566c 100644
--- a/tools/perf/util/evlist.h
+++ b/tools/perf/util/evlist.h
@@ -127,7 +127,9 @@ static inline struct evsel *evlist__add_dummy_on_all_cpus(struct evlist *evlist)
{
return evlist__add_aux_dummy(evlist, true);
}
+#ifdef HAVE_LIBTRACEEVENT
struct evsel *evlist__add_sched_switch(struct evlist *evlist, bool system_wide);
+#endif

int evlist__add_sb_event(struct evlist *evlist, struct perf_event_attr *attr,
evsel__sb_cb_t cb, void *data);
@@ -135,7 +137,9 @@ void evlist__set_cb(struct evlist *evlist, evsel__sb_cb_t cb, void *data);
int evlist__start_sb_thread(struct evlist *evlist, struct target *target);
void evlist__stop_sb_thread(struct evlist *evlist);

+#ifdef HAVE_LIBTRACEEVENT
int evlist__add_newtp(struct evlist *evlist, const char *sys, const char *name, void *handler);
+#endif

int __evlist__set_tracepoints_handlers(struct evlist *evlist,
const struct evsel_str_handler *assocs,
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
index 0f617359a82f..ca911856c4b1 100644
--- a/tools/perf/util/evsel.c
+++ b/tools/perf/util/evsel.c
@@ -12,7 +12,6 @@
#include <linux/bitops.h>
#include <api/fs/fs.h>
#include <api/fs/tracing_path.h>
-#include <traceevent/event-parse.h>
#include <linux/hw_breakpoint.h>
#include <linux/perf_event.h>
#include <linux/compiler.h>
@@ -57,6 +56,10 @@

#include <linux/ctype.h>

+#ifdef HAVE_LIBTRACEEVENT
+#include <traceevent/event-parse.h>
+#endif
+
struct perf_missing_features perf_missing_features;

static clockid_t clockid;
@@ -439,7 +442,9 @@ struct evsel *evsel__clone(struct evsel *orig)
goto out_err;
}
evsel->cgrp = cgroup__get(orig->cgrp);
+#ifdef HAVE_LIBTRACEEVENT
evsel->tp_format = orig->tp_format;
+#endif
evsel->handler = orig->handler;
evsel->core.leader = orig->core.leader;

@@ -479,6 +484,7 @@ struct evsel *evsel__clone(struct evsel *orig)
/*
* Returns pointer with encoded error via <linux/err.h> interface.
*/
+#ifdef HAVE_LIBTRACEEVENT
struct evsel *evsel__newtp_idx(const char *sys, const char *name, int idx)
{
struct evsel *evsel = zalloc(perf_evsel__object.size);
@@ -516,6 +522,7 @@ struct evsel *evsel__newtp_idx(const char *sys, const char *name, int idx)
out_err:
return ERR_PTR(err);
}
+#endif

const char *const evsel__hw_names[PERF_COUNT_HW_MAX] = {
"cycles",
@@ -2758,6 +2765,7 @@ u16 evsel__id_hdr_size(struct evsel *evsel)
return size;
}

+#ifdef HAVE_LIBTRACEEVENT
struct tep_format_field *evsel__field(struct evsel *evsel, const char *name)
{
return tep_find_field(evsel->tp_format, name);
@@ -2831,6 +2839,7 @@ u64 evsel__intval(struct evsel *evsel, struct perf_sample *sample, const char *n

return field ? format_field__intval(field, sample, evsel->needs_swap) : 0;
}
+#endif

bool evsel__fallback(struct evsel *evsel, int err, char *msg, size_t msgsize)
{
diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h
index f3485799ddf9..d572be41b960 100644
--- a/tools/perf/util/evsel.h
+++ b/tools/perf/util/evsel.h
@@ -72,7 +72,9 @@ struct evsel {
char *name;
char *group_name;
const char *pmu_name;
+#ifdef HAVE_LIBTRACEEVENT
struct tep_event *tp_format;
+#endif
char *filter;
unsigned long max_events;
double scale;
@@ -223,11 +225,14 @@ static inline struct evsel *evsel__new(struct perf_event_attr *attr)
}

struct evsel *evsel__clone(struct evsel *orig);
-struct evsel *evsel__newtp_idx(const char *sys, const char *name, int idx);

int copy_config_terms(struct list_head *dst, struct list_head *src);
void free_config_terms(struct list_head *config_terms);

+
+#ifdef HAVE_LIBTRACEEVENT
+struct evsel *evsel__newtp_idx(const char *sys, const char *name, int idx);
+
/*
* Returns pointer with encoded error via <linux/err.h> interface.
*/
@@ -235,10 +240,13 @@ static inline struct evsel *evsel__newtp(const char *sys, const char *name)
{
return evsel__newtp_idx(sys, name, 0);
}
+#endif

struct evsel *evsel__new_cycles(bool precise, __u32 type, __u64 config);

+#ifdef HAVE_LIBTRACEEVENT
struct tep_event *event_format__new(const char *sys, const char *name);
+#endif

void evsel__init(struct evsel *evsel, struct perf_event_attr *attr, int idx);
void evsel__exit(struct evsel *evsel);
@@ -323,6 +331,7 @@ bool evsel__precise_ip_fallback(struct evsel *evsel);

struct perf_sample;

+#ifdef HAVE_LIBTRACEEVENT
void *evsel__rawptr(struct evsel *evsel, struct perf_sample *sample, const char *name);
u64 evsel__intval(struct evsel *evsel, struct perf_sample *sample, const char *name);

@@ -330,6 +339,7 @@ static inline char *evsel__strval(struct evsel *evsel, struct perf_sample *sampl
{
return evsel__rawptr(evsel, sample, name);
}
+#endif

struct tep_format_field;

diff --git a/tools/perf/util/evsel_fprintf.c b/tools/perf/util/evsel_fprintf.c
index 8c2ea8001329..bd22c4932d10 100644
--- a/tools/perf/util/evsel_fprintf.c
+++ b/tools/perf/util/evsel_fprintf.c
@@ -2,7 +2,6 @@
#include <inttypes.h>
#include <stdio.h>
#include <stdbool.h>
-#include <traceevent/event-parse.h>
#include "evsel.h"
#include "util/evsel_fprintf.h"
#include "util/event.h"
@@ -13,6 +12,10 @@
#include "srcline.h"
#include "dso.h"

+#ifdef HAVE_LIBTRACEEVENT
+#include <traceevent/event-parse.h>
+#endif
+
static int comma_fprintf(FILE *fp, bool *first, const char *fmt, ...)
{
va_list args;
@@ -74,6 +77,7 @@ int evsel__fprintf(struct evsel *evsel, struct perf_attr_details *details, FILE
term, (u64)evsel->core.attr.sample_freq);
}

+#ifdef HAVE_LIBTRACEEVENT
if (details->trace_fields) {
struct tep_format_field *field;

@@ -96,6 +100,7 @@ int evsel__fprintf(struct evsel *evsel, struct perf_attr_details *details, FILE
field = field->next;
}
}
+#endif
out:
fputc('\n', fp);
return ++printed;
diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c
index 98dfaf84bd13..85c7b27e0cb4 100644
--- a/tools/perf/util/header.c
+++ b/tools/perf/util/header.c
@@ -6,6 +6,7 @@
#include <sys/types.h>
#include <byteswap.h>
#include <unistd.h>
+#include <regex.h>
#include <stdio.h>
#include <stdlib.h>
#include <linux/compiler.h>
@@ -55,6 +56,10 @@
#include <linux/ctype.h>
#include <internal/lib.h>

+#ifdef HAVE_LIBTRACEEVENT
+#include <traceevent/event-parse.h>
+#endif
+
/*
* magic2 = "PERFILE2"
* must be a numerical value to let the endianness
@@ -298,6 +303,7 @@ static int do_read_bitmap(struct feat_fd *ff, unsigned long **pset, u64 *psize)
return 0;
}

+#ifdef HAVE_LIBTRACEEVENT
static int write_tracing_data(struct feat_fd *ff,
struct evlist *evlist)
{
@@ -306,6 +312,7 @@ static int write_tracing_data(struct feat_fd *ff,

return read_tracing_data(ff->fd, &evlist->core.entries);
}
+#endif

static int write_build_id(struct feat_fd *ff,
struct evlist *evlist __maybe_unused)
@@ -2394,12 +2401,14 @@ FEAT_PROCESS_STR_FUN(arch, arch);
FEAT_PROCESS_STR_FUN(cpudesc, cpu_desc);
FEAT_PROCESS_STR_FUN(cpuid, cpuid);

+#ifdef HAVE_LIBTRACEEVENT
static int process_tracing_data(struct feat_fd *ff, void *data)
{
ssize_t ret = trace_report(ff->fd, data, false);

return ret < 0 ? -1 : 0;
}
+#endif

static int process_build_id(struct feat_fd *ff, void *data __maybe_unused)
{
@@ -3366,7 +3375,9 @@ static int process_pmu_caps(struct feat_fd *ff, void *data __maybe_unused)
const struct perf_header_feature_ops feat_ops[HEADER_LAST_FEATURE];

const struct perf_header_feature_ops feat_ops[HEADER_LAST_FEATURE] = {
+#ifdef HAVE_LIBTRACEEVENT
FEAT_OPN(TRACING_DATA, tracing_data, false),
+#endif
FEAT_OPN(BUILD_ID, build_id, false),
FEAT_OPR(HOSTNAME, hostname, false),
FEAT_OPR(OSRELEASE, osrelease, false),
@@ -4082,6 +4093,7 @@ static int read_attr(int fd, struct perf_header *ph,
return ret <= 0 ? -1 : 0;
}

+#ifdef HAVE_LIBTRACEEVENT
static int evsel__prepare_tracepoint_event(struct evsel *evsel, struct tep_handle *pevent)
{
struct tep_event *event;
@@ -4125,6 +4137,7 @@ static int evlist__prepare_tracepoint_events(struct evlist *evlist, struct tep_h

return 0;
}
+#endif

int perf_session__read_header(struct perf_session *session, int repipe_fd)
{
@@ -4230,11 +4243,15 @@ int perf_session__read_header(struct perf_session *session, int repipe_fd)
lseek(fd, tmp, SEEK_SET);
}

+#ifdef HAVE_LIBTRACEEVENT
perf_header__process_sections(header, fd, &session->tevent,
perf_file_section__process);

if (evlist__prepare_tracepoint_events(session->evlist, session->tevent.pevent))
goto out_delete_evlist;
+#else
+ perf_header__process_sections(header, fd, NULL, perf_file_section__process);
+#endif

return 0;
out_errno:
@@ -4412,6 +4429,7 @@ int perf_event__process_event_update(struct perf_tool *tool __maybe_unused,
return 0;
}

+#ifdef HAVE_LIBTRACEEVENT
int perf_event__process_tracing_data(struct perf_session *session,
union perf_event *event)
{
@@ -4459,6 +4477,7 @@ int perf_event__process_tracing_data(struct perf_session *session,

return size_read + padding;
}
+#endif

int perf_event__process_build_id(struct perf_session *session,
union perf_event *event)
diff --git a/tools/perf/util/header.h b/tools/perf/util/header.h
index 2d5e601ba60f..e3861ae62172 100644
--- a/tools/perf/util/header.h
+++ b/tools/perf/util/header.h
@@ -160,8 +160,10 @@ int perf_event__process_event_update(struct perf_tool *tool,
union perf_event *event,
struct evlist **pevlist);
size_t perf_event__fprintf_event_update(union perf_event *event, FILE *fp);
+#ifdef HAVE_LIBTRACEEVENT
int perf_event__process_tracing_data(struct perf_session *session,
union perf_event *event);
+#endif
int perf_event__process_build_id(struct perf_session *session,
union perf_event *event);
bool is_perf_magic(u64 magic);
diff --git a/tools/perf/util/intel-pt.c b/tools/perf/util/intel-pt.c
index e3548ddef254..6d3921627e33 100644
--- a/tools/perf/util/intel-pt.c
+++ b/tools/perf/util/intel-pt.c
@@ -3142,6 +3142,7 @@ static int intel_pt_sync_switch(struct intel_pt *pt, int cpu, pid_t tid,
return 1;
}

+#ifdef HAVE_LIBTRACEEVENT
static int intel_pt_process_switch(struct intel_pt *pt,
struct perf_sample *sample)
{
@@ -3165,6 +3166,7 @@ static int intel_pt_process_switch(struct intel_pt *pt,

return machine__set_current_tid(pt->machine, cpu, -1, tid);
}
+#endif /* HAVE_LIBTRACEEVENT */

static int intel_pt_context_switch_in(struct intel_pt *pt,
struct perf_sample *sample)
@@ -3433,9 +3435,12 @@ static int intel_pt_process_event(struct perf_session *session,
return err;
}

+#ifdef HAVE_LIBTRACEEVENT
if (pt->switch_evsel && event->header.type == PERF_RECORD_SAMPLE)
err = intel_pt_process_switch(pt, sample);
- else if (event->header.type == PERF_RECORD_ITRACE_START)
+ else
+#endif
+ if (event->header.type == PERF_RECORD_ITRACE_START)
err = intel_pt_process_itrace_start(pt, event, sample);
else if (event->header.type == PERF_RECORD_AUX_OUTPUT_HW_ID)
err = intel_pt_process_aux_output_hw_id(pt, event, sample);
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index 6502cd679f57..21cce83462b3 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -445,6 +445,7 @@ int parse_events_add_cache(struct list_head *list, int *idx,
return ret;
}

+#ifdef HAVE_LIBTRACEEVENT
static void tracepoint_error(struct parse_events_error *e, int err,
const char *sys, const char *name)
{
@@ -593,6 +594,7 @@ static int add_tracepoint_multi_sys(struct list_head *list, int *idx,
closedir(events_dir);
return ret;
}
+#endif /* HAVE_LIBTRACEEVENT */

#ifdef HAVE_LIBBPF_SUPPORT
struct __add_bpf_event_param {
@@ -1143,6 +1145,7 @@ static int config_term_pmu(struct perf_event_attr *attr,
return config_term_common(attr, term, err);
}

+#ifdef HAVE_LIBTRACEEVENT
static int config_term_tracepoint(struct perf_event_attr *attr,
struct parse_events_term *term,
struct parse_events_error *err)
@@ -1170,6 +1173,7 @@ static int config_term_tracepoint(struct perf_event_attr *attr,

return 0;
}
+#endif

static int config_attr(struct perf_event_attr *attr,
struct list_head *head,
@@ -1325,6 +1329,7 @@ int parse_events_add_tracepoint(struct list_head *list, int *idx,
struct parse_events_error *err,
struct list_head *head_config)
{
+#ifdef HAVE_LIBTRACEEVENT
if (head_config) {
struct perf_event_attr attr;

@@ -1339,6 +1344,16 @@ int parse_events_add_tracepoint(struct list_head *list, int *idx,
else
return add_tracepoint_event(list, idx, sys, event,
err, head_config);
+#else
+ (void)list;
+ (void)idx;
+ (void)sys;
+ (void)event;
+ (void)head_config;
+ parse_events_error__handle(err, 0, strdup("unsupported tracepoint"),
+ strdup("libtraceevent is necessary for tracepoint support"));
+ return -1;
+#endif
}

int parse_events_add_numeric(struct parse_events_state *parse_state,
diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h
index 07df7bb7b042..428e72eaafcc 100644
--- a/tools/perf/util/parse-events.h
+++ b/tools/perf/util/parse-events.h
@@ -18,7 +18,6 @@ struct parse_events_error;
struct option;
struct perf_pmu;

-bool have_tracepoints(struct list_head *evlist);
bool is_event_supported(u8 type, u64 config);

const char *event_type(int type);
diff --git a/tools/perf/util/python.c b/tools/perf/util/python.c
index b5941c74a0d6..728fe2f51759 100644
--- a/tools/perf/util/python.c
+++ b/tools/perf/util/python.c
@@ -417,6 +417,7 @@ static PyObject *pyrf_sample_event__repr(struct pyrf_event *pevent)
return ret;
}

+#ifdef HAVE_LIBTRACEEVENT
static bool is_tracepoint(struct pyrf_event *pevent)
{
return pevent->evsel->core.attr.type == PERF_TYPE_TRACEPOINT;
@@ -486,14 +487,17 @@ get_tracepoint_field(struct pyrf_event *pevent, PyObject *attr_name)

return tracepoint_field(pevent, field);
}
+#endif /* HAVE_LIBTRACEEVENT */

static PyObject*
pyrf_sample_event__getattro(struct pyrf_event *pevent, PyObject *attr_name)
{
PyObject *obj = NULL;

+#ifdef HAVE_LIBTRACEEVENT
if (is_tracepoint(pevent))
obj = get_tracepoint_field(pevent, attr_name);
+#endif

return obj ?: PyObject_GenericGetAttr((PyObject *) pevent, attr_name);
}
diff --git a/tools/perf/util/scripting-engines/Build b/tools/perf/util/scripting-engines/Build
index 0f5ba28339cf..77544d2c447c 100644
--- a/tools/perf/util/scripting-engines/Build
+++ b/tools/perf/util/scripting-engines/Build
@@ -1,5 +1,7 @@
-perf-$(CONFIG_LIBPERL) += trace-event-perl.o
-perf-$(CONFIG_LIBPYTHON) += trace-event-python.o
+ifeq ($(CONFIG_TRACEEVENT),y)
+ perf-$(CONFIG_LIBPERL) += trace-event-perl.o
+ perf-$(CONFIG_LIBPYTHON) += trace-event-python.o
+endif

CFLAGS_trace-event-perl.o += $(PERL_EMBED_CCOPTS) -Wno-redundant-decls -Wno-strict-prototypes -Wno-unused-parameter -Wno-shadow -Wno-nested-externs -Wno-undef -Wno-switch-default -Wno-bad-function-cast -Wno-declaration-after-statement -Wno-switch-enum

diff --git a/tools/perf/util/scripting-engines/trace-event-python.c b/tools/perf/util/scripting-engines/trace-event-python.c
index 1cf65db8f861..5b7db76fc3ba 100644
--- a/tools/perf/util/scripting-engines/trace-event-python.c
+++ b/tools/perf/util/scripting-engines/trace-event-python.c
@@ -30,6 +30,7 @@
#include <linux/bitmap.h>
#include <linux/compiler.h>
#include <linux/time64.h>
+#include <traceevent/event-parse.h>

#include "../build-id.h"
#include "../counts.h"
diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
index 0e1a3d6bacb9..c1aa5cb656a6 100644
--- a/tools/perf/util/session.c
+++ b/tools/perf/util/session.c
@@ -314,7 +314,9 @@ void perf_session__delete(struct perf_session *session)
evlist__delete(session->evlist);
perf_data__close(session->data);
}
+#ifdef HAVE_LIBTRACEEVENT
trace_event__cleanup(&session->tevent);
+#endif
free(session);
}

diff --git a/tools/perf/util/session.h b/tools/perf/util/session.h
index be5871ea558f..ee3715e8563b 100644
--- a/tools/perf/util/session.h
+++ b/tools/perf/util/session.h
@@ -33,7 +33,9 @@ struct perf_session {
struct auxtrace *auxtrace;
struct itrace_synth_opts *itrace_synth_opts;
struct list_head auxtrace_index;
+#ifdef HAVE_LIBTRACEEVENT
struct trace_event tevent;
+#endif
struct perf_record_time_conv time_conv;
bool repipe;
bool one_mmap;
diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c
index 2e7330867e2e..c7a97b33e134 100644
--- a/tools/perf/util/sort.c
+++ b/tools/perf/util/sort.c
@@ -22,7 +22,6 @@
#include "srcline.h"
#include "strlist.h"
#include "strbuf.h"
-#include <traceevent/event-parse.h>
#include "mem-events.h"
#include "annotate.h"
#include "event.h"
@@ -32,6 +31,10 @@
#include <linux/kernel.h>
#include <linux/string.h>

+#ifdef HAVE_LIBTRACEEVENT
+#include <traceevent/event-parse.h>
+#endif
+
regex_t parent_regex;
const char default_parent_pattern[] = "^sys_|^do_page_fault";
const char *parent_pattern = default_parent_pattern;
@@ -743,6 +746,7 @@ struct sort_entry sort_time = {

/* --sort trace */

+#ifdef HAVE_LIBTRACEEVENT
static char *get_trace_output(struct hist_entry *he)
{
struct trace_seq seq;
@@ -806,6 +810,7 @@ struct sort_entry sort_trace = {
.se_snprintf = hist_entry__trace_snprintf,
.se_width_idx = HISTC_TRACE,
};
+#endif /* HAVE_LIBTRACEEVENT */

/* sort keys for branch stacks */

@@ -2022,7 +2027,9 @@ static struct sort_dimension common_sort_dimensions[] = {
DIM(SORT_LOCAL_WEIGHT, "local_weight", sort_local_weight),
DIM(SORT_GLOBAL_WEIGHT, "weight", sort_global_weight),
DIM(SORT_TRANSACTION, "transaction", sort_transaction),
+#ifdef HAVE_LIBTRACEEVENT
DIM(SORT_TRACE, "trace", sort_trace),
+#endif
DIM(SORT_SYM_SIZE, "symbol_size", sort_sym_size),
DIM(SORT_DSO_SIZE, "dso_size", sort_dso_size),
DIM(SORT_CGROUP, "cgroup", sort_cgroup),
@@ -2206,7 +2213,14 @@ bool perf_hpp__is_ ## key ## _entry(struct perf_hpp_fmt *fmt) \
return hse->se == &sort_ ## key ; \
}

+#ifdef HAVE_LIBTRACEEVENT
MK_SORT_ENTRY_CHK(trace)
+#else
+bool perf_hpp__is_trace_entry(struct perf_hpp_fmt *fmt __maybe_unused)
+{
+ return false;
+}
+#endif
MK_SORT_ENTRY_CHK(srcline)
MK_SORT_ENTRY_CHK(srcfile)
MK_SORT_ENTRY_CHK(thread)
@@ -2347,6 +2361,17 @@ static int __sort_dimension__add_hpp_output(struct sort_dimension *sd,
return 0;
}

+#ifndef HAVE_LIBTRACEEVENT
+bool perf_hpp__is_dynamic_entry(struct perf_hpp_fmt *fmt __maybe_unused)
+{
+ return false;
+}
+bool perf_hpp__defined_dynamic_entry(struct perf_hpp_fmt *fmt __maybe_unused,
+ struct hists *hists __maybe_unused)
+{
+ return false;
+}
+#else
struct hpp_dynamic_entry {
struct perf_hpp_fmt hpp;
struct evsel *evsel;
@@ -2621,6 +2646,7 @@ __alloc_dynamic_entry(struct evsel *evsel, struct tep_format_field *field,

return hde;
}
+#endif /* HAVE_LIBTRACEEVENT */

struct perf_hpp_fmt *perf_hpp_fmt__dup(struct perf_hpp_fmt *fmt)
{
@@ -2633,6 +2659,7 @@ struct perf_hpp_fmt *perf_hpp_fmt__dup(struct perf_hpp_fmt *fmt)
new_hse = memdup(hse, sizeof(*hse));
if (new_hse)
new_fmt = &new_hse->hpp;
+#ifdef HAVE_LIBTRACEEVENT
} else if (perf_hpp__is_dynamic_entry(fmt)) {
struct hpp_dynamic_entry *hde, *new_hde;

@@ -2640,6 +2667,7 @@ struct perf_hpp_fmt *perf_hpp_fmt__dup(struct perf_hpp_fmt *fmt)
new_hde = memdup(hde, sizeof(*hde));
if (new_hde)
new_fmt = &new_hde->hpp;
+#endif
} else {
new_fmt = memdup(fmt, sizeof(*fmt));
}
@@ -2719,6 +2747,7 @@ static struct evsel *find_evsel(struct evlist *evlist, char *event_name)
return evsel;
}

+#ifdef HAVE_LIBTRACEEVENT
static int __dynamic_dimension__add(struct evsel *evsel,
struct tep_format_field *field,
bool raw_trace, int level)
@@ -2789,13 +2818,13 @@ static int add_all_matching_fields(struct evlist *evlist,
}
return ret;
}
+#endif /* HAVE_LIBTRACEEVENT */

static int add_dynamic_entry(struct evlist *evlist, const char *tok,
int level)
{
char *str, *event_name, *field_name, *opt_name;
struct evsel *evsel;
- struct tep_format_field *field;
bool raw_trace = symbol_conf.raw_trace;
int ret = 0;

@@ -2820,6 +2849,7 @@ static int add_dynamic_entry(struct evlist *evlist, const char *tok,
raw_trace = true;
}

+#ifdef HAVE_LIBTRACEEVENT
if (!strcmp(field_name, "trace_fields")) {
ret = add_all_dynamic_fields(evlist, raw_trace, level);
goto out;
@@ -2829,6 +2859,7 @@ static int add_dynamic_entry(struct evlist *evlist, const char *tok,
ret = add_all_matching_fields(evlist, field_name, raw_trace, level);
goto out;
}
+#endif

evsel = find_evsel(evlist, event_name);
if (evsel == NULL) {
@@ -2843,10 +2874,12 @@ static int add_dynamic_entry(struct evlist *evlist, const char *tok,
goto out;
}

+#ifdef HAVE_LIBTRACEEVENT
if (!strcmp(field_name, "*")) {
ret = add_evsel_fields(evsel, raw_trace, level);
} else {
- field = tep_find_any_field(evsel->tp_format, field_name);
+ struct tep_format_field *field = tep_find_any_field(evsel->tp_format, field_name);
+
if (field == NULL) {
pr_debug("Cannot find event field for %s.%s\n",
event_name, field_name);
@@ -2855,6 +2888,10 @@ static int add_dynamic_entry(struct evlist *evlist, const char *tok,

ret = __dynamic_dimension__add(evsel, field, raw_trace, level);
}
+#else
+ (void)level;
+ (void)raw_trace;
+#endif /* HAVE_LIBTRACEEVENT */

out:
free(str);
@@ -2955,11 +2992,11 @@ int sort_dimension__add(struct perf_hpp_list *list, const char *tok,
for (i = 0; i < ARRAY_SIZE(common_sort_dimensions); i++) {
struct sort_dimension *sd = &common_sort_dimensions[i];

- if (strncasecmp(tok, sd->name, strlen(tok)))
+ if (!sd->name || strncasecmp(tok, sd->name, strlen(tok)))
continue;

for (j = 0; j < ARRAY_SIZE(dynamic_headers); j++) {
- if (!strcmp(dynamic_headers[j], sd->name))
+ if (sd->name && !strcmp(dynamic_headers[j], sd->name))
sort_dimension_add_dynamic_header(sd);
}

@@ -3009,7 +3046,7 @@ int sort_dimension__add(struct perf_hpp_list *list, const char *tok,
for (i = 0; i < ARRAY_SIZE(bstack_sort_dimensions); i++) {
struct sort_dimension *sd = &bstack_sort_dimensions[i];

- if (strncasecmp(tok, sd->name, strlen(tok)))
+ if (!sd->name || strncasecmp(tok, sd->name, strlen(tok)))
continue;

if (sort__mode != SORT_MODE__BRANCH)
@@ -3025,7 +3062,7 @@ int sort_dimension__add(struct perf_hpp_list *list, const char *tok,
for (i = 0; i < ARRAY_SIZE(memory_sort_dimensions); i++) {
struct sort_dimension *sd = &memory_sort_dimensions[i];

- if (strncasecmp(tok, sd->name, strlen(tok)))
+ if (!sd->name || strncasecmp(tok, sd->name, strlen(tok)))
continue;

if (sort__mode != SORT_MODE__MEMORY)
@@ -3339,7 +3376,7 @@ int output_field_add(struct perf_hpp_list *list, char *tok)
for (i = 0; i < ARRAY_SIZE(common_sort_dimensions); i++) {
struct sort_dimension *sd = &common_sort_dimensions[i];

- if (strncasecmp(tok, sd->name, strlen(tok)))
+ if (!sd->name || strncasecmp(tok, sd->name, strlen(tok)))
continue;

return __sort_dimension__add_output(list, sd);
@@ -3357,7 +3394,7 @@ int output_field_add(struct perf_hpp_list *list, char *tok)
for (i = 0; i < ARRAY_SIZE(bstack_sort_dimensions); i++) {
struct sort_dimension *sd = &bstack_sort_dimensions[i];

- if (strncasecmp(tok, sd->name, strlen(tok)))
+ if (!sd->name || strncasecmp(tok, sd->name, strlen(tok)))
continue;

if (sort__mode != SORT_MODE__BRANCH)
@@ -3369,7 +3406,7 @@ int output_field_add(struct perf_hpp_list *list, char *tok)
for (i = 0; i < ARRAY_SIZE(memory_sort_dimensions); i++) {
struct sort_dimension *sd = &memory_sort_dimensions[i];

- if (strncasecmp(tok, sd->name, strlen(tok)))
+ if (!sd->name || strncasecmp(tok, sd->name, strlen(tok)))
continue;

if (sort__mode != SORT_MODE__MEMORY)
@@ -3508,6 +3545,9 @@ void reset_output_field(void)

static void add_key(struct strbuf *sb, const char *str, int *llen)
{
+ if (!str)
+ return;
+
if (*llen >= 75) {
strbuf_addstr(sb, "\n\t\t\t ");
*llen = INDENT;
diff --git a/tools/perf/util/synthetic-events.c b/tools/perf/util/synthetic-events.c
index 0645795ff080..3ab6a92b1a6d 100644
--- a/tools/perf/util/synthetic-events.c
+++ b/tools/perf/util/synthetic-events.c
@@ -2157,6 +2157,7 @@ int perf_event__synthesize_attr(struct perf_tool *tool, struct perf_event_attr *
return err;
}

+#ifdef HAVE_LIBTRACEEVENT
int perf_event__synthesize_tracing_data(struct perf_tool *tool, int fd, struct evlist *evlist,
perf_event__handler_t process)
{
@@ -2203,6 +2204,7 @@ int perf_event__synthesize_tracing_data(struct perf_tool *tool, int fd, struct e

return aligned_size;
}
+#endif

int perf_event__synthesize_build_id(struct perf_tool *tool, struct dso *pos, u16 misc,
perf_event__handler_t process, struct machine *machine)
@@ -2355,6 +2357,7 @@ int perf_event__synthesize_for_pipe(struct perf_tool *tool,
}
ret += err;

+#ifdef HAVE_LIBTRACEEVENT
if (have_tracepoints(&evlist->core.entries)) {
int fd = perf_data__fd(data);

@@ -2374,6 +2377,9 @@ int perf_event__synthesize_for_pipe(struct perf_tool *tool,
}
ret += err;
}
+#else
+ (void)data;
+#endif

return ret;
}
diff --git a/tools/perf/util/trace-event-parse.c b/tools/perf/util/trace-event-parse.c
index c9c83a40647c..2d3c2576bab7 100644
--- a/tools/perf/util/trace-event-parse.c
+++ b/tools/perf/util/trace-event-parse.c
@@ -11,6 +11,8 @@
#include "trace-event.h"

#include <linux/ctype.h>
+#include <linux/kernel.h>
+#include <traceevent/event-parse.h>

static int get_common_field(struct scripting_context *context,
int *offset, int *size, const char *type)
diff --git a/tools/perf/util/trace-event-read.c b/tools/perf/util/trace-event-read.c
index 43146a4ce2fb..1162c49b8082 100644
--- a/tools/perf/util/trace-event-read.c
+++ b/tools/perf/util/trace-event-read.c
@@ -11,6 +11,7 @@
#include <sys/stat.h>
#include <sys/wait.h>
#include <sys/mman.h>
+#include <traceevent/event-parse.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
diff --git a/tools/perf/util/trace-event-scripting.c b/tools/perf/util/trace-event-scripting.c
index 636a010d929b..56175c53f9af 100644
--- a/tools/perf/util/trace-event-scripting.c
+++ b/tools/perf/util/trace-event-scripting.c
@@ -9,6 +9,7 @@
#include <stdlib.h>
#include <string.h>
#include <errno.h>
+#include <traceevent/event-parse.h>

#include "debug.h"
#include "trace-event.h"
diff --git a/tools/perf/util/trace-event.c b/tools/perf/util/trace-event.c
index b3ee651e3d91..8ad75b31e09b 100644
--- a/tools/perf/util/trace-event.c
+++ b/tools/perf/util/trace-event.c
@@ -1,5 +1,4 @@
// SPDX-License-Identifier: GPL-2.0
-
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
diff --git a/tools/perf/util/trace-event.h b/tools/perf/util/trace-event.h
index 8f39f5bcb2c2..add6c5d9531c 100644
--- a/tools/perf/util/trace-event.h
+++ b/tools/perf/util/trace-event.h
@@ -2,9 +2,11 @@
#ifndef _PERF_UTIL_TRACE_EVENT_H
#define _PERF_UTIL_TRACE_EVENT_H

-#include <traceevent/event-parse.h>
-#include "parse-events.h"
+#include <stdbool.h>
+#include <stdio.h>
+#include <linux/types.h>

+struct evlist;
struct machine;
struct perf_sample;
union perf_event;
@@ -18,6 +20,11 @@ struct trace_event {
struct tep_plugin_list *plugin_list;
};

+typedef char *(tep_func_resolver_t)(void *priv,
+ unsigned long long *addrp, char **modp);
+
+bool have_tracepoints(struct list_head *evlist);
+
int trace_event__init(struct trace_event *t);
void trace_event__cleanup(struct trace_event *t);
int trace_event__register_resolver(struct machine *machine,
--
2.38.1.584.g0f3c55d4c2-goog

2022-11-30 07:27:41

by Ian Rogers

[permalink] [raw]
Subject: [PATCH v2 1/4] perf util: Make header guard consistent with tool

Remove git reference by changing GIT_COMPAT_UTIL_H to __PERF_UTIL_H.

Signed-off-by: Ian Rogers <[email protected]>
---
tools/perf/util/util.h | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/tools/perf/util/util.h b/tools/perf/util/util.h
index c1f2d423a9ec..63cdab0e5314 100644
--- a/tools/perf/util/util.h
+++ b/tools/perf/util/util.h
@@ -1,6 +1,6 @@
/* SPDX-License-Identifier: GPL-2.0 */
-#ifndef GIT_COMPAT_UTIL_H
-#define GIT_COMPAT_UTIL_H
+#ifndef __PERF_UTIL_H
+#define __PERF_UTIL_H

#define _BSD_SOURCE 1
/* glibc 2.20 deprecates _BSD_SOURCE in favour of _DEFAULT_SOURCE */
@@ -94,4 +94,4 @@ int do_realloc_array_as_needed(void **arr, size_t *arr_sz, size_t x,
0; \
})

-#endif /* GIT_COMPAT_UTIL_H */
+#endif /* __PERF_UTIL_H */
--
2.38.1.584.g0f3c55d4c2-goog

2022-11-30 19:12:42

by Namhyung Kim

[permalink] [raw]
Subject: Re: [PATCH v2 2/4] perf util: Add host_is_bigendian to util.h

On Tue, Nov 29, 2022 at 10:30 PM Ian Rogers <[email protected]> wrote:
>
> Avoid libtraceevent dependency for tep_is_bigendian or trace-event.h
> dependency for bigendian. Add a new host_is_bigendian to util.h, using
> the compiler defined __BYTE_ORDER__ when available.
>
> Signed-off-by: Ian Rogers <[email protected]>

Acked-by: Namhyung Kim <[email protected]>

A nit below...

> ---
[SNIP]
> diff --git a/tools/perf/util/util.h b/tools/perf/util/util.h
> index 63cdab0e5314..87d418cb6792 100644
> --- a/tools/perf/util/util.h
> +++ b/tools/perf/util/util.h
> @@ -94,4 +94,23 @@ int do_realloc_array_as_needed(void **arr, size_t *arr_sz, size_t x,
> 0; \
> })
>
> +static inline bool host_is_bigendian(void)
> +{
> +#ifdef __BYTE_ORDER__
> +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
> + return false;
> +#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
> + return true;
> +#else
> +#error "Unrecognized __BYTE_ORDER__"
> +#endif
> +#else

It'd be nice if we could have a comment at least there's a nested
ifdef condition. Like below?

#else /* !__BYTE_ORDER__ */

Thanks,
Namhyung


> + unsigned char str[] = { 0x1, 0x2, 0x3, 0x4, 0x0, 0x0, 0x0, 0x0};
> + unsigned int *ptr;
> +
> + ptr = (unsigned int *)(void *)str;
> + return *ptr == 0x01020304;
> +#endif
> +}
> +
> #endif /* __PERF_UTIL_H */
> --
> 2.38.1.584.g0f3c55d4c2-goog
>

2022-11-30 19:14:17

by Namhyung Kim

[permalink] [raw]
Subject: Re: [PATCH v2 1/4] perf util: Make header guard consistent with tool

On Tue, Nov 29, 2022 at 10:29 PM Ian Rogers <[email protected]> wrote:
>
> Remove git reference by changing GIT_COMPAT_UTIL_H to __PERF_UTIL_H.
>
> Signed-off-by: Ian Rogers <[email protected]>

Acked-by: Namhyung Kim <[email protected]>

Thanks,
Namhyung


> ---
> tools/perf/util/util.h | 6 +++---
> 1 file changed, 3 insertions(+), 3 deletions(-)
>
> diff --git a/tools/perf/util/util.h b/tools/perf/util/util.h
> index c1f2d423a9ec..63cdab0e5314 100644
> --- a/tools/perf/util/util.h
> +++ b/tools/perf/util/util.h
> @@ -1,6 +1,6 @@
> /* SPDX-License-Identifier: GPL-2.0 */
> -#ifndef GIT_COMPAT_UTIL_H
> -#define GIT_COMPAT_UTIL_H
> +#ifndef __PERF_UTIL_H
> +#define __PERF_UTIL_H
>
> #define _BSD_SOURCE 1
> /* glibc 2.20 deprecates _BSD_SOURCE in favour of _DEFAULT_SOURCE */
> @@ -94,4 +94,4 @@ int do_realloc_array_as_needed(void **arr, size_t *arr_sz, size_t x,
> 0; \
> })
>
> -#endif /* GIT_COMPAT_UTIL_H */
> +#endif /* __PERF_UTIL_H */
> --
> 2.38.1.584.g0f3c55d4c2-goog
>

2022-11-30 19:19:21

by Namhyung Kim

[permalink] [raw]
Subject: Re: [PATCH v2 3/4] perf build: Use libtraceevent from the system

On Tue, Nov 29, 2022 at 10:30 PM Ian Rogers <[email protected]> wrote:
>
> Remove the LIBTRACEEVENT_DYNAMIC and LIBTRACEFS_DYNAMIC. If
> libtraceevent isn't installed or NO_LIBTRACEEVENT=1 is passed to the
> build, don't compile in libtraceevent and libtracefs support. This
> also disables CONFIG_TRACE that controls "perf
> trace". CONFIG_TRACEEVENT is used to control enablement in
> Build/Makefiles, HAVE_LIBTRACEEVENT is used in C code. Without
> HAVE_LIBTRACEEVENT tracepoints are disabled and as such the commands
> kmem, kwork, lock, sched and timechart are removed. The majority of
> commands continue to work including "perf test".

Maybe we can have a different approach. I guess the trace data
access is isolated then we can make dummy interfaces when there's
no libtraceevent. This way we don't need to touch every command
and let it fail when it's asked.

The motivation is that we should be able to run the sub-commands
as much as possible. In fact, we could run 'record' part only on the
target machine and pass the data to the host for analysis with a
full-fledged perf. Also some commands like 'perf lock contention'
can run with or without libtraceevent (using BPF only).

Thanks,
Namhyung

2022-11-30 21:03:18

by Ian Rogers

[permalink] [raw]
Subject: Re: [PATCH v2 3/4] perf build: Use libtraceevent from the system

On Wed, Nov 30, 2022 at 11:05 AM Namhyung Kim <[email protected]> wrote:
>
> On Tue, Nov 29, 2022 at 10:30 PM Ian Rogers <[email protected]> wrote:
> >
> > Remove the LIBTRACEEVENT_DYNAMIC and LIBTRACEFS_DYNAMIC. If
> > libtraceevent isn't installed or NO_LIBTRACEEVENT=1 is passed to the
> > build, don't compile in libtraceevent and libtracefs support. This
> > also disables CONFIG_TRACE that controls "perf
> > trace". CONFIG_TRACEEVENT is used to control enablement in
> > Build/Makefiles, HAVE_LIBTRACEEVENT is used in C code. Without
> > HAVE_LIBTRACEEVENT tracepoints are disabled and as such the commands
> > kmem, kwork, lock, sched and timechart are removed. The majority of
> > commands continue to work including "perf test".
>
> Maybe we can have a different approach. I guess the trace data
> access is isolated then we can make dummy interfaces when there's
> no libtraceevent. This way we don't need to touch every command
> and let it fail when it's asked.

Sounds like a worthwhile refactor that can land on top of this change.

> The motivation is that we should be able to run the sub-commands
> as much as possible. In fact, we could run 'record' part only on the
> target machine and pass the data to the host for analysis with a
> full-fledged perf. Also some commands like 'perf lock contention'
> can run with or without libtraceevent (using BPF only).

The issue here is that perf lock contention will use evsel__new_tp and
internally that uses libtraceevent. As such it is removed without
HAVE_LIBTRACEEVENT. Without the evsel there's not much perf lock
contention can do, so rather than litter the code with
HAVE_LIBTRACEEVENT and for it to be broken, I made the choice just to
remove it from the no libtraceevent build for now.

I think it is worth pursuing these patches in the shape they are in so
that we can land the removal of tools/lib/traceevent and ensure the
migration away from an out-of-date version of that library.

Thanks,
Ian

> Thanks,
> Namhyung

2022-12-02 18:42:12

by Namhyung Kim

[permalink] [raw]
Subject: Re: [PATCH v2 3/4] perf build: Use libtraceevent from the system

On Wed, Nov 30, 2022 at 12:13 PM Ian Rogers <[email protected]> wrote:
>
> On Wed, Nov 30, 2022 at 11:05 AM Namhyung Kim <[email protected]> wrote:
> >
> > On Tue, Nov 29, 2022 at 10:30 PM Ian Rogers <[email protected]> wrote:
> > >
> > > Remove the LIBTRACEEVENT_DYNAMIC and LIBTRACEFS_DYNAMIC. If
> > > libtraceevent isn't installed or NO_LIBTRACEEVENT=1 is passed to the
> > > build, don't compile in libtraceevent and libtracefs support. This
> > > also disables CONFIG_TRACE that controls "perf
> > > trace". CONFIG_TRACEEVENT is used to control enablement in
> > > Build/Makefiles, HAVE_LIBTRACEEVENT is used in C code. Without
> > > HAVE_LIBTRACEEVENT tracepoints are disabled and as such the commands
> > > kmem, kwork, lock, sched and timechart are removed. The majority of
> > > commands continue to work including "perf test".
> >
> > Maybe we can have a different approach. I guess the trace data
> > access is isolated then we can make dummy interfaces when there's
> > no libtraceevent. This way we don't need to touch every command
> > and let it fail when it's asked.
>
> Sounds like a worthwhile refactor that can land on top of this change.
>
> > The motivation is that we should be able to run the sub-commands
> > as much as possible. In fact, we could run 'record' part only on the
> > target machine and pass the data to the host for analysis with a
> > full-fledged perf. Also some commands like 'perf lock contention'
> > can run with or without libtraceevent (using BPF only).
>
> The issue here is that perf lock contention will use evsel__new_tp and
> internally that uses libtraceevent. As such it is removed without
> HAVE_LIBTRACEEVENT. Without the evsel there's not much perf lock
> contention can do, so rather than litter the code with
> HAVE_LIBTRACEEVENT and for it to be broken, I made the choice just to
> remove it from the no libtraceevent build for now.

I don't think it needs evsel__new_tp() when BPF is used.
The BPF program is attached to the raw tracepoint without
perf_event and the result is written to the BPF map.

>
> I think it is worth pursuing these patches in the shape they are in so
> that we can land the removal of tools/lib/traceevent and ensure the
> migration away from an out-of-date version of that library.

Yeah, I agree that we should remove the stale libtraceevent but
I'd like to do it with minimal changes in the perf code base.
Let me take a look at this.

Thanks,
Namhyung

2022-12-02 19:00:15

by Arnaldo Carvalho de Melo

[permalink] [raw]
Subject: Re: [PATCH v2 3/4] perf build: Use libtraceevent from the system

Em Fri, Dec 02, 2022 at 10:08:04AM -0800, Namhyung Kim escreveu:
> On Wed, Nov 30, 2022 at 12:13 PM Ian Rogers <[email protected]> wrote:
> >
> > On Wed, Nov 30, 2022 at 11:05 AM Namhyung Kim <[email protected]> wrote:
> > >
> > > On Tue, Nov 29, 2022 at 10:30 PM Ian Rogers <[email protected]> wrote:
> > > >
> > > > Remove the LIBTRACEEVENT_DYNAMIC and LIBTRACEFS_DYNAMIC. If
> > > > libtraceevent isn't installed or NO_LIBTRACEEVENT=1 is passed to the
> > > > build, don't compile in libtraceevent and libtracefs support. This
> > > > also disables CONFIG_TRACE that controls "perf
> > > > trace". CONFIG_TRACEEVENT is used to control enablement in
> > > > Build/Makefiles, HAVE_LIBTRACEEVENT is used in C code. Without
> > > > HAVE_LIBTRACEEVENT tracepoints are disabled and as such the commands
> > > > kmem, kwork, lock, sched and timechart are removed. The majority of
> > > > commands continue to work including "perf test".
> > >
> > > Maybe we can have a different approach. I guess the trace data
> > > access is isolated then we can make dummy interfaces when there's
> > > no libtraceevent. This way we don't need to touch every command
> > > and let it fail when it's asked.
> >
> > Sounds like a worthwhile refactor that can land on top of this change.
> >
> > > The motivation is that we should be able to run the sub-commands
> > > as much as possible. In fact, we could run 'record' part only on the
> > > target machine and pass the data to the host for analysis with a
> > > full-fledged perf. Also some commands like 'perf lock contention'
> > > can run with or without libtraceevent (using BPF only).
> >
> > The issue here is that perf lock contention will use evsel__new_tp and
> > internally that uses libtraceevent. As such it is removed without
> > HAVE_LIBTRACEEVENT. Without the evsel there's not much perf lock
> > contention can do, so rather than litter the code with
> > HAVE_LIBTRACEEVENT and for it to be broken, I made the choice just to
> > remove it from the no libtraceevent build for now.
>
> I don't think it needs evsel__new_tp() when BPF is used.
> The BPF program is attached to the raw tracepoint without
> perf_event and the result is written to the BPF map.
>
> >
> > I think it is worth pursuing these patches in the shape they are in so
> > that we can land the removal of tools/lib/traceevent and ensure the
> > migration away from an out-of-date version of that library.
>
> Yeah, I agree that we should remove the stale libtraceevent but
> I'd like to do it with minimal changes in the perf code base.
> Let me take a look at this.

Ok, was going to take a look at this patchkit, will wait for you now.

- Arnaldo

2022-12-02 20:48:53

by Ian Rogers

[permalink] [raw]
Subject: Re: [PATCH v2 3/4] perf build: Use libtraceevent from the system

On Fri, Dec 2, 2022 at 10:29 AM Arnaldo Carvalho de Melo
<[email protected]> wrote:
>
> Em Fri, Dec 02, 2022 at 10:08:04AM -0800, Namhyung Kim escreveu:
> > On Wed, Nov 30, 2022 at 12:13 PM Ian Rogers <[email protected]> wrote:
> > >
> > > On Wed, Nov 30, 2022 at 11:05 AM Namhyung Kim <[email protected]> wrote:
> > > >
> > > > On Tue, Nov 29, 2022 at 10:30 PM Ian Rogers <[email protected]> wrote:
> > > > >
> > > > > Remove the LIBTRACEEVENT_DYNAMIC and LIBTRACEFS_DYNAMIC. If
> > > > > libtraceevent isn't installed or NO_LIBTRACEEVENT=1 is passed to the
> > > > > build, don't compile in libtraceevent and libtracefs support. This
> > > > > also disables CONFIG_TRACE that controls "perf
> > > > > trace". CONFIG_TRACEEVENT is used to control enablement in
> > > > > Build/Makefiles, HAVE_LIBTRACEEVENT is used in C code. Without
> > > > > HAVE_LIBTRACEEVENT tracepoints are disabled and as such the commands
> > > > > kmem, kwork, lock, sched and timechart are removed. The majority of
> > > > > commands continue to work including "perf test".
> > > >
> > > > Maybe we can have a different approach. I guess the trace data
> > > > access is isolated then we can make dummy interfaces when there's
> > > > no libtraceevent. This way we don't need to touch every command
> > > > and let it fail when it's asked.
> > >
> > > Sounds like a worthwhile refactor that can land on top of this change.
> > >
> > > > The motivation is that we should be able to run the sub-commands
> > > > as much as possible. In fact, we could run 'record' part only on the
> > > > target machine and pass the data to the host for analysis with a
> > > > full-fledged perf. Also some commands like 'perf lock contention'
> > > > can run with or without libtraceevent (using BPF only).
> > >
> > > The issue here is that perf lock contention will use evsel__new_tp and
> > > internally that uses libtraceevent. As such it is removed without
> > > HAVE_LIBTRACEEVENT. Without the evsel there's not much perf lock
> > > contention can do, so rather than litter the code with
> > > HAVE_LIBTRACEEVENT and for it to be broken, I made the choice just to
> > > remove it from the no libtraceevent build for now.
> >
> > I don't think it needs evsel__new_tp() when BPF is used.
> > The BPF program is attached to the raw tracepoint without
> > perf_event and the result is written to the BPF map.
> >
> > >
> > > I think it is worth pursuing these patches in the shape they are in so
> > > that we can land the removal of tools/lib/traceevent and ensure the
> > > migration away from an out-of-date version of that library.
> >
> > Yeah, I agree that we should remove the stale libtraceevent but
> > I'd like to do it with minimal changes in the perf code base.
> > Let me take a look at this.
>
> Ok, was going to take a look at this patchkit, will wait for you now.
>
> - Arnaldo

So the problematic function is:
https://git.kernel.org/pub/scm/linux/kernel/git/acme/linux.git/tree/tools/perf/util/evsel.c?h=perf/core#n482
struct evsel *evsel__newtp_idx(const char *sys, const char *name, int idx)

on success it will always initialize:
https://git.kernel.org/pub/scm/linux/kernel/git/acme/linux.git/tree/tools/perf/util/evsel.c?h=perf/core#n499
evsel->tp_format = trace_event__tp_format(sys, name);

tp_format is a libtraceevent type so this patch makes the variable
conditional on HAVE_LIBTRACEEVENT. I think this will remain true even
with a new evsel__newtp function that isn't dependent on
libtraceevent. I also think adding such things is best kept out of
this patch which is trying to do the minimal (only 312 lines of
addition) to have a build without libtraceevent.

Given we expect builds to use libtraceevent and we should build off of
this patch, I think we should look to land it for 6.2.

Thanks,
Ian

2022-12-02 23:44:10

by Namhyung Kim

[permalink] [raw]
Subject: Re: [PATCH v2 3/4] perf build: Use libtraceevent from the system

On Fri, Dec 2, 2022 at 11:45 AM Ian Rogers <[email protected]> wrote:
>
> On Fri, Dec 2, 2022 at 10:29 AM Arnaldo Carvalho de Melo
> <[email protected]> wrote:
> >
> > Em Fri, Dec 02, 2022 at 10:08:04AM -0800, Namhyung Kim escreveu:
> > > On Wed, Nov 30, 2022 at 12:13 PM Ian Rogers <[email protected]> wrote:
> > > >
> > > > On Wed, Nov 30, 2022 at 11:05 AM Namhyung Kim <[email protected]> wrote:
> > > > >
> > > > > On Tue, Nov 29, 2022 at 10:30 PM Ian Rogers <[email protected]> wrote:
> > > > > >
> > > > > > Remove the LIBTRACEEVENT_DYNAMIC and LIBTRACEFS_DYNAMIC. If
> > > > > > libtraceevent isn't installed or NO_LIBTRACEEVENT=1 is passed to the
> > > > > > build, don't compile in libtraceevent and libtracefs support. This
> > > > > > also disables CONFIG_TRACE that controls "perf
> > > > > > trace". CONFIG_TRACEEVENT is used to control enablement in
> > > > > > Build/Makefiles, HAVE_LIBTRACEEVENT is used in C code. Without
> > > > > > HAVE_LIBTRACEEVENT tracepoints are disabled and as such the commands
> > > > > > kmem, kwork, lock, sched and timechart are removed. The majority of
> > > > > > commands continue to work including "perf test".
> > > > >
> > > > > Maybe we can have a different approach. I guess the trace data
> > > > > access is isolated then we can make dummy interfaces when there's
> > > > > no libtraceevent. This way we don't need to touch every command
> > > > > and let it fail when it's asked.
> > > >
> > > > Sounds like a worthwhile refactor that can land on top of this change.
> > > >
> > > > > The motivation is that we should be able to run the sub-commands
> > > > > as much as possible. In fact, we could run 'record' part only on the
> > > > > target machine and pass the data to the host for analysis with a
> > > > > full-fledged perf. Also some commands like 'perf lock contention'
> > > > > can run with or without libtraceevent (using BPF only).
> > > >
> > > > The issue here is that perf lock contention will use evsel__new_tp and
> > > > internally that uses libtraceevent. As such it is removed without
> > > > HAVE_LIBTRACEEVENT. Without the evsel there's not much perf lock
> > > > contention can do, so rather than litter the code with
> > > > HAVE_LIBTRACEEVENT and for it to be broken, I made the choice just to
> > > > remove it from the no libtraceevent build for now.
> > >
> > > I don't think it needs evsel__new_tp() when BPF is used.
> > > The BPF program is attached to the raw tracepoint without
> > > perf_event and the result is written to the BPF map.
> > >
> > > >
> > > > I think it is worth pursuing these patches in the shape they are in so
> > > > that we can land the removal of tools/lib/traceevent and ensure the
> > > > migration away from an out-of-date version of that library.
> > >
> > > Yeah, I agree that we should remove the stale libtraceevent but
> > > I'd like to do it with minimal changes in the perf code base.
> > > Let me take a look at this.
> >
> > Ok, was going to take a look at this patchkit, will wait for you now.
> >
> > - Arnaldo
>
> So the problematic function is:
> https://git.kernel.org/pub/scm/linux/kernel/git/acme/linux.git/tree/tools/perf/util/evsel.c?h=perf/core#n482
> struct evsel *evsel__newtp_idx(const char *sys, const char *name, int idx)
>
> on success it will always initialize:
> https://git.kernel.org/pub/scm/linux/kernel/git/acme/linux.git/tree/tools/perf/util/evsel.c?h=perf/core#n499
> evsel->tp_format = trace_event__tp_format(sys, name);
>
> tp_format is a libtraceevent type so this patch makes the variable
> conditional on HAVE_LIBTRACEEVENT. I think this will remain true even
> with a new evsel__newtp function that isn't dependent on
> libtraceevent. I also think adding such things is best kept out of
> this patch which is trying to do the minimal (only 312 lines of
> addition) to have a build without libtraceevent.
>
> Given we expect builds to use libtraceevent and we should build off of
> this patch, I think we should look to land it for 6.2.

So I took a quick look and it seems not quite easy to isolate
libtraceevent accesses from perf trace, dynamic sort keys and
other places. That would need some amount of work.

Now I think that we may apply this first and then work on enabling
more functionalities without libtraceevent gradually.

Also I think it'd be a major change for regular users if there's
no libtraceevent installed in their system. Maybe we could add
a warning during the build?

Thanks,
Namhyung

2022-12-05 13:41:45

by Arnaldo Carvalho de Melo

[permalink] [raw]
Subject: Re: [PATCH v2 2/4] perf util: Add host_is_bigendian to util.h

Em Wed, Nov 30, 2022 at 10:52:35AM -0800, Namhyung Kim escreveu:
> On Tue, Nov 29, 2022 at 10:30 PM Ian Rogers <[email protected]> wrote:
> >
> > Avoid libtraceevent dependency for tep_is_bigendian or trace-event.h
> > dependency for bigendian. Add a new host_is_bigendian to util.h, using
> > the compiler defined __BYTE_ORDER__ when available.
> >
> > Signed-off-by: Ian Rogers <[email protected]>
>
> Acked-by: Namhyung Kim <[email protected]>
>
> A nit below...
>
> > ---
> [SNIP]
> > diff --git a/tools/perf/util/util.h b/tools/perf/util/util.h
> > index 63cdab0e5314..87d418cb6792 100644
> > --- a/tools/perf/util/util.h
> > +++ b/tools/perf/util/util.h
> > @@ -94,4 +94,23 @@ int do_realloc_array_as_needed(void **arr, size_t *arr_sz, size_t x,
> > 0; \
> > })
> >
> > +static inline bool host_is_bigendian(void)
> > +{
> > +#ifdef __BYTE_ORDER__
> > +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
> > + return false;
> > +#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
> > + return true;
> > +#else
> > +#error "Unrecognized __BYTE_ORDER__"
> > +#endif
> > +#else
>
> It'd be nice if we could have a comment at least there's a nested
> ifdef condition. Like below?
>
> #else /* !__BYTE_ORDER__ */

Reasonable, added it and applied the first two patches in this series,
with your Acked-by, thanks.

- Arnaldo


diff --git a/tools/perf/util/util.h b/tools/perf/util/util.h
index 87d418cb67929576..a06c54ab85ee4506 100644
--- a/tools/perf/util/util.h
+++ b/tools/perf/util/util.h
@@ -104,7 +104,7 @@ static inline bool host_is_bigendian(void)
#else
#error "Unrecognized __BYTE_ORDER__"
#endif
-#else
+#else /* !__BYTE_ORDER__ */
unsigned char str[] = { 0x1, 0x2, 0x3, 0x4, 0x0, 0x0, 0x0, 0x0};
unsigned int *ptr;

2022-12-05 13:42:33

by Arnaldo Carvalho de Melo

[permalink] [raw]
Subject: Re: [PATCH v2 0/4] perf use system libtraceevent

Em Tue, Nov 29, 2022 at 10:29:31PM -0800, Ian Rogers escreveu:
> Detect whether libtraceevent is installed and if so build against
> it. If not installed, warn and build a subset of perf that works
> without libtraceevent. With nothing using the now out-of-date
> tools/lib/traceevent remove it.
>
> Discussed on LKML here:
> https://lore.kernel.org/lkml/CAP-5=fWxAjEia-Qbm0RVzKOxyiod8rUOBieqaGK=DtQboDe3Qw@mail.gmail.com/
>
> Builds upon:
> https://lore.kernel.org/lkml/[email protected]/

So the above isn't applying:

⬢[acme@toolbox perf]$ b4 am -P1-4 -ctsl --cc-trailers [email protected]
Grabbing thread from lore.kernel.org/all/20221116224631.207631-1-irogers%40google.com/t.mbox.gz
Checking for newer revisions on https://lore.kernel.org/all/
Analyzing 5 messages in the thread
Checking attestation on all messages, may take a moment...
---
✓ [PATCH] perf build: Fix LIBTRACEEVENT_DYNAMIC
---
✓ Signed: DKIM/google.com
---
Total patches: 1 (cherrypicked: 1-4)
---
Link: https://lore.kernel.org/r/[email protected]
Base: not specified
git am ./20221116_irogers_perf_build_fix_libtraceevent_dynamic.mbx
⬢[acme@toolbox perf]$ git am ./20221116_irogers_perf_build_fix_libtraceevent_dynamic.mbx
Applying: perf build: Fix LIBTRACEEVENT_DYNAMIC
error: patch failed: tools/perf/Makefile.perf:242
error: tools/perf/Makefile.perf: patch does not apply
error: patch failed: tools/perf/util/setup.py:77
error: tools/perf/util/setup.py: patch does not apply
Patch failed at 0001 perf build: Fix LIBTRACEEVENT_DYNAMIC
hint: Use 'git am --show-current-patch=diff' to see the failed patch
When you have resolved this problem, run "git am --continue".
If you prefer to skip this patch, run "git am --skip" instead.
To restore the original branch and stop patching, run "git am --abort".
⬢[acme@toolbox perf]$ git am --abort
⬢[acme@toolbox perf]$

> Based on discussion of the v1 patch set:
> https://lore.kernel.org/lkml/[email protected]/
> v2 conditionally compiles a subset of perf that doesn't require
> libtraceevent to avoid having to have libtraceevent installed on a
> system.
>
> The changes build upon the fix in:
> https://lore.kernel.org/lkml/[email protected]/
>
> Ian Rogers (4):
> perf util: Make header guard consistent with tool
> perf util: Add host_is_bigendian to util.h
> perf build: Use libtraceevent from the system
> tools lib traceevent: Remove libtraceevent
>
> tools/lib/traceevent/.gitignore | 4 -
> tools/lib/traceevent/Build | 8 -
> tools/lib/traceevent/Documentation/Makefile | 207 -
> .../traceevent/Documentation/asciidoc.conf | 120 -
> .../Documentation/libtraceevent-commands.txt | 153 -
> .../Documentation/libtraceevent-cpus.txt | 77 -
> .../libtraceevent-endian_read.txt | 78 -
> .../libtraceevent-event_find.txt | 103 -
> .../Documentation/libtraceevent-event_get.txt | 99 -
> .../libtraceevent-event_list.txt | 122 -
> .../libtraceevent-event_print.txt | 130 -
> .../libtraceevent-field_find.txt | 118 -
> .../libtraceevent-field_get_val.txt | 122 -
> .../libtraceevent-field_print.txt | 126 -
> .../libtraceevent-field_read.txt | 81 -
> .../Documentation/libtraceevent-fields.txt | 105 -
> .../libtraceevent-file_endian.txt | 91 -
> .../Documentation/libtraceevent-filter.txt | 209 -
> .../Documentation/libtraceevent-func_apis.txt | 183 -
> .../Documentation/libtraceevent-func_find.txt | 88 -
> .../Documentation/libtraceevent-handle.txt | 101 -
> .../libtraceevent-header_page.txt | 102 -
> .../libtraceevent-host_endian.txt | 104 -
> .../Documentation/libtraceevent-long_size.txt | 78 -
> .../Documentation/libtraceevent-page_size.txt | 82 -
> .../libtraceevent-parse_event.txt | 90 -
> .../libtraceevent-parse_head.txt | 82 -
> .../Documentation/libtraceevent-plugins.txt | 122 -
> .../libtraceevent-record_parse.txt | 137 -
> .../libtraceevent-reg_event_handler.txt | 156 -
> .../libtraceevent-reg_print_func.txt | 155 -
> .../Documentation/libtraceevent-set_flag.txt | 104 -
> .../Documentation/libtraceevent-strerror.txt | 85 -
> .../Documentation/libtraceevent-tseq.txt | 158 -
> .../Documentation/libtraceevent.txt | 192 -
> .../traceevent/Documentation/manpage-1.72.xsl | 14 -
> .../traceevent/Documentation/manpage-base.xsl | 35 -
> .../Documentation/manpage-bold-literal.xsl | 17 -
> .../Documentation/manpage-normal.xsl | 13 -
> .../Documentation/manpage-suppress-sp.xsl | 21 -
> tools/lib/traceevent/Makefile | 300 -
> tools/lib/traceevent/event-parse-api.c | 333 -
> tools/lib/traceevent/event-parse-local.h | 123 -
> tools/lib/traceevent/event-parse.c | 7624 -----------------
> tools/lib/traceevent/event-parse.h | 750 --
> tools/lib/traceevent/event-plugin.c | 711 --
> tools/lib/traceevent/event-utils.h | 67 -
> tools/lib/traceevent/kbuffer-parse.c | 809 --
> tools/lib/traceevent/kbuffer.h | 68 -
> .../lib/traceevent/libtraceevent.pc.template | 10 -
> tools/lib/traceevent/parse-filter.c | 2281 -----
> tools/lib/traceevent/parse-utils.c | 71 -
> tools/lib/traceevent/plugins/Build | 12 -
> tools/lib/traceevent/plugins/Makefile | 225 -
> .../lib/traceevent/plugins/plugin_cfg80211.c | 43 -
> .../lib/traceevent/plugins/plugin_function.c | 282 -
> tools/lib/traceevent/plugins/plugin_futex.c | 123 -
> tools/lib/traceevent/plugins/plugin_hrtimer.c | 74 -
> tools/lib/traceevent/plugins/plugin_jbd2.c | 61 -
> tools/lib/traceevent/plugins/plugin_kmem.c | 80 -
> tools/lib/traceevent/plugins/plugin_kvm.c | 527 --
> .../lib/traceevent/plugins/plugin_mac80211.c | 88 -
> .../traceevent/plugins/plugin_sched_switch.c | 146 -
> tools/lib/traceevent/plugins/plugin_scsi.c | 434 -
> tools/lib/traceevent/plugins/plugin_tlb.c | 66 -
> tools/lib/traceevent/plugins/plugin_xen.c | 138 -
> tools/lib/traceevent/tep_strerror.c | 53 -
> tools/lib/traceevent/trace-seq.c | 249 -
> tools/lib/traceevent/trace-seq.h | 55 -
> tools/perf/Build | 11 +-
> tools/perf/Makefile.config | 37 +-
> tools/perf/Makefile.perf | 99 +-
> tools/perf/arch/x86/util/Build | 2 +-
> tools/perf/arch/x86/util/intel-pt.c | 4 +
> tools/perf/builtin-annotate.c | 2 +
> tools/perf/builtin-inject.c | 8 +
> tools/perf/builtin-kmem.c | 1 +
> tools/perf/builtin-kvm.c | 12 +-
> tools/perf/builtin-kwork.c | 1 +
> tools/perf/builtin-record.c | 2 +
> tools/perf/builtin-report.c | 9 +-
> tools/perf/builtin-script.c | 19 +-
> tools/perf/builtin-timechart.c | 1 +
> tools/perf/builtin-trace.c | 5 +-
> tools/perf/builtin-version.c | 1 +
> tools/perf/perf.c | 24 +-
> .../perf/scripts/python/Perf-Trace-Util/Build | 2 +-
> tools/perf/tests/Build | 12 +-
> tools/perf/tests/builtin-test.c | 6 +
> tools/perf/tests/code-reading.c | 4 +-
> tools/perf/tests/parse-events.c | 20 +
> tools/perf/tests/sample-parsing.c | 4 +-
> tools/perf/util/Build | 10 +-
> tools/perf/util/data-convert-bt.c | 5 +-
> tools/perf/util/data-convert-json.c | 9 +-
> tools/perf/util/evlist.c | 6 +-
> tools/perf/util/evlist.h | 4 +
> tools/perf/util/evsel.c | 16 +-
> tools/perf/util/evsel.h | 12 +-
> tools/perf/util/evsel_fprintf.c | 7 +-
> tools/perf/util/header.c | 19 +
> tools/perf/util/header.h | 2 +
> tools/perf/util/intel-pt.c | 7 +-
> tools/perf/util/parse-events.c | 15 +
> tools/perf/util/parse-events.h | 1 -
> tools/perf/util/python.c | 4 +
> tools/perf/util/scripting-engines/Build | 6 +-
> .../scripting-engines/trace-event-python.c | 1 +
> tools/perf/util/session.c | 2 +
> tools/perf/util/session.h | 2 +
> tools/perf/util/sort.c | 60 +-
> tools/perf/util/synthetic-events.c | 6 +
> tools/perf/util/trace-event-info.c | 14 +-
> tools/perf/util/trace-event-parse.c | 2 +
> tools/perf/util/trace-event-read.c | 4 +-
> tools/perf/util/trace-event-scripting.c | 1 +
> tools/perf/util/trace-event.c | 1 -
> tools/perf/util/trace-event.h | 13 +-
> tools/perf/util/util.h | 25 +-
> 119 files changed, 344 insertions(+), 20071 deletions(-)
> delete mode 100644 tools/lib/traceevent/.gitignore
> delete mode 100644 tools/lib/traceevent/Build
> delete mode 100644 tools/lib/traceevent/Documentation/Makefile
> delete mode 100644 tools/lib/traceevent/Documentation/asciidoc.conf
> delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-commands.txt
> delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-cpus.txt
> delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-endian_read.txt
> delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-event_find.txt
> delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-event_get.txt
> delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-event_list.txt
> delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-event_print.txt
> delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-field_find.txt
> delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-field_get_val.txt
> delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-field_print.txt
> delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-field_read.txt
> delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-fields.txt
> delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-file_endian.txt
> delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-filter.txt
> delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-func_apis.txt
> delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-func_find.txt
> delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-handle.txt
> delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-header_page.txt
> delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-host_endian.txt
> delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-long_size.txt
> delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-page_size.txt
> delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-parse_event.txt
> delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-parse_head.txt
> delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-plugins.txt
> delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-record_parse.txt
> delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-reg_event_handler.txt
> delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-reg_print_func.txt
> delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-set_flag.txt
> delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-strerror.txt
> delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-tseq.txt
> delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent.txt
> delete mode 100644 tools/lib/traceevent/Documentation/manpage-1.72.xsl
> delete mode 100644 tools/lib/traceevent/Documentation/manpage-base.xsl
> delete mode 100644 tools/lib/traceevent/Documentation/manpage-bold-literal.xsl
> delete mode 100644 tools/lib/traceevent/Documentation/manpage-normal.xsl
> delete mode 100644 tools/lib/traceevent/Documentation/manpage-suppress-sp.xsl
> delete mode 100644 tools/lib/traceevent/Makefile
> delete mode 100644 tools/lib/traceevent/event-parse-api.c
> delete mode 100644 tools/lib/traceevent/event-parse-local.h
> delete mode 100644 tools/lib/traceevent/event-parse.c
> delete mode 100644 tools/lib/traceevent/event-parse.h
> delete mode 100644 tools/lib/traceevent/event-plugin.c
> delete mode 100644 tools/lib/traceevent/event-utils.h
> delete mode 100644 tools/lib/traceevent/kbuffer-parse.c
> delete mode 100644 tools/lib/traceevent/kbuffer.h
> delete mode 100644 tools/lib/traceevent/libtraceevent.pc.template
> delete mode 100644 tools/lib/traceevent/parse-filter.c
> delete mode 100644 tools/lib/traceevent/parse-utils.c
> delete mode 100644 tools/lib/traceevent/plugins/Build
> delete mode 100644 tools/lib/traceevent/plugins/Makefile
> delete mode 100644 tools/lib/traceevent/plugins/plugin_cfg80211.c
> delete mode 100644 tools/lib/traceevent/plugins/plugin_function.c
> delete mode 100644 tools/lib/traceevent/plugins/plugin_futex.c
> delete mode 100644 tools/lib/traceevent/plugins/plugin_hrtimer.c
> delete mode 100644 tools/lib/traceevent/plugins/plugin_jbd2.c
> delete mode 100644 tools/lib/traceevent/plugins/plugin_kmem.c
> delete mode 100644 tools/lib/traceevent/plugins/plugin_kvm.c
> delete mode 100644 tools/lib/traceevent/plugins/plugin_mac80211.c
> delete mode 100644 tools/lib/traceevent/plugins/plugin_sched_switch.c
> delete mode 100644 tools/lib/traceevent/plugins/plugin_scsi.c
> delete mode 100644 tools/lib/traceevent/plugins/plugin_tlb.c
> delete mode 100644 tools/lib/traceevent/plugins/plugin_xen.c
> delete mode 100644 tools/lib/traceevent/tep_strerror.c
> delete mode 100644 tools/lib/traceevent/trace-seq.c
> delete mode 100644 tools/lib/traceevent/trace-seq.h
>
> --
> 2.38.1.584.g0f3c55d4c2-goog

--

- Arnaldo

2022-12-12 20:34:34

by Arnaldo Carvalho de Melo

[permalink] [raw]
Subject: Re: [PATCH v2 4/4] tools lib traceevent: Remove libtraceevent

Em Tue, Nov 29, 2022 at 10:29:35PM -0800, Ian Rogers escreveu:
> libtraceevent is now out-of-date and it is better to depend on the
> system version. Remove this code that is no longer depended upon by
> any builds.



Thanks, applied and Added Steven's Acked-by.

- Arnaldo


> Signed-off-by: Ian Rogers <[email protected]>
> ---
> tools/lib/traceevent/.gitignore | 4 -
> tools/lib/traceevent/Build | 8 -
> tools/lib/traceevent/Documentation/Makefile | 207 -
> .../traceevent/Documentation/asciidoc.conf | 120 -
> .../Documentation/libtraceevent-commands.txt | 153 -
> .../Documentation/libtraceevent-cpus.txt | 77 -
> .../libtraceevent-endian_read.txt | 78 -
> .../libtraceevent-event_find.txt | 103 -
> .../Documentation/libtraceevent-event_get.txt | 99 -
> .../libtraceevent-event_list.txt | 122 -
> .../libtraceevent-event_print.txt | 130 -
> .../libtraceevent-field_find.txt | 118 -
> .../libtraceevent-field_get_val.txt | 122 -
> .../libtraceevent-field_print.txt | 126 -
> .../libtraceevent-field_read.txt | 81 -
> .../Documentation/libtraceevent-fields.txt | 105 -
> .../libtraceevent-file_endian.txt | 91 -
> .../Documentation/libtraceevent-filter.txt | 209 -
> .../Documentation/libtraceevent-func_apis.txt | 183 -
> .../Documentation/libtraceevent-func_find.txt | 88 -
> .../Documentation/libtraceevent-handle.txt | 101 -
> .../libtraceevent-header_page.txt | 102 -
> .../libtraceevent-host_endian.txt | 104 -
> .../Documentation/libtraceevent-long_size.txt | 78 -
> .../Documentation/libtraceevent-page_size.txt | 82 -
> .../libtraceevent-parse_event.txt | 90 -
> .../libtraceevent-parse_head.txt | 82 -
> .../Documentation/libtraceevent-plugins.txt | 122 -
> .../libtraceevent-record_parse.txt | 137 -
> .../libtraceevent-reg_event_handler.txt | 156 -
> .../libtraceevent-reg_print_func.txt | 155 -
> .../Documentation/libtraceevent-set_flag.txt | 104 -
> .../Documentation/libtraceevent-strerror.txt | 85 -
> .../Documentation/libtraceevent-tseq.txt | 158 -
> .../Documentation/libtraceevent.txt | 192 -
> .../traceevent/Documentation/manpage-1.72.xsl | 14 -
> .../traceevent/Documentation/manpage-base.xsl | 35 -
> .../Documentation/manpage-bold-literal.xsl | 17 -
> .../Documentation/manpage-normal.xsl | 13 -
> .../Documentation/manpage-suppress-sp.xsl | 21 -
> tools/lib/traceevent/Makefile | 300 -
> tools/lib/traceevent/event-parse-api.c | 333 -
> tools/lib/traceevent/event-parse-local.h | 123 -
> tools/lib/traceevent/event-parse.c | 7624 -----------------
> tools/lib/traceevent/event-parse.h | 750 --
> tools/lib/traceevent/event-plugin.c | 711 --
> tools/lib/traceevent/event-utils.h | 67 -
> tools/lib/traceevent/kbuffer-parse.c | 809 --
> tools/lib/traceevent/kbuffer.h | 68 -
> .../lib/traceevent/libtraceevent.pc.template | 10 -
> tools/lib/traceevent/parse-filter.c | 2281 -----
> tools/lib/traceevent/parse-utils.c | 71 -
> tools/lib/traceevent/plugins/Build | 12 -
> tools/lib/traceevent/plugins/Makefile | 225 -
> .../lib/traceevent/plugins/plugin_cfg80211.c | 43 -
> .../lib/traceevent/plugins/plugin_function.c | 282 -
> tools/lib/traceevent/plugins/plugin_futex.c | 123 -
> tools/lib/traceevent/plugins/plugin_hrtimer.c | 74 -
> tools/lib/traceevent/plugins/plugin_jbd2.c | 61 -
> tools/lib/traceevent/plugins/plugin_kmem.c | 80 -
> tools/lib/traceevent/plugins/plugin_kvm.c | 527 --
> .../lib/traceevent/plugins/plugin_mac80211.c | 88 -
> .../traceevent/plugins/plugin_sched_switch.c | 146 -
> tools/lib/traceevent/plugins/plugin_scsi.c | 434 -
> tools/lib/traceevent/plugins/plugin_tlb.c | 66 -
> tools/lib/traceevent/plugins/plugin_xen.c | 138 -
> tools/lib/traceevent/tep_strerror.c | 53 -
> tools/lib/traceevent/trace-seq.c | 249 -
> tools/lib/traceevent/trace-seq.h | 55 -
> 69 files changed, 19875 deletions(-)
> delete mode 100644 tools/lib/traceevent/.gitignore
> delete mode 100644 tools/lib/traceevent/Build
> delete mode 100644 tools/lib/traceevent/Documentation/Makefile
> delete mode 100644 tools/lib/traceevent/Documentation/asciidoc.conf
> delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-commands.txt
> delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-cpus.txt
> delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-endian_read.txt
> delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-event_find.txt
> delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-event_get.txt
> delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-event_list.txt
> delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-event_print.txt
> delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-field_find.txt
> delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-field_get_val.txt
> delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-field_print.txt
> delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-field_read.txt
> delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-fields.txt
> delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-file_endian.txt
> delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-filter.txt
> delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-func_apis.txt
> delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-func_find.txt
> delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-handle.txt
> delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-header_page.txt
> delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-host_endian.txt
> delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-long_size.txt
> delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-page_size.txt
> delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-parse_event.txt
> delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-parse_head.txt
> delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-plugins.txt
> delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-record_parse.txt
> delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-reg_event_handler.txt
> delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-reg_print_func.txt
> delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-set_flag.txt
> delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-strerror.txt
> delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent-tseq.txt
> delete mode 100644 tools/lib/traceevent/Documentation/libtraceevent.txt
> delete mode 100644 tools/lib/traceevent/Documentation/manpage-1.72.xsl
> delete mode 100644 tools/lib/traceevent/Documentation/manpage-base.xsl
> delete mode 100644 tools/lib/traceevent/Documentation/manpage-bold-literal.xsl
> delete mode 100644 tools/lib/traceevent/Documentation/manpage-normal.xsl
> delete mode 100644 tools/lib/traceevent/Documentation/manpage-suppress-sp.xsl
> delete mode 100644 tools/lib/traceevent/Makefile
> delete mode 100644 tools/lib/traceevent/event-parse-api.c
> delete mode 100644 tools/lib/traceevent/event-parse-local.h
> delete mode 100644 tools/lib/traceevent/event-parse.c
> delete mode 100644 tools/lib/traceevent/event-parse.h
> delete mode 100644 tools/lib/traceevent/event-plugin.c
> delete mode 100644 tools/lib/traceevent/event-utils.h
> delete mode 100644 tools/lib/traceevent/kbuffer-parse.c
> delete mode 100644 tools/lib/traceevent/kbuffer.h
> delete mode 100644 tools/lib/traceevent/libtraceevent.pc.template
> delete mode 100644 tools/lib/traceevent/parse-filter.c
> delete mode 100644 tools/lib/traceevent/parse-utils.c
> delete mode 100644 tools/lib/traceevent/plugins/Build
> delete mode 100644 tools/lib/traceevent/plugins/Makefile
> delete mode 100644 tools/lib/traceevent/plugins/plugin_cfg80211.c
> delete mode 100644 tools/lib/traceevent/plugins/plugin_function.c
> delete mode 100644 tools/lib/traceevent/plugins/plugin_futex.c
> delete mode 100644 tools/lib/traceevent/plugins/plugin_hrtimer.c
> delete mode 100644 tools/lib/traceevent/plugins/plugin_jbd2.c
> delete mode 100644 tools/lib/traceevent/plugins/plugin_kmem.c
> delete mode 100644 tools/lib/traceevent/plugins/plugin_kvm.c
> delete mode 100644 tools/lib/traceevent/plugins/plugin_mac80211.c
> delete mode 100644 tools/lib/traceevent/plugins/plugin_sched_switch.c
> delete mode 100644 tools/lib/traceevent/plugins/plugin_scsi.c
> delete mode 100644 tools/lib/traceevent/plugins/plugin_tlb.c
> delete mode 100644 tools/lib/traceevent/plugins/plugin_xen.c
> delete mode 100644 tools/lib/traceevent/tep_strerror.c
> delete mode 100644 tools/lib/traceevent/trace-seq.c
> delete mode 100644 tools/lib/traceevent/trace-seq.h
>
> diff --git a/tools/lib/traceevent/.gitignore b/tools/lib/traceevent/.gitignore
> deleted file mode 100644
> index 7123c70b9ebc..000000000000
> --- a/tools/lib/traceevent/.gitignore
> +++ /dev/null
> @@ -1,4 +0,0 @@
> -# SPDX-License-Identifier: GPL-2.0-only
> -TRACEEVENT-CFLAGS
> -libtraceevent-dynamic-list
> -libtraceevent.so.*
> diff --git a/tools/lib/traceevent/Build b/tools/lib/traceevent/Build
> deleted file mode 100644
> index f9a5d79578f5..000000000000
> --- a/tools/lib/traceevent/Build
> +++ /dev/null
> @@ -1,8 +0,0 @@
> -libtraceevent-y += event-parse.o
> -libtraceevent-y += event-plugin.o
> -libtraceevent-y += trace-seq.o
> -libtraceevent-y += parse-filter.o
> -libtraceevent-y += parse-utils.o
> -libtraceevent-y += kbuffer-parse.o
> -libtraceevent-y += tep_strerror.o
> -libtraceevent-y += event-parse-api.o
> diff --git a/tools/lib/traceevent/Documentation/Makefile b/tools/lib/traceevent/Documentation/Makefile
> deleted file mode 100644
> index aa72ab96c3c1..000000000000
> --- a/tools/lib/traceevent/Documentation/Makefile
> +++ /dev/null
> @@ -1,207 +0,0 @@
> -include ../../../scripts/Makefile.include
> -include ../../../scripts/utilities.mak
> -
> -# This Makefile and manpage XSL files were taken from tools/perf/Documentation
> -# and modified for libtraceevent.
> -
> -MAN3_TXT= \
> - $(wildcard libtraceevent-*.txt) \
> - libtraceevent.txt
> -
> -MAN_TXT = $(MAN3_TXT)
> -_MAN_XML=$(patsubst %.txt,%.xml,$(MAN_TXT))
> -_MAN_HTML=$(patsubst %.txt,%.html,$(MAN_TXT))
> -_DOC_MAN3=$(patsubst %.txt,%.3,$(MAN3_TXT))
> -
> -MAN_XML=$(addprefix $(OUTPUT),$(_MAN_XML))
> -MAN_HTML=$(addprefix $(OUTPUT),$(_MAN_HTML))
> -DOC_MAN3=$(addprefix $(OUTPUT),$(_DOC_MAN3))
> -
> -# Make the path relative to DESTDIR, not prefix
> -ifndef DESTDIR
> -prefix?=$(HOME)
> -endif
> -bindir?=$(prefix)/bin
> -htmldir?=$(prefix)/share/doc/libtraceevent-doc
> -pdfdir?=$(prefix)/share/doc/libtraceevent-doc
> -mandir?=$(prefix)/share/man
> -man3dir=$(mandir)/man3
> -
> -ASCIIDOC=asciidoc
> -ASCIIDOC_EXTRA = --unsafe -f asciidoc.conf
> -ASCIIDOC_HTML = xhtml11
> -MANPAGE_XSL = manpage-normal.xsl
> -XMLTO_EXTRA =
> -INSTALL?=install
> -RM ?= rm -f
> -
> -ifdef USE_ASCIIDOCTOR
> -ASCIIDOC = asciidoctor
> -ASCIIDOC_EXTRA = -a compat-mode
> -ASCIIDOC_EXTRA += -I. -rasciidoctor-extensions
> -ASCIIDOC_EXTRA += -a mansource="libtraceevent" -a manmanual="libtraceevent Manual"
> -ASCIIDOC_HTML = xhtml5
> -endif
> -
> -XMLTO=xmlto
> -
> -_tmp_tool_path := $(call get-executable,$(ASCIIDOC))
> -ifeq ($(_tmp_tool_path),)
> - missing_tools = $(ASCIIDOC)
> -endif
> -
> -ifndef USE_ASCIIDOCTOR
> -_tmp_tool_path := $(call get-executable,$(XMLTO))
> -ifeq ($(_tmp_tool_path),)
> - missing_tools += $(XMLTO)
> -endif
> -endif
> -
> -#
> -# For asciidoc ...
> -# -7.1.2, no extra settings are needed.
> -# 8.0-, set ASCIIDOC8.
> -#
> -
> -#
> -# For docbook-xsl ...
> -# -1.68.1, set ASCIIDOC_NO_ROFF? (based on changelog from 1.73.0)
> -# 1.69.0, no extra settings are needed?
> -# 1.69.1-1.71.0, set DOCBOOK_SUPPRESS_SP?
> -# 1.71.1, no extra settings are needed?
> -# 1.72.0, set DOCBOOK_XSL_172.
> -# 1.73.0-, set ASCIIDOC_NO_ROFF
> -#
> -
> -#
> -# If you had been using DOCBOOK_XSL_172 in an attempt to get rid
> -# of 'the ".ft C" problem' in your generated manpages, and you
> -# instead ended up with weird characters around callouts, try
> -# using ASCIIDOC_NO_ROFF instead (it works fine with ASCIIDOC8).
> -#
> -
> -ifdef ASCIIDOC8
> -ASCIIDOC_EXTRA += -a asciidoc7compatible
> -endif
> -ifdef DOCBOOK_XSL_172
> -ASCIIDOC_EXTRA += -a libtraceevent-asciidoc-no-roff
> -MANPAGE_XSL = manpage-1.72.xsl
> -else
> - ifdef ASCIIDOC_NO_ROFF
> - # docbook-xsl after 1.72 needs the regular XSL, but will not
> - # pass-thru raw roff codes from asciidoc.conf, so turn them off.
> - ASCIIDOC_EXTRA += -a libtraceevent-asciidoc-no-roff
> - endif
> -endif
> -ifdef MAN_BOLD_LITERAL
> -XMLTO_EXTRA += -m manpage-bold-literal.xsl
> -endif
> -ifdef DOCBOOK_SUPPRESS_SP
> -XMLTO_EXTRA += -m manpage-suppress-sp.xsl
> -endif
> -
> -SHELL_PATH ?= $(SHELL)
> -# Shell quote;
> -SHELL_PATH_SQ = $(subst ','\'',$(SHELL_PATH))
> -
> -DESTDIR ?=
> -DESTDIR_SQ = '$(subst ','\'',$(DESTDIR))'
> -
> -export DESTDIR DESTDIR_SQ
> -
> -#
> -# Please note that there is a minor bug in asciidoc.
> -# The version after 6.0.3 _will_ include the patch found here:
> -# http://marc.theaimsgroup.com/?l=libtraceevent&m=111558757202243&w=2
> -#
> -# Until that version is released you may have to apply the patch
> -# yourself - yes, all 6 characters of it!
> -#
> -QUIET_SUBDIR0 = +$(MAKE) -C # space to separate -C and subdir
> -QUIET_SUBDIR1 =
> -
> -ifneq ($(findstring $(MAKEFLAGS),w),w)
> -PRINT_DIR = --no-print-directory
> -else # "make -w"
> -NO_SUBDIR = :
> -endif
> -
> -ifneq ($(findstring $(MAKEFLAGS),s),s)
> -ifneq ($(V),1)
> - QUIET_ASCIIDOC = @echo ' ASCIIDOC '$@;
> - QUIET_XMLTO = @echo ' XMLTO '$@;
> - QUIET_SUBDIR0 = +@subdir=
> - QUIET_SUBDIR1 = ;$(NO_SUBDIR) \
> - echo ' SUBDIR ' $$subdir; \
> - $(MAKE) $(PRINT_DIR) -C $$subdir
> - export V
> -endif
> -endif
> -
> -all: html man
> -
> -man: man3
> -man3: $(DOC_MAN3)
> -
> -html: $(MAN_HTML)
> -
> -$(MAN_HTML) $(DOC_MAN3): asciidoc.conf
> -
> -install: install-man
> -
> -check-man-tools:
> -ifdef missing_tools
> - $(error "You need to install $(missing_tools) for man pages")
> -endif
> -
> -do-install-man: man
> - $(call QUIET_INSTALL, Documentation-man) \
> - $(INSTALL) -d -m 755 $(DESTDIR)$(man3dir); \
> - $(INSTALL) -m 644 $(DOC_MAN3) $(DESTDIR)$(man3dir);
> -
> -install-man: check-man-tools man do-install-man
> -
> -uninstall: uninstall-man
> -
> -uninstall-man:
> - $(call QUIET_UNINST, Documentation-man) \
> - $(Q)$(RM) $(addprefix $(DESTDIR)$(man3dir)/,$(DOC_MAN3))
> -
> -
> -ifdef missing_tools
> - DO_INSTALL_MAN = $(warning Please install $(missing_tools) to have the man pages installed)
> -else
> - DO_INSTALL_MAN = do-install-man
> -endif
> -
> -CLEAN_FILES = \
> - $(MAN_XML) $(addsuffix +,$(MAN_XML)) \
> - $(MAN_HTML) $(addsuffix +,$(MAN_HTML)) \
> - $(DOC_MAN3) *.3
> -
> -clean:
> - $(call QUIET_CLEAN, Documentation) $(RM) $(CLEAN_FILES)
> -
> -ifdef USE_ASCIIDOCTOR
> -$(OUTPUT)%.3 : $(OUTPUT)%.txt
> - $(QUIET_ASCIIDOC)$(RM) $@+ $@ && \
> - $(ASCIIDOC) -b manpage -d manpage \
> - $(ASCIIDOC_EXTRA) -alibtraceevent_version=$(EVENT_PARSE_VERSION) -o $@+ $< && \
> - mv $@+ $@
> -endif
> -
> -$(OUTPUT)%.3 : $(OUTPUT)%.xml
> - $(QUIET_XMLTO)$(RM) $@ && \
> - $(XMLTO) -o $(OUTPUT). -m $(MANPAGE_XSL) $(XMLTO_EXTRA) man $<
> -
> -$(OUTPUT)%.xml : %.txt
> - $(QUIET_ASCIIDOC)$(RM) $@+ $@ && \
> - $(ASCIIDOC) -b docbook -d manpage \
> - $(ASCIIDOC_EXTRA) -alibtraceevent_version=$(EVENT_PARSE_VERSION) -o $@+ $< && \
> - mv $@+ $@
> -
> -$(MAN_HTML): $(OUTPUT)%.html : %.txt
> - $(QUIET_ASCIIDOC)$(RM) $@+ $@ && \
> - $(ASCIIDOC) -b $(ASCIIDOC_HTML) -d manpage \
> - $(ASCIIDOC_EXTRA) -aperf_version=$(EVENT_PARSE_VERSION) -o $@+ $< && \
> - mv $@+ $@
> diff --git a/tools/lib/traceevent/Documentation/asciidoc.conf b/tools/lib/traceevent/Documentation/asciidoc.conf
> deleted file mode 100644
> index 07595717f06e..000000000000
> --- a/tools/lib/traceevent/Documentation/asciidoc.conf
> +++ /dev/null
> @@ -1,120 +0,0 @@
> -## linktep: macro
> -#
> -# Usage: linktep:command[manpage-section]
> -#
> -# Note, {0} is the manpage section, while {target} is the command.
> -#
> -# Show TEP link as: <command>(<section>); if section is defined, else just show
> -# the command.
> -
> -[macros]
> -(?su)[\\]?(?P<name>linktep):(?P<target>\S*?)\[(?P<attrlist>.*?)\]=
> -
> -[attributes]
> -asterisk=&#42;
> -plus=&#43;
> -caret=&#94;
> -startsb=&#91;
> -endsb=&#93;
> -tilde=&#126;
> -
> -ifdef::backend-docbook[]
> -[linktep-inlinemacro]
> -{0%{target}}
> -{0#<citerefentry>}
> -{0#<refentrytitle>{target}</refentrytitle><manvolnum>{0}</manvolnum>}
> -{0#</citerefentry>}
> -endif::backend-docbook[]
> -
> -ifdef::backend-docbook[]
> -ifndef::tep-asciidoc-no-roff[]
> -# "unbreak" docbook-xsl v1.68 for manpages. v1.69 works with or without this.
> -# v1.72 breaks with this because it replaces dots not in roff requests.
> -[listingblock]
> -<example><title>{title}</title>
> -<literallayout>
> -ifdef::doctype-manpage[]
> -&#10;.ft C&#10;
> -endif::doctype-manpage[]
> -|
> -ifdef::doctype-manpage[]
> -&#10;.ft&#10;
> -endif::doctype-manpage[]
> -</literallayout>
> -{title#}</example>
> -endif::tep-asciidoc-no-roff[]
> -
> -ifdef::tep-asciidoc-no-roff[]
> -ifdef::doctype-manpage[]
> -# The following two small workarounds insert a simple paragraph after screen
> -[listingblock]
> -<example><title>{title}</title>
> -<literallayout>
> -|
> -</literallayout><simpara></simpara>
> -{title#}</example>
> -
> -[verseblock]
> -<formalpara{id? id="{id}"}><title>{title}</title><para>
> -{title%}<literallayout{id? id="{id}"}>
> -{title#}<literallayout>
> -|
> -</literallayout>
> -{title#}</para></formalpara>
> -{title%}<simpara></simpara>
> -endif::doctype-manpage[]
> -endif::tep-asciidoc-no-roff[]
> -endif::backend-docbook[]
> -
> -ifdef::doctype-manpage[]
> -ifdef::backend-docbook[]
> -[header]
> -template::[header-declarations]
> -<refentry>
> -<refmeta>
> -<refentrytitle>{mantitle}</refentrytitle>
> -<manvolnum>{manvolnum}</manvolnum>
> -<refmiscinfo class="source">libtraceevent</refmiscinfo>
> -<refmiscinfo class="version">{libtraceevent_version}</refmiscinfo>
> -<refmiscinfo class="manual">libtraceevent Manual</refmiscinfo>
> -</refmeta>
> -<refnamediv>
> - <refname>{manname1}</refname>
> - <refname>{manname2}</refname>
> - <refname>{manname3}</refname>
> - <refname>{manname4}</refname>
> - <refname>{manname5}</refname>
> - <refname>{manname6}</refname>
> - <refname>{manname7}</refname>
> - <refname>{manname8}</refname>
> - <refname>{manname9}</refname>
> - <refname>{manname10}</refname>
> - <refname>{manname11}</refname>
> - <refname>{manname12}</refname>
> - <refname>{manname13}</refname>
> - <refname>{manname14}</refname>
> - <refname>{manname15}</refname>
> - <refname>{manname16}</refname>
> - <refname>{manname17}</refname>
> - <refname>{manname18}</refname>
> - <refname>{manname19}</refname>
> - <refname>{manname20}</refname>
> - <refname>{manname21}</refname>
> - <refname>{manname22}</refname>
> - <refname>{manname23}</refname>
> - <refname>{manname24}</refname>
> - <refname>{manname25}</refname>
> - <refname>{manname26}</refname>
> - <refname>{manname27}</refname>
> - <refname>{manname28}</refname>
> - <refname>{manname29}</refname>
> - <refname>{manname30}</refname>
> - <refpurpose>{manpurpose}</refpurpose>
> -</refnamediv>
> -endif::backend-docbook[]
> -endif::doctype-manpage[]
> -
> -ifdef::backend-xhtml11[]
> -[linktep-inlinemacro]
> -<a href="{target}.html">{target}{0?({0})}</a>
> -endif::backend-xhtml11[]
> diff --git a/tools/lib/traceevent/Documentation/libtraceevent-commands.txt b/tools/lib/traceevent/Documentation/libtraceevent-commands.txt
> deleted file mode 100644
> index bec552001f8e..000000000000
> --- a/tools/lib/traceevent/Documentation/libtraceevent-commands.txt
> +++ /dev/null
> @@ -1,153 +0,0 @@
> -libtraceevent(3)
> -================
> -
> -NAME
> -----
> -tep_register_comm, tep_override_comm, tep_pid_is_registered,
> -tep_data_comm_from_pid, tep_data_pid_from_comm, tep_cmdline_pid -
> -Manage pid to process name mappings.
> -
> -SYNOPSIS
> ---------
> -[verse]
> ---
> -*#include <event-parse.h>*
> -
> -int *tep_register_comm*(struct tep_handle pass:[*]_tep_, const char pass:[*]_comm_, int _pid_);
> -int *tep_override_comm*(struct tep_handle pass:[*]_tep_, const char pass:[*]_comm_, int _pid_);
> -bool *tep_is_pid_registered*(struct tep_handle pass:[*]_tep_, int _pid_);
> -const char pass:[*]*tep_data_comm_from_pid*(struct tep_handle pass:[*]_pevent_, int _pid_);
> -struct cmdline pass:[*]*tep_data_pid_from_comm*(struct tep_handle pass:[*]_pevent_, const char pass:[*]_comm_, struct cmdline pass:[*]_next_);
> -int *tep_cmdline_pid*(struct tep_handle pass:[*]_pevent_, struct cmdline pass:[*]_cmdline_);
> ---
> -
> -DESCRIPTION
> ------------
> -These functions can be used to handle the mapping between pid and process name.
> -The library builds a cache of these mappings, which is used to display the name
> -of the process, instead of its pid. This information can be retrieved from
> -tracefs/saved_cmdlines file.
> -
> -The _tep_register_comm()_ function registers a _pid_ / process name mapping.
> -If a command with the same _pid_ is already registered, an error is returned.
> -The _pid_ argument is the process ID, the _comm_ argument is the process name,
> -_tep_ is the event context. The _comm_ is duplicated internally.
> -
> -The _tep_override_comm()_ function registers a _pid_ / process name mapping.
> -If a process with the same pid is already registered, the process name string is
> -udapted with the new one. The _pid_ argument is the process ID, the _comm_
> -argument is the process name, _tep_ is the event context. The _comm_ is
> -duplicated internally.
> -
> -The _tep_is_pid_registered()_ function checks if a pid has a process name
> -mapping registered. The _pid_ argument is the process ID, _tep_ is the event
> -context.
> -
> -The _tep_data_comm_from_pid()_ function returns the process name for a given
> -pid. The _pid_ argument is the process ID, _tep_ is the event context.
> -The returned string should not be freed, but will be freed when the _tep_
> -handler is closed.
> -
> -The _tep_data_pid_from_comm()_ function returns a pid for a given process name.
> -The _comm_ argument is the process name, _tep_ is the event context.
> -The argument _next_ is the cmdline structure to search for the next pid.
> -As there may be more than one pid for a given process, the result of this call
> -can be passed back into a recurring call in the _next_ parameter, to search for
> -the next pid. If _next_ is NULL, it will return the first pid associated with
> -the _comm_. The function performs a linear search, so it may be slow.
> -
> -The _tep_cmdline_pid()_ function returns the pid associated with a given
> -_cmdline_. The _tep_ argument is the event context.
> -
> -RETURN VALUE
> -------------
> -_tep_register_comm()_ function returns 0 on success. In case of an error -1 is
> -returned and errno is set to indicate the cause of the problem: ENOMEM, if there
> -is not enough memory to duplicate the _comm_ or EEXIST if a mapping for this
> -_pid_ is already registered.
> -
> -_tep_override_comm()_ function returns 0 on success. In case of an error -1 is
> -returned and errno is set to indicate the cause of the problem: ENOMEM, if there
> -is not enough memory to duplicate the _comm_.
> -
> -_tep_is_pid_registered()_ function returns true if the _pid_ has a process name
> -mapped to it, false otherwise.
> -
> -_tep_data_comm_from_pid()_ function returns the process name as string, or the
> -string "<...>" if there is no mapping for the given pid.
> -
> -_tep_data_pid_from_comm()_ function returns a pointer to a struct cmdline, that
> -holds a pid for a given process, or NULL if none is found. This result can be
> -passed back into a recurring call as the _next_ parameter of the function.
> -
> -_tep_cmdline_pid()_ functions returns the pid for the give cmdline. If _cmdline_
> - is NULL, then -1 is returned.
> -
> -EXAMPLE
> --------
> -The following example registers pid for command "ls", in context of event _tep_
> -and performs various searches for pid / process name mappings:
> -[source,c]
> ---
> -#include <event-parse.h>
> -...
> -int ret;
> -int ls_pid = 1021;
> -struct tep_handle *tep = tep_alloc();
> -...
> - ret = tep_register_comm(tep, "ls", ls_pid);
> - if (ret != 0 && errno == EEXIST)
> - ret = tep_override_comm(tep, "ls", ls_pid);
> - if (ret != 0) {
> - /* Failed to register pid / command mapping */
> - }
> -...
> - if (tep_is_pid_registered(tep, ls_pid) == 0) {
> - /* Command mapping for ls_pid is not registered */
> - }
> -...
> - const char *comm = tep_data_comm_from_pid(tep, ls_pid);
> - if (comm) {
> - /* Found process name for ls_pid */
> - }
> -...
> - int pid;
> - struct cmdline *cmd = tep_data_pid_from_comm(tep, "ls", NULL);
> - while (cmd) {
> - pid = tep_cmdline_pid(tep, cmd);
> - /* Found pid for process "ls" */
> - cmd = tep_data_pid_from_comm(tep, "ls", cmd);
> - }
> ---
> -FILES
> ------
> -[verse]
> ---
> -*event-parse.h*
> - Header file to include in order to have access to the library APIs.
> -*-ltraceevent*
> - Linker switch to add when building a program that uses the library.
> ---
> -
> -SEE ALSO
> ---------
> -_libtraceevent(3)_, _trace-cmd(1)_
> -
> -AUTHOR
> -------
> -[verse]
> ---
> -*Steven Rostedt* <[email protected]>, author of *libtraceevent*.
> -*Tzvetomir Stoyanov* <[email protected]>, author of this man page.
> ---
> -REPORTING BUGS
> ---------------
> -Report bugs to <[email protected]>
> -
> -LICENSE
> --------
> -libtraceevent is Free Software licensed under the GNU LGPL 2.1
> -
> -RESOURCES
> ----------
> -https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
> diff --git a/tools/lib/traceevent/Documentation/libtraceevent-cpus.txt b/tools/lib/traceevent/Documentation/libtraceevent-cpus.txt
> deleted file mode 100644
> index 5ad70e43b752..000000000000
> --- a/tools/lib/traceevent/Documentation/libtraceevent-cpus.txt
> +++ /dev/null
> @@ -1,77 +0,0 @@
> -libtraceevent(3)
> -================
> -
> -NAME
> -----
> -tep_get_cpus, tep_set_cpus - Get / set the number of CPUs, which have a tracing
> -buffer representing it. Note, the buffer may be empty.
> -
> -SYNOPSIS
> ---------
> -[verse]
> ---
> -*#include <event-parse.h>*
> -
> -int *tep_get_cpus*(struct tep_handle pass:[*]_tep_);
> -void *tep_set_cpus*(struct tep_handle pass:[*]_tep_, int _cpus_);
> ---
> -
> -DESCRIPTION
> ------------
> -The _tep_get_cpus()_ function gets the number of CPUs, which have a tracing
> -buffer representing it. The _tep_ argument is trace event parser context.
> -
> -The _tep_set_cpus()_ function sets the number of CPUs, which have a tracing
> -buffer representing it. The _tep_ argument is trace event parser context.
> -The _cpu_ argument is the number of CPUs with tracing data.
> -
> -RETURN VALUE
> -------------
> -The _tep_get_cpus()_ functions returns the number of CPUs, which have tracing
> -data recorded.
> -
> -EXAMPLE
> --------
> -[source,c]
> ---
> -#include <event-parse.h>
> -...
> -struct tep_handle *tep = tep_alloc();
> -...
> - tep_set_cpus(tep, 5);
> -...
> - printf("We have tracing data for %d CPUs", tep_get_cpus(tep));
> ---
> -
> -FILES
> ------
> -[verse]
> ---
> -*event-parse.h*
> - Header file to include in order to have access to the library APIs.
> -*-ltraceevent*
> - Linker switch to add when building a program that uses the library.
> ---
> -
> -SEE ALSO
> ---------
> -_libtraceevent(3)_, _trace-cmd(1)_
> -
> -AUTHOR
> -------
> -[verse]
> ---
> -*Steven Rostedt* <[email protected]>, author of *libtraceevent*.
> -*Tzvetomir Stoyanov* <[email protected]>, author of this man page.
> ---
> -REPORTING BUGS
> ---------------
> -Report bugs to <[email protected]>
> -
> -LICENSE
> --------
> -libtraceevent is Free Software licensed under the GNU LGPL 2.1
> -
> -RESOURCES
> ----------
> -https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
> diff --git a/tools/lib/traceevent/Documentation/libtraceevent-endian_read.txt b/tools/lib/traceevent/Documentation/libtraceevent-endian_read.txt
> deleted file mode 100644
> index e64851b6e189..000000000000
> --- a/tools/lib/traceevent/Documentation/libtraceevent-endian_read.txt
> +++ /dev/null
> @@ -1,78 +0,0 @@
> -libtraceevent(3)
> -================
> -
> -NAME
> -----
> -tep_read_number - Reads a number from raw data.
> -
> -SYNOPSIS
> ---------
> -[verse]
> ---
> -*#include <event-parse.h>*
> -
> -unsigned long long *tep_read_number*(struct tep_handle pass:[*]_tep_, const void pass:[*]_ptr_, int _size_);
> ---
> -
> -DESCRIPTION
> ------------
> -The _tep_read_number()_ function reads an integer from raw data, taking into
> -account the endianness of the raw data and the current host. The _tep_ argument
> -is the trace event parser context. The _ptr_ is a pointer to the raw data, where
> -the integer is, and the _size_ is the size of the integer.
> -
> -RETURN VALUE
> -------------
> -The _tep_read_number()_ function returns the integer in the byte order of
> -the current host. In case of an error, 0 is returned.
> -
> -EXAMPLE
> --------
> -[source,c]
> ---
> -#include <event-parse.h>
> -...
> -struct tep_handle *tep = tep_alloc();
> -...
> -void process_record(struct tep_record *record)
> -{
> - int offset = 24;
> - int data = tep_read_number(tep, record->data + offset, 4);
> -
> - /* Read the 4 bytes at the offset 24 of data as an integer */
> -}
> -...
> ---
> -
> -FILES
> ------
> -[verse]
> ---
> -*event-parse.h*
> - Header file to include in order to have access to the library APIs.
> -*-ltraceevent*
> - Linker switch to add when building a program that uses the library.
> ---
> -
> -SEE ALSO
> ---------
> -_libtraceevent(3)_, _trace-cmd(1)_
> -
> -AUTHOR
> -------
> -[verse]
> ---
> -*Steven Rostedt* <[email protected]>, author of *libtraceevent*.
> -*Tzvetomir Stoyanov* <[email protected]>, author of this man page.
> ---
> -REPORTING BUGS
> ---------------
> -Report bugs to <[email protected]>
> -
> -LICENSE
> --------
> -libtraceevent is Free Software licensed under the GNU LGPL 2.1
> -
> -RESOURCES
> ----------
> -https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
> diff --git a/tools/lib/traceevent/Documentation/libtraceevent-event_find.txt b/tools/lib/traceevent/Documentation/libtraceevent-event_find.txt
> deleted file mode 100644
> index 7bc062c9f76f..000000000000
> --- a/tools/lib/traceevent/Documentation/libtraceevent-event_find.txt
> +++ /dev/null
> @@ -1,103 +0,0 @@
> -libtraceevent(3)
> -================
> -
> -NAME
> -----
> -tep_find_event,tep_find_event_by_name,tep_find_event_by_record -
> -Find events by given key.
> -
> -SYNOPSIS
> ---------
> -[verse]
> ---
> -*#include <event-parse.h>*
> -
> -struct tep_event pass:[*]*tep_find_event*(struct tep_handle pass:[*]_tep_, int _id_);
> -struct tep_event pass:[*]*tep_find_event_by_name*(struct tep_handle pass:[*]_tep_, const char pass:[*]_sys_, const char pass:[*]_name_);
> -struct tep_event pass:[*]*tep_find_event_by_record*(struct tep_handle pass:[*]_tep_, struct tep_record pass:[*]_record_);
> ---
> -
> -DESCRIPTION
> ------------
> -This set of functions can be used to search for an event, based on a given
> -criteria. All functions require a pointer to a _tep_, trace event parser
> -context.
> -
> -The _tep_find_event()_ function searches for an event by given event _id_. The
> -event ID is assigned dynamically and can be viewed in event's format file,
> -"ID" field.
> -
> -The tep_find_event_by_name()_ function searches for an event by given
> -event _name_, under the system _sys_. If the _sys_ is NULL (not specified),
> -the first event with _name_ is returned.
> -
> -The tep_find_event_by_record()_ function searches for an event from a given
> -_record_.
> -
> -RETURN VALUE
> -------------
> -All these functions return a pointer to the found event, or NULL if there is no
> -such event.
> -
> -EXAMPLE
> --------
> -[source,c]
> ---
> -#include <event-parse.h>
> -...
> -struct tep_handle *tep = tep_alloc();
> -...
> -struct tep_event *event;
> -
> -event = tep_find_event(tep, 1857);
> -if (event == NULL) {
> - /* There is no event with ID 1857 */
> -}
> -
> -event = tep_find_event_by_name(tep, "kvm", "kvm_exit");
> -if (event == NULL) {
> - /* There is no kvm_exit event, from kvm system */
> -}
> -
> -void event_from_record(struct tep_record *record)
> -{
> - struct tep_event *event = tep_find_event_by_record(tep, record);
> - if (event == NULL) {
> - /* There is no event from given record */
> - }
> -}
> -...
> ---
> -
> -FILES
> ------
> -[verse]
> ---
> -*event-parse.h*
> - Header file to include in order to have access to the library APIs.
> -*-ltraceevent*
> - Linker switch to add when building a program that uses the library.
> ---
> -
> -SEE ALSO
> ---------
> -_libtraceevent(3)_, _trace-cmd(1)_
> -
> -AUTHOR
> -------
> -[verse]
> ---
> -*Steven Rostedt* <[email protected]>, author of *libtraceevent*.
> -*Tzvetomir Stoyanov* <[email protected]>, author of this man page.
> ---
> -REPORTING BUGS
> ---------------
> -Report bugs to <[email protected]>
> -
> -LICENSE
> --------
> -libtraceevent is Free Software licensed under the GNU LGPL 2.1
> -
> -RESOURCES
> ----------
> -https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
> diff --git a/tools/lib/traceevent/Documentation/libtraceevent-event_get.txt b/tools/lib/traceevent/Documentation/libtraceevent-event_get.txt
> deleted file mode 100644
> index 6525092fc417..000000000000
> --- a/tools/lib/traceevent/Documentation/libtraceevent-event_get.txt
> +++ /dev/null
> @@ -1,99 +0,0 @@
> -libtraceevent(3)
> -================
> -
> -NAME
> -----
> -tep_get_event, tep_get_first_event, tep_get_events_count - Access events.
> -
> -SYNOPSIS
> ---------
> -[verse]
> ---
> -*#include <event-parse.h>*
> -
> -struct tep_event pass:[*]*tep_get_event*(struct tep_handle pass:[*]_tep_, int _index_);
> -struct tep_event pass:[*]*tep_get_first_event*(struct tep_handle pass:[*]_tep_);
> -int *tep_get_events_count*(struct tep_handle pass:[*]_tep_);
> ---
> -
> -DESCRIPTION
> ------------
> -The _tep_get_event()_ function returns a pointer to event at the given _index_.
> -The _tep_ argument is trace event parser context, the _index_ is the index of
> -the requested event.
> -
> -The _tep_get_first_event()_ function returns a pointer to the first event.
> -As events are stored in an array, this function returns the pointer to the
> -beginning of the array. The _tep_ argument is trace event parser context.
> -
> -The _tep_get_events_count()_ function returns the number of the events
> -in the array. The _tep_ argument is trace event parser context.
> -
> -RETURN VALUE
> -------------
> -The _tep_get_event()_ returns a pointer to the event located at _index_.
> -NULL is returned in case of error, in case there are no events or _index_ is
> -out of range.
> -
> -The _tep_get_first_event()_ returns a pointer to the first event. NULL is
> -returned in case of error, or in case there are no events.
> -
> -The _tep_get_events_count()_ returns the number of the events. 0 is
> -returned in case of error, or in case there are no events.
> -
> -EXAMPLE
> --------
> -[source,c]
> ---
> -#include <event-parse.h>
> -...
> -struct tep_handle *tep = tep_alloc();
> -...
> -int i,count = tep_get_events_count(tep);
> -struct tep_event *event, *events = tep_get_first_event(tep);
> -
> -if (events == NULL) {
> - /* There are no events */
> -} else {
> - for (i = 0; i < count; i++) {
> - event = (events+i);
> - /* process events[i] */
> - }
> -
> - /* Get the last event */
> - event = tep_get_event(tep, count-1);
> -}
> ---
> -
> -FILES
> ------
> -[verse]
> ---
> -*event-parse.h*
> - Header file to include in order to have access to the library APIs.
> -*-ltraceevent*
> - Linker switch to add when building a program that uses the library.
> ---
> -
> -SEE ALSO
> ---------
> -_libtraceevent(3)_, _trace-cmd(1)_
> -
> -AUTHOR
> -------
> -[verse]
> ---
> -*Steven Rostedt* <[email protected]>, author of *libtraceevent*.
> -*Tzvetomir Stoyanov* <[email protected]>, author of this man page.
> ---
> -REPORTING BUGS
> ---------------
> -Report bugs to <[email protected]>
> -
> -LICENSE
> --------
> -libtraceevent is Free Software licensed under the GNU LGPL 2.1
> -
> -RESOURCES
> ----------
> -https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
> diff --git a/tools/lib/traceevent/Documentation/libtraceevent-event_list.txt b/tools/lib/traceevent/Documentation/libtraceevent-event_list.txt
> deleted file mode 100644
> index fba350e5a4cb..000000000000
> --- a/tools/lib/traceevent/Documentation/libtraceevent-event_list.txt
> +++ /dev/null
> @@ -1,122 +0,0 @@
> -libtraceevent(3)
> -================
> -
> -NAME
> -----
> -tep_list_events, tep_list_events_copy -
> -Get list of events, sorted by given criteria.
> -
> -SYNOPSIS
> ---------
> -[verse]
> ---
> -*#include <event-parse.h>*
> -
> -enum *tep_event_sort_type* {
> - _TEP_EVENT_SORT_ID_,
> - _TEP_EVENT_SORT_NAME_,
> - _TEP_EVENT_SORT_SYSTEM_,
> -};
> -
> -struct tep_event pass:[*]pass:[*]*tep_list_events*(struct tep_handle pass:[*]_tep_, enum tep_event_sort_type _sort_type_);
> -struct tep_event pass:[*]pass:[*]*tep_list_events_copy*(struct tep_handle pass:[*]_tep_, enum tep_event_sort_type _sort_type_);
> ---
> -
> -DESCRIPTION
> ------------
> -The _tep_list_events()_ function returns an array of pointers to the events,
> -sorted by the _sort_type_ criteria. The last element of the array is NULL.
> -The returned memory must not be freed, it is managed by the library.
> -The function is not thread safe. The _tep_ argument is trace event parser
> -context. The _sort_type_ argument is the required sort criteria:
> -[verse]
> ---
> - _TEP_EVENT_SORT_ID_ - sort by the event ID.
> - _TEP_EVENT_SORT_NAME_ - sort by the event (name, system, id) triplet.
> - _TEP_EVENT_SORT_SYSTEM_ - sort by the event (system, name, id) triplet.
> ---
> -
> -The _tep_list_events_copy()_ is a thread safe version of _tep_list_events()_.
> -It has the same behavior, but the returned array is allocated internally and
> -must be freed by the caller. Note that the content of the array must not be
> -freed (see the EXAMPLE below).
> -
> -RETURN VALUE
> -------------
> -The _tep_list_events()_ function returns an array of pointers to events.
> -In case of an error, NULL is returned. The returned array must not be freed,
> -it is managed by the library.
> -
> -The _tep_list_events_copy()_ function returns an array of pointers to events.
> -In case of an error, NULL is returned. The returned array must be freed by
> -the caller.
> -
> -EXAMPLE
> --------
> -[source,c]
> ---
> -#include <event-parse.h>
> -...
> -struct tep_handle *tep = tep_alloc();
> -...
> -int i;
> -struct tep_event_format **events;
> -
> -i=0;
> -events = tep_list_events(tep, TEP_EVENT_SORT_ID);
> -if (events == NULL) {
> - /* Failed to get the events, sorted by ID */
> -} else {
> - while(events[i]) {
> - /* walk through the list of the events, sorted by ID */
> - i++;
> - }
> -}
> -
> -i=0;
> -events = tep_list_events_copy(tep, TEP_EVENT_SORT_NAME);
> -if (events == NULL) {
> - /* Failed to get the events, sorted by name */
> -} else {
> - while(events[i]) {
> - /* walk through the list of the events, sorted by name */
> - i++;
> - }
> - free(events);
> -}
> -
> -...
> ---
> -
> -FILES
> ------
> -[verse]
> ---
> -*event-parse.h*
> - Header file to include in order to have access to the library APIs.
> -*-ltraceevent*
> - Linker switch to add when building a program that uses the library.
> ---
> -
> -SEE ALSO
> ---------
> -_libtraceevent(3)_, _trace-cmd(1)_
> -
> -AUTHOR
> -------
> -[verse]
> ---
> -*Steven Rostedt* <[email protected]>, author of *libtraceevent*.
> -*Tzvetomir Stoyanov* <[email protected]>, author of this man page.
> ---
> -REPORTING BUGS
> ---------------
> -Report bugs to <[email protected]>
> -
> -LICENSE
> --------
> -libtraceevent is Free Software licensed under the GNU LGPL 2.1
> -
> -RESOURCES
> ----------
> -https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
> diff --git a/tools/lib/traceevent/Documentation/libtraceevent-event_print.txt b/tools/lib/traceevent/Documentation/libtraceevent-event_print.txt
> deleted file mode 100644
> index 2c6a61811118..000000000000
> --- a/tools/lib/traceevent/Documentation/libtraceevent-event_print.txt
> +++ /dev/null
> @@ -1,130 +0,0 @@
> -libtraceevent(3)
> -================
> -
> -NAME
> -----
> -tep_print_event - Writes event information into a trace sequence.
> -
> -SYNOPSIS
> ---------
> -[verse]
> ---
> -*#include <event-parse.h>*
> -*#include <trace-seq.h>*
> -
> -void *tep_print_event*(struct tep_handle pass:[*]_tep_, struct trace_seqpass:[*]_s_, struct tep_record pass:[*]_record_, const char pass:[*]_fmt_, _..._)
> ---
> -
> -DESCRIPTION
> ------------
> -
> -The _tep_print_event()_ function parses the event information of the given
> -_record_ and writes it into the trace sequence _s_, according to the format
> -string _fmt_. The desired information is specified after the format string.
> -The _fmt_ is printf-like format string, following arguments are supported:
> -[verse]
> ---
> - TEP_PRINT_PID, "%d" - PID of the event.
> - TEP_PRINT_CPU, "%d" - Event CPU.
> - TEP_PRINT_COMM, "%s" - Event command string.
> - TEP_PRINT_NAME, "%s" - Event name.
> - TEP_PRINT_LATENCY, "%s" - Latency of the event. It prints 4 or more
> - fields - interrupt state, scheduling state,
> - current context, and preemption count.
> - Field 1 is the interrupt enabled state:
> - d : Interrupts are disabled
> - . : Interrupts are enabled
> - X : The architecture does not support this
> - information
> - Field 2 is the "need resched" state.
> - N : The task is set to call the scheduler when
> - possible, as another higher priority task
> - may need to be scheduled in.
> - . : The task is not set to call the scheduler.
> - Field 3 is the context state.
> - . : Normal context
> - s : Soft interrupt context
> - h : Hard interrupt context
> - H : Hard interrupt context which triggered
> - during soft interrupt context.
> - z : NMI context
> - Z : NMI context which triggered during hard
> - interrupt context
> - Field 4 is the preemption count.
> - . : The preempt count is zero.
> - On preemptible kernels (where the task can be scheduled
> - out in arbitrary locations while in kernel context), the
> - preempt count, when non zero, will prevent the kernel
> - from scheduling out the current task. The preempt count
> - number is displayed when it is not zero.
> - Depending on the kernel, it may show other fields
> - (lock depth, or migration disabled, which are unique to
> - specialized kernels).
> - TEP_PRINT_TIME, %d - event time stamp. A divisor and precision can be
> - specified as part of this format string:
> - "%precision.divisord". Example:
> - "%3.1000d" - divide the time by 1000 and print the first
> - 3 digits before the dot. Thus, the time stamp
> - "123456000" will be printed as "123.456"
> - TEP_PRINT_INFO, "%s" - event information.
> - TEP_PRINT_INFO_RAW, "%s" - event information, in raw format.
> -
> ---
> -EXAMPLE
> --------
> -[source,c]
> ---
> -#include <event-parse.h>
> -#include <trace-seq.h>
> -...
> -struct trace_seq seq;
> -trace_seq_init(&seq);
> -struct tep_handle *tep = tep_alloc();
> -...
> -void print_my_event(struct tep_record *record)
> -{
> - trace_seq_reset(&seq);
> - tep_print_event(tep, s, record, "%16s-%-5d [%03d] %s %6.1000d %s %s",
> - TEP_PRINT_COMM, TEP_PRINT_PID, TEP_PRINT_CPU,
> - TEP_PRINT_LATENCY, TEP_PRINT_TIME, TEP_PRINT_NAME,
> - TEP_PRINT_INFO);
> -}
> -...
> ---
> -
> -FILES
> ------
> -[verse]
> ---
> -*event-parse.h*
> - Header file to include in order to have access to the library APIs.
> -*trace-seq.h*
> - Header file to include in order to have access to trace sequences related APIs.
> - Trace sequences are used to allow a function to call several other functions
> - to create a string of data to use.
> -*-ltraceevent*
> - Linker switch to add when building a program that uses the library.
> ---
> -
> -SEE ALSO
> ---------
> -_libtraceevent(3)_, _trace-cmd(1)_
> -
> -AUTHOR
> -------
> -[verse]
> ---
> -*Steven Rostedt* <[email protected]>, author of *libtraceevent*.
> -*Tzvetomir Stoyanov* <[email protected]>, author of this man page.
> ---
> -REPORTING BUGS
> ---------------
> -Report bugs to <[email protected]>
> -
> -LICENSE
> --------
> -libtraceevent is Free Software licensed under the GNU LGPL 2.1
> -
> -RESOURCES
> ----------
> -https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
> diff --git a/tools/lib/traceevent/Documentation/libtraceevent-field_find.txt b/tools/lib/traceevent/Documentation/libtraceevent-field_find.txt
> deleted file mode 100644
> index 0896af5b9eff..000000000000
> --- a/tools/lib/traceevent/Documentation/libtraceevent-field_find.txt
> +++ /dev/null
> @@ -1,118 +0,0 @@
> -libtraceevent(3)
> -================
> -
> -NAME
> -----
> -tep_find_common_field, tep_find_field, tep_find_any_field -
> -Search for a field in an event.
> -
> -SYNOPSIS
> ---------
> -[verse]
> ---
> -*#include <event-parse.h>*
> -
> -struct tep_format_field pass:[*]*tep_find_common_field*(struct tep_event pass:[*]_event_, const char pass:[*]_name_);
> -struct tep_format_field pass:[*]*tep_find_field*(struct tep_event_ormat pass:[*]_event_, const char pass:[*]_name_);
> -struct tep_format_field pass:[*]*tep_find_any_field*(struct tep_event pass:[*]_event_, const char pass:[*]_name_);
> ---
> -
> -DESCRIPTION
> ------------
> -These functions search for a field with given name in an event. The field
> -returned can be used to find the field content from within a data record.
> -
> -The _tep_find_common_field()_ function searches for a common field with _name_
> -in the _event_.
> -
> -The _tep_find_field()_ function searches for an event specific field with
> -_name_ in the _event_.
> -
> -The _tep_find_any_field()_ function searches for any field with _name_ in the
> -_event_.
> -
> -RETURN VALUE
> -------------
> -The _tep_find_common_field(), _tep_find_field()_ and _tep_find_any_field()_
> -functions return a pointer to the found field, or NULL in case there is no field
> -with the requested name.
> -
> -EXAMPLE
> --------
> -[source,c]
> ---
> -#include <event-parse.h>
> -...
> -void get_htimer_info(struct tep_handle *tep, struct tep_record *record)
> -{
> - struct tep_format_field *field;
> - struct tep_event *event;
> - long long softexpires;
> - int mode;
> - int pid;
> -
> - event = tep_find_event_by_name(tep, "timer", "hrtimer_start");
> -
> - field = tep_find_common_field(event, "common_pid");
> - if (field == NULL) {
> - /* Cannot find "common_pid" field in the event */
> - } else {
> - /* Get pid from the data record */
> - pid = tep_read_number(tep, record->data + field->offset,
> - field->size);
> - }
> -
> - field = tep_find_field(event, "softexpires");
> - if (field == NULL) {
> - /* Cannot find "softexpires" event specific field in the event */
> - } else {
> - /* Get softexpires parameter from the data record */
> - softexpires = tep_read_number(tep, record->data + field->offset,
> - field->size);
> - }
> -
> - field = tep_find_any_field(event, "mode");
> - if (field == NULL) {
> - /* Cannot find "mode" field in the event */
> - } else
> - {
> - /* Get mode parameter from the data record */
> - mode = tep_read_number(tep, record->data + field->offset,
> - field->size);
> - }
> -}
> -...
> ---
> -
> -FILES
> ------
> -[verse]
> ---
> -*event-parse.h*
> - Header file to include in order to have access to the library APIs.
> -*-ltraceevent*
> - Linker switch to add when building a program that uses the library.
> ---
> -
> -SEE ALSO
> ---------
> -_libtraceevent(3)_, _trace-cmd(1)_
> -
> -AUTHOR
> -------
> -[verse]
> ---
> -*Steven Rostedt* <[email protected]>, author of *libtraceevent*.
> -*Tzvetomir Stoyanov* <[email protected]>, author of this man page.
> ---
> -REPORTING BUGS
> ---------------
> -Report bugs to <[email protected]>
> -
> -LICENSE
> --------
> -libtraceevent is Free Software licensed under the GNU LGPL 2.1
> -
> -RESOURCES
> ----------
> -https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
> diff --git a/tools/lib/traceevent/Documentation/libtraceevent-field_get_val.txt b/tools/lib/traceevent/Documentation/libtraceevent-field_get_val.txt
> deleted file mode 100644
> index 6324f0d48aeb..000000000000
> --- a/tools/lib/traceevent/Documentation/libtraceevent-field_get_val.txt
> +++ /dev/null
> @@ -1,122 +0,0 @@
> -libtraceevent(3)
> -================
> -
> -NAME
> -----
> -tep_get_any_field_val, tep_get_common_field_val, tep_get_field_val,
> -tep_get_field_raw - Get value of a field.
> -
> -SYNOPSIS
> ---------
> -[verse]
> ---
> -*#include <event-parse.h>*
> -*#include <trace-seq.h>*
> -
> -int *tep_get_any_field_val*(struct trace_seq pass:[*]_s_, struct tep_event pass:[*]_event_, const char pass:[*]_name_, struct tep_record pass:[*]_record_, unsigned long long pass:[*]_val_, int _err_);
> -int *tep_get_common_field_val*(struct trace_seq pass:[*]_s_, struct tep_event pass:[*]_event_, const char pass:[*]_name_, struct tep_record pass:[*]_record_, unsigned long long pass:[*]_val_, int _err_);
> -int *tep_get_field_val*(struct trace_seq pass:[*]_s_, struct tep_event pass:[*]_event_, const char pass:[*]_name_, struct tep_record pass:[*]_record_, unsigned long long pass:[*]_val_, int _err_);
> -void pass:[*]*tep_get_field_raw*(struct trace_seq pass:[*]_s_, struct tep_event pass:[*]_event_, const char pass:[*]_name_, struct tep_record pass:[*]_record_, int pass:[*]_len_, int _err_);
> ---
> -
> -DESCRIPTION
> ------------
> -These functions can be used to find a field and retrieve its value.
> -
> -The _tep_get_any_field_val()_ function searches in the _record_ for a field
> -with _name_, part of the _event_. If the field is found, its value is stored in
> -_val_. If there is an error and _err_ is not zero, then an error string is
> -written into _s_.
> -
> -The _tep_get_common_field_val()_ function does the same as
> -_tep_get_any_field_val()_, but searches only in the common fields. This works
> -for any event as all events include the common fields.
> -
> -The _tep_get_field_val()_ function does the same as _tep_get_any_field_val()_,
> -but searches only in the event specific fields.
> -
> -The _tep_get_field_raw()_ function searches in the _record_ for a field with
> -_name_, part of the _event_. If the field is found, a pointer to where the field
> -exists in the record's raw data is returned. The size of the data is stored in
> -_len_. If there is an error and _err_ is not zero, then an error string is
> -written into _s_.
> -
> -RETURN VALUE
> -------------
> -The _tep_get_any_field_val()_, _tep_get_common_field_val()_ and
> -_tep_get_field_val()_ functions return 0 on success, or -1 in case of an error.
> -
> -The _tep_get_field_raw()_ function returns a pointer to field's raw data, and
> -places the length of this data in _len_. In case of an error NULL is returned.
> -
> -EXAMPLE
> --------
> -[source,c]
> ---
> -#include <event-parse.h>
> -#include <trace-seq.h>
> -...
> -struct tep_handle *tep = tep_alloc();
> -...
> -struct tep_event *event = tep_find_event_by_name(tep, "kvm", "kvm_exit");
> -...
> -void process_record(struct tep_record *record)
> -{
> - int len;
> - char *comm;
> - struct tep_event_format *event;
> - unsigned long long val;
> -
> - event = tep_find_event_by_record(pevent, record);
> - if (event != NULL) {
> - if (tep_get_common_field_val(NULL, event, "common_type",
> - record, &val, 0) == 0) {
> - /* Got the value of common type field */
> - }
> - if (tep_get_field_val(NULL, event, "pid", record, &val, 0) == 0) {
> - /* Got the value of pid specific field */
> - }
> - comm = tep_get_field_raw(NULL, event, "comm", record, &len, 0);
> - if (comm != NULL) {
> - /* Got a pointer to the comm event specific field */
> - }
> - }
> -}
> ---
> -
> -FILES
> ------
> -[verse]
> ---
> -*event-parse.h*
> - Header file to include in order to have access to the library APIs.
> -*trace-seq.h*
> - Header file to include in order to have access to trace sequences
> - related APIs. Trace sequences are used to allow a function to call
> - several other functions to create a string of data to use.
> -*-ltraceevent*
> - Linker switch to add when building a program that uses the library.
> ---
> -
> -SEE ALSO
> ---------
> -_libtraceevent(3)_, _trace-cmd(1)_
> -
> -AUTHOR
> -------
> -[verse]
> ---
> -*Steven Rostedt* <[email protected]>, author of *libtraceevent*.
> -*Tzvetomir Stoyanov* <[email protected]>, author of this man page.
> ---
> -REPORTING BUGS
> ---------------
> -Report bugs to <[email protected]>
> -
> -LICENSE
> --------
> -libtraceevent is Free Software licensed under the GNU LGPL 2.1
> -
> -RESOURCES
> ----------
> -https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
> diff --git a/tools/lib/traceevent/Documentation/libtraceevent-field_print.txt b/tools/lib/traceevent/Documentation/libtraceevent-field_print.txt
> deleted file mode 100644
> index 9a9df98ac44d..000000000000
> --- a/tools/lib/traceevent/Documentation/libtraceevent-field_print.txt
> +++ /dev/null
> @@ -1,126 +0,0 @@
> -libtraceevent(3)
> -================
> -
> -NAME
> -----
> -tep_print_field, tep_print_fields, tep_print_num_field, tep_print_func_field -
> -Print the field content.
> -
> -SYNOPSIS
> ---------
> -[verse]
> ---
> -*#include <event-parse.h>*
> -*#include <trace-seq.h>*
> -
> -void *tep_print_field*(struct trace_seq pass:[*]_s_, void pass:[*]_data_, struct tep_format_field pass:[*]_field_);
> -void *tep_print_fields*(struct trace_seq pass:[*]_s_, void pass:[*]_data_, int _size_, struct tep_event pass:[*]_event_);
> -int *tep_print_num_field*(struct trace_seq pass:[*]_s_, const char pass:[*]_fmt_, struct tep_event pass:[*]_event_, const char pass:[*]_name_, struct tep_record pass:[*]_record_, int _err_);
> -int *tep_print_func_field*(struct trace_seq pass:[*]_s_, const char pass:[*]_fmt_, struct tep_event pass:[*]_event_, const char pass:[*]_name_, struct tep_record pass:[*]_record_, int _err_);
> ---
> -
> -DESCRIPTION
> ------------
> -These functions print recorded field's data, according to the field's type.
> -
> -The _tep_print_field()_ function extracts from the recorded raw _data_ value of
> -the _field_ and prints it into _s_, according to the field type.
> -
> -The _tep_print_fields()_ prints each field name followed by the record's field
> -value according to the field's type:
> -[verse]
> ---
> -"field1_name=field1_value field2_name=field2_value ..."
> ---
> -It iterates all fields of the _event_, and calls _tep_print_field()_ for each of
> -them.
> -
> -The _tep_print_num_field()_ function prints a numeric field with given format
> -string. A search is performed in the _event_ for a field with _name_. If such
> -field is found, its value is extracted from the _record_ and is printed in the
> -_s_, according to the given format string _fmt_. If the argument _err_ is
> -non-zero, and an error occures - it is printed in the _s_.
> -
> -The _tep_print_func_field()_ function prints a function field with given format
> -string. A search is performed in the _event_ for a field with _name_. If such
> -field is found, its value is extracted from the _record_. The value is assumed
> -to be a function address, and a search is perform to find the name of this
> -function. The function name (if found) and its address are printed in the _s_,
> -according to the given format string _fmt_. If the argument _err_ is non-zero,
> -and an error occures - it is printed in _s_.
> -
> -RETURN VALUE
> -------------
> -The _tep_print_num_field()_ and _tep_print_func_field()_ functions return 1
> -on success, -1 in case of an error or 0 if the print buffer _s_ is full.
> -
> -EXAMPLE
> --------
> -[source,c]
> ---
> -#include <event-parse.h>
> -#include <trace-seq.h>
> -...
> -struct tep_handle *tep = tep_alloc();
> -...
> -struct trace_seq seq;
> -trace_seq_init(&seq);
> -struct tep_event *event = tep_find_event_by_name(tep, "timer", "hrtimer_start");
> -...
> -void process_record(struct tep_record *record)
> -{
> - struct tep_format_field *field_pid = tep_find_common_field(event, "common_pid");
> -
> - trace_seq_reset(&seq);
> -
> - /* Print the value of "common_pid" */
> - tep_print_field(&seq, record->data, field_pid);
> -
> - /* Print all fields of the "hrtimer_start" event */
> - tep_print_fields(&seq, record->data, record->size, event);
> -
> - /* Print the value of "expires" field with custom format string */
> - tep_print_num_field(&seq, " timer expires in %llu ", event, "expires", record, 0);
> -
> - /* Print the address and the name of "function" field with custom format string */
> - tep_print_func_field(&seq, " timer function is %s ", event, "function", record, 0);
> - }
> - ...
> ---
> -
> -FILES
> ------
> -[verse]
> ---
> -*event-parse.h*
> - Header file to include in order to have access to the library APIs.
> -*trace-seq.h*
> - Header file to include in order to have access to trace sequences related APIs.
> - Trace sequences are used to allow a function to call several other functions
> - to create a string of data to use.
> -*-ltraceevent*
> - Linker switch to add when building a program that uses the library.
> ---
> -
> -SEE ALSO
> ---------
> -_libtraceevent(3)_, _trace-cmd(1)_
> -
> -AUTHOR
> -------
> -[verse]
> ---
> -*Steven Rostedt* <[email protected]>, author of *libtraceevent*.
> -*Tzvetomir Stoyanov* <[email protected]>, author of this man page.
> ---
> -REPORTING BUGS
> ---------------
> -Report bugs to <[email protected]>
> -
> -LICENSE
> --------
> -libtraceevent is Free Software licensed under the GNU LGPL 2.1
> -
> -RESOURCES
> ----------
> -https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
> diff --git a/tools/lib/traceevent/Documentation/libtraceevent-field_read.txt b/tools/lib/traceevent/Documentation/libtraceevent-field_read.txt
> deleted file mode 100644
> index 64e9e25d3fd9..000000000000
> --- a/tools/lib/traceevent/Documentation/libtraceevent-field_read.txt
> +++ /dev/null
> @@ -1,81 +0,0 @@
> -libtraceevent(3)
> -================
> -
> -NAME
> -----
> -tep_read_number_field - Reads a number from raw data.
> -
> -SYNOPSIS
> ---------
> -[verse]
> ---
> -*#include <event-parse.h>*
> -
> -int *tep_read_number_field*(struct tep_format_field pass:[*]_field_, const void pass:[*]_data_, unsigned long long pass:[*]_value_);
> ---
> -
> -DESCRIPTION
> ------------
> -The _tep_read_number_field()_ function reads the value of the _field_ from the
> -raw _data_ and stores it in the _value_. The function sets the _value_ according
> -to the endianness of the raw data and the current machine and stores it in
> -_value_.
> -
> -RETURN VALUE
> -------------
> -The _tep_read_number_field()_ function retunrs 0 in case of success, or -1 in
> -case of an error.
> -
> -EXAMPLE
> --------
> -[source,c]
> ---
> -#include <event-parse.h>
> -...
> -struct tep_handle *tep = tep_alloc();
> -...
> -struct tep_event *event = tep_find_event_by_name(tep, "timer", "hrtimer_start");
> -...
> -void process_record(struct tep_record *record)
> -{
> - unsigned long long pid;
> - struct tep_format_field *field_pid = tep_find_common_field(event, "common_pid");
> -
> - if (tep_read_number_field(field_pid, record->data, &pid) != 0) {
> - /* Failed to get "common_pid" value */
> - }
> -}
> -...
> ---
> -FILES
> ------
> -[verse]
> ---
> -*event-parse.h*
> - Header file to include in order to have access to the library APIs.
> -*-ltraceevent*
> - Linker switch to add when building a program that uses the library.
> ---
> -
> -SEE ALSO
> ---------
> -_libtraceevent(3)_, _trace-cmd(1)_
> -
> -AUTHOR
> -------
> -[verse]
> ---
> -*Steven Rostedt* <[email protected]>, author of *libtraceevent*.
> -*Tzvetomir Stoyanov* <[email protected]>, author of this man page.
> ---
> -REPORTING BUGS
> ---------------
> -Report bugs to <[email protected]>
> -
> -LICENSE
> --------
> -libtraceevent is Free Software licensed under the GNU LGPL 2.1
> -
> -RESOURCES
> ----------
> -https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
> diff --git a/tools/lib/traceevent/Documentation/libtraceevent-fields.txt b/tools/lib/traceevent/Documentation/libtraceevent-fields.txt
> deleted file mode 100644
> index 1ccb531d5114..000000000000
> --- a/tools/lib/traceevent/Documentation/libtraceevent-fields.txt
> +++ /dev/null
> @@ -1,105 +0,0 @@
> -libtraceevent(3)
> -================
> -
> -NAME
> -----
> -tep_event_common_fields, tep_event_fields - Get a list of fields for an event.
> -
> -SYNOPSIS
> ---------
> -[verse]
> ---
> -*#include <event-parse.h>*
> -
> -struct tep_format_field pass:[*]pass:[*]*tep_event_common_fields*(struct tep_event pass:[*]_event_);
> -struct tep_format_field pass:[*]pass:[*]*tep_event_fields*(struct tep_event pass:[*]_event_);
> ---
> -
> -DESCRIPTION
> ------------
> -The _tep_event_common_fields()_ function returns an array of pointers to common
> -fields for the _event_. The array is allocated in the function and must be freed
> -by free(). The last element of the array is NULL.
> -
> -The _tep_event_fields()_ function returns an array of pointers to event specific
> -fields for the _event_. The array is allocated in the function and must be freed
> -by free(). The last element of the array is NULL.
> -
> -RETURN VALUE
> -------------
> -Both _tep_event_common_fields()_ and _tep_event_fields()_ functions return
> -an array of pointers to tep_format_field structures in case of success, or
> -NULL in case of an error.
> -
> -EXAMPLE
> --------
> -[source,c]
> ---
> -#include <event-parse.h>
> -...
> -struct tep_handle *tep = tep_alloc();
> -...
> -int i;
> -struct tep_format_field **fields;
> -struct tep_event *event = tep_find_event_by_name(tep, "kvm", "kvm_exit");
> -if (event != NULL) {
> - fields = tep_event_common_fields(event);
> - if (fields != NULL) {
> - i = 0;
> - while (fields[i]) {
> - /*
> - walk through the list of the common fields
> - of the kvm_exit event
> - */
> - i++;
> - }
> - free(fields);
> - }
> - fields = tep_event_fields(event);
> - if (fields != NULL) {
> - i = 0;
> - while (fields[i]) {
> - /*
> - walk through the list of the event specific
> - fields of the kvm_exit event
> - */
> - i++;
> - }
> - free(fields);
> - }
> -}
> -...
> ---
> -
> -FILES
> ------
> -[verse]
> ---
> -*event-parse.h*
> - Header file to include in order to have access to the library APIs.
> -*-ltraceevent*
> - Linker switch to add when building a program that uses the library.
> ---
> -
> -SEE ALSO
> ---------
> -_libtraceevent(3)_, _trace-cmd(1)_
> -
> -AUTHOR
> -------
> -[verse]
> ---
> -*Steven Rostedt* <[email protected]>, author of *libtraceevent*.
> -*Tzvetomir Stoyanov* <[email protected]>, author of this man page.
> ---
> -REPORTING BUGS
> ---------------
> -Report bugs to <[email protected]>
> -
> -LICENSE
> --------
> -libtraceevent is Free Software licensed under the GNU LGPL 2.1
> -
> -RESOURCES
> ----------
> -https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
> diff --git a/tools/lib/traceevent/Documentation/libtraceevent-file_endian.txt b/tools/lib/traceevent/Documentation/libtraceevent-file_endian.txt
> deleted file mode 100644
> index f401ad311047..000000000000
> --- a/tools/lib/traceevent/Documentation/libtraceevent-file_endian.txt
> +++ /dev/null
> @@ -1,91 +0,0 @@
> -libtraceevent(3)
> -================
> -
> -NAME
> -----
> -tep_is_file_bigendian, tep_set_file_bigendian - Get / set the endianness of the
> -raw data being accessed by the tep handler.
> -
> -SYNOPSIS
> ---------
> -[verse]
> ---
> -*#include <event-parse.h>*
> -
> -enum *tep_endian* {
> - TEP_LITTLE_ENDIAN = 0,
> - TEP_BIG_ENDIAN
> -};
> -
> -bool *tep_is_file_bigendian*(struct tep_handle pass:[*]_tep_);
> -void *tep_set_file_bigendian*(struct tep_handle pass:[*]_tep_, enum tep_endian _endian_);
> -
> ---
> -DESCRIPTION
> ------------
> -The _tep_is_file_bigendian()_ function gets the endianness of the raw data,
> -being accessed by the tep handler. The _tep_ argument is trace event parser
> -context.
> -
> -The _tep_set_file_bigendian()_ function sets the endianness of raw data being
> -accessed by the tep handler. The _tep_ argument is trace event parser context.
> -[verse]
> ---
> -The _endian_ argument is the endianness:
> - _TEP_LITTLE_ENDIAN_ - the raw data is in little endian format,
> - _TEP_BIG_ENDIAN_ - the raw data is in big endian format.
> ---
> -RETURN VALUE
> -------------
> -The _tep_is_file_bigendian()_ function returns true if the data is in bigendian
> -format, false otherwise.
> -
> -EXAMPLE
> --------
> -[source,c]
> ---
> -#include <event-parse.h>
> -...
> -struct tep_handle *tep = tep_alloc();
> -...
> - tep_set_file_bigendian(tep, TEP_LITTLE_ENDIAN);
> -...
> - if (tep_is_file_bigendian(tep)) {
> - /* The raw data is in big endian */
> - } else {
> - /* The raw data is in little endian */
> - }
> ---
> -
> -FILES
> ------
> -[verse]
> ---
> -*event-parse.h*
> - Header file to include in order to have access to the library APIs.
> -*-ltraceevent*
> - Linker switch to add when building a program that uses the library.
> ---
> -
> -SEE ALSO
> ---------
> -_libtraceevent(3)_, _trace-cmd(1)_
> -
> -AUTHOR
> -------
> -[verse]
> ---
> -*Steven Rostedt* <[email protected]>, author of *libtraceevent*.
> -*Tzvetomir Stoyanov* <[email protected]>, author of this man page.
> ---
> -REPORTING BUGS
> ---------------
> -Report bugs to <[email protected]>
> -
> -LICENSE
> --------
> -libtraceevent is Free Software licensed under the GNU LGPL 2.1
> -
> -RESOURCES
> ----------
> -https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
> diff --git a/tools/lib/traceevent/Documentation/libtraceevent-filter.txt b/tools/lib/traceevent/Documentation/libtraceevent-filter.txt
> deleted file mode 100644
> index 4a9962d8cb59..000000000000
> --- a/tools/lib/traceevent/Documentation/libtraceevent-filter.txt
> +++ /dev/null
> @@ -1,209 +0,0 @@
> -libtraceevent(3)
> -================
> -
> -NAME
> -----
> -tep_filter_alloc, tep_filter_free, tep_filter_reset, tep_filter_make_string,
> -tep_filter_copy, tep_filter_compare, tep_filter_match, tep_event_filtered,
> -tep_filter_remove_event, tep_filter_strerror, tep_filter_add_filter_str -
> -Event filter related APIs.
> -
> -SYNOPSIS
> ---------
> -[verse]
> ---
> -*#include <event-parse.h>*
> -
> -struct tep_event_filter pass:[*]*tep_filter_alloc*(struct tep_handle pass:[*]_tep_);
> -void *tep_filter_free*(struct tep_event_filter pass:[*]_filter_);
> -void *tep_filter_reset*(struct tep_event_filter pass:[*]_filter_);
> -enum tep_errno *tep_filter_add_filter_str*(struct tep_event_filter pass:[*]_filter_, const char pass:[*]_filter_str_);
> -int *tep_event_filtered*(struct tep_event_filter pass:[*]_filter_, int _event_id_);
> -int *tep_filter_remove_event*(struct tep_event_filter pass:[*]_filter_, int _event_id_);
> -enum tep_errno *tep_filter_match*(struct tep_event_filter pass:[*]_filter_, struct tep_record pass:[*]_record_);
> -int *tep_filter_copy*(struct tep_event_filter pass:[*]_dest_, struct tep_event_filter pass:[*]_source_);
> -int *tep_filter_compare*(struct tep_event_filter pass:[*]_filter1_, struct tep_event_filter pass:[*]_filter2_);
> -char pass:[*]*tep_filter_make_string*(struct tep_event_filter pass:[*]_filter_, int _event_id_);
> -int *tep_filter_strerror*(struct tep_event_filter pass:[*]_filter_, enum tep_errno _err_, char pass:[*]buf, size_t _buflen_);
> ---
> -
> -DESCRIPTION
> ------------
> -Filters can be attached to traced events. They can be used to filter out various
> -events when outputting them. Each event can be filtered based on its parameters,
> -described in the event's format file. This set of functions can be used to
> -create, delete, modify and attach event filters.
> -
> -The _tep_filter_alloc()_ function creates a new event filter. The _tep_ argument
> -is the trace event parser context.
> -
> -The _tep_filter_free()_ function frees an event filter and all resources that it
> -had used.
> -
> -The _tep_filter_reset()_ function removes all rules from an event filter and
> -resets it.
> -
> -The _tep_filter_add_filter_str()_ function adds a new rule to the _filter_. The
> -_filter_str_ argument is the filter string, that contains the rule.
> -
> -The _tep_event_filtered()_ function checks if the event with _event_id_ has
> -_filter_.
> -
> -The _tep_filter_remove_event()_ function removes a _filter_ for an event with
> -_event_id_.
> -
> -The _tep_filter_match()_ function tests if a _record_ matches given _filter_.
> -
> -The _tep_filter_copy()_ function copies a _source_ filter into a _dest_ filter.
> -
> -The _tep_filter_compare()_ function compares two filers - _filter1_ and _filter2_.
> -
> -The _tep_filter_make_string()_ function constructs a string, displaying
> -the _filter_ contents for given _event_id_.
> -
> -The _tep_filter_strerror()_ function copies the _filter_ error buffer into the
> -given _buf_ with the size _buflen_. If the error buffer is empty, in the _buf_
> -is copied a string, describing the error _err_.
> -
> -RETURN VALUE
> -------------
> -The _tep_filter_alloc()_ function returns a pointer to the newly created event
> -filter, or NULL in case of an error.
> -
> -The _tep_filter_add_filter_str()_ function returns 0 if the rule was
> -successfully added or a negative error code. Use _tep_filter_strerror()_ to see
> -actual error message in case of an error.
> -
> -The _tep_event_filtered()_ function returns 1 if the filter is found for given
> -event, or 0 otherwise.
> -
> -The _tep_filter_remove_event()_ function returns 1 if the vent was removed, or
> -0 if the event was not found.
> -
> -The _tep_filter_match()_ function returns _tep_errno_, according to the result:
> -[verse]
> ---
> -_pass:[TEP_ERRNO__FILTER_MATCH]_ - filter found for event, the record matches.
> -_pass:[TEP_ERRNO__FILTER_MISS]_ - filter found for event, the record does not match.
> -_pass:[TEP_ERRNO__FILTER_NOT_FOUND]_ - no filter found for record's event.
> -_pass:[TEP_ERRNO__NO_FILTER]_ - no rules in the filter.
> ---
> -or any other _tep_errno_, if an error occurred during the test.
> -
> -The _tep_filter_copy()_ function returns 0 on success or -1 if not all rules
> - were copied.
> -
> -The _tep_filter_compare()_ function returns 1 if the two filters hold the same
> -content, or 0 if they do not.
> -
> -The _tep_filter_make_string()_ function returns a string, which must be freed
> -with free(), or NULL in case of an error.
> -
> -The _tep_filter_strerror()_ function returns 0 if message was filled
> -successfully, or -1 in case of an error.
> -
> -EXAMPLE
> --------
> -[source,c]
> ---
> -#include <event-parse.h>
> -...
> -struct tep_handle *tep = tep_alloc();
> -...
> -char errstr[200];
> -int ret;
> -
> -struct tep_event_filter *filter = tep_filter_alloc(tep);
> -struct tep_event_filter *filter1 = tep_filter_alloc(tep);
> -ret = tep_filter_add_filter_str(filter, "sched/sched_wakeup:target_cpu==1");
> -if(ret < 0) {
> - tep_filter_strerror(filter, ret, errstr, sizeof(errstr));
> - /* Failed to add a new rule to the filter, the error string is in errstr */
> -}
> -if (tep_filter_copy(filter1, filter) != 0) {
> - /* Failed to copy filter in filter1 */
> -}
> -...
> -if (tep_filter_compare(filter, filter1) != 1) {
> - /* Both filters are different */
> -}
> -...
> -void process_record(struct tep_handle *tep, struct tep_record *record)
> -{
> - struct tep_event *event;
> - char *fstring;
> -
> - event = tep_find_event_by_record(tep, record);
> -
> - if (tep_event_filtered(filter, event->id) == 1) {
> - /* The event has filter */
> - fstring = tep_filter_make_string(filter, event->id);
> - if (fstring != NULL) {
> - /* The filter for the event is in fstring */
> - free(fstring);
> - }
> - }
> -
> - switch (tep_filter_match(filter, record)) {
> - case TEP_ERRNO__FILTER_MATCH:
> - /* The filter matches the record */
> - break;
> - case TEP_ERRNO__FILTER_MISS:
> - /* The filter does not match the record */
> - break;
> - case TEP_ERRNO__FILTER_NOT_FOUND:
> - /* No filter found for record's event */
> - break;
> - case TEP_ERRNO__NO_FILTER:
> - /* There are no rules in the filter */
> - break
> - default:
> - /* An error occurred during the test */
> - break;
> - }
> -
> - if (tep_filter_remove_event(filter, event->id) == 1) {
> - /* The event was removed from the filter */
> - }
> -}
> -
> -...
> -tep_filter_reset(filter);
> -...
> -tep_filter_free(filter);
> -tep_filter_free(filter1);
> -...
> ---
> -
> -FILES
> ------
> -[verse]
> ---
> -*event-parse.h*
> - Header file to include in order to have access to the library APIs.
> -*-ltraceevent*
> - Linker switch to add when building a program that uses the library.
> ---
> -
> -SEE ALSO
> ---------
> -_libtraceevent(3)_, _trace-cmd(1)_
> -
> -AUTHOR
> -------
> -[verse]
> ---
> -*Steven Rostedt* <[email protected]>, author of *libtraceevent*.
> -*Tzvetomir Stoyanov* <[email protected]>, author of this man page.
> ---
> -REPORTING BUGS
> ---------------
> -Report bugs to <[email protected]>
> -
> -LICENSE
> --------
> -libtraceevent is Free Software licensed under the GNU LGPL 2.1
> -
> -RESOURCES
> ----------
> -https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
> diff --git a/tools/lib/traceevent/Documentation/libtraceevent-func_apis.txt b/tools/lib/traceevent/Documentation/libtraceevent-func_apis.txt
> deleted file mode 100644
> index f6aca0df2151..000000000000
> --- a/tools/lib/traceevent/Documentation/libtraceevent-func_apis.txt
> +++ /dev/null
> @@ -1,183 +0,0 @@
> -libtraceevent(3)
> -================
> -
> -NAME
> -----
> -tep_find_function, tep_find_function_address, tep_set_function_resolver,
> -tep_reset_function_resolver, tep_register_function, tep_register_print_string -
> -function related tep APIs
> -
> -SYNOPSIS
> ---------
> -[verse]
> ---
> -*#include <event-parse.h>*
> -
> -typedef char pass:[*](*tep_func_resolver_t*)(void pass:[*]_priv_, unsigned long long pass:[*]_addrp_, char pass:[**]_modp_);
> -int *tep_set_function_resolver*(struct tep_handle pass:[*]_tep_, tep_func_resolver_t pass:[*]_func_, void pass:[*]_priv_);
> -void *tep_reset_function_resolver*(struct tep_handle pass:[*]_tep_);
> -const char pass:[*]*tep_find_function*(struct tep_handle pass:[*]_tep_, unsigned long long _addr_);
> -unsigned long long *tep_find_function_address*(struct tep_handle pass:[*]_tep_, unsigned long long _addr_);
> -int *tep_register_function*(struct tep_handle pass:[*]_tep_, char pass:[*]_name_, unsigned long long _addr_, char pass:[*]_mod_);
> -int *tep_register_print_string*(struct tep_handle pass:[*]_tep_, const char pass:[*]_fmt_, unsigned long long _addr_);
> ---
> -
> -DESCRIPTION
> ------------
> -Some tools may have already a way to resolve the kernel functions. These APIs
> -allow them to keep using it instead of duplicating all the entries inside.
> -
> -The _tep_func_resolver_t_ type is the prototype of the alternative kernel
> -functions resolver. This function receives a pointer to its custom context
> -(set with the _tep_set_function_resolver()_ call ) and the address of a kernel
> -function, which has to be resolved. In case of success, it should return
> -the name of the function and its module (if any) in _modp_.
> -
> -The _tep_set_function_resolver()_ function registers _func_ as an alternative
> -kernel functions resolver. The _tep_ argument is trace event parser context.
> -The _priv_ argument is a custom context of the _func_ function. The function
> -resolver is used by the APIs _tep_find_function()_,
> -_tep_find_function_address()_, and _tep_print_func_field()_ to resolve
> -a function address to a function name.
> -
> -The _tep_reset_function_resolver()_ function resets the kernel functions
> -resolver to the default function. The _tep_ argument is trace event parser
> -context.
> -
> -
> -These APIs can be used to find function name and start address, by given
> -address. The given address does not have to be exact, it will select
> -the function that would contain it.
> -
> -The _tep_find_function()_ function returns the function name, which contains the
> -given address _addr_. The _tep_ argument is the trace event parser context.
> -
> -The _tep_find_function_address()_ function returns the function start address,
> -by given address _addr_. The _addr_ does not have to be exact, it will select
> -the function that would contain it. The _tep_ argument is the trace event
> -parser context.
> -
> -The _tep_register_function()_ function registers a function name mapped to an
> -address and (optional) module. This mapping is used in case the function tracer
> -or events have "%pS" parameter in its format string. It is common to pass in
> -the kallsyms function names with their corresponding addresses with this
> -function. The _tep_ argument is the trace event parser context. The _name_ is
> -the name of the function, the string is copied internally. The _addr_ is the
> -start address of the function. The _mod_ is the kernel module the function may
> -be in (NULL for none).
> -
> -The _tep_register_print_string()_ function registers a string by the address
> -it was stored in the kernel. Some strings internal to the kernel with static
> -address are passed to certain events. The "%s" in the event's format field
> -which has an address needs to know what string would be at that address. The
> -tep_register_print_string() supplies the parsing with the mapping between kernel
> -addresses and those strings. The _tep_ argument is the trace event parser
> -context. The _fmt_ is the string to register, it is copied internally.
> -The _addr_ is the address the string was located at.
> -
> -
> -RETURN VALUE
> -------------
> -The _tep_set_function_resolver()_ function returns 0 in case of success, or -1
> -in case of an error.
> -
> -The _tep_find_function()_ function returns the function name, or NULL in case
> -it cannot be found.
> -
> -The _tep_find_function_address()_ function returns the function start address,
> -or 0 in case it cannot be found.
> -
> -The _tep_register_function()_ function returns 0 in case of success. In case of
> -an error -1 is returned, and errno is set to the appropriate error number.
> -
> -The _tep_register_print_string()_ function returns 0 in case of success. In case
> -of an error -1 is returned, and errno is set to the appropriate error number.
> -
> -EXAMPLE
> --------
> -[source,c]
> ---
> -#include <event-parse.h>
> -...
> -struct tep_handle *tep = tep_alloc();
> -...
> -char *my_resolve_kernel_addr(void *context,
> - unsigned long long *addrp, char **modp)
> -{
> - struct db *function_database = context;
> - struct symbol *sym = sql_lookup(function_database, *addrp);
> -
> - if (!sym)
> - return NULL;
> -
> - *modp = sym->module_name;
> - return sym->name;
> -}
> -
> -void show_function( unsigned long long addr)
> -{
> - unsigned long long fstart;
> - const char *fname;
> -
> - if (tep_set_function_resolver(tep, my_resolve_kernel_addr,
> - function_database) != 0) {
> - /* failed to register my_resolve_kernel_addr */
> - }
> -
> - /* These APIs use my_resolve_kernel_addr() to resolve the addr */
> - fname = tep_find_function(tep, addr);
> - fstart = tep_find_function_address(tep, addr);
> -
> - /*
> - addr is in function named fname, starting at fstart address,
> - at offset (addr - fstart)
> - */
> -
> - tep_reset_function_resolver(tep);
> -
> -}
> -...
> - if (tep_register_function(tep, "kvm_exit",
> - (unsigned long long) 0x12345678, "kvm") != 0) {
> - /* Failed to register kvm_exit address mapping */
> - }
> -...
> - if (tep_register_print_string(tep, "print string",
> - (unsigned long long) 0x87654321, NULL) != 0) {
> - /* Failed to register "print string" address mapping */
> - }
> -...
> ---
> -
> -FILES
> ------
> -[verse]
> ---
> -*event-parse.h*
> - Header file to include in order to have access to the library APIs.
> -*-ltraceevent*
> - Linker switch to add when building a program that uses the library.
> ---
> -
> -SEE ALSO
> ---------
> -_libtraceevent(3)_, _trace-cmd(1)_
> -
> -AUTHOR
> -------
> -[verse]
> ---
> -*Steven Rostedt* <[email protected]>, author of *libtraceevent*.
> -*Tzvetomir Stoyanov* <[email protected]>, author of this man page.
> ---
> -REPORTING BUGS
> ---------------
> -Report bugs to <[email protected]>
> -
> -LICENSE
> --------
> -libtraceevent is Free Software licensed under the GNU LGPL 2.1
> -
> -RESOURCES
> ----------
> -https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
> diff --git a/tools/lib/traceevent/Documentation/libtraceevent-func_find.txt b/tools/lib/traceevent/Documentation/libtraceevent-func_find.txt
> deleted file mode 100644
> index 04840e244445..000000000000
> --- a/tools/lib/traceevent/Documentation/libtraceevent-func_find.txt
> +++ /dev/null
> @@ -1,88 +0,0 @@
> -libtraceevent(3)
> -================
> -
> -NAME
> -----
> -tep_find_function,tep_find_function_address - Find function name / start address.
> -
> -SYNOPSIS
> ---------
> -[verse]
> ---
> -*#include <event-parse.h>*
> -
> -const char pass:[*]*tep_find_function*(struct tep_handle pass:[*]_tep_, unsigned long long _addr_);
> -unsigned long long *tep_find_function_address*(struct tep_handle pass:[*]_tep_, unsigned long long _addr_);
> ---
> -
> -DESCRIPTION
> ------------
> -These functions can be used to find function name and start address, by given
> -address. The given address does not have to be exact, it will select the function
> -that would contain it.
> -
> -The _tep_find_function()_ function returns the function name, which contains the
> -given address _addr_. The _tep_ argument is the trace event parser context.
> -
> -The _tep_find_function_address()_ function returns the function start address,
> -by given address _addr_. The _addr_ does not have to be exact, it will select the
> -function that would contain it. The _tep_ argument is the trace event parser context.
> -
> -RETURN VALUE
> -------------
> -The _tep_find_function()_ function returns the function name, or NULL in case
> -it cannot be found.
> -
> -The _tep_find_function_address()_ function returns the function start address,
> -or 0 in case it cannot be found.
> -
> -EXAMPLE
> --------
> -[source,c]
> ---
> -#include <event-parse.h>
> -...
> -struct tep_handle *tep = tep_alloc();
> -...
> -void show_function( unsigned long long addr)
> -{
> - const char *fname = tep_find_function(tep, addr);
> - unsigned long long fstart = tep_find_function_address(tep, addr);
> -
> - /* addr is in function named fname, starting at fstart address, at offset (addr - fstart) */
> -}
> -...
> ---
> -
> -FILES
> ------
> -[verse]
> ---
> -*event-parse.h*
> - Header file to include in order to have access to the library APIs.
> -*-ltraceevent*
> - Linker switch to add when building a program that uses the library.
> ---
> -
> -SEE ALSO
> ---------
> -_libtraceevent(3)_, _trace-cmd(1)_
> -
> -AUTHOR
> -------
> -[verse]
> ---
> -*Steven Rostedt* <[email protected]>, author of *libtraceevent*.
> -*Tzvetomir Stoyanov* <[email protected]>, author of this man page.
> ---
> -REPORTING BUGS
> ---------------
> -Report bugs to <[email protected]>
> -
> -LICENSE
> --------
> -libtraceevent is Free Software licensed under the GNU LGPL 2.1
> -
> -RESOURCES
> ----------
> -https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
> diff --git a/tools/lib/traceevent/Documentation/libtraceevent-handle.txt b/tools/lib/traceevent/Documentation/libtraceevent-handle.txt
> deleted file mode 100644
> index 45b20172e262..000000000000
> --- a/tools/lib/traceevent/Documentation/libtraceevent-handle.txt
> +++ /dev/null
> @@ -1,101 +0,0 @@
> -libtraceevent(3)
> -================
> -
> -NAME
> -----
> -tep_alloc, tep_free,tep_ref, tep_unref,tep_get_ref - Create, destroy, manage
> -references of trace event parser context.
> -
> -SYNOPSIS
> ---------
> -[verse]
> ---
> -*#include <event-parse.h>*
> -
> -struct tep_handle pass:[*]*tep_alloc*(void);
> -void *tep_free*(struct tep_handle pass:[*]_tep_);
> -void *tep_ref*(struct tep_handle pass:[*]_tep_);
> -void *tep_unref*(struct tep_handle pass:[*]_tep_);
> -int *tep_get_ref*(struct tep_handle pass:[*]_tep_);
> ---
> -
> -DESCRIPTION
> ------------
> -These are the main functions to create and destroy tep_handle - the main
> -structure, representing the trace event parser context. This context is used as
> -the input parameter of most library APIs.
> -
> -The _tep_alloc()_ function allocates and initializes the tep context.
> -
> -The _tep_free()_ function will decrement the reference of the _tep_ handler.
> -When there is no more references, then it will free the handler, as well
> -as clean up all its resources that it had used. The argument _tep_ is
> -the pointer to the trace event parser context.
> -
> -The _tep_ref()_ function adds a reference to the _tep_ handler.
> -
> -The _tep_unref()_ function removes a reference from the _tep_ handler. When
> -the last reference is removed, the _tep_ is destroyed, and all resources that
> -it had used are cleaned up.
> -
> -The _tep_ref_get()_ functions gets the current references of the _tep_ handler.
> -
> -RETURN VALUE
> -------------
> -_tep_alloc()_ returns a pointer to a newly created tep_handle structure.
> -NULL is returned in case there is not enough free memory to allocate it.
> -
> -_tep_ref_get()_ returns the current references of _tep_.
> -If _tep_ is NULL, 0 is returned.
> -
> -EXAMPLE
> --------
> -[source,c]
> ---
> -#include <event-parse.h>
> -
> -...
> -struct tep_handle *tep = tep_alloc();
> -...
> -int ref = tep_get_ref(tep);
> -tep_ref(tep);
> -if ( (ref+1) != tep_get_ref(tep)) {
> - /* Something wrong happened, the counter is not incremented by 1 */
> -}
> -tep_unref(tep);
> -...
> -tep_free(tep);
> -...
> ---
> -FILES
> ------
> -[verse]
> ---
> -*event-parse.h*
> - Header file to include in order to have access to the library APIs.
> -*-ltraceevent*
> - Linker switch to add when building a program that uses the library.
> ---
> -
> -SEE ALSO
> ---------
> -_libtraceevent(3)_, _trace-cmd(1)_
> -
> -AUTHOR
> -------
> -[verse]
> ---
> -*Steven Rostedt* <[email protected]>, author of *libtraceevent*.
> -*Tzvetomir Stoyanov* <[email protected]>, author of this man page.
> ---
> -REPORTING BUGS
> ---------------
> -Report bugs to <[email protected]>
> -
> -LICENSE
> --------
> -libtraceevent is Free Software licensed under the GNU LGPL 2.1
> -
> -RESOURCES
> ----------
> -https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
> diff --git a/tools/lib/traceevent/Documentation/libtraceevent-header_page.txt b/tools/lib/traceevent/Documentation/libtraceevent-header_page.txt
> deleted file mode 100644
> index 615d117dc39f..000000000000
> --- a/tools/lib/traceevent/Documentation/libtraceevent-header_page.txt
> +++ /dev/null
> @@ -1,102 +0,0 @@
> -libtraceevent(3)
> -================
> -
> -NAME
> -----
> -tep_get_header_page_size, tep_get_header_timestamp_size, tep_is_old_format -
> -Get the data stored in the header page, in kernel context.
> -
> -SYNOPSIS
> ---------
> -[verse]
> ---
> -*#include <event-parse.h>*
> -
> -int *tep_get_header_page_size*(struct tep_handle pass:[*]_tep_);
> -int *tep_get_header_timestamp_size*(struct tep_handle pass:[*]_tep_);
> -bool *tep_is_old_format*(struct tep_handle pass:[*]_tep_);
> ---
> -DESCRIPTION
> ------------
> -These functions retrieve information from kernel context, stored in tracefs
> -events/header_page. Old kernels do not have header page info, so default values
> -from user space context are used.
> -
> -The _tep_get_header_page_size()_ function returns the size of a long integer,
> -in kernel context. The _tep_ argument is trace event parser context.
> -This information is retrieved from tracefs events/header_page, "commit" field.
> -
> -The _tep_get_header_timestamp_size()_ function returns the size of timestamps,
> -in kernel context. The _tep_ argument is trace event parser context. This
> -information is retrieved from tracefs events/header_page, "timestamp" field.
> -
> -The _tep_is_old_format()_ function returns true if the kernel predates
> -the addition of events/header_page, otherwise it returns false.
> -
> -RETURN VALUE
> -------------
> -The _tep_get_header_page_size()_ function returns the size of a long integer,
> -in bytes.
> -
> -The _tep_get_header_timestamp_size()_ function returns the size of timestamps,
> -in bytes.
> -
> -The _tep_is_old_format()_ function returns true, if an old kernel is used to
> -generate the tracing data, which has no event/header_page. If the kernel is new,
> -or _tep_ is NULL, false is returned.
> -
> -EXAMPLE
> --------
> -[source,c]
> ---
> -#include <event-parse.h>
> -...
> -struct tep_handle *tep = tep_alloc();
> -...
> - int longsize;
> - int timesize;
> - bool old;
> -
> - longsize = tep_get_header_page_size(tep);
> - timesize = tep_get_header_timestamp_size(tep);
> - old = tep_is_old_format(tep);
> -
> - printf ("%s kernel is used to generate the tracing data.\n",
> - old?"Old":"New");
> - printf("The size of a long integer is %d bytes.\n", longsize);
> - printf("The timestamps size is %d bytes.\n", timesize);
> -...
> ---
> -
> -FILES
> ------
> -[verse]
> ---
> -*event-parse.h*
> - Header file to include in order to have access to the library APIs.
> -*-ltraceevent*
> - Linker switch to add when building a program that uses the library.
> ---
> -
> -SEE ALSO
> ---------
> -_libtraceevent(3)_, _trace-cmd(1)_
> -
> -AUTHOR
> -------
> -[verse]
> ---
> -*Steven Rostedt* <[email protected]>, author of *libtraceevent*.
> -*Tzvetomir Stoyanov* <[email protected]>, author of this man page.
> ---
> -REPORTING BUGS
> ---------------
> -Report bugs to <[email protected]>
> -
> -LICENSE
> --------
> -libtraceevent is Free Software licensed under the GNU LGPL 2.1
> -
> -RESOURCES
> ----------
> -https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
> diff --git a/tools/lib/traceevent/Documentation/libtraceevent-host_endian.txt b/tools/lib/traceevent/Documentation/libtraceevent-host_endian.txt
> deleted file mode 100644
> index d5d375eb8d1e..000000000000
> --- a/tools/lib/traceevent/Documentation/libtraceevent-host_endian.txt
> +++ /dev/null
> @@ -1,104 +0,0 @@
> -libtraceevent(3)
> -================
> -
> -NAME
> -----
> -tep_is_bigendian, tep_is_local_bigendian, tep_set_local_bigendian - Get / set
> -the endianness of the local machine.
> -
> -SYNOPSIS
> ---------
> -[verse]
> ---
> -*#include <event-parse.h>*
> -
> -enum *tep_endian* {
> - TEP_LITTLE_ENDIAN = 0,
> - TEP_BIG_ENDIAN
> -};
> -
> -int *tep_is_bigendian*(void);
> -bool *tep_is_local_bigendian*(struct tep_handle pass:[*]_tep_);
> -void *tep_set_local_bigendian*(struct tep_handle pass:[*]_tep_, enum tep_endian _endian_);
> ---
> -
> -DESCRIPTION
> ------------
> -
> -The _tep_is_bigendian()_ gets the endianness of the machine, executing
> -the function.
> -
> -The _tep_is_local_bigendian()_ function gets the endianness of the local
> -machine, saved in the _tep_ handler. The _tep_ argument is the trace event
> -parser context. This API is a bit faster than _tep_is_bigendian()_, as it
> -returns cached endianness of the local machine instead of checking it each time.
> -
> -The _tep_set_local_bigendian()_ function sets the endianness of the local
> -machine in the _tep_ handler. The _tep_ argument is trace event parser context.
> -The _endian_ argument is the endianness:
> -[verse]
> ---
> - _TEP_LITTLE_ENDIAN_ - the machine is little endian,
> - _TEP_BIG_ENDIAN_ - the machine is big endian.
> ---
> -
> -RETURN VALUE
> -------------
> -The _tep_is_bigendian()_ function returns non zero if the endianness of the
> -machine, executing the code, is big endian and zero otherwise.
> -
> -The _tep_is_local_bigendian()_ function returns true, if the endianness of the
> -local machine, saved in the _tep_ handler, is big endian, or false otherwise.
> -
> -EXAMPLE
> --------
> -[source,c]
> ---
> -#include <event-parse.h>
> -...
> -struct tep_handle *tep = tep_alloc();
> -...
> - if (tep_is_bigendian())
> - tep_set_local_bigendian(tep, TEP_BIG_ENDIAN);
> - else
> - tep_set_local_bigendian(tep, TEP_LITTLE_ENDIAN);
> -...
> - if (tep_is_local_bigendian(tep))
> - printf("This machine you are running on is bigendian\n");
> - else
> - printf("This machine you are running on is little endian\n");
> -
> ---
> -
> -FILES
> ------
> -[verse]
> ---
> -*event-parse.h*
> - Header file to include in order to have access to the library APIs.
> -*-ltraceevent*
> - Linker switch to add when building a program that uses the library.
> ---
> -
> -SEE ALSO
> ---------
> -_libtraceevent(3)_, _trace-cmd(1)_
> -
> -AUTHOR
> -------
> -[verse]
> ---
> -*Steven Rostedt* <[email protected]>, author of *libtraceevent*.
> -*Tzvetomir Stoyanov* <[email protected]>, author of this man page.
> ---
> -REPORTING BUGS
> ---------------
> -Report bugs to <[email protected]>
> -
> -LICENSE
> --------
> -libtraceevent is Free Software licensed under the GNU LGPL 2.1
> -
> -RESOURCES
> ----------
> -https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
> diff --git a/tools/lib/traceevent/Documentation/libtraceevent-long_size.txt b/tools/lib/traceevent/Documentation/libtraceevent-long_size.txt
> deleted file mode 100644
> index 01d78ea2519a..000000000000
> --- a/tools/lib/traceevent/Documentation/libtraceevent-long_size.txt
> +++ /dev/null
> @@ -1,78 +0,0 @@
> -libtraceevent(3)
> -================
> -
> -NAME
> -----
> -tep_get_long_size, tep_set_long_size - Get / set the size of a long integer on
> -the machine, where the trace is generated, in bytes
> -
> -SYNOPSIS
> ---------
> -[verse]
> ---
> -*#include <event-parse.h>*
> -
> -int *tep_get_long_size*(strucqt tep_handle pass:[*]_tep_);
> -void *tep_set_long_size*(struct tep_handle pass:[*]_tep_, int _long_size_);
> ---
> -
> -DESCRIPTION
> ------------
> -The _tep_get_long_size()_ function returns the size of a long integer on the machine,
> -where the trace is generated. The _tep_ argument is trace event parser context.
> -
> -The _tep_set_long_size()_ function sets the size of a long integer on the machine,
> -where the trace is generated. The _tep_ argument is trace event parser context.
> -The _long_size_ is the size of a long integer, in bytes.
> -
> -RETURN VALUE
> -------------
> -The _tep_get_long_size()_ function returns the size of a long integer on the machine,
> -where the trace is generated, in bytes.
> -
> -EXAMPLE
> --------
> -[source,c]
> ---
> -#include <event-parse.h>
> -...
> -struct tep_handle *tep = tep_alloc();
> -...
> -tep_set_long_size(tep, 4);
> -...
> -int long_size = tep_get_long_size(tep);
> -...
> ---
> -
> -FILES
> ------
> -[verse]
> ---
> -*event-parse.h*
> - Header file to include in order to have access to the library APIs.
> -*-ltraceevent*
> - Linker switch to add when building a program that uses the library.
> ---
> -
> -SEE ALSO
> ---------
> -_libtraceevent(3)_, _trace-cmd(1)_
> -
> -AUTHOR
> -------
> -[verse]
> ---
> -*Steven Rostedt* <[email protected]>, author of *libtraceevent*.
> -*Tzvetomir Stoyanov* <[email protected]>, author of this man page.
> ---
> -REPORTING BUGS
> ---------------
> -Report bugs to <[email protected]>
> -
> -LICENSE
> --------
> -libtraceevent is Free Software licensed under the GNU LGPL 2.1
> -
> -RESOURCES
> ----------
> -https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
> diff --git a/tools/lib/traceevent/Documentation/libtraceevent-page_size.txt b/tools/lib/traceevent/Documentation/libtraceevent-page_size.txt
> deleted file mode 100644
> index 452c0cfa1822..000000000000
> --- a/tools/lib/traceevent/Documentation/libtraceevent-page_size.txt
> +++ /dev/null
> @@ -1,82 +0,0 @@
> -libtraceevent(3)
> -================
> -
> -NAME
> -----
> -tep_get_page_size, tep_set_page_size - Get / set the size of a memory page on
> -the machine, where the trace is generated
> -
> -SYNOPSIS
> ---------
> -[verse]
> ---
> -*#include <event-parse.h>*
> -
> -int *tep_get_page_size*(struct tep_handle pass:[*]_tep_);
> -void *tep_set_page_size*(struct tep_handle pass:[*]_tep_, int _page_size_);
> ---
> -
> -DESCRIPTION
> ------------
> -The _tep_get_page_size()_ function returns the size of a memory page on
> -the machine, where the trace is generated. The _tep_ argument is trace
> -event parser context.
> -
> -The _tep_set_page_size()_ function stores in the _tep_ context the size of a
> -memory page on the machine, where the trace is generated.
> -The _tep_ argument is trace event parser context.
> -The _page_size_ argument is the size of a memory page, in bytes.
> -
> -RETURN VALUE
> -------------
> -The _tep_get_page_size()_ function returns size of the memory page, in bytes.
> -
> -EXAMPLE
> --------
> -[source,c]
> ---
> -#include <unistd.h>
> -#include <event-parse.h>
> -...
> -struct tep_handle *tep = tep_alloc();
> -...
> - int page_size = getpagesize();
> -
> - tep_set_page_size(tep, page_size);
> -
> - printf("The page size for this machine is %d\n", tep_get_page_size(tep));
> -
> ---
> -
> -FILES
> ------
> -[verse]
> ---
> -*event-parse.h*
> - Header file to include in order to have access to the library APIs.
> -*-ltraceevent*
> - Linker switch to add when building a program that uses the library.
> ---
> -
> -SEE ALSO
> ---------
> -_libtraceevent(3)_, _trace-cmd(1)_
> -
> -AUTHOR
> -------
> -[verse]
> ---
> -*Steven Rostedt* <[email protected]>, author of *libtraceevent*.
> -*Tzvetomir Stoyanov* <[email protected]>, author of this man page.
> ---
> -REPORTING BUGS
> ---------------
> -Report bugs to <[email protected]>
> -
> -LICENSE
> --------
> -libtraceevent is Free Software licensed under the GNU LGPL 2.1
> -
> -RESOURCES
> ----------
> -https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
> diff --git a/tools/lib/traceevent/Documentation/libtraceevent-parse_event.txt b/tools/lib/traceevent/Documentation/libtraceevent-parse_event.txt
> deleted file mode 100644
> index f248114ca1ff..000000000000
> --- a/tools/lib/traceevent/Documentation/libtraceevent-parse_event.txt
> +++ /dev/null
> @@ -1,90 +0,0 @@
> -libtraceevent(3)
> -================
> -
> -NAME
> -----
> -tep_parse_event, tep_parse_format - Parse the event format information
> -
> -SYNOPSIS
> ---------
> -[verse]
> ---
> -*#include <event-parse.h>*
> -
> -enum tep_errno *tep_parse_event*(struct tep_handle pass:[*]_tep_, const char pass:[*]_buf_, unsigned long _size_, const char pass:[*]_sys_);
> -enum tep_errno *tep_parse_format*(struct tep_handle pass:[*]_tep_, struct tep_event pass:[*]pass:[*]_eventp_, const char pass:[*]_buf_, unsigned long _size_, const char pass:[*]_sys_);
> ---
> -
> -DESCRIPTION
> ------------
> -The _tep_parse_event()_ function parses the event format and creates an event
> -structure to quickly parse raw data for a given event. The _tep_ argument is
> -the trace event parser context. The created event structure is stored in the
> -_tep_ context. The _buf_ argument is a buffer with _size_, where the event
> -format data is. The event format data can be taken from
> -tracefs/events/.../.../format files. The _sys_ argument is the system of
> -the event.
> -
> -The _tep_parse_format()_ function does the same as _tep_parse_event()_. The only
> -difference is in the extra _eventp_ argument, where the newly created event
> -structure is returned.
> -
> -RETURN VALUE
> -------------
> -Both _tep_parse_event()_ and _tep_parse_format()_ functions return 0 on success,
> -or TEP_ERRNO__... in case of an error.
> -
> -EXAMPLE
> --------
> -[source,c]
> ---
> -#include <event-parse.h>
> -...
> -struct tep_handle *tep = tep_alloc();
> -...
> -char *buf;
> -int size;
> -struct tep_event *event = NULL;
> -buf = read_file("/sys/kernel/tracing/events/ftrace/print/format", &size);
> -if (tep_parse_event(tep, buf, size, "ftrace") != 0) {
> - /* Failed to parse the ftrace print format */
> -}
> -
> -if (tep_parse_format(tep, &event, buf, size, "ftrace") != 0) {
> - /* Failed to parse the ftrace print format */
> -}
> -...
> ---
> -
> -FILES
> ------
> -[verse]
> ---
> -*event-parse.h*
> - Header file to include in order to have access to the library APIs.
> -*-ltraceevent*
> - Linker switch to add when building a program that uses the library.
> ---
> -
> -SEE ALSO
> ---------
> -_libtraceevent(3)_, _trace-cmd(1)_
> -
> -AUTHOR
> -------
> -[verse]
> ---
> -*Steven Rostedt* <[email protected]>, author of *libtraceevent*.
> -*Tzvetomir Stoyanov* <[email protected]>, author of this man page.
> ---
> -REPORTING BUGS
> ---------------
> -Report bugs to <[email protected]>
> -
> -LICENSE
> --------
> -libtraceevent is Free Software licensed under the GNU LGPL 2.1
> -
> -RESOURCES
> ----------
> -https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
> diff --git a/tools/lib/traceevent/Documentation/libtraceevent-parse_head.txt b/tools/lib/traceevent/Documentation/libtraceevent-parse_head.txt
> deleted file mode 100644
> index c90f16c7d8e6..000000000000
> --- a/tools/lib/traceevent/Documentation/libtraceevent-parse_head.txt
> +++ /dev/null
> @@ -1,82 +0,0 @@
> -libtraceevent(3)
> -================
> -
> -NAME
> -----
> -tep_parse_header_page - Parses the data stored in the header page.
> -
> -SYNOPSIS
> ---------
> -[verse]
> ---
> -*#include <event-parse.h>*
> -
> -int *tep_parse_header_page*(struct tep_handle pass:[*]_tep_, char pass:[*]_buf_, unsigned long _size_, int _long_size_);
> ---
> -
> -DESCRIPTION
> ------------
> -The _tep_parse_header_page()_ function parses the header page data from _buf_,
> -and initializes the _tep_, trace event parser context, with it. The buffer
> -_buf_ is with _size_, and is supposed to be copied from
> -tracefs/events/header_page.
> -
> -Some old kernels do not have header page info, in this case the
> -_tep_parse_header_page()_ function can be called with _size_ equal to 0. The
> -_tep_ context is initialized with default values. The _long_size_ can be used in
> -this use case, to set the size of a long integer to be used.
> -
> -RETURN VALUE
> -------------
> -The _tep_parse_header_page()_ function returns 0 in case of success, or -1
> -in case of an error.
> -
> -EXAMPLE
> --------
> -[source,c]
> ---
> -#include <event-parse.h>
> -...
> -struct tep_handle *tep = tep_alloc();
> -...
> -char *buf;
> -int size;
> -buf = read_file("/sys/kernel/tracing/events/header_page", &size);
> -if (tep_parse_header_page(tep, buf, size, sizeof(unsigned long)) != 0) {
> - /* Failed to parse the header page */
> -}
> -...
> ---
> -
> -FILES
> ------
> -[verse]
> ---
> -*event-parse.h*
> - Header file to include in order to have access to the library APIs.
> -*-ltraceevent*
> - Linker switch to add when building a program that uses the library.
> ---
> -
> -SEE ALSO
> ---------
> -_libtraceevent(3)_, _trace-cmd(1)_
> -
> -AUTHOR
> -------
> -[verse]
> ---
> -*Steven Rostedt* <[email protected]>, author of *libtraceevent*.
> -*Tzvetomir Stoyanov* <[email protected]>, author of this man page.
> ---
> -REPORTING BUGS
> ---------------
> -Report bugs to <[email protected]>
> -
> -LICENSE
> --------
> -libtraceevent is Free Software licensed under the GNU LGPL 2.1
> -
> -RESOURCES
> ----------
> -https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
> diff --git a/tools/lib/traceevent/Documentation/libtraceevent-plugins.txt b/tools/lib/traceevent/Documentation/libtraceevent-plugins.txt
> deleted file mode 100644
> index 4d6394397d92..000000000000
> --- a/tools/lib/traceevent/Documentation/libtraceevent-plugins.txt
> +++ /dev/null
> @@ -1,122 +0,0 @@
> -libtraceevent(3)
> -================
> -
> -NAME
> -----
> -tep_load_plugins, tep_unload_plugins, tep_load_plugins_hook - Load / unload traceevent plugins.
> -
> -SYNOPSIS
> ---------
> -[verse]
> ---
> -*#include <event-parse.h>*
> -
> -struct tep_plugin_list pass:[*]*tep_load_plugins*(struct tep_handle pass:[*]_tep_);
> -void *tep_unload_plugins*(struct tep_plugin_list pass:[*]_plugin_list_, struct tep_handle pass:[*]_tep_);
> -void *tep_load_plugins_hook*(struct tep_handle pass:[*]_tep_, const char pass:[*]_suffix_,
> - void (pass:[*]_load_plugin_)(struct tep_handle pass:[*]tep,
> - const char pass:[*]path,
> - const char pass:[*]name,
> - void pass:[*]data),
> - void pass:[*]_data_);
> ---
> -
> -DESCRIPTION
> ------------
> -The _tep_load_plugins()_ function loads all plugins, located in the plugin
> -directories. The _tep_ argument is trace event parser context.
> -The plugin directories are :
> -[verse]
> ---
> - - Directories, specified in _tep_->plugins_dir with priority TEP_PLUGIN_FIRST
> - - System's plugin directory, defined at the library compile time. It
> - depends on the library installation prefix and usually is
> - _(install_preffix)/lib/traceevent/plugins_
> - - Directory, defined by the environment variable _TRACEEVENT_PLUGIN_DIR_
> - - User's plugin directory, located at _~/.local/lib/traceevent/plugins_
> - - Directories, specified in _tep_->plugins_dir with priority TEP_PLUGIN_LAST
> ---
> -Loading of plugins can be controlled by the _tep_flags_, using the
> -_tep_set_flag()_ API:
> -[verse]
> ---
> - _TEP_DISABLE_SYS_PLUGINS_ - do not load plugins, located in
> - the system's plugin directory.
> - _TEP_DISABLE_PLUGINS_ - do not load any plugins.
> ---
> -The _tep_set_flag()_ API needs to be called before _tep_load_plugins()_, if
> -loading of all plugins is not the desired case.
> -
> -The _tep_unload_plugins()_ function unloads the plugins, previously loaded by
> -_tep_load_plugins()_. The _tep_ argument is trace event parser context. The
> -_plugin_list_ is the list of loaded plugins, returned by
> -the _tep_load_plugins()_ function.
> -
> -The _tep_load_plugins_hook_ function walks through all directories with plugins
> -and calls user specified _load_plugin()_ hook for each plugin file. Only files
> -with given _suffix_ are considered to be plugins. The _data_ is a user specified
> -context, passed to _load_plugin()_. Directories and the walk order are the same
> -as in _tep_load_plugins()_ API.
> -
> -RETURN VALUE
> -------------
> -The _tep_load_plugins()_ function returns a list of successfully loaded plugins,
> -or NULL in case no plugins are loaded.
> -
> -EXAMPLE
> --------
> -[source,c]
> ---
> -#include <event-parse.h>
> -...
> -struct tep_handle *tep = tep_alloc();
> -...
> -struct tep_plugin_list *plugins = tep_load_plugins(tep);
> -if (plugins == NULL) {
> - /* no plugins are loaded */
> -}
> -...
> -tep_unload_plugins(plugins, tep);
> -...
> -void print_plugin(struct tep_handle *tep, const char *path,
> - const char *name, void *data)
> -{
> - pritnf("Found libtraceevent plugin %s/%s\n", path, name);
> -}
> -...
> -tep_load_plugins_hook(tep, ".so", print_plugin, NULL);
> -...
> ---
> -
> -FILES
> ------
> -[verse]
> ---
> -*event-parse.h*
> - Header file to include in order to have access to the library APIs.
> -*-ltraceevent*
> - Linker switch to add when building a program that uses the library.
> ---
> -
> -SEE ALSO
> ---------
> -_libtraceevent(3)_, _trace-cmd(1)_, _tep_set_flag(3)_
> -
> -AUTHOR
> -------
> -[verse]
> ---
> -*Steven Rostedt* <[email protected]>, author of *libtraceevent*.
> -*Tzvetomir Stoyanov* <[email protected]>, author of this man page.
> ---
> -REPORTING BUGS
> ---------------
> -Report bugs to <[email protected]>
> -
> -LICENSE
> --------
> -libtraceevent is Free Software licensed under the GNU LGPL 2.1
> -
> -RESOURCES
> ----------
> -https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
> diff --git a/tools/lib/traceevent/Documentation/libtraceevent-record_parse.txt b/tools/lib/traceevent/Documentation/libtraceevent-record_parse.txt
> deleted file mode 100644
> index e9a69116c78b..000000000000
> --- a/tools/lib/traceevent/Documentation/libtraceevent-record_parse.txt
> +++ /dev/null
> @@ -1,137 +0,0 @@
> -libtraceevent(3)
> -================
> -
> -NAME
> -----
> -tep_data_type, tep_data_pid,tep_data_preempt_count, tep_data_flags -
> -Extract common fields from a record.
> -
> -SYNOPSIS
> ---------
> -[verse]
> ---
> -*#include <event-parse.h>*
> -
> -enum *trace_flag_type* {
> - _TRACE_FLAG_IRQS_OFF_,
> - _TRACE_FLAG_IRQS_NOSUPPORT_,
> - _TRACE_FLAG_NEED_RESCHED_,
> - _TRACE_FLAG_HARDIRQ_,
> - _TRACE_FLAG_SOFTIRQ_,
> -};
> -
> -int *tep_data_type*(struct tep_handle pass:[*]_tep_, struct tep_record pass:[*]_rec_);
> -int *tep_data_pid*(struct tep_handle pass:[*]_tep_, struct tep_record pass:[*]_rec_);
> -int *tep_data_preempt_count*(struct tep_handle pass:[*]_tep_, struct tep_record pass:[*]_rec_);
> -int *tep_data_flags*(struct tep_handle pass:[*]_tep_, struct tep_record pass:[*]_rec_);
> ---
> -
> -DESCRIPTION
> ------------
> -This set of functions can be used to extract common fields from a record.
> -
> -The _tep_data_type()_ function gets the event id from the record _rec_.
> -It reads the "common_type" field. The _tep_ argument is the trace event parser
> -context.
> -
> -The _tep_data_pid()_ function gets the process id from the record _rec_.
> -It reads the "common_pid" field. The _tep_ argument is the trace event parser
> -context.
> -
> -The _tep_data_preempt_count()_ function gets the preemption count from the
> -record _rec_. It reads the "common_preempt_count" field. The _tep_ argument is
> -the trace event parser context.
> -
> -The _tep_data_flags()_ function gets the latency flags from the record _rec_.
> -It reads the "common_flags" field. The _tep_ argument is the trace event parser
> -context. Supported latency flags are:
> -[verse]
> ---
> - _TRACE_FLAG_IRQS_OFF_, Interrupts are disabled.
> - _TRACE_FLAG_IRQS_NOSUPPORT_, Reading IRQ flag is not supported by the architecture.
> - _TRACE_FLAG_NEED_RESCHED_, Task needs rescheduling.
> - _TRACE_FLAG_HARDIRQ_, Hard IRQ is running.
> - _TRACE_FLAG_SOFTIRQ_, Soft IRQ is running.
> ---
> -
> -RETURN VALUE
> -------------
> -The _tep_data_type()_ function returns an integer, representing the event id.
> -
> -The _tep_data_pid()_ function returns an integer, representing the process id
> -
> -The _tep_data_preempt_count()_ function returns an integer, representing the
> -preemption count.
> -
> -The _tep_data_flags()_ function returns an integer, representing the latency
> -flags. Look at the _trace_flag_type_ enum for supported flags.
> -
> -All these functions in case of an error return a negative integer.
> -
> -EXAMPLE
> --------
> -[source,c]
> ---
> -#include <event-parse.h>
> -...
> -struct tep_handle *tep = tep_alloc();
> -...
> -void process_record(struct tep_record *record)
> -{
> - int data;
> -
> - data = tep_data_type(tep, record);
> - if (data >= 0) {
> - /* Got the ID of the event */
> - }
> -
> - data = tep_data_pid(tep, record);
> - if (data >= 0) {
> - /* Got the process ID */
> - }
> -
> - data = tep_data_preempt_count(tep, record);
> - if (data >= 0) {
> - /* Got the preemption count */
> - }
> -
> - data = tep_data_flags(tep, record);
> - if (data >= 0) {
> - /* Got the latency flags */
> - }
> -}
> -...
> ---
> -
> -FILES
> ------
> -[verse]
> ---
> -*event-parse.h*
> - Header file to include in order to have access to the library APIs.
> -*-ltraceevent*
> - Linker switch to add when building a program that uses the library.
> ---
> -
> -SEE ALSO
> ---------
> -_libtraceevent(3)_, _trace-cmd(1)_
> -
> -AUTHOR
> -------
> -[verse]
> ---
> -*Steven Rostedt* <[email protected]>, author of *libtraceevent*.
> -*Tzvetomir Stoyanov* <[email protected]>, author of this man page.
> ---
> -REPORTING BUGS
> ---------------
> -Report bugs to <[email protected]>
> -
> -LICENSE
> --------
> -libtraceevent is Free Software licensed under the GNU LGPL 2.1
> -
> -RESOURCES
> ----------
> -https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
> diff --git a/tools/lib/traceevent/Documentation/libtraceevent-reg_event_handler.txt b/tools/lib/traceevent/Documentation/libtraceevent-reg_event_handler.txt
> deleted file mode 100644
> index 53d37d72a1c1..000000000000
> --- a/tools/lib/traceevent/Documentation/libtraceevent-reg_event_handler.txt
> +++ /dev/null
> @@ -1,156 +0,0 @@
> -libtraceevent(3)
> -================
> -
> -NAME
> -----
> -tep_register_event_handler, tep_unregister_event_handler - Register /
> -unregisters a callback function to parse an event information.
> -
> -SYNOPSIS
> ---------
> -[verse]
> ---
> -*#include <event-parse.h>*
> -
> -enum *tep_reg_handler* {
> - _TEP_REGISTER_SUCCESS_,
> - _TEP_REGISTER_SUCCESS_OVERWRITE_,
> -};
> -
> -int *tep_register_event_handler*(struct tep_handle pass:[*]_tep_, int _id_, const char pass:[*]_sys_name_, const char pass:[*]_event_name_, tep_event_handler_func _func_, void pass:[*]_context_);
> -int *tep_unregister_event_handler*(struct tep_handle pass:[*]tep, int id, const char pass:[*]sys_name, const char pass:[*]event_name, tep_event_handler_func func, void pass:[*]_context_);
> -
> -typedef int (*pass:[*]tep_event_handler_func*)(struct trace_seq pass:[*]s, struct tep_record pass:[*]record, struct tep_event pass:[*]event, void pass:[*]context);
> ---
> -
> -DESCRIPTION
> ------------
> -The _tep_register_event_handler()_ function registers a handler function,
> -which is going to be called to parse the information for a given event.
> -The _tep_ argument is the trace event parser context. The _id_ argument is
> -the id of the event. The _sys_name_ argument is the name of the system,
> -the event belongs to. The _event_name_ argument is the name of the event.
> -If _id_ is >= 0, it is used to find the event, otherwise _sys_name_ and
> -_event_name_ are used. The _func_ is a pointer to the function, which is going
> -to be called to parse the event information. The _context_ argument is a pointer
> -to the context data, which will be passed to the _func_. If a handler function
> -for the same event is already registered, it will be overridden with the new
> -one. This mechanism allows a developer to override the parsing of a given event.
> -If for some reason the default print format is not sufficient, the developer
> -can register a function for an event to be used to parse the data instead.
> -
> -The _tep_unregister_event_handler()_ function unregisters the handler function,
> -previously registered with _tep_register_event_handler()_. The _tep_ argument
> -is the trace event parser context. The _id_, _sys_name_, _event_name_, _func_,
> -and _context_ are the same arguments, as when the callback function _func_ was
> -registered.
> -
> -The _tep_event_handler_func_ is the type of the custom event handler
> -function. The _s_ argument is the trace sequence, it can be used to create a
> -custom string, describing the event. A _record_ to get the event from is passed
> -as input parameter and also the _event_ - the handle to the record's event. The
> -_context_ is custom context, set when the custom event handler is registered.
> -
> -RETURN VALUE
> -------------
> -The _tep_register_event_handler()_ function returns _TEP_REGISTER_SUCCESS_
> -if the new handler is registered successfully or
> -_TEP_REGISTER_SUCCESS_OVERWRITE_ if an existing handler is overwritten.
> -If there is not enough memory to complete the registration,
> -TEP_ERRNO__MEM_ALLOC_FAILED is returned.
> -
> -The _tep_unregister_event_handler()_ function returns 0 if _func_ was removed
> -successful or, -1 if the event was not found.
> -
> -The _tep_event_handler_func_ should return -1 in case of an error,
> -or 0 otherwise.
> -
> -EXAMPLE
> --------
> -[source,c]
> ---
> -#include <event-parse.h>
> -#include <trace-seq.h>
> -...
> -struct tep_handle *tep = tep_alloc();
> -...
> -int timer_expire_handler(struct trace_seq *s, struct tep_record *record,
> - struct tep_event *event, void *context)
> -{
> - trace_seq_printf(s, "hrtimer=");
> -
> - if (tep_print_num_field(s, "0x%llx", event, "timer", record, 0) == -1)
> - tep_print_num_field(s, "0x%llx", event, "hrtimer", record, 1);
> -
> - trace_seq_printf(s, " now=");
> -
> - tep_print_num_field(s, "%llu", event, "now", record, 1);
> -
> - tep_print_func_field(s, " function=%s", event, "function", record, 0);
> -
> - return 0;
> -}
> -...
> - int ret;
> -
> - ret = tep_register_event_handler(tep, -1, "timer", "hrtimer_expire_entry",
> - timer_expire_handler, NULL);
> - if (ret < 0) {
> - char buf[32];
> -
> - tep_strerror(tep, ret, buf, 32)
> - printf("Failed to register handler for hrtimer_expire_entry: %s\n", buf);
> - } else {
> - switch (ret) {
> - case TEP_REGISTER_SUCCESS:
> - printf ("Registered handler for hrtimer_expire_entry\n");
> - break;
> - case TEP_REGISTER_SUCCESS_OVERWRITE:
> - printf ("Overwrote handler for hrtimer_expire_entry\n");
> - break;
> - }
> - }
> -...
> - ret = tep_unregister_event_handler(tep, -1, "timer", "hrtimer_expire_entry",
> - timer_expire_handler, NULL);
> - if ( ret )
> - printf ("Failed to unregister handler for hrtimer_expire_entry\n");
> -
> ---
> -
> -FILES
> ------
> -[verse]
> ---
> -*event-parse.h*
> - Header file to include in order to have access to the library APIs.
> -*trace-seq.h*
> - Header file to include in order to have access to trace sequences
> - related APIs. Trace sequences are used to allow a function to call
> - several other functions to create a string of data to use.
> -*-ltraceevent*
> - Linker switch to add when building a program that uses the library.
> ---
> -
> -SEE ALSO
> ---------
> -_libtraceevent(3)_, _trace-cmd(1)_
> -
> -AUTHOR
> -------
> -[verse]
> ---
> -*Steven Rostedt* <[email protected]>, author of *libtraceevent*.
> -*Tzvetomir Stoyanov* <[email protected]>, author of this man page.
> ---
> -REPORTING BUGS
> ---------------
> -Report bugs to <[email protected]>
> -
> -LICENSE
> --------
> -libtraceevent is Free Software licensed under the GNU LGPL 2.1
> -
> -RESOURCES
> ----------
> -https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
> diff --git a/tools/lib/traceevent/Documentation/libtraceevent-reg_print_func.txt b/tools/lib/traceevent/Documentation/libtraceevent-reg_print_func.txt
> deleted file mode 100644
> index 708dce91ebd8..000000000000
> --- a/tools/lib/traceevent/Documentation/libtraceevent-reg_print_func.txt
> +++ /dev/null
> @@ -1,155 +0,0 @@
> -libtraceevent(3)
> -================
> -
> -NAME
> -----
> -tep_register_print_function,tep_unregister_print_function -
> -Registers / Unregisters a helper function.
> -
> -SYNOPSIS
> ---------
> -[verse]
> ---
> -*#include <event-parse.h>*
> -
> -enum *tep_func_arg_type* {
> - TEP_FUNC_ARG_VOID,
> - TEP_FUNC_ARG_INT,
> - TEP_FUNC_ARG_LONG,
> - TEP_FUNC_ARG_STRING,
> - TEP_FUNC_ARG_PTR,
> - TEP_FUNC_ARG_MAX_TYPES
> -};
> -
> -typedef unsigned long long (*pass:[*]tep_func_handler*)(struct trace_seq pass:[*]s, unsigned long long pass:[*]args);
> -
> -int *tep_register_print_function*(struct tep_handle pass:[*]_tep_, tep_func_handler _func_, enum tep_func_arg_type _ret_type_, char pass:[*]_name_, _..._);
> -int *tep_unregister_print_function*(struct tep_handle pass:[*]_tep_, tep_func_handler _func_, char pass:[*]_name_);
> ---
> -
> -DESCRIPTION
> ------------
> -Some events may have helper functions in the print format arguments.
> -This allows a plugin to dynamically create a way to process one of
> -these functions.
> -
> -The _tep_register_print_function()_ registers such helper function. The _tep_
> -argument is the trace event parser context. The _func_ argument is a pointer
> -to the helper function. The _ret_type_ argument is the return type of the
> -helper function, value from the _tep_func_arg_type_ enum. The _name_ is the name
> -of the helper function, as seen in the print format arguments. The _..._ is a
> -variable list of _tep_func_arg_type_ enums, the _func_ function arguments.
> -This list must end with _TEP_FUNC_ARG_VOID_. See 'EXAMPLE' section.
> -
> -The _tep_unregister_print_function()_ unregisters a helper function, previously
> -registered with _tep_register_print_function()_. The _tep_ argument is the
> -trace event parser context. The _func_ and _name_ arguments are the same, used
> -when the helper function was registered.
> -
> -The _tep_func_handler_ is the type of the helper function. The _s_ argument is
> -the trace sequence, it can be used to create a custom string.
> -The _args_ is a list of arguments, defined when the helper function was
> -registered.
> -
> -RETURN VALUE
> -------------
> -The _tep_register_print_function()_ function returns 0 in case of success.
> -In case of an error, TEP_ERRNO_... code is returned.
> -
> -The _tep_unregister_print_function()_ returns 0 in case of success, or -1 in
> -case of an error.
> -
> -EXAMPLE
> --------
> -Some events have internal functions calls, that appear in the print format
> -output. For example "tracefs/events/i915/g4x_wm/format" has:
> -[source,c]
> ---
> -print fmt: "pipe %c, frame=%u, scanline=%u, wm %d/%d/%d, sr %s/%d/%d/%d, hpll %s/%d/%d/%d, fbc %s",
> - ((REC->pipe) + 'A'), REC->frame, REC->scanline, REC->primary,
> - REC->sprite, REC->cursor, yesno(REC->cxsr), REC->sr_plane,
> - REC->sr_cursor, REC->sr_fbc, yesno(REC->hpll), REC->hpll_plane,
> - REC->hpll_cursor, REC->hpll_fbc, yesno(REC->fbc)
> ---
> -Notice the call to function _yesno()_ in the print arguments. In the kernel
> -context, this function has the following implementation:
> -[source,c]
> ---
> -static const char *yesno(int x)
> -{
> - static const char *yes = "yes";
> - static const char *no = "no";
> -
> - return x ? yes : no;
> -}
> ---
> -The user space event parser has no idea how to handle this _yesno()_ function.
> -The _tep_register_print_function()_ API can be used to register a user space
> -helper function, mapped to the kernel's _yesno()_:
> -[source,c]
> ---
> -#include <event-parse.h>
> -#include <trace-seq.h>
> -...
> -struct tep_handle *tep = tep_alloc();
> -...
> -static const char *yes_no_helper(int x)
> -{
> - return x ? "yes" : "no";
> -}
> -...
> - if ( tep_register_print_function(tep,
> - yes_no_helper,
> - TEP_FUNC_ARG_STRING,
> - "yesno",
> - TEP_FUNC_ARG_INT,
> - TEP_FUNC_ARG_VOID) != 0) {
> - /* Failed to register yes_no_helper function */
> - }
> -
> -/*
> - Now, when the event parser encounters this yesno() function, it will know
> - how to handle it.
> -*/
> -...
> - if (tep_unregister_print_function(tep, yes_no_helper, "yesno") != 0) {
> - /* Failed to unregister yes_no_helper function */
> - }
> ---
> -
> -FILES
> ------
> -[verse]
> ---
> -*event-parse.h*
> - Header file to include in order to have access to the library APIs.
> -*trace-seq.h*
> - Header file to include in order to have access to trace sequences
> - related APIs. Trace sequences are used to allow a function to call
> - several other functions to create a string of data to use.
> -*-ltraceevent*
> - Linker switch to add when building a program that uses the library.
> ---
> -
> -SEE ALSO
> ---------
> -_libtraceevent(3)_, _trace-cmd(1)_
> -
> -AUTHOR
> -------
> -[verse]
> ---
> -*Steven Rostedt* <[email protected]>, author of *libtraceevent*.
> -*Tzvetomir Stoyanov* <[email protected]>, author of this man page.
> ---
> -REPORTING BUGS
> ---------------
> -Report bugs to <[email protected]>
> -
> -LICENSE
> --------
> -libtraceevent is Free Software licensed under the GNU LGPL 2.1
> -
> -RESOURCES
> ----------
> -https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
> diff --git a/tools/lib/traceevent/Documentation/libtraceevent-set_flag.txt b/tools/lib/traceevent/Documentation/libtraceevent-set_flag.txt
> deleted file mode 100644
> index b0599780b9a6..000000000000
> --- a/tools/lib/traceevent/Documentation/libtraceevent-set_flag.txt
> +++ /dev/null
> @@ -1,104 +0,0 @@
> -libtraceevent(3)
> -================
> -
> -NAME
> -----
> -tep_set_flag, tep_clear_flag, tep_test_flag -
> -Manage flags of trace event parser context.
> -
> -SYNOPSIS
> ---------
> -[verse]
> ---
> -*#include <event-parse.h>*
> -
> -enum *tep_flag* {
> - _TEP_NSEC_OUTPUT_,
> - _TEP_DISABLE_SYS_PLUGINS_,
> - _TEP_DISABLE_PLUGINS_
> -};
> -void *tep_set_flag*(struct tep_handle pass:[*]_tep_, enum tep_flag _flag_);
> -void *tep_clear_flag*(struct tep_handle pass:[*]_tep_, enum tep_flag _flag_);
> -bool *tep_test_flag*(struct tep_handle pass:[*]_tep_, enum tep_flag _flag_);
> ---
> -
> -DESCRIPTION
> ------------
> -Trace event parser context flags are defined in *enum tep_flag*:
> -[verse]
> ---
> -_TEP_NSEC_OUTPUT_ - print event's timestamp in nano seconds, instead of micro seconds.
> -_TEP_DISABLE_SYS_PLUGINS_ - disable plugins, located in system's plugin
> - directory. This directory is defined at library compile
> - time, and usually depends on library installation
> - prefix: (install_preffix)/lib/traceevent/plugins
> -_TEP_DISABLE_PLUGINS_ - disable all library plugins:
> - - in system's plugin directory
> - - in directory, defined by the environment variable _TRACEEVENT_PLUGIN_DIR_
> - - in user's home directory, _~/.traceevent/plugins_
> ---
> -Note: plugin related flags must me set before calling _tep_load_plugins()_ API.
> -
> -The _tep_set_flag()_ function sets _flag_ to _tep_ context.
> -
> -The _tep_clear_flag()_ function clears _flag_ from _tep_ context.
> -
> -The _tep_test_flag()_ function tests if _flag_ is set to _tep_ context.
> -
> -RETURN VALUE
> -------------
> -_tep_test_flag()_ function returns true if _flag_ is set, false otherwise.
> -
> -EXAMPLE
> --------
> -[source,c]
> ---
> -#include <event-parse.h>
> -...
> -struct tep_handle *tep = tep_alloc();
> -...
> -/* Print timestamps in nanoseconds */
> -tep_set_flag(tep, TEP_NSEC_OUTPUT);
> -...
> -if (tep_test_flag(tep, TEP_NSEC_OUTPUT)) {
> - /* print timestamps in nanoseconds */
> -} else {
> - /* print timestamps in microseconds */
> -}
> -...
> -/* Print timestamps in microseconds */
> -tep_clear_flag(tep, TEP_NSEC_OUTPUT);
> -...
> ---
> -FILES
> ------
> -[verse]
> ---
> -*event-parse.h*
> - Header file to include in order to have access to the library APIs.
> -*-ltraceevent*
> - Linker switch to add when building a program that uses the library.
> ---
> -
> -SEE ALSO
> ---------
> -_libtraceevent(3)_, _trace-cmd(1)_
> -
> -AUTHOR
> -------
> -[verse]
> ---
> -*Steven Rostedt* <[email protected]>, author of *libtraceevent*.
> -*Tzvetomir Stoyanov* <[email protected]>, author of this man page.
> ---
> -REPORTING BUGS
> ---------------
> -Report bugs to <[email protected]>
> -
> -LICENSE
> --------
> -libtraceevent is Free Software licensed under the GNU LGPL 2.1
> -
> -RESOURCES
> ----------
> -https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
> diff --git a/tools/lib/traceevent/Documentation/libtraceevent-strerror.txt b/tools/lib/traceevent/Documentation/libtraceevent-strerror.txt
> deleted file mode 100644
> index ee4062a00c9f..000000000000
> --- a/tools/lib/traceevent/Documentation/libtraceevent-strerror.txt
> +++ /dev/null
> @@ -1,85 +0,0 @@
> -libtraceevent(3)
> -================
> -
> -NAME
> -----
> -tep_strerror - Returns a string describing regular errno and tep error number.
> -
> -SYNOPSIS
> ---------
> -[verse]
> ---
> -*#include <event-parse.h>*
> -
> -int *tep_strerror*(struct tep_handle pass:[*]_tep_, enum tep_errno _errnum_, char pass:[*]_buf_, size_t _buflen_);
> -
> ---
> -DESCRIPTION
> ------------
> -The _tep_strerror()_ function converts tep error number into a human
> -readable string.
> -The _tep_ argument is trace event parser context. The _errnum_ is a regular
> -errno, defined in errno.h, or a tep error number. The string, describing this
> -error number is copied in the _buf_ argument. The _buflen_ argument is
> -the size of the _buf_.
> -
> -It as a thread safe wrapper around strerror_r(). The library function has two
> -different behaviors - POSIX and GNU specific. The _tep_strerror()_ API always
> -behaves as the POSIX version - the error string is copied in the user supplied
> -buffer.
> -
> -RETURN VALUE
> -------------
> -The _tep_strerror()_ function returns 0, if a valid _errnum_ is passed and the
> -string is copied into _buf_. If _errnum_ is not a valid error number,
> --1 is returned and _buf_ is not modified.
> -
> -EXAMPLE
> --------
> -[source,c]
> ---
> -#include <event-parse.h>
> -...
> -struct tep_handle *tep = tep_alloc();
> -...
> -char buf[32];
> -char *pool = calloc(1, 128);
> -if (tep == NULL) {
> - tep_strerror(tep, TEP_ERRNO__MEM_ALLOC_FAILED, buf, 32);
> - printf ("The pool is not initialized, %s", buf);
> -}
> -...
> ---
> -
> -FILES
> ------
> -[verse]
> ---
> -*event-parse.h*
> - Header file to include in order to have access to the library APIs.
> -*-ltraceevent*
> - Linker switch to add when building a program that uses the library.
> ---
> -
> -SEE ALSO
> ---------
> -_libtraceevent(3)_, _trace-cmd(1)_
> -
> -AUTHOR
> -------
> -[verse]
> ---
> -*Steven Rostedt* <[email protected]>, author of *libtraceevent*.
> -*Tzvetomir Stoyanov* <[email protected]>, author of this man page.
> ---
> -REPORTING BUGS
> ---------------
> -Report bugs to <[email protected]>
> -
> -LICENSE
> --------
> -libtraceevent is Free Software licensed under the GNU LGPL 2.1
> -
> -RESOURCES
> ----------
> -https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
> diff --git a/tools/lib/traceevent/Documentation/libtraceevent-tseq.txt b/tools/lib/traceevent/Documentation/libtraceevent-tseq.txt
> deleted file mode 100644
> index 8ac6aa174e12..000000000000
> --- a/tools/lib/traceevent/Documentation/libtraceevent-tseq.txt
> +++ /dev/null
> @@ -1,158 +0,0 @@
> -libtraceevent(3)
> -================
> -
> -NAME
> -----
> -trace_seq_init, trace_seq_destroy, trace_seq_reset, trace_seq_terminate,
> -trace_seq_putc, trace_seq_puts, trace_seq_printf, trace_seq_vprintf,
> -trace_seq_do_fprintf, trace_seq_do_printf -
> -Initialize / destroy a trace sequence.
> -
> -SYNOPSIS
> ---------
> -[verse]
> ---
> -*#include <event-parse.h>*
> -*#include <trace-seq.h>*
> -
> -void *trace_seq_init*(struct trace_seq pass:[*]_s_);
> -void *trace_seq_destroy*(struct trace_seq pass:[*]_s_);
> -void *trace_seq_reset*(struct trace_seq pass:[*]_s_);
> -void *trace_seq_terminate*(struct trace_seq pass:[*]_s_);
> -int *trace_seq_putc*(struct trace_seq pass:[*]_s_, unsigned char _c_);
> -int *trace_seq_puts*(struct trace_seq pass:[*]_s_, const char pass:[*]_str_);
> -int *trace_seq_printf*(struct trace_seq pass:[*]_s_, const char pass:[*]_fmt_, _..._);
> -int *trace_seq_vprintf*(struct trace_seq pass:[*]_s_, const char pass:[*]_fmt_, va_list _args_);
> -int *trace_seq_do_printf*(struct trace_seq pass:[*]_s_);
> -int *trace_seq_do_fprintf*(struct trace_seq pass:[*]_s_, FILE pass:[*]_fp_);
> ---
> -
> -DESCRIPTION
> ------------
> -Trace sequences are used to allow a function to call several other functions
> -to create a string of data to use.
> -
> -The _trace_seq_init()_ function initializes the trace sequence _s_.
> -
> -The _trace_seq_destroy()_ function destroys the trace sequence _s_ and frees
> -all its resources that it had used.
> -
> -The _trace_seq_reset()_ function re-initializes the trace sequence _s_. All
> -characters already written in _s_ will be deleted.
> -
> -The _trace_seq_terminate()_ function terminates the trace sequence _s_. It puts
> -the null character pass:['\0'] at the end of the buffer.
> -
> -The _trace_seq_putc()_ function puts a single character _c_ in the trace
> -sequence _s_.
> -
> -The _trace_seq_puts()_ function puts a NULL terminated string _str_ in the
> -trace sequence _s_.
> -
> -The _trace_seq_printf()_ function puts a formated string _fmt _with
> -variable arguments _..._ in the trace sequence _s_.
> -
> -The _trace_seq_vprintf()_ function puts a formated string _fmt _with
> -list of arguments _args_ in the trace sequence _s_.
> -
> -The _trace_seq_do_printf()_ function prints the buffer of trace sequence _s_ to
> -the standard output stdout.
> -
> -The _trace_seq_do_fprintf()_ function prints the buffer of trace sequence _s_
> -to the given file _fp_.
> -
> -RETURN VALUE
> -------------
> -Both _trace_seq_putc()_ and _trace_seq_puts()_ functions return the number of
> -characters put in the trace sequence, or 0 in case of an error
> -
> -Both _trace_seq_printf()_ and _trace_seq_vprintf()_ functions return 0 if the
> -trace oversizes the buffer's free space, the number of characters printed, or
> -a negative value in case of an error.
> -
> -Both _trace_seq_do_printf()_ and _trace_seq_do_fprintf()_ functions return the
> -number of printed characters, or -1 in case of an error.
> -
> -EXAMPLE
> --------
> -[source,c]
> ---
> -#include <event-parse.h>
> -#include <trace-seq.h>
> -...
> -struct trace_seq seq;
> -trace_seq_init(&seq);
> -...
> -void foo_seq_print(struct trace_seq *tseq, char *format, ...)
> -{
> - va_list ap;
> - va_start(ap, format);
> - if (trace_seq_vprintf(tseq, format, ap) <= 0) {
> - /* Failed to print in the trace sequence */
> - }
> - va_end(ap);
> -}
> -
> -trace_seq_reset(&seq);
> -
> -char *str = " MAN page example";
> -if (trace_seq_puts(&seq, str) != strlen(str)) {
> - /* Failed to put str in the trace sequence */
> -}
> -if (trace_seq_putc(&seq, ':') != 1) {
> - /* Failed to put ':' in the trace sequence */
> -}
> -if (trace_seq_printf(&seq, " trace sequence: %d", 1) <= 0) {
> - /* Failed to print in the trace sequence */
> -}
> -foo_seq_print( &seq, " %d\n", 2);
> -
> -trace_seq_terminate(&seq);
> -...
> -
> -if (trace_seq_do_printf(&seq) < 0 ) {
> - /* Failed to print the sequence buffer to the standard output */
> -}
> -FILE *fp = fopen("trace.txt", "w");
> -if (trace_seq_do_fprintf(&seq, fp) < 0 ) [
> - /* Failed to print the sequence buffer to the trace.txt file */
> -}
> -
> -trace_seq_destroy(&seq);
> -...
> ---
> -
> -FILES
> ------
> -[verse]
> ---
> -*event-parse.h*
> - Header file to include in order to have access to the library APIs.
> -*trace-seq.h*
> - Header file to include in order to have access to trace sequences related APIs.
> -*-ltraceevent*
> - Linker switch to add when building a program that uses the library.
> ---
> -
> -SEE ALSO
> ---------
> -_libtraceevent(3)_, _trace-cmd(1)_
> -
> -AUTHOR
> -------
> -[verse]
> ---
> -*Steven Rostedt* <[email protected]>, author of *libtraceevent*.
> -*Tzvetomir Stoyanov* <[email protected]>, author of this man page.
> ---
> -REPORTING BUGS
> ---------------
> -Report bugs to <[email protected]>
> -
> -LICENSE
> --------
> -libtraceevent is Free Software licensed under the GNU LGPL 2.1
> -
> -RESOURCES
> ----------
> -https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
> diff --git a/tools/lib/traceevent/Documentation/libtraceevent.txt b/tools/lib/traceevent/Documentation/libtraceevent.txt
> deleted file mode 100644
> index d530a7ce8fb2..000000000000
> --- a/tools/lib/traceevent/Documentation/libtraceevent.txt
> +++ /dev/null
> @@ -1,192 +0,0 @@
> -libtraceevent(3)
> -================
> -
> -NAME
> -----
> -libtraceevent - Linux kernel trace event library
> -
> -SYNOPSIS
> ---------
> -[verse]
> ---
> -*#include <event-parse.h>*
> -
> -Management of tep handler data structure and access of its members:
> - struct tep_handle pass:[*]*tep_alloc*(void);
> - void *tep_free*(struct tep_handle pass:[*]_tep_);
> - void *tep_ref*(struct tep_handle pass:[*]_tep_);
> - void *tep_unref*(struct tep_handle pass:[*]_tep_);
> - int *tep_get_ref*(struct tep_handle pass:[*]_tep_);
> - void *tep_set_flag*(struct tep_handle pass:[*]_tep_, enum tep_flag _flag_);
> - void *tep_clear_flag*(struct tep_handle pass:[*]_tep_, enum tep_flag _flag_);
> - bool *tep_test_flag*(struct tep_handle pass:[*]_tep_, enum tep_flag _flags_);
> - int *tep_get_cpus*(struct tep_handle pass:[*]_tep_);
> - void *tep_set_cpus*(struct tep_handle pass:[*]_tep_, int _cpus_);
> - int *tep_get_long_size*(strucqt tep_handle pass:[*]_tep_);
> - void *tep_set_long_size*(struct tep_handle pass:[*]_tep_, int _long_size_);
> - int *tep_get_page_size*(struct tep_handle pass:[*]_tep_);
> - void *tep_set_page_size*(struct tep_handle pass:[*]_tep_, int _page_size_);
> - int *tep_get_header_page_size*(struct tep_handle pass:[*]_tep_);
> - int *tep_get_header_timestamp_size*(struct tep_handle pass:[*]_tep_);
> - bool *tep_is_old_format*(struct tep_handle pass:[*]_tep_);
> - int *tep_strerror*(struct tep_handle pass:[*]_tep_, enum tep_errno _errnum_, char pass:[*]_buf_, size_t _buflen_);
> -
> -Register / unregister APIs:
> - int *tep_register_function*(struct tep_handle pass:[*]_tep_, char pass:[*]_name_, unsigned long long _addr_, char pass:[*]_mod_);
> - int *tep_register_event_handler*(struct tep_handle pass:[*]_tep_, int _id_, const char pass:[*]_sys_name_, const char pass:[*]_event_name_, tep_event_handler_func _func_, void pass:[*]_context_);
> - int *tep_unregister_event_handler*(struct tep_handle pass:[*]tep, int id, const char pass:[*]sys_name, const char pass:[*]event_name, tep_event_handler_func func, void pass:[*]_context_);
> - int *tep_register_print_string*(struct tep_handle pass:[*]_tep_, const char pass:[*]_fmt_, unsigned long long _addr_);
> - int *tep_register_print_function*(struct tep_handle pass:[*]_tep_, tep_func_handler _func_, enum tep_func_arg_type _ret_type_, char pass:[*]_name_, _..._);
> - int *tep_unregister_print_function*(struct tep_handle pass:[*]_tep_, tep_func_handler _func_, char pass:[*]_name_);
> -
> -Plugins management:
> - struct tep_plugin_list pass:[*]*tep_load_plugins*(struct tep_handle pass:[*]_tep_);
> - void *tep_unload_plugins*(struct tep_plugin_list pass:[*]_plugin_list_, struct tep_handle pass:[*]_tep_);
> - char pass:[*]pass:[*]*tep_plugin_list_options*(void);
> - void *tep_plugin_free_options_list*(char pass:[*]pass:[*]_list_);
> - int *tep_plugin_add_options*(const char pass:[*]_name_, struct tep_plugin_option pass:[*]_options_);
> - void *tep_plugin_remove_options*(struct tep_plugin_option pass:[*]_options_);
> - void *tep_print_plugins*(struct trace_seq pass:[*]_s_, const char pass:[*]_prefix_, const char pass:[*]_suffix_, const struct tep_plugin_list pass:[*]_list_);
> -
> -Event related APIs:
> - struct tep_event pass:[*]*tep_get_event*(struct tep_handle pass:[*]_tep_, int _index_);
> - struct tep_event pass:[*]*tep_get_first_event*(struct tep_handle pass:[*]_tep_);
> - int *tep_get_events_count*(struct tep_handle pass:[*]_tep_);
> - struct tep_event pass:[*]pass:[*]*tep_list_events*(struct tep_handle pass:[*]_tep_, enum tep_event_sort_type _sort_type_);
> - struct tep_event pass:[*]pass:[*]*tep_list_events_copy*(struct tep_handle pass:[*]_tep_, enum tep_event_sort_type _sort_type_);
> - void *tep_print_event*(struct tep_handle pass:[*]_tep_, struct trace_seq pass:[*]_s_, struct tep_record pass:[*]_record_, const char pass:[*]_fmt_, _..._);
> -
> -Event finding:
> - struct tep_event pass:[*]*tep_find_event*(struct tep_handle pass:[*]_tep_, int _id_);
> - struct tep_event pass:[*]*tep_find_event_by_name*(struct tep_handle pass:[*]_tep_, const char pass:[*]_sys_, const char pass:[*]_name_);
> - struct tep_event pass:[*]*tep_find_event_by_record*(struct tep_handle pass:[*]_tep_, struct tep_record pass:[*]_record_);
> -
> -Parsing of event files:
> - int *tep_parse_header_page*(struct tep_handle pass:[*]_tep_, char pass:[*]_buf_, unsigned long _size_, int _long_size_);
> - enum tep_errno *tep_parse_event*(struct tep_handle pass:[*]_tep_, const char pass:[*]_buf_, unsigned long _size_, const char pass:[*]_sys_);
> - enum tep_errno *tep_parse_format*(struct tep_handle pass:[*]_tep_, struct tep_event pass:[*]pass:[*]_eventp_, const char pass:[*]_buf_, unsigned long _size_, const char pass:[*]_sys_);
> -
> -APIs related to fields from event's format files:
> - struct tep_format_field pass:[*]pass:[*]*tep_event_common_fields*(struct tep_event pass:[*]_event_);
> - struct tep_format_field pass:[*]pass:[*]*tep_event_fields*(struct tep_event pass:[*]_event_);
> - void pass:[*]*tep_get_field_raw*(struct trace_seq pass:[*]_s_, struct tep_event pass:[*]_event_, const char pass:[*]_name_, struct tep_record pass:[*]_record_, int pass:[*]_len_, int _err_);
> - int *tep_get_field_val*(struct trace_seq pass:[*]_s_, struct tep_event pass:[*]_event_, const char pass:[*]_name_, struct tep_record pass:[*]_record_, unsigned long long pass:[*]_val_, int _err_);
> - int *tep_get_common_field_val*(struct trace_seq pass:[*]_s_, struct tep_event pass:[*]_event_, const char pass:[*]_name_, struct tep_record pass:[*]_record_, unsigned long long pass:[*]_val_, int _err_);
> - int *tep_get_any_field_val*(struct trace_seq pass:[*]_s_, struct tep_event pass:[*]_event_, const char pass:[*]_name_, struct tep_record pass:[*]_record_, unsigned long long pass:[*]_val_, int _err_);
> - int *tep_read_number_field*(struct tep_format_field pass:[*]_field_, const void pass:[*]_data_, unsigned long long pass:[*]_value_);
> -
> -Event fields printing:
> - void *tep_print_field*(struct trace_seq pass:[*]_s_, void pass:[*]_data_, struct tep_format_field pass:[*]_field_);
> - void *tep_print_fields*(struct trace_seq pass:[*]_s_, void pass:[*]_data_, int _size_, struct tep_event pass:[*]_event_);
> - int *tep_print_num_field*(struct trace_seq pass:[*]_s_, const char pass:[*]_fmt_, struct tep_event pass:[*]_event_, const char pass:[*]_name_, struct tep_record pass:[*]_record_, int _err_);
> - int *tep_print_func_field*(struct trace_seq pass:[*]_s_, const char pass:[*]_fmt_, struct tep_event pass:[*]_event_, const char pass:[*]_name_, struct tep_record pass:[*]_record_, int _err_);
> -
> -Event fields finding:
> - struct tep_format_field pass:[*]*tep_find_common_field*(struct tep_event pass:[*]_event_, const char pass:[*]_name_);
> - struct tep_format_field pass:[*]*tep_find_field*(struct tep_event_ormat pass:[*]_event_, const char pass:[*]_name_);
> - struct tep_format_field pass:[*]*tep_find_any_field*(struct tep_event pass:[*]_event_, const char pass:[*]_name_);
> -
> -Functions resolver:
> - int *tep_set_function_resolver*(struct tep_handle pass:[*]_tep_, tep_func_resolver_t pass:[*]_func_, void pass:[*]_priv_);
> - void *tep_reset_function_resolver*(struct tep_handle pass:[*]_tep_);
> - const char pass:[*]*tep_find_function*(struct tep_handle pass:[*]_tep_, unsigned long long _addr_);
> - unsigned long long *tep_find_function_address*(struct tep_handle pass:[*]_tep_, unsigned long long _addr_);
> -
> -Filter management:
> - struct tep_event_filter pass:[*]*tep_filter_alloc*(struct tep_handle pass:[*]_tep_);
> - enum tep_errno *tep_filter_add_filter_str*(struct tep_event_filter pass:[*]_filter_, const char pass:[*]_filter_str_);
> - enum tep_errno *tep_filter_match*(struct tep_event_filter pass:[*]_filter_, struct tep_record pass:[*]_record_);
> - int *tep_filter_strerror*(struct tep_event_filter pass:[*]_filter_, enum tep_errno _err_, char pass:[*]buf, size_t _buflen_);
> - int *tep_event_filtered*(struct tep_event_filter pass:[*]_filter_, int _event_id_);
> - void *tep_filter_reset*(struct tep_event_filter pass:[*]_filter_);
> - void *tep_filter_free*(struct tep_event_filter pass:[*]_filter_);
> - char pass:[*]*tep_filter_make_string*(struct tep_event_filter pass:[*]_filter_, int _event_id_);
> - int *tep_filter_remove_event*(struct tep_event_filter pass:[*]_filter_, int _event_id_);
> - int *tep_filter_copy*(struct tep_event_filter pass:[*]_dest_, struct tep_event_filter pass:[*]_source_);
> - int *tep_filter_compare*(struct tep_event_filter pass:[*]_filter1_, struct tep_event_filter pass:[*]_filter2_);
> -
> -Parsing various data from the records:
> - int *tep_data_type*(struct tep_handle pass:[*]_tep_, struct tep_record pass:[*]_rec_);
> - int *tep_data_pid*(struct tep_handle pass:[*]_tep_, struct tep_record pass:[*]_rec_);
> - int *tep_data_preempt_count*(struct tep_handle pass:[*]_tep_, struct tep_record pass:[*]_rec_);
> - int *tep_data_flags*(struct tep_handle pass:[*]_tep_, struct tep_record pass:[*]_rec_);
> -
> -Command and task related APIs:
> - const char pass:[*]*tep_data_comm_from_pid*(struct tep_handle pass:[*]_tep_, int _pid_);
> - struct cmdline pass:[*]*tep_data_pid_from_comm*(struct tep_handle pass:[*]_tep_, const char pass:[*]_comm_, struct cmdline pass:[*]_next_);
> - int *tep_register_comm*(struct tep_handle pass:[*]_tep_, const char pass:[*]_comm_, int _pid_);
> - int *tep_override_comm*(struct tep_handle pass:[*]_tep_, const char pass:[*]_comm_, int _pid_);
> - bool *tep_is_pid_registered*(struct tep_handle pass:[*]_tep_, int _pid_);
> - int *tep_cmdline_pid*(struct tep_handle pass:[*]_tep_, struct cmdline pass:[*]_cmdline_);
> -
> -Endian related APIs:
> - int *tep_is_bigendian*(void);
> - unsigned long long *tep_read_number*(struct tep_handle pass:[*]_tep_, const void pass:[*]_ptr_, int _size_);
> - bool *tep_is_file_bigendian*(struct tep_handle pass:[*]_tep_);
> - void *tep_set_file_bigendian*(struct tep_handle pass:[*]_tep_, enum tep_endian _endian_);
> - bool *tep_is_local_bigendian*(struct tep_handle pass:[*]_tep_);
> - void *tep_set_local_bigendian*(struct tep_handle pass:[*]_tep_, enum tep_endian _endian_);
> -
> -Trace sequences:
> -*#include <trace-seq.h>*
> - void *trace_seq_init*(struct trace_seq pass:[*]_s_);
> - void *trace_seq_reset*(struct trace_seq pass:[*]_s_);
> - void *trace_seq_destroy*(struct trace_seq pass:[*]_s_);
> - int *trace_seq_printf*(struct trace_seq pass:[*]_s_, const char pass:[*]_fmt_, ...);
> - int *trace_seq_vprintf*(struct trace_seq pass:[*]_s_, const char pass:[*]_fmt_, va_list _args_);
> - int *trace_seq_puts*(struct trace_seq pass:[*]_s_, const char pass:[*]_str_);
> - int *trace_seq_putc*(struct trace_seq pass:[*]_s_, unsigned char _c_);
> - void *trace_seq_terminate*(struct trace_seq pass:[*]_s_);
> - int *trace_seq_do_fprintf*(struct trace_seq pass:[*]_s_, FILE pass:[*]_fp_);
> - int *trace_seq_do_printf*(struct trace_seq pass:[*]_s_);
> ---
> -
> -DESCRIPTION
> ------------
> -The libtraceevent(3) library provides APIs to access kernel tracepoint events,
> -located in the tracefs file system under the events directory.
> -
> -ENVIRONMENT
> ------------
> -[verse]
> ---
> -TRACEEVENT_PLUGIN_DIR
> - Additional plugin directory. All shared object files, located in this directory will be loaded as traceevent plugins.
> ---
> -
> -FILES
> ------
> -[verse]
> ---
> -*event-parse.h*
> - Header file to include in order to have access to the library APIs.
> -*trace-seq.h*
> - Header file to include in order to have access to trace sequences related APIs.
> - Trace sequences are used to allow a function to call several other functions
> - to create a string of data to use.
> -*-ltraceevent*
> - Linker switch to add when building a program that uses the library.
> ---
> -
> -SEE ALSO
> ---------
> -_trace-cmd(1)_
> -
> -AUTHOR
> -------
> -[verse]
> ---
> -*Steven Rostedt* <[email protected]>, author of *libtraceevent*.
> -*Tzvetomir Stoyanov* <[email protected]>, author of this man page.
> ---
> -REPORTING BUGS
> ---------------
> -Report bugs to <[email protected]>
> -
> -LICENSE
> --------
> -libtraceevent is Free Software licensed under the GNU LGPL 2.1
> -
> -RESOURCES
> ----------
> -https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
> diff --git a/tools/lib/traceevent/Documentation/manpage-1.72.xsl b/tools/lib/traceevent/Documentation/manpage-1.72.xsl
> deleted file mode 100644
> index b4d315cb8c47..000000000000
> --- a/tools/lib/traceevent/Documentation/manpage-1.72.xsl
> +++ /dev/null
> @@ -1,14 +0,0 @@
> -<!-- manpage-1.72.xsl:
> - special settings for manpages rendered from asciidoc+docbook
> - handles peculiarities in docbook-xsl 1.72.0 -->
> -<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
> - version="1.0">
> -
> -<xsl:import href="manpage-base.xsl"/>
> -
> -<!-- these are the special values for the roff control characters
> - needed for docbook-xsl 1.72.0 -->
> -<xsl:param name="git.docbook.backslash">&#x2593;</xsl:param>
> -<xsl:param name="git.docbook.dot" >&#x2302;</xsl:param>
> -
> -</xsl:stylesheet>
> diff --git a/tools/lib/traceevent/Documentation/manpage-base.xsl b/tools/lib/traceevent/Documentation/manpage-base.xsl
> deleted file mode 100644
> index a264fa616093..000000000000
> --- a/tools/lib/traceevent/Documentation/manpage-base.xsl
> +++ /dev/null
> @@ -1,35 +0,0 @@
> -<!-- manpage-base.xsl:
> - special formatting for manpages rendered from asciidoc+docbook -->
> -<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
> - version="1.0">
> -
> -<!-- these params silence some output from xmlto -->
> -<xsl:param name="man.output.quietly" select="1"/>
> -<xsl:param name="refentry.meta.get.quietly" select="1"/>
> -
> -<!-- convert asciidoc callouts to man page format;
> - git.docbook.backslash and git.docbook.dot params
> - must be supplied by another XSL file or other means -->
> -<xsl:template match="co">
> - <xsl:value-of select="concat(
> - $git.docbook.backslash,'fB(',
> - substring-after(@id,'-'),')',
> - $git.docbook.backslash,'fR')"/>
> -</xsl:template>
> -<xsl:template match="calloutlist">
> - <xsl:value-of select="$git.docbook.dot"/>
> - <xsl:text>sp&#10;</xsl:text>
> - <xsl:apply-templates/>
> - <xsl:text>&#10;</xsl:text>
> -</xsl:template>
> -<xsl:template match="callout">
> - <xsl:value-of select="concat(
> - $git.docbook.backslash,'fB',
> - substring-after(@arearefs,'-'),
> - '. ',$git.docbook.backslash,'fR')"/>
> - <xsl:apply-templates/>
> - <xsl:value-of select="$git.docbook.dot"/>
> - <xsl:text>br&#10;</xsl:text>
> -</xsl:template>
> -
> -</xsl:stylesheet>
> diff --git a/tools/lib/traceevent/Documentation/manpage-bold-literal.xsl b/tools/lib/traceevent/Documentation/manpage-bold-literal.xsl
> deleted file mode 100644
> index 608eb5df6281..000000000000
> --- a/tools/lib/traceevent/Documentation/manpage-bold-literal.xsl
> +++ /dev/null
> @@ -1,17 +0,0 @@
> -<!-- manpage-bold-literal.xsl:
> - special formatting for manpages rendered from asciidoc+docbook -->
> -<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
> - version="1.0">
> -
> -<!-- render literal text as bold (instead of plain or monospace);
> - this makes literal text easier to distinguish in manpages
> - viewed on a tty -->
> -<xsl:template match="literal">
> - <xsl:value-of select="$git.docbook.backslash"/>
> - <xsl:text>fB</xsl:text>
> - <xsl:apply-templates/>
> - <xsl:value-of select="$git.docbook.backslash"/>
> - <xsl:text>fR</xsl:text>
> -</xsl:template>
> -
> -</xsl:stylesheet>
> diff --git a/tools/lib/traceevent/Documentation/manpage-normal.xsl b/tools/lib/traceevent/Documentation/manpage-normal.xsl
> deleted file mode 100644
> index a48f5b11f3dc..000000000000
> --- a/tools/lib/traceevent/Documentation/manpage-normal.xsl
> +++ /dev/null
> @@ -1,13 +0,0 @@
> -<!-- manpage-normal.xsl:
> - special settings for manpages rendered from asciidoc+docbook
> - handles anything we want to keep away from docbook-xsl 1.72.0 -->
> -<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
> - version="1.0">
> -
> -<xsl:import href="manpage-base.xsl"/>
> -
> -<!-- these are the normal values for the roff control characters -->
> -<xsl:param name="git.docbook.backslash">\</xsl:param>
> -<xsl:param name="git.docbook.dot" >.</xsl:param>
> -
> -</xsl:stylesheet>
> diff --git a/tools/lib/traceevent/Documentation/manpage-suppress-sp.xsl b/tools/lib/traceevent/Documentation/manpage-suppress-sp.xsl
> deleted file mode 100644
> index a63c7632a87d..000000000000
> --- a/tools/lib/traceevent/Documentation/manpage-suppress-sp.xsl
> +++ /dev/null
> @@ -1,21 +0,0 @@
> -<!-- manpage-suppress-sp.xsl:
> - special settings for manpages rendered from asciidoc+docbook
> - handles erroneous, inline .sp in manpage output of some
> - versions of docbook-xsl -->
> -<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
> - version="1.0">
> -
> -<!-- attempt to work around spurious .sp at the tail of the line
> - that some versions of docbook stylesheets seem to add -->
> -<xsl:template match="simpara">
> - <xsl:variable name="content">
> - <xsl:apply-templates/>
> - </xsl:variable>
> - <xsl:value-of select="normalize-space($content)"/>
> - <xsl:if test="not(ancestor::authorblurb) and
> - not(ancestor::personblurb)">
> - <xsl:text>&#10;&#10;</xsl:text>
> - </xsl:if>
> -</xsl:template>
> -
> -</xsl:stylesheet>
> diff --git a/tools/lib/traceevent/Makefile b/tools/lib/traceevent/Makefile
> deleted file mode 100644
> index 98dfd4badea3..000000000000
> --- a/tools/lib/traceevent/Makefile
> +++ /dev/null
> @@ -1,300 +0,0 @@
> -# SPDX-License-Identifier: GPL-2.0
> -# trace-cmd version
> -EP_VERSION = 1
> -EP_PATCHLEVEL = 1
> -EP_EXTRAVERSION = 0
> -
> -# file format version
> -FILE_VERSION = 6
> -
> -MAKEFLAGS += --no-print-directory
> -
> -
> -# Makefiles suck: This macro sets a default value of $(2) for the
> -# variable named by $(1), unless the variable has been set by
> -# environment or command line. This is necessary for CC and AR
> -# because make sets default values, so the simpler ?= approach
> -# won't work as expected.
> -define allow-override
> - $(if $(or $(findstring environment,$(origin $(1))),\
> - $(findstring command line,$(origin $(1)))),,\
> - $(eval $(1) = $(2)))
> -endef
> -
> -# Allow setting CC and AR, or setting CROSS_COMPILE as a prefix.
> -$(call allow-override,CC,$(CROSS_COMPILE)gcc)
> -$(call allow-override,AR,$(CROSS_COMPILE)ar)
> -$(call allow-override,NM,$(CROSS_COMPILE)nm)
> -$(call allow-override,PKG_CONFIG,pkg-config)
> -
> -EXT = -std=gnu99
> -INSTALL = install
> -
> -# Use DESTDIR for installing into a different root directory.
> -# This is useful for building a package. The program will be
> -# installed in this directory as if it was the root directory.
> -# Then the build tool can move it later.
> -DESTDIR ?=
> -DESTDIR_SQ = '$(subst ','\'',$(DESTDIR))'
> -
> -LP64 := $(shell echo __LP64__ | ${CC} ${CFLAGS} -E -x c - | tail -n 1)
> -ifeq ($(LP64), 1)
> - libdir_relative_temp = lib64
> -else
> - libdir_relative_temp = lib
> -endif
> -
> -libdir_relative ?= $(libdir_relative_temp)
> -prefix ?= /usr/local
> -libdir = $(prefix)/$(libdir_relative)
> -man_dir = $(prefix)/share/man
> -man_dir_SQ = '$(subst ','\'',$(man_dir))'
> -pkgconfig_dir ?= $(word 1,$(shell $(PKG_CONFIG) \
> - --variable pc_path pkg-config | tr ":" " "))
> -includedir_relative = traceevent
> -includedir = $(prefix)/include/$(includedir_relative)
> -includedir_SQ = '$(subst ','\'',$(includedir))'
> -
> -export man_dir man_dir_SQ INSTALL
> -export DESTDIR DESTDIR_SQ
> -export EVENT_PARSE_VERSION
> -
> -include ../../scripts/Makefile.include
> -
> -# copy a bit from Linux kbuild
> -
> -ifeq ("$(origin V)", "command line")
> - VERBOSE = $(V)
> -endif
> -ifndef VERBOSE
> - VERBOSE = 0
> -endif
> -
> -ifeq ($(srctree),)
> -srctree := $(patsubst %/,%,$(dir $(CURDIR)))
> -srctree := $(patsubst %/,%,$(dir $(srctree)))
> -srctree := $(patsubst %/,%,$(dir $(srctree)))
> -#$(info Determined 'srctree' to be $(srctree))
> -endif
> -
> -export prefix libdir src obj
> -
> -# Shell quotes
> -libdir_SQ = $(subst ','\'',$(libdir))
> -libdir_relative_SQ = $(subst ','\'',$(libdir_relative))
> -
> -CONFIG_INCLUDES =
> -CONFIG_LIBS =
> -CONFIG_FLAGS =
> -
> -VERSION = $(EP_VERSION)
> -PATCHLEVEL = $(EP_PATCHLEVEL)
> -EXTRAVERSION = $(EP_EXTRAVERSION)
> -
> -OBJ = $@
> -N =
> -
> -EVENT_PARSE_VERSION = $(EP_VERSION).$(EP_PATCHLEVEL).$(EP_EXTRAVERSION)
> -
> -LIB_TARGET = libtraceevent.a libtraceevent.so.$(EVENT_PARSE_VERSION)
> -LIB_INSTALL = libtraceevent.a libtraceevent.so*
> -LIB_INSTALL := $(addprefix $(OUTPUT),$(LIB_INSTALL))
> -
> -INCLUDES = -I. -I $(srctree)/tools/include $(CONFIG_INCLUDES)
> -
> -# Set compile option CFLAGS
> -ifdef EXTRA_CFLAGS
> - CFLAGS := $(EXTRA_CFLAGS)
> -else
> - CFLAGS := -g -Wall
> -endif
> -
> -# Append required CFLAGS
> -override CFLAGS += -fPIC
> -override CFLAGS += $(CONFIG_FLAGS) $(INCLUDES) $(PLUGIN_DIR_SQ)
> -override CFLAGS += $(udis86-flags) -D_GNU_SOURCE
> -
> -ifeq ($(VERBOSE),1)
> - Q =
> -else
> - Q = @
> -endif
> -
> -# Disable command line variables (CFLAGS) override from top
> -# level Makefile (perf), otherwise build Makefile will get
> -# the same command line setup.
> -MAKEOVERRIDES=
> -
> -export srctree OUTPUT CC LD CFLAGS V
> -build := -f $(srctree)/tools/build/Makefile.build dir=. obj
> -
> -TE_IN := $(OUTPUT)libtraceevent-in.o
> -LIB_TARGET := $(addprefix $(OUTPUT),$(LIB_TARGET))
> -
> -CMD_TARGETS = $(LIB_TARGET)
> -
> -TARGETS = $(CMD_TARGETS)
> -
> -all: all_cmd plugins
> -
> -all_cmd: $(CMD_TARGETS)
> -
> -$(TE_IN): force
> - $(Q)$(MAKE) $(build)=libtraceevent
> -
> -$(OUTPUT)libtraceevent.so.$(EVENT_PARSE_VERSION): $(TE_IN)
> - $(QUIET_LINK)$(CC) --shared $(LDFLAGS) $^ -Wl,-soname,libtraceevent.so.$(EP_VERSION) -o $@
> - @ln -sf $(@F) $(OUTPUT)libtraceevent.so
> - @ln -sf $(@F) $(OUTPUT)libtraceevent.so.$(EP_VERSION)
> -
> -$(OUTPUT)libtraceevent.a: $(TE_IN)
> - $(QUIET_LINK)$(RM) $@; $(AR) rcs $@ $^
> -
> -$(OUTPUT)%.so: $(OUTPUT)%-in.o
> - $(QUIET_LINK)$(CC) $(CFLAGS) -shared $(LDFLAGS) -nostartfiles -o $@ $^
> -
> -define make_version.h
> - (echo '/* This file is automatically generated. Do not modify. */'; \
> - echo \#define VERSION_CODE $(shell \
> - expr $(VERSION) \* 256 + $(PATCHLEVEL)); \
> - echo '#define EXTRAVERSION ' $(EXTRAVERSION); \
> - echo '#define VERSION_STRING "'$(VERSION).$(PATCHLEVEL).$(EXTRAVERSION)'"'; \
> - echo '#define FILE_VERSION '$(FILE_VERSION); \
> - ) > $1
> -endef
> -
> -define update_version.h
> - ($(call make_version.h, [email protected]); \
> - if [ -r $@ ] && cmp -s $@ [email protected]; then \
> - rm -f [email protected]; \
> - else \
> - echo ' UPDATE $@'; \
> - mv -f [email protected] $@; \
> - fi);
> -endef
> -
> -ep_version.h: force
> - $(Q)$(N)$(call update_version.h)
> -
> -VERSION_FILES = ep_version.h
> -
> -define update_dir
> - (echo $1 > [email protected]; \
> - if [ -r $@ ] && cmp -s $@ [email protected]; then \
> - rm -f [email protected]; \
> - else \
> - echo ' UPDATE $@'; \
> - mv -f [email protected] $@; \
> - fi);
> -endef
> -
> -tags: force
> - $(RM) tags
> - find . -name '*.[ch]' | xargs ctags --extra=+f --c-kinds=+px \
> - --regex-c++='/_PE\(([^,)]*).*/TEP_ERRNO__\1/'
> -
> -TAGS: force
> - $(RM) TAGS
> - find . -name '*.[ch]' | xargs etags \
> - --regex='/_PE(\([^,)]*\).*/TEP_ERRNO__\1/'
> -
> -define do_install_mkdir
> - if [ ! -d '$(DESTDIR_SQ)$1' ]; then \
> - $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$1'; \
> - fi
> -endef
> -
> -define do_install
> - $(call do_install_mkdir,$2); \
> - $(INSTALL) $(if $3,-m $3,) $1 '$(DESTDIR_SQ)$2'
> -endef
> -
> -PKG_CONFIG_SOURCE_FILE = libtraceevent.pc
> -PKG_CONFIG_FILE := $(addprefix $(OUTPUT),$(PKG_CONFIG_SOURCE_FILE))
> -define do_install_pkgconfig_file
> - if [ -n "${pkgconfig_dir}" ]; then \
> - cp -f ${PKG_CONFIG_SOURCE_FILE}.template ${PKG_CONFIG_FILE}; \
> - sed -i "s|INSTALL_PREFIX|${1}|g" ${PKG_CONFIG_FILE}; \
> - sed -i "s|LIB_VERSION|${EVENT_PARSE_VERSION}|g" ${PKG_CONFIG_FILE}; \
> - sed -i "s|LIB_DIR|${libdir}|g" ${PKG_CONFIG_FILE}; \
> - sed -i "s|HEADER_DIR|$(includedir)|g" ${PKG_CONFIG_FILE}; \
> - $(call do_install,$(PKG_CONFIG_FILE),$(pkgconfig_dir),644); \
> - else \
> - (echo Failed to locate pkg-config directory) 1>&2; \
> - fi
> -endef
> -
> -install_lib: all_cmd install_plugins install_headers install_pkgconfig
> - $(call QUIET_INSTALL, $(LIB_TARGET)) \
> - $(call do_install_mkdir,$(libdir_SQ)); \
> - cp -fpR $(LIB_INSTALL) $(DESTDIR)$(libdir_SQ)
> -
> -install_pkgconfig:
> - $(call QUIET_INSTALL, $(PKG_CONFIG_FILE)) \
> - $(call do_install_pkgconfig_file,$(prefix))
> -
> -install_headers:
> - $(call QUIET_INSTALL, traceevent_headers) \
> - $(call do_install,event-parse.h,$(includedir_SQ),644); \
> - $(call do_install,event-utils.h,$(includedir_SQ),644); \
> - $(call do_install,trace-seq.h,$(includedir_SQ),644); \
> - $(call do_install,kbuffer.h,$(includedir_SQ),644);
> -
> -install: install_lib
> -
> -clean: clean_plugins
> - $(call QUIET_CLEAN, libtraceevent) \
> - $(RM) *.o *~ $(TARGETS) *.a *.so $(VERSION_FILES) .*.d .*.cmd; \
> - $(RM) TRACEEVENT-CFLAGS tags TAGS; \
> - $(RM) $(PKG_CONFIG_FILE)
> -
> -PHONY += doc
> -doc:
> - $(call descend,Documentation)
> -
> -PHONY += doc-clean
> -doc-clean:
> - $(call descend,Documentation,clean)
> -
> -PHONY += doc-install
> -doc-install:
> - $(call descend,Documentation,install)
> -
> -PHONY += doc-uninstall
> -doc-uninstall:
> - $(call descend,Documentation,uninstall)
> -
> -PHONY += help
> -help:
> - @echo 'Possible targets:'
> - @echo''
> - @echo ' all - default, compile the library and the'\
> - 'plugins'
> - @echo ' plugins - compile the plugins'
> - @echo ' install - install the library, the plugins,'\
> - 'the header and pkgconfig files'
> - @echo ' clean - clean the library and the plugins object files'
> - @echo ' doc - compile the documentation files - man'\
> - 'and html pages, in the Documentation directory'
> - @echo ' doc-clean - clean the documentation files'
> - @echo ' doc-install - install the man pages'
> - @echo ' doc-uninstall - uninstall the man pages'
> - @echo''
> -
> -PHONY += plugins
> -plugins:
> - $(call descend,plugins)
> -
> -PHONY += install_plugins
> -install_plugins:
> - $(call descend,plugins,install)
> -
> -PHONY += clean_plugins
> -clean_plugins:
> - $(call descend,plugins,clean)
> -
> -force:
> -
> -# Declare the contents of the .PHONY variable as phony. We keep that
> -# information in a variable so we can use it in if_changed and friends.
> -.PHONY: $(PHONY)
> diff --git a/tools/lib/traceevent/event-parse-api.c b/tools/lib/traceevent/event-parse-api.c
> deleted file mode 100644
> index f8361e45d446..000000000000
> --- a/tools/lib/traceevent/event-parse-api.c
> +++ /dev/null
> @@ -1,333 +0,0 @@
> -// SPDX-License-Identifier: LGPL-2.1
> -/*
> - * Copyright (C) 2009, 2010 Red Hat Inc, Steven Rostedt <[email protected]>
> - *
> - */
> -
> -#include "event-parse.h"
> -#include "event-parse-local.h"
> -#include "event-utils.h"
> -
> -/**
> - * tep_get_event - returns the event with the given index
> - * @tep: a handle to the tep_handle
> - * @index: index of the requested event, in the range 0 .. nr_events
> - *
> - * This returns pointer to the element of the events array with the given index
> - * If @tep is NULL, or @index is not in the range 0 .. nr_events, NULL is returned.
> - */
> -struct tep_event *tep_get_event(struct tep_handle *tep, int index)
> -{
> - if (tep && tep->events && index < tep->nr_events)
> - return tep->events[index];
> -
> - return NULL;
> -}
> -
> -/**
> - * tep_get_first_event - returns the first event in the events array
> - * @tep: a handle to the tep_handle
> - *
> - * This returns pointer to the first element of the events array
> - * If @tep is NULL, NULL is returned.
> - */
> -struct tep_event *tep_get_first_event(struct tep_handle *tep)
> -{
> - return tep_get_event(tep, 0);
> -}
> -
> -/**
> - * tep_get_events_count - get the number of defined events
> - * @tep: a handle to the tep_handle
> - *
> - * This returns number of elements in event array
> - * If @tep is NULL, 0 is returned.
> - */
> -int tep_get_events_count(struct tep_handle *tep)
> -{
> - if (tep)
> - return tep->nr_events;
> - return 0;
> -}
> -
> -/**
> - * tep_set_flag - set event parser flag
> - * @tep: a handle to the tep_handle
> - * @flag: flag, or combination of flags to be set
> - * can be any combination from enum tep_flag
> - *
> - * This sets a flag or combination of flags from enum tep_flag
> - */
> -void tep_set_flag(struct tep_handle *tep, int flag)
> -{
> - if (tep)
> - tep->flags |= flag;
> -}
> -
> -/**
> - * tep_clear_flag - clear event parser flag
> - * @tep: a handle to the tep_handle
> - * @flag: flag to be cleared
> - *
> - * This clears a tep flag
> - */
> -void tep_clear_flag(struct tep_handle *tep, enum tep_flag flag)
> -{
> - if (tep)
> - tep->flags &= ~flag;
> -}
> -
> -/**
> - * tep_test_flag - check the state of event parser flag
> - * @tep: a handle to the tep_handle
> - * @flag: flag to be checked
> - *
> - * This returns the state of the requested tep flag.
> - * Returns: true if the flag is set, false otherwise.
> - */
> -bool tep_test_flag(struct tep_handle *tep, enum tep_flag flag)
> -{
> - if (tep)
> - return tep->flags & flag;
> - return false;
> -}
> -
> -__hidden unsigned short data2host2(struct tep_handle *tep, unsigned short data)
> -{
> - unsigned short swap;
> -
> - if (!tep || tep->host_bigendian == tep->file_bigendian)
> - return data;
> -
> - swap = ((data & 0xffULL) << 8) |
> - ((data & (0xffULL << 8)) >> 8);
> -
> - return swap;
> -}
> -
> -__hidden unsigned int data2host4(struct tep_handle *tep, unsigned int data)
> -{
> - unsigned int swap;
> -
> - if (!tep || tep->host_bigendian == tep->file_bigendian)
> - return data;
> -
> - swap = ((data & 0xffULL) << 24) |
> - ((data & (0xffULL << 8)) << 8) |
> - ((data & (0xffULL << 16)) >> 8) |
> - ((data & (0xffULL << 24)) >> 24);
> -
> - return swap;
> -}
> -
> -__hidden unsigned long long
> -data2host8(struct tep_handle *tep, unsigned long long data)
> -{
> - unsigned long long swap;
> -
> - if (!tep || tep->host_bigendian == tep->file_bigendian)
> - return data;
> -
> - swap = ((data & 0xffULL) << 56) |
> - ((data & (0xffULL << 8)) << 40) |
> - ((data & (0xffULL << 16)) << 24) |
> - ((data & (0xffULL << 24)) << 8) |
> - ((data & (0xffULL << 32)) >> 8) |
> - ((data & (0xffULL << 40)) >> 24) |
> - ((data & (0xffULL << 48)) >> 40) |
> - ((data & (0xffULL << 56)) >> 56);
> -
> - return swap;
> -}
> -
> -/**
> - * tep_get_header_page_size - get size of the header page
> - * @tep: a handle to the tep_handle
> - *
> - * This returns size of the header page
> - * If @tep is NULL, 0 is returned.
> - */
> -int tep_get_header_page_size(struct tep_handle *tep)
> -{
> - if (tep)
> - return tep->header_page_size_size;
> - return 0;
> -}
> -
> -/**
> - * tep_get_header_timestamp_size - get size of the timestamp in the header page
> - * @tep: a handle to the tep_handle
> - *
> - * This returns size of the timestamp in the header page
> - * If @tep is NULL, 0 is returned.
> - */
> -int tep_get_header_timestamp_size(struct tep_handle *tep)
> -{
> - if (tep)
> - return tep->header_page_ts_size;
> - return 0;
> -}
> -
> -/**
> - * tep_get_cpus - get the number of CPUs
> - * @tep: a handle to the tep_handle
> - *
> - * This returns the number of CPUs
> - * If @tep is NULL, 0 is returned.
> - */
> -int tep_get_cpus(struct tep_handle *tep)
> -{
> - if (tep)
> - return tep->cpus;
> - return 0;
> -}
> -
> -/**
> - * tep_set_cpus - set the number of CPUs
> - * @tep: a handle to the tep_handle
> - *
> - * This sets the number of CPUs
> - */
> -void tep_set_cpus(struct tep_handle *tep, int cpus)
> -{
> - if (tep)
> - tep->cpus = cpus;
> -}
> -
> -/**
> - * tep_get_long_size - get the size of a long integer on the traced machine
> - * @tep: a handle to the tep_handle
> - *
> - * This returns the size of a long integer on the traced machine
> - * If @tep is NULL, 0 is returned.
> - */
> -int tep_get_long_size(struct tep_handle *tep)
> -{
> - if (tep)
> - return tep->long_size;
> - return 0;
> -}
> -
> -/**
> - * tep_set_long_size - set the size of a long integer on the traced machine
> - * @tep: a handle to the tep_handle
> - * @size: size, in bytes, of a long integer
> - *
> - * This sets the size of a long integer on the traced machine
> - */
> -void tep_set_long_size(struct tep_handle *tep, int long_size)
> -{
> - if (tep)
> - tep->long_size = long_size;
> -}
> -
> -/**
> - * tep_get_page_size - get the size of a memory page on the traced machine
> - * @tep: a handle to the tep_handle
> - *
> - * This returns the size of a memory page on the traced machine
> - * If @tep is NULL, 0 is returned.
> - */
> -int tep_get_page_size(struct tep_handle *tep)
> -{
> - if (tep)
> - return tep->page_size;
> - return 0;
> -}
> -
> -/**
> - * tep_set_page_size - set the size of a memory page on the traced machine
> - * @tep: a handle to the tep_handle
> - * @_page_size: size of a memory page, in bytes
> - *
> - * This sets the size of a memory page on the traced machine
> - */
> -void tep_set_page_size(struct tep_handle *tep, int _page_size)
> -{
> - if (tep)
> - tep->page_size = _page_size;
> -}
> -
> -/**
> - * tep_is_file_bigendian - return the endian of the file
> - * @tep: a handle to the tep_handle
> - *
> - * This returns true if the file is in big endian order
> - * If @tep is NULL, false is returned.
> - */
> -bool tep_is_file_bigendian(struct tep_handle *tep)
> -{
> - if (tep)
> - return (tep->file_bigendian == TEP_BIG_ENDIAN);
> - return false;
> -}
> -
> -/**
> - * tep_set_file_bigendian - set if the file is in big endian order
> - * @tep: a handle to the tep_handle
> - * @endian: non zero, if the file is in big endian order
> - *
> - * This sets if the file is in big endian order
> - */
> -void tep_set_file_bigendian(struct tep_handle *tep, enum tep_endian endian)
> -{
> - if (tep)
> - tep->file_bigendian = endian;
> -}
> -
> -/**
> - * tep_is_local_bigendian - return the endian of the saved local machine
> - * @tep: a handle to the tep_handle
> - *
> - * This returns true if the saved local machine in @tep is big endian.
> - * If @tep is NULL, false is returned.
> - */
> -bool tep_is_local_bigendian(struct tep_handle *tep)
> -{
> - if (tep)
> - return (tep->host_bigendian == TEP_BIG_ENDIAN);
> - return 0;
> -}
> -
> -/**
> - * tep_set_local_bigendian - set the stored local machine endian order
> - * @tep: a handle to the tep_handle
> - * @endian: non zero, if the local host has big endian order
> - *
> - * This sets the endian order for the local machine.
> - */
> -void tep_set_local_bigendian(struct tep_handle *tep, enum tep_endian endian)
> -{
> - if (tep)
> - tep->host_bigendian = endian;
> -}
> -
> -/**
> - * tep_is_old_format - get if an old kernel is used
> - * @tep: a handle to the tep_handle
> - *
> - * This returns true, if an old kernel is used to generate the tracing events or
> - * false if a new kernel is used. Old kernels did not have header page info.
> - * If @tep is NULL, false is returned.
> - */
> -bool tep_is_old_format(struct tep_handle *tep)
> -{
> - if (tep)
> - return tep->old_format;
> - return false;
> -}
> -
> -/**
> - * tep_set_test_filters - set a flag to test a filter string
> - * @tep: a handle to the tep_handle
> - * @test_filters: the new value of the test_filters flag
> - *
> - * This sets a flag to test a filter string. If this flag is set, when
> - * tep_filter_add_filter_str() API as called,it will print the filter string
> - * instead of adding it.
> - */
> -void tep_set_test_filters(struct tep_handle *tep, int test_filters)
> -{
> - if (tep)
> - tep->test_filters = test_filters;
> -}
> diff --git a/tools/lib/traceevent/event-parse-local.h b/tools/lib/traceevent/event-parse-local.h
> deleted file mode 100644
> index fd4bbcfbb849..000000000000
> --- a/tools/lib/traceevent/event-parse-local.h
> +++ /dev/null
> @@ -1,123 +0,0 @@
> -// SPDX-License-Identifier: LGPL-2.1
> -/*
> - * Copyright (C) 2009, 2010 Red Hat Inc, Steven Rostedt <[email protected]>
> - *
> - */
> -
> -#ifndef _PARSE_EVENTS_INT_H
> -#define _PARSE_EVENTS_INT_H
> -
> -struct tep_cmdline;
> -struct cmdline_list;
> -struct func_map;
> -struct func_list;
> -struct event_handler;
> -struct func_resolver;
> -struct tep_plugins_dir;
> -
> -#define __hidden __attribute__((visibility ("hidden")))
> -
> -struct tep_handle {
> - int ref_count;
> -
> - int header_page_ts_offset;
> - int header_page_ts_size;
> - int header_page_size_offset;
> - int header_page_size_size;
> - int header_page_data_offset;
> - int header_page_data_size;
> - int header_page_overwrite;
> -
> - enum tep_endian file_bigendian;
> - enum tep_endian host_bigendian;
> -
> - int old_format;
> -
> - int cpus;
> - int long_size;
> - int page_size;
> -
> - struct tep_cmdline *cmdlines;
> - struct cmdline_list *cmdlist;
> - int cmdline_count;
> -
> - struct func_map *func_map;
> - struct func_resolver *func_resolver;
> - struct func_list *funclist;
> - unsigned int func_count;
> -
> - struct printk_map *printk_map;
> - struct printk_list *printklist;
> - unsigned int printk_count;
> -
> - struct tep_event **events;
> - int nr_events;
> - struct tep_event **sort_events;
> - enum tep_event_sort_type last_type;
> -
> - int type_offset;
> - int type_size;
> -
> - int pid_offset;
> - int pid_size;
> -
> - int pc_offset;
> - int pc_size;
> -
> - int flags_offset;
> - int flags_size;
> -
> - int ld_offset;
> - int ld_size;
> -
> - int test_filters;
> -
> - int flags;
> -
> - struct tep_format_field *bprint_ip_field;
> - struct tep_format_field *bprint_fmt_field;
> - struct tep_format_field *bprint_buf_field;
> -
> - struct event_handler *handlers;
> - struct tep_function_handler *func_handlers;
> -
> - /* cache */
> - struct tep_event *last_event;
> -
> - struct tep_plugins_dir *plugins_dir;
> -};
> -
> -enum tep_print_parse_type {
> - PRINT_FMT_STRING,
> - PRINT_FMT_ARG_DIGIT,
> - PRINT_FMT_ARG_POINTER,
> - PRINT_FMT_ARG_STRING,
> -};
> -
> -struct tep_print_parse {
> - struct tep_print_parse *next;
> -
> - char *format;
> - int ls;
> - enum tep_print_parse_type type;
> - struct tep_print_arg *arg;
> - struct tep_print_arg *len_as_arg;
> -};
> -
> -void free_tep_event(struct tep_event *event);
> -void free_tep_format_field(struct tep_format_field *field);
> -void free_tep_plugin_paths(struct tep_handle *tep);
> -
> -unsigned short data2host2(struct tep_handle *tep, unsigned short data);
> -unsigned int data2host4(struct tep_handle *tep, unsigned int data);
> -unsigned long long data2host8(struct tep_handle *tep, unsigned long long data);
> -
> -/* access to the internal parser */
> -int peek_char(void);
> -void init_input_buf(const char *buf, unsigned long long size);
> -unsigned long long get_input_buf_ptr(void);
> -const char *get_input_buf(void);
> -enum tep_event_type read_token(char **tok);
> -void free_token(char *tok);
> -
> -#endif /* _PARSE_EVENTS_INT_H */
> diff --git a/tools/lib/traceevent/event-parse.c b/tools/lib/traceevent/event-parse.c
> deleted file mode 100644
> index 8e24c4c78c7f..000000000000
> --- a/tools/lib/traceevent/event-parse.c
> +++ /dev/null
> @@ -1,7624 +0,0 @@
> -// SPDX-License-Identifier: LGPL-2.1
> -/*
> - * Copyright (C) 2009, 2010 Red Hat Inc, Steven Rostedt <[email protected]>
> - *
> - *
> - * The parts for function graph printing was taken and modified from the
> - * Linux Kernel that were written by
> - * - Copyright (C) 2009 Frederic Weisbecker,
> - * Frederic Weisbecker gave his permission to relicense the code to
> - * the Lesser General Public License.
> - */
> -#include <inttypes.h>
> -#include <stdio.h>
> -#include <stdlib.h>
> -#include <string.h>
> -#include <stdarg.h>
> -#include <ctype.h>
> -#include <errno.h>
> -#include <stdint.h>
> -#include <limits.h>
> -#include <linux/time64.h>
> -
> -#include <netinet/in.h>
> -#include "event-parse.h"
> -
> -#include "event-parse-local.h"
> -#include "event-utils.h"
> -#include "trace-seq.h"
> -
> -static const char *input_buf;
> -static unsigned long long input_buf_ptr;
> -static unsigned long long input_buf_siz;
> -
> -static int is_flag_field;
> -static int is_symbolic_field;
> -
> -static int show_warning = 1;
> -
> -#define do_warning(fmt, ...) \
> - do { \
> - if (show_warning) \
> - warning(fmt, ##__VA_ARGS__); \
> - } while (0)
> -
> -#define do_warning_event(event, fmt, ...) \
> - do { \
> - if (!show_warning) \
> - continue; \
> - \
> - if (event) \
> - warning("[%s:%s] " fmt, event->system, \
> - event->name, ##__VA_ARGS__); \
> - else \
> - warning(fmt, ##__VA_ARGS__); \
> - } while (0)
> -
> -/**
> - * init_input_buf - init buffer for parsing
> - * @buf: buffer to parse
> - * @size: the size of the buffer
> - *
> - * Initializes the internal buffer that tep_read_token() will parse.
> - */
> -__hidden void init_input_buf(const char *buf, unsigned long long size)
> -{
> - input_buf = buf;
> - input_buf_siz = size;
> - input_buf_ptr = 0;
> -}
> -
> -__hidden const char *get_input_buf(void)
> -{
> - return input_buf;
> -}
> -
> -__hidden unsigned long long get_input_buf_ptr(void)
> -{
> - return input_buf_ptr;
> -}
> -
> -struct event_handler {
> - struct event_handler *next;
> - int id;
> - const char *sys_name;
> - const char *event_name;
> - tep_event_handler_func func;
> - void *context;
> -};
> -
> -struct func_params {
> - struct func_params *next;
> - enum tep_func_arg_type type;
> -};
> -
> -struct tep_function_handler {
> - struct tep_function_handler *next;
> - enum tep_func_arg_type ret_type;
> - char *name;
> - tep_func_handler func;
> - struct func_params *params;
> - int nr_args;
> -};
> -
> -static unsigned long long
> -process_defined_func(struct trace_seq *s, void *data, int size,
> - struct tep_event *event, struct tep_print_arg *arg);
> -
> -static void free_func_handle(struct tep_function_handler *func);
> -
> -void breakpoint(void)
> -{
> - static int x;
> - x++;
> -}
> -
> -static struct tep_print_arg *alloc_arg(void)
> -{
> - return calloc(1, sizeof(struct tep_print_arg));
> -}
> -
> -struct tep_cmdline {
> - char *comm;
> - int pid;
> -};
> -
> -static int cmdline_cmp(const void *a, const void *b)
> -{
> - const struct tep_cmdline *ca = a;
> - const struct tep_cmdline *cb = b;
> -
> - if (ca->pid < cb->pid)
> - return -1;
> - if (ca->pid > cb->pid)
> - return 1;
> -
> - return 0;
> -}
> -
> -/* Looking for where to place the key */
> -static int cmdline_slot_cmp(const void *a, const void *b)
> -{
> - const struct tep_cmdline *ca = a;
> - const struct tep_cmdline *cb = b;
> - const struct tep_cmdline *cb1 = cb + 1;
> -
> - if (ca->pid < cb->pid)
> - return -1;
> -
> - if (ca->pid > cb->pid) {
> - if (ca->pid <= cb1->pid)
> - return 0;
> - return 1;
> - }
> -
> - return 0;
> -}
> -
> -struct cmdline_list {
> - struct cmdline_list *next;
> - char *comm;
> - int pid;
> -};
> -
> -static int cmdline_init(struct tep_handle *tep)
> -{
> - struct cmdline_list *cmdlist = tep->cmdlist;
> - struct cmdline_list *item;
> - struct tep_cmdline *cmdlines;
> - int i;
> -
> - cmdlines = malloc(sizeof(*cmdlines) * tep->cmdline_count);
> - if (!cmdlines)
> - return -1;
> -
> - i = 0;
> - while (cmdlist) {
> - cmdlines[i].pid = cmdlist->pid;
> - cmdlines[i].comm = cmdlist->comm;
> - i++;
> - item = cmdlist;
> - cmdlist = cmdlist->next;
> - free(item);
> - }
> -
> - qsort(cmdlines, tep->cmdline_count, sizeof(*cmdlines), cmdline_cmp);
> -
> - tep->cmdlines = cmdlines;
> - tep->cmdlist = NULL;
> -
> - return 0;
> -}
> -
> -static const char *find_cmdline(struct tep_handle *tep, int pid)
> -{
> - const struct tep_cmdline *comm;
> - struct tep_cmdline key;
> -
> - if (!pid)
> - return "<idle>";
> -
> - if (!tep->cmdlines && cmdline_init(tep))
> - return "<not enough memory for cmdlines!>";
> -
> - key.pid = pid;
> -
> - comm = bsearch(&key, tep->cmdlines, tep->cmdline_count,
> - sizeof(*tep->cmdlines), cmdline_cmp);
> -
> - if (comm)
> - return comm->comm;
> - return "<...>";
> -}
> -
> -/**
> - * tep_is_pid_registered - return if a pid has a cmdline registered
> - * @tep: a handle to the trace event parser context
> - * @pid: The pid to check if it has a cmdline registered with.
> - *
> - * Returns true if the pid has a cmdline mapped to it
> - * false otherwise.
> - */
> -bool tep_is_pid_registered(struct tep_handle *tep, int pid)
> -{
> - const struct tep_cmdline *comm;
> - struct tep_cmdline key;
> -
> - if (!pid)
> - return true;
> -
> - if (!tep->cmdlines && cmdline_init(tep))
> - return false;
> -
> - key.pid = pid;
> -
> - comm = bsearch(&key, tep->cmdlines, tep->cmdline_count,
> - sizeof(*tep->cmdlines), cmdline_cmp);
> -
> - if (comm)
> - return true;
> - return false;
> -}
> -
> -/*
> - * If the command lines have been converted to an array, then
> - * we must add this pid. This is much slower than when cmdlines
> - * are added before the array is initialized.
> - */
> -static int add_new_comm(struct tep_handle *tep,
> - const char *comm, int pid, bool override)
> -{
> - struct tep_cmdline *cmdlines = tep->cmdlines;
> - struct tep_cmdline *cmdline;
> - struct tep_cmdline key;
> - char *new_comm;
> - int cnt;
> -
> - if (!pid)
> - return 0;
> -
> - /* avoid duplicates */
> - key.pid = pid;
> -
> - cmdline = bsearch(&key, tep->cmdlines, tep->cmdline_count,
> - sizeof(*tep->cmdlines), cmdline_cmp);
> - if (cmdline) {
> - if (!override) {
> - errno = EEXIST;
> - return -1;
> - }
> - new_comm = strdup(comm);
> - if (!new_comm) {
> - errno = ENOMEM;
> - return -1;
> - }
> - free(cmdline->comm);
> - cmdline->comm = new_comm;
> -
> - return 0;
> - }
> -
> - cmdlines = realloc(cmdlines, sizeof(*cmdlines) * (tep->cmdline_count + 1));
> - if (!cmdlines) {
> - errno = ENOMEM;
> - return -1;
> - }
> - tep->cmdlines = cmdlines;
> -
> - key.comm = strdup(comm);
> - if (!key.comm) {
> - errno = ENOMEM;
> - return -1;
> - }
> -
> - if (!tep->cmdline_count) {
> - /* no entries yet */
> - tep->cmdlines[0] = key;
> - tep->cmdline_count++;
> - return 0;
> - }
> -
> - /* Now find where we want to store the new cmdline */
> - cmdline = bsearch(&key, tep->cmdlines, tep->cmdline_count - 1,
> - sizeof(*tep->cmdlines), cmdline_slot_cmp);
> -
> - cnt = tep->cmdline_count;
> - if (cmdline) {
> - /* cmdline points to the one before the spot we want */
> - cmdline++;
> - cnt -= cmdline - tep->cmdlines;
> -
> - } else {
> - /* The new entry is either before or after the list */
> - if (key.pid > tep->cmdlines[tep->cmdline_count - 1].pid) {
> - tep->cmdlines[tep->cmdline_count++] = key;
> - return 0;
> - }
> - cmdline = &tep->cmdlines[0];
> - }
> - memmove(cmdline + 1, cmdline, (cnt * sizeof(*cmdline)));
> - *cmdline = key;
> -
> - tep->cmdline_count++;
> -
> - return 0;
> -}
> -
> -static int _tep_register_comm(struct tep_handle *tep,
> - const char *comm, int pid, bool override)
> -{
> - struct cmdline_list *item;
> -
> - if (tep->cmdlines)
> - return add_new_comm(tep, comm, pid, override);
> -
> - item = malloc(sizeof(*item));
> - if (!item)
> - return -1;
> -
> - if (comm)
> - item->comm = strdup(comm);
> - else
> - item->comm = strdup("<...>");
> - if (!item->comm) {
> - free(item);
> - return -1;
> - }
> - item->pid = pid;
> - item->next = tep->cmdlist;
> -
> - tep->cmdlist = item;
> - tep->cmdline_count++;
> -
> - return 0;
> -}
> -
> -/**
> - * tep_register_comm - register a pid / comm mapping
> - * @tep: a handle to the trace event parser context
> - * @comm: the command line to register
> - * @pid: the pid to map the command line to
> - *
> - * This adds a mapping to search for command line names with
> - * a given pid. The comm is duplicated. If a command with the same pid
> - * already exist, -1 is returned and errno is set to EEXIST
> - */
> -int tep_register_comm(struct tep_handle *tep, const char *comm, int pid)
> -{
> - return _tep_register_comm(tep, comm, pid, false);
> -}
> -
> -/**
> - * tep_override_comm - register a pid / comm mapping
> - * @tep: a handle to the trace event parser context
> - * @comm: the command line to register
> - * @pid: the pid to map the command line to
> - *
> - * This adds a mapping to search for command line names with
> - * a given pid. The comm is duplicated. If a command with the same pid
> - * already exist, the command string is udapted with the new one
> - */
> -int tep_override_comm(struct tep_handle *tep, const char *comm, int pid)
> -{
> - if (!tep->cmdlines && cmdline_init(tep)) {
> - errno = ENOMEM;
> - return -1;
> - }
> - return _tep_register_comm(tep, comm, pid, true);
> -}
> -
> -struct func_map {
> - unsigned long long addr;
> - char *func;
> - char *mod;
> -};
> -
> -struct func_list {
> - struct func_list *next;
> - unsigned long long addr;
> - char *func;
> - char *mod;
> -};
> -
> -static int func_cmp(const void *a, const void *b)
> -{
> - const struct func_map *fa = a;
> - const struct func_map *fb = b;
> -
> - if (fa->addr < fb->addr)
> - return -1;
> - if (fa->addr > fb->addr)
> - return 1;
> -
> - return 0;
> -}
> -
> -/*
> - * We are searching for a record in between, not an exact
> - * match.
> - */
> -static int func_bcmp(const void *a, const void *b)
> -{
> - const struct func_map *fa = a;
> - const struct func_map *fb = b;
> -
> - if ((fa->addr == fb->addr) ||
> -
> - (fa->addr > fb->addr &&
> - fa->addr < (fb+1)->addr))
> - return 0;
> -
> - if (fa->addr < fb->addr)
> - return -1;
> -
> - return 1;
> -}
> -
> -static int func_map_init(struct tep_handle *tep)
> -{
> - struct func_list *funclist;
> - struct func_list *item;
> - struct func_map *func_map;
> - int i;
> -
> - func_map = malloc(sizeof(*func_map) * (tep->func_count + 1));
> - if (!func_map)
> - return -1;
> -
> - funclist = tep->funclist;
> -
> - i = 0;
> - while (funclist) {
> - func_map[i].func = funclist->func;
> - func_map[i].addr = funclist->addr;
> - func_map[i].mod = funclist->mod;
> - i++;
> - item = funclist;
> - funclist = funclist->next;
> - free(item);
> - }
> -
> - qsort(func_map, tep->func_count, sizeof(*func_map), func_cmp);
> -
> - /*
> - * Add a special record at the end.
> - */
> - func_map[tep->func_count].func = NULL;
> - func_map[tep->func_count].addr = 0;
> - func_map[tep->func_count].mod = NULL;
> -
> - tep->func_map = func_map;
> - tep->funclist = NULL;
> -
> - return 0;
> -}
> -
> -static struct func_map *
> -__find_func(struct tep_handle *tep, unsigned long long addr)
> -{
> - struct func_map *func;
> - struct func_map key;
> -
> - if (!tep->func_map)
> - func_map_init(tep);
> -
> - key.addr = addr;
> -
> - func = bsearch(&key, tep->func_map, tep->func_count,
> - sizeof(*tep->func_map), func_bcmp);
> -
> - return func;
> -}
> -
> -struct func_resolver {
> - tep_func_resolver_t *func;
> - void *priv;
> - struct func_map map;
> -};
> -
> -/**
> - * tep_set_function_resolver - set an alternative function resolver
> - * @tep: a handle to the trace event parser context
> - * @resolver: function to be used
> - * @priv: resolver function private state.
> - *
> - * Some tools may have already a way to resolve kernel functions, allow them to
> - * keep using it instead of duplicating all the entries inside tep->funclist.
> - */
> -int tep_set_function_resolver(struct tep_handle *tep,
> - tep_func_resolver_t *func, void *priv)
> -{
> - struct func_resolver *resolver = malloc(sizeof(*resolver));
> -
> - if (resolver == NULL)
> - return -1;
> -
> - resolver->func = func;
> - resolver->priv = priv;
> -
> - free(tep->func_resolver);
> - tep->func_resolver = resolver;
> -
> - return 0;
> -}
> -
> -/**
> - * tep_reset_function_resolver - reset alternative function resolver
> - * @tep: a handle to the trace event parser context
> - *
> - * Stop using whatever alternative resolver was set, use the default
> - * one instead.
> - */
> -void tep_reset_function_resolver(struct tep_handle *tep)
> -{
> - free(tep->func_resolver);
> - tep->func_resolver = NULL;
> -}
> -
> -static struct func_map *
> -find_func(struct tep_handle *tep, unsigned long long addr)
> -{
> - struct func_map *map;
> -
> - if (!tep->func_resolver)
> - return __find_func(tep, addr);
> -
> - map = &tep->func_resolver->map;
> - map->mod = NULL;
> - map->addr = addr;
> - map->func = tep->func_resolver->func(tep->func_resolver->priv,
> - &map->addr, &map->mod);
> - if (map->func == NULL)
> - return NULL;
> -
> - return map;
> -}
> -
> -/**
> - * tep_find_function - find a function by a given address
> - * @tep: a handle to the trace event parser context
> - * @addr: the address to find the function with
> - *
> - * Returns a pointer to the function stored that has the given
> - * address. Note, the address does not have to be exact, it
> - * will select the function that would contain the address.
> - */
> -const char *tep_find_function(struct tep_handle *tep, unsigned long long addr)
> -{
> - struct func_map *map;
> -
> - map = find_func(tep, addr);
> - if (!map)
> - return NULL;
> -
> - return map->func;
> -}
> -
> -/**
> - * tep_find_function_address - find a function address by a given address
> - * @tep: a handle to the trace event parser context
> - * @addr: the address to find the function with
> - *
> - * Returns the address the function starts at. This can be used in
> - * conjunction with tep_find_function to print both the function
> - * name and the function offset.
> - */
> -unsigned long long
> -tep_find_function_address(struct tep_handle *tep, unsigned long long addr)
> -{
> - struct func_map *map;
> -
> - map = find_func(tep, addr);
> - if (!map)
> - return 0;
> -
> - return map->addr;
> -}
> -
> -/**
> - * tep_register_function - register a function with a given address
> - * @tep: a handle to the trace event parser context
> - * @function: the function name to register
> - * @addr: the address the function starts at
> - * @mod: the kernel module the function may be in (NULL for none)
> - *
> - * This registers a function name with an address and module.
> - * The @func passed in is duplicated.
> - */
> -int tep_register_function(struct tep_handle *tep, char *func,
> - unsigned long long addr, char *mod)
> -{
> - struct func_list *item = malloc(sizeof(*item));
> -
> - if (!item)
> - return -1;
> -
> - item->next = tep->funclist;
> - item->func = strdup(func);
> - if (!item->func)
> - goto out_free;
> -
> - if (mod) {
> - item->mod = strdup(mod);
> - if (!item->mod)
> - goto out_free_func;
> - } else
> - item->mod = NULL;
> - item->addr = addr;
> -
> - tep->funclist = item;
> - tep->func_count++;
> -
> - return 0;
> -
> -out_free_func:
> - free(item->func);
> - item->func = NULL;
> -out_free:
> - free(item);
> - errno = ENOMEM;
> - return -1;
> -}
> -
> -/**
> - * tep_print_funcs - print out the stored functions
> - * @tep: a handle to the trace event parser context
> - *
> - * This prints out the stored functions.
> - */
> -void tep_print_funcs(struct tep_handle *tep)
> -{
> - int i;
> -
> - if (!tep->func_map)
> - func_map_init(tep);
> -
> - for (i = 0; i < (int)tep->func_count; i++) {
> - printf("%016llx %s",
> - tep->func_map[i].addr,
> - tep->func_map[i].func);
> - if (tep->func_map[i].mod)
> - printf(" [%s]\n", tep->func_map[i].mod);
> - else
> - printf("\n");
> - }
> -}
> -
> -struct printk_map {
> - unsigned long long addr;
> - char *printk;
> -};
> -
> -struct printk_list {
> - struct printk_list *next;
> - unsigned long long addr;
> - char *printk;
> -};
> -
> -static int printk_cmp(const void *a, const void *b)
> -{
> - const struct printk_map *pa = a;
> - const struct printk_map *pb = b;
> -
> - if (pa->addr < pb->addr)
> - return -1;
> - if (pa->addr > pb->addr)
> - return 1;
> -
> - return 0;
> -}
> -
> -static int printk_map_init(struct tep_handle *tep)
> -{
> - struct printk_list *printklist;
> - struct printk_list *item;
> - struct printk_map *printk_map;
> - int i;
> -
> - printk_map = malloc(sizeof(*printk_map) * (tep->printk_count + 1));
> - if (!printk_map)
> - return -1;
> -
> - printklist = tep->printklist;
> -
> - i = 0;
> - while (printklist) {
> - printk_map[i].printk = printklist->printk;
> - printk_map[i].addr = printklist->addr;
> - i++;
> - item = printklist;
> - printklist = printklist->next;
> - free(item);
> - }
> -
> - qsort(printk_map, tep->printk_count, sizeof(*printk_map), printk_cmp);
> -
> - tep->printk_map = printk_map;
> - tep->printklist = NULL;
> -
> - return 0;
> -}
> -
> -static struct printk_map *
> -find_printk(struct tep_handle *tep, unsigned long long addr)
> -{
> - struct printk_map *printk;
> - struct printk_map key;
> -
> - if (!tep->printk_map && printk_map_init(tep))
> - return NULL;
> -
> - key.addr = addr;
> -
> - printk = bsearch(&key, tep->printk_map, tep->printk_count,
> - sizeof(*tep->printk_map), printk_cmp);
> -
> - return printk;
> -}
> -
> -/**
> - * tep_register_print_string - register a string by its address
> - * @tep: a handle to the trace event parser context
> - * @fmt: the string format to register
> - * @addr: the address the string was located at
> - *
> - * This registers a string by the address it was stored in the kernel.
> - * The @fmt passed in is duplicated.
> - */
> -int tep_register_print_string(struct tep_handle *tep, const char *fmt,
> - unsigned long long addr)
> -{
> - struct printk_list *item = malloc(sizeof(*item));
> - char *p;
> -
> - if (!item)
> - return -1;
> -
> - item->next = tep->printklist;
> - item->addr = addr;
> -
> - /* Strip off quotes and '\n' from the end */
> - if (fmt[0] == '"')
> - fmt++;
> - item->printk = strdup(fmt);
> - if (!item->printk)
> - goto out_free;
> -
> - p = item->printk + strlen(item->printk) - 1;
> - if (*p == '"')
> - *p = 0;
> -
> - p -= 2;
> - if (strcmp(p, "\\n") == 0)
> - *p = 0;
> -
> - tep->printklist = item;
> - tep->printk_count++;
> -
> - return 0;
> -
> -out_free:
> - free(item);
> - errno = ENOMEM;
> - return -1;
> -}
> -
> -/**
> - * tep_print_printk - print out the stored strings
> - * @tep: a handle to the trace event parser context
> - *
> - * This prints the string formats that were stored.
> - */
> -void tep_print_printk(struct tep_handle *tep)
> -{
> - int i;
> -
> - if (!tep->printk_map)
> - printk_map_init(tep);
> -
> - for (i = 0; i < (int)tep->printk_count; i++) {
> - printf("%016llx %s\n",
> - tep->printk_map[i].addr,
> - tep->printk_map[i].printk);
> - }
> -}
> -
> -static struct tep_event *alloc_event(void)
> -{
> - return calloc(1, sizeof(struct tep_event));
> -}
> -
> -static int add_event(struct tep_handle *tep, struct tep_event *event)
> -{
> - int i;
> - struct tep_event **events = realloc(tep->events, sizeof(event) *
> - (tep->nr_events + 1));
> - if (!events)
> - return -1;
> -
> - tep->events = events;
> -
> - for (i = 0; i < tep->nr_events; i++) {
> - if (tep->events[i]->id > event->id)
> - break;
> - }
> - if (i < tep->nr_events)
> - memmove(&tep->events[i + 1],
> - &tep->events[i],
> - sizeof(event) * (tep->nr_events - i));
> -
> - tep->events[i] = event;
> - tep->nr_events++;
> -
> - event->tep = tep;
> -
> - return 0;
> -}
> -
> -static int event_item_type(enum tep_event_type type)
> -{
> - switch (type) {
> - case TEP_EVENT_ITEM ... TEP_EVENT_SQUOTE:
> - return 1;
> - case TEP_EVENT_ERROR ... TEP_EVENT_DELIM:
> - default:
> - return 0;
> - }
> -}
> -
> -static void free_flag_sym(struct tep_print_flag_sym *fsym)
> -{
> - struct tep_print_flag_sym *next;
> -
> - while (fsym) {
> - next = fsym->next;
> - free(fsym->value);
> - free(fsym->str);
> - free(fsym);
> - fsym = next;
> - }
> -}
> -
> -static void free_arg(struct tep_print_arg *arg)
> -{
> - struct tep_print_arg *farg;
> -
> - if (!arg)
> - return;
> -
> - switch (arg->type) {
> - case TEP_PRINT_ATOM:
> - free(arg->atom.atom);
> - break;
> - case TEP_PRINT_FIELD:
> - free(arg->field.name);
> - break;
> - case TEP_PRINT_FLAGS:
> - free_arg(arg->flags.field);
> - free(arg->flags.delim);
> - free_flag_sym(arg->flags.flags);
> - break;
> - case TEP_PRINT_SYMBOL:
> - free_arg(arg->symbol.field);
> - free_flag_sym(arg->symbol.symbols);
> - break;
> - case TEP_PRINT_HEX:
> - case TEP_PRINT_HEX_STR:
> - free_arg(arg->hex.field);
> - free_arg(arg->hex.size);
> - break;
> - case TEP_PRINT_INT_ARRAY:
> - free_arg(arg->int_array.field);
> - free_arg(arg->int_array.count);
> - free_arg(arg->int_array.el_size);
> - break;
> - case TEP_PRINT_TYPE:
> - free(arg->typecast.type);
> - free_arg(arg->typecast.item);
> - break;
> - case TEP_PRINT_STRING:
> - case TEP_PRINT_BSTRING:
> - free(arg->string.string);
> - break;
> - case TEP_PRINT_BITMASK:
> - free(arg->bitmask.bitmask);
> - break;
> - case TEP_PRINT_DYNAMIC_ARRAY:
> - case TEP_PRINT_DYNAMIC_ARRAY_LEN:
> - free(arg->dynarray.index);
> - break;
> - case TEP_PRINT_OP:
> - free(arg->op.op);
> - free_arg(arg->op.left);
> - free_arg(arg->op.right);
> - break;
> - case TEP_PRINT_FUNC:
> - while (arg->func.args) {
> - farg = arg->func.args;
> - arg->func.args = farg->next;
> - free_arg(farg);
> - }
> - break;
> -
> - case TEP_PRINT_NULL:
> - default:
> - break;
> - }
> -
> - free(arg);
> -}
> -
> -static enum tep_event_type get_type(int ch)
> -{
> - if (ch == '\n')
> - return TEP_EVENT_NEWLINE;
> - if (isspace(ch))
> - return TEP_EVENT_SPACE;
> - if (isalnum(ch) || ch == '_')
> - return TEP_EVENT_ITEM;
> - if (ch == '\'')
> - return TEP_EVENT_SQUOTE;
> - if (ch == '"')
> - return TEP_EVENT_DQUOTE;
> - if (!isprint(ch))
> - return TEP_EVENT_NONE;
> - if (ch == '(' || ch == ')' || ch == ',')
> - return TEP_EVENT_DELIM;
> -
> - return TEP_EVENT_OP;
> -}
> -
> -static int __read_char(void)
> -{
> - if (input_buf_ptr >= input_buf_siz)
> - return -1;
> -
> - return input_buf[input_buf_ptr++];
> -}
> -
> -/**
> - * peek_char - peek at the next character that will be read
> - *
> - * Returns the next character read, or -1 if end of buffer.
> - */
> -__hidden int peek_char(void)
> -{
> - if (input_buf_ptr >= input_buf_siz)
> - return -1;
> -
> - return input_buf[input_buf_ptr];
> -}
> -
> -static int extend_token(char **tok, char *buf, int size)
> -{
> - char *newtok = realloc(*tok, size);
> -
> - if (!newtok) {
> - free(*tok);
> - *tok = NULL;
> - return -1;
> - }
> -
> - if (!*tok)
> - strcpy(newtok, buf);
> - else
> - strcat(newtok, buf);
> - *tok = newtok;
> -
> - return 0;
> -}
> -
> -static enum tep_event_type force_token(const char *str, char **tok);
> -
> -static enum tep_event_type __read_token(char **tok)
> -{
> - char buf[BUFSIZ];
> - int ch, last_ch, quote_ch, next_ch;
> - int i = 0;
> - int tok_size = 0;
> - enum tep_event_type type;
> -
> - *tok = NULL;
> -
> -
> - ch = __read_char();
> - if (ch < 0)
> - return TEP_EVENT_NONE;
> -
> - type = get_type(ch);
> - if (type == TEP_EVENT_NONE)
> - return type;
> -
> - buf[i++] = ch;
> -
> - switch (type) {
> - case TEP_EVENT_NEWLINE:
> - case TEP_EVENT_DELIM:
> - if (asprintf(tok, "%c", ch) < 0)
> - return TEP_EVENT_ERROR;
> -
> - return type;
> -
> - case TEP_EVENT_OP:
> - switch (ch) {
> - case '-':
> - next_ch = peek_char();
> - if (next_ch == '>') {
> - buf[i++] = __read_char();
> - break;
> - }
> - /* fall through */
> - case '+':
> - case '|':
> - case '&':
> - case '>':
> - case '<':
> - last_ch = ch;
> - ch = peek_char();
> - if (ch != last_ch)
> - goto test_equal;
> - buf[i++] = __read_char();
> - switch (last_ch) {
> - case '>':
> - case '<':
> - goto test_equal;
> - default:
> - break;
> - }
> - break;
> - case '!':
> - case '=':
> - goto test_equal;
> - default: /* what should we do instead? */
> - break;
> - }
> - buf[i] = 0;
> - *tok = strdup(buf);
> - return type;
> -
> - test_equal:
> - ch = peek_char();
> - if (ch == '=')
> - buf[i++] = __read_char();
> - goto out;
> -
> - case TEP_EVENT_DQUOTE:
> - case TEP_EVENT_SQUOTE:
> - /* don't keep quotes */
> - i--;
> - quote_ch = ch;
> - last_ch = 0;
> - concat:
> - do {
> - if (i == (BUFSIZ - 1)) {
> - buf[i] = 0;
> - tok_size += BUFSIZ;
> -
> - if (extend_token(tok, buf, tok_size) < 0)
> - return TEP_EVENT_NONE;
> - i = 0;
> - }
> - last_ch = ch;
> - ch = __read_char();
> - buf[i++] = ch;
> - /* the '\' '\' will cancel itself */
> - if (ch == '\\' && last_ch == '\\')
> - last_ch = 0;
> - } while (ch != quote_ch || last_ch == '\\');
> - /* remove the last quote */
> - i--;
> -
> - /*
> - * For strings (double quotes) check the next token.
> - * If it is another string, concatinate the two.
> - */
> - if (type == TEP_EVENT_DQUOTE) {
> - unsigned long long save_input_buf_ptr = input_buf_ptr;
> -
> - do {
> - ch = __read_char();
> - } while (isspace(ch));
> - if (ch == '"')
> - goto concat;
> - input_buf_ptr = save_input_buf_ptr;
> - }
> -
> - goto out;
> -
> - case TEP_EVENT_ERROR ... TEP_EVENT_SPACE:
> - case TEP_EVENT_ITEM:
> - default:
> - break;
> - }
> -
> - while (get_type(peek_char()) == type) {
> - if (i == (BUFSIZ - 1)) {
> - buf[i] = 0;
> - tok_size += BUFSIZ;
> -
> - if (extend_token(tok, buf, tok_size) < 0)
> - return TEP_EVENT_NONE;
> - i = 0;
> - }
> - ch = __read_char();
> - buf[i++] = ch;
> - }
> -
> - out:
> - buf[i] = 0;
> - if (extend_token(tok, buf, tok_size + i + 1) < 0)
> - return TEP_EVENT_NONE;
> -
> - if (type == TEP_EVENT_ITEM) {
> - /*
> - * Older versions of the kernel has a bug that
> - * creates invalid symbols and will break the mac80211
> - * parsing. This is a work around to that bug.
> - *
> - * See Linux kernel commit:
> - * 811cb50baf63461ce0bdb234927046131fc7fa8b
> - */
> - if (strcmp(*tok, "LOCAL_PR_FMT") == 0) {
> - free(*tok);
> - *tok = NULL;
> - return force_token("\"%s\" ", tok);
> - } else if (strcmp(*tok, "STA_PR_FMT") == 0) {
> - free(*tok);
> - *tok = NULL;
> - return force_token("\" sta:%pM\" ", tok);
> - } else if (strcmp(*tok, "VIF_PR_FMT") == 0) {
> - free(*tok);
> - *tok = NULL;
> - return force_token("\" vif:%p(%d)\" ", tok);
> - }
> - }
> -
> - return type;
> -}
> -
> -static enum tep_event_type force_token(const char *str, char **tok)
> -{
> - const char *save_input_buf;
> - unsigned long long save_input_buf_ptr;
> - unsigned long long save_input_buf_siz;
> - enum tep_event_type type;
> -
> - /* save off the current input pointers */
> - save_input_buf = input_buf;
> - save_input_buf_ptr = input_buf_ptr;
> - save_input_buf_siz = input_buf_siz;
> -
> - init_input_buf(str, strlen(str));
> -
> - type = __read_token(tok);
> -
> - /* reset back to original token */
> - input_buf = save_input_buf;
> - input_buf_ptr = save_input_buf_ptr;
> - input_buf_siz = save_input_buf_siz;
> -
> - return type;
> -}
> -
> -/**
> - * free_token - free a token returned by tep_read_token
> - * @token: the token to free
> - */
> -__hidden void free_token(char *tok)
> -{
> - if (tok)
> - free(tok);
> -}
> -
> -/**
> - * read_token - access to utilities to use the tep parser
> - * @tok: The token to return
> - *
> - * This will parse tokens from the string given by
> - * tep_init_data().
> - *
> - * Returns the token type.
> - */
> -__hidden enum tep_event_type read_token(char **tok)
> -{
> - enum tep_event_type type;
> -
> - for (;;) {
> - type = __read_token(tok);
> - if (type != TEP_EVENT_SPACE)
> - return type;
> -
> - free_token(*tok);
> - }
> -
> - /* not reached */
> - *tok = NULL;
> - return TEP_EVENT_NONE;
> -}
> -
> -/* no newline */
> -static enum tep_event_type read_token_item(char **tok)
> -{
> - enum tep_event_type type;
> -
> - for (;;) {
> - type = __read_token(tok);
> - if (type != TEP_EVENT_SPACE && type != TEP_EVENT_NEWLINE)
> - return type;
> - free_token(*tok);
> - *tok = NULL;
> - }
> -
> - /* not reached */
> - *tok = NULL;
> - return TEP_EVENT_NONE;
> -}
> -
> -static int test_type(enum tep_event_type type, enum tep_event_type expect)
> -{
> - if (type != expect) {
> - do_warning("Error: expected type %d but read %d",
> - expect, type);
> - return -1;
> - }
> - return 0;
> -}
> -
> -static int test_type_token(enum tep_event_type type, const char *token,
> - enum tep_event_type expect, const char *expect_tok)
> -{
> - if (type != expect) {
> - do_warning("Error: expected type %d but read %d",
> - expect, type);
> - return -1;
> - }
> -
> - if (strcmp(token, expect_tok) != 0) {
> - do_warning("Error: expected '%s' but read '%s'",
> - expect_tok, token);
> - return -1;
> - }
> - return 0;
> -}
> -
> -static int __read_expect_type(enum tep_event_type expect, char **tok, int newline_ok)
> -{
> - enum tep_event_type type;
> -
> - if (newline_ok)
> - type = read_token(tok);
> - else
> - type = read_token_item(tok);
> - return test_type(type, expect);
> -}
> -
> -static int read_expect_type(enum tep_event_type expect, char **tok)
> -{
> - return __read_expect_type(expect, tok, 1);
> -}
> -
> -static int __read_expected(enum tep_event_type expect, const char *str,
> - int newline_ok)
> -{
> - enum tep_event_type type;
> - char *token;
> - int ret;
> -
> - if (newline_ok)
> - type = read_token(&token);
> - else
> - type = read_token_item(&token);
> -
> - ret = test_type_token(type, token, expect, str);
> -
> - free_token(token);
> -
> - return ret;
> -}
> -
> -static int read_expected(enum tep_event_type expect, const char *str)
> -{
> - return __read_expected(expect, str, 1);
> -}
> -
> -static int read_expected_item(enum tep_event_type expect, const char *str)
> -{
> - return __read_expected(expect, str, 0);
> -}
> -
> -static char *event_read_name(void)
> -{
> - char *token;
> -
> - if (read_expected(TEP_EVENT_ITEM, "name") < 0)
> - return NULL;
> -
> - if (read_expected(TEP_EVENT_OP, ":") < 0)
> - return NULL;
> -
> - if (read_expect_type(TEP_EVENT_ITEM, &token) < 0)
> - goto fail;
> -
> - return token;
> -
> - fail:
> - free_token(token);
> - return NULL;
> -}
> -
> -static int event_read_id(void)
> -{
> - char *token;
> - int id;
> -
> - if (read_expected_item(TEP_EVENT_ITEM, "ID") < 0)
> - return -1;
> -
> - if (read_expected(TEP_EVENT_OP, ":") < 0)
> - return -1;
> -
> - if (read_expect_type(TEP_EVENT_ITEM, &token) < 0)
> - goto fail;
> -
> - id = strtoul(token, NULL, 0);
> - free_token(token);
> - return id;
> -
> - fail:
> - free_token(token);
> - return -1;
> -}
> -
> -static int field_is_string(struct tep_format_field *field)
> -{
> - if ((field->flags & TEP_FIELD_IS_ARRAY) &&
> - (strstr(field->type, "char") || strstr(field->type, "u8") ||
> - strstr(field->type, "s8")))
> - return 1;
> -
> - return 0;
> -}
> -
> -static int field_is_dynamic(struct tep_format_field *field)
> -{
> - if (strncmp(field->type, "__data_loc", 10) == 0)
> - return 1;
> -
> - return 0;
> -}
> -
> -static int field_is_relative_dynamic(struct tep_format_field *field)
> -{
> - if (strncmp(field->type, "__rel_loc", 9) == 0)
> - return 1;
> -
> - return 0;
> -}
> -
> -static int field_is_long(struct tep_format_field *field)
> -{
> - /* includes long long */
> - if (strstr(field->type, "long"))
> - return 1;
> -
> - return 0;
> -}
> -
> -static unsigned int type_size(const char *name)
> -{
> - /* This covers all TEP_FIELD_IS_STRING types. */
> - static struct {
> - const char *type;
> - unsigned int size;
> - } table[] = {
> - { "u8", 1 },
> - { "u16", 2 },
> - { "u32", 4 },
> - { "u64", 8 },
> - { "s8", 1 },
> - { "s16", 2 },
> - { "s32", 4 },
> - { "s64", 8 },
> - { "char", 1 },
> - { },
> - };
> - int i;
> -
> - for (i = 0; table[i].type; i++) {
> - if (!strcmp(table[i].type, name))
> - return table[i].size;
> - }
> -
> - return 0;
> -}
> -
> -static int append(char **buf, const char *delim, const char *str)
> -{
> - char *new_buf;
> -
> - new_buf = realloc(*buf, strlen(*buf) + strlen(delim) + strlen(str) + 1);
> - if (!new_buf)
> - return -1;
> - strcat(new_buf, delim);
> - strcat(new_buf, str);
> - *buf = new_buf;
> - return 0;
> -}
> -
> -static int event_read_fields(struct tep_event *event, struct tep_format_field **fields)
> -{
> - struct tep_format_field *field = NULL;
> - enum tep_event_type type;
> - char *token;
> - char *last_token;
> - char *delim = " ";
> - int count = 0;
> - int ret;
> -
> - do {
> - unsigned int size_dynamic = 0;
> -
> - type = read_token(&token);
> - if (type == TEP_EVENT_NEWLINE) {
> - free_token(token);
> - return count;
> - }
> -
> - count++;
> -
> - if (test_type_token(type, token, TEP_EVENT_ITEM, "field"))
> - goto fail;
> - free_token(token);
> -
> - type = read_token(&token);
> - /*
> - * The ftrace fields may still use the "special" name.
> - * Just ignore it.
> - */
> - if (event->flags & TEP_EVENT_FL_ISFTRACE &&
> - type == TEP_EVENT_ITEM && strcmp(token, "special") == 0) {
> - free_token(token);
> - type = read_token(&token);
> - }
> -
> - if (test_type_token(type, token, TEP_EVENT_OP, ":") < 0)
> - goto fail;
> -
> - free_token(token);
> - if (read_expect_type(TEP_EVENT_ITEM, &token) < 0)
> - goto fail;
> -
> - last_token = token;
> -
> - field = calloc(1, sizeof(*field));
> - if (!field)
> - goto fail;
> -
> - field->event = event;
> -
> - /* read the rest of the type */
> - for (;;) {
> - type = read_token(&token);
> - if (type == TEP_EVENT_ITEM ||
> - (type == TEP_EVENT_OP && strcmp(token, "*") == 0) ||
> - /*
> - * Some of the ftrace fields are broken and have
> - * an illegal "." in them.
> - */
> - (event->flags & TEP_EVENT_FL_ISFTRACE &&
> - type == TEP_EVENT_OP && strcmp(token, ".") == 0)) {
> -
> - if (strcmp(token, "*") == 0)
> - field->flags |= TEP_FIELD_IS_POINTER;
> -
> - if (field->type) {
> - ret = append(&field->type, delim, last_token);
> - free(last_token);
> - if (ret < 0)
> - goto fail;
> - } else
> - field->type = last_token;
> - last_token = token;
> - delim = " ";
> - continue;
> - }
> -
> - /* Handle __attribute__((user)) */
> - if ((type == TEP_EVENT_DELIM) &&
> - strcmp("__attribute__", last_token) == 0 &&
> - token[0] == '(') {
> - int depth = 1;
> - int ret;
> -
> - ret = append(&field->type, " ", last_token);
> - ret |= append(&field->type, "", "(");
> - if (ret < 0)
> - goto fail;
> -
> - delim = " ";
> - while ((type = read_token(&token)) != TEP_EVENT_NONE) {
> - if (type == TEP_EVENT_DELIM) {
> - if (token[0] == '(')
> - depth++;
> - else if (token[0] == ')')
> - depth--;
> - if (!depth)
> - break;
> - ret = append(&field->type, "", token);
> - delim = "";
> - } else {
> - ret = append(&field->type, delim, token);
> - delim = " ";
> - }
> - if (ret < 0)
> - goto fail;
> - free(last_token);
> - last_token = token;
> - }
> - continue;
> - }
> - break;
> - }
> -
> - if (!field->type) {
> - do_warning_event(event, "%s: no type found", __func__);
> - goto fail;
> - }
> - field->name = field->alias = last_token;
> -
> - if (test_type(type, TEP_EVENT_OP))
> - goto fail;
> -
> - if (strcmp(token, "[") == 0) {
> - enum tep_event_type last_type = type;
> - char *brackets = token;
> -
> - field->flags |= TEP_FIELD_IS_ARRAY;
> -
> - type = read_token(&token);
> -
> - if (type == TEP_EVENT_ITEM)
> - field->arraylen = strtoul(token, NULL, 0);
> - else
> - field->arraylen = 0;
> -
> - while (strcmp(token, "]") != 0) {
> - const char *delim;
> -
> - if (last_type == TEP_EVENT_ITEM &&
> - type == TEP_EVENT_ITEM)
> - delim = " ";
> - else
> - delim = "";
> -
> - last_type = type;
> -
> - ret = append(&brackets, delim, token);
> - if (ret < 0) {
> - free(brackets);
> - goto fail;
> - }
> - /* We only care about the last token */
> - field->arraylen = strtoul(token, NULL, 0);
> - free_token(token);
> - type = read_token(&token);
> - if (type == TEP_EVENT_NONE) {
> - free(brackets);
> - do_warning_event(event, "failed to find token");
> - goto fail;
> - }
> - }
> -
> - free_token(token);
> -
> - ret = append(&brackets, "", "]");
> - if (ret < 0) {
> - free(brackets);
> - goto fail;
> - }
> -
> - /* add brackets to type */
> -
> - type = read_token(&token);
> - /*
> - * If the next token is not an OP, then it is of
> - * the format: type [] item;
> - */
> - if (type == TEP_EVENT_ITEM) {
> - ret = append(&field->type, " ", field->name);
> - if (ret < 0) {
> - free(brackets);
> - goto fail;
> - }
> - ret = append(&field->type, "", brackets);
> -
> - size_dynamic = type_size(field->name);
> - free_token(field->name);
> - field->name = field->alias = token;
> - type = read_token(&token);
> - } else {
> - ret = append(&field->type, "", brackets);
> - if (ret < 0) {
> - free(brackets);
> - goto fail;
> - }
> - }
> - free(brackets);
> - }
> -
> - if (field_is_string(field))
> - field->flags |= TEP_FIELD_IS_STRING;
> - if (field_is_dynamic(field))
> - field->flags |= TEP_FIELD_IS_DYNAMIC;
> - if (field_is_relative_dynamic(field))
> - field->flags |= TEP_FIELD_IS_DYNAMIC | TEP_FIELD_IS_RELATIVE;
> - if (field_is_long(field))
> - field->flags |= TEP_FIELD_IS_LONG;
> -
> - if (test_type_token(type, token, TEP_EVENT_OP, ";"))
> - goto fail;
> - free_token(token);
> -
> - if (read_expected(TEP_EVENT_ITEM, "offset") < 0)
> - goto fail_expect;
> -
> - if (read_expected(TEP_EVENT_OP, ":") < 0)
> - goto fail_expect;
> -
> - if (read_expect_type(TEP_EVENT_ITEM, &token))
> - goto fail;
> - field->offset = strtoul(token, NULL, 0);
> - free_token(token);
> -
> - if (read_expected(TEP_EVENT_OP, ";") < 0)
> - goto fail_expect;
> -
> - if (read_expected(TEP_EVENT_ITEM, "size") < 0)
> - goto fail_expect;
> -
> - if (read_expected(TEP_EVENT_OP, ":") < 0)
> - goto fail_expect;
> -
> - if (read_expect_type(TEP_EVENT_ITEM, &token))
> - goto fail;
> - field->size = strtoul(token, NULL, 0);
> - free_token(token);
> -
> - if (read_expected(TEP_EVENT_OP, ";") < 0)
> - goto fail_expect;
> -
> - type = read_token(&token);
> - if (type != TEP_EVENT_NEWLINE) {
> - /* newer versions of the kernel have a "signed" type */
> - if (test_type_token(type, token, TEP_EVENT_ITEM, "signed"))
> - goto fail;
> -
> - free_token(token);
> -
> - if (read_expected(TEP_EVENT_OP, ":") < 0)
> - goto fail_expect;
> -
> - if (read_expect_type(TEP_EVENT_ITEM, &token))
> - goto fail;
> -
> - if (strtoul(token, NULL, 0))
> - field->flags |= TEP_FIELD_IS_SIGNED;
> -
> - free_token(token);
> - if (read_expected(TEP_EVENT_OP, ";") < 0)
> - goto fail_expect;
> -
> - if (read_expect_type(TEP_EVENT_NEWLINE, &token))
> - goto fail;
> - }
> -
> - free_token(token);
> -
> - if (field->flags & TEP_FIELD_IS_ARRAY) {
> - if (field->arraylen)
> - field->elementsize = field->size / field->arraylen;
> - else if (field->flags & TEP_FIELD_IS_DYNAMIC)
> - field->elementsize = size_dynamic;
> - else if (field->flags & TEP_FIELD_IS_STRING)
> - field->elementsize = 1;
> - else if (field->flags & TEP_FIELD_IS_LONG)
> - field->elementsize = event->tep ?
> - event->tep->long_size :
> - sizeof(long);
> - } else
> - field->elementsize = field->size;
> -
> - *fields = field;
> - fields = &field->next;
> -
> - } while (1);
> -
> - return 0;
> -
> -fail:
> - free_token(token);
> -fail_expect:
> - if (field) {
> - free(field->type);
> - free(field->name);
> - free(field);
> - }
> - return -1;
> -}
> -
> -static int event_read_format(struct tep_event *event)
> -{
> - char *token;
> - int ret;
> -
> - if (read_expected_item(TEP_EVENT_ITEM, "format") < 0)
> - return -1;
> -
> - if (read_expected(TEP_EVENT_OP, ":") < 0)
> - return -1;
> -
> - if (read_expect_type(TEP_EVENT_NEWLINE, &token))
> - goto fail;
> - free_token(token);
> -
> - ret = event_read_fields(event, &event->format.common_fields);
> - if (ret < 0)
> - return ret;
> - event->format.nr_common = ret;
> -
> - ret = event_read_fields(event, &event->format.fields);
> - if (ret < 0)
> - return ret;
> - event->format.nr_fields = ret;
> -
> - return 0;
> -
> - fail:
> - free_token(token);
> - return -1;
> -}
> -
> -static enum tep_event_type
> -process_arg_token(struct tep_event *event, struct tep_print_arg *arg,
> - char **tok, enum tep_event_type type);
> -
> -static enum tep_event_type
> -process_arg(struct tep_event *event, struct tep_print_arg *arg, char **tok)
> -{
> - enum tep_event_type type;
> - char *token;
> -
> - type = read_token(&token);
> - *tok = token;
> -
> - return process_arg_token(event, arg, tok, type);
> -}
> -
> -static enum tep_event_type
> -process_op(struct tep_event *event, struct tep_print_arg *arg, char **tok);
> -
> -/*
> - * For __print_symbolic() and __print_flags, we need to completely
> - * evaluate the first argument, which defines what to print next.
> - */
> -static enum tep_event_type
> -process_field_arg(struct tep_event *event, struct tep_print_arg *arg, char **tok)
> -{
> - enum tep_event_type type;
> -
> - type = process_arg(event, arg, tok);
> -
> - while (type == TEP_EVENT_OP) {
> - type = process_op(event, arg, tok);
> - }
> -
> - return type;
> -}
> -
> -static enum tep_event_type
> -process_cond(struct tep_event *event, struct tep_print_arg *top, char **tok)
> -{
> - struct tep_print_arg *arg, *left, *right;
> - enum tep_event_type type;
> - char *token = NULL;
> -
> - arg = alloc_arg();
> - left = alloc_arg();
> - right = alloc_arg();
> -
> - if (!arg || !left || !right) {
> - do_warning_event(event, "%s: not enough memory!", __func__);
> - /* arg will be freed at out_free */
> - free_arg(left);
> - free_arg(right);
> - goto out_free;
> - }
> -
> - arg->type = TEP_PRINT_OP;
> - arg->op.left = left;
> - arg->op.right = right;
> -
> - *tok = NULL;
> - type = process_arg(event, left, &token);
> -
> - again:
> - if (type == TEP_EVENT_ERROR)
> - goto out_free;
> -
> - /* Handle other operations in the arguments */
> - if (type == TEP_EVENT_OP && strcmp(token, ":") != 0) {
> - type = process_op(event, left, &token);
> - goto again;
> - }
> -
> - if (test_type_token(type, token, TEP_EVENT_OP, ":"))
> - goto out_free;
> -
> - arg->op.op = token;
> -
> - type = process_arg(event, right, &token);
> -
> - top->op.right = arg;
> -
> - *tok = token;
> - return type;
> -
> -out_free:
> - /* Top may point to itself */
> - top->op.right = NULL;
> - free_token(token);
> - free_arg(arg);
> - return TEP_EVENT_ERROR;
> -}
> -
> -static enum tep_event_type
> -process_array(struct tep_event *event, struct tep_print_arg *top, char **tok)
> -{
> - struct tep_print_arg *arg;
> - enum tep_event_type type;
> - char *token = NULL;
> -
> - arg = alloc_arg();
> - if (!arg) {
> - do_warning_event(event, "%s: not enough memory!", __func__);
> - /* '*tok' is set to top->op.op. No need to free. */
> - *tok = NULL;
> - return TEP_EVENT_ERROR;
> - }
> -
> - *tok = NULL;
> - type = process_arg(event, arg, &token);
> - if (test_type_token(type, token, TEP_EVENT_OP, "]"))
> - goto out_free;
> -
> - top->op.right = arg;
> -
> - free_token(token);
> - type = read_token_item(&token);
> - *tok = token;
> -
> - return type;
> -
> -out_free:
> - free_token(token);
> - free_arg(arg);
> - return TEP_EVENT_ERROR;
> -}
> -
> -static int get_op_prio(char *op)
> -{
> - if (!op[1]) {
> - switch (op[0]) {
> - case '~':
> - case '!':
> - return 4;
> - case '*':
> - case '/':
> - case '%':
> - return 6;
> - case '+':
> - case '-':
> - return 7;
> - /* '>>' and '<<' are 8 */
> - case '<':
> - case '>':
> - return 9;
> - /* '==' and '!=' are 10 */
> - case '&':
> - return 11;
> - case '^':
> - return 12;
> - case '|':
> - return 13;
> - case '?':
> - return 16;
> - default:
> - do_warning("unknown op '%c'", op[0]);
> - return -1;
> - }
> - } else {
> - if (strcmp(op, "++") == 0 ||
> - strcmp(op, "--") == 0) {
> - return 3;
> - } else if (strcmp(op, ">>") == 0 ||
> - strcmp(op, "<<") == 0) {
> - return 8;
> - } else if (strcmp(op, ">=") == 0 ||
> - strcmp(op, "<=") == 0) {
> - return 9;
> - } else if (strcmp(op, "==") == 0 ||
> - strcmp(op, "!=") == 0) {
> - return 10;
> - } else if (strcmp(op, "&&") == 0) {
> - return 14;
> - } else if (strcmp(op, "||") == 0) {
> - return 15;
> - } else {
> - do_warning("unknown op '%s'", op);
> - return -1;
> - }
> - }
> -}
> -
> -static int set_op_prio(struct tep_print_arg *arg)
> -{
> -
> - /* single ops are the greatest */
> - if (!arg->op.left || arg->op.left->type == TEP_PRINT_NULL)
> - arg->op.prio = 0;
> - else
> - arg->op.prio = get_op_prio(arg->op.op);
> -
> - return arg->op.prio;
> -}
> -
> -/* Note, *tok does not get freed, but will most likely be saved */
> -static enum tep_event_type
> -process_op(struct tep_event *event, struct tep_print_arg *arg, char **tok)
> -{
> - struct tep_print_arg *left, *right = NULL;
> - enum tep_event_type type;
> - char *token;
> -
> - /* the op is passed in via tok */
> - token = *tok;
> -
> - if (arg->type == TEP_PRINT_OP && !arg->op.left) {
> - /* handle single op */
> - if (token[1]) {
> - do_warning_event(event, "bad op token %s", token);
> - goto out_free;
> - }
> - switch (token[0]) {
> - case '~':
> - case '!':
> - case '+':
> - case '-':
> - break;
> - default:
> - do_warning_event(event, "bad op token %s", token);
> - goto out_free;
> -
> - }
> -
> - /* make an empty left */
> - left = alloc_arg();
> - if (!left)
> - goto out_warn_free;
> -
> - left->type = TEP_PRINT_NULL;
> - arg->op.left = left;
> -
> - right = alloc_arg();
> - if (!right)
> - goto out_warn_free;
> -
> - arg->op.right = right;
> -
> - /* do not free the token, it belongs to an op */
> - *tok = NULL;
> - type = process_arg(event, right, tok);
> -
> - } else if (strcmp(token, "?") == 0) {
> -
> - left = alloc_arg();
> - if (!left)
> - goto out_warn_free;
> -
> - /* copy the top arg to the left */
> - *left = *arg;
> -
> - arg->type = TEP_PRINT_OP;
> - arg->op.op = token;
> - arg->op.left = left;
> - arg->op.prio = 0;
> -
> - /* it will set arg->op.right */
> - type = process_cond(event, arg, tok);
> -
> - } else if (strcmp(token, ">>") == 0 ||
> - strcmp(token, "<<") == 0 ||
> - strcmp(token, "&") == 0 ||
> - strcmp(token, "|") == 0 ||
> - strcmp(token, "&&") == 0 ||
> - strcmp(token, "||") == 0 ||
> - strcmp(token, "-") == 0 ||
> - strcmp(token, "+") == 0 ||
> - strcmp(token, "*") == 0 ||
> - strcmp(token, "^") == 0 ||
> - strcmp(token, "/") == 0 ||
> - strcmp(token, "%") == 0 ||
> - strcmp(token, "<") == 0 ||
> - strcmp(token, ">") == 0 ||
> - strcmp(token, "<=") == 0 ||
> - strcmp(token, ">=") == 0 ||
> - strcmp(token, "==") == 0 ||
> - strcmp(token, "!=") == 0) {
> -
> - left = alloc_arg();
> - if (!left)
> - goto out_warn_free;
> -
> - /* copy the top arg to the left */
> - *left = *arg;
> -
> - arg->type = TEP_PRINT_OP;
> - arg->op.op = token;
> - arg->op.left = left;
> - arg->op.right = NULL;
> -
> - if (set_op_prio(arg) == -1) {
> - event->flags |= TEP_EVENT_FL_FAILED;
> - /* arg->op.op (= token) will be freed at out_free */
> - arg->op.op = NULL;
> - goto out_free;
> - }
> -
> - type = read_token_item(&token);
> - *tok = token;
> -
> - /* could just be a type pointer */
> - if ((strcmp(arg->op.op, "*") == 0) &&
> - type == TEP_EVENT_DELIM && (strcmp(token, ")") == 0)) {
> - int ret;
> -
> - if (left->type != TEP_PRINT_ATOM) {
> - do_warning_event(event, "bad pointer type");
> - goto out_free;
> - }
> - ret = append(&left->atom.atom, " ", "*");
> - if (ret < 0)
> - goto out_warn_free;
> -
> - free(arg->op.op);
> - *arg = *left;
> - free(left);
> -
> - return type;
> - }
> -
> - right = alloc_arg();
> - if (!right)
> - goto out_warn_free;
> -
> - type = process_arg_token(event, right, tok, type);
> - if (type == TEP_EVENT_ERROR) {
> - free_arg(right);
> - /* token was freed in process_arg_token() via *tok */
> - token = NULL;
> - goto out_free;
> - }
> -
> - if (right->type == TEP_PRINT_OP &&
> - get_op_prio(arg->op.op) < get_op_prio(right->op.op)) {
> - struct tep_print_arg tmp;
> -
> - /* rotate ops according to the priority */
> - arg->op.right = right->op.left;
> -
> - tmp = *arg;
> - *arg = *right;
> - *right = tmp;
> -
> - arg->op.left = right;
> - } else {
> - arg->op.right = right;
> - }
> -
> - } else if (strcmp(token, "[") == 0) {
> -
> - left = alloc_arg();
> - if (!left)
> - goto out_warn_free;
> -
> - *left = *arg;
> -
> - arg->type = TEP_PRINT_OP;
> - arg->op.op = token;
> - arg->op.left = left;
> -
> - arg->op.prio = 0;
> -
> - /* it will set arg->op.right */
> - type = process_array(event, arg, tok);
> -
> - } else {
> - do_warning_event(event, "unknown op '%s'", token);
> - event->flags |= TEP_EVENT_FL_FAILED;
> - /* the arg is now the left side */
> - goto out_free;
> - }
> -
> - if (type == TEP_EVENT_OP && strcmp(*tok, ":") != 0) {
> - int prio;
> -
> - /* higher prios need to be closer to the root */
> - prio = get_op_prio(*tok);
> -
> - if (prio > arg->op.prio)
> - return process_op(event, arg, tok);
> -
> - return process_op(event, right, tok);
> - }
> -
> - return type;
> -
> -out_warn_free:
> - do_warning_event(event, "%s: not enough memory!", __func__);
> -out_free:
> - free_token(token);
> - *tok = NULL;
> - return TEP_EVENT_ERROR;
> -}
> -
> -static enum tep_event_type
> -process_entry(struct tep_event *event __maybe_unused, struct tep_print_arg *arg,
> - char **tok)
> -{
> - enum tep_event_type type;
> - char *field;
> - char *token;
> -
> - if (read_expected(TEP_EVENT_OP, "->") < 0)
> - goto out_err;
> -
> - if (read_expect_type(TEP_EVENT_ITEM, &token) < 0)
> - goto out_free;
> - field = token;
> -
> - arg->type = TEP_PRINT_FIELD;
> - arg->field.name = field;
> -
> - if (is_flag_field) {
> - arg->field.field = tep_find_any_field(event, arg->field.name);
> - arg->field.field->flags |= TEP_FIELD_IS_FLAG;
> - is_flag_field = 0;
> - } else if (is_symbolic_field) {
> - arg->field.field = tep_find_any_field(event, arg->field.name);
> - arg->field.field->flags |= TEP_FIELD_IS_SYMBOLIC;
> - is_symbolic_field = 0;
> - }
> -
> - type = read_token(&token);
> - *tok = token;
> -
> - return type;
> -
> - out_free:
> - free_token(token);
> - out_err:
> - *tok = NULL;
> - return TEP_EVENT_ERROR;
> -}
> -
> -static int alloc_and_process_delim(struct tep_event *event, char *next_token,
> - struct tep_print_arg **print_arg)
> -{
> - struct tep_print_arg *field;
> - enum tep_event_type type;
> - char *token;
> - int ret = 0;
> -
> - field = alloc_arg();
> - if (!field) {
> - do_warning_event(event, "%s: not enough memory!", __func__);
> - errno = ENOMEM;
> - return -1;
> - }
> -
> - type = process_arg(event, field, &token);
> -
> - if (test_type_token(type, token, TEP_EVENT_DELIM, next_token)) {
> - errno = EINVAL;
> - ret = -1;
> - free_arg(field);
> - goto out_free_token;
> - }
> -
> - *print_arg = field;
> -
> -out_free_token:
> - free_token(token);
> -
> - return ret;
> -}
> -
> -static char *arg_eval (struct tep_print_arg *arg);
> -
> -static unsigned long long
> -eval_type_str(unsigned long long val, const char *type, int pointer)
> -{
> - int sign = 0;
> - char *ref;
> - int len;
> -
> - len = strlen(type);
> -
> - if (pointer) {
> -
> - if (type[len-1] != '*') {
> - do_warning("pointer expected with non pointer type");
> - return val;
> - }
> -
> - ref = malloc(len);
> - if (!ref) {
> - do_warning("%s: not enough memory!", __func__);
> - return val;
> - }
> - memcpy(ref, type, len);
> -
> - /* chop off the " *" */
> - ref[len - 2] = 0;
> -
> - val = eval_type_str(val, ref, 0);
> - free(ref);
> - return val;
> - }
> -
> - /* check if this is a pointer */
> - if (type[len - 1] == '*')
> - return val;
> -
> - /* Try to figure out the arg size*/
> - if (strncmp(type, "struct", 6) == 0)
> - /* all bets off */
> - return val;
> -
> - if (strcmp(type, "u8") == 0)
> - return val & 0xff;
> -
> - if (strcmp(type, "u16") == 0)
> - return val & 0xffff;
> -
> - if (strcmp(type, "u32") == 0)
> - return val & 0xffffffff;
> -
> - if (strcmp(type, "u64") == 0 ||
> - strcmp(type, "s64") == 0)
> - return val;
> -
> - if (strcmp(type, "s8") == 0)
> - return (unsigned long long)(char)val & 0xff;
> -
> - if (strcmp(type, "s16") == 0)
> - return (unsigned long long)(short)val & 0xffff;
> -
> - if (strcmp(type, "s32") == 0)
> - return (unsigned long long)(int)val & 0xffffffff;
> -
> - if (strncmp(type, "unsigned ", 9) == 0) {
> - sign = 0;
> - type += 9;
> - }
> -
> - if (strcmp(type, "char") == 0) {
> - if (sign)
> - return (unsigned long long)(char)val & 0xff;
> - else
> - return val & 0xff;
> - }
> -
> - if (strcmp(type, "short") == 0) {
> - if (sign)
> - return (unsigned long long)(short)val & 0xffff;
> - else
> - return val & 0xffff;
> - }
> -
> - if (strcmp(type, "int") == 0) {
> - if (sign)
> - return (unsigned long long)(int)val & 0xffffffff;
> - else
> - return val & 0xffffffff;
> - }
> -
> - return val;
> -}
> -
> -/*
> - * Try to figure out the type.
> - */
> -static unsigned long long
> -eval_type(unsigned long long val, struct tep_print_arg *arg, int pointer)
> -{
> - if (arg->type != TEP_PRINT_TYPE) {
> - do_warning("expected type argument");
> - return 0;
> - }
> -
> - return eval_type_str(val, arg->typecast.type, pointer);
> -}
> -
> -static int arg_num_eval(struct tep_print_arg *arg, long long *val)
> -{
> - long long left, right;
> - int ret = 1;
> -
> - switch (arg->type) {
> - case TEP_PRINT_ATOM:
> - *val = strtoll(arg->atom.atom, NULL, 0);
> - break;
> - case TEP_PRINT_TYPE:
> - ret = arg_num_eval(arg->typecast.item, val);
> - if (!ret)
> - break;
> - *val = eval_type(*val, arg, 0);
> - break;
> - case TEP_PRINT_OP:
> - switch (arg->op.op[0]) {
> - case '|':
> - ret = arg_num_eval(arg->op.left, &left);
> - if (!ret)
> - break;
> - ret = arg_num_eval(arg->op.right, &right);
> - if (!ret)
> - break;
> - if (arg->op.op[1])
> - *val = left || right;
> - else
> - *val = left | right;
> - break;
> - case '&':
> - ret = arg_num_eval(arg->op.left, &left);
> - if (!ret)
> - break;
> - ret = arg_num_eval(arg->op.right, &right);
> - if (!ret)
> - break;
> - if (arg->op.op[1])
> - *val = left && right;
> - else
> - *val = left & right;
> - break;
> - case '<':
> - ret = arg_num_eval(arg->op.left, &left);
> - if (!ret)
> - break;
> - ret = arg_num_eval(arg->op.right, &right);
> - if (!ret)
> - break;
> - switch (arg->op.op[1]) {
> - case 0:
> - *val = left < right;
> - break;
> - case '<':
> - *val = left << right;
> - break;
> - case '=':
> - *val = left <= right;
> - break;
> - default:
> - do_warning("unknown op '%s'", arg->op.op);
> - ret = 0;
> - }
> - break;
> - case '>':
> - ret = arg_num_eval(arg->op.left, &left);
> - if (!ret)
> - break;
> - ret = arg_num_eval(arg->op.right, &right);
> - if (!ret)
> - break;
> - switch (arg->op.op[1]) {
> - case 0:
> - *val = left > right;
> - break;
> - case '>':
> - *val = left >> right;
> - break;
> - case '=':
> - *val = left >= right;
> - break;
> - default:
> - do_warning("unknown op '%s'", arg->op.op);
> - ret = 0;
> - }
> - break;
> - case '=':
> - ret = arg_num_eval(arg->op.left, &left);
> - if (!ret)
> - break;
> - ret = arg_num_eval(arg->op.right, &right);
> - if (!ret)
> - break;
> -
> - if (arg->op.op[1] != '=') {
> - do_warning("unknown op '%s'", arg->op.op);
> - ret = 0;
> - } else
> - *val = left == right;
> - break;
> - case '!':
> - ret = arg_num_eval(arg->op.left, &left);
> - if (!ret)
> - break;
> - ret = arg_num_eval(arg->op.right, &right);
> - if (!ret)
> - break;
> -
> - switch (arg->op.op[1]) {
> - case '=':
> - *val = left != right;
> - break;
> - default:
> - do_warning("unknown op '%s'", arg->op.op);
> - ret = 0;
> - }
> - break;
> - case '-':
> - /* check for negative */
> - if (arg->op.left->type == TEP_PRINT_NULL)
> - left = 0;
> - else
> - ret = arg_num_eval(arg->op.left, &left);
> - if (!ret)
> - break;
> - ret = arg_num_eval(arg->op.right, &right);
> - if (!ret)
> - break;
> - *val = left - right;
> - break;
> - case '+':
> - if (arg->op.left->type == TEP_PRINT_NULL)
> - left = 0;
> - else
> - ret = arg_num_eval(arg->op.left, &left);
> - if (!ret)
> - break;
> - ret = arg_num_eval(arg->op.right, &right);
> - if (!ret)
> - break;
> - *val = left + right;
> - break;
> - case '~':
> - ret = arg_num_eval(arg->op.right, &right);
> - if (!ret)
> - break;
> - *val = ~right;
> - break;
> - default:
> - do_warning("unknown op '%s'", arg->op.op);
> - ret = 0;
> - }
> - break;
> -
> - case TEP_PRINT_NULL:
> - case TEP_PRINT_FIELD ... TEP_PRINT_SYMBOL:
> - case TEP_PRINT_STRING:
> - case TEP_PRINT_BSTRING:
> - case TEP_PRINT_BITMASK:
> - default:
> - do_warning("invalid eval type %d", arg->type);
> - ret = 0;
> -
> - }
> - return ret;
> -}
> -
> -static char *arg_eval (struct tep_print_arg *arg)
> -{
> - long long val;
> - static char buf[24];
> -
> - switch (arg->type) {
> - case TEP_PRINT_ATOM:
> - return arg->atom.atom;
> - case TEP_PRINT_TYPE:
> - return arg_eval(arg->typecast.item);
> - case TEP_PRINT_OP:
> - if (!arg_num_eval(arg, &val))
> - break;
> - sprintf(buf, "%lld", val);
> - return buf;
> -
> - case TEP_PRINT_NULL:
> - case TEP_PRINT_FIELD ... TEP_PRINT_SYMBOL:
> - case TEP_PRINT_STRING:
> - case TEP_PRINT_BSTRING:
> - case TEP_PRINT_BITMASK:
> - default:
> - do_warning("invalid eval type %d", arg->type);
> - break;
> - }
> -
> - return NULL;
> -}
> -
> -static enum tep_event_type
> -process_fields(struct tep_event *event, struct tep_print_flag_sym **list, char **tok)
> -{
> - enum tep_event_type type;
> - struct tep_print_arg *arg = NULL;
> - struct tep_print_flag_sym *field;
> - char *token = *tok;
> - char *value;
> -
> - do {
> - free_token(token);
> - type = read_token_item(&token);
> - if (test_type_token(type, token, TEP_EVENT_OP, "{"))
> - break;
> -
> - arg = alloc_arg();
> - if (!arg)
> - goto out_free;
> -
> - free_token(token);
> - type = process_arg(event, arg, &token);
> -
> - if (type == TEP_EVENT_OP)
> - type = process_op(event, arg, &token);
> -
> - if (type == TEP_EVENT_ERROR)
> - goto out_free;
> -
> - if (test_type_token(type, token, TEP_EVENT_DELIM, ","))
> - goto out_free;
> -
> - field = calloc(1, sizeof(*field));
> - if (!field)
> - goto out_free;
> -
> - value = arg_eval(arg);
> - if (value == NULL)
> - goto out_free_field;
> - field->value = strdup(value);
> - if (field->value == NULL)
> - goto out_free_field;
> -
> - free_arg(arg);
> - arg = alloc_arg();
> - if (!arg)
> - goto out_free;
> -
> - free_token(token);
> - type = process_arg(event, arg, &token);
> - if (test_type_token(type, token, TEP_EVENT_OP, "}"))
> - goto out_free_field;
> -
> - value = arg_eval(arg);
> - if (value == NULL)
> - goto out_free_field;
> - field->str = strdup(value);
> - if (field->str == NULL)
> - goto out_free_field;
> - free_arg(arg);
> - arg = NULL;
> -
> - *list = field;
> - list = &field->next;
> -
> - free_token(token);
> - type = read_token_item(&token);
> - } while (type == TEP_EVENT_DELIM && strcmp(token, ",") == 0);
> -
> - *tok = token;
> - return type;
> -
> -out_free_field:
> - free_flag_sym(field);
> -out_free:
> - free_arg(arg);
> - free_token(token);
> - *tok = NULL;
> -
> - return TEP_EVENT_ERROR;
> -}
> -
> -static enum tep_event_type
> -process_flags(struct tep_event *event, struct tep_print_arg *arg, char **tok)
> -{
> - struct tep_print_arg *field;
> - enum tep_event_type type;
> - char *token = NULL;
> -
> - memset(arg, 0, sizeof(*arg));
> - arg->type = TEP_PRINT_FLAGS;
> -
> - field = alloc_arg();
> - if (!field) {
> - do_warning_event(event, "%s: not enough memory!", __func__);
> - goto out_free;
> - }
> -
> - type = process_field_arg(event, field, &token);
> -
> - /* Handle operations in the first argument */
> - while (type == TEP_EVENT_OP)
> - type = process_op(event, field, &token);
> -
> - if (test_type_token(type, token, TEP_EVENT_DELIM, ","))
> - goto out_free_field;
> - free_token(token);
> -
> - arg->flags.field = field;
> -
> - type = read_token_item(&token);
> - if (event_item_type(type)) {
> - arg->flags.delim = token;
> - type = read_token_item(&token);
> - }
> -
> - if (test_type_token(type, token, TEP_EVENT_DELIM, ","))
> - goto out_free;
> -
> - type = process_fields(event, &arg->flags.flags, &token);
> - if (test_type_token(type, token, TEP_EVENT_DELIM, ")"))
> - goto out_free;
> -
> - free_token(token);
> - type = read_token_item(tok);
> - return type;
> -
> -out_free_field:
> - free_arg(field);
> -out_free:
> - free_token(token);
> - *tok = NULL;
> - return TEP_EVENT_ERROR;
> -}
> -
> -static enum tep_event_type
> -process_symbols(struct tep_event *event, struct tep_print_arg *arg, char **tok)
> -{
> - struct tep_print_arg *field;
> - enum tep_event_type type;
> - char *token = NULL;
> -
> - memset(arg, 0, sizeof(*arg));
> - arg->type = TEP_PRINT_SYMBOL;
> -
> - field = alloc_arg();
> - if (!field) {
> - do_warning_event(event, "%s: not enough memory!", __func__);
> - goto out_free;
> - }
> -
> - type = process_field_arg(event, field, &token);
> -
> - if (test_type_token(type, token, TEP_EVENT_DELIM, ","))
> - goto out_free_field;
> -
> - arg->symbol.field = field;
> -
> - type = process_fields(event, &arg->symbol.symbols, &token);
> - if (test_type_token(type, token, TEP_EVENT_DELIM, ")"))
> - goto out_free;
> -
> - free_token(token);
> - type = read_token_item(tok);
> - return type;
> -
> -out_free_field:
> - free_arg(field);
> -out_free:
> - free_token(token);
> - *tok = NULL;
> - return TEP_EVENT_ERROR;
> -}
> -
> -static enum tep_event_type
> -process_hex_common(struct tep_event *event, struct tep_print_arg *arg,
> - char **tok, enum tep_print_arg_type type)
> -{
> - memset(arg, 0, sizeof(*arg));
> - arg->type = type;
> -
> - if (alloc_and_process_delim(event, ",", &arg->hex.field))
> - goto out;
> -
> - if (alloc_and_process_delim(event, ")", &arg->hex.size))
> - goto free_field;
> -
> - return read_token_item(tok);
> -
> -free_field:
> - free_arg(arg->hex.field);
> - arg->hex.field = NULL;
> -out:
> - *tok = NULL;
> - return TEP_EVENT_ERROR;
> -}
> -
> -static enum tep_event_type
> -process_hex(struct tep_event *event, struct tep_print_arg *arg, char **tok)
> -{
> - return process_hex_common(event, arg, tok, TEP_PRINT_HEX);
> -}
> -
> -static enum tep_event_type
> -process_hex_str(struct tep_event *event, struct tep_print_arg *arg,
> - char **tok)
> -{
> - return process_hex_common(event, arg, tok, TEP_PRINT_HEX_STR);
> -}
> -
> -static enum tep_event_type
> -process_int_array(struct tep_event *event, struct tep_print_arg *arg, char **tok)
> -{
> - memset(arg, 0, sizeof(*arg));
> - arg->type = TEP_PRINT_INT_ARRAY;
> -
> - if (alloc_and_process_delim(event, ",", &arg->int_array.field))
> - goto out;
> -
> - if (alloc_and_process_delim(event, ",", &arg->int_array.count))
> - goto free_field;
> -
> - if (alloc_and_process_delim(event, ")", &arg->int_array.el_size))
> - goto free_size;
> -
> - return read_token_item(tok);
> -
> -free_size:
> - free_arg(arg->int_array.count);
> - arg->int_array.count = NULL;
> -free_field:
> - free_arg(arg->int_array.field);
> - arg->int_array.field = NULL;
> -out:
> - *tok = NULL;
> - return TEP_EVENT_ERROR;
> -}
> -
> -static enum tep_event_type
> -process_dynamic_array(struct tep_event *event, struct tep_print_arg *arg, char **tok)
> -{
> - struct tep_format_field *field;
> - enum tep_event_type type;
> - char *token;
> -
> - memset(arg, 0, sizeof(*arg));
> - arg->type = TEP_PRINT_DYNAMIC_ARRAY;
> -
> - /*
> - * The item within the parenthesis is another field that holds
> - * the index into where the array starts.
> - */
> - type = read_token(&token);
> - *tok = token;
> - if (type != TEP_EVENT_ITEM)
> - goto out_free;
> -
> - /* Find the field */
> -
> - field = tep_find_field(event, token);
> - if (!field)
> - goto out_free;
> -
> - arg->dynarray.field = field;
> - arg->dynarray.index = 0;
> -
> - if (read_expected(TEP_EVENT_DELIM, ")") < 0)
> - goto out_free;
> -
> - free_token(token);
> - type = read_token_item(&token);
> - *tok = token;
> - if (type != TEP_EVENT_OP || strcmp(token, "[") != 0)
> - return type;
> -
> - free_token(token);
> - arg = alloc_arg();
> - if (!arg) {
> - do_warning_event(event, "%s: not enough memory!", __func__);
> - *tok = NULL;
> - return TEP_EVENT_ERROR;
> - }
> -
> - type = process_arg(event, arg, &token);
> - if (type == TEP_EVENT_ERROR)
> - goto out_free_arg;
> -
> - if (!test_type_token(type, token, TEP_EVENT_OP, "]"))
> - goto out_free_arg;
> -
> - free_token(token);
> - type = read_token_item(tok);
> - return type;
> -
> - out_free_arg:
> - free_arg(arg);
> - out_free:
> - free_token(token);
> - *tok = NULL;
> - return TEP_EVENT_ERROR;
> -}
> -
> -static enum tep_event_type
> -process_dynamic_array_len(struct tep_event *event, struct tep_print_arg *arg,
> - char **tok)
> -{
> - struct tep_format_field *field;
> - enum tep_event_type type;
> - char *token;
> -
> - if (read_expect_type(TEP_EVENT_ITEM, &token) < 0)
> - goto out_free;
> -
> - arg->type = TEP_PRINT_DYNAMIC_ARRAY_LEN;
> -
> - /* Find the field */
> - field = tep_find_field(event, token);
> - if (!field)
> - goto out_free;
> -
> - arg->dynarray.field = field;
> - arg->dynarray.index = 0;
> -
> - if (read_expected(TEP_EVENT_DELIM, ")") < 0)
> - goto out_err;
> -
> - free_token(token);
> - type = read_token(&token);
> - *tok = token;
> -
> - return type;
> -
> - out_free:
> - free_token(token);
> - out_err:
> - *tok = NULL;
> - return TEP_EVENT_ERROR;
> -}
> -
> -static enum tep_event_type
> -process_paren(struct tep_event *event, struct tep_print_arg *arg, char **tok)
> -{
> - struct tep_print_arg *item_arg;
> - enum tep_event_type type;
> - char *token;
> -
> - type = process_arg(event, arg, &token);
> -
> - if (type == TEP_EVENT_ERROR)
> - goto out_free;
> -
> - if (type == TEP_EVENT_OP)
> - type = process_op(event, arg, &token);
> -
> - if (type == TEP_EVENT_ERROR)
> - goto out_free;
> -
> - if (test_type_token(type, token, TEP_EVENT_DELIM, ")"))
> - goto out_free;
> -
> - free_token(token);
> - type = read_token_item(&token);
> -
> - /*
> - * If the next token is an item or another open paren, then
> - * this was a typecast.
> - */
> - if (event_item_type(type) ||
> - (type == TEP_EVENT_DELIM && strcmp(token, "(") == 0)) {
> -
> - /* make this a typecast and contine */
> -
> - /* prevous must be an atom */
> - if (arg->type != TEP_PRINT_ATOM) {
> - do_warning_event(event, "previous needed to be TEP_PRINT_ATOM");
> - goto out_free;
> - }
> -
> - item_arg = alloc_arg();
> - if (!item_arg) {
> - do_warning_event(event, "%s: not enough memory!",
> - __func__);
> - goto out_free;
> - }
> -
> - arg->type = TEP_PRINT_TYPE;
> - arg->typecast.type = arg->atom.atom;
> - arg->typecast.item = item_arg;
> - type = process_arg_token(event, item_arg, &token, type);
> -
> - }
> -
> - *tok = token;
> - return type;
> -
> - out_free:
> - free_token(token);
> - *tok = NULL;
> - return TEP_EVENT_ERROR;
> -}
> -
> -
> -static enum tep_event_type
> -process_str(struct tep_event *event __maybe_unused, struct tep_print_arg *arg,
> - char **tok)
> -{
> - enum tep_event_type type;
> - char *token;
> -
> - if (read_expect_type(TEP_EVENT_ITEM, &token) < 0)
> - goto out_free;
> -
> - arg->type = TEP_PRINT_STRING;
> - arg->string.string = token;
> - arg->string.field = NULL;
> -
> - if (read_expected(TEP_EVENT_DELIM, ")") < 0)
> - goto out_err;
> -
> - type = read_token(&token);
> - *tok = token;
> -
> - return type;
> -
> - out_free:
> - free_token(token);
> - out_err:
> - *tok = NULL;
> - return TEP_EVENT_ERROR;
> -}
> -
> -static enum tep_event_type
> -process_bitmask(struct tep_event *event __maybe_unused, struct tep_print_arg *arg,
> - char **tok)
> -{
> - enum tep_event_type type;
> - char *token;
> -
> - if (read_expect_type(TEP_EVENT_ITEM, &token) < 0)
> - goto out_free;
> -
> - arg->type = TEP_PRINT_BITMASK;
> - arg->bitmask.bitmask = token;
> - arg->bitmask.field = NULL;
> -
> - if (read_expected(TEP_EVENT_DELIM, ")") < 0)
> - goto out_err;
> -
> - type = read_token(&token);
> - *tok = token;
> -
> - return type;
> -
> - out_free:
> - free_token(token);
> - out_err:
> - *tok = NULL;
> - return TEP_EVENT_ERROR;
> -}
> -
> -static struct tep_function_handler *
> -find_func_handler(struct tep_handle *tep, char *func_name)
> -{
> - struct tep_function_handler *func;
> -
> - if (!tep)
> - return NULL;
> -
> - for (func = tep->func_handlers; func; func = func->next) {
> - if (strcmp(func->name, func_name) == 0)
> - break;
> - }
> -
> - return func;
> -}
> -
> -static void remove_func_handler(struct tep_handle *tep, char *func_name)
> -{
> - struct tep_function_handler *func;
> - struct tep_function_handler **next;
> -
> - next = &tep->func_handlers;
> - while ((func = *next)) {
> - if (strcmp(func->name, func_name) == 0) {
> - *next = func->next;
> - free_func_handle(func);
> - break;
> - }
> - next = &func->next;
> - }
> -}
> -
> -static enum tep_event_type
> -process_func_handler(struct tep_event *event, struct tep_function_handler *func,
> - struct tep_print_arg *arg, char **tok)
> -{
> - struct tep_print_arg **next_arg;
> - struct tep_print_arg *farg;
> - enum tep_event_type type;
> - char *token;
> - int i;
> -
> - arg->type = TEP_PRINT_FUNC;
> - arg->func.func = func;
> -
> - *tok = NULL;
> -
> - next_arg = &(arg->func.args);
> - for (i = 0; i < func->nr_args; i++) {
> - farg = alloc_arg();
> - if (!farg) {
> - do_warning_event(event, "%s: not enough memory!",
> - __func__);
> - return TEP_EVENT_ERROR;
> - }
> -
> - type = process_arg(event, farg, &token);
> - if (i < (func->nr_args - 1)) {
> - if (type != TEP_EVENT_DELIM || strcmp(token, ",") != 0) {
> - do_warning_event(event,
> - "Error: function '%s()' expects %d arguments but event %s only uses %d",
> - func->name, func->nr_args,
> - event->name, i + 1);
> - goto err;
> - }
> - } else {
> - if (type != TEP_EVENT_DELIM || strcmp(token, ")") != 0) {
> - do_warning_event(event,
> - "Error: function '%s()' only expects %d arguments but event %s has more",
> - func->name, func->nr_args, event->name);
> - goto err;
> - }
> - }
> -
> - *next_arg = farg;
> - next_arg = &(farg->next);
> - free_token(token);
> - }
> -
> - type = read_token(&token);
> - *tok = token;
> -
> - return type;
> -
> -err:
> - free_arg(farg);
> - free_token(token);
> - return TEP_EVENT_ERROR;
> -}
> -
> -static enum tep_event_type
> -process_builtin_expect(struct tep_event *event, struct tep_print_arg *arg, char **tok)
> -{
> - enum tep_event_type type;
> - char *token = NULL;
> -
> - /* Handle __builtin_expect( cond, #) */
> - type = process_arg(event, arg, &token);
> -
> - if (type != TEP_EVENT_DELIM || token[0] != ',')
> - goto out_free;
> -
> - free_token(token);
> -
> - /* We don't care what the second parameter is of the __builtin_expect() */
> - if (read_expect_type(TEP_EVENT_ITEM, &token) < 0)
> - goto out_free;
> -
> - if (read_expected(TEP_EVENT_DELIM, ")") < 0)
> - goto out_free;
> -
> - free_token(token);
> - type = read_token_item(tok);
> - return type;
> -
> -out_free:
> - free_token(token);
> - *tok = NULL;
> - return TEP_EVENT_ERROR;
> -}
> -
> -static enum tep_event_type
> -process_function(struct tep_event *event, struct tep_print_arg *arg,
> - char *token, char **tok)
> -{
> - struct tep_function_handler *func;
> -
> - if (strcmp(token, "__print_flags") == 0) {
> - free_token(token);
> - is_flag_field = 1;
> - return process_flags(event, arg, tok);
> - }
> - if (strcmp(token, "__print_symbolic") == 0) {
> - free_token(token);
> - is_symbolic_field = 1;
> - return process_symbols(event, arg, tok);
> - }
> - if (strcmp(token, "__print_hex") == 0) {
> - free_token(token);
> - return process_hex(event, arg, tok);
> - }
> - if (strcmp(token, "__print_hex_str") == 0) {
> - free_token(token);
> - return process_hex_str(event, arg, tok);
> - }
> - if (strcmp(token, "__print_array") == 0) {
> - free_token(token);
> - return process_int_array(event, arg, tok);
> - }
> - if (strcmp(token, "__get_str") == 0 ||
> - strcmp(token, "__get_rel_str") == 0) {
> - free_token(token);
> - return process_str(event, arg, tok);
> - }
> - if (strcmp(token, "__get_bitmask") == 0 ||
> - strcmp(token, "__get_rel_bitmask") == 0) {
> - free_token(token);
> - return process_bitmask(event, arg, tok);
> - }
> - if (strcmp(token, "__get_dynamic_array") == 0 ||
> - strcmp(token, "__get_rel_dynamic_array") == 0) {
> - free_token(token);
> - return process_dynamic_array(event, arg, tok);
> - }
> - if (strcmp(token, "__get_dynamic_array_len") == 0 ||
> - strcmp(token, "__get_rel_dynamic_array_len") == 0) {
> - free_token(token);
> - return process_dynamic_array_len(event, arg, tok);
> - }
> - if (strcmp(token, "__builtin_expect") == 0) {
> - free_token(token);
> - return process_builtin_expect(event, arg, tok);
> - }
> -
> - func = find_func_handler(event->tep, token);
> - if (func) {
> - free_token(token);
> - return process_func_handler(event, func, arg, tok);
> - }
> -
> - do_warning_event(event, "function %s not defined", token);
> - free_token(token);
> - return TEP_EVENT_ERROR;
> -}
> -
> -static enum tep_event_type
> -process_arg_token(struct tep_event *event, struct tep_print_arg *arg,
> - char **tok, enum tep_event_type type)
> -{
> - char *token;
> - char *atom;
> -
> - token = *tok;
> -
> - switch (type) {
> - case TEP_EVENT_ITEM:
> - if (strcmp(token, "REC") == 0) {
> - free_token(token);
> - type = process_entry(event, arg, &token);
> - break;
> - }
> - atom = token;
> - /* test the next token */
> - type = read_token_item(&token);
> -
> - /*
> - * If the next token is a parenthesis, then this
> - * is a function.
> - */
> - if (type == TEP_EVENT_DELIM && strcmp(token, "(") == 0) {
> - free_token(token);
> - token = NULL;
> - /* this will free atom. */
> - type = process_function(event, arg, atom, &token);
> - break;
> - }
> - /* atoms can be more than one token long */
> - while (type == TEP_EVENT_ITEM) {
> - int ret;
> -
> - ret = append(&atom, " ", token);
> - if (ret < 0) {
> - free(atom);
> - *tok = NULL;
> - free_token(token);
> - return TEP_EVENT_ERROR;
> - }
> - free_token(token);
> - type = read_token_item(&token);
> - }
> -
> - arg->type = TEP_PRINT_ATOM;
> - arg->atom.atom = atom;
> - break;
> -
> - case TEP_EVENT_DQUOTE:
> - case TEP_EVENT_SQUOTE:
> - arg->type = TEP_PRINT_ATOM;
> - arg->atom.atom = token;
> - type = read_token_item(&token);
> - break;
> - case TEP_EVENT_DELIM:
> - if (strcmp(token, "(") == 0) {
> - free_token(token);
> - type = process_paren(event, arg, &token);
> - break;
> - }
> - case TEP_EVENT_OP:
> - /* handle single ops */
> - arg->type = TEP_PRINT_OP;
> - arg->op.op = token;
> - arg->op.left = NULL;
> - type = process_op(event, arg, &token);
> -
> - /* On error, the op is freed */
> - if (type == TEP_EVENT_ERROR)
> - arg->op.op = NULL;
> -
> - /* return error type if errored */
> - break;
> -
> - case TEP_EVENT_ERROR ... TEP_EVENT_NEWLINE:
> - default:
> - do_warning_event(event, "unexpected type %d", type);
> - return TEP_EVENT_ERROR;
> - }
> - *tok = token;
> -
> - return type;
> -}
> -
> -static int event_read_print_args(struct tep_event *event, struct tep_print_arg **list)
> -{
> - enum tep_event_type type = TEP_EVENT_ERROR;
> - struct tep_print_arg *arg;
> - char *token;
> - int args = 0;
> -
> - do {
> - if (type == TEP_EVENT_NEWLINE) {
> - type = read_token_item(&token);
> - continue;
> - }
> -
> - arg = alloc_arg();
> - if (!arg) {
> - do_warning_event(event, "%s: not enough memory!",
> - __func__);
> - return -1;
> - }
> -
> - type = process_arg(event, arg, &token);
> -
> - if (type == TEP_EVENT_ERROR) {
> - free_token(token);
> - free_arg(arg);
> - return -1;
> - }
> -
> - *list = arg;
> - args++;
> -
> - if (type == TEP_EVENT_OP) {
> - type = process_op(event, arg, &token);
> - free_token(token);
> - if (type == TEP_EVENT_ERROR) {
> - *list = NULL;
> - free_arg(arg);
> - return -1;
> - }
> - list = &arg->next;
> - continue;
> - }
> -
> - if (type == TEP_EVENT_DELIM && strcmp(token, ",") == 0) {
> - free_token(token);
> - *list = arg;
> - list = &arg->next;
> - continue;
> - }
> - break;
> - } while (type != TEP_EVENT_NONE);
> -
> - if (type != TEP_EVENT_NONE && type != TEP_EVENT_ERROR)
> - free_token(token);
> -
> - return args;
> -}
> -
> -static int event_read_print(struct tep_event *event)
> -{
> - enum tep_event_type type;
> - char *token;
> - int ret;
> -
> - if (read_expected_item(TEP_EVENT_ITEM, "print") < 0)
> - return -1;
> -
> - if (read_expected(TEP_EVENT_ITEM, "fmt") < 0)
> - return -1;
> -
> - if (read_expected(TEP_EVENT_OP, ":") < 0)
> - return -1;
> -
> - if (read_expect_type(TEP_EVENT_DQUOTE, &token) < 0)
> - goto fail;
> -
> - concat:
> - event->print_fmt.format = token;
> - event->print_fmt.args = NULL;
> -
> - /* ok to have no arg */
> - type = read_token_item(&token);
> -
> - if (type == TEP_EVENT_NONE)
> - return 0;
> -
> - /* Handle concatenation of print lines */
> - if (type == TEP_EVENT_DQUOTE) {
> - char *cat;
> -
> - if (asprintf(&cat, "%s%s", event->print_fmt.format, token) < 0)
> - goto fail;
> - free_token(token);
> - free_token(event->print_fmt.format);
> - event->print_fmt.format = NULL;
> - token = cat;
> - goto concat;
> - }
> -
> - if (test_type_token(type, token, TEP_EVENT_DELIM, ","))
> - goto fail;
> -
> - free_token(token);
> -
> - ret = event_read_print_args(event, &event->print_fmt.args);
> - if (ret < 0)
> - return -1;
> -
> - return ret;
> -
> - fail:
> - free_token(token);
> - return -1;
> -}
> -
> -/**
> - * tep_find_common_field - return a common field by event
> - * @event: handle for the event
> - * @name: the name of the common field to return
> - *
> - * Returns a common field from the event by the given @name.
> - * This only searches the common fields and not all field.
> - */
> -struct tep_format_field *
> -tep_find_common_field(struct tep_event *event, const char *name)
> -{
> - struct tep_format_field *format;
> -
> - for (format = event->format.common_fields;
> - format; format = format->next) {
> - if (strcmp(format->name, name) == 0)
> - break;
> - }
> -
> - return format;
> -}
> -
> -/**
> - * tep_find_field - find a non-common field
> - * @event: handle for the event
> - * @name: the name of the non-common field
> - *
> - * Returns a non-common field by the given @name.
> - * This does not search common fields.
> - */
> -struct tep_format_field *
> -tep_find_field(struct tep_event *event, const char *name)
> -{
> - struct tep_format_field *format;
> -
> - for (format = event->format.fields;
> - format; format = format->next) {
> - if (strcmp(format->name, name) == 0)
> - break;
> - }
> -
> - return format;
> -}
> -
> -/**
> - * tep_find_any_field - find any field by name
> - * @event: handle for the event
> - * @name: the name of the field
> - *
> - * Returns a field by the given @name.
> - * This searches the common field names first, then
> - * the non-common ones if a common one was not found.
> - */
> -struct tep_format_field *
> -tep_find_any_field(struct tep_event *event, const char *name)
> -{
> - struct tep_format_field *format;
> -
> - format = tep_find_common_field(event, name);
> - if (format)
> - return format;
> - return tep_find_field(event, name);
> -}
> -
> -/**
> - * tep_read_number - read a number from data
> - * @tep: a handle to the trace event parser context
> - * @ptr: the raw data
> - * @size: the size of the data that holds the number
> - *
> - * Returns the number (converted to host) from the
> - * raw data.
> - */
> -unsigned long long tep_read_number(struct tep_handle *tep,
> - const void *ptr, int size)
> -{
> - unsigned long long val;
> -
> - switch (size) {
> - case 1:
> - return *(unsigned char *)ptr;
> - case 2:
> - return data2host2(tep, *(unsigned short *)ptr);
> - case 4:
> - return data2host4(tep, *(unsigned int *)ptr);
> - case 8:
> - memcpy(&val, (ptr), sizeof(unsigned long long));
> - return data2host8(tep, val);
> - default:
> - /* BUG! */
> - return 0;
> - }
> -}
> -
> -/**
> - * tep_read_number_field - read a number from data
> - * @field: a handle to the field
> - * @data: the raw data to read
> - * @value: the value to place the number in
> - *
> - * Reads raw data according to a field offset and size,
> - * and translates it into @value.
> - *
> - * Returns 0 on success, -1 otherwise.
> - */
> -int tep_read_number_field(struct tep_format_field *field, const void *data,
> - unsigned long long *value)
> -{
> - if (!field)
> - return -1;
> - switch (field->size) {
> - case 1:
> - case 2:
> - case 4:
> - case 8:
> - *value = tep_read_number(field->event->tep,
> - data + field->offset, field->size);
> - return 0;
> - default:
> - return -1;
> - }
> -}
> -
> -static int get_common_info(struct tep_handle *tep,
> - const char *type, int *offset, int *size)
> -{
> - struct tep_event *event;
> - struct tep_format_field *field;
> -
> - /*
> - * All events should have the same common elements.
> - * Pick any event to find where the type is;
> - */
> - if (!tep->events) {
> - do_warning("no event_list!");
> - return -1;
> - }
> -
> - event = tep->events[0];
> - field = tep_find_common_field(event, type);
> - if (!field)
> - return -1;
> -
> - *offset = field->offset;
> - *size = field->size;
> -
> - return 0;
> -}
> -
> -static int __parse_common(struct tep_handle *tep, void *data,
> - int *size, int *offset, const char *name)
> -{
> - int ret;
> -
> - if (!*size) {
> - ret = get_common_info(tep, name, offset, size);
> - if (ret < 0)
> - return ret;
> - }
> - return tep_read_number(tep, data + *offset, *size);
> -}
> -
> -static int trace_parse_common_type(struct tep_handle *tep, void *data)
> -{
> - return __parse_common(tep, data,
> - &tep->type_size, &tep->type_offset,
> - "common_type");
> -}
> -
> -static int parse_common_pid(struct tep_handle *tep, void *data)
> -{
> - return __parse_common(tep, data,
> - &tep->pid_size, &tep->pid_offset,
> - "common_pid");
> -}
> -
> -static int parse_common_pc(struct tep_handle *tep, void *data)
> -{
> - return __parse_common(tep, data,
> - &tep->pc_size, &tep->pc_offset,
> - "common_preempt_count");
> -}
> -
> -static int parse_common_flags(struct tep_handle *tep, void *data)
> -{
> - return __parse_common(tep, data,
> - &tep->flags_size, &tep->flags_offset,
> - "common_flags");
> -}
> -
> -static int parse_common_lock_depth(struct tep_handle *tep, void *data)
> -{
> - return __parse_common(tep, data,
> - &tep->ld_size, &tep->ld_offset,
> - "common_lock_depth");
> -}
> -
> -static int parse_common_migrate_disable(struct tep_handle *tep, void *data)
> -{
> - return __parse_common(tep, data,
> - &tep->ld_size, &tep->ld_offset,
> - "common_migrate_disable");
> -}
> -
> -static int events_id_cmp(const void *a, const void *b);
> -
> -/**
> - * tep_find_event - find an event by given id
> - * @tep: a handle to the trace event parser context
> - * @id: the id of the event
> - *
> - * Returns an event that has a given @id.
> - */
> -struct tep_event *tep_find_event(struct tep_handle *tep, int id)
> -{
> - struct tep_event **eventptr;
> - struct tep_event key;
> - struct tep_event *pkey = &key;
> -
> - /* Check cache first */
> - if (tep->last_event && tep->last_event->id == id)
> - return tep->last_event;
> -
> - key.id = id;
> -
> - eventptr = bsearch(&pkey, tep->events, tep->nr_events,
> - sizeof(*tep->events), events_id_cmp);
> -
> - if (eventptr) {
> - tep->last_event = *eventptr;
> - return *eventptr;
> - }
> -
> - return NULL;
> -}
> -
> -/**
> - * tep_find_event_by_name - find an event by given name
> - * @tep: a handle to the trace event parser context
> - * @sys: the system name to search for
> - * @name: the name of the event to search for
> - *
> - * This returns an event with a given @name and under the system
> - * @sys. If @sys is NULL the first event with @name is returned.
> - */
> -struct tep_event *
> -tep_find_event_by_name(struct tep_handle *tep,
> - const char *sys, const char *name)
> -{
> - struct tep_event *event = NULL;
> - int i;
> -
> - if (tep->last_event &&
> - strcmp(tep->last_event->name, name) == 0 &&
> - (!sys || strcmp(tep->last_event->system, sys) == 0))
> - return tep->last_event;
> -
> - for (i = 0; i < tep->nr_events; i++) {
> - event = tep->events[i];
> - if (strcmp(event->name, name) == 0) {
> - if (!sys)
> - break;
> - if (strcmp(event->system, sys) == 0)
> - break;
> - }
> - }
> - if (i == tep->nr_events)
> - event = NULL;
> -
> - tep->last_event = event;
> - return event;
> -}
> -
> -static unsigned long long
> -eval_num_arg(void *data, int size, struct tep_event *event, struct tep_print_arg *arg)
> -{
> - struct tep_handle *tep = event->tep;
> - unsigned long long val = 0;
> - unsigned long long left, right;
> - struct tep_print_arg *typearg = NULL;
> - struct tep_print_arg *larg;
> - unsigned long offset;
> - unsigned int field_size;
> -
> - switch (arg->type) {
> - case TEP_PRINT_NULL:
> - /* ?? */
> - return 0;
> - case TEP_PRINT_ATOM:
> - return strtoull(arg->atom.atom, NULL, 0);
> - case TEP_PRINT_FIELD:
> - if (!arg->field.field) {
> - arg->field.field = tep_find_any_field(event, arg->field.name);
> - if (!arg->field.field)
> - goto out_warning_field;
> -
> - }
> - /* must be a number */
> - val = tep_read_number(tep, data + arg->field.field->offset,
> - arg->field.field->size);
> - break;
> - case TEP_PRINT_FLAGS:
> - case TEP_PRINT_SYMBOL:
> - case TEP_PRINT_INT_ARRAY:
> - case TEP_PRINT_HEX:
> - case TEP_PRINT_HEX_STR:
> - break;
> - case TEP_PRINT_TYPE:
> - val = eval_num_arg(data, size, event, arg->typecast.item);
> - return eval_type(val, arg, 0);
> - case TEP_PRINT_STRING:
> - case TEP_PRINT_BSTRING:
> - case TEP_PRINT_BITMASK:
> - return 0;
> - case TEP_PRINT_FUNC: {
> - struct trace_seq s;
> - trace_seq_init(&s);
> - val = process_defined_func(&s, data, size, event, arg);
> - trace_seq_destroy(&s);
> - return val;
> - }
> - case TEP_PRINT_OP:
> - if (strcmp(arg->op.op, "[") == 0) {
> - /*
> - * Arrays are special, since we don't want
> - * to read the arg as is.
> - */
> - right = eval_num_arg(data, size, event, arg->op.right);
> -
> - /* handle typecasts */
> - larg = arg->op.left;
> - while (larg->type == TEP_PRINT_TYPE) {
> - if (!typearg)
> - typearg = larg;
> - larg = larg->typecast.item;
> - }
> -
> - /* Default to long size */
> - field_size = tep->long_size;
> -
> - switch (larg->type) {
> - case TEP_PRINT_DYNAMIC_ARRAY:
> - offset = tep_read_number(tep,
> - data + larg->dynarray.field->offset,
> - larg->dynarray.field->size);
> - if (larg->dynarray.field->elementsize)
> - field_size = larg->dynarray.field->elementsize;
> - /*
> - * The actual length of the dynamic array is stored
> - * in the top half of the field, and the offset
> - * is in the bottom half of the 32 bit field.
> - */
> - offset &= 0xffff;
> - offset += right;
> - break;
> - case TEP_PRINT_FIELD:
> - if (!larg->field.field) {
> - larg->field.field =
> - tep_find_any_field(event, larg->field.name);
> - if (!larg->field.field) {
> - arg = larg;
> - goto out_warning_field;
> - }
> - }
> - field_size = larg->field.field->elementsize;
> - offset = larg->field.field->offset +
> - right * larg->field.field->elementsize;
> - break;
> - default:
> - goto default_op; /* oops, all bets off */
> - }
> - val = tep_read_number(tep,
> - data + offset, field_size);
> - if (typearg)
> - val = eval_type(val, typearg, 1);
> - break;
> - } else if (strcmp(arg->op.op, "?") == 0) {
> - left = eval_num_arg(data, size, event, arg->op.left);
> - arg = arg->op.right;
> - if (left)
> - val = eval_num_arg(data, size, event, arg->op.left);
> - else
> - val = eval_num_arg(data, size, event, arg->op.right);
> - break;
> - }
> - default_op:
> - left = eval_num_arg(data, size, event, arg->op.left);
> - right = eval_num_arg(data, size, event, arg->op.right);
> - switch (arg->op.op[0]) {
> - case '!':
> - switch (arg->op.op[1]) {
> - case 0:
> - val = !right;
> - break;
> - case '=':
> - val = left != right;
> - break;
> - default:
> - goto out_warning_op;
> - }
> - break;
> - case '~':
> - val = ~right;
> - break;
> - case '|':
> - if (arg->op.op[1])
> - val = left || right;
> - else
> - val = left | right;
> - break;
> - case '&':
> - if (arg->op.op[1])
> - val = left && right;
> - else
> - val = left & right;
> - break;
> - case '<':
> - switch (arg->op.op[1]) {
> - case 0:
> - val = left < right;
> - break;
> - case '<':
> - val = left << right;
> - break;
> - case '=':
> - val = left <= right;
> - break;
> - default:
> - goto out_warning_op;
> - }
> - break;
> - case '>':
> - switch (arg->op.op[1]) {
> - case 0:
> - val = left > right;
> - break;
> - case '>':
> - val = left >> right;
> - break;
> - case '=':
> - val = left >= right;
> - break;
> - default:
> - goto out_warning_op;
> - }
> - break;
> - case '=':
> - if (arg->op.op[1] != '=')
> - goto out_warning_op;
> -
> - val = left == right;
> - break;
> - case '-':
> - val = left - right;
> - break;
> - case '+':
> - val = left + right;
> - break;
> - case '/':
> - val = left / right;
> - break;
> - case '%':
> - val = left % right;
> - break;
> - case '*':
> - val = left * right;
> - break;
> - default:
> - goto out_warning_op;
> - }
> - break;
> - case TEP_PRINT_DYNAMIC_ARRAY_LEN:
> - offset = tep_read_number(tep,
> - data + arg->dynarray.field->offset,
> - arg->dynarray.field->size);
> - /*
> - * The total allocated length of the dynamic array is
> - * stored in the top half of the field, and the offset
> - * is in the bottom half of the 32 bit field.
> - */
> - val = (unsigned long long)(offset >> 16);
> - break;
> - case TEP_PRINT_DYNAMIC_ARRAY:
> - /* Without [], we pass the address to the dynamic data */
> - offset = tep_read_number(tep,
> - data + arg->dynarray.field->offset,
> - arg->dynarray.field->size);
> - /*
> - * The total allocated length of the dynamic array is
> - * stored in the top half of the field, and the offset
> - * is in the bottom half of the 32 bit field.
> - */
> - offset &= 0xffff;
> - val = (unsigned long long)((unsigned long)data + offset);
> - break;
> - default: /* not sure what to do there */
> - return 0;
> - }
> - return val;
> -
> -out_warning_op:
> - do_warning_event(event, "%s: unknown op '%s'", __func__, arg->op.op);
> - return 0;
> -
> -out_warning_field:
> - do_warning_event(event, "%s: field %s not found",
> - __func__, arg->field.name);
> - return 0;
> -}
> -
> -struct flag {
> - const char *name;
> - unsigned long long value;
> -};
> -
> -static const struct flag flags[] = {
> - { "HI_SOFTIRQ", 0 },
> - { "TIMER_SOFTIRQ", 1 },
> - { "NET_TX_SOFTIRQ", 2 },
> - { "NET_RX_SOFTIRQ", 3 },
> - { "BLOCK_SOFTIRQ", 4 },
> - { "IRQ_POLL_SOFTIRQ", 5 },
> - { "TASKLET_SOFTIRQ", 6 },
> - { "SCHED_SOFTIRQ", 7 },
> - { "HRTIMER_SOFTIRQ", 8 },
> - { "RCU_SOFTIRQ", 9 },
> -
> - { "HRTIMER_NORESTART", 0 },
> - { "HRTIMER_RESTART", 1 },
> -};
> -
> -static long long eval_flag(const char *flag)
> -{
> - int i;
> -
> - /*
> - * Some flags in the format files do not get converted.
> - * If the flag is not numeric, see if it is something that
> - * we already know about.
> - */
> - if (isdigit(flag[0]))
> - return strtoull(flag, NULL, 0);
> -
> - for (i = 0; i < (int)(sizeof(flags)/sizeof(flags[0])); i++)
> - if (strcmp(flags[i].name, flag) == 0)
> - return flags[i].value;
> -
> - return -1LL;
> -}
> -
> -static void print_str_to_seq(struct trace_seq *s, const char *format,
> - int len_arg, const char *str)
> -{
> - if (len_arg >= 0)
> - trace_seq_printf(s, format, len_arg, str);
> - else
> - trace_seq_printf(s, format, str);
> -}
> -
> -static void print_bitmask_to_seq(struct tep_handle *tep,
> - struct trace_seq *s, const char *format,
> - int len_arg, const void *data, int size)
> -{
> - int nr_bits = size * 8;
> - int str_size = (nr_bits + 3) / 4;
> - int len = 0;
> - char buf[3];
> - char *str;
> - int index;
> - int i;
> -
> - /*
> - * The kernel likes to put in commas every 32 bits, we
> - * can do the same.
> - */
> - str_size += (nr_bits - 1) / 32;
> -
> - str = malloc(str_size + 1);
> - if (!str) {
> - do_warning("%s: not enough memory!", __func__);
> - return;
> - }
> - str[str_size] = 0;
> -
> - /* Start out with -2 for the two chars per byte */
> - for (i = str_size - 2; i >= 0; i -= 2) {
> - /*
> - * data points to a bit mask of size bytes.
> - * In the kernel, this is an array of long words, thus
> - * endianness is very important.
> - */
> - if (tep->file_bigendian)
> - index = size - (len + 1);
> - else
> - index = len;
> -
> - snprintf(buf, 3, "%02x", *((unsigned char *)data + index));
> - memcpy(str + i, buf, 2);
> - len++;
> - if (!(len & 3) && i > 0) {
> - i--;
> - str[i] = ',';
> - }
> - }
> -
> - if (len_arg >= 0)
> - trace_seq_printf(s, format, len_arg, str);
> - else
> - trace_seq_printf(s, format, str);
> -
> - free(str);
> -}
> -
> -static void print_str_arg(struct trace_seq *s, void *data, int size,
> - struct tep_event *event, const char *format,
> - int len_arg, struct tep_print_arg *arg)
> -{
> - struct tep_handle *tep = event->tep;
> - struct tep_print_flag_sym *flag;
> - struct tep_format_field *field;
> - struct printk_map *printk;
> - long long val, fval;
> - unsigned long long addr;
> - char *str;
> - unsigned char *hex;
> - int print;
> - int i, len;
> -
> - switch (arg->type) {
> - case TEP_PRINT_NULL:
> - /* ?? */
> - return;
> - case TEP_PRINT_ATOM:
> - print_str_to_seq(s, format, len_arg, arg->atom.atom);
> - return;
> - case TEP_PRINT_FIELD:
> - field = arg->field.field;
> - if (!field) {
> - field = tep_find_any_field(event, arg->field.name);
> - if (!field) {
> - str = arg->field.name;
> - goto out_warning_field;
> - }
> - arg->field.field = field;
> - }
> - /* Zero sized fields, mean the rest of the data */
> - len = field->size ? : size - field->offset;
> -
> - /*
> - * Some events pass in pointers. If this is not an array
> - * and the size is the same as long_size, assume that it
> - * is a pointer.
> - */
> - if (!(field->flags & TEP_FIELD_IS_ARRAY) &&
> - field->size == tep->long_size) {
> -
> - /* Handle heterogeneous recording and processing
> - * architectures
> - *
> - * CASE I:
> - * Traces recorded on 32-bit devices (32-bit
> - * addressing) and processed on 64-bit devices:
> - * In this case, only 32 bits should be read.
> - *
> - * CASE II:
> - * Traces recorded on 64 bit devices and processed
> - * on 32-bit devices:
> - * In this case, 64 bits must be read.
> - */
> - addr = (tep->long_size == 8) ?
> - *(unsigned long long *)(data + field->offset) :
> - (unsigned long long)*(unsigned int *)(data + field->offset);
> -
> - /* Check if it matches a print format */
> - printk = find_printk(tep, addr);
> - if (printk)
> - trace_seq_puts(s, printk->printk);
> - else
> - trace_seq_printf(s, "%llx", addr);
> - break;
> - }
> - str = malloc(len + 1);
> - if (!str) {
> - do_warning_event(event, "%s: not enough memory!",
> - __func__);
> - return;
> - }
> - memcpy(str, data + field->offset, len);
> - str[len] = 0;
> - print_str_to_seq(s, format, len_arg, str);
> - free(str);
> - break;
> - case TEP_PRINT_FLAGS:
> - val = eval_num_arg(data, size, event, arg->flags.field);
> - print = 0;
> - for (flag = arg->flags.flags; flag; flag = flag->next) {
> - fval = eval_flag(flag->value);
> - if (!val && fval < 0) {
> - print_str_to_seq(s, format, len_arg, flag->str);
> - break;
> - }
> - if (fval > 0 && (val & fval) == fval) {
> - if (print && arg->flags.delim)
> - trace_seq_puts(s, arg->flags.delim);
> - print_str_to_seq(s, format, len_arg, flag->str);
> - print = 1;
> - val &= ~fval;
> - }
> - }
> - if (val) {
> - if (print && arg->flags.delim)
> - trace_seq_puts(s, arg->flags.delim);
> - trace_seq_printf(s, "0x%llx", val);
> - }
> - break;
> - case TEP_PRINT_SYMBOL:
> - val = eval_num_arg(data, size, event, arg->symbol.field);
> - for (flag = arg->symbol.symbols; flag; flag = flag->next) {
> - fval = eval_flag(flag->value);
> - if (val == fval) {
> - print_str_to_seq(s, format, len_arg, flag->str);
> - break;
> - }
> - }
> - if (!flag)
> - trace_seq_printf(s, "0x%llx", val);
> - break;
> - case TEP_PRINT_HEX:
> - case TEP_PRINT_HEX_STR:
> - if (arg->hex.field->type == TEP_PRINT_DYNAMIC_ARRAY) {
> - unsigned long offset;
> - offset = tep_read_number(tep,
> - data + arg->hex.field->dynarray.field->offset,
> - arg->hex.field->dynarray.field->size);
> - hex = data + (offset & 0xffff);
> - } else {
> - field = arg->hex.field->field.field;
> - if (!field) {
> - str = arg->hex.field->field.name;
> - field = tep_find_any_field(event, str);
> - if (!field)
> - goto out_warning_field;
> - arg->hex.field->field.field = field;
> - }
> - hex = data + field->offset;
> - }
> - len = eval_num_arg(data, size, event, arg->hex.size);
> - for (i = 0; i < len; i++) {
> - if (i && arg->type == TEP_PRINT_HEX)
> - trace_seq_putc(s, ' ');
> - trace_seq_printf(s, "%02x", hex[i]);
> - }
> - break;
> -
> - case TEP_PRINT_INT_ARRAY: {
> - void *num;
> - int el_size;
> -
> - if (arg->int_array.field->type == TEP_PRINT_DYNAMIC_ARRAY) {
> - unsigned long offset;
> - struct tep_format_field *field =
> - arg->int_array.field->dynarray.field;
> - offset = tep_read_number(tep,
> - data + field->offset,
> - field->size);
> - num = data + (offset & 0xffff);
> - } else {
> - field = arg->int_array.field->field.field;
> - if (!field) {
> - str = arg->int_array.field->field.name;
> - field = tep_find_any_field(event, str);
> - if (!field)
> - goto out_warning_field;
> - arg->int_array.field->field.field = field;
> - }
> - num = data + field->offset;
> - }
> - len = eval_num_arg(data, size, event, arg->int_array.count);
> - el_size = eval_num_arg(data, size, event,
> - arg->int_array.el_size);
> - for (i = 0; i < len; i++) {
> - if (i)
> - trace_seq_putc(s, ' ');
> -
> - if (el_size == 1) {
> - trace_seq_printf(s, "%u", *(uint8_t *)num);
> - } else if (el_size == 2) {
> - trace_seq_printf(s, "%u", *(uint16_t *)num);
> - } else if (el_size == 4) {
> - trace_seq_printf(s, "%u", *(uint32_t *)num);
> - } else if (el_size == 8) {
> - trace_seq_printf(s, "%"PRIu64, *(uint64_t *)num);
> - } else {
> - trace_seq_printf(s, "BAD SIZE:%d 0x%x",
> - el_size, *(uint8_t *)num);
> - el_size = 1;
> - }
> -
> - num += el_size;
> - }
> - break;
> - }
> - case TEP_PRINT_TYPE:
> - break;
> - case TEP_PRINT_STRING: {
> - int str_offset;
> -
> - if (!arg->string.field)
> - arg->string.field = tep_find_any_field(event, arg->string.string);
> - if (!arg->string.field)
> - break;
> -
> - str_offset = data2host4(tep,
> - *(unsigned int *)(data + arg->string.field->offset));
> - str_offset &= 0xffff;
> - if (arg->string.field->flags & TEP_FIELD_IS_RELATIVE)
> - str_offset += arg->string.field->offset + arg->string.field->size;
> - print_str_to_seq(s, format, len_arg, ((char *)data) + str_offset);
> - break;
> - }
> - case TEP_PRINT_BSTRING:
> - print_str_to_seq(s, format, len_arg, arg->string.string);
> - break;
> - case TEP_PRINT_BITMASK: {
> - int bitmask_offset;
> - int bitmask_size;
> -
> - if (!arg->bitmask.field)
> - arg->bitmask.field = tep_find_any_field(event, arg->bitmask.bitmask);
> - if (!arg->bitmask.field)
> - break;
> - bitmask_offset = data2host4(tep,
> - *(unsigned int *)(data + arg->bitmask.field->offset));
> - bitmask_size = bitmask_offset >> 16;
> - bitmask_offset &= 0xffff;
> - if (arg->bitmask.field->flags & TEP_FIELD_IS_RELATIVE)
> - bitmask_offset += arg->bitmask.field->offset + arg->bitmask.field->size;
> - print_bitmask_to_seq(tep, s, format, len_arg,
> - data + bitmask_offset, bitmask_size);
> - break;
> - }
> - case TEP_PRINT_OP:
> - /*
> - * The only op for string should be ? :
> - */
> - if (arg->op.op[0] != '?')
> - return;
> - val = eval_num_arg(data, size, event, arg->op.left);
> - if (val)
> - print_str_arg(s, data, size, event,
> - format, len_arg, arg->op.right->op.left);
> - else
> - print_str_arg(s, data, size, event,
> - format, len_arg, arg->op.right->op.right);
> - break;
> - case TEP_PRINT_FUNC:
> - process_defined_func(s, data, size, event, arg);
> - break;
> - default:
> - /* well... */
> - break;
> - }
> -
> - return;
> -
> -out_warning_field:
> - do_warning_event(event, "%s: field %s not found",
> - __func__, arg->field.name);
> -}
> -
> -static unsigned long long
> -process_defined_func(struct trace_seq *s, void *data, int size,
> - struct tep_event *event, struct tep_print_arg *arg)
> -{
> - struct tep_function_handler *func_handle = arg->func.func;
> - struct func_params *param;
> - unsigned long long *args;
> - unsigned long long ret;
> - struct tep_print_arg *farg;
> - struct trace_seq str;
> - struct save_str {
> - struct save_str *next;
> - char *str;
> - } *strings = NULL, *string;
> - int i;
> -
> - if (!func_handle->nr_args) {
> - ret = (*func_handle->func)(s, NULL);
> - goto out;
> - }
> -
> - farg = arg->func.args;
> - param = func_handle->params;
> -
> - ret = ULLONG_MAX;
> - args = malloc(sizeof(*args) * func_handle->nr_args);
> - if (!args)
> - goto out;
> -
> - for (i = 0; i < func_handle->nr_args; i++) {
> - switch (param->type) {
> - case TEP_FUNC_ARG_INT:
> - case TEP_FUNC_ARG_LONG:
> - case TEP_FUNC_ARG_PTR:
> - args[i] = eval_num_arg(data, size, event, farg);
> - break;
> - case TEP_FUNC_ARG_STRING:
> - trace_seq_init(&str);
> - print_str_arg(&str, data, size, event, "%s", -1, farg);
> - trace_seq_terminate(&str);
> - string = malloc(sizeof(*string));
> - if (!string) {
> - do_warning_event(event, "%s(%d): malloc str",
> - __func__, __LINE__);
> - goto out_free;
> - }
> - string->next = strings;
> - string->str = strdup(str.buffer);
> - if (!string->str) {
> - free(string);
> - do_warning_event(event, "%s(%d): malloc str",
> - __func__, __LINE__);
> - goto out_free;
> - }
> - args[i] = (uintptr_t)string->str;
> - strings = string;
> - trace_seq_destroy(&str);
> - break;
> - default:
> - /*
> - * Something went totally wrong, this is not
> - * an input error, something in this code broke.
> - */
> - do_warning_event(event, "Unexpected end of arguments\n");
> - goto out_free;
> - }
> - farg = farg->next;
> - param = param->next;
> - }
> -
> - ret = (*func_handle->func)(s, args);
> -out_free:
> - free(args);
> - while (strings) {
> - string = strings;
> - strings = string->next;
> - free(string->str);
> - free(string);
> - }
> -
> - out:
> - /* TBD : handle return type here */
> - return ret;
> -}
> -
> -static void free_args(struct tep_print_arg *args)
> -{
> - struct tep_print_arg *next;
> -
> - while (args) {
> - next = args->next;
> -
> - free_arg(args);
> - args = next;
> - }
> -}
> -
> -static struct tep_print_arg *make_bprint_args(char *fmt, void *data, int size, struct tep_event *event)
> -{
> - struct tep_handle *tep = event->tep;
> - struct tep_format_field *field, *ip_field;
> - struct tep_print_arg *args, *arg, **next;
> - unsigned long long ip, val;
> - char *ptr;
> - void *bptr;
> - int vsize = 0;
> -
> - field = tep->bprint_buf_field;
> - ip_field = tep->bprint_ip_field;
> -
> - if (!field) {
> - field = tep_find_field(event, "buf");
> - if (!field) {
> - do_warning_event(event, "can't find buffer field for binary printk");
> - return NULL;
> - }
> - ip_field = tep_find_field(event, "ip");
> - if (!ip_field) {
> - do_warning_event(event, "can't find ip field for binary printk");
> - return NULL;
> - }
> - tep->bprint_buf_field = field;
> - tep->bprint_ip_field = ip_field;
> - }
> -
> - ip = tep_read_number(tep, data + ip_field->offset, ip_field->size);
> -
> - /*
> - * The first arg is the IP pointer.
> - */
> - args = alloc_arg();
> - if (!args) {
> - do_warning_event(event, "%s(%d): not enough memory!",
> - __func__, __LINE__);
> - return NULL;
> - }
> - arg = args;
> - arg->next = NULL;
> - next = &arg->next;
> -
> - arg->type = TEP_PRINT_ATOM;
> -
> - if (asprintf(&arg->atom.atom, "%lld", ip) < 0)
> - goto out_free;
> -
> - /* skip the first "%ps: " */
> - for (ptr = fmt + 5, bptr = data + field->offset;
> - bptr < data + size && *ptr; ptr++) {
> - int ls = 0;
> -
> - if (*ptr == '%') {
> - process_again:
> - ptr++;
> - switch (*ptr) {
> - case '%':
> - break;
> - case 'l':
> - ls++;
> - goto process_again;
> - case 'L':
> - ls = 2;
> - goto process_again;
> - case '0' ... '9':
> - goto process_again;
> - case '.':
> - goto process_again;
> - case 'z':
> - case 'Z':
> - ls = 1;
> - goto process_again;
> - case 'p':
> - ls = 1;
> - if (isalnum(ptr[1])) {
> - ptr++;
> - /* Check for special pointers */
> - switch (*ptr) {
> - case 's':
> - case 'S':
> - case 'x':
> - break;
> - case 'f':
> - case 'F':
> - /*
> - * Pre-5.5 kernels use %pf and
> - * %pF for printing symbols
> - * while kernels since 5.5 use
> - * %pfw for fwnodes. So check
> - * %p[fF] isn't followed by 'w'.
> - */
> - if (ptr[1] != 'w')
> - break;
> - /* fall through */
> - default:
> - /*
> - * Older kernels do not process
> - * dereferenced pointers.
> - * Only process if the pointer
> - * value is a printable.
> - */
> - if (isprint(*(char *)bptr))
> - goto process_string;
> - }
> - }
> - /* fall through */
> - case 'd':
> - case 'u':
> - case 'i':
> - case 'x':
> - case 'X':
> - case 'o':
> - switch (ls) {
> - case 0:
> - vsize = 4;
> - break;
> - case 1:
> - vsize = tep->long_size;
> - break;
> - case 2:
> - vsize = 8;
> - break;
> - default:
> - vsize = ls; /* ? */
> - break;
> - }
> - /* fall through */
> - case '*':
> - if (*ptr == '*')
> - vsize = 4;
> -
> - /* the pointers are always 4 bytes aligned */
> - bptr = (void *)(((unsigned long)bptr + 3) &
> - ~3);
> - val = tep_read_number(tep, bptr, vsize);
> - bptr += vsize;
> - arg = alloc_arg();
> - if (!arg) {
> - do_warning_event(event, "%s(%d): not enough memory!",
> - __func__, __LINE__);
> - goto out_free;
> - }
> - arg->next = NULL;
> - arg->type = TEP_PRINT_ATOM;
> - if (asprintf(&arg->atom.atom, "%lld", val) < 0) {
> - free(arg);
> - goto out_free;
> - }
> - *next = arg;
> - next = &arg->next;
> - /*
> - * The '*' case means that an arg is used as the length.
> - * We need to continue to figure out for what.
> - */
> - if (*ptr == '*')
> - goto process_again;
> -
> - break;
> - case 's':
> - process_string:
> - arg = alloc_arg();
> - if (!arg) {
> - do_warning_event(event, "%s(%d): not enough memory!",
> - __func__, __LINE__);
> - goto out_free;
> - }
> - arg->next = NULL;
> - arg->type = TEP_PRINT_BSTRING;
> - arg->string.string = strdup(bptr);
> - if (!arg->string.string)
> - goto out_free;
> - bptr += strlen(bptr) + 1;
> - *next = arg;
> - next = &arg->next;
> - default:
> - break;
> - }
> - }
> - }
> -
> - return args;
> -
> -out_free:
> - free_args(args);
> - return NULL;
> -}
> -
> -static char *
> -get_bprint_format(void *data, int size __maybe_unused,
> - struct tep_event *event)
> -{
> - struct tep_handle *tep = event->tep;
> - unsigned long long addr;
> - struct tep_format_field *field;
> - struct printk_map *printk;
> - char *format;
> -
> - field = tep->bprint_fmt_field;
> -
> - if (!field) {
> - field = tep_find_field(event, "fmt");
> - if (!field) {
> - do_warning_event(event, "can't find format field for binary printk");
> - return NULL;
> - }
> - tep->bprint_fmt_field = field;
> - }
> -
> - addr = tep_read_number(tep, data + field->offset, field->size);
> -
> - printk = find_printk(tep, addr);
> - if (!printk) {
> - if (asprintf(&format, "%%ps: (NO FORMAT FOUND at %llx)\n", addr) < 0)
> - return NULL;
> - return format;
> - }
> -
> - if (asprintf(&format, "%s: %s", "%ps", printk->printk) < 0)
> - return NULL;
> -
> - return format;
> -}
> -
> -static int print_mac_arg(struct trace_seq *s, const char *format,
> - void *data, int size, struct tep_event *event,
> - struct tep_print_arg *arg)
> -{
> - const char *fmt = "%.2x:%.2x:%.2x:%.2x:%.2x:%.2x";
> - bool reverse = false;
> - unsigned char *buf;
> - int ret = 0;
> -
> - if (arg->type == TEP_PRINT_FUNC) {
> - process_defined_func(s, data, size, event, arg);
> - return 0;
> - }
> -
> - if (arg->type != TEP_PRINT_FIELD) {
> - trace_seq_printf(s, "ARG TYPE NOT FIELD BUT %d",
> - arg->type);
> - return 0;
> - }
> -
> - if (format[0] == 'm') {
> - fmt = "%.2x%.2x%.2x%.2x%.2x%.2x";
> - } else if (format[0] == 'M' && format[1] == 'F') {
> - fmt = "%.2x-%.2x-%.2x-%.2x-%.2x-%.2x";
> - ret++;
> - }
> - if (format[1] == 'R') {
> - reverse = true;
> - ret++;
> - }
> -
> - if (!arg->field.field) {
> - arg->field.field =
> - tep_find_any_field(event, arg->field.name);
> - if (!arg->field.field) {
> - do_warning_event(event, "%s: field %s not found",
> - __func__, arg->field.name);
> - return ret;
> - }
> - }
> - if (arg->field.field->size != 6) {
> - trace_seq_printf(s, "INVALIDMAC");
> - return ret;
> - }
> -
> - buf = data + arg->field.field->offset;
> - if (reverse)
> - trace_seq_printf(s, fmt, buf[5], buf[4], buf[3], buf[2], buf[1], buf[0]);
> - else
> - trace_seq_printf(s, fmt, buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]);
> -
> - return ret;
> -}
> -
> -static int parse_ip4_print_args(struct tep_handle *tep,
> - const char *ptr, bool *reverse)
> -{
> - int ret = 0;
> -
> - *reverse = false;
> -
> - /* hnbl */
> - switch (*ptr) {
> - case 'h':
> - if (tep->file_bigendian)
> - *reverse = false;
> - else
> - *reverse = true;
> - ret++;
> - break;
> - case 'l':
> - *reverse = true;
> - ret++;
> - break;
> - case 'n':
> - case 'b':
> - ret++;
> - /* fall through */
> - default:
> - *reverse = false;
> - break;
> - }
> -
> - return ret;
> -}
> -
> -static void print_ip4_addr(struct trace_seq *s, char i, bool reverse, unsigned char *buf)
> -{
> - const char *fmt;
> -
> - if (i == 'i')
> - fmt = "%03d.%03d.%03d.%03d";
> - else
> - fmt = "%d.%d.%d.%d";
> -
> - if (reverse)
> - trace_seq_printf(s, fmt, buf[3], buf[2], buf[1], buf[0]);
> - else
> - trace_seq_printf(s, fmt, buf[0], buf[1], buf[2], buf[3]);
> -
> -}
> -
> -static inline bool ipv6_addr_v4mapped(const struct in6_addr *a)
> -{
> - return ((unsigned long)(a->s6_addr32[0] | a->s6_addr32[1]) |
> - (unsigned long)(a->s6_addr32[2] ^ htonl(0x0000ffff))) == 0UL;
> -}
> -
> -static inline bool ipv6_addr_is_isatap(const struct in6_addr *addr)
> -{
> - return (addr->s6_addr32[2] | htonl(0x02000000)) == htonl(0x02005EFE);
> -}
> -
> -static void print_ip6c_addr(struct trace_seq *s, unsigned char *addr)
> -{
> - int i, j, range;
> - unsigned char zerolength[8];
> - int longest = 1;
> - int colonpos = -1;
> - uint16_t word;
> - uint8_t hi, lo;
> - bool needcolon = false;
> - bool useIPv4;
> - struct in6_addr in6;
> -
> - memcpy(&in6, addr, sizeof(struct in6_addr));
> -
> - useIPv4 = ipv6_addr_v4mapped(&in6) || ipv6_addr_is_isatap(&in6);
> -
> - memset(zerolength, 0, sizeof(zerolength));
> -
> - if (useIPv4)
> - range = 6;
> - else
> - range = 8;
> -
> - /* find position of longest 0 run */
> - for (i = 0; i < range; i++) {
> - for (j = i; j < range; j++) {
> - if (in6.s6_addr16[j] != 0)
> - break;
> - zerolength[i]++;
> - }
> - }
> - for (i = 0; i < range; i++) {
> - if (zerolength[i] > longest) {
> - longest = zerolength[i];
> - colonpos = i;
> - }
> - }
> - if (longest == 1) /* don't compress a single 0 */
> - colonpos = -1;
> -
> - /* emit address */
> - for (i = 0; i < range; i++) {
> - if (i == colonpos) {
> - if (needcolon || i == 0)
> - trace_seq_printf(s, ":");
> - trace_seq_printf(s, ":");
> - needcolon = false;
> - i += longest - 1;
> - continue;
> - }
> - if (needcolon) {
> - trace_seq_printf(s, ":");
> - needcolon = false;
> - }
> - /* hex u16 without leading 0s */
> - word = ntohs(in6.s6_addr16[i]);
> - hi = word >> 8;
> - lo = word & 0xff;
> - if (hi)
> - trace_seq_printf(s, "%x%02x", hi, lo);
> - else
> - trace_seq_printf(s, "%x", lo);
> -
> - needcolon = true;
> - }
> -
> - if (useIPv4) {
> - if (needcolon)
> - trace_seq_printf(s, ":");
> - print_ip4_addr(s, 'I', false, &in6.s6_addr[12]);
> - }
> -
> - return;
> -}
> -
> -static void print_ip6_addr(struct trace_seq *s, char i, unsigned char *buf)
> -{
> - int j;
> -
> - for (j = 0; j < 16; j += 2) {
> - trace_seq_printf(s, "%02x%02x", buf[j], buf[j+1]);
> - if (i == 'I' && j < 14)
> - trace_seq_printf(s, ":");
> - }
> -}
> -
> -/*
> - * %pi4 print an IPv4 address with leading zeros
> - * %pI4 print an IPv4 address without leading zeros
> - * %pi6 print an IPv6 address without colons
> - * %pI6 print an IPv6 address with colons
> - * %pI6c print an IPv6 address in compressed form with colons
> - * %pISpc print an IP address based on sockaddr; p adds port.
> - */
> -static int print_ipv4_arg(struct trace_seq *s, const char *ptr, char i,
> - void *data, int size, struct tep_event *event,
> - struct tep_print_arg *arg)
> -{
> - bool reverse = false;
> - unsigned char *buf;
> - int ret;
> -
> - ret = parse_ip4_print_args(event->tep, ptr, &reverse);
> -
> - if (arg->type == TEP_PRINT_FUNC) {
> - process_defined_func(s, data, size, event, arg);
> - return ret;
> - }
> -
> - if (arg->type != TEP_PRINT_FIELD) {
> - trace_seq_printf(s, "ARG TYPE NOT FIELD BUT %d", arg->type);
> - return ret;
> - }
> -
> - if (!arg->field.field) {
> - arg->field.field =
> - tep_find_any_field(event, arg->field.name);
> - if (!arg->field.field) {
> - do_warning("%s: field %s not found",
> - __func__, arg->field.name);
> - return ret;
> - }
> - }
> -
> - buf = data + arg->field.field->offset;
> -
> - if (arg->field.field->size != 4) {
> - trace_seq_printf(s, "INVALIDIPv4");
> - return ret;
> - }
> -
> - print_ip4_addr(s, i, reverse, buf);
> - return ret;
> -
> -}
> -
> -static int print_ipv6_arg(struct trace_seq *s, const char *ptr, char i,
> - void *data, int size, struct tep_event *event,
> - struct tep_print_arg *arg)
> -{
> - char have_c = 0;
> - unsigned char *buf;
> - int rc = 0;
> -
> - /* pI6c */
> - if (i == 'I' && *ptr == 'c') {
> - have_c = 1;
> - ptr++;
> - rc++;
> - }
> -
> - if (arg->type == TEP_PRINT_FUNC) {
> - process_defined_func(s, data, size, event, arg);
> - return rc;
> - }
> -
> - if (arg->type != TEP_PRINT_FIELD) {
> - trace_seq_printf(s, "ARG TYPE NOT FIELD BUT %d", arg->type);
> - return rc;
> - }
> -
> - if (!arg->field.field) {
> - arg->field.field =
> - tep_find_any_field(event, arg->field.name);
> - if (!arg->field.field) {
> - do_warning("%s: field %s not found",
> - __func__, arg->field.name);
> - return rc;
> - }
> - }
> -
> - buf = data + arg->field.field->offset;
> -
> - if (arg->field.field->size != 16) {
> - trace_seq_printf(s, "INVALIDIPv6");
> - return rc;
> - }
> -
> - if (have_c)
> - print_ip6c_addr(s, buf);
> - else
> - print_ip6_addr(s, i, buf);
> -
> - return rc;
> -}
> -
> -static int print_ipsa_arg(struct trace_seq *s, const char *ptr, char i,
> - void *data, int size, struct tep_event *event,
> - struct tep_print_arg *arg)
> -{
> - char have_c = 0, have_p = 0;
> - unsigned char *buf;
> - struct sockaddr_storage *sa;
> - bool reverse = false;
> - int rc = 0;
> - int ret;
> -
> - /* pISpc */
> - if (i == 'I') {
> - if (*ptr == 'p') {
> - have_p = 1;
> - ptr++;
> - rc++;
> - }
> - if (*ptr == 'c') {
> - have_c = 1;
> - ptr++;
> - rc++;
> - }
> - }
> - ret = parse_ip4_print_args(event->tep, ptr, &reverse);
> - ptr += ret;
> - rc += ret;
> -
> - if (arg->type == TEP_PRINT_FUNC) {
> - process_defined_func(s, data, size, event, arg);
> - return rc;
> - }
> -
> - if (arg->type != TEP_PRINT_FIELD) {
> - trace_seq_printf(s, "ARG TYPE NOT FIELD BUT %d", arg->type);
> - return rc;
> - }
> -
> - if (!arg->field.field) {
> - arg->field.field =
> - tep_find_any_field(event, arg->field.name);
> - if (!arg->field.field) {
> - do_warning("%s: field %s not found",
> - __func__, arg->field.name);
> - return rc;
> - }
> - }
> -
> - sa = (struct sockaddr_storage *) (data + arg->field.field->offset);
> -
> - if (sa->ss_family == AF_INET) {
> - struct sockaddr_in *sa4 = (struct sockaddr_in *) sa;
> -
> - if (arg->field.field->size < sizeof(struct sockaddr_in)) {
> - trace_seq_printf(s, "INVALIDIPv4");
> - return rc;
> - }
> -
> - print_ip4_addr(s, i, reverse, (unsigned char *) &sa4->sin_addr);
> - if (have_p)
> - trace_seq_printf(s, ":%d", ntohs(sa4->sin_port));
> -
> -
> - } else if (sa->ss_family == AF_INET6) {
> - struct sockaddr_in6 *sa6 = (struct sockaddr_in6 *) sa;
> -
> - if (arg->field.field->size < sizeof(struct sockaddr_in6)) {
> - trace_seq_printf(s, "INVALIDIPv6");
> - return rc;
> - }
> -
> - if (have_p)
> - trace_seq_printf(s, "[");
> -
> - buf = (unsigned char *) &sa6->sin6_addr;
> - if (have_c)
> - print_ip6c_addr(s, buf);
> - else
> - print_ip6_addr(s, i, buf);
> -
> - if (have_p)
> - trace_seq_printf(s, "]:%d", ntohs(sa6->sin6_port));
> - }
> -
> - return rc;
> -}
> -
> -static int print_ip_arg(struct trace_seq *s, const char *ptr,
> - void *data, int size, struct tep_event *event,
> - struct tep_print_arg *arg)
> -{
> - char i = *ptr; /* 'i' or 'I' */
> - int rc = 1;
> -
> - /* IP version */
> - ptr++;
> -
> - switch (*ptr) {
> - case '4':
> - rc += print_ipv4_arg(s, ptr + 1, i, data, size, event, arg);
> - break;
> - case '6':
> - rc += print_ipv6_arg(s, ptr + 1, i, data, size, event, arg);
> - break;
> - case 'S':
> - rc += print_ipsa_arg(s, ptr + 1, i, data, size, event, arg);
> - break;
> - default:
> - return 0;
> - }
> -
> - return rc;
> -}
> -
> -static const int guid_index[16] = {3, 2, 1, 0, 5, 4, 7, 6, 8, 9, 10, 11, 12, 13, 14, 15};
> -static const int uuid_index[16] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
> -
> -static int print_uuid_arg(struct trace_seq *s, const char *ptr,
> - void *data, int size, struct tep_event *event,
> - struct tep_print_arg *arg)
> -{
> - const int *index = uuid_index;
> - char *format = "%02x";
> - int ret = 0;
> - char *buf;
> - int i;
> -
> - switch (*(ptr + 1)) {
> - case 'L':
> - format = "%02X";
> - /* fall through */
> - case 'l':
> - index = guid_index;
> - ret++;
> - break;
> - case 'B':
> - format = "%02X";
> - /* fall through */
> - case 'b':
> - ret++;
> - break;
> - }
> -
> - if (arg->type == TEP_PRINT_FUNC) {
> - process_defined_func(s, data, size, event, arg);
> - return ret;
> - }
> -
> - if (arg->type != TEP_PRINT_FIELD) {
> - trace_seq_printf(s, "ARG TYPE NOT FIELD BUT %d", arg->type);
> - return ret;
> - }
> -
> - if (!arg->field.field) {
> - arg->field.field =
> - tep_find_any_field(event, arg->field.name);
> - if (!arg->field.field) {
> - do_warning("%s: field %s not found",
> - __func__, arg->field.name);
> - return ret;
> - }
> - }
> -
> - if (arg->field.field->size != 16) {
> - trace_seq_printf(s, "INVALIDUUID");
> - return ret;
> - }
> -
> - buf = data + arg->field.field->offset;
> -
> - for (i = 0; i < 16; i++) {
> - trace_seq_printf(s, format, buf[index[i]] & 0xff);
> - switch (i) {
> - case 3:
> - case 5:
> - case 7:
> - case 9:
> - trace_seq_printf(s, "-");
> - break;
> - }
> - }
> -
> - return ret;
> -}
> -
> -static int print_raw_buff_arg(struct trace_seq *s, const char *ptr,
> - void *data, int size, struct tep_event *event,
> - struct tep_print_arg *arg, int print_len)
> -{
> - int plen = print_len;
> - char *delim = " ";
> - int ret = 0;
> - char *buf;
> - int i;
> - unsigned long offset;
> - int arr_len;
> -
> - switch (*(ptr + 1)) {
> - case 'C':
> - delim = ":";
> - ret++;
> - break;
> - case 'D':
> - delim = "-";
> - ret++;
> - break;
> - case 'N':
> - delim = "";
> - ret++;
> - break;
> - }
> -
> - if (arg->type == TEP_PRINT_FUNC) {
> - process_defined_func(s, data, size, event, arg);
> - return ret;
> - }
> -
> - if (arg->type != TEP_PRINT_DYNAMIC_ARRAY) {
> - trace_seq_printf(s, "ARG TYPE NOT FIELD BUT %d", arg->type);
> - return ret;
> - }
> -
> - offset = tep_read_number(event->tep,
> - data + arg->dynarray.field->offset,
> - arg->dynarray.field->size);
> - arr_len = (unsigned long long)(offset >> 16);
> - buf = data + (offset & 0xffff);
> -
> - if (arr_len < plen)
> - plen = arr_len;
> -
> - if (plen < 1)
> - return ret;
> -
> - trace_seq_printf(s, "%02x", buf[0] & 0xff);
> - for (i = 1; i < plen; i++)
> - trace_seq_printf(s, "%s%02x", delim, buf[i] & 0xff);
> -
> - return ret;
> -}
> -
> -static int is_printable_array(char *p, unsigned int len)
> -{
> - unsigned int i;
> -
> - for (i = 0; i < len && p[i]; i++)
> - if (!isprint(p[i]) && !isspace(p[i]))
> - return 0;
> - return 1;
> -}
> -
> -void tep_print_field(struct trace_seq *s, void *data,
> - struct tep_format_field *field)
> -{
> - unsigned long long val;
> - unsigned int offset, len, i;
> - struct tep_handle *tep = field->event->tep;
> -
> - if (field->flags & TEP_FIELD_IS_ARRAY) {
> - offset = field->offset;
> - len = field->size;
> - if (field->flags & TEP_FIELD_IS_DYNAMIC) {
> - val = tep_read_number(tep, data + offset, len);
> - offset = val;
> - len = offset >> 16;
> - offset &= 0xffff;
> - if (field->flags & TEP_FIELD_IS_RELATIVE)
> - offset += field->offset + field->size;
> - }
> - if (field->flags & TEP_FIELD_IS_STRING &&
> - is_printable_array(data + offset, len)) {
> - trace_seq_printf(s, "%s", (char *)data + offset);
> - } else {
> - trace_seq_puts(s, "ARRAY[");
> - for (i = 0; i < len; i++) {
> - if (i)
> - trace_seq_puts(s, ", ");
> - trace_seq_printf(s, "%02x",
> - *((unsigned char *)data + offset + i));
> - }
> - trace_seq_putc(s, ']');
> - field->flags &= ~TEP_FIELD_IS_STRING;
> - }
> - } else {
> - val = tep_read_number(tep, data + field->offset,
> - field->size);
> - if (field->flags & TEP_FIELD_IS_POINTER) {
> - trace_seq_printf(s, "0x%llx", val);
> - } else if (field->flags & TEP_FIELD_IS_SIGNED) {
> - switch (field->size) {
> - case 4:
> - /*
> - * If field is long then print it in hex.
> - * A long usually stores pointers.
> - */
> - if (field->flags & TEP_FIELD_IS_LONG)
> - trace_seq_printf(s, "0x%x", (int)val);
> - else
> - trace_seq_printf(s, "%d", (int)val);
> - break;
> - case 2:
> - trace_seq_printf(s, "%2d", (short)val);
> - break;
> - case 1:
> - trace_seq_printf(s, "%1d", (char)val);
> - break;
> - default:
> - trace_seq_printf(s, "%lld", val);
> - }
> - } else {
> - if (field->flags & TEP_FIELD_IS_LONG)
> - trace_seq_printf(s, "0x%llx", val);
> - else
> - trace_seq_printf(s, "%llu", val);
> - }
> - }
> -}
> -
> -void tep_print_fields(struct trace_seq *s, void *data,
> - int size __maybe_unused, struct tep_event *event)
> -{
> - struct tep_format_field *field;
> -
> - field = event->format.fields;
> - while (field) {
> - trace_seq_printf(s, " %s=", field->name);
> - tep_print_field(s, data, field);
> - field = field->next;
> - }
> -}
> -
> -static int print_function(struct trace_seq *s, const char *format,
> - void *data, int size, struct tep_event *event,
> - struct tep_print_arg *arg)
> -{
> - struct func_map *func;
> - unsigned long long val;
> -
> - val = eval_num_arg(data, size, event, arg);
> - func = find_func(event->tep, val);
> - if (func) {
> - trace_seq_puts(s, func->func);
> - if (*format == 'F' || *format == 'S')
> - trace_seq_printf(s, "+0x%llx", val - func->addr);
> - } else {
> - if (event->tep->long_size == 4)
> - trace_seq_printf(s, "0x%lx", (long)val);
> - else
> - trace_seq_printf(s, "0x%llx", (long long)val);
> - }
> -
> - return 0;
> -}
> -
> -static int print_arg_pointer(struct trace_seq *s, const char *format, int plen,
> - void *data, int size,
> - struct tep_event *event, struct tep_print_arg *arg)
> -{
> - unsigned long long val;
> - int ret = 1;
> -
> - if (arg->type == TEP_PRINT_BSTRING) {
> - trace_seq_puts(s, arg->string.string);
> - return 0;
> - }
> - while (*format) {
> - if (*format == 'p') {
> - format++;
> - break;
> - }
> - format++;
> - }
> -
> - switch (*format) {
> - case 'F':
> - case 'f':
> - case 'S':
> - case 's':
> - ret += print_function(s, format, data, size, event, arg);
> - break;
> - case 'M':
> - case 'm':
> - ret += print_mac_arg(s, format, data, size, event, arg);
> - break;
> - case 'I':
> - case 'i':
> - ret += print_ip_arg(s, format, data, size, event, arg);
> - break;
> - case 'U':
> - ret += print_uuid_arg(s, format, data, size, event, arg);
> - break;
> - case 'h':
> - ret += print_raw_buff_arg(s, format, data, size, event, arg, plen);
> - break;
> - default:
> - ret = 0;
> - val = eval_num_arg(data, size, event, arg);
> - trace_seq_printf(s, "%p", (void *)(intptr_t)val);
> - break;
> - }
> -
> - return ret;
> -
> -}
> -
> -static int print_arg_number(struct trace_seq *s, const char *format, int plen,
> - void *data, int size, int ls,
> - struct tep_event *event, struct tep_print_arg *arg)
> -{
> - unsigned long long val;
> -
> - val = eval_num_arg(data, size, event, arg);
> -
> - switch (ls) {
> - case -2:
> - if (plen >= 0)
> - trace_seq_printf(s, format, plen, (char)val);
> - else
> - trace_seq_printf(s, format, (char)val);
> - break;
> - case -1:
> - if (plen >= 0)
> - trace_seq_printf(s, format, plen, (short)val);
> - else
> - trace_seq_printf(s, format, (short)val);
> - break;
> - case 0:
> - if (plen >= 0)
> - trace_seq_printf(s, format, plen, (int)val);
> - else
> - trace_seq_printf(s, format, (int)val);
> - break;
> - case 1:
> - if (plen >= 0)
> - trace_seq_printf(s, format, plen, (long)val);
> - else
> - trace_seq_printf(s, format, (long)val);
> - break;
> - case 2:
> - if (plen >= 0)
> - trace_seq_printf(s, format, plen, (long long)val);
> - else
> - trace_seq_printf(s, format, (long long)val);
> - break;
> - default:
> - do_warning_event(event, "bad count (%d)", ls);
> - event->flags |= TEP_EVENT_FL_FAILED;
> - }
> - return 0;
> -}
> -
> -
> -static void print_arg_string(struct trace_seq *s, const char *format, int plen,
> - void *data, int size,
> - struct tep_event *event, struct tep_print_arg *arg)
> -{
> - struct trace_seq p;
> -
> - /* Use helper trace_seq */
> - trace_seq_init(&p);
> - print_str_arg(&p, data, size, event,
> - format, plen, arg);
> - trace_seq_terminate(&p);
> - trace_seq_puts(s, p.buffer);
> - trace_seq_destroy(&p);
> -}
> -
> -static int parse_arg_format_pointer(const char *format)
> -{
> - int ret = 0;
> - int index;
> - int loop;
> -
> - switch (*format) {
> - case 'F':
> - case 'S':
> - case 'f':
> - case 's':
> - ret++;
> - break;
> - case 'M':
> - case 'm':
> - /* [mM]R , [mM]F */
> - switch (format[1]) {
> - case 'R':
> - case 'F':
> - ret++;
> - break;
> - }
> - ret++;
> - break;
> - case 'I':
> - case 'i':
> - index = 2;
> - loop = 1;
> - switch (format[1]) {
> - case 'S':
> - /*[S][pfs]*/
> - while (loop) {
> - switch (format[index]) {
> - case 'p':
> - case 'f':
> - case 's':
> - ret++;
> - index++;
> - break;
> - default:
> - loop = 0;
> - break;
> - }
> - }
> - /* fall through */
> - case '4':
> - /* [4S][hnbl] */
> - switch (format[index]) {
> - case 'h':
> - case 'n':
> - case 'l':
> - case 'b':
> - ret++;
> - index++;
> - break;
> - }
> - if (format[1] == '4') {
> - ret++;
> - break;
> - }
> - /* fall through */
> - case '6':
> - /* [6S]c */
> - if (format[index] == 'c')
> - ret++;
> - ret++;
> - break;
> - }
> - ret++;
> - break;
> - case 'U':
> - switch (format[1]) {
> - case 'L':
> - case 'l':
> - case 'B':
> - case 'b':
> - ret++;
> - break;
> - }
> - ret++;
> - break;
> - case 'h':
> - switch (format[1]) {
> - case 'C':
> - case 'D':
> - case 'N':
> - ret++;
> - break;
> - }
> - ret++;
> - break;
> - default:
> - break;
> - }
> -
> - return ret;
> -}
> -
> -static void free_parse_args(struct tep_print_parse *arg)
> -{
> - struct tep_print_parse *del;
> -
> - while (arg) {
> - del = arg;
> - arg = del->next;
> - free(del->format);
> - free(del);
> - }
> -}
> -
> -static int parse_arg_add(struct tep_print_parse **parse, char *format,
> - enum tep_print_parse_type type,
> - struct tep_print_arg *arg,
> - struct tep_print_arg *len_as_arg,
> - int ls)
> -{
> - struct tep_print_parse *parg = NULL;
> -
> - parg = calloc(1, sizeof(*parg));
> - if (!parg)
> - goto error;
> - parg->format = strdup(format);
> - if (!parg->format)
> - goto error;
> - parg->type = type;
> - parg->arg = arg;
> - parg->len_as_arg = len_as_arg;
> - parg->ls = ls;
> - *parse = parg;
> - return 0;
> -error:
> - if (parg) {
> - free(parg->format);
> - free(parg);
> - }
> - return -1;
> -}
> -
> -static int parse_arg_format(struct tep_print_parse **parse,
> - struct tep_event *event,
> - const char *format, struct tep_print_arg **arg)
> -{
> - struct tep_print_arg *len_arg = NULL;
> - char print_format[32];
> - const char *start = format;
> - int ret = 0;
> - int ls = 0;
> - int res;
> - int len;
> -
> - format++;
> - ret++;
> - for (; *format; format++) {
> - switch (*format) {
> - case '#':
> - /* FIXME: need to handle properly */
> - break;
> - case 'h':
> - ls--;
> - break;
> - case 'l':
> - ls++;
> - break;
> - case 'L':
> - ls = 2;
> - break;
> - case '.':
> - case 'z':
> - case 'Z':
> - case '0' ... '9':
> - case '-':
> - break;
> - case '*':
> - /* The argument is the length. */
> - if (!*arg) {
> - do_warning_event(event, "no argument match");
> - event->flags |= TEP_EVENT_FL_FAILED;
> - goto out_failed;
> - }
> - if (len_arg) {
> - do_warning_event(event, "argument already matched");
> - event->flags |= TEP_EVENT_FL_FAILED;
> - goto out_failed;
> - }
> - len_arg = *arg;
> - *arg = (*arg)->next;
> - break;
> - case 'p':
> - if (!*arg) {
> - do_warning_event(event, "no argument match");
> - event->flags |= TEP_EVENT_FL_FAILED;
> - goto out_failed;
> - }
> - res = parse_arg_format_pointer(format + 1);
> - if (res > 0) {
> - format += res;
> - ret += res;
> - }
> - len = ((unsigned long)format + 1) -
> - (unsigned long)start;
> - /* should never happen */
> - if (len > 31) {
> - do_warning_event(event, "bad format!");
> - event->flags |= TEP_EVENT_FL_FAILED;
> - len = 31;
> - }
> - memcpy(print_format, start, len);
> - print_format[len] = 0;
> -
> - parse_arg_add(parse, print_format,
> - PRINT_FMT_ARG_POINTER, *arg, len_arg, ls);
> - *arg = (*arg)->next;
> - ret++;
> - return ret;
> - case 'd':
> - case 'u':
> - case 'i':
> - case 'x':
> - case 'X':
> - case 'o':
> - if (!*arg) {
> - do_warning_event(event, "no argument match");
> - event->flags |= TEP_EVENT_FL_FAILED;
> - goto out_failed;
> - }
> -
> - len = ((unsigned long)format + 1) -
> - (unsigned long)start;
> -
> - /* should never happen */
> - if (len > 30) {
> - do_warning_event(event, "bad format!");
> - event->flags |= TEP_EVENT_FL_FAILED;
> - len = 31;
> - }
> - memcpy(print_format, start, len);
> - print_format[len] = 0;
> -
> - if (event->tep->long_size == 8 && ls == 1 &&
> - sizeof(long) != 8) {
> - char *p;
> -
> - /* make %l into %ll */
> - if (ls == 1 && (p = strchr(print_format, 'l')))
> - memmove(p+1, p, strlen(p)+1);
> - ls = 2;
> - }
> - if (ls < -2 || ls > 2) {
> - do_warning_event(event, "bad count (%d)", ls);
> - event->flags |= TEP_EVENT_FL_FAILED;
> - }
> - parse_arg_add(parse, print_format,
> - PRINT_FMT_ARG_DIGIT, *arg, len_arg, ls);
> - *arg = (*arg)->next;
> - ret++;
> - return ret;
> - case 's':
> - if (!*arg) {
> - do_warning_event(event, "no matching argument");
> - event->flags |= TEP_EVENT_FL_FAILED;
> - goto out_failed;
> - }
> -
> - len = ((unsigned long)format + 1) -
> - (unsigned long)start;
> -
> - /* should never happen */
> - if (len > 31) {
> - do_warning_event(event, "bad format!");
> - event->flags |= TEP_EVENT_FL_FAILED;
> - len = 31;
> - }
> -
> - memcpy(print_format, start, len);
> - print_format[len] = 0;
> -
> - parse_arg_add(parse, print_format,
> - PRINT_FMT_ARG_STRING, *arg, len_arg, 0);
> - *arg = (*arg)->next;
> - ret++;
> - return ret;
> - default:
> - snprintf(print_format, 32, ">%c<", *format);
> - parse_arg_add(parse, print_format,
> - PRINT_FMT_STRING, NULL, NULL, 0);
> - ret++;
> - return ret;
> - }
> - ret++;
> - }
> -
> -out_failed:
> - return ret;
> -
> -}
> -
> -static int parse_arg_string(struct tep_print_parse **parse, const char *format)
> -{
> - struct trace_seq s;
> - int ret = 0;
> -
> - trace_seq_init(&s);
> - for (; *format; format++) {
> - if (*format == '\\') {
> - format++;
> - ret++;
> - switch (*format) {
> - case 'n':
> - trace_seq_putc(&s, '\n');
> - break;
> - case 't':
> - trace_seq_putc(&s, '\t');
> - break;
> - case 'r':
> - trace_seq_putc(&s, '\r');
> - break;
> - case '\\':
> - trace_seq_putc(&s, '\\');
> - break;
> - default:
> - trace_seq_putc(&s, *format);
> - break;
> - }
> - } else if (*format == '%') {
> - if (*(format + 1) == '%') {
> - trace_seq_putc(&s, '%');
> - format++;
> - ret++;
> - } else
> - break;
> - } else
> - trace_seq_putc(&s, *format);
> -
> - ret++;
> - }
> - trace_seq_terminate(&s);
> - parse_arg_add(parse, s.buffer, PRINT_FMT_STRING, NULL, NULL, 0);
> - trace_seq_destroy(&s);
> -
> - return ret;
> -}
> -
> -static struct tep_print_parse *
> -parse_args(struct tep_event *event, const char *format, struct tep_print_arg *arg)
> -{
> - struct tep_print_parse *parse_ret = NULL;
> - struct tep_print_parse **parse = NULL;
> - int ret;
> - int len;
> -
> - len = strlen(format);
> - while (*format) {
> - if (!parse_ret)
> - parse = &parse_ret;
> - if (*format == '%' && *(format + 1) != '%')
> - ret = parse_arg_format(parse, event, format, &arg);
> - else
> - ret = parse_arg_string(parse, format);
> - if (*parse)
> - parse = &((*parse)->next);
> -
> - len -= ret;
> - if (len > 0)
> - format += ret;
> - else
> - break;
> - }
> - return parse_ret;
> -}
> -
> -static void print_event_cache(struct tep_print_parse *parse, struct trace_seq *s,
> - void *data, int size, struct tep_event *event)
> -{
> - int len_arg;
> -
> - while (parse) {
> - if (parse->len_as_arg)
> - len_arg = eval_num_arg(data, size, event, parse->len_as_arg);
> - switch (parse->type) {
> - case PRINT_FMT_ARG_DIGIT:
> - print_arg_number(s, parse->format,
> - parse->len_as_arg ? len_arg : -1, data,
> - size, parse->ls, event, parse->arg);
> - break;
> - case PRINT_FMT_ARG_POINTER:
> - print_arg_pointer(s, parse->format,
> - parse->len_as_arg ? len_arg : 1,
> - data, size, event, parse->arg);
> - break;
> - case PRINT_FMT_ARG_STRING:
> - print_arg_string(s, parse->format,
> - parse->len_as_arg ? len_arg : -1,
> - data, size, event, parse->arg);
> - break;
> - case PRINT_FMT_STRING:
> - default:
> - trace_seq_printf(s, "%s", parse->format);
> - break;
> - }
> - parse = parse->next;
> - }
> -}
> -
> -static void pretty_print(struct trace_seq *s, void *data, int size, struct tep_event *event)
> -{
> - struct tep_print_parse *parse = event->print_fmt.print_cache;
> - struct tep_print_arg *args = NULL;
> - char *bprint_fmt = NULL;
> -
> - if (event->flags & TEP_EVENT_FL_FAILED) {
> - trace_seq_printf(s, "[FAILED TO PARSE]");
> - tep_print_fields(s, data, size, event);
> - return;
> - }
> -
> - if (event->flags & TEP_EVENT_FL_ISBPRINT) {
> - bprint_fmt = get_bprint_format(data, size, event);
> - args = make_bprint_args(bprint_fmt, data, size, event);
> - parse = parse_args(event, bprint_fmt, args);
> - }
> -
> - print_event_cache(parse, s, data, size, event);
> -
> - if (event->flags & TEP_EVENT_FL_ISBPRINT) {
> - free_parse_args(parse);
> - free_args(args);
> - free(bprint_fmt);
> - }
> -}
> -
> -/*
> - * This parses out the Latency format (interrupts disabled,
> - * need rescheduling, in hard/soft interrupt, preempt count
> - * and lock depth) and places it into the trace_seq.
> - */
> -static void data_latency_format(struct tep_handle *tep, struct trace_seq *s,
> - char *format, struct tep_record *record)
> -{
> - static int check_lock_depth = 1;
> - static int check_migrate_disable = 1;
> - static int lock_depth_exists;
> - static int migrate_disable_exists;
> - unsigned int lat_flags;
> - struct trace_seq sq;
> - unsigned int pc;
> - int lock_depth = 0;
> - int migrate_disable = 0;
> - int hardirq;
> - int softirq;
> - void *data = record->data;
> -
> - trace_seq_init(&sq);
> - lat_flags = parse_common_flags(tep, data);
> - pc = parse_common_pc(tep, data);
> - /* lock_depth may not always exist */
> - if (lock_depth_exists)
> - lock_depth = parse_common_lock_depth(tep, data);
> - else if (check_lock_depth) {
> - lock_depth = parse_common_lock_depth(tep, data);
> - if (lock_depth < 0)
> - check_lock_depth = 0;
> - else
> - lock_depth_exists = 1;
> - }
> -
> - /* migrate_disable may not always exist */
> - if (migrate_disable_exists)
> - migrate_disable = parse_common_migrate_disable(tep, data);
> - else if (check_migrate_disable) {
> - migrate_disable = parse_common_migrate_disable(tep, data);
> - if (migrate_disable < 0)
> - check_migrate_disable = 0;
> - else
> - migrate_disable_exists = 1;
> - }
> -
> - hardirq = lat_flags & TRACE_FLAG_HARDIRQ;
> - softirq = lat_flags & TRACE_FLAG_SOFTIRQ;
> -
> - trace_seq_printf(&sq, "%c%c%c",
> - (lat_flags & TRACE_FLAG_IRQS_OFF) ? 'd' :
> - (lat_flags & TRACE_FLAG_IRQS_NOSUPPORT) ?
> - 'X' : '.',
> - (lat_flags & TRACE_FLAG_NEED_RESCHED) ?
> - 'N' : '.',
> - (hardirq && softirq) ? 'H' :
> - hardirq ? 'h' : softirq ? 's' : '.');
> -
> - if (pc)
> - trace_seq_printf(&sq, "%x", pc);
> - else
> - trace_seq_printf(&sq, ".");
> -
> - if (migrate_disable_exists) {
> - if (migrate_disable < 0)
> - trace_seq_printf(&sq, ".");
> - else
> - trace_seq_printf(&sq, "%d", migrate_disable);
> - }
> -
> - if (lock_depth_exists) {
> - if (lock_depth < 0)
> - trace_seq_printf(&sq, ".");
> - else
> - trace_seq_printf(&sq, "%d", lock_depth);
> - }
> -
> - if (sq.state == TRACE_SEQ__MEM_ALLOC_FAILED) {
> - s->state = TRACE_SEQ__MEM_ALLOC_FAILED;
> - return;
> - }
> -
> - trace_seq_terminate(&sq);
> - trace_seq_puts(s, sq.buffer);
> - trace_seq_destroy(&sq);
> - trace_seq_terminate(s);
> -}
> -
> -/**
> - * tep_data_type - parse out the given event type
> - * @tep: a handle to the trace event parser context
> - * @rec: the record to read from
> - *
> - * This returns the event id from the @rec.
> - */
> -int tep_data_type(struct tep_handle *tep, struct tep_record *rec)
> -{
> - return trace_parse_common_type(tep, rec->data);
> -}
> -
> -/**
> - * tep_data_pid - parse the PID from record
> - * @tep: a handle to the trace event parser context
> - * @rec: the record to parse
> - *
> - * This returns the PID from a record.
> - */
> -int tep_data_pid(struct tep_handle *tep, struct tep_record *rec)
> -{
> - return parse_common_pid(tep, rec->data);
> -}
> -
> -/**
> - * tep_data_preempt_count - parse the preempt count from the record
> - * @tep: a handle to the trace event parser context
> - * @rec: the record to parse
> - *
> - * This returns the preempt count from a record.
> - */
> -int tep_data_preempt_count(struct tep_handle *tep, struct tep_record *rec)
> -{
> - return parse_common_pc(tep, rec->data);
> -}
> -
> -/**
> - * tep_data_flags - parse the latency flags from the record
> - * @tep: a handle to the trace event parser context
> - * @rec: the record to parse
> - *
> - * This returns the latency flags from a record.
> - *
> - * Use trace_flag_type enum for the flags (see event-parse.h).
> - */
> -int tep_data_flags(struct tep_handle *tep, struct tep_record *rec)
> -{
> - return parse_common_flags(tep, rec->data);
> -}
> -
> -/**
> - * tep_data_comm_from_pid - return the command line from PID
> - * @tep: a handle to the trace event parser context
> - * @pid: the PID of the task to search for
> - *
> - * This returns a pointer to the command line that has the given
> - * @pid.
> - */
> -const char *tep_data_comm_from_pid(struct tep_handle *tep, int pid)
> -{
> - const char *comm;
> -
> - comm = find_cmdline(tep, pid);
> - return comm;
> -}
> -
> -static struct tep_cmdline *
> -pid_from_cmdlist(struct tep_handle *tep, const char *comm, struct tep_cmdline *next)
> -{
> - struct cmdline_list *cmdlist = (struct cmdline_list *)next;
> -
> - if (cmdlist)
> - cmdlist = cmdlist->next;
> - else
> - cmdlist = tep->cmdlist;
> -
> - while (cmdlist && strcmp(cmdlist->comm, comm) != 0)
> - cmdlist = cmdlist->next;
> -
> - return (struct tep_cmdline *)cmdlist;
> -}
> -
> -/**
> - * tep_data_pid_from_comm - return the pid from a given comm
> - * @tep: a handle to the trace event parser context
> - * @comm: the cmdline to find the pid from
> - * @next: the cmdline structure to find the next comm
> - *
> - * This returns the cmdline structure that holds a pid for a given
> - * comm, or NULL if none found. As there may be more than one pid for
> - * a given comm, the result of this call can be passed back into
> - * a recurring call in the @next parameter, and then it will find the
> - * next pid.
> - * Also, it does a linear search, so it may be slow.
> - */
> -struct tep_cmdline *tep_data_pid_from_comm(struct tep_handle *tep, const char *comm,
> - struct tep_cmdline *next)
> -{
> - struct tep_cmdline *cmdline;
> -
> - /*
> - * If the cmdlines have not been converted yet, then use
> - * the list.
> - */
> - if (!tep->cmdlines)
> - return pid_from_cmdlist(tep, comm, next);
> -
> - if (next) {
> - /*
> - * The next pointer could have been still from
> - * a previous call before cmdlines were created
> - */
> - if (next < tep->cmdlines ||
> - next >= tep->cmdlines + tep->cmdline_count)
> - next = NULL;
> - else
> - cmdline = next++;
> - }
> -
> - if (!next)
> - cmdline = tep->cmdlines;
> -
> - while (cmdline < tep->cmdlines + tep->cmdline_count) {
> - if (strcmp(cmdline->comm, comm) == 0)
> - return cmdline;
> - cmdline++;
> - }
> - return NULL;
> -}
> -
> -/**
> - * tep_cmdline_pid - return the pid associated to a given cmdline
> - * @tep: a handle to the trace event parser context
> - * @cmdline: The cmdline structure to get the pid from
> - *
> - * Returns the pid for a give cmdline. If @cmdline is NULL, then
> - * -1 is returned.
> - */
> -int tep_cmdline_pid(struct tep_handle *tep, struct tep_cmdline *cmdline)
> -{
> - struct cmdline_list *cmdlist = (struct cmdline_list *)cmdline;
> -
> - if (!cmdline)
> - return -1;
> -
> - /*
> - * If cmdlines have not been created yet, or cmdline is
> - * not part of the array, then treat it as a cmdlist instead.
> - */
> - if (!tep->cmdlines ||
> - cmdline < tep->cmdlines ||
> - cmdline >= tep->cmdlines + tep->cmdline_count)
> - return cmdlist->pid;
> -
> - return cmdline->pid;
> -}
> -
> -/*
> - * This parses the raw @data using the given @event information and
> - * writes the print format into the trace_seq.
> - */
> -static void print_event_info(struct trace_seq *s, char *format, bool raw,
> - struct tep_event *event, struct tep_record *record)
> -{
> - int print_pretty = 1;
> -
> - if (raw || (event->flags & TEP_EVENT_FL_PRINTRAW))
> - tep_print_fields(s, record->data, record->size, event);
> - else {
> -
> - if (event->handler && !(event->flags & TEP_EVENT_FL_NOHANDLE))
> - print_pretty = event->handler(s, record, event,
> - event->context);
> -
> - if (print_pretty)
> - pretty_print(s, record->data, record->size, event);
> - }
> -
> - trace_seq_terminate(s);
> -}
> -
> -/**
> - * tep_find_event_by_record - return the event from a given record
> - * @tep: a handle to the trace event parser context
> - * @record: The record to get the event from
> - *
> - * Returns the associated event for a given record, or NULL if non is
> - * is found.
> - */
> -struct tep_event *
> -tep_find_event_by_record(struct tep_handle *tep, struct tep_record *record)
> -{
> - int type;
> -
> - if (record->size < 0) {
> - do_warning("ug! negative record size %d", record->size);
> - return NULL;
> - }
> -
> - type = trace_parse_common_type(tep, record->data);
> -
> - return tep_find_event(tep, type);
> -}
> -
> -/*
> - * Writes the timestamp of the record into @s. Time divisor and precision can be
> - * specified as part of printf @format string. Example:
> - * "%3.1000d" - divide the time by 1000 and print the first 3 digits
> - * before the dot. Thus, the timestamp "123456000" will be printed as
> - * "123.456"
> - */
> -static void print_event_time(struct tep_handle *tep, struct trace_seq *s,
> - char *format, struct tep_event *event,
> - struct tep_record *record)
> -{
> - unsigned long long time;
> - char *divstr;
> - int prec = 0, pr;
> - int div = 0;
> - int p10 = 1;
> -
> - if (isdigit(*(format + 1)))
> - prec = atoi(format + 1);
> - divstr = strchr(format, '.');
> - if (divstr && isdigit(*(divstr + 1)))
> - div = atoi(divstr + 1);
> - time = record->ts;
> - if (div) {
> - time += div / 2;
> - time /= div;
> - }
> - pr = prec;
> - while (pr--)
> - p10 *= 10;
> -
> - if (p10 > 1 && p10 < time)
> - trace_seq_printf(s, "%5llu.%0*llu", time / p10, prec, time % p10);
> - else
> - trace_seq_printf(s, "%12llu", time);
> -}
> -
> -struct print_event_type {
> - enum {
> - EVENT_TYPE_INT = 1,
> - EVENT_TYPE_STRING,
> - EVENT_TYPE_UNKNOWN,
> - } type;
> - char format[32];
> -};
> -
> -static void print_string(struct tep_handle *tep, struct trace_seq *s,
> - struct tep_record *record, struct tep_event *event,
> - const char *arg, struct print_event_type *type)
> -{
> - const char *comm;
> - int pid;
> -
> - if (strncmp(arg, TEP_PRINT_LATENCY, strlen(TEP_PRINT_LATENCY)) == 0) {
> - data_latency_format(tep, s, type->format, record);
> - } else if (strncmp(arg, TEP_PRINT_COMM, strlen(TEP_PRINT_COMM)) == 0) {
> - pid = parse_common_pid(tep, record->data);
> - comm = find_cmdline(tep, pid);
> - trace_seq_printf(s, type->format, comm);
> - } else if (strncmp(arg, TEP_PRINT_INFO_RAW, strlen(TEP_PRINT_INFO_RAW)) == 0) {
> - print_event_info(s, type->format, true, event, record);
> - } else if (strncmp(arg, TEP_PRINT_INFO, strlen(TEP_PRINT_INFO)) == 0) {
> - print_event_info(s, type->format, false, event, record);
> - } else if (strncmp(arg, TEP_PRINT_NAME, strlen(TEP_PRINT_NAME)) == 0) {
> - trace_seq_printf(s, type->format, event->name);
> - } else {
> - trace_seq_printf(s, "[UNKNOWN TEP TYPE %s]", arg);
> - }
> -
> -}
> -
> -static void print_int(struct tep_handle *tep, struct trace_seq *s,
> - struct tep_record *record, struct tep_event *event,
> - int arg, struct print_event_type *type)
> -{
> - int param;
> -
> - switch (arg) {
> - case TEP_PRINT_CPU:
> - param = record->cpu;
> - break;
> - case TEP_PRINT_PID:
> - param = parse_common_pid(tep, record->data);
> - break;
> - case TEP_PRINT_TIME:
> - return print_event_time(tep, s, type->format, event, record);
> - default:
> - return;
> - }
> - trace_seq_printf(s, type->format, param);
> -}
> -
> -static int tep_print_event_param_type(char *format,
> - struct print_event_type *type)
> -{
> - char *str = format + 1;
> - int i = 1;
> -
> - type->type = EVENT_TYPE_UNKNOWN;
> - while (*str) {
> - switch (*str) {
> - case 'd':
> - case 'u':
> - case 'i':
> - case 'x':
> - case 'X':
> - case 'o':
> - type->type = EVENT_TYPE_INT;
> - break;
> - case 's':
> - type->type = EVENT_TYPE_STRING;
> - break;
> - }
> - str++;
> - i++;
> - if (type->type != EVENT_TYPE_UNKNOWN)
> - break;
> - }
> - memset(type->format, 0, 32);
> - memcpy(type->format, format, i < 32 ? i : 31);
> - return i;
> -}
> -
> -/**
> - * tep_print_event - Write various event information
> - * @tep: a handle to the trace event parser context
> - * @s: the trace_seq to write to
> - * @record: The record to get the event from
> - * @format: a printf format string. Supported event fileds:
> - * TEP_PRINT_PID, "%d" - event PID
> - * TEP_PRINT_CPU, "%d" - event CPU
> - * TEP_PRINT_COMM, "%s" - event command string
> - * TEP_PRINT_NAME, "%s" - event name
> - * TEP_PRINT_LATENCY, "%s" - event latency
> - * TEP_PRINT_TIME, %d - event time stamp. A divisor and precision
> - * can be specified as part of this format string:
> - * "%precision.divisord". Example:
> - * "%3.1000d" - divide the time by 1000 and print the first
> - * 3 digits before the dot. Thus, the time stamp
> - * "123456000" will be printed as "123.456"
> - * TEP_PRINT_INFO, "%s" - event information. If any width is specified in
> - * the format string, the event information will be printed
> - * in raw format.
> - * Writes the specified event information into @s.
> - */
> -void tep_print_event(struct tep_handle *tep, struct trace_seq *s,
> - struct tep_record *record, const char *fmt, ...)
> -{
> - struct print_event_type type;
> - char *format = strdup(fmt);
> - char *current = format;
> - char *str = format;
> - int offset;
> - va_list args;
> - struct tep_event *event;
> -
> - if (!format)
> - return;
> -
> - event = tep_find_event_by_record(tep, record);
> - va_start(args, fmt);
> - while (*current) {
> - current = strchr(str, '%');
> - if (!current) {
> - trace_seq_puts(s, str);
> - break;
> - }
> - memset(&type, 0, sizeof(type));
> - offset = tep_print_event_param_type(current, &type);
> - *current = '\0';
> - trace_seq_puts(s, str);
> - current += offset;
> - switch (type.type) {
> - case EVENT_TYPE_STRING:
> - print_string(tep, s, record, event,
> - va_arg(args, char*), &type);
> - break;
> - case EVENT_TYPE_INT:
> - print_int(tep, s, record, event,
> - va_arg(args, int), &type);
> - break;
> - case EVENT_TYPE_UNKNOWN:
> - default:
> - trace_seq_printf(s, "[UNKNOWN TYPE]");
> - break;
> - }
> - str = current;
> -
> - }
> - va_end(args);
> - free(format);
> -}
> -
> -static int events_id_cmp(const void *a, const void *b)
> -{
> - struct tep_event * const * ea = a;
> - struct tep_event * const * eb = b;
> -
> - if ((*ea)->id < (*eb)->id)
> - return -1;
> -
> - if ((*ea)->id > (*eb)->id)
> - return 1;
> -
> - return 0;
> -}
> -
> -static int events_name_cmp(const void *a, const void *b)
> -{
> - struct tep_event * const * ea = a;
> - struct tep_event * const * eb = b;
> - int res;
> -
> - res = strcmp((*ea)->name, (*eb)->name);
> - if (res)
> - return res;
> -
> - res = strcmp((*ea)->system, (*eb)->system);
> - if (res)
> - return res;
> -
> - return events_id_cmp(a, b);
> -}
> -
> -static int events_system_cmp(const void *a, const void *b)
> -{
> - struct tep_event * const * ea = a;
> - struct tep_event * const * eb = b;
> - int res;
> -
> - res = strcmp((*ea)->system, (*eb)->system);
> - if (res)
> - return res;
> -
> - res = strcmp((*ea)->name, (*eb)->name);
> - if (res)
> - return res;
> -
> - return events_id_cmp(a, b);
> -}
> -
> -static struct tep_event **list_events_copy(struct tep_handle *tep)
> -{
> - struct tep_event **events;
> -
> - if (!tep)
> - return NULL;
> -
> - events = malloc(sizeof(*events) * (tep->nr_events + 1));
> - if (!events)
> - return NULL;
> -
> - memcpy(events, tep->events, sizeof(*events) * tep->nr_events);
> - events[tep->nr_events] = NULL;
> - return events;
> -}
> -
> -static void list_events_sort(struct tep_event **events, int nr_events,
> - enum tep_event_sort_type sort_type)
> -{
> - int (*sort)(const void *a, const void *b);
> -
> - switch (sort_type) {
> - case TEP_EVENT_SORT_ID:
> - sort = events_id_cmp;
> - break;
> - case TEP_EVENT_SORT_NAME:
> - sort = events_name_cmp;
> - break;
> - case TEP_EVENT_SORT_SYSTEM:
> - sort = events_system_cmp;
> - break;
> - default:
> - sort = NULL;
> - }
> -
> - if (sort)
> - qsort(events, nr_events, sizeof(*events), sort);
> -}
> -
> -/**
> - * tep_list_events - Get events, sorted by given criteria.
> - * @tep: a handle to the tep context
> - * @sort_type: desired sort order of the events in the array
> - *
> - * Returns an array of pointers to all events, sorted by the given
> - * @sort_type criteria. The last element of the array is NULL. The returned
> - * memory must not be freed, it is managed by the library.
> - * The function is not thread safe.
> - */
> -struct tep_event **tep_list_events(struct tep_handle *tep,
> - enum tep_event_sort_type sort_type)
> -{
> - struct tep_event **events;
> -
> - if (!tep)
> - return NULL;
> -
> - events = tep->sort_events;
> - if (events && tep->last_type == sort_type)
> - return events;
> -
> - if (!events) {
> - events = list_events_copy(tep);
> - if (!events)
> - return NULL;
> -
> - tep->sort_events = events;
> -
> - /* the internal events are sorted by id */
> - if (sort_type == TEP_EVENT_SORT_ID) {
> - tep->last_type = sort_type;
> - return events;
> - }
> - }
> -
> - list_events_sort(events, tep->nr_events, sort_type);
> - tep->last_type = sort_type;
> -
> - return events;
> -}
> -
> -
> -/**
> - * tep_list_events_copy - Thread safe version of tep_list_events()
> - * @tep: a handle to the tep context
> - * @sort_type: desired sort order of the events in the array
> - *
> - * Returns an array of pointers to all events, sorted by the given
> - * @sort_type criteria. The last element of the array is NULL. The returned
> - * array is newly allocated inside the function and must be freed by the caller
> - */
> -struct tep_event **tep_list_events_copy(struct tep_handle *tep,
> - enum tep_event_sort_type sort_type)
> -{
> - struct tep_event **events;
> -
> - if (!tep)
> - return NULL;
> -
> - events = list_events_copy(tep);
> - if (!events)
> - return NULL;
> -
> - /* the internal events are sorted by id */
> - if (sort_type == TEP_EVENT_SORT_ID)
> - return events;
> -
> - list_events_sort(events, tep->nr_events, sort_type);
> -
> - return events;
> -}
> -
> -static struct tep_format_field **
> -get_event_fields(const char *type, const char *name,
> - int count, struct tep_format_field *list)
> -{
> - struct tep_format_field **fields;
> - struct tep_format_field *field;
> - int i = 0;
> -
> - fields = malloc(sizeof(*fields) * (count + 1));
> - if (!fields)
> - return NULL;
> -
> - for (field = list; field; field = field->next) {
> - fields[i++] = field;
> - if (i == count + 1) {
> - do_warning("event %s has more %s fields than specified",
> - name, type);
> - i--;
> - break;
> - }
> - }
> -
> - if (i != count)
> - do_warning("event %s has less %s fields than specified",
> - name, type);
> -
> - fields[i] = NULL;
> -
> - return fields;
> -}
> -
> -/**
> - * tep_event_common_fields - return a list of common fields for an event
> - * @event: the event to return the common fields of.
> - *
> - * Returns an allocated array of fields. The last item in the array is NULL.
> - * The array must be freed with free().
> - */
> -struct tep_format_field **tep_event_common_fields(struct tep_event *event)
> -{
> - return get_event_fields("common", event->name,
> - event->format.nr_common,
> - event->format.common_fields);
> -}
> -
> -/**
> - * tep_event_fields - return a list of event specific fields for an event
> - * @event: the event to return the fields of.
> - *
> - * Returns an allocated array of fields. The last item in the array is NULL.
> - * The array must be freed with free().
> - */
> -struct tep_format_field **tep_event_fields(struct tep_event *event)
> -{
> - return get_event_fields("event", event->name,
> - event->format.nr_fields,
> - event->format.fields);
> -}
> -
> -static void print_fields(struct trace_seq *s, struct tep_print_flag_sym *field)
> -{
> - trace_seq_printf(s, "{ %s, %s }", field->value, field->str);
> - if (field->next) {
> - trace_seq_puts(s, ", ");
> - print_fields(s, field->next);
> - }
> -}
> -
> -/* for debugging */
> -static void print_args(struct tep_print_arg *args)
> -{
> - int print_paren = 1;
> - struct trace_seq s;
> -
> - switch (args->type) {
> - case TEP_PRINT_NULL:
> - printf("null");
> - break;
> - case TEP_PRINT_ATOM:
> - printf("%s", args->atom.atom);
> - break;
> - case TEP_PRINT_FIELD:
> - printf("REC->%s", args->field.name);
> - break;
> - case TEP_PRINT_FLAGS:
> - printf("__print_flags(");
> - print_args(args->flags.field);
> - printf(", %s, ", args->flags.delim);
> - trace_seq_init(&s);
> - print_fields(&s, args->flags.flags);
> - trace_seq_do_printf(&s);
> - trace_seq_destroy(&s);
> - printf(")");
> - break;
> - case TEP_PRINT_SYMBOL:
> - printf("__print_symbolic(");
> - print_args(args->symbol.field);
> - printf(", ");
> - trace_seq_init(&s);
> - print_fields(&s, args->symbol.symbols);
> - trace_seq_do_printf(&s);
> - trace_seq_destroy(&s);
> - printf(")");
> - break;
> - case TEP_PRINT_HEX:
> - printf("__print_hex(");
> - print_args(args->hex.field);
> - printf(", ");
> - print_args(args->hex.size);
> - printf(")");
> - break;
> - case TEP_PRINT_HEX_STR:
> - printf("__print_hex_str(");
> - print_args(args->hex.field);
> - printf(", ");
> - print_args(args->hex.size);
> - printf(")");
> - break;
> - case TEP_PRINT_INT_ARRAY:
> - printf("__print_array(");
> - print_args(args->int_array.field);
> - printf(", ");
> - print_args(args->int_array.count);
> - printf(", ");
> - print_args(args->int_array.el_size);
> - printf(")");
> - break;
> - case TEP_PRINT_STRING:
> - case TEP_PRINT_BSTRING:
> - printf("__get_str(%s)", args->string.string);
> - break;
> - case TEP_PRINT_BITMASK:
> - printf("__get_bitmask(%s)", args->bitmask.bitmask);
> - break;
> - case TEP_PRINT_TYPE:
> - printf("(%s)", args->typecast.type);
> - print_args(args->typecast.item);
> - break;
> - case TEP_PRINT_OP:
> - if (strcmp(args->op.op, ":") == 0)
> - print_paren = 0;
> - if (print_paren)
> - printf("(");
> - print_args(args->op.left);
> - printf(" %s ", args->op.op);
> - print_args(args->op.right);
> - if (print_paren)
> - printf(")");
> - break;
> - default:
> - /* we should warn... */
> - return;
> - }
> - if (args->next) {
> - printf("\n");
> - print_args(args->next);
> - }
> -}
> -
> -static void parse_header_field(const char *field,
> - int *offset, int *size, int mandatory)
> -{
> - unsigned long long save_input_buf_ptr;
> - unsigned long long save_input_buf_siz;
> - char *token;
> - int type;
> -
> - save_input_buf_ptr = input_buf_ptr;
> - save_input_buf_siz = input_buf_siz;
> -
> - if (read_expected(TEP_EVENT_ITEM, "field") < 0)
> - return;
> - if (read_expected(TEP_EVENT_OP, ":") < 0)
> - return;
> -
> - /* type */
> - if (read_expect_type(TEP_EVENT_ITEM, &token) < 0)
> - goto fail;
> - free_token(token);
> -
> - /*
> - * If this is not a mandatory field, then test it first.
> - */
> - if (mandatory) {
> - if (read_expected(TEP_EVENT_ITEM, field) < 0)
> - return;
> - } else {
> - if (read_expect_type(TEP_EVENT_ITEM, &token) < 0)
> - goto fail;
> - if (strcmp(token, field) != 0)
> - goto discard;
> - free_token(token);
> - }
> -
> - if (read_expected(TEP_EVENT_OP, ";") < 0)
> - return;
> - if (read_expected(TEP_EVENT_ITEM, "offset") < 0)
> - return;
> - if (read_expected(TEP_EVENT_OP, ":") < 0)
> - return;
> - if (read_expect_type(TEP_EVENT_ITEM, &token) < 0)
> - goto fail;
> - *offset = atoi(token);
> - free_token(token);
> - if (read_expected(TEP_EVENT_OP, ";") < 0)
> - return;
> - if (read_expected(TEP_EVENT_ITEM, "size") < 0)
> - return;
> - if (read_expected(TEP_EVENT_OP, ":") < 0)
> - return;
> - if (read_expect_type(TEP_EVENT_ITEM, &token) < 0)
> - goto fail;
> - *size = atoi(token);
> - free_token(token);
> - if (read_expected(TEP_EVENT_OP, ";") < 0)
> - return;
> - type = read_token(&token);
> - if (type != TEP_EVENT_NEWLINE) {
> - /* newer versions of the kernel have a "signed" type */
> - if (type != TEP_EVENT_ITEM)
> - goto fail;
> -
> - if (strcmp(token, "signed") != 0)
> - goto fail;
> -
> - free_token(token);
> -
> - if (read_expected(TEP_EVENT_OP, ":") < 0)
> - return;
> -
> - if (read_expect_type(TEP_EVENT_ITEM, &token))
> - goto fail;
> -
> - free_token(token);
> - if (read_expected(TEP_EVENT_OP, ";") < 0)
> - return;
> -
> - if (read_expect_type(TEP_EVENT_NEWLINE, &token))
> - goto fail;
> - }
> - fail:
> - free_token(token);
> - return;
> -
> - discard:
> - input_buf_ptr = save_input_buf_ptr;
> - input_buf_siz = save_input_buf_siz;
> - *offset = 0;
> - *size = 0;
> - free_token(token);
> -}
> -
> -/**
> - * tep_parse_header_page - parse the data stored in the header page
> - * @tep: a handle to the trace event parser context
> - * @buf: the buffer storing the header page format string
> - * @size: the size of @buf
> - * @long_size: the long size to use if there is no header
> - *
> - * This parses the header page format for information on the
> - * ring buffer used. The @buf should be copied from
> - *
> - * /sys/kernel/debug/tracing/events/header_page
> - */
> -int tep_parse_header_page(struct tep_handle *tep, char *buf, unsigned long size,
> - int long_size)
> -{
> - int ignore;
> -
> - if (!size) {
> - /*
> - * Old kernels did not have header page info.
> - * Sorry but we just use what we find here in user space.
> - */
> - tep->header_page_ts_size = sizeof(long long);
> - tep->header_page_size_size = long_size;
> - tep->header_page_data_offset = sizeof(long long) + long_size;
> - tep->old_format = 1;
> - return -1;
> - }
> - init_input_buf(buf, size);
> -
> - parse_header_field("timestamp", &tep->header_page_ts_offset,
> - &tep->header_page_ts_size, 1);
> - parse_header_field("commit", &tep->header_page_size_offset,
> - &tep->header_page_size_size, 1);
> - parse_header_field("overwrite", &tep->header_page_overwrite,
> - &ignore, 0);
> - parse_header_field("data", &tep->header_page_data_offset,
> - &tep->header_page_data_size, 1);
> -
> - return 0;
> -}
> -
> -static int event_matches(struct tep_event *event,
> - int id, const char *sys_name,
> - const char *event_name)
> -{
> - if (id >= 0 && id != event->id)
> - return 0;
> -
> - if (event_name && (strcmp(event_name, event->name) != 0))
> - return 0;
> -
> - if (sys_name && (strcmp(sys_name, event->system) != 0))
> - return 0;
> -
> - return 1;
> -}
> -
> -static void free_handler(struct event_handler *handle)
> -{
> - free((void *)handle->sys_name);
> - free((void *)handle->event_name);
> - free(handle);
> -}
> -
> -static int find_event_handle(struct tep_handle *tep, struct tep_event *event)
> -{
> - struct event_handler *handle, **next;
> -
> - for (next = &tep->handlers; *next;
> - next = &(*next)->next) {
> - handle = *next;
> - if (event_matches(event, handle->id,
> - handle->sys_name,
> - handle->event_name))
> - break;
> - }
> -
> - if (!(*next))
> - return 0;
> -
> - pr_stat("overriding event (%d) %s:%s with new print handler",
> - event->id, event->system, event->name);
> -
> - event->handler = handle->func;
> - event->context = handle->context;
> -
> - *next = handle->next;
> - free_handler(handle);
> -
> - return 1;
> -}
> -
> -/**
> - * parse_format - parse the event format
> - * @buf: the buffer storing the event format string
> - * @size: the size of @buf
> - * @sys: the system the event belongs to
> - *
> - * This parses the event format and creates an event structure
> - * to quickly parse raw data for a given event.
> - *
> - * These files currently come from:
> - *
> - * /sys/kernel/debug/tracing/events/.../.../format
> - */
> -static enum tep_errno parse_format(struct tep_event **eventp,
> - struct tep_handle *tep, const char *buf,
> - unsigned long size, const char *sys)
> -{
> - struct tep_event *event;
> - int ret;
> -
> - init_input_buf(buf, size);
> -
> - *eventp = event = alloc_event();
> - if (!event)
> - return TEP_ERRNO__MEM_ALLOC_FAILED;
> -
> - event->name = event_read_name();
> - if (!event->name) {
> - /* Bad event? */
> - ret = TEP_ERRNO__MEM_ALLOC_FAILED;
> - goto event_alloc_failed;
> - }
> -
> - if (strcmp(sys, "ftrace") == 0) {
> - event->flags |= TEP_EVENT_FL_ISFTRACE;
> -
> - if (strcmp(event->name, "bprint") == 0)
> - event->flags |= TEP_EVENT_FL_ISBPRINT;
> - }
> -
> - event->id = event_read_id();
> - if (event->id < 0) {
> - ret = TEP_ERRNO__READ_ID_FAILED;
> - /*
> - * This isn't an allocation error actually.
> - * But as the ID is critical, just bail out.
> - */
> - goto event_alloc_failed;
> - }
> -
> - event->system = strdup(sys);
> - if (!event->system) {
> - ret = TEP_ERRNO__MEM_ALLOC_FAILED;
> - goto event_alloc_failed;
> - }
> -
> - /* Add tep to event so that it can be referenced */
> - event->tep = tep;
> -
> - ret = event_read_format(event);
> - if (ret < 0) {
> - ret = TEP_ERRNO__READ_FORMAT_FAILED;
> - goto event_parse_failed;
> - }
> -
> - /*
> - * If the event has an override, don't print warnings if the event
> - * print format fails to parse.
> - */
> - if (tep && find_event_handle(tep, event))
> - show_warning = 0;
> -
> - ret = event_read_print(event);
> - show_warning = 1;
> -
> - if (ret < 0) {
> - ret = TEP_ERRNO__READ_PRINT_FAILED;
> - goto event_parse_failed;
> - }
> -
> - if (!ret && (event->flags & TEP_EVENT_FL_ISFTRACE)) {
> - struct tep_format_field *field;
> - struct tep_print_arg *arg, **list;
> -
> - /* old ftrace had no args */
> - list = &event->print_fmt.args;
> - for (field = event->format.fields; field; field = field->next) {
> - arg = alloc_arg();
> - if (!arg) {
> - event->flags |= TEP_EVENT_FL_FAILED;
> - return TEP_ERRNO__OLD_FTRACE_ARG_FAILED;
> - }
> - arg->type = TEP_PRINT_FIELD;
> - arg->field.name = strdup(field->name);
> - if (!arg->field.name) {
> - event->flags |= TEP_EVENT_FL_FAILED;
> - free_arg(arg);
> - return TEP_ERRNO__OLD_FTRACE_ARG_FAILED;
> - }
> - arg->field.field = field;
> - *list = arg;
> - list = &arg->next;
> - }
> - }
> -
> - if (!(event->flags & TEP_EVENT_FL_ISBPRINT))
> - event->print_fmt.print_cache = parse_args(event,
> - event->print_fmt.format,
> - event->print_fmt.args);
> -
> - return 0;
> -
> - event_parse_failed:
> - event->flags |= TEP_EVENT_FL_FAILED;
> - return ret;
> -
> - event_alloc_failed:
> - free(event->system);
> - free(event->name);
> - free(event);
> - *eventp = NULL;
> - return ret;
> -}
> -
> -static enum tep_errno
> -__parse_event(struct tep_handle *tep,
> - struct tep_event **eventp,
> - const char *buf, unsigned long size,
> - const char *sys)
> -{
> - int ret = parse_format(eventp, tep, buf, size, sys);
> - struct tep_event *event = *eventp;
> -
> - if (event == NULL)
> - return ret;
> -
> - if (tep && add_event(tep, event)) {
> - ret = TEP_ERRNO__MEM_ALLOC_FAILED;
> - goto event_add_failed;
> - }
> -
> -#define PRINT_ARGS 0
> - if (PRINT_ARGS && event->print_fmt.args)
> - print_args(event->print_fmt.args);
> -
> - return 0;
> -
> -event_add_failed:
> - free_tep_event(event);
> - return ret;
> -}
> -
> -/**
> - * tep_parse_format - parse the event format
> - * @tep: a handle to the trace event parser context
> - * @eventp: returned format
> - * @buf: the buffer storing the event format string
> - * @size: the size of @buf
> - * @sys: the system the event belongs to
> - *
> - * This parses the event format and creates an event structure
> - * to quickly parse raw data for a given event.
> - *
> - * These files currently come from:
> - *
> - * /sys/kernel/debug/tracing/events/.../.../format
> - */
> -enum tep_errno tep_parse_format(struct tep_handle *tep,
> - struct tep_event **eventp,
> - const char *buf,
> - unsigned long size, const char *sys)
> -{
> - return __parse_event(tep, eventp, buf, size, sys);
> -}
> -
> -/**
> - * tep_parse_event - parse the event format
> - * @tep: a handle to the trace event parser context
> - * @buf: the buffer storing the event format string
> - * @size: the size of @buf
> - * @sys: the system the event belongs to
> - *
> - * This parses the event format and creates an event structure
> - * to quickly parse raw data for a given event.
> - *
> - * These files currently come from:
> - *
> - * /sys/kernel/debug/tracing/events/.../.../format
> - */
> -enum tep_errno tep_parse_event(struct tep_handle *tep, const char *buf,
> - unsigned long size, const char *sys)
> -{
> - struct tep_event *event = NULL;
> - return __parse_event(tep, &event, buf, size, sys);
> -}
> -
> -int get_field_val(struct trace_seq *s, struct tep_format_field *field,
> - const char *name, struct tep_record *record,
> - unsigned long long *val, int err)
> -{
> - if (!field) {
> - if (err)
> - trace_seq_printf(s, "<CANT FIND FIELD %s>", name);
> - return -1;
> - }
> -
> - if (tep_read_number_field(field, record->data, val)) {
> - if (err)
> - trace_seq_printf(s, " %s=INVALID", name);
> - return -1;
> - }
> -
> - return 0;
> -}
> -
> -/**
> - * tep_get_field_raw - return the raw pointer into the data field
> - * @s: The seq to print to on error
> - * @event: the event that the field is for
> - * @name: The name of the field
> - * @record: The record with the field name.
> - * @len: place to store the field length.
> - * @err: print default error if failed.
> - *
> - * Returns a pointer into record->data of the field and places
> - * the length of the field in @len.
> - *
> - * On failure, it returns NULL.
> - */
> -void *tep_get_field_raw(struct trace_seq *s, struct tep_event *event,
> - const char *name, struct tep_record *record,
> - int *len, int err)
> -{
> - struct tep_format_field *field;
> - void *data = record->data;
> - unsigned offset;
> - int dummy;
> -
> - if (!event)
> - return NULL;
> -
> - field = tep_find_field(event, name);
> -
> - if (!field) {
> - if (err)
> - trace_seq_printf(s, "<CANT FIND FIELD %s>", name);
> - return NULL;
> - }
> -
> - /* Allow @len to be NULL */
> - if (!len)
> - len = &dummy;
> -
> - offset = field->offset;
> - if (field->flags & TEP_FIELD_IS_DYNAMIC) {
> - offset = tep_read_number(event->tep,
> - data + offset, field->size);
> - *len = offset >> 16;
> - offset &= 0xffff;
> - if (field->flags & TEP_FIELD_IS_RELATIVE)
> - offset += field->offset + field->size;
> - } else
> - *len = field->size;
> -
> - return data + offset;
> -}
> -
> -/**
> - * tep_get_field_val - find a field and return its value
> - * @s: The seq to print to on error
> - * @event: the event that the field is for
> - * @name: The name of the field
> - * @record: The record with the field name.
> - * @val: place to store the value of the field.
> - * @err: print default error if failed.
> - *
> - * Returns 0 on success -1 on field not found.
> - */
> -int tep_get_field_val(struct trace_seq *s, struct tep_event *event,
> - const char *name, struct tep_record *record,
> - unsigned long long *val, int err)
> -{
> - struct tep_format_field *field;
> -
> - if (!event)
> - return -1;
> -
> - field = tep_find_field(event, name);
> -
> - return get_field_val(s, field, name, record, val, err);
> -}
> -
> -/**
> - * tep_get_common_field_val - find a common field and return its value
> - * @s: The seq to print to on error
> - * @event: the event that the field is for
> - * @name: The name of the field
> - * @record: The record with the field name.
> - * @val: place to store the value of the field.
> - * @err: print default error if failed.
> - *
> - * Returns 0 on success -1 on field not found.
> - */
> -int tep_get_common_field_val(struct trace_seq *s, struct tep_event *event,
> - const char *name, struct tep_record *record,
> - unsigned long long *val, int err)
> -{
> - struct tep_format_field *field;
> -
> - if (!event)
> - return -1;
> -
> - field = tep_find_common_field(event, name);
> -
> - return get_field_val(s, field, name, record, val, err);
> -}
> -
> -/**
> - * tep_get_any_field_val - find a any field and return its value
> - * @s: The seq to print to on error
> - * @event: the event that the field is for
> - * @name: The name of the field
> - * @record: The record with the field name.
> - * @val: place to store the value of the field.
> - * @err: print default error if failed.
> - *
> - * Returns 0 on success -1 on field not found.
> - */
> -int tep_get_any_field_val(struct trace_seq *s, struct tep_event *event,
> - const char *name, struct tep_record *record,
> - unsigned long long *val, int err)
> -{
> - struct tep_format_field *field;
> -
> - if (!event)
> - return -1;
> -
> - field = tep_find_any_field(event, name);
> -
> - return get_field_val(s, field, name, record, val, err);
> -}
> -
> -/**
> - * tep_print_num_field - print a field and a format
> - * @s: The seq to print to
> - * @fmt: The printf format to print the field with.
> - * @event: the event that the field is for
> - * @name: The name of the field
> - * @record: The record with the field name.
> - * @err: print default error if failed.
> - *
> - * Returns positive value on success, negative in case of an error,
> - * or 0 if buffer is full.
> - */
> -int tep_print_num_field(struct trace_seq *s, const char *fmt,
> - struct tep_event *event, const char *name,
> - struct tep_record *record, int err)
> -{
> - struct tep_format_field *field = tep_find_field(event, name);
> - unsigned long long val;
> -
> - if (!field)
> - goto failed;
> -
> - if (tep_read_number_field(field, record->data, &val))
> - goto failed;
> -
> - return trace_seq_printf(s, fmt, val);
> -
> - failed:
> - if (err)
> - trace_seq_printf(s, "CAN'T FIND FIELD \"%s\"", name);
> - return -1;
> -}
> -
> -/**
> - * tep_print_func_field - print a field and a format for function pointers
> - * @s: The seq to print to
> - * @fmt: The printf format to print the field with.
> - * @event: the event that the field is for
> - * @name: The name of the field
> - * @record: The record with the field name.
> - * @err: print default error if failed.
> - *
> - * Returns positive value on success, negative in case of an error,
> - * or 0 if buffer is full.
> - */
> -int tep_print_func_field(struct trace_seq *s, const char *fmt,
> - struct tep_event *event, const char *name,
> - struct tep_record *record, int err)
> -{
> - struct tep_format_field *field = tep_find_field(event, name);
> - struct tep_handle *tep = event->tep;
> - unsigned long long val;
> - struct func_map *func;
> - char tmp[128];
> -
> - if (!field)
> - goto failed;
> -
> - if (tep_read_number_field(field, record->data, &val))
> - goto failed;
> -
> - func = find_func(tep, val);
> -
> - if (func)
> - snprintf(tmp, 128, "%s/0x%llx", func->func, func->addr - val);
> - else
> - sprintf(tmp, "0x%08llx", val);
> -
> - return trace_seq_printf(s, fmt, tmp);
> -
> - failed:
> - if (err)
> - trace_seq_printf(s, "CAN'T FIND FIELD \"%s\"", name);
> - return -1;
> -}
> -
> -static void free_func_handle(struct tep_function_handler *func)
> -{
> - struct func_params *params;
> -
> - free(func->name);
> -
> - while (func->params) {
> - params = func->params;
> - func->params = params->next;
> - free(params);
> - }
> -
> - free(func);
> -}
> -
> -/**
> - * tep_register_print_function - register a helper function
> - * @tep: a handle to the trace event parser context
> - * @func: the function to process the helper function
> - * @ret_type: the return type of the helper function
> - * @name: the name of the helper function
> - * @parameters: A list of enum tep_func_arg_type
> - *
> - * Some events may have helper functions in the print format arguments.
> - * This allows a plugin to dynamically create a way to process one
> - * of these functions.
> - *
> - * The @parameters is a variable list of tep_func_arg_type enums that
> - * must end with TEP_FUNC_ARG_VOID.
> - */
> -int tep_register_print_function(struct tep_handle *tep,
> - tep_func_handler func,
> - enum tep_func_arg_type ret_type,
> - char *name, ...)
> -{
> - struct tep_function_handler *func_handle;
> - struct func_params **next_param;
> - struct func_params *param;
> - enum tep_func_arg_type type;
> - va_list ap;
> - int ret;
> -
> - func_handle = find_func_handler(tep, name);
> - if (func_handle) {
> - /*
> - * This is most like caused by the users own
> - * plugins updating the function. This overrides the
> - * system defaults.
> - */
> - pr_stat("override of function helper '%s'", name);
> - remove_func_handler(tep, name);
> - }
> -
> - func_handle = calloc(1, sizeof(*func_handle));
> - if (!func_handle) {
> - do_warning("Failed to allocate function handler");
> - return TEP_ERRNO__MEM_ALLOC_FAILED;
> - }
> -
> - func_handle->ret_type = ret_type;
> - func_handle->name = strdup(name);
> - func_handle->func = func;
> - if (!func_handle->name) {
> - do_warning("Failed to allocate function name");
> - free(func_handle);
> - return TEP_ERRNO__MEM_ALLOC_FAILED;
> - }
> -
> - next_param = &(func_handle->params);
> - va_start(ap, name);
> - for (;;) {
> - type = va_arg(ap, enum tep_func_arg_type);
> - if (type == TEP_FUNC_ARG_VOID)
> - break;
> -
> - if (type >= TEP_FUNC_ARG_MAX_TYPES) {
> - do_warning("Invalid argument type %d", type);
> - ret = TEP_ERRNO__INVALID_ARG_TYPE;
> - goto out_free;
> - }
> -
> - param = malloc(sizeof(*param));
> - if (!param) {
> - do_warning("Failed to allocate function param");
> - ret = TEP_ERRNO__MEM_ALLOC_FAILED;
> - goto out_free;
> - }
> - param->type = type;
> - param->next = NULL;
> -
> - *next_param = param;
> - next_param = &(param->next);
> -
> - func_handle->nr_args++;
> - }
> - va_end(ap);
> -
> - func_handle->next = tep->func_handlers;
> - tep->func_handlers = func_handle;
> -
> - return 0;
> - out_free:
> - va_end(ap);
> - free_func_handle(func_handle);
> - return ret;
> -}
> -
> -/**
> - * tep_unregister_print_function - unregister a helper function
> - * @tep: a handle to the trace event parser context
> - * @func: the function to process the helper function
> - * @name: the name of the helper function
> - *
> - * This function removes existing print handler for function @name.
> - *
> - * Returns 0 if the handler was removed successully, -1 otherwise.
> - */
> -int tep_unregister_print_function(struct tep_handle *tep,
> - tep_func_handler func, char *name)
> -{
> - struct tep_function_handler *func_handle;
> -
> - func_handle = find_func_handler(tep, name);
> - if (func_handle && func_handle->func == func) {
> - remove_func_handler(tep, name);
> - return 0;
> - }
> - return -1;
> -}
> -
> -static struct tep_event *search_event(struct tep_handle *tep, int id,
> - const char *sys_name,
> - const char *event_name)
> -{
> - struct tep_event *event;
> -
> - if (id >= 0) {
> - /* search by id */
> - event = tep_find_event(tep, id);
> - if (!event)
> - return NULL;
> - if (event_name && (strcmp(event_name, event->name) != 0))
> - return NULL;
> - if (sys_name && (strcmp(sys_name, event->system) != 0))
> - return NULL;
> - } else {
> - event = tep_find_event_by_name(tep, sys_name, event_name);
> - if (!event)
> - return NULL;
> - }
> - return event;
> -}
> -
> -/**
> - * tep_register_event_handler - register a way to parse an event
> - * @tep: a handle to the trace event parser context
> - * @id: the id of the event to register
> - * @sys_name: the system name the event belongs to
> - * @event_name: the name of the event
> - * @func: the function to call to parse the event information
> - * @context: the data to be passed to @func
> - *
> - * This function allows a developer to override the parsing of
> - * a given event. If for some reason the default print format
> - * is not sufficient, this function will register a function
> - * for an event to be used to parse the data instead.
> - *
> - * If @id is >= 0, then it is used to find the event.
> - * else @sys_name and @event_name are used.
> - *
> - * Returns:
> - * TEP_REGISTER_SUCCESS_OVERWRITE if an existing handler is overwritten
> - * TEP_REGISTER_SUCCESS if a new handler is registered successfully
> - * negative TEP_ERRNO_... in case of an error
> - *
> - */
> -int tep_register_event_handler(struct tep_handle *tep, int id,
> - const char *sys_name, const char *event_name,
> - tep_event_handler_func func, void *context)
> -{
> - struct tep_event *event;
> - struct event_handler *handle;
> -
> - event = search_event(tep, id, sys_name, event_name);
> - if (event == NULL)
> - goto not_found;
> -
> - pr_stat("overriding event (%d) %s:%s with new print handler",
> - event->id, event->system, event->name);
> -
> - event->handler = func;
> - event->context = context;
> - return TEP_REGISTER_SUCCESS_OVERWRITE;
> -
> - not_found:
> - /* Save for later use. */
> - handle = calloc(1, sizeof(*handle));
> - if (!handle) {
> - do_warning("Failed to allocate event handler");
> - return TEP_ERRNO__MEM_ALLOC_FAILED;
> - }
> -
> - handle->id = id;
> - if (event_name)
> - handle->event_name = strdup(event_name);
> - if (sys_name)
> - handle->sys_name = strdup(sys_name);
> -
> - if ((event_name && !handle->event_name) ||
> - (sys_name && !handle->sys_name)) {
> - do_warning("Failed to allocate event/sys name");
> - free((void *)handle->event_name);
> - free((void *)handle->sys_name);
> - free(handle);
> - return TEP_ERRNO__MEM_ALLOC_FAILED;
> - }
> -
> - handle->func = func;
> - handle->next = tep->handlers;
> - tep->handlers = handle;
> - handle->context = context;
> -
> - return TEP_REGISTER_SUCCESS;
> -}
> -
> -static int handle_matches(struct event_handler *handler, int id,
> - const char *sys_name, const char *event_name,
> - tep_event_handler_func func, void *context)
> -{
> - if (id >= 0 && id != handler->id)
> - return 0;
> -
> - if (event_name && (strcmp(event_name, handler->event_name) != 0))
> - return 0;
> -
> - if (sys_name && (strcmp(sys_name, handler->sys_name) != 0))
> - return 0;
> -
> - if (func != handler->func || context != handler->context)
> - return 0;
> -
> - return 1;
> -}
> -
> -/**
> - * tep_unregister_event_handler - unregister an existing event handler
> - * @tep: a handle to the trace event parser context
> - * @id: the id of the event to unregister
> - * @sys_name: the system name the handler belongs to
> - * @event_name: the name of the event handler
> - * @func: the function to call to parse the event information
> - * @context: the data to be passed to @func
> - *
> - * This function removes existing event handler (parser).
> - *
> - * If @id is >= 0, then it is used to find the event.
> - * else @sys_name and @event_name are used.
> - *
> - * Returns 0 if handler was removed successfully, -1 if event was not found.
> - */
> -int tep_unregister_event_handler(struct tep_handle *tep, int id,
> - const char *sys_name, const char *event_name,
> - tep_event_handler_func func, void *context)
> -{
> - struct tep_event *event;
> - struct event_handler *handle;
> - struct event_handler **next;
> -
> - event = search_event(tep, id, sys_name, event_name);
> - if (event == NULL)
> - goto not_found;
> -
> - if (event->handler == func && event->context == context) {
> - pr_stat("removing override handler for event (%d) %s:%s. Going back to default handler.",
> - event->id, event->system, event->name);
> -
> - event->handler = NULL;
> - event->context = NULL;
> - return 0;
> - }
> -
> -not_found:
> - for (next = &tep->handlers; *next; next = &(*next)->next) {
> - handle = *next;
> - if (handle_matches(handle, id, sys_name, event_name,
> - func, context))
> - break;
> - }
> -
> - if (!(*next))
> - return -1;
> -
> - *next = handle->next;
> - free_handler(handle);
> -
> - return 0;
> -}
> -
> -/**
> - * tep_alloc - create a tep handle
> - */
> -struct tep_handle *tep_alloc(void)
> -{
> - struct tep_handle *tep = calloc(1, sizeof(*tep));
> -
> - if (tep) {
> - tep->ref_count = 1;
> - tep->host_bigendian = tep_is_bigendian();
> - }
> -
> - return tep;
> -}
> -
> -void tep_ref(struct tep_handle *tep)
> -{
> - tep->ref_count++;
> -}
> -
> -int tep_get_ref(struct tep_handle *tep)
> -{
> - if (tep)
> - return tep->ref_count;
> - return 0;
> -}
> -
> -__hidden void free_tep_format_field(struct tep_format_field *field)
> -{
> - free(field->type);
> - if (field->alias != field->name)
> - free(field->alias);
> - free(field->name);
> - free(field);
> -}
> -
> -static void free_format_fields(struct tep_format_field *field)
> -{
> - struct tep_format_field *next;
> -
> - while (field) {
> - next = field->next;
> - free_tep_format_field(field);
> - field = next;
> - }
> -}
> -
> -static void free_formats(struct tep_format *format)
> -{
> - free_format_fields(format->common_fields);
> - free_format_fields(format->fields);
> -}
> -
> -__hidden void free_tep_event(struct tep_event *event)
> -{
> - free(event->name);
> - free(event->system);
> -
> - free_formats(&event->format);
> -
> - free(event->print_fmt.format);
> - free_args(event->print_fmt.args);
> - free_parse_args(event->print_fmt.print_cache);
> - free(event);
> -}
> -
> -/**
> - * tep_free - free a tep handle
> - * @tep: the tep handle to free
> - */
> -void tep_free(struct tep_handle *tep)
> -{
> - struct cmdline_list *cmdlist, *cmdnext;
> - struct func_list *funclist, *funcnext;
> - struct printk_list *printklist, *printknext;
> - struct tep_function_handler *func_handler;
> - struct event_handler *handle;
> - int i;
> -
> - if (!tep)
> - return;
> -
> - cmdlist = tep->cmdlist;
> - funclist = tep->funclist;
> - printklist = tep->printklist;
> -
> - tep->ref_count--;
> - if (tep->ref_count)
> - return;
> -
> - if (tep->cmdlines) {
> - for (i = 0; i < tep->cmdline_count; i++)
> - free(tep->cmdlines[i].comm);
> - free(tep->cmdlines);
> - }
> -
> - while (cmdlist) {
> - cmdnext = cmdlist->next;
> - free(cmdlist->comm);
> - free(cmdlist);
> - cmdlist = cmdnext;
> - }
> -
> - if (tep->func_map) {
> - for (i = 0; i < (int)tep->func_count; i++) {
> - free(tep->func_map[i].func);
> - free(tep->func_map[i].mod);
> - }
> - free(tep->func_map);
> - }
> -
> - while (funclist) {
> - funcnext = funclist->next;
> - free(funclist->func);
> - free(funclist->mod);
> - free(funclist);
> - funclist = funcnext;
> - }
> -
> - while (tep->func_handlers) {
> - func_handler = tep->func_handlers;
> - tep->func_handlers = func_handler->next;
> - free_func_handle(func_handler);
> - }
> -
> - if (tep->printk_map) {
> - for (i = 0; i < (int)tep->printk_count; i++)
> - free(tep->printk_map[i].printk);
> - free(tep->printk_map);
> - }
> -
> - while (printklist) {
> - printknext = printklist->next;
> - free(printklist->printk);
> - free(printklist);
> - printklist = printknext;
> - }
> -
> - for (i = 0; i < tep->nr_events; i++)
> - free_tep_event(tep->events[i]);
> -
> - while (tep->handlers) {
> - handle = tep->handlers;
> - tep->handlers = handle->next;
> - free_handler(handle);
> - }
> -
> - free(tep->events);
> - free(tep->sort_events);
> - free(tep->func_resolver);
> - free_tep_plugin_paths(tep);
> -
> - free(tep);
> -}
> -
> -void tep_unref(struct tep_handle *tep)
> -{
> - tep_free(tep);
> -}
> diff --git a/tools/lib/traceevent/event-parse.h b/tools/lib/traceevent/event-parse.h
> deleted file mode 100644
> index 41d4f9f6a843..000000000000
> --- a/tools/lib/traceevent/event-parse.h
> +++ /dev/null
> @@ -1,750 +0,0 @@
> -/* SPDX-License-Identifier: LGPL-2.1 */
> -/*
> - * Copyright (C) 2009, 2010 Red Hat Inc, Steven Rostedt <[email protected]>
> - *
> - */
> -#ifndef _PARSE_EVENTS_H
> -#define _PARSE_EVENTS_H
> -
> -#include <stdbool.h>
> -#include <stdarg.h>
> -#include <stdio.h>
> -#include <regex.h>
> -#include <string.h>
> -
> -#include "trace-seq.h"
> -
> -#ifndef __maybe_unused
> -#define __maybe_unused __attribute__((unused))
> -#endif
> -
> -#ifndef DEBUG_RECORD
> -#define DEBUG_RECORD 0
> -#endif
> -
> -struct tep_record {
> - unsigned long long ts;
> - unsigned long long offset;
> - long long missed_events; /* buffer dropped events before */
> - int record_size; /* size of binary record */
> - int size; /* size of data */
> - void *data;
> - int cpu;
> - int ref_count;
> - int locked; /* Do not free, even if ref_count is zero */
> - void *priv;
> -#if DEBUG_RECORD
> - struct tep_record *prev;
> - struct tep_record *next;
> - long alloc_addr;
> -#endif
> -};
> -
> -/* ----------------------- tep ----------------------- */
> -
> -struct tep_handle;
> -struct tep_event;
> -
> -typedef int (*tep_event_handler_func)(struct trace_seq *s,
> - struct tep_record *record,
> - struct tep_event *event,
> - void *context);
> -
> -typedef int (*tep_plugin_load_func)(struct tep_handle *tep);
> -typedef int (*tep_plugin_unload_func)(struct tep_handle *tep);
> -
> -struct tep_plugin_option {
> - struct tep_plugin_option *next;
> - void *handle;
> - char *file;
> - char *name;
> - char *plugin_alias;
> - char *description;
> - const char *value;
> - void *priv;
> - int set;
> -};
> -
> -/*
> - * Plugin hooks that can be called:
> - *
> - * TEP_PLUGIN_LOADER: (required)
> - * The function name to initialized the plugin.
> - *
> - * int TEP_PLUGIN_LOADER(struct tep_handle *tep)
> - *
> - * TEP_PLUGIN_UNLOADER: (optional)
> - * The function called just before unloading
> - *
> - * int TEP_PLUGIN_UNLOADER(struct tep_handle *tep)
> - *
> - * TEP_PLUGIN_OPTIONS: (optional)
> - * Plugin options that can be set before loading
> - *
> - * struct tep_plugin_option TEP_PLUGIN_OPTIONS[] = {
> - * {
> - * .name = "option-name",
> - * .plugin_alias = "override-file-name", (optional)
> - * .description = "description of option to show users",
> - * },
> - * {
> - * .name = NULL,
> - * },
> - * };
> - *
> - * Array must end with .name = NULL;
> - *
> - *
> - * .plugin_alias is used to give a shorter name to access
> - * the vairable. Useful if a plugin handles more than one event.
> - *
> - * If .value is not set, then it is considered a boolean and only
> - * .set will be processed. If .value is defined, then it is considered
> - * a string option and .set will be ignored.
> - *
> - * TEP_PLUGIN_ALIAS: (optional)
> - * The name to use for finding options (uses filename if not defined)
> - */
> -#define TEP_PLUGIN_LOADER tep_plugin_loader
> -#define TEP_PLUGIN_UNLOADER tep_plugin_unloader
> -#define TEP_PLUGIN_OPTIONS tep_plugin_options
> -#define TEP_PLUGIN_ALIAS tep_plugin_alias
> -#define _MAKE_STR(x) #x
> -#define MAKE_STR(x) _MAKE_STR(x)
> -#define TEP_PLUGIN_LOADER_NAME MAKE_STR(TEP_PLUGIN_LOADER)
> -#define TEP_PLUGIN_UNLOADER_NAME MAKE_STR(TEP_PLUGIN_UNLOADER)
> -#define TEP_PLUGIN_OPTIONS_NAME MAKE_STR(TEP_PLUGIN_OPTIONS)
> -#define TEP_PLUGIN_ALIAS_NAME MAKE_STR(TEP_PLUGIN_ALIAS)
> -
> -enum tep_format_flags {
> - TEP_FIELD_IS_ARRAY = 1,
> - TEP_FIELD_IS_POINTER = 2,
> - TEP_FIELD_IS_SIGNED = 4,
> - TEP_FIELD_IS_STRING = 8,
> - TEP_FIELD_IS_DYNAMIC = 16,
> - TEP_FIELD_IS_LONG = 32,
> - TEP_FIELD_IS_FLAG = 64,
> - TEP_FIELD_IS_SYMBOLIC = 128,
> - TEP_FIELD_IS_RELATIVE = 256,
> -};
> -
> -struct tep_format_field {
> - struct tep_format_field *next;
> - struct tep_event *event;
> - char *type;
> - char *name;
> - char *alias;
> - int offset;
> - int size;
> - unsigned int arraylen;
> - unsigned int elementsize;
> - unsigned long flags;
> -};
> -
> -struct tep_format {
> - int nr_common;
> - int nr_fields;
> - struct tep_format_field *common_fields;
> - struct tep_format_field *fields;
> -};
> -
> -struct tep_print_arg_atom {
> - char *atom;
> -};
> -
> -struct tep_print_arg_string {
> - char *string;
> - struct tep_format_field *field;
> -};
> -
> -struct tep_print_arg_bitmask {
> - char *bitmask;
> - struct tep_format_field *field;
> -};
> -
> -struct tep_print_arg_field {
> - char *name;
> - struct tep_format_field *field;
> -};
> -
> -struct tep_print_flag_sym {
> - struct tep_print_flag_sym *next;
> - char *value;
> - char *str;
> -};
> -
> -struct tep_print_arg_typecast {
> - char *type;
> - struct tep_print_arg *item;
> -};
> -
> -struct tep_print_arg_flags {
> - struct tep_print_arg *field;
> - char *delim;
> - struct tep_print_flag_sym *flags;
> -};
> -
> -struct tep_print_arg_symbol {
> - struct tep_print_arg *field;
> - struct tep_print_flag_sym *symbols;
> -};
> -
> -struct tep_print_arg_hex {
> - struct tep_print_arg *field;
> - struct tep_print_arg *size;
> -};
> -
> -struct tep_print_arg_int_array {
> - struct tep_print_arg *field;
> - struct tep_print_arg *count;
> - struct tep_print_arg *el_size;
> -};
> -
> -struct tep_print_arg_dynarray {
> - struct tep_format_field *field;
> - struct tep_print_arg *index;
> -};
> -
> -struct tep_print_arg;
> -
> -struct tep_print_arg_op {
> - char *op;
> - int prio;
> - struct tep_print_arg *left;
> - struct tep_print_arg *right;
> -};
> -
> -struct tep_function_handler;
> -
> -struct tep_print_arg_func {
> - struct tep_function_handler *func;
> - struct tep_print_arg *args;
> -};
> -
> -enum tep_print_arg_type {
> - TEP_PRINT_NULL,
> - TEP_PRINT_ATOM,
> - TEP_PRINT_FIELD,
> - TEP_PRINT_FLAGS,
> - TEP_PRINT_SYMBOL,
> - TEP_PRINT_HEX,
> - TEP_PRINT_INT_ARRAY,
> - TEP_PRINT_TYPE,
> - TEP_PRINT_STRING,
> - TEP_PRINT_BSTRING,
> - TEP_PRINT_DYNAMIC_ARRAY,
> - TEP_PRINT_OP,
> - TEP_PRINT_FUNC,
> - TEP_PRINT_BITMASK,
> - TEP_PRINT_DYNAMIC_ARRAY_LEN,
> - TEP_PRINT_HEX_STR,
> -};
> -
> -struct tep_print_arg {
> - struct tep_print_arg *next;
> - enum tep_print_arg_type type;
> - union {
> - struct tep_print_arg_atom atom;
> - struct tep_print_arg_field field;
> - struct tep_print_arg_typecast typecast;
> - struct tep_print_arg_flags flags;
> - struct tep_print_arg_symbol symbol;
> - struct tep_print_arg_hex hex;
> - struct tep_print_arg_int_array int_array;
> - struct tep_print_arg_func func;
> - struct tep_print_arg_string string;
> - struct tep_print_arg_bitmask bitmask;
> - struct tep_print_arg_op op;
> - struct tep_print_arg_dynarray dynarray;
> - };
> -};
> -
> -struct tep_print_parse;
> -
> -struct tep_print_fmt {
> - char *format;
> - struct tep_print_arg *args;
> - struct tep_print_parse *print_cache;
> -};
> -
> -struct tep_event {
> - struct tep_handle *tep;
> - char *name;
> - int id;
> - int flags;
> - struct tep_format format;
> - struct tep_print_fmt print_fmt;
> - char *system;
> - tep_event_handler_func handler;
> - void *context;
> -};
> -
> -enum {
> - TEP_EVENT_FL_ISFTRACE = 0x01,
> - TEP_EVENT_FL_ISPRINT = 0x02,
> - TEP_EVENT_FL_ISBPRINT = 0x04,
> - TEP_EVENT_FL_ISFUNCENT = 0x10,
> - TEP_EVENT_FL_ISFUNCRET = 0x20,
> - TEP_EVENT_FL_NOHANDLE = 0x40,
> - TEP_EVENT_FL_PRINTRAW = 0x80,
> -
> - TEP_EVENT_FL_FAILED = 0x80000000
> -};
> -
> -enum tep_event_sort_type {
> - TEP_EVENT_SORT_ID,
> - TEP_EVENT_SORT_NAME,
> - TEP_EVENT_SORT_SYSTEM,
> -};
> -
> -enum tep_event_type {
> - TEP_EVENT_ERROR,
> - TEP_EVENT_NONE,
> - TEP_EVENT_SPACE,
> - TEP_EVENT_NEWLINE,
> - TEP_EVENT_OP,
> - TEP_EVENT_DELIM,
> - TEP_EVENT_ITEM,
> - TEP_EVENT_DQUOTE,
> - TEP_EVENT_SQUOTE,
> -};
> -
> -typedef unsigned long long (*tep_func_handler)(struct trace_seq *s,
> - unsigned long long *args);
> -
> -enum tep_func_arg_type {
> - TEP_FUNC_ARG_VOID,
> - TEP_FUNC_ARG_INT,
> - TEP_FUNC_ARG_LONG,
> - TEP_FUNC_ARG_STRING,
> - TEP_FUNC_ARG_PTR,
> - TEP_FUNC_ARG_MAX_TYPES
> -};
> -
> -enum tep_flag {
> - TEP_NSEC_OUTPUT = 1, /* output in NSECS */
> - TEP_DISABLE_SYS_PLUGINS = 1 << 1,
> - TEP_DISABLE_PLUGINS = 1 << 2,
> -};
> -
> -#define TEP_ERRORS \
> - _PE(MEM_ALLOC_FAILED, "failed to allocate memory"), \
> - _PE(PARSE_EVENT_FAILED, "failed to parse event"), \
> - _PE(READ_ID_FAILED, "failed to read event id"), \
> - _PE(READ_FORMAT_FAILED, "failed to read event format"), \
> - _PE(READ_PRINT_FAILED, "failed to read event print fmt"), \
> - _PE(OLD_FTRACE_ARG_FAILED,"failed to allocate field name for ftrace"),\
> - _PE(INVALID_ARG_TYPE, "invalid argument type"), \
> - _PE(INVALID_EXP_TYPE, "invalid expression type"), \
> - _PE(INVALID_OP_TYPE, "invalid operator type"), \
> - _PE(INVALID_EVENT_NAME, "invalid event name"), \
> - _PE(EVENT_NOT_FOUND, "no event found"), \
> - _PE(SYNTAX_ERROR, "syntax error"), \
> - _PE(ILLEGAL_RVALUE, "illegal rvalue"), \
> - _PE(ILLEGAL_LVALUE, "illegal lvalue for string comparison"), \
> - _PE(INVALID_REGEX, "regex did not compute"), \
> - _PE(ILLEGAL_STRING_CMP, "illegal comparison for string"), \
> - _PE(ILLEGAL_INTEGER_CMP,"illegal comparison for integer"), \
> - _PE(REPARENT_NOT_OP, "cannot reparent other than OP"), \
> - _PE(REPARENT_FAILED, "failed to reparent filter OP"), \
> - _PE(BAD_FILTER_ARG, "bad arg in filter tree"), \
> - _PE(UNEXPECTED_TYPE, "unexpected type (not a value)"), \
> - _PE(ILLEGAL_TOKEN, "illegal token"), \
> - _PE(INVALID_PAREN, "open parenthesis cannot come here"), \
> - _PE(UNBALANCED_PAREN, "unbalanced number of parenthesis"), \
> - _PE(UNKNOWN_TOKEN, "unknown token"), \
> - _PE(FILTER_NOT_FOUND, "no filter found"), \
> - _PE(NOT_A_NUMBER, "must have number field"), \
> - _PE(NO_FILTER, "no filters exists"), \
> - _PE(FILTER_MISS, "record does not match to filter")
> -
> -#undef _PE
> -#define _PE(__code, __str) TEP_ERRNO__ ## __code
> -enum tep_errno {
> - TEP_ERRNO__SUCCESS = 0,
> - TEP_ERRNO__FILTER_MATCH = TEP_ERRNO__SUCCESS,
> -
> - /*
> - * Choose an arbitrary negative big number not to clash with standard
> - * errno since SUS requires the errno has distinct positive values.
> - * See 'Issue 6' in the link below.
> - *
> - * https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/errno.h.html
> - */
> - __TEP_ERRNO__START = -100000,
> -
> - TEP_ERRORS,
> -
> - __TEP_ERRNO__END,
> -};
> -#undef _PE
> -
> -struct tep_plugin_list;
> -
> -#define INVALID_PLUGIN_LIST_OPTION ((char **)((unsigned long)-1))
> -
> -enum tep_plugin_load_priority {
> - TEP_PLUGIN_FIRST,
> - TEP_PLUGIN_LAST,
> -};
> -
> -int tep_add_plugin_path(struct tep_handle *tep, char *path,
> - enum tep_plugin_load_priority prio);
> -struct tep_plugin_list *tep_load_plugins(struct tep_handle *tep);
> -void tep_unload_plugins(struct tep_plugin_list *plugin_list,
> - struct tep_handle *tep);
> -void tep_load_plugins_hook(struct tep_handle *tep, const char *suffix,
> - void (*load_plugin)(struct tep_handle *tep,
> - const char *path,
> - const char *name,
> - void *data),
> - void *data);
> -char **tep_plugin_list_options(void);
> -void tep_plugin_free_options_list(char **list);
> -int tep_plugin_add_options(const char *name,
> - struct tep_plugin_option *options);
> -int tep_plugin_add_option(const char *name, const char *val);
> -void tep_plugin_remove_options(struct tep_plugin_option *options);
> -void tep_plugin_print_options(struct trace_seq *s);
> -void tep_print_plugins(struct trace_seq *s,
> - const char *prefix, const char *suffix,
> - const struct tep_plugin_list *list);
> -
> -/* tep_handle */
> -typedef char *(tep_func_resolver_t)(void *priv,
> - unsigned long long *addrp, char **modp);
> -void tep_set_flag(struct tep_handle *tep, int flag);
> -void tep_clear_flag(struct tep_handle *tep, enum tep_flag flag);
> -bool tep_test_flag(struct tep_handle *tep, enum tep_flag flags);
> -
> -static inline int tep_is_bigendian(void)
> -{
> - unsigned char str[] = { 0x1, 0x2, 0x3, 0x4 };
> - unsigned int val;
> -
> - memcpy(&val, str, 4);
> - return val == 0x01020304;
> -}
> -
> -/* taken from kernel/trace/trace.h */
> -enum trace_flag_type {
> - TRACE_FLAG_IRQS_OFF = 0x01,
> - TRACE_FLAG_IRQS_NOSUPPORT = 0x02,
> - TRACE_FLAG_NEED_RESCHED = 0x04,
> - TRACE_FLAG_HARDIRQ = 0x08,
> - TRACE_FLAG_SOFTIRQ = 0x10,
> -};
> -
> -int tep_set_function_resolver(struct tep_handle *tep,
> - tep_func_resolver_t *func, void *priv);
> -void tep_reset_function_resolver(struct tep_handle *tep);
> -int tep_register_comm(struct tep_handle *tep, const char *comm, int pid);
> -int tep_override_comm(struct tep_handle *tep, const char *comm, int pid);
> -int tep_register_function(struct tep_handle *tep, char *name,
> - unsigned long long addr, char *mod);
> -int tep_register_print_string(struct tep_handle *tep, const char *fmt,
> - unsigned long long addr);
> -bool tep_is_pid_registered(struct tep_handle *tep, int pid);
> -
> -struct tep_event *tep_get_event(struct tep_handle *tep, int index);
> -
> -#define TEP_PRINT_INFO "INFO"
> -#define TEP_PRINT_INFO_RAW "INFO_RAW"
> -#define TEP_PRINT_COMM "COMM"
> -#define TEP_PRINT_LATENCY "LATENCY"
> -#define TEP_PRINT_NAME "NAME"
> -#define TEP_PRINT_PID 1U
> -#define TEP_PRINT_TIME 2U
> -#define TEP_PRINT_CPU 3U
> -
> -void tep_print_event(struct tep_handle *tep, struct trace_seq *s,
> - struct tep_record *record, const char *fmt, ...)
> - __attribute__ ((format (printf, 4, 5)));
> -
> -int tep_parse_header_page(struct tep_handle *tep, char *buf, unsigned long size,
> - int long_size);
> -
> -enum tep_errno tep_parse_event(struct tep_handle *tep, const char *buf,
> - unsigned long size, const char *sys);
> -enum tep_errno tep_parse_format(struct tep_handle *tep,
> - struct tep_event **eventp,
> - const char *buf,
> - unsigned long size, const char *sys);
> -
> -void *tep_get_field_raw(struct trace_seq *s, struct tep_event *event,
> - const char *name, struct tep_record *record,
> - int *len, int err);
> -
> -int tep_get_field_val(struct trace_seq *s, struct tep_event *event,
> - const char *name, struct tep_record *record,
> - unsigned long long *val, int err);
> -int tep_get_common_field_val(struct trace_seq *s, struct tep_event *event,
> - const char *name, struct tep_record *record,
> - unsigned long long *val, int err);
> -int tep_get_any_field_val(struct trace_seq *s, struct tep_event *event,
> - const char *name, struct tep_record *record,
> - unsigned long long *val, int err);
> -
> -int tep_print_num_field(struct trace_seq *s, const char *fmt,
> - struct tep_event *event, const char *name,
> - struct tep_record *record, int err);
> -
> -int tep_print_func_field(struct trace_seq *s, const char *fmt,
> - struct tep_event *event, const char *name,
> - struct tep_record *record, int err);
> -
> -enum tep_reg_handler {
> - TEP_REGISTER_SUCCESS = 0,
> - TEP_REGISTER_SUCCESS_OVERWRITE,
> -};
> -
> -int tep_register_event_handler(struct tep_handle *tep, int id,
> - const char *sys_name, const char *event_name,
> - tep_event_handler_func func, void *context);
> -int tep_unregister_event_handler(struct tep_handle *tep, int id,
> - const char *sys_name, const char *event_name,
> - tep_event_handler_func func, void *context);
> -int tep_register_print_function(struct tep_handle *tep,
> - tep_func_handler func,
> - enum tep_func_arg_type ret_type,
> - char *name, ...);
> -int tep_unregister_print_function(struct tep_handle *tep,
> - tep_func_handler func, char *name);
> -
> -struct tep_format_field *tep_find_common_field(struct tep_event *event, const char *name);
> -struct tep_format_field *tep_find_field(struct tep_event *event, const char *name);
> -struct tep_format_field *tep_find_any_field(struct tep_event *event, const char *name);
> -
> -const char *tep_find_function(struct tep_handle *tep, unsigned long long addr);
> -unsigned long long
> -tep_find_function_address(struct tep_handle *tep, unsigned long long addr);
> -unsigned long long tep_read_number(struct tep_handle *tep, const void *ptr, int size);
> -int tep_read_number_field(struct tep_format_field *field, const void *data,
> - unsigned long long *value);
> -
> -struct tep_event *tep_get_first_event(struct tep_handle *tep);
> -int tep_get_events_count(struct tep_handle *tep);
> -struct tep_event *tep_find_event(struct tep_handle *tep, int id);
> -
> -struct tep_event *
> -tep_find_event_by_name(struct tep_handle *tep, const char *sys, const char *name);
> -struct tep_event *
> -tep_find_event_by_record(struct tep_handle *tep, struct tep_record *record);
> -
> -int tep_data_type(struct tep_handle *tep, struct tep_record *rec);
> -int tep_data_pid(struct tep_handle *tep, struct tep_record *rec);
> -int tep_data_preempt_count(struct tep_handle *tep, struct tep_record *rec);
> -int tep_data_flags(struct tep_handle *tep, struct tep_record *rec);
> -const char *tep_data_comm_from_pid(struct tep_handle *tep, int pid);
> -struct tep_cmdline;
> -struct tep_cmdline *tep_data_pid_from_comm(struct tep_handle *tep, const char *comm,
> - struct tep_cmdline *next);
> -int tep_cmdline_pid(struct tep_handle *tep, struct tep_cmdline *cmdline);
> -
> -void tep_print_field(struct trace_seq *s, void *data,
> - struct tep_format_field *field);
> -void tep_print_fields(struct trace_seq *s, void *data,
> - int size __maybe_unused, struct tep_event *event);
> -int tep_strerror(struct tep_handle *tep, enum tep_errno errnum,
> - char *buf, size_t buflen);
> -
> -struct tep_event **tep_list_events(struct tep_handle *tep, enum tep_event_sort_type);
> -struct tep_event **tep_list_events_copy(struct tep_handle *tep,
> - enum tep_event_sort_type);
> -struct tep_format_field **tep_event_common_fields(struct tep_event *event);
> -struct tep_format_field **tep_event_fields(struct tep_event *event);
> -
> -enum tep_endian {
> - TEP_LITTLE_ENDIAN = 0,
> - TEP_BIG_ENDIAN
> -};
> -int tep_get_cpus(struct tep_handle *tep);
> -void tep_set_cpus(struct tep_handle *tep, int cpus);
> -int tep_get_long_size(struct tep_handle *tep);
> -void tep_set_long_size(struct tep_handle *tep, int long_size);
> -int tep_get_page_size(struct tep_handle *tep);
> -void tep_set_page_size(struct tep_handle *tep, int _page_size);
> -bool tep_is_file_bigendian(struct tep_handle *tep);
> -void tep_set_file_bigendian(struct tep_handle *tep, enum tep_endian endian);
> -bool tep_is_local_bigendian(struct tep_handle *tep);
> -void tep_set_local_bigendian(struct tep_handle *tep, enum tep_endian endian);
> -int tep_get_header_page_size(struct tep_handle *tep);
> -int tep_get_header_timestamp_size(struct tep_handle *tep);
> -bool tep_is_old_format(struct tep_handle *tep);
> -void tep_set_test_filters(struct tep_handle *tep, int test_filters);
> -
> -struct tep_handle *tep_alloc(void);
> -void tep_free(struct tep_handle *tep);
> -void tep_ref(struct tep_handle *tep);
> -void tep_unref(struct tep_handle *tep);
> -int tep_get_ref(struct tep_handle *tep);
> -
> -/* for debugging */
> -void tep_print_funcs(struct tep_handle *tep);
> -void tep_print_printk(struct tep_handle *tep);
> -
> -/* ----------------------- filtering ----------------------- */
> -
> -enum tep_filter_boolean_type {
> - TEP_FILTER_FALSE,
> - TEP_FILTER_TRUE,
> -};
> -
> -enum tep_filter_op_type {
> - TEP_FILTER_OP_AND = 1,
> - TEP_FILTER_OP_OR,
> - TEP_FILTER_OP_NOT,
> -};
> -
> -enum tep_filter_cmp_type {
> - TEP_FILTER_CMP_NONE,
> - TEP_FILTER_CMP_EQ,
> - TEP_FILTER_CMP_NE,
> - TEP_FILTER_CMP_GT,
> - TEP_FILTER_CMP_LT,
> - TEP_FILTER_CMP_GE,
> - TEP_FILTER_CMP_LE,
> - TEP_FILTER_CMP_MATCH,
> - TEP_FILTER_CMP_NOT_MATCH,
> - TEP_FILTER_CMP_REGEX,
> - TEP_FILTER_CMP_NOT_REGEX,
> -};
> -
> -enum tep_filter_exp_type {
> - TEP_FILTER_EXP_NONE,
> - TEP_FILTER_EXP_ADD,
> - TEP_FILTER_EXP_SUB,
> - TEP_FILTER_EXP_MUL,
> - TEP_FILTER_EXP_DIV,
> - TEP_FILTER_EXP_MOD,
> - TEP_FILTER_EXP_RSHIFT,
> - TEP_FILTER_EXP_LSHIFT,
> - TEP_FILTER_EXP_AND,
> - TEP_FILTER_EXP_OR,
> - TEP_FILTER_EXP_XOR,
> - TEP_FILTER_EXP_NOT,
> -};
> -
> -enum tep_filter_arg_type {
> - TEP_FILTER_ARG_NONE,
> - TEP_FILTER_ARG_BOOLEAN,
> - TEP_FILTER_ARG_VALUE,
> - TEP_FILTER_ARG_FIELD,
> - TEP_FILTER_ARG_EXP,
> - TEP_FILTER_ARG_OP,
> - TEP_FILTER_ARG_NUM,
> - TEP_FILTER_ARG_STR,
> -};
> -
> -enum tep_filter_value_type {
> - TEP_FILTER_NUMBER,
> - TEP_FILTER_STRING,
> - TEP_FILTER_CHAR
> -};
> -
> -struct tep_filter_arg;
> -
> -struct tep_filter_arg_boolean {
> - enum tep_filter_boolean_type value;
> -};
> -
> -struct tep_filter_arg_field {
> - struct tep_format_field *field;
> -};
> -
> -struct tep_filter_arg_value {
> - enum tep_filter_value_type type;
> - union {
> - char *str;
> - unsigned long long val;
> - };
> -};
> -
> -struct tep_filter_arg_op {
> - enum tep_filter_op_type type;
> - struct tep_filter_arg *left;
> - struct tep_filter_arg *right;
> -};
> -
> -struct tep_filter_arg_exp {
> - enum tep_filter_exp_type type;
> - struct tep_filter_arg *left;
> - struct tep_filter_arg *right;
> -};
> -
> -struct tep_filter_arg_num {
> - enum tep_filter_cmp_type type;
> - struct tep_filter_arg *left;
> - struct tep_filter_arg *right;
> -};
> -
> -struct tep_filter_arg_str {
> - enum tep_filter_cmp_type type;
> - struct tep_format_field *field;
> - char *val;
> - char *buffer;
> - regex_t reg;
> -};
> -
> -struct tep_filter_arg {
> - enum tep_filter_arg_type type;
> - union {
> - struct tep_filter_arg_boolean boolean;
> - struct tep_filter_arg_field field;
> - struct tep_filter_arg_value value;
> - struct tep_filter_arg_op op;
> - struct tep_filter_arg_exp exp;
> - struct tep_filter_arg_num num;
> - struct tep_filter_arg_str str;
> - };
> -};
> -
> -struct tep_filter_type {
> - int event_id;
> - struct tep_event *event;
> - struct tep_filter_arg *filter;
> -};
> -
> -#define TEP_FILTER_ERROR_BUFSZ 1024
> -
> -struct tep_event_filter {
> - struct tep_handle *tep;
> - int filters;
> - struct tep_filter_type *event_filters;
> - char error_buffer[TEP_FILTER_ERROR_BUFSZ];
> -};
> -
> -struct tep_event_filter *tep_filter_alloc(struct tep_handle *tep);
> -
> -/* for backward compatibility */
> -#define FILTER_NONE TEP_ERRNO__NO_FILTER
> -#define FILTER_NOEXIST TEP_ERRNO__FILTER_NOT_FOUND
> -#define FILTER_MISS TEP_ERRNO__FILTER_MISS
> -#define FILTER_MATCH TEP_ERRNO__FILTER_MATCH
> -
> -enum tep_errno tep_filter_add_filter_str(struct tep_event_filter *filter,
> - const char *filter_str);
> -
> -enum tep_errno tep_filter_match(struct tep_event_filter *filter,
> - struct tep_record *record);
> -
> -int tep_filter_strerror(struct tep_event_filter *filter, enum tep_errno err,
> - char *buf, size_t buflen);
> -
> -int tep_event_filtered(struct tep_event_filter *filter,
> - int event_id);
> -
> -void tep_filter_reset(struct tep_event_filter *filter);
> -
> -void tep_filter_free(struct tep_event_filter *filter);
> -
> -char *tep_filter_make_string(struct tep_event_filter *filter, int event_id);
> -
> -int tep_filter_remove_event(struct tep_event_filter *filter,
> - int event_id);
> -
> -int tep_filter_copy(struct tep_event_filter *dest, struct tep_event_filter *source);
> -
> -int tep_filter_compare(struct tep_event_filter *filter1, struct tep_event_filter *filter2);
> -
> -#endif /* _PARSE_EVENTS_H */
> diff --git a/tools/lib/traceevent/event-plugin.c b/tools/lib/traceevent/event-plugin.c
> deleted file mode 100644
> index e7f93d5fe4fd..000000000000
> --- a/tools/lib/traceevent/event-plugin.c
> +++ /dev/null
> @@ -1,711 +0,0 @@
> -// SPDX-License-Identifier: LGPL-2.1
> -/*
> - * Copyright (C) 2009, 2010 Red Hat Inc, Steven Rostedt <[email protected]>
> - *
> - */
> -
> -#include <ctype.h>
> -#include <stdio.h>
> -#include <string.h>
> -#include <dlfcn.h>
> -#include <stdlib.h>
> -#include <sys/types.h>
> -#include <sys/stat.h>
> -#include <unistd.h>
> -#include <dirent.h>
> -#include <errno.h>
> -#include "event-parse.h"
> -#include "event-parse-local.h"
> -#include "event-utils.h"
> -#include "trace-seq.h"
> -
> -#define LOCAL_PLUGIN_DIR ".local/lib/traceevent/plugins/"
> -
> -static struct registered_plugin_options {
> - struct registered_plugin_options *next;
> - struct tep_plugin_option *options;
> -} *registered_options;
> -
> -static struct trace_plugin_options {
> - struct trace_plugin_options *next;
> - char *plugin;
> - char *option;
> - char *value;
> -} *trace_plugin_options;
> -
> -struct tep_plugin_list {
> - struct tep_plugin_list *next;
> - char *name;
> - void *handle;
> -};
> -
> -struct tep_plugins_dir {
> - struct tep_plugins_dir *next;
> - char *path;
> - enum tep_plugin_load_priority prio;
> -};
> -
> -static void lower_case(char *str)
> -{
> - if (!str)
> - return;
> - for (; *str; str++)
> - *str = tolower(*str);
> -}
> -
> -static int update_option_value(struct tep_plugin_option *op, const char *val)
> -{
> - char *op_val;
> -
> - if (!val) {
> - /* toggle, only if option is boolean */
> - if (op->value)
> - /* Warn? */
> - return 0;
> - op->set ^= 1;
> - return 0;
> - }
> -
> - /*
> - * If the option has a value then it takes a string
> - * otherwise the option is a boolean.
> - */
> - if (op->value) {
> - op->value = val;
> - return 0;
> - }
> -
> - /* Option is boolean, must be either "1", "0", "true" or "false" */
> -
> - op_val = strdup(val);
> - if (!op_val)
> - return -1;
> - lower_case(op_val);
> -
> - if (strcmp(val, "1") == 0 || strcmp(val, "true") == 0)
> - op->set = 1;
> - else if (strcmp(val, "0") == 0 || strcmp(val, "false") == 0)
> - op->set = 0;
> - free(op_val);
> -
> - return 0;
> -}
> -
> -/**
> - * tep_plugin_list_options - get list of plugin options
> - *
> - * Returns an array of char strings that list the currently registered
> - * plugin options in the format of <plugin>:<option>. This list can be
> - * used by toggling the option.
> - *
> - * Returns NULL if there's no options registered. On error it returns
> - * INVALID_PLUGIN_LIST_OPTION
> - *
> - * Must be freed with tep_plugin_free_options_list().
> - */
> -char **tep_plugin_list_options(void)
> -{
> - struct registered_plugin_options *reg;
> - struct tep_plugin_option *op;
> - char **list = NULL;
> - char *name;
> - int count = 0;
> -
> - for (reg = registered_options; reg; reg = reg->next) {
> - for (op = reg->options; op->name; op++) {
> - char *alias = op->plugin_alias ? op->plugin_alias : op->file;
> - char **temp = list;
> - int ret;
> -
> - ret = asprintf(&name, "%s:%s", alias, op->name);
> - if (ret < 0)
> - goto err;
> -
> - list = realloc(list, count + 2);
> - if (!list) {
> - list = temp;
> - free(name);
> - goto err;
> - }
> - list[count++] = name;
> - list[count] = NULL;
> - }
> - }
> - return list;
> -
> - err:
> - while (--count >= 0)
> - free(list[count]);
> - free(list);
> -
> - return INVALID_PLUGIN_LIST_OPTION;
> -}
> -
> -void tep_plugin_free_options_list(char **list)
> -{
> - int i;
> -
> - if (!list)
> - return;
> -
> - if (list == INVALID_PLUGIN_LIST_OPTION)
> - return;
> -
> - for (i = 0; list[i]; i++)
> - free(list[i]);
> -
> - free(list);
> -}
> -
> -static int
> -update_option(const char *file, struct tep_plugin_option *option)
> -{
> - struct trace_plugin_options *op;
> - char *plugin;
> - int ret = 0;
> -
> - if (option->plugin_alias) {
> - plugin = strdup(option->plugin_alias);
> - if (!plugin)
> - return -1;
> - } else {
> - char *p;
> - plugin = strdup(file);
> - if (!plugin)
> - return -1;
> - p = strstr(plugin, ".");
> - if (p)
> - *p = '\0';
> - }
> -
> - /* first look for named options */
> - for (op = trace_plugin_options; op; op = op->next) {
> - if (!op->plugin)
> - continue;
> - if (strcmp(op->plugin, plugin) != 0)
> - continue;
> - if (strcmp(op->option, option->name) != 0)
> - continue;
> -
> - ret = update_option_value(option, op->value);
> - if (ret)
> - goto out;
> - break;
> - }
> -
> - /* first look for unnamed options */
> - for (op = trace_plugin_options; op; op = op->next) {
> - if (op->plugin)
> - continue;
> - if (strcmp(op->option, option->name) != 0)
> - continue;
> -
> - ret = update_option_value(option, op->value);
> - break;
> - }
> -
> - out:
> - free(plugin);
> - return ret;
> -}
> -
> -/**
> - * tep_plugin_add_options - Add a set of options by a plugin
> - * @name: The name of the plugin adding the options
> - * @options: The set of options being loaded
> - *
> - * Sets the options with the values that have been added by user.
> - */
> -int tep_plugin_add_options(const char *name,
> - struct tep_plugin_option *options)
> -{
> - struct registered_plugin_options *reg;
> -
> - reg = malloc(sizeof(*reg));
> - if (!reg)
> - return -1;
> - reg->next = registered_options;
> - reg->options = options;
> - registered_options = reg;
> -
> - while (options->name) {
> - update_option(name, options);
> - options++;
> - }
> - return 0;
> -}
> -
> -/**
> - * tep_plugin_remove_options - remove plugin options that were registered
> - * @options: Options to removed that were registered with tep_plugin_add_options
> - */
> -void tep_plugin_remove_options(struct tep_plugin_option *options)
> -{
> - struct registered_plugin_options **last;
> - struct registered_plugin_options *reg;
> -
> - for (last = &registered_options; *last; last = &(*last)->next) {
> - if ((*last)->options == options) {
> - reg = *last;
> - *last = reg->next;
> - free(reg);
> - return;
> - }
> - }
> -}
> -
> -static int parse_option_name(char **option, char **plugin)
> -{
> - char *p;
> -
> - *plugin = NULL;
> -
> - if ((p = strstr(*option, ":"))) {
> - *plugin = *option;
> - *p = '\0';
> - *option = strdup(p + 1);
> - if (!*option)
> - return -1;
> - }
> - return 0;
> -}
> -
> -static struct tep_plugin_option *
> -find_registered_option(const char *plugin, const char *option)
> -{
> - struct registered_plugin_options *reg;
> - struct tep_plugin_option *op;
> - const char *op_plugin;
> -
> - for (reg = registered_options; reg; reg = reg->next) {
> - for (op = reg->options; op->name; op++) {
> - if (op->plugin_alias)
> - op_plugin = op->plugin_alias;
> - else
> - op_plugin = op->file;
> -
> - if (plugin && strcmp(plugin, op_plugin) != 0)
> - continue;
> - if (strcmp(option, op->name) != 0)
> - continue;
> -
> - return op;
> - }
> - }
> -
> - return NULL;
> -}
> -
> -static int process_option(const char *plugin, const char *option, const char *val)
> -{
> - struct tep_plugin_option *op;
> -
> - op = find_registered_option(plugin, option);
> - if (!op)
> - return 0;
> -
> - return update_option_value(op, val);
> -}
> -
> -/**
> - * tep_plugin_add_option - add an option/val pair to set plugin options
> - * @name: The name of the option (format: <plugin>:<option> or just <option>)
> - * @val: (optional) the value for the option
> - *
> - * Modify a plugin option. If @val is given than the value of the option
> - * is set (note, some options just take a boolean, so @val must be either
> - * "1" or "0" or "true" or "false").
> - */
> -int tep_plugin_add_option(const char *name, const char *val)
> -{
> - struct trace_plugin_options *op;
> - char *option_str;
> - char *plugin;
> -
> - option_str = strdup(name);
> - if (!option_str)
> - return -ENOMEM;
> -
> - if (parse_option_name(&option_str, &plugin) < 0)
> - return -ENOMEM;
> -
> - /* If the option exists, update the val */
> - for (op = trace_plugin_options; op; op = op->next) {
> - /* Both must be NULL or not NULL */
> - if ((!plugin || !op->plugin) && plugin != op->plugin)
> - continue;
> - if (plugin && strcmp(plugin, op->plugin) != 0)
> - continue;
> - if (strcmp(op->option, option_str) != 0)
> - continue;
> -
> - /* update option */
> - free(op->value);
> - if (val) {
> - op->value = strdup(val);
> - if (!op->value)
> - goto out_free;
> - } else
> - op->value = NULL;
> -
> - /* plugin and option_str don't get freed at the end */
> - free(plugin);
> - free(option_str);
> -
> - plugin = op->plugin;
> - option_str = op->option;
> - break;
> - }
> -
> - /* If not found, create */
> - if (!op) {
> - op = malloc(sizeof(*op));
> - if (!op)
> - goto out_free;
> - memset(op, 0, sizeof(*op));
> - op->plugin = plugin;
> - op->option = option_str;
> - if (val) {
> - op->value = strdup(val);
> - if (!op->value) {
> - free(op);
> - goto out_free;
> - }
> - }
> - op->next = trace_plugin_options;
> - trace_plugin_options = op;
> - }
> -
> - return process_option(plugin, option_str, val);
> -
> -out_free:
> - free(plugin);
> - free(option_str);
> - return -ENOMEM;
> -}
> -
> -static void print_op_data(struct trace_seq *s, const char *name,
> - const char *op)
> -{
> - if (op)
> - trace_seq_printf(s, "%8s:\t%s\n", name, op);
> -}
> -
> -/**
> - * tep_plugin_print_options - print out the registered plugin options
> - * @s: The trace_seq descriptor to write the plugin options into
> - *
> - * Writes a list of options into trace_seq @s.
> - */
> -void tep_plugin_print_options(struct trace_seq *s)
> -{
> - struct registered_plugin_options *reg;
> - struct tep_plugin_option *op;
> -
> - for (reg = registered_options; reg; reg = reg->next) {
> - if (reg != registered_options)
> - trace_seq_printf(s, "============\n");
> - for (op = reg->options; op->name; op++) {
> - if (op != reg->options)
> - trace_seq_printf(s, "------------\n");
> - print_op_data(s, "file", op->file);
> - print_op_data(s, "plugin", op->plugin_alias);
> - print_op_data(s, "option", op->name);
> - print_op_data(s, "desc", op->description);
> - print_op_data(s, "value", op->value);
> - trace_seq_printf(s, "%8s:\t%d\n", "set", op->set);
> - }
> - }
> -}
> -
> -/**
> - * tep_print_plugins - print out the list of plugins loaded
> - * @s: the trace_seq descripter to write to
> - * @prefix: The prefix string to add before listing the option name
> - * @suffix: The suffix string ot append after the option name
> - * @list: The list of plugins (usually returned by tep_load_plugins()
> - *
> - * Writes to the trace_seq @s the list of plugins (files) that is
> - * returned by tep_load_plugins(). Use @prefix and @suffix for formating:
> - * @prefix = " ", @suffix = "\n".
> - */
> -void tep_print_plugins(struct trace_seq *s,
> - const char *prefix, const char *suffix,
> - const struct tep_plugin_list *list)
> -{
> - while (list) {
> - trace_seq_printf(s, "%s%s%s", prefix, list->name, suffix);
> - list = list->next;
> - }
> -}
> -
> -static void
> -load_plugin(struct tep_handle *tep, const char *path,
> - const char *file, void *data)
> -{
> - struct tep_plugin_list **plugin_list = data;
> - struct tep_plugin_option *options;
> - tep_plugin_load_func func;
> - struct tep_plugin_list *list;
> - const char *alias;
> - char *plugin;
> - void *handle;
> - int ret;
> -
> - ret = asprintf(&plugin, "%s/%s", path, file);
> - if (ret < 0) {
> - warning("could not allocate plugin memory\n");
> - return;
> - }
> -
> - handle = dlopen(plugin, RTLD_NOW | RTLD_GLOBAL);
> - if (!handle) {
> - warning("could not load plugin '%s'\n%s\n",
> - plugin, dlerror());
> - goto out_free;
> - }
> -
> - alias = dlsym(handle, TEP_PLUGIN_ALIAS_NAME);
> - if (!alias)
> - alias = file;
> -
> - options = dlsym(handle, TEP_PLUGIN_OPTIONS_NAME);
> - if (options) {
> - while (options->name) {
> - ret = update_option(alias, options);
> - if (ret < 0)
> - goto out_free;
> - options++;
> - }
> - }
> -
> - func = dlsym(handle, TEP_PLUGIN_LOADER_NAME);
> - if (!func) {
> - warning("could not find func '%s' in plugin '%s'\n%s\n",
> - TEP_PLUGIN_LOADER_NAME, plugin, dlerror());
> - goto out_free;
> - }
> -
> - list = malloc(sizeof(*list));
> - if (!list) {
> - warning("could not allocate plugin memory\n");
> - goto out_free;
> - }
> -
> - list->next = *plugin_list;
> - list->handle = handle;
> - list->name = plugin;
> - *plugin_list = list;
> -
> - pr_stat("registering plugin: %s", plugin);
> - func(tep);
> - return;
> -
> - out_free:
> - free(plugin);
> -}
> -
> -static void
> -load_plugins_dir(struct tep_handle *tep, const char *suffix,
> - const char *path,
> - void (*load_plugin)(struct tep_handle *tep,
> - const char *path,
> - const char *name,
> - void *data),
> - void *data)
> -{
> - struct dirent *dent;
> - struct stat st;
> - DIR *dir;
> - int ret;
> -
> - ret = stat(path, &st);
> - if (ret < 0)
> - return;
> -
> - if (!S_ISDIR(st.st_mode))
> - return;
> -
> - dir = opendir(path);
> - if (!dir)
> - return;
> -
> - while ((dent = readdir(dir))) {
> - const char *name = dent->d_name;
> -
> - if (strcmp(name, ".") == 0 ||
> - strcmp(name, "..") == 0)
> - continue;
> -
> - /* Only load plugins that end in suffix */
> - if (strcmp(name + (strlen(name) - strlen(suffix)), suffix) != 0)
> - continue;
> -
> - load_plugin(tep, path, name, data);
> - }
> -
> - closedir(dir);
> -}
> -
> -/**
> - * tep_load_plugins_hook - call a user specified callback to load a plugin
> - * @tep: handler to traceevent context
> - * @suffix: filter only plugin files with given suffix
> - * @load_plugin: user specified callback, called for each plugin file
> - * @data: custom context, passed to @load_plugin
> - *
> - * Searches for traceevent plugin files and calls @load_plugin for each
> - * The order of plugins search is:
> - * - Directories, specified in @tep->plugins_dir and priority TEP_PLUGIN_FIRST
> - * - Directory, specified at compile time with PLUGIN_TRACEEVENT_DIR
> - * - Directory, specified by environment variable TRACEEVENT_PLUGIN_DIR
> - * - In user's home: ~/.local/lib/traceevent/plugins/
> - * - Directories, specified in @tep->plugins_dir and priority TEP_PLUGIN_LAST
> - *
> - */
> -void tep_load_plugins_hook(struct tep_handle *tep, const char *suffix,
> - void (*load_plugin)(struct tep_handle *tep,
> - const char *path,
> - const char *name,
> - void *data),
> - void *data)
> -{
> - struct tep_plugins_dir *dir = NULL;
> - char *home;
> - char *path;
> - char *envdir;
> - int ret;
> -
> - if (tep && tep->flags & TEP_DISABLE_PLUGINS)
> - return;
> -
> - if (tep)
> - dir = tep->plugins_dir;
> - while (dir) {
> - if (dir->prio == TEP_PLUGIN_FIRST)
> - load_plugins_dir(tep, suffix, dir->path,
> - load_plugin, data);
> - dir = dir->next;
> - }
> -
> - /*
> - * If a system plugin directory was defined,
> - * check that first.
> - */
> -#ifdef PLUGIN_DIR
> - if (!tep || !(tep->flags & TEP_DISABLE_SYS_PLUGINS))
> - load_plugins_dir(tep, suffix, PLUGIN_DIR,
> - load_plugin, data);
> -#endif
> -
> - /*
> - * Next let the environment-set plugin directory
> - * override the system defaults.
> - */
> - envdir = getenv("TRACEEVENT_PLUGIN_DIR");
> - if (envdir)
> - load_plugins_dir(tep, suffix, envdir, load_plugin, data);
> -
> - /*
> - * Now let the home directory override the environment
> - * or system defaults.
> - */
> - home = getenv("HOME");
> - if (!home)
> - return;
> -
> - ret = asprintf(&path, "%s/%s", home, LOCAL_PLUGIN_DIR);
> - if (ret < 0) {
> - warning("could not allocate plugin memory\n");
> - return;
> - }
> -
> - load_plugins_dir(tep, suffix, path, load_plugin, data);
> -
> - if (tep)
> - dir = tep->plugins_dir;
> - while (dir) {
> - if (dir->prio == TEP_PLUGIN_LAST)
> - load_plugins_dir(tep, suffix, dir->path,
> - load_plugin, data);
> - dir = dir->next;
> - }
> -
> - free(path);
> -}
> -
> -struct tep_plugin_list*
> -tep_load_plugins(struct tep_handle *tep)
> -{
> - struct tep_plugin_list *list = NULL;
> -
> - tep_load_plugins_hook(tep, ".so", load_plugin, &list);
> - return list;
> -}
> -
> -/**
> - * tep_add_plugin_path - Add a new plugin directory.
> - * @tep: Trace event handler.
> - * @path: Path to a directory. All plugin files in that
> - * directory will be loaded.
> - *@prio: Load priority of the plugins in that directory.
> - *
> - * Returns -1 in case of an error, 0 otherwise.
> - */
> -int tep_add_plugin_path(struct tep_handle *tep, char *path,
> - enum tep_plugin_load_priority prio)
> -{
> - struct tep_plugins_dir *dir;
> -
> - if (!tep || !path)
> - return -1;
> -
> - dir = calloc(1, sizeof(*dir));
> - if (!dir)
> - return -1;
> -
> - dir->path = strdup(path);
> - if (!dir->path) {
> - free(dir);
> - return -1;
> - }
> - dir->prio = prio;
> - dir->next = tep->plugins_dir;
> - tep->plugins_dir = dir;
> -
> - return 0;
> -}
> -
> -__hidden void free_tep_plugin_paths(struct tep_handle *tep)
> -{
> - struct tep_plugins_dir *dir;
> -
> - if (!tep)
> - return;
> -
> - dir = tep->plugins_dir;
> - while (dir) {
> - tep->plugins_dir = tep->plugins_dir->next;
> - free(dir->path);
> - free(dir);
> - dir = tep->plugins_dir;
> - }
> -}
> -
> -void
> -tep_unload_plugins(struct tep_plugin_list *plugin_list, struct tep_handle *tep)
> -{
> - tep_plugin_unload_func func;
> - struct tep_plugin_list *list;
> -
> - while (plugin_list) {
> - list = plugin_list;
> - plugin_list = list->next;
> - func = dlsym(list->handle, TEP_PLUGIN_UNLOADER_NAME);
> - if (func)
> - func(tep);
> - dlclose(list->handle);
> - free(list->name);
> - free(list);
> - }
> -}
> diff --git a/tools/lib/traceevent/event-utils.h b/tools/lib/traceevent/event-utils.h
> deleted file mode 100644
> index 0560b96a31d1..000000000000
> --- a/tools/lib/traceevent/event-utils.h
> +++ /dev/null
> @@ -1,67 +0,0 @@
> -/* SPDX-License-Identifier: LGPL-2.1 */
> -/*
> - * Copyright (C) 2010 Red Hat Inc, Steven Rostedt <[email protected]>
> - *
> - */
> -#ifndef __UTIL_H
> -#define __UTIL_H
> -
> -#include <ctype.h>
> -
> -/* Can be overridden */
> -void warning(const char *fmt, ...);
> -void pr_stat(const char *fmt, ...);
> -void vpr_stat(const char *fmt, va_list ap);
> -
> -/* Always available */
> -void __warning(const char *fmt, ...);
> -void __pr_stat(const char *fmt, ...);
> -
> -void __vwarning(const char *fmt, ...);
> -void __vpr_stat(const char *fmt, ...);
> -
> -#define min(x, y) ({ \
> - typeof(x) _min1 = (x); \
> - typeof(y) _min2 = (y); \
> - (void) (&_min1 == &_min2); \
> - _min1 < _min2 ? _min1 : _min2; })
> -
> -static inline char *strim(char *string)
> -{
> - char *ret;
> -
> - if (!string)
> - return NULL;
> - while (*string) {
> - if (!isspace(*string))
> - break;
> - string++;
> - }
> - ret = string;
> -
> - string = ret + strlen(ret) - 1;
> - while (string > ret) {
> - if (!isspace(*string))
> - break;
> - string--;
> - }
> - string[1] = 0;
> -
> - return ret;
> -}
> -
> -static inline int has_text(const char *text)
> -{
> - if (!text)
> - return 0;
> -
> - while (*text) {
> - if (!isspace(*text))
> - return 1;
> - text++;
> - }
> -
> - return 0;
> -}
> -
> -#endif
> diff --git a/tools/lib/traceevent/kbuffer-parse.c b/tools/lib/traceevent/kbuffer-parse.c
> deleted file mode 100644
> index f1640d651c8a..000000000000
> --- a/tools/lib/traceevent/kbuffer-parse.c
> +++ /dev/null
> @@ -1,809 +0,0 @@
> -// SPDX-License-Identifier: LGPL-2.1
> -/*
> - * Copyright (C) 2009, 2010 Red Hat Inc, Steven Rostedt <[email protected]>
> - *
> - */
> -#include <stdio.h>
> -#include <stdlib.h>
> -#include <string.h>
> -
> -#include "kbuffer.h"
> -
> -#define MISSING_EVENTS (1UL << 31)
> -#define MISSING_STORED (1UL << 30)
> -
> -#define COMMIT_MASK ((1 << 27) - 1)
> -
> -enum {
> - KBUFFER_FL_HOST_BIG_ENDIAN = (1<<0),
> - KBUFFER_FL_BIG_ENDIAN = (1<<1),
> - KBUFFER_FL_LONG_8 = (1<<2),
> - KBUFFER_FL_OLD_FORMAT = (1<<3),
> -};
> -
> -#define ENDIAN_MASK (KBUFFER_FL_HOST_BIG_ENDIAN | KBUFFER_FL_BIG_ENDIAN)
> -
> -/** kbuffer
> - * @timestamp - timestamp of current event
> - * @lost_events - # of lost events between this subbuffer and previous
> - * @flags - special flags of the kbuffer
> - * @subbuffer - pointer to the sub-buffer page
> - * @data - pointer to the start of data on the sub-buffer page
> - * @index - index from @data to the @curr event data
> - * @curr - offset from @data to the start of current event
> - * (includes metadata)
> - * @next - offset from @data to the start of next event
> - * @size - The size of data on @data
> - * @start - The offset from @subbuffer where @data lives
> - *
> - * @read_4 - Function to read 4 raw bytes (may swap)
> - * @read_8 - Function to read 8 raw bytes (may swap)
> - * @read_long - Function to read a long word (4 or 8 bytes with needed swap)
> - */
> -struct kbuffer {
> - unsigned long long timestamp;
> - long long lost_events;
> - unsigned long flags;
> - void *subbuffer;
> - void *data;
> - unsigned int index;
> - unsigned int curr;
> - unsigned int next;
> - unsigned int size;
> - unsigned int start;
> -
> - unsigned int (*read_4)(void *ptr);
> - unsigned long long (*read_8)(void *ptr);
> - unsigned long long (*read_long)(struct kbuffer *kbuf, void *ptr);
> - int (*next_event)(struct kbuffer *kbuf);
> -};
> -
> -static void *zmalloc(size_t size)
> -{
> - return calloc(1, size);
> -}
> -
> -static int host_is_bigendian(void)
> -{
> - unsigned char str[] = { 0x1, 0x2, 0x3, 0x4 };
> - unsigned int *ptr;
> -
> - ptr = (unsigned int *)str;
> - return *ptr == 0x01020304;
> -}
> -
> -static int do_swap(struct kbuffer *kbuf)
> -{
> - return ((kbuf->flags & KBUFFER_FL_HOST_BIG_ENDIAN) + kbuf->flags) &
> - ENDIAN_MASK;
> -}
> -
> -static unsigned long long __read_8(void *ptr)
> -{
> - unsigned long long data = *(unsigned long long *)ptr;
> -
> - return data;
> -}
> -
> -static unsigned long long __read_8_sw(void *ptr)
> -{
> - unsigned long long data = *(unsigned long long *)ptr;
> - unsigned long long swap;
> -
> - swap = ((data & 0xffULL) << 56) |
> - ((data & (0xffULL << 8)) << 40) |
> - ((data & (0xffULL << 16)) << 24) |
> - ((data & (0xffULL << 24)) << 8) |
> - ((data & (0xffULL << 32)) >> 8) |
> - ((data & (0xffULL << 40)) >> 24) |
> - ((data & (0xffULL << 48)) >> 40) |
> - ((data & (0xffULL << 56)) >> 56);
> -
> - return swap;
> -}
> -
> -static unsigned int __read_4(void *ptr)
> -{
> - unsigned int data = *(unsigned int *)ptr;
> -
> - return data;
> -}
> -
> -static unsigned int __read_4_sw(void *ptr)
> -{
> - unsigned int data = *(unsigned int *)ptr;
> - unsigned int swap;
> -
> - swap = ((data & 0xffULL) << 24) |
> - ((data & (0xffULL << 8)) << 8) |
> - ((data & (0xffULL << 16)) >> 8) |
> - ((data & (0xffULL << 24)) >> 24);
> -
> - return swap;
> -}
> -
> -static unsigned long long read_8(struct kbuffer *kbuf, void *ptr)
> -{
> - return kbuf->read_8(ptr);
> -}
> -
> -static unsigned int read_4(struct kbuffer *kbuf, void *ptr)
> -{
> - return kbuf->read_4(ptr);
> -}
> -
> -static unsigned long long __read_long_8(struct kbuffer *kbuf, void *ptr)
> -{
> - return kbuf->read_8(ptr);
> -}
> -
> -static unsigned long long __read_long_4(struct kbuffer *kbuf, void *ptr)
> -{
> - return kbuf->read_4(ptr);
> -}
> -
> -static unsigned long long read_long(struct kbuffer *kbuf, void *ptr)
> -{
> - return kbuf->read_long(kbuf, ptr);
> -}
> -
> -static int calc_index(struct kbuffer *kbuf, void *ptr)
> -{
> - return (unsigned long)ptr - (unsigned long)kbuf->data;
> -}
> -
> -static int __next_event(struct kbuffer *kbuf);
> -
> -/**
> - * kbuffer_alloc - allocat a new kbuffer
> - * @size; enum to denote size of word
> - * @endian: enum to denote endianness
> - *
> - * Allocates and returns a new kbuffer.
> - */
> -struct kbuffer *
> -kbuffer_alloc(enum kbuffer_long_size size, enum kbuffer_endian endian)
> -{
> - struct kbuffer *kbuf;
> - int flags = 0;
> -
> - switch (size) {
> - case KBUFFER_LSIZE_4:
> - break;
> - case KBUFFER_LSIZE_8:
> - flags |= KBUFFER_FL_LONG_8;
> - break;
> - default:
> - return NULL;
> - }
> -
> - switch (endian) {
> - case KBUFFER_ENDIAN_LITTLE:
> - break;
> - case KBUFFER_ENDIAN_BIG:
> - flags |= KBUFFER_FL_BIG_ENDIAN;
> - break;
> - default:
> - return NULL;
> - }
> -
> - kbuf = zmalloc(sizeof(*kbuf));
> - if (!kbuf)
> - return NULL;
> -
> - kbuf->flags = flags;
> -
> - if (host_is_bigendian())
> - kbuf->flags |= KBUFFER_FL_HOST_BIG_ENDIAN;
> -
> - if (do_swap(kbuf)) {
> - kbuf->read_8 = __read_8_sw;
> - kbuf->read_4 = __read_4_sw;
> - } else {
> - kbuf->read_8 = __read_8;
> - kbuf->read_4 = __read_4;
> - }
> -
> - if (kbuf->flags & KBUFFER_FL_LONG_8)
> - kbuf->read_long = __read_long_8;
> - else
> - kbuf->read_long = __read_long_4;
> -
> - /* May be changed by kbuffer_set_old_format() */
> - kbuf->next_event = __next_event;
> -
> - return kbuf;
> -}
> -
> -/** kbuffer_free - free an allocated kbuffer
> - * @kbuf: The kbuffer to free
> - *
> - * Can take NULL as a parameter.
> - */
> -void kbuffer_free(struct kbuffer *kbuf)
> -{
> - free(kbuf);
> -}
> -
> -static unsigned int type4host(struct kbuffer *kbuf,
> - unsigned int type_len_ts)
> -{
> - if (kbuf->flags & KBUFFER_FL_BIG_ENDIAN)
> - return (type_len_ts >> 29) & 3;
> - else
> - return type_len_ts & 3;
> -}
> -
> -static unsigned int len4host(struct kbuffer *kbuf,
> - unsigned int type_len_ts)
> -{
> - if (kbuf->flags & KBUFFER_FL_BIG_ENDIAN)
> - return (type_len_ts >> 27) & 7;
> - else
> - return (type_len_ts >> 2) & 7;
> -}
> -
> -static unsigned int type_len4host(struct kbuffer *kbuf,
> - unsigned int type_len_ts)
> -{
> - if (kbuf->flags & KBUFFER_FL_BIG_ENDIAN)
> - return (type_len_ts >> 27) & ((1 << 5) - 1);
> - else
> - return type_len_ts & ((1 << 5) - 1);
> -}
> -
> -static unsigned int ts4host(struct kbuffer *kbuf,
> - unsigned int type_len_ts)
> -{
> - if (kbuf->flags & KBUFFER_FL_BIG_ENDIAN)
> - return type_len_ts & ((1 << 27) - 1);
> - else
> - return type_len_ts >> 5;
> -}
> -
> -/*
> - * Linux 2.6.30 and earlier (not much ealier) had a different
> - * ring buffer format. It should be obsolete, but we handle it anyway.
> - */
> -enum old_ring_buffer_type {
> - OLD_RINGBUF_TYPE_PADDING,
> - OLD_RINGBUF_TYPE_TIME_EXTEND,
> - OLD_RINGBUF_TYPE_TIME_STAMP,
> - OLD_RINGBUF_TYPE_DATA,
> -};
> -
> -static unsigned int old_update_pointers(struct kbuffer *kbuf)
> -{
> - unsigned long long extend;
> - unsigned int type_len_ts;
> - unsigned int type;
> - unsigned int len;
> - unsigned int delta;
> - unsigned int length;
> - void *ptr = kbuf->data + kbuf->curr;
> -
> - type_len_ts = read_4(kbuf, ptr);
> - ptr += 4;
> -
> - type = type4host(kbuf, type_len_ts);
> - len = len4host(kbuf, type_len_ts);
> - delta = ts4host(kbuf, type_len_ts);
> -
> - switch (type) {
> - case OLD_RINGBUF_TYPE_PADDING:
> - kbuf->next = kbuf->size;
> - return 0;
> -
> - case OLD_RINGBUF_TYPE_TIME_EXTEND:
> - extend = read_4(kbuf, ptr);
> - extend <<= TS_SHIFT;
> - extend += delta;
> - delta = extend;
> - ptr += 4;
> - length = 0;
> - break;
> -
> - case OLD_RINGBUF_TYPE_TIME_STAMP:
> - /* should never happen! */
> - kbuf->curr = kbuf->size;
> - kbuf->next = kbuf->size;
> - kbuf->index = kbuf->size;
> - return -1;
> - default:
> - if (len)
> - length = len * 4;
> - else {
> - length = read_4(kbuf, ptr);
> - length -= 4;
> - ptr += 4;
> - }
> - break;
> - }
> -
> - kbuf->timestamp += delta;
> - kbuf->index = calc_index(kbuf, ptr);
> - kbuf->next = kbuf->index + length;
> -
> - return type;
> -}
> -
> -static int __old_next_event(struct kbuffer *kbuf)
> -{
> - int type;
> -
> - do {
> - kbuf->curr = kbuf->next;
> - if (kbuf->next >= kbuf->size)
> - return -1;
> - type = old_update_pointers(kbuf);
> - } while (type == OLD_RINGBUF_TYPE_TIME_EXTEND || type == OLD_RINGBUF_TYPE_PADDING);
> -
> - return 0;
> -}
> -
> -static unsigned int
> -translate_data(struct kbuffer *kbuf, void *data, void **rptr,
> - unsigned long long *delta, int *length)
> -{
> - unsigned long long extend;
> - unsigned int type_len_ts;
> - unsigned int type_len;
> -
> - type_len_ts = read_4(kbuf, data);
> - data += 4;
> -
> - type_len = type_len4host(kbuf, type_len_ts);
> - *delta = ts4host(kbuf, type_len_ts);
> -
> - switch (type_len) {
> - case KBUFFER_TYPE_PADDING:
> - *length = read_4(kbuf, data);
> - break;
> -
> - case KBUFFER_TYPE_TIME_EXTEND:
> - case KBUFFER_TYPE_TIME_STAMP:
> - extend = read_4(kbuf, data);
> - data += 4;
> - extend <<= TS_SHIFT;
> - extend += *delta;
> - *delta = extend;
> - *length = 0;
> - break;
> -
> - case 0:
> - *length = read_4(kbuf, data) - 4;
> - *length = (*length + 3) & ~3;
> - data += 4;
> - break;
> - default:
> - *length = type_len * 4;
> - break;
> - }
> -
> - *rptr = data;
> -
> - return type_len;
> -}
> -
> -static unsigned int update_pointers(struct kbuffer *kbuf)
> -{
> - unsigned long long delta;
> - unsigned int type_len;
> - int length;
> - void *ptr = kbuf->data + kbuf->curr;
> -
> - type_len = translate_data(kbuf, ptr, &ptr, &delta, &length);
> -
> - if (type_len == KBUFFER_TYPE_TIME_STAMP)
> - kbuf->timestamp = delta;
> - else
> - kbuf->timestamp += delta;
> -
> - kbuf->index = calc_index(kbuf, ptr);
> - kbuf->next = kbuf->index + length;
> -
> - return type_len;
> -}
> -
> -/**
> - * kbuffer_translate_data - read raw data to get a record
> - * @swap: Set to 1 if bytes in words need to be swapped when read
> - * @data: The raw data to read
> - * @size: Address to store the size of the event data.
> - *
> - * Returns a pointer to the event data. To determine the entire
> - * record size (record metadata + data) just add the difference between
> - * @data and the returned value to @size.
> - */
> -void *kbuffer_translate_data(int swap, void *data, unsigned int *size)
> -{
> - unsigned long long delta;
> - struct kbuffer kbuf;
> - int type_len;
> - int length;
> - void *ptr;
> -
> - if (swap) {
> - kbuf.read_8 = __read_8_sw;
> - kbuf.read_4 = __read_4_sw;
> - kbuf.flags = host_is_bigendian() ? 0 : KBUFFER_FL_BIG_ENDIAN;
> - } else {
> - kbuf.read_8 = __read_8;
> - kbuf.read_4 = __read_4;
> - kbuf.flags = host_is_bigendian() ? KBUFFER_FL_BIG_ENDIAN: 0;
> - }
> -
> - type_len = translate_data(&kbuf, data, &ptr, &delta, &length);
> - switch (type_len) {
> - case KBUFFER_TYPE_PADDING:
> - case KBUFFER_TYPE_TIME_EXTEND:
> - case KBUFFER_TYPE_TIME_STAMP:
> - return NULL;
> - }
> -
> - *size = length;
> -
> - return ptr;
> -}
> -
> -static int __next_event(struct kbuffer *kbuf)
> -{
> - int type;
> -
> - do {
> - kbuf->curr = kbuf->next;
> - if (kbuf->next >= kbuf->size)
> - return -1;
> - type = update_pointers(kbuf);
> - } while (type == KBUFFER_TYPE_TIME_EXTEND ||
> - type == KBUFFER_TYPE_TIME_STAMP ||
> - type == KBUFFER_TYPE_PADDING);
> -
> - return 0;
> -}
> -
> -static int next_event(struct kbuffer *kbuf)
> -{
> - return kbuf->next_event(kbuf);
> -}
> -
> -/**
> - * kbuffer_next_event - increment the current pointer
> - * @kbuf: The kbuffer to read
> - * @ts: Address to store the next record's timestamp (may be NULL to ignore)
> - *
> - * Increments the pointers into the subbuffer of the kbuffer to point to the
> - * next event so that the next kbuffer_read_event() will return a
> - * new event.
> - *
> - * Returns the data of the next event if a new event exists on the subbuffer,
> - * NULL otherwise.
> - */
> -void *kbuffer_next_event(struct kbuffer *kbuf, unsigned long long *ts)
> -{
> - int ret;
> -
> - if (!kbuf || !kbuf->subbuffer)
> - return NULL;
> -
> - ret = next_event(kbuf);
> - if (ret < 0)
> - return NULL;
> -
> - if (ts)
> - *ts = kbuf->timestamp;
> -
> - return kbuf->data + kbuf->index;
> -}
> -
> -/**
> - * kbuffer_load_subbuffer - load a new subbuffer into the kbuffer
> - * @kbuf: The kbuffer to load
> - * @subbuffer: The subbuffer to load into @kbuf.
> - *
> - * Load a new subbuffer (page) into @kbuf. This will reset all
> - * the pointers and update the @kbuf timestamp. The next read will
> - * return the first event on @subbuffer.
> - *
> - * Returns 0 on succes, -1 otherwise.
> - */
> -int kbuffer_load_subbuffer(struct kbuffer *kbuf, void *subbuffer)
> -{
> - unsigned long long flags;
> - void *ptr = subbuffer;
> -
> - if (!kbuf || !subbuffer)
> - return -1;
> -
> - kbuf->subbuffer = subbuffer;
> -
> - kbuf->timestamp = read_8(kbuf, ptr);
> - ptr += 8;
> -
> - kbuf->curr = 0;
> -
> - if (kbuf->flags & KBUFFER_FL_LONG_8)
> - kbuf->start = 16;
> - else
> - kbuf->start = 12;
> -
> - kbuf->data = subbuffer + kbuf->start;
> -
> - flags = read_long(kbuf, ptr);
> - kbuf->size = (unsigned int)flags & COMMIT_MASK;
> -
> - if (flags & MISSING_EVENTS) {
> - if (flags & MISSING_STORED) {
> - ptr = kbuf->data + kbuf->size;
> - kbuf->lost_events = read_long(kbuf, ptr);
> - } else
> - kbuf->lost_events = -1;
> - } else
> - kbuf->lost_events = 0;
> -
> - kbuf->index = 0;
> - kbuf->next = 0;
> -
> - next_event(kbuf);
> -
> - return 0;
> -}
> -
> -/**
> - * kbuffer_subbuf_timestamp - read the timestamp from a sub buffer
> - * @kbuf: The kbuffer to load
> - * @subbuf: The subbuffer to read from.
> - *
> - * Return the timestamp from a subbuffer.
> - */
> -unsigned long long kbuffer_subbuf_timestamp(struct kbuffer *kbuf, void *subbuf)
> -{
> - return kbuf->read_8(subbuf);
> -}
> -
> -/**
> - * kbuffer_ptr_delta - read the delta field from a record
> - * @kbuf: The kbuffer to load
> - * @ptr: The record in the buffe.
> - *
> - * Return the timestamp delta from a record
> - */
> -unsigned int kbuffer_ptr_delta(struct kbuffer *kbuf, void *ptr)
> -{
> - unsigned int type_len_ts;
> -
> - type_len_ts = read_4(kbuf, ptr);
> - return ts4host(kbuf, type_len_ts);
> -}
> -
> -
> -/**
> - * kbuffer_read_event - read the next event in the kbuffer subbuffer
> - * @kbuf: The kbuffer to read from
> - * @ts: The address to store the timestamp of the event (may be NULL to ignore)
> - *
> - * Returns a pointer to the data part of the current event.
> - * NULL if no event is left on the subbuffer.
> - */
> -void *kbuffer_read_event(struct kbuffer *kbuf, unsigned long long *ts)
> -{
> - if (!kbuf || !kbuf->subbuffer)
> - return NULL;
> -
> - if (kbuf->curr >= kbuf->size)
> - return NULL;
> -
> - if (ts)
> - *ts = kbuf->timestamp;
> - return kbuf->data + kbuf->index;
> -}
> -
> -/**
> - * kbuffer_timestamp - Return the timestamp of the current event
> - * @kbuf: The kbuffer to read from
> - *
> - * Returns the timestamp of the current (next) event.
> - */
> -unsigned long long kbuffer_timestamp(struct kbuffer *kbuf)
> -{
> - return kbuf->timestamp;
> -}
> -
> -/**
> - * kbuffer_read_at_offset - read the event that is at offset
> - * @kbuf: The kbuffer to read from
> - * @offset: The offset into the subbuffer
> - * @ts: The address to store the timestamp of the event (may be NULL to ignore)
> - *
> - * The @offset must be an index from the @kbuf subbuffer beginning.
> - * If @offset is bigger than the stored subbuffer, NULL will be returned.
> - *
> - * Returns the data of the record that is at @offset. Note, @offset does
> - * not need to be the start of the record, the offset just needs to be
> - * in the record (or beginning of it).
> - *
> - * Note, the kbuf timestamp and pointers are updated to the
> - * returned record. That is, kbuffer_read_event() will return the same
> - * data and timestamp, and kbuffer_next_event() will increment from
> - * this record.
> - */
> -void *kbuffer_read_at_offset(struct kbuffer *kbuf, int offset,
> - unsigned long long *ts)
> -{
> - void *data;
> -
> - if (offset < kbuf->start)
> - offset = 0;
> - else
> - offset -= kbuf->start;
> -
> - /* Reset the buffer */
> - kbuffer_load_subbuffer(kbuf, kbuf->subbuffer);
> - data = kbuffer_read_event(kbuf, ts);
> -
> - while (kbuf->curr < offset) {
> - data = kbuffer_next_event(kbuf, ts);
> - if (!data)
> - break;
> - }
> -
> - return data;
> -}
> -
> -/**
> - * kbuffer_subbuffer_size - the size of the loaded subbuffer
> - * @kbuf: The kbuffer to read from
> - *
> - * Returns the size of the subbuffer. Note, this size is
> - * where the last event resides. The stored subbuffer may actually be
> - * bigger due to padding and such.
> - */
> -int kbuffer_subbuffer_size(struct kbuffer *kbuf)
> -{
> - return kbuf->size;
> -}
> -
> -/**
> - * kbuffer_curr_index - Return the index of the record
> - * @kbuf: The kbuffer to read from
> - *
> - * Returns the index from the start of the data part of
> - * the subbuffer to the current location. Note this is not
> - * from the start of the subbuffer. An index of zero will
> - * point to the first record. Use kbuffer_curr_offset() for
> - * the actually offset (that can be used by kbuffer_read_at_offset())
> - */
> -int kbuffer_curr_index(struct kbuffer *kbuf)
> -{
> - return kbuf->curr;
> -}
> -
> -/**
> - * kbuffer_curr_offset - Return the offset of the record
> - * @kbuf: The kbuffer to read from
> - *
> - * Returns the offset from the start of the subbuffer to the
> - * current location.
> - */
> -int kbuffer_curr_offset(struct kbuffer *kbuf)
> -{
> - return kbuf->curr + kbuf->start;
> -}
> -
> -/**
> - * kbuffer_event_size - return the size of the event data
> - * @kbuf: The kbuffer to read
> - *
> - * Returns the size of the event data (the payload not counting
> - * the meta data of the record) of the current event.
> - */
> -int kbuffer_event_size(struct kbuffer *kbuf)
> -{
> - return kbuf->next - kbuf->index;
> -}
> -
> -/**
> - * kbuffer_curr_size - return the size of the entire record
> - * @kbuf: The kbuffer to read
> - *
> - * Returns the size of the entire record (meta data and payload)
> - * of the current event.
> - */
> -int kbuffer_curr_size(struct kbuffer *kbuf)
> -{
> - return kbuf->next - kbuf->curr;
> -}
> -
> -/**
> - * kbuffer_missed_events - return the # of missed events from last event.
> - * @kbuf: The kbuffer to read from
> - *
> - * Returns the # of missed events (if recorded) before the current
> - * event. Note, only events on the beginning of a subbuffer can
> - * have missed events, all other events within the buffer will be
> - * zero.
> - */
> -int kbuffer_missed_events(struct kbuffer *kbuf)
> -{
> - /* Only the first event can have missed events */
> - if (kbuf->curr)
> - return 0;
> -
> - return kbuf->lost_events;
> -}
> -
> -/**
> - * kbuffer_set_old_forma - set the kbuffer to use the old format parsing
> - * @kbuf: The kbuffer to set
> - *
> - * This is obsolete (or should be). The first kernels to use the
> - * new ring buffer had a slightly different ring buffer format
> - * (2.6.30 and earlier). It is still somewhat supported by kbuffer,
> - * but should not be counted on in the future.
> - */
> -void kbuffer_set_old_format(struct kbuffer *kbuf)
> -{
> - kbuf->flags |= KBUFFER_FL_OLD_FORMAT;
> -
> - kbuf->next_event = __old_next_event;
> -}
> -
> -/**
> - * kbuffer_start_of_data - return offset of where data starts on subbuffer
> - * @kbuf: The kbuffer
> - *
> - * Returns the location on the subbuffer where the data starts.
> - */
> -int kbuffer_start_of_data(struct kbuffer *kbuf)
> -{
> - return kbuf->start;
> -}
> -
> -/**
> - * kbuffer_raw_get - get raw buffer info
> - * @kbuf: The kbuffer
> - * @subbuf: Start of mapped subbuffer
> - * @info: Info descriptor to fill in
> - *
> - * For debugging. This can return internals of the ring buffer.
> - * Expects to have info->next set to what it will read.
> - * The type, length and timestamp delta will be filled in, and
> - * @info->next will be updated to the next element.
> - * The @subbuf is used to know if the info is passed the end of
> - * data and NULL will be returned if it is.
> - */
> -struct kbuffer_raw_info *
> -kbuffer_raw_get(struct kbuffer *kbuf, void *subbuf, struct kbuffer_raw_info *info)
> -{
> - unsigned long long flags;
> - unsigned long long delta;
> - unsigned int type_len;
> - unsigned int size;
> - int start;
> - int length;
> - void *ptr = info->next;
> -
> - if (!kbuf || !subbuf)
> - return NULL;
> -
> - if (kbuf->flags & KBUFFER_FL_LONG_8)
> - start = 16;
> - else
> - start = 12;
> -
> - flags = read_long(kbuf, subbuf + 8);
> - size = (unsigned int)flags & COMMIT_MASK;
> -
> - if (ptr < subbuf || ptr >= subbuf + start + size)
> - return NULL;
> -
> - type_len = translate_data(kbuf, ptr, &ptr, &delta, &length);
> -
> - info->next = ptr + length;
> -
> - info->type = type_len;
> - info->delta = delta;
> - info->length = length;
> -
> - return info;
> -}
> diff --git a/tools/lib/traceevent/kbuffer.h b/tools/lib/traceevent/kbuffer.h
> deleted file mode 100644
> index a2b522093cfd..000000000000
> --- a/tools/lib/traceevent/kbuffer.h
> +++ /dev/null
> @@ -1,68 +0,0 @@
> -/* SPDX-License-Identifier: LGPL-2.1 */
> -/*
> - * Copyright (C) 2012 Red Hat Inc, Steven Rostedt <[email protected]>
> - *
> - */
> -#ifndef _KBUFFER_H
> -#define _KBUFFER_H
> -
> -#ifndef TS_SHIFT
> -#define TS_SHIFT 27
> -#endif
> -
> -enum kbuffer_endian {
> - KBUFFER_ENDIAN_BIG,
> - KBUFFER_ENDIAN_LITTLE,
> -};
> -
> -enum kbuffer_long_size {
> - KBUFFER_LSIZE_4,
> - KBUFFER_LSIZE_8,
> -};
> -
> -enum {
> - KBUFFER_TYPE_PADDING = 29,
> - KBUFFER_TYPE_TIME_EXTEND = 30,
> - KBUFFER_TYPE_TIME_STAMP = 31,
> -};
> -
> -struct kbuffer;
> -
> -struct kbuffer *kbuffer_alloc(enum kbuffer_long_size size, enum kbuffer_endian endian);
> -void kbuffer_free(struct kbuffer *kbuf);
> -int kbuffer_load_subbuffer(struct kbuffer *kbuf, void *subbuffer);
> -void *kbuffer_read_event(struct kbuffer *kbuf, unsigned long long *ts);
> -void *kbuffer_next_event(struct kbuffer *kbuf, unsigned long long *ts);
> -unsigned long long kbuffer_timestamp(struct kbuffer *kbuf);
> -unsigned long long kbuffer_subbuf_timestamp(struct kbuffer *kbuf, void *subbuf);
> -unsigned int kbuffer_ptr_delta(struct kbuffer *kbuf, void *ptr);
> -
> -void *kbuffer_translate_data(int swap, void *data, unsigned int *size);
> -
> -void *kbuffer_read_at_offset(struct kbuffer *kbuf, int offset, unsigned long long *ts);
> -
> -int kbuffer_curr_index(struct kbuffer *kbuf);
> -
> -int kbuffer_curr_offset(struct kbuffer *kbuf);
> -int kbuffer_curr_size(struct kbuffer *kbuf);
> -int kbuffer_event_size(struct kbuffer *kbuf);
> -int kbuffer_missed_events(struct kbuffer *kbuf);
> -int kbuffer_subbuffer_size(struct kbuffer *kbuf);
> -
> -void kbuffer_set_old_format(struct kbuffer *kbuf);
> -int kbuffer_start_of_data(struct kbuffer *kbuf);
> -
> -/* Debugging */
> -
> -struct kbuffer_raw_info {
> - int type;
> - int length;
> - unsigned long long delta;
> - void *next;
> -};
> -
> -/* Read raw data */
> -struct kbuffer_raw_info *kbuffer_raw_get(struct kbuffer *kbuf, void *subbuf,
> - struct kbuffer_raw_info *info);
> -
> -#endif /* _K_BUFFER_H */
> diff --git a/tools/lib/traceevent/libtraceevent.pc.template b/tools/lib/traceevent/libtraceevent.pc.template
> deleted file mode 100644
> index 86384fcd57f1..000000000000
> --- a/tools/lib/traceevent/libtraceevent.pc.template
> +++ /dev/null
> @@ -1,10 +0,0 @@
> -prefix=INSTALL_PREFIX
> -libdir=LIB_DIR
> -includedir=HEADER_DIR
> -
> -Name: libtraceevent
> -URL: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
> -Description: Linux kernel trace event library
> -Version: LIB_VERSION
> -Cflags: -I${includedir}
> -Libs: -L${libdir} -ltraceevent
> diff --git a/tools/lib/traceevent/parse-filter.c b/tools/lib/traceevent/parse-filter.c
> deleted file mode 100644
> index 5df177070d53..000000000000
> --- a/tools/lib/traceevent/parse-filter.c
> +++ /dev/null
> @@ -1,2281 +0,0 @@
> -// SPDX-License-Identifier: LGPL-2.1
> -/*
> - * Copyright (C) 2010 Red Hat Inc, Steven Rostedt <[email protected]>
> - *
> - */
> -#include <stdio.h>
> -#include <stdlib.h>
> -#include <string.h>
> -#include <stdarg.h>
> -#include <errno.h>
> -#include <sys/types.h>
> -
> -#include "event-parse.h"
> -#include "event-parse-local.h"
> -#include "event-utils.h"
> -
> -#define COMM "COMM"
> -#define CPU "CPU"
> -
> -static struct tep_format_field comm = {
> - .name = "COMM",
> -};
> -
> -static struct tep_format_field cpu = {
> - .name = "CPU",
> -};
> -
> -struct event_list {
> - struct event_list *next;
> - struct tep_event *event;
> -};
> -
> -static void show_error(char *error_buf, const char *fmt, ...)
> -{
> - unsigned long long index;
> - const char *input;
> - va_list ap;
> - int len;
> - int i;
> -
> - input = get_input_buf();
> - index = get_input_buf_ptr();
> - len = input ? strlen(input) : 0;
> -
> - if (len) {
> - strcpy(error_buf, input);
> - error_buf[len] = '\n';
> - for (i = 1; i < len && i < index; i++)
> - error_buf[len+i] = ' ';
> - error_buf[len + i] = '^';
> - error_buf[len + i + 1] = '\n';
> - len += i+2;
> - }
> -
> - va_start(ap, fmt);
> - vsnprintf(error_buf + len, TEP_FILTER_ERROR_BUFSZ - len, fmt, ap);
> - va_end(ap);
> -}
> -
> -static enum tep_event_type filter_read_token(char **tok)
> -{
> - enum tep_event_type type;
> - char *token = NULL;
> -
> - do {
> - free_token(token);
> - type = read_token(&token);
> - } while (type == TEP_EVENT_NEWLINE || type == TEP_EVENT_SPACE);
> -
> - /* If token is = or ! check to see if the next char is ~ */
> - if (token &&
> - (strcmp(token, "=") == 0 || strcmp(token, "!") == 0) &&
> - peek_char() == '~') {
> - /* append it */
> - *tok = malloc(3);
> - if (*tok == NULL) {
> - free_token(token);
> - return TEP_EVENT_ERROR;
> - }
> - sprintf(*tok, "%c%c", *token, '~');
> - free_token(token);
> - /* Now remove the '~' from the buffer */
> - read_token(&token);
> - free_token(token);
> - } else
> - *tok = token;
> -
> - return type;
> -}
> -
> -static int filter_cmp(const void *a, const void *b)
> -{
> - const struct tep_filter_type *ea = a;
> - const struct tep_filter_type *eb = b;
> -
> - if (ea->event_id < eb->event_id)
> - return -1;
> -
> - if (ea->event_id > eb->event_id)
> - return 1;
> -
> - return 0;
> -}
> -
> -static struct tep_filter_type *
> -find_filter_type(struct tep_event_filter *filter, int id)
> -{
> - struct tep_filter_type *filter_type;
> - struct tep_filter_type key;
> -
> - key.event_id = id;
> -
> - filter_type = bsearch(&key, filter->event_filters,
> - filter->filters,
> - sizeof(*filter->event_filters),
> - filter_cmp);
> -
> - return filter_type;
> -}
> -
> -static struct tep_filter_type *
> -add_filter_type(struct tep_event_filter *filter, int id)
> -{
> - struct tep_filter_type *filter_type;
> - int i;
> -
> - filter_type = find_filter_type(filter, id);
> - if (filter_type)
> - return filter_type;
> -
> - filter_type = realloc(filter->event_filters,
> - sizeof(*filter->event_filters) *
> - (filter->filters + 1));
> - if (!filter_type)
> - return NULL;
> -
> - filter->event_filters = filter_type;
> -
> - for (i = 0; i < filter->filters; i++) {
> - if (filter->event_filters[i].event_id > id)
> - break;
> - }
> -
> - if (i < filter->filters)
> - memmove(&filter->event_filters[i+1],
> - &filter->event_filters[i],
> - sizeof(*filter->event_filters) *
> - (filter->filters - i));
> -
> - filter_type = &filter->event_filters[i];
> - filter_type->event_id = id;
> - filter_type->event = tep_find_event(filter->tep, id);
> - filter_type->filter = NULL;
> -
> - filter->filters++;
> -
> - return filter_type;
> -}
> -
> -/**
> - * tep_filter_alloc - create a new event filter
> - * @tep: The tep that this filter is associated with
> - */
> -struct tep_event_filter *tep_filter_alloc(struct tep_handle *tep)
> -{
> - struct tep_event_filter *filter;
> -
> - filter = malloc(sizeof(*filter));
> - if (filter == NULL)
> - return NULL;
> -
> - memset(filter, 0, sizeof(*filter));
> - filter->tep = tep;
> - tep_ref(tep);
> -
> - return filter;
> -}
> -
> -static struct tep_filter_arg *allocate_arg(void)
> -{
> - return calloc(1, sizeof(struct tep_filter_arg));
> -}
> -
> -static void free_arg(struct tep_filter_arg *arg)
> -{
> - if (!arg)
> - return;
> -
> - switch (arg->type) {
> - case TEP_FILTER_ARG_NONE:
> - case TEP_FILTER_ARG_BOOLEAN:
> - break;
> -
> - case TEP_FILTER_ARG_NUM:
> - free_arg(arg->num.left);
> - free_arg(arg->num.right);
> - break;
> -
> - case TEP_FILTER_ARG_EXP:
> - free_arg(arg->exp.left);
> - free_arg(arg->exp.right);
> - break;
> -
> - case TEP_FILTER_ARG_STR:
> - free(arg->str.val);
> - regfree(&arg->str.reg);
> - free(arg->str.buffer);
> - break;
> -
> - case TEP_FILTER_ARG_VALUE:
> - if (arg->value.type == TEP_FILTER_STRING ||
> - arg->value.type == TEP_FILTER_CHAR)
> - free(arg->value.str);
> - break;
> -
> - case TEP_FILTER_ARG_OP:
> - free_arg(arg->op.left);
> - free_arg(arg->op.right);
> - default:
> - break;
> - }
> -
> - free(arg);
> -}
> -
> -static int add_event(struct event_list **events,
> - struct tep_event *event)
> -{
> - struct event_list *list;
> -
> - list = malloc(sizeof(*list));
> - if (list == NULL)
> - return -1;
> -
> - list->next = *events;
> - *events = list;
> - list->event = event;
> - return 0;
> -}
> -
> -static int event_match(struct tep_event *event,
> - regex_t *sreg, regex_t *ereg)
> -{
> - if (sreg) {
> - return !regexec(sreg, event->system, 0, NULL, 0) &&
> - !regexec(ereg, event->name, 0, NULL, 0);
> - }
> -
> - return !regexec(ereg, event->system, 0, NULL, 0) ||
> - !regexec(ereg, event->name, 0, NULL, 0);
> -}
> -
> -static enum tep_errno
> -find_event(struct tep_handle *tep, struct event_list **events,
> - char *sys_name, char *event_name)
> -{
> - struct tep_event *event;
> - regex_t ereg;
> - regex_t sreg;
> - int match = 0;
> - int fail = 0;
> - char *reg;
> - int ret;
> - int i;
> -
> - if (!event_name) {
> - /* if no name is given, then swap sys and name */
> - event_name = sys_name;
> - sys_name = NULL;
> - }
> -
> - ret = asprintf(&reg, "^%s$", event_name);
> - if (ret < 0)
> - return TEP_ERRNO__MEM_ALLOC_FAILED;
> -
> - ret = regcomp(&ereg, reg, REG_ICASE|REG_NOSUB);
> - free(reg);
> -
> - if (ret)
> - return TEP_ERRNO__INVALID_EVENT_NAME;
> -
> - if (sys_name) {
> - ret = asprintf(&reg, "^%s$", sys_name);
> - if (ret < 0) {
> - regfree(&ereg);
> - return TEP_ERRNO__MEM_ALLOC_FAILED;
> - }
> -
> - ret = regcomp(&sreg, reg, REG_ICASE|REG_NOSUB);
> - free(reg);
> - if (ret) {
> - regfree(&ereg);
> - return TEP_ERRNO__INVALID_EVENT_NAME;
> - }
> - }
> -
> - for (i = 0; i < tep->nr_events; i++) {
> - event = tep->events[i];
> - if (event_match(event, sys_name ? &sreg : NULL, &ereg)) {
> - match = 1;
> - if (add_event(events, event) < 0) {
> - fail = 1;
> - break;
> - }
> - }
> - }
> -
> - regfree(&ereg);
> - if (sys_name)
> - regfree(&sreg);
> -
> - if (!match)
> - return TEP_ERRNO__EVENT_NOT_FOUND;
> - if (fail)
> - return TEP_ERRNO__MEM_ALLOC_FAILED;
> -
> - return 0;
> -}
> -
> -static void free_events(struct event_list *events)
> -{
> - struct event_list *event;
> -
> - while (events) {
> - event = events;
> - events = events->next;
> - free(event);
> - }
> -}
> -
> -static enum tep_errno
> -create_arg_item(struct tep_event *event, const char *token,
> - enum tep_event_type type, struct tep_filter_arg **parg, char *error_str)
> -{
> - struct tep_format_field *field;
> - struct tep_filter_arg *arg;
> -
> - arg = allocate_arg();
> - if (arg == NULL) {
> - show_error(error_str, "failed to allocate filter arg");
> - return TEP_ERRNO__MEM_ALLOC_FAILED;
> - }
> -
> - switch (type) {
> -
> - case TEP_EVENT_SQUOTE:
> - case TEP_EVENT_DQUOTE:
> - arg->type = TEP_FILTER_ARG_VALUE;
> - arg->value.type =
> - type == TEP_EVENT_DQUOTE ? TEP_FILTER_STRING : TEP_FILTER_CHAR;
> - arg->value.str = strdup(token);
> - if (!arg->value.str) {
> - free_arg(arg);
> - show_error(error_str, "failed to allocate string filter arg");
> - return TEP_ERRNO__MEM_ALLOC_FAILED;
> - }
> - break;
> - case TEP_EVENT_ITEM:
> - /* if it is a number, then convert it */
> - if (isdigit(token[0])) {
> - arg->type = TEP_FILTER_ARG_VALUE;
> - arg->value.type = TEP_FILTER_NUMBER;
> - arg->value.val = strtoull(token, NULL, 0);
> - break;
> - }
> - /* Consider this a field */
> - field = tep_find_any_field(event, token);
> - if (!field) {
> - /* If token is 'COMM' or 'CPU' then it is special */
> - if (strcmp(token, COMM) == 0) {
> - field = &comm;
> - } else if (strcmp(token, CPU) == 0) {
> - field = &cpu;
> - } else {
> - /* not a field, Make it false */
> - arg->type = TEP_FILTER_ARG_BOOLEAN;
> - arg->boolean.value = TEP_FILTER_FALSE;
> - break;
> - }
> - }
> - arg->type = TEP_FILTER_ARG_FIELD;
> - arg->field.field = field;
> - break;
> - default:
> - free_arg(arg);
> - show_error(error_str, "expected a value but found %s", token);
> - return TEP_ERRNO__UNEXPECTED_TYPE;
> - }
> - *parg = arg;
> - return 0;
> -}
> -
> -static struct tep_filter_arg *
> -create_arg_op(enum tep_filter_op_type btype)
> -{
> - struct tep_filter_arg *arg;
> -
> - arg = allocate_arg();
> - if (!arg)
> - return NULL;
> -
> - arg->type = TEP_FILTER_ARG_OP;
> - arg->op.type = btype;
> -
> - return arg;
> -}
> -
> -static struct tep_filter_arg *
> -create_arg_exp(enum tep_filter_exp_type etype)
> -{
> - struct tep_filter_arg *arg;
> -
> - arg = allocate_arg();
> - if (!arg)
> - return NULL;
> -
> - arg->type = TEP_FILTER_ARG_EXP;
> - arg->exp.type = etype;
> -
> - return arg;
> -}
> -
> -static struct tep_filter_arg *
> -create_arg_cmp(enum tep_filter_cmp_type ctype)
> -{
> - struct tep_filter_arg *arg;
> -
> - arg = allocate_arg();
> - if (!arg)
> - return NULL;
> -
> - /* Use NUM and change if necessary */
> - arg->type = TEP_FILTER_ARG_NUM;
> - arg->num.type = ctype;
> -
> - return arg;
> -}
> -
> -static enum tep_errno
> -add_right(struct tep_filter_arg *op, struct tep_filter_arg *arg, char *error_str)
> -{
> - struct tep_filter_arg *left;
> - char *str;
> - int op_type;
> - int ret;
> -
> - switch (op->type) {
> - case TEP_FILTER_ARG_EXP:
> - if (op->exp.right)
> - goto out_fail;
> - op->exp.right = arg;
> - break;
> -
> - case TEP_FILTER_ARG_OP:
> - if (op->op.right)
> - goto out_fail;
> - op->op.right = arg;
> - break;
> -
> - case TEP_FILTER_ARG_NUM:
> - if (op->op.right)
> - goto out_fail;
> - /*
> - * The arg must be num, str, or field
> - */
> - switch (arg->type) {
> - case TEP_FILTER_ARG_VALUE:
> - case TEP_FILTER_ARG_FIELD:
> - break;
> - default:
> - show_error(error_str, "Illegal rvalue");
> - return TEP_ERRNO__ILLEGAL_RVALUE;
> - }
> -
> - /*
> - * Depending on the type, we may need to
> - * convert this to a string or regex.
> - */
> - switch (arg->value.type) {
> - case TEP_FILTER_CHAR:
> - /*
> - * A char should be converted to number if
> - * the string is 1 byte, and the compare
> - * is not a REGEX.
> - */
> - if (strlen(arg->value.str) == 1 &&
> - op->num.type != TEP_FILTER_CMP_REGEX &&
> - op->num.type != TEP_FILTER_CMP_NOT_REGEX) {
> - arg->value.type = TEP_FILTER_NUMBER;
> - goto do_int;
> - }
> - /* fall through */
> - case TEP_FILTER_STRING:
> -
> - /* convert op to a string arg */
> - op_type = op->num.type;
> - left = op->num.left;
> - str = arg->value.str;
> -
> - /* reset the op for the new field */
> - memset(op, 0, sizeof(*op));
> -
> - /*
> - * If left arg was a field not found then
> - * NULL the entire op.
> - */
> - if (left->type == TEP_FILTER_ARG_BOOLEAN) {
> - free_arg(left);
> - free_arg(arg);
> - op->type = TEP_FILTER_ARG_BOOLEAN;
> - op->boolean.value = TEP_FILTER_FALSE;
> - break;
> - }
> -
> - /* Left arg must be a field */
> - if (left->type != TEP_FILTER_ARG_FIELD) {
> - show_error(error_str,
> - "Illegal lvalue for string comparison");
> - return TEP_ERRNO__ILLEGAL_LVALUE;
> - }
> -
> - /* Make sure this is a valid string compare */
> - switch (op_type) {
> - case TEP_FILTER_CMP_EQ:
> - op_type = TEP_FILTER_CMP_MATCH;
> - break;
> - case TEP_FILTER_CMP_NE:
> - op_type = TEP_FILTER_CMP_NOT_MATCH;
> - break;
> -
> - case TEP_FILTER_CMP_REGEX:
> - case TEP_FILTER_CMP_NOT_REGEX:
> - ret = regcomp(&op->str.reg, str, REG_ICASE|REG_NOSUB);
> - if (ret) {
> - show_error(error_str,
> - "RegEx '%s' did not compute",
> - str);
> - return TEP_ERRNO__INVALID_REGEX;
> - }
> - break;
> - default:
> - show_error(error_str,
> - "Illegal comparison for string");
> - return TEP_ERRNO__ILLEGAL_STRING_CMP;
> - }
> -
> - op->type = TEP_FILTER_ARG_STR;
> - op->str.type = op_type;
> - op->str.field = left->field.field;
> - op->str.val = strdup(str);
> - if (!op->str.val) {
> - show_error(error_str, "Failed to allocate string filter");
> - return TEP_ERRNO__MEM_ALLOC_FAILED;
> - }
> - /*
> - * Need a buffer to copy data for tests
> - */
> - op->str.buffer = malloc(op->str.field->size + 1);
> - if (!op->str.buffer) {
> - show_error(error_str, "Failed to allocate string filter");
> - return TEP_ERRNO__MEM_ALLOC_FAILED;
> - }
> - /* Null terminate this buffer */
> - op->str.buffer[op->str.field->size] = 0;
> -
> - /* We no longer have left or right args */
> - free_arg(arg);
> - free_arg(left);
> -
> - break;
> -
> - case TEP_FILTER_NUMBER:
> -
> - do_int:
> - switch (op->num.type) {
> - case TEP_FILTER_CMP_REGEX:
> - case TEP_FILTER_CMP_NOT_REGEX:
> - show_error(error_str,
> - "Op not allowed with integers");
> - return TEP_ERRNO__ILLEGAL_INTEGER_CMP;
> -
> - default:
> - break;
> - }
> -
> - /* numeric compare */
> - op->num.right = arg;
> - break;
> - default:
> - goto out_fail;
> - }
> - break;
> - default:
> - goto out_fail;
> - }
> -
> - return 0;
> -
> - out_fail:
> - show_error(error_str, "Syntax error");
> - return TEP_ERRNO__SYNTAX_ERROR;
> -}
> -
> -static struct tep_filter_arg *
> -rotate_op_right(struct tep_filter_arg *a, struct tep_filter_arg *b)
> -{
> - struct tep_filter_arg *arg;
> -
> - arg = a->op.right;
> - a->op.right = b;
> - return arg;
> -}
> -
> -static enum tep_errno add_left(struct tep_filter_arg *op, struct tep_filter_arg *arg)
> -{
> - switch (op->type) {
> - case TEP_FILTER_ARG_EXP:
> - if (arg->type == TEP_FILTER_ARG_OP)
> - arg = rotate_op_right(arg, op);
> - op->exp.left = arg;
> - break;
> -
> - case TEP_FILTER_ARG_OP:
> - op->op.left = arg;
> - break;
> - case TEP_FILTER_ARG_NUM:
> - if (arg->type == TEP_FILTER_ARG_OP)
> - arg = rotate_op_right(arg, op);
> -
> - /* left arg of compares must be a field */
> - if (arg->type != TEP_FILTER_ARG_FIELD &&
> - arg->type != TEP_FILTER_ARG_BOOLEAN)
> - return TEP_ERRNO__INVALID_ARG_TYPE;
> - op->num.left = arg;
> - break;
> - default:
> - return TEP_ERRNO__INVALID_ARG_TYPE;
> - }
> - return 0;
> -}
> -
> -enum op_type {
> - OP_NONE,
> - OP_BOOL,
> - OP_NOT,
> - OP_EXP,
> - OP_CMP,
> -};
> -
> -static enum op_type process_op(const char *token,
> - enum tep_filter_op_type *btype,
> - enum tep_filter_cmp_type *ctype,
> - enum tep_filter_exp_type *etype)
> -{
> - *btype = TEP_FILTER_OP_NOT;
> - *etype = TEP_FILTER_EXP_NONE;
> - *ctype = TEP_FILTER_CMP_NONE;
> -
> - if (strcmp(token, "&&") == 0)
> - *btype = TEP_FILTER_OP_AND;
> - else if (strcmp(token, "||") == 0)
> - *btype = TEP_FILTER_OP_OR;
> - else if (strcmp(token, "!") == 0)
> - return OP_NOT;
> -
> - if (*btype != TEP_FILTER_OP_NOT)
> - return OP_BOOL;
> -
> - /* Check for value expressions */
> - if (strcmp(token, "+") == 0) {
> - *etype = TEP_FILTER_EXP_ADD;
> - } else if (strcmp(token, "-") == 0) {
> - *etype = TEP_FILTER_EXP_SUB;
> - } else if (strcmp(token, "*") == 0) {
> - *etype = TEP_FILTER_EXP_MUL;
> - } else if (strcmp(token, "/") == 0) {
> - *etype = TEP_FILTER_EXP_DIV;
> - } else if (strcmp(token, "%") == 0) {
> - *etype = TEP_FILTER_EXP_MOD;
> - } else if (strcmp(token, ">>") == 0) {
> - *etype = TEP_FILTER_EXP_RSHIFT;
> - } else if (strcmp(token, "<<") == 0) {
> - *etype = TEP_FILTER_EXP_LSHIFT;
> - } else if (strcmp(token, "&") == 0) {
> - *etype = TEP_FILTER_EXP_AND;
> - } else if (strcmp(token, "|") == 0) {
> - *etype = TEP_FILTER_EXP_OR;
> - } else if (strcmp(token, "^") == 0) {
> - *etype = TEP_FILTER_EXP_XOR;
> - } else if (strcmp(token, "~") == 0)
> - *etype = TEP_FILTER_EXP_NOT;
> -
> - if (*etype != TEP_FILTER_EXP_NONE)
> - return OP_EXP;
> -
> - /* Check for compares */
> - if (strcmp(token, "==") == 0)
> - *ctype = TEP_FILTER_CMP_EQ;
> - else if (strcmp(token, "!=") == 0)
> - *ctype = TEP_FILTER_CMP_NE;
> - else if (strcmp(token, "<") == 0)
> - *ctype = TEP_FILTER_CMP_LT;
> - else if (strcmp(token, ">") == 0)
> - *ctype = TEP_FILTER_CMP_GT;
> - else if (strcmp(token, "<=") == 0)
> - *ctype = TEP_FILTER_CMP_LE;
> - else if (strcmp(token, ">=") == 0)
> - *ctype = TEP_FILTER_CMP_GE;
> - else if (strcmp(token, "=~") == 0)
> - *ctype = TEP_FILTER_CMP_REGEX;
> - else if (strcmp(token, "!~") == 0)
> - *ctype = TEP_FILTER_CMP_NOT_REGEX;
> - else
> - return OP_NONE;
> -
> - return OP_CMP;
> -}
> -
> -static int check_op_done(struct tep_filter_arg *arg)
> -{
> - switch (arg->type) {
> - case TEP_FILTER_ARG_EXP:
> - return arg->exp.right != NULL;
> -
> - case TEP_FILTER_ARG_OP:
> - return arg->op.right != NULL;
> -
> - case TEP_FILTER_ARG_NUM:
> - return arg->num.right != NULL;
> -
> - case TEP_FILTER_ARG_STR:
> - /* A string conversion is always done */
> - return 1;
> -
> - case TEP_FILTER_ARG_BOOLEAN:
> - /* field not found, is ok */
> - return 1;
> -
> - default:
> - return 0;
> - }
> -}
> -
> -enum filter_vals {
> - FILTER_VAL_NORM,
> - FILTER_VAL_FALSE,
> - FILTER_VAL_TRUE,
> -};
> -
> -static enum tep_errno
> -reparent_op_arg(struct tep_filter_arg *parent, struct tep_filter_arg *old_child,
> - struct tep_filter_arg *arg, char *error_str)
> -{
> - struct tep_filter_arg *other_child;
> - struct tep_filter_arg **ptr;
> -
> - if (parent->type != TEP_FILTER_ARG_OP &&
> - arg->type != TEP_FILTER_ARG_OP) {
> - show_error(error_str, "can not reparent other than OP");
> - return TEP_ERRNO__REPARENT_NOT_OP;
> - }
> -
> - /* Get the sibling */
> - if (old_child->op.right == arg) {
> - ptr = &old_child->op.right;
> - other_child = old_child->op.left;
> - } else if (old_child->op.left == arg) {
> - ptr = &old_child->op.left;
> - other_child = old_child->op.right;
> - } else {
> - show_error(error_str, "Error in reparent op, find other child");
> - return TEP_ERRNO__REPARENT_FAILED;
> - }
> -
> - /* Detach arg from old_child */
> - *ptr = NULL;
> -
> - /* Check for root */
> - if (parent == old_child) {
> - free_arg(other_child);
> - *parent = *arg;
> - /* Free arg without recussion */
> - free(arg);
> - return 0;
> - }
> -
> - if (parent->op.right == old_child)
> - ptr = &parent->op.right;
> - else if (parent->op.left == old_child)
> - ptr = &parent->op.left;
> - else {
> - show_error(error_str, "Error in reparent op");
> - return TEP_ERRNO__REPARENT_FAILED;
> - }
> -
> - *ptr = arg;
> -
> - free_arg(old_child);
> - return 0;
> -}
> -
> -/* Returns either filter_vals (success) or tep_errno (failfure) */
> -static int test_arg(struct tep_filter_arg *parent, struct tep_filter_arg *arg,
> - char *error_str)
> -{
> - int lval, rval;
> -
> - switch (arg->type) {
> -
> - /* bad case */
> - case TEP_FILTER_ARG_BOOLEAN:
> - return FILTER_VAL_FALSE + arg->boolean.value;
> -
> - /* good cases: */
> - case TEP_FILTER_ARG_STR:
> - case TEP_FILTER_ARG_VALUE:
> - case TEP_FILTER_ARG_FIELD:
> - return FILTER_VAL_NORM;
> -
> - case TEP_FILTER_ARG_EXP:
> - lval = test_arg(arg, arg->exp.left, error_str);
> - if (lval != FILTER_VAL_NORM)
> - return lval;
> - rval = test_arg(arg, arg->exp.right, error_str);
> - if (rval != FILTER_VAL_NORM)
> - return rval;
> - return FILTER_VAL_NORM;
> -
> - case TEP_FILTER_ARG_NUM:
> - lval = test_arg(arg, arg->num.left, error_str);
> - if (lval != FILTER_VAL_NORM)
> - return lval;
> - rval = test_arg(arg, arg->num.right, error_str);
> - if (rval != FILTER_VAL_NORM)
> - return rval;
> - return FILTER_VAL_NORM;
> -
> - case TEP_FILTER_ARG_OP:
> - if (arg->op.type != TEP_FILTER_OP_NOT) {
> - lval = test_arg(arg, arg->op.left, error_str);
> - switch (lval) {
> - case FILTER_VAL_NORM:
> - break;
> - case FILTER_VAL_TRUE:
> - if (arg->op.type == TEP_FILTER_OP_OR)
> - return FILTER_VAL_TRUE;
> - rval = test_arg(arg, arg->op.right, error_str);
> - if (rval != FILTER_VAL_NORM)
> - return rval;
> -
> - return reparent_op_arg(parent, arg, arg->op.right,
> - error_str);
> -
> - case FILTER_VAL_FALSE:
> - if (arg->op.type == TEP_FILTER_OP_AND)
> - return FILTER_VAL_FALSE;
> - rval = test_arg(arg, arg->op.right, error_str);
> - if (rval != FILTER_VAL_NORM)
> - return rval;
> -
> - return reparent_op_arg(parent, arg, arg->op.right,
> - error_str);
> -
> - default:
> - return lval;
> - }
> - }
> -
> - rval = test_arg(arg, arg->op.right, error_str);
> - switch (rval) {
> - case FILTER_VAL_NORM:
> - default:
> - break;
> -
> - case FILTER_VAL_TRUE:
> - if (arg->op.type == TEP_FILTER_OP_OR)
> - return FILTER_VAL_TRUE;
> - if (arg->op.type == TEP_FILTER_OP_NOT)
> - return FILTER_VAL_FALSE;
> -
> - return reparent_op_arg(parent, arg, arg->op.left,
> - error_str);
> -
> - case FILTER_VAL_FALSE:
> - if (arg->op.type == TEP_FILTER_OP_AND)
> - return FILTER_VAL_FALSE;
> - if (arg->op.type == TEP_FILTER_OP_NOT)
> - return FILTER_VAL_TRUE;
> -
> - return reparent_op_arg(parent, arg, arg->op.left,
> - error_str);
> - }
> -
> - return rval;
> - default:
> - show_error(error_str, "bad arg in filter tree");
> - return TEP_ERRNO__BAD_FILTER_ARG;
> - }
> - return FILTER_VAL_NORM;
> -}
> -
> -/* Remove any unknown event fields */
> -static int collapse_tree(struct tep_filter_arg *arg,
> - struct tep_filter_arg **arg_collapsed, char *error_str)
> -{
> - int ret;
> -
> - ret = test_arg(arg, arg, error_str);
> - switch (ret) {
> - case FILTER_VAL_NORM:
> - break;
> -
> - case FILTER_VAL_TRUE:
> - case FILTER_VAL_FALSE:
> - free_arg(arg);
> - arg = allocate_arg();
> - if (arg) {
> - arg->type = TEP_FILTER_ARG_BOOLEAN;
> - arg->boolean.value = ret == FILTER_VAL_TRUE;
> - } else {
> - show_error(error_str, "Failed to allocate filter arg");
> - ret = TEP_ERRNO__MEM_ALLOC_FAILED;
> - }
> - break;
> -
> - default:
> - /* test_arg() already set the error_str */
> - free_arg(arg);
> - arg = NULL;
> - break;
> - }
> -
> - *arg_collapsed = arg;
> - return ret;
> -}
> -
> -static enum tep_errno
> -process_filter(struct tep_event *event, struct tep_filter_arg **parg,
> - char *error_str, int not)
> -{
> - enum tep_event_type type;
> - char *token = NULL;
> - struct tep_filter_arg *current_op = NULL;
> - struct tep_filter_arg *current_exp = NULL;
> - struct tep_filter_arg *left_item = NULL;
> - struct tep_filter_arg *arg = NULL;
> - enum op_type op_type;
> - enum tep_filter_op_type btype;
> - enum tep_filter_exp_type etype;
> - enum tep_filter_cmp_type ctype;
> - enum tep_errno ret;
> -
> - *parg = NULL;
> -
> - do {
> - free(token);
> - type = filter_read_token(&token);
> - switch (type) {
> - case TEP_EVENT_SQUOTE:
> - case TEP_EVENT_DQUOTE:
> - case TEP_EVENT_ITEM:
> - ret = create_arg_item(event, token, type, &arg, error_str);
> - if (ret < 0)
> - goto fail;
> - if (!left_item)
> - left_item = arg;
> - else if (current_exp) {
> - ret = add_right(current_exp, arg, error_str);
> - if (ret < 0)
> - goto fail;
> - left_item = NULL;
> - /* Not's only one one expression */
> - if (not) {
> - arg = NULL;
> - if (current_op)
> - goto fail_syntax;
> - free(token);
> - *parg = current_exp;
> - return 0;
> - }
> - } else
> - goto fail_syntax;
> - arg = NULL;
> - break;
> -
> - case TEP_EVENT_DELIM:
> - if (*token == ',') {
> - show_error(error_str, "Illegal token ','");
> - ret = TEP_ERRNO__ILLEGAL_TOKEN;
> - goto fail;
> - }
> -
> - if (*token == '(') {
> - if (left_item) {
> - show_error(error_str,
> - "Open paren can not come after item");
> - ret = TEP_ERRNO__INVALID_PAREN;
> - goto fail;
> - }
> - if (current_exp) {
> - show_error(error_str,
> - "Open paren can not come after expression");
> - ret = TEP_ERRNO__INVALID_PAREN;
> - goto fail;
> - }
> -
> - ret = process_filter(event, &arg, error_str, 0);
> - if (ret != TEP_ERRNO__UNBALANCED_PAREN) {
> - if (ret == 0) {
> - show_error(error_str,
> - "Unbalanced number of '('");
> - ret = TEP_ERRNO__UNBALANCED_PAREN;
> - }
> - goto fail;
> - }
> - ret = 0;
> -
> - /* A not wants just one expression */
> - if (not) {
> - if (current_op)
> - goto fail_syntax;
> - *parg = arg;
> - return 0;
> - }
> -
> - if (current_op)
> - ret = add_right(current_op, arg, error_str);
> - else
> - current_exp = arg;
> -
> - if (ret < 0)
> - goto fail;
> -
> - } else { /* ')' */
> - if (!current_op && !current_exp)
> - goto fail_syntax;
> -
> - /* Make sure everything is finished at this level */
> - if (current_exp && !check_op_done(current_exp))
> - goto fail_syntax;
> - if (current_op && !check_op_done(current_op))
> - goto fail_syntax;
> -
> - if (current_op)
> - *parg = current_op;
> - else
> - *parg = current_exp;
> - free(token);
> - return TEP_ERRNO__UNBALANCED_PAREN;
> - }
> - break;
> -
> - case TEP_EVENT_OP:
> - op_type = process_op(token, &btype, &ctype, &etype);
> -
> - /* All expect a left arg except for NOT */
> - switch (op_type) {
> - case OP_BOOL:
> - /* Logic ops need a left expression */
> - if (!current_exp && !current_op)
> - goto fail_syntax;
> - /* fall through */
> - case OP_NOT:
> - /* logic only processes ops and exp */
> - if (left_item)
> - goto fail_syntax;
> - break;
> - case OP_EXP:
> - case OP_CMP:
> - if (!left_item)
> - goto fail_syntax;
> - break;
> - case OP_NONE:
> - show_error(error_str,
> - "Unknown op token %s", token);
> - ret = TEP_ERRNO__UNKNOWN_TOKEN;
> - goto fail;
> - }
> -
> - ret = 0;
> - switch (op_type) {
> - case OP_BOOL:
> - arg = create_arg_op(btype);
> - if (arg == NULL)
> - goto fail_alloc;
> - if (current_op)
> - ret = add_left(arg, current_op);
> - else
> - ret = add_left(arg, current_exp);
> - current_op = arg;
> - current_exp = NULL;
> - break;
> -
> - case OP_NOT:
> - arg = create_arg_op(btype);
> - if (arg == NULL)
> - goto fail_alloc;
> - if (current_op)
> - ret = add_right(current_op, arg, error_str);
> - if (ret < 0)
> - goto fail;
> - current_exp = arg;
> - ret = process_filter(event, &arg, error_str, 1);
> - if (ret < 0)
> - goto fail;
> - ret = add_right(current_exp, arg, error_str);
> - if (ret < 0)
> - goto fail;
> - break;
> -
> - case OP_EXP:
> - case OP_CMP:
> - if (op_type == OP_EXP)
> - arg = create_arg_exp(etype);
> - else
> - arg = create_arg_cmp(ctype);
> - if (arg == NULL)
> - goto fail_alloc;
> -
> - if (current_op)
> - ret = add_right(current_op, arg, error_str);
> - if (ret < 0)
> - goto fail;
> - ret = add_left(arg, left_item);
> - if (ret < 0) {
> - arg = NULL;
> - goto fail_syntax;
> - }
> - current_exp = arg;
> - break;
> - default:
> - break;
> - }
> - arg = NULL;
> - if (ret < 0)
> - goto fail_syntax;
> - break;
> - case TEP_EVENT_NONE:
> - break;
> - case TEP_EVENT_ERROR:
> - goto fail_alloc;
> - default:
> - goto fail_syntax;
> - }
> - } while (type != TEP_EVENT_NONE);
> -
> - if (!current_op && !current_exp)
> - goto fail_syntax;
> -
> - if (!current_op)
> - current_op = current_exp;
> -
> - ret = collapse_tree(current_op, parg, error_str);
> - /* collapse_tree() may free current_op, and updates parg accordingly */
> - current_op = NULL;
> - if (ret < 0)
> - goto fail;
> -
> - free(token);
> - return 0;
> -
> - fail_alloc:
> - show_error(error_str, "failed to allocate filter arg");
> - ret = TEP_ERRNO__MEM_ALLOC_FAILED;
> - goto fail;
> - fail_syntax:
> - show_error(error_str, "Syntax error");
> - ret = TEP_ERRNO__SYNTAX_ERROR;
> - fail:
> - free_arg(current_op);
> - free_arg(current_exp);
> - free_arg(arg);
> - free(token);
> - return ret;
> -}
> -
> -static enum tep_errno
> -process_event(struct tep_event *event, const char *filter_str,
> - struct tep_filter_arg **parg, char *error_str)
> -{
> - int ret;
> -
> - init_input_buf(filter_str, strlen(filter_str));
> -
> - ret = process_filter(event, parg, error_str, 0);
> - if (ret < 0)
> - return ret;
> -
> - /* If parg is NULL, then make it into FALSE */
> - if (!*parg) {
> - *parg = allocate_arg();
> - if (*parg == NULL)
> - return TEP_ERRNO__MEM_ALLOC_FAILED;
> -
> - (*parg)->type = TEP_FILTER_ARG_BOOLEAN;
> - (*parg)->boolean.value = TEP_FILTER_FALSE;
> - }
> -
> - return 0;
> -}
> -
> -static enum tep_errno
> -filter_event(struct tep_event_filter *filter, struct tep_event *event,
> - const char *filter_str, char *error_str)
> -{
> - struct tep_filter_type *filter_type;
> - struct tep_filter_arg *arg;
> - enum tep_errno ret;
> -
> - if (filter_str) {
> - ret = process_event(event, filter_str, &arg, error_str);
> - if (ret < 0)
> - return ret;
> -
> - } else {
> - /* just add a TRUE arg */
> - arg = allocate_arg();
> - if (arg == NULL)
> - return TEP_ERRNO__MEM_ALLOC_FAILED;
> -
> - arg->type = TEP_FILTER_ARG_BOOLEAN;
> - arg->boolean.value = TEP_FILTER_TRUE;
> - }
> -
> - filter_type = add_filter_type(filter, event->id);
> - if (filter_type == NULL) {
> - free_arg(arg);
> - return TEP_ERRNO__MEM_ALLOC_FAILED;
> - }
> -
> - if (filter_type->filter)
> - free_arg(filter_type->filter);
> - filter_type->filter = arg;
> -
> - return 0;
> -}
> -
> -static void filter_init_error_buf(struct tep_event_filter *filter)
> -{
> - /* clear buffer to reset show error */
> - init_input_buf("", 0);
> - filter->error_buffer[0] = '\0';
> -}
> -
> -/**
> - * tep_filter_add_filter_str - add a new filter
> - * @filter: the event filter to add to
> - * @filter_str: the filter string that contains the filter
> - *
> - * Returns 0 if the filter was successfully added or a
> - * negative error code. Use tep_filter_strerror() to see
> - * actual error message in case of error.
> - */
> -enum tep_errno tep_filter_add_filter_str(struct tep_event_filter *filter,
> - const char *filter_str)
> -{
> - struct tep_handle *tep = filter->tep;
> - struct event_list *event;
> - struct event_list *events = NULL;
> - const char *filter_start;
> - const char *next_event;
> - char *this_event;
> - char *event_name = NULL;
> - char *sys_name = NULL;
> - char *sp;
> - enum tep_errno rtn = 0; /* TEP_ERRNO__SUCCESS */
> - int len;
> - int ret;
> -
> - filter_init_error_buf(filter);
> -
> - filter_start = strchr(filter_str, ':');
> - if (filter_start)
> - len = filter_start - filter_str;
> - else
> - len = strlen(filter_str);
> -
> - do {
> - next_event = strchr(filter_str, ',');
> - if (next_event &&
> - (!filter_start || next_event < filter_start))
> - len = next_event - filter_str;
> - else if (filter_start)
> - len = filter_start - filter_str;
> - else
> - len = strlen(filter_str);
> -
> - this_event = malloc(len + 1);
> - if (this_event == NULL) {
> - /* This can only happen when events is NULL, but still */
> - free_events(events);
> - return TEP_ERRNO__MEM_ALLOC_FAILED;
> - }
> - memcpy(this_event, filter_str, len);
> - this_event[len] = 0;
> -
> - if (next_event)
> - next_event++;
> -
> - filter_str = next_event;
> -
> - sys_name = strtok_r(this_event, "/", &sp);
> - event_name = strtok_r(NULL, "/", &sp);
> -
> - if (!sys_name) {
> - /* This can only happen when events is NULL, but still */
> - free_events(events);
> - free(this_event);
> - return TEP_ERRNO__FILTER_NOT_FOUND;
> - }
> -
> - /* Find this event */
> - ret = find_event(tep, &events, strim(sys_name), strim(event_name));
> - if (ret < 0) {
> - free_events(events);
> - free(this_event);
> - return ret;
> - }
> - free(this_event);
> - } while (filter_str);
> -
> - /* Skip the ':' */
> - if (filter_start)
> - filter_start++;
> -
> - /* filter starts here */
> - for (event = events; event; event = event->next) {
> - ret = filter_event(filter, event->event, filter_start,
> - filter->error_buffer);
> - /* Failures are returned if a parse error happened */
> - if (ret < 0)
> - rtn = ret;
> -
> - if (ret >= 0 && tep->test_filters) {
> - char *test;
> - test = tep_filter_make_string(filter, event->event->id);
> - if (test) {
> - printf(" '%s: %s'\n", event->event->name, test);
> - free(test);
> - }
> - }
> - }
> -
> - free_events(events);
> -
> - return rtn;
> -}
> -
> -static void free_filter_type(struct tep_filter_type *filter_type)
> -{
> - free_arg(filter_type->filter);
> -}
> -
> -/**
> - * tep_filter_strerror - fill error message in a buffer
> - * @filter: the event filter contains error
> - * @err: the error code
> - * @buf: the buffer to be filled in
> - * @buflen: the size of the buffer
> - *
> - * Returns 0 if message was filled successfully, -1 if error
> - */
> -int tep_filter_strerror(struct tep_event_filter *filter, enum tep_errno err,
> - char *buf, size_t buflen)
> -{
> - if (err <= __TEP_ERRNO__START || err >= __TEP_ERRNO__END)
> - return -1;
> -
> - if (strlen(filter->error_buffer) > 0) {
> - size_t len = snprintf(buf, buflen, "%s", filter->error_buffer);
> -
> - if (len > buflen)
> - return -1;
> - return 0;
> - }
> -
> - return tep_strerror(filter->tep, err, buf, buflen);
> -}
> -
> -/**
> - * tep_filter_remove_event - remove a filter for an event
> - * @filter: the event filter to remove from
> - * @event_id: the event to remove a filter for
> - *
> - * Removes the filter saved for an event defined by @event_id
> - * from the @filter.
> - *
> - * Returns 1: if an event was removed
> - * 0: if the event was not found
> - */
> -int tep_filter_remove_event(struct tep_event_filter *filter,
> - int event_id)
> -{
> - struct tep_filter_type *filter_type;
> - unsigned long len;
> -
> - if (!filter->filters)
> - return 0;
> -
> - filter_type = find_filter_type(filter, event_id);
> -
> - if (!filter_type)
> - return 0;
> -
> - free_filter_type(filter_type);
> -
> - /* The filter_type points into the event_filters array */
> - len = (unsigned long)(filter->event_filters + filter->filters) -
> - (unsigned long)(filter_type + 1);
> -
> - memmove(filter_type, filter_type + 1, len);
> - filter->filters--;
> -
> - memset(&filter->event_filters[filter->filters], 0,
> - sizeof(*filter_type));
> -
> - return 1;
> -}
> -
> -/**
> - * tep_filter_reset - clear all filters in a filter
> - * @filter: the event filter to reset
> - *
> - * Removes all filters from a filter and resets it.
> - */
> -void tep_filter_reset(struct tep_event_filter *filter)
> -{
> - int i;
> -
> - for (i = 0; i < filter->filters; i++)
> - free_filter_type(&filter->event_filters[i]);
> -
> - free(filter->event_filters);
> - filter->filters = 0;
> - filter->event_filters = NULL;
> -}
> -
> -void tep_filter_free(struct tep_event_filter *filter)
> -{
> - tep_unref(filter->tep);
> -
> - tep_filter_reset(filter);
> -
> - free(filter);
> -}
> -
> -static char *arg_to_str(struct tep_event_filter *filter, struct tep_filter_arg *arg);
> -
> -static int copy_filter_type(struct tep_event_filter *filter,
> - struct tep_event_filter *source,
> - struct tep_filter_type *filter_type)
> -{
> - struct tep_filter_arg *arg;
> - struct tep_event *event;
> - const char *sys;
> - const char *name;
> - char *str;
> -
> - /* Can't assume that the tep's are the same */
> - sys = filter_type->event->system;
> - name = filter_type->event->name;
> - event = tep_find_event_by_name(filter->tep, sys, name);
> - if (!event)
> - return -1;
> -
> - str = arg_to_str(source, filter_type->filter);
> - if (!str)
> - return -1;
> -
> - if (strcmp(str, "TRUE") == 0 || strcmp(str, "FALSE") == 0) {
> - /* Add trivial event */
> - arg = allocate_arg();
> - if (arg == NULL) {
> - free(str);
> - return -1;
> - }
> -
> - arg->type = TEP_FILTER_ARG_BOOLEAN;
> - if (strcmp(str, "TRUE") == 0)
> - arg->boolean.value = 1;
> - else
> - arg->boolean.value = 0;
> -
> - filter_type = add_filter_type(filter, event->id);
> - if (filter_type == NULL) {
> - free(str);
> - free_arg(arg);
> - return -1;
> - }
> -
> - filter_type->filter = arg;
> -
> - free(str);
> - return 0;
> - }
> -
> - filter_event(filter, event, str, NULL);
> - free(str);
> -
> - return 0;
> -}
> -
> -/**
> - * tep_filter_copy - copy a filter using another filter
> - * @dest - the filter to copy to
> - * @source - the filter to copy from
> - *
> - * Returns 0 on success and -1 if not all filters were copied
> - */
> -int tep_filter_copy(struct tep_event_filter *dest, struct tep_event_filter *source)
> -{
> - int ret = 0;
> - int i;
> -
> - tep_filter_reset(dest);
> -
> - for (i = 0; i < source->filters; i++) {
> - if (copy_filter_type(dest, source, &source->event_filters[i]))
> - ret = -1;
> - }
> - return ret;
> -}
> -
> -static int test_filter(struct tep_event *event, struct tep_filter_arg *arg,
> - struct tep_record *record, enum tep_errno *err);
> -
> -static const char *
> -get_comm(struct tep_event *event, struct tep_record *record)
> -{
> - const char *comm;
> - int pid;
> -
> - pid = tep_data_pid(event->tep, record);
> - comm = tep_data_comm_from_pid(event->tep, pid);
> - return comm;
> -}
> -
> -static unsigned long long
> -get_value(struct tep_event *event,
> - struct tep_format_field *field, struct tep_record *record)
> -{
> - unsigned long long val;
> -
> - /* Handle our dummy "comm" field */
> - if (field == &comm) {
> - const char *name;
> -
> - name = get_comm(event, record);
> - return (unsigned long)name;
> - }
> -
> - /* Handle our dummy "cpu" field */
> - if (field == &cpu)
> - return record->cpu;
> -
> - tep_read_number_field(field, record->data, &val);
> -
> - if (!(field->flags & TEP_FIELD_IS_SIGNED))
> - return val;
> -
> - switch (field->size) {
> - case 1:
> - return (char)val;
> - case 2:
> - return (short)val;
> - case 4:
> - return (int)val;
> - case 8:
> - return (long long)val;
> - }
> - return val;
> -}
> -
> -static unsigned long long
> -get_arg_value(struct tep_event *event, struct tep_filter_arg *arg,
> - struct tep_record *record, enum tep_errno *err);
> -
> -static unsigned long long
> -get_exp_value(struct tep_event *event, struct tep_filter_arg *arg,
> - struct tep_record *record, enum tep_errno *err)
> -{
> - unsigned long long lval, rval;
> -
> - lval = get_arg_value(event, arg->exp.left, record, err);
> - rval = get_arg_value(event, arg->exp.right, record, err);
> -
> - if (*err) {
> - /*
> - * There was an error, no need to process anymore.
> - */
> - return 0;
> - }
> -
> - switch (arg->exp.type) {
> - case TEP_FILTER_EXP_ADD:
> - return lval + rval;
> -
> - case TEP_FILTER_EXP_SUB:
> - return lval - rval;
> -
> - case TEP_FILTER_EXP_MUL:
> - return lval * rval;
> -
> - case TEP_FILTER_EXP_DIV:
> - return lval / rval;
> -
> - case TEP_FILTER_EXP_MOD:
> - return lval % rval;
> -
> - case TEP_FILTER_EXP_RSHIFT:
> - return lval >> rval;
> -
> - case TEP_FILTER_EXP_LSHIFT:
> - return lval << rval;
> -
> - case TEP_FILTER_EXP_AND:
> - return lval & rval;
> -
> - case TEP_FILTER_EXP_OR:
> - return lval | rval;
> -
> - case TEP_FILTER_EXP_XOR:
> - return lval ^ rval;
> -
> - case TEP_FILTER_EXP_NOT:
> - default:
> - if (!*err)
> - *err = TEP_ERRNO__INVALID_EXP_TYPE;
> - }
> - return 0;
> -}
> -
> -static unsigned long long
> -get_arg_value(struct tep_event *event, struct tep_filter_arg *arg,
> - struct tep_record *record, enum tep_errno *err)
> -{
> - switch (arg->type) {
> - case TEP_FILTER_ARG_FIELD:
> - return get_value(event, arg->field.field, record);
> -
> - case TEP_FILTER_ARG_VALUE:
> - if (arg->value.type != TEP_FILTER_NUMBER) {
> - if (!*err)
> - *err = TEP_ERRNO__NOT_A_NUMBER;
> - }
> - return arg->value.val;
> -
> - case TEP_FILTER_ARG_EXP:
> - return get_exp_value(event, arg, record, err);
> -
> - default:
> - if (!*err)
> - *err = TEP_ERRNO__INVALID_ARG_TYPE;
> - }
> - return 0;
> -}
> -
> -static int test_num(struct tep_event *event, struct tep_filter_arg *arg,
> - struct tep_record *record, enum tep_errno *err)
> -{
> - unsigned long long lval, rval;
> -
> - lval = get_arg_value(event, arg->num.left, record, err);
> - rval = get_arg_value(event, arg->num.right, record, err);
> -
> - if (*err) {
> - /*
> - * There was an error, no need to process anymore.
> - */
> - return 0;
> - }
> -
> - switch (arg->num.type) {
> - case TEP_FILTER_CMP_EQ:
> - return lval == rval;
> -
> - case TEP_FILTER_CMP_NE:
> - return lval != rval;
> -
> - case TEP_FILTER_CMP_GT:
> - return lval > rval;
> -
> - case TEP_FILTER_CMP_LT:
> - return lval < rval;
> -
> - case TEP_FILTER_CMP_GE:
> - return lval >= rval;
> -
> - case TEP_FILTER_CMP_LE:
> - return lval <= rval;
> -
> - default:
> - if (!*err)
> - *err = TEP_ERRNO__ILLEGAL_INTEGER_CMP;
> - return 0;
> - }
> -}
> -
> -static const char *get_field_str(struct tep_filter_arg *arg, struct tep_record *record)
> -{
> - struct tep_event *event;
> - struct tep_handle *tep;
> - unsigned long long addr;
> - const char *val = NULL;
> - unsigned int size;
> - char hex[64];
> -
> - /* If the field is not a string convert it */
> - if (arg->str.field->flags & TEP_FIELD_IS_STRING) {
> - val = record->data + arg->str.field->offset;
> - size = arg->str.field->size;
> -
> - if (arg->str.field->flags & TEP_FIELD_IS_DYNAMIC) {
> - addr = *(unsigned int *)val;
> - size = addr >> 16;
> - addr &= 0xffff;
> - if (arg->str.field->flags & TEP_FIELD_IS_RELATIVE)
> - addr += arg->str.field->offset + arg->str.field->size;
> - val = record->data + addr;
> - }
> -
> - /*
> - * We need to copy the data since we can't be sure the field
> - * is null terminated.
> - */
> - if (*(val + size - 1)) {
> - /* copy it */
> - memcpy(arg->str.buffer, val, arg->str.field->size);
> - /* the buffer is already NULL terminated */
> - val = arg->str.buffer;
> - }
> -
> - } else {
> - event = arg->str.field->event;
> - tep = event->tep;
> - addr = get_value(event, arg->str.field, record);
> -
> - if (arg->str.field->flags & (TEP_FIELD_IS_POINTER | TEP_FIELD_IS_LONG))
> - /* convert to a kernel symbol */
> - val = tep_find_function(tep, addr);
> -
> - if (val == NULL) {
> - /* just use the hex of the string name */
> - snprintf(hex, 64, "0x%llx", addr);
> - val = hex;
> - }
> - }
> -
> - return val;
> -}
> -
> -static int test_str(struct tep_event *event, struct tep_filter_arg *arg,
> - struct tep_record *record, enum tep_errno *err)
> -{
> - const char *val;
> -
> - if (arg->str.field == &comm)
> - val = get_comm(event, record);
> - else
> - val = get_field_str(arg, record);
> -
> - switch (arg->str.type) {
> - case TEP_FILTER_CMP_MATCH:
> - return strcmp(val, arg->str.val) == 0;
> -
> - case TEP_FILTER_CMP_NOT_MATCH:
> - return strcmp(val, arg->str.val) != 0;
> -
> - case TEP_FILTER_CMP_REGEX:
> - /* Returns zero on match */
> - return !regexec(&arg->str.reg, val, 0, NULL, 0);
> -
> - case TEP_FILTER_CMP_NOT_REGEX:
> - return regexec(&arg->str.reg, val, 0, NULL, 0);
> -
> - default:
> - if (!*err)
> - *err = TEP_ERRNO__ILLEGAL_STRING_CMP;
> - return 0;
> - }
> -}
> -
> -static int test_op(struct tep_event *event, struct tep_filter_arg *arg,
> - struct tep_record *record, enum tep_errno *err)
> -{
> - switch (arg->op.type) {
> - case TEP_FILTER_OP_AND:
> - return test_filter(event, arg->op.left, record, err) &&
> - test_filter(event, arg->op.right, record, err);
> -
> - case TEP_FILTER_OP_OR:
> - return test_filter(event, arg->op.left, record, err) ||
> - test_filter(event, arg->op.right, record, err);
> -
> - case TEP_FILTER_OP_NOT:
> - return !test_filter(event, arg->op.right, record, err);
> -
> - default:
> - if (!*err)
> - *err = TEP_ERRNO__INVALID_OP_TYPE;
> - return 0;
> - }
> -}
> -
> -static int test_filter(struct tep_event *event, struct tep_filter_arg *arg,
> - struct tep_record *record, enum tep_errno *err)
> -{
> - if (*err) {
> - /*
> - * There was an error, no need to process anymore.
> - */
> - return 0;
> - }
> -
> - switch (arg->type) {
> - case TEP_FILTER_ARG_BOOLEAN:
> - /* easy case */
> - return arg->boolean.value;
> -
> - case TEP_FILTER_ARG_OP:
> - return test_op(event, arg, record, err);
> -
> - case TEP_FILTER_ARG_NUM:
> - return test_num(event, arg, record, err);
> -
> - case TEP_FILTER_ARG_STR:
> - return test_str(event, arg, record, err);
> -
> - case TEP_FILTER_ARG_EXP:
> - case TEP_FILTER_ARG_VALUE:
> - case TEP_FILTER_ARG_FIELD:
> - /*
> - * Expressions, fields and values evaluate
> - * to true if they return non zero
> - */
> - return !!get_arg_value(event, arg, record, err);
> -
> - default:
> - if (!*err)
> - *err = TEP_ERRNO__INVALID_ARG_TYPE;
> - return 0;
> - }
> -}
> -
> -/**
> - * tep_event_filtered - return true if event has filter
> - * @filter: filter struct with filter information
> - * @event_id: event id to test if filter exists
> - *
> - * Returns 1 if filter found for @event_id
> - * otherwise 0;
> - */
> -int tep_event_filtered(struct tep_event_filter *filter, int event_id)
> -{
> - struct tep_filter_type *filter_type;
> -
> - if (!filter->filters)
> - return 0;
> -
> - filter_type = find_filter_type(filter, event_id);
> -
> - return filter_type ? 1 : 0;
> -}
> -
> -/**
> - * tep_filter_match - test if a record matches a filter
> - * @filter: filter struct with filter information
> - * @record: the record to test against the filter
> - *
> - * Returns: match result or error code (prefixed with TEP_ERRNO__)
> - * FILTER_MATCH - filter found for event and @record matches
> - * FILTER_MISS - filter found for event and @record does not match
> - * FILTER_NOT_FOUND - no filter found for @record's event
> - * NO_FILTER - if no filters exist
> - * otherwise - error occurred during test
> - */
> -enum tep_errno tep_filter_match(struct tep_event_filter *filter,
> - struct tep_record *record)
> -{
> - struct tep_handle *tep = filter->tep;
> - struct tep_filter_type *filter_type;
> - int event_id;
> - int ret;
> - enum tep_errno err = 0;
> -
> - filter_init_error_buf(filter);
> -
> - if (!filter->filters)
> - return TEP_ERRNO__NO_FILTER;
> -
> - event_id = tep_data_type(tep, record);
> -
> - filter_type = find_filter_type(filter, event_id);
> - if (!filter_type)
> - return TEP_ERRNO__FILTER_NOT_FOUND;
> -
> - ret = test_filter(filter_type->event, filter_type->filter, record, &err);
> - if (err)
> - return err;
> -
> - return ret ? TEP_ERRNO__FILTER_MATCH : TEP_ERRNO__FILTER_MISS;
> -}
> -
> -static char *op_to_str(struct tep_event_filter *filter, struct tep_filter_arg *arg)
> -{
> - char *str = NULL;
> - char *left = NULL;
> - char *right = NULL;
> - char *op = NULL;
> - int left_val = -1;
> - int right_val = -1;
> - int val;
> -
> - switch (arg->op.type) {
> - case TEP_FILTER_OP_AND:
> - op = "&&";
> - /* fall through */
> - case TEP_FILTER_OP_OR:
> - if (!op)
> - op = "||";
> -
> - left = arg_to_str(filter, arg->op.left);
> - right = arg_to_str(filter, arg->op.right);
> - if (!left || !right)
> - break;
> -
> - /* Try to consolidate boolean values */
> - if (strcmp(left, "TRUE") == 0)
> - left_val = 1;
> - else if (strcmp(left, "FALSE") == 0)
> - left_val = 0;
> -
> - if (strcmp(right, "TRUE") == 0)
> - right_val = 1;
> - else if (strcmp(right, "FALSE") == 0)
> - right_val = 0;
> -
> - if (left_val >= 0) {
> - if ((arg->op.type == TEP_FILTER_OP_AND && !left_val) ||
> - (arg->op.type == TEP_FILTER_OP_OR && left_val)) {
> - /* Just return left value */
> - str = left;
> - left = NULL;
> - break;
> - }
> - if (right_val >= 0) {
> - /* just evaluate this. */
> - val = 0;
> - switch (arg->op.type) {
> - case TEP_FILTER_OP_AND:
> - val = left_val && right_val;
> - break;
> - case TEP_FILTER_OP_OR:
> - val = left_val || right_val;
> - break;
> - default:
> - break;
> - }
> - if (asprintf(&str, val ? "TRUE" : "FALSE") < 0)
> - str = NULL;
> - break;
> - }
> - }
> - if (right_val >= 0) {
> - if ((arg->op.type == TEP_FILTER_OP_AND && !right_val) ||
> - (arg->op.type == TEP_FILTER_OP_OR && right_val)) {
> - /* Just return right value */
> - str = right;
> - right = NULL;
> - break;
> - }
> - /* The right value is meaningless */
> - str = left;
> - left = NULL;
> - break;
> - }
> -
> - if (asprintf(&str, "(%s) %s (%s)", left, op, right) < 0)
> - str = NULL;
> - break;
> -
> - case TEP_FILTER_OP_NOT:
> - op = "!";
> - right = arg_to_str(filter, arg->op.right);
> - if (!right)
> - break;
> -
> - /* See if we can consolidate */
> - if (strcmp(right, "TRUE") == 0)
> - right_val = 1;
> - else if (strcmp(right, "FALSE") == 0)
> - right_val = 0;
> - if (right_val >= 0) {
> - /* just return the opposite */
> - if (asprintf(&str, right_val ? "FALSE" : "TRUE") < 0)
> - str = NULL;
> - break;
> - }
> - if (asprintf(&str, "%s(%s)", op, right) < 0)
> - str = NULL;
> - break;
> -
> - default:
> - /* ?? */
> - break;
> - }
> - free(left);
> - free(right);
> - return str;
> -}
> -
> -static char *val_to_str(struct tep_event_filter *filter, struct tep_filter_arg *arg)
> -{
> - char *str = NULL;
> -
> - if (asprintf(&str, "%lld", arg->value.val) < 0)
> - str = NULL;
> -
> - return str;
> -}
> -
> -static char *field_to_str(struct tep_event_filter *filter, struct tep_filter_arg *arg)
> -{
> - return strdup(arg->field.field->name);
> -}
> -
> -static char *exp_to_str(struct tep_event_filter *filter, struct tep_filter_arg *arg)
> -{
> - char *lstr;
> - char *rstr;
> - char *op;
> - char *str = NULL;
> -
> - lstr = arg_to_str(filter, arg->exp.left);
> - rstr = arg_to_str(filter, arg->exp.right);
> - if (!lstr || !rstr)
> - goto out;
> -
> - switch (arg->exp.type) {
> - case TEP_FILTER_EXP_ADD:
> - op = "+";
> - break;
> - case TEP_FILTER_EXP_SUB:
> - op = "-";
> - break;
> - case TEP_FILTER_EXP_MUL:
> - op = "*";
> - break;
> - case TEP_FILTER_EXP_DIV:
> - op = "/";
> - break;
> - case TEP_FILTER_EXP_MOD:
> - op = "%";
> - break;
> - case TEP_FILTER_EXP_RSHIFT:
> - op = ">>";
> - break;
> - case TEP_FILTER_EXP_LSHIFT:
> - op = "<<";
> - break;
> - case TEP_FILTER_EXP_AND:
> - op = "&";
> - break;
> - case TEP_FILTER_EXP_OR:
> - op = "|";
> - break;
> - case TEP_FILTER_EXP_XOR:
> - op = "^";
> - break;
> - default:
> - op = "[ERROR IN EXPRESSION TYPE]";
> - break;
> - }
> -
> - if (asprintf(&str, "%s %s %s", lstr, op, rstr) < 0)
> - str = NULL;
> -out:
> - free(lstr);
> - free(rstr);
> -
> - return str;
> -}
> -
> -static char *num_to_str(struct tep_event_filter *filter, struct tep_filter_arg *arg)
> -{
> - char *lstr;
> - char *rstr;
> - char *str = NULL;
> - char *op = NULL;
> -
> - lstr = arg_to_str(filter, arg->num.left);
> - rstr = arg_to_str(filter, arg->num.right);
> - if (!lstr || !rstr)
> - goto out;
> -
> - switch (arg->num.type) {
> - case TEP_FILTER_CMP_EQ:
> - op = "==";
> - /* fall through */
> - case TEP_FILTER_CMP_NE:
> - if (!op)
> - op = "!=";
> - /* fall through */
> - case TEP_FILTER_CMP_GT:
> - if (!op)
> - op = ">";
> - /* fall through */
> - case TEP_FILTER_CMP_LT:
> - if (!op)
> - op = "<";
> - /* fall through */
> - case TEP_FILTER_CMP_GE:
> - if (!op)
> - op = ">=";
> - /* fall through */
> - case TEP_FILTER_CMP_LE:
> - if (!op)
> - op = "<=";
> -
> - if (asprintf(&str, "%s %s %s", lstr, op, rstr) < 0)
> - str = NULL;
> - break;
> -
> - default:
> - /* ?? */
> - break;
> - }
> -
> -out:
> - free(lstr);
> - free(rstr);
> - return str;
> -}
> -
> -static char *str_to_str(struct tep_event_filter *filter, struct tep_filter_arg *arg)
> -{
> - char *str = NULL;
> - char *op = NULL;
> -
> - switch (arg->str.type) {
> - case TEP_FILTER_CMP_MATCH:
> - op = "==";
> - /* fall through */
> - case TEP_FILTER_CMP_NOT_MATCH:
> - if (!op)
> - op = "!=";
> - /* fall through */
> - case TEP_FILTER_CMP_REGEX:
> - if (!op)
> - op = "=~";
> - /* fall through */
> - case TEP_FILTER_CMP_NOT_REGEX:
> - if (!op)
> - op = "!~";
> -
> - if (asprintf(&str, "%s %s \"%s\"",
> - arg->str.field->name, op, arg->str.val) < 0)
> - str = NULL;
> - break;
> -
> - default:
> - /* ?? */
> - break;
> - }
> - return str;
> -}
> -
> -static char *arg_to_str(struct tep_event_filter *filter, struct tep_filter_arg *arg)
> -{
> - char *str = NULL;
> -
> - switch (arg->type) {
> - case TEP_FILTER_ARG_BOOLEAN:
> - if (asprintf(&str, arg->boolean.value ? "TRUE" : "FALSE") < 0)
> - str = NULL;
> - return str;
> -
> - case TEP_FILTER_ARG_OP:
> - return op_to_str(filter, arg);
> -
> - case TEP_FILTER_ARG_NUM:
> - return num_to_str(filter, arg);
> -
> - case TEP_FILTER_ARG_STR:
> - return str_to_str(filter, arg);
> -
> - case TEP_FILTER_ARG_VALUE:
> - return val_to_str(filter, arg);
> -
> - case TEP_FILTER_ARG_FIELD:
> - return field_to_str(filter, arg);
> -
> - case TEP_FILTER_ARG_EXP:
> - return exp_to_str(filter, arg);
> -
> - default:
> - /* ?? */
> - return NULL;
> - }
> -
> -}
> -
> -/**
> - * tep_filter_make_string - return a string showing the filter
> - * @filter: filter struct with filter information
> - * @event_id: the event id to return the filter string with
> - *
> - * Returns a string that displays the filter contents.
> - * This string must be freed with free(str).
> - * NULL is returned if no filter is found or allocation failed.
> - */
> -char *
> -tep_filter_make_string(struct tep_event_filter *filter, int event_id)
> -{
> - struct tep_filter_type *filter_type;
> -
> - if (!filter->filters)
> - return NULL;
> -
> - filter_type = find_filter_type(filter, event_id);
> -
> - if (!filter_type)
> - return NULL;
> -
> - return arg_to_str(filter, filter_type->filter);
> -}
> -
> -/**
> - * tep_filter_compare - compare two filters and return if they are the same
> - * @filter1: Filter to compare with @filter2
> - * @filter2: Filter to compare with @filter1
> - *
> - * Returns:
> - * 1 if the two filters hold the same content.
> - * 0 if they do not.
> - */
> -int tep_filter_compare(struct tep_event_filter *filter1, struct tep_event_filter *filter2)
> -{
> - struct tep_filter_type *filter_type1;
> - struct tep_filter_type *filter_type2;
> - char *str1, *str2;
> - int result;
> - int i;
> -
> - /* Do the easy checks first */
> - if (filter1->filters != filter2->filters)
> - return 0;
> - if (!filter1->filters && !filter2->filters)
> - return 1;
> -
> - /*
> - * Now take a look at each of the events to see if they have the same
> - * filters to them.
> - */
> - for (i = 0; i < filter1->filters; i++) {
> - filter_type1 = &filter1->event_filters[i];
> - filter_type2 = find_filter_type(filter2, filter_type1->event_id);
> - if (!filter_type2)
> - break;
> - if (filter_type1->filter->type != filter_type2->filter->type)
> - break;
> - /* The best way to compare complex filters is with strings */
> - str1 = arg_to_str(filter1, filter_type1->filter);
> - str2 = arg_to_str(filter2, filter_type2->filter);
> - if (str1 && str2)
> - result = strcmp(str1, str2) != 0;
> - else
> - /* bail out if allocation fails */
> - result = 1;
> -
> - free(str1);
> - free(str2);
> - if (result)
> - break;
> - }
> -
> - if (i < filter1->filters)
> - return 0;
> - return 1;
> -}
> -
> diff --git a/tools/lib/traceevent/parse-utils.c b/tools/lib/traceevent/parse-utils.c
> deleted file mode 100644
> index e99867111387..000000000000
> --- a/tools/lib/traceevent/parse-utils.c
> +++ /dev/null
> @@ -1,71 +0,0 @@
> -// SPDX-License-Identifier: LGPL-2.1
> -/*
> - * Copyright (C) 2010 Red Hat Inc, Steven Rostedt <[email protected]>
> - *
> - */
> -#include <stdio.h>
> -#include <stdlib.h>
> -#include <string.h>
> -#include <stdarg.h>
> -#include <errno.h>
> -
> -#define __weak __attribute__((weak))
> -
> -void __vwarning(const char *fmt, va_list ap)
> -{
> - if (errno)
> - perror("libtraceevent");
> - errno = 0;
> -
> - fprintf(stderr, " ");
> - vfprintf(stderr, fmt, ap);
> -
> - fprintf(stderr, "\n");
> -}
> -
> -void __warning(const char *fmt, ...)
> -{
> - va_list ap;
> -
> - va_start(ap, fmt);
> - __vwarning(fmt, ap);
> - va_end(ap);
> -}
> -
> -void __weak warning(const char *fmt, ...)
> -{
> - va_list ap;
> -
> - va_start(ap, fmt);
> - __vwarning(fmt, ap);
> - va_end(ap);
> -}
> -
> -void __vpr_stat(const char *fmt, va_list ap)
> -{
> - vprintf(fmt, ap);
> - printf("\n");
> -}
> -
> -void __pr_stat(const char *fmt, ...)
> -{
> - va_list ap;
> -
> - va_start(ap, fmt);
> - __vpr_stat(fmt, ap);
> - va_end(ap);
> -}
> -
> -void __weak vpr_stat(const char *fmt, va_list ap)
> -{
> - __vpr_stat(fmt, ap);
> -}
> -
> -void __weak pr_stat(const char *fmt, ...)
> -{
> - va_list ap;
> -
> - va_start(ap, fmt);
> - __vpr_stat(fmt, ap);
> - va_end(ap);
> -}
> diff --git a/tools/lib/traceevent/plugins/Build b/tools/lib/traceevent/plugins/Build
> deleted file mode 100644
> index dd4da823c38f..000000000000
> --- a/tools/lib/traceevent/plugins/Build
> +++ /dev/null
> @@ -1,12 +0,0 @@
> -plugin_jbd2-y += plugin_jbd2.o
> -plugin_hrtimer-y += plugin_hrtimer.o
> -plugin_kmem-y += plugin_kmem.o
> -plugin_kvm-y += plugin_kvm.o
> -plugin_mac80211-y += plugin_mac80211.o
> -plugin_sched_switch-y += plugin_sched_switch.o
> -plugin_function-y += plugin_function.o
> -plugin_futex-y += plugin_futex.o
> -plugin_xen-y += plugin_xen.o
> -plugin_scsi-y += plugin_scsi.o
> -plugin_cfg80211-y += plugin_cfg80211.o
> -plugin_tlb-y += plugin_tlb.o
> \ No newline at end of file
> diff --git a/tools/lib/traceevent/plugins/Makefile b/tools/lib/traceevent/plugins/Makefile
> deleted file mode 100644
> index 47e802553250..000000000000
> --- a/tools/lib/traceevent/plugins/Makefile
> +++ /dev/null
> @@ -1,225 +0,0 @@
> -# SPDX-License-Identifier: GPL-2.0
> -
> -#MAKEFLAGS += --no-print-directory
> -
> -
> -# Makefiles suck: This macro sets a default value of $(2) for the
> -# variable named by $(1), unless the variable has been set by
> -# environment or command line. This is necessary for CC and AR
> -# because make sets default values, so the simpler ?= approach
> -# won't work as expected.
> -define allow-override
> - $(if $(or $(findstring environment,$(origin $(1))),\
> - $(findstring command line,$(origin $(1)))),,\
> - $(eval $(1) = $(2)))
> -endef
> -
> -# Allow setting CC and AR, or setting CROSS_COMPILE as a prefix.
> -$(call allow-override,CC,$(CROSS_COMPILE)gcc)
> -$(call allow-override,AR,$(CROSS_COMPILE)ar)
> -$(call allow-override,NM,$(CROSS_COMPILE)nm)
> -$(call allow-override,PKG_CONFIG,pkg-config)
> -
> -EXT = -std=gnu99
> -INSTALL = install
> -
> -# Use DESTDIR for installing into a different root directory.
> -# This is useful for building a package. The program will be
> -# installed in this directory as if it was the root directory.
> -# Then the build tool can move it later.
> -DESTDIR ?=
> -DESTDIR_SQ = '$(subst ','\'',$(DESTDIR))'
> -
> -LP64 := $(shell echo __LP64__ | ${CC} ${CFLAGS} -E -x c - | tail -n 1)
> -ifeq ($(LP64), 1)
> - libdir_relative_tmp = lib64
> -else
> - libdir_relative_tmp = lib
> -endif
> -
> -libdir_relative ?= $(libdir_relative_tmp)
> -prefix ?= /usr/local
> -libdir = $(prefix)/$(libdir_relative)
> -
> -set_plugin_dir := 1
> -
> -# Set plugin_dir to preffered global plugin location
> -# If we install under $HOME directory we go under
> -# $(HOME)/.local/lib/traceevent/plugins
> -#
> -# We dont set PLUGIN_DIR in case we install under $HOME
> -# directory, because by default the code looks under:
> -# $(HOME)/.local/lib/traceevent/plugins by default.
> -#
> -ifeq ($(plugin_dir),)
> -ifeq ($(prefix),$(HOME))
> -override plugin_dir = $(HOME)/.local/lib/traceevent/plugins
> -set_plugin_dir := 0
> -else
> -override plugin_dir = $(libdir)/traceevent/plugins
> -endif
> -endif
> -
> -ifeq ($(set_plugin_dir),1)
> -PLUGIN_DIR = -DPLUGIN_DIR="$(plugin_dir)"
> -PLUGIN_DIR_SQ = '$(subst ','\'',$(PLUGIN_DIR))'
> -endif
> -
> -include ../../../scripts/Makefile.include
> -
> -# copy a bit from Linux kbuild
> -
> -ifeq ("$(origin V)", "command line")
> - VERBOSE = $(V)
> -endif
> -ifndef VERBOSE
> - VERBOSE = 0
> -endif
> -
> -ifeq ($(srctree),)
> -srctree := $(patsubst %/,%,$(dir $(CURDIR)))
> -srctree := $(patsubst %/,%,$(dir $(srctree)))
> -srctree := $(patsubst %/,%,$(dir $(srctree)))
> -srctree := $(patsubst %/,%,$(dir $(srctree)))
> -#$(info Determined 'srctree' to be $(srctree))
> -endif
> -
> -export prefix libdir src obj
> -
> -# Shell quotes
> -plugin_dir_SQ = $(subst ','\'',$(plugin_dir))
> -
> -CONFIG_INCLUDES =
> -CONFIG_LIBS =
> -CONFIG_FLAGS =
> -
> -OBJ = $@
> -N =
> -
> -INCLUDES = -I. -I.. -I $(srctree)/tools/include $(CONFIG_INCLUDES)
> -
> -# Set compile option CFLAGS
> -ifdef EXTRA_CFLAGS
> - CFLAGS := $(EXTRA_CFLAGS)
> -else
> - CFLAGS := -g -Wall
> -endif
> -
> -# Append required CFLAGS
> -override CFLAGS += -fPIC
> -override CFLAGS += $(CONFIG_FLAGS) $(INCLUDES) $(PLUGIN_DIR_SQ)
> -override CFLAGS += $(udis86-flags) -D_GNU_SOURCE
> -
> -ifeq ($(VERBOSE),1)
> - Q =
> -else
> - Q = @
> -endif
> -
> -# Disable command line variables (CFLAGS) override from top
> -# level Makefile (perf), otherwise build Makefile will get
> -# the same command line setup.
> -MAKEOVERRIDES=
> -
> -export srctree OUTPUT CC LD CFLAGS V
> -
> -build := -f $(srctree)/tools/build/Makefile.build dir=. obj
> -
> -DYNAMIC_LIST_FILE := $(OUTPUT)libtraceevent-dynamic-list
> -
> -PLUGINS = plugin_jbd2.so
> -PLUGINS += plugin_hrtimer.so
> -PLUGINS += plugin_kmem.so
> -PLUGINS += plugin_kvm.so
> -PLUGINS += plugin_mac80211.so
> -PLUGINS += plugin_sched_switch.so
> -PLUGINS += plugin_function.so
> -PLUGINS += plugin_futex.so
> -PLUGINS += plugin_xen.so
> -PLUGINS += plugin_scsi.so
> -PLUGINS += plugin_cfg80211.so
> -PLUGINS += plugin_tlb.so
> -
> -PLUGINS := $(addprefix $(OUTPUT),$(PLUGINS))
> -PLUGINS_IN := $(PLUGINS:.so=-in.o)
> -
> -plugins: $(PLUGINS) $(DYNAMIC_LIST_FILE)
> -
> -__plugin_obj = $(notdir $@)
> - plugin_obj = $(__plugin_obj:-in.o=)
> -
> -$(PLUGINS_IN): force
> - $(Q)$(MAKE) $(build)=$(plugin_obj)
> -
> -$(OUTPUT)libtraceevent-dynamic-list: $(PLUGINS)
> - $(QUIET_GEN)$(call do_generate_dynamic_list_file, $(PLUGINS), $@)
> -
> -$(OUTPUT)%.so: $(OUTPUT)%-in.o
> - $(QUIET_LINK)$(CC) $(CFLAGS) -shared $(LDFLAGS) -nostartfiles -o $@ $^
> -
> -define update_dir
> - (echo $1 > [email protected]; \
> - if [ -r $@ ] && cmp -s $@ [email protected]; then \
> - rm -f [email protected]; \
> - else \
> - echo ' UPDATE $@'; \
> - mv -f [email protected] $@; \
> - fi);
> -endef
> -
> -tags: force
> - $(RM) tags
> - find . -name '*.[ch]' | xargs ctags --extra=+f --c-kinds=+px \
> - --regex-c++='/_PE\(([^,)]*).*/TEP_ERRNO__\1/'
> -
> -TAGS: force
> - $(RM) TAGS
> - find . -name '*.[ch]' | xargs etags \
> - --regex='/_PE(\([^,)]*\).*/TEP_ERRNO__\1/'
> -
> -define do_install_mkdir
> - if [ ! -d '$(DESTDIR_SQ)$1' ]; then \
> - $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$1'; \
> - fi
> -endef
> -
> -define do_install
> - $(call do_install_mkdir,$2); \
> - $(INSTALL) $(if $3,-m $3,) $1 '$(DESTDIR_SQ)$2'
> -endef
> -
> -define do_install_plugins
> - for plugin in $1; do \
> - $(call do_install,$$plugin,$(plugin_dir_SQ)); \
> - done
> -endef
> -
> -define do_generate_dynamic_list_file
> - symbol_type=`$(NM) -u -D $1 | awk 'NF>1 {print $$1}' | \
> - xargs echo "U w W" | tr 'w ' 'W\n' | sort -u | xargs echo`;\
> - if [ "$$symbol_type" = "U W" ];then \
> - (echo '{'; \
> - $(NM) -u -D $1 | awk 'NF>1 {sub("@.*", "", $$2); print "\t"$$2";"}' | sort -u;\
> - echo '};'; \
> - ) > $2; \
> - else \
> - (echo Either missing one of [$1] or bad version of $(NM)) 1>&2;\
> - fi
> -endef
> -
> -install: $(PLUGINS)
> - $(call QUIET_INSTALL, trace_plugins) \
> - $(call do_install_plugins, $(PLUGINS))
> -
> -clean:
> - $(call QUIET_CLEAN, trace_plugins) \
> - $(RM) *.o *~ $(TARGETS) *.a *.so $(VERSION_FILES) .*.d .*.cmd; \
> - $(RM) $(OUTPUT)libtraceevent-dynamic-list \
> - $(RM) TRACEEVENT-CFLAGS tags TAGS;
> -
> -PHONY += force plugins
> -force:
> -
> -# Declare the contents of the .PHONY variable as phony. We keep that
> -# information in a variable so we can use it in if_changed and friends.
> -.PHONY: $(PHONY)
> diff --git a/tools/lib/traceevent/plugins/plugin_cfg80211.c b/tools/lib/traceevent/plugins/plugin_cfg80211.c
> deleted file mode 100644
> index 3d43b56a6c98..000000000000
> --- a/tools/lib/traceevent/plugins/plugin_cfg80211.c
> +++ /dev/null
> @@ -1,43 +0,0 @@
> -// SPDX-License-Identifier: GPL-2.0
> -#include <stdio.h>
> -#include <string.h>
> -#include <inttypes.h>
> -#include <endian.h>
> -#include "event-parse.h"
> -
> -/*
> - * From glibc endian.h, for older systems where it is not present, e.g.: RHEL5,
> - * Fedora6.
> - */
> -#ifndef le16toh
> -# if __BYTE_ORDER == __LITTLE_ENDIAN
> -# define le16toh(x) (x)
> -# else
> -# define le16toh(x) __bswap_16 (x)
> -# endif
> -#endif
> -
> -
> -static unsigned long long
> -process___le16_to_cpup(struct trace_seq *s, unsigned long long *args)
> -{
> - uint16_t *val = (uint16_t *) (unsigned long) args[0];
> - return val ? (long long) le16toh(*val) : 0;
> -}
> -
> -int TEP_PLUGIN_LOADER(struct tep_handle *tep)
> -{
> - tep_register_print_function(tep,
> - process___le16_to_cpup,
> - TEP_FUNC_ARG_INT,
> - "__le16_to_cpup",
> - TEP_FUNC_ARG_PTR,
> - TEP_FUNC_ARG_VOID);
> - return 0;
> -}
> -
> -void TEP_PLUGIN_UNLOADER(struct tep_handle *tep)
> -{
> - tep_unregister_print_function(tep, process___le16_to_cpup,
> - "__le16_to_cpup");
> -}
> diff --git a/tools/lib/traceevent/plugins/plugin_function.c b/tools/lib/traceevent/plugins/plugin_function.c
> deleted file mode 100644
> index 807b16e1bf0f..000000000000
> --- a/tools/lib/traceevent/plugins/plugin_function.c
> +++ /dev/null
> @@ -1,282 +0,0 @@
> -// SPDX-License-Identifier: LGPL-2.1
> -/*
> - * Copyright (C) 2009, 2010 Red Hat Inc, Steven Rostedt <[email protected]>
> - */
> -#include <stdio.h>
> -#include <stdlib.h>
> -#include <string.h>
> -
> -#include "event-parse.h"
> -#include "event-utils.h"
> -#include "trace-seq.h"
> -
> -static struct func_stack {
> - int size;
> - char **stack;
> -} *fstack;
> -
> -static int cpus = -1;
> -
> -#define STK_BLK 10
> -
> -struct tep_plugin_option plugin_options[] =
> -{
> - {
> - .name = "parent",
> - .plugin_alias = "ftrace",
> - .description =
> - "Print parent of functions for function events",
> - },
> - {
> - .name = "indent",
> - .plugin_alias = "ftrace",
> - .description =
> - "Try to show function call indents, based on parents",
> - .set = 1,
> - },
> - {
> - .name = "offset",
> - .plugin_alias = "ftrace",
> - .description =
> - "Show function names as well as their offsets",
> - .set = 0,
> - },
> - {
> - .name = NULL,
> - }
> -};
> -
> -static struct tep_plugin_option *ftrace_parent = &plugin_options[0];
> -static struct tep_plugin_option *ftrace_indent = &plugin_options[1];
> -static struct tep_plugin_option *ftrace_offset = &plugin_options[2];
> -
> -static void add_child(struct func_stack *stack, const char *child, int pos)
> -{
> - int i;
> -
> - if (!child)
> - return;
> -
> - if (pos < stack->size)
> - free(stack->stack[pos]);
> - else {
> - char **ptr;
> -
> - ptr = realloc(stack->stack, sizeof(char *) *
> - (stack->size + STK_BLK));
> - if (!ptr) {
> - warning("could not allocate plugin memory\n");
> - return;
> - }
> -
> - stack->stack = ptr;
> -
> - for (i = stack->size; i < stack->size + STK_BLK; i++)
> - stack->stack[i] = NULL;
> - stack->size += STK_BLK;
> - }
> -
> - stack->stack[pos] = strdup(child);
> -}
> -
> -static int add_and_get_index(const char *parent, const char *child, int cpu)
> -{
> - int i;
> -
> - if (cpu < 0)
> - return 0;
> -
> - if (cpu > cpus) {
> - struct func_stack *ptr;
> -
> - ptr = realloc(fstack, sizeof(*fstack) * (cpu + 1));
> - if (!ptr) {
> - warning("could not allocate plugin memory\n");
> - return 0;
> - }
> -
> - fstack = ptr;
> -
> - /* Account for holes in the cpu count */
> - for (i = cpus + 1; i <= cpu; i++)
> - memset(&fstack[i], 0, sizeof(fstack[i]));
> - cpus = cpu;
> - }
> -
> - for (i = 0; i < fstack[cpu].size && fstack[cpu].stack[i]; i++) {
> - if (strcmp(parent, fstack[cpu].stack[i]) == 0) {
> - add_child(&fstack[cpu], child, i+1);
> - return i;
> - }
> - }
> -
> - /* Not found */
> - add_child(&fstack[cpu], parent, 0);
> - add_child(&fstack[cpu], child, 1);
> - return 0;
> -}
> -
> -static void show_function(struct trace_seq *s, struct tep_handle *tep,
> - const char *func, unsigned long long function)
> -{
> - unsigned long long offset;
> -
> - trace_seq_printf(s, "%s", func);
> - if (ftrace_offset->set) {
> - offset = tep_find_function_address(tep, function);
> - trace_seq_printf(s, "+0x%x ", (int)(function - offset));
> - }
> -}
> -
> -static int function_handler(struct trace_seq *s, struct tep_record *record,
> - struct tep_event *event, void *context)
> -{
> - struct tep_handle *tep = event->tep;
> - unsigned long long function;
> - unsigned long long pfunction;
> - const char *func;
> - const char *parent;
> - int index = 0;
> -
> - if (tep_get_field_val(s, event, "ip", record, &function, 1))
> - return trace_seq_putc(s, '!');
> -
> - func = tep_find_function(tep, function);
> -
> - if (tep_get_field_val(s, event, "parent_ip", record, &pfunction, 1))
> - return trace_seq_putc(s, '!');
> -
> - parent = tep_find_function(tep, pfunction);
> -
> - if (parent && ftrace_indent->set)
> - index = add_and_get_index(parent, func, record->cpu);
> -
> - trace_seq_printf(s, "%*s", index*3, "");
> -
> - if (func)
> - show_function(s, tep, func, function);
> - else
> - trace_seq_printf(s, "0x%llx", function);
> -
> - if (ftrace_parent->set) {
> - trace_seq_printf(s, " <-- ");
> - if (parent)
> - show_function(s, tep, parent, pfunction);
> - else
> - trace_seq_printf(s, "0x%llx", pfunction);
> - }
> -
> - return 0;
> -}
> -
> -static int
> -trace_stack_handler(struct trace_seq *s, struct tep_record *record,
> - struct tep_event *event, void *context)
> -{
> - struct tep_format_field *field;
> - unsigned long long addr;
> - const char *func;
> - int long_size;
> - void *data = record->data;
> -
> - field = tep_find_any_field(event, "caller");
> - if (!field) {
> - trace_seq_printf(s, "<CANT FIND FIELD %s>", "caller");
> - return 0;
> - }
> -
> - trace_seq_puts(s, "<stack trace >\n");
> -
> - long_size = tep_get_long_size(event->tep);
> -
> - for (data += field->offset; data < record->data + record->size;
> - data += long_size) {
> - addr = tep_read_number(event->tep, data, long_size);
> -
> - if ((long_size == 8 && addr == (unsigned long long)-1) ||
> - ((int)addr == -1))
> - break;
> -
> - func = tep_find_function(event->tep, addr);
> - if (func)
> - trace_seq_printf(s, "=> %s (%llx)\n", func, addr);
> - else
> - trace_seq_printf(s, "=> %llx\n", addr);
> - }
> -
> - return 0;
> -}
> -
> -static int
> -trace_raw_data_handler(struct trace_seq *s, struct tep_record *record,
> - struct tep_event *event, void *context)
> -{
> - struct tep_format_field *field;
> - unsigned long long id;
> - int long_size;
> - void *data = record->data;
> -
> - if (tep_get_field_val(s, event, "id", record, &id, 1))
> - return trace_seq_putc(s, '!');
> -
> - trace_seq_printf(s, "# %llx", id);
> -
> - field = tep_find_any_field(event, "buf");
> - if (!field) {
> - trace_seq_printf(s, "<CANT FIND FIELD %s>", "buf");
> - return 0;
> - }
> -
> - long_size = tep_get_long_size(event->tep);
> -
> - for (data += field->offset; data < record->data + record->size;
> - data += long_size) {
> - int size = sizeof(long);
> - int left = (record->data + record->size) - data;
> - int i;
> -
> - if (size > left)
> - size = left;
> -
> - for (i = 0; i < size; i++)
> - trace_seq_printf(s, " %02x", *(unsigned char *)(data + i));
> - }
> -
> - return 0;
> -}
> -
> -int TEP_PLUGIN_LOADER(struct tep_handle *tep)
> -{
> - tep_register_event_handler(tep, -1, "ftrace", "function",
> - function_handler, NULL);
> -
> - tep_register_event_handler(tep, -1, "ftrace", "kernel_stack",
> - trace_stack_handler, NULL);
> -
> - tep_register_event_handler(tep, -1, "ftrace", "raw_data",
> - trace_raw_data_handler, NULL);
> -
> - tep_plugin_add_options("ftrace", plugin_options);
> -
> - return 0;
> -}
> -
> -void TEP_PLUGIN_UNLOADER(struct tep_handle *tep)
> -{
> - int i, x;
> -
> - tep_unregister_event_handler(tep, -1, "ftrace", "function",
> - function_handler, NULL);
> -
> - for (i = 0; i <= cpus; i++) {
> - for (x = 0; x < fstack[i].size && fstack[i].stack[x]; x++)
> - free(fstack[i].stack[x]);
> - free(fstack[i].stack);
> - }
> -
> - tep_plugin_remove_options(plugin_options);
> -
> - free(fstack);
> - fstack = NULL;
> - cpus = -1;
> -}
> diff --git a/tools/lib/traceevent/plugins/plugin_futex.c b/tools/lib/traceevent/plugins/plugin_futex.c
> deleted file mode 100644
> index eb7c9f8a850a..000000000000
> --- a/tools/lib/traceevent/plugins/plugin_futex.c
> +++ /dev/null
> @@ -1,123 +0,0 @@
> -// SPDX-License-Identifier: LGPL-2.1
> -/*
> - * Copyright (C) 2017 National Instruments Corp.
> - *
> - * Author: Julia Cartwright <[email protected]>
> - *
> - */
> -#include <stdio.h>
> -#include <stdlib.h>
> -#include <string.h>
> -#include <linux/futex.h>
> -
> -#include "event-parse.h"
> -
> -#define ARRAY_SIZE(_a) (sizeof(_a) / sizeof((_a)[0]))
> -
> -struct futex_args {
> - unsigned long long uaddr;
> - unsigned long long op;
> - unsigned long long val;
> - unsigned long long utime; /* or val2 */
> - unsigned long long uaddr2;
> - unsigned long long val3;
> -};
> -
> -struct futex_op {
> - const char *name;
> - const char *fmt_val;
> - const char *fmt_utime;
> - const char *fmt_uaddr2;
> - const char *fmt_val3;
> -};
> -
> -static const struct futex_op futex_op_tbl[] = {
> - { "FUTEX_WAIT", " val=0x%08llx", " utime=0x%08llx", NULL, NULL },
> - { "FUTEX_WAKE", " val=%llu", NULL, NULL, NULL },
> - { "FUTEX_FD", " val=%llu", NULL, NULL, NULL },
> - { "FUTEX_REQUEUE", " val=%llu", " val2=%llu", " uaddr2=0x%08llx", NULL },
> - { "FUTEX_CMP_REQUEUE", " val=%llu", " val2=%llu", " uaddr2=0x%08llx", " val3=0x%08llx" },
> - { "FUTEX_WAKE_OP", " val=%llu", " val2=%llu", " uaddr2=0x%08llx", " val3=0x%08llx" },
> - { "FUTEX_LOCK_PI", NULL, " utime=0x%08llx", NULL, NULL },
> - { "FUTEX_UNLOCK_PI", NULL, NULL, NULL, NULL },
> - { "FUTEX_TRYLOCK_PI", NULL, NULL, NULL, NULL },
> - { "FUTEX_WAIT_BITSET", " val=0x%08llx", " utime=0x%08llx", NULL, " val3=0x%08llx" },
> - { "FUTEX_WAKE_BITSET", " val=%llu", NULL, NULL, " val3=0x%08llx" },
> - { "FUTEX_WAIT_REQUEUE_PI", " val=0x%08llx", " utime=0x%08llx", " uaddr2=0x%08llx", " val3=0x%08llx" },
> - { "FUTEX_CMP_REQUEUE_PI", " val=%llu", " val2=%llu", " uaddr2=0x%08llx", " val3=0x%08llx" },
> -};
> -
> -
> -static void futex_print(struct trace_seq *s, const struct futex_args *args,
> - const struct futex_op *fop)
> -{
> - trace_seq_printf(s, " uaddr=0x%08llx", args->uaddr);
> -
> - if (fop->fmt_val)
> - trace_seq_printf(s, fop->fmt_val, args->val);
> -
> - if (fop->fmt_utime)
> - trace_seq_printf(s,fop->fmt_utime, args->utime);
> -
> - if (fop->fmt_uaddr2)
> - trace_seq_printf(s, fop->fmt_uaddr2, args->uaddr2);
> -
> - if (fop->fmt_val3)
> - trace_seq_printf(s, fop->fmt_val3, args->val3);
> -}
> -
> -static int futex_handler(struct trace_seq *s, struct tep_record *record,
> - struct tep_event *event, void *context)
> -{
> - const struct futex_op *fop;
> - struct futex_args args;
> - unsigned long long cmd;
> -
> - if (tep_get_field_val(s, event, "uaddr", record, &args.uaddr, 1))
> - return 1;
> -
> - if (tep_get_field_val(s, event, "op", record, &args.op, 1))
> - return 1;
> -
> - if (tep_get_field_val(s, event, "val", record, &args.val, 1))
> - return 1;
> -
> - if (tep_get_field_val(s, event, "utime", record, &args.utime, 1))
> - return 1;
> -
> - if (tep_get_field_val(s, event, "uaddr2", record, &args.uaddr2, 1))
> - return 1;
> -
> - if (tep_get_field_val(s, event, "val3", record, &args.val3, 1))
> - return 1;
> -
> - cmd = args.op & FUTEX_CMD_MASK;
> - if (cmd >= ARRAY_SIZE(futex_op_tbl))
> - return 1;
> -
> - fop = &futex_op_tbl[cmd];
> -
> - trace_seq_printf(s, "op=%s", fop->name);
> -
> - if (args.op & FUTEX_PRIVATE_FLAG)
> - trace_seq_puts(s, "|FUTEX_PRIVATE_FLAG");
> -
> - if (args.op & FUTEX_CLOCK_REALTIME)
> - trace_seq_puts(s, "|FUTEX_CLOCK_REALTIME");
> -
> - futex_print(s, &args, fop);
> - return 0;
> -}
> -
> -int TEP_PLUGIN_LOADER(struct tep_handle *tep)
> -{
> - tep_register_event_handler(tep, -1, "syscalls", "sys_enter_futex",
> - futex_handler, NULL);
> - return 0;
> -}
> -
> -void TEP_PLUGIN_UNLOADER(struct tep_handle *tep)
> -{
> - tep_unregister_event_handler(tep, -1, "syscalls", "sys_enter_futex",
> - futex_handler, NULL);
> -}
> diff --git a/tools/lib/traceevent/plugins/plugin_hrtimer.c b/tools/lib/traceevent/plugins/plugin_hrtimer.c
> deleted file mode 100644
> index d98466788f14..000000000000
> --- a/tools/lib/traceevent/plugins/plugin_hrtimer.c
> +++ /dev/null
> @@ -1,74 +0,0 @@
> -// SPDX-License-Identifier: LGPL-2.1
> -/*
> - * Copyright (C) 2009 Red Hat Inc, Steven Rostedt <[email protected]>
> - * Copyright (C) 2009 Johannes Berg <[email protected]>
> - */
> -#include <stdio.h>
> -#include <stdlib.h>
> -#include <string.h>
> -
> -#include "event-parse.h"
> -#include "trace-seq.h"
> -
> -static int timer_expire_handler(struct trace_seq *s,
> - struct tep_record *record,
> - struct tep_event *event, void *context)
> -{
> - trace_seq_printf(s, "hrtimer=");
> -
> - if (tep_print_num_field(s, "0x%llx", event, "timer",
> - record, 0) == -1)
> - tep_print_num_field(s, "0x%llx", event, "hrtimer",
> - record, 1);
> -
> - trace_seq_printf(s, " now=");
> -
> - tep_print_num_field(s, "%llu", event, "now", record, 1);
> -
> - tep_print_func_field(s, " function=%s", event, "function",
> - record, 0);
> - return 0;
> -}
> -
> -static int timer_start_handler(struct trace_seq *s,
> - struct tep_record *record,
> - struct tep_event *event, void *context)
> -{
> - trace_seq_printf(s, "hrtimer=");
> -
> - if (tep_print_num_field(s, "0x%llx", event, "timer",
> - record, 0) == -1)
> - tep_print_num_field(s, "0x%llx", event, "hrtimer",
> - record, 1);
> -
> - tep_print_func_field(s, " function=%s", event, "function",
> - record, 0);
> -
> - trace_seq_printf(s, " expires=");
> - tep_print_num_field(s, "%llu", event, "expires", record, 1);
> -
> - trace_seq_printf(s, " softexpires=");
> - tep_print_num_field(s, "%llu", event, "softexpires", record, 1);
> - return 0;
> -}
> -
> -int TEP_PLUGIN_LOADER(struct tep_handle *tep)
> -{
> - tep_register_event_handler(tep, -1,
> - "timer", "hrtimer_expire_entry",
> - timer_expire_handler, NULL);
> -
> - tep_register_event_handler(tep, -1, "timer", "hrtimer_start",
> - timer_start_handler, NULL);
> - return 0;
> -}
> -
> -void TEP_PLUGIN_UNLOADER(struct tep_handle *tep)
> -{
> - tep_unregister_event_handler(tep, -1,
> - "timer", "hrtimer_expire_entry",
> - timer_expire_handler, NULL);
> -
> - tep_unregister_event_handler(tep, -1, "timer", "hrtimer_start",
> - timer_start_handler, NULL);
> -}
> diff --git a/tools/lib/traceevent/plugins/plugin_jbd2.c b/tools/lib/traceevent/plugins/plugin_jbd2.c
> deleted file mode 100644
> index 69111a68d3cf..000000000000
> --- a/tools/lib/traceevent/plugins/plugin_jbd2.c
> +++ /dev/null
> @@ -1,61 +0,0 @@
> -// SPDX-License-Identifier: LGPL-2.1
> -/*
> - * Copyright (C) 2010 Red Hat Inc, Steven Rostedt <[email protected]>
> - */
> -#include <stdio.h>
> -#include <stdlib.h>
> -#include <string.h>
> -
> -#include "event-parse.h"
> -#include "trace-seq.h"
> -
> -#define MINORBITS 20
> -#define MINORMASK ((1U << MINORBITS) - 1)
> -
> -#define MAJOR(dev) ((unsigned int) ((dev) >> MINORBITS))
> -#define MINOR(dev) ((unsigned int) ((dev) & MINORMASK))
> -
> -static unsigned long long
> -process_jbd2_dev_to_name(struct trace_seq *s, unsigned long long *args)
> -{
> - unsigned int dev = args[0];
> -
> - trace_seq_printf(s, "%d:%d", MAJOR(dev), MINOR(dev));
> - return 0;
> -}
> -
> -static unsigned long long
> -process_jiffies_to_msecs(struct trace_seq *s, unsigned long long *args)
> -{
> - unsigned long long jiffies = args[0];
> -
> - trace_seq_printf(s, "%lld", jiffies);
> - return jiffies;
> -}
> -
> -int TEP_PLUGIN_LOADER(struct tep_handle *tep)
> -{
> - tep_register_print_function(tep,
> - process_jbd2_dev_to_name,
> - TEP_FUNC_ARG_STRING,
> - "jbd2_dev_to_name",
> - TEP_FUNC_ARG_INT,
> - TEP_FUNC_ARG_VOID);
> -
> - tep_register_print_function(tep,
> - process_jiffies_to_msecs,
> - TEP_FUNC_ARG_LONG,
> - "jiffies_to_msecs",
> - TEP_FUNC_ARG_LONG,
> - TEP_FUNC_ARG_VOID);
> - return 0;
> -}
> -
> -void TEP_PLUGIN_UNLOADER(struct tep_handle *tep)
> -{
> - tep_unregister_print_function(tep, process_jbd2_dev_to_name,
> - "jbd2_dev_to_name");
> -
> - tep_unregister_print_function(tep, process_jiffies_to_msecs,
> - "jiffies_to_msecs");
> -}
> diff --git a/tools/lib/traceevent/plugins/plugin_kmem.c b/tools/lib/traceevent/plugins/plugin_kmem.c
> deleted file mode 100644
> index 4b4f7f9616e3..000000000000
> --- a/tools/lib/traceevent/plugins/plugin_kmem.c
> +++ /dev/null
> @@ -1,80 +0,0 @@
> -// SPDX-License-Identifier: LGPL-2.1
> -/*
> - * Copyright (C) 2009 Red Hat Inc, Steven Rostedt <[email protected]>
> - */
> -#include <stdio.h>
> -#include <stdlib.h>
> -#include <string.h>
> -
> -#include "event-parse.h"
> -#include "trace-seq.h"
> -
> -static int call_site_handler(struct trace_seq *s, struct tep_record *record,
> - struct tep_event *event, void *context)
> -{
> - struct tep_format_field *field;
> - unsigned long long val, addr;
> - void *data = record->data;
> - const char *func;
> -
> - field = tep_find_field(event, "call_site");
> - if (!field)
> - return 1;
> -
> - if (tep_read_number_field(field, data, &val))
> - return 1;
> -
> - func = tep_find_function(event->tep, val);
> - if (!func)
> - return 1;
> -
> - addr = tep_find_function_address(event->tep, val);
> -
> - trace_seq_printf(s, "(%s+0x%x) ", func, (int)(val - addr));
> - return 1;
> -}
> -
> -int TEP_PLUGIN_LOADER(struct tep_handle *tep)
> -{
> - tep_register_event_handler(tep, -1, "kmem", "kfree",
> - call_site_handler, NULL);
> -
> - tep_register_event_handler(tep, -1, "kmem", "kmalloc",
> - call_site_handler, NULL);
> -
> - tep_register_event_handler(tep, -1, "kmem", "kmalloc_node",
> - call_site_handler, NULL);
> -
> - tep_register_event_handler(tep, -1, "kmem", "kmem_cache_alloc",
> - call_site_handler, NULL);
> -
> - tep_register_event_handler(tep, -1, "kmem",
> - "kmem_cache_alloc_node",
> - call_site_handler, NULL);
> -
> - tep_register_event_handler(tep, -1, "kmem", "kmem_cache_free",
> - call_site_handler, NULL);
> - return 0;
> -}
> -
> -void TEP_PLUGIN_UNLOADER(struct tep_handle *tep)
> -{
> - tep_unregister_event_handler(tep, -1, "kmem", "kfree",
> - call_site_handler, NULL);
> -
> - tep_unregister_event_handler(tep, -1, "kmem", "kmalloc",
> - call_site_handler, NULL);
> -
> - tep_unregister_event_handler(tep, -1, "kmem", "kmalloc_node",
> - call_site_handler, NULL);
> -
> - tep_unregister_event_handler(tep, -1, "kmem", "kmem_cache_alloc",
> - call_site_handler, NULL);
> -
> - tep_unregister_event_handler(tep, -1, "kmem",
> - "kmem_cache_alloc_node",
> - call_site_handler, NULL);
> -
> - tep_unregister_event_handler(tep, -1, "kmem", "kmem_cache_free",
> - call_site_handler, NULL);
> -}
> diff --git a/tools/lib/traceevent/plugins/plugin_kvm.c b/tools/lib/traceevent/plugins/plugin_kvm.c
> deleted file mode 100644
> index 9ce7b4b68e3f..000000000000
> --- a/tools/lib/traceevent/plugins/plugin_kvm.c
> +++ /dev/null
> @@ -1,527 +0,0 @@
> -// SPDX-License-Identifier: LGPL-2.1
> -/*
> - * Copyright (C) 2009 Red Hat Inc, Steven Rostedt <[email protected]>
> - */
> -#include <stdio.h>
> -#include <stdlib.h>
> -#include <string.h>
> -#include <stdint.h>
> -
> -#include "event-parse.h"
> -#include "trace-seq.h"
> -
> -#ifdef HAVE_UDIS86
> -
> -#include <udis86.h>
> -
> -static ud_t ud;
> -
> -static void init_disassembler(void)
> -{
> - ud_init(&ud);
> - ud_set_syntax(&ud, UD_SYN_ATT);
> -}
> -
> -static const char *disassemble(unsigned char *insn, int len, uint64_t rip,
> - int cr0_pe, int eflags_vm,
> - int cs_d, int cs_l)
> -{
> - int mode;
> -
> - if (!cr0_pe)
> - mode = 16;
> - else if (eflags_vm)
> - mode = 16;
> - else if (cs_l)
> - mode = 64;
> - else if (cs_d)
> - mode = 32;
> - else
> - mode = 16;
> -
> - ud_set_pc(&ud, rip);
> - ud_set_mode(&ud, mode);
> - ud_set_input_buffer(&ud, insn, len);
> - ud_disassemble(&ud);
> - return ud_insn_asm(&ud);
> -}
> -
> -#else
> -
> -static void init_disassembler(void)
> -{
> -}
> -
> -static const char *disassemble(unsigned char *insn, int len, uint64_t rip,
> - int cr0_pe, int eflags_vm,
> - int cs_d, int cs_l)
> -{
> - static char out[15*3+1];
> - int i;
> -
> - for (i = 0; i < len; ++i)
> - sprintf(out + i * 3, "%02x ", insn[i]);
> - out[len*3-1] = '\0';
> - return out;
> -}
> -
> -#endif
> -
> -
> -#define VMX_EXIT_REASONS \
> - _ER(EXCEPTION_NMI, 0) \
> - _ER(EXTERNAL_INTERRUPT, 1) \
> - _ER(TRIPLE_FAULT, 2) \
> - _ER(PENDING_INTERRUPT, 7) \
> - _ER(NMI_WINDOW, 8) \
> - _ER(TASK_SWITCH, 9) \
> - _ER(CPUID, 10) \
> - _ER(HLT, 12) \
> - _ER(INVD, 13) \
> - _ER(INVLPG, 14) \
> - _ER(RDPMC, 15) \
> - _ER(RDTSC, 16) \
> - _ER(VMCALL, 18) \
> - _ER(VMCLEAR, 19) \
> - _ER(VMLAUNCH, 20) \
> - _ER(VMPTRLD, 21) \
> - _ER(VMPTRST, 22) \
> - _ER(VMREAD, 23) \
> - _ER(VMRESUME, 24) \
> - _ER(VMWRITE, 25) \
> - _ER(VMOFF, 26) \
> - _ER(VMON, 27) \
> - _ER(CR_ACCESS, 28) \
> - _ER(DR_ACCESS, 29) \
> - _ER(IO_INSTRUCTION, 30) \
> - _ER(MSR_READ, 31) \
> - _ER(MSR_WRITE, 32) \
> - _ER(MWAIT_INSTRUCTION, 36) \
> - _ER(MONITOR_INSTRUCTION, 39) \
> - _ER(PAUSE_INSTRUCTION, 40) \
> - _ER(MCE_DURING_VMENTRY, 41) \
> - _ER(TPR_BELOW_THRESHOLD, 43) \
> - _ER(APIC_ACCESS, 44) \
> - _ER(EOI_INDUCED, 45) \
> - _ER(EPT_VIOLATION, 48) \
> - _ER(EPT_MISCONFIG, 49) \
> - _ER(INVEPT, 50) \
> - _ER(PREEMPTION_TIMER, 52) \
> - _ER(WBINVD, 54) \
> - _ER(XSETBV, 55) \
> - _ER(APIC_WRITE, 56) \
> - _ER(INVPCID, 58) \
> - _ER(PML_FULL, 62) \
> - _ER(XSAVES, 63) \
> - _ER(XRSTORS, 64)
> -
> -#define SVM_EXIT_REASONS \
> - _ER(EXIT_READ_CR0, 0x000) \
> - _ER(EXIT_READ_CR3, 0x003) \
> - _ER(EXIT_READ_CR4, 0x004) \
> - _ER(EXIT_READ_CR8, 0x008) \
> - _ER(EXIT_WRITE_CR0, 0x010) \
> - _ER(EXIT_WRITE_CR3, 0x013) \
> - _ER(EXIT_WRITE_CR4, 0x014) \
> - _ER(EXIT_WRITE_CR8, 0x018) \
> - _ER(EXIT_READ_DR0, 0x020) \
> - _ER(EXIT_READ_DR1, 0x021) \
> - _ER(EXIT_READ_DR2, 0x022) \
> - _ER(EXIT_READ_DR3, 0x023) \
> - _ER(EXIT_READ_DR4, 0x024) \
> - _ER(EXIT_READ_DR5, 0x025) \
> - _ER(EXIT_READ_DR6, 0x026) \
> - _ER(EXIT_READ_DR7, 0x027) \
> - _ER(EXIT_WRITE_DR0, 0x030) \
> - _ER(EXIT_WRITE_DR1, 0x031) \
> - _ER(EXIT_WRITE_DR2, 0x032) \
> - _ER(EXIT_WRITE_DR3, 0x033) \
> - _ER(EXIT_WRITE_DR4, 0x034) \
> - _ER(EXIT_WRITE_DR5, 0x035) \
> - _ER(EXIT_WRITE_DR6, 0x036) \
> - _ER(EXIT_WRITE_DR7, 0x037) \
> - _ER(EXIT_EXCP_DE, 0x040) \
> - _ER(EXIT_EXCP_DB, 0x041) \
> - _ER(EXIT_EXCP_BP, 0x043) \
> - _ER(EXIT_EXCP_OF, 0x044) \
> - _ER(EXIT_EXCP_BR, 0x045) \
> - _ER(EXIT_EXCP_UD, 0x046) \
> - _ER(EXIT_EXCP_NM, 0x047) \
> - _ER(EXIT_EXCP_DF, 0x048) \
> - _ER(EXIT_EXCP_TS, 0x04a) \
> - _ER(EXIT_EXCP_NP, 0x04b) \
> - _ER(EXIT_EXCP_SS, 0x04c) \
> - _ER(EXIT_EXCP_GP, 0x04d) \
> - _ER(EXIT_EXCP_PF, 0x04e) \
> - _ER(EXIT_EXCP_MF, 0x050) \
> - _ER(EXIT_EXCP_AC, 0x051) \
> - _ER(EXIT_EXCP_MC, 0x052) \
> - _ER(EXIT_EXCP_XF, 0x053) \
> - _ER(EXIT_INTR, 0x060) \
> - _ER(EXIT_NMI, 0x061) \
> - _ER(EXIT_SMI, 0x062) \
> - _ER(EXIT_INIT, 0x063) \
> - _ER(EXIT_VINTR, 0x064) \
> - _ER(EXIT_CR0_SEL_WRITE, 0x065) \
> - _ER(EXIT_IDTR_READ, 0x066) \
> - _ER(EXIT_GDTR_READ, 0x067) \
> - _ER(EXIT_LDTR_READ, 0x068) \
> - _ER(EXIT_TR_READ, 0x069) \
> - _ER(EXIT_IDTR_WRITE, 0x06a) \
> - _ER(EXIT_GDTR_WRITE, 0x06b) \
> - _ER(EXIT_LDTR_WRITE, 0x06c) \
> - _ER(EXIT_TR_WRITE, 0x06d) \
> - _ER(EXIT_RDTSC, 0x06e) \
> - _ER(EXIT_RDPMC, 0x06f) \
> - _ER(EXIT_PUSHF, 0x070) \
> - _ER(EXIT_POPF, 0x071) \
> - _ER(EXIT_CPUID, 0x072) \
> - _ER(EXIT_RSM, 0x073) \
> - _ER(EXIT_IRET, 0x074) \
> - _ER(EXIT_SWINT, 0x075) \
> - _ER(EXIT_INVD, 0x076) \
> - _ER(EXIT_PAUSE, 0x077) \
> - _ER(EXIT_HLT, 0x078) \
> - _ER(EXIT_INVLPG, 0x079) \
> - _ER(EXIT_INVLPGA, 0x07a) \
> - _ER(EXIT_IOIO, 0x07b) \
> - _ER(EXIT_MSR, 0x07c) \
> - _ER(EXIT_TASK_SWITCH, 0x07d) \
> - _ER(EXIT_FERR_FREEZE, 0x07e) \
> - _ER(EXIT_SHUTDOWN, 0x07f) \
> - _ER(EXIT_VMRUN, 0x080) \
> - _ER(EXIT_VMMCALL, 0x081) \
> - _ER(EXIT_VMLOAD, 0x082) \
> - _ER(EXIT_VMSAVE, 0x083) \
> - _ER(EXIT_STGI, 0x084) \
> - _ER(EXIT_CLGI, 0x085) \
> - _ER(EXIT_SKINIT, 0x086) \
> - _ER(EXIT_RDTSCP, 0x087) \
> - _ER(EXIT_ICEBP, 0x088) \
> - _ER(EXIT_WBINVD, 0x089) \
> - _ER(EXIT_MONITOR, 0x08a) \
> - _ER(EXIT_MWAIT, 0x08b) \
> - _ER(EXIT_MWAIT_COND, 0x08c) \
> - _ER(EXIT_XSETBV, 0x08d) \
> - _ER(EXIT_NPF, 0x400) \
> - _ER(EXIT_AVIC_INCOMPLETE_IPI, 0x401) \
> - _ER(EXIT_AVIC_UNACCELERATED_ACCESS, 0x402) \
> - _ER(EXIT_ERR, -1)
> -
> -#define _ER(reason, val) { #reason, val },
> -struct str_values {
> - const char *str;
> - int val;
> -};
> -
> -static struct str_values vmx_exit_reasons[] = {
> - VMX_EXIT_REASONS
> - { NULL, -1}
> -};
> -
> -static struct str_values svm_exit_reasons[] = {
> - SVM_EXIT_REASONS
> - { NULL, -1}
> -};
> -
> -static struct isa_exit_reasons {
> - unsigned isa;
> - struct str_values *strings;
> -} isa_exit_reasons[] = {
> - { .isa = 1, .strings = vmx_exit_reasons },
> - { .isa = 2, .strings = svm_exit_reasons },
> - { }
> -};
> -
> -static const char *find_exit_reason(unsigned isa, int val)
> -{
> - struct str_values *strings = NULL;
> - int i;
> -
> - for (i = 0; isa_exit_reasons[i].strings; ++i)
> - if (isa_exit_reasons[i].isa == isa) {
> - strings = isa_exit_reasons[i].strings;
> - break;
> - }
> - if (!strings)
> - return "UNKNOWN-ISA";
> - for (i = 0; strings[i].str; i++)
> - if (strings[i].val == val)
> - break;
> -
> - return strings[i].str;
> -}
> -
> -static int print_exit_reason(struct trace_seq *s, struct tep_record *record,
> - struct tep_event *event, const char *field)
> -{
> - unsigned long long isa;
> - unsigned long long val;
> - const char *reason;
> -
> - if (tep_get_field_val(s, event, field, record, &val, 1) < 0)
> - return -1;
> -
> - if (tep_get_field_val(s, event, "isa", record, &isa, 0) < 0)
> - isa = 1;
> -
> - reason = find_exit_reason(isa, val);
> - if (reason)
> - trace_seq_printf(s, "reason %s", reason);
> - else
> - trace_seq_printf(s, "reason UNKNOWN (%llu)", val);
> - return 0;
> -}
> -
> -static int kvm_exit_handler(struct trace_seq *s, struct tep_record *record,
> - struct tep_event *event, void *context)
> -{
> - unsigned long long info1 = 0, info2 = 0;
> -
> - if (print_exit_reason(s, record, event, "exit_reason") < 0)
> - return -1;
> -
> - tep_print_num_field(s, " rip 0x%lx", event, "guest_rip", record, 1);
> -
> - if (tep_get_field_val(s, event, "info1", record, &info1, 0) >= 0
> - && tep_get_field_val(s, event, "info2", record, &info2, 0) >= 0)
> - trace_seq_printf(s, " info %llx %llx", info1, info2);
> -
> - return 0;
> -}
> -
> -#define KVM_EMUL_INSN_F_CR0_PE (1 << 0)
> -#define KVM_EMUL_INSN_F_EFL_VM (1 << 1)
> -#define KVM_EMUL_INSN_F_CS_D (1 << 2)
> -#define KVM_EMUL_INSN_F_CS_L (1 << 3)
> -
> -static int kvm_emulate_insn_handler(struct trace_seq *s,
> - struct tep_record *record,
> - struct tep_event *event, void *context)
> -{
> - unsigned long long rip, csbase, len, flags, failed;
> - int llen;
> - uint8_t *insn;
> - const char *disasm;
> -
> - if (tep_get_field_val(s, event, "rip", record, &rip, 1) < 0)
> - return -1;
> -
> - if (tep_get_field_val(s, event, "csbase", record, &csbase, 1) < 0)
> - return -1;
> -
> - if (tep_get_field_val(s, event, "len", record, &len, 1) < 0)
> - return -1;
> -
> - if (tep_get_field_val(s, event, "flags", record, &flags, 1) < 0)
> - return -1;
> -
> - if (tep_get_field_val(s, event, "failed", record, &failed, 1) < 0)
> - return -1;
> -
> - insn = tep_get_field_raw(s, event, "insn", record, &llen, 1);
> - if (!insn)
> - return -1;
> -
> - disasm = disassemble(insn, len, rip,
> - flags & KVM_EMUL_INSN_F_CR0_PE,
> - flags & KVM_EMUL_INSN_F_EFL_VM,
> - flags & KVM_EMUL_INSN_F_CS_D,
> - flags & KVM_EMUL_INSN_F_CS_L);
> -
> - trace_seq_printf(s, "%llx:%llx: %s%s", csbase, rip, disasm,
> - failed ? " FAIL" : "");
> - return 0;
> -}
> -
> -
> -static int kvm_nested_vmexit_inject_handler(struct trace_seq *s, struct tep_record *record,
> - struct tep_event *event, void *context)
> -{
> - if (print_exit_reason(s, record, event, "exit_code") < 0)
> - return -1;
> -
> - tep_print_num_field(s, " info1 %llx", event, "exit_info1", record, 1);
> - tep_print_num_field(s, " info2 %llx", event, "exit_info2", record, 1);
> - tep_print_num_field(s, " int_info %llx", event, "exit_int_info", record, 1);
> - tep_print_num_field(s, " int_info_err %llx", event, "exit_int_info_err", record, 1);
> -
> - return 0;
> -}
> -
> -static int kvm_nested_vmexit_handler(struct trace_seq *s, struct tep_record *record,
> - struct tep_event *event, void *context)
> -{
> - tep_print_num_field(s, "rip %llx ", event, "rip", record, 1);
> -
> - return kvm_nested_vmexit_inject_handler(s, record, event, context);
> -}
> -
> -union kvm_mmu_page_role {
> - unsigned word;
> - struct {
> - unsigned level:4;
> - unsigned cr4_pae:1;
> - unsigned quadrant:2;
> - unsigned direct:1;
> - unsigned access:3;
> - unsigned invalid:1;
> - unsigned efer_nx:1;
> - unsigned cr0_wp:1;
> - unsigned smep_and_not_wp:1;
> - unsigned smap_and_not_wp:1;
> - unsigned pad_for_nice_hex_output:8;
> - unsigned smm:8;
> - };
> -};
> -
> -static int kvm_mmu_print_role(struct trace_seq *s, struct tep_record *record,
> - struct tep_event *event, void *context)
> -{
> - unsigned long long val;
> - static const char *access_str[] = {
> - "---", "--x", "w--", "w-x", "-u-", "-ux", "wu-", "wux"
> - };
> - union kvm_mmu_page_role role;
> -
> - if (tep_get_field_val(s, event, "role", record, &val, 1) < 0)
> - return -1;
> -
> - role.word = (int)val;
> -
> - /*
> - * We can only use the structure if file is of the same
> - * endianness.
> - */
> - if (tep_is_file_bigendian(event->tep) ==
> - tep_is_local_bigendian(event->tep)) {
> -
> - trace_seq_printf(s, "%u q%u%s %s%s %spae %snxe %swp%s%s%s",
> - role.level,
> - role.quadrant,
> - role.direct ? " direct" : "",
> - access_str[role.access],
> - role.invalid ? " invalid" : "",
> - role.cr4_pae ? "" : "!",
> - role.efer_nx ? "" : "!",
> - role.cr0_wp ? "" : "!",
> - role.smep_and_not_wp ? " smep" : "",
> - role.smap_and_not_wp ? " smap" : "",
> - role.smm ? " smm" : "");
> - } else
> - trace_seq_printf(s, "WORD: %08x", role.word);
> -
> - tep_print_num_field(s, " root %u ", event,
> - "root_count", record, 1);
> -
> - if (tep_get_field_val(s, event, "unsync", record, &val, 1) < 0)
> - return -1;
> -
> - trace_seq_printf(s, "%s%c", val ? "unsync" : "sync", 0);
> - return 0;
> -}
> -
> -static int kvm_mmu_get_page_handler(struct trace_seq *s,
> - struct tep_record *record,
> - struct tep_event *event, void *context)
> -{
> - unsigned long long val;
> -
> - if (tep_get_field_val(s, event, "created", record, &val, 1) < 0)
> - return -1;
> -
> - trace_seq_printf(s, "%s ", val ? "new" : "existing");
> -
> - if (tep_get_field_val(s, event, "gfn", record, &val, 1) < 0)
> - return -1;
> -
> - trace_seq_printf(s, "sp gfn %llx ", val);
> - return kvm_mmu_print_role(s, record, event, context);
> -}
> -
> -#define PT_WRITABLE_SHIFT 1
> -#define PT_WRITABLE_MASK (1ULL << PT_WRITABLE_SHIFT)
> -
> -static unsigned long long
> -process_is_writable_pte(struct trace_seq *s, unsigned long long *args)
> -{
> - unsigned long pte = args[0];
> - return pte & PT_WRITABLE_MASK;
> -}
> -
> -int TEP_PLUGIN_LOADER(struct tep_handle *tep)
> -{
> - init_disassembler();
> -
> - tep_register_event_handler(tep, -1, "kvm", "kvm_exit",
> - kvm_exit_handler, NULL);
> -
> - tep_register_event_handler(tep, -1, "kvm", "kvm_emulate_insn",
> - kvm_emulate_insn_handler, NULL);
> -
> - tep_register_event_handler(tep, -1, "kvm", "kvm_nested_vmexit",
> - kvm_nested_vmexit_handler, NULL);
> -
> - tep_register_event_handler(tep, -1, "kvm", "kvm_nested_vmexit_inject",
> - kvm_nested_vmexit_inject_handler, NULL);
> -
> - tep_register_event_handler(tep, -1, "kvmmmu", "kvm_mmu_get_page",
> - kvm_mmu_get_page_handler, NULL);
> -
> - tep_register_event_handler(tep, -1, "kvmmmu", "kvm_mmu_sync_page",
> - kvm_mmu_print_role, NULL);
> -
> - tep_register_event_handler(tep, -1,
> - "kvmmmu", "kvm_mmu_unsync_page",
> - kvm_mmu_print_role, NULL);
> -
> - tep_register_event_handler(tep, -1, "kvmmmu", "kvm_mmu_zap_page",
> - kvm_mmu_print_role, NULL);
> -
> - tep_register_event_handler(tep, -1, "kvmmmu",
> - "kvm_mmu_prepare_zap_page", kvm_mmu_print_role,
> - NULL);
> -
> - tep_register_print_function(tep,
> - process_is_writable_pte,
> - TEP_FUNC_ARG_INT,
> - "is_writable_pte",
> - TEP_FUNC_ARG_LONG,
> - TEP_FUNC_ARG_VOID);
> - return 0;
> -}
> -
> -void TEP_PLUGIN_UNLOADER(struct tep_handle *tep)
> -{
> - tep_unregister_event_handler(tep, -1, "kvm", "kvm_exit",
> - kvm_exit_handler, NULL);
> -
> - tep_unregister_event_handler(tep, -1, "kvm", "kvm_emulate_insn",
> - kvm_emulate_insn_handler, NULL);
> -
> - tep_unregister_event_handler(tep, -1, "kvm", "kvm_nested_vmexit",
> - kvm_nested_vmexit_handler, NULL);
> -
> - tep_unregister_event_handler(tep, -1, "kvm", "kvm_nested_vmexit_inject",
> - kvm_nested_vmexit_inject_handler, NULL);
> -
> - tep_unregister_event_handler(tep, -1, "kvmmmu", "kvm_mmu_get_page",
> - kvm_mmu_get_page_handler, NULL);
> -
> - tep_unregister_event_handler(tep, -1, "kvmmmu", "kvm_mmu_sync_page",
> - kvm_mmu_print_role, NULL);
> -
> - tep_unregister_event_handler(tep, -1,
> - "kvmmmu", "kvm_mmu_unsync_page",
> - kvm_mmu_print_role, NULL);
> -
> - tep_unregister_event_handler(tep, -1, "kvmmmu", "kvm_mmu_zap_page",
> - kvm_mmu_print_role, NULL);
> -
> - tep_unregister_event_handler(tep, -1, "kvmmmu",
> - "kvm_mmu_prepare_zap_page", kvm_mmu_print_role,
> - NULL);
> -
> - tep_unregister_print_function(tep, process_is_writable_pte,
> - "is_writable_pte");
> -}
> diff --git a/tools/lib/traceevent/plugins/plugin_mac80211.c b/tools/lib/traceevent/plugins/plugin_mac80211.c
> deleted file mode 100644
> index f48071e3cfb8..000000000000
> --- a/tools/lib/traceevent/plugins/plugin_mac80211.c
> +++ /dev/null
> @@ -1,88 +0,0 @@
> -// SPDX-License-Identifier: LGPL-2.1
> -/*
> - * Copyright (C) 2009 Johannes Berg <[email protected]>
> - */
> -#include <stdio.h>
> -#include <stdlib.h>
> -#include <string.h>
> -
> -#include "event-parse.h"
> -#include "trace-seq.h"
> -
> -#define INDENT 65
> -
> -static void print_string(struct trace_seq *s, struct tep_event *event,
> - const char *name, const void *data)
> -{
> - struct tep_format_field *f = tep_find_field(event, name);
> - int offset;
> - int length;
> -
> - if (!f) {
> - trace_seq_printf(s, "NOTFOUND:%s", name);
> - return;
> - }
> -
> - offset = f->offset;
> - length = f->size;
> -
> - if (!strncmp(f->type, "__data_loc", 10)) {
> - unsigned long long v;
> - if (tep_read_number_field(f, data, &v)) {
> - trace_seq_printf(s, "invalid_data_loc");
> - return;
> - }
> - offset = v & 0xffff;
> - length = v >> 16;
> - }
> -
> - trace_seq_printf(s, "%.*s", length, (char *)data + offset);
> -}
> -
> -#define SF(fn) tep_print_num_field(s, fn ":%d", event, fn, record, 0)
> -#define SFX(fn) tep_print_num_field(s, fn ":%#x", event, fn, record, 0)
> -#define SP() trace_seq_putc(s, ' ')
> -
> -static int drv_bss_info_changed(struct trace_seq *s,
> - struct tep_record *record,
> - struct tep_event *event, void *context)
> -{
> - void *data = record->data;
> -
> - print_string(s, event, "wiphy_name", data);
> - trace_seq_printf(s, " vif:");
> - print_string(s, event, "vif_name", data);
> - tep_print_num_field(s, "(%d)", event, "vif_type", record, 1);
> -
> - trace_seq_printf(s, "\n%*s", INDENT, "");
> - SF("assoc"); SP();
> - SF("aid"); SP();
> - SF("cts"); SP();
> - SF("shortpre"); SP();
> - SF("shortslot"); SP();
> - SF("dtimper"); SP();
> - trace_seq_printf(s, "\n%*s", INDENT, "");
> - SF("bcnint"); SP();
> - SFX("assoc_cap"); SP();
> - SFX("basic_rates"); SP();
> - SF("enable_beacon");
> - trace_seq_printf(s, "\n%*s", INDENT, "");
> - SF("ht_operation_mode");
> -
> - return 0;
> -}
> -
> -int TEP_PLUGIN_LOADER(struct tep_handle *tep)
> -{
> - tep_register_event_handler(tep, -1, "mac80211",
> - "drv_bss_info_changed",
> - drv_bss_info_changed, NULL);
> - return 0;
> -}
> -
> -void TEP_PLUGIN_UNLOADER(struct tep_handle *tep)
> -{
> - tep_unregister_event_handler(tep, -1, "mac80211",
> - "drv_bss_info_changed",
> - drv_bss_info_changed, NULL);
> -}
> diff --git a/tools/lib/traceevent/plugins/plugin_sched_switch.c b/tools/lib/traceevent/plugins/plugin_sched_switch.c
> deleted file mode 100644
> index e12fa103820a..000000000000
> --- a/tools/lib/traceevent/plugins/plugin_sched_switch.c
> +++ /dev/null
> @@ -1,146 +0,0 @@
> -// SPDX-License-Identifier: LGPL-2.1
> -/*
> - * Copyright (C) 2009, 2010 Red Hat Inc, Steven Rostedt <[email protected]>
> - */
> -#include <stdio.h>
> -#include <stdlib.h>
> -#include <string.h>
> -
> -#include "event-parse.h"
> -#include "trace-seq.h"
> -
> -static void write_state(struct trace_seq *s, int val)
> -{
> - const char states[] = "SDTtZXxW";
> - int found = 0;
> - int i;
> -
> - for (i = 0; i < (sizeof(states) - 1); i++) {
> - if (!(val & (1 << i)))
> - continue;
> -
> - if (found)
> - trace_seq_putc(s, '|');
> -
> - found = 1;
> - trace_seq_putc(s, states[i]);
> - }
> -
> - if (!found)
> - trace_seq_putc(s, 'R');
> -}
> -
> -static void write_and_save_comm(struct tep_format_field *field,
> - struct tep_record *record,
> - struct trace_seq *s, int pid)
> -{
> - const char *comm;
> - int len;
> -
> - comm = (char *)(record->data + field->offset);
> - len = s->len;
> - trace_seq_printf(s, "%.*s",
> - field->size, comm);
> -
> - /* make sure the comm has a \0 at the end. */
> - trace_seq_terminate(s);
> - comm = &s->buffer[len];
> -
> - /* Help out the comm to ids. This will handle dups */
> - tep_register_comm(field->event->tep, comm, pid);
> -}
> -
> -static int sched_wakeup_handler(struct trace_seq *s,
> - struct tep_record *record,
> - struct tep_event *event, void *context)
> -{
> - struct tep_format_field *field;
> - unsigned long long val;
> -
> - if (tep_get_field_val(s, event, "pid", record, &val, 1))
> - return trace_seq_putc(s, '!');
> -
> - field = tep_find_any_field(event, "comm");
> - if (field) {
> - write_and_save_comm(field, record, s, val);
> - trace_seq_putc(s, ':');
> - }
> - trace_seq_printf(s, "%lld", val);
> -
> - if (tep_get_field_val(s, event, "prio", record, &val, 0) == 0)
> - trace_seq_printf(s, " [%lld]", val);
> -
> - if (tep_get_field_val(s, event, "success", record, &val, 1) == 0)
> - trace_seq_printf(s, " success=%lld", val);
> -
> - if (tep_get_field_val(s, event, "target_cpu", record, &val, 0) == 0)
> - trace_seq_printf(s, " CPU:%03llu", val);
> -
> - return 0;
> -}
> -
> -static int sched_switch_handler(struct trace_seq *s,
> - struct tep_record *record,
> - struct tep_event *event, void *context)
> -{
> - struct tep_format_field *field;
> - unsigned long long val;
> -
> - if (tep_get_field_val(s, event, "prev_pid", record, &val, 1))
> - return trace_seq_putc(s, '!');
> -
> - field = tep_find_any_field(event, "prev_comm");
> - if (field) {
> - write_and_save_comm(field, record, s, val);
> - trace_seq_putc(s, ':');
> - }
> - trace_seq_printf(s, "%lld ", val);
> -
> - if (tep_get_field_val(s, event, "prev_prio", record, &val, 0) == 0)
> - trace_seq_printf(s, "[%d] ", (int) val);
> -
> - if (tep_get_field_val(s, event, "prev_state", record, &val, 0) == 0)
> - write_state(s, val);
> -
> - trace_seq_puts(s, " ==> ");
> -
> - if (tep_get_field_val(s, event, "next_pid", record, &val, 1))
> - return trace_seq_putc(s, '!');
> -
> - field = tep_find_any_field(event, "next_comm");
> - if (field) {
> - write_and_save_comm(field, record, s, val);
> - trace_seq_putc(s, ':');
> - }
> - trace_seq_printf(s, "%lld", val);
> -
> - if (tep_get_field_val(s, event, "next_prio", record, &val, 0) == 0)
> - trace_seq_printf(s, " [%d]", (int) val);
> -
> - return 0;
> -}
> -
> -int TEP_PLUGIN_LOADER(struct tep_handle *tep)
> -{
> - tep_register_event_handler(tep, -1, "sched", "sched_switch",
> - sched_switch_handler, NULL);
> -
> - tep_register_event_handler(tep, -1, "sched", "sched_wakeup",
> - sched_wakeup_handler, NULL);
> -
> - tep_register_event_handler(tep, -1, "sched", "sched_wakeup_new",
> - sched_wakeup_handler, NULL);
> - return 0;
> -}
> -
> -void TEP_PLUGIN_UNLOADER(struct tep_handle *tep)
> -{
> - tep_unregister_event_handler(tep, -1, "sched", "sched_switch",
> - sched_switch_handler, NULL);
> -
> - tep_unregister_event_handler(tep, -1, "sched", "sched_wakeup",
> - sched_wakeup_handler, NULL);
> -
> - tep_unregister_event_handler(tep, -1, "sched", "sched_wakeup_new",
> - sched_wakeup_handler, NULL);
> -}
> diff --git a/tools/lib/traceevent/plugins/plugin_scsi.c b/tools/lib/traceevent/plugins/plugin_scsi.c
> deleted file mode 100644
> index 5d0387a4b65a..000000000000
> --- a/tools/lib/traceevent/plugins/plugin_scsi.c
> +++ /dev/null
> @@ -1,434 +0,0 @@
> -// SPDX-License-Identifier: GPL-2.0
> -#include <stdio.h>
> -#include <string.h>
> -#include <inttypes.h>
> -#include "event-parse.h"
> -#include "trace-seq.h"
> -
> -typedef unsigned long sector_t;
> -typedef uint64_t u64;
> -typedef unsigned int u32;
> -
> -/*
> - * SCSI opcodes
> - */
> -#define TEST_UNIT_READY 0x00
> -#define REZERO_UNIT 0x01
> -#define REQUEST_SENSE 0x03
> -#define FORMAT_UNIT 0x04
> -#define READ_BLOCK_LIMITS 0x05
> -#define REASSIGN_BLOCKS 0x07
> -#define INITIALIZE_ELEMENT_STATUS 0x07
> -#define READ_6 0x08
> -#define WRITE_6 0x0a
> -#define SEEK_6 0x0b
> -#define READ_REVERSE 0x0f
> -#define WRITE_FILEMARKS 0x10
> -#define SPACE 0x11
> -#define INQUIRY 0x12
> -#define RECOVER_BUFFERED_DATA 0x14
> -#define MODE_SELECT 0x15
> -#define RESERVE 0x16
> -#define RELEASE 0x17
> -#define COPY 0x18
> -#define ERASE 0x19
> -#define MODE_SENSE 0x1a
> -#define START_STOP 0x1b
> -#define RECEIVE_DIAGNOSTIC 0x1c
> -#define SEND_DIAGNOSTIC 0x1d
> -#define ALLOW_MEDIUM_REMOVAL 0x1e
> -
> -#define READ_FORMAT_CAPACITIES 0x23
> -#define SET_WINDOW 0x24
> -#define READ_CAPACITY 0x25
> -#define READ_10 0x28
> -#define WRITE_10 0x2a
> -#define SEEK_10 0x2b
> -#define POSITION_TO_ELEMENT 0x2b
> -#define WRITE_VERIFY 0x2e
> -#define VERIFY 0x2f
> -#define SEARCH_HIGH 0x30
> -#define SEARCH_EQUAL 0x31
> -#define SEARCH_LOW 0x32
> -#define SET_LIMITS 0x33
> -#define PRE_FETCH 0x34
> -#define READ_POSITION 0x34
> -#define SYNCHRONIZE_CACHE 0x35
> -#define LOCK_UNLOCK_CACHE 0x36
> -#define READ_DEFECT_DATA 0x37
> -#define MEDIUM_SCAN 0x38
> -#define COMPARE 0x39
> -#define COPY_VERIFY 0x3a
> -#define WRITE_BUFFER 0x3b
> -#define READ_BUFFER 0x3c
> -#define UPDATE_BLOCK 0x3d
> -#define READ_LONG 0x3e
> -#define WRITE_LONG 0x3f
> -#define CHANGE_DEFINITION 0x40
> -#define WRITE_SAME 0x41
> -#define UNMAP 0x42
> -#define READ_TOC 0x43
> -#define READ_HEADER 0x44
> -#define GET_EVENT_STATUS_NOTIFICATION 0x4a
> -#define LOG_SELECT 0x4c
> -#define LOG_SENSE 0x4d
> -#define XDWRITEREAD_10 0x53
> -#define MODE_SELECT_10 0x55
> -#define RESERVE_10 0x56
> -#define RELEASE_10 0x57
> -#define MODE_SENSE_10 0x5a
> -#define PERSISTENT_RESERVE_IN 0x5e
> -#define PERSISTENT_RESERVE_OUT 0x5f
> -#define VARIABLE_LENGTH_CMD 0x7f
> -#define REPORT_LUNS 0xa0
> -#define SECURITY_PROTOCOL_IN 0xa2
> -#define MAINTENANCE_IN 0xa3
> -#define MAINTENANCE_OUT 0xa4
> -#define MOVE_MEDIUM 0xa5
> -#define EXCHANGE_MEDIUM 0xa6
> -#define READ_12 0xa8
> -#define SERVICE_ACTION_OUT_12 0xa9
> -#define WRITE_12 0xaa
> -#define SERVICE_ACTION_IN_12 0xab
> -#define WRITE_VERIFY_12 0xae
> -#define VERIFY_12 0xaf
> -#define SEARCH_HIGH_12 0xb0
> -#define SEARCH_EQUAL_12 0xb1
> -#define SEARCH_LOW_12 0xb2
> -#define SECURITY_PROTOCOL_OUT 0xb5
> -#define READ_ELEMENT_STATUS 0xb8
> -#define SEND_VOLUME_TAG 0xb6
> -#define WRITE_LONG_2 0xea
> -#define EXTENDED_COPY 0x83
> -#define RECEIVE_COPY_RESULTS 0x84
> -#define ACCESS_CONTROL_IN 0x86
> -#define ACCESS_CONTROL_OUT 0x87
> -#define READ_16 0x88
> -#define WRITE_16 0x8a
> -#define READ_ATTRIBUTE 0x8c
> -#define WRITE_ATTRIBUTE 0x8d
> -#define VERIFY_16 0x8f
> -#define SYNCHRONIZE_CACHE_16 0x91
> -#define WRITE_SAME_16 0x93
> -#define SERVICE_ACTION_BIDIRECTIONAL 0x9d
> -#define SERVICE_ACTION_IN_16 0x9e
> -#define SERVICE_ACTION_OUT_16 0x9f
> -/* values for service action in */
> -#define SAI_READ_CAPACITY_16 0x10
> -#define SAI_GET_LBA_STATUS 0x12
> -/* values for VARIABLE_LENGTH_CMD service action codes
> - * see spc4r17 Section D.3.5, table D.7 and D.8 */
> -#define VLC_SA_RECEIVE_CREDENTIAL 0x1800
> -/* values for maintenance in */
> -#define MI_REPORT_IDENTIFYING_INFORMATION 0x05
> -#define MI_REPORT_TARGET_PGS 0x0a
> -#define MI_REPORT_ALIASES 0x0b
> -#define MI_REPORT_SUPPORTED_OPERATION_CODES 0x0c
> -#define MI_REPORT_SUPPORTED_TASK_MANAGEMENT_FUNCTIONS 0x0d
> -#define MI_REPORT_PRIORITY 0x0e
> -#define MI_REPORT_TIMESTAMP 0x0f
> -#define MI_MANAGEMENT_PROTOCOL_IN 0x10
> -/* value for MI_REPORT_TARGET_PGS ext header */
> -#define MI_EXT_HDR_PARAM_FMT 0x20
> -/* values for maintenance out */
> -#define MO_SET_IDENTIFYING_INFORMATION 0x06
> -#define MO_SET_TARGET_PGS 0x0a
> -#define MO_CHANGE_ALIASES 0x0b
> -#define MO_SET_PRIORITY 0x0e
> -#define MO_SET_TIMESTAMP 0x0f
> -#define MO_MANAGEMENT_PROTOCOL_OUT 0x10
> -/* values for variable length command */
> -#define XDREAD_32 0x03
> -#define XDWRITE_32 0x04
> -#define XPWRITE_32 0x06
> -#define XDWRITEREAD_32 0x07
> -#define READ_32 0x09
> -#define VERIFY_32 0x0a
> -#define WRITE_32 0x0b
> -#define WRITE_SAME_32 0x0d
> -
> -#define SERVICE_ACTION16(cdb) (cdb[1] & 0x1f)
> -#define SERVICE_ACTION32(cdb) ((cdb[8] << 8) | cdb[9])
> -
> -static const char *
> -scsi_trace_misc(struct trace_seq *, unsigned char *, int);
> -
> -static const char *
> -scsi_trace_rw6(struct trace_seq *p, unsigned char *cdb, int len)
> -{
> - const char *ret = p->buffer + p->len;
> - sector_t lba = 0, txlen = 0;
> -
> - lba |= ((cdb[1] & 0x1F) << 16);
> - lba |= (cdb[2] << 8);
> - lba |= cdb[3];
> - txlen = cdb[4];
> -
> - trace_seq_printf(p, "lba=%llu txlen=%llu",
> - (unsigned long long)lba, (unsigned long long)txlen);
> - trace_seq_putc(p, 0);
> - return ret;
> -}
> -
> -static const char *
> -scsi_trace_rw10(struct trace_seq *p, unsigned char *cdb, int len)
> -{
> - const char *ret = p->buffer + p->len;
> - sector_t lba = 0, txlen = 0;
> -
> - lba |= (cdb[2] << 24);
> - lba |= (cdb[3] << 16);
> - lba |= (cdb[4] << 8);
> - lba |= cdb[5];
> - txlen |= (cdb[7] << 8);
> - txlen |= cdb[8];
> -
> - trace_seq_printf(p, "lba=%llu txlen=%llu protect=%u",
> - (unsigned long long)lba, (unsigned long long)txlen,
> - cdb[1] >> 5);
> -
> - if (cdb[0] == WRITE_SAME)
> - trace_seq_printf(p, " unmap=%u", cdb[1] >> 3 & 1);
> -
> - trace_seq_putc(p, 0);
> - return ret;
> -}
> -
> -static const char *
> -scsi_trace_rw12(struct trace_seq *p, unsigned char *cdb, int len)
> -{
> - const char *ret = p->buffer + p->len;
> - sector_t lba = 0, txlen = 0;
> -
> - lba |= (cdb[2] << 24);
> - lba |= (cdb[3] << 16);
> - lba |= (cdb[4] << 8);
> - lba |= cdb[5];
> - txlen |= (cdb[6] << 24);
> - txlen |= (cdb[7] << 16);
> - txlen |= (cdb[8] << 8);
> - txlen |= cdb[9];
> -
> - trace_seq_printf(p, "lba=%llu txlen=%llu protect=%u",
> - (unsigned long long)lba, (unsigned long long)txlen,
> - cdb[1] >> 5);
> - trace_seq_putc(p, 0);
> - return ret;
> -}
> -
> -static const char *
> -scsi_trace_rw16(struct trace_seq *p, unsigned char *cdb, int len)
> -{
> - const char *ret = p->buffer + p->len;
> - sector_t lba = 0, txlen = 0;
> -
> - lba |= ((u64)cdb[2] << 56);
> - lba |= ((u64)cdb[3] << 48);
> - lba |= ((u64)cdb[4] << 40);
> - lba |= ((u64)cdb[5] << 32);
> - lba |= (cdb[6] << 24);
> - lba |= (cdb[7] << 16);
> - lba |= (cdb[8] << 8);
> - lba |= cdb[9];
> - txlen |= (cdb[10] << 24);
> - txlen |= (cdb[11] << 16);
> - txlen |= (cdb[12] << 8);
> - txlen |= cdb[13];
> -
> - trace_seq_printf(p, "lba=%llu txlen=%llu protect=%u",
> - (unsigned long long)lba, (unsigned long long)txlen,
> - cdb[1] >> 5);
> -
> - if (cdb[0] == WRITE_SAME_16)
> - trace_seq_printf(p, " unmap=%u", cdb[1] >> 3 & 1);
> -
> - trace_seq_putc(p, 0);
> - return ret;
> -}
> -
> -static const char *
> -scsi_trace_rw32(struct trace_seq *p, unsigned char *cdb, int len)
> -{
> - const char *ret = p->buffer + p->len, *cmd;
> - sector_t lba = 0, txlen = 0;
> - u32 ei_lbrt = 0;
> -
> - switch (SERVICE_ACTION32(cdb)) {
> - case READ_32:
> - cmd = "READ";
> - break;
> - case VERIFY_32:
> - cmd = "VERIFY";
> - break;
> - case WRITE_32:
> - cmd = "WRITE";
> - break;
> - case WRITE_SAME_32:
> - cmd = "WRITE_SAME";
> - break;
> - default:
> - trace_seq_printf(p, "UNKNOWN");
> - goto out;
> - }
> -
> - lba |= ((u64)cdb[12] << 56);
> - lba |= ((u64)cdb[13] << 48);
> - lba |= ((u64)cdb[14] << 40);
> - lba |= ((u64)cdb[15] << 32);
> - lba |= (cdb[16] << 24);
> - lba |= (cdb[17] << 16);
> - lba |= (cdb[18] << 8);
> - lba |= cdb[19];
> - ei_lbrt |= (cdb[20] << 24);
> - ei_lbrt |= (cdb[21] << 16);
> - ei_lbrt |= (cdb[22] << 8);
> - ei_lbrt |= cdb[23];
> - txlen |= (cdb[28] << 24);
> - txlen |= (cdb[29] << 16);
> - txlen |= (cdb[30] << 8);
> - txlen |= cdb[31];
> -
> - trace_seq_printf(p, "%s_32 lba=%llu txlen=%llu protect=%u ei_lbrt=%u",
> - cmd, (unsigned long long)lba,
> - (unsigned long long)txlen, cdb[10] >> 5, ei_lbrt);
> -
> - if (SERVICE_ACTION32(cdb) == WRITE_SAME_32)
> - trace_seq_printf(p, " unmap=%u", cdb[10] >> 3 & 1);
> -
> -out:
> - trace_seq_putc(p, 0);
> - return ret;
> -}
> -
> -static const char *
> -scsi_trace_unmap(struct trace_seq *p, unsigned char *cdb, int len)
> -{
> - const char *ret = p->buffer + p->len;
> - unsigned int regions = cdb[7] << 8 | cdb[8];
> -
> - trace_seq_printf(p, "regions=%u", (regions - 8) / 16);
> - trace_seq_putc(p, 0);
> - return ret;
> -}
> -
> -static const char *
> -scsi_trace_service_action_in(struct trace_seq *p, unsigned char *cdb, int len)
> -{
> - const char *ret = p->buffer + p->len, *cmd;
> - sector_t lba = 0;
> - u32 alloc_len = 0;
> -
> - switch (SERVICE_ACTION16(cdb)) {
> - case SAI_READ_CAPACITY_16:
> - cmd = "READ_CAPACITY_16";
> - break;
> - case SAI_GET_LBA_STATUS:
> - cmd = "GET_LBA_STATUS";
> - break;
> - default:
> - trace_seq_printf(p, "UNKNOWN");
> - goto out;
> - }
> -
> - lba |= ((u64)cdb[2] << 56);
> - lba |= ((u64)cdb[3] << 48);
> - lba |= ((u64)cdb[4] << 40);
> - lba |= ((u64)cdb[5] << 32);
> - lba |= (cdb[6] << 24);
> - lba |= (cdb[7] << 16);
> - lba |= (cdb[8] << 8);
> - lba |= cdb[9];
> - alloc_len |= (cdb[10] << 24);
> - alloc_len |= (cdb[11] << 16);
> - alloc_len |= (cdb[12] << 8);
> - alloc_len |= cdb[13];
> -
> - trace_seq_printf(p, "%s lba=%llu alloc_len=%u", cmd,
> - (unsigned long long)lba, alloc_len);
> -
> -out:
> - trace_seq_putc(p, 0);
> - return ret;
> -}
> -
> -static const char *
> -scsi_trace_varlen(struct trace_seq *p, unsigned char *cdb, int len)
> -{
> - switch (SERVICE_ACTION32(cdb)) {
> - case READ_32:
> - case VERIFY_32:
> - case WRITE_32:
> - case WRITE_SAME_32:
> - return scsi_trace_rw32(p, cdb, len);
> - default:
> - return scsi_trace_misc(p, cdb, len);
> - }
> -}
> -
> -static const char *
> -scsi_trace_misc(struct trace_seq *p, unsigned char *cdb, int len)
> -{
> - const char *ret = p->buffer + p->len;
> -
> - trace_seq_printf(p, "-");
> - trace_seq_putc(p, 0);
> - return ret;
> -}
> -
> -const char *
> -scsi_trace_parse_cdb(struct trace_seq *p, unsigned char *cdb, int len)
> -{
> - switch (cdb[0]) {
> - case READ_6:
> - case WRITE_6:
> - return scsi_trace_rw6(p, cdb, len);
> - case READ_10:
> - case VERIFY:
> - case WRITE_10:
> - case WRITE_SAME:
> - return scsi_trace_rw10(p, cdb, len);
> - case READ_12:
> - case VERIFY_12:
> - case WRITE_12:
> - return scsi_trace_rw12(p, cdb, len);
> - case READ_16:
> - case VERIFY_16:
> - case WRITE_16:
> - case WRITE_SAME_16:
> - return scsi_trace_rw16(p, cdb, len);
> - case UNMAP:
> - return scsi_trace_unmap(p, cdb, len);
> - case SERVICE_ACTION_IN_16:
> - return scsi_trace_service_action_in(p, cdb, len);
> - case VARIABLE_LENGTH_CMD:
> - return scsi_trace_varlen(p, cdb, len);
> - default:
> - return scsi_trace_misc(p, cdb, len);
> - }
> -}
> -
> -unsigned long long process_scsi_trace_parse_cdb(struct trace_seq *s,
> - unsigned long long *args)
> -{
> - scsi_trace_parse_cdb(s, (unsigned char *) (unsigned long) args[1], args[2]);
> - return 0;
> -}
> -
> -int TEP_PLUGIN_LOADER(struct tep_handle *tep)
> -{
> - tep_register_print_function(tep,
> - process_scsi_trace_parse_cdb,
> - TEP_FUNC_ARG_STRING,
> - "scsi_trace_parse_cdb",
> - TEP_FUNC_ARG_PTR,
> - TEP_FUNC_ARG_PTR,
> - TEP_FUNC_ARG_INT,
> - TEP_FUNC_ARG_VOID);
> - return 0;
> -}
> -
> -void TEP_PLUGIN_UNLOADER(struct tep_handle *tep)
> -{
> - tep_unregister_print_function(tep, process_scsi_trace_parse_cdb,
> - "scsi_trace_parse_cdb");
> -}
> diff --git a/tools/lib/traceevent/plugins/plugin_tlb.c b/tools/lib/traceevent/plugins/plugin_tlb.c
> deleted file mode 100644
> index 43657fb60504..000000000000
> --- a/tools/lib/traceevent/plugins/plugin_tlb.c
> +++ /dev/null
> @@ -1,66 +0,0 @@
> -// SPDX-License-Identifier: LGPL-2.1
> -/*
> - * Copyright (C) 2015 Red Hat Inc, Steven Rostedt <[email protected]>
> - */
> -#include <stdio.h>
> -#include <stdlib.h>
> -#include <string.h>
> -
> -#include "event-parse.h"
> -
> -enum tlb_flush_reason {
> - TLB_FLUSH_ON_TASK_SWITCH,
> - TLB_REMOTE_SHOOTDOWN,
> - TLB_LOCAL_SHOOTDOWN,
> - TLB_LOCAL_MM_SHOOTDOWN,
> - NR_TLB_FLUSH_REASONS,
> -};
> -
> -static int tlb_flush_handler(struct trace_seq *s, struct tep_record *record,
> - struct tep_event *event, void *context)
> -{
> - unsigned long long val;
> -
> - trace_seq_printf(s, "pages=");
> -
> - tep_print_num_field(s, "%ld", event, "pages", record, 1);
> -
> - if (tep_get_field_val(s, event, "reason", record, &val, 1) < 0)
> - return -1;
> -
> - trace_seq_puts(s, " reason=");
> -
> - switch (val) {
> - case TLB_FLUSH_ON_TASK_SWITCH:
> - trace_seq_puts(s, "flush on task switch");
> - break;
> - case TLB_REMOTE_SHOOTDOWN:
> - trace_seq_puts(s, "remote shootdown");
> - break;
> - case TLB_LOCAL_SHOOTDOWN:
> - trace_seq_puts(s, "local shootdown");
> - break;
> - case TLB_LOCAL_MM_SHOOTDOWN:
> - trace_seq_puts(s, "local mm shootdown");
> - break;
> - }
> -
> - trace_seq_printf(s, " (%lld)", val);
> -
> - return 0;
> -}
> -
> -int TEP_PLUGIN_LOADER(struct tep_handle *tep)
> -{
> - tep_register_event_handler(tep, -1, "tlb", "tlb_flush",
> - tlb_flush_handler, NULL);
> -
> - return 0;
> -}
> -
> -void TEP_PLUGIN_UNLOADER(struct tep_handle *tep)
> -{
> - tep_unregister_event_handler(tep, -1,
> - "tlb", "tlb_flush",
> - tlb_flush_handler, NULL);
> -}
> diff --git a/tools/lib/traceevent/plugins/plugin_xen.c b/tools/lib/traceevent/plugins/plugin_xen.c
> deleted file mode 100644
> index 993b208d0323..000000000000
> --- a/tools/lib/traceevent/plugins/plugin_xen.c
> +++ /dev/null
> @@ -1,138 +0,0 @@
> -// SPDX-License-Identifier: GPL-2.0
> -#include <stdio.h>
> -#include <stdlib.h>
> -#include <string.h>
> -#include "event-parse.h"
> -#include "trace-seq.h"
> -
> -#define __HYPERVISOR_set_trap_table 0
> -#define __HYPERVISOR_mmu_update 1
> -#define __HYPERVISOR_set_gdt 2
> -#define __HYPERVISOR_stack_switch 3
> -#define __HYPERVISOR_set_callbacks 4
> -#define __HYPERVISOR_fpu_taskswitch 5
> -#define __HYPERVISOR_sched_op_compat 6
> -#define __HYPERVISOR_dom0_op 7
> -#define __HYPERVISOR_set_debugreg 8
> -#define __HYPERVISOR_get_debugreg 9
> -#define __HYPERVISOR_update_descriptor 10
> -#define __HYPERVISOR_memory_op 12
> -#define __HYPERVISOR_multicall 13
> -#define __HYPERVISOR_update_va_mapping 14
> -#define __HYPERVISOR_set_timer_op 15
> -#define __HYPERVISOR_event_channel_op_compat 16
> -#define __HYPERVISOR_xen_version 17
> -#define __HYPERVISOR_console_io 18
> -#define __HYPERVISOR_physdev_op_compat 19
> -#define __HYPERVISOR_grant_table_op 20
> -#define __HYPERVISOR_vm_assist 21
> -#define __HYPERVISOR_update_va_mapping_otherdomain 22
> -#define __HYPERVISOR_iret 23 /* x86 only */
> -#define __HYPERVISOR_vcpu_op 24
> -#define __HYPERVISOR_set_segment_base 25 /* x86/64 only */
> -#define __HYPERVISOR_mmuext_op 26
> -#define __HYPERVISOR_acm_op 27
> -#define __HYPERVISOR_nmi_op 28
> -#define __HYPERVISOR_sched_op 29
> -#define __HYPERVISOR_callback_op 30
> -#define __HYPERVISOR_xenoprof_op 31
> -#define __HYPERVISOR_event_channel_op 32
> -#define __HYPERVISOR_physdev_op 33
> -#define __HYPERVISOR_hvm_op 34
> -#define __HYPERVISOR_tmem_op 38
> -
> -/* Architecture-specific hypercall definitions. */
> -#define __HYPERVISOR_arch_0 48
> -#define __HYPERVISOR_arch_1 49
> -#define __HYPERVISOR_arch_2 50
> -#define __HYPERVISOR_arch_3 51
> -#define __HYPERVISOR_arch_4 52
> -#define __HYPERVISOR_arch_5 53
> -#define __HYPERVISOR_arch_6 54
> -#define __HYPERVISOR_arch_7 55
> -
> -#define N(x) [__HYPERVISOR_##x] = "("#x")"
> -static const char *xen_hypercall_names[] = {
> - N(set_trap_table),
> - N(mmu_update),
> - N(set_gdt),
> - N(stack_switch),
> - N(set_callbacks),
> - N(fpu_taskswitch),
> - N(sched_op_compat),
> - N(dom0_op),
> - N(set_debugreg),
> - N(get_debugreg),
> - N(update_descriptor),
> - N(memory_op),
> - N(multicall),
> - N(update_va_mapping),
> - N(set_timer_op),
> - N(event_channel_op_compat),
> - N(xen_version),
> - N(console_io),
> - N(physdev_op_compat),
> - N(grant_table_op),
> - N(vm_assist),
> - N(update_va_mapping_otherdomain),
> - N(iret),
> - N(vcpu_op),
> - N(set_segment_base),
> - N(mmuext_op),
> - N(acm_op),
> - N(nmi_op),
> - N(sched_op),
> - N(callback_op),
> - N(xenoprof_op),
> - N(event_channel_op),
> - N(physdev_op),
> - N(hvm_op),
> -
> -/* Architecture-specific hypercall definitions. */
> - N(arch_0),
> - N(arch_1),
> - N(arch_2),
> - N(arch_3),
> - N(arch_4),
> - N(arch_5),
> - N(arch_6),
> - N(arch_7),
> -};
> -#undef N
> -
> -#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
> -
> -static const char *xen_hypercall_name(unsigned op)
> -{
> - if (op < ARRAY_SIZE(xen_hypercall_names) &&
> - xen_hypercall_names[op] != NULL)
> - return xen_hypercall_names[op];
> -
> - return "";
> -}
> -
> -unsigned long long process_xen_hypercall_name(struct trace_seq *s,
> - unsigned long long *args)
> -{
> - unsigned int op = args[0];
> -
> - trace_seq_printf(s, "%s", xen_hypercall_name(op));
> - return 0;
> -}
> -
> -int TEP_PLUGIN_LOADER(struct tep_handle *tep)
> -{
> - tep_register_print_function(tep,
> - process_xen_hypercall_name,
> - TEP_FUNC_ARG_STRING,
> - "xen_hypercall_name",
> - TEP_FUNC_ARG_INT,
> - TEP_FUNC_ARG_VOID);
> - return 0;
> -}
> -
> -void TEP_PLUGIN_UNLOADER(struct tep_handle *tep)
> -{
> - tep_unregister_print_function(tep, process_xen_hypercall_name,
> - "xen_hypercall_name");
> -}
> diff --git a/tools/lib/traceevent/tep_strerror.c b/tools/lib/traceevent/tep_strerror.c
> deleted file mode 100644
> index 4ac26445b2f6..000000000000
> --- a/tools/lib/traceevent/tep_strerror.c
> +++ /dev/null
> @@ -1,53 +0,0 @@
> -// SPDX-License-Identifier: LGPL-2.1
> -#undef _GNU_SOURCE
> -#include <string.h>
> -#include <stdio.h>
> -
> -#include "event-parse.h"
> -
> -#undef _PE
> -#define _PE(code, str) str
> -static const char * const tep_error_str[] = {
> - TEP_ERRORS
> -};
> -#undef _PE
> -
> -/*
> - * The tools so far have been using the strerror_r() GNU variant, that returns
> - * a string, be it the buffer passed or something else.
> - *
> - * But that, besides being tricky in cases where we expect that the function
> - * using strerror_r() returns the error formatted in a provided buffer (we have
> - * to check if it returned something else and copy that instead), breaks the
> - * build on systems not using glibc, like Alpine Linux, where musl libc is
> - * used.
> - *
> - * So, introduce yet another wrapper, str_error_r(), that has the GNU
> - * interface, but uses the portable XSI variant of strerror_r(), so that users
> - * rest asured that the provided buffer is used and it is what is returned.
> - */
> -int tep_strerror(struct tep_handle *tep __maybe_unused,
> - enum tep_errno errnum, char *buf, size_t buflen)
> -{
> - const char *msg;
> - int idx;
> -
> - if (!buflen)
> - return 0;
> -
> - if (errnum >= 0) {
> - int err = strerror_r(errnum, buf, buflen);
> - buf[buflen - 1] = 0;
> - return err;
> - }
> -
> - if (errnum <= __TEP_ERRNO__START ||
> - errnum >= __TEP_ERRNO__END)
> - return -1;
> -
> - idx = errnum - __TEP_ERRNO__START - 1;
> - msg = tep_error_str[idx];
> - snprintf(buf, buflen, "%s", msg);
> -
> - return 0;
> -}
> diff --git a/tools/lib/traceevent/trace-seq.c b/tools/lib/traceevent/trace-seq.c
> deleted file mode 100644
> index 8d5ecd2bf877..000000000000
> --- a/tools/lib/traceevent/trace-seq.c
> +++ /dev/null
> @@ -1,249 +0,0 @@
> -// SPDX-License-Identifier: LGPL-2.1
> -/*
> - * Copyright (C) 2009 Red Hat Inc, Steven Rostedt <[email protected]>
> - *
> - */
> -#include "trace-seq.h"
> -
> -#include <stdio.h>
> -#include <stdlib.h>
> -#include <string.h>
> -#include <stdarg.h>
> -
> -#include <asm/bug.h>
> -#include "event-parse.h"
> -#include "event-utils.h"
> -
> -/*
> - * The TRACE_SEQ_POISON is to catch the use of using
> - * a trace_seq structure after it was destroyed.
> - */
> -#define TRACE_SEQ_POISON ((void *)0xdeadbeef)
> -#define TRACE_SEQ_CHECK(s) \
> -do { \
> - if (WARN_ONCE((s)->buffer == TRACE_SEQ_POISON, \
> - "Usage of trace_seq after it was destroyed")) \
> - (s)->state = TRACE_SEQ__BUFFER_POISONED; \
> -} while (0)
> -
> -#define TRACE_SEQ_CHECK_RET_N(s, n) \
> -do { \
> - TRACE_SEQ_CHECK(s); \
> - if ((s)->state != TRACE_SEQ__GOOD) \
> - return n; \
> -} while (0)
> -
> -#define TRACE_SEQ_CHECK_RET(s) TRACE_SEQ_CHECK_RET_N(s, )
> -#define TRACE_SEQ_CHECK_RET0(s) TRACE_SEQ_CHECK_RET_N(s, 0)
> -
> -/**
> - * trace_seq_init - initialize the trace_seq structure
> - * @s: a pointer to the trace_seq structure to initialize
> - */
> -void trace_seq_init(struct trace_seq *s)
> -{
> - s->len = 0;
> - s->readpos = 0;
> - s->buffer_size = TRACE_SEQ_BUF_SIZE;
> - s->buffer = malloc(s->buffer_size);
> - if (s->buffer != NULL)
> - s->state = TRACE_SEQ__GOOD;
> - else
> - s->state = TRACE_SEQ__MEM_ALLOC_FAILED;
> -}
> -
> -/**
> - * trace_seq_reset - re-initialize the trace_seq structure
> - * @s: a pointer to the trace_seq structure to reset
> - */
> -void trace_seq_reset(struct trace_seq *s)
> -{
> - if (!s)
> - return;
> - TRACE_SEQ_CHECK(s);
> - s->len = 0;
> - s->readpos = 0;
> -}
> -
> -/**
> - * trace_seq_destroy - free up memory of a trace_seq
> - * @s: a pointer to the trace_seq to free the buffer
> - *
> - * Only frees the buffer, not the trace_seq struct itself.
> - */
> -void trace_seq_destroy(struct trace_seq *s)
> -{
> - if (!s)
> - return;
> - TRACE_SEQ_CHECK_RET(s);
> - free(s->buffer);
> - s->buffer = TRACE_SEQ_POISON;
> -}
> -
> -static void expand_buffer(struct trace_seq *s)
> -{
> - char *buf;
> -
> - buf = realloc(s->buffer, s->buffer_size + TRACE_SEQ_BUF_SIZE);
> - if (WARN_ONCE(!buf, "Can't allocate trace_seq buffer memory")) {
> - s->state = TRACE_SEQ__MEM_ALLOC_FAILED;
> - return;
> - }
> -
> - s->buffer = buf;
> - s->buffer_size += TRACE_SEQ_BUF_SIZE;
> -}
> -
> -/**
> - * trace_seq_printf - sequence printing of trace information
> - * @s: trace sequence descriptor
> - * @fmt: printf format string
> - *
> - * It returns 0 if the trace oversizes the buffer's free
> - * space, the number of characters printed, or a negative
> - * value in case of an error.
> - *
> - * The tracer may use either sequence operations or its own
> - * copy to user routines. To simplify formating of a trace
> - * trace_seq_printf is used to store strings into a special
> - * buffer (@s). Then the output may be either used by
> - * the sequencer or pulled into another buffer.
> - */
> -int
> -trace_seq_printf(struct trace_seq *s, const char *fmt, ...)
> -{
> - va_list ap;
> - int len;
> - int ret;
> -
> - try_again:
> - TRACE_SEQ_CHECK_RET0(s);
> -
> - len = (s->buffer_size - 1) - s->len;
> -
> - va_start(ap, fmt);
> - ret = vsnprintf(s->buffer + s->len, len, fmt, ap);
> - va_end(ap);
> -
> - if (ret >= len) {
> - expand_buffer(s);
> - goto try_again;
> - }
> -
> - if (ret > 0)
> - s->len += ret;
> -
> - return ret;
> -}
> -
> -/**
> - * trace_seq_vprintf - sequence printing of trace information
> - * @s: trace sequence descriptor
> - * @fmt: printf format string
> - *
> - * It returns 0 if the trace oversizes the buffer's free
> - * space, the number of characters printed, or a negative
> - * value in case of an error.
> - * *
> - * The tracer may use either sequence operations or its own
> - * copy to user routines. To simplify formating of a trace
> - * trace_seq_printf is used to store strings into a special
> - * buffer (@s). Then the output may be either used by
> - * the sequencer or pulled into another buffer.
> - */
> -int
> -trace_seq_vprintf(struct trace_seq *s, const char *fmt, va_list args)
> -{
> - int len;
> - int ret;
> -
> - try_again:
> - TRACE_SEQ_CHECK_RET0(s);
> -
> - len = (s->buffer_size - 1) - s->len;
> -
> - ret = vsnprintf(s->buffer + s->len, len, fmt, args);
> -
> - if (ret >= len) {
> - expand_buffer(s);
> - goto try_again;
> - }
> -
> - if (ret > 0)
> - s->len += ret;
> -
> - return ret;
> -}
> -
> -/**
> - * trace_seq_puts - trace sequence printing of simple string
> - * @s: trace sequence descriptor
> - * @str: simple string to record
> - *
> - * The tracer may use either the sequence operations or its own
> - * copy to user routines. This function records a simple string
> - * into a special buffer (@s) for later retrieval by a sequencer
> - * or other mechanism.
> - */
> -int trace_seq_puts(struct trace_seq *s, const char *str)
> -{
> - int len;
> -
> - TRACE_SEQ_CHECK_RET0(s);
> -
> - len = strlen(str);
> -
> - while (len > ((s->buffer_size - 1) - s->len))
> - expand_buffer(s);
> -
> - TRACE_SEQ_CHECK_RET0(s);
> -
> - memcpy(s->buffer + s->len, str, len);
> - s->len += len;
> -
> - return len;
> -}
> -
> -int trace_seq_putc(struct trace_seq *s, unsigned char c)
> -{
> - TRACE_SEQ_CHECK_RET0(s);
> -
> - while (s->len >= (s->buffer_size - 1))
> - expand_buffer(s);
> -
> - TRACE_SEQ_CHECK_RET0(s);
> -
> - s->buffer[s->len++] = c;
> -
> - return 1;
> -}
> -
> -void trace_seq_terminate(struct trace_seq *s)
> -{
> - TRACE_SEQ_CHECK_RET(s);
> -
> - /* There's always one character left on the buffer */
> - s->buffer[s->len] = 0;
> -}
> -
> -int trace_seq_do_fprintf(struct trace_seq *s, FILE *fp)
> -{
> - TRACE_SEQ_CHECK(s);
> -
> - switch (s->state) {
> - case TRACE_SEQ__GOOD:
> - return fprintf(fp, "%.*s", s->len, s->buffer);
> - case TRACE_SEQ__BUFFER_POISONED:
> - fprintf(fp, "%s\n", "Usage of trace_seq after it was destroyed");
> - break;
> - case TRACE_SEQ__MEM_ALLOC_FAILED:
> - fprintf(fp, "%s\n", "Can't allocate trace_seq buffer memory");
> - break;
> - }
> - return -1;
> -}
> -
> -int trace_seq_do_printf(struct trace_seq *s)
> -{
> - return trace_seq_do_fprintf(s, stdout);
> -}
> diff --git a/tools/lib/traceevent/trace-seq.h b/tools/lib/traceevent/trace-seq.h
> deleted file mode 100644
> index d68ec69f8d1a..000000000000
> --- a/tools/lib/traceevent/trace-seq.h
> +++ /dev/null
> @@ -1,55 +0,0 @@
> -// SPDX-License-Identifier: LGPL-2.1
> -/*
> - * Copyright (C) 2009, 2010 Red Hat Inc, Steven Rostedt <[email protected]>
> - *
> - */
> -
> -#ifndef _TRACE_SEQ_H
> -#define _TRACE_SEQ_H
> -
> -#include <stdarg.h>
> -#include <stdio.h>
> -
> -/* ----------------------- trace_seq ----------------------- */
> -
> -#ifndef TRACE_SEQ_BUF_SIZE
> -#define TRACE_SEQ_BUF_SIZE 4096
> -#endif
> -
> -enum trace_seq_fail {
> - TRACE_SEQ__GOOD,
> - TRACE_SEQ__BUFFER_POISONED,
> - TRACE_SEQ__MEM_ALLOC_FAILED,
> -};
> -
> -/*
> - * Trace sequences are used to allow a function to call several other functions
> - * to create a string of data to use (up to a max of PAGE_SIZE).
> - */
> -
> -struct trace_seq {
> - char *buffer;
> - unsigned int buffer_size;
> - unsigned int len;
> - unsigned int readpos;
> - enum trace_seq_fail state;
> -};
> -
> -void trace_seq_init(struct trace_seq *s);
> -void trace_seq_reset(struct trace_seq *s);
> -void trace_seq_destroy(struct trace_seq *s);
> -
> -extern int trace_seq_printf(struct trace_seq *s, const char *fmt, ...)
> - __attribute__ ((format (printf, 2, 3)));
> -extern int trace_seq_vprintf(struct trace_seq *s, const char *fmt, va_list args)
> - __attribute__ ((format (printf, 2, 0)));
> -
> -extern int trace_seq_puts(struct trace_seq *s, const char *str);
> -extern int trace_seq_putc(struct trace_seq *s, unsigned char c);
> -
> -extern void trace_seq_terminate(struct trace_seq *s);
> -
> -extern int trace_seq_do_fprintf(struct trace_seq *s, FILE *fp);
> -extern int trace_seq_do_printf(struct trace_seq *s);
> -
> -#endif /* _TRACE_SEQ_H */
> --
> 2.38.1.584.g0f3c55d4c2-goog

--

- Arnaldo

2022-12-12 20:36:57

by Arnaldo Carvalho de Melo

[permalink] [raw]
Subject: Re: [PATCH v2 4/4] tools lib traceevent: Remove libtraceevent

Em Mon, Dec 12, 2022 at 04:52:47PM -0300, Arnaldo Carvalho de Melo escreveu:
> Em Tue, Nov 29, 2022 at 10:29:35PM -0800, Ian Rogers escreveu:
> > libtraceevent is now out-of-date and it is better to depend on the
> > system version. Remove this code that is no longer depended upon by
> > any builds.
>
>
>
> Thanks, applied and Added Steven's Acked-by.

Had to add this to keep 'make perf-tar-src-pkg' working:

diff --git a/tools/perf/MANIFEST b/tools/perf/MANIFEST
index c8e8e05b4ff1f56f..1da7f4b91b4f8af5 100644
--- a/tools/perf/MANIFEST
+++ b/tools/perf/MANIFEST
@@ -3,7 +3,6 @@ tools/arch
tools/scripts
tools/build
tools/include
-tools/lib/traceevent
tools/lib/api
tools/lib/bpf
tools/lib/subcmd