• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1HOWTO - using the library with perf   {#howto_perf}
2===================================
3
4@brief Using command line perf and OpenCSD to collect and decode trace.
5
6This HOWTO explains how to use the perf cmd line tools and the openCSD
7library to collect and extract program flow traces generated by the
8CoreSight IP blocks on a Linux system.  The examples have been generated using
9an aarch64 Juno-r0 platform.
10
11
12On Target Trace Acquisition - Perf Record
13-----------------------------------------
14
15Compile the perf tool from the same kernel source code version you are using with:
16
17	make -C tools/perf
18
19This will yield a `perf` executable that will support CoreSight trace collection.
20
21*Note:* If traces are to be decompressed **off** target, there is no need to download
22and compile the openCSD library (on the target).
23
24If you are instead planning to use perf to record and decode the trace on the target,
25compile the perf tool linking against the openCSD library, in the following way:
26
27	make -C tools/perf VF=1 CORESIGHT=1
28
29Further information on the needed build environments and options are detailed later
30in the section **Off Target Perf Tools Compilation**.
31
32Before launching a trace run a sink that will collect trace data needs to be
33identified.  All CoreSight blocks identified by the framework are registed in
34sysFS:
35
36
37    linaro@linaro-nano:~$ ls /sys/bus/coresight/devices/
38    etm0  etm2  etm4  etm6  funnel0  funnel2  funnel4      stm0      tmc_etr0
39    etm1  etm3  etm5  etm7  funnel1  funnel3  replicator0  tmc_etf0
40
41
42CoreSight blocks are listed in the device tree for a specific system and
43discovered at boot time.  Since tracers can be linked to more than one sink,
44the sink that will recieve trace data needs to be identified and given as an
45option on the perf command line.  Once a sink has been identify trace collection
46can start.  An easy and yet interesting example is the `uname` command:
47
48    linaro@linaro-nano:~/kernel$ ./tools/perf/perf record -e cs_etm/@tmc_etr0/ --per-thread uname
49
50This will generate a `perf.data` file where execution has been traced for both
51user and kernel space.  To narrow the field to either user or kernel space the
52`u` and `k` options can be specified.  For example the following will limit
53traces to user space:
54
55
56    linaro@linaro-nano:~/kernel$ ./tools/perf/perf record -vvv -e cs_etm/@tmc_etr0/u --per-thread uname
57    Problems setting modules path maps, continuing anyway...
58    -----------------------------------------------------------
59    perf_event_attr:
60      type                             8
61      size                             112
62      { sample_period, sample_freq }   1
63      sample_type                      IP|TID|IDENTIFIER
64      read_format                      ID
65      disabled                         1
66      exclude_kernel                   1
67      exclude_hv                       1
68      enable_on_exec                   1
69      sample_id_all                    1
70    ------------------------------------------------------------
71    sys_perf_event_open: pid 11375  cpu -1  group_fd -1  flags 0x8
72    ------------------------------------------------------------
73    perf_event_attr:
74      type                             1
75      size                             112
76      config                           0x9
77      { sample_period, sample_freq }   1
78      sample_type                      IP|TID|IDENTIFIER
79      read_format                      ID
80      disabled                         1
81      exclude_kernel                   1
82      exclude_hv                       1
83      mmap                             1
84      comm                             1
85      enable_on_exec                   1
86      task                             1
87      sample_id_all                    1
88      mmap2                            1
89      comm_exec                        1
90    ------------------------------------------------------------
91    sys_perf_event_open: pid 11375  cpu -1  group_fd -1  flags 0x8
92    mmap size 266240B
93    AUX area mmap length 131072
94    perf event ring buffer mmapped per thread
95    Synthesizing auxtrace information
96    Linux
97    auxtrace idx 0 old 0 head 0x11ea0 diff 0x11ea0
98    [ perf record: Woken up 1 times to write data ]
99    overlapping maps:
100     7f99daf000-7f99db0000 0 [vdso]
101     7f99d84000-7f99db3000 0 /lib/aarch64-linux-gnu/ld-2.21.so
102     7f99d84000-7f99daf000 0 /lib/aarch64-linux-gnu/ld-2.21.so
103     7f99db0000-7f99db3000 0 /lib/aarch64-linux-gnu/ld-2.21.so
104    failed to write feature 8
105    failed to write feature 9
106    failed to write feature 14
107    [ perf record: Captured and wrote 0.072 MB perf.data ]
108
109    linaro@linaro-nano:~/kernel$ ls -l ~/.debug/ perf.data
110    _-rw------- 1 linaro linaro 77888 Mar  2 20:41 perf.data
111
112    /home/linaro/.debug/:
113    total 16
114    drwxr-xr-x 2 linaro linaro 4096 Mar  2 20:40 [kernel.kallsyms]
115    drwxr-xr-x 2 linaro linaro 4096 Mar  2 20:40 [vdso]
116    drwxr-xr-x 3 linaro linaro 4096 Mar  2 20:40 bin
117    drwxr-xr-x 3 linaro linaro 4096 Mar  2 20:40 lib
118
119Trace data filtering
120--------------------
121The amount of traces generated by CoreSight tracers is staggering, event for
122the most simple trace scenario.  Reducing trace generation to specific areas
123of interest is desirable to save trace buffer space and avoid getting lost in
124the trace data that isn't relevant.  Supplementing the 'k' and 'u' options
125described above is the notion of address filters.
126
127On CoreSight two types of address filter have been implemented - address range
128and start/stop filter:
129
130**Address range filters:**
131With address range filters traces are generated if the instruction pointer
132falls within the specified range.  Any work done by the CPU outside of that
133range will not be traced.  Address range filters can be specified for both
134user and kernel space session:
135
136    perf record -e cs_etm/@tmc_etr0/k --filter 'filter 0xffffff8008562d0c/0x48' --per-thread uname
137
138    perf record -e cs_etm/@tmc_etr0/u --filter 'filter 0x72c/0x40@/opt/lib/libcstest.so.1.0' --per-thread ./main
139
140When dealing with kernel space trace addresses are typically taken in the
141'System.map' file.  In user space addresses are relocatable and can be
142extracted from an objdump output:
143
144    $ aarch64-linux-gnu-objdump  -d libcstest.so.1.0
145    ...
146    ...
147    000000000000072c <coresight_test1>:		<------------ Beginning of traces
148     72c:	d10083ff 	sub	sp, sp, #0x20
149     730:	b9000fe0 	str	w0, [sp,#12]
150     734:	b9001fff 	str	wzr, [sp,#28]
151     738:	14000007 	b	754 <coresight_test1+0x28>
152     73c:	b9400fe0 	ldr	w0, [sp,#12]
153     740:	11000800 	add	w0, w0, #0x2
154     744:	b9000fe0 	str	w0, [sp,#12]
155     748:	b9401fe0 	ldr	w0, [sp,#28]
156     74c:	11000400 	add	w0, w0, #0x1
157     750:	b9001fe0 	str	w0, [sp,#28]
158     754:	b9401fe0 	ldr	w0, [sp,#28]
159     758:	7100101f 	cmp	w0, #0x4
160     75c:	54ffff0d 	b.le	73c <coresight_test1+0x10>
161     760:	b9400fe0 	ldr	w0, [sp,#12]
162     764:	910083ff 	add	sp, sp, #0x20
163     768:	d65f03c0 	ret
164    ...
165    ...
166
167Following the address the amount of byte is specified and if tracing in user
168space, the full path to the binary (or library) being traced.
169
170**Start/Stop filters:**
171With start/stop filters traces are generated when the instruction pointer is
172equal to the start address.  Incidentally traces stop being generated when the
173insruction pointer is equal to the stop address.  Anything that happens between
174there to events is traced:
175
176    perf record -e cs_etm/@tmc_etr0/k --filter 'start 0xffffff800856bc50,stop 0xffffff800856bcb0' --per-thread  uname
177
178    perf record -vvv -e cs_etm/@tmc_etr0/u --filter 'start 0x72c@/opt/lib/libcstest.so.1.0,    \
179                                                         stop 0x40082c@/home/linaro/main'          \
180                                                     --per-thread ./main
181
182**Limitation on address filters:**
183The only limitation on address filters is the amount of address comparator
184found on an implementation and the mutual exclusion between range and
185start stop filters.  As such the following example would _not_ work:
186
187    perf record -e cs_etm/@tmc_etr0/k --filter 'start 0xffffff800856bc50,stop 0xffffff800856bcb0, \  // start/stop
188                                                    filter 0x72c/0x40@/opt/lib/libcstest.so.1.0'      \  // address range
189                                                    --per-thread  uname
190
191Additional Trace Options
192------------------------
193Additional options can be used during trace collection that add information to the captured trace.
194
195- Timestamps: These packets are added to the trace streams to allow correlation of different sources where tools support this.
196- Cycle Counts: These packets are added to get a count of cycles for blocks of executed instructions. Adding cycle counts will considerably increase the amount of generated trace.
197The relationship between cycle counts and executed instructions differs according to the trace protocol.
198For example, the ETMv4 protocol will emit counts for groups of instructions according to a minimum count threshold.
199Presently this threshold is fixed at 256 cycles for `perf record`.
200
201Command line options in `perf record` to use these features are part of the options for the `cs_etm` event:
202
203    perf record -e cs_etm/timestamp,cycacc,@tmc_etr0/ --per-thread uname
204
205At current version,  `perf record` and `perf script` do not use this additional information.
206
207The cs_etm perf event
208---------------------
209
210System information for this perf pmu event can be found at:
211
212	/sys/devices/cs_etm
213
214This contains internal format of the parameters described above:
215
216	root@linaro-developer:~# ls /sys/devices/cs_etm/format
217	contextid  cycacc  retstack  sinkid  timestamp
218
219and names of registered sinks:
220
221	root@linaro-developer:~# ls /sys/devices/cs_etm/sinks
222	tmc_etf0  tmc_etr0  tpiu0
223
224Note: The `sinkid` parameter is there to document the usage of a 32-bit internal parameter to
225pass the sink name used in the cs_etm/@sink/ command to the kernel drivers. It can be used
226directly as cs_etm/sinkid=<hash_value>/ but this is not recommended as the values used are
227considered opaque and subject to changes.
228
229On Target Trace Collection
230--------------------------
231The entire program flow will have been recorded in the `perf.data` file.
232Information about libraries and executable is stored under `$HOME/.debug`:
233
234    linaro@linaro-nano:~/kernel$ tree ~/.debug
235    .debug
236    ├── [kernel.kallsyms]
237    │   └── 0542921808098d591a7acba5a1163e8991897669
238    │       └── kallsyms
239    ├── [vdso]
240    │   └── 551fbbe29579eb63be3178a04c16830b8d449769
241    │       └── vdso
242    ├── bin
243    │   └── uname
244    │       └── ed95e81f97c4471fb2ccc21e356b780eb0c92676
245    │           └── elf
246    └── lib
247        └── aarch64-linux-gnu
248            ├── ld-2.21.so
249            │   └── 94912dc5a1dc8c7ef2c4e4649d4b1639b6ebc8b7
250            │       └── elf
251            └── libc-2.21.so
252                └── 169a143e9c40cfd9d09695333e45fd67743cd2d6
253                    └── elf
254
255    13 directories, 5 files
256    linaro@linaro-nano:~/kernel$
257
258
259All this information needs to be collected in order to successfully decode
260traces off target:
261
262    linaro@linaro-nano:~/kernel$ tar czf uname.trace.tgz perf.data ~/.debug
263
264
265Note that file `vmlinux` should also be added to the bundle if kernel traces
266have also been collected.
267
268
269Off Target OpenCSD Compilation
270------------------------------
271The openCSD library is not part of the perf tools.  It is available on
272[github][1] and needs to be compiled before the perf tools. Checkout the
273required branch/tag version into a local directory.
274
275    linaro@t430:~/linaro/coresight$ git clone https://github.com/Linaro/OpenCSD.git my-opencsd
276    Cloning into 'OpenCSD'...
277    remote: Counting objects: 2063, done.
278    remote: Total 2063 (delta 0), reused 0 (delta 0), pack-reused 2063
279    Receiving objects: 100% (2063/2063), 2.51 MiB | 1.24 MiB/s, done.
280    Resolving deltas: 100% (1399/1399), done.
281    Checking connectivity... done.
282    linaro@t430:~/linaro/coresight$ ls my-opencsd
283    decoder LICENSE  README.md HOWTO.md TODO
284
285Once the source code has been acquired compilation of the openCSD library can
286take place.  For Linux two options are available, LINUX and LINUX64, based on
287the host's (which has nothing to do with the target) architecture:
288
289    linaro@t430:~/linaro/coresight/$ cd my-opencsd/decoder/build/linux/
290    linaro@t430:~/linaro/coresight/my-opencsd/decoder/build/linux$ ls
291    makefile  rctdl_c_api_lib  ref_trace_decode_lib
292
293    linaro@t430:~/linaro/coresight/my-opencsd/decoder/build/linux$ make LINUX64=1 DEBUG=1
294    ...
295    ...
296
297    linaro@t430:~/linaro/coresight/my-opencsd/decoder/build/linux$ ls ../../lib/linux64/dbg/
298    libopencsd.a  libopencsd_c_api.a  libopencsd_c_api.so  libopencsd.so
299
300From there the header file and libraries need to be installed on the system,
301something that requires root privileges.  The default installation path is
302/usr/include/opencsd for the header files and /usr/lib/ for the libraries:
303
304    linaro@t430:~/linaro/coresight/my-opencsd/decoder/build/linux$ sudo make install
305    linaro@t430:~/linaro/coresight/my-opencsd/decoder/build/linux$ ls -l /usr/include/opencsd
306    total 60
307    drwxr-xr-x 2 root root  4096 Dec 12 10:19 c_api
308    drwxr-xr-x 2 root root  4096 Dec 12 10:19 etmv3
309    drwxr-xr-x 2 root root  4096 Dec 12 10:19 etmv4
310    -rw-r--r-- 1 root root 28049 Dec 12 10:19 ocsd_if_types.h
311    drwxr-xr-x 2 root root  4096 Dec 12 10:19 ptm
312    drwxr-xr-x 2 root root  4096 Dec 12 10:19 stm
313    -rw-r--r-- 1 root root  7264 Dec 12 10:19 trc_gen_elem_types.h
314    -rw-r--r-- 1 root root  3972 Dec 12 10:19 trc_pkt_types.h
315
316    linaro@t430:~/linaro/coresight/my-opencsd/decoder/build/linux$ ls -l /usr/lib/libopencsd*
317    -rw-r--r-- 1 root root  598720 Dec 12 10:19 /usr/lib/libopencsd_c_api.so
318    -rw-r--r-- 1 root root 4692200 Dec 12 10:19 /usr/lib/libopencsd.so
319
320A "clean_install" target is also available so that openCSD installed files can
321be removed from a system.  Going forward the goal is to have the openCSD library
322packaged as a Debian or RPM archive so that it can be installed from a
323distribution without having to be compiled.
324
325
326Off Target Perf Tools Compilation
327---------------------------------
328
329As mentioned above the openCSD library is not part of the perf tools' code base
330and needs to be installed on a system prior to compilation.  Information about
331the status of the openCSD library on a system is given at compile time by the
332perf tools build script:
333
334    linaro@t430:~/linaro/linux-kernel$ make CORESIGHT=1 VF=1 -C tools/perf
335    Auto-detecting system features:
336    ...                         dwarf: [ on  ]
337    ...            dwarf_getlocations: [ on  ]
338    ...                         glibc: [ on  ]
339    ...                          gtk2: [ on  ]
340    ...                      libaudit: [ on  ]
341    ...                        libbfd: [ OFF ]
342    ...                        libelf: [ on  ]
343    ...                       libnuma: [ OFF ]
344    ...        numa_num_possible_cpus: [ OFF ]
345    ...                       libperl: [ on  ]
346    ...                     libpython: [ on  ]
347    ...                      libslang: [ on  ]
348    ...                     libcrypto: [ on  ]
349    ...                     libunwind: [ OFF ]
350    ...            libdw-dwarf-unwind: [ on  ]
351    ...                          zlib: [ on  ]
352    ...                          lzma: [ OFF ]
353    ...                     get_cpuid: [ on  ]
354    ...                           bpf: [ on  ]
355    ...                    libopencsd: [ on  ]  <-------
356
357
358At the end of the compilation a new perf binary is available in `tools/perf/`:
359
360    linaro@t430:~/linaro/linux-kernel$ ldd tools/perf/perf
361	linux-vdso.so.1 =>  (0x00007fff135db000)
362	libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f15f9176000)
363	librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f15f8f6e000)
364	libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f15f8c64000)
365	libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f15f8a60000)
366	libopencsd_c_api.so => /usr/lib/libopencsd_c_api.so (0x00007f15f884e000)   <-------
367	libelf.so.1 => /usr/lib/x86_64-linux-gnu/libelf.so.1 (0x00007f15f8635000)
368	libdw.so.1 => /usr/lib/x86_64-linux-gnu/libdw.so.1 (0x00007f15f83ec000)
369	libaudit.so.1 => /lib/x86_64-linux-gnu/libaudit.so.1 (0x00007f15f81c5000)
370	libslang.so.2 => /lib/x86_64-linux-gnu/libslang.so.2 (0x00007f15f7e38000)
371	libperl.so.5.22 => /usr/lib/x86_64-linux-gnu/libperl.so.5.22 (0x00007f15f7a5d000)
372	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f15f7693000)
373	libpython2.7.so.1.0 => /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0 (0x00007f15f7104000)
374	libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f15f6eea000)
375	/lib64/ld-linux-x86-64.so.2 (0x0000559b88038000)
376	libopencsd.so => /usr/lib/libopencsd.so (0x00007f15f6c62000)    <-------
377	libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f15f68df000)
378	libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f15f66c9000)
379	liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00007f15f64a6000)
380	libbz2.so.1.0 => /lib/x86_64-linux-gnu/libbz2.so.1.0 (0x00007f15f6296000)
381	libcrypt.so.1 => /lib/x86_64-linux-gnu/libcrypt.so.1 (0x00007f15f605e000)
382	libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00007f15f5e5a000)
383
384
385Additional debug output from the decoder can be compiled in by setting the
386`CSTRACE_RAW` environment variable. Setting this to `packed` gets trace frame
387output as follows:-
388
389    Frame Data; Index    576;    RAW_PACKED; d6 d6 d6 d6 d6 d6 d6 d6 fc fb d6 d6 d6 d6 e0 7f
390    Frame Data; Index    576;   ID_DATA[0x14]; d7 d6 d7 d6 d7 d6 d7 d6 fd fb d7 d6 d7 d6 e0
391
392Set to any other value will remove the RAW_PACKED lines.
393
394Working with an alternate version of the openCSD library
395--------------------------------------------------------
396When compiling the perf tools it is possible to reference another version of
397the openCSD library than the one installed on the system.  This is useful when
398working with multiple development trees or having the desire to keep system
399libraries intact.  Two environment variable are available to tell the perf tools
400build script where to get the header file and libraries, namely CSINCLUDES and
401CSLIBS:
402
403    linaro@t430:~/linaro/linux-kernel$ export CSINCLUDES=~/linaro/coresight/my-opencsd/decoder/include/
404    linaro@t430:~/linaro/linux-kernel$ export CSLIBS=~/linaro/coresight/my-opencsd/decoder/lib/builddir/
405    linaro@t430:~/linaro/linux-kernel$ make CORESIGHT=1 VF=1 -C tools/perf
406
407This will have the effect of compiling and linking against the provided library.
408Since the system's openCSD library is in the loader's search patch the
409LD_LIBRARY_PATH environment variable needs to be set.
410
411    linaro@t430:~/linaro/linux-kernel$ export LD_LIBRARY_PATH=$CSLIBS
412
413
414Trace Decoding with Perf Report
415-------------------------------
416Before working with custom traces it is suggested to use a trace bundle that
417is known to be working properly.  A sample bundle has been made available
418here [2].  Trace bundles can be extracted anywhere and have no dependencies on
419where the perf tools and openCSD library have been compiled.
420
421    linaro@t430:~/linaro/coresight$ mkdir sept20
422    linaro@t430:~/linaro/coresight$ cd sept20
423    linaro@t430:~/linaro/coresight/sept20$ wget http://people.linaro.org/~mathieu.poirier/openCSD/uname.v4.user.sept20.tgz
424    linaro@t430:~/linaro/coresight/sept20$ md5sum uname.v4.user.sept20.tgz
425    f53f11d687ce72bdbe9de2e67e960ec6  uname.v4.user.sept20.tgz
426    linaro@t430:~/linaro/coresight/sept20$ tar xf uname.v4.user.sept20.tgz
427    linaro@t430:~/linaro/coresight/sept20$ ls -la
428    total 1312
429    drwxrwxr-x 3 linaro linaro    4096 Mar  3 10:26 .
430    drwxrwxr-x 5 linaro linaro    4096 Mar  3 10:13 ..
431    drwxr-xr-x 7 linaro linaro    4096 Feb 24 12:21 .debug
432    -rw------- 1 linaro linaro   78016 Feb 24 12:21 perf.data
433    -rw-rw-r-- 1 linaro linaro 1245881 Feb 24 12:25 uname.v4.user.sept20.tgz
434
435Perf is expecting files related to the trace capture (`perf.data`) to be located in the `buildid` directory.
436By default this is under `~/.debug`.  Alternatively the default `buildid` directory can be changed
437using the command:
438
439     perf config --system buildid.dir=/my/own/buildid/dir
440
441This example will remove the current `~/.debug` directory to be sure everything is clean.
442
443    linaro@t430:~/linaro/coresight/sept20$ rm -rf ~/.debug
444    linaro@t430:~/linaro/coresight/sept20$ cp -dpR .debug ~/
445    linaro@t430:~/linaro/coresight/sept20$ ../perf-opencsd-master/tools/perf/perf report --stdio
446
447    # To display the perf.data header info, please use --header/--header-only options.
448    #
449    #
450    # Total Lost Samples: 0
451    #
452    # Samples: 0  of event 'cs_etm//u'
453    # Event count (approx.): 0
454    #
455    # Children      Self  Command  Shared Object  Symbol
456    # ........  ........  .......  .............  ......
457    #
458
459
460    # Samples: 0  of event 'dummy:u'
461    # Event count (approx.): 0
462    #
463    # Children      Self  Command  Shared Object  Symbol
464    # ........  ........  .......  .............  ......
465    #
466
467
468    # Samples: 115K of event 'instructions:u'
469    # Event count (approx.): 522009
470    #
471    # Children      Self  Command  Shared Object     Symbol
472    # ........  ........  .......  ................  ......................
473    #
474         4.13%     4.13%  uname    libc-2.21.so      [.] 0x0000000000078758
475         3.81%     3.81%  uname    libc-2.21.so      [.] 0x0000000000078e50
476         2.06%     2.06%  uname    libc-2.21.so      [.] 0x00000000000fcaf4
477         1.65%     1.65%  uname    libc-2.21.so      [.] 0x00000000000fcae4
478         1.59%     1.59%  uname    ld-2.21.so        [.] 0x000000000000a7f4
479         1.50%     1.50%  uname    libc-2.21.so      [.] 0x0000000000078e40
480         1.43%     1.43%  uname    libc-2.21.so      [.] 0x00000000000fcac4
481         1.31%     1.31%  uname    libc-2.21.so      [.] 0x000000000002f0c0
482         1.26%     1.26%  uname    ld-2.21.so        [.] 0x0000000000016888
483         1.24%     1.24%  uname    libc-2.21.so      [.] 0x0000000000078e7c
484         1.24%     1.24%  uname    libc-2.21.so      [.] 0x00000000000fcab8
485    ...
486
487Additional data can be obtained, which contains a dump of the trace packets received using the command
488
489    mjl@ubuntu-vbox:./perf-opencsd-master/coresight/tools/perf/perf report --stdio --dump
490
491resulting a large amount of data, trace looking like:-
492
493    0x618 [0x30]: PERF_RECORD_AUXTRACE size: 0x11ef0  offset: 0  ref: 0x4d881c1f13216016  idx: 0  tid: 15244  cpu: -1
494
495    . ... CoreSight ETM Trace data: size 73456 bytes
496
497      0: I_ASYNC : Alignment Synchronisation.
498      12: I_TRACE_INFO : Trace Info.
499      17: I_TRACE_ON : Trace On.
500      18: I_ADDR_CTXT_L_64IS0 : Address & Context, Long, 64 bit, IS0.; Addr=0x0000007F89F24D80; Ctxt: AArch64,EL0, NS;
501      28: I_ATOM_F6 : Atom format 6.; EEEEEEEEEEEEEEEEEEEEEEEE
502      29: I_ATOM_F6 : Atom format 6.; EEEEEEEEEEEEEEEEEEEEEEEE
503      30: I_ATOM_F6 : Atom format 6.; EEEEEEEEEEEEEEEEEEEEEEEE
504      32: I_ATOM_F6 : Atom format 6.; EEEEN
505      33: I_ATOM_F1 : Atom format 1.; E
506      34: I_EXCEPT : Exception.;  Data Fault; Ret Addr Follows;
507      36: I_ADDR_L_64IS0 : Address, Long, 64 bit, IS0.; Addr=0x0000007F89F2832C;
508      45: I_ADDR_CTXT_L_64IS0 : Address & Context, Long, 64 bit, IS0.; Addr=0xFFFFFFC000083400; Ctxt: AArch64,EL1, NS;
509      56: I_TRACE_ON : Trace On.
510      57: I_ADDR_CTXT_L_64IS0 : Address & Context, Long, 64 bit, IS0.; Addr=0x0000007F89F2832C; Ctxt: AArch64,EL0, NS;
511      68: I_ATOM_F3 : Atom format 3.; NEE
512      69: I_ATOM_F3 : Atom format 3.; NEN
513      70: I_ATOM_F3 : Atom format 3.; NNE
514      71: I_ATOM_F5 : Atom format 5.; ENENE
515      72: I_ATOM_F5 : Atom format 5.; NENEN
516      73: I_ATOM_F5 : Atom format 5.; ENENE
517      74: I_ATOM_F5 : Atom format 5.; NENEN
518      75: I_ATOM_F5 : Atom format 5.; ENENE
519      76: I_ATOM_F3 : Atom format 3.; NNE
520      77: I_ATOM_F3 : Atom format 3.; NNE
521      78: I_ATOM_F3 : Atom format 3.; NNE
522      80: I_ATOM_F3 : Atom format 3.; NNE
523      81: I_ATOM_F3 : Atom format 3.; ENN
524      82: I_EXCEPT : Exception.;  Data Fault; Ret Addr Follows;
525      84: I_ADDR_L_64IS0 : Address, Long, 64 bit, IS0.; Addr=0x0000007F89F283F0;
526      93: I_ADDR_CTXT_L_64IS0 : Address & Context, Long, 64 bit, IS0.; Addr=0xFFFFFFC000083400; Ctxt: AArch64,EL1, NS;
527      104: I_TRACE_ON : Trace On.
528      105: I_ADDR_CTXT_L_64IS0 : Address & Context, Long, 64 bit, IS0.; Addr=0x0000007F89F283F0; Ctxt: AArch64,EL0, NS;
529      116: I_ATOM_F5 : Atom format 5.; NNNNN
530      117: I_ATOM_F5 : Atom format 5.; NNNNN
531
532
533Trace Decoding with Perf Script
534-------------------------------
535Working with perf scripts needs more command line options but yields
536interesting results.
537
538    linaro@t430:~/linaro/coresight/sept20$ export EXEC_PATH=/home/linaro/coresight/perf-opencsd-master/tools/perf/
539    linaro@t430:~/linaro/coresight/sept20$ export SCRIPT_PATH=$EXEC_PATH/scripts/python/
540    linaro@t430:~/linaro/coresight/sept20$ export XTOOL_PATH=/your/aarch64/toolchain/path/bin/
541    linaro@t430:~/linaro/coresight/sept20$ ../perf-opencsd-master/tools/perf/perf --exec-path=${EXEC_PATH} script --script=python:${SCRIPT_PATH}/cs-trace-disasm.py -- -d ${XTOOL_PATH}/aarch64-linux-gnu-objdump
542
543              7f89f24d80:   910003e0        mov     x0, sp
544              7f89f24d84:   94000d53        bl      7f89f282d0 <free@plt+0x3790>
545              7f89f282d0:   d11203ff        sub     sp, sp, #0x480
546              7f89f282d4:   a9ba7bfd        stp     x29, x30, [sp,#-96]!
547              7f89f282d8:   910003fd        mov     x29, sp
548              7f89f282dc:   a90363f7        stp     x23, x24, [sp,#48]
549              7f89f282e0:   9101e3b7        add     x23, x29, #0x78
550              7f89f282e4:   a90573fb        stp     x27, x28, [sp,#80]
551              7f89f282e8:   a90153f3        stp     x19, x20, [sp,#16]
552              7f89f282ec:   aa0003fb        mov     x27, x0
553              7f89f282f0:   910a82e1        add     x1, x23, #0x2a0
554              7f89f282f4:   a9025bf5        stp     x21, x22, [sp,#32]
555              7f89f282f8:   a9046bf9        stp     x25, x26, [sp,#64]
556              7f89f282fc:   910102e0        add     x0, x23, #0x40
557              7f89f28300:   f800841f        str     xzr, [x0],#8
558              7f89f28304:   eb01001f        cmp     x0, x1
559              7f89f28308:   54ffffc1        b.ne    7f89f28300 <free@plt+0x37c0>
560              7f89f28300:   f800841f        str     xzr, [x0],#8
561              7f89f28304:   eb01001f        cmp     x0, x1
562              7f89f28308:   54ffffc1        b.ne    7f89f28300 <free@plt+0x37c0>
563              7f89f28300:   f800841f        str     xzr, [x0],#8
564              7f89f28304:   eb01001f        cmp     x0, x1
565              7f89f28308:   54ffffc1        b.ne    7f89f28300 <free@plt+0x37c0>
566
567Kernel Trace Decoding
568---------------------
569
570When dealing with kernel space traces the vmlinux file has to be communicated
571explicitely to perf using the "--vmlinux" command line option:
572
573    linaro@t430:~/linaro/coresight/sept20$ ../perf-opencsd-master/tools/perf/perf report --stdio --vmlinux=./vmlinux
574    ...
575    ...
576    linaro@t430:~/linaro/coresight/sept20$ ../perf-opencsd-master/tools/perf/perf script --vmlinux=./vmlinux
577
578When using scripts things get a little more convoluted.  Using the same example
579an above but for traces but for kernel traces, the command line becomes:
580
581    linaro@t430:~/linaro/coresight/sept20$ export EXEC_PATH=/home/linaro/coresight/perf-opencsd-master/tools/perf/
582    linaro@t430:~/linaro/coresight/sept20$ export SCRIPT_PATH=$EXEC_PATH/scripts/python/
583    linaro@t430:~/linaro/coresight/sept20$ export XTOOL_PATH=/your/aarch64/toolchain/path/bin/
584    linaro@t430:~/linaro/coresight/sept20$ ../perf-opencsd-master/tools/perf/perf --exec-path=${EXEC_PATH} script	\
585							--vmlinux=./vmlinux					\
586							--script=python:${SCRIPT_PATH}/cs-trace-disasm.py --	\
587							-d ${XTOOLS_PATH}/aarch64-linux-gnu-objdump		\
588							-k ./vmlinux
589    ...
590    ...
591
592The option "--vmlinux=./vmlinux" is interpreted by the "perf script" command
593the same way it if for "perf report".  The option "-k ./vmlinux" is dependant
594on the script being executed and has no related to the "--vmlinux", though it
595is highly advised to keep them synchronized.
596
597
598Perf Test Environment Scripts
599-----------------------------
600
601The decoder library comes with a number of `bash` scripts that ease the setting up of the
602offline build and test environment for perf, and executing tests.
603
604These scripts can be found in
605
606    decoder/tests/perf-test-scripts
607
608There are three scripts provided:
609
610- `perf-setup-env.bash`    : this sets up all the environment variables mentioned above.
611- `perf-test-report.bash`  : this runs `perf report` - using the environment setup by `perf-setup-env.bash`
612- `perf-test-script.bash`  : this runs `perf script` - using the environment setup by `perf-setup-env.bash`
613
614Use as follows:-
615
6161. Prior to building perf, edit `perf-setup-env.bash` to conform to your environment. There are four lines at the top of the file that will require editing.
617
6182. Execute the script using the command:
619
620        source perf-setup-env.bash
621
622   This will set up a perf execute environment for using the perf report and script commands.
623
624   Alternatively use the command:
625
626		source perf-setup-env.base buildenv
627
628   This will add in the build environment variables mentioned in the sections on building above alongside the
629   environment for using the used by the `perf-test...` scripts to run the tests.
630
6313. Build perf as described above.
6324. Follow the instructions for downloading the test capture, or create a capture from your target.
6335. Copy the `perf-test...` scripts into the capture data directory -> the one that contains `perf.data`.
634
6356. The scripts can now be run. No options are required for the default operation, but any command line options will be added to the perf report / perf script command line.
636
637e.g.
638
639        ./perf-test-report.bash --dump
640
641will add the --dump option to the end of the command line and run
642
643        ${PERF_EXEC_PATH}/perf report --stdio --dump
644
645
646Generating coverage files for Feedback Directed Optimization: AutoFDO
647---------------------------------------------------------------------
648
649See autofdo.md (@ref AutoFDO) for details and scripts.
650
651
652The Linaro CoreSight Team
653-------------------------
654- Mike Leach
655- Mathieu Poirier
656
657
658One Last Thing
659--------------
660We welcome help on this project.  If you would like to add features or help
661improve the way things work, we want to hear from you.
662
663Best regards,
664*The Linaro CoreSight Team*
665
666--------------------------------------
667[1]: https://github.com/Linaro/OpenCSD
668
669[2]: http://people.linaro.org/~mathieu.poirier/openCSD/uname.v4.user.sept20.tgz
670