aboutsummaryrefslogtreecommitdiff
path: root/decoder/docs/test_progs.md
blob: dd8c7a9293852f1ca828f8aa2e653f26f8676774 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
Test Programs    {#test_progs}
=============

@brief A description of the test programs used with the library.

The Programs
------------

There are currently a number test programs built alongside the library.

__Principle Test Programs__

- `trc_pkt_lister`:

This tests the C++ library by taking a trace "snapshot" directory as an input and decodes all
or a chosen set of trace sources from within the trace data buffers in the library. Command
line parameters allow the test program to be controlled.

Users may also run this program on their own trace snapshots to investigate or validate trace from their platforms.

The program may be installed alongside the library onto linux systems, using `make install` from the library build
directories. This will be installed alongside a `man` file containing relevant user options.

- `c_api_pkt_print_test`:

This program tests the "C" API functions, using hardcoded tests based on the same "snapshots" used
for the C++ library. Limited user control for this program.

This can also run tests using the external test decoder library to validate the external decoder API. 
See [external_custom.md](@ref custom_decoders) for details.

__Development Utilities__

These are small utilities, primarily used during the development and test of the decoder library.

- `mem-acc-test`           : tests the memory accessor interfaces.
- `mem-buffer-eg`          : example using a memory buffer input to the library.
- `frame-demux-test`       : tests the library CoreSight Frame demux object.
- `ocsd-perr`              : quickly list the library error codes and descriptions.

__Build and Install__

All the test programs are built at the same time as the library for the same set of platforms.
See [build_libs.md](@ref build_lib) for build details.

Only `trc_pkt_lister` will be installed alongside the library.


Trace "Snapshot" directory.
----------------------------

The `.\tests\snapshots` and `.\tests\snapshots-ete` directories contain a number of trace snapshots
used for testing the library.

Trace snapshots are dumps of captured binary trace data, CoreSight component configurations and memory 
dumps to allow trace decode.

Snapshots are generated on ARM targets and can then be analysed offline. 

__Snapshot Specification__

The principal snapshot format is available in a separate document in
`.\docs\specs\ARM Trace and Debug Snapshot file format 0v2.pdf`.

The programs above use the library's [core name mapper helper class] (@ref CoreArchProfileMap) to map 
the name of the core into a profile / architecture pair that the library can use. 

The snapshot definition must use one of the names recognised by this class, or alternatively use an approved
profile / architecture profile pattern string as defined below.

There are extensions to this specification, reflecting recent architectural changes.

**Dump File Section Space Format**

The dump file section in device .ini files can define a memory space associated with the file.
This is done using the `space` keyword. Omitting this keyword with cause the test programs to assume 
that the file applies to all memory spaces enccountered in the trace stream

For complex systems, the same virtual addresses may have differing contents in differing memory spaces.
The library has extended the memory space names defined in the current specification version to include 
new names for the Realm and Root memory spaces.

Mappings of names to spaces is used as follows :
    - `EL1S` : maps file to EL1 / EL0 secure states.
    - `EL2S` : maps file to EL2 secure state.
    - `EL3`  : maps file to EL3 secure state.
    - `EL1N` : maps file to EL1 / EL0 non-secure state.
    - `EL2` or `EL2N` : maps file to EL2 non-secure state.
    - `EL1R` : maps file to EL1 / EL0 Realm state.
    - `EL2R` : maps file to EL2 Realm state.
    - `ROOT` : maps file to Root state.
    - `S` : maps file to all secure states.
    - `N` : maps file to all non-secure states.
    - `R` : maps file to all Realm states.
    - `ANY` : maps file to all security states. This is default if the `space` keyword is omitted.


e.g. - Dump section examples with differing memory space definitions.

   - dump 1 & 2 overlap in address but are in different memory spaces.
   - dump 1 & 3 cover the same memory space, but do not overlap in address.
   - dump 4 covers all memory spaces but does not overlap in address with any of the other dumps.

~~~~~~~~~~~~~~~~
[dump1]
file=bindir_64ns/OTHERS_exec
address=0x00060000
length=0x21388
space=N

[dump2]
file=bindir_64rt/OTHERS_exec
address=0x00060000
length=0x21388
space=ROOT

[dump3]
file=bindir_64ns/VAL_NON_DET_CODE_exec
address=0x00010000
length=0x24bf4
space=EL1N

[dump4]
file=bindir_64ns/TEST_NON_DET_CODE_exec
address=0x00050000
length=0x26c
~~~~~~~~~~~~~~~~

**Profile / Architecture pattern string**

Where a specific core name is not used - then a profile / architecture pattern string may be used.
This enables trace generated on cores with names not in the library to be decoded by the test programs.

Pattern strings can be of the form:

`ARMvM[.m]-P` : 
    - ARMv   : fixed prefix
    - M      : architecture major version number 7-9.
    - .m     : optional minor version number
    - -P     : profile type, one of -A, -R or -M


e.g. `ARMv8.3-A`  , `ARMv7-M`

This format can be used for any ARMv7 / ARMv8 core - including ARM Cortex cores where the name is 
not one of those mapped in the library.


`ARM-{aa|AA}64[-P]` :
    - ARM-   : fixed prefix
    - aa64 or AA64 : indicator for aarch64
    - -P : optional profile - one of -R or -M, if missing A profile is assumed.

e.g. `ARM-aa64` , `ARM-AA64-R`

This format can be used for all Arm v9 architecture cores.


The `trc_pkt_lister` program.
-----------------------------

This will take a snapshot directory as an input, and lists and/or
decodes all the trace packets from a given trace sink, for any source in
that sink where the protocol is supported.

The output will be a list of discrete packets, generic output packets and any error messages
to file and/or screen as selected by the input command line options.

By default the program will list packets only (no decode), for the first discovered trace sink
(ETB, ETF, ETR) in the snapshot directory, with all source streams output.

__Command Line Options__

*Snapshot selection*

- `-ss_dir <dir>` : Set the directory path to a trace snapshot.
- `-ss_verbose`   : Verbose output when reading the snapshot.

*Decode options*

- `-id <n>`          : Set an ID to list (may be used multiple times) - default if no id set is for all IDs to be printed.
- `-src_name <name>` : List packets from a given snapshot source name - e.g ETB_0. (defaults to first source found).
- `-multi_session`   : Decode all buffers listed in snapshot under `buffers` key in `trace.ini`. Uses config of first 
                       buffer to decode all. Ignored if `-src_name` is used.
- `-dstream_format`  : Input is DSTREAM framed.
- `-tpiu`            : Input data is from a TPIU source that has TPIU FSYNC packets present.
- `-tpiu_hsync`      : Input data is from a TPIU source that has both TPIU FSYNC and HSYNC packets present.
- `-decode`          : Full decode of the packets from the trace snapshot (default is to list undecoded packets only.
- `-decode_only`     : Does not list the undecoded packets, just the trace decode.
- `-src_addr_n`      : ETE protocol; Indicate skipped N atoms in source address packet ranges by breaking the decode 
                       range into multiple ranges of N atoms.
- `-o_raw_packed`    : Output raw packed trace frames.
- `-o_raw_unpacked`  : Output raw unpacked trace data per ID.
- `-stats`           : Output packet processing statistics (if available).

*Output options*

Default is to output to file and stdout. Setting any option overrides and limits to only
the options set.
- `-logstdout`          : output to stdout.
- `-logstderr`          : output to stderr.
- `-logfile`            : output to file using the default log file name.
- `-logfilename <name>` : change the name of the output log file.

*Library Development options*

Options that are only useful if developing or testing the OpenCSD library.

- `-test_waits <N>`  : Force wait from packet printer for N packets - test the wait/flush mechanisms for the decoder.
- `-profile`         : Mute logging output while profiling library performance.
- `-macc_cache_disable` : Switch off caching on memory accessor.
- `-macc_cache_p_size`  : Set size of caching pages.
- `-macc_cache_p_num`   : Set number of caching pages.

__Test output examples__

Example command lines with short output excerpts.

*TC2, ETMv3 packet processor output, raw packet output.*

Command line:-
`trc_pkt_lister -ss_dir ..\..\..\snapshots\TC2 -o_raw_unpacked`

~~~~~~~~~~~~~~~~
Frame Data; Index  17958; ID_DATA[0x11]; 16 04 c0 86 42 97 e1 c4 
Idx:17945; ID:11;	I_SYNC : Instruction Packet synchronisation.; (Periodic); Addr=0xc00416e2; S;  ISA=Thumb2; 
Idx:17961; ID:11;	P_HDR : Atom P-header.; WEN; Cycles=1
Frame Data; Index  17968; ID_DATA[0x11]; ce af 90 80 80 00 a4 84 a0 84 a4 88 
Idx:17962; ID:11;	TIMESTAMP : Timestamp Value.; TS=0x82f9d13097 (562536984727) 
Idx:17974; ID:11;	P_HDR : Atom P-header.; WW; Cycles=2
Idx:17975; ID:11;	P_HDR : Atom P-header.; WE; Cycles=1
Idx:17976; ID:11;	P_HDR : Atom P-header.; W; Cycles=1
Idx:17977; ID:11;	P_HDR : Atom P-header.; WE; Cycles=1
Idx:17978; ID:11;	P_HDR : Atom P-header.; WW; Cycles=2
Idx:17979; ID:11;	P_HDR : Atom P-header.; WEWE; Cycles=2
Frame Data; Index  17980; ID_DATA[0x10]; a0 82 
Idx:17980; ID:10;	P_HDR : Atom P-header.; W; Cycles=1
Idx:17981; ID:10;	P_HDR : Atom P-header.; WEE; Cycles=1
Frame Data; Index  17984; ID_DATA[0x10]; b8 84 a4 88 a0 82 
Idx:17984; ID:10;	P_HDR : Atom P-header.; WWWWWWW; Cycles=7
Idx:17985; ID:10;	P_HDR : Atom P-header.; WE; Cycles=1
Idx:17986; ID:10;	P_HDR : Atom P-header.; WW; Cycles=2
Idx:17987; ID:10;	P_HDR : Atom P-header.; WEWE; Cycles=2
Idx:17988; ID:10;	P_HDR : Atom P-header.; W; Cycles=1
Idx:17989; ID:10;	P_HDR : Atom P-header.; WEE; Cycles=1
~~~~~~~~~~~~~~~~

*Juno - ETB_1 selected which contains STM source output, raw packet output*

Command line:-
`trc_pkt_lister -ss_dir ..\..\..\snapshots\juno_r1_1 -o_raw_unpacked -src_name ETB_1`

~~~~~~~~~~~~~~~~
Trace Packet Lister: CS Decode library testing
-----------------------------------------------

Trace Packet Lister : reading snapshot from path ..\..\..\snapshots\juno_r1_1
Using ETB_1 as trace source
Trace Packet Lister : STM Protocol on Trace ID 0x20
Frame Data; Index      0; ID_DATA[0x20]; ff ff ff ff ff ff ff ff ff ff 0f 0f 30 41 
Idx:0; ID:20;	ASYNC:Alignment synchronisation packet.
Idx:11; ID:20;	VERSION:Version packet.; Ver=3
Frame Data; Index     16; ID_DATA[0x20]; f1 1a 00 00 00 30 10 af 01 00 00 10 03 f2 1a 
Idx:13; ID:20;	M8:Set current master.; Master=0x41
Idx:17; ID:20;	D32M:32 bit data; with marker.; Data=0x10000000
Idx:22; ID:20;	C8:Set current channel.; Chan=0x0001
Idx:23; ID:20;	D32M:32 bit data; with marker.; Data=0x10000001
Idx:28; ID:20;	C8:Set current channel.; Chan=0x0002
Frame Data; Index     32; ID_DATA[0x20]; 00 00 00 32 30 af 01 00 00 30 03 f4 1a 00 00 
Idx:30; ID:20;	D32M:32 bit data; with marker.; Data=0x10000002
Idx:36; ID:20;	C8:Set current channel.; Chan=0x0003
Idx:37; ID:20;	D32M:32 bit data; with marker.; Data=0x10000003
Idx:42; ID:20;	C8:Set current channel.; Chan=0x0004
Frame Data; Index     48; ID_DATA[0x20]; 00 f4 ff ff ff ff ff ff ff ff ff ff f0 00 13 
Idx:44; ID:20;	D32M:32 bit data; with marker.; Data=0x10000004
Idx:50; ID:20;	ASYNC:Alignment synchronisation packet.
Idx:61; ID:20;	VERSION:Version packet.; Ver=3
~~~~~~~~~~~~~~~~

*Juno - ETMv4 full trace decode + packet monitor, source trace ID 0x10 only.*

Command line:-
`trc_pkt_lister -ss_dir ..\..\..\snapshots\juno_r1_1 -decode -id 0x10`

~~~~~~~~~~~~~~~~

Idx:17204; ID:10; [0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80 ];	I_ASYNC : Alignment Synchronisation.
Idx:17218; ID:10; [0x01 0x01 0x00 ];	I_TRACE_INFO : Trace Info.; INFO=0x0
Idx:17221; ID:10; [0x9d 0x00 0x35 0x09 0x00 0xc0 0xff 0xff 0xff ];	I_ADDR_L_64IS0 : Address, Long, 64 bit, IS0.; Addr=0xFFFFFFC000096A00; 
Idx:17230; ID:10; [0x04 ];	I_TRACE_ON : Trace On.
Idx:17232; ID:10; [0x85 0x00 0x35 0x09 0x00 0xc0 0xff 0xff 0xff 0xf1 0x00 0x00 0x00 0x00 0x00 ];	I_ADDR_CTXT_L_64IS0 : Address & Context, Long, 64 bit, IS0.; Addr=0xFFFFFFC000096A00; Ctxt: AArch64,EL1, NS; CID=0x00000000; VMID=0x0000;
Idx:17248; ID:10; [0xf7 ];	I_ATOM_F1 : Atom format 1.; E
Idx:17230; ID:10; OCSD_GEN_TRC_ELEM_TRACE_ON( [begin or filter])
Idx:17232; ID:10; OCSD_GEN_TRC_ELEM_PE_CONTEXT((ISA=A64) EL1N; 64-bit; VMID=0x0; CTXTID=0x0; )
Idx:17248; ID:10; OCSD_GEN_TRC_ELEM_INSTR_RANGE(exec range=0xffffffc000096a00:[0xffffffc000096a10] num_i(4) last_sz(4) (ISA=A64) E ISB )
Idx:17249; ID:10; [0x9d 0x30 0x25 0x59 0x00 0xc0 0xff 0xff 0xff ];	I_ADDR_L_64IS0 : Address, Long, 64 bit, IS0.; Addr=0xFFFFFFC000594AC0; 
Idx:17258; ID:10; [0xf7 ];	I_ATOM_F1 : Atom format 1.; E
Idx:17258; ID:10; OCSD_GEN_TRC_ELEM_ADDR_NACC( 0xffffffc000594ac0 )
Idx:17259; ID:10; [0x95 0xd6 0x95 ];	I_ADDR_S_IS0 : Address, Short, IS0.; Addr=0xFFFFFFC000592B58 ~[0x12B58]
Idx:17262; ID:10; [0xf9 ];	I_ATOM_F3 : Atom format 3.; ENN
Idx:17262; ID:10; OCSD_GEN_TRC_ELEM_ADDR_NACC( 0xffffffc000592b58 )
Idx:17264; ID:10; [0xf7 ];	I_ATOM_F1 : Atom format 1.; E
Idx:17265; ID:10; [0x9a 0x32 0x62 0x5a 0x00 ];	I_ADDR_L_32IS0 : Address, Long, 32 bit, IS0.; Addr=0xFFFFFFC0005AC4C8; 
Idx:17270; ID:10; [0xdb ];	I_ATOM_F2 : Atom format 2.; EE
Idx:17270; ID:10; OCSD_GEN_TRC_ELEM_ADDR_NACC( 0xffffffc0005ac4c8 )
Idx:17271; ID:10; [0x9a 0x62 0x52 0x0e 0x00 ];	I_ADDR_L_32IS0 : Address, Long, 32 bit, IS0.; Addr=0xFFFFFFC0000EA588; 
Idx:17276; ID:10; [0xfc ];	I_ATOM_F3 : Atom format 3.; NNE
Idx:17276; ID:10; OCSD_GEN_TRC_ELEM_ADDR_NACC( 0xffffffc0000ea588 )
Idx:17277; ID:10; [0x9a 0x58 0x15 0x59 0x00 ];	I_ADDR_L_32IS0 : Address, Long, 32 bit, IS0.; Addr=0xFFFFFFC000592B60; 
Idx:17283; ID:10; [0x06 0x1d ];	I_EXCEPT : Exception.;  IRQ; Ret Addr Follows;
Idx:17285; ID:10; [0x95 0x59 ];	I_ADDR_S_IS0 : Address, Short, IS0.; Addr=0xFFFFFFC000592B64 ~[0x164]
Idx:17283; ID:10; OCSD_GEN_TRC_ELEM_ADDR_NACC( 0xffffffc000592b60 )
Idx:17283; ID:10; OCSD_GEN_TRC_ELEM_EXCEPTION(pref ret addr:0xffffffc000592b64; excep num (0x0e) )
Idx:17287; ID:10; [0x9a 0x20 0x19 0x08 0x00 ];	I_ADDR_L_32IS0 : Address, Long, 32 bit, IS0.; Addr=0xFFFFFFC000083280; 
Idx:17292; ID:10; [0xfd ];	I_ATOM_F3 : Atom format 3.; ENE
Idx:17292; ID:10; OCSD_GEN_TRC_ELEM_INSTR_RANGE(exec range=0xffffffc000083280:[0xffffffc000083284] num_i(1) last_sz(4) (ISA=A64) E BR  )
Idx:17292; ID:10; OCSD_GEN_TRC_ELEM_INSTR_RANGE(exec range=0xffffffc000083d40:[0xffffffc000083d9c] num_i(23) last_sz(4) (ISA=A64) N BR   <cond>)
Idx:17292; ID:10; OCSD_GEN_TRC_ELEM_INSTR_RANGE(exec range=0xffffffc000083d9c:[0xffffffc000083dac] num_i(4) last_sz(4) (ISA=A64) E iBR b+link )
Idx:17293; ID:10; [0x95 0xf7 0x09 ];	I_ADDR_S_IS0 : Address, Short, IS0.; Addr=0xFFFFFFC0000813DC ~[0x13DC]
Idx:17297; ID:10; [0xdb ];	I_ATOM_F2 : Atom format 2.; EE
Idx:17297; ID:10; OCSD_GEN_TRC_ELEM_INSTR_RANGE(exec range=0xffffffc0000813dc:[0xffffffc0000813f0] num_i(5) last_sz(4) (ISA=A64) E BR  b+link )
Idx:17297; ID:10; OCSD_GEN_TRC_ELEM_INSTR_RANGE(exec range=0xffffffc00008f2e0:[0xffffffc00008f2e4] num_i(1) last_sz(4) (ISA=A64) E iBR A64:ret )
Idx:17298; ID:10; [0x95 0x7e ];	I_ADDR_S_IS0 : Address, Short, IS0.; Addr=0xFFFFFFC0000813F8 ~[0x1F8]
Idx:17300; ID:10; [0xe0 ];	I_ATOM_F6 : Atom format 6.; EEEN
Idx:17300; ID:10; OCSD_GEN_TRC_ELEM_INSTR_RANGE(exec range=0xffffffc0000813f8:[0xffffffc00008140c] num_i(5) last_sz(4) (ISA=A64) E BR  )
Idx:17300; ID:10; OCSD_GEN_TRC_ELEM_INSTR_RANGE(exec range=0xffffffc00008141c:[0xffffffc000081434] num_i(6) last_sz(4) (ISA=A64) E BR   <cond>)
Idx:17300; ID:10; OCSD_GEN_TRC_ELEM_INSTR_RANGE(exec range=0xffffffc00008140c:[0xffffffc000081414] num_i(2) last_sz(4) (ISA=A64) E BR  b+link )
Idx:17300; ID:10; OCSD_GEN_TRC_ELEM_ADDR_NACC( 0xffffffc000117cf0 )

~~~~~~~~~~~~~~~~

The `c_api_pkt_print_test` program.
-----------------------------------

Program tests the C-API infrastructure, including as an option the external decoder support. 

Limited to decoding trace from a single CoreSight ID. Uses the same "snapshots" as the C++ test program, but using hardcoded path values.

__Command Line Options__

By default the program will run the single CoreSight ID of 0x10 in packet processing output mode using the ETMv4 decoder on the Juno snapshot.

- `-id <n>`          : Change the ID used for the test.
- `-etmv3`           : Test the ETMv3 decoder - uses the TC2 snapshot.
- `-ptm`             : Test the PTM decoder - uses the TC2 snapshot.
- `-stm`             : Test the STM decoder - uses juno STM only snapshot.
- `-extern`          : Use the 'echo_test' external decoder to test the custom decoder API.
- `-decode`          : Output trace protocol packets and full decode generic packets.
- `-decode_only`     : Output full decode generic packets only.