All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 00/10] perf tools: Add support for CoreSight trace decoding
@ 2017-12-15 16:44 ` Mathieu Poirier
  0 siblings, 0 replies; 52+ messages in thread
From: Mathieu Poirier @ 2017-12-15 16:44 UTC (permalink / raw)
  To: acme
  Cc: peterz, mingo, alexander.shishkin, namhyung, adrian.hunter,
	mike.leach, suzuki.poulosi, tor, jolsa, mathieu.poirier,
	linux-kernel, linux-arm-kernel

This patchset adds support for per-thread CoreSight trace decoding from the
"perf report" interface.  It is largely modelled on what has been done for 
intelPT traces and currently targets the ETMv4 architecture.  Support for
cpu-wide scenarios and ETMv3/PTMv1.1 will follow shortly.

The trace decoding support is done using the Open CoreSight Decoding
Library (openCSD), a stand alone open source project available here [1].
Integration of the openCSD library with the perf tools follow what has
been done for other support libraries.  If the library has been installed
on a system the build scripts will include support for CoreSight trace
decoding:

...                          zlib: [ on  ]
...                          lzma: [ OFF ]
...                     get_cpuid: [ on  ]
...                           bpf: [ on  ]
...                    libopencsd: [ on  ] <------

Instructions on how to build and install the openCSD library are provided
in the HOWTO.md of the project repository.  We elected to keep the decoder
library independent of the kernel tree as it is also used outside of the
perf toolset and various non-linux projects.

The work applies cleanly to [2] and proper functionning of the feature
depends on this patch [3].

Review and comments would be greatly appreciated.

Regards,
Mathieu

[1]. https://github.com/Linaro/OpenCSD
[2]. git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git perf/core
[3]. https://lkml.org/lkml/2017/12/14/612

Mathieu Poirier (8):
  perf tools: Integrating the CoreSight decoding library
  perf tools: Add initial entry point for decoder CoreSight traces
  perf tools: Add decoder mechanic to support dumping trace data
  perf tools: Add support for decoding CoreSight trace data
  perf tools: Add functionality to communicate with the openCSD decoder
  pert tools: Add queue management functionality
  perf tools: Add full support for CoreSight trace decoding
  perf tools: Add mechanic to synthesise CoreSight trace packets

Tor Jeremiassen (2):
  perf tools: Add processing of coresight metadata
  MAINTAINERS: Adding entry for CoreSight trace decoding

 MAINTAINERS                                     |    3 +-
 tools/build/Makefile.feature                    |    6 +-
 tools/build/feature/Makefile                    |    6 +-
 tools/build/feature/test-all.c                  |    5 +
 tools/build/feature/test-libopencsd.c           |    8 +
 tools/perf/Makefile.config                      |   13 +
 tools/perf/util/Build                           |    6 +
 tools/perf/util/auxtrace.c                      |    2 +
 tools/perf/util/cs-etm-decoder/Build            |    1 +
 tools/perf/util/cs-etm-decoder/cs-etm-decoder.c |  513 ++++++++++++
 tools/perf/util/cs-etm-decoder/cs-etm-decoder.h |  105 +++
 tools/perf/util/cs-etm.c                        | 1023 +++++++++++++++++++++++
 tools/perf/util/cs-etm.h                        |   18 +
 13 files changed, 1705 insertions(+), 4 deletions(-)
 create mode 100644 tools/build/feature/test-libopencsd.c
 create mode 100644 tools/perf/util/cs-etm-decoder/Build
 create mode 100644 tools/perf/util/cs-etm-decoder/cs-etm-decoder.c
 create mode 100644 tools/perf/util/cs-etm-decoder/cs-etm-decoder.h
 create mode 100644 tools/perf/util/cs-etm.c

-- 
2.7.4

^ permalink raw reply	[flat|nested] 52+ messages in thread

* [PATCH 00/10] perf tools: Add support for CoreSight trace decoding
@ 2017-12-15 16:44 ` Mathieu Poirier
  0 siblings, 0 replies; 52+ messages in thread
From: Mathieu Poirier @ 2017-12-15 16:44 UTC (permalink / raw)
  To: linux-arm-kernel

This patchset adds support for per-thread CoreSight trace decoding from the
"perf report" interface.  It is largely modelled on what has been done for 
intelPT traces and currently targets the ETMv4 architecture.  Support for
cpu-wide scenarios and ETMv3/PTMv1.1 will follow shortly.

The trace decoding support is done using the Open CoreSight Decoding
Library (openCSD), a stand alone open source project available here [1].
Integration of the openCSD library with the perf tools follow what has
been done for other support libraries.  If the library has been installed
on a system the build scripts will include support for CoreSight trace
decoding:

...                          zlib: [ on  ]
...                          lzma: [ OFF ]
...                     get_cpuid: [ on  ]
...                           bpf: [ on  ]
...                    libopencsd: [ on  ] <------

Instructions on how to build and install the openCSD library are provided
in the HOWTO.md of the project repository.  We elected to keep the decoder
library independent of the kernel tree as it is also used outside of the
perf toolset and various non-linux projects.

The work applies cleanly to [2] and proper functionning of the feature
depends on this patch [3].

Review and comments would be greatly appreciated.

Regards,
Mathieu

[1]. https://github.com/Linaro/OpenCSD
[2]. git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git perf/core
[3]. https://lkml.org/lkml/2017/12/14/612

Mathieu Poirier (8):
  perf tools: Integrating the CoreSight decoding library
  perf tools: Add initial entry point for decoder CoreSight traces
  perf tools: Add decoder mechanic to support dumping trace data
  perf tools: Add support for decoding CoreSight trace data
  perf tools: Add functionality to communicate with the openCSD decoder
  pert tools: Add queue management functionality
  perf tools: Add full support for CoreSight trace decoding
  perf tools: Add mechanic to synthesise CoreSight trace packets

Tor Jeremiassen (2):
  perf tools: Add processing of coresight metadata
  MAINTAINERS: Adding entry for CoreSight trace decoding

 MAINTAINERS                                     |    3 +-
 tools/build/Makefile.feature                    |    6 +-
 tools/build/feature/Makefile                    |    6 +-
 tools/build/feature/test-all.c                  |    5 +
 tools/build/feature/test-libopencsd.c           |    8 +
 tools/perf/Makefile.config                      |   13 +
 tools/perf/util/Build                           |    6 +
 tools/perf/util/auxtrace.c                      |    2 +
 tools/perf/util/cs-etm-decoder/Build            |    1 +
 tools/perf/util/cs-etm-decoder/cs-etm-decoder.c |  513 ++++++++++++
 tools/perf/util/cs-etm-decoder/cs-etm-decoder.h |  105 +++
 tools/perf/util/cs-etm.c                        | 1023 +++++++++++++++++++++++
 tools/perf/util/cs-etm.h                        |   18 +
 13 files changed, 1705 insertions(+), 4 deletions(-)
 create mode 100644 tools/build/feature/test-libopencsd.c
 create mode 100644 tools/perf/util/cs-etm-decoder/Build
 create mode 100644 tools/perf/util/cs-etm-decoder/cs-etm-decoder.c
 create mode 100644 tools/perf/util/cs-etm-decoder/cs-etm-decoder.h
 create mode 100644 tools/perf/util/cs-etm.c

-- 
2.7.4

^ permalink raw reply	[flat|nested] 52+ messages in thread

* [PATCH 01/10] perf tools: Integrating the CoreSight decoding library
  2017-12-15 16:44 ` Mathieu Poirier
@ 2017-12-15 16:44   ` Mathieu Poirier
  -1 siblings, 0 replies; 52+ messages in thread
From: Mathieu Poirier @ 2017-12-15 16:44 UTC (permalink / raw)
  To: acme
  Cc: peterz, mingo, alexander.shishkin, namhyung, adrian.hunter,
	mike.leach, suzuki.poulosi, tor, jolsa, mathieu.poirier,
	linux-kernel, linux-arm-kernel

The Open CoreSight Decoding Library (openCSD) is a free and open
library to decode traces collected by the CoreSight hardware
infrastructure.

This patch adds the required mechanic to recognise the presence
of the openCSD library on a system and set up miscellaneous flags
to be used in the compilation of the trace decoding feature.

Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
---
 tools/build/Makefile.feature          |  6 ++++--
 tools/build/feature/Makefile          |  6 +++++-
 tools/build/feature/test-all.c        |  5 +++++
 tools/build/feature/test-libopencsd.c |  8 ++++++++
 tools/perf/Makefile.config            | 13 +++++++++++++
 5 files changed, 35 insertions(+), 3 deletions(-)
 create mode 100644 tools/build/feature/test-libopencsd.c

diff --git a/tools/build/Makefile.feature b/tools/build/Makefile.feature
index e52fcefee379..dc3d97b248ab 100644
--- a/tools/build/Makefile.feature
+++ b/tools/build/Makefile.feature
@@ -66,7 +66,8 @@ FEATURE_TESTS_BASIC :=                  \
         bpf                             \
         sched_getcpu			\
         sdt				\
-        setns
+        setns				\
+	libopencsd
 
 # FEATURE_TESTS_BASIC + FEATURE_TESTS_EXTRA is the complete list
 # of all feature tests
@@ -108,7 +109,8 @@ FEATURE_DISPLAY ?=              \
          zlib                   \
          lzma                   \
          get_cpuid              \
-         bpf
+         bpf			\
+	 libopencsd
 
 # Set FEATURE_CHECK_(C|LD)FLAGS-all for all FEATURE_TESTS features.
 # If in the future we need per-feature checks/flags for features not
diff --git a/tools/build/feature/Makefile b/tools/build/feature/Makefile
index cff38f342283..2aae2d3fb5f6 100644
--- a/tools/build/feature/Makefile
+++ b/tools/build/feature/Makefile
@@ -52,7 +52,8 @@ FILES=                                          \
          test-cxx.bin                           \
          test-jvmti.bin				\
          test-sched_getcpu.bin			\
-         test-setns.bin
+         test-setns.bin				\
+	 test-libopencsd.bin
 
 FILES := $(addprefix $(OUTPUT),$(FILES))
 
@@ -104,6 +105,9 @@ $(OUTPUT)test-sched_getcpu.bin:
 $(OUTPUT)test-setns.bin:
 	$(BUILD)
 
+$(OUTPUT)test-libopencsd.bin:
+	$(BUILD) -lopencsd_c_api
+
 DWARFLIBS := -ldw
 ifeq ($(findstring -static,${LDFLAGS}),-static)
 DWARFLIBS += -lelf -lebl -lz -llzma -lbz2
diff --git a/tools/build/feature/test-all.c b/tools/build/feature/test-all.c
index 6fdf83263ab7..38ab0fd7a74c 100644
--- a/tools/build/feature/test-all.c
+++ b/tools/build/feature/test-all.c
@@ -162,6 +162,10 @@
 # include "test-setns.c"
 #undef main
 
+#define main main_test_setns
+# include "test-libopencsd.c"
+#undef main
+
 int main(int argc, char *argv[])
 {
 	main_test_libpython();
@@ -199,6 +203,7 @@ int main(int argc, char *argv[])
 	main_test_sched_getcpu();
 	main_test_sdt();
 	main_test_setns();
+	main_test_libopencsd();
 
 	return 0;
 }
diff --git a/tools/build/feature/test-libopencsd.c b/tools/build/feature/test-libopencsd.c
new file mode 100644
index 000000000000..cd4fb99eb9d3
--- /dev/null
+++ b/tools/build/feature/test-libopencsd.c
@@ -0,0 +1,8 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#include <opencsd/c_api/opencsd_c_api.h>
+
+int main(void)
+{
+	(void)ocsd_get_version();
+	return 0;
+}
diff --git a/tools/perf/Makefile.config b/tools/perf/Makefile.config
index 79b117a03fd7..2d0b99f7b4e7 100644
--- a/tools/perf/Makefile.config
+++ b/tools/perf/Makefile.config
@@ -346,6 +346,19 @@ ifeq ($(feature-setns), 1)
   $(call detected,CONFIG_SETNS)
 endif
 
+ifeq ($(feature-libopencsd), 1)
+  CFLAGS += -DHAVE_CSTRACE_SUPPORT
+  LIBCSTRACE = -lopencsd_c_api -lopencsd
+  EXTLIBS += $(LIBCSTRACE)
+  $(call detected,CONFIG_LIBOPENCSD)
+  ifdef CSTRACE_RAW
+    CFLAGS += -DCS_DEBUG_RAW
+    ifeq (${CSTRACE_RAW}, packed)
+      CFLAGS += -DCS_RAW_PACKED
+    endif
+  endif
+endif
+
 ifndef NO_LIBELF
   CFLAGS += -DHAVE_LIBELF_SUPPORT
   EXTLIBS += -lelf
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 52+ messages in thread

* [PATCH 01/10] perf tools: Integrating the CoreSight decoding library
@ 2017-12-15 16:44   ` Mathieu Poirier
  0 siblings, 0 replies; 52+ messages in thread
From: Mathieu Poirier @ 2017-12-15 16:44 UTC (permalink / raw)
  To: linux-arm-kernel

The Open CoreSight Decoding Library (openCSD) is a free and open
library to decode traces collected by the CoreSight hardware
infrastructure.

This patch adds the required mechanic to recognise the presence
of the openCSD library on a system and set up miscellaneous flags
to be used in the compilation of the trace decoding feature.

Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
---
 tools/build/Makefile.feature          |  6 ++++--
 tools/build/feature/Makefile          |  6 +++++-
 tools/build/feature/test-all.c        |  5 +++++
 tools/build/feature/test-libopencsd.c |  8 ++++++++
 tools/perf/Makefile.config            | 13 +++++++++++++
 5 files changed, 35 insertions(+), 3 deletions(-)
 create mode 100644 tools/build/feature/test-libopencsd.c

diff --git a/tools/build/Makefile.feature b/tools/build/Makefile.feature
index e52fcefee379..dc3d97b248ab 100644
--- a/tools/build/Makefile.feature
+++ b/tools/build/Makefile.feature
@@ -66,7 +66,8 @@ FEATURE_TESTS_BASIC :=                  \
         bpf                             \
         sched_getcpu			\
         sdt				\
-        setns
+        setns				\
+	libopencsd
 
 # FEATURE_TESTS_BASIC + FEATURE_TESTS_EXTRA is the complete list
 # of all feature tests
@@ -108,7 +109,8 @@ FEATURE_DISPLAY ?=              \
          zlib                   \
          lzma                   \
          get_cpuid              \
-         bpf
+         bpf			\
+	 libopencsd
 
 # Set FEATURE_CHECK_(C|LD)FLAGS-all for all FEATURE_TESTS features.
 # If in the future we need per-feature checks/flags for features not
diff --git a/tools/build/feature/Makefile b/tools/build/feature/Makefile
index cff38f342283..2aae2d3fb5f6 100644
--- a/tools/build/feature/Makefile
+++ b/tools/build/feature/Makefile
@@ -52,7 +52,8 @@ FILES=                                          \
          test-cxx.bin                           \
          test-jvmti.bin				\
          test-sched_getcpu.bin			\
-         test-setns.bin
+         test-setns.bin				\
+	 test-libopencsd.bin
 
 FILES := $(addprefix $(OUTPUT),$(FILES))
 
@@ -104,6 +105,9 @@ $(OUTPUT)test-sched_getcpu.bin:
 $(OUTPUT)test-setns.bin:
 	$(BUILD)
 
+$(OUTPUT)test-libopencsd.bin:
+	$(BUILD) -lopencsd_c_api
+
 DWARFLIBS := -ldw
 ifeq ($(findstring -static,${LDFLAGS}),-static)
 DWARFLIBS += -lelf -lebl -lz -llzma -lbz2
diff --git a/tools/build/feature/test-all.c b/tools/build/feature/test-all.c
index 6fdf83263ab7..38ab0fd7a74c 100644
--- a/tools/build/feature/test-all.c
+++ b/tools/build/feature/test-all.c
@@ -162,6 +162,10 @@
 # include "test-setns.c"
 #undef main
 
+#define main main_test_setns
+# include "test-libopencsd.c"
+#undef main
+
 int main(int argc, char *argv[])
 {
 	main_test_libpython();
@@ -199,6 +203,7 @@ int main(int argc, char *argv[])
 	main_test_sched_getcpu();
 	main_test_sdt();
 	main_test_setns();
+	main_test_libopencsd();
 
 	return 0;
 }
diff --git a/tools/build/feature/test-libopencsd.c b/tools/build/feature/test-libopencsd.c
new file mode 100644
index 000000000000..cd4fb99eb9d3
--- /dev/null
+++ b/tools/build/feature/test-libopencsd.c
@@ -0,0 +1,8 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#include <opencsd/c_api/opencsd_c_api.h>
+
+int main(void)
+{
+	(void)ocsd_get_version();
+	return 0;
+}
diff --git a/tools/perf/Makefile.config b/tools/perf/Makefile.config
index 79b117a03fd7..2d0b99f7b4e7 100644
--- a/tools/perf/Makefile.config
+++ b/tools/perf/Makefile.config
@@ -346,6 +346,19 @@ ifeq ($(feature-setns), 1)
   $(call detected,CONFIG_SETNS)
 endif
 
+ifeq ($(feature-libopencsd), 1)
+  CFLAGS += -DHAVE_CSTRACE_SUPPORT
+  LIBCSTRACE = -lopencsd_c_api -lopencsd
+  EXTLIBS += $(LIBCSTRACE)
+  $(call detected,CONFIG_LIBOPENCSD)
+  ifdef CSTRACE_RAW
+    CFLAGS += -DCS_DEBUG_RAW
+    ifeq (${CSTRACE_RAW}, packed)
+      CFLAGS += -DCS_RAW_PACKED
+    endif
+  endif
+endif
+
 ifndef NO_LIBELF
   CFLAGS += -DHAVE_LIBELF_SUPPORT
   EXTLIBS += -lelf
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 52+ messages in thread

* [PATCH 02/10] perf tools: Add initial entry point for decoder CoreSight traces
  2017-12-15 16:44 ` Mathieu Poirier
@ 2017-12-15 16:44   ` Mathieu Poirier
  -1 siblings, 0 replies; 52+ messages in thread
From: Mathieu Poirier @ 2017-12-15 16:44 UTC (permalink / raw)
  To: acme
  Cc: peterz, mingo, alexander.shishkin, namhyung, adrian.hunter,
	mike.leach, suzuki.poulosi, tor, jolsa, mathieu.poirier,
	linux-kernel, linux-arm-kernel

This patch adds the entry point for CoreSight trace decoding, serving
as a jumping board for furhter expansions.

Co-authored-by: Tor Jeremiassen <tor@ti.com>
Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
---
 tools/perf/util/Build      |   5 ++
 tools/perf/util/auxtrace.c |   2 +
 tools/perf/util/cs-etm.c   | 213 +++++++++++++++++++++++++++++++++++++++++++++
 tools/perf/util/cs-etm.h   |  15 ++++
 4 files changed, 235 insertions(+)
 create mode 100644 tools/perf/util/cs-etm.c

diff --git a/tools/perf/util/Build b/tools/perf/util/Build
index a3de7916fe63..49d447ca8644 100644
--- a/tools/perf/util/Build
+++ b/tools/perf/util/Build
@@ -86,6 +86,11 @@ libperf-$(CONFIG_AUXTRACE) += auxtrace.o
 libperf-$(CONFIG_AUXTRACE) += intel-pt-decoder/
 libperf-$(CONFIG_AUXTRACE) += intel-pt.o
 libperf-$(CONFIG_AUXTRACE) += intel-bts.o
+
+ifdef CONFIG_LIBOPENCSD
+libperf-$(CONFIG_AUXTRACE) += cs-etm.o
+endif
+
 libperf-y += parse-branch-options.o
 libperf-y += dump-insn.o
 libperf-y += parse-regs-options.o
diff --git a/tools/perf/util/auxtrace.c b/tools/perf/util/auxtrace.c
index a33491416400..d07e31bd6120 100644
--- a/tools/perf/util/auxtrace.c
+++ b/tools/perf/util/auxtrace.c
@@ -55,6 +55,7 @@
 #include "debug.h"
 #include <subcmd/parse-options.h>
 
+#include "cs-etm.h"
 #include "intel-pt.h"
 #include "intel-bts.h"
 
@@ -914,6 +915,7 @@ int perf_event__process_auxtrace_info(struct perf_tool *tool __maybe_unused,
 	case PERF_AUXTRACE_INTEL_BTS:
 		return intel_bts_process_auxtrace_info(event, session);
 	case PERF_AUXTRACE_CS_ETM:
+		return cs_etm__process_auxtrace_info(event, session);
 	case PERF_AUXTRACE_UNKNOWN:
 	default:
 		return -EINVAL;
diff --git a/tools/perf/util/cs-etm.c b/tools/perf/util/cs-etm.c
new file mode 100644
index 000000000000..f47797101857
--- /dev/null
+++ b/tools/perf/util/cs-etm.c
@@ -0,0 +1,213 @@
+/*
+ * SPDX-License-Identifier: GPL-2.0
+ *
+ * Copyright(C) 2015-2018 Linaro Limited.
+ *
+ * Author: Tor Jeremiassen <tor@ti.com>
+ * Author: Mathieu Poirier <mathieu.poirier@linaro.org>
+ */
+
+#include <linux/bitops.h>
+#include <linux/err.h>
+#include <linux/kernel.h>
+#include <linux/log2.h>
+#include <linux/types.h>
+
+#include <stdlib.h>
+
+#include "auxtrace.h"
+#include "color.h"
+#include "cs-etm.h"
+#include "debug.h"
+#include "evlist.h"
+#include "intlist.h"
+#include "machine.h"
+#include "map.h"
+#include "perf.h"
+#include "thread.h"
+#include "thread_map.h"
+#include "thread-stack.h"
+#include "util.h"
+
+#define MAX_TIMESTAMP (~0ULL)
+
+struct cs_etm_auxtrace {
+	struct auxtrace auxtrace;
+	struct auxtrace_queues queues;
+	struct auxtrace_heap heap;
+	struct itrace_synth_opts synth_opts;
+	struct perf_session *session;
+	struct machine *machine;
+	struct thread *unknown_thread;
+
+	u8 timeless_decoding;
+	u8 snapshot_mode;
+	u8 data_queued;
+	u8 sample_branches;
+
+	int num_cpu;
+	u32 auxtrace_type;
+	u64 branches_sample_type;
+	u64 branches_id;
+	u64 **metadata;
+	u64 kernel_start;
+	unsigned int pmu_type;
+};
+
+struct cs_etm_queue {
+	struct cs_etm_auxtrace *etm;
+	struct thread *thread;
+	struct cs_etm_decoder *decoder;
+	struct auxtrace_buffer *buffer;
+	const struct cs_etm_state *state;
+	union perf_event *event_buf;
+	unsigned int queue_nr;
+	pid_t pid, tid;
+	int cpu;
+	u64 time;
+	u64 timestamp;
+	u64 offset;
+};
+
+static int cs_etm__flush_events(struct perf_session *session,
+				struct perf_tool *tool)
+{
+	(void) session;
+	(void) tool;
+	return 0;
+}
+
+static void cs_etm__free_queue(void *priv)
+{
+	struct cs_etm_queue *etmq = priv;
+
+	free(etmq);
+}
+
+static void cs_etm__free_events(struct perf_session *session)
+{
+	unsigned int i;
+	struct cs_etm_auxtrace *aux = container_of(session->auxtrace,
+						   struct cs_etm_auxtrace,
+						   auxtrace);
+	struct auxtrace_queues *queues = &aux->queues;
+
+	for (i = 0; i < queues->nr_queues; i++) {
+		cs_etm__free_queue(queues->queue_array[i].priv);
+		queues->queue_array[i].priv = NULL;
+	}
+
+	auxtrace_queues__free(queues);
+}
+
+static void cs_etm__free(struct perf_session *session)
+{
+	struct cs_etm_auxtrace *aux = container_of(session->auxtrace,
+						   struct cs_etm_auxtrace,
+						   auxtrace);
+	cs_etm__free_events(session);
+	session->auxtrace = NULL;
+
+	zfree(&aux);
+}
+
+static int cs_etm__process_event(struct perf_session *session,
+				 union perf_event *event,
+				 struct perf_sample *sample,
+				 struct perf_tool *tool)
+{
+	(void) session;
+	(void) event;
+	(void) sample;
+	(void) tool;
+	return 0;
+}
+
+static int cs_etm__process_auxtrace_event(struct perf_session *session,
+					  union perf_event *event,
+					  struct perf_tool *tool)
+{
+	(void) session;
+	(void) event;
+	(void) tool;
+	return 0;
+}
+
+static bool cs_etm__is_timeless_decoding(struct cs_etm_auxtrace *etm)
+{
+	struct perf_evsel *evsel;
+	struct perf_evlist *evlist = etm->session->evlist;
+	bool timeless_decoding = true;
+
+	/*
+	 * Circle through the list of event and complain if we find one
+	 * with the time bit set.
+	 */
+	evlist__for_each_entry(evlist, evsel) {
+		if ((evsel->attr.sample_type & PERF_SAMPLE_TIME))
+			timeless_decoding = false;
+	}
+
+	return timeless_decoding;
+}
+
+int cs_etm__process_auxtrace_info(union perf_event *event,
+				  struct perf_session *session)
+{
+	struct auxtrace_info_event *auxtrace_info = &event->auxtrace_info;
+	struct cs_etm_auxtrace *etm = NULL;
+	int event_header_size = sizeof(struct perf_event_header);
+	int info_header_size;
+	int total_size = auxtrace_info->header.size;
+	int err = 0;
+
+	/*
+	 * sizeof(auxtrace_info_event::type) +
+	 * sizeof(auxtrace_info_event::reserved) == 8
+	 */
+	info_header_size = 8;
+
+	if (total_size < (event_header_size + info_header_size))
+		return -EINVAL;
+
+	etm = zalloc(sizeof(*etm));
+
+	if (!etm)
+		err = -ENOMEM;
+
+	err = auxtrace_queues__init(&etm->queues);
+	if (err)
+		goto err_free_etm;
+
+	etm->session = session;
+	etm->machine = &session->machines.host;
+
+	etm->auxtrace_type = auxtrace_info->type;
+	etm->timeless_decoding = cs_etm__is_timeless_decoding(etm);
+
+	etm->auxtrace.process_event = cs_etm__process_event;
+	etm->auxtrace.process_auxtrace_event = cs_etm__process_auxtrace_event;
+	etm->auxtrace.flush_events = cs_etm__flush_events;
+	etm->auxtrace.free_events = cs_etm__free_events;
+	etm->auxtrace.free = cs_etm__free;
+	session->auxtrace = &etm->auxtrace;
+
+	if (dump_trace)
+		return 0;
+
+	err = auxtrace_queues__process_index(&etm->queues, session);
+	if (err)
+		goto err_free_queues;
+
+	etm->data_queued = etm->queues.populated;
+
+	return 0;
+
+err_free_queues:
+	auxtrace_queues__free(&etm->queues);
+	session->auxtrace = NULL;
+err_free_etm:
+	zfree(&etm);
+
+	return -EINVAL;
+}
diff --git a/tools/perf/util/cs-etm.h b/tools/perf/util/cs-etm.h
index 3cc6bc3263fe..5ab6a8ef1b32 100644
--- a/tools/perf/util/cs-etm.h
+++ b/tools/perf/util/cs-etm.h
@@ -18,6 +18,9 @@
 #ifndef INCLUDE__UTIL_PERF_CS_ETM_H__
 #define INCLUDE__UTIL_PERF_CS_ETM_H__
 
+#include "util/event.h"
+#include "util/session.h"
+
 /* Versionning header in case things need tro change in the future.  That way
  * decoding of old snapshot is still possible.
  */
@@ -71,4 +74,16 @@ static const u64 __perf_cs_etmv4_magic   = 0x4040404040404040ULL;
 #define CS_ETMV3_PRIV_SIZE (CS_ETM_PRIV_MAX * sizeof(u64))
 #define CS_ETMV4_PRIV_SIZE (CS_ETMV4_PRIV_MAX * sizeof(u64))
 
+#ifdef HAVE_CSTRACE_SUPPORT
+int cs_etm__process_auxtrace_info(union perf_event *event,
+				  struct perf_session *session);
+#else
+static inline int
+cs_etm__process_auxtrace_info(union perf_event *event __maybe_unused,
+			      struct perf_session *session __maybe_unused)
+{
+	return -1;
+}
+#endif
+
 #endif
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 52+ messages in thread

* [PATCH 02/10] perf tools: Add initial entry point for decoder CoreSight traces
@ 2017-12-15 16:44   ` Mathieu Poirier
  0 siblings, 0 replies; 52+ messages in thread
From: Mathieu Poirier @ 2017-12-15 16:44 UTC (permalink / raw)
  To: linux-arm-kernel

This patch adds the entry point for CoreSight trace decoding, serving
as a jumping board for furhter expansions.

Co-authored-by: Tor Jeremiassen <tor@ti.com>
Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
---
 tools/perf/util/Build      |   5 ++
 tools/perf/util/auxtrace.c |   2 +
 tools/perf/util/cs-etm.c   | 213 +++++++++++++++++++++++++++++++++++++++++++++
 tools/perf/util/cs-etm.h   |  15 ++++
 4 files changed, 235 insertions(+)
 create mode 100644 tools/perf/util/cs-etm.c

diff --git a/tools/perf/util/Build b/tools/perf/util/Build
index a3de7916fe63..49d447ca8644 100644
--- a/tools/perf/util/Build
+++ b/tools/perf/util/Build
@@ -86,6 +86,11 @@ libperf-$(CONFIG_AUXTRACE) += auxtrace.o
 libperf-$(CONFIG_AUXTRACE) += intel-pt-decoder/
 libperf-$(CONFIG_AUXTRACE) += intel-pt.o
 libperf-$(CONFIG_AUXTRACE) += intel-bts.o
+
+ifdef CONFIG_LIBOPENCSD
+libperf-$(CONFIG_AUXTRACE) += cs-etm.o
+endif
+
 libperf-y += parse-branch-options.o
 libperf-y += dump-insn.o
 libperf-y += parse-regs-options.o
diff --git a/tools/perf/util/auxtrace.c b/tools/perf/util/auxtrace.c
index a33491416400..d07e31bd6120 100644
--- a/tools/perf/util/auxtrace.c
+++ b/tools/perf/util/auxtrace.c
@@ -55,6 +55,7 @@
 #include "debug.h"
 #include <subcmd/parse-options.h>
 
+#include "cs-etm.h"
 #include "intel-pt.h"
 #include "intel-bts.h"
 
@@ -914,6 +915,7 @@ int perf_event__process_auxtrace_info(struct perf_tool *tool __maybe_unused,
 	case PERF_AUXTRACE_INTEL_BTS:
 		return intel_bts_process_auxtrace_info(event, session);
 	case PERF_AUXTRACE_CS_ETM:
+		return cs_etm__process_auxtrace_info(event, session);
 	case PERF_AUXTRACE_UNKNOWN:
 	default:
 		return -EINVAL;
diff --git a/tools/perf/util/cs-etm.c b/tools/perf/util/cs-etm.c
new file mode 100644
index 000000000000..f47797101857
--- /dev/null
+++ b/tools/perf/util/cs-etm.c
@@ -0,0 +1,213 @@
+/*
+ * SPDX-License-Identifier: GPL-2.0
+ *
+ * Copyright(C) 2015-2018 Linaro Limited.
+ *
+ * Author: Tor Jeremiassen <tor@ti.com>
+ * Author: Mathieu Poirier <mathieu.poirier@linaro.org>
+ */
+
+#include <linux/bitops.h>
+#include <linux/err.h>
+#include <linux/kernel.h>
+#include <linux/log2.h>
+#include <linux/types.h>
+
+#include <stdlib.h>
+
+#include "auxtrace.h"
+#include "color.h"
+#include "cs-etm.h"
+#include "debug.h"
+#include "evlist.h"
+#include "intlist.h"
+#include "machine.h"
+#include "map.h"
+#include "perf.h"
+#include "thread.h"
+#include "thread_map.h"
+#include "thread-stack.h"
+#include "util.h"
+
+#define MAX_TIMESTAMP (~0ULL)
+
+struct cs_etm_auxtrace {
+	struct auxtrace auxtrace;
+	struct auxtrace_queues queues;
+	struct auxtrace_heap heap;
+	struct itrace_synth_opts synth_opts;
+	struct perf_session *session;
+	struct machine *machine;
+	struct thread *unknown_thread;
+
+	u8 timeless_decoding;
+	u8 snapshot_mode;
+	u8 data_queued;
+	u8 sample_branches;
+
+	int num_cpu;
+	u32 auxtrace_type;
+	u64 branches_sample_type;
+	u64 branches_id;
+	u64 **metadata;
+	u64 kernel_start;
+	unsigned int pmu_type;
+};
+
+struct cs_etm_queue {
+	struct cs_etm_auxtrace *etm;
+	struct thread *thread;
+	struct cs_etm_decoder *decoder;
+	struct auxtrace_buffer *buffer;
+	const struct cs_etm_state *state;
+	union perf_event *event_buf;
+	unsigned int queue_nr;
+	pid_t pid, tid;
+	int cpu;
+	u64 time;
+	u64 timestamp;
+	u64 offset;
+};
+
+static int cs_etm__flush_events(struct perf_session *session,
+				struct perf_tool *tool)
+{
+	(void) session;
+	(void) tool;
+	return 0;
+}
+
+static void cs_etm__free_queue(void *priv)
+{
+	struct cs_etm_queue *etmq = priv;
+
+	free(etmq);
+}
+
+static void cs_etm__free_events(struct perf_session *session)
+{
+	unsigned int i;
+	struct cs_etm_auxtrace *aux = container_of(session->auxtrace,
+						   struct cs_etm_auxtrace,
+						   auxtrace);
+	struct auxtrace_queues *queues = &aux->queues;
+
+	for (i = 0; i < queues->nr_queues; i++) {
+		cs_etm__free_queue(queues->queue_array[i].priv);
+		queues->queue_array[i].priv = NULL;
+	}
+
+	auxtrace_queues__free(queues);
+}
+
+static void cs_etm__free(struct perf_session *session)
+{
+	struct cs_etm_auxtrace *aux = container_of(session->auxtrace,
+						   struct cs_etm_auxtrace,
+						   auxtrace);
+	cs_etm__free_events(session);
+	session->auxtrace = NULL;
+
+	zfree(&aux);
+}
+
+static int cs_etm__process_event(struct perf_session *session,
+				 union perf_event *event,
+				 struct perf_sample *sample,
+				 struct perf_tool *tool)
+{
+	(void) session;
+	(void) event;
+	(void) sample;
+	(void) tool;
+	return 0;
+}
+
+static int cs_etm__process_auxtrace_event(struct perf_session *session,
+					  union perf_event *event,
+					  struct perf_tool *tool)
+{
+	(void) session;
+	(void) event;
+	(void) tool;
+	return 0;
+}
+
+static bool cs_etm__is_timeless_decoding(struct cs_etm_auxtrace *etm)
+{
+	struct perf_evsel *evsel;
+	struct perf_evlist *evlist = etm->session->evlist;
+	bool timeless_decoding = true;
+
+	/*
+	 * Circle through the list of event and complain if we find one
+	 * with the time bit set.
+	 */
+	evlist__for_each_entry(evlist, evsel) {
+		if ((evsel->attr.sample_type & PERF_SAMPLE_TIME))
+			timeless_decoding = false;
+	}
+
+	return timeless_decoding;
+}
+
+int cs_etm__process_auxtrace_info(union perf_event *event,
+				  struct perf_session *session)
+{
+	struct auxtrace_info_event *auxtrace_info = &event->auxtrace_info;
+	struct cs_etm_auxtrace *etm = NULL;
+	int event_header_size = sizeof(struct perf_event_header);
+	int info_header_size;
+	int total_size = auxtrace_info->header.size;
+	int err = 0;
+
+	/*
+	 * sizeof(auxtrace_info_event::type) +
+	 * sizeof(auxtrace_info_event::reserved) == 8
+	 */
+	info_header_size = 8;
+
+	if (total_size < (event_header_size + info_header_size))
+		return -EINVAL;
+
+	etm = zalloc(sizeof(*etm));
+
+	if (!etm)
+		err = -ENOMEM;
+
+	err = auxtrace_queues__init(&etm->queues);
+	if (err)
+		goto err_free_etm;
+
+	etm->session = session;
+	etm->machine = &session->machines.host;
+
+	etm->auxtrace_type = auxtrace_info->type;
+	etm->timeless_decoding = cs_etm__is_timeless_decoding(etm);
+
+	etm->auxtrace.process_event = cs_etm__process_event;
+	etm->auxtrace.process_auxtrace_event = cs_etm__process_auxtrace_event;
+	etm->auxtrace.flush_events = cs_etm__flush_events;
+	etm->auxtrace.free_events = cs_etm__free_events;
+	etm->auxtrace.free = cs_etm__free;
+	session->auxtrace = &etm->auxtrace;
+
+	if (dump_trace)
+		return 0;
+
+	err = auxtrace_queues__process_index(&etm->queues, session);
+	if (err)
+		goto err_free_queues;
+
+	etm->data_queued = etm->queues.populated;
+
+	return 0;
+
+err_free_queues:
+	auxtrace_queues__free(&etm->queues);
+	session->auxtrace = NULL;
+err_free_etm:
+	zfree(&etm);
+
+	return -EINVAL;
+}
diff --git a/tools/perf/util/cs-etm.h b/tools/perf/util/cs-etm.h
index 3cc6bc3263fe..5ab6a8ef1b32 100644
--- a/tools/perf/util/cs-etm.h
+++ b/tools/perf/util/cs-etm.h
@@ -18,6 +18,9 @@
 #ifndef INCLUDE__UTIL_PERF_CS_ETM_H__
 #define INCLUDE__UTIL_PERF_CS_ETM_H__
 
+#include "util/event.h"
+#include "util/session.h"
+
 /* Versionning header in case things need tro change in the future.  That way
  * decoding of old snapshot is still possible.
  */
@@ -71,4 +74,16 @@ static const u64 __perf_cs_etmv4_magic   = 0x4040404040404040ULL;
 #define CS_ETMV3_PRIV_SIZE (CS_ETM_PRIV_MAX * sizeof(u64))
 #define CS_ETMV4_PRIV_SIZE (CS_ETMV4_PRIV_MAX * sizeof(u64))
 
+#ifdef HAVE_CSTRACE_SUPPORT
+int cs_etm__process_auxtrace_info(union perf_event *event,
+				  struct perf_session *session);
+#else
+static inline int
+cs_etm__process_auxtrace_info(union perf_event *event __maybe_unused,
+			      struct perf_session *session __maybe_unused)
+{
+	return -1;
+}
+#endif
+
 #endif
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 52+ messages in thread

* [PATCH 03/10] perf tools: Add processing of coresight metadata
  2017-12-15 16:44 ` Mathieu Poirier
@ 2017-12-15 16:44   ` Mathieu Poirier
  -1 siblings, 0 replies; 52+ messages in thread
From: Mathieu Poirier @ 2017-12-15 16:44 UTC (permalink / raw)
  To: acme
  Cc: peterz, mingo, alexander.shishkin, namhyung, adrian.hunter,
	mike.leach, suzuki.poulosi, tor, jolsa, mathieu.poirier,
	linux-kernel, linux-arm-kernel

From: Tor Jeremiassen <tor@ti.com>

The auxtrace_info section contains metadata that describes the number of
trace capable CPUs, their ETM version and trace configuration, including
trace id values. This information is required by the trace decoder in
order to properly decode the compressed trace packets. This patch adds
code to read and parse this metadata, and store it for use in configuring
instances of the cs-etm trace decoder.

Co-authored-by: Mathieu Poirier <mathieu.poirier@linaro.org>
Signed-off-by: Tor Jeremiassen <tor@ti.com>
---
 tools/perf/util/cs-etm.c | 194 ++++++++++++++++++++++++++++++++++++++++++++++-
 tools/perf/util/cs-etm.h |   3 +
 2 files changed, 194 insertions(+), 3 deletions(-)

diff --git a/tools/perf/util/cs-etm.c b/tools/perf/util/cs-etm.c
index f47797101857..18894ee7aa0b 100644
--- a/tools/perf/util/cs-etm.c
+++ b/tools/perf/util/cs-etm.c
@@ -102,12 +102,24 @@ static void cs_etm__free_events(struct perf_session *session)
 
 static void cs_etm__free(struct perf_session *session)
 {
+	int i;
+	struct int_node *inode, *tmp;
 	struct cs_etm_auxtrace *aux = container_of(session->auxtrace,
 						   struct cs_etm_auxtrace,
 						   auxtrace);
 	cs_etm__free_events(session);
 	session->auxtrace = NULL;
 
+	/* First remove all traceID/CPU# nodes for the RB tree */
+	intlist__for_each_entry_safe(inode, tmp, traceid_list)
+		intlist__remove(traceid_list, inode);
+	/* Then the RB tree itself */
+	intlist__delete(traceid_list);
+
+	for (i = 0; i < aux->num_cpu; i++)
+		zfree(&aux->metadata[i]);
+
+	zfree(&aux->metadata);
 	zfree(&aux);
 }
 
@@ -151,15 +163,69 @@ static bool cs_etm__is_timeless_decoding(struct cs_etm_auxtrace *etm)
 	return timeless_decoding;
 }
 
+static const char * const cs_etm_global_header_fmts[] = {
+	[CS_HEADER_VERSION_0]	= "	Header version		       %llx\n",
+	[CS_PMU_TYPE_CPUS]	= "	PMU type/num cpus	       %llx\n",
+	[CS_ETM_SNAPSHOT]	= "	Snapshot		       %llx\n",
+};
+
+static const char * const cs_etm_priv_fmts[] = {
+	[CS_ETM_MAGIC]		= "	Magic number		       %llx\n",
+	[CS_ETM_CPU]		= "	CPU			       %lld\n",
+	[CS_ETM_ETMCR]		= "	ETMCR			       %llx\n",
+	[CS_ETM_ETMTRACEIDR]	= "	ETMTRACEIDR		       %llx\n",
+	[CS_ETM_ETMCCER]	= "	ETMCCER			       %llx\n",
+	[CS_ETM_ETMIDR]		= "	ETMIDR			       %llx\n",
+};
+
+static const char * const cs_etmv4_priv_fmts[] = {
+	[CS_ETM_MAGIC]		= "	Magic number		       %llx\n",
+	[CS_ETM_CPU]		= "	CPU			       %lld\n",
+	[CS_ETMV4_TRCCONFIGR]	= "	TRCCONFIGR		       %llx\n",
+	[CS_ETMV4_TRCTRACEIDR]	= "	TRCTRACEIDR		       %llx\n",
+	[CS_ETMV4_TRCIDR0]	= "	TRCIDR0			       %llx\n",
+	[CS_ETMV4_TRCIDR1]	= "	TRCIDR1			       %llx\n",
+	[CS_ETMV4_TRCIDR2]	= "	TRCIDR2			       %llx\n",
+	[CS_ETMV4_TRCIDR8]	= "	TRCIDR8			       %llx\n",
+	[CS_ETMV4_TRCAUTHSTATUS] = "	TRCAUTHSTATUS		       %llx\n",
+};
+
+static void cs_etm__print_auxtrace_info(u64 *val, int num)
+{
+	int i, j, cpu = 0;
+
+	for (i = 0; i < CS_HEADER_VERSION_0_MAX; i++)
+		fprintf(stdout, cs_etm_global_header_fmts[i], val[i]);
+
+	for (i = CS_HEADER_VERSION_0_MAX; cpu < num; cpu++) {
+		if (val[i] == __perf_cs_etmv3_magic)
+			for (j = 0; j < CS_ETM_PRIV_MAX; j++, i++)
+				fprintf(stdout, cs_etm_priv_fmts[j], val[i]);
+		else if (val[i] == __perf_cs_etmv4_magic)
+			for (j = 0; j < CS_ETMV4_PRIV_MAX; j++, i++)
+				fprintf(stdout, cs_etmv4_priv_fmts[j], val[i]);
+		else
+			/* failure.. return */
+			return;
+	}
+}
+
 int cs_etm__process_auxtrace_info(union perf_event *event,
 				  struct perf_session *session)
 {
 	struct auxtrace_info_event *auxtrace_info = &event->auxtrace_info;
 	struct cs_etm_auxtrace *etm = NULL;
+	struct int_node *inode;
+	unsigned int pmu_type;
 	int event_header_size = sizeof(struct perf_event_header);
 	int info_header_size;
 	int total_size = auxtrace_info->header.size;
-	int err = 0;
+	int priv_size = 0;
+	int num_cpu;
+	int err = 0, idx = -1;
+	int i, j, k;
+	u64 *ptr, *hdr = NULL;
+	u64 **metadata = NULL;
 
 	/*
 	 * sizeof(auxtrace_info_event::type) +
@@ -170,10 +236,117 @@ int cs_etm__process_auxtrace_info(union perf_event *event,
 	if (total_size < (event_header_size + info_header_size))
 		return -EINVAL;
 
+	priv_size = total_size - event_header_size - info_header_size;
+
+	/* First the global part */
+	ptr = (u64 *) auxtrace_info->priv;
+
+	/* Look for version '0' of the header */
+	if (ptr[0] != 0)
+		return -EINVAL;
+
+	hdr = zalloc(sizeof(*hdr) * CS_HEADER_VERSION_0_MAX);
+	if (!hdr)
+		return -ENOMEM;
+
+	/* Extract header information - see cs-etm.h for format */
+	for (i = 0; i < CS_HEADER_VERSION_0_MAX; i++)
+		hdr[i] = ptr[i];
+	num_cpu = hdr[CS_PMU_TYPE_CPUS] & 0xffffffff;
+	pmu_type = (unsigned int) ((hdr[CS_PMU_TYPE_CPUS] >> 32) &
+				    0xffffffff);
+
+	/*
+	 * Create an RB tree for traceID-CPU# tuple. Since the conversion has
+	 * to be made for each packet that gets decoded, optimizing access in
+	 * anything other than a sequential array is worth doing.
+	 */
+	traceid_list = intlist__new(NULL);
+	if (!traceid_list) {
+		err = -ENOMEM;
+		goto err_free_hdr;
+	}
+
+	metadata = zalloc(sizeof(*metadata) * num_cpu);
+	if (!metadata) {
+		err = -ENOMEM;
+		goto err_free_traceid_list;
+	}
+
+	/*
+	 * The metadata is stored in the auxtrace_info section and encodes
+	 * the configuration of the ARM embedded trace macrocell which is
+	 * required by the trace decoder to properly decode the trace due
+	 * to its highly compressed nature.
+	 */
+	for (j = 0; j < num_cpu; j++) {
+		if (ptr[i] == __perf_cs_etmv3_magic) {
+			metadata[j] = zalloc(sizeof(*metadata[j]) *
+					     CS_ETM_PRIV_MAX);
+			if (!metadata[j]) {
+				err = -ENOMEM;
+				goto err_free_metadata;
+			}
+			for (k = 0; k < CS_ETM_PRIV_MAX; k++)
+				metadata[j][k] = ptr[i + k];
+
+			/* The traceID is our handle */
+			idx = metadata[j][CS_ETM_ETMTRACEIDR];
+			i += CS_ETM_PRIV_MAX;
+		} else if (ptr[i] == __perf_cs_etmv4_magic) {
+			metadata[j] = zalloc(sizeof(*metadata[j]) *
+					     CS_ETMV4_PRIV_MAX);
+			if (!metadata[j]) {
+				err = -ENOMEM;
+				goto err_free_metadata;
+			}
+			for (k = 0; k < CS_ETMV4_PRIV_MAX; k++)
+				metadata[j][k] = ptr[i + k];
+
+			/* The traceID is our handle */
+			idx = metadata[j][CS_ETMV4_TRCTRACEIDR];
+			i += CS_ETMV4_PRIV_MAX;
+		}
+
+		/* Get an RB node for this CPU */
+		inode = intlist__findnew(traceid_list, idx);
+
+		/* Something went wrong, no need to continue */
+		if (!inode) {
+			err = PTR_ERR(inode);
+			goto err_free_metadata;
+		}
+
+		/*
+		 * The node for that CPU should not be taken.
+		 * Back out if that's the case.
+		 */
+		if (inode->priv) {
+			err = -EINVAL;
+			goto err_free_metadata;
+		}
+		/* All good, associate the traceID with the CPU# */
+		inode->priv = &metadata[j][CS_ETM_CPU];
+	}
+
+	/*
+	 * Each of CS_HEADER_VERSION_0_MAX, CS_ETM_PRIV_MAX and
+	 * CS_ETMV4_PRIV_MAX mark how many double words are in the
+	 * global metadata, and each cpu's metadata respectively.
+	 * The following tests if the correct number of double words was
+	 * present in the auxtrace info section.
+	 */
+	if (i * 8 != priv_size) {
+		err = -EINVAL;
+		goto err_free_metadata;
+	}
+
 	etm = zalloc(sizeof(*etm));
 
-	if (!etm)
+	if (!etm) {
 		err = -ENOMEM;
+		goto err_free_metadata;
+	}
 
 	err = auxtrace_queues__init(&etm->queues);
 	if (err)
@@ -182,6 +355,10 @@ int cs_etm__process_auxtrace_info(union perf_event *event,
 	etm->session = session;
 	etm->machine = &session->machines.host;
 
+	etm->num_cpu = num_cpu;
+	etm->pmu_type = pmu_type;
+	etm->snapshot_mode = (hdr[CS_ETM_SNAPSHOT] != 0);
+	etm->metadata = metadata;
 	etm->auxtrace_type = auxtrace_info->type;
 	etm->timeless_decoding = cs_etm__is_timeless_decoding(etm);
 
@@ -192,8 +369,10 @@ int cs_etm__process_auxtrace_info(union perf_event *event,
 	etm->auxtrace.free = cs_etm__free;
 	session->auxtrace = &etm->auxtrace;
 
-	if (dump_trace)
+	if (dump_trace) {
+		cs_etm__print_auxtrace_info(auxtrace_info->priv, num_cpu);
 		return 0;
+	}
 
 	err = auxtrace_queues__process_index(&etm->queues, session);
 	if (err)
@@ -208,6 +387,15 @@ int cs_etm__process_auxtrace_info(union perf_event *event,
 	session->auxtrace = NULL;
 err_free_etm:
 	zfree(&etm);
+err_free_metadata:
+	/* No need to check @metadata[j], free(NULL) is supported */
+	for (j = 0; j < num_cpu; j++)
+		free(metadata[j]);
+	zfree(&metadata);
+err_free_traceid_list:
+	intlist__delete(traceid_list);
+err_free_hdr:
+	zfree(&hdr);
 
 	return -EINVAL;
 }
diff --git a/tools/perf/util/cs-etm.h b/tools/perf/util/cs-etm.h
index 5ab6a8ef1b32..5864d5dca616 100644
--- a/tools/perf/util/cs-etm.h
+++ b/tools/perf/util/cs-etm.h
@@ -64,6 +64,9 @@ enum {
 	CS_ETMV4_PRIV_MAX,
 };
 
+/* RB tree for quick conversion between traceID and CPUs */
+struct intlist *traceid_list;
+
 #define KiB(x) ((x) * 1024)
 #define MiB(x) ((x) * 1024 * 1024)
 
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 52+ messages in thread

* [PATCH 03/10] perf tools: Add processing of coresight metadata
@ 2017-12-15 16:44   ` Mathieu Poirier
  0 siblings, 0 replies; 52+ messages in thread
From: Mathieu Poirier @ 2017-12-15 16:44 UTC (permalink / raw)
  To: linux-arm-kernel

From: Tor Jeremiassen <tor@ti.com>

The auxtrace_info section contains metadata that describes the number of
trace capable CPUs, their ETM version and trace configuration, including
trace id values. This information is required by the trace decoder in
order to properly decode the compressed trace packets. This patch adds
code to read and parse this metadata, and store it for use in configuring
instances of the cs-etm trace decoder.

Co-authored-by: Mathieu Poirier <mathieu.poirier@linaro.org>
Signed-off-by: Tor Jeremiassen <tor@ti.com>
---
 tools/perf/util/cs-etm.c | 194 ++++++++++++++++++++++++++++++++++++++++++++++-
 tools/perf/util/cs-etm.h |   3 +
 2 files changed, 194 insertions(+), 3 deletions(-)

diff --git a/tools/perf/util/cs-etm.c b/tools/perf/util/cs-etm.c
index f47797101857..18894ee7aa0b 100644
--- a/tools/perf/util/cs-etm.c
+++ b/tools/perf/util/cs-etm.c
@@ -102,12 +102,24 @@ static void cs_etm__free_events(struct perf_session *session)
 
 static void cs_etm__free(struct perf_session *session)
 {
+	int i;
+	struct int_node *inode, *tmp;
 	struct cs_etm_auxtrace *aux = container_of(session->auxtrace,
 						   struct cs_etm_auxtrace,
 						   auxtrace);
 	cs_etm__free_events(session);
 	session->auxtrace = NULL;
 
+	/* First remove all traceID/CPU# nodes for the RB tree */
+	intlist__for_each_entry_safe(inode, tmp, traceid_list)
+		intlist__remove(traceid_list, inode);
+	/* Then the RB tree itself */
+	intlist__delete(traceid_list);
+
+	for (i = 0; i < aux->num_cpu; i++)
+		zfree(&aux->metadata[i]);
+
+	zfree(&aux->metadata);
 	zfree(&aux);
 }
 
@@ -151,15 +163,69 @@ static bool cs_etm__is_timeless_decoding(struct cs_etm_auxtrace *etm)
 	return timeless_decoding;
 }
 
+static const char * const cs_etm_global_header_fmts[] = {
+	[CS_HEADER_VERSION_0]	= "	Header version		       %llx\n",
+	[CS_PMU_TYPE_CPUS]	= "	PMU type/num cpus	       %llx\n",
+	[CS_ETM_SNAPSHOT]	= "	Snapshot		       %llx\n",
+};
+
+static const char * const cs_etm_priv_fmts[] = {
+	[CS_ETM_MAGIC]		= "	Magic number		       %llx\n",
+	[CS_ETM_CPU]		= "	CPU			       %lld\n",
+	[CS_ETM_ETMCR]		= "	ETMCR			       %llx\n",
+	[CS_ETM_ETMTRACEIDR]	= "	ETMTRACEIDR		       %llx\n",
+	[CS_ETM_ETMCCER]	= "	ETMCCER			       %llx\n",
+	[CS_ETM_ETMIDR]		= "	ETMIDR			       %llx\n",
+};
+
+static const char * const cs_etmv4_priv_fmts[] = {
+	[CS_ETM_MAGIC]		= "	Magic number		       %llx\n",
+	[CS_ETM_CPU]		= "	CPU			       %lld\n",
+	[CS_ETMV4_TRCCONFIGR]	= "	TRCCONFIGR		       %llx\n",
+	[CS_ETMV4_TRCTRACEIDR]	= "	TRCTRACEIDR		       %llx\n",
+	[CS_ETMV4_TRCIDR0]	= "	TRCIDR0			       %llx\n",
+	[CS_ETMV4_TRCIDR1]	= "	TRCIDR1			       %llx\n",
+	[CS_ETMV4_TRCIDR2]	= "	TRCIDR2			       %llx\n",
+	[CS_ETMV4_TRCIDR8]	= "	TRCIDR8			       %llx\n",
+	[CS_ETMV4_TRCAUTHSTATUS] = "	TRCAUTHSTATUS		       %llx\n",
+};
+
+static void cs_etm__print_auxtrace_info(u64 *val, int num)
+{
+	int i, j, cpu = 0;
+
+	for (i = 0; i < CS_HEADER_VERSION_0_MAX; i++)
+		fprintf(stdout, cs_etm_global_header_fmts[i], val[i]);
+
+	for (i = CS_HEADER_VERSION_0_MAX; cpu < num; cpu++) {
+		if (val[i] == __perf_cs_etmv3_magic)
+			for (j = 0; j < CS_ETM_PRIV_MAX; j++, i++)
+				fprintf(stdout, cs_etm_priv_fmts[j], val[i]);
+		else if (val[i] == __perf_cs_etmv4_magic)
+			for (j = 0; j < CS_ETMV4_PRIV_MAX; j++, i++)
+				fprintf(stdout, cs_etmv4_priv_fmts[j], val[i]);
+		else
+			/* failure.. return */
+			return;
+	}
+}
+
 int cs_etm__process_auxtrace_info(union perf_event *event,
 				  struct perf_session *session)
 {
 	struct auxtrace_info_event *auxtrace_info = &event->auxtrace_info;
 	struct cs_etm_auxtrace *etm = NULL;
+	struct int_node *inode;
+	unsigned int pmu_type;
 	int event_header_size = sizeof(struct perf_event_header);
 	int info_header_size;
 	int total_size = auxtrace_info->header.size;
-	int err = 0;
+	int priv_size = 0;
+	int num_cpu;
+	int err = 0, idx = -1;
+	int i, j, k;
+	u64 *ptr, *hdr = NULL;
+	u64 **metadata = NULL;
 
 	/*
 	 * sizeof(auxtrace_info_event::type) +
@@ -170,10 +236,117 @@ int cs_etm__process_auxtrace_info(union perf_event *event,
 	if (total_size < (event_header_size + info_header_size))
 		return -EINVAL;
 
+	priv_size = total_size - event_header_size - info_header_size;
+
+	/* First the global part */
+	ptr = (u64 *) auxtrace_info->priv;
+
+	/* Look for version '0' of the header */
+	if (ptr[0] != 0)
+		return -EINVAL;
+
+	hdr = zalloc(sizeof(*hdr) * CS_HEADER_VERSION_0_MAX);
+	if (!hdr)
+		return -ENOMEM;
+
+	/* Extract header information - see cs-etm.h for format */
+	for (i = 0; i < CS_HEADER_VERSION_0_MAX; i++)
+		hdr[i] = ptr[i];
+	num_cpu = hdr[CS_PMU_TYPE_CPUS] & 0xffffffff;
+	pmu_type = (unsigned int) ((hdr[CS_PMU_TYPE_CPUS] >> 32) &
+				    0xffffffff);
+
+	/*
+	 * Create an RB tree for traceID-CPU# tuple. Since the conversion has
+	 * to be made for each packet that gets decoded, optimizing access in
+	 * anything other than a sequential array is worth doing.
+	 */
+	traceid_list = intlist__new(NULL);
+	if (!traceid_list) {
+		err = -ENOMEM;
+		goto err_free_hdr;
+	}
+
+	metadata = zalloc(sizeof(*metadata) * num_cpu);
+	if (!metadata) {
+		err = -ENOMEM;
+		goto err_free_traceid_list;
+	}
+
+	/*
+	 * The metadata is stored in the auxtrace_info section and encodes
+	 * the configuration of the ARM embedded trace macrocell which is
+	 * required by the trace decoder to properly decode the trace due
+	 * to its highly compressed nature.
+	 */
+	for (j = 0; j < num_cpu; j++) {
+		if (ptr[i] == __perf_cs_etmv3_magic) {
+			metadata[j] = zalloc(sizeof(*metadata[j]) *
+					     CS_ETM_PRIV_MAX);
+			if (!metadata[j]) {
+				err = -ENOMEM;
+				goto err_free_metadata;
+			}
+			for (k = 0; k < CS_ETM_PRIV_MAX; k++)
+				metadata[j][k] = ptr[i + k];
+
+			/* The traceID is our handle */
+			idx = metadata[j][CS_ETM_ETMTRACEIDR];
+			i += CS_ETM_PRIV_MAX;
+		} else if (ptr[i] == __perf_cs_etmv4_magic) {
+			metadata[j] = zalloc(sizeof(*metadata[j]) *
+					     CS_ETMV4_PRIV_MAX);
+			if (!metadata[j]) {
+				err = -ENOMEM;
+				goto err_free_metadata;
+			}
+			for (k = 0; k < CS_ETMV4_PRIV_MAX; k++)
+				metadata[j][k] = ptr[i + k];
+
+			/* The traceID is our handle */
+			idx = metadata[j][CS_ETMV4_TRCTRACEIDR];
+			i += CS_ETMV4_PRIV_MAX;
+		}
+
+		/* Get an RB node for this CPU */
+		inode = intlist__findnew(traceid_list, idx);
+
+		/* Something went wrong, no need to continue */
+		if (!inode) {
+			err = PTR_ERR(inode);
+			goto err_free_metadata;
+		}
+
+		/*
+		 * The node for that CPU should not be taken.
+		 * Back out if that's the case.
+		 */
+		if (inode->priv) {
+			err = -EINVAL;
+			goto err_free_metadata;
+		}
+		/* All good, associate the traceID with the CPU# */
+		inode->priv = &metadata[j][CS_ETM_CPU];
+	}
+
+	/*
+	 * Each of CS_HEADER_VERSION_0_MAX, CS_ETM_PRIV_MAX and
+	 * CS_ETMV4_PRIV_MAX mark how many double words are in the
+	 * global metadata, and each cpu's metadata respectively.
+	 * The following tests if the correct number of double words was
+	 * present in the auxtrace info section.
+	 */
+	if (i * 8 != priv_size) {
+		err = -EINVAL;
+		goto err_free_metadata;
+	}
+
 	etm = zalloc(sizeof(*etm));
 
-	if (!etm)
+	if (!etm) {
 		err = -ENOMEM;
+		goto err_free_metadata;
+	}
 
 	err = auxtrace_queues__init(&etm->queues);
 	if (err)
@@ -182,6 +355,10 @@ int cs_etm__process_auxtrace_info(union perf_event *event,
 	etm->session = session;
 	etm->machine = &session->machines.host;
 
+	etm->num_cpu = num_cpu;
+	etm->pmu_type = pmu_type;
+	etm->snapshot_mode = (hdr[CS_ETM_SNAPSHOT] != 0);
+	etm->metadata = metadata;
 	etm->auxtrace_type = auxtrace_info->type;
 	etm->timeless_decoding = cs_etm__is_timeless_decoding(etm);
 
@@ -192,8 +369,10 @@ int cs_etm__process_auxtrace_info(union perf_event *event,
 	etm->auxtrace.free = cs_etm__free;
 	session->auxtrace = &etm->auxtrace;
 
-	if (dump_trace)
+	if (dump_trace) {
+		cs_etm__print_auxtrace_info(auxtrace_info->priv, num_cpu);
 		return 0;
+	}
 
 	err = auxtrace_queues__process_index(&etm->queues, session);
 	if (err)
@@ -208,6 +387,15 @@ int cs_etm__process_auxtrace_info(union perf_event *event,
 	session->auxtrace = NULL;
 err_free_etm:
 	zfree(&etm);
+err_free_metadata:
+	/* No need to check @metadata[j], free(NULL) is supported */
+	for (j = 0; j < num_cpu; j++)
+		free(metadata[j]);
+	zfree(&metadata);
+err_free_traceid_list:
+	intlist__delete(traceid_list);
+err_free_hdr:
+	zfree(&hdr);
 
 	return -EINVAL;
 }
diff --git a/tools/perf/util/cs-etm.h b/tools/perf/util/cs-etm.h
index 5ab6a8ef1b32..5864d5dca616 100644
--- a/tools/perf/util/cs-etm.h
+++ b/tools/perf/util/cs-etm.h
@@ -64,6 +64,9 @@ enum {
 	CS_ETMV4_PRIV_MAX,
 };
 
+/* RB tree for quick conversion between traceID and CPUs */
+struct intlist *traceid_list;
+
 #define KiB(x) ((x) * 1024)
 #define MiB(x) ((x) * 1024 * 1024)
 
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 52+ messages in thread

* [PATCH 04/10] perf tools: Add decoder mechanic to support dumping trace data
  2017-12-15 16:44 ` Mathieu Poirier
@ 2017-12-15 16:44   ` Mathieu Poirier
  -1 siblings, 0 replies; 52+ messages in thread
From: Mathieu Poirier @ 2017-12-15 16:44 UTC (permalink / raw)
  To: acme
  Cc: peterz, mingo, alexander.shishkin, namhyung, adrian.hunter,
	mike.leach, suzuki.poulosi, tor, jolsa, mathieu.poirier,
	linux-kernel, linux-arm-kernel

This patch adds the required interface to the openCSD library to support
dumping CoreSight trace packet using the "report --dump" command.  The
information conveyed is related to the type of packets gathered by a
trace session rather than full decoding.

Co-authored-by: Tor Jeremiassen <tor@ti.com>
Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
---
 tools/perf/util/Build                           |   1 +
 tools/perf/util/cs-etm-decoder/Build            |   1 +
 tools/perf/util/cs-etm-decoder/cs-etm-decoder.c | 334 ++++++++++++++++++++++++
 tools/perf/util/cs-etm-decoder/cs-etm-decoder.h |  96 +++++++
 tools/perf/util/cs-etm.c                        | 108 +++++++-
 5 files changed, 536 insertions(+), 4 deletions(-)
 create mode 100644 tools/perf/util/cs-etm-decoder/Build
 create mode 100644 tools/perf/util/cs-etm-decoder/cs-etm-decoder.c
 create mode 100644 tools/perf/util/cs-etm-decoder/cs-etm-decoder.h

diff --git a/tools/perf/util/Build b/tools/perf/util/Build
index 49d447ca8644..06225cc98804 100644
--- a/tools/perf/util/Build
+++ b/tools/perf/util/Build
@@ -89,6 +89,7 @@ libperf-$(CONFIG_AUXTRACE) += intel-bts.o
 
 ifdef CONFIG_LIBOPENCSD
 libperf-$(CONFIG_AUXTRACE) += cs-etm.o
+libperf-$(CONFIG_AUXTRACE) += cs-etm-decoder/
 endif
 
 libperf-y += parse-branch-options.o
diff --git a/tools/perf/util/cs-etm-decoder/Build b/tools/perf/util/cs-etm-decoder/Build
new file mode 100644
index 000000000000..bc22c39c727f
--- /dev/null
+++ b/tools/perf/util/cs-etm-decoder/Build
@@ -0,0 +1 @@
+libperf-$(CONFIG_AUXTRACE) += cs-etm-decoder.o
diff --git a/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c b/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c
new file mode 100644
index 000000000000..6a4c86b1431f
--- /dev/null
+++ b/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c
@@ -0,0 +1,334 @@
+/*
+ * SPDX-License-Identifier: GPL-2.0
+ *
+ * Copyright(C) 2015-2018 Linaro Limited.
+ *
+ * Author: Tor Jeremiassen <tor@ti.com>
+ * Author: Mathieu Poirier <mathieu.poirier@linaro.org>
+ */
+
+#include <linux/err.h>
+#include <linux/list.h>
+#include <stdlib.h>
+#include <opencsd/c_api/opencsd_c_api.h>
+#include <opencsd/etmv4/trc_pkt_types_etmv4.h>
+#include <opencsd/ocsd_if_types.h>
+
+#include "cs-etm.h"
+#include "cs-etm-decoder.h"
+#include "intlist.h"
+#include "util.h"
+
+#define MAX_BUFFER 1024
+
+/* use raw logging */
+#ifdef CS_DEBUG_RAW
+#define CS_LOG_RAW_FRAMES
+#ifdef CS_RAW_PACKED
+#define CS_RAW_DEBUG_FLAGS (OCSD_DFRMTR_UNPACKED_RAW_OUT | \
+			    OCSD_DFRMTR_PACKED_RAW_OUT)
+#else
+#define CS_RAW_DEBUG_FLAGS (OCSD_DFRMTR_UNPACKED_RAW_OUT)
+#endif
+#endif
+
+struct cs_etm_decoder {
+	void *data;
+	void (*packet_printer)(const char *msg);
+	bool trace_on;
+	dcd_tree_handle_t dcd_tree;
+	cs_etm_mem_cb_type mem_access;
+	ocsd_datapath_resp_t prev_return;
+	u32 packet_count;
+	u32 head;
+	u32 tail;
+	struct cs_etm_packet packet_buffer[MAX_BUFFER];
+};
+
+static void cs_etm_decoder__gen_etmv4_config(struct cs_etm_trace_params *params,
+					     ocsd_etmv4_cfg *config)
+{
+	config->reg_configr = params->etmv4.reg_configr;
+	config->reg_traceidr = params->etmv4.reg_traceidr;
+	config->reg_idr0 = params->etmv4.reg_idr0;
+	config->reg_idr1 = params->etmv4.reg_idr1;
+	config->reg_idr2 = params->etmv4.reg_idr2;
+	config->reg_idr8 = params->etmv4.reg_idr8;
+	config->reg_idr9 = 0;
+	config->reg_idr10 = 0;
+	config->reg_idr11 = 0;
+	config->reg_idr12 = 0;
+	config->reg_idr13 = 0;
+	config->arch_ver = ARCH_V8;
+	config->core_prof = profile_CortexA;
+}
+
+static void cs_etm_decoder__print_str_cb(const void *p_context,
+					 const char *msg,
+					 const int str_len)
+{
+	if (p_context && str_len)
+		((struct cs_etm_decoder *)p_context)->packet_printer(msg);
+}
+
+static int
+cs_etm_decoder__init_def_logger_printing(struct cs_etm_decoder_params *d_params,
+					 struct cs_etm_decoder *decoder)
+{
+	int ret = 0;
+
+	if (d_params->packet_printer == NULL)
+		return -1;
+
+	decoder->packet_printer = d_params->packet_printer;
+
+	/*
+	 * Set up a library default logger to process any printers
+	 * (packet/raw frame) we add later.
+	 */
+	ret = ocsd_def_errlog_init(OCSD_ERR_SEV_ERROR, 1);
+	if (ret != 0)
+		return -1;
+
+	/* no stdout / err / file output */
+	ret = ocsd_def_errlog_config_output(C_API_MSGLOGOUT_FLG_NONE, NULL);
+	if (ret != 0)
+		return -1;
+
+	/*
+	 * Set the string CB for the default logger, passes strings to
+	 * perf print logger.
+	 */
+	ret = ocsd_def_errlog_set_strprint_cb(decoder->dcd_tree,
+					      (void *)decoder,
+					      cs_etm_decoder__print_str_cb);
+	if (ret != 0)
+		ret = -1;
+
+	return 0;
+}
+
+#ifdef CS_LOG_RAW_FRAMES
+static void
+cs_etm_decoder__init_raw_frame_logging(struct cs_etm_decoder_params *d_params,
+				       struct cs_etm_decoder *decoder)
+{
+	/* Only log these during a --dump operation */
+	if (d_params->operation == CS_ETM_OPERATION_PRINT) {
+		/* set up a library default logger to process the
+		 *  raw frame printer we add later
+		 */
+		ocsd_def_errlog_init(OCSD_ERR_SEV_ERROR, 1);
+
+		/* no stdout / err / file output */
+		ocsd_def_errlog_config_output(C_API_MSGLOGOUT_FLG_NONE, NULL);
+
+		/* set the string CB for the default logger,
+		 * passes strings to perf print logger.
+		 */
+		ocsd_def_errlog_set_strprint_cb(decoder->dcd_tree,
+						(void *)decoder,
+						cs_etm_decoder__print_str_cb);
+
+		/* use the built in library printer for the raw frames */
+		ocsd_dt_set_raw_frame_printer(decoder->dcd_tree,
+					      CS_RAW_DEBUG_FLAGS);
+	}
+}
+#else
+static void
+cs_etm_decoder__init_raw_frame_logging(
+		struct cs_etm_decoder_params *d_params __maybe_unused,
+		struct cs_etm_decoder *decoder __maybe_unused)
+{
+}
+#endif
+
+static int cs_etm_decoder__create_packet_printer(struct cs_etm_decoder *decoder,
+						 const char *decoder_name,
+						 void *trace_config)
+{
+	u8 csid;
+
+	if (ocsd_dt_create_decoder(decoder->dcd_tree, decoder_name,
+				   OCSD_CREATE_FLG_PACKET_PROC,
+				   trace_config, &csid))
+		return -1;
+
+	if (ocsd_dt_set_pkt_protocol_printer(decoder->dcd_tree, csid, 0))
+		return -1;
+
+	return 0;
+}
+
+static int
+cs_etm_decoder__create_etm_packet_printer(struct cs_etm_trace_params *t_params,
+					  struct cs_etm_decoder *decoder)
+{
+	const char *decoder_name;
+	ocsd_etmv4_cfg trace_config_etmv4;
+	void *trace_config;
+
+	switch (t_params->protocol) {
+	case CS_ETM_PROTO_ETMV4i:
+		cs_etm_decoder__gen_etmv4_config(t_params, &trace_config_etmv4);
+		decoder_name = OCSD_BUILTIN_DCD_ETMV4I;
+		trace_config = &trace_config_etmv4;
+		break;
+	default:
+		return -1;
+	}
+
+	return cs_etm_decoder__create_packet_printer(decoder,
+						     decoder_name,
+						     trace_config);
+}
+
+static void cs_etm_decoder__clear_buffer(struct cs_etm_decoder *decoder)
+{
+	int i;
+
+	decoder->head = 0;
+	decoder->tail = 0;
+	decoder->packet_count = 0;
+	for (i = 0; i < MAX_BUFFER; i++) {
+		decoder->packet_buffer[i].start_addr = 0xdeadbeefdeadbeefUL;
+		decoder->packet_buffer[i].end_addr   = 0xdeadbeefdeadbeefUL;
+		decoder->packet_buffer[i].exc	     = false;
+		decoder->packet_buffer[i].exc_ret    = false;
+		decoder->packet_buffer[i].cpu	     = INT_MIN;
+	}
+}
+
+static int
+cs_etm_decoder__create_etm_decoder(struct cs_etm_decoder_params *d_params,
+				   struct cs_etm_trace_params *t_params,
+				   struct cs_etm_decoder *decoder)
+{
+	if (d_params->operation == CS_ETM_OPERATION_PRINT)
+		return cs_etm_decoder__create_etm_packet_printer(t_params,
+								 decoder);
+	return -1;
+}
+
+struct cs_etm_decoder *
+cs_etm_decoder__new(int num_cpu, struct cs_etm_decoder_params *d_params,
+		    struct cs_etm_trace_params t_params[])
+{
+	struct cs_etm_decoder *decoder;
+	ocsd_dcd_tree_src_t format;
+	u32 flags;
+	int i, ret;
+
+	if ((!t_params) || (!d_params))
+		return NULL;
+
+	decoder = zalloc(sizeof(*decoder));
+
+	if (!decoder)
+		return NULL;
+
+	decoder->data = d_params->data;
+	decoder->prev_return = OCSD_RESP_CONT;
+	cs_etm_decoder__clear_buffer(decoder);
+	format = (d_params->formatted ? OCSD_TRC_SRC_FRAME_FORMATTED :
+					 OCSD_TRC_SRC_SINGLE);
+	flags = 0;
+	flags |= (d_params->fsyncs ? OCSD_DFRMTR_HAS_FSYNCS : 0);
+	flags |= (d_params->hsyncs ? OCSD_DFRMTR_HAS_HSYNCS : 0);
+	flags |= (d_params->frame_aligned ? OCSD_DFRMTR_FRAME_MEM_ALIGN : 0);
+
+	/*
+	 * Drivers may add barrier frames when used with perf, set up to
+	 * handle this. Barriers const of FSYNC packet repeated 4 times.
+	 */
+	flags |= OCSD_DFRMTR_RESET_ON_4X_FSYNC;
+
+	/* Create decode tree for the data source */
+	decoder->dcd_tree = ocsd_create_dcd_tree(format, flags);
+
+	if (decoder->dcd_tree == 0)
+		goto err_free_decoder;
+
+	/* init library print logging support */
+	ret = cs_etm_decoder__init_def_logger_printing(d_params, decoder);
+	if (ret != 0)
+		goto err_free_decoder_tree;
+
+	/* init raw frame logging if required */
+	cs_etm_decoder__init_raw_frame_logging(d_params, decoder);
+
+	for (i = 0; i < num_cpu; i++) {
+		ret = cs_etm_decoder__create_etm_decoder(d_params,
+							 &t_params[i],
+							 decoder);
+		if (ret != 0)
+			goto err_free_decoder_tree;
+	}
+
+	return decoder;
+
+err_free_decoder_tree:
+	ocsd_destroy_dcd_tree(decoder->dcd_tree);
+err_free_decoder:
+	free(decoder);
+	return NULL;
+}
+
+int cs_etm_decoder__process_data_block(struct cs_etm_decoder *decoder,
+				       u64 indx, const u8 *buf,
+				       size_t len, size_t *consumed)
+{
+	int ret = 0;
+	ocsd_datapath_resp_t cur = OCSD_RESP_CONT;
+	ocsd_datapath_resp_t prev_return = decoder->prev_return;
+	size_t processed = 0;
+	u32 count;
+
+	while (processed < len) {
+		if (OCSD_DATA_RESP_IS_WAIT(prev_return)) {
+			cur = ocsd_dt_process_data(decoder->dcd_tree,
+						   OCSD_OP_FLUSH,
+						   0,
+						   0,
+						   NULL,
+						   NULL);
+		} else if (OCSD_DATA_RESP_IS_CONT(prev_return)) {
+			cur = ocsd_dt_process_data(decoder->dcd_tree,
+						   OCSD_OP_DATA,
+						   indx + processed,
+						   len - processed,
+						   &buf[processed],
+						   &count);
+			processed += count;
+		} else {
+			ret = -EINVAL;
+			break;
+		}
+
+		/*
+		 * Return to the input code if the packet buffer is full.
+		 * Flushing will get done once the packet buffer has been
+		 * processed.
+		 */
+		if (OCSD_DATA_RESP_IS_WAIT(cur))
+			break;
+
+		prev_return = cur;
+	}
+
+	decoder->prev_return = cur;
+	*consumed = processed;
+
+	return ret;
+}
+
+void cs_etm_decoder__free(struct cs_etm_decoder *decoder)
+{
+	if (!decoder)
+		return;
+
+	ocsd_destroy_dcd_tree(decoder->dcd_tree);
+	decoder->dcd_tree = NULL;
+	free(decoder);
+}
diff --git a/tools/perf/util/cs-etm-decoder/cs-etm-decoder.h b/tools/perf/util/cs-etm-decoder/cs-etm-decoder.h
new file mode 100644
index 000000000000..a1e9b0ac5965
--- /dev/null
+++ b/tools/perf/util/cs-etm-decoder/cs-etm-decoder.h
@@ -0,0 +1,96 @@
+/*
+ * SPDX-License-Identifier: GPL-2.0
+ *
+ * Copyright(C) 2015-2018 Linaro Limited.
+ *
+ * Author: Tor Jeremiassen <tor@ti.com>
+ * Author: Mathieu Poirier <mathieu.poirier@linaro.org>
+ */
+
+#ifndef INCLUDE__CS_ETM_DECODER_H__
+#define INCLUDE__CS_ETM_DECODER_H__
+
+#include <linux/types.h>
+#include <stdio.h>
+
+struct cs_etm_decoder;
+
+struct cs_etm_buffer {
+	const unsigned char *buf;
+	size_t len;
+	u64 offset;
+	u64 ref_timestamp;
+};
+
+enum cs_etm_sample_type {
+	CS_ETM_RANGE = 1 << 0,
+};
+
+struct cs_etm_packet {
+	enum cs_etm_sample_type sample_type;
+	u64 start_addr;
+	u64 end_addr;
+	u8 exc;
+	u8 exc_ret;
+	int cpu;
+};
+
+struct cs_etm_queue;
+
+typedef u32 (*cs_etm_mem_cb_type)(struct cs_etm_queue *, u64,
+				  size_t, u8 *);
+
+struct cs_etmv4_trace_params {
+	u32 reg_idr0;
+	u32 reg_idr1;
+	u32 reg_idr2;
+	u32 reg_idr8;
+	u32 reg_configr;
+	u32 reg_traceidr;
+};
+
+struct cs_etm_trace_params {
+	int protocol;
+	union {
+		struct cs_etmv4_trace_params etmv4;
+	};
+};
+
+struct cs_etm_decoder_params {
+	int operation;
+	void (*packet_printer)(const char *msg);
+	cs_etm_mem_cb_type mem_acc_cb;
+	u8 formatted;
+	u8 fsyncs;
+	u8 hsyncs;
+	u8 frame_aligned;
+	void *data;
+};
+
+/*
+ * The following enums are indexed starting with 1 to align with the
+ * open source coresight trace decoder library.
+ */
+enum {
+	CS_ETM_PROTO_ETMV3 = 1,
+	CS_ETM_PROTO_ETMV4i,
+	CS_ETM_PROTO_ETMV4d,
+};
+
+enum {
+	CS_ETM_OPERATION_PRINT = 1,
+	CS_ETM_OPERATION_DECODE,
+};
+
+int cs_etm_decoder__process_data_block(struct cs_etm_decoder *decoder,
+				       u64 indx, const u8 *buf,
+				       size_t len, size_t *consumed);
+
+struct cs_etm_decoder *
+cs_etm_decoder__new(int num_cpu,
+		    struct cs_etm_decoder_params *d_params,
+		    struct cs_etm_trace_params t_params[]);
+
+void cs_etm_decoder__free(struct cs_etm_decoder *decoder);
+
+#endif /* INCLUDE__CS_ETM_DECODER_H__ */
diff --git a/tools/perf/util/cs-etm.c b/tools/perf/util/cs-etm.c
index 18894ee7aa0b..cad429ce3c00 100644
--- a/tools/perf/util/cs-etm.c
+++ b/tools/perf/util/cs-etm.c
@@ -18,6 +18,7 @@
 #include "auxtrace.h"
 #include "color.h"
 #include "cs-etm.h"
+#include "cs-etm-decoder/cs-etm-decoder.h"
 #include "debug.h"
 #include "evlist.h"
 #include "intlist.h"
@@ -69,6 +70,78 @@ struct cs_etm_queue {
 	u64 offset;
 };
 
+static void cs_etm__packet_dump(const char *pkt_string)
+{
+	const char *color = PERF_COLOR_BLUE;
+	int len = strlen(pkt_string);
+
+	if (len && (pkt_string[len-1] == '\n'))
+		color_fprintf(stdout, color, "	%s", pkt_string);
+	else
+		color_fprintf(stdout, color, "	%s\n", pkt_string);
+
+	fflush(stdout);
+}
+
+static void cs_etm__dump_event(struct cs_etm_auxtrace *etm,
+			       struct auxtrace_buffer *buffer)
+{
+	int i, ret;
+	const char *color = PERF_COLOR_BLUE;
+	struct cs_etm_decoder_params d_params;
+	struct cs_etm_trace_params *t_params;
+	struct cs_etm_decoder *decoder;
+	size_t buffer_used = 0;
+
+	fprintf(stdout, "\n");
+	color_fprintf(stdout, color,
+		     ". ... CoreSight ETM Trace data: size %zu bytes\n",
+		     buffer->size);
+
+	/* Use metadata to fill in trace parameters for trace decoder */
+	t_params = zalloc(sizeof(*t_params) * etm->num_cpu);
+	for (i = 0; i < etm->num_cpu; i++) {
+		t_params[i].protocol = CS_ETM_PROTO_ETMV4i;
+		t_params[i].etmv4.reg_idr0 = etm->metadata[i][CS_ETMV4_TRCIDR0];
+		t_params[i].etmv4.reg_idr1 = etm->metadata[i][CS_ETMV4_TRCIDR1];
+		t_params[i].etmv4.reg_idr2 = etm->metadata[i][CS_ETMV4_TRCIDR2];
+		t_params[i].etmv4.reg_idr8 = etm->metadata[i][CS_ETMV4_TRCIDR8];
+		t_params[i].etmv4.reg_configr =
+					etm->metadata[i][CS_ETMV4_TRCCONFIGR];
+		t_params[i].etmv4.reg_traceidr =
+					etm->metadata[i][CS_ETMV4_TRCTRACEIDR];
+	}
+
+	/* Set decoder parameters to simply print the trace packets */
+	d_params.packet_printer = cs_etm__packet_dump;
+	d_params.operation = CS_ETM_OPERATION_PRINT;
+	d_params.formatted = true;
+	d_params.fsyncs = false;
+	d_params.hsyncs = false;
+	d_params.frame_aligned = true;
+
+	decoder = cs_etm_decoder__new(etm->num_cpu, &d_params, t_params);
+
+	zfree(&t_params);
+
+	if (!decoder)
+		return;
+	do {
+		size_t consumed;
+
+		ret = cs_etm_decoder__process_data_block(
+				decoder, buffer->offset,
+				&((u8 *)buffer->data)[buffer_used],
+				buffer->size - buffer_used, &consumed);
+		if (ret)
+			break;
+
+		buffer_used += consumed;
+	} while (buffer_used < buffer->size);
+
+	cs_etm_decoder__free(decoder);
+}
+
 static int cs_etm__flush_events(struct perf_session *session,
 				struct perf_tool *tool)
 {
@@ -137,11 +210,38 @@ static int cs_etm__process_event(struct perf_session *session,
 
 static int cs_etm__process_auxtrace_event(struct perf_session *session,
 					  union perf_event *event,
-					  struct perf_tool *tool)
+					  struct perf_tool *tool __maybe_unused)
 {
-	(void) session;
-	(void) event;
-	(void) tool;
+	struct cs_etm_auxtrace *etm = container_of(session->auxtrace,
+						   struct cs_etm_auxtrace,
+						   auxtrace);
+	if (!etm->data_queued) {
+		struct auxtrace_buffer *buffer;
+		off_t  data_offset;
+		int fd = perf_data__fd(session->data);
+		bool is_pipe = perf_data__is_pipe(session->data);
+		int err;
+
+		if (is_pipe)
+			data_offset = 0;
+		else {
+			data_offset = lseek(fd, 0, SEEK_CUR);
+			if (data_offset == -1)
+				return -errno;
+		}
+
+		err = auxtrace_queues__add_event(&etm->queues, session,
+						 event, data_offset, &buffer);
+		if (err)
+			return err;
+
+		if (dump_trace)
+			if (auxtrace_buffer__get_data(buffer, fd)) {
+				cs_etm__dump_event(etm, buffer);
+				auxtrace_buffer__put_data(buffer);
+			}
+	}
+
 	return 0;
 }
 
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 52+ messages in thread

* [PATCH 04/10] perf tools: Add decoder mechanic to support dumping trace data
@ 2017-12-15 16:44   ` Mathieu Poirier
  0 siblings, 0 replies; 52+ messages in thread
From: Mathieu Poirier @ 2017-12-15 16:44 UTC (permalink / raw)
  To: linux-arm-kernel

This patch adds the required interface to the openCSD library to support
dumping CoreSight trace packet using the "report --dump" command.  The
information conveyed is related to the type of packets gathered by a
trace session rather than full decoding.

Co-authored-by: Tor Jeremiassen <tor@ti.com>
Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
---
 tools/perf/util/Build                           |   1 +
 tools/perf/util/cs-etm-decoder/Build            |   1 +
 tools/perf/util/cs-etm-decoder/cs-etm-decoder.c | 334 ++++++++++++++++++++++++
 tools/perf/util/cs-etm-decoder/cs-etm-decoder.h |  96 +++++++
 tools/perf/util/cs-etm.c                        | 108 +++++++-
 5 files changed, 536 insertions(+), 4 deletions(-)
 create mode 100644 tools/perf/util/cs-etm-decoder/Build
 create mode 100644 tools/perf/util/cs-etm-decoder/cs-etm-decoder.c
 create mode 100644 tools/perf/util/cs-etm-decoder/cs-etm-decoder.h

diff --git a/tools/perf/util/Build b/tools/perf/util/Build
index 49d447ca8644..06225cc98804 100644
--- a/tools/perf/util/Build
+++ b/tools/perf/util/Build
@@ -89,6 +89,7 @@ libperf-$(CONFIG_AUXTRACE) += intel-bts.o
 
 ifdef CONFIG_LIBOPENCSD
 libperf-$(CONFIG_AUXTRACE) += cs-etm.o
+libperf-$(CONFIG_AUXTRACE) += cs-etm-decoder/
 endif
 
 libperf-y += parse-branch-options.o
diff --git a/tools/perf/util/cs-etm-decoder/Build b/tools/perf/util/cs-etm-decoder/Build
new file mode 100644
index 000000000000..bc22c39c727f
--- /dev/null
+++ b/tools/perf/util/cs-etm-decoder/Build
@@ -0,0 +1 @@
+libperf-$(CONFIG_AUXTRACE) += cs-etm-decoder.o
diff --git a/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c b/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c
new file mode 100644
index 000000000000..6a4c86b1431f
--- /dev/null
+++ b/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c
@@ -0,0 +1,334 @@
+/*
+ * SPDX-License-Identifier: GPL-2.0
+ *
+ * Copyright(C) 2015-2018 Linaro Limited.
+ *
+ * Author: Tor Jeremiassen <tor@ti.com>
+ * Author: Mathieu Poirier <mathieu.poirier@linaro.org>
+ */
+
+#include <linux/err.h>
+#include <linux/list.h>
+#include <stdlib.h>
+#include <opencsd/c_api/opencsd_c_api.h>
+#include <opencsd/etmv4/trc_pkt_types_etmv4.h>
+#include <opencsd/ocsd_if_types.h>
+
+#include "cs-etm.h"
+#include "cs-etm-decoder.h"
+#include "intlist.h"
+#include "util.h"
+
+#define MAX_BUFFER 1024
+
+/* use raw logging */
+#ifdef CS_DEBUG_RAW
+#define CS_LOG_RAW_FRAMES
+#ifdef CS_RAW_PACKED
+#define CS_RAW_DEBUG_FLAGS (OCSD_DFRMTR_UNPACKED_RAW_OUT | \
+			    OCSD_DFRMTR_PACKED_RAW_OUT)
+#else
+#define CS_RAW_DEBUG_FLAGS (OCSD_DFRMTR_UNPACKED_RAW_OUT)
+#endif
+#endif
+
+struct cs_etm_decoder {
+	void *data;
+	void (*packet_printer)(const char *msg);
+	bool trace_on;
+	dcd_tree_handle_t dcd_tree;
+	cs_etm_mem_cb_type mem_access;
+	ocsd_datapath_resp_t prev_return;
+	u32 packet_count;
+	u32 head;
+	u32 tail;
+	struct cs_etm_packet packet_buffer[MAX_BUFFER];
+};
+
+static void cs_etm_decoder__gen_etmv4_config(struct cs_etm_trace_params *params,
+					     ocsd_etmv4_cfg *config)
+{
+	config->reg_configr = params->etmv4.reg_configr;
+	config->reg_traceidr = params->etmv4.reg_traceidr;
+	config->reg_idr0 = params->etmv4.reg_idr0;
+	config->reg_idr1 = params->etmv4.reg_idr1;
+	config->reg_idr2 = params->etmv4.reg_idr2;
+	config->reg_idr8 = params->etmv4.reg_idr8;
+	config->reg_idr9 = 0;
+	config->reg_idr10 = 0;
+	config->reg_idr11 = 0;
+	config->reg_idr12 = 0;
+	config->reg_idr13 = 0;
+	config->arch_ver = ARCH_V8;
+	config->core_prof = profile_CortexA;
+}
+
+static void cs_etm_decoder__print_str_cb(const void *p_context,
+					 const char *msg,
+					 const int str_len)
+{
+	if (p_context && str_len)
+		((struct cs_etm_decoder *)p_context)->packet_printer(msg);
+}
+
+static int
+cs_etm_decoder__init_def_logger_printing(struct cs_etm_decoder_params *d_params,
+					 struct cs_etm_decoder *decoder)
+{
+	int ret = 0;
+
+	if (d_params->packet_printer == NULL)
+		return -1;
+
+	decoder->packet_printer = d_params->packet_printer;
+
+	/*
+	 * Set up a library default logger to process any printers
+	 * (packet/raw frame) we add later.
+	 */
+	ret = ocsd_def_errlog_init(OCSD_ERR_SEV_ERROR, 1);
+	if (ret != 0)
+		return -1;
+
+	/* no stdout / err / file output */
+	ret = ocsd_def_errlog_config_output(C_API_MSGLOGOUT_FLG_NONE, NULL);
+	if (ret != 0)
+		return -1;
+
+	/*
+	 * Set the string CB for the default logger, passes strings to
+	 * perf print logger.
+	 */
+	ret = ocsd_def_errlog_set_strprint_cb(decoder->dcd_tree,
+					      (void *)decoder,
+					      cs_etm_decoder__print_str_cb);
+	if (ret != 0)
+		ret = -1;
+
+	return 0;
+}
+
+#ifdef CS_LOG_RAW_FRAMES
+static void
+cs_etm_decoder__init_raw_frame_logging(struct cs_etm_decoder_params *d_params,
+				       struct cs_etm_decoder *decoder)
+{
+	/* Only log these during a --dump operation */
+	if (d_params->operation == CS_ETM_OPERATION_PRINT) {
+		/* set up a library default logger to process the
+		 *  raw frame printer we add later
+		 */
+		ocsd_def_errlog_init(OCSD_ERR_SEV_ERROR, 1);
+
+		/* no stdout / err / file output */
+		ocsd_def_errlog_config_output(C_API_MSGLOGOUT_FLG_NONE, NULL);
+
+		/* set the string CB for the default logger,
+		 * passes strings to perf print logger.
+		 */
+		ocsd_def_errlog_set_strprint_cb(decoder->dcd_tree,
+						(void *)decoder,
+						cs_etm_decoder__print_str_cb);
+
+		/* use the built in library printer for the raw frames */
+		ocsd_dt_set_raw_frame_printer(decoder->dcd_tree,
+					      CS_RAW_DEBUG_FLAGS);
+	}
+}
+#else
+static void
+cs_etm_decoder__init_raw_frame_logging(
+		struct cs_etm_decoder_params *d_params __maybe_unused,
+		struct cs_etm_decoder *decoder __maybe_unused)
+{
+}
+#endif
+
+static int cs_etm_decoder__create_packet_printer(struct cs_etm_decoder *decoder,
+						 const char *decoder_name,
+						 void *trace_config)
+{
+	u8 csid;
+
+	if (ocsd_dt_create_decoder(decoder->dcd_tree, decoder_name,
+				   OCSD_CREATE_FLG_PACKET_PROC,
+				   trace_config, &csid))
+		return -1;
+
+	if (ocsd_dt_set_pkt_protocol_printer(decoder->dcd_tree, csid, 0))
+		return -1;
+
+	return 0;
+}
+
+static int
+cs_etm_decoder__create_etm_packet_printer(struct cs_etm_trace_params *t_params,
+					  struct cs_etm_decoder *decoder)
+{
+	const char *decoder_name;
+	ocsd_etmv4_cfg trace_config_etmv4;
+	void *trace_config;
+
+	switch (t_params->protocol) {
+	case CS_ETM_PROTO_ETMV4i:
+		cs_etm_decoder__gen_etmv4_config(t_params, &trace_config_etmv4);
+		decoder_name = OCSD_BUILTIN_DCD_ETMV4I;
+		trace_config = &trace_config_etmv4;
+		break;
+	default:
+		return -1;
+	}
+
+	return cs_etm_decoder__create_packet_printer(decoder,
+						     decoder_name,
+						     trace_config);
+}
+
+static void cs_etm_decoder__clear_buffer(struct cs_etm_decoder *decoder)
+{
+	int i;
+
+	decoder->head = 0;
+	decoder->tail = 0;
+	decoder->packet_count = 0;
+	for (i = 0; i < MAX_BUFFER; i++) {
+		decoder->packet_buffer[i].start_addr = 0xdeadbeefdeadbeefUL;
+		decoder->packet_buffer[i].end_addr   = 0xdeadbeefdeadbeefUL;
+		decoder->packet_buffer[i].exc	     = false;
+		decoder->packet_buffer[i].exc_ret    = false;
+		decoder->packet_buffer[i].cpu	     = INT_MIN;
+	}
+}
+
+static int
+cs_etm_decoder__create_etm_decoder(struct cs_etm_decoder_params *d_params,
+				   struct cs_etm_trace_params *t_params,
+				   struct cs_etm_decoder *decoder)
+{
+	if (d_params->operation == CS_ETM_OPERATION_PRINT)
+		return cs_etm_decoder__create_etm_packet_printer(t_params,
+								 decoder);
+	return -1;
+}
+
+struct cs_etm_decoder *
+cs_etm_decoder__new(int num_cpu, struct cs_etm_decoder_params *d_params,
+		    struct cs_etm_trace_params t_params[])
+{
+	struct cs_etm_decoder *decoder;
+	ocsd_dcd_tree_src_t format;
+	u32 flags;
+	int i, ret;
+
+	if ((!t_params) || (!d_params))
+		return NULL;
+
+	decoder = zalloc(sizeof(*decoder));
+
+	if (!decoder)
+		return NULL;
+
+	decoder->data = d_params->data;
+	decoder->prev_return = OCSD_RESP_CONT;
+	cs_etm_decoder__clear_buffer(decoder);
+	format = (d_params->formatted ? OCSD_TRC_SRC_FRAME_FORMATTED :
+					 OCSD_TRC_SRC_SINGLE);
+	flags = 0;
+	flags |= (d_params->fsyncs ? OCSD_DFRMTR_HAS_FSYNCS : 0);
+	flags |= (d_params->hsyncs ? OCSD_DFRMTR_HAS_HSYNCS : 0);
+	flags |= (d_params->frame_aligned ? OCSD_DFRMTR_FRAME_MEM_ALIGN : 0);
+
+	/*
+	 * Drivers may add barrier frames when used with perf, set up to
+	 * handle this. Barriers const of FSYNC packet repeated 4 times.
+	 */
+	flags |= OCSD_DFRMTR_RESET_ON_4X_FSYNC;
+
+	/* Create decode tree for the data source */
+	decoder->dcd_tree = ocsd_create_dcd_tree(format, flags);
+
+	if (decoder->dcd_tree == 0)
+		goto err_free_decoder;
+
+	/* init library print logging support */
+	ret = cs_etm_decoder__init_def_logger_printing(d_params, decoder);
+	if (ret != 0)
+		goto err_free_decoder_tree;
+
+	/* init raw frame logging if required */
+	cs_etm_decoder__init_raw_frame_logging(d_params, decoder);
+
+	for (i = 0; i < num_cpu; i++) {
+		ret = cs_etm_decoder__create_etm_decoder(d_params,
+							 &t_params[i],
+							 decoder);
+		if (ret != 0)
+			goto err_free_decoder_tree;
+	}
+
+	return decoder;
+
+err_free_decoder_tree:
+	ocsd_destroy_dcd_tree(decoder->dcd_tree);
+err_free_decoder:
+	free(decoder);
+	return NULL;
+}
+
+int cs_etm_decoder__process_data_block(struct cs_etm_decoder *decoder,
+				       u64 indx, const u8 *buf,
+				       size_t len, size_t *consumed)
+{
+	int ret = 0;
+	ocsd_datapath_resp_t cur = OCSD_RESP_CONT;
+	ocsd_datapath_resp_t prev_return = decoder->prev_return;
+	size_t processed = 0;
+	u32 count;
+
+	while (processed < len) {
+		if (OCSD_DATA_RESP_IS_WAIT(prev_return)) {
+			cur = ocsd_dt_process_data(decoder->dcd_tree,
+						   OCSD_OP_FLUSH,
+						   0,
+						   0,
+						   NULL,
+						   NULL);
+		} else if (OCSD_DATA_RESP_IS_CONT(prev_return)) {
+			cur = ocsd_dt_process_data(decoder->dcd_tree,
+						   OCSD_OP_DATA,
+						   indx + processed,
+						   len - processed,
+						   &buf[processed],
+						   &count);
+			processed += count;
+		} else {
+			ret = -EINVAL;
+			break;
+		}
+
+		/*
+		 * Return to the input code if the packet buffer is full.
+		 * Flushing will get done once the packet buffer has been
+		 * processed.
+		 */
+		if (OCSD_DATA_RESP_IS_WAIT(cur))
+			break;
+
+		prev_return = cur;
+	}
+
+	decoder->prev_return = cur;
+	*consumed = processed;
+
+	return ret;
+}
+
+void cs_etm_decoder__free(struct cs_etm_decoder *decoder)
+{
+	if (!decoder)
+		return;
+
+	ocsd_destroy_dcd_tree(decoder->dcd_tree);
+	decoder->dcd_tree = NULL;
+	free(decoder);
+}
diff --git a/tools/perf/util/cs-etm-decoder/cs-etm-decoder.h b/tools/perf/util/cs-etm-decoder/cs-etm-decoder.h
new file mode 100644
index 000000000000..a1e9b0ac5965
--- /dev/null
+++ b/tools/perf/util/cs-etm-decoder/cs-etm-decoder.h
@@ -0,0 +1,96 @@
+/*
+ * SPDX-License-Identifier: GPL-2.0
+ *
+ * Copyright(C) 2015-2018 Linaro Limited.
+ *
+ * Author: Tor Jeremiassen <tor@ti.com>
+ * Author: Mathieu Poirier <mathieu.poirier@linaro.org>
+ */
+
+#ifndef INCLUDE__CS_ETM_DECODER_H__
+#define INCLUDE__CS_ETM_DECODER_H__
+
+#include <linux/types.h>
+#include <stdio.h>
+
+struct cs_etm_decoder;
+
+struct cs_etm_buffer {
+	const unsigned char *buf;
+	size_t len;
+	u64 offset;
+	u64 ref_timestamp;
+};
+
+enum cs_etm_sample_type {
+	CS_ETM_RANGE = 1 << 0,
+};
+
+struct cs_etm_packet {
+	enum cs_etm_sample_type sample_type;
+	u64 start_addr;
+	u64 end_addr;
+	u8 exc;
+	u8 exc_ret;
+	int cpu;
+};
+
+struct cs_etm_queue;
+
+typedef u32 (*cs_etm_mem_cb_type)(struct cs_etm_queue *, u64,
+				  size_t, u8 *);
+
+struct cs_etmv4_trace_params {
+	u32 reg_idr0;
+	u32 reg_idr1;
+	u32 reg_idr2;
+	u32 reg_idr8;
+	u32 reg_configr;
+	u32 reg_traceidr;
+};
+
+struct cs_etm_trace_params {
+	int protocol;
+	union {
+		struct cs_etmv4_trace_params etmv4;
+	};
+};
+
+struct cs_etm_decoder_params {
+	int operation;
+	void (*packet_printer)(const char *msg);
+	cs_etm_mem_cb_type mem_acc_cb;
+	u8 formatted;
+	u8 fsyncs;
+	u8 hsyncs;
+	u8 frame_aligned;
+	void *data;
+};
+
+/*
+ * The following enums are indexed starting with 1 to align with the
+ * open source coresight trace decoder library.
+ */
+enum {
+	CS_ETM_PROTO_ETMV3 = 1,
+	CS_ETM_PROTO_ETMV4i,
+	CS_ETM_PROTO_ETMV4d,
+};
+
+enum {
+	CS_ETM_OPERATION_PRINT = 1,
+	CS_ETM_OPERATION_DECODE,
+};
+
+int cs_etm_decoder__process_data_block(struct cs_etm_decoder *decoder,
+				       u64 indx, const u8 *buf,
+				       size_t len, size_t *consumed);
+
+struct cs_etm_decoder *
+cs_etm_decoder__new(int num_cpu,
+		    struct cs_etm_decoder_params *d_params,
+		    struct cs_etm_trace_params t_params[]);
+
+void cs_etm_decoder__free(struct cs_etm_decoder *decoder);
+
+#endif /* INCLUDE__CS_ETM_DECODER_H__ */
diff --git a/tools/perf/util/cs-etm.c b/tools/perf/util/cs-etm.c
index 18894ee7aa0b..cad429ce3c00 100644
--- a/tools/perf/util/cs-etm.c
+++ b/tools/perf/util/cs-etm.c
@@ -18,6 +18,7 @@
 #include "auxtrace.h"
 #include "color.h"
 #include "cs-etm.h"
+#include "cs-etm-decoder/cs-etm-decoder.h"
 #include "debug.h"
 #include "evlist.h"
 #include "intlist.h"
@@ -69,6 +70,78 @@ struct cs_etm_queue {
 	u64 offset;
 };
 
+static void cs_etm__packet_dump(const char *pkt_string)
+{
+	const char *color = PERF_COLOR_BLUE;
+	int len = strlen(pkt_string);
+
+	if (len && (pkt_string[len-1] == '\n'))
+		color_fprintf(stdout, color, "	%s", pkt_string);
+	else
+		color_fprintf(stdout, color, "	%s\n", pkt_string);
+
+	fflush(stdout);
+}
+
+static void cs_etm__dump_event(struct cs_etm_auxtrace *etm,
+			       struct auxtrace_buffer *buffer)
+{
+	int i, ret;
+	const char *color = PERF_COLOR_BLUE;
+	struct cs_etm_decoder_params d_params;
+	struct cs_etm_trace_params *t_params;
+	struct cs_etm_decoder *decoder;
+	size_t buffer_used = 0;
+
+	fprintf(stdout, "\n");
+	color_fprintf(stdout, color,
+		     ". ... CoreSight ETM Trace data: size %zu bytes\n",
+		     buffer->size);
+
+	/* Use metadata to fill in trace parameters for trace decoder */
+	t_params = zalloc(sizeof(*t_params) * etm->num_cpu);
+	for (i = 0; i < etm->num_cpu; i++) {
+		t_params[i].protocol = CS_ETM_PROTO_ETMV4i;
+		t_params[i].etmv4.reg_idr0 = etm->metadata[i][CS_ETMV4_TRCIDR0];
+		t_params[i].etmv4.reg_idr1 = etm->metadata[i][CS_ETMV4_TRCIDR1];
+		t_params[i].etmv4.reg_idr2 = etm->metadata[i][CS_ETMV4_TRCIDR2];
+		t_params[i].etmv4.reg_idr8 = etm->metadata[i][CS_ETMV4_TRCIDR8];
+		t_params[i].etmv4.reg_configr =
+					etm->metadata[i][CS_ETMV4_TRCCONFIGR];
+		t_params[i].etmv4.reg_traceidr =
+					etm->metadata[i][CS_ETMV4_TRCTRACEIDR];
+	}
+
+	/* Set decoder parameters to simply print the trace packets */
+	d_params.packet_printer = cs_etm__packet_dump;
+	d_params.operation = CS_ETM_OPERATION_PRINT;
+	d_params.formatted = true;
+	d_params.fsyncs = false;
+	d_params.hsyncs = false;
+	d_params.frame_aligned = true;
+
+	decoder = cs_etm_decoder__new(etm->num_cpu, &d_params, t_params);
+
+	zfree(&t_params);
+
+	if (!decoder)
+		return;
+	do {
+		size_t consumed;
+
+		ret = cs_etm_decoder__process_data_block(
+				decoder, buffer->offset,
+				&((u8 *)buffer->data)[buffer_used],
+				buffer->size - buffer_used, &consumed);
+		if (ret)
+			break;
+
+		buffer_used += consumed;
+	} while (buffer_used < buffer->size);
+
+	cs_etm_decoder__free(decoder);
+}
+
 static int cs_etm__flush_events(struct perf_session *session,
 				struct perf_tool *tool)
 {
@@ -137,11 +210,38 @@ static int cs_etm__process_event(struct perf_session *session,
 
 static int cs_etm__process_auxtrace_event(struct perf_session *session,
 					  union perf_event *event,
-					  struct perf_tool *tool)
+					  struct perf_tool *tool __maybe_unused)
 {
-	(void) session;
-	(void) event;
-	(void) tool;
+	struct cs_etm_auxtrace *etm = container_of(session->auxtrace,
+						   struct cs_etm_auxtrace,
+						   auxtrace);
+	if (!etm->data_queued) {
+		struct auxtrace_buffer *buffer;
+		off_t  data_offset;
+		int fd = perf_data__fd(session->data);
+		bool is_pipe = perf_data__is_pipe(session->data);
+		int err;
+
+		if (is_pipe)
+			data_offset = 0;
+		else {
+			data_offset = lseek(fd, 0, SEEK_CUR);
+			if (data_offset == -1)
+				return -errno;
+		}
+
+		err = auxtrace_queues__add_event(&etm->queues, session,
+						 event, data_offset, &buffer);
+		if (err)
+			return err;
+
+		if (dump_trace)
+			if (auxtrace_buffer__get_data(buffer, fd)) {
+				cs_etm__dump_event(etm, buffer);
+				auxtrace_buffer__put_data(buffer);
+			}
+	}
+
 	return 0;
 }
 
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 52+ messages in thread

* [PATCH 05/10] perf tools: Add support for decoding CoreSight trace data
  2017-12-15 16:44 ` Mathieu Poirier
@ 2017-12-15 16:44   ` Mathieu Poirier
  -1 siblings, 0 replies; 52+ messages in thread
From: Mathieu Poirier @ 2017-12-15 16:44 UTC (permalink / raw)
  To: acme
  Cc: peterz, mingo, alexander.shishkin, namhyung, adrian.hunter,
	mike.leach, suzuki.poulosi, tor, jolsa, mathieu.poirier,
	linux-kernel, linux-arm-kernel

Adding functionality to create a CoreSight trace decoder capable
of decoding trace data pushed by a client application.

Co-authored-by: Tor Jeremiassen <tor@ti.com>
Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
---
 tools/perf/util/cs-etm-decoder/cs-etm-decoder.c | 119 ++++++++++++++++++++++++
 1 file changed, 119 insertions(+)

diff --git a/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c b/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c
index 6a4c86b1431f..57b020b0b36f 100644
--- a/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c
+++ b/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c
@@ -200,6 +200,121 @@ static void cs_etm_decoder__clear_buffer(struct cs_etm_decoder *decoder)
 	}
 }
 
+static ocsd_datapath_resp_t
+cs_etm_decoder__buffer_packet(struct cs_etm_decoder *decoder,
+			      const ocsd_generic_trace_elem *elem,
+			      const u8 trace_chan_id,
+			      enum cs_etm_sample_type sample_type)
+{
+	u32 et = 0;
+	struct int_node *inode = NULL;
+
+	if (decoder->packet_count >= MAX_BUFFER - 1)
+		return OCSD_RESP_FATAL_SYS_ERR;
+
+	/* Search the RB tree for the cpu associated with this traceID */
+	inode = intlist__find(traceid_list, trace_chan_id);
+	if (!inode)
+		return OCSD_RESP_FATAL_SYS_ERR;
+
+	et = decoder->tail;
+	decoder->packet_buffer[et].sample_type = sample_type;
+	decoder->packet_buffer[et].start_addr = elem->st_addr;
+	decoder->packet_buffer[et].end_addr = elem->en_addr;
+	decoder->packet_buffer[et].exc = false;
+	decoder->packet_buffer[et].exc_ret = false;
+	decoder->packet_buffer[et].cpu = *((int *)inode->priv);
+
+	/* Wrap around if need be */
+	et = (et + 1) & (MAX_BUFFER - 1);
+
+	decoder->tail = et;
+	decoder->packet_count++;
+
+	if (decoder->packet_count == MAX_BUFFER - 1)
+		return OCSD_RESP_WAIT;
+
+	return OCSD_RESP_CONT;
+}
+
+static ocsd_datapath_resp_t cs_etm_decoder__gen_trace_elem_printer(
+				const void *context,
+				const ocsd_trc_index_t indx __maybe_unused,
+				const u8 trace_chan_id __maybe_unused,
+				const ocsd_generic_trace_elem *elem)
+{
+	ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
+	struct cs_etm_decoder *decoder = (struct cs_etm_decoder *) context;
+
+	switch (elem->elem_type) {
+	case OCSD_GEN_TRC_ELEM_UNKNOWN:
+		break;
+	case OCSD_GEN_TRC_ELEM_NO_SYNC:
+		decoder->trace_on = false;
+		break;
+	case OCSD_GEN_TRC_ELEM_TRACE_ON:
+		decoder->trace_on = true;
+		break;
+	case OCSD_GEN_TRC_ELEM_INSTR_RANGE:
+		resp = cs_etm_decoder__buffer_packet(decoder, elem,
+						     trace_chan_id,
+						     CS_ETM_RANGE);
+		break;
+	case OCSD_GEN_TRC_ELEM_EXCEPTION:
+		decoder->packet_buffer[decoder->tail].exc = true;
+		break;
+	case OCSD_GEN_TRC_ELEM_EXCEPTION_RET:
+		decoder->packet_buffer[decoder->tail].exc_ret = true;
+		break;
+	case OCSD_GEN_TRC_ELEM_PE_CONTEXT:
+	case OCSD_GEN_TRC_ELEM_EO_TRACE:
+	case OCSD_GEN_TRC_ELEM_ADDR_NACC:
+	case OCSD_GEN_TRC_ELEM_TIMESTAMP:
+	case OCSD_GEN_TRC_ELEM_CYCLE_COUNT:
+	case OCSD_GEN_TRC_ELEM_ADDR_UNKNOWN:
+	case OCSD_GEN_TRC_ELEM_EVENT:
+	case OCSD_GEN_TRC_ELEM_SWTRACE:
+	case OCSD_GEN_TRC_ELEM_CUSTOM:
+	default:
+		break;
+	}
+
+	return resp;
+}
+
+static int cs_etm_decoder__create_etm_packet_decoder(
+					struct cs_etm_trace_params *t_params,
+					struct cs_etm_decoder *decoder)
+{
+	const char *decoder_name;
+	ocsd_etmv4_cfg trace_config_etmv4;
+	void *trace_config;
+	u8 csid;
+
+	switch (t_params->protocol) {
+	case CS_ETM_PROTO_ETMV4i:
+		cs_etm_decoder__gen_etmv4_config(t_params, &trace_config_etmv4);
+		decoder_name = OCSD_BUILTIN_DCD_ETMV4I;
+		trace_config = &trace_config_etmv4;
+		break;
+	default:
+		return -1;
+	}
+
+	if (ocsd_dt_create_decoder(decoder->dcd_tree,
+				     decoder_name,
+				     OCSD_CREATE_FLG_FULL_DECODER,
+				     trace_config, &csid))
+		return -1;
+
+	if (ocsd_dt_set_gen_elem_outfn(decoder->dcd_tree,
+				       cs_etm_decoder__gen_trace_elem_printer,
+				       decoder))
+		return -1;
+
+	return 0;
+}
+
 static int
 cs_etm_decoder__create_etm_decoder(struct cs_etm_decoder_params *d_params,
 				   struct cs_etm_trace_params *t_params,
@@ -208,6 +323,10 @@ cs_etm_decoder__create_etm_decoder(struct cs_etm_decoder_params *d_params,
 	if (d_params->operation == CS_ETM_OPERATION_PRINT)
 		return cs_etm_decoder__create_etm_packet_printer(t_params,
 								 decoder);
+	else if (d_params->operation == CS_ETM_OPERATION_DECODE)
+		return cs_etm_decoder__create_etm_packet_decoder(t_params,
+								 decoder);
+
 	return -1;
 }
 
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 52+ messages in thread

* [PATCH 05/10] perf tools: Add support for decoding CoreSight trace data
@ 2017-12-15 16:44   ` Mathieu Poirier
  0 siblings, 0 replies; 52+ messages in thread
From: Mathieu Poirier @ 2017-12-15 16:44 UTC (permalink / raw)
  To: linux-arm-kernel

Adding functionality to create a CoreSight trace decoder capable
of decoding trace data pushed by a client application.

Co-authored-by: Tor Jeremiassen <tor@ti.com>
Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
---
 tools/perf/util/cs-etm-decoder/cs-etm-decoder.c | 119 ++++++++++++++++++++++++
 1 file changed, 119 insertions(+)

diff --git a/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c b/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c
index 6a4c86b1431f..57b020b0b36f 100644
--- a/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c
+++ b/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c
@@ -200,6 +200,121 @@ static void cs_etm_decoder__clear_buffer(struct cs_etm_decoder *decoder)
 	}
 }
 
+static ocsd_datapath_resp_t
+cs_etm_decoder__buffer_packet(struct cs_etm_decoder *decoder,
+			      const ocsd_generic_trace_elem *elem,
+			      const u8 trace_chan_id,
+			      enum cs_etm_sample_type sample_type)
+{
+	u32 et = 0;
+	struct int_node *inode = NULL;
+
+	if (decoder->packet_count >= MAX_BUFFER - 1)
+		return OCSD_RESP_FATAL_SYS_ERR;
+
+	/* Search the RB tree for the cpu associated with this traceID */
+	inode = intlist__find(traceid_list, trace_chan_id);
+	if (!inode)
+		return OCSD_RESP_FATAL_SYS_ERR;
+
+	et = decoder->tail;
+	decoder->packet_buffer[et].sample_type = sample_type;
+	decoder->packet_buffer[et].start_addr = elem->st_addr;
+	decoder->packet_buffer[et].end_addr = elem->en_addr;
+	decoder->packet_buffer[et].exc = false;
+	decoder->packet_buffer[et].exc_ret = false;
+	decoder->packet_buffer[et].cpu = *((int *)inode->priv);
+
+	/* Wrap around if need be */
+	et = (et + 1) & (MAX_BUFFER - 1);
+
+	decoder->tail = et;
+	decoder->packet_count++;
+
+	if (decoder->packet_count == MAX_BUFFER - 1)
+		return OCSD_RESP_WAIT;
+
+	return OCSD_RESP_CONT;
+}
+
+static ocsd_datapath_resp_t cs_etm_decoder__gen_trace_elem_printer(
+				const void *context,
+				const ocsd_trc_index_t indx __maybe_unused,
+				const u8 trace_chan_id __maybe_unused,
+				const ocsd_generic_trace_elem *elem)
+{
+	ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
+	struct cs_etm_decoder *decoder = (struct cs_etm_decoder *) context;
+
+	switch (elem->elem_type) {
+	case OCSD_GEN_TRC_ELEM_UNKNOWN:
+		break;
+	case OCSD_GEN_TRC_ELEM_NO_SYNC:
+		decoder->trace_on = false;
+		break;
+	case OCSD_GEN_TRC_ELEM_TRACE_ON:
+		decoder->trace_on = true;
+		break;
+	case OCSD_GEN_TRC_ELEM_INSTR_RANGE:
+		resp = cs_etm_decoder__buffer_packet(decoder, elem,
+						     trace_chan_id,
+						     CS_ETM_RANGE);
+		break;
+	case OCSD_GEN_TRC_ELEM_EXCEPTION:
+		decoder->packet_buffer[decoder->tail].exc = true;
+		break;
+	case OCSD_GEN_TRC_ELEM_EXCEPTION_RET:
+		decoder->packet_buffer[decoder->tail].exc_ret = true;
+		break;
+	case OCSD_GEN_TRC_ELEM_PE_CONTEXT:
+	case OCSD_GEN_TRC_ELEM_EO_TRACE:
+	case OCSD_GEN_TRC_ELEM_ADDR_NACC:
+	case OCSD_GEN_TRC_ELEM_TIMESTAMP:
+	case OCSD_GEN_TRC_ELEM_CYCLE_COUNT:
+	case OCSD_GEN_TRC_ELEM_ADDR_UNKNOWN:
+	case OCSD_GEN_TRC_ELEM_EVENT:
+	case OCSD_GEN_TRC_ELEM_SWTRACE:
+	case OCSD_GEN_TRC_ELEM_CUSTOM:
+	default:
+		break;
+	}
+
+	return resp;
+}
+
+static int cs_etm_decoder__create_etm_packet_decoder(
+					struct cs_etm_trace_params *t_params,
+					struct cs_etm_decoder *decoder)
+{
+	const char *decoder_name;
+	ocsd_etmv4_cfg trace_config_etmv4;
+	void *trace_config;
+	u8 csid;
+
+	switch (t_params->protocol) {
+	case CS_ETM_PROTO_ETMV4i:
+		cs_etm_decoder__gen_etmv4_config(t_params, &trace_config_etmv4);
+		decoder_name = OCSD_BUILTIN_DCD_ETMV4I;
+		trace_config = &trace_config_etmv4;
+		break;
+	default:
+		return -1;
+	}
+
+	if (ocsd_dt_create_decoder(decoder->dcd_tree,
+				     decoder_name,
+				     OCSD_CREATE_FLG_FULL_DECODER,
+				     trace_config, &csid))
+		return -1;
+
+	if (ocsd_dt_set_gen_elem_outfn(decoder->dcd_tree,
+				       cs_etm_decoder__gen_trace_elem_printer,
+				       decoder))
+		return -1;
+
+	return 0;
+}
+
 static int
 cs_etm_decoder__create_etm_decoder(struct cs_etm_decoder_params *d_params,
 				   struct cs_etm_trace_params *t_params,
@@ -208,6 +323,10 @@ cs_etm_decoder__create_etm_decoder(struct cs_etm_decoder_params *d_params,
 	if (d_params->operation == CS_ETM_OPERATION_PRINT)
 		return cs_etm_decoder__create_etm_packet_printer(t_params,
 								 decoder);
+	else if (d_params->operation == CS_ETM_OPERATION_DECODE)
+		return cs_etm_decoder__create_etm_packet_decoder(t_params,
+								 decoder);
+
 	return -1;
 }
 
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 52+ messages in thread

* [PATCH 06/10] perf tools: Add functionality to communicate with the openCSD decoder
  2017-12-15 16:44 ` Mathieu Poirier
@ 2017-12-15 16:44   ` Mathieu Poirier
  -1 siblings, 0 replies; 52+ messages in thread
From: Mathieu Poirier @ 2017-12-15 16:44 UTC (permalink / raw)
  To: acme
  Cc: peterz, mingo, alexander.shishkin, namhyung, adrian.hunter,
	mike.leach, suzuki.poulosi, tor, jolsa, mathieu.poirier,
	linux-kernel, linux-arm-kernel

This patch adds functions to communicate with the openCSD trace decoder,
more specifically to access program memory, fetch trace packets and
reset the decoder.

Co-authored-by: Tor Jeremiassen <tor@ti.com>
Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
---
 tools/perf/util/cs-etm-decoder/cs-etm-decoder.c | 60 +++++++++++++++++++++++++
 tools/perf/util/cs-etm-decoder/cs-etm-decoder.h |  9 ++++
 2 files changed, 69 insertions(+)

diff --git a/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c b/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c
index 57b020b0b36f..1fb01849f1c7 100644
--- a/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c
+++ b/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c
@@ -45,6 +45,66 @@ struct cs_etm_decoder {
 	struct cs_etm_packet packet_buffer[MAX_BUFFER];
 };
 
+static u32
+cs_etm_decoder__mem_access(const void *context,
+			   const ocsd_vaddr_t address,
+			   const ocsd_mem_space_acc_t mem_space __maybe_unused,
+			   const u32 req_size,
+			   u8 *buffer)
+{
+	struct cs_etm_decoder *decoder = (struct cs_etm_decoder *) context;
+
+	return decoder->mem_access(decoder->data,
+				   address,
+				   req_size,
+				   buffer);
+}
+
+int cs_etm_decoder__add_mem_access_cb(struct cs_etm_decoder *decoder,
+				      u64 start, u64 end,
+				      cs_etm_mem_cb_type cb_func)
+{
+	decoder->mem_access = cb_func;
+
+	if (ocsd_dt_add_callback_mem_acc(decoder->dcd_tree, start, end,
+					 OCSD_MEM_SPACE_ANY,
+					 cs_etm_decoder__mem_access, decoder))
+		return -1;
+
+	return 0;
+}
+
+int cs_etm_decoder__reset(struct cs_etm_decoder *decoder)
+{
+	ocsd_datapath_resp_t dp_ret;
+
+	dp_ret = ocsd_dt_process_data(decoder->dcd_tree, OCSD_OP_RESET,
+				      0, 0, NULL, NULL);
+	if (OCSD_DATA_RESP_IS_FATAL(dp_ret))
+		return -1;
+
+	return 0;
+}
+
+int cs_etm_decoder__get_packet(struct cs_etm_decoder *decoder,
+			       struct cs_etm_packet *packet)
+{
+	if (!decoder || !packet)
+		return -EINVAL;
+
+	/* Nothing to do, might as well just return */
+	if (decoder->packet_count == 0)
+		return 0;
+
+	*packet = decoder->packet_buffer[decoder->head];
+
+	decoder->head = (decoder->head + 1) & (MAX_BUFFER - 1);
+
+	decoder->packet_count--;
+
+	return 1;
+}
+
 static void cs_etm_decoder__gen_etmv4_config(struct cs_etm_trace_params *params,
 					     ocsd_etmv4_cfg *config)
 {
diff --git a/tools/perf/util/cs-etm-decoder/cs-etm-decoder.h b/tools/perf/util/cs-etm-decoder/cs-etm-decoder.h
index a1e9b0ac5965..3d2e6205d186 100644
--- a/tools/perf/util/cs-etm-decoder/cs-etm-decoder.h
+++ b/tools/perf/util/cs-etm-decoder/cs-etm-decoder.h
@@ -93,4 +93,13 @@ cs_etm_decoder__new(int num_cpu,
 
 void cs_etm_decoder__free(struct cs_etm_decoder *decoder);
 
+int cs_etm_decoder__add_mem_access_cb(struct cs_etm_decoder *decoder,
+				      u64 start, u64 end,
+				      cs_etm_mem_cb_type cb_func);
+
+int cs_etm_decoder__get_packet(struct cs_etm_decoder *decoder,
+			       struct cs_etm_packet *packet);
+
+int cs_etm_decoder__reset(struct cs_etm_decoder *decoder);
+
 #endif /* INCLUDE__CS_ETM_DECODER_H__ */
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 52+ messages in thread

* [PATCH 06/10] perf tools: Add functionality to communicate with the openCSD decoder
@ 2017-12-15 16:44   ` Mathieu Poirier
  0 siblings, 0 replies; 52+ messages in thread
From: Mathieu Poirier @ 2017-12-15 16:44 UTC (permalink / raw)
  To: linux-arm-kernel

This patch adds functions to communicate with the openCSD trace decoder,
more specifically to access program memory, fetch trace packets and
reset the decoder.

Co-authored-by: Tor Jeremiassen <tor@ti.com>
Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
---
 tools/perf/util/cs-etm-decoder/cs-etm-decoder.c | 60 +++++++++++++++++++++++++
 tools/perf/util/cs-etm-decoder/cs-etm-decoder.h |  9 ++++
 2 files changed, 69 insertions(+)

diff --git a/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c b/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c
index 57b020b0b36f..1fb01849f1c7 100644
--- a/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c
+++ b/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c
@@ -45,6 +45,66 @@ struct cs_etm_decoder {
 	struct cs_etm_packet packet_buffer[MAX_BUFFER];
 };
 
+static u32
+cs_etm_decoder__mem_access(const void *context,
+			   const ocsd_vaddr_t address,
+			   const ocsd_mem_space_acc_t mem_space __maybe_unused,
+			   const u32 req_size,
+			   u8 *buffer)
+{
+	struct cs_etm_decoder *decoder = (struct cs_etm_decoder *) context;
+
+	return decoder->mem_access(decoder->data,
+				   address,
+				   req_size,
+				   buffer);
+}
+
+int cs_etm_decoder__add_mem_access_cb(struct cs_etm_decoder *decoder,
+				      u64 start, u64 end,
+				      cs_etm_mem_cb_type cb_func)
+{
+	decoder->mem_access = cb_func;
+
+	if (ocsd_dt_add_callback_mem_acc(decoder->dcd_tree, start, end,
+					 OCSD_MEM_SPACE_ANY,
+					 cs_etm_decoder__mem_access, decoder))
+		return -1;
+
+	return 0;
+}
+
+int cs_etm_decoder__reset(struct cs_etm_decoder *decoder)
+{
+	ocsd_datapath_resp_t dp_ret;
+
+	dp_ret = ocsd_dt_process_data(decoder->dcd_tree, OCSD_OP_RESET,
+				      0, 0, NULL, NULL);
+	if (OCSD_DATA_RESP_IS_FATAL(dp_ret))
+		return -1;
+
+	return 0;
+}
+
+int cs_etm_decoder__get_packet(struct cs_etm_decoder *decoder,
+			       struct cs_etm_packet *packet)
+{
+	if (!decoder || !packet)
+		return -EINVAL;
+
+	/* Nothing to do, might as well just return */
+	if (decoder->packet_count == 0)
+		return 0;
+
+	*packet = decoder->packet_buffer[decoder->head];
+
+	decoder->head = (decoder->head + 1) & (MAX_BUFFER - 1);
+
+	decoder->packet_count--;
+
+	return 1;
+}
+
 static void cs_etm_decoder__gen_etmv4_config(struct cs_etm_trace_params *params,
 					     ocsd_etmv4_cfg *config)
 {
diff --git a/tools/perf/util/cs-etm-decoder/cs-etm-decoder.h b/tools/perf/util/cs-etm-decoder/cs-etm-decoder.h
index a1e9b0ac5965..3d2e6205d186 100644
--- a/tools/perf/util/cs-etm-decoder/cs-etm-decoder.h
+++ b/tools/perf/util/cs-etm-decoder/cs-etm-decoder.h
@@ -93,4 +93,13 @@ cs_etm_decoder__new(int num_cpu,
 
 void cs_etm_decoder__free(struct cs_etm_decoder *decoder);
 
+int cs_etm_decoder__add_mem_access_cb(struct cs_etm_decoder *decoder,
+				      u64 start, u64 end,
+				      cs_etm_mem_cb_type cb_func);
+
+int cs_etm_decoder__get_packet(struct cs_etm_decoder *decoder,
+			       struct cs_etm_packet *packet);
+
+int cs_etm_decoder__reset(struct cs_etm_decoder *decoder);
+
 #endif /* INCLUDE__CS_ETM_DECODER_H__ */
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 52+ messages in thread

* [PATCH 07/10] pert tools: Add queue management functionality
  2017-12-15 16:44 ` Mathieu Poirier
@ 2017-12-15 16:44   ` Mathieu Poirier
  -1 siblings, 0 replies; 52+ messages in thread
From: Mathieu Poirier @ 2017-12-15 16:44 UTC (permalink / raw)
  To: acme
  Cc: peterz, mingo, alexander.shishkin, namhyung, adrian.hunter,
	mike.leach, suzuki.poulosi, tor, jolsa, mathieu.poirier,
	linux-kernel, linux-arm-kernel

Add functionatlity to setup trace queues so that traces associated with
CoreSight auxtrace events found in the perf.data file can be classified
properly.  The decoder and memory callback associated with each queue are
then used to decode the traces that have been assigned to that queue.

Co-authored-by: Tor Jeremiassen <tor@ti.com>
Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
---
 tools/perf/util/cs-etm.c | 208 ++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 204 insertions(+), 4 deletions(-)

diff --git a/tools/perf/util/cs-etm.c b/tools/perf/util/cs-etm.c
index cad429ce3c00..83eb676274b5 100644
--- a/tools/perf/util/cs-etm.c
+++ b/tools/perf/util/cs-etm.c
@@ -196,15 +196,215 @@ static void cs_etm__free(struct perf_session *session)
 	zfree(&aux);
 }
 
+static u32 cs_etm__mem_access(struct cs_etm_queue *etmq, u64 address,
+			      size_t size, u8 *buffer)
+{
+	u8  cpumode;
+	u64 offset;
+	int len;
+	struct	 thread *thread;
+	struct	 machine *machine;
+	struct	 addr_location al;
+
+	if (!etmq)
+		return -1;
+
+	machine = etmq->etm->machine;
+	if (address >= etmq->etm->kernel_start)
+		cpumode = PERF_RECORD_MISC_KERNEL;
+	else
+		cpumode = PERF_RECORD_MISC_USER;
+
+	thread = etmq->thread;
+	if (!thread) {
+		if (cpumode != PERF_RECORD_MISC_KERNEL)
+			return -EINVAL;
+		thread = etmq->etm->unknown_thread;
+	}
+
+	thread__find_addr_map(thread, cpumode, MAP__FUNCTION, address, &al);
+
+	if (!al.map || !al.map->dso)
+		return 0;
+
+	if (al.map->dso->data.status == DSO_DATA_STATUS_ERROR &&
+	    dso__data_status_seen(al.map->dso, DSO_DATA_STATUS_SEEN_ITRACE))
+		return 0;
+
+	offset = al.map->map_ip(al.map, address);
+
+	map__load(al.map);
+
+	len = dso__data_read_offset(al.map->dso, machine, offset, buffer, size);
+
+	if (len <= 0)
+		return 0;
+
+	return len;
+}
+
+static struct cs_etm_queue *cs_etm__alloc_queue(struct cs_etm_auxtrace *etm,
+						unsigned int queue_nr)
+{
+	int i;
+	struct cs_etm_decoder_params d_params;
+	struct cs_etm_trace_params  *t_params;
+	struct cs_etm_queue *etmq;
+
+	etmq = zalloc(sizeof(*etmq));
+	if (!etmq)
+		return NULL;
+
+	etmq->event_buf = malloc(PERF_SAMPLE_MAX_SIZE);
+	if (!etmq->event_buf)
+		goto out_free;
+
+	etmq->etm = etm;
+	etmq->queue_nr = queue_nr;
+	etmq->pid = -1;
+	etmq->tid = -1;
+	etmq->cpu = -1;
+
+	/* Use metadata to fill in trace parameters for trace decoder */
+	t_params = zalloc(sizeof(*t_params) * etm->num_cpu);
+
+	if (!t_params)
+		goto out_free;
+
+	for (i = 0; i < etm->num_cpu; i++) {
+		t_params[i].protocol = CS_ETM_PROTO_ETMV4i;
+		t_params[i].etmv4.reg_idr0 = etm->metadata[i][CS_ETMV4_TRCIDR0];
+		t_params[i].etmv4.reg_idr1 = etm->metadata[i][CS_ETMV4_TRCIDR1];
+		t_params[i].etmv4.reg_idr2 = etm->metadata[i][CS_ETMV4_TRCIDR2];
+		t_params[i].etmv4.reg_idr8 = etm->metadata[i][CS_ETMV4_TRCIDR8];
+		t_params[i].etmv4.reg_configr =
+					etm->metadata[i][CS_ETMV4_TRCCONFIGR];
+		t_params[i].etmv4.reg_traceidr =
+					etm->metadata[i][CS_ETMV4_TRCTRACEIDR];
+	}
+
+	/* Set decoder parameters to simply print the trace packets */
+	d_params.packet_printer = cs_etm__packet_dump;
+	d_params.operation = CS_ETM_OPERATION_DECODE;
+	d_params.formatted = true;
+	d_params.fsyncs = false;
+	d_params.hsyncs = false;
+	d_params.frame_aligned = true;
+	d_params.data = etmq;
+
+	etmq->decoder = cs_etm_decoder__new(etm->num_cpu, &d_params, t_params);
+
+	zfree(&t_params);
+
+	if (!etmq->decoder)
+		goto out_free;
+
+	/*
+	 * Register a function to handle all memory accesses required by
+	 * the trace decoder library.
+	 */
+	if (cs_etm_decoder__add_mem_access_cb(etmq->decoder,
+					      0x0L, ((u64) -1L),
+					      cs_etm__mem_access))
+		goto out_free_decoder;
+
+	etmq->offset = 0;
+
+	return etmq;
+
+out_free_decoder:
+	cs_etm_decoder__free(etmq->decoder);
+out_free:
+	zfree(&etmq->event_buf);
+	free(etmq);
+
+	return NULL;
+}
+
+static int cs_etm__setup_queue(struct cs_etm_auxtrace *etm,
+			       struct auxtrace_queue *queue,
+			       unsigned int queue_nr)
+{
+	struct cs_etm_queue *etmq = queue->priv;
+
+	if (list_empty(&queue->head) || etmq)
+		return 0;
+
+	etmq = cs_etm__alloc_queue(etm, queue_nr);
+
+	if (!etmq)
+		return -ENOMEM;
+
+	queue->priv = etmq;
+
+	if (queue->cpu != -1)
+		etmq->cpu = queue->cpu;
+
+	etmq->tid = queue->tid;
+
+	return 0;
+}
+
+static int cs_etm__setup_queues(struct cs_etm_auxtrace *etm)
+{
+	unsigned int i;
+	int ret;
+
+	for (i = 0; i < etm->queues.nr_queues; i++) {
+		ret = cs_etm__setup_queue(etm, &etm->queues.queue_array[i], i);
+		if (ret)
+			return ret;
+	}
+
+	return 0;
+}
+
+static int cs_etm__update_queues(struct cs_etm_auxtrace *etm)
+{
+	if (etm->queues.new_data) {
+		etm->queues.new_data = false;
+		return cs_etm__setup_queues(etm);
+	}
+
+	return 0;
+}
+
 static int cs_etm__process_event(struct perf_session *session,
 				 union perf_event *event,
 				 struct perf_sample *sample,
 				 struct perf_tool *tool)
 {
-	(void) session;
-	(void) event;
-	(void) sample;
-	(void) tool;
+	int err = 0;
+	u64 timestamp;
+	struct cs_etm_auxtrace *etm = container_of(session->auxtrace,
+						   struct cs_etm_auxtrace,
+						   auxtrace);
+
+	/* Keep compiler happy */
+	(void)event;
+
+	if (dump_trace)
+		return 0;
+
+	if (!tool->ordered_events) {
+		pr_err("CoreSight ETM Trace requires ordered events\n");
+		return -EINVAL;
+	}
+
+	if (!etm->timeless_decoding)
+		return -EINVAL;
+
+	if (sample->time && (sample->time != (u64) -1))
+		timestamp = sample->time;
+	else
+		timestamp = 0;
+
+	if (timestamp || etm->timeless_decoding) {
+		err = cs_etm__update_queues(etm);
+		if (err)
+			return err;
+	}
+
 	return 0;
 }
 
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 52+ messages in thread

* [PATCH 07/10] pert tools: Add queue management functionality
@ 2017-12-15 16:44   ` Mathieu Poirier
  0 siblings, 0 replies; 52+ messages in thread
From: Mathieu Poirier @ 2017-12-15 16:44 UTC (permalink / raw)
  To: linux-arm-kernel

Add functionatlity to setup trace queues so that traces associated with
CoreSight auxtrace events found in the perf.data file can be classified
properly.  The decoder and memory callback associated with each queue are
then used to decode the traces that have been assigned to that queue.

Co-authored-by: Tor Jeremiassen <tor@ti.com>
Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
---
 tools/perf/util/cs-etm.c | 208 ++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 204 insertions(+), 4 deletions(-)

diff --git a/tools/perf/util/cs-etm.c b/tools/perf/util/cs-etm.c
index cad429ce3c00..83eb676274b5 100644
--- a/tools/perf/util/cs-etm.c
+++ b/tools/perf/util/cs-etm.c
@@ -196,15 +196,215 @@ static void cs_etm__free(struct perf_session *session)
 	zfree(&aux);
 }
 
+static u32 cs_etm__mem_access(struct cs_etm_queue *etmq, u64 address,
+			      size_t size, u8 *buffer)
+{
+	u8  cpumode;
+	u64 offset;
+	int len;
+	struct	 thread *thread;
+	struct	 machine *machine;
+	struct	 addr_location al;
+
+	if (!etmq)
+		return -1;
+
+	machine = etmq->etm->machine;
+	if (address >= etmq->etm->kernel_start)
+		cpumode = PERF_RECORD_MISC_KERNEL;
+	else
+		cpumode = PERF_RECORD_MISC_USER;
+
+	thread = etmq->thread;
+	if (!thread) {
+		if (cpumode != PERF_RECORD_MISC_KERNEL)
+			return -EINVAL;
+		thread = etmq->etm->unknown_thread;
+	}
+
+	thread__find_addr_map(thread, cpumode, MAP__FUNCTION, address, &al);
+
+	if (!al.map || !al.map->dso)
+		return 0;
+
+	if (al.map->dso->data.status == DSO_DATA_STATUS_ERROR &&
+	    dso__data_status_seen(al.map->dso, DSO_DATA_STATUS_SEEN_ITRACE))
+		return 0;
+
+	offset = al.map->map_ip(al.map, address);
+
+	map__load(al.map);
+
+	len = dso__data_read_offset(al.map->dso, machine, offset, buffer, size);
+
+	if (len <= 0)
+		return 0;
+
+	return len;
+}
+
+static struct cs_etm_queue *cs_etm__alloc_queue(struct cs_etm_auxtrace *etm,
+						unsigned int queue_nr)
+{
+	int i;
+	struct cs_etm_decoder_params d_params;
+	struct cs_etm_trace_params  *t_params;
+	struct cs_etm_queue *etmq;
+
+	etmq = zalloc(sizeof(*etmq));
+	if (!etmq)
+		return NULL;
+
+	etmq->event_buf = malloc(PERF_SAMPLE_MAX_SIZE);
+	if (!etmq->event_buf)
+		goto out_free;
+
+	etmq->etm = etm;
+	etmq->queue_nr = queue_nr;
+	etmq->pid = -1;
+	etmq->tid = -1;
+	etmq->cpu = -1;
+
+	/* Use metadata to fill in trace parameters for trace decoder */
+	t_params = zalloc(sizeof(*t_params) * etm->num_cpu);
+
+	if (!t_params)
+		goto out_free;
+
+	for (i = 0; i < etm->num_cpu; i++) {
+		t_params[i].protocol = CS_ETM_PROTO_ETMV4i;
+		t_params[i].etmv4.reg_idr0 = etm->metadata[i][CS_ETMV4_TRCIDR0];
+		t_params[i].etmv4.reg_idr1 = etm->metadata[i][CS_ETMV4_TRCIDR1];
+		t_params[i].etmv4.reg_idr2 = etm->metadata[i][CS_ETMV4_TRCIDR2];
+		t_params[i].etmv4.reg_idr8 = etm->metadata[i][CS_ETMV4_TRCIDR8];
+		t_params[i].etmv4.reg_configr =
+					etm->metadata[i][CS_ETMV4_TRCCONFIGR];
+		t_params[i].etmv4.reg_traceidr =
+					etm->metadata[i][CS_ETMV4_TRCTRACEIDR];
+	}
+
+	/* Set decoder parameters to simply print the trace packets */
+	d_params.packet_printer = cs_etm__packet_dump;
+	d_params.operation = CS_ETM_OPERATION_DECODE;
+	d_params.formatted = true;
+	d_params.fsyncs = false;
+	d_params.hsyncs = false;
+	d_params.frame_aligned = true;
+	d_params.data = etmq;
+
+	etmq->decoder = cs_etm_decoder__new(etm->num_cpu, &d_params, t_params);
+
+	zfree(&t_params);
+
+	if (!etmq->decoder)
+		goto out_free;
+
+	/*
+	 * Register a function to handle all memory accesses required by
+	 * the trace decoder library.
+	 */
+	if (cs_etm_decoder__add_mem_access_cb(etmq->decoder,
+					      0x0L, ((u64) -1L),
+					      cs_etm__mem_access))
+		goto out_free_decoder;
+
+	etmq->offset = 0;
+
+	return etmq;
+
+out_free_decoder:
+	cs_etm_decoder__free(etmq->decoder);
+out_free:
+	zfree(&etmq->event_buf);
+	free(etmq);
+
+	return NULL;
+}
+
+static int cs_etm__setup_queue(struct cs_etm_auxtrace *etm,
+			       struct auxtrace_queue *queue,
+			       unsigned int queue_nr)
+{
+	struct cs_etm_queue *etmq = queue->priv;
+
+	if (list_empty(&queue->head) || etmq)
+		return 0;
+
+	etmq = cs_etm__alloc_queue(etm, queue_nr);
+
+	if (!etmq)
+		return -ENOMEM;
+
+	queue->priv = etmq;
+
+	if (queue->cpu != -1)
+		etmq->cpu = queue->cpu;
+
+	etmq->tid = queue->tid;
+
+	return 0;
+}
+
+static int cs_etm__setup_queues(struct cs_etm_auxtrace *etm)
+{
+	unsigned int i;
+	int ret;
+
+	for (i = 0; i < etm->queues.nr_queues; i++) {
+		ret = cs_etm__setup_queue(etm, &etm->queues.queue_array[i], i);
+		if (ret)
+			return ret;
+	}
+
+	return 0;
+}
+
+static int cs_etm__update_queues(struct cs_etm_auxtrace *etm)
+{
+	if (etm->queues.new_data) {
+		etm->queues.new_data = false;
+		return cs_etm__setup_queues(etm);
+	}
+
+	return 0;
+}
+
 static int cs_etm__process_event(struct perf_session *session,
 				 union perf_event *event,
 				 struct perf_sample *sample,
 				 struct perf_tool *tool)
 {
-	(void) session;
-	(void) event;
-	(void) sample;
-	(void) tool;
+	int err = 0;
+	u64 timestamp;
+	struct cs_etm_auxtrace *etm = container_of(session->auxtrace,
+						   struct cs_etm_auxtrace,
+						   auxtrace);
+
+	/* Keep compiler happy */
+	(void)event;
+
+	if (dump_trace)
+		return 0;
+
+	if (!tool->ordered_events) {
+		pr_err("CoreSight ETM Trace requires ordered events\n");
+		return -EINVAL;
+	}
+
+	if (!etm->timeless_decoding)
+		return -EINVAL;
+
+	if (sample->time && (sample->time != (u64) -1))
+		timestamp = sample->time;
+	else
+		timestamp = 0;
+
+	if (timestamp || etm->timeless_decoding) {
+		err = cs_etm__update_queues(etm);
+		if (err)
+			return err;
+	}
+
 	return 0;
 }
 
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 52+ messages in thread

* [PATCH 08/10] perf tools: Add full support for CoreSight trace decoding
  2017-12-15 16:44 ` Mathieu Poirier
@ 2017-12-15 16:44   ` Mathieu Poirier
  -1 siblings, 0 replies; 52+ messages in thread
From: Mathieu Poirier @ 2017-12-15 16:44 UTC (permalink / raw)
  To: acme
  Cc: peterz, mingo, alexander.shishkin, namhyung, adrian.hunter,
	mike.leach, suzuki.poulosi, tor, jolsa, mathieu.poirier,
	linux-kernel, linux-arm-kernel

This patch adds support for complete packet decoding, allowing
traces collected during a trace session to be decoder from the
"report" infrastructure.

Co-authored-by: Tor Jeremiassen <tor@ti.com>
Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
---
 tools/perf/util/cs-etm.c | 166 +++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 160 insertions(+), 6 deletions(-)

diff --git a/tools/perf/util/cs-etm.c b/tools/perf/util/cs-etm.c
index 83eb676274b5..407095af1456 100644
--- a/tools/perf/util/cs-etm.c
+++ b/tools/perf/util/cs-etm.c
@@ -70,6 +70,10 @@ struct cs_etm_queue {
 	u64 offset;
 };
 
+static int cs_etm__update_queues(struct cs_etm_auxtrace *etm);
+static int cs_etm__process_timeless_queues(struct cs_etm_auxtrace *etm,
+					   pid_t tid, u64 time_);
+
 static void cs_etm__packet_dump(const char *pkt_string)
 {
 	const char *color = PERF_COLOR_BLUE;
@@ -145,9 +149,25 @@ static void cs_etm__dump_event(struct cs_etm_auxtrace *etm,
 static int cs_etm__flush_events(struct perf_session *session,
 				struct perf_tool *tool)
 {
-	(void) session;
-	(void) tool;
-	return 0;
+	int ret;
+	struct cs_etm_auxtrace *etm = container_of(session->auxtrace,
+						   struct cs_etm_auxtrace,
+						   auxtrace);
+	if (dump_trace)
+		return 0;
+
+	if (!tool->ordered_events)
+		return -EINVAL;
+
+	if (!etm->timeless_decoding)
+		return -EINVAL;
+
+	ret = cs_etm__update_queues(etm);
+
+	if (ret < 0)
+		return ret;
+
+	return cs_etm__process_timeless_queues(etm, -1, MAX_TIMESTAMP - 1);
 }
 
 static void cs_etm__free_queue(void *priv)
@@ -369,6 +389,138 @@ static int cs_etm__update_queues(struct cs_etm_auxtrace *etm)
 	return 0;
 }
 
+static int
+cs_etm__get_trace(struct cs_etm_buffer *buff, struct cs_etm_queue *etmq)
+{
+	struct auxtrace_buffer *aux_buffer = etmq->buffer;
+	struct auxtrace_buffer *old_buffer = aux_buffer;
+	struct auxtrace_queue *queue;
+
+	queue = &etmq->etm->queues.queue_array[etmq->queue_nr];
+
+	aux_buffer = auxtrace_buffer__next(queue, aux_buffer);
+
+	/* If no more data, drop the previous auxtrace_buffer and return */
+	if (!aux_buffer) {
+		if (old_buffer)
+			auxtrace_buffer__drop_data(old_buffer);
+		buff->len = 0;
+		return 0;
+	}
+
+	etmq->buffer = aux_buffer;
+
+	/* If the aux_buffer doesn't have data associated, try to load it */
+	if (!aux_buffer->data) {
+		/* get the file desc associated with the perf data file */
+		int fd = perf_data__fd(etmq->etm->session->data);
+
+		aux_buffer->data = auxtrace_buffer__get_data(aux_buffer, fd);
+		if (!aux_buffer->data)
+			return -ENOMEM;
+	}
+
+	/* If valid, drop the previous buffer */
+	if (old_buffer)
+		auxtrace_buffer__drop_data(old_buffer);
+
+	buff->offset = aux_buffer->offset;
+	buff->len = aux_buffer->size;
+	buff->buf = aux_buffer->data;
+
+	buff->ref_timestamp = aux_buffer->reference;
+
+	return buff->len;
+}
+
+static void  cs_etm__set_pid_tid_cpu(struct cs_etm_auxtrace *etm,
+				     struct auxtrace_queue *queue)
+{
+	struct cs_etm_queue *etmq = queue->priv;
+
+	/* CPU-wide tracing isn't supported yet */
+	if (queue->tid == -1)
+		return;
+
+	if ((!etmq->thread) && (etmq->tid != -1))
+		etmq->thread = machine__find_thread(etm->machine, -1,
+						    etmq->tid);
+
+	if (etmq->thread) {
+		etmq->pid = etmq->thread->pid_;
+		if (queue->cpu == -1)
+			etmq->cpu = etmq->thread->cpu;
+	}
+}
+
+static int cs_etm__run_decoder(struct cs_etm_queue *etmq)
+{
+	struct cs_etm_auxtrace *etm = etmq->etm;
+	struct cs_etm_buffer buffer;
+	size_t buffer_used, processed;
+	int err = 0;
+
+	if (!etm->kernel_start)
+		etm->kernel_start = machine__kernel_start(etm->machine);
+
+	/* Go through each buffer in the queue and decode them one by one */
+more:
+	buffer_used = 0;
+	memset(&buffer, 0, sizeof(buffer));
+	err = cs_etm__get_trace(&buffer, etmq);
+	if (err <= 0)
+		return err;
+	/*
+	 * We cannot assume consecutive blocks in the data file are contiguous,
+	 * reset the decoder to force re-sync.
+	 */
+	err = cs_etm_decoder__reset(etmq->decoder);
+	if (err != 0)
+		return err;
+
+	/* Run trace decoder until buffer consumed or end of trace */
+	do {
+		processed = 0;
+
+		err = cs_etm_decoder__process_data_block(
+						etmq->decoder,
+						etmq->offset,
+						&buffer.buf[buffer_used],
+						buffer.len - buffer_used,
+						&processed);
+
+		if (err)
+			return err;
+
+		etmq->offset += processed;
+		buffer_used += processed;
+	} while (buffer.len > buffer_used);
+
+goto more;
+
+	return err;
+}
+
+static int cs_etm__process_timeless_queues(struct cs_etm_auxtrace *etm,
+					   pid_t tid, u64 time_)
+{
+	unsigned int i;
+	struct auxtrace_queues *queues = &etm->queues;
+
+	for (i = 0; i < queues->nr_queues; i++) {
+		struct auxtrace_queue *queue = &etm->queues.queue_array[i];
+		struct cs_etm_queue *etmq = queue->priv;
+
+		if (etmq && ((tid == -1) || (etmq->tid == tid))) {
+			etmq->time = time_;
+			cs_etm__set_pid_tid_cpu(etm, queue);
+			cs_etm__run_decoder(etmq);
+		}
+	}
+
+	return 0;
+}
+
 static int cs_etm__process_event(struct perf_session *session,
 				 union perf_event *event,
 				 struct perf_sample *sample,
@@ -380,9 +532,6 @@ static int cs_etm__process_event(struct perf_session *session,
 						   struct cs_etm_auxtrace,
 						   auxtrace);
 
-	/* Keep compiler happy */
-	(void)event;
-
 	if (dump_trace)
 		return 0;
 
@@ -405,6 +554,11 @@ static int cs_etm__process_event(struct perf_session *session,
 			return err;
 	}
 
+	if (event->header.type == PERF_RECORD_EXIT)
+		return cs_etm__process_timeless_queues(etm,
+						       event->fork.tid,
+						       sample->time);
+
 	return 0;
 }
 
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 52+ messages in thread

* [PATCH 08/10] perf tools: Add full support for CoreSight trace decoding
@ 2017-12-15 16:44   ` Mathieu Poirier
  0 siblings, 0 replies; 52+ messages in thread
From: Mathieu Poirier @ 2017-12-15 16:44 UTC (permalink / raw)
  To: linux-arm-kernel

This patch adds support for complete packet decoding, allowing
traces collected during a trace session to be decoder from the
"report" infrastructure.

Co-authored-by: Tor Jeremiassen <tor@ti.com>
Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
---
 tools/perf/util/cs-etm.c | 166 +++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 160 insertions(+), 6 deletions(-)

diff --git a/tools/perf/util/cs-etm.c b/tools/perf/util/cs-etm.c
index 83eb676274b5..407095af1456 100644
--- a/tools/perf/util/cs-etm.c
+++ b/tools/perf/util/cs-etm.c
@@ -70,6 +70,10 @@ struct cs_etm_queue {
 	u64 offset;
 };
 
+static int cs_etm__update_queues(struct cs_etm_auxtrace *etm);
+static int cs_etm__process_timeless_queues(struct cs_etm_auxtrace *etm,
+					   pid_t tid, u64 time_);
+
 static void cs_etm__packet_dump(const char *pkt_string)
 {
 	const char *color = PERF_COLOR_BLUE;
@@ -145,9 +149,25 @@ static void cs_etm__dump_event(struct cs_etm_auxtrace *etm,
 static int cs_etm__flush_events(struct perf_session *session,
 				struct perf_tool *tool)
 {
-	(void) session;
-	(void) tool;
-	return 0;
+	int ret;
+	struct cs_etm_auxtrace *etm = container_of(session->auxtrace,
+						   struct cs_etm_auxtrace,
+						   auxtrace);
+	if (dump_trace)
+		return 0;
+
+	if (!tool->ordered_events)
+		return -EINVAL;
+
+	if (!etm->timeless_decoding)
+		return -EINVAL;
+
+	ret = cs_etm__update_queues(etm);
+
+	if (ret < 0)
+		return ret;
+
+	return cs_etm__process_timeless_queues(etm, -1, MAX_TIMESTAMP - 1);
 }
 
 static void cs_etm__free_queue(void *priv)
@@ -369,6 +389,138 @@ static int cs_etm__update_queues(struct cs_etm_auxtrace *etm)
 	return 0;
 }
 
+static int
+cs_etm__get_trace(struct cs_etm_buffer *buff, struct cs_etm_queue *etmq)
+{
+	struct auxtrace_buffer *aux_buffer = etmq->buffer;
+	struct auxtrace_buffer *old_buffer = aux_buffer;
+	struct auxtrace_queue *queue;
+
+	queue = &etmq->etm->queues.queue_array[etmq->queue_nr];
+
+	aux_buffer = auxtrace_buffer__next(queue, aux_buffer);
+
+	/* If no more data, drop the previous auxtrace_buffer and return */
+	if (!aux_buffer) {
+		if (old_buffer)
+			auxtrace_buffer__drop_data(old_buffer);
+		buff->len = 0;
+		return 0;
+	}
+
+	etmq->buffer = aux_buffer;
+
+	/* If the aux_buffer doesn't have data associated, try to load it */
+	if (!aux_buffer->data) {
+		/* get the file desc associated with the perf data file */
+		int fd = perf_data__fd(etmq->etm->session->data);
+
+		aux_buffer->data = auxtrace_buffer__get_data(aux_buffer, fd);
+		if (!aux_buffer->data)
+			return -ENOMEM;
+	}
+
+	/* If valid, drop the previous buffer */
+	if (old_buffer)
+		auxtrace_buffer__drop_data(old_buffer);
+
+	buff->offset = aux_buffer->offset;
+	buff->len = aux_buffer->size;
+	buff->buf = aux_buffer->data;
+
+	buff->ref_timestamp = aux_buffer->reference;
+
+	return buff->len;
+}
+
+static void  cs_etm__set_pid_tid_cpu(struct cs_etm_auxtrace *etm,
+				     struct auxtrace_queue *queue)
+{
+	struct cs_etm_queue *etmq = queue->priv;
+
+	/* CPU-wide tracing isn't supported yet */
+	if (queue->tid == -1)
+		return;
+
+	if ((!etmq->thread) && (etmq->tid != -1))
+		etmq->thread = machine__find_thread(etm->machine, -1,
+						    etmq->tid);
+
+	if (etmq->thread) {
+		etmq->pid = etmq->thread->pid_;
+		if (queue->cpu == -1)
+			etmq->cpu = etmq->thread->cpu;
+	}
+}
+
+static int cs_etm__run_decoder(struct cs_etm_queue *etmq)
+{
+	struct cs_etm_auxtrace *etm = etmq->etm;
+	struct cs_etm_buffer buffer;
+	size_t buffer_used, processed;
+	int err = 0;
+
+	if (!etm->kernel_start)
+		etm->kernel_start = machine__kernel_start(etm->machine);
+
+	/* Go through each buffer in the queue and decode them one by one */
+more:
+	buffer_used = 0;
+	memset(&buffer, 0, sizeof(buffer));
+	err = cs_etm__get_trace(&buffer, etmq);
+	if (err <= 0)
+		return err;
+	/*
+	 * We cannot assume consecutive blocks in the data file are contiguous,
+	 * reset the decoder to force re-sync.
+	 */
+	err = cs_etm_decoder__reset(etmq->decoder);
+	if (err != 0)
+		return err;
+
+	/* Run trace decoder until buffer consumed or end of trace */
+	do {
+		processed = 0;
+
+		err = cs_etm_decoder__process_data_block(
+						etmq->decoder,
+						etmq->offset,
+						&buffer.buf[buffer_used],
+						buffer.len - buffer_used,
+						&processed);
+
+		if (err)
+			return err;
+
+		etmq->offset += processed;
+		buffer_used += processed;
+	} while (buffer.len > buffer_used);
+
+goto more;
+
+	return err;
+}
+
+static int cs_etm__process_timeless_queues(struct cs_etm_auxtrace *etm,
+					   pid_t tid, u64 time_)
+{
+	unsigned int i;
+	struct auxtrace_queues *queues = &etm->queues;
+
+	for (i = 0; i < queues->nr_queues; i++) {
+		struct auxtrace_queue *queue = &etm->queues.queue_array[i];
+		struct cs_etm_queue *etmq = queue->priv;
+
+		if (etmq && ((tid == -1) || (etmq->tid == tid))) {
+			etmq->time = time_;
+			cs_etm__set_pid_tid_cpu(etm, queue);
+			cs_etm__run_decoder(etmq);
+		}
+	}
+
+	return 0;
+}
+
 static int cs_etm__process_event(struct perf_session *session,
 				 union perf_event *event,
 				 struct perf_sample *sample,
@@ -380,9 +532,6 @@ static int cs_etm__process_event(struct perf_session *session,
 						   struct cs_etm_auxtrace,
 						   auxtrace);
 
-	/* Keep compiler happy */
-	(void)event;
-
 	if (dump_trace)
 		return 0;
 
@@ -405,6 +554,11 @@ static int cs_etm__process_event(struct perf_session *session,
 			return err;
 	}
 
+	if (event->header.type == PERF_RECORD_EXIT)
+		return cs_etm__process_timeless_queues(etm,
+						       event->fork.tid,
+						       sample->time);
+
 	return 0;
 }
 
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 52+ messages in thread

* [PATCH 09/10] perf tools: Add mechanic to synthesise CoreSight trace packets
  2017-12-15 16:44 ` Mathieu Poirier
@ 2017-12-15 16:44   ` Mathieu Poirier
  -1 siblings, 0 replies; 52+ messages in thread
From: Mathieu Poirier @ 2017-12-15 16:44 UTC (permalink / raw)
  To: acme
  Cc: peterz, mingo, alexander.shishkin, namhyung, adrian.hunter,
	mike.leach, suzuki.poulosi, tor, jolsa, mathieu.poirier,
	linux-kernel, linux-arm-kernel

Once decoded from trace packets information on trace range needs
to be communicated to the perf synthesis infrastructure so that it
is available to the perf tools built-in rendering tools and scripts.

Co-authored-by: Tor Jeremiassen <tor@ti.com>
Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
---
 tools/perf/util/cs-etm.c | 168 +++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 168 insertions(+)

diff --git a/tools/perf/util/cs-etm.c b/tools/perf/util/cs-etm.c
index 407095af1456..b9f0a53dfa65 100644
--- a/tools/perf/util/cs-etm.c
+++ b/tools/perf/util/cs-etm.c
@@ -453,6 +453,157 @@ static void  cs_etm__set_pid_tid_cpu(struct cs_etm_auxtrace *etm,
 	}
 }
 
+/*
+ * The cs etm packet encodes an instruction range between a branch target
+ * and the next taken branch. Generate sample accordingly.
+ */
+static int cs_etm__synth_branch_sample(struct cs_etm_queue *etmq,
+				       struct cs_etm_packet *packet)
+{
+	int ret = 0;
+	struct cs_etm_auxtrace *etm = etmq->etm;
+	struct perf_sample sample = {.ip = 0,};
+	union perf_event *event = etmq->event_buf;
+	u64 start_addr = packet->start_addr;
+	u64 end_addr = packet->end_addr;
+
+	event->sample.header.type = PERF_RECORD_SAMPLE;
+	event->sample.header.misc = PERF_RECORD_MISC_USER;
+	event->sample.header.size = sizeof(struct perf_event_header);
+
+	sample.ip = start_addr;
+	sample.pid = etmq->pid;
+	sample.tid = etmq->tid;
+	sample.addr = end_addr;
+	sample.id = etmq->etm->branches_id;
+	sample.stream_id = etmq->etm->branches_id;
+	sample.period = 1;
+	sample.cpu = packet->cpu;
+	sample.flags = 0;
+	sample.cpumode = PERF_RECORD_MISC_USER;
+
+	ret = perf_session__deliver_synth_event(etm->session, event, &sample);
+
+	if (ret)
+		pr_err(
+		"CS ETM Trace: failed to deliver instruction event, error %d\n",
+		ret);
+
+	return ret;
+}
+
+struct cs_etm_synth {
+	struct perf_tool dummy_tool;
+	struct perf_session *session;
+};
+
+static int cs_etm__event_synth(struct perf_tool *tool,
+			       union perf_event *event,
+			       struct perf_sample *sample __maybe_unused,
+			       struct machine *machine __maybe_unused)
+{
+	struct cs_etm_synth *cs_etm_synth =
+		      container_of(tool, struct cs_etm_synth, dummy_tool);
+
+	return perf_session__deliver_synth_event(cs_etm_synth->session,
+						 event, NULL);
+}
+
+static int cs_etm__synth_event(struct perf_session *session,
+			       struct perf_event_attr *attr, u64 id)
+{
+	struct cs_etm_synth cs_etm_synth;
+
+	memset(&cs_etm_synth, 0, sizeof(struct cs_etm_synth));
+	cs_etm_synth.session = session;
+
+	return perf_event__synthesize_attr(&cs_etm_synth.dummy_tool, attr, 1,
+					   &id, cs_etm__event_synth);
+}
+
+static int cs_etm__synth_events(struct cs_etm_auxtrace *etm,
+				struct perf_session *session)
+{
+	struct perf_evlist *evlist = session->evlist;
+	struct perf_evsel *evsel;
+	struct perf_event_attr attr;
+	bool found = false;
+	u64 id;
+	int err;
+
+	evlist__for_each_entry(evlist, evsel) {
+		if (evsel->attr.type == etm->pmu_type) {
+			found = true;
+			break;
+		}
+	}
+
+	if (!found) {
+		pr_debug("No selected events with CoreSight Trace data\n");
+		return 0;
+	}
+
+	memset(&attr, 0, sizeof(struct perf_event_attr));
+	attr.size = sizeof(struct perf_event_attr);
+	attr.type = PERF_TYPE_HARDWARE;
+	attr.sample_type = evsel->attr.sample_type & PERF_SAMPLE_MASK;
+	attr.sample_type |= PERF_SAMPLE_IP | PERF_SAMPLE_TID |
+			    PERF_SAMPLE_PERIOD;
+	if (etm->timeless_decoding)
+		attr.sample_type &= ~(u64)PERF_SAMPLE_TIME;
+	else
+		attr.sample_type |= PERF_SAMPLE_TIME;
+
+	attr.exclude_user = evsel->attr.exclude_user;
+	attr.exclude_kernel = evsel->attr.exclude_kernel;
+	attr.exclude_hv = evsel->attr.exclude_hv;
+	attr.exclude_host = evsel->attr.exclude_host;
+	attr.exclude_guest = evsel->attr.exclude_guest;
+	attr.sample_id_all = evsel->attr.sample_id_all;
+	attr.read_format = evsel->attr.read_format;
+
+	/* create new id val to be a fixed offset from evsel id */
+	id = evsel->id[0] + 1000000000;
+
+	if (!id)
+		id = 1;
+
+	if (etm->synth_opts.branches) {
+		attr.config = PERF_COUNT_HW_BRANCH_INSTRUCTIONS;
+		attr.sample_period = 1;
+		attr.sample_type |= PERF_SAMPLE_ADDR;
+		err = cs_etm__synth_event(session, &attr, id);
+		if (err)
+			return err;
+		etm->sample_branches = true;
+		etm->branches_sample_type = attr.sample_type;
+		etm->branches_id = id;
+	}
+
+	return 0;
+}
+
+static int cs_etm__sample(struct cs_etm_queue *etmq)
+{
+	int ret;
+	struct cs_etm_packet packet;
+
+	while (1) {
+		ret = cs_etm_decoder__get_packet(etmq->decoder, &packet);
+		if (ret <= 0)
+			return ret;
+
+		/*
+		 * If the packet contains an instruction range, generate an
+		 * instruction sequence event.
+		 */
+		if (packet.sample_type & CS_ETM_RANGE)
+			cs_etm__synth_branch_sample(etmq, &packet);
+	}
+
+	return 0;
+}
+
 static int cs_etm__run_decoder(struct cs_etm_queue *etmq)
 {
 	struct cs_etm_auxtrace *etm = etmq->etm;
@@ -494,6 +645,12 @@ static int cs_etm__run_decoder(struct cs_etm_queue *etmq)
 
 		etmq->offset += processed;
 		buffer_used += processed;
+
+		/*
+		 * Nothing to do with an error condition, let's hope the next
+		 * chunk will be better.
+		 */
+		err = cs_etm__sample(etmq);
 	} while (buffer.len > buffer_used);
 
 goto more;
@@ -828,6 +985,17 @@ int cs_etm__process_auxtrace_info(union perf_event *event,
 		return 0;
 	}
 
+	if (session->itrace_synth_opts && session->itrace_synth_opts->set) {
+		etm->synth_opts = *session->itrace_synth_opts;
+	} else {
+		itrace_synth_opts__set_default(&etm->synth_opts);
+		etm->synth_opts.callchain = false;
+	}
+
+	err = cs_etm__synth_events(etm, session);
+	if (err)
+		goto err_free_queues;
+
 	err = auxtrace_queues__process_index(&etm->queues, session);
 	if (err)
 		goto err_free_queues;
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 52+ messages in thread

* [PATCH 09/10] perf tools: Add mechanic to synthesise CoreSight trace packets
@ 2017-12-15 16:44   ` Mathieu Poirier
  0 siblings, 0 replies; 52+ messages in thread
From: Mathieu Poirier @ 2017-12-15 16:44 UTC (permalink / raw)
  To: linux-arm-kernel

Once decoded from trace packets information on trace range needs
to be communicated to the perf synthesis infrastructure so that it
is available to the perf tools built-in rendering tools and scripts.

Co-authored-by: Tor Jeremiassen <tor@ti.com>
Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
---
 tools/perf/util/cs-etm.c | 168 +++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 168 insertions(+)

diff --git a/tools/perf/util/cs-etm.c b/tools/perf/util/cs-etm.c
index 407095af1456..b9f0a53dfa65 100644
--- a/tools/perf/util/cs-etm.c
+++ b/tools/perf/util/cs-etm.c
@@ -453,6 +453,157 @@ static void  cs_etm__set_pid_tid_cpu(struct cs_etm_auxtrace *etm,
 	}
 }
 
+/*
+ * The cs etm packet encodes an instruction range between a branch target
+ * and the next taken branch. Generate sample accordingly.
+ */
+static int cs_etm__synth_branch_sample(struct cs_etm_queue *etmq,
+				       struct cs_etm_packet *packet)
+{
+	int ret = 0;
+	struct cs_etm_auxtrace *etm = etmq->etm;
+	struct perf_sample sample = {.ip = 0,};
+	union perf_event *event = etmq->event_buf;
+	u64 start_addr = packet->start_addr;
+	u64 end_addr = packet->end_addr;
+
+	event->sample.header.type = PERF_RECORD_SAMPLE;
+	event->sample.header.misc = PERF_RECORD_MISC_USER;
+	event->sample.header.size = sizeof(struct perf_event_header);
+
+	sample.ip = start_addr;
+	sample.pid = etmq->pid;
+	sample.tid = etmq->tid;
+	sample.addr = end_addr;
+	sample.id = etmq->etm->branches_id;
+	sample.stream_id = etmq->etm->branches_id;
+	sample.period = 1;
+	sample.cpu = packet->cpu;
+	sample.flags = 0;
+	sample.cpumode = PERF_RECORD_MISC_USER;
+
+	ret = perf_session__deliver_synth_event(etm->session, event, &sample);
+
+	if (ret)
+		pr_err(
+		"CS ETM Trace: failed to deliver instruction event, error %d\n",
+		ret);
+
+	return ret;
+}
+
+struct cs_etm_synth {
+	struct perf_tool dummy_tool;
+	struct perf_session *session;
+};
+
+static int cs_etm__event_synth(struct perf_tool *tool,
+			       union perf_event *event,
+			       struct perf_sample *sample __maybe_unused,
+			       struct machine *machine __maybe_unused)
+{
+	struct cs_etm_synth *cs_etm_synth =
+		      container_of(tool, struct cs_etm_synth, dummy_tool);
+
+	return perf_session__deliver_synth_event(cs_etm_synth->session,
+						 event, NULL);
+}
+
+static int cs_etm__synth_event(struct perf_session *session,
+			       struct perf_event_attr *attr, u64 id)
+{
+	struct cs_etm_synth cs_etm_synth;
+
+	memset(&cs_etm_synth, 0, sizeof(struct cs_etm_synth));
+	cs_etm_synth.session = session;
+
+	return perf_event__synthesize_attr(&cs_etm_synth.dummy_tool, attr, 1,
+					   &id, cs_etm__event_synth);
+}
+
+static int cs_etm__synth_events(struct cs_etm_auxtrace *etm,
+				struct perf_session *session)
+{
+	struct perf_evlist *evlist = session->evlist;
+	struct perf_evsel *evsel;
+	struct perf_event_attr attr;
+	bool found = false;
+	u64 id;
+	int err;
+
+	evlist__for_each_entry(evlist, evsel) {
+		if (evsel->attr.type == etm->pmu_type) {
+			found = true;
+			break;
+		}
+	}
+
+	if (!found) {
+		pr_debug("No selected events with CoreSight Trace data\n");
+		return 0;
+	}
+
+	memset(&attr, 0, sizeof(struct perf_event_attr));
+	attr.size = sizeof(struct perf_event_attr);
+	attr.type = PERF_TYPE_HARDWARE;
+	attr.sample_type = evsel->attr.sample_type & PERF_SAMPLE_MASK;
+	attr.sample_type |= PERF_SAMPLE_IP | PERF_SAMPLE_TID |
+			    PERF_SAMPLE_PERIOD;
+	if (etm->timeless_decoding)
+		attr.sample_type &= ~(u64)PERF_SAMPLE_TIME;
+	else
+		attr.sample_type |= PERF_SAMPLE_TIME;
+
+	attr.exclude_user = evsel->attr.exclude_user;
+	attr.exclude_kernel = evsel->attr.exclude_kernel;
+	attr.exclude_hv = evsel->attr.exclude_hv;
+	attr.exclude_host = evsel->attr.exclude_host;
+	attr.exclude_guest = evsel->attr.exclude_guest;
+	attr.sample_id_all = evsel->attr.sample_id_all;
+	attr.read_format = evsel->attr.read_format;
+
+	/* create new id val to be a fixed offset from evsel id */
+	id = evsel->id[0] + 1000000000;
+
+	if (!id)
+		id = 1;
+
+	if (etm->synth_opts.branches) {
+		attr.config = PERF_COUNT_HW_BRANCH_INSTRUCTIONS;
+		attr.sample_period = 1;
+		attr.sample_type |= PERF_SAMPLE_ADDR;
+		err = cs_etm__synth_event(session, &attr, id);
+		if (err)
+			return err;
+		etm->sample_branches = true;
+		etm->branches_sample_type = attr.sample_type;
+		etm->branches_id = id;
+	}
+
+	return 0;
+}
+
+static int cs_etm__sample(struct cs_etm_queue *etmq)
+{
+	int ret;
+	struct cs_etm_packet packet;
+
+	while (1) {
+		ret = cs_etm_decoder__get_packet(etmq->decoder, &packet);
+		if (ret <= 0)
+			return ret;
+
+		/*
+		 * If the packet contains an instruction range, generate an
+		 * instruction sequence event.
+		 */
+		if (packet.sample_type & CS_ETM_RANGE)
+			cs_etm__synth_branch_sample(etmq, &packet);
+	}
+
+	return 0;
+}
+
 static int cs_etm__run_decoder(struct cs_etm_queue *etmq)
 {
 	struct cs_etm_auxtrace *etm = etmq->etm;
@@ -494,6 +645,12 @@ static int cs_etm__run_decoder(struct cs_etm_queue *etmq)
 
 		etmq->offset += processed;
 		buffer_used += processed;
+
+		/*
+		 * Nothing to do with an error condition, let's hope the next
+		 * chunk will be better.
+		 */
+		err = cs_etm__sample(etmq);
 	} while (buffer.len > buffer_used);
 
 goto more;
@@ -828,6 +985,17 @@ int cs_etm__process_auxtrace_info(union perf_event *event,
 		return 0;
 	}
 
+	if (session->itrace_synth_opts && session->itrace_synth_opts->set) {
+		etm->synth_opts = *session->itrace_synth_opts;
+	} else {
+		itrace_synth_opts__set_default(&etm->synth_opts);
+		etm->synth_opts.callchain = false;
+	}
+
+	err = cs_etm__synth_events(etm, session);
+	if (err)
+		goto err_free_queues;
+
 	err = auxtrace_queues__process_index(&etm->queues, session);
 	if (err)
 		goto err_free_queues;
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 52+ messages in thread

* [PATCH 10/10] MAINTAINERS: Adding entry for CoreSight trace decoding
  2017-12-15 16:44 ` Mathieu Poirier
@ 2017-12-15 16:44   ` Mathieu Poirier
  -1 siblings, 0 replies; 52+ messages in thread
From: Mathieu Poirier @ 2017-12-15 16:44 UTC (permalink / raw)
  To: acme
  Cc: peterz, mingo, alexander.shishkin, namhyung, adrian.hunter,
	mike.leach, suzuki.poulosi, tor, jolsa, mathieu.poirier,
	linux-kernel, linux-arm-kernel

From: Tor Jeremiassen <tor@ti.com>

Adding maintainers for Coresight trace decoding via perf tools.

Signed-off-by: Tor Jeremiassen <tor@ti.com>
---
 MAINTAINERS | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/MAINTAINERS b/MAINTAINERS
index 82ad0eabce4f..865847aa84bd 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -1313,7 +1313,8 @@ F:	tools/perf/arch/arm/util/pmu.c
 F:	tools/perf/arch/arm/util/auxtrace.c
 F:	tools/perf/arch/arm/util/cs-etm.c
 F:	tools/perf/arch/arm/util/cs-etm.h
-F:	tools/perf/util/cs-etm.h
+F:	tools/perf/util/cs-etm.*
+F:	tools/perf/util/cs-etm-decoder/*
 
 ARM/CORGI MACHINE SUPPORT
 M:	Richard Purdie <rpurdie@rpsys.net>
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 52+ messages in thread

* [PATCH 10/10] MAINTAINERS: Adding entry for CoreSight trace decoding
@ 2017-12-15 16:44   ` Mathieu Poirier
  0 siblings, 0 replies; 52+ messages in thread
From: Mathieu Poirier @ 2017-12-15 16:44 UTC (permalink / raw)
  To: linux-arm-kernel

From: Tor Jeremiassen <tor@ti.com>

Adding maintainers for Coresight trace decoding via perf tools.

Signed-off-by: Tor Jeremiassen <tor@ti.com>
---
 MAINTAINERS | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/MAINTAINERS b/MAINTAINERS
index 82ad0eabce4f..865847aa84bd 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -1313,7 +1313,8 @@ F:	tools/perf/arch/arm/util/pmu.c
 F:	tools/perf/arch/arm/util/auxtrace.c
 F:	tools/perf/arch/arm/util/cs-etm.c
 F:	tools/perf/arch/arm/util/cs-etm.h
-F:	tools/perf/util/cs-etm.h
+F:	tools/perf/util/cs-etm.*
+F:	tools/perf/util/cs-etm-decoder/*
 
 ARM/CORGI MACHINE SUPPORT
 M:	Richard Purdie <rpurdie@rpsys.net>
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 52+ messages in thread

* Re: [PATCH 05/10] perf tools: Add support for decoding CoreSight trace data
  2017-12-15 16:44   ` Mathieu Poirier
@ 2017-12-30  0:33     ` Leo Yan
  -1 siblings, 0 replies; 52+ messages in thread
From: Leo Yan @ 2017-12-30  0:33 UTC (permalink / raw)
  To: Mathieu Poirier
  Cc: acme, peterz, mingo, alexander.shishkin, namhyung, adrian.hunter,
	mike.leach, suzuki.poulosi, tor, jolsa, linux-kernel,
	linux-arm-kernel

Hi Mathieu, Mike,

On Fri, Dec 15, 2017 at 09:44:54AM -0700, Mathieu Poirier wrote:
> Adding functionality to create a CoreSight trace decoder capable
> of decoding trace data pushed by a client application.
> 
> Co-authored-by: Tor Jeremiassen <tor@ti.com>
> Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
> ---
>  tools/perf/util/cs-etm-decoder/cs-etm-decoder.c | 119 ++++++++++++++++++++++++
>  1 file changed, 119 insertions(+)
> 
> diff --git a/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c b/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c
> index 6a4c86b1431f..57b020b0b36f 100644
> --- a/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c
> +++ b/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c
> @@ -200,6 +200,121 @@ static void cs_etm_decoder__clear_buffer(struct cs_etm_decoder *decoder)
>  	}
>  }
>  
> +static ocsd_datapath_resp_t
> +cs_etm_decoder__buffer_packet(struct cs_etm_decoder *decoder,
> +			      const ocsd_generic_trace_elem *elem,
> +			      const u8 trace_chan_id,
> +			      enum cs_etm_sample_type sample_type)
> +{
> +	u32 et = 0;
> +	struct int_node *inode = NULL;
> +
> +	if (decoder->packet_count >= MAX_BUFFER - 1)
> +		return OCSD_RESP_FATAL_SYS_ERR;
> +
> +	/* Search the RB tree for the cpu associated with this traceID */
> +	inode = intlist__find(traceid_list, trace_chan_id);
> +	if (!inode)
> +		return OCSD_RESP_FATAL_SYS_ERR;
> +
> +	et = decoder->tail;
> +	decoder->packet_buffer[et].sample_type = sample_type;
> +	decoder->packet_buffer[et].start_addr = elem->st_addr;
> +	decoder->packet_buffer[et].end_addr = elem->en_addr;
> +	decoder->packet_buffer[et].exc = false;
> +	decoder->packet_buffer[et].exc_ret = false;
> +	decoder->packet_buffer[et].cpu = *((int *)inode->priv);
> +
> +	/* Wrap around if need be */
> +	et = (et + 1) & (MAX_BUFFER - 1);
> +
> +	decoder->tail = et;
> +	decoder->packet_count++;
> +
> +	if (decoder->packet_count == MAX_BUFFER - 1)
> +		return OCSD_RESP_WAIT;
> +
> +	return OCSD_RESP_CONT;
> +}
> +
> +static ocsd_datapath_resp_t cs_etm_decoder__gen_trace_elem_printer(
> +				const void *context,
> +				const ocsd_trc_index_t indx __maybe_unused,
> +				const u8 trace_chan_id __maybe_unused,
> +				const ocsd_generic_trace_elem *elem)
> +{
> +	ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
> +	struct cs_etm_decoder *decoder = (struct cs_etm_decoder *) context;

After apply this patch set and build 'perf' tool with linking
OpenCSDv0.8.0 libs, I can everytime OpenCSD parses 'elem->elem_type'
is OCSD_GEN_TRC_ELEM_ADDR_NACC but not OCSD_GEN_TRC_ELEM_INSTR_RANGE.

As result, the 'perf' tool can dump the raw data with '-D' option but
it cannot analyze the symbol and symbol offset with below command:

./perf script -v -a -F cpu,event,ip,sym,symoff -i ./perf.data -k vmlinux
--kallsyms ./System.map

Have uploaded perf.data/vmlinux/System.map in the folder:
http://people.linaro.org/~leo.yan/binaries/perf_4.15_r4/

Thanks,
Leo Yan

> +	switch (elem->elem_type) {
> +	case OCSD_GEN_TRC_ELEM_UNKNOWN:
> +		break;
> +	case OCSD_GEN_TRC_ELEM_NO_SYNC:
> +		decoder->trace_on = false;
> +		break;
> +	case OCSD_GEN_TRC_ELEM_TRACE_ON:
> +		decoder->trace_on = true;
> +		break;
> +	case OCSD_GEN_TRC_ELEM_INSTR_RANGE:
> +		resp = cs_etm_decoder__buffer_packet(decoder, elem,
> +						     trace_chan_id,
> +						     CS_ETM_RANGE);
> +		break;
> +	case OCSD_GEN_TRC_ELEM_EXCEPTION:
> +		decoder->packet_buffer[decoder->tail].exc = true;
> +		break;
> +	case OCSD_GEN_TRC_ELEM_EXCEPTION_RET:
> +		decoder->packet_buffer[decoder->tail].exc_ret = true;
> +		break;
> +	case OCSD_GEN_TRC_ELEM_PE_CONTEXT:
> +	case OCSD_GEN_TRC_ELEM_EO_TRACE:
> +	case OCSD_GEN_TRC_ELEM_ADDR_NACC:
> +	case OCSD_GEN_TRC_ELEM_TIMESTAMP:
> +	case OCSD_GEN_TRC_ELEM_CYCLE_COUNT:
> +	case OCSD_GEN_TRC_ELEM_ADDR_UNKNOWN:
> +	case OCSD_GEN_TRC_ELEM_EVENT:
> +	case OCSD_GEN_TRC_ELEM_SWTRACE:
> +	case OCSD_GEN_TRC_ELEM_CUSTOM:
> +	default:
> +		break;
> +	}
> +
> +	return resp;
> +}
> +
> +static int cs_etm_decoder__create_etm_packet_decoder(
> +					struct cs_etm_trace_params *t_params,
> +					struct cs_etm_decoder *decoder)
> +{
> +	const char *decoder_name;
> +	ocsd_etmv4_cfg trace_config_etmv4;
> +	void *trace_config;
> +	u8 csid;
> +
> +	switch (t_params->protocol) {
> +	case CS_ETM_PROTO_ETMV4i:
> +		cs_etm_decoder__gen_etmv4_config(t_params, &trace_config_etmv4);
> +		decoder_name = OCSD_BUILTIN_DCD_ETMV4I;
> +		trace_config = &trace_config_etmv4;
> +		break;
> +	default:
> +		return -1;
> +	}
> +
> +	if (ocsd_dt_create_decoder(decoder->dcd_tree,
> +				     decoder_name,
> +				     OCSD_CREATE_FLG_FULL_DECODER,
> +				     trace_config, &csid))
> +		return -1;
> +
> +	if (ocsd_dt_set_gen_elem_outfn(decoder->dcd_tree,
> +				       cs_etm_decoder__gen_trace_elem_printer,
> +				       decoder))
> +		return -1;
> +
> +	return 0;
> +}
> +
>  static int
>  cs_etm_decoder__create_etm_decoder(struct cs_etm_decoder_params *d_params,
>  				   struct cs_etm_trace_params *t_params,
> @@ -208,6 +323,10 @@ cs_etm_decoder__create_etm_decoder(struct cs_etm_decoder_params *d_params,
>  	if (d_params->operation == CS_ETM_OPERATION_PRINT)
>  		return cs_etm_decoder__create_etm_packet_printer(t_params,
>  								 decoder);
> +	else if (d_params->operation == CS_ETM_OPERATION_DECODE)
> +		return cs_etm_decoder__create_etm_packet_decoder(t_params,
> +								 decoder);
> +
>  	return -1;
>  }
>  
> -- 
> 2.7.4
> 

^ permalink raw reply	[flat|nested] 52+ messages in thread

* [PATCH 05/10] perf tools: Add support for decoding CoreSight trace data
@ 2017-12-30  0:33     ` Leo Yan
  0 siblings, 0 replies; 52+ messages in thread
From: Leo Yan @ 2017-12-30  0:33 UTC (permalink / raw)
  To: linux-arm-kernel

Hi Mathieu, Mike,

On Fri, Dec 15, 2017 at 09:44:54AM -0700, Mathieu Poirier wrote:
> Adding functionality to create a CoreSight trace decoder capable
> of decoding trace data pushed by a client application.
> 
> Co-authored-by: Tor Jeremiassen <tor@ti.com>
> Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
> ---
>  tools/perf/util/cs-etm-decoder/cs-etm-decoder.c | 119 ++++++++++++++++++++++++
>  1 file changed, 119 insertions(+)
> 
> diff --git a/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c b/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c
> index 6a4c86b1431f..57b020b0b36f 100644
> --- a/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c
> +++ b/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c
> @@ -200,6 +200,121 @@ static void cs_etm_decoder__clear_buffer(struct cs_etm_decoder *decoder)
>  	}
>  }
>  
> +static ocsd_datapath_resp_t
> +cs_etm_decoder__buffer_packet(struct cs_etm_decoder *decoder,
> +			      const ocsd_generic_trace_elem *elem,
> +			      const u8 trace_chan_id,
> +			      enum cs_etm_sample_type sample_type)
> +{
> +	u32 et = 0;
> +	struct int_node *inode = NULL;
> +
> +	if (decoder->packet_count >= MAX_BUFFER - 1)
> +		return OCSD_RESP_FATAL_SYS_ERR;
> +
> +	/* Search the RB tree for the cpu associated with this traceID */
> +	inode = intlist__find(traceid_list, trace_chan_id);
> +	if (!inode)
> +		return OCSD_RESP_FATAL_SYS_ERR;
> +
> +	et = decoder->tail;
> +	decoder->packet_buffer[et].sample_type = sample_type;
> +	decoder->packet_buffer[et].start_addr = elem->st_addr;
> +	decoder->packet_buffer[et].end_addr = elem->en_addr;
> +	decoder->packet_buffer[et].exc = false;
> +	decoder->packet_buffer[et].exc_ret = false;
> +	decoder->packet_buffer[et].cpu = *((int *)inode->priv);
> +
> +	/* Wrap around if need be */
> +	et = (et + 1) & (MAX_BUFFER - 1);
> +
> +	decoder->tail = et;
> +	decoder->packet_count++;
> +
> +	if (decoder->packet_count == MAX_BUFFER - 1)
> +		return OCSD_RESP_WAIT;
> +
> +	return OCSD_RESP_CONT;
> +}
> +
> +static ocsd_datapath_resp_t cs_etm_decoder__gen_trace_elem_printer(
> +				const void *context,
> +				const ocsd_trc_index_t indx __maybe_unused,
> +				const u8 trace_chan_id __maybe_unused,
> +				const ocsd_generic_trace_elem *elem)
> +{
> +	ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
> +	struct cs_etm_decoder *decoder = (struct cs_etm_decoder *) context;

After apply this patch set and build 'perf' tool with linking
OpenCSDv0.8.0 libs, I can everytime OpenCSD parses 'elem->elem_type'
is OCSD_GEN_TRC_ELEM_ADDR_NACC but not OCSD_GEN_TRC_ELEM_INSTR_RANGE.

As result, the 'perf' tool can dump the raw data with '-D' option but
it cannot analyze the symbol and symbol offset with below command:

./perf script -v -a -F cpu,event,ip,sym,symoff -i ./perf.data -k vmlinux
--kallsyms ./System.map

Have uploaded perf.data/vmlinux/System.map in the folder:
http://people.linaro.org/~leo.yan/binaries/perf_4.15_r4/

Thanks,
Leo Yan

> +	switch (elem->elem_type) {
> +	case OCSD_GEN_TRC_ELEM_UNKNOWN:
> +		break;
> +	case OCSD_GEN_TRC_ELEM_NO_SYNC:
> +		decoder->trace_on = false;
> +		break;
> +	case OCSD_GEN_TRC_ELEM_TRACE_ON:
> +		decoder->trace_on = true;
> +		break;
> +	case OCSD_GEN_TRC_ELEM_INSTR_RANGE:
> +		resp = cs_etm_decoder__buffer_packet(decoder, elem,
> +						     trace_chan_id,
> +						     CS_ETM_RANGE);
> +		break;
> +	case OCSD_GEN_TRC_ELEM_EXCEPTION:
> +		decoder->packet_buffer[decoder->tail].exc = true;
> +		break;
> +	case OCSD_GEN_TRC_ELEM_EXCEPTION_RET:
> +		decoder->packet_buffer[decoder->tail].exc_ret = true;
> +		break;
> +	case OCSD_GEN_TRC_ELEM_PE_CONTEXT:
> +	case OCSD_GEN_TRC_ELEM_EO_TRACE:
> +	case OCSD_GEN_TRC_ELEM_ADDR_NACC:
> +	case OCSD_GEN_TRC_ELEM_TIMESTAMP:
> +	case OCSD_GEN_TRC_ELEM_CYCLE_COUNT:
> +	case OCSD_GEN_TRC_ELEM_ADDR_UNKNOWN:
> +	case OCSD_GEN_TRC_ELEM_EVENT:
> +	case OCSD_GEN_TRC_ELEM_SWTRACE:
> +	case OCSD_GEN_TRC_ELEM_CUSTOM:
> +	default:
> +		break;
> +	}
> +
> +	return resp;
> +}
> +
> +static int cs_etm_decoder__create_etm_packet_decoder(
> +					struct cs_etm_trace_params *t_params,
> +					struct cs_etm_decoder *decoder)
> +{
> +	const char *decoder_name;
> +	ocsd_etmv4_cfg trace_config_etmv4;
> +	void *trace_config;
> +	u8 csid;
> +
> +	switch (t_params->protocol) {
> +	case CS_ETM_PROTO_ETMV4i:
> +		cs_etm_decoder__gen_etmv4_config(t_params, &trace_config_etmv4);
> +		decoder_name = OCSD_BUILTIN_DCD_ETMV4I;
> +		trace_config = &trace_config_etmv4;
> +		break;
> +	default:
> +		return -1;
> +	}
> +
> +	if (ocsd_dt_create_decoder(decoder->dcd_tree,
> +				     decoder_name,
> +				     OCSD_CREATE_FLG_FULL_DECODER,
> +				     trace_config, &csid))
> +		return -1;
> +
> +	if (ocsd_dt_set_gen_elem_outfn(decoder->dcd_tree,
> +				       cs_etm_decoder__gen_trace_elem_printer,
> +				       decoder))
> +		return -1;
> +
> +	return 0;
> +}
> +
>  static int
>  cs_etm_decoder__create_etm_decoder(struct cs_etm_decoder_params *d_params,
>  				   struct cs_etm_trace_params *t_params,
> @@ -208,6 +323,10 @@ cs_etm_decoder__create_etm_decoder(struct cs_etm_decoder_params *d_params,
>  	if (d_params->operation == CS_ETM_OPERATION_PRINT)
>  		return cs_etm_decoder__create_etm_packet_printer(t_params,
>  								 decoder);
> +	else if (d_params->operation == CS_ETM_OPERATION_DECODE)
> +		return cs_etm_decoder__create_etm_packet_decoder(t_params,
> +								 decoder);
> +
>  	return -1;
>  }
>  
> -- 
> 2.7.4
> 

^ permalink raw reply	[flat|nested] 52+ messages in thread

* Re: [PATCH 00/10] perf tools: Add support for CoreSight trace decoding
  2017-12-15 16:44 ` Mathieu Poirier
@ 2017-12-30  0:51   ` Leo Yan
  -1 siblings, 0 replies; 52+ messages in thread
From: Leo Yan @ 2017-12-30  0:51 UTC (permalink / raw)
  To: Mathieu Poirier
  Cc: acme, peterz, mingo, alexander.shishkin, namhyung, adrian.hunter,
	mike.leach, suzuki.poulosi, tor, jolsa, linux-kernel,
	linux-arm-kernel

Hi Mathieu,

On Fri, Dec 15, 2017 at 09:44:49AM -0700, Mathieu Poirier wrote:
> This patchset adds support for per-thread CoreSight trace decoding from the
> "perf report" interface.  It is largely modelled on what has been done for 
> intelPT traces and currently targets the ETMv4 architecture.  Support for
> cpu-wide scenarios and ETMv3/PTMv1.1 will follow shortly.
> 
> The trace decoding support is done using the Open CoreSight Decoding
> Library (openCSD), a stand alone open source project available here [1].
> Integration of the openCSD library with the perf tools follow what has
> been done for other support libraries.  If the library has been installed
> on a system the build scripts will include support for CoreSight trace
> decoding:
> 
> ...                          zlib: [ on  ]
> ...                          lzma: [ OFF ]
> ...                     get_cpuid: [ on  ]
> ...                           bpf: [ on  ]
> ...                    libopencsd: [ on  ] <------
> 
> Instructions on how to build and install the openCSD library are provided
> in the HOWTO.md of the project repository.  We elected to keep the decoder
> library independent of the kernel tree as it is also used outside of the
> perf toolset and various non-linux projects.
> 
> The work applies cleanly to [2] and proper functionning of the feature
> depends on this patch [3].

With latest perf code, it reports another error when analyse perf
data: "0x3e0 [0x50]: failed to process type: 1".

After roughly analysis, I found this is caused by one dummy event (in
the binary from offset 0xf8 to offset 0x178). Because this event type
is not set for 'PERF_SAMPLE_TIME', so the function
perf_evsel__parse_sample_timestamp() checks the event has not set
'PERF_SAMPLE_TIME' then directly bail out with error.

000000f0: 0800 0000 0000 0000 0100 0000 7000 0000  ............p... 
00000100: 0900 0000 0000 0000 0100 0000 0000 0000  ................ 
00000110: 0300 0100 0000 0000 0400 0000 0000 0000  ................ 
00000120: 6133 8401 0000 0000 0000 0000 0000 0000  a3.............. 
00000130: 0000 0000 0000 0000 0000 0000 0000 0000  ................ 
00000140: 0000 0000 0000 0000 0000 0000 0000 0000  ................ 
00000150: 0000 0000 0000 0000 0000 0000 0000 0000  ................ 
00000160: 0000 0000 0000 0000 7000 0000 0000 0000  ........p....... 
00000170: 0800 0000 0000 0000 4600 0000 0000 6802  ........F.....h.

You could check the perf binary from [1]. Please note, this perf data
I capatured from kernel 4.14-rc6, so is it might be compatible issue
between 4.14-rc6 and 4.15?

[1] http://people.linaro.org/~leo.yan/binaries/perf_4.15_r4/perf.data

Thanks,
Leo Yan

> Review and comments would be greatly appreciated.
> 
> Regards,
> Mathieu
> 
> [1]. https://github.com/Linaro/OpenCSD
> [2]. git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git perf/core
> [3]. https://lkml.org/lkml/2017/12/14/612
> 
> Mathieu Poirier (8):
>   perf tools: Integrating the CoreSight decoding library
>   perf tools: Add initial entry point for decoder CoreSight traces
>   perf tools: Add decoder mechanic to support dumping trace data
>   perf tools: Add support for decoding CoreSight trace data
>   perf tools: Add functionality to communicate with the openCSD decoder
>   pert tools: Add queue management functionality
>   perf tools: Add full support for CoreSight trace decoding
>   perf tools: Add mechanic to synthesise CoreSight trace packets
> 
> Tor Jeremiassen (2):
>   perf tools: Add processing of coresight metadata
>   MAINTAINERS: Adding entry for CoreSight trace decoding
> 
>  MAINTAINERS                                     |    3 +-
>  tools/build/Makefile.feature                    |    6 +-
>  tools/build/feature/Makefile                    |    6 +-
>  tools/build/feature/test-all.c                  |    5 +
>  tools/build/feature/test-libopencsd.c           |    8 +
>  tools/perf/Makefile.config                      |   13 +
>  tools/perf/util/Build                           |    6 +
>  tools/perf/util/auxtrace.c                      |    2 +
>  tools/perf/util/cs-etm-decoder/Build            |    1 +
>  tools/perf/util/cs-etm-decoder/cs-etm-decoder.c |  513 ++++++++++++
>  tools/perf/util/cs-etm-decoder/cs-etm-decoder.h |  105 +++
>  tools/perf/util/cs-etm.c                        | 1023 +++++++++++++++++++++++
>  tools/perf/util/cs-etm.h                        |   18 +
>  13 files changed, 1705 insertions(+), 4 deletions(-)
>  create mode 100644 tools/build/feature/test-libopencsd.c
>  create mode 100644 tools/perf/util/cs-etm-decoder/Build
>  create mode 100644 tools/perf/util/cs-etm-decoder/cs-etm-decoder.c
>  create mode 100644 tools/perf/util/cs-etm-decoder/cs-etm-decoder.h
>  create mode 100644 tools/perf/util/cs-etm.c
> 
> -- 
> 2.7.4
> 

^ permalink raw reply	[flat|nested] 52+ messages in thread

* [PATCH 00/10] perf tools: Add support for CoreSight trace decoding
@ 2017-12-30  0:51   ` Leo Yan
  0 siblings, 0 replies; 52+ messages in thread
From: Leo Yan @ 2017-12-30  0:51 UTC (permalink / raw)
  To: linux-arm-kernel

Hi Mathieu,

On Fri, Dec 15, 2017 at 09:44:49AM -0700, Mathieu Poirier wrote:
> This patchset adds support for per-thread CoreSight trace decoding from the
> "perf report" interface.  It is largely modelled on what has been done for 
> intelPT traces and currently targets the ETMv4 architecture.  Support for
> cpu-wide scenarios and ETMv3/PTMv1.1 will follow shortly.
> 
> The trace decoding support is done using the Open CoreSight Decoding
> Library (openCSD), a stand alone open source project available here [1].
> Integration of the openCSD library with the perf tools follow what has
> been done for other support libraries.  If the library has been installed
> on a system the build scripts will include support for CoreSight trace
> decoding:
> 
> ...                          zlib: [ on  ]
> ...                          lzma: [ OFF ]
> ...                     get_cpuid: [ on  ]
> ...                           bpf: [ on  ]
> ...                    libopencsd: [ on  ] <------
> 
> Instructions on how to build and install the openCSD library are provided
> in the HOWTO.md of the project repository.  We elected to keep the decoder
> library independent of the kernel tree as it is also used outside of the
> perf toolset and various non-linux projects.
> 
> The work applies cleanly to [2] and proper functionning of the feature
> depends on this patch [3].

With latest perf code, it reports another error when analyse perf
data: "0x3e0 [0x50]: failed to process type: 1".

After roughly analysis, I found this is caused by one dummy event (in
the binary from offset 0xf8 to offset 0x178). Because this event type
is not set for 'PERF_SAMPLE_TIME', so the function
perf_evsel__parse_sample_timestamp() checks the event has not set
'PERF_SAMPLE_TIME' then directly bail out with error.

000000f0: 0800 0000 0000 0000 0100 0000 7000 0000  ............p... 
00000100: 0900 0000 0000 0000 0100 0000 0000 0000  ................ 
00000110: 0300 0100 0000 0000 0400 0000 0000 0000  ................ 
00000120: 6133 8401 0000 0000 0000 0000 0000 0000  a3.............. 
00000130: 0000 0000 0000 0000 0000 0000 0000 0000  ................ 
00000140: 0000 0000 0000 0000 0000 0000 0000 0000  ................ 
00000150: 0000 0000 0000 0000 0000 0000 0000 0000  ................ 
00000160: 0000 0000 0000 0000 7000 0000 0000 0000  ........p....... 
00000170: 0800 0000 0000 0000 4600 0000 0000 6802  ........F.....h.

You could check the perf binary from [1]. Please note, this perf data
I capatured from kernel 4.14-rc6, so is it might be compatible issue
between 4.14-rc6 and 4.15?

[1] http://people.linaro.org/~leo.yan/binaries/perf_4.15_r4/perf.data

Thanks,
Leo Yan

> Review and comments would be greatly appreciated.
> 
> Regards,
> Mathieu
> 
> [1]. https://github.com/Linaro/OpenCSD
> [2]. git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git perf/core
> [3]. https://lkml.org/lkml/2017/12/14/612
> 
> Mathieu Poirier (8):
>   perf tools: Integrating the CoreSight decoding library
>   perf tools: Add initial entry point for decoder CoreSight traces
>   perf tools: Add decoder mechanic to support dumping trace data
>   perf tools: Add support for decoding CoreSight trace data
>   perf tools: Add functionality to communicate with the openCSD decoder
>   pert tools: Add queue management functionality
>   perf tools: Add full support for CoreSight trace decoding
>   perf tools: Add mechanic to synthesise CoreSight trace packets
> 
> Tor Jeremiassen (2):
>   perf tools: Add processing of coresight metadata
>   MAINTAINERS: Adding entry for CoreSight trace decoding
> 
>  MAINTAINERS                                     |    3 +-
>  tools/build/Makefile.feature                    |    6 +-
>  tools/build/feature/Makefile                    |    6 +-
>  tools/build/feature/test-all.c                  |    5 +
>  tools/build/feature/test-libopencsd.c           |    8 +
>  tools/perf/Makefile.config                      |   13 +
>  tools/perf/util/Build                           |    6 +
>  tools/perf/util/auxtrace.c                      |    2 +
>  tools/perf/util/cs-etm-decoder/Build            |    1 +
>  tools/perf/util/cs-etm-decoder/cs-etm-decoder.c |  513 ++++++++++++
>  tools/perf/util/cs-etm-decoder/cs-etm-decoder.h |  105 +++
>  tools/perf/util/cs-etm.c                        | 1023 +++++++++++++++++++++++
>  tools/perf/util/cs-etm.h                        |   18 +
>  13 files changed, 1705 insertions(+), 4 deletions(-)
>  create mode 100644 tools/build/feature/test-libopencsd.c
>  create mode 100644 tools/perf/util/cs-etm-decoder/Build
>  create mode 100644 tools/perf/util/cs-etm-decoder/cs-etm-decoder.c
>  create mode 100644 tools/perf/util/cs-etm-decoder/cs-etm-decoder.h
>  create mode 100644 tools/perf/util/cs-etm.c
> 
> -- 
> 2.7.4
> 

^ permalink raw reply	[flat|nested] 52+ messages in thread

* Re: [PATCH 00/10] perf tools: Add support for CoreSight trace decoding
  2017-12-30  0:51   ` Leo Yan
@ 2018-01-08 17:45     ` Mathieu Poirier
  -1 siblings, 0 replies; 52+ messages in thread
From: Mathieu Poirier @ 2018-01-08 17:45 UTC (permalink / raw)
  To: Leo Yan
  Cc: Arnaldo Carvalho de Melo, Peter Zijlstra, Ingo Molnar,
	Alexander Shishkin, namhyung, Adrian Hunter, Mike Leach,
	suzuki.poulosi, Jeremiassen, Tor, Jiri Olsa, linux-kernel,
	linux-arm-kernel

Good day Leo,

On 29 December 2017 at 17:51, Leo Yan <leo.yan@linaro.org> wrote:
> Hi Mathieu,
>
> On Fri, Dec 15, 2017 at 09:44:49AM -0700, Mathieu Poirier wrote:
>> This patchset adds support for per-thread CoreSight trace decoding from the
>> "perf report" interface.  It is largely modelled on what has been done for
>> intelPT traces and currently targets the ETMv4 architecture.  Support for
>> cpu-wide scenarios and ETMv3/PTMv1.1 will follow shortly.
>>
>> The trace decoding support is done using the Open CoreSight Decoding
>> Library (openCSD), a stand alone open source project available here [1].
>> Integration of the openCSD library with the perf tools follow what has
>> been done for other support libraries.  If the library has been installed
>> on a system the build scripts will include support for CoreSight trace
>> decoding:
>>
>> ...                          zlib: [ on  ]
>> ...                          lzma: [ OFF ]
>> ...                     get_cpuid: [ on  ]
>> ...                           bpf: [ on  ]
>> ...                    libopencsd: [ on  ] <------
>>
>> Instructions on how to build and install the openCSD library are provided
>> in the HOWTO.md of the project repository.  We elected to keep the decoder
>> library independent of the kernel tree as it is also used outside of the
>> perf toolset and various non-linux projects.
>>
>> The work applies cleanly to [2] and proper functionning of the feature
>> depends on this patch [3].
>
> With latest perf code, it reports another error when analyse perf
> data: "0x3e0 [0x50]: failed to process type: 1".
>
> After roughly analysis, I found this is caused by one dummy event (in
> the binary from offset 0xf8 to offset 0x178). Because this event type
> is not set for 'PERF_SAMPLE_TIME', so the function
> perf_evsel__parse_sample_timestamp() checks the event has not set
> 'PERF_SAMPLE_TIME' then directly bail out with error.

This patch should fix the problem: https://patchwork.kernel.org/patch/10121515/

>
> 000000f0: 0800 0000 0000 0000 0100 0000 7000 0000  ............p...
> 00000100: 0900 0000 0000 0000 0100 0000 0000 0000  ................
> 00000110: 0300 0100 0000 0000 0400 0000 0000 0000  ................
> 00000120: 6133 8401 0000 0000 0000 0000 0000 0000  a3..............
> 00000130: 0000 0000 0000 0000 0000 0000 0000 0000  ................
> 00000140: 0000 0000 0000 0000 0000 0000 0000 0000  ................
> 00000150: 0000 0000 0000 0000 0000 0000 0000 0000  ................
> 00000160: 0000 0000 0000 0000 7000 0000 0000 0000  ........p.......
> 00000170: 0800 0000 0000 0000 4600 0000 0000 6802  ........F.....h.
>
> You could check the perf binary from [1]. Please note, this perf data
> I capatured from kernel 4.14-rc6, so is it might be compatible issue
> between 4.14-rc6 and 4.15?
>
> [1] http://people.linaro.org/~leo.yan/binaries/perf_4.15_r4/perf.data
>
> Thanks,
> Leo Yan
>
>> Review and comments would be greatly appreciated.
>>
>> Regards,
>> Mathieu
>>
>> [1]. https://github.com/Linaro/OpenCSD
>> [2]. git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git perf/core
>> [3]. https://lkml.org/lkml/2017/12/14/612
>>
>> Mathieu Poirier (8):
>>   perf tools: Integrating the CoreSight decoding library
>>   perf tools: Add initial entry point for decoder CoreSight traces
>>   perf tools: Add decoder mechanic to support dumping trace data
>>   perf tools: Add support for decoding CoreSight trace data
>>   perf tools: Add functionality to communicate with the openCSD decoder
>>   pert tools: Add queue management functionality
>>   perf tools: Add full support for CoreSight trace decoding
>>   perf tools: Add mechanic to synthesise CoreSight trace packets
>>
>> Tor Jeremiassen (2):
>>   perf tools: Add processing of coresight metadata
>>   MAINTAINERS: Adding entry for CoreSight trace decoding
>>
>>  MAINTAINERS                                     |    3 +-
>>  tools/build/Makefile.feature                    |    6 +-
>>  tools/build/feature/Makefile                    |    6 +-
>>  tools/build/feature/test-all.c                  |    5 +
>>  tools/build/feature/test-libopencsd.c           |    8 +
>>  tools/perf/Makefile.config                      |   13 +
>>  tools/perf/util/Build                           |    6 +
>>  tools/perf/util/auxtrace.c                      |    2 +
>>  tools/perf/util/cs-etm-decoder/Build            |    1 +
>>  tools/perf/util/cs-etm-decoder/cs-etm-decoder.c |  513 ++++++++++++
>>  tools/perf/util/cs-etm-decoder/cs-etm-decoder.h |  105 +++
>>  tools/perf/util/cs-etm.c                        | 1023 +++++++++++++++++++++++
>>  tools/perf/util/cs-etm.h                        |   18 +
>>  13 files changed, 1705 insertions(+), 4 deletions(-)
>>  create mode 100644 tools/build/feature/test-libopencsd.c
>>  create mode 100644 tools/perf/util/cs-etm-decoder/Build
>>  create mode 100644 tools/perf/util/cs-etm-decoder/cs-etm-decoder.c
>>  create mode 100644 tools/perf/util/cs-etm-decoder/cs-etm-decoder.h
>>  create mode 100644 tools/perf/util/cs-etm.c
>>
>> --
>> 2.7.4
>>

^ permalink raw reply	[flat|nested] 52+ messages in thread

* [PATCH 00/10] perf tools: Add support for CoreSight trace decoding
@ 2018-01-08 17:45     ` Mathieu Poirier
  0 siblings, 0 replies; 52+ messages in thread
From: Mathieu Poirier @ 2018-01-08 17:45 UTC (permalink / raw)
  To: linux-arm-kernel

Good day Leo,

On 29 December 2017 at 17:51, Leo Yan <leo.yan@linaro.org> wrote:
> Hi Mathieu,
>
> On Fri, Dec 15, 2017 at 09:44:49AM -0700, Mathieu Poirier wrote:
>> This patchset adds support for per-thread CoreSight trace decoding from the
>> "perf report" interface.  It is largely modelled on what has been done for
>> intelPT traces and currently targets the ETMv4 architecture.  Support for
>> cpu-wide scenarios and ETMv3/PTMv1.1 will follow shortly.
>>
>> The trace decoding support is done using the Open CoreSight Decoding
>> Library (openCSD), a stand alone open source project available here [1].
>> Integration of the openCSD library with the perf tools follow what has
>> been done for other support libraries.  If the library has been installed
>> on a system the build scripts will include support for CoreSight trace
>> decoding:
>>
>> ...                          zlib: [ on  ]
>> ...                          lzma: [ OFF ]
>> ...                     get_cpuid: [ on  ]
>> ...                           bpf: [ on  ]
>> ...                    libopencsd: [ on  ] <------
>>
>> Instructions on how to build and install the openCSD library are provided
>> in the HOWTO.md of the project repository.  We elected to keep the decoder
>> library independent of the kernel tree as it is also used outside of the
>> perf toolset and various non-linux projects.
>>
>> The work applies cleanly to [2] and proper functionning of the feature
>> depends on this patch [3].
>
> With latest perf code, it reports another error when analyse perf
> data: "0x3e0 [0x50]: failed to process type: 1".
>
> After roughly analysis, I found this is caused by one dummy event (in
> the binary from offset 0xf8 to offset 0x178). Because this event type
> is not set for 'PERF_SAMPLE_TIME', so the function
> perf_evsel__parse_sample_timestamp() checks the event has not set
> 'PERF_SAMPLE_TIME' then directly bail out with error.

This patch should fix the problem: https://patchwork.kernel.org/patch/10121515/

>
> 000000f0: 0800 0000 0000 0000 0100 0000 7000 0000  ............p...
> 00000100: 0900 0000 0000 0000 0100 0000 0000 0000  ................
> 00000110: 0300 0100 0000 0000 0400 0000 0000 0000  ................
> 00000120: 6133 8401 0000 0000 0000 0000 0000 0000  a3..............
> 00000130: 0000 0000 0000 0000 0000 0000 0000 0000  ................
> 00000140: 0000 0000 0000 0000 0000 0000 0000 0000  ................
> 00000150: 0000 0000 0000 0000 0000 0000 0000 0000  ................
> 00000160: 0000 0000 0000 0000 7000 0000 0000 0000  ........p.......
> 00000170: 0800 0000 0000 0000 4600 0000 0000 6802  ........F.....h.
>
> You could check the perf binary from [1]. Please note, this perf data
> I capatured from kernel 4.14-rc6, so is it might be compatible issue
> between 4.14-rc6 and 4.15?
>
> [1] http://people.linaro.org/~leo.yan/binaries/perf_4.15_r4/perf.data
>
> Thanks,
> Leo Yan
>
>> Review and comments would be greatly appreciated.
>>
>> Regards,
>> Mathieu
>>
>> [1]. https://github.com/Linaro/OpenCSD
>> [2]. git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git perf/core
>> [3]. https://lkml.org/lkml/2017/12/14/612
>>
>> Mathieu Poirier (8):
>>   perf tools: Integrating the CoreSight decoding library
>>   perf tools: Add initial entry point for decoder CoreSight traces
>>   perf tools: Add decoder mechanic to support dumping trace data
>>   perf tools: Add support for decoding CoreSight trace data
>>   perf tools: Add functionality to communicate with the openCSD decoder
>>   pert tools: Add queue management functionality
>>   perf tools: Add full support for CoreSight trace decoding
>>   perf tools: Add mechanic to synthesise CoreSight trace packets
>>
>> Tor Jeremiassen (2):
>>   perf tools: Add processing of coresight metadata
>>   MAINTAINERS: Adding entry for CoreSight trace decoding
>>
>>  MAINTAINERS                                     |    3 +-
>>  tools/build/Makefile.feature                    |    6 +-
>>  tools/build/feature/Makefile                    |    6 +-
>>  tools/build/feature/test-all.c                  |    5 +
>>  tools/build/feature/test-libopencsd.c           |    8 +
>>  tools/perf/Makefile.config                      |   13 +
>>  tools/perf/util/Build                           |    6 +
>>  tools/perf/util/auxtrace.c                      |    2 +
>>  tools/perf/util/cs-etm-decoder/Build            |    1 +
>>  tools/perf/util/cs-etm-decoder/cs-etm-decoder.c |  513 ++++++++++++
>>  tools/perf/util/cs-etm-decoder/cs-etm-decoder.h |  105 +++
>>  tools/perf/util/cs-etm.c                        | 1023 +++++++++++++++++++++++
>>  tools/perf/util/cs-etm.h                        |   18 +
>>  13 files changed, 1705 insertions(+), 4 deletions(-)
>>  create mode 100644 tools/build/feature/test-libopencsd.c
>>  create mode 100644 tools/perf/util/cs-etm-decoder/Build
>>  create mode 100644 tools/perf/util/cs-etm-decoder/cs-etm-decoder.c
>>  create mode 100644 tools/perf/util/cs-etm-decoder/cs-etm-decoder.h
>>  create mode 100644 tools/perf/util/cs-etm.c
>>
>> --
>> 2.7.4
>>

^ permalink raw reply	[flat|nested] 52+ messages in thread

* Re: [PATCH 05/10] perf tools: Add support for decoding CoreSight trace data
  2017-12-30  0:33     ` Leo Yan
@ 2018-01-09 12:09       ` Mike Leach
  -1 siblings, 0 replies; 52+ messages in thread
From: Mike Leach @ 2018-01-09 12:09 UTC (permalink / raw)
  To: Leo Yan
  Cc: Mathieu Poirier, peterz, linux-kernel, adrian.hunter, acme,
	Jeremiassen, Tor, alexander.shishkin, mingo, Mike Leach,
	namhyung, suzuki.poulosi, jolsa, linux-arm-kernel

Hi Leo,

The OCSD_GEN_TRC_ELEM_ADDR_NACC element indicates that the decoder
does not have an code image mapping for the address contained in the
trace, at the location described by this element. the payload for the
NACC element is the memory location it could not address.
This means that it cannot correctly follow the instruction execution
sequence described by the individual trace packets.

The dump option works because we do not need to follow the execution
sequence to dump raw trace packets.

It is not clear to me if the perf script option as you specified is
mapping the vmlinux image into the decoder.

Regards

Mike

On 30 December 2017 at 00:33, Leo Yan <leo.yan@linaro.org> wrote:
> Hi Mathieu, Mike,
>
> On Fri, Dec 15, 2017 at 09:44:54AM -0700, Mathieu Poirier wrote:
>> Adding functionality to create a CoreSight trace decoder capable
>> of decoding trace data pushed by a client application.
>>
>> Co-authored-by: Tor Jeremiassen <tor@ti.com>
>> Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
>> ---
>>  tools/perf/util/cs-etm-decoder/cs-etm-decoder.c | 119 ++++++++++++++++++++++++
>>  1 file changed, 119 insertions(+)
>>
>> diff --git a/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c b/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c
>> index 6a4c86b1431f..57b020b0b36f 100644
>> --- a/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c
>> +++ b/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c
>> @@ -200,6 +200,121 @@ static void cs_etm_decoder__clear_buffer(struct cs_etm_decoder *decoder)
>>       }
>>  }
>>
>> +static ocsd_datapath_resp_t
>> +cs_etm_decoder__buffer_packet(struct cs_etm_decoder *decoder,
>> +                           const ocsd_generic_trace_elem *elem,
>> +                           const u8 trace_chan_id,
>> +                           enum cs_etm_sample_type sample_type)
>> +{
>> +     u32 et = 0;
>> +     struct int_node *inode = NULL;
>> +
>> +     if (decoder->packet_count >= MAX_BUFFER - 1)
>> +             return OCSD_RESP_FATAL_SYS_ERR;
>> +
>> +     /* Search the RB tree for the cpu associated with this traceID */
>> +     inode = intlist__find(traceid_list, trace_chan_id);
>> +     if (!inode)
>> +             return OCSD_RESP_FATAL_SYS_ERR;
>> +
>> +     et = decoder->tail;
>> +     decoder->packet_buffer[et].sample_type = sample_type;
>> +     decoder->packet_buffer[et].start_addr = elem->st_addr;
>> +     decoder->packet_buffer[et].end_addr = elem->en_addr;
>> +     decoder->packet_buffer[et].exc = false;
>> +     decoder->packet_buffer[et].exc_ret = false;
>> +     decoder->packet_buffer[et].cpu = *((int *)inode->priv);
>> +
>> +     /* Wrap around if need be */
>> +     et = (et + 1) & (MAX_BUFFER - 1);
>> +
>> +     decoder->tail = et;
>> +     decoder->packet_count++;
>> +
>> +     if (decoder->packet_count == MAX_BUFFER - 1)
>> +             return OCSD_RESP_WAIT;
>> +
>> +     return OCSD_RESP_CONT;
>> +}
>> +
>> +static ocsd_datapath_resp_t cs_etm_decoder__gen_trace_elem_printer(
>> +                             const void *context,
>> +                             const ocsd_trc_index_t indx __maybe_unused,
>> +                             const u8 trace_chan_id __maybe_unused,
>> +                             const ocsd_generic_trace_elem *elem)
>> +{
>> +     ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
>> +     struct cs_etm_decoder *decoder = (struct cs_etm_decoder *) context;
>
> After apply this patch set and build 'perf' tool with linking
> OpenCSDv0.8.0 libs, I can everytime OpenCSD parses 'elem->elem_type'
> is OCSD_GEN_TRC_ELEM_ADDR_NACC but not OCSD_GEN_TRC_ELEM_INSTR_RANGE.
>
> As result, the 'perf' tool can dump the raw data with '-D' option but
> it cannot analyze the symbol and symbol offset with below command:
>
> ./perf script -v -a -F cpu,event,ip,sym,symoff -i ./perf.data -k vmlinux
> --kallsyms ./System.map
>
> Have uploaded perf.data/vmlinux/System.map in the folder:
> http://people.linaro.org/~leo.yan/binaries/perf_4.15_r4/
>
> Thanks,
> Leo Yan
>
>> +     switch (elem->elem_type) {
>> +     case OCSD_GEN_TRC_ELEM_UNKNOWN:
>> +             break;
>> +     case OCSD_GEN_TRC_ELEM_NO_SYNC:
>> +             decoder->trace_on = false;
>> +             break;
>> +     case OCSD_GEN_TRC_ELEM_TRACE_ON:
>> +             decoder->trace_on = true;
>> +             break;
>> +     case OCSD_GEN_TRC_ELEM_INSTR_RANGE:
>> +             resp = cs_etm_decoder__buffer_packet(decoder, elem,
>> +                                                  trace_chan_id,
>> +                                                  CS_ETM_RANGE);
>> +             break;
>> +     case OCSD_GEN_TRC_ELEM_EXCEPTION:
>> +             decoder->packet_buffer[decoder->tail].exc = true;
>> +             break;
>> +     case OCSD_GEN_TRC_ELEM_EXCEPTION_RET:
>> +             decoder->packet_buffer[decoder->tail].exc_ret = true;
>> +             break;
>> +     case OCSD_GEN_TRC_ELEM_PE_CONTEXT:
>> +     case OCSD_GEN_TRC_ELEM_EO_TRACE:
>> +     case OCSD_GEN_TRC_ELEM_ADDR_NACC:
>> +     case OCSD_GEN_TRC_ELEM_TIMESTAMP:
>> +     case OCSD_GEN_TRC_ELEM_CYCLE_COUNT:
>> +     case OCSD_GEN_TRC_ELEM_ADDR_UNKNOWN:
>> +     case OCSD_GEN_TRC_ELEM_EVENT:
>> +     case OCSD_GEN_TRC_ELEM_SWTRACE:
>> +     case OCSD_GEN_TRC_ELEM_CUSTOM:
>> +     default:
>> +             break;
>> +     }
>> +
>> +     return resp;
>> +}
>> +
>> +static int cs_etm_decoder__create_etm_packet_decoder(
>> +                                     struct cs_etm_trace_params *t_params,
>> +                                     struct cs_etm_decoder *decoder)
>> +{
>> +     const char *decoder_name;
>> +     ocsd_etmv4_cfg trace_config_etmv4;
>> +     void *trace_config;
>> +     u8 csid;
>> +
>> +     switch (t_params->protocol) {
>> +     case CS_ETM_PROTO_ETMV4i:
>> +             cs_etm_decoder__gen_etmv4_config(t_params, &trace_config_etmv4);
>> +             decoder_name = OCSD_BUILTIN_DCD_ETMV4I;
>> +             trace_config = &trace_config_etmv4;
>> +             break;
>> +     default:
>> +             return -1;
>> +     }
>> +
>> +     if (ocsd_dt_create_decoder(decoder->dcd_tree,
>> +                                  decoder_name,
>> +                                  OCSD_CREATE_FLG_FULL_DECODER,
>> +                                  trace_config, &csid))
>> +             return -1;
>> +
>> +     if (ocsd_dt_set_gen_elem_outfn(decoder->dcd_tree,
>> +                                    cs_etm_decoder__gen_trace_elem_printer,
>> +                                    decoder))
>> +             return -1;
>> +
>> +     return 0;
>> +}
>> +
>>  static int
>>  cs_etm_decoder__create_etm_decoder(struct cs_etm_decoder_params *d_params,
>>                                  struct cs_etm_trace_params *t_params,
>> @@ -208,6 +323,10 @@ cs_etm_decoder__create_etm_decoder(struct cs_etm_decoder_params *d_params,
>>       if (d_params->operation == CS_ETM_OPERATION_PRINT)
>>               return cs_etm_decoder__create_etm_packet_printer(t_params,
>>                                                                decoder);
>> +     else if (d_params->operation == CS_ETM_OPERATION_DECODE)
>> +             return cs_etm_decoder__create_etm_packet_decoder(t_params,
>> +                                                              decoder);
>> +
>>       return -1;
>>  }
>>
>> --
>> 2.7.4
>>
>
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel



-- 
Mike Leach
Principal Engineer, ARM Ltd.
Blackburn Design Centre. UK

^ permalink raw reply	[flat|nested] 52+ messages in thread

* [PATCH 05/10] perf tools: Add support for decoding CoreSight trace data
@ 2018-01-09 12:09       ` Mike Leach
  0 siblings, 0 replies; 52+ messages in thread
From: Mike Leach @ 2018-01-09 12:09 UTC (permalink / raw)
  To: linux-arm-kernel

Hi Leo,

The OCSD_GEN_TRC_ELEM_ADDR_NACC element indicates that the decoder
does not have an code image mapping for the address contained in the
trace, at the location described by this element. the payload for the
NACC element is the memory location it could not address.
This means that it cannot correctly follow the instruction execution
sequence described by the individual trace packets.

The dump option works because we do not need to follow the execution
sequence to dump raw trace packets.

It is not clear to me if the perf script option as you specified is
mapping the vmlinux image into the decoder.

Regards

Mike

On 30 December 2017 at 00:33, Leo Yan <leo.yan@linaro.org> wrote:
> Hi Mathieu, Mike,
>
> On Fri, Dec 15, 2017 at 09:44:54AM -0700, Mathieu Poirier wrote:
>> Adding functionality to create a CoreSight trace decoder capable
>> of decoding trace data pushed by a client application.
>>
>> Co-authored-by: Tor Jeremiassen <tor@ti.com>
>> Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
>> ---
>>  tools/perf/util/cs-etm-decoder/cs-etm-decoder.c | 119 ++++++++++++++++++++++++
>>  1 file changed, 119 insertions(+)
>>
>> diff --git a/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c b/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c
>> index 6a4c86b1431f..57b020b0b36f 100644
>> --- a/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c
>> +++ b/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c
>> @@ -200,6 +200,121 @@ static void cs_etm_decoder__clear_buffer(struct cs_etm_decoder *decoder)
>>       }
>>  }
>>
>> +static ocsd_datapath_resp_t
>> +cs_etm_decoder__buffer_packet(struct cs_etm_decoder *decoder,
>> +                           const ocsd_generic_trace_elem *elem,
>> +                           const u8 trace_chan_id,
>> +                           enum cs_etm_sample_type sample_type)
>> +{
>> +     u32 et = 0;
>> +     struct int_node *inode = NULL;
>> +
>> +     if (decoder->packet_count >= MAX_BUFFER - 1)
>> +             return OCSD_RESP_FATAL_SYS_ERR;
>> +
>> +     /* Search the RB tree for the cpu associated with this traceID */
>> +     inode = intlist__find(traceid_list, trace_chan_id);
>> +     if (!inode)
>> +             return OCSD_RESP_FATAL_SYS_ERR;
>> +
>> +     et = decoder->tail;
>> +     decoder->packet_buffer[et].sample_type = sample_type;
>> +     decoder->packet_buffer[et].start_addr = elem->st_addr;
>> +     decoder->packet_buffer[et].end_addr = elem->en_addr;
>> +     decoder->packet_buffer[et].exc = false;
>> +     decoder->packet_buffer[et].exc_ret = false;
>> +     decoder->packet_buffer[et].cpu = *((int *)inode->priv);
>> +
>> +     /* Wrap around if need be */
>> +     et = (et + 1) & (MAX_BUFFER - 1);
>> +
>> +     decoder->tail = et;
>> +     decoder->packet_count++;
>> +
>> +     if (decoder->packet_count == MAX_BUFFER - 1)
>> +             return OCSD_RESP_WAIT;
>> +
>> +     return OCSD_RESP_CONT;
>> +}
>> +
>> +static ocsd_datapath_resp_t cs_etm_decoder__gen_trace_elem_printer(
>> +                             const void *context,
>> +                             const ocsd_trc_index_t indx __maybe_unused,
>> +                             const u8 trace_chan_id __maybe_unused,
>> +                             const ocsd_generic_trace_elem *elem)
>> +{
>> +     ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
>> +     struct cs_etm_decoder *decoder = (struct cs_etm_decoder *) context;
>
> After apply this patch set and build 'perf' tool with linking
> OpenCSDv0.8.0 libs, I can everytime OpenCSD parses 'elem->elem_type'
> is OCSD_GEN_TRC_ELEM_ADDR_NACC but not OCSD_GEN_TRC_ELEM_INSTR_RANGE.
>
> As result, the 'perf' tool can dump the raw data with '-D' option but
> it cannot analyze the symbol and symbol offset with below command:
>
> ./perf script -v -a -F cpu,event,ip,sym,symoff -i ./perf.data -k vmlinux
> --kallsyms ./System.map
>
> Have uploaded perf.data/vmlinux/System.map in the folder:
> http://people.linaro.org/~leo.yan/binaries/perf_4.15_r4/
>
> Thanks,
> Leo Yan
>
>> +     switch (elem->elem_type) {
>> +     case OCSD_GEN_TRC_ELEM_UNKNOWN:
>> +             break;
>> +     case OCSD_GEN_TRC_ELEM_NO_SYNC:
>> +             decoder->trace_on = false;
>> +             break;
>> +     case OCSD_GEN_TRC_ELEM_TRACE_ON:
>> +             decoder->trace_on = true;
>> +             break;
>> +     case OCSD_GEN_TRC_ELEM_INSTR_RANGE:
>> +             resp = cs_etm_decoder__buffer_packet(decoder, elem,
>> +                                                  trace_chan_id,
>> +                                                  CS_ETM_RANGE);
>> +             break;
>> +     case OCSD_GEN_TRC_ELEM_EXCEPTION:
>> +             decoder->packet_buffer[decoder->tail].exc = true;
>> +             break;
>> +     case OCSD_GEN_TRC_ELEM_EXCEPTION_RET:
>> +             decoder->packet_buffer[decoder->tail].exc_ret = true;
>> +             break;
>> +     case OCSD_GEN_TRC_ELEM_PE_CONTEXT:
>> +     case OCSD_GEN_TRC_ELEM_EO_TRACE:
>> +     case OCSD_GEN_TRC_ELEM_ADDR_NACC:
>> +     case OCSD_GEN_TRC_ELEM_TIMESTAMP:
>> +     case OCSD_GEN_TRC_ELEM_CYCLE_COUNT:
>> +     case OCSD_GEN_TRC_ELEM_ADDR_UNKNOWN:
>> +     case OCSD_GEN_TRC_ELEM_EVENT:
>> +     case OCSD_GEN_TRC_ELEM_SWTRACE:
>> +     case OCSD_GEN_TRC_ELEM_CUSTOM:
>> +     default:
>> +             break;
>> +     }
>> +
>> +     return resp;
>> +}
>> +
>> +static int cs_etm_decoder__create_etm_packet_decoder(
>> +                                     struct cs_etm_trace_params *t_params,
>> +                                     struct cs_etm_decoder *decoder)
>> +{
>> +     const char *decoder_name;
>> +     ocsd_etmv4_cfg trace_config_etmv4;
>> +     void *trace_config;
>> +     u8 csid;
>> +
>> +     switch (t_params->protocol) {
>> +     case CS_ETM_PROTO_ETMV4i:
>> +             cs_etm_decoder__gen_etmv4_config(t_params, &trace_config_etmv4);
>> +             decoder_name = OCSD_BUILTIN_DCD_ETMV4I;
>> +             trace_config = &trace_config_etmv4;
>> +             break;
>> +     default:
>> +             return -1;
>> +     }
>> +
>> +     if (ocsd_dt_create_decoder(decoder->dcd_tree,
>> +                                  decoder_name,
>> +                                  OCSD_CREATE_FLG_FULL_DECODER,
>> +                                  trace_config, &csid))
>> +             return -1;
>> +
>> +     if (ocsd_dt_set_gen_elem_outfn(decoder->dcd_tree,
>> +                                    cs_etm_decoder__gen_trace_elem_printer,
>> +                                    decoder))
>> +             return -1;
>> +
>> +     return 0;
>> +}
>> +
>>  static int
>>  cs_etm_decoder__create_etm_decoder(struct cs_etm_decoder_params *d_params,
>>                                  struct cs_etm_trace_params *t_params,
>> @@ -208,6 +323,10 @@ cs_etm_decoder__create_etm_decoder(struct cs_etm_decoder_params *d_params,
>>       if (d_params->operation == CS_ETM_OPERATION_PRINT)
>>               return cs_etm_decoder__create_etm_packet_printer(t_params,
>>                                                                decoder);
>> +     else if (d_params->operation == CS_ETM_OPERATION_DECODE)
>> +             return cs_etm_decoder__create_etm_packet_decoder(t_params,
>> +                                                              decoder);
>> +
>>       return -1;
>>  }
>>
>> --
>> 2.7.4
>>
>
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel



-- 
Mike Leach
Principal Engineer, ARM Ltd.
Blackburn Design Centre. UK

^ permalink raw reply	[flat|nested] 52+ messages in thread

* Re: [PATCH 05/10] perf tools: Add support for decoding CoreSight trace data
  2018-01-09 12:09       ` Mike Leach
@ 2018-01-10  5:59         ` Leo Yan
  -1 siblings, 0 replies; 52+ messages in thread
From: Leo Yan @ 2018-01-10  5:59 UTC (permalink / raw)
  To: Mike Leach
  Cc: Mathieu Poirier, peterz, linux-kernel, adrian.hunter, acme,
	Jeremiassen, Tor, alexander.shishkin, mingo, Mike Leach,
	namhyung, suzuki.poulosi, jolsa, linux-arm-kernel

Hi Mike,

On Tue, Jan 09, 2018 at 12:09:58PM +0000, Mike Leach wrote:
> Hi Leo,
> 
> The OCSD_GEN_TRC_ELEM_ADDR_NACC element indicates that the decoder
> does not have an code image mapping for the address contained in the
> trace, at the location described by this element. the payload for the
> NACC element is the memory location it could not address.
> This means that it cannot correctly follow the instruction execution
> sequence described by the individual trace packets.
> 
> The dump option works because we do not need to follow the execution
> sequence to dump raw trace packets.
> 
> It is not clear to me if the perf script option as you specified is
> mapping the vmlinux image into the decoder.

I only can say that the 'perf script' has loaded symbol list by the
option '--kallsyms ./System.map'.  Here have one corner case is for
option '-k vmlinux', at my side I build 'perf' tool without linking
libelf, so perf cannot directly parse kernel symbol.  If the perf
tool is built with linking libelf, then we can directly load kernel
symbol mapping from vmlinux and don't need specifiy option
'--kallsyms ./System.map' anymore.

Could you point which perf code will pass vmlinux mapping to the
decoder? I don't know this before.  After some debugging I only found
perf relies on OpenCSD to return back OCSD_GEN_TRC_ELEM_INSTR_RANGE
and then perf will do symbol/sym_off analysis, otherwise it will skip
symbol analysis.

BTW, I use the same 'perf script' command with OpenCSD v0.7.5, it
can return back OCSD_GEN_TRC_ELEM_INSTR_RANGE but not
OCSD_GEN_TRC_ELEM_ADDR_NACC so it can print out kernel symbol, this
is for using the same perf.data and vmlinux files.

Thanks,
Leo Yan

> On 30 December 2017 at 00:33, Leo Yan <leo.yan@linaro.org> wrote:
> > Hi Mathieu, Mike,
> >
> > On Fri, Dec 15, 2017 at 09:44:54AM -0700, Mathieu Poirier wrote:
> >> Adding functionality to create a CoreSight trace decoder capable
> >> of decoding trace data pushed by a client application.
> >>
> >> Co-authored-by: Tor Jeremiassen <tor@ti.com>
> >> Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
> >> ---
> >>  tools/perf/util/cs-etm-decoder/cs-etm-decoder.c | 119 ++++++++++++++++++++++++
> >>  1 file changed, 119 insertions(+)
> >>
> >> diff --git a/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c b/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c
> >> index 6a4c86b1431f..57b020b0b36f 100644
> >> --- a/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c
> >> +++ b/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c
> >> @@ -200,6 +200,121 @@ static void cs_etm_decoder__clear_buffer(struct cs_etm_decoder *decoder)
> >>       }
> >>  }
> >>
> >> +static ocsd_datapath_resp_t
> >> +cs_etm_decoder__buffer_packet(struct cs_etm_decoder *decoder,
> >> +                           const ocsd_generic_trace_elem *elem,
> >> +                           const u8 trace_chan_id,
> >> +                           enum cs_etm_sample_type sample_type)
> >> +{
> >> +     u32 et = 0;
> >> +     struct int_node *inode = NULL;
> >> +
> >> +     if (decoder->packet_count >= MAX_BUFFER - 1)
> >> +             return OCSD_RESP_FATAL_SYS_ERR;
> >> +
> >> +     /* Search the RB tree for the cpu associated with this traceID */
> >> +     inode = intlist__find(traceid_list, trace_chan_id);
> >> +     if (!inode)
> >> +             return OCSD_RESP_FATAL_SYS_ERR;
> >> +
> >> +     et = decoder->tail;
> >> +     decoder->packet_buffer[et].sample_type = sample_type;
> >> +     decoder->packet_buffer[et].start_addr = elem->st_addr;
> >> +     decoder->packet_buffer[et].end_addr = elem->en_addr;
> >> +     decoder->packet_buffer[et].exc = false;
> >> +     decoder->packet_buffer[et].exc_ret = false;
> >> +     decoder->packet_buffer[et].cpu = *((int *)inode->priv);
> >> +
> >> +     /* Wrap around if need be */
> >> +     et = (et + 1) & (MAX_BUFFER - 1);
> >> +
> >> +     decoder->tail = et;
> >> +     decoder->packet_count++;
> >> +
> >> +     if (decoder->packet_count == MAX_BUFFER - 1)
> >> +             return OCSD_RESP_WAIT;
> >> +
> >> +     return OCSD_RESP_CONT;
> >> +}
> >> +
> >> +static ocsd_datapath_resp_t cs_etm_decoder__gen_trace_elem_printer(
> >> +                             const void *context,
> >> +                             const ocsd_trc_index_t indx __maybe_unused,
> >> +                             const u8 trace_chan_id __maybe_unused,
> >> +                             const ocsd_generic_trace_elem *elem)
> >> +{
> >> +     ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
> >> +     struct cs_etm_decoder *decoder = (struct cs_etm_decoder *) context;
> >
> > After apply this patch set and build 'perf' tool with linking
> > OpenCSDv0.8.0 libs, I can everytime OpenCSD parses 'elem->elem_type'
> > is OCSD_GEN_TRC_ELEM_ADDR_NACC but not OCSD_GEN_TRC_ELEM_INSTR_RANGE.
> >
> > As result, the 'perf' tool can dump the raw data with '-D' option but
> > it cannot analyze the symbol and symbol offset with below command:
> >
> > ./perf script -v -a -F cpu,event,ip,sym,symoff -i ./perf.data -k vmlinux
> > --kallsyms ./System.map
> >
> > Have uploaded perf.data/vmlinux/System.map in the folder:
> > http://people.linaro.org/~leo.yan/binaries/perf_4.15_r4/
> >
> > Thanks,
> > Leo Yan
> >
> >> +     switch (elem->elem_type) {
> >> +     case OCSD_GEN_TRC_ELEM_UNKNOWN:
> >> +             break;
> >> +     case OCSD_GEN_TRC_ELEM_NO_SYNC:
> >> +             decoder->trace_on = false;
> >> +             break;
> >> +     case OCSD_GEN_TRC_ELEM_TRACE_ON:
> >> +             decoder->trace_on = true;
> >> +             break;
> >> +     case OCSD_GEN_TRC_ELEM_INSTR_RANGE:
> >> +             resp = cs_etm_decoder__buffer_packet(decoder, elem,
> >> +                                                  trace_chan_id,
> >> +                                                  CS_ETM_RANGE);
> >> +             break;
> >> +     case OCSD_GEN_TRC_ELEM_EXCEPTION:
> >> +             decoder->packet_buffer[decoder->tail].exc = true;
> >> +             break;
> >> +     case OCSD_GEN_TRC_ELEM_EXCEPTION_RET:
> >> +             decoder->packet_buffer[decoder->tail].exc_ret = true;
> >> +             break;
> >> +     case OCSD_GEN_TRC_ELEM_PE_CONTEXT:
> >> +     case OCSD_GEN_TRC_ELEM_EO_TRACE:
> >> +     case OCSD_GEN_TRC_ELEM_ADDR_NACC:
> >> +     case OCSD_GEN_TRC_ELEM_TIMESTAMP:
> >> +     case OCSD_GEN_TRC_ELEM_CYCLE_COUNT:
> >> +     case OCSD_GEN_TRC_ELEM_ADDR_UNKNOWN:
> >> +     case OCSD_GEN_TRC_ELEM_EVENT:
> >> +     case OCSD_GEN_TRC_ELEM_SWTRACE:
> >> +     case OCSD_GEN_TRC_ELEM_CUSTOM:
> >> +     default:
> >> +             break;
> >> +     }
> >> +
> >> +     return resp;
> >> +}
> >> +
> >> +static int cs_etm_decoder__create_etm_packet_decoder(
> >> +                                     struct cs_etm_trace_params *t_params,
> >> +                                     struct cs_etm_decoder *decoder)
> >> +{
> >> +     const char *decoder_name;
> >> +     ocsd_etmv4_cfg trace_config_etmv4;
> >> +     void *trace_config;
> >> +     u8 csid;
> >> +
> >> +     switch (t_params->protocol) {
> >> +     case CS_ETM_PROTO_ETMV4i:
> >> +             cs_etm_decoder__gen_etmv4_config(t_params, &trace_config_etmv4);
> >> +             decoder_name = OCSD_BUILTIN_DCD_ETMV4I;
> >> +             trace_config = &trace_config_etmv4;
> >> +             break;
> >> +     default:
> >> +             return -1;
> >> +     }
> >> +
> >> +     if (ocsd_dt_create_decoder(decoder->dcd_tree,
> >> +                                  decoder_name,
> >> +                                  OCSD_CREATE_FLG_FULL_DECODER,
> >> +                                  trace_config, &csid))
> >> +             return -1;
> >> +
> >> +     if (ocsd_dt_set_gen_elem_outfn(decoder->dcd_tree,
> >> +                                    cs_etm_decoder__gen_trace_elem_printer,
> >> +                                    decoder))
> >> +             return -1;
> >> +
> >> +     return 0;
> >> +}
> >> +
> >>  static int
> >>  cs_etm_decoder__create_etm_decoder(struct cs_etm_decoder_params *d_params,
> >>                                  struct cs_etm_trace_params *t_params,
> >> @@ -208,6 +323,10 @@ cs_etm_decoder__create_etm_decoder(struct cs_etm_decoder_params *d_params,
> >>       if (d_params->operation == CS_ETM_OPERATION_PRINT)
> >>               return cs_etm_decoder__create_etm_packet_printer(t_params,
> >>                                                                decoder);
> >> +     else if (d_params->operation == CS_ETM_OPERATION_DECODE)
> >> +             return cs_etm_decoder__create_etm_packet_decoder(t_params,
> >> +                                                              decoder);
> >> +
> >>       return -1;
> >>  }
> >>
> >> --
> >> 2.7.4
> >>
> >
> > _______________________________________________
> > linux-arm-kernel mailing list
> > linux-arm-kernel@lists.infradead.org
> > http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
> 
> 
> 
> -- 
> Mike Leach
> Principal Engineer, ARM Ltd.
> Blackburn Design Centre. UK

^ permalink raw reply	[flat|nested] 52+ messages in thread

* [PATCH 05/10] perf tools: Add support for decoding CoreSight trace data
@ 2018-01-10  5:59         ` Leo Yan
  0 siblings, 0 replies; 52+ messages in thread
From: Leo Yan @ 2018-01-10  5:59 UTC (permalink / raw)
  To: linux-arm-kernel

Hi Mike,

On Tue, Jan 09, 2018 at 12:09:58PM +0000, Mike Leach wrote:
> Hi Leo,
> 
> The OCSD_GEN_TRC_ELEM_ADDR_NACC element indicates that the decoder
> does not have an code image mapping for the address contained in the
> trace, at the location described by this element. the payload for the
> NACC element is the memory location it could not address.
> This means that it cannot correctly follow the instruction execution
> sequence described by the individual trace packets.
> 
> The dump option works because we do not need to follow the execution
> sequence to dump raw trace packets.
> 
> It is not clear to me if the perf script option as you specified is
> mapping the vmlinux image into the decoder.

I only can say that the 'perf script' has loaded symbol list by the
option '--kallsyms ./System.map'.  Here have one corner case is for
option '-k vmlinux', at my side I build 'perf' tool without linking
libelf, so perf cannot directly parse kernel symbol.  If the perf
tool is built with linking libelf, then we can directly load kernel
symbol mapping from vmlinux and don't need specifiy option
'--kallsyms ./System.map' anymore.

Could you point which perf code will pass vmlinux mapping to the
decoder? I don't know this before.  After some debugging I only found
perf relies on OpenCSD to return back OCSD_GEN_TRC_ELEM_INSTR_RANGE
and then perf will do symbol/sym_off analysis, otherwise it will skip
symbol analysis.

BTW, I use the same 'perf script' command with OpenCSD v0.7.5, it
can return back OCSD_GEN_TRC_ELEM_INSTR_RANGE but not
OCSD_GEN_TRC_ELEM_ADDR_NACC so it can print out kernel symbol, this
is for using the same perf.data and vmlinux files.

Thanks,
Leo Yan

> On 30 December 2017 at 00:33, Leo Yan <leo.yan@linaro.org> wrote:
> > Hi Mathieu, Mike,
> >
> > On Fri, Dec 15, 2017 at 09:44:54AM -0700, Mathieu Poirier wrote:
> >> Adding functionality to create a CoreSight trace decoder capable
> >> of decoding trace data pushed by a client application.
> >>
> >> Co-authored-by: Tor Jeremiassen <tor@ti.com>
> >> Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
> >> ---
> >>  tools/perf/util/cs-etm-decoder/cs-etm-decoder.c | 119 ++++++++++++++++++++++++
> >>  1 file changed, 119 insertions(+)
> >>
> >> diff --git a/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c b/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c
> >> index 6a4c86b1431f..57b020b0b36f 100644
> >> --- a/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c
> >> +++ b/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c
> >> @@ -200,6 +200,121 @@ static void cs_etm_decoder__clear_buffer(struct cs_etm_decoder *decoder)
> >>       }
> >>  }
> >>
> >> +static ocsd_datapath_resp_t
> >> +cs_etm_decoder__buffer_packet(struct cs_etm_decoder *decoder,
> >> +                           const ocsd_generic_trace_elem *elem,
> >> +                           const u8 trace_chan_id,
> >> +                           enum cs_etm_sample_type sample_type)
> >> +{
> >> +     u32 et = 0;
> >> +     struct int_node *inode = NULL;
> >> +
> >> +     if (decoder->packet_count >= MAX_BUFFER - 1)
> >> +             return OCSD_RESP_FATAL_SYS_ERR;
> >> +
> >> +     /* Search the RB tree for the cpu associated with this traceID */
> >> +     inode = intlist__find(traceid_list, trace_chan_id);
> >> +     if (!inode)
> >> +             return OCSD_RESP_FATAL_SYS_ERR;
> >> +
> >> +     et = decoder->tail;
> >> +     decoder->packet_buffer[et].sample_type = sample_type;
> >> +     decoder->packet_buffer[et].start_addr = elem->st_addr;
> >> +     decoder->packet_buffer[et].end_addr = elem->en_addr;
> >> +     decoder->packet_buffer[et].exc = false;
> >> +     decoder->packet_buffer[et].exc_ret = false;
> >> +     decoder->packet_buffer[et].cpu = *((int *)inode->priv);
> >> +
> >> +     /* Wrap around if need be */
> >> +     et = (et + 1) & (MAX_BUFFER - 1);
> >> +
> >> +     decoder->tail = et;
> >> +     decoder->packet_count++;
> >> +
> >> +     if (decoder->packet_count == MAX_BUFFER - 1)
> >> +             return OCSD_RESP_WAIT;
> >> +
> >> +     return OCSD_RESP_CONT;
> >> +}
> >> +
> >> +static ocsd_datapath_resp_t cs_etm_decoder__gen_trace_elem_printer(
> >> +                             const void *context,
> >> +                             const ocsd_trc_index_t indx __maybe_unused,
> >> +                             const u8 trace_chan_id __maybe_unused,
> >> +                             const ocsd_generic_trace_elem *elem)
> >> +{
> >> +     ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
> >> +     struct cs_etm_decoder *decoder = (struct cs_etm_decoder *) context;
> >
> > After apply this patch set and build 'perf' tool with linking
> > OpenCSDv0.8.0 libs, I can everytime OpenCSD parses 'elem->elem_type'
> > is OCSD_GEN_TRC_ELEM_ADDR_NACC but not OCSD_GEN_TRC_ELEM_INSTR_RANGE.
> >
> > As result, the 'perf' tool can dump the raw data with '-D' option but
> > it cannot analyze the symbol and symbol offset with below command:
> >
> > ./perf script -v -a -F cpu,event,ip,sym,symoff -i ./perf.data -k vmlinux
> > --kallsyms ./System.map
> >
> > Have uploaded perf.data/vmlinux/System.map in the folder:
> > http://people.linaro.org/~leo.yan/binaries/perf_4.15_r4/
> >
> > Thanks,
> > Leo Yan
> >
> >> +     switch (elem->elem_type) {
> >> +     case OCSD_GEN_TRC_ELEM_UNKNOWN:
> >> +             break;
> >> +     case OCSD_GEN_TRC_ELEM_NO_SYNC:
> >> +             decoder->trace_on = false;
> >> +             break;
> >> +     case OCSD_GEN_TRC_ELEM_TRACE_ON:
> >> +             decoder->trace_on = true;
> >> +             break;
> >> +     case OCSD_GEN_TRC_ELEM_INSTR_RANGE:
> >> +             resp = cs_etm_decoder__buffer_packet(decoder, elem,
> >> +                                                  trace_chan_id,
> >> +                                                  CS_ETM_RANGE);
> >> +             break;
> >> +     case OCSD_GEN_TRC_ELEM_EXCEPTION:
> >> +             decoder->packet_buffer[decoder->tail].exc = true;
> >> +             break;
> >> +     case OCSD_GEN_TRC_ELEM_EXCEPTION_RET:
> >> +             decoder->packet_buffer[decoder->tail].exc_ret = true;
> >> +             break;
> >> +     case OCSD_GEN_TRC_ELEM_PE_CONTEXT:
> >> +     case OCSD_GEN_TRC_ELEM_EO_TRACE:
> >> +     case OCSD_GEN_TRC_ELEM_ADDR_NACC:
> >> +     case OCSD_GEN_TRC_ELEM_TIMESTAMP:
> >> +     case OCSD_GEN_TRC_ELEM_CYCLE_COUNT:
> >> +     case OCSD_GEN_TRC_ELEM_ADDR_UNKNOWN:
> >> +     case OCSD_GEN_TRC_ELEM_EVENT:
> >> +     case OCSD_GEN_TRC_ELEM_SWTRACE:
> >> +     case OCSD_GEN_TRC_ELEM_CUSTOM:
> >> +     default:
> >> +             break;
> >> +     }
> >> +
> >> +     return resp;
> >> +}
> >> +
> >> +static int cs_etm_decoder__create_etm_packet_decoder(
> >> +                                     struct cs_etm_trace_params *t_params,
> >> +                                     struct cs_etm_decoder *decoder)
> >> +{
> >> +     const char *decoder_name;
> >> +     ocsd_etmv4_cfg trace_config_etmv4;
> >> +     void *trace_config;
> >> +     u8 csid;
> >> +
> >> +     switch (t_params->protocol) {
> >> +     case CS_ETM_PROTO_ETMV4i:
> >> +             cs_etm_decoder__gen_etmv4_config(t_params, &trace_config_etmv4);
> >> +             decoder_name = OCSD_BUILTIN_DCD_ETMV4I;
> >> +             trace_config = &trace_config_etmv4;
> >> +             break;
> >> +     default:
> >> +             return -1;
> >> +     }
> >> +
> >> +     if (ocsd_dt_create_decoder(decoder->dcd_tree,
> >> +                                  decoder_name,
> >> +                                  OCSD_CREATE_FLG_FULL_DECODER,
> >> +                                  trace_config, &csid))
> >> +             return -1;
> >> +
> >> +     if (ocsd_dt_set_gen_elem_outfn(decoder->dcd_tree,
> >> +                                    cs_etm_decoder__gen_trace_elem_printer,
> >> +                                    decoder))
> >> +             return -1;
> >> +
> >> +     return 0;
> >> +}
> >> +
> >>  static int
> >>  cs_etm_decoder__create_etm_decoder(struct cs_etm_decoder_params *d_params,
> >>                                  struct cs_etm_trace_params *t_params,
> >> @@ -208,6 +323,10 @@ cs_etm_decoder__create_etm_decoder(struct cs_etm_decoder_params *d_params,
> >>       if (d_params->operation == CS_ETM_OPERATION_PRINT)
> >>               return cs_etm_decoder__create_etm_packet_printer(t_params,
> >>                                                                decoder);
> >> +     else if (d_params->operation == CS_ETM_OPERATION_DECODE)
> >> +             return cs_etm_decoder__create_etm_packet_decoder(t_params,
> >> +                                                              decoder);
> >> +
> >>       return -1;
> >>  }
> >>
> >> --
> >> 2.7.4
> >>
> >
> > _______________________________________________
> > linux-arm-kernel mailing list
> > linux-arm-kernel at lists.infradead.org
> > http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
> 
> 
> 
> -- 
> Mike Leach
> Principal Engineer, ARM Ltd.
> Blackburn Design Centre. UK

^ permalink raw reply	[flat|nested] 52+ messages in thread

* Re: [PATCH 05/10] perf tools: Add support for decoding CoreSight trace data
  2018-01-10  5:59         ` Leo Yan
@ 2018-01-10 20:16           ` Mathieu Poirier
  -1 siblings, 0 replies; 52+ messages in thread
From: Mathieu Poirier @ 2018-01-10 20:16 UTC (permalink / raw)
  To: Leo Yan
  Cc: Mike Leach, Peter Zijlstra, linux-kernel, Adrian Hunter,
	Arnaldo Carvalho de Melo, Jeremiassen, Tor, Alexander Shishkin,
	Ingo Molnar, Mike Leach, namhyung, suzuki.poulosi, Jiri Olsa,
	linux-arm-kernel

On 9 January 2018 at 22:59, Leo Yan <leo.yan@linaro.org> wrote:
> Hi Mike,
>
> On Tue, Jan 09, 2018 at 12:09:58PM +0000, Mike Leach wrote:
>> Hi Leo,
>>
>> The OCSD_GEN_TRC_ELEM_ADDR_NACC element indicates that the decoder
>> does not have an code image mapping for the address contained in the
>> trace, at the location described by this element. the payload for the
>> NACC element is the memory location it could not address.
>> This means that it cannot correctly follow the instruction execution
>> sequence described by the individual trace packets.
>>
>> The dump option works because we do not need to follow the execution
>> sequence to dump raw trace packets.
>>
>> It is not clear to me if the perf script option as you specified is
>> mapping the vmlinux image into the decoder.
>
> I only can say that the 'perf script' has loaded symbol list by the
> option '--kallsyms ./System.map'.  Here have one corner case is for
> option '-k vmlinux', at my side I build 'perf' tool without linking
> libelf, so perf cannot directly parse kernel symbol.  If the perf
> tool is built with linking libelf, then we can directly load kernel
> symbol mapping from vmlinux and don't need specifiy option
> '--kallsyms ./System.map' anymore.
>
> Could you point which perf code will pass vmlinux mapping to the
> decoder? I don't know this before.  After some debugging I only found
> perf relies on OpenCSD to return back OCSD_GEN_TRC_ELEM_INSTR_RANGE
> and then perf will do symbol/sym_off analysis, otherwise it will skip
> symbol analysis.

I have hit this problem before when trying to decode kernel traces.
When using the --kallsyms option the kernel's base address isn't
correctly set and from there no symbols can be decoded (the same
happens on PT).  Looking into the root cause of the problem is on my
(long) list of things to do.  In the mean time try with only the -k
vmlinux option and see how far that gets you.

Mathieu

>
> BTW, I use the same 'perf script' command with OpenCSD v0.7.5, it
> can return back OCSD_GEN_TRC_ELEM_INSTR_RANGE but not
> OCSD_GEN_TRC_ELEM_ADDR_NACC so it can print out kernel symbol, this
> is for using the same perf.data and vmlinux files.
>
> Thanks,
> Leo Yan
>
>> On 30 December 2017 at 00:33, Leo Yan <leo.yan@linaro.org> wrote:
>> > Hi Mathieu, Mike,
>> >
>> > On Fri, Dec 15, 2017 at 09:44:54AM -0700, Mathieu Poirier wrote:
>> >> Adding functionality to create a CoreSight trace decoder capable
>> >> of decoding trace data pushed by a client application.
>> >>
>> >> Co-authored-by: Tor Jeremiassen <tor@ti.com>
>> >> Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
>> >> ---
>> >>  tools/perf/util/cs-etm-decoder/cs-etm-decoder.c | 119 ++++++++++++++++++++++++
>> >>  1 file changed, 119 insertions(+)
>> >>
>> >> diff --git a/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c b/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c
>> >> index 6a4c86b1431f..57b020b0b36f 100644
>> >> --- a/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c
>> >> +++ b/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c
>> >> @@ -200,6 +200,121 @@ static void cs_etm_decoder__clear_buffer(struct cs_etm_decoder *decoder)
>> >>       }
>> >>  }
>> >>
>> >> +static ocsd_datapath_resp_t
>> >> +cs_etm_decoder__buffer_packet(struct cs_etm_decoder *decoder,
>> >> +                           const ocsd_generic_trace_elem *elem,
>> >> +                           const u8 trace_chan_id,
>> >> +                           enum cs_etm_sample_type sample_type)
>> >> +{
>> >> +     u32 et = 0;
>> >> +     struct int_node *inode = NULL;
>> >> +
>> >> +     if (decoder->packet_count >= MAX_BUFFER - 1)
>> >> +             return OCSD_RESP_FATAL_SYS_ERR;
>> >> +
>> >> +     /* Search the RB tree for the cpu associated with this traceID */
>> >> +     inode = intlist__find(traceid_list, trace_chan_id);
>> >> +     if (!inode)
>> >> +             return OCSD_RESP_FATAL_SYS_ERR;
>> >> +
>> >> +     et = decoder->tail;
>> >> +     decoder->packet_buffer[et].sample_type = sample_type;
>> >> +     decoder->packet_buffer[et].start_addr = elem->st_addr;
>> >> +     decoder->packet_buffer[et].end_addr = elem->en_addr;
>> >> +     decoder->packet_buffer[et].exc = false;
>> >> +     decoder->packet_buffer[et].exc_ret = false;
>> >> +     decoder->packet_buffer[et].cpu = *((int *)inode->priv);
>> >> +
>> >> +     /* Wrap around if need be */
>> >> +     et = (et + 1) & (MAX_BUFFER - 1);
>> >> +
>> >> +     decoder->tail = et;
>> >> +     decoder->packet_count++;
>> >> +
>> >> +     if (decoder->packet_count == MAX_BUFFER - 1)
>> >> +             return OCSD_RESP_WAIT;
>> >> +
>> >> +     return OCSD_RESP_CONT;
>> >> +}
>> >> +
>> >> +static ocsd_datapath_resp_t cs_etm_decoder__gen_trace_elem_printer(
>> >> +                             const void *context,
>> >> +                             const ocsd_trc_index_t indx __maybe_unused,
>> >> +                             const u8 trace_chan_id __maybe_unused,
>> >> +                             const ocsd_generic_trace_elem *elem)
>> >> +{
>> >> +     ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
>> >> +     struct cs_etm_decoder *decoder = (struct cs_etm_decoder *) context;
>> >
>> > After apply this patch set and build 'perf' tool with linking
>> > OpenCSDv0.8.0 libs, I can everytime OpenCSD parses 'elem->elem_type'
>> > is OCSD_GEN_TRC_ELEM_ADDR_NACC but not OCSD_GEN_TRC_ELEM_INSTR_RANGE.
>> >
>> > As result, the 'perf' tool can dump the raw data with '-D' option but
>> > it cannot analyze the symbol and symbol offset with below command:
>> >
>> > ./perf script -v -a -F cpu,event,ip,sym,symoff -i ./perf.data -k vmlinux
>> > --kallsyms ./System.map
>> >
>> > Have uploaded perf.data/vmlinux/System.map in the folder:
>> > http://people.linaro.org/~leo.yan/binaries/perf_4.15_r4/
>> >
>> > Thanks,
>> > Leo Yan
>> >
>> >> +     switch (elem->elem_type) {
>> >> +     case OCSD_GEN_TRC_ELEM_UNKNOWN:
>> >> +             break;
>> >> +     case OCSD_GEN_TRC_ELEM_NO_SYNC:
>> >> +             decoder->trace_on = false;
>> >> +             break;
>> >> +     case OCSD_GEN_TRC_ELEM_TRACE_ON:
>> >> +             decoder->trace_on = true;
>> >> +             break;
>> >> +     case OCSD_GEN_TRC_ELEM_INSTR_RANGE:
>> >> +             resp = cs_etm_decoder__buffer_packet(decoder, elem,
>> >> +                                                  trace_chan_id,
>> >> +                                                  CS_ETM_RANGE);
>> >> +             break;
>> >> +     case OCSD_GEN_TRC_ELEM_EXCEPTION:
>> >> +             decoder->packet_buffer[decoder->tail].exc = true;
>> >> +             break;
>> >> +     case OCSD_GEN_TRC_ELEM_EXCEPTION_RET:
>> >> +             decoder->packet_buffer[decoder->tail].exc_ret = true;
>> >> +             break;
>> >> +     case OCSD_GEN_TRC_ELEM_PE_CONTEXT:
>> >> +     case OCSD_GEN_TRC_ELEM_EO_TRACE:
>> >> +     case OCSD_GEN_TRC_ELEM_ADDR_NACC:
>> >> +     case OCSD_GEN_TRC_ELEM_TIMESTAMP:
>> >> +     case OCSD_GEN_TRC_ELEM_CYCLE_COUNT:
>> >> +     case OCSD_GEN_TRC_ELEM_ADDR_UNKNOWN:
>> >> +     case OCSD_GEN_TRC_ELEM_EVENT:
>> >> +     case OCSD_GEN_TRC_ELEM_SWTRACE:
>> >> +     case OCSD_GEN_TRC_ELEM_CUSTOM:
>> >> +     default:
>> >> +             break;
>> >> +     }
>> >> +
>> >> +     return resp;
>> >> +}
>> >> +
>> >> +static int cs_etm_decoder__create_etm_packet_decoder(
>> >> +                                     struct cs_etm_trace_params *t_params,
>> >> +                                     struct cs_etm_decoder *decoder)
>> >> +{
>> >> +     const char *decoder_name;
>> >> +     ocsd_etmv4_cfg trace_config_etmv4;
>> >> +     void *trace_config;
>> >> +     u8 csid;
>> >> +
>> >> +     switch (t_params->protocol) {
>> >> +     case CS_ETM_PROTO_ETMV4i:
>> >> +             cs_etm_decoder__gen_etmv4_config(t_params, &trace_config_etmv4);
>> >> +             decoder_name = OCSD_BUILTIN_DCD_ETMV4I;
>> >> +             trace_config = &trace_config_etmv4;
>> >> +             break;
>> >> +     default:
>> >> +             return -1;
>> >> +     }
>> >> +
>> >> +     if (ocsd_dt_create_decoder(decoder->dcd_tree,
>> >> +                                  decoder_name,
>> >> +                                  OCSD_CREATE_FLG_FULL_DECODER,
>> >> +                                  trace_config, &csid))
>> >> +             return -1;
>> >> +
>> >> +     if (ocsd_dt_set_gen_elem_outfn(decoder->dcd_tree,
>> >> +                                    cs_etm_decoder__gen_trace_elem_printer,
>> >> +                                    decoder))
>> >> +             return -1;
>> >> +
>> >> +     return 0;
>> >> +}
>> >> +
>> >>  static int
>> >>  cs_etm_decoder__create_etm_decoder(struct cs_etm_decoder_params *d_params,
>> >>                                  struct cs_etm_trace_params *t_params,
>> >> @@ -208,6 +323,10 @@ cs_etm_decoder__create_etm_decoder(struct cs_etm_decoder_params *d_params,
>> >>       if (d_params->operation == CS_ETM_OPERATION_PRINT)
>> >>               return cs_etm_decoder__create_etm_packet_printer(t_params,
>> >>                                                                decoder);
>> >> +     else if (d_params->operation == CS_ETM_OPERATION_DECODE)
>> >> +             return cs_etm_decoder__create_etm_packet_decoder(t_params,
>> >> +                                                              decoder);
>> >> +
>> >>       return -1;
>> >>  }
>> >>
>> >> --
>> >> 2.7.4
>> >>
>> >
>> > _______________________________________________
>> > linux-arm-kernel mailing list
>> > linux-arm-kernel@lists.infradead.org
>> > http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
>>
>>
>>
>> --
>> Mike Leach
>> Principal Engineer, ARM Ltd.
>> Blackburn Design Centre. UK

^ permalink raw reply	[flat|nested] 52+ messages in thread

* [PATCH 05/10] perf tools: Add support for decoding CoreSight trace data
@ 2018-01-10 20:16           ` Mathieu Poirier
  0 siblings, 0 replies; 52+ messages in thread
From: Mathieu Poirier @ 2018-01-10 20:16 UTC (permalink / raw)
  To: linux-arm-kernel

On 9 January 2018 at 22:59, Leo Yan <leo.yan@linaro.org> wrote:
> Hi Mike,
>
> On Tue, Jan 09, 2018 at 12:09:58PM +0000, Mike Leach wrote:
>> Hi Leo,
>>
>> The OCSD_GEN_TRC_ELEM_ADDR_NACC element indicates that the decoder
>> does not have an code image mapping for the address contained in the
>> trace, at the location described by this element. the payload for the
>> NACC element is the memory location it could not address.
>> This means that it cannot correctly follow the instruction execution
>> sequence described by the individual trace packets.
>>
>> The dump option works because we do not need to follow the execution
>> sequence to dump raw trace packets.
>>
>> It is not clear to me if the perf script option as you specified is
>> mapping the vmlinux image into the decoder.
>
> I only can say that the 'perf script' has loaded symbol list by the
> option '--kallsyms ./System.map'.  Here have one corner case is for
> option '-k vmlinux', at my side I build 'perf' tool without linking
> libelf, so perf cannot directly parse kernel symbol.  If the perf
> tool is built with linking libelf, then we can directly load kernel
> symbol mapping from vmlinux and don't need specifiy option
> '--kallsyms ./System.map' anymore.
>
> Could you point which perf code will pass vmlinux mapping to the
> decoder? I don't know this before.  After some debugging I only found
> perf relies on OpenCSD to return back OCSD_GEN_TRC_ELEM_INSTR_RANGE
> and then perf will do symbol/sym_off analysis, otherwise it will skip
> symbol analysis.

I have hit this problem before when trying to decode kernel traces.
When using the --kallsyms option the kernel's base address isn't
correctly set and from there no symbols can be decoded (the same
happens on PT).  Looking into the root cause of the problem is on my
(long) list of things to do.  In the mean time try with only the -k
vmlinux option and see how far that gets you.

Mathieu

>
> BTW, I use the same 'perf script' command with OpenCSD v0.7.5, it
> can return back OCSD_GEN_TRC_ELEM_INSTR_RANGE but not
> OCSD_GEN_TRC_ELEM_ADDR_NACC so it can print out kernel symbol, this
> is for using the same perf.data and vmlinux files.
>
> Thanks,
> Leo Yan
>
>> On 30 December 2017 at 00:33, Leo Yan <leo.yan@linaro.org> wrote:
>> > Hi Mathieu, Mike,
>> >
>> > On Fri, Dec 15, 2017 at 09:44:54AM -0700, Mathieu Poirier wrote:
>> >> Adding functionality to create a CoreSight trace decoder capable
>> >> of decoding trace data pushed by a client application.
>> >>
>> >> Co-authored-by: Tor Jeremiassen <tor@ti.com>
>> >> Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
>> >> ---
>> >>  tools/perf/util/cs-etm-decoder/cs-etm-decoder.c | 119 ++++++++++++++++++++++++
>> >>  1 file changed, 119 insertions(+)
>> >>
>> >> diff --git a/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c b/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c
>> >> index 6a4c86b1431f..57b020b0b36f 100644
>> >> --- a/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c
>> >> +++ b/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c
>> >> @@ -200,6 +200,121 @@ static void cs_etm_decoder__clear_buffer(struct cs_etm_decoder *decoder)
>> >>       }
>> >>  }
>> >>
>> >> +static ocsd_datapath_resp_t
>> >> +cs_etm_decoder__buffer_packet(struct cs_etm_decoder *decoder,
>> >> +                           const ocsd_generic_trace_elem *elem,
>> >> +                           const u8 trace_chan_id,
>> >> +                           enum cs_etm_sample_type sample_type)
>> >> +{
>> >> +     u32 et = 0;
>> >> +     struct int_node *inode = NULL;
>> >> +
>> >> +     if (decoder->packet_count >= MAX_BUFFER - 1)
>> >> +             return OCSD_RESP_FATAL_SYS_ERR;
>> >> +
>> >> +     /* Search the RB tree for the cpu associated with this traceID */
>> >> +     inode = intlist__find(traceid_list, trace_chan_id);
>> >> +     if (!inode)
>> >> +             return OCSD_RESP_FATAL_SYS_ERR;
>> >> +
>> >> +     et = decoder->tail;
>> >> +     decoder->packet_buffer[et].sample_type = sample_type;
>> >> +     decoder->packet_buffer[et].start_addr = elem->st_addr;
>> >> +     decoder->packet_buffer[et].end_addr = elem->en_addr;
>> >> +     decoder->packet_buffer[et].exc = false;
>> >> +     decoder->packet_buffer[et].exc_ret = false;
>> >> +     decoder->packet_buffer[et].cpu = *((int *)inode->priv);
>> >> +
>> >> +     /* Wrap around if need be */
>> >> +     et = (et + 1) & (MAX_BUFFER - 1);
>> >> +
>> >> +     decoder->tail = et;
>> >> +     decoder->packet_count++;
>> >> +
>> >> +     if (decoder->packet_count == MAX_BUFFER - 1)
>> >> +             return OCSD_RESP_WAIT;
>> >> +
>> >> +     return OCSD_RESP_CONT;
>> >> +}
>> >> +
>> >> +static ocsd_datapath_resp_t cs_etm_decoder__gen_trace_elem_printer(
>> >> +                             const void *context,
>> >> +                             const ocsd_trc_index_t indx __maybe_unused,
>> >> +                             const u8 trace_chan_id __maybe_unused,
>> >> +                             const ocsd_generic_trace_elem *elem)
>> >> +{
>> >> +     ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
>> >> +     struct cs_etm_decoder *decoder = (struct cs_etm_decoder *) context;
>> >
>> > After apply this patch set and build 'perf' tool with linking
>> > OpenCSDv0.8.0 libs, I can everytime OpenCSD parses 'elem->elem_type'
>> > is OCSD_GEN_TRC_ELEM_ADDR_NACC but not OCSD_GEN_TRC_ELEM_INSTR_RANGE.
>> >
>> > As result, the 'perf' tool can dump the raw data with '-D' option but
>> > it cannot analyze the symbol and symbol offset with below command:
>> >
>> > ./perf script -v -a -F cpu,event,ip,sym,symoff -i ./perf.data -k vmlinux
>> > --kallsyms ./System.map
>> >
>> > Have uploaded perf.data/vmlinux/System.map in the folder:
>> > http://people.linaro.org/~leo.yan/binaries/perf_4.15_r4/
>> >
>> > Thanks,
>> > Leo Yan
>> >
>> >> +     switch (elem->elem_type) {
>> >> +     case OCSD_GEN_TRC_ELEM_UNKNOWN:
>> >> +             break;
>> >> +     case OCSD_GEN_TRC_ELEM_NO_SYNC:
>> >> +             decoder->trace_on = false;
>> >> +             break;
>> >> +     case OCSD_GEN_TRC_ELEM_TRACE_ON:
>> >> +             decoder->trace_on = true;
>> >> +             break;
>> >> +     case OCSD_GEN_TRC_ELEM_INSTR_RANGE:
>> >> +             resp = cs_etm_decoder__buffer_packet(decoder, elem,
>> >> +                                                  trace_chan_id,
>> >> +                                                  CS_ETM_RANGE);
>> >> +             break;
>> >> +     case OCSD_GEN_TRC_ELEM_EXCEPTION:
>> >> +             decoder->packet_buffer[decoder->tail].exc = true;
>> >> +             break;
>> >> +     case OCSD_GEN_TRC_ELEM_EXCEPTION_RET:
>> >> +             decoder->packet_buffer[decoder->tail].exc_ret = true;
>> >> +             break;
>> >> +     case OCSD_GEN_TRC_ELEM_PE_CONTEXT:
>> >> +     case OCSD_GEN_TRC_ELEM_EO_TRACE:
>> >> +     case OCSD_GEN_TRC_ELEM_ADDR_NACC:
>> >> +     case OCSD_GEN_TRC_ELEM_TIMESTAMP:
>> >> +     case OCSD_GEN_TRC_ELEM_CYCLE_COUNT:
>> >> +     case OCSD_GEN_TRC_ELEM_ADDR_UNKNOWN:
>> >> +     case OCSD_GEN_TRC_ELEM_EVENT:
>> >> +     case OCSD_GEN_TRC_ELEM_SWTRACE:
>> >> +     case OCSD_GEN_TRC_ELEM_CUSTOM:
>> >> +     default:
>> >> +             break;
>> >> +     }
>> >> +
>> >> +     return resp;
>> >> +}
>> >> +
>> >> +static int cs_etm_decoder__create_etm_packet_decoder(
>> >> +                                     struct cs_etm_trace_params *t_params,
>> >> +                                     struct cs_etm_decoder *decoder)
>> >> +{
>> >> +     const char *decoder_name;
>> >> +     ocsd_etmv4_cfg trace_config_etmv4;
>> >> +     void *trace_config;
>> >> +     u8 csid;
>> >> +
>> >> +     switch (t_params->protocol) {
>> >> +     case CS_ETM_PROTO_ETMV4i:
>> >> +             cs_etm_decoder__gen_etmv4_config(t_params, &trace_config_etmv4);
>> >> +             decoder_name = OCSD_BUILTIN_DCD_ETMV4I;
>> >> +             trace_config = &trace_config_etmv4;
>> >> +             break;
>> >> +     default:
>> >> +             return -1;
>> >> +     }
>> >> +
>> >> +     if (ocsd_dt_create_decoder(decoder->dcd_tree,
>> >> +                                  decoder_name,
>> >> +                                  OCSD_CREATE_FLG_FULL_DECODER,
>> >> +                                  trace_config, &csid))
>> >> +             return -1;
>> >> +
>> >> +     if (ocsd_dt_set_gen_elem_outfn(decoder->dcd_tree,
>> >> +                                    cs_etm_decoder__gen_trace_elem_printer,
>> >> +                                    decoder))
>> >> +             return -1;
>> >> +
>> >> +     return 0;
>> >> +}
>> >> +
>> >>  static int
>> >>  cs_etm_decoder__create_etm_decoder(struct cs_etm_decoder_params *d_params,
>> >>                                  struct cs_etm_trace_params *t_params,
>> >> @@ -208,6 +323,10 @@ cs_etm_decoder__create_etm_decoder(struct cs_etm_decoder_params *d_params,
>> >>       if (d_params->operation == CS_ETM_OPERATION_PRINT)
>> >>               return cs_etm_decoder__create_etm_packet_printer(t_params,
>> >>                                                                decoder);
>> >> +     else if (d_params->operation == CS_ETM_OPERATION_DECODE)
>> >> +             return cs_etm_decoder__create_etm_packet_decoder(t_params,
>> >> +                                                              decoder);
>> >> +
>> >>       return -1;
>> >>  }
>> >>
>> >> --
>> >> 2.7.4
>> >>
>> >
>> > _______________________________________________
>> > linux-arm-kernel mailing list
>> > linux-arm-kernel at lists.infradead.org
>> > http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
>>
>>
>>
>> --
>> Mike Leach
>> Principal Engineer, ARM Ltd.
>> Blackburn Design Centre. UK

^ permalink raw reply	[flat|nested] 52+ messages in thread

* Re: [PATCH 00/10] perf tools: Add support for CoreSight trace decoding
  2017-12-15 16:44 ` Mathieu Poirier
@ 2018-01-11  0:08   ` Kim Phillips
  -1 siblings, 0 replies; 52+ messages in thread
From: Kim Phillips @ 2018-01-11  0:08 UTC (permalink / raw)
  To: Mathieu Poirier
  Cc: acme, peterz, mingo, alexander.shishkin, namhyung, adrian.hunter,
	mike.leach, suzuki.poulosi, tor, jolsa, linux-kernel,
	linux-arm-kernel, Mark Brown

On Fri, 15 Dec 2017 09:44:49 -0700
Mathieu Poirier <mathieu.poirier@linaro.org> wrote:

> This patchset adds support for per-thread CoreSight trace decoding from the
> "perf report" interface.  It is largely modelled on what has been done for 
> intelPT traces and currently targets the ETMv4 architecture.  Support for
> cpu-wide scenarios and ETMv3/PTMv1.1 will follow shortly.
> 
> The trace decoding support is done using the Open CoreSight Decoding
> Library (openCSD), a stand alone open source project available here [1].
> Integration of the openCSD library with the perf tools follow what has
> been done for other support libraries.  If the library has been installed
> on a system the build scripts will include support for CoreSight trace
> decoding:
> 
> ...                          zlib: [ on  ]
> ...                          lzma: [ OFF ]
> ...                     get_cpuid: [ on  ]
> ...                           bpf: [ on  ]
> ...                    libopencsd: [ on  ] <------
> 
> Instructions on how to build and install the openCSD library are provided
> in the HOWTO.md of the project repository.  

Usually when a perf builder sees something they need "on," they - or,
at least I - start querying the host's package manager for something
that provides it (e.g., apt search/install libopencsd), but since no
distro provides libopencsd, this is bad because it misleads the user.

> We elected to keep the decoder
> library independent of the kernel tree as it is also used outside of the
> perf toolset and various non-linux projects.

Where?  Not that that won't mean it can't be included in the kernel
source tree anyway:  Doing so would enable support without burdening
the linux perf user with adding any external custom library
dependencies.

Keeping the library external will also inevitably introduce more
source level synchronization problems because the perf sources being
built may not be compatible with their version of the library, whether
due to new features like new trace hardware support, or API changes.

As Mark Brown (cc'd) mentioned on the Coresight mailing list, this may
be able to be done the same way the dtc is incorporated into the
kernel, where only its relevant sources are included and updated as
needed:  see linux/scripts/dtc/update-dtc-source.sh.

Hopefully the upstream maintainers (acme, etc.) can chime in with
their opinion on how to include the library, if at all?  It's
essentially the same type of code as the Intel-PT decoder code,
currently found under tools/perf/util/intel-pt-decoder, except we're
trying to keep some sense of connection to the parent project ("Intel
(R) Processor Trace Decoder Library" in Intel's case [1]) alive.

Thanks,

Kim

[1] https://github.com/01org/processor-trace

^ permalink raw reply	[flat|nested] 52+ messages in thread

* [PATCH 00/10] perf tools: Add support for CoreSight trace decoding
@ 2018-01-11  0:08   ` Kim Phillips
  0 siblings, 0 replies; 52+ messages in thread
From: Kim Phillips @ 2018-01-11  0:08 UTC (permalink / raw)
  To: linux-arm-kernel

On Fri, 15 Dec 2017 09:44:49 -0700
Mathieu Poirier <mathieu.poirier@linaro.org> wrote:

> This patchset adds support for per-thread CoreSight trace decoding from the
> "perf report" interface.  It is largely modelled on what has been done for 
> intelPT traces and currently targets the ETMv4 architecture.  Support for
> cpu-wide scenarios and ETMv3/PTMv1.1 will follow shortly.
> 
> The trace decoding support is done using the Open CoreSight Decoding
> Library (openCSD), a stand alone open source project available here [1].
> Integration of the openCSD library with the perf tools follow what has
> been done for other support libraries.  If the library has been installed
> on a system the build scripts will include support for CoreSight trace
> decoding:
> 
> ...                          zlib: [ on  ]
> ...                          lzma: [ OFF ]
> ...                     get_cpuid: [ on  ]
> ...                           bpf: [ on  ]
> ...                    libopencsd: [ on  ] <------
> 
> Instructions on how to build and install the openCSD library are provided
> in the HOWTO.md of the project repository.  

Usually when a perf builder sees something they need "on," they - or,
at least I - start querying the host's package manager for something
that provides it (e.g., apt search/install libopencsd), but since no
distro provides libopencsd, this is bad because it misleads the user.

> We elected to keep the decoder
> library independent of the kernel tree as it is also used outside of the
> perf toolset and various non-linux projects.

Where?  Not that that won't mean it can't be included in the kernel
source tree anyway:  Doing so would enable support without burdening
the linux perf user with adding any external custom library
dependencies.

Keeping the library external will also inevitably introduce more
source level synchronization problems because the perf sources being
built may not be compatible with their version of the library, whether
due to new features like new trace hardware support, or API changes.

As Mark Brown (cc'd) mentioned on the Coresight mailing list, this may
be able to be done the same way the dtc is incorporated into the
kernel, where only its relevant sources are included and updated as
needed:  see linux/scripts/dtc/update-dtc-source.sh.

Hopefully the upstream maintainers (acme, etc.) can chime in with
their opinion on how to include the library, if at all?  It's
essentially the same type of code as the Intel-PT decoder code,
currently found under tools/perf/util/intel-pt-decoder, except we're
trying to keep some sense of connection to the parent project ("Intel
(R) Processor Trace Decoder Library" in Intel's case [1]) alive.

Thanks,

Kim

[1] https://github.com/01org/processor-trace

^ permalink raw reply	[flat|nested] 52+ messages in thread

* Re: [PATCH 00/10] perf tools: Add support for CoreSight trace decoding
  2018-01-11  0:08   ` Kim Phillips
@ 2018-01-11 12:23     ` Mark Brown
  -1 siblings, 0 replies; 52+ messages in thread
From: Mark Brown @ 2018-01-11 12:23 UTC (permalink / raw)
  To: Kim Phillips
  Cc: Mathieu Poirier, acme, peterz, mingo, alexander.shishkin,
	namhyung, adrian.hunter, mike.leach, suzuki.poulosi, tor, jolsa,
	linux-kernel, linux-arm-kernel

[-- Attachment #1: Type: text/plain, Size: 2558 bytes --]

On Wed, Jan 10, 2018 at 06:08:21PM -0600, Kim Phillips wrote:
> Mathieu Poirier <mathieu.poirier@linaro.org> wrote:

> > Instructions on how to build and install the openCSD library are provided
> > in the HOWTO.md of the project repository.  

> Usually when a perf builder sees something they need "on," they - or,
> at least I - start querying the host's package manager for something
> that provides it (e.g., apt search/install libopencsd), but since no
> distro provides libopencsd, this is bad because it misleads the user.

It's on the radar to push this at distros fairly soon.  Part of the
discussion was wanting to get things to the point where the tools using
the library were far enough along that we could be reasonably sure that
there weren't any problems that were going to require ABI breaks to fix
before pushing the library at distros since ABI churn isn't nice for
packagers to deal with.  There's also a bit of a chicken and egg problem
in that it's a lot easier to get distros to package libraries that have
users available (some are not really bothered about this of course but
it still helps).  

> Keeping the library external will also inevitably introduce more
> source level synchronization problems because the perf sources being
> built may not be compatible with their version of the library, whether
> due to new features like new trace hardware support, or API changes.

Perf users installing from source rather than from a package (who do
tend to the more technical side even for kernel developers) already have
to cope with potentially installing at least dwarf, gtk2, libaudit,
libbfd, libelf, libnuma, libperl, libpython, libslang, libcrypto,
libunwind, libdw-dwarf-unwind, zlib, lzma, bpf and OpenJDK depending on
which features they want.  I'm not sure that adding one more library is
going to be the end of the world here, especially once the packaging
starts to filter through distros.  Until that happens at least people
are no worse off for not having the feature.

> As Mark Brown (cc'd) mentioned on the Coresight mailing list, this may
> be able to be done the same way the dtc is incorporated into the
> kernel, where only its relevant sources are included and updated as
> needed:  see linux/scripts/dtc/update-dtc-source.sh.

Bear in mind that we need dtc for essentially all kernel development on
ARM and when it was introduced it was a new requirement for existing
systems, it's a bit of a different case here where it's an optional
feature in an optional tool.

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 52+ messages in thread

* [PATCH 00/10] perf tools: Add support for CoreSight trace decoding
@ 2018-01-11 12:23     ` Mark Brown
  0 siblings, 0 replies; 52+ messages in thread
From: Mark Brown @ 2018-01-11 12:23 UTC (permalink / raw)
  To: linux-arm-kernel

On Wed, Jan 10, 2018 at 06:08:21PM -0600, Kim Phillips wrote:
> Mathieu Poirier <mathieu.poirier@linaro.org> wrote:

> > Instructions on how to build and install the openCSD library are provided
> > in the HOWTO.md of the project repository.  

> Usually when a perf builder sees something they need "on," they - or,
> at least I - start querying the host's package manager for something
> that provides it (e.g., apt search/install libopencsd), but since no
> distro provides libopencsd, this is bad because it misleads the user.

It's on the radar to push this at distros fairly soon.  Part of the
discussion was wanting to get things to the point where the tools using
the library were far enough along that we could be reasonably sure that
there weren't any problems that were going to require ABI breaks to fix
before pushing the library at distros since ABI churn isn't nice for
packagers to deal with.  There's also a bit of a chicken and egg problem
in that it's a lot easier to get distros to package libraries that have
users available (some are not really bothered about this of course but
it still helps).  

> Keeping the library external will also inevitably introduce more
> source level synchronization problems because the perf sources being
> built may not be compatible with their version of the library, whether
> due to new features like new trace hardware support, or API changes.

Perf users installing from source rather than from a package (who do
tend to the more technical side even for kernel developers) already have
to cope with potentially installing at least dwarf, gtk2, libaudit,
libbfd, libelf, libnuma, libperl, libpython, libslang, libcrypto,
libunwind, libdw-dwarf-unwind, zlib, lzma, bpf and OpenJDK depending on
which features they want.  I'm not sure that adding one more library is
going to be the end of the world here, especially once the packaging
starts to filter through distros.  Until that happens at least people
are no worse off for not having the feature.

> As Mark Brown (cc'd) mentioned on the Coresight mailing list, this may
> be able to be done the same way the dtc is incorporated into the
> kernel, where only its relevant sources are included and updated as
> needed:  see linux/scripts/dtc/update-dtc-source.sh.

Bear in mind that we need dtc for essentially all kernel development on
ARM and when it was introduced it was a new requirement for existing
systems, it's a bit of a different case here where it's an optional
feature in an optional tool.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20180111/20414ad4/attachment.sig>

^ permalink raw reply	[flat|nested] 52+ messages in thread

* Re: [PATCH 00/10] perf tools: Add support for CoreSight trace decoding
  2018-01-11 12:23     ` Mark Brown
@ 2018-01-11 15:45       ` Mathieu Poirier
  -1 siblings, 0 replies; 52+ messages in thread
From: Mathieu Poirier @ 2018-01-11 15:45 UTC (permalink / raw)
  To: Mark Brown
  Cc: Kim Phillips, Arnaldo Carvalho de Melo, Peter Zijlstra,
	Ingo Molnar, Alexander Shishkin, namhyung, Adrian Hunter,
	Mike Leach, suzuki.poulosi, Jeremiassen, Tor, Jiri Olsa,
	linux-kernel, linux-arm-kernel

On 11 January 2018 at 05:23, Mark Brown <broonie@kernel.org> wrote:
> On Wed, Jan 10, 2018 at 06:08:21PM -0600, Kim Phillips wrote:
>> Mathieu Poirier <mathieu.poirier@linaro.org> wrote:
>
>> > Instructions on how to build and install the openCSD library are provided
>> > in the HOWTO.md of the project repository.
>
>> Usually when a perf builder sees something they need "on," they - or,
>> at least I - start querying the host's package manager for something
>> that provides it (e.g., apt search/install libopencsd), but since no
>> distro provides libopencsd, this is bad because it misleads the user.
>
> It's on the radar to push this at distros fairly soon.  Part of the
> discussion was wanting to get things to the point where the tools using
> the library were far enough along that we could be reasonably sure that
> there weren't any problems that were going to require ABI breaks to fix
> before pushing the library at distros since ABI churn isn't nice for
> packagers to deal with.  There's also a bit of a chicken and egg problem
> in that it's a lot easier to get distros to package libraries that have
> users available (some are not really bothered about this of course but
> it still helps).

Moreover including in the kernel tree every library that can
potentially be used by the perf tools simply doesn't scale.  The perf
tools project has come up with a very cleaver way to deal with
external dependencies and I don't see why the OpenCSD library should
be different.

>
>> Keeping the library external will also inevitably introduce more
>> source level synchronization problems because the perf sources being
>> built may not be compatible with their version of the library, whether
>> due to new features like new trace hardware support, or API changes.
>
> Perf users installing from source rather than from a package (who do
> tend to the more technical side even for kernel developers) already have
> to cope with potentially installing at least dwarf, gtk2, libaudit,
> libbfd, libelf, libnuma, libperl, libpython, libslang, libcrypto,
> libunwind, libdw-dwarf-unwind, zlib, lzma, bpf and OpenJDK depending on
> which features they want.  I'm not sure that adding one more library is
> going to be the end of the world here, especially once the packaging
> starts to filter through distros.  Until that happens at least people
> are no worse off for not having the feature.

I completely agree.  Just like any other package, people that want the
very latest code need to install from source.

>
>> As Mark Brown (cc'd) mentioned on the Coresight mailing list, this may
>> be able to be done the same way the dtc is incorporated into the
>> kernel, where only its relevant sources are included and updated as
>> needed:  see linux/scripts/dtc/update-dtc-source.sh.
>
> Bear in mind that we need dtc for essentially all kernel development on
> ARM and when it was introduced it was a new requirement for existing
> systems, it's a bit of a different case here where it's an optional
> feature in an optional tool.

^ permalink raw reply	[flat|nested] 52+ messages in thread

* [PATCH 00/10] perf tools: Add support for CoreSight trace decoding
@ 2018-01-11 15:45       ` Mathieu Poirier
  0 siblings, 0 replies; 52+ messages in thread
From: Mathieu Poirier @ 2018-01-11 15:45 UTC (permalink / raw)
  To: linux-arm-kernel

On 11 January 2018 at 05:23, Mark Brown <broonie@kernel.org> wrote:
> On Wed, Jan 10, 2018 at 06:08:21PM -0600, Kim Phillips wrote:
>> Mathieu Poirier <mathieu.poirier@linaro.org> wrote:
>
>> > Instructions on how to build and install the openCSD library are provided
>> > in the HOWTO.md of the project repository.
>
>> Usually when a perf builder sees something they need "on," they - or,
>> at least I - start querying the host's package manager for something
>> that provides it (e.g., apt search/install libopencsd), but since no
>> distro provides libopencsd, this is bad because it misleads the user.
>
> It's on the radar to push this at distros fairly soon.  Part of the
> discussion was wanting to get things to the point where the tools using
> the library were far enough along that we could be reasonably sure that
> there weren't any problems that were going to require ABI breaks to fix
> before pushing the library at distros since ABI churn isn't nice for
> packagers to deal with.  There's also a bit of a chicken and egg problem
> in that it's a lot easier to get distros to package libraries that have
> users available (some are not really bothered about this of course but
> it still helps).

Moreover including in the kernel tree every library that can
potentially be used by the perf tools simply doesn't scale.  The perf
tools project has come up with a very cleaver way to deal with
external dependencies and I don't see why the OpenCSD library should
be different.

>
>> Keeping the library external will also inevitably introduce more
>> source level synchronization problems because the perf sources being
>> built may not be compatible with their version of the library, whether
>> due to new features like new trace hardware support, or API changes.
>
> Perf users installing from source rather than from a package (who do
> tend to the more technical side even for kernel developers) already have
> to cope with potentially installing at least dwarf, gtk2, libaudit,
> libbfd, libelf, libnuma, libperl, libpython, libslang, libcrypto,
> libunwind, libdw-dwarf-unwind, zlib, lzma, bpf and OpenJDK depending on
> which features they want.  I'm not sure that adding one more library is
> going to be the end of the world here, especially once the packaging
> starts to filter through distros.  Until that happens at least people
> are no worse off for not having the feature.

I completely agree.  Just like any other package, people that want the
very latest code need to install from source.

>
>> As Mark Brown (cc'd) mentioned on the Coresight mailing list, this may
>> be able to be done the same way the dtc is incorporated into the
>> kernel, where only its relevant sources are included and updated as
>> needed:  see linux/scripts/dtc/update-dtc-source.sh.
>
> Bear in mind that we need dtc for essentially all kernel development on
> ARM and when it was introduced it was a new requirement for existing
> systems, it's a bit of a different case here where it's an optional
> feature in an optional tool.

^ permalink raw reply	[flat|nested] 52+ messages in thread

* Re: [PATCH 00/10] perf tools: Add support for CoreSight trace decoding
  2018-01-11 15:45       ` Mathieu Poirier
@ 2018-01-11 17:28         ` Kim Phillips
  -1 siblings, 0 replies; 52+ messages in thread
From: Kim Phillips @ 2018-01-11 17:28 UTC (permalink / raw)
  To: Mathieu Poirier
  Cc: Mark Brown, Arnaldo Carvalho de Melo, Peter Zijlstra,
	Ingo Molnar, Alexander Shishkin, namhyung, Adrian Hunter,
	Mike Leach, suzuki.poulosi, Jeremiassen, Tor, Jiri Olsa,
	linux-kernel, linux-arm-kernel

On Thu, 11 Jan 2018 08:45:21 -0700
Mathieu Poirier <mathieu.poirier@linaro.org> wrote:

> On 11 January 2018 at 05:23, Mark Brown <broonie@kernel.org> wrote:
> > On Wed, Jan 10, 2018 at 06:08:21PM -0600, Kim Phillips wrote:
> >> Mathieu Poirier <mathieu.poirier@linaro.org> wrote:
> >
> >> > Instructions on how to build and install the openCSD library are provided
> >> > in the HOWTO.md of the project repository.
> >
> >> Usually when a perf builder sees something they need "on," they - or,
> >> at least I - start querying the host's package manager for something
> >> that provides it (e.g., apt search/install libopencsd), but since no
> >> distro provides libopencsd, this is bad because it misleads the user.
> >
> > It's on the radar to push this at distros fairly soon.

Adding packages to distros takes years, this patchset is being
submitted for inclusion *now*.  So until then, it would greatly
facilitate users if the relevant libopencsd source files were
self-contained within perf from the get go.

> >  Part of the
> > discussion was wanting to get things to the point where the tools using
> > the library were far enough along that we could be reasonably sure that

Curious, what other tools are there?

> > there weren't any problems that were going to require ABI breaks to fix
> > before pushing the library at distros since ABI churn isn't nice for
> > packagers to deal with.  

Why make perf the guinea pig?  Whatever, this doesn't preclude
adding the code into the tree; it can be removed years from now when
libopencsd becomes ubiquitous among distros.

> > There's also a bit of a chicken and egg problem
> > in that it's a lot easier to get distros to package libraries that have
> > users available (some are not really bothered about this of course but
> > it still helps).
> 
> Moreover including in the kernel tree every library that can
> potentially be used by the perf tools simply doesn't scale.

This is a trace decoder library we're talking about:  there are no
others in perf's system features autodetection list.  And why wouldn't
adding such libraries scale?

>  The perf
> tools project has come up with a very cleaver way to deal with
> external dependencies and I don't see why the OpenCSD library should
> be different.

Again, the opencsd library is a decoder library:  this patchseries adds
it as a package dependency (when it isn't even a package in any
distro), and it's different in that it's the first decoder library to
be submitted as an external dependency (i.e., not fully built-in, like
Intel's, or even the Arm SPE's pending submission).

> >> Keeping the library external will also inevitably introduce more
> >> source level synchronization problems because the perf sources being
> >> built may not be compatible with their version of the library, whether
> >> due to new features like new trace hardware support, or API changes.
> >
> > Perf users installing from source rather than from a package (who do
> > tend to the more technical side even for kernel developers) already have
> > to cope with potentially installing at least dwarf, gtk2, libaudit,
> > libbfd, libelf, libnuma, libperl, libpython, libslang, libcrypto,
> > libunwind, libdw-dwarf-unwind, zlib, lzma, bpf and OpenJDK depending on
> > which features they want.  I'm not sure that adding one more library is
> > going to be the end of the world here, especially once the packaging
> > starts to filter through distros.  Until that happens at least people
> > are no worse off for not having the feature.
> 
> I completely agree.  Just like any other package, people that want the
> very latest code need to install from source.

A fully-integrated solution would work better for people, e.g., how are
people supposed to know what 'latest' is when there are separate,
unsynchronized git repos?

> >> As Mark Brown (cc'd) mentioned on the Coresight mailing list, this may
> >> be able to be done the same way the dtc is incorporated into the
> >> kernel, where only its relevant sources are included and updated as
> >> needed:  see linux/scripts/dtc/update-dtc-source.sh.
> >
> > Bear in mind that we need dtc for essentially all kernel development on
> > ARM and when it was introduced it was a new requirement for existing
> > systems, it's a bit of a different case here where it's an optional
> > feature in an optional tool.

That argument applies to Intel-PT, yet its decoder is self-contained
within perf: all non-x86 perf binaries are capable of decoding PT.
We'd want that for Arm Coresight where perf gets statically built to
run on much more constrained systems like Android.

Or are you referring to the higher level linux/scripts/ location of the
dtc?  That's not my point: the libopencsd sources can live under
somewhere like linux/tools/.

Kim

^ permalink raw reply	[flat|nested] 52+ messages in thread

* [PATCH 00/10] perf tools: Add support for CoreSight trace decoding
@ 2018-01-11 17:28         ` Kim Phillips
  0 siblings, 0 replies; 52+ messages in thread
From: Kim Phillips @ 2018-01-11 17:28 UTC (permalink / raw)
  To: linux-arm-kernel

On Thu, 11 Jan 2018 08:45:21 -0700
Mathieu Poirier <mathieu.poirier@linaro.org> wrote:

> On 11 January 2018 at 05:23, Mark Brown <broonie@kernel.org> wrote:
> > On Wed, Jan 10, 2018 at 06:08:21PM -0600, Kim Phillips wrote:
> >> Mathieu Poirier <mathieu.poirier@linaro.org> wrote:
> >
> >> > Instructions on how to build and install the openCSD library are provided
> >> > in the HOWTO.md of the project repository.
> >
> >> Usually when a perf builder sees something they need "on," they - or,
> >> at least I - start querying the host's package manager for something
> >> that provides it (e.g., apt search/install libopencsd), but since no
> >> distro provides libopencsd, this is bad because it misleads the user.
> >
> > It's on the radar to push this at distros fairly soon.

Adding packages to distros takes years, this patchset is being
submitted for inclusion *now*.  So until then, it would greatly
facilitate users if the relevant libopencsd source files were
self-contained within perf from the get go.

> >  Part of the
> > discussion was wanting to get things to the point where the tools using
> > the library were far enough along that we could be reasonably sure that

Curious, what other tools are there?

> > there weren't any problems that were going to require ABI breaks to fix
> > before pushing the library at distros since ABI churn isn't nice for
> > packagers to deal with.  

Why make perf the guinea pig?  Whatever, this doesn't preclude
adding the code into the tree; it can be removed years from now when
libopencsd becomes ubiquitous among distros.

> > There's also a bit of a chicken and egg problem
> > in that it's a lot easier to get distros to package libraries that have
> > users available (some are not really bothered about this of course but
> > it still helps).
> 
> Moreover including in the kernel tree every library that can
> potentially be used by the perf tools simply doesn't scale.

This is a trace decoder library we're talking about:  there are no
others in perf's system features autodetection list.  And why wouldn't
adding such libraries scale?

>  The perf
> tools project has come up with a very cleaver way to deal with
> external dependencies and I don't see why the OpenCSD library should
> be different.

Again, the opencsd library is a decoder library:  this patchseries adds
it as a package dependency (when it isn't even a package in any
distro), and it's different in that it's the first decoder library to
be submitted as an external dependency (i.e., not fully built-in, like
Intel's, or even the Arm SPE's pending submission).

> >> Keeping the library external will also inevitably introduce more
> >> source level synchronization problems because the perf sources being
> >> built may not be compatible with their version of the library, whether
> >> due to new features like new trace hardware support, or API changes.
> >
> > Perf users installing from source rather than from a package (who do
> > tend to the more technical side even for kernel developers) already have
> > to cope with potentially installing at least dwarf, gtk2, libaudit,
> > libbfd, libelf, libnuma, libperl, libpython, libslang, libcrypto,
> > libunwind, libdw-dwarf-unwind, zlib, lzma, bpf and OpenJDK depending on
> > which features they want.  I'm not sure that adding one more library is
> > going to be the end of the world here, especially once the packaging
> > starts to filter through distros.  Until that happens at least people
> > are no worse off for not having the feature.
> 
> I completely agree.  Just like any other package, people that want the
> very latest code need to install from source.

A fully-integrated solution would work better for people, e.g., how are
people supposed to know what 'latest' is when there are separate,
unsynchronized git repos?

> >> As Mark Brown (cc'd) mentioned on the Coresight mailing list, this may
> >> be able to be done the same way the dtc is incorporated into the
> >> kernel, where only its relevant sources are included and updated as
> >> needed:  see linux/scripts/dtc/update-dtc-source.sh.
> >
> > Bear in mind that we need dtc for essentially all kernel development on
> > ARM and when it was introduced it was a new requirement for existing
> > systems, it's a bit of a different case here where it's an optional
> > feature in an optional tool.

That argument applies to Intel-PT, yet its decoder is self-contained
within perf: all non-x86 perf binaries are capable of decoding PT.
We'd want that for Arm Coresight where perf gets statically built to
run on much more constrained systems like Android.

Or are you referring to the higher level linux/scripts/ location of the
dtc?  That's not my point: the libopencsd sources can live under
somewhere like linux/tools/.

Kim

^ permalink raw reply	[flat|nested] 52+ messages in thread

* Re: [PATCH 00/10] perf tools: Add support for CoreSight trace decoding
  2018-01-11 17:28         ` Kim Phillips
@ 2018-01-11 21:11           ` Mathieu Poirier
  -1 siblings, 0 replies; 52+ messages in thread
From: Mathieu Poirier @ 2018-01-11 21:11 UTC (permalink / raw)
  To: Kim Phillips
  Cc: Mark Brown, Arnaldo Carvalho de Melo, Peter Zijlstra,
	Ingo Molnar, Alexander Shishkin, namhyung, Adrian Hunter,
	Mike Leach, suzuki.poulosi, Jeremiassen, Tor, Jiri Olsa,
	linux-kernel, linux-arm-kernel

On 11 January 2018 at 10:28, Kim Phillips <kim.phillips@arm.com> wrote:
> On Thu, 11 Jan 2018 08:45:21 -0700
> Mathieu Poirier <mathieu.poirier@linaro.org> wrote:
>
>> On 11 January 2018 at 05:23, Mark Brown <broonie@kernel.org> wrote:
>> > On Wed, Jan 10, 2018 at 06:08:21PM -0600, Kim Phillips wrote:
>> >> Mathieu Poirier <mathieu.poirier@linaro.org> wrote:
>> >
>> >> > Instructions on how to build and install the openCSD library are provided
>> >> > in the HOWTO.md of the project repository.
>> >
>> >> Usually when a perf builder sees something they need "on," they - or,
>> >> at least I - start querying the host's package manager for something
>> >> that provides it (e.g., apt search/install libopencsd), but since no
>> >> distro provides libopencsd, this is bad because it misleads the user.
>> >
>> > It's on the radar to push this at distros fairly soon.
>
> Adding packages to distros takes years, this patchset is being
> submitted for inclusion *now*.  So until then, it would greatly
> facilitate users if the relevant libopencsd source files were
> self-contained within perf from the get go.

I do not agree with you on the front that it takes years.  On the flip
side it would take a significant amount of time and effort to refactor
the openCSD library so that it can be added to the kernel tree.  This
patchset is available now with a solution that follows what has
already been done for dozens of other external library.  There is no
point in delaying the inclusion of the functionality when an
end-to-end solution exists.

>
>> >  Part of the
>> > discussion was wanting to get things to the point where the tools using
>> > the library were far enough along that we could be reasonably sure that
>
> Curious, what other tools are there?

Ask around at ARM.

>
>> > there weren't any problems that were going to require ABI breaks to fix
>> > before pushing the library at distros since ABI churn isn't nice for
>> > packagers to deal with.
>
> Why make perf the guinea pig?  Whatever, this doesn't preclude
> adding the code into the tree; it can be removed years from now when
> libopencsd becomes ubiquitous among distros.

The same can be said about proceeding the other way around - the
openCSD library can be added to the kernel tree later if it is deemed
necessary.  Until then I really don't see why we'd prevent people from
accessing the functionality.

>
>> > There's also a bit of a chicken and egg problem
>> > in that it's a lot easier to get distros to package libraries that have
>> > users available (some are not really bothered about this of course but
>> > it still helps).
>>
>> Moreover including in the kernel tree every library that can
>> potentially be used by the perf tools simply doesn't scale.
>
> This is a trace decoder library we're talking about:  there are no
> others in perf's system features autodetection list.  And why wouldn't
> adding such libraries scale?

I don't see why a decoder library and say, libelf, need to be treated
differently.

>
>>  The perf
>> tools project has come up with a very cleaver way to deal with
>> external dependencies and I don't see why the OpenCSD library should
>> be different.
>
> Again, the opencsd library is a decoder library:  this patchseries adds
> it as a package dependency (when it isn't even a package in any
> distro), and it's different in that it's the first decoder library to
> be submitted as an external dependency (i.e., not fully built-in, like
> Intel's, or even the Arm SPE's pending submission).

I don't see why we absolutely need to do exactly the same as Intel.
The library is public and this patchset neatly integrates it with the
perf tools.

>
>> >> Keeping the library external will also inevitably introduce more
>> >> source level synchronization problems because the perf sources being
>> >> built may not be compatible with their version of the library, whether
>> >> due to new features like new trace hardware support, or API changes.
>> >
>> > Perf users installing from source rather than from a package (who do
>> > tend to the more technical side even for kernel developers) already have
>> > to cope with potentially installing at least dwarf, gtk2, libaudit,
>> > libbfd, libelf, libnuma, libperl, libpython, libslang, libcrypto,
>> > libunwind, libdw-dwarf-unwind, zlib, lzma, bpf and OpenJDK depending on
>> > which features they want.  I'm not sure that adding one more library is
>> > going to be the end of the world here, especially once the packaging
>> > starts to filter through distros.  Until that happens at least people
>> > are no worse off for not having the feature.
>>
>> I completely agree.  Just like any other package, people that want the
>> very latest code need to install from source.
>
> A fully-integrated solution would work better for people, e.g., how are
> people supposed to know what 'latest' is when there are separate,
> unsynchronized git repos?

The same applies to any of the other libraries perf is working with.

>
>> >> As Mark Brown (cc'd) mentioned on the Coresight mailing list, this may
>> >> be able to be done the same way the dtc is incorporated into the
>> >> kernel, where only its relevant sources are included and updated as
>> >> needed:  see linux/scripts/dtc/update-dtc-source.sh.
>> >
>> > Bear in mind that we need dtc for essentially all kernel development on
>> > ARM and when it was introduced it was a new requirement for existing
>> > systems, it's a bit of a different case here where it's an optional
>> > feature in an optional tool.
>
> That argument applies to Intel-PT, yet its decoder is self-contained
> within perf: all non-x86 perf binaries are capable of decoding PT.
> We'd want that for Arm Coresight where perf gets statically built to
> run on much more constrained systems like Android.

Traces can't be decoded properly without the support of external
libraries, whether we are talking about PT or CS.

>
> Or are you referring to the higher level linux/scripts/ location of the
> dtc?  That's not my point: the libopencsd sources can live under
> somewhere like linux/tools/.
>
> Kim

^ permalink raw reply	[flat|nested] 52+ messages in thread

* [PATCH 00/10] perf tools: Add support for CoreSight trace decoding
@ 2018-01-11 21:11           ` Mathieu Poirier
  0 siblings, 0 replies; 52+ messages in thread
From: Mathieu Poirier @ 2018-01-11 21:11 UTC (permalink / raw)
  To: linux-arm-kernel

On 11 January 2018 at 10:28, Kim Phillips <kim.phillips@arm.com> wrote:
> On Thu, 11 Jan 2018 08:45:21 -0700
> Mathieu Poirier <mathieu.poirier@linaro.org> wrote:
>
>> On 11 January 2018 at 05:23, Mark Brown <broonie@kernel.org> wrote:
>> > On Wed, Jan 10, 2018 at 06:08:21PM -0600, Kim Phillips wrote:
>> >> Mathieu Poirier <mathieu.poirier@linaro.org> wrote:
>> >
>> >> > Instructions on how to build and install the openCSD library are provided
>> >> > in the HOWTO.md of the project repository.
>> >
>> >> Usually when a perf builder sees something they need "on," they - or,
>> >> at least I - start querying the host's package manager for something
>> >> that provides it (e.g., apt search/install libopencsd), but since no
>> >> distro provides libopencsd, this is bad because it misleads the user.
>> >
>> > It's on the radar to push this at distros fairly soon.
>
> Adding packages to distros takes years, this patchset is being
> submitted for inclusion *now*.  So until then, it would greatly
> facilitate users if the relevant libopencsd source files were
> self-contained within perf from the get go.

I do not agree with you on the front that it takes years.  On the flip
side it would take a significant amount of time and effort to refactor
the openCSD library so that it can be added to the kernel tree.  This
patchset is available now with a solution that follows what has
already been done for dozens of other external library.  There is no
point in delaying the inclusion of the functionality when an
end-to-end solution exists.

>
>> >  Part of the
>> > discussion was wanting to get things to the point where the tools using
>> > the library were far enough along that we could be reasonably sure that
>
> Curious, what other tools are there?

Ask around at ARM.

>
>> > there weren't any problems that were going to require ABI breaks to fix
>> > before pushing the library at distros since ABI churn isn't nice for
>> > packagers to deal with.
>
> Why make perf the guinea pig?  Whatever, this doesn't preclude
> adding the code into the tree; it can be removed years from now when
> libopencsd becomes ubiquitous among distros.

The same can be said about proceeding the other way around - the
openCSD library can be added to the kernel tree later if it is deemed
necessary.  Until then I really don't see why we'd prevent people from
accessing the functionality.

>
>> > There's also a bit of a chicken and egg problem
>> > in that it's a lot easier to get distros to package libraries that have
>> > users available (some are not really bothered about this of course but
>> > it still helps).
>>
>> Moreover including in the kernel tree every library that can
>> potentially be used by the perf tools simply doesn't scale.
>
> This is a trace decoder library we're talking about:  there are no
> others in perf's system features autodetection list.  And why wouldn't
> adding such libraries scale?

I don't see why a decoder library and say, libelf, need to be treated
differently.

>
>>  The perf
>> tools project has come up with a very cleaver way to deal with
>> external dependencies and I don't see why the OpenCSD library should
>> be different.
>
> Again, the opencsd library is a decoder library:  this patchseries adds
> it as a package dependency (when it isn't even a package in any
> distro), and it's different in that it's the first decoder library to
> be submitted as an external dependency (i.e., not fully built-in, like
> Intel's, or even the Arm SPE's pending submission).

I don't see why we absolutely need to do exactly the same as Intel.
The library is public and this patchset neatly integrates it with the
perf tools.

>
>> >> Keeping the library external will also inevitably introduce more
>> >> source level synchronization problems because the perf sources being
>> >> built may not be compatible with their version of the library, whether
>> >> due to new features like new trace hardware support, or API changes.
>> >
>> > Perf users installing from source rather than from a package (who do
>> > tend to the more technical side even for kernel developers) already have
>> > to cope with potentially installing at least dwarf, gtk2, libaudit,
>> > libbfd, libelf, libnuma, libperl, libpython, libslang, libcrypto,
>> > libunwind, libdw-dwarf-unwind, zlib, lzma, bpf and OpenJDK depending on
>> > which features they want.  I'm not sure that adding one more library is
>> > going to be the end of the world here, especially once the packaging
>> > starts to filter through distros.  Until that happens at least people
>> > are no worse off for not having the feature.
>>
>> I completely agree.  Just like any other package, people that want the
>> very latest code need to install from source.
>
> A fully-integrated solution would work better for people, e.g., how are
> people supposed to know what 'latest' is when there are separate,
> unsynchronized git repos?

The same applies to any of the other libraries perf is working with.

>
>> >> As Mark Brown (cc'd) mentioned on the Coresight mailing list, this may
>> >> be able to be done the same way the dtc is incorporated into the
>> >> kernel, where only its relevant sources are included and updated as
>> >> needed:  see linux/scripts/dtc/update-dtc-source.sh.
>> >
>> > Bear in mind that we need dtc for essentially all kernel development on
>> > ARM and when it was introduced it was a new requirement for existing
>> > systems, it's a bit of a different case here where it's an optional
>> > feature in an optional tool.
>
> That argument applies to Intel-PT, yet its decoder is self-contained
> within perf: all non-x86 perf binaries are capable of decoding PT.
> We'd want that for Arm Coresight where perf gets statically built to
> run on much more constrained systems like Android.

Traces can't be decoded properly without the support of external
libraries, whether we are talking about PT or CS.

>
> Or are you referring to the higher level linux/scripts/ location of the
> dtc?  That's not my point: the libopencsd sources can live under
> somewhere like linux/tools/.
>
> Kim

^ permalink raw reply	[flat|nested] 52+ messages in thread

* Re: [PATCH 00/10] perf tools: Add support for CoreSight trace decoding
  2018-01-11 21:11           ` Mathieu Poirier
@ 2018-01-11 21:49             ` Kim Phillips
  -1 siblings, 0 replies; 52+ messages in thread
From: Kim Phillips @ 2018-01-11 21:49 UTC (permalink / raw)
  To: Mathieu Poirier
  Cc: Mark Brown, Arnaldo Carvalho de Melo, Peter Zijlstra,
	Ingo Molnar, Alexander Shishkin, namhyung, Adrian Hunter,
	Mike Leach, suzuki.poulosi, Jeremiassen, Tor, Jiri Olsa,
	linux-kernel, linux-arm-kernel

On Thu, 11 Jan 2018 14:11:00 -0700
Mathieu Poirier <mathieu.poirier@linaro.org> wrote:

> On 11 January 2018 at 10:28, Kim Phillips <kim.phillips@arm.com> wrote:
> > On Thu, 11 Jan 2018 08:45:21 -0700
> > Mathieu Poirier <mathieu.poirier@linaro.org> wrote:
> >
> >> On 11 January 2018 at 05:23, Mark Brown <broonie@kernel.org> wrote:
> >> > On Wed, Jan 10, 2018 at 06:08:21PM -0600, Kim Phillips wrote:
> >> >> Mathieu Poirier <mathieu.poirier@linaro.org> wrote:
> >> >
> >> >> > Instructions on how to build and install the openCSD library are provided
> >> >> > in the HOWTO.md of the project repository.
> >> >
> >> >> Usually when a perf builder sees something they need "on," they - or,
> >> >> at least I - start querying the host's package manager for something
> >> >> that provides it (e.g., apt search/install libopencsd), but since no
> >> >> distro provides libopencsd, this is bad because it misleads the user.
> >> >
> >> > It's on the radar to push this at distros fairly soon.
> >
> > Adding packages to distros takes years, this patchset is being
> > submitted for inclusion *now*.  So until then, it would greatly
> > facilitate users if the relevant libopencsd source files were
> > self-contained within perf from the get go.
> 
> I do not agree with you on the front that it takes years.  On the flip
> side it would take a significant amount of time and effort to refactor
> the openCSD library so that it can be added to the kernel tree.  This

The dtc wasn't refactored before it was added to the kernel tree.

> patchset is available now with a solution that follows what has
> already been done for dozens of other external library.  There is no
> point in delaying the inclusion of the functionality when an
> end-to-end solution exists.

See above: I'm not necessarily suggesting the code get refactored.

> >> >  Part of the
> >> > discussion was wanting to get things to the point where the tools using
> >> > the library were far enough along that we could be reasonably sure that
> >
> > Curious, what other tools are there?
> 
> Ask around at ARM.

I'm asking the person that claimed it.

> >> > there weren't any problems that were going to require ABI breaks to fix
> >> > before pushing the library at distros since ABI churn isn't nice for
> >> > packagers to deal with.
> >
> > Why make perf the guinea pig?  Whatever, this doesn't preclude
> > adding the code into the tree; it can be removed years from now when
> > libopencsd becomes ubiquitous among distros.
> 
> The same can be said about proceeding the other way around - the
> openCSD library can be added to the kernel tree later if it is deemed
> necessary.  Until then I really don't see why we'd prevent people from
> accessing the functionality.

Again, I'm not suggesting the code be refactored...

> >> > There's also a bit of a chicken and egg problem
> >> > in that it's a lot easier to get distros to package libraries that have
> >> > users available (some are not really bothered about this of course but
> >> > it still helps).
> >>
> >> Moreover including in the kernel tree every library that can
> >> potentially be used by the perf tools simply doesn't scale.
> >
> > This is a trace decoder library we're talking about:  there are no
> > others in perf's system features autodetection list.  And why wouldn't
> > adding such libraries scale?
> 
> I don't see why a decoder library and say, libelf, need to be treated
> differently.

libelf is a mature library based on an industry-wide standard, not to
mention already packaged by most (all?) distros.

> >>  The perf
> >> tools project has come up with a very cleaver way to deal with
> >> external dependencies and I don't see why the OpenCSD library should
> >> be different.
> >
> > Again, the opencsd library is a decoder library:  this patchseries adds
> > it as a package dependency (when it isn't even a package in any
> > distro), and it's different in that it's the first decoder library to
> > be submitted as an external dependency (i.e., not fully built-in, like
> > Intel's, or even the Arm SPE's pending submission).
> 
> I don't see why we absolutely need to do exactly the same as Intel.
> The library is public and this patchset neatly integrates it with the
> perf tools.

We don't, but it'd be more efficient, upstream-acceptance-wise, but as
you brought up above, we wouldn't be able to since we'd have to rewrite
libopencsd to conform to upstream codingstyle, etc., so I'm suggesting
we might look at a better enablement strategy like how the dtc works.

It'd be nice if the upstream maintainers would comment on what would be
acceptable instead of us going back and forth between each other.

> >> >> Keeping the library external will also inevitably introduce more
> >> >> source level synchronization problems because the perf sources being
> >> >> built may not be compatible with their version of the library, whether
> >> >> due to new features like new trace hardware support, or API changes.
> >> >
> >> > Perf users installing from source rather than from a package (who do
> >> > tend to the more technical side even for kernel developers) already have
> >> > to cope with potentially installing at least dwarf, gtk2, libaudit,
> >> > libbfd, libelf, libnuma, libperl, libpython, libslang, libcrypto,
> >> > libunwind, libdw-dwarf-unwind, zlib, lzma, bpf and OpenJDK depending on
> >> > which features they want.  I'm not sure that adding one more library is
> >> > going to be the end of the world here, especially once the packaging
> >> > starts to filter through distros.  Until that happens at least people
> >> > are no worse off for not having the feature.
> >>
> >> I completely agree.  Just like any other package, people that want the
> >> very latest code need to install from source.
> >
> > A fully-integrated solution would work better for people, e.g., how are
> > people supposed to know what 'latest' is when there are separate,
> > unsynchronized git repos?
> 
> The same applies to any of the other libraries perf is working with.

The packaged libraries?  They are stable:  they don't come in the form
of cloning a git repo and building from scratch.

The decoder libraries?  They are self-contained within perf.

> >> >> As Mark Brown (cc'd) mentioned on the Coresight mailing list, this may
> >> >> be able to be done the same way the dtc is incorporated into the
> >> >> kernel, where only its relevant sources are included and updated as
> >> >> needed:  see linux/scripts/dtc/update-dtc-source.sh.
> >> >
> >> > Bear in mind that we need dtc for essentially all kernel development on
> >> > ARM and when it was introduced it was a new requirement for existing
> >> > systems, it's a bit of a different case here where it's an optional
> >> > feature in an optional tool.
> >
> > That argument applies to Intel-PT, yet its decoder is self-contained
> > within perf: all non-x86 perf binaries are capable of decoding PT.
> > We'd want that for Arm Coresight where perf gets statically built to
> > run on much more constrained systems like Android.
> 
> Traces can't be decoded properly without the support of external
> libraries, whether we are talking about PT or CS.

Not true; perf has PT decoding self-contained.

Thanks,

Kim

^ permalink raw reply	[flat|nested] 52+ messages in thread

* [PATCH 00/10] perf tools: Add support for CoreSight trace decoding
@ 2018-01-11 21:49             ` Kim Phillips
  0 siblings, 0 replies; 52+ messages in thread
From: Kim Phillips @ 2018-01-11 21:49 UTC (permalink / raw)
  To: linux-arm-kernel

On Thu, 11 Jan 2018 14:11:00 -0700
Mathieu Poirier <mathieu.poirier@linaro.org> wrote:

> On 11 January 2018 at 10:28, Kim Phillips <kim.phillips@arm.com> wrote:
> > On Thu, 11 Jan 2018 08:45:21 -0700
> > Mathieu Poirier <mathieu.poirier@linaro.org> wrote:
> >
> >> On 11 January 2018 at 05:23, Mark Brown <broonie@kernel.org> wrote:
> >> > On Wed, Jan 10, 2018 at 06:08:21PM -0600, Kim Phillips wrote:
> >> >> Mathieu Poirier <mathieu.poirier@linaro.org> wrote:
> >> >
> >> >> > Instructions on how to build and install the openCSD library are provided
> >> >> > in the HOWTO.md of the project repository.
> >> >
> >> >> Usually when a perf builder sees something they need "on," they - or,
> >> >> at least I - start querying the host's package manager for something
> >> >> that provides it (e.g., apt search/install libopencsd), but since no
> >> >> distro provides libopencsd, this is bad because it misleads the user.
> >> >
> >> > It's on the radar to push this at distros fairly soon.
> >
> > Adding packages to distros takes years, this patchset is being
> > submitted for inclusion *now*.  So until then, it would greatly
> > facilitate users if the relevant libopencsd source files were
> > self-contained within perf from the get go.
> 
> I do not agree with you on the front that it takes years.  On the flip
> side it would take a significant amount of time and effort to refactor
> the openCSD library so that it can be added to the kernel tree.  This

The dtc wasn't refactored before it was added to the kernel tree.

> patchset is available now with a solution that follows what has
> already been done for dozens of other external library.  There is no
> point in delaying the inclusion of the functionality when an
> end-to-end solution exists.

See above: I'm not necessarily suggesting the code get refactored.

> >> >  Part of the
> >> > discussion was wanting to get things to the point where the tools using
> >> > the library were far enough along that we could be reasonably sure that
> >
> > Curious, what other tools are there?
> 
> Ask around at ARM.

I'm asking the person that claimed it.

> >> > there weren't any problems that were going to require ABI breaks to fix
> >> > before pushing the library at distros since ABI churn isn't nice for
> >> > packagers to deal with.
> >
> > Why make perf the guinea pig?  Whatever, this doesn't preclude
> > adding the code into the tree; it can be removed years from now when
> > libopencsd becomes ubiquitous among distros.
> 
> The same can be said about proceeding the other way around - the
> openCSD library can be added to the kernel tree later if it is deemed
> necessary.  Until then I really don't see why we'd prevent people from
> accessing the functionality.

Again, I'm not suggesting the code be refactored...

> >> > There's also a bit of a chicken and egg problem
> >> > in that it's a lot easier to get distros to package libraries that have
> >> > users available (some are not really bothered about this of course but
> >> > it still helps).
> >>
> >> Moreover including in the kernel tree every library that can
> >> potentially be used by the perf tools simply doesn't scale.
> >
> > This is a trace decoder library we're talking about:  there are no
> > others in perf's system features autodetection list.  And why wouldn't
> > adding such libraries scale?
> 
> I don't see why a decoder library and say, libelf, need to be treated
> differently.

libelf is a mature library based on an industry-wide standard, not to
mention already packaged by most (all?) distros.

> >>  The perf
> >> tools project has come up with a very cleaver way to deal with
> >> external dependencies and I don't see why the OpenCSD library should
> >> be different.
> >
> > Again, the opencsd library is a decoder library:  this patchseries adds
> > it as a package dependency (when it isn't even a package in any
> > distro), and it's different in that it's the first decoder library to
> > be submitted as an external dependency (i.e., not fully built-in, like
> > Intel's, or even the Arm SPE's pending submission).
> 
> I don't see why we absolutely need to do exactly the same as Intel.
> The library is public and this patchset neatly integrates it with the
> perf tools.

We don't, but it'd be more efficient, upstream-acceptance-wise, but as
you brought up above, we wouldn't be able to since we'd have to rewrite
libopencsd to conform to upstream codingstyle, etc., so I'm suggesting
we might look at a better enablement strategy like how the dtc works.

It'd be nice if the upstream maintainers would comment on what would be
acceptable instead of us going back and forth between each other.

> >> >> Keeping the library external will also inevitably introduce more
> >> >> source level synchronization problems because the perf sources being
> >> >> built may not be compatible with their version of the library, whether
> >> >> due to new features like new trace hardware support, or API changes.
> >> >
> >> > Perf users installing from source rather than from a package (who do
> >> > tend to the more technical side even for kernel developers) already have
> >> > to cope with potentially installing at least dwarf, gtk2, libaudit,
> >> > libbfd, libelf, libnuma, libperl, libpython, libslang, libcrypto,
> >> > libunwind, libdw-dwarf-unwind, zlib, lzma, bpf and OpenJDK depending on
> >> > which features they want.  I'm not sure that adding one more library is
> >> > going to be the end of the world here, especially once the packaging
> >> > starts to filter through distros.  Until that happens at least people
> >> > are no worse off for not having the feature.
> >>
> >> I completely agree.  Just like any other package, people that want the
> >> very latest code need to install from source.
> >
> > A fully-integrated solution would work better for people, e.g., how are
> > people supposed to know what 'latest' is when there are separate,
> > unsynchronized git repos?
> 
> The same applies to any of the other libraries perf is working with.

The packaged libraries?  They are stable:  they don't come in the form
of cloning a git repo and building from scratch.

The decoder libraries?  They are self-contained within perf.

> >> >> As Mark Brown (cc'd) mentioned on the Coresight mailing list, this may
> >> >> be able to be done the same way the dtc is incorporated into the
> >> >> kernel, where only its relevant sources are included and updated as
> >> >> needed:  see linux/scripts/dtc/update-dtc-source.sh.
> >> >
> >> > Bear in mind that we need dtc for essentially all kernel development on
> >> > ARM and when it was introduced it was a new requirement for existing
> >> > systems, it's a bit of a different case here where it's an optional
> >> > feature in an optional tool.
> >
> > That argument applies to Intel-PT, yet its decoder is self-contained
> > within perf: all non-x86 perf binaries are capable of decoding PT.
> > We'd want that for Arm Coresight where perf gets statically built to
> > run on much more constrained systems like Android.
> 
> Traces can't be decoded properly without the support of external
> libraries, whether we are talking about PT or CS.

Not true; perf has PT decoding self-contained.

Thanks,

Kim

^ permalink raw reply	[flat|nested] 52+ messages in thread

* Re: [PATCH 00/10] perf tools: Add support for CoreSight trace decoding
  2018-01-11 21:49             ` Kim Phillips
@ 2018-01-11 22:18               ` Mathieu Poirier
  -1 siblings, 0 replies; 52+ messages in thread
From: Mathieu Poirier @ 2018-01-11 22:18 UTC (permalink / raw)
  To: Kim Phillips
  Cc: Mark Brown, Arnaldo Carvalho de Melo, Peter Zijlstra,
	Ingo Molnar, Alexander Shishkin, namhyung, Adrian Hunter,
	Mike Leach, suzuki.poulosi, Jeremiassen, Tor, Jiri Olsa,
	linux-kernel, linux-arm-kernel

On 11 January 2018 at 14:49, Kim Phillips <kim.phillips@arm.com> wrote:
> On Thu, 11 Jan 2018 14:11:00 -0700
> Mathieu Poirier <mathieu.poirier@linaro.org> wrote:
>
>> On 11 January 2018 at 10:28, Kim Phillips <kim.phillips@arm.com> wrote:
>> > On Thu, 11 Jan 2018 08:45:21 -0700
>> > Mathieu Poirier <mathieu.poirier@linaro.org> wrote:
>> >
>> >> On 11 January 2018 at 05:23, Mark Brown <broonie@kernel.org> wrote:
>> >> > On Wed, Jan 10, 2018 at 06:08:21PM -0600, Kim Phillips wrote:
>> >> >> Mathieu Poirier <mathieu.poirier@linaro.org> wrote:
>> >> >
>> >> >> > Instructions on how to build and install the openCSD library are provided
>> >> >> > in the HOWTO.md of the project repository.
>> >> >
>> >> >> Usually when a perf builder sees something they need "on," they - or,
>> >> >> at least I - start querying the host's package manager for something
>> >> >> that provides it (e.g., apt search/install libopencsd), but since no
>> >> >> distro provides libopencsd, this is bad because it misleads the user.
>> >> >
>> >> > It's on the radar to push this at distros fairly soon.
>> >
>> > Adding packages to distros takes years, this patchset is being
>> > submitted for inclusion *now*.  So until then, it would greatly
>> > facilitate users if the relevant libopencsd source files were
>> > self-contained within perf from the get go.
>>
>> I do not agree with you on the front that it takes years.  On the flip
>> side it would take a significant amount of time and effort to refactor
>> the openCSD library so that it can be added to the kernel tree.  This
>
> The dtc wasn't refactored before it was added to the kernel tree.
>
>> patchset is available now with a solution that follows what has
>> already been done for dozens of other external library.  There is no
>> point in delaying the inclusion of the functionality when an
>> end-to-end solution exists.
>
> See above: I'm not necessarily suggesting the code get refactored.
>
>> >> >  Part of the
>> >> > discussion was wanting to get things to the point where the tools using
>> >> > the library were far enough along that we could be reasonably sure that
>> >
>> > Curious, what other tools are there?
>>
>> Ask around at ARM.
>
> I'm asking the person that claimed it.
>
>> >> > there weren't any problems that were going to require ABI breaks to fix
>> >> > before pushing the library at distros since ABI churn isn't nice for
>> >> > packagers to deal with.
>> >
>> > Why make perf the guinea pig?  Whatever, this doesn't preclude
>> > adding the code into the tree; it can be removed years from now when
>> > libopencsd becomes ubiquitous among distros.
>>
>> The same can be said about proceeding the other way around - the
>> openCSD library can be added to the kernel tree later if it is deemed
>> necessary.  Until then I really don't see why we'd prevent people from
>> accessing the functionality.
>
> Again, I'm not suggesting the code be refactored...
>
>> >> > There's also a bit of a chicken and egg problem
>> >> > in that it's a lot easier to get distros to package libraries that have
>> >> > users available (some are not really bothered about this of course but
>> >> > it still helps).
>> >>
>> >> Moreover including in the kernel tree every library that can
>> >> potentially be used by the perf tools simply doesn't scale.
>> >
>> > This is a trace decoder library we're talking about:  there are no
>> > others in perf's system features autodetection list.  And why wouldn't
>> > adding such libraries scale?
>>
>> I don't see why a decoder library and say, libelf, need to be treated
>> differently.
>
> libelf is a mature library based on an industry-wide standard, not to
> mention already packaged by most (all?) distros.
>
>> >>  The perf
>> >> tools project has come up with a very cleaver way to deal with
>> >> external dependencies and I don't see why the OpenCSD library should
>> >> be different.
>> >
>> > Again, the opencsd library is a decoder library:  this patchseries adds
>> > it as a package dependency (when it isn't even a package in any
>> > distro), and it's different in that it's the first decoder library to
>> > be submitted as an external dependency (i.e., not fully built-in, like
>> > Intel's, or even the Arm SPE's pending submission).
>>
>> I don't see why we absolutely need to do exactly the same as Intel.
>> The library is public and this patchset neatly integrates it with the
>> perf tools.
>
> We don't, but it'd be more efficient, upstream-acceptance-wise, but as
> you brought up above, we wouldn't be able to since we'd have to rewrite
> libopencsd to conform to upstream codingstyle, etc., so I'm suggesting
> we might look at a better enablement strategy like how the dtc works.
>
> It'd be nice if the upstream maintainers would comment on what would be
> acceptable instead of us going back and forth between each other.

Agreed.

>
>> >> >> Keeping the library external will also inevitably introduce more
>> >> >> source level synchronization problems because the perf sources being
>> >> >> built may not be compatible with their version of the library, whether
>> >> >> due to new features like new trace hardware support, or API changes.
>> >> >
>> >> > Perf users installing from source rather than from a package (who do
>> >> > tend to the more technical side even for kernel developers) already have
>> >> > to cope with potentially installing at least dwarf, gtk2, libaudit,
>> >> > libbfd, libelf, libnuma, libperl, libpython, libslang, libcrypto,
>> >> > libunwind, libdw-dwarf-unwind, zlib, lzma, bpf and OpenJDK depending on
>> >> > which features they want.  I'm not sure that adding one more library is
>> >> > going to be the end of the world here, especially once the packaging
>> >> > starts to filter through distros.  Until that happens at least people
>> >> > are no worse off for not having the feature.
>> >>
>> >> I completely agree.  Just like any other package, people that want the
>> >> very latest code need to install from source.
>> >
>> > A fully-integrated solution would work better for people, e.g., how are
>> > people supposed to know what 'latest' is when there are separate,
>> > unsynchronized git repos?
>>
>> The same applies to any of the other libraries perf is working with.
>
> The packaged libraries?  They are stable:  they don't come in the form
> of cloning a git repo and building from scratch.
>
> The decoder libraries?  They are self-contained within perf.
>
>> >> >> As Mark Brown (cc'd) mentioned on the Coresight mailing list, this may
>> >> >> be able to be done the same way the dtc is incorporated into the
>> >> >> kernel, where only its relevant sources are included and updated as
>> >> >> needed:  see linux/scripts/dtc/update-dtc-source.sh.
>> >> >
>> >> > Bear in mind that we need dtc for essentially all kernel development on
>> >> > ARM and when it was introduced it was a new requirement for existing
>> >> > systems, it's a bit of a different case here where it's an optional
>> >> > feature in an optional tool.
>> >
>> > That argument applies to Intel-PT, yet its decoder is self-contained
>> > within perf: all non-x86 perf binaries are capable of decoding PT.
>> > We'd want that for Arm Coresight where perf gets statically built to
>> > run on much more constrained systems like Android.
>>
>> Traces can't be decoded properly without the support of external
>> libraries, whether we are talking about PT or CS.
>
> Not true; perf has PT decoding self-contained.
>
> Thanks,
>
> Kim

^ permalink raw reply	[flat|nested] 52+ messages in thread

* [PATCH 00/10] perf tools: Add support for CoreSight trace decoding
@ 2018-01-11 22:18               ` Mathieu Poirier
  0 siblings, 0 replies; 52+ messages in thread
From: Mathieu Poirier @ 2018-01-11 22:18 UTC (permalink / raw)
  To: linux-arm-kernel

On 11 January 2018 at 14:49, Kim Phillips <kim.phillips@arm.com> wrote:
> On Thu, 11 Jan 2018 14:11:00 -0700
> Mathieu Poirier <mathieu.poirier@linaro.org> wrote:
>
>> On 11 January 2018 at 10:28, Kim Phillips <kim.phillips@arm.com> wrote:
>> > On Thu, 11 Jan 2018 08:45:21 -0700
>> > Mathieu Poirier <mathieu.poirier@linaro.org> wrote:
>> >
>> >> On 11 January 2018 at 05:23, Mark Brown <broonie@kernel.org> wrote:
>> >> > On Wed, Jan 10, 2018 at 06:08:21PM -0600, Kim Phillips wrote:
>> >> >> Mathieu Poirier <mathieu.poirier@linaro.org> wrote:
>> >> >
>> >> >> > Instructions on how to build and install the openCSD library are provided
>> >> >> > in the HOWTO.md of the project repository.
>> >> >
>> >> >> Usually when a perf builder sees something they need "on," they - or,
>> >> >> at least I - start querying the host's package manager for something
>> >> >> that provides it (e.g., apt search/install libopencsd), but since no
>> >> >> distro provides libopencsd, this is bad because it misleads the user.
>> >> >
>> >> > It's on the radar to push this at distros fairly soon.
>> >
>> > Adding packages to distros takes years, this patchset is being
>> > submitted for inclusion *now*.  So until then, it would greatly
>> > facilitate users if the relevant libopencsd source files were
>> > self-contained within perf from the get go.
>>
>> I do not agree with you on the front that it takes years.  On the flip
>> side it would take a significant amount of time and effort to refactor
>> the openCSD library so that it can be added to the kernel tree.  This
>
> The dtc wasn't refactored before it was added to the kernel tree.
>
>> patchset is available now with a solution that follows what has
>> already been done for dozens of other external library.  There is no
>> point in delaying the inclusion of the functionality when an
>> end-to-end solution exists.
>
> See above: I'm not necessarily suggesting the code get refactored.
>
>> >> >  Part of the
>> >> > discussion was wanting to get things to the point where the tools using
>> >> > the library were far enough along that we could be reasonably sure that
>> >
>> > Curious, what other tools are there?
>>
>> Ask around at ARM.
>
> I'm asking the person that claimed it.
>
>> >> > there weren't any problems that were going to require ABI breaks to fix
>> >> > before pushing the library at distros since ABI churn isn't nice for
>> >> > packagers to deal with.
>> >
>> > Why make perf the guinea pig?  Whatever, this doesn't preclude
>> > adding the code into the tree; it can be removed years from now when
>> > libopencsd becomes ubiquitous among distros.
>>
>> The same can be said about proceeding the other way around - the
>> openCSD library can be added to the kernel tree later if it is deemed
>> necessary.  Until then I really don't see why we'd prevent people from
>> accessing the functionality.
>
> Again, I'm not suggesting the code be refactored...
>
>> >> > There's also a bit of a chicken and egg problem
>> >> > in that it's a lot easier to get distros to package libraries that have
>> >> > users available (some are not really bothered about this of course but
>> >> > it still helps).
>> >>
>> >> Moreover including in the kernel tree every library that can
>> >> potentially be used by the perf tools simply doesn't scale.
>> >
>> > This is a trace decoder library we're talking about:  there are no
>> > others in perf's system features autodetection list.  And why wouldn't
>> > adding such libraries scale?
>>
>> I don't see why a decoder library and say, libelf, need to be treated
>> differently.
>
> libelf is a mature library based on an industry-wide standard, not to
> mention already packaged by most (all?) distros.
>
>> >>  The perf
>> >> tools project has come up with a very cleaver way to deal with
>> >> external dependencies and I don't see why the OpenCSD library should
>> >> be different.
>> >
>> > Again, the opencsd library is a decoder library:  this patchseries adds
>> > it as a package dependency (when it isn't even a package in any
>> > distro), and it's different in that it's the first decoder library to
>> > be submitted as an external dependency (i.e., not fully built-in, like
>> > Intel's, or even the Arm SPE's pending submission).
>>
>> I don't see why we absolutely need to do exactly the same as Intel.
>> The library is public and this patchset neatly integrates it with the
>> perf tools.
>
> We don't, but it'd be more efficient, upstream-acceptance-wise, but as
> you brought up above, we wouldn't be able to since we'd have to rewrite
> libopencsd to conform to upstream codingstyle, etc., so I'm suggesting
> we might look at a better enablement strategy like how the dtc works.
>
> It'd be nice if the upstream maintainers would comment on what would be
> acceptable instead of us going back and forth between each other.

Agreed.

>
>> >> >> Keeping the library external will also inevitably introduce more
>> >> >> source level synchronization problems because the perf sources being
>> >> >> built may not be compatible with their version of the library, whether
>> >> >> due to new features like new trace hardware support, or API changes.
>> >> >
>> >> > Perf users installing from source rather than from a package (who do
>> >> > tend to the more technical side even for kernel developers) already have
>> >> > to cope with potentially installing at least dwarf, gtk2, libaudit,
>> >> > libbfd, libelf, libnuma, libperl, libpython, libslang, libcrypto,
>> >> > libunwind, libdw-dwarf-unwind, zlib, lzma, bpf and OpenJDK depending on
>> >> > which features they want.  I'm not sure that adding one more library is
>> >> > going to be the end of the world here, especially once the packaging
>> >> > starts to filter through distros.  Until that happens at least people
>> >> > are no worse off for not having the feature.
>> >>
>> >> I completely agree.  Just like any other package, people that want the
>> >> very latest code need to install from source.
>> >
>> > A fully-integrated solution would work better for people, e.g., how are
>> > people supposed to know what 'latest' is when there are separate,
>> > unsynchronized git repos?
>>
>> The same applies to any of the other libraries perf is working with.
>
> The packaged libraries?  They are stable:  they don't come in the form
> of cloning a git repo and building from scratch.
>
> The decoder libraries?  They are self-contained within perf.
>
>> >> >> As Mark Brown (cc'd) mentioned on the Coresight mailing list, this may
>> >> >> be able to be done the same way the dtc is incorporated into the
>> >> >> kernel, where only its relevant sources are included and updated as
>> >> >> needed:  see linux/scripts/dtc/update-dtc-source.sh.
>> >> >
>> >> > Bear in mind that we need dtc for essentially all kernel development on
>> >> > ARM and when it was introduced it was a new requirement for existing
>> >> > systems, it's a bit of a different case here where it's an optional
>> >> > feature in an optional tool.
>> >
>> > That argument applies to Intel-PT, yet its decoder is self-contained
>> > within perf: all non-x86 perf binaries are capable of decoding PT.
>> > We'd want that for Arm Coresight where perf gets statically built to
>> > run on much more constrained systems like Android.
>>
>> Traces can't be decoded properly without the support of external
>> libraries, whether we are talking about PT or CS.
>
> Not true; perf has PT decoding self-contained.
>
> Thanks,
>
> Kim

^ permalink raw reply	[flat|nested] 52+ messages in thread

* Re: [PATCH 00/10] perf tools: Add support for CoreSight trace decoding
  2018-01-11 22:18               ` Mathieu Poirier
  (?)
@ 2018-01-16 12:35               ` Mike Leach
  2018-01-16 17:01                 ` Kim Phillips
  -1 siblings, 1 reply; 52+ messages in thread
From: Mike Leach @ 2018-01-16 12:35 UTC (permalink / raw)
  To: Mathieu Poirier
  Cc: Kim Phillips, Peter Zijlstra, linux-kernel, Adrian Hunter,
	Arnaldo Carvalho de Melo, Jeremiassen, Tor, Alexander Shishkin,
	Mark Brown, Mike Leach, namhyung, suzuki.poulosi, Jiri Olsa,
	Ingo Molnar, linux-arm-kernel

Hi,

On 11 January 2018 at 22:18, Mathieu Poirier <mathieu.poirier@linaro.org> wrote:
> On 11 January 2018 at 14:49, Kim Phillips <kim.phillips@arm.com> wrote:
>> On Thu, 11 Jan 2018 14:11:00 -0700
>> Mathieu Poirier <mathieu.poirier@linaro.org> wrote:
>>
>>> On 11 January 2018 at 10:28, Kim Phillips <kim.phillips@arm.com> wrote:
>>> > On Thu, 11 Jan 2018 08:45:21 -0700
>>> > Mathieu Poirier <mathieu.poirier@linaro.org> wrote:
>>> >
>>> >> On 11 January 2018 at 05:23, Mark Brown <broonie@kernel.org> wrote:
>>> >> > On Wed, Jan 10, 2018 at 06:08:21PM -0600, Kim Phillips wrote:
>>> >> >> Mathieu Poirier <mathieu.poirier@linaro.org> wrote:
>>> >> >
>>> >> >> > Instructions on how to build and install the openCSD library are provided
>>> >> >> > in the HOWTO.md of the project repository.
>>> >> >
>>> >> >> Usually when a perf builder sees something they need "on," they - or,
>>> >> >> at least I - start querying the host's package manager for something
>>> >> >> that provides it (e.g., apt search/install libopencsd), but since no
>>> >> >> distro provides libopencsd, this is bad because it misleads the user.
>>> >> >
>>> >> > It's on the radar to push this at distros fairly soon.
>>> >
>>> > Adding packages to distros takes years, this patchset is being
>>> > submitted for inclusion *now*.  So until then, it would greatly
>>> > facilitate users if the relevant libopencsd source files were
>>> > self-contained within perf from the get go.
>>>
>>> I do not agree with you on the front that it takes years.  On the flip
>>> side it would take a significant amount of time and effort to refactor
>>> the openCSD library so that it can be added to the kernel tree.  This
>>
>> The dtc wasn't refactored before it was added to the kernel tree.

The openCSD library consists of c. 140 C++ source and header files,
plus a few headers to form the libraries C-API, formatted in what is
an accepted standard within ARM - indent of 4 spaces and no tabs.
Now, afaik, this is unlikely to be acceptable to the kernel tree.

The decision to use C++ was made at the start of this project - the
objective was to produce a standalone, open source, reference trace
decoder library for CoreSight, to be used by any tooling that wanted
it, both open source and proprietary, for linux and windows OS, on x86
and native ARM, plus baremetal on ARM. The majority of stakeholders
involved at the start of the project expressed a preference for C++ -
in part as a significant amount of the code donated to the project was
already C++. The C-API was agreed as an addition to enable integration
with projects that preferred / required that - perf being one example.

Unlike intel PT, that has a single protocol, tightly bound to the core
it is run on, (similar to SPE in this respect), the library supports
multiple trace protocols, which are configured and controlled
independently of the cores that generate them. The library supports
all extant protocols - ETMv3 & 4, PTM and STM, plus the ability to
de-multiplex individual trace streams from the CS trace frames,
decoding these into a common generic standard, removing the need for
tooling to aware of the underlying protocol. Furthermore, given that
CoreSight hardware can support proprietary trace protocols (e.g. DSPs)
being added to and captured in the standard trace streams, the library
supports facilities to plug in additional external decoders.The
library also provides ancilliary tooling support - e.g. string
representations of protocol packets.

The library currently supports ETMv4.1 -> we have a requirement to
support v4.3 once these cores begin to appear, and it is inevitable
that the trace protocols will develop as the ARM architecture
develops. Adding the decoder library to the kernel tree will result in
code churn that is unnecessary for the kernel tree as the library is
developed, especially if functionality is added that is not used by A
class cores (see comment below re data trace).

>>
>>> patchset is available now with a solution that follows what has
>>> already been done for dozens of other external library.  There is no
>>> point in delaying the inclusion of the functionality when an
>>> end-to-end solution exists.
>>
>> See above: I'm not necessarily suggesting the code get refactored.
>>
>>> >> >  Part of the
>>> >> > discussion was wanting to get things to the point where the tools using
>>> >> > the library were far enough along that we could be reasonably sure that
>>> >
>>> > Curious, what other tools are there?
>>>
>>> Ask around at ARM.
>>
>> I'm asking the person that claimed it.
>>

The intent is to use openCSD as a decoder within existing ARM tools -
though the library will need to be extended to decode Data trace
before this is possible. (ARM A class processors are instruction trace
only. )
Additionally the library test program itself is in fact a useful tool
for investigating trace capture / corruption / setup errors in
hardware. It is capable of listing trace packets from snapshots
captured by DS-5 or the open source CoreSight Access Library.

>>> >> > there weren't any problems that were going to require ABI breaks to fix
>>> >> > before pushing the library at distros since ABI churn isn't nice for
>>> >> > packagers to deal with.
>>> >
>>> > Why make perf the guinea pig?  Whatever, this doesn't preclude
>>> > adding the code into the tree; it can be removed years from now when
>>> > libopencsd becomes ubiquitous among distros.
>>>
>>> The same can be said about proceeding the other way around - the
>>> openCSD library can be added to the kernel tree later if it is deemed
>>> necessary.  Until then I really don't see why we'd prevent people from
>>> accessing the functionality.
>>
>> Again, I'm not suggesting the code be refactored...
>>
>>> >> > There's also a bit of a chicken and egg problem
>>> >> > in that it's a lot easier to get distros to package libraries that have
>>> >> > users available (some are not really bothered about this of course but
>>> >> > it still helps).
>>> >>
>>> >> Moreover including in the kernel tree every library that can
>>> >> potentially be used by the perf tools simply doesn't scale.
>>> >
>>> > This is a trace decoder library we're talking about:  there are no
>>> > others in perf's system features autodetection list.  And why wouldn't
>>> > adding such libraries scale?
>>>
>>> I don't see why a decoder library and say, libelf, need to be treated
>>> differently.
>>
>> libelf is a mature library based on an industry-wide standard, not to
>> mention already packaged by most (all?) distros.
>>

We re-factored the library name and the layout of the C-API necessary
header files in the latest release (v0.8) to allow for installation
into a linux system and the build changes made to perf.
Now, while it is true that we need to be careful that users are aware
they need to use the latest release, in general if the library is not
present on a system; if is not part of the distribution, it is very
easy to find using a simple search. Frankly whenever I appear to be
missing a library in linux the first thing I do is a web search, to
figure out what package I am missing (since it is not always obvious
to me what libraries lie in which packages).

Google 'libopencsd' and you see the github HOWTO.md for OpenCSD very quickly.

I think users interested in using the library will have the know-how
to find an install it if the perf build process marks it as missing.
The HOWTO will be maintained as part of the library to explain the
installation and integration with perf.

Given all the above, I cannot see any engineering benefit from adding
the source to the kernel tree. We have a stable and maintainable
solution with the library added to the perf build as an external
dependency.

Regards

Mike


>>> >>  The perf
>>> >> tools project has come up with a very cleaver way to deal with
>>> >> external dependencies and I don't see why the OpenCSD library should
>>> >> be different.
>>> >
>>> > Again, the opencsd library is a decoder library:  this patchseries adds
>>> > it as a package dependency (when it isn't even a package in any
>>> > distro), and it's different in that it's the first decoder library to
>>> > be submitted as an external dependency (i.e., not fully built-in, like
>>> > Intel's, or even the Arm SPE's pending submission).
>>>
>>> I don't see why we absolutely need to do exactly the same as Intel.
>>> The library is public and this patchset neatly integrates it with the
>>> perf tools.
>>
>> We don't, but it'd be more efficient, upstream-acceptance-wise, but as
>> you brought up above, we wouldn't be able to since we'd have to rewrite
>> libopencsd to conform to upstream codingstyle, etc., so I'm suggesting
>> we might look at a better enablement strategy like how the dtc works.
>>
>> It'd be nice if the upstream maintainers would comment on what would be
>> acceptable instead of us going back and forth between each other.
>
> Agreed.
>
>>
>>> >> >> Keeping the library external will also inevitably introduce more
>>> >> >> source level synchronization problems because the perf sources being
>>> >> >> built may not be compatible with their version of the library, whether
>>> >> >> due to new features like new trace hardware support, or API changes.
>>> >> >
>>> >> > Perf users installing from source rather than from a package (who do
>>> >> > tend to the more technical side even for kernel developers) already have
>>> >> > to cope with potentially installing at least dwarf, gtk2, libaudit,
>>> >> > libbfd, libelf, libnuma, libperl, libpython, libslang, libcrypto,
>>> >> > libunwind, libdw-dwarf-unwind, zlib, lzma, bpf and OpenJDK depending on
>>> >> > which features they want.  I'm not sure that adding one more library is
>>> >> > going to be the end of the world here, especially once the packaging
>>> >> > starts to filter through distros.  Until that happens at least people
>>> >> > are no worse off for not having the feature.
>>> >>
>>> >> I completely agree.  Just like any other package, people that want the
>>> >> very latest code need to install from source.
>>> >
>>> > A fully-integrated solution would work better for people, e.g., how are
>>> > people supposed to know what 'latest' is when there are separate,
>>> > unsynchronized git repos?
>>>
>>> The same applies to any of the other libraries perf is working with.
>>
>> The packaged libraries?  They are stable:  they don't come in the form
>> of cloning a git repo and building from scratch.
>>
>> The decoder libraries?  They are self-contained within perf.
>>
>>> >> >> As Mark Brown (cc'd) mentioned on the Coresight mailing list, this may
>>> >> >> be able to be done the same way the dtc is incorporated into the
>>> >> >> kernel, where only its relevant sources are included and updated as
>>> >> >> needed:  see linux/scripts/dtc/update-dtc-source.sh.
>>> >> >
>>> >> > Bear in mind that we need dtc for essentially all kernel development on
>>> >> > ARM and when it was introduced it was a new requirement for existing
>>> >> > systems, it's a bit of a different case here where it's an optional
>>> >> > feature in an optional tool.
>>> >
>>> > That argument applies to Intel-PT, yet its decoder is self-contained
>>> > within perf: all non-x86 perf binaries are capable of decoding PT.
>>> > We'd want that for Arm Coresight where perf gets statically built to
>>> > run on much more constrained systems like Android.
>>>
>>> Traces can't be decoded properly without the support of external
>>> libraries, whether we are talking about PT or CS.
>>
>> Not true; perf has PT decoding self-contained.
>>
>> Thanks,
>>
>> Kim
>
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel



-- 
Mike Leach
Principal Engineer, ARM Ltd.
Blackburn Design Centre. UK

^ permalink raw reply	[flat|nested] 52+ messages in thread

* Re: [PATCH 00/10] perf tools: Add support for CoreSight trace decoding
  2018-01-16 12:35               ` Mike Leach
@ 2018-01-16 17:01                 ` Kim Phillips
  2018-01-16 17:58                   ` Mathieu Poirier
  0 siblings, 1 reply; 52+ messages in thread
From: Kim Phillips @ 2018-01-16 17:01 UTC (permalink / raw)
  To: Mike Leach
  Cc: Mathieu Poirier, Peter Zijlstra, linux-kernel, Adrian Hunter,
	Arnaldo Carvalho de Melo, Jeremiassen, Tor, Alexander Shishkin,
	Mark Brown, Mike Leach, namhyung, suzuki.poulosi, Jiri Olsa,
	Ingo Molnar, linux-arm-kernel

On Tue, 16 Jan 2018 12:35:26 +0000
Mike Leach <mike.leach@linaro.org> wrote:

> Hi,
> 
> On 11 January 2018 at 22:18, Mathieu Poirier <mathieu.poirier@linaro.org> wrote:
> > On 11 January 2018 at 14:49, Kim Phillips <kim.phillips@arm.com> wrote:
> >> On Thu, 11 Jan 2018 14:11:00 -0700
> >> Mathieu Poirier <mathieu.poirier@linaro.org> wrote:
> >>
> >>> On 11 January 2018 at 10:28, Kim Phillips <kim.phillips@arm.com> wrote:
> >>> > On Thu, 11 Jan 2018 08:45:21 -0700
> >>> > Mathieu Poirier <mathieu.poirier@linaro.org> wrote:
> >>> >
> >>> >> On 11 January 2018 at 05:23, Mark Brown <broonie@kernel.org> wrote:
> >>> >> > On Wed, Jan 10, 2018 at 06:08:21PM -0600, Kim Phillips wrote:
> >>> >> >> Mathieu Poirier <mathieu.poirier@linaro.org> wrote:
> >>> >> >
> >>> >> >> > Instructions on how to build and install the openCSD library are provided
> >>> >> >> > in the HOWTO.md of the project repository.
> >>> >> >
> >>> >> >> Usually when a perf builder sees something they need "on," they - or,
> >>> >> >> at least I - start querying the host's package manager for something
> >>> >> >> that provides it (e.g., apt search/install libopencsd), but since no
> >>> >> >> distro provides libopencsd, this is bad because it misleads the user.
> >>> >> >
> >>> >> > It's on the radar to push this at distros fairly soon.
> >>> >
> >>> > Adding packages to distros takes years, this patchset is being
> >>> > submitted for inclusion *now*.  So until then, it would greatly
> >>> > facilitate users if the relevant libopencsd source files were
> >>> > self-contained within perf from the get go.
> >>>
> >>> I do not agree with you on the front that it takes years.  On the flip
> >>> side it would take a significant amount of time and effort to refactor
> >>> the openCSD library so that it can be added to the kernel tree.  This
> >>
> >> The dtc wasn't refactored before it was added to the kernel tree.
> 
> The openCSD library consists of c. 140 C++ source and header files,
> plus a few headers to form the libraries C-API, formatted in what is
> an accepted standard within ARM - indent of 4 spaces and no tabs.
> Now, afaik, this is unlikely to be acceptable to the kernel tree.

like I said, the refactoring (restyling?) shouldn't have to be
necessary, as was with the dtc.  Plus, only the necessary files would
be imported by the update script: a figure an order of magnitude less
than 140.

> The decision to use C++ was made at the start of this project - the

I don't think that matters either.

> Unlike intel PT, that has a single protocol, tightly bound to the core
> it is run on, (similar to SPE in this respect), the library supports
> multiple trace protocols, which are configured and controlled
> independently of the cores that generate them. The library supports
> all extant protocols - ETMv3 & 4, PTM and STM, plus the ability to
> de-multiplex individual trace streams from the CS trace frames,
> decoding these into a common generic standard, removing the need for
> tooling to aware of the underlying protocol. Furthermore, given that

So if we limited the first submission to just the relevant ETMv4 files
imported, we'd start off in the same place as Intel PT: a single
protocol.  Not that it's a crime to extend it later to newer versions
of the ETM protocol, and possibly backport the older stuff at a later
date.  The object here is to enable the current-generation ETM user wrt
perf decoding as seamlessly and as easily as possible.

> CoreSight hardware can support proprietary trace protocols (e.g. DSPs)

Likewise, we're not concerned about these cases in the first submission
of the ETM decoder patch to perf.

> The library currently supports ETMv4.1 -> we have a requirement to
> support v4.3 once these cores begin to appear, and it is inevitable
> that the trace protocols will develop as the ARM architecture
> develops. Adding the decoder library to the kernel tree will result in
> code churn that is unnecessary for the kernel tree as the library is
> developed, especially if functionality is added that is not used by A
> class cores (see comment below re data trace).

Generally, if new hardware needs to be supported, the kernel tree will
accept patches to support it.

During development, the developers are free to maintain public git
repos with their work-in-progress, as usual, for those seeking early
access to the new feature.

> >>> patchset is available now with a solution that follows what has
> >>> already been done for dozens of other external library.  There is no
> >>> point in delaying the inclusion of the functionality when an
> >>> end-to-end solution exists.
> >>
> >> See above: I'm not necessarily suggesting the code get refactored.
> >>
> >>> >> >  Part of the
> >>> >> > discussion was wanting to get things to the point where the tools using
> >>> >> > the library were far enough along that we could be reasonably sure that
> >>> >
> >>> > Curious, what other tools are there?
> >>>
> >>> Ask around at ARM.
> >>
> >> I'm asking the person that claimed it.
> 
> The intent is to use openCSD as a decoder within existing ARM tools -
> though the library will need to be extended to decode Data trace
> before this is possible. (ARM A class processors are instruction trace
> only. )

So there are no other users in the linux ecosystem, meaning nothing
is gained by packaging it in distros, and all the more reason to enable
it by directly importing it into perf, so users get all the benefit
without the wait and without the hassle of having to manually install
the library and worry about compatibility between perf.

> Additionally the library test program itself is in fact a useful tool
> for investigating trace capture / corruption / setup errors in
> hardware. It is capable of listing trace packets from snapshots
> captured by DS-5 or the open source CoreSight Access Library.

Like I said above, the libopencsd files perf doesn't need don't need to
be imported by the update script.

> >>> >> > there weren't any problems that were going to require ABI breaks to fix
> >>> >> > before pushing the library at distros since ABI churn isn't nice for
> >>> >> > packagers to deal with.
> >>> >
> >>> > Why make perf the guinea pig?  Whatever, this doesn't preclude
> >>> > adding the code into the tree; it can be removed years from now when
> >>> > libopencsd becomes ubiquitous among distros.
> >>>
> >>> The same can be said about proceeding the other way around - the
> >>> openCSD library can be added to the kernel tree later if it is deemed
> >>> necessary.  Until then I really don't see why we'd prevent people from
> >>> accessing the functionality.
> >>
> >> Again, I'm not suggesting the code be refactored...
> >>
> >>> >> > There's also a bit of a chicken and egg problem
> >>> >> > in that it's a lot easier to get distros to package libraries that have
> >>> >> > users available (some are not really bothered about this of course but
> >>> >> > it still helps).
> >>> >>
> >>> >> Moreover including in the kernel tree every library that can
> >>> >> potentially be used by the perf tools simply doesn't scale.
> >>> >
> >>> > This is a trace decoder library we're talking about:  there are no
> >>> > others in perf's system features autodetection list.  And why wouldn't
> >>> > adding such libraries scale?
> >>>
> >>> I don't see why a decoder library and say, libelf, need to be treated
> >>> differently.
> >>
> >> libelf is a mature library based on an industry-wide standard, not to
> >> mention already packaged by most (all?) distros.
> 
> We re-factored the library name and the layout of the C-API necessary
> header files in the latest release (v0.8) to allow for installation
> into a linux system and the build changes made to perf.
> Now, while it is true that we need to be careful that users are aware
> they need to use the latest release, in general if the library is not
> present on a system; if is not part of the distribution, it is very
> easy to find using a simple search.

The way it's being done in this patchseries, users are going to query
their package managers for libopencsd and not find it: very
misleading.  To avoid having to manually install the library and
inevitably have it go out of sync with perf, it'd behoove us to
include the sources directly as of now.

> Frankly whenever I appear to be
> missing a library in linux the first thing I do is a web search, to
> figure out what package I am missing (since it is not always obvious
> to me what libraries lie in which packages).
> 
> Google 'libopencsd' and you see the github HOWTO.md for OpenCSD very quickly.
> 
> I think users interested in using the library will have the know-how
> to find an install it if the perf build process marks it as missing.
> The HOWTO will be maintained as part of the library to explain the
> installation and integration with perf.

We can avoid all of this.

> Given all the above, I cannot see any engineering benefit from adding
> the source to the kernel tree. We have a stable and maintainable
> solution with the library added to the perf build as an external
> dependency.

That's not true: the perf and libopencsd sources can get out of sync,
whereas if the perf-dependent files of libopencsd were maintained along
with the perf source itself, that would not be possible.

Kim

^ permalink raw reply	[flat|nested] 52+ messages in thread

* Re: [PATCH 00/10] perf tools: Add support for CoreSight trace decoding
  2018-01-16 17:01                 ` Kim Phillips
@ 2018-01-16 17:58                   ` Mathieu Poirier
  2018-01-16 19:29                     ` Kim Phillips
  0 siblings, 1 reply; 52+ messages in thread
From: Mathieu Poirier @ 2018-01-16 17:58 UTC (permalink / raw)
  To: Kim Phillips
  Cc: Mike Leach, Peter Zijlstra, linux-kernel, Adrian Hunter,
	Arnaldo Carvalho de Melo, Jeremiassen, Tor, Alexander Shishkin,
	Mark Brown, Mike Leach, namhyung, suzuki.poulosi, Jiri Olsa,
	Ingo Molnar, linux-arm-kernel

On Tue, Jan 16, 2018 at 11:01:02AM -0600, Kim Phillips wrote:
> On Tue, 16 Jan 2018 12:35:26 +0000
> Mike Leach <mike.leach@linaro.org> wrote:
> 
> > Hi,
> > 
> > On 11 January 2018 at 22:18, Mathieu Poirier <mathieu.poirier@linaro.org> wrote:
> > > On 11 January 2018 at 14:49, Kim Phillips <kim.phillips@arm.com> wrote:
> > >> On Thu, 11 Jan 2018 14:11:00 -0700
> > >> Mathieu Poirier <mathieu.poirier@linaro.org> wrote:
> > >>
> > >>> On 11 January 2018 at 10:28, Kim Phillips <kim.phillips@arm.com> wrote:
> > >>> > On Thu, 11 Jan 2018 08:45:21 -0700
> > >>> > Mathieu Poirier <mathieu.poirier@linaro.org> wrote:
> > >>> >
> > >>> >> On 11 January 2018 at 05:23, Mark Brown <broonie@kernel.org> wrote:
> > >>> >> > On Wed, Jan 10, 2018 at 06:08:21PM -0600, Kim Phillips wrote:
> > >>> >> >> Mathieu Poirier <mathieu.poirier@linaro.org> wrote:
> > >>> >> >
> > >>> >> >> > Instructions on how to build and install the openCSD library are provided
> > >>> >> >> > in the HOWTO.md of the project repository.
> > >>> >> >
> > >>> >> >> Usually when a perf builder sees something they need "on," they - or,
> > >>> >> >> at least I - start querying the host's package manager for something
> > >>> >> >> that provides it (e.g., apt search/install libopencsd), but since no
> > >>> >> >> distro provides libopencsd, this is bad because it misleads the user.
> > >>> >> >
> > >>> >> > It's on the radar to push this at distros fairly soon.
> > >>> >
> > >>> > Adding packages to distros takes years, this patchset is being
> > >>> > submitted for inclusion *now*.  So until then, it would greatly
> > >>> > facilitate users if the relevant libopencsd source files were
> > >>> > self-contained within perf from the get go.
> > >>>
> > >>> I do not agree with you on the front that it takes years.  On the flip
> > >>> side it would take a significant amount of time and effort to refactor
> > >>> the openCSD library so that it can be added to the kernel tree.  This
> > >>
> > >> The dtc wasn't refactored before it was added to the kernel tree.
> > 
> > The openCSD library consists of c. 140 C++ source and header files,
> > plus a few headers to form the libraries C-API, formatted in what is
> > an accepted standard within ARM - indent of 4 spaces and no tabs.
> > Now, afaik, this is unlikely to be acceptable to the kernel tree.
> 
> like I said, the refactoring (restyling?) shouldn't have to be
> necessary, as was with the dtc.  Plus, only the necessary files would
> be imported by the update script: a figure an order of magnitude less
> than 140.

Again, we don't need to do all that if we keep the library separate.

> 
> > The decision to use C++ was made at the start of this project - the
> 
> I don't think that matters either.
> 
> > Unlike intel PT, that has a single protocol, tightly bound to the core
> > it is run on, (similar to SPE in this respect), the library supports
> > multiple trace protocols, which are configured and controlled
> > independently of the cores that generate them. The library supports
> > all extant protocols - ETMv3 & 4, PTM and STM, plus the ability to
> > de-multiplex individual trace streams from the CS trace frames,
> > decoding these into a common generic standard, removing the need for
> > tooling to aware of the underlying protocol. Furthermore, given that
> 
> So if we limited the first submission to just the relevant ETMv4 files
> imported, we'd start off in the same place as Intel PT: a single
> protocol.  Not that it's a crime to extend it later to newer versions
> of the ETM protocol, and possibly backport the older stuff at a later
> date.  The object here is to enable the current-generation ETM user wrt
> perf decoding as seamlessly and as easily as possible.
> 
> > CoreSight hardware can support proprietary trace protocols (e.g. DSPs)
> 
> Likewise, we're not concerned about these cases in the first submission
> of the ETM decoder patch to perf.

It would be extremely time consuming to start splitting the library by
functionality and then, incrementally start (re)adding the features.  I rather
spend that time working on new functionality and making the CoreSight subsystem
better.

> 
> > The library currently supports ETMv4.1 -> we have a requirement to
> > support v4.3 once these cores begin to appear, and it is inevitable
> > that the trace protocols will develop as the ARM architecture
> > develops. Adding the decoder library to the kernel tree will result in
> > code churn that is unnecessary for the kernel tree as the library is
> > developed, especially if functionality is added that is not used by A
> > class cores (see comment below re data trace).
> 
> Generally, if new hardware needs to be supported, the kernel tree will
> accept patches to support it.
> 
> During development, the developers are free to maintain public git
> repos with their work-in-progress, as usual, for those seeking early
> access to the new feature.
> 
> > >>> patchset is available now with a solution that follows what has
> > >>> already been done for dozens of other external library.  There is no
> > >>> point in delaying the inclusion of the functionality when an
> > >>> end-to-end solution exists.
> > >>
> > >> See above: I'm not necessarily suggesting the code get refactored.
> > >>
> > >>> >> >  Part of the
> > >>> >> > discussion was wanting to get things to the point where the tools using
> > >>> >> > the library were far enough along that we could be reasonably sure that
> > >>> >
> > >>> > Curious, what other tools are there?
> > >>>
> > >>> Ask around at ARM.
> > >>
> > >> I'm asking the person that claimed it.
> > 
> > The intent is to use openCSD as a decoder within existing ARM tools -
> > though the library will need to be extended to decode Data trace
> > before this is possible. (ARM A class processors are instruction trace
> > only. )
> 
> So there are no other users in the linux ecosystem, meaning nothing
> is gained by packaging it in distros, and all the more reason to enable
> it by directly importing it into perf, so users get all the benefit
> without the wait and without the hassle of having to manually install
> the library and worry about compatibility between perf.

Once again I think you're blowing the down side out of proportion.  Like Mark
Brown said we have to start somewhere.  Once we have this in work on proper
packaging will start immediately.

> 
> > Additionally the library test program itself is in fact a useful tool
> > for investigating trace capture / corruption / setup errors in
> > hardware. It is capable of listing trace packets from snapshots
> > captured by DS-5 or the open source CoreSight Access Library.
> 
> Like I said above, the libopencsd files perf doesn't need don't need to
> be imported by the update script.
> 
> > >>> >> > there weren't any problems that were going to require ABI breaks to fix
> > >>> >> > before pushing the library at distros since ABI churn isn't nice for
> > >>> >> > packagers to deal with.
> > >>> >
> > >>> > Why make perf the guinea pig?  Whatever, this doesn't preclude
> > >>> > adding the code into the tree; it can be removed years from now when
> > >>> > libopencsd becomes ubiquitous among distros.
> > >>>
> > >>> The same can be said about proceeding the other way around - the
> > >>> openCSD library can be added to the kernel tree later if it is deemed
> > >>> necessary.  Until then I really don't see why we'd prevent people from
> > >>> accessing the functionality.
> > >>
> > >> Again, I'm not suggesting the code be refactored...
> > >>
> > >>> >> > There's also a bit of a chicken and egg problem
> > >>> >> > in that it's a lot easier to get distros to package libraries that have
> > >>> >> > users available (some are not really bothered about this of course but
> > >>> >> > it still helps).
> > >>> >>
> > >>> >> Moreover including in the kernel tree every library that can
> > >>> >> potentially be used by the perf tools simply doesn't scale.
> > >>> >
> > >>> > This is a trace decoder library we're talking about:  there are no
> > >>> > others in perf's system features autodetection list.  And why wouldn't
> > >>> > adding such libraries scale?
> > >>>
> > >>> I don't see why a decoder library and say, libelf, need to be treated
> > >>> differently.
> > >>
> > >> libelf is a mature library based on an industry-wide standard, not to
> > >> mention already packaged by most (all?) distros.
> > 
> > We re-factored the library name and the layout of the C-API necessary
> > header files in the latest release (v0.8) to allow for installation
> > into a linux system and the build changes made to perf.
> > Now, while it is true that we need to be careful that users are aware
> > they need to use the latest release, in general if the library is not
> > present on a system; if is not part of the distribution, it is very
> > easy to find using a simple search.
> 
> The way it's being done in this patchseries, users are going to query
> their package managers for libopencsd and not find it: very
> misleading.  To avoid having to manually install the library and
> inevitably have it go out of sync with perf, it'd behoove us to
> include the sources directly as of now.

There's nothing going out of sync - until we have proper packaging people simply
need to recompile their perf utility.  As pointed out before that wouldn't be
hard to do for people using hardware assisted tracing.

> 
> > Frankly whenever I appear to be
> > missing a library in linux the first thing I do is a web search, to
> > figure out what package I am missing (since it is not always obvious
> > to me what libraries lie in which packages).
> > 
> > Google 'libopencsd' and you see the github HOWTO.md for OpenCSD very quickly.
> > 
> > I think users interested in using the library will have the know-how
> > to find an install it if the perf build process marks it as missing.
> > The HOWTO will be maintained as part of the library to explain the
> > installation and integration with perf.
> 
> We can avoid all of this.
> 
> > Given all the above, I cannot see any engineering benefit from adding
> > the source to the kernel tree. We have a stable and maintainable
> > solution with the library added to the perf build as an external
> > dependency.
> 
> That's not true: the perf and libopencsd sources can get out of sync,
> whereas if the perf-dependent files of libopencsd were maintained along
> with the perf source itself, that would not be possible.

Not true: kernel subsystem get out of sync regularly, this wouldn't be any
different.


> 
> Kim

^ permalink raw reply	[flat|nested] 52+ messages in thread

* Re: [PATCH 00/10] perf tools: Add support for CoreSight trace decoding
  2018-01-16 17:58                   ` Mathieu Poirier
@ 2018-01-16 19:29                     ` Kim Phillips
  0 siblings, 0 replies; 52+ messages in thread
From: Kim Phillips @ 2018-01-16 19:29 UTC (permalink / raw)
  To: Mathieu Poirier
  Cc: Mike Leach, Peter Zijlstra, linux-kernel, Adrian Hunter,
	Arnaldo Carvalho de Melo, Jeremiassen, Tor, Alexander Shishkin,
	Mark Brown, Mike Leach, namhyung, suzuki.poulosi, Jiri Olsa,
	Ingo Molnar, linux-arm-kernel

On Tue, 16 Jan 2018 10:58:06 -0700
Mathieu Poirier <mathieu.poirier@linaro.org> wrote:

> On Tue, Jan 16, 2018 at 11:01:02AM -0600, Kim Phillips wrote:
> > On Tue, 16 Jan 2018 12:35:26 +0000
> > Mike Leach <mike.leach@linaro.org> wrote:
> > 
> > > Hi,
> > > 
> > > On 11 January 2018 at 22:18, Mathieu Poirier <mathieu.poirier@linaro.org> wrote:
> > > > On 11 January 2018 at 14:49, Kim Phillips <kim.phillips@arm.com> wrote:
> > > >> On Thu, 11 Jan 2018 14:11:00 -0700
> > > >> Mathieu Poirier <mathieu.poirier@linaro.org> wrote:
> > > >>
> > > >>> On 11 January 2018 at 10:28, Kim Phillips <kim.phillips@arm.com> wrote:
> > > >>> > On Thu, 11 Jan 2018 08:45:21 -0700
> > > >>> > Mathieu Poirier <mathieu.poirier@linaro.org> wrote:
> > > >>> >
> > > >>> >> On 11 January 2018 at 05:23, Mark Brown <broonie@kernel.org> wrote:
> > > >>> >> > On Wed, Jan 10, 2018 at 06:08:21PM -0600, Kim Phillips wrote:
> > > >>> >> >> Mathieu Poirier <mathieu.poirier@linaro.org> wrote:
> > > >>> >> >
> > > >>> >> >> > Instructions on how to build and install the openCSD library are provided
> > > >>> >> >> > in the HOWTO.md of the project repository.
> > > >>> >> >
> > > >>> >> >> Usually when a perf builder sees something they need "on," they - or,
> > > >>> >> >> at least I - start querying the host's package manager for something
> > > >>> >> >> that provides it (e.g., apt search/install libopencsd), but since no
> > > >>> >> >> distro provides libopencsd, this is bad because it misleads the user.
> > > >>> >> >
> > > >>> >> > It's on the radar to push this at distros fairly soon.
> > > >>> >
> > > >>> > Adding packages to distros takes years, this patchset is being
> > > >>> > submitted for inclusion *now*.  So until then, it would greatly
> > > >>> > facilitate users if the relevant libopencsd source files were
> > > >>> > self-contained within perf from the get go.
> > > >>>
> > > >>> I do not agree with you on the front that it takes years.  On the flip
> > > >>> side it would take a significant amount of time and effort to refactor
> > > >>> the openCSD library so that it can be added to the kernel tree.  This
> > > >>
> > > >> The dtc wasn't refactored before it was added to the kernel tree.
> > > 
> > > The openCSD library consists of c. 140 C++ source and header files,
> > > plus a few headers to form the libraries C-API, formatted in what is
> > > an accepted standard within ARM - indent of 4 spaces and no tabs.
> > > Now, afaik, this is unlikely to be acceptable to the kernel tree.
> > 
> > like I said, the refactoring (restyling?) shouldn't have to be
> > necessary, as was with the dtc.  Plus, only the necessary files would
> > be imported by the update script: a figure an order of magnitude less
> > than 140.
> 
> Again, we don't need to do all that if we keep the library separate.

Do all what?  I'm saying no refactoring/restyling should be necessary,
even only for the files relevant to perf.

If you're talking about writing the update script, the dtc example can
be used as a base, and I'd rather we do it up front so our users don't
have to deal with manually installing libopencsd and not knowing when
to update it.

> > > The decision to use C++ was made at the start of this project - the
> > 
> > I don't think that matters either.
> > 
> > > Unlike intel PT, that has a single protocol, tightly bound to the core
> > > it is run on, (similar to SPE in this respect), the library supports
> > > multiple trace protocols, which are configured and controlled
> > > independently of the cores that generate them. The library supports
> > > all extant protocols - ETMv3 & 4, PTM and STM, plus the ability to
> > > de-multiplex individual trace streams from the CS trace frames,
> > > decoding these into a common generic standard, removing the need for
> > > tooling to aware of the underlying protocol. Furthermore, given that
> > 
> > So if we limited the first submission to just the relevant ETMv4 files
> > imported, we'd start off in the same place as Intel PT: a single
> > protocol.  Not that it's a crime to extend it later to newer versions
> > of the ETM protocol, and possibly backport the older stuff at a later
> > date.  The object here is to enable the current-generation ETM user wrt
> > perf decoding as seamlessly and as easily as possible.
> > 
> > > CoreSight hardware can support proprietary trace protocols (e.g. DSPs)
> > 
> > Likewise, we're not concerned about these cases in the first submission
> > of the ETM decoder patch to perf.
> 
> It would be extremely time consuming to start splitting the library by
> functionality and then, incrementally start (re)adding the features.  I rather
> spend that time working on new functionality and making the CoreSight subsystem
> better.

The library is already organized by ETM h/w version for the most part,
so we'd add the ETMv4 files to the update script first, then the others
- older or newer - as they get successfully tested, and at the tester's
leisure:  all this requires is a dtc update script and initial test on
ETMv4 data, and avoids users from having to deal with misleading
behaviour when building the coresight subsytem.

> > > The library currently supports ETMv4.1 -> we have a requirement to
> > > support v4.3 once these cores begin to appear, and it is inevitable
> > > that the trace protocols will develop as the ARM architecture
> > > develops. Adding the decoder library to the kernel tree will result in
> > > code churn that is unnecessary for the kernel tree as the library is
> > > developed, especially if functionality is added that is not used by A
> > > class cores (see comment below re data trace).
> > 
> > Generally, if new hardware needs to be supported, the kernel tree will
> > accept patches to support it.
> > 
> > During development, the developers are free to maintain public git
> > repos with their work-in-progress, as usual, for those seeking early
> > access to the new feature.
> > 
> > > >>> patchset is available now with a solution that follows what has
> > > >>> already been done for dozens of other external library.  There is no
> > > >>> point in delaying the inclusion of the functionality when an
> > > >>> end-to-end solution exists.
> > > >>
> > > >> See above: I'm not necessarily suggesting the code get refactored.
> > > >>
> > > >>> >> >  Part of the
> > > >>> >> > discussion was wanting to get things to the point where the tools using
> > > >>> >> > the library were far enough along that we could be reasonably sure that
> > > >>> >
> > > >>> > Curious, what other tools are there?
> > > >>>
> > > >>> Ask around at ARM.
> > > >>
> > > >> I'm asking the person that claimed it.
> > > 
> > > The intent is to use openCSD as a decoder within existing ARM tools -
> > > though the library will need to be extended to decode Data trace
> > > before this is possible. (ARM A class processors are instruction trace
> > > only. )
> > 
> > So there are no other users in the linux ecosystem, meaning nothing
> > is gained by packaging it in distros, and all the more reason to enable
> > it by directly importing it into perf, so users get all the benefit
> > without the wait and without the hassle of having to manually install
> > the library and worry about compatibility between perf.
> 
> Once again I think you're blowing the down side out of proportion.  Like Mark
> Brown said we have to start somewhere.  Once we have this in work on proper
> packaging will start immediately.

Why package libopencsd at all, when only perf is using it?

> > > Additionally the library test program itself is in fact a useful tool
> > > for investigating trace capture / corruption / setup errors in
> > > hardware. It is capable of listing trace packets from snapshots
> > > captured by DS-5 or the open source CoreSight Access Library.
> > 
> > Like I said above, the libopencsd files perf doesn't need don't need to
> > be imported by the update script.
> > 
> > > >>> >> > there weren't any problems that were going to require ABI breaks to fix
> > > >>> >> > before pushing the library at distros since ABI churn isn't nice for
> > > >>> >> > packagers to deal with.
> > > >>> >
> > > >>> > Why make perf the guinea pig?  Whatever, this doesn't preclude
> > > >>> > adding the code into the tree; it can be removed years from now when
> > > >>> > libopencsd becomes ubiquitous among distros.
> > > >>>
> > > >>> The same can be said about proceeding the other way around - the
> > > >>> openCSD library can be added to the kernel tree later if it is deemed
> > > >>> necessary.  Until then I really don't see why we'd prevent people from
> > > >>> accessing the functionality.
> > > >>
> > > >> Again, I'm not suggesting the code be refactored...
> > > >>
> > > >>> >> > There's also a bit of a chicken and egg problem
> > > >>> >> > in that it's a lot easier to get distros to package libraries that have
> > > >>> >> > users available (some are not really bothered about this of course but
> > > >>> >> > it still helps).
> > > >>> >>
> > > >>> >> Moreover including in the kernel tree every library that can
> > > >>> >> potentially be used by the perf tools simply doesn't scale.
> > > >>> >
> > > >>> > This is a trace decoder library we're talking about:  there are no
> > > >>> > others in perf's system features autodetection list.  And why wouldn't
> > > >>> > adding such libraries scale?
> > > >>>
> > > >>> I don't see why a decoder library and say, libelf, need to be treated
> > > >>> differently.
> > > >>
> > > >> libelf is a mature library based on an industry-wide standard, not to
> > > >> mention already packaged by most (all?) distros.
> > > 
> > > We re-factored the library name and the layout of the C-API necessary
> > > header files in the latest release (v0.8) to allow for installation
> > > into a linux system and the build changes made to perf.
> > > Now, while it is true that we need to be careful that users are aware
> > > they need to use the latest release, in general if the library is not
> > > present on a system; if is not part of the distribution, it is very
> > > easy to find using a simple search.
> > 
> > The way it's being done in this patchseries, users are going to query
> > their package managers for libopencsd and not find it: very
> > misleading.  To avoid having to manually install the library and
> > inevitably have it go out of sync with perf, it'd behoove us to
> > include the sources directly as of now.
> 
> There's nothing going out of sync - until we have proper packaging
> people simply need to recompile their perf utility.

You can't guarantee that:  Both the perf tool and libopencsd will
continue to be developed.  Without the control of which version of the
library gets built with perf means that user copies will go out of sync
if this patchseries goes in as-is.

>  As pointed out before that wouldn't be
> hard to do for people using hardware assisted tracing.

You mean people already used to building OpenCSD kernels, libraries,
and perf from scratch?  That's not saying much, esp. because by posting
decoder support upstream, we should be catering to new - less unique -
users.

> > > Frankly whenever I appear to be
> > > missing a library in linux the first thing I do is a web search, to
> > > figure out what package I am missing (since it is not always obvious
> > > to me what libraries lie in which packages).
> > > 
> > > Google 'libopencsd' and you see the github HOWTO.md for OpenCSD very quickly.
> > > 
> > > I think users interested in using the library will have the know-how
> > > to find an install it if the perf build process marks it as missing.
> > > The HOWTO will be maintained as part of the library to explain the
> > > installation and integration with perf.
> > 
> > We can avoid all of this.
> > 
> > > Given all the above, I cannot see any engineering benefit from adding
> > > the source to the kernel tree. We have a stable and maintainable
> > > solution with the library added to the perf build as an external
> > > dependency.
> > 
> > That's not true: the perf and libopencsd sources can get out of sync,
> > whereas if the perf-dependent files of libopencsd were maintained along
> > with the perf source itself, that would not be possible.
> 
> Not true: kernel subsystem get out of sync regularly, this wouldn't be any

The kernel subsystem gets out of sync with what?  The perf tool?  That
hasn't been my experience:  When does that happen, and how regularly?

Note that some of the kernel header files are copied into the perf
tool, but are controllingly updated prior to every release.

IIRC, on the Coresight mailing list, the first response to incoming bug
reports is to ask the user to update to the latest
OpenCSD-tree-maintained version of the kernel, library *and* perf tool,
because that is the only tested/maintained version.  You'd want the
libopencsd sources in sync with perf to avoid those bug reports for
that same reason.

> different.

Can we get upstream maintainer input on importing some libopencsd
source files, much like how the kernel build system does in scripts/dtc?

Thanks,

Kim

^ permalink raw reply	[flat|nested] 52+ messages in thread

end of thread, other threads:[~2018-01-16 19:30 UTC | newest]

Thread overview: 52+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-12-15 16:44 [PATCH 00/10] perf tools: Add support for CoreSight trace decoding Mathieu Poirier
2017-12-15 16:44 ` Mathieu Poirier
2017-12-15 16:44 ` [PATCH 01/10] perf tools: Integrating the CoreSight decoding library Mathieu Poirier
2017-12-15 16:44   ` Mathieu Poirier
2017-12-15 16:44 ` [PATCH 02/10] perf tools: Add initial entry point for decoder CoreSight traces Mathieu Poirier
2017-12-15 16:44   ` Mathieu Poirier
2017-12-15 16:44 ` [PATCH 03/10] perf tools: Add processing of coresight metadata Mathieu Poirier
2017-12-15 16:44   ` Mathieu Poirier
2017-12-15 16:44 ` [PATCH 04/10] perf tools: Add decoder mechanic to support dumping trace data Mathieu Poirier
2017-12-15 16:44   ` Mathieu Poirier
2017-12-15 16:44 ` [PATCH 05/10] perf tools: Add support for decoding CoreSight " Mathieu Poirier
2017-12-15 16:44   ` Mathieu Poirier
2017-12-30  0:33   ` Leo Yan
2017-12-30  0:33     ` Leo Yan
2018-01-09 12:09     ` Mike Leach
2018-01-09 12:09       ` Mike Leach
2018-01-10  5:59       ` Leo Yan
2018-01-10  5:59         ` Leo Yan
2018-01-10 20:16         ` Mathieu Poirier
2018-01-10 20:16           ` Mathieu Poirier
2017-12-15 16:44 ` [PATCH 06/10] perf tools: Add functionality to communicate with the openCSD decoder Mathieu Poirier
2017-12-15 16:44   ` Mathieu Poirier
2017-12-15 16:44 ` [PATCH 07/10] pert tools: Add queue management functionality Mathieu Poirier
2017-12-15 16:44   ` Mathieu Poirier
2017-12-15 16:44 ` [PATCH 08/10] perf tools: Add full support for CoreSight trace decoding Mathieu Poirier
2017-12-15 16:44   ` Mathieu Poirier
2017-12-15 16:44 ` [PATCH 09/10] perf tools: Add mechanic to synthesise CoreSight trace packets Mathieu Poirier
2017-12-15 16:44   ` Mathieu Poirier
2017-12-15 16:44 ` [PATCH 10/10] MAINTAINERS: Adding entry for CoreSight trace decoding Mathieu Poirier
2017-12-15 16:44   ` Mathieu Poirier
2017-12-30  0:51 ` [PATCH 00/10] perf tools: Add support " Leo Yan
2017-12-30  0:51   ` Leo Yan
2018-01-08 17:45   ` Mathieu Poirier
2018-01-08 17:45     ` Mathieu Poirier
2018-01-11  0:08 ` Kim Phillips
2018-01-11  0:08   ` Kim Phillips
2018-01-11 12:23   ` Mark Brown
2018-01-11 12:23     ` Mark Brown
2018-01-11 15:45     ` Mathieu Poirier
2018-01-11 15:45       ` Mathieu Poirier
2018-01-11 17:28       ` Kim Phillips
2018-01-11 17:28         ` Kim Phillips
2018-01-11 21:11         ` Mathieu Poirier
2018-01-11 21:11           ` Mathieu Poirier
2018-01-11 21:49           ` Kim Phillips
2018-01-11 21:49             ` Kim Phillips
2018-01-11 22:18             ` Mathieu Poirier
2018-01-11 22:18               ` Mathieu Poirier
2018-01-16 12:35               ` Mike Leach
2018-01-16 17:01                 ` Kim Phillips
2018-01-16 17:58                   ` Mathieu Poirier
2018-01-16 19:29                     ` Kim Phillips

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.