Import OpenCSD -- an ARM CoreSight Trace Decode library.
Git ID 900407e9d6400f6541138d6c2e483a9fc2d699a4 Sponsored by: DARPA, AFRL
This commit is contained in:
commit
a6157d8112
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/vendor/opencsd/dist/; revision=332012 svn path=/vendor/opencsd/900407e9d6400f6541138d6c2e483a9fc2d699a4/; revision=332013; tag=vendor/opencsd/900407e9d6400f6541138d6c2e483a9fc2d699a4
76
.gitignore
vendored
Normal file
76
.gitignore
vendored
Normal file
@ -0,0 +1,76 @@
|
||||
# Object files
|
||||
*.o
|
||||
*.ko
|
||||
*.obj
|
||||
*.elf
|
||||
|
||||
# Precompiled Headers
|
||||
*.gch
|
||||
*.pch
|
||||
|
||||
# Libraries
|
||||
*.lib
|
||||
*.a
|
||||
*.la
|
||||
*.lo
|
||||
|
||||
# Shared objects (inc. Windows DLLs)
|
||||
*.dll
|
||||
*.so
|
||||
*.so.*
|
||||
*.dylib
|
||||
|
||||
# Executables
|
||||
*.exe
|
||||
*.out
|
||||
*.app
|
||||
*.i*86
|
||||
*.x86_64
|
||||
*.hex
|
||||
|
||||
# Debug files
|
||||
*.dSYM/
|
||||
|
||||
# Vc++ build files
|
||||
*tlog
|
||||
Debug/
|
||||
ipch/
|
||||
*.opensdf
|
||||
*.sdf
|
||||
*.suo
|
||||
*.user
|
||||
*.idb
|
||||
*.pdb
|
||||
*.exp
|
||||
*.ilk
|
||||
|
||||
# ignore emacs backup saves
|
||||
*~
|
||||
|
||||
# ignore bin test directory
|
||||
bin/
|
||||
*.log
|
||||
ref_trace_decoder/build/win/rctdl_c_api_lib/Release/*
|
||||
ref_trace_decoder/build/win/rctdl_c_api_lib/x64/Release/*
|
||||
ref_trace_decoder/build/win/ref_trace_decode_lib/Release/*
|
||||
ref_trace_decoder/build/win/ref_trace_decode_lib/x64/Release/*
|
||||
ref_trace_decoder/tests/build/win/simple_pkt_print_c_api/Release/*
|
||||
ref_trace_decoder/tests/build/win/simple_pkt_print_c_api/x64/Release/*
|
||||
*.lastbuildstate
|
||||
*.manifest
|
||||
*.cache
|
||||
ref_trace_decoder/docs/html/*
|
||||
ref_trace_decoder/tests/build/win/simple_pkt_print_c_api/Debug-dll/*
|
||||
ref_trace_decoder/tests/build/win/simple_pkt_print_c_api/x64/Debug-dll/*
|
||||
ref_trace_decoder/tests/build/win/trc_pkt_lister/Debug-dll/*
|
||||
ref_trace_decoder/tests/build/win/trc_pkt_lister/Release-dll/*
|
||||
ref_trace_decoder/tests/build/win/trc_pkt_lister/x64/Debug-dll/*
|
||||
ref_trace_decoder/tests/build/win/trc_pkt_lister/x64/Release-dll/*
|
||||
*.bak
|
||||
*.orig
|
||||
decoder/docs/html/*
|
||||
*.orig
|
||||
*.VC.db
|
||||
*.VC.VC.opendb
|
||||
*.iobj
|
||||
*.ipdb
|
661
HOWTO.md
Normal file
661
HOWTO.md
Normal file
@ -0,0 +1,661 @@
|
||||
HOWTO - using the library with perf {#howto_perf}
|
||||
===================================
|
||||
|
||||
@brief Using command line perf and OpenCSD to collect and decode trace.
|
||||
|
||||
This HOWTO explains how to use the perf cmd line tools and the openCSD
|
||||
library to collect and extract program flow traces generated by the
|
||||
CoreSight IP blocks on a Linux system. The examples have been generated using
|
||||
an aarch64 Juno-r0 platform. All information is considered accurate and tested
|
||||
using the latest version of the library and the `master` branch on the
|
||||
[perf-opencsd github repository][1].
|
||||
|
||||
|
||||
On Target Trace Acquisition - Perf Record
|
||||
-----------------------------------------
|
||||
All the enhancement to the Perf tools that support the new `cs_etm` pmu have
|
||||
not been upstreamed yet. To get the required functionality branch
|
||||
`perf-opencsd-master` needs to be downloaded to the target system where
|
||||
traces are to be collected. This branch is a vanilla upstream kernel
|
||||
supplemented with modifications to the CoreSight framework and drivers to be
|
||||
usable by the Perf core. The remaining out of tree patches are being
|
||||
upstreamed incrementally.
|
||||
|
||||
From there compiling the perf tools with `make -C tools/perf` will yield a
|
||||
`perf` executable that will support CoreSight trace collection. Note that if
|
||||
traces are to be decompressed *off* target, there is no need to download and
|
||||
compile the openCSD library (on the target).
|
||||
|
||||
Before launching a trace run a sink that will collect trace data needs to be
|
||||
identified. All CoreSight blocks identified by the framework are registed in
|
||||
sysFS:
|
||||
|
||||
|
||||
linaro@linaro-nano:~$ ls /sys/bus/coresight/devices/
|
||||
20010000.etf 20040000.main_funnel 22040000.etm 22140000.etm
|
||||
230c0000.A53_funnel 23240000.etm replicator@20020000 20030000.tpiu
|
||||
20070000.etr 220c0000.A57_funnel 23040000.etm 23140000.etm 23340000.etm
|
||||
|
||||
|
||||
CoreSight blocks are listed in the device tree for a specific system and
|
||||
discovered at boot time. Since tracers can be linked to more than one sink,
|
||||
the sink that will recieve trace data needs to be identified and given as an
|
||||
option on the perf command line. Once a sink has been identify trace collection
|
||||
can start. An easy and yet interesting example is the `uname` command:
|
||||
|
||||
linaro@linaro-nano:~/kernel$ ./tools/perf/perf record -e cs_etm/@20070000.etr/ --per-thread uname
|
||||
|
||||
This will generate a `perf.data` file where execution has been traced for both
|
||||
user and kernel space. To narrow the field to either user or kernel space the
|
||||
`u` and `k` options can be specified. For example the following will limit
|
||||
traces to user space:
|
||||
|
||||
|
||||
linaro@linaro-nano:~/kernel$ ./tools/perf/perf record -vvv -e cs_etm/@20070000.etr/u --per-thread uname
|
||||
Problems setting modules path maps, continuing anyway...
|
||||
-----------------------------------------------------------
|
||||
perf_event_attr:
|
||||
type 8
|
||||
size 112
|
||||
{ sample_period, sample_freq } 1
|
||||
sample_type IP|TID|IDENTIFIER
|
||||
read_format ID
|
||||
disabled 1
|
||||
exclude_kernel 1
|
||||
exclude_hv 1
|
||||
enable_on_exec 1
|
||||
sample_id_all 1
|
||||
------------------------------------------------------------
|
||||
sys_perf_event_open: pid 11375 cpu -1 group_fd -1 flags 0x8
|
||||
------------------------------------------------------------
|
||||
perf_event_attr:
|
||||
type 1
|
||||
size 112
|
||||
config 0x9
|
||||
{ sample_period, sample_freq } 1
|
||||
sample_type IP|TID|IDENTIFIER
|
||||
read_format ID
|
||||
disabled 1
|
||||
exclude_kernel 1
|
||||
exclude_hv 1
|
||||
mmap 1
|
||||
comm 1
|
||||
enable_on_exec 1
|
||||
task 1
|
||||
sample_id_all 1
|
||||
mmap2 1
|
||||
comm_exec 1
|
||||
------------------------------------------------------------
|
||||
sys_perf_event_open: pid 11375 cpu -1 group_fd -1 flags 0x8
|
||||
mmap size 266240B
|
||||
AUX area mmap length 131072
|
||||
perf event ring buffer mmapped per thread
|
||||
Synthesizing auxtrace information
|
||||
Linux
|
||||
auxtrace idx 0 old 0 head 0x11ea0 diff 0x11ea0
|
||||
[ perf record: Woken up 1 times to write data ]
|
||||
overlapping maps:
|
||||
7f99daf000-7f99db0000 0 [vdso]
|
||||
7f99d84000-7f99db3000 0 /lib/aarch64-linux-gnu/ld-2.21.so
|
||||
7f99d84000-7f99daf000 0 /lib/aarch64-linux-gnu/ld-2.21.so
|
||||
7f99db0000-7f99db3000 0 /lib/aarch64-linux-gnu/ld-2.21.so
|
||||
failed to write feature 8
|
||||
failed to write feature 9
|
||||
failed to write feature 14
|
||||
[ perf record: Captured and wrote 0.072 MB perf.data ]
|
||||
|
||||
linaro@linaro-nano:~/kernel$ ls -l ~/.debug/ perf.data
|
||||
_-rw------- 1 linaro linaro 77888 Mar 2 20:41 perf.data
|
||||
|
||||
/home/linaro/.debug/:
|
||||
total 16
|
||||
drwxr-xr-x 2 linaro linaro 4096 Mar 2 20:40 [kernel.kallsyms]
|
||||
drwxr-xr-x 2 linaro linaro 4096 Mar 2 20:40 [vdso]
|
||||
drwxr-xr-x 3 linaro linaro 4096 Mar 2 20:40 bin
|
||||
drwxr-xr-x 3 linaro linaro 4096 Mar 2 20:40 lib
|
||||
|
||||
Trace data filtering
|
||||
--------------------
|
||||
The amount of traces generated by CoreSight tracers is staggering, event for
|
||||
the most simple trace scenario. Reducing trace generation to specific areas
|
||||
of interest is desirable to save trace buffer space and avoid getting lost in
|
||||
the trace data that isn't relevant. Supplementing the 'k' and 'u' options
|
||||
described above is the notion of address filters.
|
||||
|
||||
On CoreSight two types of address filter have been implemented - address range
|
||||
and start/stop filter:
|
||||
|
||||
**Address range filters:**
|
||||
With address range filters traces are generated if the instruction pointer
|
||||
falls within the specified range. Any work done by the CPU outside of that
|
||||
range will not be traced. Address range filters can be specified for both
|
||||
user and kernel space session:
|
||||
|
||||
perf record -e cs_etm/@20070000.etr/k --filter 'filter 0xffffff8008562d0c/0x48' --per-thread uname
|
||||
|
||||
perf record -e cs_etm/@20070000.etr/u --filter 'filter 0x72c/0x40@/opt/lib/libcstest.so.1.0' --per-thread ./main
|
||||
|
||||
When dealing with kernel space trace addresses are typically taken in the
|
||||
'System.map' file. In user space addresses are relocatable and can be
|
||||
extracted from an objdump output:
|
||||
|
||||
$ aarch64-linux-gnu-objdump -d libcstest.so.1.0
|
||||
...
|
||||
...
|
||||
000000000000072c <coresight_test1>: <------------ Beginning of traces
|
||||
72c: d10083ff sub sp, sp, #0x20
|
||||
730: b9000fe0 str w0, [sp,#12]
|
||||
734: b9001fff str wzr, [sp,#28]
|
||||
738: 14000007 b 754 <coresight_test1+0x28>
|
||||
73c: b9400fe0 ldr w0, [sp,#12]
|
||||
740: 11000800 add w0, w0, #0x2
|
||||
744: b9000fe0 str w0, [sp,#12]
|
||||
748: b9401fe0 ldr w0, [sp,#28]
|
||||
74c: 11000400 add w0, w0, #0x1
|
||||
750: b9001fe0 str w0, [sp,#28]
|
||||
754: b9401fe0 ldr w0, [sp,#28]
|
||||
758: 7100101f cmp w0, #0x4
|
||||
75c: 54ffff0d b.le 73c <coresight_test1+0x10>
|
||||
760: b9400fe0 ldr w0, [sp,#12]
|
||||
764: 910083ff add sp, sp, #0x20
|
||||
768: d65f03c0 ret
|
||||
...
|
||||
...
|
||||
|
||||
Following the address the amount of byte is specified and if tracing in user
|
||||
space, the full path to the binary (or library) being traced.
|
||||
|
||||
**Start/Stop filters:**
|
||||
With start/stop filters traces are generated when the instruction pointer is
|
||||
equal to the start address. Incidentally traces stop being generated when the
|
||||
insruction pointer is equal to the stop address. Anything that happens between
|
||||
there to events is traced:
|
||||
|
||||
perf record -e cs_etm/@20070000.etr/k --filter 'start 0xffffff800856bc50,stop 0xffffff800856bcb0' --per-thread uname
|
||||
|
||||
perf record -vvv -e cs_etm/@20070000.etr/u --filter 'start 0x72c@/opt/lib/libcstest.so.1.0, \
|
||||
stop 0x40082c@/home/linaro/main' \
|
||||
--per-thread ./main
|
||||
|
||||
**Limitation on address filters:**
|
||||
The only limitation on address filters is the amount of address comparator
|
||||
found on an implementation and the mutual exclusion between range and
|
||||
start stop filters. As such the following example would _not_ work:
|
||||
|
||||
perf record -e cs_etm/@20070000.etr/k --filter 'start 0xffffff800856bc50,stop 0xffffff800856bcb0, \ // start/stop
|
||||
filter 0x72c/0x40@/opt/lib/libcstest.so.1.0' \ // address range
|
||||
--per-thread uname
|
||||
|
||||
Additional Trace Options
|
||||
------------------------
|
||||
Additional options can be used during trace collection that add information to the captured trace.
|
||||
|
||||
- Timestamps: These packets are added to the trace streams to allow correlation of different sources where tools support this.
|
||||
- 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.
|
||||
The relationship between cycle counts and executed instructions differs according to the trace protocol.
|
||||
For example, the ETMv4 protocol will emit counts for groups of instructions according to a minimum count threshold.
|
||||
Presently this threshold is fixed at 256 cycles for `perf record`.
|
||||
|
||||
Command line options in `perf record` to use these features are part of the options for the `cs_etm` event:
|
||||
|
||||
perf record -e cs_etm/timestamp,cycacc,@20070000.etr/ --per-thread uname
|
||||
|
||||
At current version, `perf record` and `perf script` do not use this additional information.
|
||||
|
||||
On Target Trace Collection
|
||||
--------------------------
|
||||
The entire program flow will have been recorded in the `perf.data` file.
|
||||
Information about libraries and executable is stored under `$HOME/.debug`:
|
||||
|
||||
linaro@linaro-nano:~/kernel$ tree ~/.debug
|
||||
.debug
|
||||
├── [kernel.kallsyms]
|
||||
│ └── 0542921808098d591a7acba5a1163e8991897669
|
||||
│ └── kallsyms
|
||||
├── [vdso]
|
||||
│ └── 551fbbe29579eb63be3178a04c16830b8d449769
|
||||
│ └── vdso
|
||||
├── bin
|
||||
│ └── uname
|
||||
│ └── ed95e81f97c4471fb2ccc21e356b780eb0c92676
|
||||
│ └── elf
|
||||
└── lib
|
||||
└── aarch64-linux-gnu
|
||||
├── ld-2.21.so
|
||||
│ └── 94912dc5a1dc8c7ef2c4e4649d4b1639b6ebc8b7
|
||||
│ └── elf
|
||||
└── libc-2.21.so
|
||||
└── 169a143e9c40cfd9d09695333e45fd67743cd2d6
|
||||
└── elf
|
||||
|
||||
13 directories, 5 files
|
||||
linaro@linaro-nano:~/kernel$
|
||||
|
||||
|
||||
All this information needs to be collected in order to successfully decode
|
||||
traces off target:
|
||||
|
||||
linaro@linaro-nano:~/kernel$ tar czf uname.trace.tgz perf.data ~/.debug
|
||||
|
||||
|
||||
Note that file `vmlinux` should also be added to the bundle if kernel traces
|
||||
have also been collected.
|
||||
|
||||
|
||||
Off Target OpenCSD Compilation
|
||||
------------------------------
|
||||
The openCSD library is not part of the perf tools. It is available on
|
||||
[github][1] and needs to be compiled before the perf tools. Checkout the
|
||||
required branch/tag version into a local directory.
|
||||
|
||||
linaro@t430:~/linaro/coresight$ git clone -b v0.8 https://github.com/Linaro/OpenCSD.git my-opencsd
|
||||
Cloning into 'OpenCSD'...
|
||||
remote: Counting objects: 2063, done.
|
||||
remote: Total 2063 (delta 0), reused 0 (delta 0), pack-reused 2063
|
||||
Receiving objects: 100% (2063/2063), 2.51 MiB | 1.24 MiB/s, done.
|
||||
Resolving deltas: 100% (1399/1399), done.
|
||||
Checking connectivity... done.
|
||||
linaro@t430:~/linaro/coresight$ ls my-opencsd
|
||||
decoder LICENSE README.md HOWTO.md TODO
|
||||
|
||||
Once the source code has been acquired compilation of the openCSD library can
|
||||
take place. For Linux two options are available, LINUX and LINUX64, based on
|
||||
the host's (which has nothing to do with the target) architecture:
|
||||
|
||||
linaro@t430:~/linaro/coresight/$ cd my-opencsd/decoder/build/linux/
|
||||
linaro@t430:~/linaro/coresight/my-opencsd/decoder/build/linux$ ls
|
||||
makefile rctdl_c_api_lib ref_trace_decode_lib
|
||||
|
||||
linaro@t430:~/linaro/coresight/my-opencsd/decoder/build/linux$ make LINUX64=1 DEBUG=1
|
||||
...
|
||||
...
|
||||
|
||||
linaro@t430:~/linaro/coresight/my-opencsd/decoder/build/linux$ ls ../../lib/linux64/dbg/
|
||||
libopencsd.a libopencsd_c_api.a libopencsd_c_api.so libopencsd.so
|
||||
|
||||
From there the header file and libraries need to be installed on the system,
|
||||
something that requires root privileges. The default installation path is
|
||||
/usr/include/opencsd for the header files and /usr/lib/ for the libraries:
|
||||
|
||||
linaro@t430:~/linaro/coresight/my-opencsd/decoder/build/linux$ sudo make install
|
||||
linaro@t430:~/linaro/coresight/my-opencsd/decoder/build/linux$ ls -l /usr/include/opencsd
|
||||
total 60
|
||||
drwxr-xr-x 2 root root 4096 Dec 12 10:19 c_api
|
||||
drwxr-xr-x 2 root root 4096 Dec 12 10:19 etmv3
|
||||
drwxr-xr-x 2 root root 4096 Dec 12 10:19 etmv4
|
||||
-rw-r--r-- 1 root root 28049 Dec 12 10:19 ocsd_if_types.h
|
||||
drwxr-xr-x 2 root root 4096 Dec 12 10:19 ptm
|
||||
drwxr-xr-x 2 root root 4096 Dec 12 10:19 stm
|
||||
-rw-r--r-- 1 root root 7264 Dec 12 10:19 trc_gen_elem_types.h
|
||||
-rw-r--r-- 1 root root 3972 Dec 12 10:19 trc_pkt_types.h
|
||||
|
||||
linaro@t430:~/linaro/coresight/my-opencsd/decoder/build/linux$ ls -l /usr/lib/libopencsd*
|
||||
-rw-r--r-- 1 root root 598720 Dec 12 10:19 /usr/lib/libopencsd_c_api.so
|
||||
-rw-r--r-- 1 root root 4692200 Dec 12 10:19 /usr/lib/libopencsd.so
|
||||
|
||||
A "clean_install" target is also available so that openCSD installed files can
|
||||
be removed from a system. Going forward the goal is to have the openCSD library
|
||||
packaged as a Debian or RPM archive so that it can be installed from a
|
||||
distribution without having to be compiled.
|
||||
|
||||
|
||||
Off Target Perf Tools Compilation
|
||||
---------------------------------
|
||||
As mentionned above the openCSD library is not part of the perf tools' code base
|
||||
and needs to be installed on a system prior to compilation. Information about
|
||||
the status of the openCSD library on a system is given at compile time by the
|
||||
perf tools build script:
|
||||
|
||||
linaro@t430:~/linaro/linux-kernel$ make VF=1 -C tools/perf
|
||||
Auto-detecting system features:
|
||||
... dwarf: [ on ]
|
||||
... dwarf_getlocations: [ on ]
|
||||
... glibc: [ on ]
|
||||
... gtk2: [ on ]
|
||||
... libaudit: [ on ]
|
||||
... libbfd: [ OFF ]
|
||||
... libelf: [ on ]
|
||||
... libnuma: [ OFF ]
|
||||
... numa_num_possible_cpus: [ OFF ]
|
||||
... libperl: [ on ]
|
||||
... libpython: [ on ]
|
||||
... libslang: [ on ]
|
||||
... libcrypto: [ on ]
|
||||
... libunwind: [ OFF ]
|
||||
... libdw-dwarf-unwind: [ on ]
|
||||
... zlib: [ on ]
|
||||
... lzma: [ OFF ]
|
||||
... get_cpuid: [ on ]
|
||||
... bpf: [ on ]
|
||||
... libopencsd: [ on ] <-------
|
||||
|
||||
|
||||
At the end of the compilation a new perf binary is available in `tools/perf/`:
|
||||
|
||||
linaro@t430:~/linaro/linux-kernel$ ldd tools/perf/perf
|
||||
linux-vdso.so.1 => (0x00007fff135db000)
|
||||
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f15f9176000)
|
||||
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f15f8f6e000)
|
||||
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f15f8c64000)
|
||||
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f15f8a60000)
|
||||
libopencsd_c_api.so => /usr/lib/libopencsd_c_api.so (0x00007f15f884e000) <-------
|
||||
libelf.so.1 => /usr/lib/x86_64-linux-gnu/libelf.so.1 (0x00007f15f8635000)
|
||||
libdw.so.1 => /usr/lib/x86_64-linux-gnu/libdw.so.1 (0x00007f15f83ec000)
|
||||
libaudit.so.1 => /lib/x86_64-linux-gnu/libaudit.so.1 (0x00007f15f81c5000)
|
||||
libslang.so.2 => /lib/x86_64-linux-gnu/libslang.so.2 (0x00007f15f7e38000)
|
||||
libperl.so.5.22 => /usr/lib/x86_64-linux-gnu/libperl.so.5.22 (0x00007f15f7a5d000)
|
||||
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f15f7693000)
|
||||
libpython2.7.so.1.0 => /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0 (0x00007f15f7104000)
|
||||
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f15f6eea000)
|
||||
/lib64/ld-linux-x86-64.so.2 (0x0000559b88038000)
|
||||
libopencsd.so => /usr/lib/libopencsd.so (0x00007f15f6c62000) <-------
|
||||
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f15f68df000)
|
||||
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f15f66c9000)
|
||||
liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00007f15f64a6000)
|
||||
libbz2.so.1.0 => /lib/x86_64-linux-gnu/libbz2.so.1.0 (0x00007f15f6296000)
|
||||
libcrypt.so.1 => /lib/x86_64-linux-gnu/libcrypt.so.1 (0x00007f15f605e000)
|
||||
libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00007f15f5e5a000)
|
||||
|
||||
|
||||
Additional debug output from the decoder can be compiled in by setting the
|
||||
`CSTRACE_RAW` environment variable. Setting this to `packed` gets trace frame
|
||||
output as follows:-
|
||||
|
||||
Frame Data; Index 576; RAW_PACKED; d6 d6 d6 d6 d6 d6 d6 d6 fc fb d6 d6 d6 d6 e0 7f
|
||||
Frame Data; Index 576; ID_DATA[0x14]; d7 d6 d7 d6 d7 d6 d7 d6 fd fb d7 d6 d7 d6 e0
|
||||
|
||||
Set to any other value will remove the RAW_PACKED lines.
|
||||
|
||||
Working with a debug version of the openCSD library
|
||||
---------------------------------------------------
|
||||
When compiling the perf tools it is possible to reference another version of
|
||||
the openCSD library than the one installed on the system. This is useful when
|
||||
working with multiple development trees or having the desire to keep system
|
||||
libraries intact. Two environment variable are available to tell the perf tools
|
||||
build script where to get the header file and libraries, namely CSINCLUDES and
|
||||
CSLIBS:
|
||||
|
||||
linaro@t430:~/linaro/linux-kernel$ export CSINCLUDES=~/linaro/coresight/my-opencsd/decoder/include/
|
||||
linaro@t430:~/linaro/linux-kernel$ export CSLIBS=~/linaro/coresight/my-opencsd/decoder/lib/linux64-rel/
|
||||
linaro@t430:~/linaro/linux-kernel$ make VF=1 -C tools/perf
|
||||
|
||||
This will have the effect of compiling and linking against the provided library.
|
||||
Since the system's openCSD library is in the loader's search patch the
|
||||
LD_LIBRARY_PATH environment variable needs to be set.
|
||||
|
||||
linaro@t430:~/linaro/linux-kernel$ export LD_LIBRARY_PATH=$CSLIBS
|
||||
|
||||
|
||||
Trace Decoding with Perf Report
|
||||
-------------------------------
|
||||
Before working with custom traces it is suggested to use a trace bundle that
|
||||
is known to be working properly. A sample bundle has been made available
|
||||
here [2]. Trace bundles can be extracted anywhere and have no dependencies on
|
||||
where the perf tools and openCSD library have been compiled.
|
||||
|
||||
linaro@t430:~/linaro/coresight$ mkdir sept20
|
||||
linaro@t430:~/linaro/coresight$ cd sept20
|
||||
linaro@t430:~/linaro/coresight/sept20$ wget http://people.linaro.org/~mathieu.poirier/openCSD/uname.v4.user.sept20.tgz
|
||||
linaro@t430:~/linaro/coresight/sept20$ md5sum uname.v4.user.sept20.tgz
|
||||
f53f11d687ce72bdbe9de2e67e960ec6 uname.v4.user.sept20.tgz
|
||||
linaro@t430:~/linaro/coresight/sept20$ tar xf uname.v4.user.sept20.tgz
|
||||
linaro@t430:~/linaro/coresight/sept20$ ls -la
|
||||
total 1312
|
||||
drwxrwxr-x 3 linaro linaro 4096 Mar 3 10:26 .
|
||||
drwxrwxr-x 5 linaro linaro 4096 Mar 3 10:13 ..
|
||||
drwxr-xr-x 7 linaro linaro 4096 Feb 24 12:21 .debug
|
||||
-rw------- 1 linaro linaro 78016 Feb 24 12:21 perf.data
|
||||
-rw-rw-r-- 1 linaro linaro 1245881 Feb 24 12:25 uname.v4.user.sept20.tgz
|
||||
|
||||
Perf is expecting files related to the trace capture (`perf.data`) to be located
|
||||
under `~/.debug` [3]. This example will remove the current `~/.debug` directory
|
||||
to be sure everything is clean.
|
||||
|
||||
linaro@t430:~/linaro/coresight/sept20$ rm -rf ~/.debug
|
||||
linaro@t430:~/linaro/coresight/sept20$ cp -dpR .debug ~/
|
||||
linaro@t430:~/linaro/coresight/sept20$ ../perf-opencsd-master/tools/perf/perf report --stdio
|
||||
|
||||
# To display the perf.data header info, please use --header/--header-only options.
|
||||
#
|
||||
#
|
||||
# Total Lost Samples: 0
|
||||
#
|
||||
# Samples: 0 of event 'cs_etm//u'
|
||||
# Event count (approx.): 0
|
||||
#
|
||||
# Children Self Command Shared Object Symbol
|
||||
# ........ ........ ....... ............. ......
|
||||
#
|
||||
|
||||
|
||||
# Samples: 0 of event 'dummy:u'
|
||||
# Event count (approx.): 0
|
||||
#
|
||||
# Children Self Command Shared Object Symbol
|
||||
# ........ ........ ....... ............. ......
|
||||
#
|
||||
|
||||
|
||||
# Samples: 115K of event 'instructions:u'
|
||||
# Event count (approx.): 522009
|
||||
#
|
||||
# Children Self Command Shared Object Symbol
|
||||
# ........ ........ ....... ................ ......................
|
||||
#
|
||||
4.13% 4.13% uname libc-2.21.so [.] 0x0000000000078758
|
||||
3.81% 3.81% uname libc-2.21.so [.] 0x0000000000078e50
|
||||
2.06% 2.06% uname libc-2.21.so [.] 0x00000000000fcaf4
|
||||
1.65% 1.65% uname libc-2.21.so [.] 0x00000000000fcae4
|
||||
1.59% 1.59% uname ld-2.21.so [.] 0x000000000000a7f4
|
||||
1.50% 1.50% uname libc-2.21.so [.] 0x0000000000078e40
|
||||
1.43% 1.43% uname libc-2.21.so [.] 0x00000000000fcac4
|
||||
1.31% 1.31% uname libc-2.21.so [.] 0x000000000002f0c0
|
||||
1.26% 1.26% uname ld-2.21.so [.] 0x0000000000016888
|
||||
1.24% 1.24% uname libc-2.21.so [.] 0x0000000000078e7c
|
||||
1.24% 1.24% uname libc-2.21.so [.] 0x00000000000fcab8
|
||||
...
|
||||
|
||||
Additional data can be obtained, which contains a dump of the trace packets received using the command
|
||||
|
||||
mjl@ubuntu-vbox:./perf-opencsd-master/coresight/tools/perf/perf report --stdio --dump
|
||||
|
||||
resulting a large amount of data, trace looking like:-
|
||||
|
||||
0x618 [0x30]: PERF_RECORD_AUXTRACE size: 0x11ef0 offset: 0 ref: 0x4d881c1f13216016 idx: 0 tid: 15244 cpu: -1
|
||||
|
||||
. ... CoreSight ETM Trace data: size 73456 bytes
|
||||
|
||||
0: I_ASYNC : Alignment Synchronisation.
|
||||
12: I_TRACE_INFO : Trace Info.
|
||||
17: I_TRACE_ON : Trace On.
|
||||
18: I_ADDR_CTXT_L_64IS0 : Address & Context, Long, 64 bit, IS0.; Addr=0x0000007F89F24D80; Ctxt: AArch64,EL0, NS;
|
||||
28: I_ATOM_F6 : Atom format 6.; EEEEEEEEEEEEEEEEEEEEEEEE
|
||||
29: I_ATOM_F6 : Atom format 6.; EEEEEEEEEEEEEEEEEEEEEEEE
|
||||
30: I_ATOM_F6 : Atom format 6.; EEEEEEEEEEEEEEEEEEEEEEEE
|
||||
32: I_ATOM_F6 : Atom format 6.; EEEEN
|
||||
33: I_ATOM_F1 : Atom format 1.; E
|
||||
34: I_EXCEPT : Exception.; Data Fault; Ret Addr Follows;
|
||||
36: I_ADDR_L_64IS0 : Address, Long, 64 bit, IS0.; Addr=0x0000007F89F2832C;
|
||||
45: I_ADDR_CTXT_L_64IS0 : Address & Context, Long, 64 bit, IS0.; Addr=0xFFFFFFC000083400; Ctxt: AArch64,EL1, NS;
|
||||
56: I_TRACE_ON : Trace On.
|
||||
57: I_ADDR_CTXT_L_64IS0 : Address & Context, Long, 64 bit, IS0.; Addr=0x0000007F89F2832C; Ctxt: AArch64,EL0, NS;
|
||||
68: I_ATOM_F3 : Atom format 3.; NEE
|
||||
69: I_ATOM_F3 : Atom format 3.; NEN
|
||||
70: I_ATOM_F3 : Atom format 3.; NNE
|
||||
71: I_ATOM_F5 : Atom format 5.; ENENE
|
||||
72: I_ATOM_F5 : Atom format 5.; NENEN
|
||||
73: I_ATOM_F5 : Atom format 5.; ENENE
|
||||
74: I_ATOM_F5 : Atom format 5.; NENEN
|
||||
75: I_ATOM_F5 : Atom format 5.; ENENE
|
||||
76: I_ATOM_F3 : Atom format 3.; NNE
|
||||
77: I_ATOM_F3 : Atom format 3.; NNE
|
||||
78: I_ATOM_F3 : Atom format 3.; NNE
|
||||
80: I_ATOM_F3 : Atom format 3.; NNE
|
||||
81: I_ATOM_F3 : Atom format 3.; ENN
|
||||
82: I_EXCEPT : Exception.; Data Fault; Ret Addr Follows;
|
||||
84: I_ADDR_L_64IS0 : Address, Long, 64 bit, IS0.; Addr=0x0000007F89F283F0;
|
||||
93: I_ADDR_CTXT_L_64IS0 : Address & Context, Long, 64 bit, IS0.; Addr=0xFFFFFFC000083400; Ctxt: AArch64,EL1, NS;
|
||||
104: I_TRACE_ON : Trace On.
|
||||
105: I_ADDR_CTXT_L_64IS0 : Address & Context, Long, 64 bit, IS0.; Addr=0x0000007F89F283F0; Ctxt: AArch64,EL0, NS;
|
||||
116: I_ATOM_F5 : Atom format 5.; NNNNN
|
||||
117: I_ATOM_F5 : Atom format 5.; NNNNN
|
||||
|
||||
|
||||
Trace Decoding with Perf Script
|
||||
-------------------------------
|
||||
Working with perf scripts needs more command line options but yields
|
||||
interesting results.
|
||||
|
||||
linaro@t430:~/linaro/coresight/sept20$ export EXEC_PATH=/home/linaro/coresight/perf-opencsd-master/tools/perf/
|
||||
linaro@t430:~/linaro/coresight/sept20$ export SCRIPT_PATH=$EXEC_PATH/scripts/python/
|
||||
linaro@t430:~/linaro/coresight/sept20$ export XTOOL_PATH=/your/aarch64/toolchain/path/bin/
|
||||
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
|
||||
|
||||
7f89f24d80: 910003e0 mov x0, sp
|
||||
7f89f24d84: 94000d53 bl 7f89f282d0 <free@plt+0x3790>
|
||||
7f89f282d0: d11203ff sub sp, sp, #0x480
|
||||
7f89f282d4: a9ba7bfd stp x29, x30, [sp,#-96]!
|
||||
7f89f282d8: 910003fd mov x29, sp
|
||||
7f89f282dc: a90363f7 stp x23, x24, [sp,#48]
|
||||
7f89f282e0: 9101e3b7 add x23, x29, #0x78
|
||||
7f89f282e4: a90573fb stp x27, x28, [sp,#80]
|
||||
7f89f282e8: a90153f3 stp x19, x20, [sp,#16]
|
||||
7f89f282ec: aa0003fb mov x27, x0
|
||||
7f89f282f0: 910a82e1 add x1, x23, #0x2a0
|
||||
7f89f282f4: a9025bf5 stp x21, x22, [sp,#32]
|
||||
7f89f282f8: a9046bf9 stp x25, x26, [sp,#64]
|
||||
7f89f282fc: 910102e0 add x0, x23, #0x40
|
||||
7f89f28300: f800841f str xzr, [x0],#8
|
||||
7f89f28304: eb01001f cmp x0, x1
|
||||
7f89f28308: 54ffffc1 b.ne 7f89f28300 <free@plt+0x37c0>
|
||||
7f89f28300: f800841f str xzr, [x0],#8
|
||||
7f89f28304: eb01001f cmp x0, x1
|
||||
7f89f28308: 54ffffc1 b.ne 7f89f28300 <free@plt+0x37c0>
|
||||
7f89f28300: f800841f str xzr, [x0],#8
|
||||
7f89f28304: eb01001f cmp x0, x1
|
||||
7f89f28308: 54ffffc1 b.ne 7f89f28300 <free@plt+0x37c0>
|
||||
|
||||
Kernel Trace Decoding
|
||||
---------------------
|
||||
|
||||
When dealing with kernel space traces the vmlinux file has to be communicated
|
||||
explicitely to perf using the "--vmlinux" command line option:
|
||||
|
||||
linaro@t430:~/linaro/coresight/sept20$ ../perf-opencsd-master/tools/perf/perf report --stdio --vmlinux=./vmlinux
|
||||
...
|
||||
...
|
||||
linaro@t430:~/linaro/coresight/sept20$ ../perf-opencsd-master/tools/perf/perf script --vmlinux=./vmlinux
|
||||
|
||||
When using scripts things get a little more convoluted. Using the same example
|
||||
an above but for traces but for kernel traces, the command line becomes:
|
||||
|
||||
linaro@t430:~/linaro/coresight/sept20$ export EXEC_PATH=/home/linaro/coresight/perf-opencsd-master/tools/perf/
|
||||
linaro@t430:~/linaro/coresight/sept20$ export SCRIPT_PATH=$EXEC_PATH/scripts/python/
|
||||
linaro@t430:~/linaro/coresight/sept20$ export XTOOL_PATH=/your/aarch64/toolchain/path/bin/
|
||||
linaro@t430:~/linaro/coresight/sept20$ ../perf-opencsd-master/tools/perf/perf --exec-path=${EXEC_PATH} script \
|
||||
--vmlinux=./vmlinux \
|
||||
--script=python:${SCRIPT_PATH}/cs-trace-disasm.py -- \
|
||||
-d ${XTOOLS_PATH}/aarch64-linux-gnu-objdump \
|
||||
-k ./vmlinux
|
||||
...
|
||||
...
|
||||
|
||||
The option "--vmlinux=./vmlinux" is interpreted by the "perf script" command
|
||||
the same way it if for "perf report". The option "-k ./vmlinux" is dependant
|
||||
on the script being executed and has no related to the "--vmlinux", though it
|
||||
is highly advised to keep them synchronized.
|
||||
|
||||
|
||||
Perf Test Environment Scripts
|
||||
-----------------------------
|
||||
|
||||
The decoder library comes with a number of `bash` scripts that ease the setting up of the
|
||||
offline build and test environment for perf, and executing tests.
|
||||
|
||||
These scripts can be found in
|
||||
|
||||
decoder/tests/perf-test-scripts
|
||||
|
||||
There are three scripts provided:
|
||||
|
||||
- `perf-setup-env.bash` : this sets up all the environment variables mentioned above.
|
||||
- `perf-test-report.bash` : this runs `perf report` - using the environment setup by `perf-setup-env.bash`
|
||||
- `perf-test-script.bash` : this runs `perf script` - using the environment setup by `perf-setup-env.bash`
|
||||
|
||||
Use as follows:-
|
||||
|
||||
1. 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.
|
||||
|
||||
2. Execute the script using the command
|
||||
|
||||
source perf-setup-env.bash
|
||||
|
||||
This will set up all the environment variables mentioned in the sections on building and running
|
||||
perf above, and these are used by the `perf-test...` scripts to run the tests.
|
||||
|
||||
3. Build perf as described above.
|
||||
4. Follow the instructions for downloading the test capture, or create a capture from your target.
|
||||
5. Copy the `perf-test...` scripts into the capture data directory -> the one that contains `perf.data`.
|
||||
|
||||
6. 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.
|
||||
|
||||
e.g.
|
||||
|
||||
./perf-test-report.bash --dump
|
||||
|
||||
will add the --dump option to the end of the command line and run
|
||||
|
||||
${PERF_EXEC_PATH}/perf report --stdio --dump
|
||||
|
||||
|
||||
Generating coverage files for Feedback Directed Optimization: AutoFDO
|
||||
---------------------------------------------------------------------
|
||||
|
||||
Below is an example of using ARM ETM for autoFDO. The updates to the perf
|
||||
support for this is experimental and available on the 'autoFDO' branch of
|
||||
the [perf-opencsd github repository][1].
|
||||
|
||||
It also requires autofdo (https://github.com/google/autofdo) and gcc version 5. The bubble
|
||||
sort example is from the AutoFDO tutorial (https://gcc.gnu.org/wiki/AutoFDO/Tutorial).
|
||||
|
||||
$ gcc-5 -O3 sort.c -o sort_optimized
|
||||
$ taskset -c 2 ./sort_optimized
|
||||
Bubble sorting array of 30000 elements
|
||||
5910 ms
|
||||
|
||||
$ perf record -e cs_etm/@20070000.etr/u --per-thread taskset -c 2 ./sort
|
||||
Bubble sorting array of 30000 elements
|
||||
12543 ms
|
||||
[ perf record: Woken up 35 times to write data ]
|
||||
[ perf record: Captured and wrote 69.640 MB perf.data ]
|
||||
|
||||
$ perf inject -i perf.data -o inj.data --itrace=il64 --strip
|
||||
$ create_gcov --binary=./sort --profile=inj.data --gcov=sort.gcov -gcov_version=1
|
||||
$ gcc-5 -O3 -fauto-profile=sort.gcov sort.c -o sort_autofdo
|
||||
$ taskset -c 2 ./sort_autofdo
|
||||
Bubble sorting array of 30000 elements
|
||||
5806 ms
|
||||
|
||||
|
||||
The Linaro CoreSight Team
|
||||
-------------------------
|
||||
- Mike Leach
|
||||
- Tor Jeremiassen
|
||||
- Chunyan Zang
|
||||
- Mathieu Poirier
|
||||
|
||||
|
||||
One Last Thing
|
||||
--------------
|
||||
We welcome help on this project. If you would like to add features or help
|
||||
improve the way things work, we want to hear from you.
|
||||
|
||||
Best regards,
|
||||
*The Linaro CoreSight Team*
|
||||
|
||||
--------------------------------------
|
||||
[1]: https://github.com/Linaro/perf-opencsd "perf-opencsd Github"
|
||||
|
||||
[2]: http://people.linaro.org/~mathieu.poirier/openCSD/uname.v4.user.sept20.tgz
|
||||
|
||||
[3]: Get in touch with us if you know a way to change this.
|
30
LICENSE
Normal file
30
LICENSE
Normal file
@ -0,0 +1,30 @@
|
||||
BSD 3Clause License
|
||||
http://directory.fsf.org/wiki/License:BSD_3Clause
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
(1) Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
(2) Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
|
||||
(3)The name of the author may not be used to
|
||||
endorse or promote products derived from this software without
|
||||
specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE.
|
132
README.md
Normal file
132
README.md
Normal file
@ -0,0 +1,132 @@
|
||||
OpenCSD - An open source CoreSight(tm) Trace Decode library {#mainpage}
|
||||
===========================================================
|
||||
|
||||
This library provides an API suitable for the decode of ARM(r) CoreSight(tm) trace streams.
|
||||
|
||||
The library will decode formatted trace in three stages:
|
||||
|
||||
1. *Frame Deformatting* : Removal CoreSight frame formatting from individual trace streams.
|
||||
2. *Packet Processing* : Separate individual trace streams into discrete packets.
|
||||
3. *Packet Decode* : Convert the packets into fully decoded trace describing the program flow on a core.
|
||||
|
||||
The library is implemented in C++ with an optional "C" API.
|
||||
|
||||
Library Versioning
|
||||
------------------
|
||||
|
||||
From version 0.4, library versioning will use a semantic versioning format
|
||||
(per http://semver.org) of the form _Major.minor.patch_ (M.m.p).
|
||||
|
||||
Internal library version calls, documentation and git repository will use this format moving forwards.
|
||||
Where a patch version is not quoted, or quoted as .x then comments will apply to the entire release.
|
||||
|
||||
Releases will be at M.m.0, with patch version incremented for bugfixes or documentation updates.
|
||||
|
||||
Releases will appear on the master branch in the git repository with an appropriate version tag.
|
||||
|
||||
CoreSight Trace Component Support.
|
||||
----------------------------------
|
||||
|
||||
_Current Version 0.8.2_
|
||||
|
||||
### Current support:
|
||||
|
||||
- ETMv4 (v4.1) instruction trace - packet processing and packet decode.
|
||||
- PTM (v1.1) instruction trace - packet processing and packet decode.
|
||||
- ETMv3 (v3.5) instruction trace - packet processing and packet decode.
|
||||
- ETMv3 (v3.5) data trace - packet processing.
|
||||
- STM (v1.1) software trace - packet processing and packet decode.
|
||||
|
||||
- External Decoders - support for addition of external / custom decoders into the library.
|
||||
|
||||
### Support to be added:
|
||||
|
||||
- ITM software trace - packet processing and decode.
|
||||
- ETMv3 data trace - packet decode.
|
||||
- ETMv4 data trace - packet processing and decode.
|
||||
|
||||
Note: for ITM and STM, packet decode is combining Master+Channel+Marker+Payload packets into a single generic
|
||||
output packet.
|
||||
|
||||
|
||||
Note on the Git Repository.
|
||||
---------------------------
|
||||
|
||||
This git repository for OpenCSD contains only source for the OpenCSD decoder library.
|
||||
From version 0.4, releases appear as versioned tags on the master branch.
|
||||
|
||||
From version 0.7.4, the required updates to CoreSight drivers and perf, that are not
|
||||
currently upstream in the linux kernel tree, are now contained in a separate
|
||||
repository to be found at:
|
||||
|
||||
https://github.com/Linaro/perf-opencsd
|
||||
|
||||
|
||||
Documentation
|
||||
-------------
|
||||
|
||||
API Documentation is provided inline in the source header files, which use the __doxygen__ standard mark-up.
|
||||
Run `doxygen` on the `./doxygen_config.dox` file located in the `./docs` directory..
|
||||
|
||||
doxygen ./doxygen_config.dox
|
||||
|
||||
This will produce the documentation in the `./docs/html` directory. The doxygen configuration also includes
|
||||
the `*.md` files as part of the documentation.
|
||||
|
||||
|
||||
Building the Library
|
||||
--------------------
|
||||
|
||||
See [build_libs.md](@ref build_lib) in the `./docs` directory for build details.
|
||||
|
||||
|
||||
How the Library is used in Linux `perf`
|
||||
---------------------------------------
|
||||
The library and additional infrastructure for programming CoreSight components has been integrated
|
||||
with the standard linux perfomance analysis tool `perf`.
|
||||
|
||||
|
||||
See [HOWTO.md](@ref howto_perf) for details.
|
||||
|
||||
|
||||
Version and Modification Information
|
||||
====================================
|
||||
|
||||
- _Version 0.001_: Library development - tested with `perf` tools integration - BKK16, 8th March 2016
|
||||
- _Version 0.002_: Library development - added in PTM decoder support. Restructure header dir, replaced ARM rctdl prefix with opencsd/ocsd.
|
||||
- _Version 0.003_: Library development - added in ETMv3 instruction decoder support.
|
||||
- _Version 0.4_ : Library development - updated decode tree and C-API for generic decoder handling. Switch to semantic versioning.
|
||||
- _Version 0.4.1_: Minor Update & Bugfixes - fix to PTM decoder, ID checking on test program, adds NULL_TS support in STM packet processor.
|
||||
- _Version 0.4.2_: Minor Update - Update to documentation for perf usage in 4.8 kernel branch.
|
||||
- _Version 0.5.0_: Library Development - external decoder support. STM full decode.
|
||||
- _Version 0.5.1_: Minor Update & Bugfixes - Update HOWTO for kernel 4.9. Build fixes for parallel builds
|
||||
- _Version 0.5.2_: Minor Update & Bugfixes - Update trace info packet string o/p + Cycle count packet bugfixes.
|
||||
- _Version 0.5.3_: Doc update for using AutoFDO with ETM and additional timestamp and cycle count options.
|
||||
- _Version 0.5.4_: Updates: X-compile for arm/arm64. Remove deprecated VS2010 builds. Bugfix: GCC inline semantics in debug build.
|
||||
- _Version 0.6.0_: Packet printers moved from tests into the main library. C++ and C APIs updated to allow clients to use them.
|
||||
Update to allow perf to insert barrier packets (4xFSYNC) which the decoder can be made to use to reset the decode state.
|
||||
- _Version 0.6.1_: Bugfix: instruction follower bug on A32 branch to T32.
|
||||
- _Version 0.7.0_: Add handling for trace return stack feature to ETMv4 and PTM trace.
|
||||
- _Version 0.7.1_: Bugfix: ETMv3 packet processor.
|
||||
- _Version 0.7.2_: Bugfix: ETMv4 decoder - fix exact match packet address follower.
|
||||
- _Version 0.7.3_: Bugfix: PTM decoder - issues with initialisation and ASYNC detection.
|
||||
- _Version 0.7.4_: Notification of change of repository for perf extensions. gcc 6.x build fixes.
|
||||
- _Version 0.7.5_: Bugfix: ETMv4 decoder memory leak. Linux build update - header dependencies force rebuild.
|
||||
- _Version 0.8.0_: Header restructure and build update to enable linux version to install library and C-API headers in standard locations.
|
||||
Library output naming changed from 'cstraced' to 'opencsd'.
|
||||
- _Version 0.8.1_: Minor updates: Use install tool to copy headers. Changes to HOWTO for perf usage.
|
||||
- _Version 0.8.2_: Bugfix: C++ init errors fixed for CLANG build process.
|
||||
|
||||
Licence Information
|
||||
===================
|
||||
|
||||
This library is licensed under the [BSD three clause licence.](http://directory.fsf.org/wiki/License:BSD_3Clause)
|
||||
|
||||
A copy of this license is in the `LICENCE` file included with the source code.
|
||||
|
||||
Contact
|
||||
=======
|
||||
|
||||
Using the github site: https://github.com/Linaro/OpenCSD
|
||||
|
||||
Mailing list: coresight@lists.linaro.org
|
19
TODO
Normal file
19
TODO
Normal file
@ -0,0 +1,19 @@
|
||||
* ETMv4/PTM - decoder updates to handle advanced configuration.
|
||||
-> Certain (currently unused by perf / current hardware) configuration settings
|
||||
can alter the format of the trace output. One example is Return Stack -
|
||||
settable in the control registers for PTM/ETMv4, and removes some inline
|
||||
addresses. Decoder must use a follower to correctly trace when this is set.
|
||||
|
||||
* ITM packet processing and decode.
|
||||
-> ITM is primarily an M class SW trace module. I wouldn't expect to see it on
|
||||
systems with STM, unless a companion M class was present.
|
||||
|
||||
*Data trace - ETMv4 / ETMv3
|
||||
-> Differing solutions to data trace in v4/v3 - v4 is separate trace stream
|
||||
completely, output at trace ID <instruction_trace_ID>+1. ETMv3 is inline with
|
||||
the instruction trace.
|
||||
|
||||
Cortex-A cores do not support this architecturally. On R and M profile cores it
|
||||
is an option. There are scenarios in future that could see linux on R cores, plus
|
||||
on something like Juno it is possible to switch on trace for the SCP
|
||||
(M class processor). So at some point data trace may be required.
|
196
decoder/build/linux/makefile
Normal file
196
decoder/build/linux/makefile
Normal file
@ -0,0 +1,196 @@
|
||||
########################################################
|
||||
# Copyright 2015 ARM Limited. All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without modification,
|
||||
# are permitted provided that the following conditions are met:
|
||||
#
|
||||
# 1. Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
#
|
||||
# 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
#
|
||||
# 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
# may be used to endorse or promote products derived from this software without
|
||||
# specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
#################################################################################
|
||||
# OpenCSD - master makefile for libraries and tests
|
||||
#
|
||||
# command line options
|
||||
# DEBUG=1 create a debug build
|
||||
#
|
||||
|
||||
# Set project root - relative to build directory
|
||||
ifeq ($(OCSD_ROOT),)
|
||||
OCSD_ROOT := $(shell pwd | sed 's,/build/linux.*,,')
|
||||
export OCSD_ROOT
|
||||
endif
|
||||
|
||||
# library names
|
||||
LIB_BASE_NAME=opencsd
|
||||
export LIB_BASE_NAME
|
||||
LIB_CAPI_NAME=$(LIB_BASE_NAME)_c_api
|
||||
export LIB_CAPI_NAME
|
||||
|
||||
# determine base architecture, heavily borrowed from the Linux kernel v4.4's
|
||||
# tools/perf/config/Makefile.arch
|
||||
# For example, to compile for arm64 on a X86 PC, you can issue the command:
|
||||
# "export ARCH=arm64"
|
||||
ifndef ARCH
|
||||
ARCH := $(shell uname -m 2>/dev/null || echo not)
|
||||
endif
|
||||
|
||||
# source root directories
|
||||
export OCSD_LIB_ROOT=$(OCSD_ROOT)/lib
|
||||
|
||||
export OCSD_INCLUDE=$(OCSD_ROOT)/include
|
||||
export OCSD_SOURCE=$(OCSD_ROOT)/source
|
||||
|
||||
export OCSD_TESTS=$(OCSD_ROOT)/tests
|
||||
|
||||
export LIB_UAPI_INC_DIR=opencsd
|
||||
|
||||
# tools
|
||||
export MASTER_CC=$(CROSS_COMPILE)gcc
|
||||
export MASTER_CPP=$(CROSS_COMPILE)g++
|
||||
export MASTER_LINKER=$(CROSS_COMPILE)g++
|
||||
export MASTER_LIB=$(CROSS_COMPILE)ar
|
||||
export INSTALL=install
|
||||
|
||||
# installation directory
|
||||
INSTALL_LIB_DIR=/usr/lib/
|
||||
export INSTALL_INCLUDE_DIR=/usr/include/
|
||||
|
||||
# compile flags
|
||||
MASTER_CC_FLAGS := -c -Wall -DLINUX
|
||||
MASTER_CPP_FLAGS := -c -Wall -DLINUX -std=c++11
|
||||
MASTER_LINKER_FLAGS := -Wl,-z,defs
|
||||
MASTER_LIB_FLAGS := rcs
|
||||
|
||||
# debug variant
|
||||
ifdef DEBUG
|
||||
MASTER_CC_FLAGS += -g -O0 -DDEBUG
|
||||
MASTER_CPP_FLAGS += -g -O0 -DDEBUG
|
||||
BUILD_VARIANT=dbg
|
||||
else
|
||||
MASTER_CC_FLAGS += -g -O2 -DNDEBUG
|
||||
MASTER_CPP_FLAGS += -g -O2 -DNDEBUG
|
||||
BUILD_VARIANT=rel
|
||||
endif
|
||||
|
||||
|
||||
# platform bit size variant
|
||||
ifeq ($(ARCH),x86)
|
||||
MFLAG:="-m32"
|
||||
BIT_VARIANT=32
|
||||
else ifeq ($(ARCH),x86_64)
|
||||
MFLAG:="-m64"
|
||||
BIT_VARIANT=64
|
||||
else ifeq ($(ARCH),arm)
|
||||
BIT_VARIANT=-arm
|
||||
else ifeq ($(ARCH),arm64)
|
||||
BIT_VARIANT=-arm64
|
||||
else ifeq ($(ARCH),aarch64)
|
||||
BIT_VARIANT=-arm64
|
||||
else ifeq ($(ARCH),aarch32)
|
||||
BIT_VARIANT=-arm
|
||||
endif
|
||||
|
||||
MASTER_CC_FLAGS += $(MFLAG)
|
||||
MASTER_CPP_FLAGS += $(MFLAG)
|
||||
MASTER_LINKER_FLAGS += $(MFLAG)
|
||||
|
||||
# export build flags
|
||||
export MASTER_CC_FLAGS
|
||||
export MASTER_CPP_FLAGS
|
||||
export MASTER_LINKER_FLAGS
|
||||
export MASTER_LIB_FLAGS
|
||||
|
||||
# target directories
|
||||
export PLAT_DIR=linux$(BIT_VARIANT)/$(BUILD_VARIANT)
|
||||
export LIB_TARGET_DIR=$(OCSD_LIB_ROOT)/$(PLAT_DIR)
|
||||
export LIB_TEST_TARGET_DIR=$(OCSD_TESTS)/lib/$(PLAT_DIR)
|
||||
export BIN_TEST_TARGET_DIR=$(OCSD_TESTS)/bin/$(PLAT_DIR)
|
||||
|
||||
###########################################################
|
||||
# build targets
|
||||
|
||||
all: libs tests
|
||||
|
||||
libs: $(LIB_BASE_NAME)_lib $(LIB_CAPI_NAME)_lib
|
||||
|
||||
install: libs
|
||||
$(INSTALL) --mode=644 $(LIB_TARGET_DIR)/lib$(LIB_BASE_NAME).so $(INSTALL_LIB_DIR)/
|
||||
$(INSTALL) --mode=644 $(LIB_TARGET_DIR)/lib$(LIB_CAPI_NAME).so $(INSTALL_LIB_DIR)/
|
||||
cd $(OCSD_ROOT)/build/linux/rctdl_c_api_lib && make install_inc
|
||||
|
||||
################################
|
||||
# build OpenCSD trace decode library
|
||||
#
|
||||
$(LIB_BASE_NAME)_lib: $(LIB_TARGET_DIR)/lib$(LIB_BASE_NAME).a $(LIB_TARGET_DIR)/lib$(LIB_BASE_NAME).so
|
||||
|
||||
$(LIB_TARGET_DIR)/lib$(LIB_BASE_NAME).so: $(LIB_BASE_NAME)_all
|
||||
$(LIB_TARGET_DIR)/lib$(LIB_BASE_NAME).a: $(LIB_BASE_NAME)_all
|
||||
|
||||
# single command builds both .a and .so targets in sub-makefile
|
||||
$(LIB_BASE_NAME)_all:
|
||||
mkdir -p $(LIB_TARGET_DIR)
|
||||
cd $(OCSD_ROOT)/build/linux/ref_trace_decode_lib && make
|
||||
|
||||
################################
|
||||
# build OpenCSD trace decode C API library
|
||||
#
|
||||
$(LIB_CAPI_NAME)_lib: $(LIB_TARGET_DIR)/lib$(LIB_CAPI_NAME).a $(LIB_TARGET_DIR)/lib$(LIB_CAPI_NAME).so
|
||||
|
||||
$(LIB_TARGET_DIR)/lib$(LIB_CAPI_NAME).so: $(LIB_CAPI_NAME)_all
|
||||
$(LIB_TARGET_DIR)/lib$(LIB_CAPI_NAME).a: $(LIB_CAPI_NAME)_all
|
||||
|
||||
# single command builds both .a and .so targets in sub-makefile
|
||||
$(LIB_CAPI_NAME)_all: $(LIB_BASE_NAME)_lib
|
||||
mkdir -p $(LIB_TARGET_DIR)
|
||||
cd $(OCSD_ROOT)/build/linux/rctdl_c_api_lib && make
|
||||
|
||||
#################################
|
||||
# build tests
|
||||
|
||||
.PHONY: tests
|
||||
tests: libs
|
||||
cd $(OCSD_ROOT)/tests/build/linux/echo_test_dcd_lib && make
|
||||
cd $(OCSD_ROOT)/tests/build/linux/snapshot_parser_lib && make
|
||||
cd $(OCSD_ROOT)/tests/build/linux/trc_pkt_lister && make
|
||||
cd $(OCSD_ROOT)/tests/build/linux/c_api_pkt_print_test && make
|
||||
|
||||
#############################################################
|
||||
# clean targets
|
||||
#
|
||||
clean: clean_libs clean_tests
|
||||
|
||||
.PHONY: clean_libs clean_tests
|
||||
|
||||
clean_libs:
|
||||
cd $(OCSD_ROOT)/build/linux/ref_trace_decode_lib && make clean
|
||||
cd $(OCSD_ROOT)/build/linux/rctdl_c_api_lib && make clean
|
||||
|
||||
clean_tests:
|
||||
cd $(OCSD_ROOT)/tests/build/linux/echo_test_dcd_lib && make clean
|
||||
cd $(OCSD_ROOT)/tests/build/linux/snapshot_parser_lib && make clean
|
||||
cd $(OCSD_ROOT)/tests/build/linux/trc_pkt_lister && make clean
|
||||
cd $(OCSD_ROOT)/tests/build/linux/c_api_pkt_print_test && make clean
|
||||
|
||||
clean_install:
|
||||
rm -f $(INSTALL_LIB_DIR)/lib$(LIB_BASE_NAME).so
|
||||
rm -f $(INSTALL_LIB_DIR)/lib$(LIB_CAPI_NAME).so
|
||||
rm -rf $(INSTALL_INCLUDE_DIR)/$(LIB_UAPI_INC_DIR)
|
105
decoder/build/linux/rctdl_c_api_lib/makefile
Normal file
105
decoder/build/linux/rctdl_c_api_lib/makefile
Normal file
@ -0,0 +1,105 @@
|
||||
########################################################
|
||||
# Copyright 2015 ARM Limited. All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without modification,
|
||||
# are permitted provided that the following conditions are met:
|
||||
#
|
||||
# 1. Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
#
|
||||
# 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
#
|
||||
# 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
# may be used to endorse or promote products derived from this software without
|
||||
# specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
#################################################################################
|
||||
# OpenCSD - makefile for C API wrapper library
|
||||
#
|
||||
|
||||
CPP := $(MASTER_CPP)
|
||||
LINKER := $(MASTER_LINKER)
|
||||
LIB := $(MASTER_LIB)
|
||||
|
||||
CPP_FLAGS := $(MASTER_CPP_FLAGS) -fpic -Wno-switch
|
||||
LIB_FLAGS := $(MASTER_LIB_FLAGS)
|
||||
LINKER_FLAGS := $(MASTER_LINKER_FLAGS) -shared
|
||||
|
||||
LIB_NAME = lib$(LIB_CAPI_NAME)
|
||||
SO_LIB_DEPS= -L$(LIB_TARGET_DIR) -l$(LIB_BASE_NAME)
|
||||
|
||||
BUILD_DIR=./$(PLAT_DIR)
|
||||
|
||||
VPATH= $(OCSD_SOURCE)/c_api
|
||||
|
||||
CPP_INCLUDES= \
|
||||
-I$(OCSD_INCLUDE) \
|
||||
-I$(OCSD_SOURCE)/c_api
|
||||
|
||||
OBJECTS=$(BUILD_DIR)/ocsd_c_api.o \
|
||||
$(BUILD_DIR)/ocsd_c_api_custom_obj.o
|
||||
|
||||
INST_INC_SRC=$(OCSD_INCLUDE)/$(LIB_UAPI_INC_DIR)
|
||||
INST_INC_DST=$(INSTALL_INCLUDE_DIR)/$(LIB_UAPI_INC_DIR)
|
||||
|
||||
all: build_dir $(OBJECTS)
|
||||
mkdir -p $(LIB_TARGET_DIR)
|
||||
$(LIB) $(LIB_FLAGS) $(LIB_TARGET_DIR)/$(LIB_NAME).a $(OBJECTS)
|
||||
$(LINKER) $(LINKER_FLAGS) -o $(LIB_TARGET_DIR)/$(LIB_NAME).so -Wl,-soname,$(LIB_NAME).so $(OBJECTS) $(SO_LIB_DEPS)
|
||||
|
||||
build_dir:
|
||||
mkdir -p $(BUILD_DIR)
|
||||
|
||||
##### build rules
|
||||
|
||||
## object dependencies
|
||||
DEPS := $(OBJECTS:%.o=%.d)
|
||||
|
||||
-include $(DEPS)
|
||||
|
||||
## object compile
|
||||
$(BUILD_DIR)/%.o : %.cpp
|
||||
$(CPP) $(CPP_FLAGS) $(CPP_INCLUDES) -MMD $< -o $@
|
||||
|
||||
|
||||
#### clean
|
||||
.PHONY: clean
|
||||
clean:
|
||||
rm -f $(OBJECTS)
|
||||
rm -f $(DEPS)
|
||||
rm -f $(LIB_TARGET_DIR)/$(LIB_NAME).a
|
||||
rm -f $(LIB_TARGET_DIR)/$(LIB_NAME).so
|
||||
|
||||
#### install the necessary include files for the c-api library on linux
|
||||
install_inc:
|
||||
$(INSTALL) -d --mode=0755 $(INST_INC_DST)/
|
||||
$(INSTALL) --mode=0644 $(INST_INC_SRC)/trc_gen_elem_types.h $(INST_INC_DST)/
|
||||
$(INSTALL) --mode=0644 $(INST_INC_SRC)/ocsd_if_types.h $(INST_INC_DST)/
|
||||
$(INSTALL) --mode=0644 $(INST_INC_SRC)/trc_pkt_types.h $(INST_INC_DST)/
|
||||
$(INSTALL) -d --mode=0755 $(INST_INC_DST)/ptm
|
||||
$(INSTALL) --mode=0644 $(INST_INC_SRC)/ptm/trc_pkt_types_ptm.h $(INST_INC_DST)/ptm/
|
||||
$(INSTALL) -d --mode=0755 $(INST_INC_DST)/stm
|
||||
$(INSTALL) --mode=0644 $(INST_INC_SRC)/stm/trc_pkt_types_stm.h $(INST_INC_DST)/stm/
|
||||
$(INSTALL) -d --mode=0755 $(INST_INC_DST)/etmv3
|
||||
$(INSTALL) --mode=0644 $(INST_INC_SRC)/etmv3/trc_pkt_types_etmv3.h $(INST_INC_DST)/etmv3/
|
||||
$(INSTALL) -d --mode=0755 $(INST_INC_DST)/etmv4
|
||||
$(INSTALL) --mode=0644 $(INST_INC_SRC)/etmv4/trc_pkt_types_etmv4.h $(INST_INC_DST)/etmv4/
|
||||
$(INSTALL) -d --mode=0755 $(INST_INC_DST)/c_api
|
||||
$(INSTALL) --mode=0644 $(INST_INC_SRC)/c_api/ocsd_c_api_types.h $(INST_INC_DST)/c_api/
|
||||
$(INSTALL) --mode=0644 $(INST_INC_SRC)/c_api/opencsd_c_api.h $(INST_INC_DST)/c_api/
|
||||
$(INSTALL) --mode=0644 $(INST_INC_SRC)/c_api/ocsd_c_api_custom.h $(INST_INC_DST)/c_api/
|
||||
|
||||
|
143
decoder/build/linux/ref_trace_decode_lib/makefile
Normal file
143
decoder/build/linux/ref_trace_decode_lib/makefile
Normal file
@ -0,0 +1,143 @@
|
||||
########################################################
|
||||
# Copyright 2015 ARM Limited. All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without modification,
|
||||
# are permitted provided that the following conditions are met:
|
||||
#
|
||||
# 1. Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
#
|
||||
# 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
#
|
||||
# 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
# may be used to endorse or promote products derived from this software without
|
||||
# specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
#################################################################################
|
||||
# OpenCSD - makefile for main trace decode library
|
||||
#
|
||||
|
||||
CPP := $(MASTER_CPP)
|
||||
LINKER := $(MASTER_LINKER)
|
||||
LIB := $(MASTER_LIB)
|
||||
|
||||
CPP_FLAGS := $(MASTER_CPP_FLAGS) -fpic -Wno-switch
|
||||
LIB_FLAGS := $(MASTER_LIB_FLAGS)
|
||||
LINKER_FLAGS := $(MASTER_LINKER_FLAGS) -shared
|
||||
|
||||
LIB_NAME= lib$(LIB_BASE_NAME)
|
||||
|
||||
BUILD_DIR=./$(PLAT_DIR)
|
||||
|
||||
VPATH= $(OCSD_SOURCE) \
|
||||
$(OCSD_SOURCE)/etmv3 \
|
||||
$(OCSD_SOURCE)/etmv4 \
|
||||
$(OCSD_SOURCE)/ptm \
|
||||
$(OCSD_SOURCE)/i_dec \
|
||||
$(OCSD_SOURCE)/mem_acc \
|
||||
$(OCSD_SOURCE)/stm \
|
||||
$(OCSD_SOURCE)/pkt_printers
|
||||
|
||||
|
||||
CPP_INCLUDES= \
|
||||
-I$(OCSD_INCLUDE) \
|
||||
-I$(OCSD_SOURCE)
|
||||
|
||||
ETMV3OBJ= $(BUILD_DIR)/trc_cmp_cfg_etmv3.o \
|
||||
$(BUILD_DIR)/trc_pkt_decode_etmv3.o \
|
||||
$(BUILD_DIR)/trc_pkt_elem_etmv3.o \
|
||||
$(BUILD_DIR)/trc_pkt_proc_etmv3.o \
|
||||
$(BUILD_DIR)/trc_pkt_proc_etmv3_impl.o
|
||||
|
||||
ETMV4OBJ= $(BUILD_DIR)/trc_cmp_cfg_etmv4.o \
|
||||
$(BUILD_DIR)/trc_pkt_proc_etmv4.o \
|
||||
$(BUILD_DIR)/trc_pkt_proc_etmv4i_impl.o \
|
||||
$(BUILD_DIR)/trc_pkt_decode_etmv4i.o \
|
||||
$(BUILD_DIR)/trc_pkt_elem_etmv4i.o \
|
||||
$(BUILD_DIR)/trc_pkt_elem_etmv4d.o \
|
||||
$(BUILD_DIR)/trc_etmv4_stack_elem.o
|
||||
|
||||
PTMOBJ= $(BUILD_DIR)/trc_cmp_cfg_ptm.o \
|
||||
$(BUILD_DIR)/trc_pkt_elem_ptm.o \
|
||||
$(BUILD_DIR)/trc_pkt_proc_ptm.o \
|
||||
$(BUILD_DIR)/trc_pkt_decode_ptm.o
|
||||
|
||||
IDECOBJ= $(BUILD_DIR)/trc_i_decode.o \
|
||||
$(BUILD_DIR)/trc_idec_arminst.o
|
||||
|
||||
MEMACCOBJ= $(BUILD_DIR)/trc_mem_acc_mapper.o \
|
||||
$(BUILD_DIR)/trc_mem_acc_bufptr.o \
|
||||
$(BUILD_DIR)/trc_mem_acc_file.o \
|
||||
$(BUILD_DIR)/trc_mem_acc_base.o \
|
||||
$(BUILD_DIR)/trc_mem_acc_cb.o
|
||||
|
||||
STMOBJ= $(BUILD_DIR)/trc_pkt_elem_stm.o \
|
||||
$(BUILD_DIR)/trc_pkt_proc_stm.o \
|
||||
$(BUILD_DIR)/trc_pkt_decode_stm.o
|
||||
|
||||
PKTPRNTOBJ= $(BUILD_DIR)/raw_frame_printer.o \
|
||||
$(BUILD_DIR)/trc_print_fact.o
|
||||
|
||||
|
||||
OBJECTS=$(BUILD_DIR)/ocsd_code_follower.o \
|
||||
$(BUILD_DIR)/ocsd_dcd_tree.o \
|
||||
$(BUILD_DIR)/ocsd_error.o \
|
||||
$(BUILD_DIR)/ocsd_error_logger.o \
|
||||
$(BUILD_DIR)/ocsd_gen_elem_list.o \
|
||||
$(BUILD_DIR)/ocsd_lib_dcd_register.o \
|
||||
$(BUILD_DIR)/ocsd_msg_logger.o \
|
||||
$(BUILD_DIR)/ocsd_version.o \
|
||||
$(BUILD_DIR)/trc_component.o \
|
||||
$(BUILD_DIR)/trc_core_arch_map.o \
|
||||
$(BUILD_DIR)/trc_frame_deformatter.o \
|
||||
$(BUILD_DIR)/trc_gen_elem.o \
|
||||
$(BUILD_DIR)/trc_printable_elem.o \
|
||||
$(BUILD_DIR)/trc_ret_stack.o \
|
||||
$(ETMV3OBJ) \
|
||||
$(ETMV4OBJ) \
|
||||
$(IDECOBJ) \
|
||||
$(MEMACCOBJ) \
|
||||
$(STMOBJ) \
|
||||
$(PTMOBJ) \
|
||||
$(PKTPRNTOBJ)
|
||||
|
||||
all: build_dir $(OBJECTS)
|
||||
mkdir -p $(LIB_TARGET_DIR)
|
||||
$(LIB) $(LIB_FLAGS) $(LIB_TARGET_DIR)/$(LIB_NAME).a $(OBJECTS)
|
||||
$(LINKER) $(LINKER_FLAGS) -o $(LIB_TARGET_DIR)/$(LIB_NAME).so -Wl,-soname,$(LIB_NAME).so $(OBJECTS)
|
||||
|
||||
build_dir:
|
||||
mkdir -p $(BUILD_DIR)
|
||||
|
||||
##### build rules
|
||||
|
||||
## object dependencies
|
||||
DEPS := $(OBJECTS:%.o=%.d)
|
||||
|
||||
-include $(DEPS)
|
||||
|
||||
## object compile
|
||||
$(BUILD_DIR)/%.o : %.cpp
|
||||
$(CPP) $(CPP_FLAGS) $(CPP_INCLUDES) -MMD $< -o $@
|
||||
|
||||
|
||||
#### clean
|
||||
.PHONY: clean
|
||||
clean:
|
||||
rm -f $(OBJECTS)
|
||||
rm -f $(DEPS)
|
||||
rm -f $(LIB_TARGET_DIR)/$(LIB_NAME).a
|
||||
rm -f $(LIB_TARGET_DIR)/$(LIB_NAME).so
|
20
decoder/build/win-vs2015/opencsd.props
Normal file
20
decoder/build/win-vs2015/opencsd.props
Normal file
@ -0,0 +1,20 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ImportGroup Label="PropertySheets" />
|
||||
<PropertyGroup Label="UserMacros">
|
||||
<LIB_BASE_NAME>opencsd</LIB_BASE_NAME>
|
||||
<LIB_CAPI_NAME>opencsd_c_api</LIB_CAPI_NAME>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup />
|
||||
<ItemDefinitionGroup />
|
||||
<ItemGroup>
|
||||
<BuildMacro Include="LIB_BASE_NAME">
|
||||
<Value>$(LIB_BASE_NAME)</Value>
|
||||
<EnvironmentVariable>true</EnvironmentVariable>
|
||||
</BuildMacro>
|
||||
<BuildMacro Include="LIB_CAPI_NAME">
|
||||
<Value>$(LIB_CAPI_NAME)</Value>
|
||||
<EnvironmentVariable>true</EnvironmentVariable>
|
||||
</BuildMacro>
|
||||
</ItemGroup>
|
||||
</Project>
|
327
decoder/build/win-vs2015/rctdl_c_api_lib/rctdl_c_api_lib.vcxproj
Normal file
327
decoder/build/win-vs2015/rctdl_c_api_lib/rctdl_c_api_lib.vcxproj
Normal file
@ -0,0 +1,327 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="Debug-dll|Win32">
|
||||
<Configuration>Debug-dll</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Debug-dll|x64">
|
||||
<Configuration>Debug-dll</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Debug|Win32">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Debug|x64">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release-dll|Win32">
|
||||
<Configuration>Release-dll</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release-dll|x64">
|
||||
<Configuration>Release-dll</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|Win32">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|x64">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<PropertyGroup Label="Globals">
|
||||
<ProjectGuid>{533F929A-A73B-46B6-9D5F-FFCD62F734E3}</ProjectGuid>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<RootNamespace>rctdl_c_api_lib</RootNamespace>
|
||||
<ProjectName>ocsd_c_api_lib</ProjectName>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
<PlatformToolset>v140</PlatformToolset>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug-dll|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
<PlatformToolset>v140</PlatformToolset>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
<PlatformToolset>v140</PlatformToolset>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug-dll|x64'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
<PlatformToolset>v140</PlatformToolset>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
<PlatformToolset>v140</PlatformToolset>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release-dll|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
<PlatformToolset>v140</PlatformToolset>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
<PlatformToolset>v140</PlatformToolset>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release-dll|x64'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
<PlatformToolset>v140</PlatformToolset>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
<ImportGroup Label="ExtensionSettings">
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
<Import Project="..\opencsd.props" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug-dll|Win32'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
<Import Project="..\opencsd.props" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
<Import Project="..\opencsd.props" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug-dll|x64'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
<Import Project="..\opencsd.props" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
<Import Project="..\opencsd.props" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release-dll|Win32'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
<Import Project="..\opencsd.props" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
<Import Project="..\opencsd.props" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release-dll|x64'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
<Import Project="..\opencsd.props" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<OutDir>..\..\..\lib\win$(PlatformArchitecture)\rel\</OutDir>
|
||||
<TargetName>lib$(LIB_CAPI_NAME)</TargetName>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release-dll|x64'">
|
||||
<OutDir>..\..\..\lib\win$(PlatformArchitecture)\rel\</OutDir>
|
||||
<IntDir>$(Platform)\$(Configuration)\</IntDir>
|
||||
<TargetName>$(LIB_CAPI_NAME)</TargetName>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<OutDir>..\..\..\lib\win$(PlatformArchitecture)\dbg\</OutDir>
|
||||
<TargetName>lib$(LIB_CAPI_NAME)</TargetName>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug-dll|x64'">
|
||||
<OutDir>..\..\..\lib\win$(PlatformArchitecture)\dbg\</OutDir>
|
||||
<TargetName>$(LIB_CAPI_NAME)</TargetName>
|
||||
<IntDir>$(Platform)\$(Configuration)\</IntDir>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<OutDir>..\..\..\lib\win$(PlatformArchitecture)\dbg\</OutDir>
|
||||
<TargetName>lib$(LIB_CAPI_NAME)</TargetName>
|
||||
<IntDir>$(Platform)\$(Configuration)\</IntDir>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug-dll|Win32'">
|
||||
<OutDir>..\..\..\lib\win$(PlatformArchitecture)\dbg\</OutDir>
|
||||
<TargetName>$(LIB_CAPI_NAME)</TargetName>
|
||||
<IntDir>$(Platform)\$(Configuration)\</IntDir>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<OutDir>..\..\..\lib\win$(PlatformArchitecture)\rel\</OutDir>
|
||||
<TargetName>lib$(LIB_CAPI_NAME)</TargetName>
|
||||
<IntDir>$(Platform)\$(Configuration)\</IntDir>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release-dll|Win32'">
|
||||
<OutDir>..\..\..\lib\win$(PlatformArchitecture)\rel\</OutDir>
|
||||
<IntDir>$(Platform)\$(Configuration)\</IntDir>
|
||||
<TargetName>$(LIB_CAPI_NAME)</TargetName>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
<PrecompiledHeader>
|
||||
</PrecompiledHeader>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<ProgramDataBaseFileName>$(OutDir)$(TargetName)_vc$(PlatformToolsetVersion).pdb</ProgramDataBaseFileName>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug-dll|Win32'">
|
||||
<ClCompile>
|
||||
<PrecompiledHeader>
|
||||
</PrecompiledHeader>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;_USRDLL;_CRT_SECURE_NO_WARNINGS;_OCSD_C_API_DLL_EXPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<ProgramDataBaseFileName>$(OutDir)$(TargetName)_vc$(PlatformToolsetVersion).pdb</ProgramDataBaseFileName>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<ClCompile>
|
||||
<PrecompiledHeader>
|
||||
</PrecompiledHeader>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<ProgramDataBaseFileName>$(OutDir)$(TargetName)_vc$(PlatformToolsetVersion).pdb</ProgramDataBaseFileName>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug-dll|x64'">
|
||||
<ClCompile>
|
||||
<PrecompiledHeader>
|
||||
</PrecompiledHeader>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;_USRDLL;_CRT_SECURE_NO_WARNINGS;_OCSD_C_API_DLL_EXPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<ProgramDataBaseFileName>$(OutDir)$(TargetName)_vc$(PlatformToolsetVersion).pdb</ProgramDataBaseFileName>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<PrecompiledHeader>
|
||||
</PrecompiledHeader>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<ProgramDataBaseFileName>$(OutDir)$(TargetName)_vc$(PlatformToolsetVersion).pdb</ProgramDataBaseFileName>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release-dll|Win32'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<PrecompiledHeader>
|
||||
</PrecompiledHeader>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_USRDLL;_OCSD_C_API_DLL_EXPORT;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<ProgramDataBaseFileName>$(OutDir)$(TargetName)_vc$(PlatformToolsetVersion).pdb</ProgramDataBaseFileName>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<PrecompiledHeader>
|
||||
</PrecompiledHeader>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<ProgramDataBaseFileName>$(OutDir)$(TargetName)_vc$(PlatformToolsetVersion).pdb</ProgramDataBaseFileName>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release-dll|x64'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<PrecompiledHeader>
|
||||
</PrecompiledHeader>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_USRDLL;_CRT_SECURE_NO_WARNINGS;_OCSD_C_API_DLL_EXPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<ProgramDataBaseFileName>$(OutDir)$(TargetName)_vc$(PlatformToolsetVersion).pdb</ProgramDataBaseFileName>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="..\..\..\include\opencsd\c_api\ocsd_c_api_custom.h" />
|
||||
<ClInclude Include="..\..\..\include\opencsd\c_api\ocsd_c_api_cust_fact.h" />
|
||||
<ClInclude Include="..\..\..\include\opencsd\c_api\ocsd_c_api_cust_impl.h" />
|
||||
<ClInclude Include="..\..\..\include\opencsd\c_api\ocsd_c_api_types.h" />
|
||||
<ClInclude Include="..\..\..\include\opencsd\c_api\opencsd_c_api.h" />
|
||||
<ClInclude Include="..\..\..\source\c_api\ocsd_c_api_custom_obj.h" />
|
||||
<ClInclude Include="..\..\..\source\c_api\ocsd_c_api_obj.h" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\ref_trace_decode_lib\ref_trace_decode_lib.vcxproj">
|
||||
<Project>{7f500891-cc76-405f-933f-f682bc39f923}</Project>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="..\..\..\source\c_api\ocsd_c_api.cpp" />
|
||||
<ClCompile Include="..\..\..\source\c_api\ocsd_c_api_custom_obj.cpp" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
@ -0,0 +1,48 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup>
|
||||
<Filter Include="Source Files">
|
||||
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
||||
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="Header Files">
|
||||
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
||||
<Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="Resource Files">
|
||||
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
|
||||
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
||||
</Filter>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="..\..\..\include\opencsd\c_api\ocsd_c_api_types.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\opencsd\c_api\opencsd_c_api.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\source\c_api\ocsd_c_api_obj.h">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\opencsd\c_api\ocsd_c_api_custom.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\source\c_api\ocsd_c_api_custom_obj.h">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\opencsd\c_api\ocsd_c_api_cust_fact.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\opencsd\c_api\ocsd_c_api_cust_impl.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="..\..\..\source\c_api\ocsd_c_api.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\source\c_api\ocsd_c_api_custom_obj.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
</Project>
|
@ -0,0 +1,135 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio 14
|
||||
VisualStudioVersion = 14.0.25420.1
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "opencsd_lib", "ref_trace_decode_lib.vcxproj", "{7F500891-CC76-405F-933F-F682BC39F923}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ocsd_c_api_lib", "..\rctdl_c_api_lib\rctdl_c_api_lib.vcxproj", "{533F929A-A73B-46B6-9D5F-FFCD62F734E3}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "snapshot_parser_lib", "..\..\..\tests\build\win-vs2015\snapshot_parser_lib\snapshot_parser_lib.vcxproj", "{DE1F395D-4F53-42FB-8AEF-993A4BF7E411}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{7F500891-CC76-405F-933F-F682BC39F923} = {7F500891-CC76-405F-933F-F682BC39F923}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "trc_pkt_lister", "..\..\..\tests\build\win-vs2015\trc_pkt_lister\trc_pkt_lister.vcxproj", "{18ABC652-AB11-4993-9491-1A7FB7117339}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{7F500891-CC76-405F-933F-F682BC39F923} = {7F500891-CC76-405F-933F-F682BC39F923}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "c_api_pkt_print_test", "..\..\..\tests\build\win-vs2015\c_api_pkt_print_test\c_api_pkt_print_test.vcxproj", "{3AC169DA-E156-4D16-95DF-73D7302A5606}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{46219A32-8178-41C1-B3B1-B5A6E547515F} = {46219A32-8178-41C1-B3B1-B5A6E547515F}
|
||||
{533F929A-A73B-46B6-9D5F-FFCD62F734E3} = {533F929A-A73B-46B6-9D5F-FFCD62F734E3}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ext_dcd_echo_test", "..\..\..\tests\build\win-vs2015\ext_dcd_echo_test\ext_dcd_echo_test.vcxproj", "{46219A32-8178-41C1-B3B1-B5A6E547515F}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{533F929A-A73B-46B6-9D5F-FFCD62F734E3} = {533F929A-A73B-46B6-9D5F-FFCD62F734E3}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Win32 = Debug|Win32
|
||||
Debug|x64 = Debug|x64
|
||||
Debug-dll|Win32 = Debug-dll|Win32
|
||||
Debug-dll|x64 = Debug-dll|x64
|
||||
Release|Win32 = Release|Win32
|
||||
Release|x64 = Release|x64
|
||||
Release-dll|Win32 = Release-dll|Win32
|
||||
Release-dll|x64 = Release-dll|x64
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{7F500891-CC76-405F-933F-F682BC39F923}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||
{7F500891-CC76-405F-933F-F682BC39F923}.Debug|Win32.Build.0 = Debug|Win32
|
||||
{7F500891-CC76-405F-933F-F682BC39F923}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{7F500891-CC76-405F-933F-F682BC39F923}.Debug|x64.Build.0 = Debug|x64
|
||||
{7F500891-CC76-405F-933F-F682BC39F923}.Debug-dll|Win32.ActiveCfg = Debug-dll|Win32
|
||||
{7F500891-CC76-405F-933F-F682BC39F923}.Debug-dll|Win32.Build.0 = Debug-dll|Win32
|
||||
{7F500891-CC76-405F-933F-F682BC39F923}.Debug-dll|x64.ActiveCfg = Debug-dll|x64
|
||||
{7F500891-CC76-405F-933F-F682BC39F923}.Debug-dll|x64.Build.0 = Debug-dll|x64
|
||||
{7F500891-CC76-405F-933F-F682BC39F923}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{7F500891-CC76-405F-933F-F682BC39F923}.Release|Win32.Build.0 = Release|Win32
|
||||
{7F500891-CC76-405F-933F-F682BC39F923}.Release|x64.ActiveCfg = Release|x64
|
||||
{7F500891-CC76-405F-933F-F682BC39F923}.Release|x64.Build.0 = Release|x64
|
||||
{7F500891-CC76-405F-933F-F682BC39F923}.Release-dll|Win32.ActiveCfg = Release-dll|Win32
|
||||
{7F500891-CC76-405F-933F-F682BC39F923}.Release-dll|Win32.Build.0 = Release-dll|Win32
|
||||
{7F500891-CC76-405F-933F-F682BC39F923}.Release-dll|x64.ActiveCfg = Release-dll|x64
|
||||
{7F500891-CC76-405F-933F-F682BC39F923}.Release-dll|x64.Build.0 = Release-dll|x64
|
||||
{533F929A-A73B-46B6-9D5F-FFCD62F734E3}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||
{533F929A-A73B-46B6-9D5F-FFCD62F734E3}.Debug|Win32.Build.0 = Debug|Win32
|
||||
{533F929A-A73B-46B6-9D5F-FFCD62F734E3}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{533F929A-A73B-46B6-9D5F-FFCD62F734E3}.Debug|x64.Build.0 = Debug|x64
|
||||
{533F929A-A73B-46B6-9D5F-FFCD62F734E3}.Debug-dll|Win32.ActiveCfg = Debug-dll|Win32
|
||||
{533F929A-A73B-46B6-9D5F-FFCD62F734E3}.Debug-dll|Win32.Build.0 = Debug-dll|Win32
|
||||
{533F929A-A73B-46B6-9D5F-FFCD62F734E3}.Debug-dll|x64.ActiveCfg = Debug-dll|x64
|
||||
{533F929A-A73B-46B6-9D5F-FFCD62F734E3}.Debug-dll|x64.Build.0 = Debug-dll|x64
|
||||
{533F929A-A73B-46B6-9D5F-FFCD62F734E3}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{533F929A-A73B-46B6-9D5F-FFCD62F734E3}.Release|Win32.Build.0 = Release|Win32
|
||||
{533F929A-A73B-46B6-9D5F-FFCD62F734E3}.Release|x64.ActiveCfg = Release|x64
|
||||
{533F929A-A73B-46B6-9D5F-FFCD62F734E3}.Release|x64.Build.0 = Release|x64
|
||||
{533F929A-A73B-46B6-9D5F-FFCD62F734E3}.Release-dll|Win32.ActiveCfg = Release-dll|Win32
|
||||
{533F929A-A73B-46B6-9D5F-FFCD62F734E3}.Release-dll|Win32.Build.0 = Release-dll|Win32
|
||||
{533F929A-A73B-46B6-9D5F-FFCD62F734E3}.Release-dll|x64.ActiveCfg = Release-dll|x64
|
||||
{533F929A-A73B-46B6-9D5F-FFCD62F734E3}.Release-dll|x64.Build.0 = Release-dll|x64
|
||||
{DE1F395D-4F53-42FB-8AEF-993A4BF7E411}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||
{DE1F395D-4F53-42FB-8AEF-993A4BF7E411}.Debug|Win32.Build.0 = Debug|Win32
|
||||
{DE1F395D-4F53-42FB-8AEF-993A4BF7E411}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{DE1F395D-4F53-42FB-8AEF-993A4BF7E411}.Debug|x64.Build.0 = Debug|x64
|
||||
{DE1F395D-4F53-42FB-8AEF-993A4BF7E411}.Debug-dll|Win32.ActiveCfg = Debug-dll|Win32
|
||||
{DE1F395D-4F53-42FB-8AEF-993A4BF7E411}.Debug-dll|x64.ActiveCfg = Debug-dll|x64
|
||||
{DE1F395D-4F53-42FB-8AEF-993A4BF7E411}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{DE1F395D-4F53-42FB-8AEF-993A4BF7E411}.Release|Win32.Build.0 = Release|Win32
|
||||
{DE1F395D-4F53-42FB-8AEF-993A4BF7E411}.Release|x64.ActiveCfg = Release|x64
|
||||
{DE1F395D-4F53-42FB-8AEF-993A4BF7E411}.Release|x64.Build.0 = Release|x64
|
||||
{DE1F395D-4F53-42FB-8AEF-993A4BF7E411}.Release-dll|Win32.ActiveCfg = Release-dll|Win32
|
||||
{DE1F395D-4F53-42FB-8AEF-993A4BF7E411}.Release-dll|x64.ActiveCfg = Release-dll|x64
|
||||
{18ABC652-AB11-4993-9491-1A7FB7117339}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||
{18ABC652-AB11-4993-9491-1A7FB7117339}.Debug|Win32.Build.0 = Debug|Win32
|
||||
{18ABC652-AB11-4993-9491-1A7FB7117339}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{18ABC652-AB11-4993-9491-1A7FB7117339}.Debug|x64.Build.0 = Debug|x64
|
||||
{18ABC652-AB11-4993-9491-1A7FB7117339}.Debug-dll|Win32.ActiveCfg = Debug-dll|Win32
|
||||
{18ABC652-AB11-4993-9491-1A7FB7117339}.Debug-dll|x64.ActiveCfg = Debug-dll|x64
|
||||
{18ABC652-AB11-4993-9491-1A7FB7117339}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{18ABC652-AB11-4993-9491-1A7FB7117339}.Release|Win32.Build.0 = Release|Win32
|
||||
{18ABC652-AB11-4993-9491-1A7FB7117339}.Release|x64.ActiveCfg = Release|x64
|
||||
{18ABC652-AB11-4993-9491-1A7FB7117339}.Release|x64.Build.0 = Release|x64
|
||||
{18ABC652-AB11-4993-9491-1A7FB7117339}.Release-dll|Win32.ActiveCfg = Release-dll|Win32
|
||||
{18ABC652-AB11-4993-9491-1A7FB7117339}.Release-dll|x64.ActiveCfg = Release-dll|x64
|
||||
{3AC169DA-E156-4D16-95DF-73D7302A5606}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||
{3AC169DA-E156-4D16-95DF-73D7302A5606}.Debug|Win32.Build.0 = Debug|Win32
|
||||
{3AC169DA-E156-4D16-95DF-73D7302A5606}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{3AC169DA-E156-4D16-95DF-73D7302A5606}.Debug|x64.Build.0 = Debug|x64
|
||||
{3AC169DA-E156-4D16-95DF-73D7302A5606}.Debug-dll|Win32.ActiveCfg = Debug-dll|Win32
|
||||
{3AC169DA-E156-4D16-95DF-73D7302A5606}.Debug-dll|Win32.Build.0 = Debug-dll|Win32
|
||||
{3AC169DA-E156-4D16-95DF-73D7302A5606}.Debug-dll|x64.ActiveCfg = Debug-dll|x64
|
||||
{3AC169DA-E156-4D16-95DF-73D7302A5606}.Debug-dll|x64.Build.0 = Debug-dll|x64
|
||||
{3AC169DA-E156-4D16-95DF-73D7302A5606}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{3AC169DA-E156-4D16-95DF-73D7302A5606}.Release|Win32.Build.0 = Release|Win32
|
||||
{3AC169DA-E156-4D16-95DF-73D7302A5606}.Release|x64.ActiveCfg = Release|x64
|
||||
{3AC169DA-E156-4D16-95DF-73D7302A5606}.Release|x64.Build.0 = Release|x64
|
||||
{3AC169DA-E156-4D16-95DF-73D7302A5606}.Release-dll|Win32.ActiveCfg = Release-dll|Win32
|
||||
{3AC169DA-E156-4D16-95DF-73D7302A5606}.Release-dll|Win32.Build.0 = Release-dll|Win32
|
||||
{3AC169DA-E156-4D16-95DF-73D7302A5606}.Release-dll|x64.ActiveCfg = Release-dll|x64
|
||||
{3AC169DA-E156-4D16-95DF-73D7302A5606}.Release-dll|x64.Build.0 = Release-dll|x64
|
||||
{46219A32-8178-41C1-B3B1-B5A6E547515F}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||
{46219A32-8178-41C1-B3B1-B5A6E547515F}.Debug|Win32.Build.0 = Debug|Win32
|
||||
{46219A32-8178-41C1-B3B1-B5A6E547515F}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{46219A32-8178-41C1-B3B1-B5A6E547515F}.Debug|x64.Build.0 = Debug|x64
|
||||
{46219A32-8178-41C1-B3B1-B5A6E547515F}.Debug-dll|Win32.ActiveCfg = Debug|Win32
|
||||
{46219A32-8178-41C1-B3B1-B5A6E547515F}.Debug-dll|Win32.Build.0 = Debug|Win32
|
||||
{46219A32-8178-41C1-B3B1-B5A6E547515F}.Debug-dll|x64.ActiveCfg = Debug|x64
|
||||
{46219A32-8178-41C1-B3B1-B5A6E547515F}.Debug-dll|x64.Build.0 = Debug|x64
|
||||
{46219A32-8178-41C1-B3B1-B5A6E547515F}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{46219A32-8178-41C1-B3B1-B5A6E547515F}.Release|Win32.Build.0 = Release|Win32
|
||||
{46219A32-8178-41C1-B3B1-B5A6E547515F}.Release|x64.ActiveCfg = Release|x64
|
||||
{46219A32-8178-41C1-B3B1-B5A6E547515F}.Release|x64.Build.0 = Release|x64
|
||||
{46219A32-8178-41C1-B3B1-B5A6E547515F}.Release-dll|Win32.ActiveCfg = Release|Win32
|
||||
{46219A32-8178-41C1-B3B1-B5A6E547515F}.Release-dll|Win32.Build.0 = Release|Win32
|
||||
{46219A32-8178-41C1-B3B1-B5A6E547515F}.Release-dll|x64.ActiveCfg = Release|x64
|
||||
{46219A32-8178-41C1-B3B1-B5A6E547515F}.Release-dll|x64.Build.0 = Release|x64
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
EndGlobal
|
@ -0,0 +1,453 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="Debug-dll|Win32">
|
||||
<Configuration>Debug-dll</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Debug-dll|x64">
|
||||
<Configuration>Debug-dll</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Debug|Win32">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Debug|x64">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release-dll|Win32">
|
||||
<Configuration>Release-dll</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release-dll|x64">
|
||||
<Configuration>Release-dll</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|Win32">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|x64">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<PropertyGroup Label="Globals">
|
||||
<ProjectGuid>{7F500891-CC76-405F-933F-F682BC39F923}</ProjectGuid>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<RootNamespace>ref_trace_decode_lib</RootNamespace>
|
||||
<ProjectName>opencsd_lib</ProjectName>
|
||||
<WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
<PlatformToolset>v140</PlatformToolset>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug-dll|Win32'" Label="Configuration">
|
||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
<PlatformToolset>v140</PlatformToolset>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
<PlatformToolset>v140</PlatformToolset>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug-dll|x64'" Label="Configuration">
|
||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
<PlatformToolset>v140</PlatformToolset>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
<PlatformToolset>v140</PlatformToolset>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release-dll|Win32'" Label="Configuration">
|
||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
<PlatformToolset>v140</PlatformToolset>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
<PlatformToolset>v140</PlatformToolset>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release-dll|x64'" Label="Configuration">
|
||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
<PlatformToolset>v140</PlatformToolset>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
<ImportGroup Label="ExtensionSettings">
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
<Import Project="..\opencsd.props" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug-dll|Win32'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
<Import Project="..\opencsd.props" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
<Import Project="..\opencsd.props" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug-dll|x64'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
<Import Project="..\opencsd.props" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
<Import Project="..\opencsd.props" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release-dll|Win32'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
<Import Project="..\opencsd.props" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
<Import Project="..\opencsd.props" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release-dll|x64'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
<Import Project="..\opencsd.props" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<OutDir>..\..\..\lib\win$(PlatformArchitecture)\dbg\</OutDir>
|
||||
<TargetName>lib$(LIB_BASE_NAME)</TargetName>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug-dll|x64'">
|
||||
<OutDir>..\..\..\lib\win$(PlatformArchitecture)\dbg\</OutDir>
|
||||
<TargetName>lib$(LIB_BASE_NAME)</TargetName>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<OutDir>..\..\..\lib\win$(PlatformArchitecture)\rel\</OutDir>
|
||||
<TargetName>lib$(LIB_BASE_NAME)</TargetName>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release-dll|x64'">
|
||||
<OutDir>..\..\..\lib\win$(PlatformArchitecture)\rel\</OutDir>
|
||||
<TargetName>lib$(LIB_BASE_NAME)</TargetName>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<OutDir>..\..\..\lib\win$(PlatformArchitecture)\rel\</OutDir>
|
||||
<TargetName>lib$(LIB_BASE_NAME)</TargetName>
|
||||
<IntDir>$(Platform)\$(Configuration)\</IntDir>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release-dll|Win32'">
|
||||
<OutDir>..\..\..\lib\win$(PlatformArchitecture)\rel\</OutDir>
|
||||
<TargetName>lib$(LIB_BASE_NAME)</TargetName>
|
||||
<IntDir>$(Platform)\$(Configuration)\</IntDir>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<OutDir>..\..\..\lib\win$(PlatformArchitecture)\dbg\</OutDir>
|
||||
<IntDir>$(Platform)\$(Configuration)\</IntDir>
|
||||
<TargetName>lib$(LIB_BASE_NAME)</TargetName>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug-dll|Win32'">
|
||||
<OutDir>..\..\..\lib\win$(PlatformArchitecture)\dbg\</OutDir>
|
||||
<TargetName>lib$(LIB_BASE_NAME)</TargetName>
|
||||
<IntDir>$(Platform)\$(Configuration)\</IntDir>
|
||||
<TargetExt>.lib</TargetExt>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
<PrecompiledHeader>
|
||||
</PrecompiledHeader>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<ProgramDataBaseFileName>$(OutDir)$(TargetName)_vc$(PlatformToolsetVersion).pdb</ProgramDataBaseFileName>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug-dll|Win32'">
|
||||
<ClCompile>
|
||||
<PrecompiledHeader>
|
||||
</PrecompiledHeader>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<ProgramDataBaseFileName>$(OutDir)$(TargetName)_vc$(PlatformToolsetVersion).pdb</ProgramDataBaseFileName>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<ClCompile>
|
||||
<PrecompiledHeader>
|
||||
</PrecompiledHeader>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions);</PreprocessorDefinitions>
|
||||
<AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<ProgramDataBaseFileName>$(OutDir)$(TargetName)_vc$(PlatformToolsetVersion).pdb</ProgramDataBaseFileName>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug-dll|x64'">
|
||||
<ClCompile>
|
||||
<PrecompiledHeader>
|
||||
</PrecompiledHeader>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions);</PreprocessorDefinitions>
|
||||
<AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<ProgramDataBaseFileName>$(OutDir)$(TargetName)_vc$(PlatformToolsetVersion).pdb</ProgramDataBaseFileName>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<PrecompiledHeader>
|
||||
</PrecompiledHeader>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<ProgramDataBaseFileName>$(OutDir)$(TargetName)_vc$(PlatformToolsetVersion).pdb</ProgramDataBaseFileName>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release-dll|Win32'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<PrecompiledHeader>
|
||||
</PrecompiledHeader>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<ProgramDataBaseFileName>$(OutDir)$(TargetName)_vc$(PlatformToolsetVersion).pdb</ProgramDataBaseFileName>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<PrecompiledHeader>
|
||||
</PrecompiledHeader>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<ProgramDataBaseFileName>$(OutDir)$(TargetName)_vc$(PlatformToolsetVersion).pdb</ProgramDataBaseFileName>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release-dll|x64'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<PrecompiledHeader>
|
||||
</PrecompiledHeader>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<ProgramDataBaseFileName>$(OutDir)$(TargetName)_vc$(PlatformToolsetVersion).pdb</ProgramDataBaseFileName>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<None Include="..\..\..\..\HOWTO.md" />
|
||||
<None Include="..\..\..\..\LICENSE" />
|
||||
<None Include="..\..\..\..\README.md" />
|
||||
<None Include="..\..\..\..\TODO" />
|
||||
<None Include="..\..\..\docs\build_libs.md" />
|
||||
<None Include="..\..\..\docs\external_custom.md" />
|
||||
<None Include="..\..\..\docs\test_progs.md" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="..\..\..\include\common\comp_attach_notifier_i.h" />
|
||||
<ClInclude Include="..\..\..\include\common\comp_attach_pt_t.h" />
|
||||
<ClInclude Include="..\..\..\include\common\ocsd_code_follower.h" />
|
||||
<ClInclude Include="..\..\..\include\common\ocsd_dcd_mngr.h" />
|
||||
<ClInclude Include="..\..\..\include\common\ocsd_dcd_mngr_i.h" />
|
||||
<ClInclude Include="..\..\..\include\common\ocsd_dcd_tree.h" />
|
||||
<ClInclude Include="..\..\..\include\common\ocsd_dcd_tree_elem.h" />
|
||||
<ClInclude Include="..\..\..\include\common\ocsd_error.h" />
|
||||
<ClInclude Include="..\..\..\include\common\ocsd_error_logger.h" />
|
||||
<ClInclude Include="..\..\..\include\common\ocsd_gen_elem_list.h" />
|
||||
<ClInclude Include="..\..\..\include\common\ocsd_lib_dcd_register.h" />
|
||||
<ClInclude Include="..\..\..\include\common\ocsd_msg_logger.h" />
|
||||
<ClInclude Include="..\..\..\include\common\ocsd_pe_context.h" />
|
||||
<ClInclude Include="..\..\..\include\common\ocsd_version.h" />
|
||||
<ClInclude Include="..\..\..\include\common\trc_component.h" />
|
||||
<ClInclude Include="..\..\..\include\common\trc_core_arch_map.h" />
|
||||
<ClInclude Include="..\..\..\include\common\trc_cs_config.h" />
|
||||
<ClInclude Include="..\..\..\include\common\trc_frame_deformatter.h" />
|
||||
<ClInclude Include="..\..\..\include\common\trc_gen_elem.h" />
|
||||
<ClInclude Include="..\..\..\include\common\trc_pkt_decode_base.h" />
|
||||
<ClInclude Include="..\..\..\include\common\trc_pkt_elem_base.h" />
|
||||
<ClInclude Include="..\..\..\include\common\trc_pkt_proc_base.h" />
|
||||
<ClInclude Include="..\..\..\include\common\trc_printable_elem.h" />
|
||||
<ClInclude Include="..\..\..\include\common\trc_ret_stack.h" />
|
||||
<ClInclude Include="..\..\..\include\opencsd\etmv3\etmv3_decoder.h" />
|
||||
<ClInclude Include="..\..\..\include\opencsd\etmv3\trc_cmp_cfg_etmv3.h" />
|
||||
<ClInclude Include="..\..\..\include\opencsd\etmv3\trc_dcd_mngr_etmv3.h" />
|
||||
<ClInclude Include="..\..\..\include\opencsd\etmv3\trc_pkt_decode_etmv3.h" />
|
||||
<ClInclude Include="..\..\..\include\opencsd\etmv3\trc_pkt_elem_etmv3.h" />
|
||||
<ClInclude Include="..\..\..\include\opencsd\etmv3\trc_pkt_proc_etmv3.h" />
|
||||
<ClInclude Include="..\..\..\include\opencsd\etmv3\trc_pkt_types_etmv3.h" />
|
||||
<ClInclude Include="..\..\..\include\opencsd\etmv4\etmv4_decoder.h" />
|
||||
<ClInclude Include="..\..\..\include\opencsd\etmv4\trc_cmp_cfg_etmv4.h" />
|
||||
<ClInclude Include="..\..\..\include\opencsd\etmv4\trc_dcd_mngr_etmv4i.h" />
|
||||
<ClInclude Include="..\..\..\include\opencsd\etmv4\trc_etmv4_stack_elem.h" />
|
||||
<ClInclude Include="..\..\..\include\opencsd\etmv4\trc_pkt_decode_etmv4i.h" />
|
||||
<ClInclude Include="..\..\..\include\opencsd\etmv4\trc_pkt_elem_etmv4d.h" />
|
||||
<ClInclude Include="..\..\..\include\opencsd\etmv4\trc_pkt_elem_etmv4i.h" />
|
||||
<ClInclude Include="..\..\..\include\opencsd\etmv4\trc_pkt_proc_etmv4.h" />
|
||||
<ClInclude Include="..\..\..\include\opencsd\etmv4\trc_pkt_types_etmv4.h" />
|
||||
<ClInclude Include="..\..\..\include\interfaces\trc_abs_typed_base_i.h" />
|
||||
<ClInclude Include="..\..\..\include\interfaces\trc_data_rawframe_in_i.h" />
|
||||
<ClInclude Include="..\..\..\include\interfaces\trc_data_raw_in_i.h" />
|
||||
<ClInclude Include="..\..\..\include\interfaces\trc_error_log_i.h" />
|
||||
<ClInclude Include="..\..\..\include\interfaces\trc_gen_elem_in_i.h" />
|
||||
<ClInclude Include="..\..\..\include\interfaces\trc_indexer_pkt_i.h" />
|
||||
<ClInclude Include="..\..\..\include\interfaces\trc_indexer_src_i.h" />
|
||||
<ClInclude Include="..\..\..\include\interfaces\trc_instr_decode_i.h" />
|
||||
<ClInclude Include="..\..\..\include\interfaces\trc_pkt_in_i.h" />
|
||||
<ClInclude Include="..\..\..\include\interfaces\trc_pkt_raw_in_i.h" />
|
||||
<ClInclude Include="..\..\..\include\interfaces\trc_tgt_mem_access_i.h" />
|
||||
<ClInclude Include="..\..\..\include\i_dec\trc_idec_arminst.h" />
|
||||
<ClInclude Include="..\..\..\include\i_dec\trc_i_decode.h" />
|
||||
<ClInclude Include="..\..\..\include\mem_acc\trc_mem_acc.h" />
|
||||
<ClInclude Include="..\..\..\include\mem_acc\trc_mem_acc_base.h" />
|
||||
<ClInclude Include="..\..\..\include\mem_acc\trc_mem_acc_bufptr.h" />
|
||||
<ClInclude Include="..\..\..\include\mem_acc\trc_mem_acc_cb.h" />
|
||||
<ClInclude Include="..\..\..\include\mem_acc\trc_mem_acc_cb_if.h" />
|
||||
<ClInclude Include="..\..\..\include\mem_acc\trc_mem_acc_file.h" />
|
||||
<ClInclude Include="..\..\..\include\mem_acc\trc_mem_acc_mapper.h" />
|
||||
<ClInclude Include="..\..\..\include\opencsd\ocsd_if_types.h" />
|
||||
<ClInclude Include="..\..\..\include\ocsd_if_version.h" />
|
||||
<ClInclude Include="..\..\..\include\opencsd.h" />
|
||||
<ClInclude Include="..\..\..\include\pkt_printers\gen_elem_printer.h" />
|
||||
<ClInclude Include="..\..\..\include\pkt_printers\item_printer.h" />
|
||||
<ClInclude Include="..\..\..\include\pkt_printers\pkt_printer_t.h" />
|
||||
<ClInclude Include="..\..\..\include\pkt_printers\raw_frame_printer.h" />
|
||||
<ClInclude Include="..\..\..\include\pkt_printers\trc_pkt_printers.h" />
|
||||
<ClInclude Include="..\..\..\include\pkt_printers\trc_print_fact.h" />
|
||||
<ClInclude Include="..\..\..\include\opencsd\ptm\ptm_decoder.h" />
|
||||
<ClInclude Include="..\..\..\include\opencsd\ptm\trc_cmp_cfg_ptm.h" />
|
||||
<ClInclude Include="..\..\..\include\opencsd\ptm\trc_dcd_mngr_ptm.h" />
|
||||
<ClInclude Include="..\..\..\include\opencsd\ptm\trc_pkt_decode_ptm.h" />
|
||||
<ClInclude Include="..\..\..\include\opencsd\ptm\trc_pkt_elem_ptm.h" />
|
||||
<ClInclude Include="..\..\..\include\opencsd\ptm\trc_pkt_proc_ptm.h" />
|
||||
<ClInclude Include="..\..\..\include\opencsd\ptm\trc_pkt_types_ptm.h" />
|
||||
<ClInclude Include="..\..\..\include\opencsd\stm\stm_decoder.h" />
|
||||
<ClInclude Include="..\..\..\include\opencsd\stm\trc_cmp_cfg_stm.h" />
|
||||
<ClInclude Include="..\..\..\include\opencsd\stm\trc_dcd_mngr_stm.h" />
|
||||
<ClInclude Include="..\..\..\include\opencsd\stm\trc_pkt_decode_stm.h" />
|
||||
<ClInclude Include="..\..\..\include\opencsd\stm\trc_pkt_elem_stm.h" />
|
||||
<ClInclude Include="..\..\..\include\opencsd\stm\trc_pkt_proc_stm.h" />
|
||||
<ClInclude Include="..\..\..\include\opencsd\stm\trc_pkt_types_stm.h" />
|
||||
<ClInclude Include="..\..\..\include\opencsd\trc_gen_elem_types.h" />
|
||||
<ClInclude Include="..\..\..\include\opencsd\trc_pkt_types.h" />
|
||||
<ClInclude Include="..\..\..\source\etmv3\trc_pkt_proc_etmv3_impl.h" />
|
||||
<ClInclude Include="..\..\..\source\etmv4\trc_pkt_proc_etmv4d_impl.h" />
|
||||
<ClInclude Include="..\..\..\source\etmv4\trc_pkt_proc_etmv4i_impl.h" />
|
||||
<ClInclude Include="..\..\..\source\trc_frame_deformatter_impl.h" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="..\..\..\source\etmv3\trc_cmp_cfg_etmv3.cpp" />
|
||||
<ClCompile Include="..\..\..\source\etmv3\trc_pkt_decode_etmv3.cpp" />
|
||||
<ClCompile Include="..\..\..\source\etmv3\trc_pkt_elem_etmv3.cpp" />
|
||||
<ClCompile Include="..\..\..\source\etmv3\trc_pkt_proc_etmv3.cpp" />
|
||||
<ClCompile Include="..\..\..\source\etmv3\trc_pkt_proc_etmv3_impl.cpp" />
|
||||
<ClCompile Include="..\..\..\source\etmv4\trc_cmp_cfg_etmv4.cpp" />
|
||||
<ClCompile Include="..\..\..\source\etmv4\trc_etmv4_stack_elem.cpp" />
|
||||
<ClCompile Include="..\..\..\source\etmv4\trc_pkt_decode_etmv4i.cpp" />
|
||||
<ClCompile Include="..\..\..\source\etmv4\trc_pkt_elem_etmv4d.cpp" />
|
||||
<ClCompile Include="..\..\..\source\etmv4\trc_pkt_elem_etmv4i.cpp" />
|
||||
<ClCompile Include="..\..\..\source\etmv4\trc_pkt_proc_etmv4.cpp" />
|
||||
<ClCompile Include="..\..\..\source\etmv4\trc_pkt_proc_etmv4i_impl.cpp" />
|
||||
<ClCompile Include="..\..\..\source\i_dec\trc_idec_arminst.cpp" />
|
||||
<ClCompile Include="..\..\..\source\i_dec\trc_i_decode.cpp" />
|
||||
<ClCompile Include="..\..\..\source\mem_acc\trc_mem_acc_base.cpp" />
|
||||
<ClCompile Include="..\..\..\source\mem_acc\trc_mem_acc_bufptr.cpp" />
|
||||
<ClCompile Include="..\..\..\source\mem_acc\trc_mem_acc_cb.cpp" />
|
||||
<ClCompile Include="..\..\..\source\mem_acc\trc_mem_acc_file.cpp" />
|
||||
<ClCompile Include="..\..\..\source\mem_acc\trc_mem_acc_mapper.cpp" />
|
||||
<ClCompile Include="..\..\..\source\ocsd_code_follower.cpp" />
|
||||
<ClCompile Include="..\..\..\source\ocsd_dcd_tree.cpp" />
|
||||
<ClCompile Include="..\..\..\source\ocsd_error.cpp" />
|
||||
<ClCompile Include="..\..\..\source\ocsd_error_logger.cpp" />
|
||||
<ClCompile Include="..\..\..\source\ocsd_gen_elem_list.cpp" />
|
||||
<ClCompile Include="..\..\..\source\ocsd_lib_dcd_register.cpp" />
|
||||
<ClCompile Include="..\..\..\source\ocsd_msg_logger.cpp" />
|
||||
<ClCompile Include="..\..\..\source\ocsd_version.cpp" />
|
||||
<ClCompile Include="..\..\..\source\pkt_printers\raw_frame_printer.cpp" />
|
||||
<ClCompile Include="..\..\..\source\pkt_printers\trc_print_fact.cpp" />
|
||||
<ClCompile Include="..\..\..\source\ptm\trc_cmp_cfg_ptm.cpp" />
|
||||
<ClCompile Include="..\..\..\source\ptm\trc_pkt_decode_ptm.cpp" />
|
||||
<ClCompile Include="..\..\..\source\ptm\trc_pkt_elem_ptm.cpp" />
|
||||
<ClCompile Include="..\..\..\source\ptm\trc_pkt_proc_ptm.cpp" />
|
||||
<ClCompile Include="..\..\..\source\stm\trc_pkt_decode_stm.cpp" />
|
||||
<ClCompile Include="..\..\..\source\stm\trc_pkt_elem_stm.cpp" />
|
||||
<ClCompile Include="..\..\..\source\stm\trc_pkt_proc_stm.cpp" />
|
||||
<ClCompile Include="..\..\..\source\trc_component.cpp" />
|
||||
<ClCompile Include="..\..\..\source\trc_core_arch_map.cpp" />
|
||||
<ClCompile Include="..\..\..\source\trc_frame_deformatter.cpp" />
|
||||
<ClCompile Include="..\..\..\source\trc_gen_elem.cpp" />
|
||||
<ClCompile Include="..\..\..\source\trc_printable_elem.cpp" />
|
||||
<ClCompile Include="..\..\..\source\trc_ret_stack.cpp" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
@ -0,0 +1,488 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup>
|
||||
<Filter Include="Source Files">
|
||||
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
||||
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="Header Files">
|
||||
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
||||
<Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="Resource Files">
|
||||
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
|
||||
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="interfaces">
|
||||
<UniqueIdentifier>{80012968-9f0d-4623-901a-c2fa5f1c0890}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Header Files\etmv3">
|
||||
<UniqueIdentifier>{98cd2a71-b44f-4884-bb8a-56c851cc8321}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Header Files\etmv4">
|
||||
<UniqueIdentifier>{dd155712-7990-4cdd-b9b0-299d97f625e4}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Header Files\ptm">
|
||||
<UniqueIdentifier>{9ec501e2-9ba4-4bad-a3d3-cdb604cc38b4}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Header Files\mem_acc">
|
||||
<UniqueIdentifier>{23a35c62-e38f-43f6-a03b-6f1287478a69}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Header Files\i_dec">
|
||||
<UniqueIdentifier>{f550018a-8974-4f8b-975a-bd8b86ae418f}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Header Files\stm">
|
||||
<UniqueIdentifier>{2c796b59-81f6-49c9-88cf-e90ed2e741a3}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="docs-files">
|
||||
<UniqueIdentifier>{5ea7e02d-0667-4d2d-8c3d-039daf112edc}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Source Files\ptm">
|
||||
<UniqueIdentifier>{2aa8a97b-13da-4bd1-bdb5-02f3e1cf030b}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Source Files\etmv4">
|
||||
<UniqueIdentifier>{ff9157b6-ef07-41e4-8ff4-322c50ea6665}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Source Files\etmv3">
|
||||
<UniqueIdentifier>{0c2ba881-cc82-4567-ab59-d2363b4c3d1b}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Source Files\stm">
|
||||
<UniqueIdentifier>{73a56760-b7ff-4d56-88f0-13249201081c}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Source Files\i_dec">
|
||||
<UniqueIdentifier>{cb3682ee-abbd-44c3-a175-4522d76e2d68}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Source Files\mem_acc">
|
||||
<UniqueIdentifier>{eb9beab1-99c6-4eaa-88c0-893b05b2e673}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Header Files\common">
|
||||
<UniqueIdentifier>{58d2398e-efdd-45d9-b7be-fc6096f3bec2}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Header Files\pkt_printers">
|
||||
<UniqueIdentifier>{0e6e1f5d-465e-4f91-88a3-479952bbd316}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Source Files\pkt_printers">
|
||||
<UniqueIdentifier>{baf047d0-0ff7-4502-b42b-4f1fda94d54b}</UniqueIdentifier>
|
||||
</Filter>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="..\..\..\..\LICENSE">
|
||||
<Filter>docs-files</Filter>
|
||||
</None>
|
||||
<None Include="..\..\..\..\README.md">
|
||||
<Filter>docs-files</Filter>
|
||||
</None>
|
||||
<None Include="..\..\..\..\TODO">
|
||||
<Filter>docs-files</Filter>
|
||||
</None>
|
||||
<None Include="..\..\..\docs\build_libs.md">
|
||||
<Filter>docs-files</Filter>
|
||||
</None>
|
||||
<None Include="..\..\..\docs\test_progs.md">
|
||||
<Filter>docs-files</Filter>
|
||||
</None>
|
||||
<None Include="..\..\..\..\HOWTO.md">
|
||||
<Filter>docs-files</Filter>
|
||||
</None>
|
||||
<None Include="..\..\..\docs\external_custom.md">
|
||||
<Filter>docs-files</Filter>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="..\..\..\source\trc_frame_deformatter_impl.h">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\interfaces\trc_tgt_mem_access_i.h">
|
||||
<Filter>interfaces</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\interfaces\trc_pkt_raw_in_i.h">
|
||||
<Filter>interfaces</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\interfaces\trc_pkt_in_i.h">
|
||||
<Filter>interfaces</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\interfaces\trc_instr_decode_i.h">
|
||||
<Filter>interfaces</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\interfaces\trc_indexer_src_i.h">
|
||||
<Filter>interfaces</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\interfaces\trc_indexer_pkt_i.h">
|
||||
<Filter>interfaces</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\interfaces\trc_gen_elem_in_i.h">
|
||||
<Filter>interfaces</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\interfaces\trc_error_log_i.h">
|
||||
<Filter>interfaces</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\interfaces\trc_data_raw_in_i.h">
|
||||
<Filter>interfaces</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\interfaces\trc_data_rawframe_in_i.h">
|
||||
<Filter>interfaces</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\opencsd\etmv3\etmv3_decoder.h">
|
||||
<Filter>Header Files\etmv3</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\opencsd\etmv3\trc_pkt_elem_etmv3.h">
|
||||
<Filter>Header Files\etmv3</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\opencsd\etmv3\trc_cmp_cfg_etmv3.h">
|
||||
<Filter>Header Files\etmv3</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\opencsd\etmv3\trc_pkt_proc_etmv3.h">
|
||||
<Filter>Header Files\etmv3</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\opencsd\etmv3\trc_pkt_types_etmv3.h">
|
||||
<Filter>Header Files\etmv3</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\opencsd\etmv4\trc_pkt_proc_etmv4.h">
|
||||
<Filter>Header Files\etmv4</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\opencsd\etmv4\trc_pkt_types_etmv4.h">
|
||||
<Filter>Header Files\etmv4</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\opencsd\etmv4\trc_pkt_elem_etmv4d.h">
|
||||
<Filter>Header Files\etmv4</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\opencsd\etmv4\trc_pkt_elem_etmv4i.h">
|
||||
<Filter>Header Files\etmv4</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\opencsd\etmv4\trc_cmp_cfg_etmv4.h">
|
||||
<Filter>Header Files\etmv4</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\opencsd\etmv4\etmv4_decoder.h">
|
||||
<Filter>Header Files\etmv4</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\opencsd\ptm\trc_pkt_elem_ptm.h">
|
||||
<Filter>Header Files\ptm</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\opencsd\ptm\trc_cmp_cfg_ptm.h">
|
||||
<Filter>Header Files\ptm</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\opencsd\ptm\trc_pkt_types_ptm.h">
|
||||
<Filter>Header Files\ptm</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\opencsd\ptm\trc_pkt_proc_ptm.h">
|
||||
<Filter>Header Files\ptm</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\opencsd\ptm\ptm_decoder.h">
|
||||
<Filter>Header Files\ptm</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\mem_acc\trc_mem_acc_base.h">
|
||||
<Filter>Header Files\mem_acc</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\mem_acc\trc_mem_acc_file.h">
|
||||
<Filter>Header Files\mem_acc</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\mem_acc\trc_mem_acc_bufptr.h">
|
||||
<Filter>Header Files\mem_acc</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\mem_acc\trc_mem_acc_mapper.h">
|
||||
<Filter>Header Files\mem_acc</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\i_dec\trc_idec_arminst.h">
|
||||
<Filter>Header Files\i_dec</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\i_dec\trc_i_decode.h">
|
||||
<Filter>Header Files\i_dec</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\opencsd\etmv4\trc_pkt_decode_etmv4i.h">
|
||||
<Filter>Header Files\etmv4</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\mem_acc\trc_mem_acc.h">
|
||||
<Filter>Header Files\mem_acc</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\opencsd\stm\stm_decoder.h">
|
||||
<Filter>Header Files\stm</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\opencsd\stm\trc_pkt_elem_stm.h">
|
||||
<Filter>Header Files\stm</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\opencsd\stm\trc_cmp_cfg_stm.h">
|
||||
<Filter>Header Files\stm</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\opencsd\stm\trc_pkt_proc_stm.h">
|
||||
<Filter>Header Files\stm</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\opencsd\stm\trc_pkt_types_stm.h">
|
||||
<Filter>Header Files\stm</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\opencsd\etmv3\trc_pkt_decode_etmv3.h">
|
||||
<Filter>Header Files\etmv3</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\mem_acc\trc_mem_acc_cb_if.h">
|
||||
<Filter>Header Files\mem_acc</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\mem_acc\trc_mem_acc_cb.h">
|
||||
<Filter>Header Files\mem_acc</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\opencsd\ptm\trc_pkt_decode_ptm.h">
|
||||
<Filter>Header Files\ptm</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\source\etmv4\trc_pkt_proc_etmv4d_impl.h">
|
||||
<Filter>Source Files\etmv4</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\source\etmv4\trc_pkt_proc_etmv4i_impl.h">
|
||||
<Filter>Source Files\etmv4</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\source\etmv3\trc_pkt_proc_etmv3_impl.h">
|
||||
<Filter>Source Files\etmv3</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\common\comp_attach_notifier_i.h">
|
||||
<Filter>Header Files\common</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\common\comp_attach_pt_t.h">
|
||||
<Filter>Header Files\common</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\common\ocsd_dcd_tree.h">
|
||||
<Filter>Header Files\common</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\common\ocsd_dcd_tree_elem.h">
|
||||
<Filter>Header Files\common</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\common\ocsd_error.h">
|
||||
<Filter>Header Files\common</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\common\ocsd_error_logger.h">
|
||||
<Filter>Header Files\common</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\common\ocsd_msg_logger.h">
|
||||
<Filter>Header Files\common</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\common\ocsd_version.h">
|
||||
<Filter>Header Files\common</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\common\trc_component.h">
|
||||
<Filter>Header Files\common</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\common\trc_core_arch_map.h">
|
||||
<Filter>Header Files\common</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\common\trc_frame_deformatter.h">
|
||||
<Filter>Header Files\common</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\common\trc_gen_elem.h">
|
||||
<Filter>Header Files\common</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\common\trc_pkt_decode_base.h">
|
||||
<Filter>Header Files\common</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\common\trc_pkt_proc_base.h">
|
||||
<Filter>Header Files\common</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\common\trc_printable_elem.h">
|
||||
<Filter>Header Files\common</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\opencsd.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\common\ocsd_pe_context.h">
|
||||
<Filter>Header Files\common</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\common\ocsd_code_follower.h">
|
||||
<Filter>Header Files\common</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\common\ocsd_gen_elem_list.h">
|
||||
<Filter>Header Files\common</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\common\trc_cs_config.h">
|
||||
<Filter>Header Files\common</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\common\ocsd_dcd_mngr.h">
|
||||
<Filter>Header Files\common</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\common\ocsd_dcd_mngr_i.h">
|
||||
<Filter>Header Files\common</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\common\ocsd_lib_dcd_register.h">
|
||||
<Filter>Header Files\common</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\interfaces\trc_abs_typed_base_i.h">
|
||||
<Filter>interfaces</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\opencsd\etmv4\trc_dcd_mngr_etmv4i.h">
|
||||
<Filter>Header Files\etmv4</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\opencsd\etmv3\trc_dcd_mngr_etmv3.h">
|
||||
<Filter>Source Files\etmv3</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\opencsd\ptm\trc_dcd_mngr_ptm.h">
|
||||
<Filter>Header Files\ptm</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\opencsd\stm\trc_dcd_mngr_stm.h">
|
||||
<Filter>Header Files\stm</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\common\trc_pkt_elem_base.h">
|
||||
<Filter>Header Files\common</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\opencsd\stm\trc_pkt_decode_stm.h">
|
||||
<Filter>Header Files\stm</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\ocsd_if_version.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\pkt_printers\gen_elem_printer.h">
|
||||
<Filter>Header Files\pkt_printers</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\pkt_printers\item_printer.h">
|
||||
<Filter>Header Files\pkt_printers</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\pkt_printers\pkt_printer_t.h">
|
||||
<Filter>Header Files\pkt_printers</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\pkt_printers\raw_frame_printer.h">
|
||||
<Filter>Header Files\pkt_printers</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\pkt_printers\trc_pkt_printers.h">
|
||||
<Filter>Header Files\pkt_printers</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\pkt_printers\trc_print_fact.h">
|
||||
<Filter>Header Files\pkt_printers</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\common\trc_ret_stack.h">
|
||||
<Filter>Header Files\common</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\opencsd\etmv4\trc_etmv4_stack_elem.h">
|
||||
<Filter>Header Files\etmv4</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\opencsd\ocsd_if_types.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\opencsd\trc_gen_elem_types.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\include\opencsd\trc_pkt_types.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="..\..\..\source\trc_component.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\source\trc_frame_deformatter.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\source\trc_core_arch_map.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\source\trc_printable_elem.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\source\trc_gen_elem.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\source\ptm\trc_pkt_decode_ptm.cpp">
|
||||
<Filter>Source Files\ptm</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\source\ptm\trc_pkt_elem_ptm.cpp">
|
||||
<Filter>Source Files\ptm</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\source\ptm\trc_pkt_proc_ptm.cpp">
|
||||
<Filter>Source Files\ptm</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\source\etmv4\trc_pkt_elem_etmv4d.cpp">
|
||||
<Filter>Source Files\etmv4</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\source\etmv4\trc_pkt_elem_etmv4i.cpp">
|
||||
<Filter>Source Files\etmv4</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\source\etmv4\trc_pkt_proc_etmv4.cpp">
|
||||
<Filter>Source Files\etmv4</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\source\etmv4\trc_pkt_proc_etmv4i_impl.cpp">
|
||||
<Filter>Source Files\etmv4</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\source\etmv4\trc_pkt_decode_etmv4i.cpp">
|
||||
<Filter>Source Files\etmv4</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\source\etmv3\trc_pkt_elem_etmv3.cpp">
|
||||
<Filter>Source Files\etmv3</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\source\etmv3\trc_pkt_decode_etmv3.cpp">
|
||||
<Filter>Source Files\etmv3</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\source\etmv3\trc_cmp_cfg_etmv3.cpp">
|
||||
<Filter>Source Files\etmv3</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\source\etmv3\trc_pkt_proc_etmv3.cpp">
|
||||
<Filter>Source Files\etmv3</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\source\etmv3\trc_pkt_proc_etmv3_impl.cpp">
|
||||
<Filter>Source Files\etmv3</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\source\etmv4\trc_cmp_cfg_etmv4.cpp">
|
||||
<Filter>Source Files\etmv4</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\source\ptm\trc_cmp_cfg_ptm.cpp">
|
||||
<Filter>Source Files\ptm</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\source\stm\trc_pkt_proc_stm.cpp">
|
||||
<Filter>Source Files\stm</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\source\stm\trc_pkt_elem_stm.cpp">
|
||||
<Filter>Source Files\stm</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\source\i_dec\trc_i_decode.cpp">
|
||||
<Filter>Source Files\i_dec</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\source\i_dec\trc_idec_arminst.cpp">
|
||||
<Filter>Source Files\i_dec</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\source\mem_acc\trc_mem_acc_base.cpp">
|
||||
<Filter>Source Files\mem_acc</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\source\mem_acc\trc_mem_acc_mapper.cpp">
|
||||
<Filter>Source Files\mem_acc</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\source\mem_acc\trc_mem_acc_bufptr.cpp">
|
||||
<Filter>Source Files\mem_acc</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\source\mem_acc\trc_mem_acc_cb.cpp">
|
||||
<Filter>Source Files\mem_acc</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\source\mem_acc\trc_mem_acc_file.cpp">
|
||||
<Filter>Source Files\mem_acc</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\source\ocsd_dcd_tree.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\source\ocsd_error.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\source\ocsd_error_logger.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\source\ocsd_msg_logger.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\source\ocsd_version.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\source\ocsd_code_follower.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\source\ocsd_gen_elem_list.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\source\ocsd_lib_dcd_register.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\source\stm\trc_pkt_decode_stm.cpp">
|
||||
<Filter>Source Files\stm</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\source\pkt_printers\raw_frame_printer.cpp">
|
||||
<Filter>Source Files\pkt_printers</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\source\pkt_printers\trc_print_fact.cpp">
|
||||
<Filter>Source Files\pkt_printers</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\source\trc_ret_stack.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\source\etmv4\trc_etmv4_stack_elem.cpp">
|
||||
<Filter>Source Files\etmv4</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
</Project>
|
113
decoder/docs/build_libs.md
Normal file
113
decoder/docs/build_libs.md
Normal file
@ -0,0 +1,113 @@
|
||||
Building and using the Library {#build_lib}
|
||||
==============================
|
||||
|
||||
@brief How to build the library and test programs and include the library in an application
|
||||
|
||||
Platform Support
|
||||
----------------
|
||||
|
||||
The current makefiles and build projects support building the library on Linux and Windows,
|
||||
x86 or x64 hosts.
|
||||
|
||||
Support is expected for ARM linux and baremetal, AArch32 and AArch64 platforms.
|
||||
|
||||
|
||||
Building the Library
|
||||
--------------------
|
||||
|
||||
The library and test programs are built from the library `./build/<platform>` directory.
|
||||
|
||||
See [`./docs/test_progs.md`](@ref test_progs) for further information on use of the test
|
||||
programs.
|
||||
|
||||
### Linux x86/x64 ###
|
||||
|
||||
Go to the `./build/linux/` and run `make` in that directory.
|
||||
|
||||
Options to pass to the makefile are:-
|
||||
- `LINUX64=1` : build the 64 bit version of the library
|
||||
- `DEBUG=1` : build the debug version of the library.
|
||||
|
||||
Libraries are delivered to the `./lib/linux<bitsize>/<dbg\rel>` directories.
|
||||
e.g. `./lib/linux64/rel` will contain the linux 64 bit release libraries.
|
||||
|
||||
The following libraries are built:-
|
||||
- `libcstraced.so` : shared library containing the main C++ based decoder library
|
||||
- `libcstraced_c_api.so` : shared library containing the C-API wrapper library. Dependent on `libcstraced.so`
|
||||
- `libcstraced.a` : static library containing the main C++ based decoder library.
|
||||
- `libcstraced_c_api.a` : static library containing the C-API wrapper library.
|
||||
|
||||
Test programs are delivered to the `./tests/bin/linux<bitsize>/<dgb\rel>` directories.
|
||||
|
||||
The test programs are built to used the .so versions of the libraries.
|
||||
- `trc_pkt_lister` - dependent on `libcstraced.so`.
|
||||
- `simple_pkt_print_c_api` - dependent on `libcstraced_c_api.so` & hence `libcstraced.so`.
|
||||
|
||||
The test program build for `trc_pkt_lister` also builds an auxiliary library used by this program for test purposes only.
|
||||
This is the `libsnapshot_parser.a` library, delivered to the `./tests/lib/linux<bitsize>/<dgb\rel>` directories.
|
||||
|
||||
### Windows ###
|
||||
|
||||
Use the `.\build\win\ref_trace_decode_lib\ref_trace_decode_lib.sln` file to load a solution
|
||||
which contains all library and test build projects.
|
||||
|
||||
Libraries are delivered to the `./lib/win<bitsize>/<dbg\rel>` directories.
|
||||
e.g. `./lib/win64/rel` will contain the windows 64 bit release libraries.
|
||||
|
||||
The solution contains four configurations:-
|
||||
- *Debug* : builds debug versions of static C++ main library and C-API libraries, test programs linked to the static library.
|
||||
- *Debug-dll* : builds debug versions of static main library and C-API DLL. C-API statically linked to the main library.
|
||||
C-API test built as `simple_pkt_print_c_api-dl.exe` and linked against the DLL version of the C-API library.
|
||||
- *Release* : builds release static library versions, test programs linked to static libraries.
|
||||
- *Release-dll* : builds release C-API DLL, static main library.
|
||||
|
||||
_Note_: Currently there is no Windows DLL version of the main C++ library. This may follow once
|
||||
the project is nearer completion with further decode protocols, and the classes requiring export are established..
|
||||
|
||||
Libraries built are:-
|
||||
- `libcstraced.lib` : static main C++ decoder library.
|
||||
- `cstraced_c_api.dll` : C-API DLL library. Statically linked against `libcstraced.lib` at .DLL build time.
|
||||
- `libcstraced_c_api.lib` : C-API static library.
|
||||
|
||||
There is also a project file to build an auxiliary library used `trc_pkt_lister` for test purposes only.
|
||||
This is the `snapshot_parser_lib.lib` library, delivered to the `./tests/lib/win<bitsize>/<dgb\rel>` directories.
|
||||
|
||||
|
||||
### Additional Build Options ###
|
||||
|
||||
__Library Virtual Address Size__
|
||||
|
||||
The ocsd_if_types.h file includes a #define that controls the size of the virtual addresses
|
||||
used within the library. By default this is a 64 bit `uint64_t` value.
|
||||
|
||||
When building for ARM architectures that have only a 32 bit Virtual Address, and building on
|
||||
32 bit ARM architectures it may be desirable to build a library that uses a v-addr size of
|
||||
32 bits. Define `USE_32BIT_V_ADDR` to enable this option
|
||||
|
||||
|
||||
Including the Library in an Application
|
||||
---------------------------------------
|
||||
|
||||
The user source code includes a header according to the API to be used:-
|
||||
|
||||
- Main C++ decoder library - include `opencsd.h`. Link to C++ library.
|
||||
- C-API library - include `opencsd_c_api.h`. Link to C-API library.
|
||||
|
||||
### Linux build ###
|
||||
|
||||
By default linux builds will link against the .so versions of the library. Using the C-API library will also
|
||||
introduce a dependency on the main C++ decoder .so. Ensure that the library paths and link commands are part of the
|
||||
application makefile.
|
||||
|
||||
To use the static versions use appropriate linker options.
|
||||
|
||||
### Windows build ###
|
||||
|
||||
To link against the C-API DLL, include the .DLL name as a dependency in the application project options.
|
||||
|
||||
To link against the C-API static library, include the library name in the dependency list, and define the macro
|
||||
`OCSD_USE_STATIC_C_API` in the preprocessor definitions. This ensures that the correct static bindings are declared in
|
||||
the header file. Also link against the main C++ library.
|
||||
|
||||
To link against the main C++ library include the library name in the dependency list.
|
||||
|
2413
decoder/docs/doxygen_config.dox
Normal file
2413
decoder/docs/doxygen_config.dox
Normal file
File diff suppressed because it is too large
Load Diff
148
decoder/docs/external_custom.md
Normal file
148
decoder/docs/external_custom.md
Normal file
@ -0,0 +1,148 @@
|
||||
Attaching External Custom Decoders {#custom_decoders}
|
||||
==================================
|
||||
|
||||
@brief A description of the C API external decoder interface.
|
||||
|
||||
Introduction
|
||||
------------
|
||||
|
||||
An external custom decoder is one which decodes a CoreSight trace byte stream from a source other
|
||||
than an ARM core which cannot be decoded by the standard built-in decoders within the library.
|
||||
|
||||
An example of this may be a trace stream from a DSP device.
|
||||
|
||||
The external decoder API allows a suitable decoder to be attached to the library and used in the
|
||||
same way as the built-in decoders. This means that the external decoder can be created and destroyed
|
||||
using the decode tree API, and will integrate seamlessly with any ARM processor decoders that are part
|
||||
of the same tree.
|
||||
|
||||
An external decoder will be required to use three standard structures:-
|
||||
|
||||
- `ocsd_extern_dcd_fact_t` : This is a decoder "factory" that allows the creation of the custom decoders.
|
||||
- `ocsd_extern_dcd_inst_t` : This structure provides decoder data to the library for a single decoder instance.
|
||||
- `ocsd_extern_dcd_cb_fns` : This structure provides a set of callback functions allowing the decoder to use library functionality in the same way as built-in decoders.
|
||||
|
||||
These structures consist of data and function pointers to allow integration with the library infrastructure.
|
||||
|
||||
Registering A Decoder
|
||||
---------------------
|
||||
|
||||
A single API function is provided to allow a decoder to be registered with the library by name.
|
||||
|
||||
ocsd_err_t ocsd_register_custom_decoder(const char *name, ocsd_extern_dcd_fact_t *p_dcd_fact);
|
||||
|
||||
This registers the custom decoder with the library using the supplied name and factory structure.
|
||||
As part of the registration function the custom decoder will be assigned a protocol ID which may be used in
|
||||
API functions requiring this parameter.
|
||||
|
||||
Once registered, the standard API functions used with the built-in decoders will work with the custom decoder.
|
||||
|
||||
The Factory Structure
|
||||
---------------------
|
||||
This structure contains the interface that is registered with the library to allow the creation of custom decoder instances.
|
||||
|
||||
The mandatory functions that must be provided include:
|
||||
- `fnCreateCustomDecoder` : Creates a decoder. This function will fill in a `ocsd_extern_dcd_inst_t` structure for the decoder instance.
|
||||
- `fnDestroyCustomDecoder` : Destroys the decoder. Takes the `decoder_handle` attribute of the instance structure.
|
||||
- `fnGetCSIDFromConfig` : Extracts the CoreSight Trace ID from the decoder configuration structure.
|
||||
May be called before the create function. The CSID is used as part of the creation process to
|
||||
attach the decoder to the correct trace byte stream.
|
||||
|
||||
`fnPacketToString` : This optional function will provide a human readable string from a protocol specific packet structure.
|
||||
|
||||
`protocol_id` : This is filled in when the decoder type is registered with the library. Used in some API
|
||||
calls to specify the decoder protocol type.
|
||||
|
||||
|
||||
|
||||
Creating a Custom Decoder Instance
|
||||
----------------------------------
|
||||
|
||||
Once the custom decoder factory has been registered with the library then using the decoder uses the standard creation API:-
|
||||
|
||||
`ocsd_dt_create_decoder(const dcd_tree_handle_t handle, const char *decoder_name, const int create_flags,
|
||||
const void *decoder_cfg, unsigned char *pCSID)`
|
||||
|
||||
|
||||
This creates a decoder by type name in the current decode tree and attaches it to the trace data stream associated with a CoreSight trace ID extracted from
|
||||
the trace configuration.
|
||||
|
||||
To create a custom decoder instance simply use the custom name and a pointer to the custom configuration structure.
|
||||
|
||||
Calling this on a custom decoder name will result in a call to the factor function `fnCreateCustomDecoder` function:-
|
||||
`ocsd_err_t CreateCustomDecoder(const int create_flags, const void *decoder_cfg, const ocsd_extern_dcd_cb_fns *p_lib_callbacks, ocsd_extern_dcd_inst_t *p_decoder_inst)`
|
||||
|
||||
This will first require that the `ocsd_extern_dcd_inst_t` structure is populated.
|
||||
|
||||
There is are two mandatory function calls in this structure that may be called by the library
|
||||
|
||||
`fnTraceDataIn` : the decoder must provide this as this is called by the library to provide the
|
||||
raw trace data to the decoder.
|
||||
|
||||
`fn_update_pkt_mon` : Allows the library to communicate when packet sink / packet monitor interfaces are attached to the decoder and in use.
|
||||
|
||||
The decoder creation process will also fill in the additional information to allow the library to correctly call back into the custom decoder using the `decoder_handle` parameter.
|
||||
|
||||
Secondly the library will provide a structure of callback functions - `ocsd_extern_dcd_cb_fns` - that the decoder can use to access standard library functionality.
|
||||
This includes the standard error and message logging functions, the memory access and ARM instruction decode functions, plus the current output sink for generic
|
||||
trace elements generated by the decoder. The decoder is not required to use these functions - indeed the ARM instruction decode will not be useful to none ARM
|
||||
architecture decoders, but should where possible use these functions if being used as part of a combined ARM / custom decoder tree. This will simplify client
|
||||
use of the external decoders.
|
||||
|
||||
The `create_flags` parameter will describe the expected operational mode for the decoder. The flags are:-
|
||||
- `OCSD_CREATE_FLG_PACKET_PROC` : Packet processing only - the decoder will split the incoming stream into protocol trace packets and output these.
|
||||
- `OCSD_CREATE_FLG_FULL_DECODER` : Full decode - the decoder will split the incoming stream into protocol trace packets and further decode and analyse these to produce generic trace output which may describe the program flow.
|
||||
|
||||
Finally the decoder creation function will interpret the custom configuration (`decoder_cfg`) and fill in the CoreSight Trace ID parameter `pCSID`
|
||||
for this decoder instance. Decoder configuration structures describe registers and parameters used in programming up the trace source. The only
|
||||
minimum requirement is that it is possible to extract a CoreSight trace ID from the configuration to allow the library to attach the correct byte
|
||||
stream to the decoder.
|
||||
|
||||
|
||||
Example : The echo_test decoder
|
||||
--------------------------------
|
||||
|
||||
The echo_test decoder is provided to both test the C-API interfaces provided for using custom decoders and as a worked example for using these interfaces.
|
||||
|
||||
This decoder is initialised and created by the `c_api_pkt_print_test` program when the `-extern` command line option is used.
|
||||
|
||||
In order to use a custom decoder, the header files for that decoder must be included by the client as they are not part of the built-in provided by the standard library includes.
|
||||
|
||||
#include "ext_dcd_echo_test_fact.h" // provides the ext_echo_get_dcd_fact() fn
|
||||
#include "ext_dcd_echo_test.h" // provides the echo_dcd_cfg_t config structure.
|
||||
|
||||
The `register_extern_decoder()` function in the test shows how simple the API is to use.
|
||||
|
||||
The implementation of the decoder provides an external function to get a factory structure.
|
||||
|
||||
p_ext_fact = ext_echo_get_dcd_fact();
|
||||
|
||||
Assuming this returns a structure then the decoder is registered by name.
|
||||
|
||||
if (p_ext_fact)
|
||||
{
|
||||
err = ocsd_register_custom_decoder(EXT_DCD_NAME, p_ext_fact);
|
||||
}
|
||||
|
||||
After this the test uses the same code path as the built in decoders when testing the custom decoder.
|
||||
The test function `ocsd_err_t create_decoder_extern(dcd_tree_handle_t dcd_tree_h)` is called if the test parameters indicate a custom decoder is needed.
|
||||
This populates the custom configuration structure specific to the echo_test decoder (`echo_dcd_cfg_t`), then passes this plus the decoder name to the same `create_generic_decoder()` function used when testing the built in decoders.
|
||||
|
||||
|
||||
static ocsd_err_t create_decoder_extern(dcd_tree_handle_t dcd_tree_h)
|
||||
{
|
||||
echo_dcd_cfg_t trace_cfg_ext;
|
||||
|
||||
/* setup the custom configuration */
|
||||
trace_cfg_ext.cs_id = 0x010;
|
||||
if (test_trc_id_override != 0)
|
||||
{
|
||||
trace_cfg_ext.cs_id = (uint32_t)test_trc_id_override;
|
||||
}
|
||||
|
||||
/* create an external decoder - no context needed as we have a single stream to a single handler. */
|
||||
return create_generic_decoder(dcd_tree_h, EXT_DCD_NAME, (void *)&trace_cfg_ext, 0);
|
||||
}
|
||||
|
||||
From the test program perspective, these are the only changes made to the test program to test this decoder.
|
||||
The `create_generic_decoder()` then uses the normal C-API calls such as `ocsd_dt_create_decoder()` and `ocsd_dt_attach_packet_callback()` to hook the decoder into the decode tree infrastructure.
|
Binary file not shown.
199
decoder/docs/test_progs.md
Normal file
199
decoder/docs/test_progs.md
Normal file
@ -0,0 +1,199 @@
|
||||
Test Programs {#test_progs}
|
||||
=============
|
||||
|
||||
@brief A description of the test programs used with the library.
|
||||
|
||||
The Programs
|
||||
------------
|
||||
|
||||
There are currently two test programs built alongside the library.
|
||||
|
||||
1. `trc_pkt_lister` : This test 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.
|
||||
|
||||
2. `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 to validate the external decoder API.
|
||||
See [external_custom.md](@ref custom_decoders) for details.
|
||||
|
||||
These programs are both built at the same time as the library for the same set of platforms.
|
||||
See [build_libs.md](@ref build_lib) for build details.
|
||||
|
||||
|
||||
Trace "Snapshot" directory.
|
||||
----------------------------
|
||||
|
||||
The `.\tests\snapshots` directory contains 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. The snapshot format is available
|
||||
in a separate document.
|
||||
|
||||
The `trc_pkt_lister` program.
|
||||
-----------------------------
|
||||
|
||||
This will take a snapshot directory as an input, and list and/or decode all the trace packets for a
|
||||
single source, for any currently supported protocol.
|
||||
|
||||
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 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 mutiple times) - default if no id set is for all IDs to be printed.
|
||||
- `-src_name <name>` : List packets from a given snapshot source name (defaults to first source found).
|
||||
- `-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.
|
||||
- `-o_raw_packed` : Output raw packed trace frames.
|
||||
- `-o_raw_unpacked` : Output raw unpacked trace data per ID.
|
||||
|
||||
*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.
|
||||
|
||||
|
||||
__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 for STM packet 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:17230; ID:10; RCTDL_GEN_TRC_ELEM_TRACE_ON()
|
||||
Idx:17232; ID:10; RCTDL_GEN_TRC_ELEM_PE_CONTEXT(EL1N; AArch64; VMID=0x0; CTXTID=0x0; )
|
||||
Idx:17248; ID:10; RCTDL_GEN_TRC_ELEM_INSTR_RANGE(exec range=0xffffffc000096a00:[0xffffffc000096a10] )
|
||||
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; RCTDL_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; RCTDL_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=0x005AC4C8;
|
||||
Idx:17270; ID:10; [0xdb ]; I_ATOM_F2 : Atom format 2.; EE
|
||||
Idx:17270; ID:10; RCTDL_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=0x000EA588;
|
||||
Idx:17276; ID:10; [0xfc ]; I_ATOM_F3 : Atom format 3.; NNE
|
||||
Idx:17276; ID:10; RCTDL_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=0x00592B60;
|
||||
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=0x00592B64 ~[0x164]
|
||||
Idx:17283; ID:10; RCTDL_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=0x00083280;
|
||||
Idx:17292; ID:10; [0xfd ]; I_ATOM_F3 : Atom format 3.; ENE
|
||||
Idx:17292; ID:10; RCTDL_GEN_TRC_ELEM_INSTR_RANGE(exec range=0xffffffc000083280:[0xffffffc000083284] )
|
||||
Idx:17292; ID:10; RCTDL_GEN_TRC_ELEM_INSTR_RANGE(exec range=0xffffffc000083d40:[0xffffffc000083d9c] )
|
||||
Idx:17292; ID:10; RCTDL_GEN_TRC_ELEM_INSTR_RANGE(exec range=0xffffffc000083d9c:[0xffffffc000083dac] )
|
||||
Idx:17293; ID:10; [0x95 0xf7 0x09 ]; I_ADDR_S_IS0 : Address, Short, IS0.; Addr=0x000813DC ~[0x13DC]
|
||||
Idx:17297; ID:10; [0xdb ]; I_ATOM_F2 : Atom format 2.; EE
|
||||
Idx:17297; ID:10; RCTDL_GEN_TRC_ELEM_INSTR_RANGE(exec range=0xffffffc0000813dc:[0xffffffc0000813f0] )
|
||||
Idx:17297; ID:10; RCTDL_GEN_TRC_ELEM_INSTR_RANGE(exec range=0xffffffc00008f2e0:[0xffffffc00008f2e4] )
|
||||
Idx:17298; ID:10; [0x95 0x7e ]; I_ADDR_S_IS0 : Address, Short, IS0.; Addr=0x000813F8 ~[0x1F8]
|
||||
Idx:17300; ID:10; [0xe0 ]; I_ATOM_F6 : Atom format 6.; EEEN
|
||||
Idx:17300; ID:10; RCTDL_GEN_TRC_ELEM_INSTR_RANGE(exec range=0xffffffc0000813f8:[0xffffffc00008140c] )
|
||||
Idx:17300; ID:10; RCTDL_GEN_TRC_ELEM_INSTR_RANGE(exec range=0xffffffc00008141c:[0xffffffc000081434] )
|
||||
Idx:17300; ID:10; RCTDL_GEN_TRC_ELEM_INSTR_RANGE(exec range=0xffffffc00008140c:[0xffffffc000081414] )
|
||||
Idx:17300; ID:10; RCTDL_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.
|
63
decoder/include/common/comp_attach_notifier_i.h
Normal file
63
decoder/include/common/comp_attach_notifier_i.h
Normal file
@ -0,0 +1,63 @@
|
||||
/*!
|
||||
* \file comp_attach_notifier_i.h
|
||||
* \brief OpenCSD : Component attach point notifier interface.
|
||||
*
|
||||
* \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef ARM_COMP_ATTACH_NOTIFIER_I_H_INCLUDED
|
||||
#define ARM_COMP_ATTACH_NOTIFIER_I_H_INCLUDED
|
||||
|
||||
/*!
|
||||
* @class IComponentAttachNotifier
|
||||
* @addtogroup ocsd_infrastructure
|
||||
* @brief Notification interface for attachment.
|
||||
*
|
||||
* Interface to the componentAttachPt classes that allow notification on component
|
||||
* connect and disconnect.
|
||||
*/
|
||||
class IComponentAttachNotifier {
|
||||
public:
|
||||
IComponentAttachNotifier() {}; /**< Default interface constructor */
|
||||
virtual ~IComponentAttachNotifier() {}; /**< Default interface destructor */
|
||||
|
||||
/*!
|
||||
* Callback called by the componentAttachPt() classes when a component is attached
|
||||
* to or detached from the attach point.
|
||||
*
|
||||
* @param num_attached : number of remaining components attached to the point after the
|
||||
* operation that triggered the notification.
|
||||
*/
|
||||
virtual void attachNotify(const int num_attached) = 0;
|
||||
};
|
||||
|
||||
#endif // ARM_COMP_ATTACH_NOTIFIER_I_H_INCLUDED
|
||||
|
||||
/* End of File comp_attach_notifier_i.h */
|
240
decoder/include/common/comp_attach_pt_t.h
Normal file
240
decoder/include/common/comp_attach_pt_t.h
Normal file
@ -0,0 +1,240 @@
|
||||
/*!
|
||||
* \file comp_attach_pt_t.h
|
||||
* \brief OpenCSD : Component attachment point interface class.
|
||||
*
|
||||
* \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef ARM_COMP_ATTACH_PT_T_H_INCLUDED
|
||||
#define ARM_COMP_ATTACH_PT_T_H_INCLUDED
|
||||
|
||||
#include <vector>
|
||||
#include "opencsd/ocsd_if_types.h"
|
||||
|
||||
/** @defgroup ocsd_infrastructure OpenCSD Library : Library Component Infrastructure
|
||||
|
||||
@brief Classes providing library infrastructure and auxilary functionality
|
||||
@{*/
|
||||
|
||||
#include "comp_attach_notifier_i.h"
|
||||
|
||||
/*!
|
||||
* @class componentAttachPt
|
||||
* @brief Single component interface pointer attachment point.
|
||||
*
|
||||
* This is a class template to standardise the connections between decode components.
|
||||
*
|
||||
* An attachment point connects a component interface pointer to the component providing the
|
||||
* attachment point.
|
||||
*
|
||||
* This attachment point implementation allows a single interface to be connected.
|
||||
*
|
||||
*/
|
||||
template <class T>
|
||||
class componentAttachPt {
|
||||
public:
|
||||
componentAttachPt(); /**< Default constructor */
|
||||
virtual ~componentAttachPt(); /**< Default destructor */
|
||||
|
||||
/*!
|
||||
* Attach an interface of type T to the attachment point.
|
||||
*
|
||||
* @param component : interface to attach.
|
||||
*
|
||||
* @return ocsd_err_t : OCSD_OK if successful, OCSD_ERR_ATTACH_TOO_MANY if too many connections.
|
||||
*/
|
||||
virtual ocsd_err_t attach(T* component);
|
||||
|
||||
/*!
|
||||
* Detach component from the attachment point.
|
||||
*
|
||||
* @param component : Component to detach.
|
||||
*
|
||||
* @return virtual ocsd_err_t : OCSD_OK if successful, OCSD_ERR_ATTACH_COMP_NOT_FOUND if no match to component.
|
||||
*/
|
||||
virtual ocsd_err_t detach(T* component);
|
||||
|
||||
|
||||
// detach current first if anything attached, connect supplied pointer, remain unattached if pointer 0
|
||||
virtual ocsd_err_t replace_first(T* component);
|
||||
|
||||
/*!
|
||||
* Detach all components.
|
||||
*/
|
||||
virtual void detach_all();
|
||||
|
||||
/*!
|
||||
* Return the current (first) attached interface pointer.
|
||||
* Will return 0 if nothing attached or the attachment point is disabled.
|
||||
*
|
||||
* @return T* : Current Interface pointer of type T or 0.
|
||||
*/
|
||||
virtual T* first();
|
||||
|
||||
/*!
|
||||
* Return the next attached interface.
|
||||
* The componentAttachPt base implmentation will always return 0 as only a single attachment is possible
|
||||
*
|
||||
* @return T* : Always returns 0.
|
||||
*/
|
||||
virtual T* next();
|
||||
|
||||
/*!
|
||||
* Returns the number of interface pointers attached to this attachment point.
|
||||
*
|
||||
* @return int : number of component interfaces attached.
|
||||
*/
|
||||
virtual int num_attached();
|
||||
|
||||
/*!
|
||||
* Attach a notifier interface to the attachment point. Will call back on this interface whenever
|
||||
* a component is attached or detached.
|
||||
*
|
||||
* @param *notifier : pointer to the IComponentAttachNotifier interface.
|
||||
*/
|
||||
void set_notifier(IComponentAttachNotifier *notifier);
|
||||
|
||||
/* enable state does not affect attach / detach, but can be used to filter access to interfaces */
|
||||
const bool enabled() const; /**< return the enabled flag. */
|
||||
void set_enabled(const bool enable);
|
||||
|
||||
|
||||
/*!
|
||||
* Check to see if any attachements. Will return attach state independent of enable state.
|
||||
*
|
||||
* @return const bool : true if attachment.
|
||||
*/
|
||||
const bool hasAttached() const { return m_hasAttached; };
|
||||
|
||||
|
||||
/*!
|
||||
* Return both the attachment and enabled state.
|
||||
*
|
||||
* @return const bool : true if both has attachment and is enabled.
|
||||
*/
|
||||
const bool hasAttachedAndEnabled() const { return m_hasAttached && m_enabled; };
|
||||
|
||||
protected:
|
||||
bool m_enabled; /**< Flag to indicate if the attachment point is enabled. */
|
||||
bool m_hasAttached; /**< Flag indicating at least one attached interface */
|
||||
IComponentAttachNotifier *m_notifier; /**< Optional attachement notifier interface. */
|
||||
T *m_comp; /**< pointer to the single attached interface */
|
||||
};
|
||||
|
||||
|
||||
|
||||
template<class T> componentAttachPt<T>::componentAttachPt()
|
||||
{
|
||||
m_comp = 0;
|
||||
m_notifier = 0;
|
||||
m_enabled = true;
|
||||
m_hasAttached = false;
|
||||
}
|
||||
|
||||
template<class T> componentAttachPt<T>::~componentAttachPt()
|
||||
{
|
||||
detach_all();
|
||||
}
|
||||
|
||||
|
||||
template<class T> ocsd_err_t componentAttachPt<T>::attach(T* component)
|
||||
{
|
||||
if(m_comp != 0)
|
||||
return OCSD_ERR_ATTACH_TOO_MANY;
|
||||
m_comp = component;
|
||||
if(m_notifier) m_notifier->attachNotify(1);
|
||||
m_hasAttached = true;
|
||||
return OCSD_OK;
|
||||
}
|
||||
|
||||
template<class T> ocsd_err_t componentAttachPt<T>::replace_first(T* component)
|
||||
{
|
||||
if(m_hasAttached)
|
||||
detach(m_comp);
|
||||
|
||||
if(component == 0)
|
||||
return OCSD_OK;
|
||||
|
||||
return attach(component);
|
||||
}
|
||||
|
||||
template<class T> ocsd_err_t componentAttachPt<T>::detach(T* component)
|
||||
{
|
||||
if(m_comp != component)
|
||||
return OCSD_ERR_ATTACH_COMP_NOT_FOUND;
|
||||
m_comp = 0;
|
||||
m_hasAttached = false;
|
||||
if(m_notifier) m_notifier->attachNotify(0);
|
||||
return OCSD_OK;
|
||||
}
|
||||
|
||||
template<class T> T* componentAttachPt<T>::first()
|
||||
{
|
||||
return (m_enabled) ? m_comp : 0;
|
||||
}
|
||||
|
||||
template<class T> T* componentAttachPt<T>::next()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
template<class T> int componentAttachPt<T>::num_attached()
|
||||
{
|
||||
return ((m_comp != 0) ? 1 : 0);
|
||||
}
|
||||
|
||||
template<class T> void componentAttachPt<T>::detach_all()
|
||||
{
|
||||
m_comp = 0;
|
||||
m_hasAttached = false;
|
||||
if(m_notifier) m_notifier->attachNotify(0);
|
||||
}
|
||||
|
||||
template<class T> void componentAttachPt<T>::set_notifier(IComponentAttachNotifier *notifier)
|
||||
{
|
||||
m_notifier = notifier;
|
||||
}
|
||||
|
||||
template<class T> const bool componentAttachPt<T>::enabled() const
|
||||
{
|
||||
return m_enabled;
|
||||
}
|
||||
|
||||
template<class T> void componentAttachPt<T>::set_enabled(const bool enable)
|
||||
{
|
||||
m_enabled = enable;
|
||||
}
|
||||
|
||||
|
||||
/** @}*/
|
||||
|
||||
#endif // ARM_COMP_ATTACH_PT_T_H_INCLUDED
|
||||
|
||||
/* End of File comp_attach_pt_t.h */
|
231
decoder/include/common/ocsd_code_follower.h
Normal file
231
decoder/include/common/ocsd_code_follower.h
Normal file
@ -0,0 +1,231 @@
|
||||
/*
|
||||
* \file ocsd_code_follower.h
|
||||
* \brief OpenCSD : Code follower for instruction trace decode
|
||||
*
|
||||
* \copyright Copyright (c) 2016, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef ARM_OCSD_CODE_FOLLOWER_H_INCLUDED
|
||||
#define ARM_OCSD_CODE_FOLLOWER_H_INCLUDED
|
||||
|
||||
#include "opencsd/ocsd_if_types.h"
|
||||
#include "opencsd/trc_pkt_types.h"
|
||||
#include "comp_attach_pt_t.h"
|
||||
#include "interfaces/trc_tgt_mem_access_i.h"
|
||||
#include "interfaces/trc_instr_decode_i.h"
|
||||
|
||||
/*!
|
||||
* @class OcsdCodeFollower
|
||||
* @brief The code follower looks for waypoints or addresses.
|
||||
*
|
||||
* Code follower used to determine the trace ranges for Atom or other waypoint
|
||||
* elements. Uses memory accessor and I decoder to follow the code path.
|
||||
*
|
||||
*/
|
||||
class OcsdCodeFollower
|
||||
{
|
||||
public:
|
||||
OcsdCodeFollower();
|
||||
~OcsdCodeFollower();
|
||||
|
||||
//*********** setup API
|
||||
void initInterfaces(componentAttachPt<ITargetMemAccess> *pMemAccess, componentAttachPt<IInstrDecode> *pIDecode);
|
||||
|
||||
// set information for decode operation - static or occasionally changing settings
|
||||
// per decode values are passed as parameters into the decode API calls.
|
||||
void setArchProfile(const ocsd_arch_profile_t profile); //!< core profile
|
||||
void setMemSpaceAccess(const ocsd_mem_space_acc_t mem_acc_rule); //!< memory space to use for access (filtered by S/NS, EL etc).
|
||||
void setMemSpaceCSID(const uint8_t csid); //!< memory spaces might be partitioned by CSID
|
||||
void setISA(const ocsd_isa isa); //!< set the ISA for the decode.
|
||||
void setDSBDMBasWP(); //!< DSB and DMB can be treated as WP in some archs.
|
||||
|
||||
//********** code following API
|
||||
|
||||
// standard WP search - for program flow trace
|
||||
//ocsd_err_t followToAtomWP(idec_res_t &op_result, const ocsd_vaddr_t addrStart, const ocsd_atm_val A);
|
||||
|
||||
// PTM exception code may require follow to an address
|
||||
//ocsd_err_t followToAddress(idec_res_t &op_result, const ocsd_vaddr_t addrStart, const ocsd_atm_val A, const ocsd_vaddr_t addrMatch);
|
||||
|
||||
// single instruction atom format such as ETMv3
|
||||
ocsd_err_t followSingleAtom(const ocsd_vaddr_t addrStart, const ocsd_atm_val A);
|
||||
|
||||
// follow N instructions
|
||||
// ocsd_err_t followNInstructions(idec_res_t &op_result) // ETMv4 Q elements
|
||||
|
||||
//*********************** results API
|
||||
const ocsd_vaddr_t getRangeSt() const; //!< inclusive start address of decoded range (value passed in)
|
||||
const ocsd_vaddr_t getRangeEn() const; //!< exclusive end address of decoded range (first instruction _not_ executed / potential next instruction).
|
||||
const bool hasRange() const; //!< we have a valid range executed (may be false if nacc).
|
||||
|
||||
const bool hasNextAddr() const; //!< we have calulated the next address - otherwise this is needed from trace packets.
|
||||
const ocsd_vaddr_t getNextAddr() const; //!< next address - valid if hasNextAddr() true.
|
||||
|
||||
// information on last instruction executed in range.
|
||||
const ocsd_instr_type getInstrType() const; //!< last instruction type
|
||||
const ocsd_instr_subtype getInstrSubType() const; //!< last instruction sub-type
|
||||
const bool isCondInstr() const; //!< is a conditional instruction
|
||||
const bool isLink() const; //!< is a link (branch with link etc)
|
||||
const bool ISAChanged() const; //!< next ISA different from input ISA.
|
||||
const ocsd_isa nextISA() const; //!< ISA for next instruction
|
||||
|
||||
// information on error conditions
|
||||
const bool isNacc() const; //!< true if Memory Not Accessible (nacc) error occurred
|
||||
void clearNacc(); //!< clear the nacc error flag
|
||||
const ocsd_vaddr_t getNaccAddr() const; //!< get the nacc error address.
|
||||
|
||||
private:
|
||||
bool initFollowerState(); //!< clear all the o/p data and flags, check init valid.
|
||||
|
||||
ocsd_err_t decodeSingleOpCode(); //!< decode single opcode address from current m_inst_info packet
|
||||
|
||||
ocsd_instr_info m_instr_info;
|
||||
|
||||
ocsd_vaddr_t m_st_range_addr; //!< start of excuted range - inclusive address.
|
||||
ocsd_vaddr_t m_en_range_addr; //!< end of executed range - exclusive address.
|
||||
ocsd_vaddr_t m_next_addr; //!< calcuated next address (could be eo range of branch address, not set for indirect branches)
|
||||
bool m_b_next_valid; //!< true if next address valid, false if need address from trace packets.
|
||||
|
||||
//! memory space rule to use when accessing memory.
|
||||
ocsd_mem_space_acc_t m_mem_acc_rule;
|
||||
//! memory space csid to use when accessing memory.
|
||||
uint8_t m_mem_space_csid;
|
||||
|
||||
ocsd_vaddr_t m_nacc_address; //!< memory address that was inaccessible - failed read @ start, or during follow operation
|
||||
bool m_b_nacc_err; //!< memory NACC error - required address was unavailable.
|
||||
|
||||
//! pointers to the memory access and i decode interfaces.
|
||||
componentAttachPt<ITargetMemAccess> *m_pMemAccess;
|
||||
componentAttachPt<IInstrDecode> *m_pIDecode;
|
||||
|
||||
};
|
||||
|
||||
#endif // ARM_OCSD_CODE_FOLLOWER_H_INCLUDED
|
||||
|
||||
//*********** setup API
|
||||
inline void OcsdCodeFollower::setArchProfile(const ocsd_arch_profile_t profile)
|
||||
{
|
||||
m_instr_info.pe_type = profile;
|
||||
}
|
||||
|
||||
inline void OcsdCodeFollower::setMemSpaceAccess(const ocsd_mem_space_acc_t mem_acc_rule)
|
||||
{
|
||||
m_mem_acc_rule = mem_acc_rule;
|
||||
}
|
||||
|
||||
inline void OcsdCodeFollower::setMemSpaceCSID(const uint8_t csid)
|
||||
{
|
||||
m_mem_space_csid = csid;
|
||||
}
|
||||
|
||||
inline void OcsdCodeFollower::setISA(const ocsd_isa isa)
|
||||
{
|
||||
m_instr_info.isa = isa;
|
||||
}
|
||||
|
||||
inline void OcsdCodeFollower::setDSBDMBasWP()
|
||||
{
|
||||
m_instr_info.dsb_dmb_waypoints = 1;
|
||||
}
|
||||
|
||||
//**************************************** results API
|
||||
inline const ocsd_vaddr_t OcsdCodeFollower::getRangeSt() const
|
||||
{
|
||||
return m_st_range_addr;
|
||||
}
|
||||
|
||||
inline const ocsd_vaddr_t OcsdCodeFollower::getRangeEn() const
|
||||
{
|
||||
return m_en_range_addr;
|
||||
}
|
||||
|
||||
inline const bool OcsdCodeFollower::hasRange() const
|
||||
{
|
||||
return m_st_range_addr < m_en_range_addr;
|
||||
}
|
||||
|
||||
inline const bool OcsdCodeFollower::hasNextAddr() const
|
||||
{
|
||||
return m_b_next_valid;
|
||||
}
|
||||
|
||||
inline const ocsd_vaddr_t OcsdCodeFollower::getNextAddr() const
|
||||
{
|
||||
return m_next_addr;
|
||||
}
|
||||
|
||||
// information on last instruction executed in range.
|
||||
inline const ocsd_instr_type OcsdCodeFollower::getInstrType() const
|
||||
{
|
||||
return m_instr_info.type;
|
||||
}
|
||||
|
||||
inline const ocsd_instr_subtype OcsdCodeFollower::getInstrSubType() const
|
||||
{
|
||||
return m_instr_info.sub_type;
|
||||
}
|
||||
|
||||
inline const bool OcsdCodeFollower::isCondInstr() const
|
||||
{
|
||||
return (bool)(m_instr_info.is_conditional == 1);
|
||||
}
|
||||
|
||||
inline const bool OcsdCodeFollower::isLink() const
|
||||
{
|
||||
return (bool)(m_instr_info.is_link == 1);
|
||||
}
|
||||
|
||||
inline const bool OcsdCodeFollower::ISAChanged() const
|
||||
{
|
||||
return (bool)(m_instr_info.isa != m_instr_info.next_isa);
|
||||
}
|
||||
|
||||
inline const ocsd_isa OcsdCodeFollower::nextISA() const
|
||||
{
|
||||
return m_instr_info.next_isa;
|
||||
}
|
||||
|
||||
// information on error conditions
|
||||
inline const bool OcsdCodeFollower::isNacc() const
|
||||
{
|
||||
return m_b_nacc_err;
|
||||
}
|
||||
|
||||
inline void OcsdCodeFollower::clearNacc()
|
||||
{
|
||||
m_b_nacc_err = false;
|
||||
}
|
||||
|
||||
inline const ocsd_vaddr_t OcsdCodeFollower::getNaccAddr() const
|
||||
{
|
||||
return m_nacc_address;
|
||||
}
|
||||
|
||||
/* End of File ocsd_code_follower.h */
|
396
decoder/include/common/ocsd_dcd_mngr.h
Normal file
396
decoder/include/common/ocsd_dcd_mngr.h
Normal file
@ -0,0 +1,396 @@
|
||||
/*
|
||||
* \file ocsd_dcd_mngr.h
|
||||
* \brief OpenCSD : Decoder manager base class.
|
||||
*
|
||||
* \copyright Copyright (c) 2016, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef ARM_OCSD_DCD_MNGR_H_INCLUDED
|
||||
#define ARM_OCSD_DCD_MNGR_H_INCLUDED
|
||||
|
||||
#include "opencsd/ocsd_if_types.h"
|
||||
#include "common/ocsd_dcd_mngr_i.h"
|
||||
#include "common/ocsd_lib_dcd_register.h"
|
||||
#include "common/trc_pkt_decode_base.h"
|
||||
#include "common/trc_pkt_proc_base.h"
|
||||
|
||||
template <class P, class Pt, class Pc>
|
||||
class DecoderMngrBase : public IDecoderMngr
|
||||
{
|
||||
public:
|
||||
DecoderMngrBase(const std::string &decoderTypeName, ocsd_trace_protocol_t builtInProtocol);
|
||||
virtual ~DecoderMngrBase() {};
|
||||
|
||||
// create decoder interface.
|
||||
virtual ocsd_err_t createDecoder(const int create_flags, const int instID, const CSConfig *p_config, TraceComponent **p_component);
|
||||
virtual ocsd_err_t destroyDecoder(TraceComponent *p_component);
|
||||
|
||||
virtual const ocsd_trace_protocol_t getProtocolType() const { return m_builtInProtocol; }
|
||||
|
||||
// common
|
||||
virtual ocsd_err_t attachErrorLogger(TraceComponent *pComponent, ITraceErrorLog *pIErrorLog);
|
||||
|
||||
// pkt decoder
|
||||
virtual ocsd_err_t attachInstrDecoder(TraceComponent *pComponent, IInstrDecode *pIInstrDec);
|
||||
virtual ocsd_err_t attachMemAccessor(TraceComponent *pComponent, ITargetMemAccess *pMemAccessor);
|
||||
virtual ocsd_err_t attachOutputSink(TraceComponent *pComponent, ITrcGenElemIn *pOutSink);
|
||||
|
||||
// pkt processor
|
||||
virtual ocsd_err_t attachPktMonitor(TraceComponent *pComponent, ITrcTypedBase *pPktRawDataMon);
|
||||
virtual ocsd_err_t attachPktIndexer(TraceComponent *pComponent, ITrcTypedBase *pPktIndexer);
|
||||
virtual ocsd_err_t attachPktSink(TraceComponent *pComponent, ITrcTypedBase *pPktDataInSink);
|
||||
|
||||
// data input connection interface
|
||||
virtual ocsd_err_t getDataInputI(TraceComponent *pComponent, ITrcDataIn **ppDataIn);
|
||||
|
||||
// generate a Config object from opaque config struct pointer.
|
||||
virtual ocsd_err_t createConfigFromDataStruct(CSConfig **pConfigBase, const void *pDataStruct);
|
||||
|
||||
// implemented by decoder handler derived classes
|
||||
virtual TraceComponent *createPktProc(const bool useInstID, const int instID) = 0;
|
||||
virtual TraceComponent *createPktDecode(const bool useInstID, const int instID) { return 0; };
|
||||
virtual CSConfig *createConfig(const void *pDataStruct) = 0;
|
||||
|
||||
|
||||
private:
|
||||
ocsd_trace_protocol_t m_builtInProtocol; //!< Protocol ID if built in type.
|
||||
};
|
||||
|
||||
template <class P, class Pt, class Pc>
|
||||
DecoderMngrBase<P,Pt,Pc>::DecoderMngrBase(const std::string &decoderTypeName, ocsd_trace_protocol_t builtInProtocol)
|
||||
{
|
||||
OcsdLibDcdRegister *pDcdReg = OcsdLibDcdRegister::getDecoderRegister();
|
||||
if(pDcdReg)
|
||||
pDcdReg->registerDecoderTypeByName(decoderTypeName,this);
|
||||
m_builtInProtocol = builtInProtocol;
|
||||
}
|
||||
|
||||
template <class P, class Pt, class Pc>
|
||||
ocsd_err_t DecoderMngrBase<P,Pt,Pc>::createDecoder(const int create_flags, const int instID, const CSConfig *pConfig, TraceComponent **ppTrcComp)
|
||||
{
|
||||
TraceComponent *pkt_proc = 0;
|
||||
TraceComponent *pkt_dcd = 0;
|
||||
bool bUseInstID = (create_flags & OCSD_CREATE_FLG_INST_ID) != 0;
|
||||
bool bDecoder = (create_flags & OCSD_CREATE_FLG_FULL_DECODER) != 0;
|
||||
bool bUnConfigured = (pConfig == 0);
|
||||
|
||||
const Pc *pConf = dynamic_cast< const Pc * >(pConfig);
|
||||
|
||||
// check inputs valid...
|
||||
if((pConf == 0) && !bUnConfigured)
|
||||
return OCSD_ERR_INVALID_PARAM_TYPE;
|
||||
|
||||
if((create_flags & (OCSD_CREATE_FLG_PACKET_PROC | OCSD_CREATE_FLG_FULL_DECODER)) == 0)
|
||||
return OCSD_ERR_INVALID_PARAM_VAL;
|
||||
|
||||
// always need a packet processor
|
||||
pkt_proc = createPktProc(bUseInstID, instID);
|
||||
if(!pkt_proc)
|
||||
return OCSD_ERR_MEM;
|
||||
|
||||
// set the configuration
|
||||
TrcPktProcBase<P,Pt,Pc> *pProcBase = dynamic_cast< TrcPktProcBase<P,Pt,Pc> *>(pkt_proc);
|
||||
if(pProcBase == 0)
|
||||
return OCSD_ERR_INVALID_PARAM_TYPE;
|
||||
|
||||
if(!bUnConfigured)
|
||||
pProcBase->setProtocolConfig(pConf);
|
||||
|
||||
*ppTrcComp = pkt_proc;
|
||||
|
||||
// may need a packet decoder
|
||||
if(bDecoder)
|
||||
{
|
||||
// create the decoder
|
||||
pkt_dcd = createPktDecode(bUseInstID, instID);
|
||||
if(!pkt_dcd)
|
||||
return OCSD_ERR_MEM;
|
||||
|
||||
// get the decoder base
|
||||
TrcPktDecodeBase<P,Pc> *pBase = dynamic_cast< TrcPktDecodeBase<P,Pc> *>(pkt_dcd);
|
||||
if(pBase == 0)
|
||||
return OCSD_ERR_INVALID_PARAM_TYPE;
|
||||
|
||||
if(!bUnConfigured)
|
||||
pBase->setProtocolConfig(pConf);
|
||||
|
||||
// associate decoder with packet processor
|
||||
// -> this means a TraceComponent with an associated component is a packet decoder.
|
||||
// the associated component is the connected packet processor.
|
||||
pkt_dcd->setAssocComponent(pkt_proc);
|
||||
|
||||
// connect packet processor and decoder
|
||||
pProcBase->getPacketOutAttachPt()->attach(pBase);
|
||||
|
||||
*ppTrcComp = pkt_dcd;
|
||||
}
|
||||
return OCSD_OK;
|
||||
}
|
||||
|
||||
template <class P, class Pt, class Pc>
|
||||
ocsd_err_t DecoderMngrBase<P,Pt,Pc>::destroyDecoder(TraceComponent *pComponent)
|
||||
{
|
||||
if(pComponent->getAssocComponent() != 0)
|
||||
delete pComponent->getAssocComponent();
|
||||
delete pComponent;
|
||||
return OCSD_OK;
|
||||
}
|
||||
|
||||
template <class P, class Pt, class Pc>
|
||||
ocsd_err_t DecoderMngrBase<P,Pt,Pc>::attachErrorLogger(TraceComponent *pComponent, ITraceErrorLog *pIErrorLog)
|
||||
{
|
||||
return pComponent->getErrorLogAttachPt()->replace_first(pIErrorLog);
|
||||
}
|
||||
|
||||
template <class P, class Pt, class Pc>
|
||||
ocsd_err_t DecoderMngrBase<P,Pt,Pc>::attachInstrDecoder(TraceComponent *pComponent, IInstrDecode *pIInstrDec)
|
||||
{
|
||||
ocsd_err_t err = OCSD_ERR_DCD_INTERFACE_UNUSED;
|
||||
|
||||
if(pComponent->getAssocComponent() == 0) // no associated component - so this is a packet processor
|
||||
return OCSD_ERR_INVALID_PARAM_TYPE;
|
||||
|
||||
TrcPktDecodeI *pDcdI = dynamic_cast< TrcPktDecodeI * >(pComponent);
|
||||
if(pDcdI == 0)
|
||||
return OCSD_ERR_INVALID_PARAM_TYPE;
|
||||
|
||||
if(pDcdI->getUsesIDecode())
|
||||
err = pDcdI->getInstrDecodeAttachPt()->replace_first(pIInstrDec);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
template <class P, class Pt, class Pc>
|
||||
ocsd_err_t DecoderMngrBase<P,Pt,Pc>::attachMemAccessor(TraceComponent *pComponent, ITargetMemAccess *pMemAccessor)
|
||||
{
|
||||
ocsd_err_t err = OCSD_ERR_DCD_INTERFACE_UNUSED;
|
||||
|
||||
if(pComponent->getAssocComponent() == 0) // no associated component - so this is a packet processor
|
||||
return OCSD_ERR_INVALID_PARAM_TYPE;
|
||||
|
||||
TrcPktDecodeI *pDcdI = dynamic_cast< TrcPktDecodeI * >(pComponent);
|
||||
if(pDcdI == 0)
|
||||
return OCSD_ERR_INVALID_PARAM_TYPE;
|
||||
|
||||
if(pDcdI->getUsesMemAccess())
|
||||
err = pDcdI->getMemoryAccessAttachPt()->replace_first(pMemAccessor);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
template <class P, class Pt, class Pc>
|
||||
ocsd_err_t DecoderMngrBase<P,Pt,Pc>::attachOutputSink(TraceComponent *pComponent, ITrcGenElemIn *pOutSink)
|
||||
{
|
||||
ocsd_err_t err = OCSD_ERR_INVALID_PARAM_TYPE;
|
||||
|
||||
if(pComponent->getAssocComponent() == 0) // no associated component - so this is a packet processor
|
||||
return err;
|
||||
|
||||
TrcPktDecodeI *pDcdI = dynamic_cast< TrcPktDecodeI * >(pComponent);
|
||||
if(pDcdI == 0)
|
||||
return OCSD_ERR_INVALID_PARAM_TYPE;
|
||||
|
||||
err = pDcdI->getTraceElemOutAttachPt()->replace_first(pOutSink);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
template <class P, class Pt, class Pc>
|
||||
ocsd_err_t DecoderMngrBase<P,Pt,Pc>::getDataInputI(TraceComponent *pComponent, ITrcDataIn **ppDataIn)
|
||||
{
|
||||
// find the packet processor
|
||||
TraceComponent *pPktProc = pComponent;
|
||||
if(pComponent->getAssocComponent() != 0)
|
||||
pPktProc = pComponent->getAssocComponent();
|
||||
|
||||
TrcPktProcI *pPPI = dynamic_cast< TrcPktProcI * >(pPktProc);
|
||||
if(pPPI == 0)
|
||||
return OCSD_ERR_INVALID_PARAM_TYPE;
|
||||
|
||||
*ppDataIn = pPPI;
|
||||
|
||||
return OCSD_OK;
|
||||
}
|
||||
|
||||
template <class P, class Pt, class Pc>
|
||||
ocsd_err_t DecoderMngrBase<P,Pt,Pc>::attachPktMonitor(TraceComponent *pComponent, ITrcTypedBase *pPktRawDataMon)
|
||||
{
|
||||
// find the packet processor
|
||||
TraceComponent *pPktProc = pComponent;
|
||||
if(pComponent->getAssocComponent() != 0)
|
||||
pPktProc = pComponent->getAssocComponent();
|
||||
|
||||
// get the packet processor
|
||||
TrcPktProcBase<P,Pt,Pc> *pPktProcBase = dynamic_cast< TrcPktProcBase<P,Pt,Pc> * >(pPktProc);
|
||||
if(pPktProcBase == 0)
|
||||
return OCSD_ERR_INVALID_PARAM_TYPE;
|
||||
|
||||
// get the interface
|
||||
IPktRawDataMon<P> *p_If = dynamic_cast< IPktRawDataMon<P> * >(pPktRawDataMon);
|
||||
if(p_If == 0)
|
||||
return OCSD_ERR_INVALID_PARAM_TYPE;
|
||||
|
||||
return pPktProcBase->getRawPacketMonAttachPt()->replace_first(p_If);
|
||||
}
|
||||
|
||||
template <class P, class Pt, class Pc>
|
||||
ocsd_err_t DecoderMngrBase<P,Pt,Pc>::attachPktIndexer(TraceComponent *pComponent, ITrcTypedBase *pPktIndexer)
|
||||
{
|
||||
// find the packet processor
|
||||
TraceComponent *pPktProc = pComponent;
|
||||
if(pComponent->getAssocComponent() != 0)
|
||||
pPktProc = pComponent->getAssocComponent();
|
||||
|
||||
// get the packet processor
|
||||
TrcPktProcBase<P,Pt,Pc> *pPktProcBase = dynamic_cast< TrcPktProcBase<P,Pt,Pc> * >(pPktProc);
|
||||
if(pPktProcBase == 0)
|
||||
return OCSD_ERR_INVALID_PARAM_TYPE;
|
||||
|
||||
// get the interface
|
||||
ITrcPktIndexer<Pt> *p_If = dynamic_cast< ITrcPktIndexer<Pt> * >(pPktIndexer);
|
||||
if(p_If == 0)
|
||||
return OCSD_ERR_INVALID_PARAM_TYPE;
|
||||
|
||||
return pPktProcBase->getTraceIDIndexerAttachPt()->replace_first(p_If);
|
||||
}
|
||||
|
||||
template <class P, class Pt, class Pc>
|
||||
ocsd_err_t DecoderMngrBase<P,Pt,Pc>::attachPktSink(TraceComponent *pComponent, ITrcTypedBase *pPktDataInSink)
|
||||
{
|
||||
// must be solo packet processor
|
||||
if(pComponent->getAssocComponent() != 0)
|
||||
return OCSD_ERR_INVALID_PARAM_TYPE;
|
||||
|
||||
// interface must be the correct one.
|
||||
IPktDataIn<P> *pkt_in_i = dynamic_cast< IPktDataIn<P> * >(pPktDataInSink);
|
||||
if(pkt_in_i == 0)
|
||||
return OCSD_ERR_INVALID_PARAM_TYPE;
|
||||
|
||||
// get the packet processor
|
||||
TrcPktProcBase<P,Pt,Pc> *pPktProcBase = dynamic_cast< TrcPktProcBase<P,Pt,Pc> * >(pComponent);
|
||||
if(pPktProcBase == 0)
|
||||
return OCSD_ERR_INVALID_PARAM_TYPE;
|
||||
|
||||
// attach
|
||||
return pPktProcBase->getPacketOutAttachPt()->replace_first(pkt_in_i);
|
||||
}
|
||||
|
||||
template <class P, class Pt, class Pc>
|
||||
ocsd_err_t DecoderMngrBase<P,Pt,Pc>::createConfigFromDataStruct(CSConfig **pConfigBase, const void *pDataStruct)
|
||||
{
|
||||
CSConfig *pConfig = createConfig(pDataStruct);
|
||||
if(!pConfig)
|
||||
return OCSD_ERR_MEM;
|
||||
*pConfigBase = pConfig;
|
||||
return OCSD_OK;
|
||||
}
|
||||
|
||||
/****************************************************************************************************/
|
||||
/* Full decoder / packet process pair, templated base for creating decoder objects */
|
||||
/****************************************************************************************************/
|
||||
|
||||
template< class P, // Packet class.
|
||||
class Pt, // Packet enum type ID.
|
||||
class Pc, // Processor config class.
|
||||
class PcSt, // Processor config struct type
|
||||
class PktProc, // Packet processor class.
|
||||
class PktDcd> // Packet decoder class.
|
||||
class DecodeMngrFullDcd : public DecoderMngrBase<P,Pt,Pc>
|
||||
{
|
||||
public:
|
||||
DecodeMngrFullDcd (const std::string &name, ocsd_trace_protocol_t builtInProtocol)
|
||||
: DecoderMngrBase<P,Pt,Pc>(name,builtInProtocol) {};
|
||||
|
||||
virtual ~DecodeMngrFullDcd() {};
|
||||
|
||||
virtual TraceComponent *createPktProc(const bool useInstID, const int instID)
|
||||
{
|
||||
TraceComponent *pComp;
|
||||
if(useInstID)
|
||||
pComp = new (std::nothrow) PktProc(instID);
|
||||
else
|
||||
pComp = new (std::nothrow) PktProc();
|
||||
return pComp;
|
||||
}
|
||||
|
||||
virtual TraceComponent *createPktDecode(const bool useInstID, const int instID)
|
||||
{
|
||||
TraceComponent *pComp;
|
||||
if(useInstID)
|
||||
pComp = new (std::nothrow)PktDcd(instID);
|
||||
else
|
||||
pComp = new (std::nothrow)PktDcd();
|
||||
return pComp;
|
||||
}
|
||||
|
||||
virtual CSConfig *createConfig(const void *pDataStruct)
|
||||
{
|
||||
return new (std::nothrow) Pc((PcSt *)pDataStruct);
|
||||
}
|
||||
};
|
||||
|
||||
/****************************************************************************************************/
|
||||
/* Packet processor only, templated base for creating decoder objects */
|
||||
/****************************************************************************************************/
|
||||
|
||||
template< class P, // Packet class.
|
||||
class Pt, // Packet enum type ID.
|
||||
class Pc, // Processor config class.
|
||||
class PcSt, // Processor config struct type
|
||||
class PktProc> // Packet processor class.
|
||||
class DecodeMngrPktProc : public DecoderMngrBase<P,Pt,Pc>
|
||||
{
|
||||
public:
|
||||
DecodeMngrPktProc (const std::string &name, ocsd_trace_protocol_t builtInProtocol)
|
||||
: DecoderMngrBase<P,Pt,Pc>(name,builtInProtocol) {};
|
||||
|
||||
virtual ~DecodeMngrPktProc() {};
|
||||
|
||||
virtual TraceComponent *createPktProc(const bool useInstID, const int instID)
|
||||
{
|
||||
TraceComponent *pComp;
|
||||
if(useInstID)
|
||||
pComp = new (std::nothrow) PktProc(instID);
|
||||
else
|
||||
pComp = new (std::nothrow) PktProc();
|
||||
return pComp;
|
||||
}
|
||||
|
||||
virtual CSConfig *createConfig(const void *pDataStruct)
|
||||
{
|
||||
return new (std::nothrow) Pc((PcSt *)pDataStruct);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
||||
#endif // ARM_OCSD_DCD_MNGR_H_INCLUDED
|
||||
|
||||
/* End of File ocsd_dcd_mngr.h */
|
98
decoder/include/common/ocsd_dcd_mngr_i.h
Normal file
98
decoder/include/common/ocsd_dcd_mngr_i.h
Normal file
@ -0,0 +1,98 @@
|
||||
/*
|
||||
* \file ocsd_dcd_mngr_i.h
|
||||
* \brief OpenCSD : Decoder manager interface.
|
||||
*
|
||||
* \copyright Copyright (c) 2016, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef ARM_OCSD_DCD_MNGR_I_H_INCLUDED
|
||||
#define ARM_OCSD_DCD_MNGR_I_H_INCLUDED
|
||||
|
||||
#include "opencsd/ocsd_if_types.h"
|
||||
#include "common/trc_cs_config.h"
|
||||
#include "common/trc_component.h"
|
||||
|
||||
#include "interfaces/trc_error_log_i.h"
|
||||
#include "interfaces/trc_data_raw_in_i.h"
|
||||
#include "interfaces/trc_instr_decode_i.h"
|
||||
#include "interfaces/trc_tgt_mem_access_i.h"
|
||||
#include "interfaces/trc_gen_elem_in_i.h"
|
||||
#include "interfaces/trc_abs_typed_base_i.h"
|
||||
|
||||
class IDecoderMngr
|
||||
{
|
||||
public:
|
||||
IDecoderMngr() {};
|
||||
virtual ~IDecoderMngr() {};
|
||||
|
||||
// create and destroy decoders
|
||||
virtual ocsd_err_t createDecoder(const int create_flags, const int instID, const CSConfig *p_config, TraceComponent **ppComponent) = 0;
|
||||
virtual ocsd_err_t destroyDecoder(TraceComponent *pComponent) = 0;
|
||||
|
||||
//! Get the built in protocol type ID managed by this instance - extern for custom decoders
|
||||
virtual const ocsd_trace_protocol_t getProtocolType() const = 0;
|
||||
|
||||
// connect decoders to other components - (replace current / 0 pointer value to detach );
|
||||
// compatible with all decoders
|
||||
//!attach error logger to ptk-processor, or both of pkt processor and pkt decoder pair
|
||||
virtual ocsd_err_t attachErrorLogger(TraceComponent *pComponent, ITraceErrorLog *pIErrorLog) = 0;
|
||||
|
||||
// pkt decoder only
|
||||
//! attach instruction decoder to pkt decoder
|
||||
virtual ocsd_err_t attachInstrDecoder(TraceComponent *pComponent, IInstrDecode *pIInstrDec) = 0;
|
||||
|
||||
//! attach memory accessor to pkt decoder
|
||||
virtual ocsd_err_t attachMemAccessor(TraceComponent *pComponent, ITargetMemAccess *pMemAccessor) = 0;
|
||||
|
||||
//! attach generic output interface to pkt decoder
|
||||
virtual ocsd_err_t attachOutputSink(TraceComponent *pComponent, ITrcGenElemIn *pOutSink) = 0;
|
||||
|
||||
// pkt processor only
|
||||
//! attach a raw packet monitor to pkt processor (solo pkt processor, or pkt processor part of pair)
|
||||
virtual ocsd_err_t attachPktMonitor(TraceComponent *pComponent, ITrcTypedBase *pPktRawDataMon) = 0;
|
||||
|
||||
//! attach a packet indexer to pkt processor (solo pkt processor, or pkt processor part of pair)
|
||||
virtual ocsd_err_t attachPktIndexer(TraceComponent *pComponent, ITrcTypedBase *pPktIndexer) = 0;
|
||||
|
||||
//! attach a packet data sink to pkt processor output (solo pkt processor only - instead of decoder when pkt processor only created.)
|
||||
virtual ocsd_err_t attachPktSink(TraceComponent *pComponent, ITrcTypedBase *pPktDataInSink) = 0;
|
||||
|
||||
// data input connection interface
|
||||
//! get raw data input interface from packet processor
|
||||
virtual ocsd_err_t getDataInputI(TraceComponent *pComponent, ITrcDataIn **ppDataIn) = 0;
|
||||
|
||||
// create configuration from data structure
|
||||
virtual ocsd_err_t createConfigFromDataStruct(CSConfig **pConfigBase, const void *pDataStruct) = 0;
|
||||
|
||||
};
|
||||
|
||||
#endif // ARM_OCSD_DCD_MNGR_I_H_INCLUDED
|
||||
|
||||
/* End of File ocsd_dcd_mngr.h */
|
406
decoder/include/common/ocsd_dcd_tree.h
Normal file
406
decoder/include/common/ocsd_dcd_tree.h
Normal file
@ -0,0 +1,406 @@
|
||||
/*!
|
||||
* \file ocsd_dcd_tree.h
|
||||
* \brief OpenCSD : Trace Decode Tree.
|
||||
*
|
||||
* \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef ARM_OCSD_DCD_TREE_H_INCLUDED
|
||||
#define ARM_OCSD_DCD_TREE_H_INCLUDED
|
||||
|
||||
#include <vector>
|
||||
#include <list>
|
||||
|
||||
#include "opencsd.h"
|
||||
#include "ocsd_dcd_tree_elem.h"
|
||||
|
||||
/** @defgroup dcd_tree OpenCSD Library : Trace Decode Tree.
|
||||
@brief Create a multi source decode tree for a single trace capture buffer.
|
||||
|
||||
Use to create a connected set of decoder objects to decode a trace buffer.
|
||||
There may be multiple trace sources within the capture buffer.
|
||||
|
||||
@{*/
|
||||
|
||||
/*!
|
||||
* @class DecodeTree
|
||||
* @brief Class to manage the decoding of data from a single trace sink .
|
||||
*
|
||||
* Provides functionality to build a tree of decode objects capable of decoding
|
||||
* multiple trace sources within a single trace sink (capture buffer).
|
||||
*
|
||||
*/
|
||||
class DecodeTree : public ITrcDataIn
|
||||
{
|
||||
public:
|
||||
/** @name Creation and Destruction
|
||||
@{*/
|
||||
DecodeTree(); //!< default constructor
|
||||
~DecodeTree(); //!< default destructor
|
||||
|
||||
/*!
|
||||
* @brief Create a decode tree.
|
||||
* Automatically creates a trace frame deformatter if required and a default error log component.
|
||||
*
|
||||
* @param src_type : Data stream source type, can be CoreSight frame formatted trace, or single demuxed trace data stream,
|
||||
* @param formatterCfgFlags : Configuration flags for trace de-formatter.
|
||||
*
|
||||
* @return DecodeTree * : pointer to the decode tree, 0 if creation failed.
|
||||
*/
|
||||
static DecodeTree *CreateDecodeTree(const ocsd_dcd_tree_src_t src_type, const uint32_t formatterCfgFlags);
|
||||
|
||||
/** @brief Destroy a decode tree */
|
||||
static void DestroyDecodeTree(DecodeTree *p_dcd_tree);
|
||||
|
||||
/** @}*/
|
||||
|
||||
|
||||
/** @name Error and element Logging
|
||||
@{*/
|
||||
/** @brief The library default error logger */
|
||||
static ocsdDefaultErrorLogger* getDefaultErrorLogger() { return &s_error_logger; };
|
||||
|
||||
/** the current error logging interface in use */
|
||||
static ITraceErrorLog *getCurrentErrorLogI() { return s_i_error_logger; };
|
||||
|
||||
/** set an alternate error logging interface. */
|
||||
static void setAlternateErrorLogger(ITraceErrorLog *p_error_logger);
|
||||
|
||||
/** get the list of packet printers for this decode tree */
|
||||
std::vector<ItemPrinter *> &getPrinterList() { return m_printer_list; };
|
||||
|
||||
/** add a protocol packet printer */
|
||||
ocsd_err_t addPacketPrinter(uint8_t CSID, bool bMonitor, ItemPrinter **ppPrinter);
|
||||
|
||||
/** add a raw frame printer */
|
||||
ocsd_err_t addRawFramePrinter(RawFramePrinter **ppPrinter, uint32_t flags);
|
||||
|
||||
/** add a generic element output printer */
|
||||
ocsd_err_t addGenElemPrinter(TrcGenericElementPrinter **ppPrinter);
|
||||
|
||||
|
||||
|
||||
/** @}*/
|
||||
|
||||
|
||||
/** @name Trace Data Path
|
||||
@{*/
|
||||
/** @brief Trace Data input interface (ITrcDataIn)
|
||||
|
||||
Decode tree implements the data in interface : ITrcDataIn .
|
||||
Captured raw trace data is passed into the deformatter and decoders via this method.
|
||||
*/
|
||||
virtual ocsd_datapath_resp_t TraceDataIn( const ocsd_datapath_op_t op,
|
||||
const ocsd_trc_index_t index,
|
||||
const uint32_t dataBlockSize,
|
||||
const uint8_t *pDataBlock,
|
||||
uint32_t *numBytesProcessed);
|
||||
|
||||
/*!
|
||||
* @brief Decoded Trace output.
|
||||
*
|
||||
* Client trace analysis program attaches a generic trace element interface to
|
||||
* receive the output from the trace decode operations.
|
||||
*
|
||||
* @param *i_gen_trace_elem : Pointer to the interface.
|
||||
*/
|
||||
void setGenTraceElemOutI(ITrcGenElemIn *i_gen_trace_elem);
|
||||
|
||||
/*! @brief Return the connected generic element interface */
|
||||
ITrcGenElemIn *getGenTraceElemOutI() const { return m_i_gen_elem_out; };
|
||||
|
||||
/** @}*/
|
||||
|
||||
/** @name Decoder Management
|
||||
@{*/
|
||||
|
||||
/*!
|
||||
* Creates a decoder that is registered with the library under the supplied name.
|
||||
* createFlags determine if a full packet processor / packet decoder pair or
|
||||
* packet processor only is created.
|
||||
* Uses the supplied configuration structure.
|
||||
*
|
||||
* @param &decoderName : registered name of decoder
|
||||
* @param createFlags : Decoder creation options.
|
||||
* @param *pConfig : Pointer to a valid configuration structure for the named decoder.
|
||||
*
|
||||
* @return ocsd_err_t : Library error code or OCSD_OK if successful.
|
||||
*/
|
||||
ocsd_err_t createDecoder(const std::string &decoderName, const int createFlags, const CSConfig *pConfig);
|
||||
|
||||
/* */
|
||||
/*!
|
||||
* Remove a decoder / packet processor attached to an Trace ID output on the frame de-mux.
|
||||
*
|
||||
* Once removed another decoder can be created that has a CSConfig using that ID.
|
||||
*
|
||||
* @param CSID : Trace ID to remove.
|
||||
*
|
||||
* @return ocsd_err_t : Library error code or OCSD_OK if successful.
|
||||
*/
|
||||
ocsd_err_t removeDecoder(const uint8_t CSID);
|
||||
|
||||
|
||||
/* get decoder elements currently in use */
|
||||
|
||||
/*!
|
||||
* Find a decode tree element associated with a specific CoreSight trace ID. *
|
||||
*/
|
||||
DecodeTreeElement *getDecoderElement(const uint8_t CSID) const;
|
||||
/* iterate decoder elements */
|
||||
|
||||
/*!
|
||||
* Decode tree iteration. Return the first tree element 0 if no elements avaiable.
|
||||
*
|
||||
* @param &elemID : CoreSight Trace ID associated with this element
|
||||
*/
|
||||
DecodeTreeElement *getFirstElement(uint8_t &elemID);
|
||||
/*!
|
||||
* Return the next tree element - or 0 if no futher elements avaiable.
|
||||
*
|
||||
* @param &elemID : CoreSight Trace ID associated with this element
|
||||
*/
|
||||
DecodeTreeElement *getNextElement(uint8_t &elemID);
|
||||
|
||||
/* set key interfaces - attach / replace on any existing tree components */
|
||||
|
||||
/*!
|
||||
* Set an ARM instruction opcode decoder.
|
||||
*
|
||||
* @param *i_instr_decode : Pointer to the interface.
|
||||
*/
|
||||
void setInstrDecoder(IInstrDecode *i_instr_decode);
|
||||
/*!
|
||||
* Set a target memory access interface - used to access program image memory for instruction
|
||||
* trace decode.
|
||||
*
|
||||
* @param *i_mem_access : Pointer to the interface.
|
||||
*/
|
||||
void setMemAccessI(ITargetMemAccess *i_mem_access);
|
||||
|
||||
|
||||
/** @}*/
|
||||
|
||||
/** @name Memory Access Mapper
|
||||
|
||||
A memory mapper is used to organise a collection of memory accessor objects that contain the
|
||||
memory images for different areas of traced instruction memory. These areas could be the executed
|
||||
program and a set of loaded .so libraries for example - each of which would have code sections in
|
||||
different memory locations.
|
||||
|
||||
A memory accessor represents a snapshot of an area of memory as it appeared during trace capture,
|
||||
for a given memory space. Memory spaces are described by the ocsd_mem_space_acc_t enum. The most
|
||||
general memory space is OCSD_MEM_SPACE_ANY. This represents memory that can be secure or none-secure,
|
||||
available at any exception level.
|
||||
|
||||
The memory mapper will not allow two accessors to overlap in the same memory space.
|
||||
|
||||
The trace decdoer will access memory with a memory space parameter that represents the current core
|
||||
state - the mapper will find the closest memory space match for the address.
|
||||
|
||||
e.g. if the core is accessing secure EL3, then the most specialised matching space will be accessed.
|
||||
If an EL3 space matches that will be used, otherwise the any secure, and finally _ANY.
|
||||
|
||||
It is no necessary for clients to register memory accessors for all spaces - _ANY will be sufficient
|
||||
in many cases.
|
||||
|
||||
|
||||
@{*/
|
||||
|
||||
/* */
|
||||
/*!
|
||||
* This creates a memory mapper within the decode tree.
|
||||
*
|
||||
* @param type : defaults to MEMACC_MAP_GLOBAL (only type available at present)
|
||||
*
|
||||
* @return ocsd_err_t : Library error code or OCSD_OK if successful.
|
||||
*/
|
||||
ocsd_err_t createMemAccMapper(memacc_mapper_t type = MEMACC_MAP_GLOBAL);
|
||||
|
||||
/*!
|
||||
* Get a pointer to the memory mapper. Allows a client to add memory accessors directly to the mapper.
|
||||
* @return TrcMemAccMapper : Pointer to the mapper.
|
||||
*/
|
||||
TrcMemAccMapper *getMemAccMapper() const { return m_default_mapper; };
|
||||
|
||||
/*!
|
||||
* Set an external mapper rather than create a mapper in the decode tree.
|
||||
* Setting this will also destroy any internal mapper that was previously created.
|
||||
*
|
||||
* @param pMapper : pointer to the mapper to add.
|
||||
*/
|
||||
void setExternMemAccMapper(TrcMemAccMapper * pMapper);
|
||||
|
||||
/*!
|
||||
* Return true if a mapper has been set (internal or external
|
||||
*/
|
||||
const bool hasMemAccMapper() const { return (bool)(m_default_mapper != 0); };
|
||||
|
||||
void logMappedRanges(); //!< Log the mapped memory ranges to the default message logger.
|
||||
|
||||
/** @}*/
|
||||
|
||||
/** @name Memory Accessors
|
||||
A memory accessor represents a snapshot of an area of memory as it appeared during trace capture.
|
||||
|
||||
Memory spaces represent either common global memory, or Secure / none-secure and EL specific spaces.
|
||||
|
||||
@{*/
|
||||
|
||||
/*!
|
||||
* Creates a memory accessor for a memory block in the supplied buffer and adds to the current mapper.
|
||||
*
|
||||
* @param address : Start address for the memory block in the memory map.
|
||||
* @param mem_space : Memory space
|
||||
* @param *p_mem_buffer : start of the buffer.
|
||||
* @param mem_length : length of the buffer.
|
||||
*
|
||||
* @return ocsd_err_t : Library error code or OCSD_OK if successful.
|
||||
*/
|
||||
ocsd_err_t addBufferMemAcc(const ocsd_vaddr_t address, const ocsd_mem_space_acc_t mem_space, const uint8_t *p_mem_buffer, const uint32_t mem_length);
|
||||
|
||||
/*!
|
||||
* Creates a memory accessor for a memory block supplied as a contiguous binary data file, and adds to the current mapper.
|
||||
*
|
||||
* @param address : Start address for the memory block in the memory map.
|
||||
* @param mem_space : Memory space
|
||||
* @param &filepath : Path to the binary data file
|
||||
*
|
||||
* @return ocsd_err_t : Library error code or OCSD_OK if successful.
|
||||
*/
|
||||
ocsd_err_t addBinFileMemAcc(const ocsd_vaddr_t address, const ocsd_mem_space_acc_t mem_space, const std::string &filepath);
|
||||
|
||||
/*!
|
||||
* Creates a memory accessor for a memory block supplied as a one or more memory regions in a binary file.
|
||||
* Region structures are created that describe the memory start address, the offset within the binary file
|
||||
* for that address, and the length of the region. This accessor can be used to point to the code section
|
||||
* in a program file for example.
|
||||
*
|
||||
* @param *region_array : array of valid memory regions in the file.
|
||||
* @param num_regions : number of regions
|
||||
* @param mem_space : Memory space
|
||||
* @param &filepath : Path to the binary data file
|
||||
*
|
||||
* @return ocsd_err_t : Library error code or OCSD_OK if successful.
|
||||
*/
|
||||
ocsd_err_t addBinFileRegionMemAcc(const ocsd_file_mem_region_t *region_array, const int num_regions, const ocsd_mem_space_acc_t mem_space, const std::string &filepath);
|
||||
|
||||
/*!
|
||||
* This memory accessor allows the client to supply a callback function for the region
|
||||
* defined by the start and end addresses. This can be used to supply a custom memory accessor,
|
||||
* or to directly access memory if the decode is running live on a target system.
|
||||
*
|
||||
* @param st_address : start address of region.
|
||||
* @param en_address : end address of region.
|
||||
* @param mem_space : Memory space
|
||||
* @param p_cb_func : Callback function
|
||||
* @param *p_context : client supplied context information
|
||||
*
|
||||
* @return ocsd_err_t : Library error code or OCSD_OK if successful.
|
||||
*/
|
||||
ocsd_err_t addCallbackMemAcc(const ocsd_vaddr_t st_address, const ocsd_vaddr_t en_address, const ocsd_mem_space_acc_t mem_space, Fn_MemAcc_CB p_cb_func, const void *p_context);
|
||||
|
||||
/*!
|
||||
* Remove the memory accessor from the map, that begins at the given address, for the memory space provided.
|
||||
*
|
||||
* @param address : Start address of the memory accessor.
|
||||
* @param mem_space : Memory space for the memory accessor.
|
||||
*
|
||||
* @return ocsd_err_t : Library error code or OCSD_OK if successful.
|
||||
*/
|
||||
ocsd_err_t removeMemAccByAddress(const ocsd_vaddr_t address, const ocsd_mem_space_acc_t mem_space);
|
||||
|
||||
/** @}*/
|
||||
|
||||
/** @name CoreSight Trace Frame De-mux
|
||||
@{*/
|
||||
|
||||
//! Get the Trace Frame de-mux.
|
||||
TraceFormatterFrameDecoder *getFrameDeformatter() const { return m_frame_deformatter_root; };
|
||||
|
||||
|
||||
/*! @brief ID filtering - sets the output filter on the trace deformatter.
|
||||
|
||||
Only supplied IDs will be decoded.
|
||||
|
||||
No effect if no decoder attached for the ID
|
||||
|
||||
@param ids : Vector of CS Trace IDs
|
||||
*/
|
||||
ocsd_err_t setIDFilter(std::vector<uint8_t> &ids); // only supplied IDs will be decoded
|
||||
|
||||
ocsd_err_t clearIDFilter(); //!< remove filter, all IDs will be decoded
|
||||
|
||||
/** @}*/
|
||||
|
||||
private:
|
||||
bool initialise(const ocsd_dcd_tree_src_t type, uint32_t formatterCfgFlags);
|
||||
const bool usingFormatter() const { return (bool)(m_dcd_tree_type == OCSD_TRC_SRC_FRAME_FORMATTED); };
|
||||
void setSingleRoot(TrcPktProcI *pComp);
|
||||
ocsd_err_t createDecodeElement(const uint8_t CSID);
|
||||
void destroyDecodeElement(const uint8_t CSID);
|
||||
void destroyMemAccMapper();
|
||||
|
||||
ocsd_dcd_tree_src_t m_dcd_tree_type;
|
||||
|
||||
IInstrDecode *m_i_instr_decode;
|
||||
ITargetMemAccess *m_i_mem_access;
|
||||
ITrcGenElemIn *m_i_gen_elem_out; //!< Output interface for generic elements from decoder.
|
||||
|
||||
ITrcDataIn* m_i_decoder_root; /*!< root decoder object interface - either deformatter or single packet processor */
|
||||
|
||||
TraceFormatterFrameDecoder *m_frame_deformatter_root;
|
||||
|
||||
DecodeTreeElement *m_decode_elements[0x80];
|
||||
|
||||
uint8_t m_decode_elem_iter;
|
||||
|
||||
TrcMemAccMapper *m_default_mapper; //!< the mem acc mapper to use
|
||||
bool m_created_mapper; //!< true if created by decode tree object
|
||||
|
||||
std::vector<ItemPrinter *> m_printer_list; //!< list of packet printers.
|
||||
|
||||
/* global error logger - all sources */
|
||||
static ITraceErrorLog *s_i_error_logger;
|
||||
static std::list<DecodeTree *> s_trace_dcd_trees;
|
||||
|
||||
/**! default error logger */
|
||||
static ocsdDefaultErrorLogger s_error_logger;
|
||||
|
||||
/**! default instruction decoder */
|
||||
static TrcIDecode s_instruction_decoder;
|
||||
};
|
||||
|
||||
/** @}*/
|
||||
|
||||
#endif // ARM_OCSD_DCD_TREE_H_INCLUDED
|
||||
|
||||
/* End of File ocsd_dcd_tree.h */
|
112
decoder/include/common/ocsd_dcd_tree_elem.h
Normal file
112
decoder/include/common/ocsd_dcd_tree_elem.h
Normal file
@ -0,0 +1,112 @@
|
||||
/*!
|
||||
* \file ocsd_dcd_tree_elem.h
|
||||
* \brief OpenCSD : Decode tree element.
|
||||
*
|
||||
* \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef ARM_OCSD_DCD_TREE_ELEM_H_INCLUDED
|
||||
#define ARM_OCSD_DCD_TREE_ELEM_H_INCLUDED
|
||||
|
||||
#include "common/ocsd_dcd_mngr_i.h"
|
||||
#include "common/trc_component.h"
|
||||
|
||||
/** @addtogroup dcd_tree
|
||||
@{*/
|
||||
|
||||
/*! @struct _decoder_elements
|
||||
* @brief Decode tree element base structure.
|
||||
*
|
||||
* Element describes the protocol supported for this element and
|
||||
* contains pointers to the decoder manager interface and component handle.
|
||||
*/
|
||||
typedef struct _decoder_elements
|
||||
{
|
||||
std::string dcd_name; //!< Registered name of the decoder
|
||||
TraceComponent *dcd_handle; //!< handle to the decoder object
|
||||
IDecoderMngr *dcd_mngr; //!< pointer to the decoder manager interface for the decodcer
|
||||
ocsd_trace_protocol_t protocol;//!< protocol type
|
||||
bool created; /**< decode tree created this element (destroy it on tree destruction) */
|
||||
} decoder_element;
|
||||
|
||||
/*!
|
||||
* @class DecodeTreeElement
|
||||
* @brief Decode tree element
|
||||
*
|
||||
* Decoder tree elements are references to individual decoders in the tree.
|
||||
* These allow iteration of all decoders in the tree to perform common operations.
|
||||
*
|
||||
* The DecodeTree contains a list of elements.
|
||||
*/
|
||||
class DecodeTreeElement : protected decoder_element
|
||||
{
|
||||
public:
|
||||
DecodeTreeElement();
|
||||
~DecodeTreeElement() {};
|
||||
|
||||
void SetDecoderElement(const std::string &name, IDecoderMngr *dcdMngr, TraceComponent *pHandle, bool bCreated);
|
||||
void DestroyElem();
|
||||
|
||||
const std::string &getDecoderTypeName() { return dcd_name; };
|
||||
IDecoderMngr *getDecoderMngr() { return dcd_mngr; };
|
||||
ocsd_trace_protocol_t getProtocol() const { return protocol; };
|
||||
TraceComponent *getDecoderHandle() { return dcd_handle; };
|
||||
};
|
||||
|
||||
inline DecodeTreeElement::DecodeTreeElement()
|
||||
{
|
||||
dcd_name = "unknown";
|
||||
dcd_mngr = 0;
|
||||
dcd_handle = 0;
|
||||
protocol = OCSD_PROTOCOL_END;
|
||||
created = false;
|
||||
}
|
||||
|
||||
inline void DecodeTreeElement::SetDecoderElement(const std::string &name, IDecoderMngr *dcdMngr, TraceComponent *pHandle, bool bCreated)
|
||||
{
|
||||
dcd_name = name;
|
||||
dcd_mngr = dcdMngr;
|
||||
dcd_handle = pHandle;
|
||||
protocol = OCSD_PROTOCOL_UNKNOWN;
|
||||
if(dcd_mngr)
|
||||
protocol = dcd_mngr->getProtocolType();
|
||||
created = bCreated;
|
||||
}
|
||||
|
||||
inline void DecodeTreeElement::DestroyElem()
|
||||
{
|
||||
if(created && (dcd_mngr != 0) && (dcd_handle != 0))
|
||||
dcd_mngr->destroyDecoder(dcd_handle);
|
||||
}
|
||||
|
||||
/** @}*/
|
||||
#endif // ARM_OCSD_DCD_TREE_ELEM_H_INCLUDED
|
||||
|
||||
/* End of File ocsd_dcd_tree_elem.h */
|
116
decoder/include/common/ocsd_error.h
Normal file
116
decoder/include/common/ocsd_error.h
Normal file
@ -0,0 +1,116 @@
|
||||
/*!
|
||||
* \file ocsd_error.h
|
||||
* \brief OpenCSD : Library Error class
|
||||
*
|
||||
* \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef ARM_OCSD_ERROR_H_INCLUDED
|
||||
#define ARM_OCSD_ERROR_H_INCLUDED
|
||||
|
||||
#include "opencsd/ocsd_if_types.h"
|
||||
#include <string>
|
||||
/** @ingroup ocsd_infrastructure
|
||||
@{*/
|
||||
|
||||
/*!
|
||||
* @class ocsdError
|
||||
*
|
||||
* This class is the error object for the Ocsd.
|
||||
*
|
||||
* Errors are created with a severity (ocsd_err_severity_t) and a standard ocsd_err_t error code.
|
||||
* Errors can optionally be created with a trace index (offset from start of capture buffer), and
|
||||
* trace CoreSight source channel ID.
|
||||
*
|
||||
* A custom error message can be appended to the error.
|
||||
*
|
||||
* The ocsdError class contains a static function to output a formatted string representation of an error.
|
||||
*
|
||||
*/
|
||||
class ocsdError {
|
||||
public:
|
||||
ocsdError(const ocsd_err_severity_t sev_type, const ocsd_err_t code); /**< Default error constructor with severity and error code. */
|
||||
ocsdError(const ocsd_err_severity_t sev_type, const ocsd_err_t code, const ocsd_trc_index_t idx); /**< Constructor with optional trace index. */
|
||||
ocsdError(const ocsd_err_severity_t sev_type, const ocsd_err_t code, const ocsd_trc_index_t idx, const uint8_t chan_id); /**< Constructor with optional trace index and channel ID. */
|
||||
ocsdError(const ocsd_err_severity_t sev_type, const ocsd_err_t code, const std::string &msg); /**< Default error constructor with severity and error code - plus message. */
|
||||
ocsdError(const ocsd_err_severity_t sev_type, const ocsd_err_t code, const ocsd_trc_index_t idx, const std::string &msg); /**< Constructor with optional trace index - plus message. */
|
||||
ocsdError(const ocsd_err_severity_t sev_type, const ocsd_err_t code, const ocsd_trc_index_t idx, const uint8_t chan_id, const std::string &msg); /**< Constructor with optional trace index and channel ID - plus message. */
|
||||
|
||||
ocsdError(const ocsdError *pError); /**< Copy constructor */
|
||||
ocsdError(const ocsdError &Error); /**< Copy constructor */
|
||||
~ocsdError(); /**< Destructor */
|
||||
|
||||
ocsdError& operator=(const ocsdError *p_err);
|
||||
ocsdError& operator=(const ocsdError &err);
|
||||
|
||||
void setMessage(const std::string &msg) { m_err_message = msg; }; /**< Set custom error message */
|
||||
const std::string &getMessage() const { return m_err_message; }; /**< Get custom error message */
|
||||
|
||||
const ocsd_err_t getErrorCode() const { return m_error_code; }; /**< Get error code. */
|
||||
const ocsd_err_severity_t getErrorSeverity() const { return m_sev; }; /**< Get error severity. */
|
||||
const ocsd_trc_index_t getErrorIndex() const { return m_idx; }; /**< Get trace index associated with the error. */
|
||||
const uint8_t getErrorChanID() const { return m_chan_ID; }; /**< Get the trace source channel ID associated with the error. */
|
||||
|
||||
static const std::string getErrorString(const ocsdError &error); /**< Generate a formatted error string for the supplied error. */
|
||||
|
||||
private:
|
||||
static void appendErrorDetails(std::string &errStr, const ocsdError &error); /**< build the error string. */
|
||||
ocsdError(); /**< Make no parameter default constructor inaccessible. */
|
||||
|
||||
ocsd_err_t m_error_code; /**< Error code for this error */
|
||||
ocsd_err_severity_t m_sev; /**< severity for this error */
|
||||
ocsd_trc_index_t m_idx; /**< Trace buffer index associated with this error (optional) */
|
||||
uint8_t m_chan_ID; /**< trace source ID associated with this error (optional) */
|
||||
|
||||
std::string m_err_message; /**< Additional text associated with this error (optional) */
|
||||
};
|
||||
|
||||
inline ocsdError& ocsdError::operator=(const ocsdError *p_err)
|
||||
{
|
||||
this->m_error_code = p_err->getErrorCode();
|
||||
this->m_sev = p_err->getErrorSeverity();
|
||||
this->m_idx = p_err->getErrorIndex();
|
||||
this->m_chan_ID = p_err->getErrorChanID();
|
||||
this->m_err_message = p_err->getMessage();
|
||||
return *this;
|
||||
}
|
||||
|
||||
inline ocsdError& ocsdError::operator=(const ocsdError &err)
|
||||
{
|
||||
return (*this = &err);
|
||||
}
|
||||
|
||||
|
||||
/** @}*/
|
||||
|
||||
#endif // ARM_OCSD_ERROR_H_INCLUDED
|
||||
|
||||
/* End of File ocsd_error.h */
|
89
decoder/include/common/ocsd_error_logger.h
Normal file
89
decoder/include/common/ocsd_error_logger.h
Normal file
@ -0,0 +1,89 @@
|
||||
/*!
|
||||
* \file ocsd_error_logger.h
|
||||
* \brief OpenCSD : Library error logger.
|
||||
*
|
||||
* \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef ARM_OCSD_ERROR_LOGGER_H_INCLUDED
|
||||
#define ARM_OCSD_ERROR_LOGGER_H_INCLUDED
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <fstream>
|
||||
|
||||
#include "interfaces/trc_error_log_i.h"
|
||||
#include "ocsd_error.h"
|
||||
#include "ocsd_msg_logger.h"
|
||||
|
||||
class ocsdDefaultErrorLogger : public ITraceErrorLog
|
||||
{
|
||||
public:
|
||||
ocsdDefaultErrorLogger();
|
||||
virtual ~ocsdDefaultErrorLogger();
|
||||
|
||||
bool initErrorLogger(const ocsd_err_severity_t verbosity, bool bCreateOutputLogger = false);
|
||||
|
||||
virtual ocsdMsgLogger *getOutputLogger() { return m_output_logger; };
|
||||
virtual void setOutputLogger(ocsdMsgLogger *pLogger);
|
||||
|
||||
virtual const ocsd_hndl_err_log_t RegisterErrorSource(const std::string &component_name);
|
||||
|
||||
virtual void LogError(const ocsd_hndl_err_log_t handle, const ocsdError *Error);
|
||||
virtual void LogMessage(const ocsd_hndl_err_log_t handle, const ocsd_err_severity_t filter_level, const std::string &msg );
|
||||
|
||||
virtual const ocsd_err_severity_t GetErrorLogVerbosity() const { return m_Verbosity; };
|
||||
|
||||
virtual ocsdError *GetLastError() { return m_lastErr; };
|
||||
virtual ocsdError *GetLastIDError(const uint8_t chan_id)
|
||||
{
|
||||
if(OCSD_IS_VALID_CS_SRC_ID(chan_id))
|
||||
return m_lastErrID[chan_id];
|
||||
return 0;
|
||||
};
|
||||
|
||||
private:
|
||||
void CreateErrorObj(ocsdError **ppErr, const ocsdError *p_from);
|
||||
|
||||
ocsdError *m_lastErr;
|
||||
ocsdError *m_lastErrID[0x80];
|
||||
|
||||
ocsd_err_severity_t m_Verbosity;
|
||||
|
||||
ocsdMsgLogger *m_output_logger; // pointer to a standard message output logger;
|
||||
bool m_created_output_logger; // true if this class created it's own logger;
|
||||
|
||||
std::vector<std::string> m_error_sources;
|
||||
};
|
||||
|
||||
|
||||
#endif // ARM_OCSD_ERROR_LOGGER_H_INCLUDED
|
||||
|
||||
/* End of File ocsd_error_logger.h */
|
153
decoder/include/common/ocsd_gen_elem_list.h
Normal file
153
decoder/include/common/ocsd_gen_elem_list.h
Normal file
@ -0,0 +1,153 @@
|
||||
/*
|
||||
* \file ocsd_gen_elem_stack.h
|
||||
* \brief OpenCSD : Generic element output stack.
|
||||
*
|
||||
* \copyright Copyright (c) 2016, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <list>
|
||||
#include "trc_gen_elem.h"
|
||||
#include "comp_attach_pt_t.h"
|
||||
#include "interfaces/trc_gen_elem_in_i.h"
|
||||
|
||||
/*!
|
||||
* @class OcsdGenElemList
|
||||
* @brief Maintain a list of elements to be output
|
||||
*
|
||||
* Each incoming packet can result in multiple output elements.
|
||||
* These are stacked in this class prior to entering the output phase of processing.
|
||||
*
|
||||
* This should remove some of the requirement on the packet processing to be re-enterant,
|
||||
* simplifying this code.
|
||||
*
|
||||
* Last element(s) on this stack can be marked pending to allow for later cancellation.
|
||||
* (This required for cancel element in ETMv3 exeception branch).
|
||||
*
|
||||
* The "list" is actually a ring buffer - maintaining pointers to indicate current valid elements.
|
||||
* This buffer can increase on demand, but will only be released at the end of a decode session.
|
||||
*/
|
||||
class OcsdGenElemList
|
||||
{
|
||||
public:
|
||||
OcsdGenElemList();
|
||||
~OcsdGenElemList();
|
||||
|
||||
void initSendIf(componentAttachPt<ITrcGenElemIn> *pGenElemIf);
|
||||
void initCSID(const uint8_t CSID) { m_CSID = CSID; };
|
||||
|
||||
void reset(); //!< reset the element list.
|
||||
|
||||
OcsdTraceElement *getNextElem(const ocsd_trc_index_t trc_pkt_idx); //!< get next free element on the stack (add one to the output)
|
||||
const int getNumElem() const; //!< return the total number of elements on the stack (inlcuding any pended ones).
|
||||
|
||||
const ocsd_gen_trc_elem_t getElemType(const int entryN) const; //!< get the type for the nth element in the stack (0 indexed)
|
||||
|
||||
void pendLastNElem(int numPend); //!< Last element to be pended prior to cancel/commit decision.
|
||||
void commitAllPendElem(); //!< commit all pended elements.
|
||||
void cancelPendElem(); //!< cancel the last pended element on the stack.
|
||||
const int numPendElem() const; //!< return the number of pended elements.
|
||||
|
||||
/*! Send all of the none pended elements
|
||||
Stop sending when all sent or _CONT response.
|
||||
*/
|
||||
ocsd_datapath_resp_t sendElements();
|
||||
const bool elemToSend() const; //!< true if any none-pending elements left to send.
|
||||
|
||||
private:
|
||||
|
||||
void growArray();
|
||||
const int getAdjustedIdx(int idxIn) const; //!< get adjusted index into circular buffer.
|
||||
|
||||
|
||||
// list element contains pointer and byte index in trace stream
|
||||
typedef struct _elemPtr {
|
||||
OcsdTraceElement *pElem; //!< pointer to the listed trace element
|
||||
ocsd_trc_index_t trc_pkt_idx; //!< packet index in the trace stream
|
||||
} elemPtr_t;
|
||||
|
||||
elemPtr_t *m_pElemArray; //!< an array of pointers to elements.
|
||||
int m_elemArraySize; //!< number of element pointers in the array
|
||||
|
||||
int m_firstElemIdx; //!< internal index in array of first element in use.
|
||||
int m_numUsed; //!< number of elements in use
|
||||
int m_numPend; //!< internal count of pended elements.
|
||||
|
||||
uint8_t m_CSID;
|
||||
|
||||
componentAttachPt<ITrcGenElemIn> *m_sendIf; //!< element send interface.
|
||||
};
|
||||
|
||||
inline const int OcsdGenElemList::getAdjustedIdx(int idxIn) const
|
||||
{
|
||||
if(idxIn >= m_elemArraySize)
|
||||
idxIn -= m_elemArraySize;
|
||||
return idxIn;
|
||||
}
|
||||
|
||||
inline const int OcsdGenElemList::getNumElem() const
|
||||
{
|
||||
return m_numUsed;
|
||||
}
|
||||
|
||||
inline const int OcsdGenElemList::numPendElem() const
|
||||
{
|
||||
return m_numPend;
|
||||
}
|
||||
|
||||
inline void OcsdGenElemList::pendLastNElem(int numPend)
|
||||
{
|
||||
if(numPend >= getNumElem())
|
||||
m_numPend = numPend;
|
||||
}
|
||||
|
||||
inline void OcsdGenElemList::commitAllPendElem()
|
||||
{
|
||||
m_numPend = 0;
|
||||
}
|
||||
|
||||
inline void OcsdGenElemList::cancelPendElem()
|
||||
{
|
||||
if(m_numPend > 0)
|
||||
{
|
||||
m_numUsed -= m_numPend;
|
||||
}
|
||||
}
|
||||
|
||||
inline const bool OcsdGenElemList::elemToSend() const
|
||||
{
|
||||
return ((getNumElem() - m_numPend) > 0);
|
||||
}
|
||||
|
||||
inline void OcsdGenElemList::initSendIf(componentAttachPt<ITrcGenElemIn> *pGenElemIf)
|
||||
{
|
||||
m_sendIf = pGenElemIf;
|
||||
}
|
||||
|
||||
/* End of File ocsd_gen_elem_stack.h */
|
131
decoder/include/common/ocsd_lib_dcd_register.h
Normal file
131
decoder/include/common/ocsd_lib_dcd_register.h
Normal file
@ -0,0 +1,131 @@
|
||||
/*
|
||||
* \file ocsd_lib_dcd_register.h
|
||||
* \brief OpenCSD : Library decoder registration and management.
|
||||
*
|
||||
* \copyright Copyright (c) 2016, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
#ifndef ARM_OCSD_LIB_DCD_REGISTER_H_INCLUDED
|
||||
#define ARM_OCSD_LIB_DCD_REGISTER_H_INCLUDED
|
||||
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <map>
|
||||
|
||||
#include "opencsd/ocsd_if_types.h"
|
||||
#include "common/ocsd_dcd_mngr_i.h"
|
||||
|
||||
/*!
|
||||
* @class OcsdLibDcdRegister : Registers decoders with the library
|
||||
*
|
||||
* library decoder register class allows decoders to be registered by name, and the register allows clients to access
|
||||
* the list of names of registerd decoders.
|
||||
*
|
||||
* The decoders in the library are accessed through the decoder manager interface. This provides a set of functions to allow
|
||||
* the creation, manipulation and destruction of registered decoders
|
||||
*
|
||||
*/
|
||||
class OcsdLibDcdRegister
|
||||
{
|
||||
public:
|
||||
static OcsdLibDcdRegister *getDecoderRegister();
|
||||
|
||||
static void deregisterAllDecoders(); //!< library cleanup - deregisters decoder managers and destroys the register object.
|
||||
static const ocsd_trace_protocol_t getNextCustomProtocolID();
|
||||
static void releaseLastCustomProtocolID();
|
||||
|
||||
const ocsd_err_t registerDecoderTypeByName(const std::string &name, IDecoderMngr *p_decoder_fact); //!< register a decoder manager interface
|
||||
const ocsd_err_t getDecoderMngrByName(const std::string &name, IDecoderMngr **p_decoder_mngr);
|
||||
const ocsd_err_t getDecoderMngrByType(const ocsd_trace_protocol_t decoderType, IDecoderMngr **p_decoder_mngr);
|
||||
|
||||
const bool isRegisteredDecoder(const std::string &name);
|
||||
const bool getFirstNamedDecoder(std::string &name);
|
||||
const bool getNextNamedDecoder(std::string &name);
|
||||
|
||||
const bool isRegisteredDecoderType(const ocsd_trace_protocol_t decoderType);
|
||||
|
||||
private:
|
||||
void registerBuiltInDecoders(); //!< register the list of build in decoder managers on first access of getDecoderMngrByName.
|
||||
void deRegisterCustomDecoders(); //!< delete all custom decoders registered with the library.
|
||||
|
||||
std::map<const std::string, IDecoderMngr *> m_decoder_mngrs; //!< map linking names to decoder manager interfaces.
|
||||
std::map<const std::string, IDecoderMngr *>::const_iterator m_iter; //!< iterator for name search.
|
||||
|
||||
std::map<const ocsd_trace_protocol_t, IDecoderMngr *> m_typed_decoder_mngrs; //!< map linking decoder managers to protocol type ID
|
||||
|
||||
// cache last found by type to speed up repeated quries on same object.
|
||||
IDecoderMngr *m_pLastTypedDecoderMngr; //!< last manager we found by type
|
||||
|
||||
|
||||
|
||||
// singleton pattern - need just one of these in the library - ensure all default constructors are private.
|
||||
OcsdLibDcdRegister();
|
||||
OcsdLibDcdRegister(OcsdLibDcdRegister const &) {};
|
||||
OcsdLibDcdRegister& operator=(OcsdLibDcdRegister const &){ return *this; };
|
||||
~OcsdLibDcdRegister();
|
||||
|
||||
static OcsdLibDcdRegister *m_p_libMngr;
|
||||
static bool m_b_registeredBuiltins;
|
||||
static ocsd_trace_protocol_t m_nextCustomProtocolID;
|
||||
};
|
||||
|
||||
/*!
|
||||
* Typedef of function signature to create a decoder manager.
|
||||
*
|
||||
* @param *name : Registered name of the decoder.
|
||||
*/
|
||||
typedef IDecoderMngr *(*CreateMngr)(const std::string &name);
|
||||
|
||||
/*!
|
||||
* Template function to create a specific decoder manager class object.
|
||||
*
|
||||
* @param &name : Registered name of the decoder.
|
||||
*
|
||||
* @return IDecoderMngr * : pointer to the decoder manager base class interface.
|
||||
*/
|
||||
template <typename T> IDecoderMngr *createManagerInst(const std::string &name)
|
||||
{
|
||||
return new (std::nothrow)T(name);
|
||||
}
|
||||
|
||||
/*! Structure to contain the information needed to create and register a builtin decoder
|
||||
* manager with the library
|
||||
*/
|
||||
typedef struct built_in_decoder_info {
|
||||
IDecoderMngr *pMngr; //!< pointer to created decoder manager
|
||||
CreateMngr PFn; //!< function to create the decoder manager.
|
||||
const char *name; //!< registered name of the decoder.
|
||||
} built_in_decoder_info_t;
|
||||
|
||||
//! Define to use to fill in an array of built_in_decoder_info_t structures.
|
||||
#define CREATE_BUILTIN_ENTRY(C,N) { 0, createManagerInst<C>, N }
|
||||
|
||||
#endif // ARM_OCSD_LIB_DCD_REGISTER_H_INCLUDED
|
||||
|
||||
/* End of File ocsd_lib_dcd_register.h */
|
84
decoder/include/common/ocsd_msg_logger.h
Normal file
84
decoder/include/common/ocsd_msg_logger.h
Normal file
@ -0,0 +1,84 @@
|
||||
/*!
|
||||
* \file ocsd_msg_logger.h
|
||||
* \brief OpenCSD : Generic Message logger / printer
|
||||
*
|
||||
* \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef ARM_OCSD_MSG_LOGGER_H_INCLUDED
|
||||
#define ARM_OCSD_MSG_LOGGER_H_INCLUDED
|
||||
|
||||
#include <string>
|
||||
#include <fstream>
|
||||
|
||||
class ocsdMsgLogStrOutI
|
||||
{
|
||||
public:
|
||||
ocsdMsgLogStrOutI() {};
|
||||
virtual ~ocsdMsgLogStrOutI() {};
|
||||
|
||||
virtual void printOutStr(const std::string &outStr) = 0;
|
||||
};
|
||||
|
||||
class ocsdMsgLogger
|
||||
{
|
||||
public:
|
||||
ocsdMsgLogger();
|
||||
~ocsdMsgLogger();
|
||||
|
||||
typedef enum {
|
||||
OUT_NONE = 0,
|
||||
OUT_FILE = 1,
|
||||
OUT_STDERR = 2,
|
||||
OUT_STDOUT = 4,
|
||||
OUT_STR_CB = 8 /* output to external string callback interface */
|
||||
} output_dest;
|
||||
|
||||
void setLogOpts(int logOpts);
|
||||
const int getLogOpts() const { return m_outFlags; };
|
||||
|
||||
void setLogFileName(const char *fileName);
|
||||
void setStrOutFn(ocsdMsgLogStrOutI *p_IstrOut);
|
||||
|
||||
void LogMsg(const std::string &msg);
|
||||
|
||||
const bool isLogging() const;
|
||||
|
||||
private:
|
||||
int m_outFlags;
|
||||
|
||||
std::string m_logFileName;
|
||||
std::fstream m_out_file;
|
||||
ocsdMsgLogStrOutI *m_pOutStrI;
|
||||
};
|
||||
|
||||
#endif // ARM_OCSD_MSG_LOGGER_H_INCLUDED
|
||||
|
||||
/* End of File ocsd_msg_logger.h */
|
116
decoder/include/common/ocsd_pe_context.h
Normal file
116
decoder/include/common/ocsd_pe_context.h
Normal file
@ -0,0 +1,116 @@
|
||||
/*
|
||||
* \file ocsd_pe_context.h
|
||||
* \brief OpenCSD : Wrapper class for PE context
|
||||
*
|
||||
* \copyright Copyright (c) 2016, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
#ifndef ARM_OCSD_PE_CONTEXT_H_INCLUDED
|
||||
#define ARM_OCSD_PE_CONTEXT_H_INCLUDED
|
||||
|
||||
#include "opencsd/ocsd_if_types.h"
|
||||
|
||||
/*! @class OcsdPeContext
|
||||
* @brief Handler for the ocsd_pe_context structure.
|
||||
*
|
||||
* Reads and writes structure values, enforcing interaction rules between values
|
||||
* and flags.
|
||||
*/
|
||||
class OcsdPeContext
|
||||
{
|
||||
public:
|
||||
OcsdPeContext();
|
||||
OcsdPeContext(const ocsd_pe_context *context);
|
||||
~OcsdPeContext() {};
|
||||
|
||||
OcsdPeContext &operator =(const OcsdPeContext &ctxt);
|
||||
OcsdPeContext &operator =(const ocsd_pe_context *context);
|
||||
|
||||
void resetCtxt();
|
||||
|
||||
void setSecLevel(const ocsd_sec_level sl) { m_context.security_level = sl; };
|
||||
void setEL(const ocsd_ex_level el) { m_context.exception_level = el; m_context.el_valid = el > ocsd_EL_unknown ? 1 : 0; };
|
||||
void setCtxtID(const uint32_t id) { m_context.context_id = id; m_context.ctxt_id_valid = 1; };
|
||||
void setVMID(const uint32_t id) { m_context.vmid = id; m_context.vmid_valid = 1; };
|
||||
void set64bit(const bool is64bit) { m_context.bits64 = is64bit ? 1 : 0; };
|
||||
|
||||
const ocsd_sec_level getSecLevel() const { return m_context.security_level; };
|
||||
const ocsd_ex_level getEL() const { return m_context.exception_level; };
|
||||
const bool ELvalid() const { return (m_context.el_valid == 1); };
|
||||
const uint32_t getCtxtID() const { return (m_context.ctxt_id_valid == 1) ? m_context.context_id : 0; };
|
||||
const bool ctxtIDvalid() const { return (m_context.ctxt_id_valid == 1); };
|
||||
const uint32_t getVMID() const { return (m_context.vmid_valid == 1) ? m_context.vmid : 0; };
|
||||
const bool VMIDvalid() const { return (m_context.vmid_valid == 1); };
|
||||
|
||||
// only allow an immutable copy of the structure out to C-API land.
|
||||
operator const ocsd_pe_context &() const { return m_context; };
|
||||
|
||||
private:
|
||||
ocsd_pe_context m_context;
|
||||
};
|
||||
|
||||
inline OcsdPeContext::OcsdPeContext()
|
||||
{
|
||||
resetCtxt();
|
||||
}
|
||||
|
||||
inline OcsdPeContext::OcsdPeContext(const ocsd_pe_context *context)
|
||||
{
|
||||
m_context = *context;
|
||||
}
|
||||
|
||||
inline void OcsdPeContext::resetCtxt()
|
||||
{
|
||||
// initialise the context
|
||||
m_context.bits64 = 0;
|
||||
m_context.context_id = 0;
|
||||
m_context.ctxt_id_valid = 0;
|
||||
m_context.el_valid = 0;
|
||||
m_context.exception_level = ocsd_EL_unknown;
|
||||
m_context.security_level = ocsd_sec_secure;
|
||||
m_context.vmid = 0;
|
||||
m_context.vmid_valid = 0;
|
||||
}
|
||||
|
||||
inline OcsdPeContext & OcsdPeContext::operator =(const OcsdPeContext &ctxt)
|
||||
{
|
||||
m_context = ctxt;
|
||||
return *this;
|
||||
}
|
||||
|
||||
inline OcsdPeContext & OcsdPeContext::operator =(const ocsd_pe_context *context)
|
||||
{
|
||||
m_context = *context;
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
#endif // ARM_OCSD_PE_CONTEXT_H_INCLUDED
|
||||
|
||||
/* End of File ocsd_pe_context.h */
|
46
decoder/include/common/ocsd_version.h
Normal file
46
decoder/include/common/ocsd_version.h
Normal file
@ -0,0 +1,46 @@
|
||||
/*
|
||||
* \file ocsd_version.h
|
||||
* \brief OpenCSD :
|
||||
*
|
||||
* \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
#ifndef ARM_OCSD_VERSION_H_INCLUDED
|
||||
#define ARM_OCSD_VERSION_H_INCLUDED
|
||||
|
||||
class ocsdVersion
|
||||
{
|
||||
public:
|
||||
static const uint32_t vers_num();
|
||||
static const char *vers_str();
|
||||
};
|
||||
|
||||
#endif // ARM_OCSD_VERSION_H_INCLUDED
|
||||
|
||||
/* End of File ocsd_version.h */
|
149
decoder/include/common/trc_component.h
Normal file
149
decoder/include/common/trc_component.h
Normal file
@ -0,0 +1,149 @@
|
||||
/*!
|
||||
* \file trc_component.h
|
||||
* \brief OpenCSD : Base trace decode component.
|
||||
*
|
||||
* \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef ARM_TRC_COMPONENT_H_INCLUDED
|
||||
#define ARM_TRC_COMPONENT_H_INCLUDED
|
||||
|
||||
#include <string>
|
||||
#include "comp_attach_pt_t.h"
|
||||
#include "interfaces/trc_error_log_i.h"
|
||||
#include "ocsd_error.h"
|
||||
|
||||
class errLogAttachMonitor;
|
||||
|
||||
/** @addtogroup ocsd_infrastructure
|
||||
@{*/
|
||||
|
||||
/*!
|
||||
* @class TraceComponent
|
||||
* @brief Base class for all decode components in the library.
|
||||
*
|
||||
* Provides error logging attachment point and component type and instance naming
|
||||
* Interface for handling of component operational mode.
|
||||
*/
|
||||
class TraceComponent
|
||||
{
|
||||
public:
|
||||
TraceComponent(const std::string &name);
|
||||
TraceComponent(const std::string &name, int instIDNum);
|
||||
virtual ~TraceComponent(); /**< Default Destructor */
|
||||
|
||||
const std::string &getComponentName() const { return m_name; };
|
||||
void setComponentName(const std::string &name) { m_name = name; };
|
||||
|
||||
/** Error logger attachment point.*/
|
||||
componentAttachPt<ITraceErrorLog> *getErrorLogAttachPt() { return &m_error_logger; };
|
||||
|
||||
/*!
|
||||
* Set the operational mode for the component.
|
||||
* This controls the way the component behaves under error conditions etc.
|
||||
* These flags may also control output formats or data.
|
||||
* Operation mode flags used are component specific and defined by derived classes.
|
||||
*
|
||||
* @param op_flags : Set of operation mode flags.
|
||||
*
|
||||
* @return ocsd_err_t : OCSD_OK if flags supported by this component, error if unsuppored
|
||||
*/
|
||||
ocsd_err_t setComponentOpMode(uint32_t op_flags);
|
||||
|
||||
/*!
|
||||
* Return the current operational mode flags values
|
||||
*
|
||||
* @return const uint32_t : Op Mode flags.
|
||||
*/
|
||||
const uint32_t getComponentOpMode() const { return m_op_flags; };
|
||||
|
||||
/*!
|
||||
* Get the supported operational mode flags for this component.
|
||||
* Base class will return nothing supported.
|
||||
* Derived class must set the value correctly for the component.
|
||||
*
|
||||
* @return const uint32_t : Supported flags values.
|
||||
*/
|
||||
const uint32_t getSupportedOpModes() const { return m_supported_op_flags; };
|
||||
|
||||
/*!
|
||||
* Set associated trace component - used by generic code to track
|
||||
* packet processor / packet decoder pairs.
|
||||
*
|
||||
* @param *assocComp : pointer to the associated component
|
||||
*/
|
||||
void setAssocComponent(TraceComponent *assocComp) { m_assocComp = assocComp; };
|
||||
|
||||
|
||||
/*!
|
||||
* get associated trace component pointer
|
||||
*
|
||||
* @return TraceComponent *: associated component.
|
||||
*/
|
||||
TraceComponent *getAssocComponent() { return m_assocComp; };
|
||||
|
||||
/*!
|
||||
* Log a message at the default severity on this component.
|
||||
*/
|
||||
void LogDefMessage(const std::string &msg)
|
||||
{
|
||||
LogMessage(m_errVerbosity, msg);
|
||||
}
|
||||
|
||||
protected:
|
||||
friend class errLogAttachMonitor;
|
||||
|
||||
void LogError(const ocsdError &Error);
|
||||
void LogMessage(const ocsd_err_severity_t filter_level, const std::string &msg);
|
||||
const ocsd_err_severity_t getErrorLogLevel() const { return m_errVerbosity; };
|
||||
const bool isLoggingErrorLevel(const ocsd_err_severity_t level) const { return level <= m_errVerbosity; };
|
||||
void updateErrorLogLevel();
|
||||
|
||||
void do_attach_notify(const int num_attached);
|
||||
void Init(const std::string &name);
|
||||
|
||||
uint32_t m_op_flags; //!< current component operational mode flags.
|
||||
uint32_t m_supported_op_flags; //!< supported component operational mode flags - derived class to intialise.
|
||||
|
||||
private:
|
||||
componentAttachPt<ITraceErrorLog> m_error_logger;
|
||||
ocsd_hndl_err_log_t m_errLogHandle;
|
||||
ocsd_err_severity_t m_errVerbosity;
|
||||
errLogAttachMonitor *m_pErrAttachMon;
|
||||
|
||||
std::string m_name;
|
||||
|
||||
TraceComponent *m_assocComp; //!< associated component -> if this is a pkt decoder, associated pkt processor.
|
||||
};
|
||||
/** @}*/
|
||||
#endif // ARM_TRC_COMPONENT_H_INCLUDED
|
||||
|
||||
/* End of File trc_component.h */
|
68
decoder/include/common/trc_core_arch_map.h
Normal file
68
decoder/include/common/trc_core_arch_map.h
Normal file
@ -0,0 +1,68 @@
|
||||
/*!
|
||||
* \file trc_core_arch_map.h
|
||||
* \brief OpenCSD : Map core name strings to architecture profile constants.
|
||||
*
|
||||
* \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef ARM_TRC_CORE_ARCH_MAP_H_INCLUDED
|
||||
#define ARM_TRC_CORE_ARCH_MAP_H_INCLUDED
|
||||
|
||||
#include <map>
|
||||
#include <string>
|
||||
#include "opencsd/ocsd_if_types.h"
|
||||
|
||||
class CoreArchProfileMap
|
||||
{
|
||||
public:
|
||||
CoreArchProfileMap();
|
||||
~CoreArchProfileMap() {};
|
||||
|
||||
ocsd_arch_profile_t getArchProfile(const std::string &coreName);
|
||||
|
||||
private:
|
||||
|
||||
std::map<std::string, ocsd_arch_profile_t> core_profiles;
|
||||
};
|
||||
|
||||
inline ocsd_arch_profile_t CoreArchProfileMap::getArchProfile(const std::string &coreName)
|
||||
{
|
||||
ocsd_arch_profile_t ap = { ARCH_UNKNOWN, profile_Unknown };
|
||||
|
||||
std::map<std::string, ocsd_arch_profile_t>::const_iterator it;
|
||||
it = core_profiles.find(coreName);
|
||||
if(it != core_profiles.end())
|
||||
ap = it->second;
|
||||
return ap;
|
||||
}
|
||||
|
||||
#endif // ARM_TRC_CORE_ARCH_MAP_H_INCLUDED
|
||||
|
||||
/* End of File trc_core_arch_map.h */
|
62
decoder/include/common/trc_cs_config.h
Normal file
62
decoder/include/common/trc_cs_config.h
Normal file
@ -0,0 +1,62 @@
|
||||
/*
|
||||
* \file trc_cs_config.h
|
||||
* \brief OpenCSD : Trace component config base class.
|
||||
*
|
||||
* \copyright Copyright (c) 2016, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
#ifndef ARM_TRC_CS_CONFIG_H_INCLUDED
|
||||
#define ARM_TRC_CS_CONFIG_H_INCLUDED
|
||||
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
/** @addtogroup ocsd_protocol_cfg
|
||||
@{*/
|
||||
|
||||
/*!
|
||||
* @class CSConfig
|
||||
* @brief Base class for configuration data on CoreSight trace component.
|
||||
*
|
||||
* Defines common access functionality, common to all components.
|
||||
* (e.g. trace ID).
|
||||
*
|
||||
*/
|
||||
class CSConfig
|
||||
{
|
||||
public:
|
||||
CSConfig() {};
|
||||
virtual ~CSConfig() {};
|
||||
|
||||
virtual const uint8_t getTraceID() const = 0; //!< CoreSight Trace ID for this device.
|
||||
};
|
||||
|
||||
/** @}*/
|
||||
|
||||
#endif // ARM_TRC_CS_CONFIG_H_INCLUDED
|
||||
|
||||
/* End of File trc_cs_config.h */
|
97
decoder/include/common/trc_frame_deformatter.h
Normal file
97
decoder/include/common/trc_frame_deformatter.h
Normal file
@ -0,0 +1,97 @@
|
||||
/*!
|
||||
* \file trc_frame_deformatter.h
|
||||
* \brief OpenCSD : De-format CoreSight formatted trace frame.
|
||||
*
|
||||
* \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
#ifndef ARM_TRC_FRAME_DEFORMATTER_H_INCLUDED
|
||||
#define ARM_TRC_FRAME_DEFORMATTER_H_INCLUDED
|
||||
|
||||
#include "opencsd/ocsd_if_types.h"
|
||||
|
||||
#include "interfaces/trc_data_raw_in_i.h"
|
||||
#include "comp_attach_pt_t.h"
|
||||
|
||||
class ITrcRawFrameIn;
|
||||
class ITrcDataMixIDIn;
|
||||
class ITrcSrcIndexCreator;
|
||||
class ITraceErrorLog;
|
||||
class TraceFmtDcdImpl;
|
||||
|
||||
/** @defgroup ocsd_deformatter OpenCSD Library : Trace Frame Deformatter
|
||||
@brief CoreSight Formatted Trace Frame - deformatting functionality.
|
||||
@{*/
|
||||
|
||||
class TraceFormatterFrameDecoder : public ITrcDataIn
|
||||
{
|
||||
public:
|
||||
TraceFormatterFrameDecoder();
|
||||
TraceFormatterFrameDecoder(int instNum);
|
||||
virtual ~TraceFormatterFrameDecoder();
|
||||
|
||||
/* the data input interface from the reader */
|
||||
virtual ocsd_datapath_resp_t TraceDataIn( const ocsd_datapath_op_t op,
|
||||
const ocsd_trc_index_t index,
|
||||
const uint32_t dataBlockSize,
|
||||
const uint8_t *pDataBlock,
|
||||
uint32_t *numBytesProcessed);
|
||||
|
||||
/* attach a data processor to a stream ID output */
|
||||
componentAttachPt<ITrcDataIn> *getIDStreamAttachPt(uint8_t ID);
|
||||
|
||||
/* attach a data processor to the raw frame output */
|
||||
componentAttachPt<ITrcRawFrameIn> *getTrcRawFrameAttachPt();
|
||||
|
||||
componentAttachPt<ITrcSrcIndexCreator> *getTrcSrcIndexAttachPt();
|
||||
|
||||
componentAttachPt<ITraceErrorLog> *getErrLogAttachPt();
|
||||
|
||||
/* configuration - set operational mode for incoming stream (has FSYNCS etc) */
|
||||
ocsd_err_t Configure(uint32_t cfg_flags);
|
||||
const uint32_t getConfigFlags() const;
|
||||
|
||||
/* enable / disable ID streams - default as all enabled */
|
||||
ocsd_err_t OutputFilterIDs(std::vector<uint8_t> &id_list, bool bEnable);
|
||||
ocsd_err_t OutputFilterAllIDs(bool bEnable);
|
||||
|
||||
/* decode control */
|
||||
ocsd_datapath_resp_t Reset(); /* reset the decode to the start state, drop partial data - propogate to attached components */
|
||||
ocsd_datapath_resp_t Flush(); /* flush existing data if possible, retain state - propogate to attached components */
|
||||
|
||||
private:
|
||||
TraceFmtDcdImpl *m_pDecoder;
|
||||
int m_instNum;
|
||||
};
|
||||
|
||||
/** @}*/
|
||||
|
||||
#endif // ARM_TRC_FRAME_DEFORMATTER_H_INCLUDED
|
||||
|
||||
/* End of File trc_frame_deformatter.h */
|
206
decoder/include/common/trc_gen_elem.h
Normal file
206
decoder/include/common/trc_gen_elem.h
Normal file
@ -0,0 +1,206 @@
|
||||
/*!
|
||||
* \file trc_gen_elem.h
|
||||
* \brief OpenCSD : Decoder Generic trace element output class.
|
||||
*
|
||||
* \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
#ifndef ARM_TRC_GEN_ELEM_H_INCLUDED
|
||||
#define ARM_TRC_GEN_ELEM_H_INCLUDED
|
||||
|
||||
#include "opencsd/trc_gen_elem_types.h"
|
||||
#include "trc_printable_elem.h"
|
||||
#include "ocsd_pe_context.h"
|
||||
|
||||
/** @addtogroup gen_trc_elem
|
||||
@{*/
|
||||
|
||||
/*!
|
||||
* @class OcsdTraceElement
|
||||
* @brief Generic trace element class
|
||||
*
|
||||
*/
|
||||
class OcsdTraceElement : public trcPrintableElem, public ocsd_generic_trace_elem
|
||||
{
|
||||
public:
|
||||
OcsdTraceElement();
|
||||
OcsdTraceElement(ocsd_gen_trc_elem_t type);
|
||||
virtual ~OcsdTraceElement() {};
|
||||
|
||||
void init();
|
||||
|
||||
// set elements API
|
||||
|
||||
void setType(const ocsd_gen_trc_elem_t type); //!< set type and init flags
|
||||
void updateType(const ocsd_gen_trc_elem_t type); //!< change type only - no init
|
||||
|
||||
void setContext(const ocsd_pe_context &new_context) { context = new_context; };
|
||||
void setISA(const ocsd_isa isa_update);
|
||||
|
||||
void setCycleCount(const uint32_t cycleCount);
|
||||
void setEvent(const event_t ev_type, const uint16_t number);
|
||||
void setTS(const uint64_t ts, const bool freqChange = false);
|
||||
|
||||
void setExcepMarker() { excep_data_marker = 1; };
|
||||
void setExceptionNum(uint32_t excepNum) { exception_number = excepNum; };
|
||||
|
||||
|
||||
void setTraceOnReason(const trace_on_reason_t reason);
|
||||
|
||||
void setAddrRange(const ocsd_vaddr_t st_addr, const ocsd_vaddr_t en_addr);
|
||||
void setLastInstrInfo(const bool exec, const ocsd_instr_type last_i_type, const ocsd_instr_subtype last_i_subtype);
|
||||
void setAddrStart(const ocsd_vaddr_t st_addr) { this->st_addr = st_addr; };
|
||||
|
||||
void setSWTInfo(const ocsd_swt_info_t swt_info) { sw_trace_info = swt_info; };
|
||||
void setExtendedDataPtr(const void *data_ptr);
|
||||
|
||||
// stringize the element
|
||||
|
||||
virtual void toString(std::string &str) const;
|
||||
|
||||
// get elements API
|
||||
|
||||
OcsdTraceElement &operator =(const ocsd_generic_trace_elem* p_elem);
|
||||
|
||||
const ocsd_gen_trc_elem_t getType() const { return elem_type; };
|
||||
|
||||
// return current context
|
||||
const ocsd_pe_context &getContext() const { return context; };
|
||||
|
||||
|
||||
private:
|
||||
void printSWInfoPkt(std::ostringstream &oss) const;
|
||||
void clearPerPktData(); //!< clear flags that indicate validity / have values on a per packet basis
|
||||
|
||||
};
|
||||
|
||||
inline OcsdTraceElement::OcsdTraceElement(ocsd_gen_trc_elem_t type)
|
||||
{
|
||||
elem_type = type;
|
||||
}
|
||||
|
||||
inline OcsdTraceElement::OcsdTraceElement()
|
||||
{
|
||||
elem_type = OCSD_GEN_TRC_ELEM_UNKNOWN;
|
||||
}
|
||||
|
||||
inline void OcsdTraceElement::setCycleCount(const uint32_t cycleCount)
|
||||
{
|
||||
cycle_count = cycleCount;
|
||||
has_cc = 1;
|
||||
}
|
||||
|
||||
inline void OcsdTraceElement::setEvent(const event_t ev_type, const uint16_t number)
|
||||
{
|
||||
trace_event.ev_type = (uint16_t)ev_type;
|
||||
trace_event.ev_number = ev_type == EVENT_NUMBERED ? number : 0;
|
||||
}
|
||||
|
||||
inline void OcsdTraceElement::setAddrRange(const ocsd_vaddr_t st_addr, const ocsd_vaddr_t en_addr)
|
||||
{
|
||||
this->st_addr = st_addr;
|
||||
this->en_addr = en_addr;
|
||||
}
|
||||
|
||||
inline void OcsdTraceElement::setLastInstrInfo(const bool exec, const ocsd_instr_type last_i_type, const ocsd_instr_subtype last_i_subtype)
|
||||
{
|
||||
last_instr_exec = exec ? 1 : 0;
|
||||
this->last_i_type = last_i_type;
|
||||
this->last_i_subtype = last_i_subtype;
|
||||
}
|
||||
|
||||
inline void OcsdTraceElement::setType(const ocsd_gen_trc_elem_t type)
|
||||
{
|
||||
// set the type and clear down the per element flags
|
||||
elem_type = type;
|
||||
|
||||
clearPerPktData();
|
||||
}
|
||||
|
||||
inline void OcsdTraceElement::updateType(const ocsd_gen_trc_elem_t type)
|
||||
{
|
||||
elem_type = type;
|
||||
}
|
||||
|
||||
inline void OcsdTraceElement::init()
|
||||
{
|
||||
st_addr = en_addr = (ocsd_vaddr_t)-1;
|
||||
isa = ocsd_isa_unknown;
|
||||
|
||||
cycle_count = 0;
|
||||
timestamp = 0;
|
||||
|
||||
context.ctxt_id_valid = 0;
|
||||
context.vmid_valid = 0;
|
||||
context.el_valid = 0;
|
||||
|
||||
last_i_type = OCSD_INSTR_OTHER;
|
||||
last_i_subtype = OCSD_S_INSTR_NONE;
|
||||
|
||||
clearPerPktData();
|
||||
}
|
||||
|
||||
inline void OcsdTraceElement::clearPerPktData()
|
||||
{
|
||||
flag_bits = 0; // union with trace_on_reason / trace_event
|
||||
|
||||
ptr_extended_data = 0; // extended data pointer
|
||||
}
|
||||
|
||||
inline void OcsdTraceElement::setTraceOnReason(const trace_on_reason_t reason)
|
||||
{
|
||||
trace_on_reason = reason;
|
||||
}
|
||||
|
||||
inline void OcsdTraceElement::setISA(const ocsd_isa isa_update)
|
||||
{
|
||||
isa = isa_update;
|
||||
if(isa > ocsd_isa_unknown)
|
||||
isa = ocsd_isa_unknown;
|
||||
}
|
||||
|
||||
inline void OcsdTraceElement::setTS(const uint64_t ts, const bool freqChange /*= false*/)
|
||||
{
|
||||
timestamp = ts;
|
||||
cpu_freq_change = freqChange ? 1 : 0;
|
||||
has_ts = 1;
|
||||
}
|
||||
|
||||
inline void OcsdTraceElement::setExtendedDataPtr(const void *data_ptr)
|
||||
{
|
||||
extended_data = 1;
|
||||
ptr_extended_data = data_ptr;
|
||||
}
|
||||
|
||||
|
||||
/** @}*/
|
||||
|
||||
#endif // ARM_TRC_GEN_ELEM_H_INCLUDED
|
||||
|
||||
/* End of File trc_gen_elem.h */
|
303
decoder/include/common/trc_pkt_decode_base.h
Normal file
303
decoder/include/common/trc_pkt_decode_base.h
Normal file
@ -0,0 +1,303 @@
|
||||
/*!
|
||||
* \file trc_pkt_decode_base.h
|
||||
* \brief OpenCSD : Trace Packet decoder base class.
|
||||
*
|
||||
* \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef ARM_TRC_PKT_DECODE_BASE_H_INCLUDED
|
||||
#define ARM_TRC_PKT_DECODE_BASE_H_INCLUDED
|
||||
|
||||
#include "trc_component.h"
|
||||
#include "comp_attach_pt_t.h"
|
||||
|
||||
#include "interfaces/trc_pkt_in_i.h"
|
||||
#include "interfaces/trc_gen_elem_in_i.h"
|
||||
#include "interfaces/trc_tgt_mem_access_i.h"
|
||||
#include "interfaces/trc_instr_decode_i.h"
|
||||
|
||||
/** @defgroup ocsd_pkt_decode OpenCSD Library : Packet Decoders.
|
||||
|
||||
@brief Classes providing Protocol Packet Decoding capability.
|
||||
|
||||
Packet decoders convert incoming protocol packets from a packet processor,
|
||||
into generic trace elements to be output to an analysis program.
|
||||
|
||||
Packet decoders can be:-
|
||||
- PE decoders - converting ETM or PTM packets into instruction and data trace elements
|
||||
- SW stimulus decoder - converting STM or ITM packets into software generated trace elements.
|
||||
- Bus decoders - converting HTM packets into bus transaction elements.
|
||||
|
||||
@{*/
|
||||
|
||||
|
||||
class TrcPktDecodeI : public TraceComponent
|
||||
{
|
||||
public:
|
||||
TrcPktDecodeI(const char *component_name);
|
||||
TrcPktDecodeI(const char *component_name, int instIDNum);
|
||||
virtual ~TrcPktDecodeI() {};
|
||||
|
||||
componentAttachPt<ITrcGenElemIn> *getTraceElemOutAttachPt() { return &m_trace_elem_out; };
|
||||
componentAttachPt<ITargetMemAccess> *getMemoryAccessAttachPt() { return &m_mem_access; };
|
||||
componentAttachPt<IInstrDecode> *getInstrDecodeAttachPt() { return &m_instr_decode; };
|
||||
|
||||
void setUsesMemAccess(bool bUsesMemaccess) { m_uses_memaccess = bUsesMemaccess; };
|
||||
const bool getUsesMemAccess() const { return m_uses_memaccess; };
|
||||
|
||||
void setUsesIDecode(bool bUsesIDecode) { m_uses_idecode = bUsesIDecode; };
|
||||
const bool getUsesIDecode() const { return m_uses_idecode; };
|
||||
|
||||
protected:
|
||||
|
||||
/* implementation packet decoding interface */
|
||||
virtual ocsd_datapath_resp_t processPacket() = 0;
|
||||
virtual ocsd_datapath_resp_t onEOT() = 0;
|
||||
virtual ocsd_datapath_resp_t onReset() = 0;
|
||||
virtual ocsd_datapath_resp_t onFlush() = 0;
|
||||
virtual ocsd_err_t onProtocolConfig() = 0;
|
||||
virtual const uint8_t getCoreSightTraceID() = 0;
|
||||
|
||||
const bool checkInit();
|
||||
|
||||
/* data output */
|
||||
ocsd_datapath_resp_t outputTraceElement(const OcsdTraceElement &elem); // use current index
|
||||
ocsd_datapath_resp_t outputTraceElementIdx(ocsd_trc_index_t idx, const OcsdTraceElement &elem); // use supplied index (where decoder caches elements)
|
||||
|
||||
/* target access */
|
||||
ocsd_err_t accessMemory(const ocsd_vaddr_t address, const ocsd_mem_space_acc_t mem_space, uint32_t *num_bytes, uint8_t *p_buffer);
|
||||
|
||||
/* instruction decode */
|
||||
ocsd_err_t instrDecode(ocsd_instr_info *instr_info);
|
||||
|
||||
componentAttachPt<ITrcGenElemIn> m_trace_elem_out;
|
||||
componentAttachPt<ITargetMemAccess> m_mem_access;
|
||||
componentAttachPt<IInstrDecode> m_instr_decode;
|
||||
|
||||
ocsd_trc_index_t m_index_curr_pkt;
|
||||
|
||||
bool m_decode_init_ok; //!< set true if all attachments in place for decode. (remove checks in main throughput paths)
|
||||
bool m_config_init_ok; //!< set true if config set.
|
||||
|
||||
std::string init_err_msg; //!< error message for init error
|
||||
|
||||
bool m_uses_memaccess;
|
||||
bool m_uses_idecode;
|
||||
|
||||
};
|
||||
|
||||
inline TrcPktDecodeI::TrcPktDecodeI(const char *component_name) :
|
||||
TraceComponent(component_name),
|
||||
m_index_curr_pkt(0),
|
||||
m_decode_init_ok(false),
|
||||
m_config_init_ok(false),
|
||||
m_uses_memaccess(true),
|
||||
m_uses_idecode(true)
|
||||
{
|
||||
}
|
||||
|
||||
inline TrcPktDecodeI::TrcPktDecodeI(const char *component_name, int instIDNum) :
|
||||
TraceComponent(component_name, instIDNum),
|
||||
m_index_curr_pkt(0),
|
||||
m_decode_init_ok(false),
|
||||
m_config_init_ok(false),
|
||||
m_uses_memaccess(true),
|
||||
m_uses_idecode(true)
|
||||
{
|
||||
}
|
||||
|
||||
inline const bool TrcPktDecodeI::checkInit()
|
||||
{
|
||||
if(!m_decode_init_ok)
|
||||
{
|
||||
if(!m_config_init_ok)
|
||||
init_err_msg = "No decoder configuration information";
|
||||
else if(!m_trace_elem_out.hasAttachedAndEnabled())
|
||||
init_err_msg = "No element output interface attached and enabled";
|
||||
else if(m_uses_memaccess && !m_mem_access.hasAttachedAndEnabled())
|
||||
init_err_msg = "No memory access interface attached and enabled";
|
||||
else if(m_uses_idecode && !m_instr_decode.hasAttachedAndEnabled())
|
||||
init_err_msg = "No instruction decoder interface attached and enabled";
|
||||
else
|
||||
m_decode_init_ok = true;
|
||||
}
|
||||
return m_decode_init_ok;
|
||||
}
|
||||
|
||||
inline ocsd_datapath_resp_t TrcPktDecodeI::outputTraceElement(const OcsdTraceElement &elem)
|
||||
{
|
||||
return m_trace_elem_out.first()->TraceElemIn(m_index_curr_pkt,getCoreSightTraceID(), elem);
|
||||
}
|
||||
|
||||
inline ocsd_datapath_resp_t TrcPktDecodeI::outputTraceElementIdx(ocsd_trc_index_t idx, const OcsdTraceElement &elem)
|
||||
{
|
||||
return m_trace_elem_out.first()->TraceElemIn(idx, getCoreSightTraceID(), elem);
|
||||
}
|
||||
|
||||
inline ocsd_err_t TrcPktDecodeI::instrDecode(ocsd_instr_info *instr_info)
|
||||
{
|
||||
if(m_uses_idecode)
|
||||
return m_instr_decode.first()->DecodeInstruction(instr_info);
|
||||
return OCSD_ERR_DCD_INTERFACE_UNUSED;
|
||||
}
|
||||
|
||||
inline ocsd_err_t TrcPktDecodeI::accessMemory(const ocsd_vaddr_t address, const ocsd_mem_space_acc_t mem_space, uint32_t *num_bytes, uint8_t *p_buffer)
|
||||
{
|
||||
if(m_uses_memaccess)
|
||||
return m_mem_access.first()->ReadTargetMemory(address,getCoreSightTraceID(),mem_space, num_bytes,p_buffer);
|
||||
return OCSD_ERR_DCD_INTERFACE_UNUSED;
|
||||
}
|
||||
|
||||
/**********************************************************************/
|
||||
template <class P, class Pc>
|
||||
class TrcPktDecodeBase : public TrcPktDecodeI, public IPktDataIn<P>
|
||||
{
|
||||
public:
|
||||
TrcPktDecodeBase(const char *component_name);
|
||||
TrcPktDecodeBase(const char *component_name, int instIDNum);
|
||||
virtual ~TrcPktDecodeBase();
|
||||
|
||||
virtual ocsd_datapath_resp_t PacketDataIn( const ocsd_datapath_op_t op,
|
||||
const ocsd_trc_index_t index_sop,
|
||||
const P *p_packet_in);
|
||||
|
||||
|
||||
/* protocol configuration */
|
||||
ocsd_err_t setProtocolConfig(const Pc *config);
|
||||
const Pc * getProtocolConfig() const { return m_config; };
|
||||
|
||||
protected:
|
||||
void ClearConfigObj();
|
||||
|
||||
/* the protocol configuration */
|
||||
Pc * m_config;
|
||||
/* the current input packet */
|
||||
const P * m_curr_packet_in;
|
||||
|
||||
};
|
||||
|
||||
|
||||
template <class P, class Pc> TrcPktDecodeBase<P, Pc>::TrcPktDecodeBase(const char *component_name) :
|
||||
TrcPktDecodeI(component_name),
|
||||
m_config(0)
|
||||
{
|
||||
}
|
||||
|
||||
template <class P, class Pc> TrcPktDecodeBase<P, Pc>::TrcPktDecodeBase(const char *component_name, int instIDNum) :
|
||||
TrcPktDecodeI(component_name,instIDNum),
|
||||
m_config(0)
|
||||
{
|
||||
}
|
||||
|
||||
template <class P, class Pc> TrcPktDecodeBase<P, Pc>::~TrcPktDecodeBase()
|
||||
{
|
||||
ClearConfigObj();
|
||||
}
|
||||
|
||||
template <class P, class Pc> ocsd_datapath_resp_t TrcPktDecodeBase<P, Pc>::PacketDataIn( const ocsd_datapath_op_t op,
|
||||
const ocsd_trc_index_t index_sop,
|
||||
const P *p_packet_in)
|
||||
{
|
||||
ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
|
||||
if(!checkInit())
|
||||
{
|
||||
LogError(ocsdError(OCSD_ERR_SEV_ERROR,OCSD_ERR_NOT_INIT,init_err_msg));
|
||||
return OCSD_RESP_FATAL_NOT_INIT;
|
||||
}
|
||||
|
||||
switch(op)
|
||||
{
|
||||
case OCSD_OP_DATA:
|
||||
if(p_packet_in == 0)
|
||||
{
|
||||
LogError(ocsdError(OCSD_ERR_SEV_ERROR,OCSD_ERR_INVALID_PARAM_VAL));
|
||||
resp = OCSD_RESP_FATAL_INVALID_PARAM;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_curr_packet_in = p_packet_in;
|
||||
m_index_curr_pkt = index_sop;
|
||||
resp = processPacket();
|
||||
}
|
||||
break;
|
||||
|
||||
case OCSD_OP_EOT:
|
||||
resp = onEOT();
|
||||
break;
|
||||
|
||||
case OCSD_OP_FLUSH:
|
||||
resp = onFlush();
|
||||
break;
|
||||
|
||||
case OCSD_OP_RESET:
|
||||
resp = onReset();
|
||||
break;
|
||||
|
||||
default:
|
||||
LogError(ocsdError(OCSD_ERR_SEV_ERROR,OCSD_ERR_INVALID_PARAM_VAL));
|
||||
resp = OCSD_RESP_FATAL_INVALID_OP;
|
||||
break;
|
||||
}
|
||||
return resp;
|
||||
}
|
||||
|
||||
/* protocol configuration */
|
||||
template <class P, class Pc> ocsd_err_t TrcPktDecodeBase<P, Pc>::setProtocolConfig(const Pc *config)
|
||||
{
|
||||
ocsd_err_t err = OCSD_ERR_INVALID_PARAM_VAL;
|
||||
if(config != 0)
|
||||
{
|
||||
ClearConfigObj(); // remove any current config
|
||||
m_config = new (std::nothrow) Pc(*config); // make a copy of the config - don't rely on the object passed in being valid outside the context of the call.
|
||||
if(m_config != 0)
|
||||
{
|
||||
err = onProtocolConfig();
|
||||
if(err == OCSD_OK)
|
||||
m_config_init_ok = true;
|
||||
}
|
||||
else
|
||||
err = OCSD_ERR_MEM;
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
template <class P, class Pc> void TrcPktDecodeBase<P, Pc>::ClearConfigObj()
|
||||
{
|
||||
if(m_config)
|
||||
{
|
||||
delete m_config;
|
||||
m_config = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/** @}*/
|
||||
#endif // ARM_TRC_PKT_DECODE_BASE_H_INCLUDED
|
||||
|
||||
/* End of File trc_pkt_decode_base.h */
|
49
decoder/include/common/trc_pkt_elem_base.h
Normal file
49
decoder/include/common/trc_pkt_elem_base.h
Normal file
@ -0,0 +1,49 @@
|
||||
/*
|
||||
* \file trc_pkt_elem_base.h
|
||||
* \brief Reference CoreSight Trace Decoder :
|
||||
*
|
||||
* \copyright Copyright (c) 2016, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
#ifndef ARM_TRC_PKT_ELEM_BASE_H_INCLUDED
|
||||
#define ARM_TRC_PKT_ELEM_BASE_H_INCLUDED
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
class TrcPacketBase
|
||||
{
|
||||
public:
|
||||
TrcPacketBase() {};
|
||||
virtual ~TrcPacketBase() {}
|
||||
|
||||
//! return the underlying C API packet structure
|
||||
virtual const void *c_pkt() const = 0;
|
||||
};
|
||||
|
||||
#endif // ARM_TRC_PKT_ELEM_BASE_H_INCLUDED
|
||||
|
||||
/* End of File trc_pkt_elem_base.h */
|
412
decoder/include/common/trc_pkt_proc_base.h
Normal file
412
decoder/include/common/trc_pkt_proc_base.h
Normal file
@ -0,0 +1,412 @@
|
||||
/*!
|
||||
* \file trc_pkt_proc_base.h
|
||||
* \brief OpenCSD : Trace packet processor base class.
|
||||
*
|
||||
* \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef ARM_TRC_PKT_PROC_BASE_H_INCLUDED
|
||||
#define ARM_TRC_PKT_PROC_BASE_H_INCLUDED
|
||||
|
||||
#include "interfaces/trc_data_raw_in_i.h"
|
||||
#include "interfaces/trc_pkt_in_i.h"
|
||||
#include "interfaces/trc_pkt_raw_in_i.h"
|
||||
#include "interfaces/trc_indexer_pkt_i.h"
|
||||
|
||||
#include "trc_component.h"
|
||||
#include "comp_attach_pt_t.h"
|
||||
|
||||
/** @defgroup ocsd_pkt_proc OpenCSD Library : Packet Processors.
|
||||
@brief Classes providing Protocol Packet Processing capability.
|
||||
|
||||
Packet processors take an incoming byte stream and convert into discrete packets for the
|
||||
required trace protocol.
|
||||
@{*/
|
||||
|
||||
|
||||
|
||||
/*!
|
||||
* @class TrcPktProcI
|
||||
* @brief Base Packet processing interface
|
||||
*
|
||||
* Defines the packet processing methods that protocol specific processors must
|
||||
* implement.
|
||||
*
|
||||
*/
|
||||
class TrcPktProcI : public TraceComponent, public ITrcDataIn
|
||||
{
|
||||
public:
|
||||
TrcPktProcI(const char *component_name);
|
||||
TrcPktProcI(const char *component_name, int instIDNum);
|
||||
virtual ~TrcPktProcI() {};
|
||||
|
||||
/** Trace byte data input interface - from ITrcDataIn.
|
||||
*/
|
||||
virtual ocsd_datapath_resp_t TraceDataIn( const ocsd_datapath_op_t op,
|
||||
const ocsd_trc_index_t index,
|
||||
const uint32_t dataBlockSize,
|
||||
const uint8_t *pDataBlock,
|
||||
uint32_t *numBytesProcessed) = 0;
|
||||
|
||||
protected:
|
||||
|
||||
/* implementation packet processing interface */
|
||||
|
||||
/*! @brief Implementation function for the OCSD_OP_DATA operation */
|
||||
virtual ocsd_datapath_resp_t processData( const ocsd_trc_index_t index,
|
||||
const uint32_t dataBlockSize,
|
||||
const uint8_t *pDataBlock,
|
||||
uint32_t *numBytesProcessed) = 0;
|
||||
|
||||
virtual ocsd_datapath_resp_t onEOT() = 0; //!< Implementation function for the OCSD_OP_EOT operation
|
||||
virtual ocsd_datapath_resp_t onReset() = 0; //!< Implementation function for the OCSD_OP_RESET operation
|
||||
virtual ocsd_datapath_resp_t onFlush() = 0; //!< Implementation function for the OCSD_OP_FLUSH operation
|
||||
virtual ocsd_err_t onProtocolConfig() = 0; //!< Called when the configuration object is passed to the decoder.
|
||||
virtual const bool isBadPacket() const = 0; //!< check if the current packet is an error / bad packet
|
||||
};
|
||||
|
||||
inline TrcPktProcI::TrcPktProcI(const char *component_name) :
|
||||
TraceComponent(component_name)
|
||||
{
|
||||
}
|
||||
|
||||
inline TrcPktProcI::TrcPktProcI(const char *component_name, int instIDNum) :
|
||||
TraceComponent(component_name,instIDNum)
|
||||
{
|
||||
}
|
||||
|
||||
/*!
|
||||
* @class TrcPktProcBase
|
||||
* @brief Packet Processor base class. Provides common infrastructure and interconnections for packet processors.
|
||||
*
|
||||
* The class is a templated base class.
|
||||
* - P - this is the packet object class.
|
||||
* - Pt - this is the packet type class.
|
||||
* - Pc - this is the packet configuration class.
|
||||
*
|
||||
* implementations will provide concrete classes for each of these to operate under the common infrastructures.
|
||||
* The base provides the trace data in (ITrcDataIn) interface and operates on the incoming operation type.
|
||||
*
|
||||
* Implementions override the 'onFn()' and data process functions defined in TrcPktProcI,
|
||||
* with the base class ensuring consistent ordering of operations.
|
||||
*
|
||||
*/
|
||||
template <class P, class Pt, class Pc>
|
||||
class TrcPktProcBase : public TrcPktProcI
|
||||
{
|
||||
public:
|
||||
TrcPktProcBase(const char *component_name);
|
||||
TrcPktProcBase(const char *component_name, int instIDNum);
|
||||
virtual ~TrcPktProcBase();
|
||||
|
||||
/** Byte trace data input interface defined in ITrcDataIn
|
||||
|
||||
The base class implementation processes the operation to call the
|
||||
interface functions on TrcPktProcI.
|
||||
*/
|
||||
virtual ocsd_datapath_resp_t TraceDataIn( const ocsd_datapath_op_t op,
|
||||
const ocsd_trc_index_t index,
|
||||
const uint32_t dataBlockSize,
|
||||
const uint8_t *pDataBlock,
|
||||
uint32_t *numBytesProcessed);
|
||||
|
||||
|
||||
/* component attachment points */
|
||||
|
||||
//! Attachement point for the protocol packet output
|
||||
componentAttachPt<IPktDataIn<P>> *getPacketOutAttachPt() { return &m_pkt_out_i; };
|
||||
//! Attachment point for the protocol packet monitor
|
||||
componentAttachPt<IPktRawDataMon<P>> *getRawPacketMonAttachPt() { return &m_pkt_raw_mon_i; };
|
||||
|
||||
//! Attachment point for a packet indexer
|
||||
componentAttachPt<ITrcPktIndexer<Pt>> *getTraceIDIndexerAttachPt() { return &m_pkt_indexer_i; };
|
||||
|
||||
/* protocol configuration */
|
||||
//!< Set the protocol specific configuration for the decoder.
|
||||
virtual ocsd_err_t setProtocolConfig(const Pc *config);
|
||||
//!< Get the configuration for the decoder.
|
||||
virtual const Pc *getProtocolConfig() const { return m_config; };
|
||||
|
||||
protected:
|
||||
|
||||
/* data output functions */
|
||||
ocsd_datapath_resp_t outputDecodedPacket(const ocsd_trc_index_t index_sop, const P *pkt);
|
||||
|
||||
void outputRawPacketToMonitor( const ocsd_trc_index_t index_sop,
|
||||
const P *pkt,
|
||||
const uint32_t size,
|
||||
const uint8_t *p_data);
|
||||
|
||||
void indexPacket(const ocsd_trc_index_t index_sop, const Pt *packet_type);
|
||||
|
||||
ocsd_datapath_resp_t outputOnAllInterfaces(const ocsd_trc_index_t index_sop, const P *pkt, const Pt *pkt_type, std::vector<uint8_t> &pktdata);
|
||||
|
||||
ocsd_datapath_resp_t outputOnAllInterfaces(const ocsd_trc_index_t index_sop, const P *pkt, const Pt *pkt_type, const uint8_t *pktdata, uint32_t pktlen);
|
||||
|
||||
/*! Let the derived class figure out if it needs to collate and send raw data.
|
||||
can improve wait for sync performance if we do not need to save and send unsynced data.
|
||||
*/
|
||||
const bool hasRawMon() const;
|
||||
|
||||
/* the protocol configuration */
|
||||
const Pc *m_config;
|
||||
|
||||
void ClearConfigObj(); // remove our copy of the config
|
||||
|
||||
const bool checkInit(); // return true if init (configured and at least one output sink attached), false otherwise.
|
||||
|
||||
private:
|
||||
/* decode control */
|
||||
ocsd_datapath_resp_t Reset(const ocsd_trc_index_t index);
|
||||
ocsd_datapath_resp_t Flush();
|
||||
ocsd_datapath_resp_t EOT();
|
||||
|
||||
componentAttachPt<IPktDataIn<P>> m_pkt_out_i;
|
||||
componentAttachPt<IPktRawDataMon<P>> m_pkt_raw_mon_i;
|
||||
|
||||
componentAttachPt<ITrcPktIndexer<Pt>> m_pkt_indexer_i;
|
||||
|
||||
bool m_b_is_init;
|
||||
};
|
||||
|
||||
template<class P,class Pt, class Pc> TrcPktProcBase<P, Pt, Pc>::TrcPktProcBase(const char *component_name) :
|
||||
TrcPktProcI(component_name),
|
||||
m_config(0),
|
||||
m_b_is_init(false)
|
||||
{
|
||||
}
|
||||
|
||||
template<class P,class Pt, class Pc> TrcPktProcBase<P, Pt, Pc>::TrcPktProcBase(const char *component_name, int instIDNum) :
|
||||
TrcPktProcI(component_name, instIDNum),
|
||||
m_config(0),
|
||||
m_b_is_init(false)
|
||||
{
|
||||
}
|
||||
|
||||
template<class P,class Pt, class Pc> TrcPktProcBase<P, Pt, Pc>::~TrcPktProcBase()
|
||||
{
|
||||
ClearConfigObj();
|
||||
}
|
||||
|
||||
template<class P,class Pt, class Pc> ocsd_datapath_resp_t TrcPktProcBase<P, Pt, Pc>::TraceDataIn( const ocsd_datapath_op_t op,
|
||||
const ocsd_trc_index_t index,
|
||||
const uint32_t dataBlockSize,
|
||||
const uint8_t *pDataBlock,
|
||||
uint32_t *numBytesProcessed)
|
||||
{
|
||||
ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
|
||||
|
||||
switch(op)
|
||||
{
|
||||
case OCSD_OP_DATA:
|
||||
if((dataBlockSize == 0) || (pDataBlock == 0) || (numBytesProcessed == 0))
|
||||
{
|
||||
if(numBytesProcessed)
|
||||
*numBytesProcessed = 0; // ensure processed bytes value set to 0.
|
||||
LogError(ocsdError(OCSD_ERR_SEV_ERROR,OCSD_ERR_INVALID_PARAM_VAL,"Packet Processor: Zero length data block or NULL pointer error\n"));
|
||||
resp = OCSD_RESP_FATAL_INVALID_PARAM;
|
||||
}
|
||||
else
|
||||
resp = processData(index,dataBlockSize,pDataBlock,numBytesProcessed);
|
||||
break;
|
||||
|
||||
case OCSD_OP_EOT:
|
||||
resp = EOT();
|
||||
break;
|
||||
|
||||
case OCSD_OP_FLUSH:
|
||||
resp = Flush();
|
||||
break;
|
||||
|
||||
case OCSD_OP_RESET:
|
||||
resp = Reset(index);
|
||||
break;
|
||||
|
||||
default:
|
||||
LogError(ocsdError(OCSD_ERR_SEV_ERROR,OCSD_ERR_INVALID_PARAM_VAL,"Packet Processor : Unknown Datapath operation\n"));
|
||||
resp = OCSD_RESP_FATAL_INVALID_OP;
|
||||
break;
|
||||
}
|
||||
return resp;
|
||||
}
|
||||
|
||||
|
||||
template<class P,class Pt, class Pc> ocsd_datapath_resp_t TrcPktProcBase<P, Pt, Pc>::Reset(const ocsd_trc_index_t index)
|
||||
{
|
||||
ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
|
||||
|
||||
// reset the trace decoder attachment on main data path.
|
||||
if(m_pkt_out_i.hasAttachedAndEnabled())
|
||||
resp = m_pkt_out_i.first()->PacketDataIn(OCSD_OP_RESET,index,0);
|
||||
|
||||
// reset the packet processor implmentation
|
||||
if(!OCSD_DATA_RESP_IS_FATAL(resp))
|
||||
resp = onReset();
|
||||
|
||||
// packet monitor
|
||||
if(m_pkt_raw_mon_i.hasAttachedAndEnabled())
|
||||
m_pkt_raw_mon_i.first()->RawPacketDataMon(OCSD_OP_RESET,index,0,0,0);
|
||||
|
||||
return resp;
|
||||
}
|
||||
|
||||
template<class P,class Pt, class Pc> ocsd_datapath_resp_t TrcPktProcBase<P, Pt, Pc>::Flush()
|
||||
{
|
||||
ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
|
||||
ocsd_datapath_resp_t resplocal = OCSD_RESP_CONT;
|
||||
|
||||
// the trace decoder attachment on main data path.
|
||||
if(m_pkt_out_i.hasAttachedAndEnabled())
|
||||
resp = m_pkt_out_i.first()->PacketDataIn(OCSD_OP_FLUSH,0,0); // flush up the data path first.
|
||||
|
||||
// if the connected components are flushed, not flush this one.
|
||||
if(OCSD_DATA_RESP_IS_CONT(resp))
|
||||
resplocal = onFlush(); // local flush
|
||||
|
||||
return (resplocal > resp) ? resplocal : resp;
|
||||
}
|
||||
|
||||
template<class P,class Pt, class Pc> ocsd_datapath_resp_t TrcPktProcBase<P, Pt, Pc>::EOT()
|
||||
{
|
||||
ocsd_datapath_resp_t resp = onEOT(); // local EOT - mark any part packet as incomplete type and prepare to send
|
||||
|
||||
// the trace decoder attachment on main data path.
|
||||
if(m_pkt_out_i.hasAttachedAndEnabled() && !OCSD_DATA_RESP_IS_FATAL(resp))
|
||||
resp = m_pkt_out_i.first()->PacketDataIn(OCSD_OP_EOT,0,0);
|
||||
|
||||
// packet monitor
|
||||
if(m_pkt_raw_mon_i.hasAttachedAndEnabled())
|
||||
m_pkt_raw_mon_i.first()->RawPacketDataMon(OCSD_OP_EOT,0,0,0,0);
|
||||
|
||||
return resp;
|
||||
}
|
||||
|
||||
template<class P,class Pt, class Pc> ocsd_datapath_resp_t TrcPktProcBase<P, Pt, Pc>::outputDecodedPacket(const ocsd_trc_index_t index, const P *pkt)
|
||||
{
|
||||
ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
|
||||
|
||||
// bad packet filter.
|
||||
if((getComponentOpMode() & OCSD_OPFLG_PKTPROC_NOFWD_BAD_PKTS) && isBadPacket())
|
||||
return resp;
|
||||
|
||||
// send a complete packet over the primary data path
|
||||
if(m_pkt_out_i.hasAttachedAndEnabled())
|
||||
resp = m_pkt_out_i.first()->PacketDataIn(OCSD_OP_DATA,index,pkt);
|
||||
return resp;
|
||||
}
|
||||
|
||||
template<class P,class Pt, class Pc> void TrcPktProcBase<P, Pt, Pc>::outputRawPacketToMonitor(
|
||||
const ocsd_trc_index_t index_sop,
|
||||
const P *pkt,
|
||||
const uint32_t size,
|
||||
const uint8_t *p_data)
|
||||
{
|
||||
// never output 0 sized packets.
|
||||
if(size == 0)
|
||||
return;
|
||||
|
||||
// bad packet filter.
|
||||
if((getComponentOpMode() & OCSD_OPFLG_PKTPROC_NOMON_BAD_PKTS) && isBadPacket())
|
||||
return;
|
||||
|
||||
// packet monitor - this cannot return CONT / WAIT, but does get the raw packet data.
|
||||
if(m_pkt_raw_mon_i.hasAttachedAndEnabled())
|
||||
m_pkt_raw_mon_i.first()->RawPacketDataMon(OCSD_OP_DATA,index_sop,pkt,size,p_data);
|
||||
}
|
||||
|
||||
template<class P,class Pt, class Pc> const bool TrcPktProcBase<P, Pt, Pc>::hasRawMon() const
|
||||
{
|
||||
return m_pkt_raw_mon_i.hasAttachedAndEnabled();
|
||||
}
|
||||
|
||||
template<class P,class Pt, class Pc> void TrcPktProcBase<P, Pt, Pc>::indexPacket(const ocsd_trc_index_t index_sop, const Pt *packet_type)
|
||||
{
|
||||
// packet indexer - cannot return CONT / WAIT, just gets the current index and type.
|
||||
if(m_pkt_indexer_i.hasAttachedAndEnabled())
|
||||
m_pkt_indexer_i.first()->TracePktIndex(index_sop,packet_type);
|
||||
}
|
||||
|
||||
template<class P,class Pt, class Pc> ocsd_datapath_resp_t TrcPktProcBase<P, Pt, Pc>::outputOnAllInterfaces(const ocsd_trc_index_t index_sop, const P *pkt, const Pt *pkt_type, std::vector<uint8_t> &pktdata)
|
||||
{
|
||||
indexPacket(index_sop,pkt_type);
|
||||
if(pktdata.size() > 0) // prevent out of range errors for 0 length vector.
|
||||
outputRawPacketToMonitor(index_sop,pkt,(uint32_t)pktdata.size(),&pktdata[0]);
|
||||
return outputDecodedPacket(index_sop,pkt);
|
||||
}
|
||||
|
||||
template<class P,class Pt, class Pc> ocsd_datapath_resp_t TrcPktProcBase<P, Pt, Pc>::outputOnAllInterfaces(const ocsd_trc_index_t index_sop, const P *pkt, const Pt *pkt_type, const uint8_t *pktdata, uint32_t pktlen)
|
||||
{
|
||||
indexPacket(index_sop,pkt_type);
|
||||
outputRawPacketToMonitor(index_sop,pkt,pktlen,pktdata);
|
||||
return outputDecodedPacket(index_sop,pkt);
|
||||
}
|
||||
|
||||
template<class P,class Pt, class Pc> ocsd_err_t TrcPktProcBase<P, Pt, Pc>::setProtocolConfig(const Pc *config)
|
||||
{
|
||||
ocsd_err_t err = OCSD_ERR_INVALID_PARAM_VAL;
|
||||
if(config != 0)
|
||||
{
|
||||
ClearConfigObj();
|
||||
m_config = new (std::nothrow) Pc(*config);
|
||||
if(m_config != 0)
|
||||
err = onProtocolConfig();
|
||||
else
|
||||
err = OCSD_ERR_MEM;
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
template<class P,class Pt, class Pc> void TrcPktProcBase<P, Pt, Pc>::ClearConfigObj()
|
||||
{
|
||||
if(m_config)
|
||||
{
|
||||
delete m_config;
|
||||
m_config = 0;
|
||||
}
|
||||
}
|
||||
|
||||
template<class P,class Pt, class Pc> const bool TrcPktProcBase<P, Pt, Pc>::checkInit()
|
||||
{
|
||||
if(!m_b_is_init)
|
||||
{
|
||||
if( (m_config != 0) &&
|
||||
(m_pkt_out_i.hasAttached() || m_pkt_raw_mon_i.hasAttached())
|
||||
)
|
||||
m_b_is_init = true;
|
||||
}
|
||||
return m_b_is_init;
|
||||
}
|
||||
|
||||
/** @}*/
|
||||
|
||||
#endif // ARM_TRC_PKT_PROC_BASE_H_INCLUDED
|
||||
|
||||
/* End of File trc_pkt_proc_base.h */
|
91
decoder/include/common/trc_printable_elem.h
Normal file
91
decoder/include/common/trc_printable_elem.h
Normal file
@ -0,0 +1,91 @@
|
||||
/*!
|
||||
* \file trc_printable_elem.h
|
||||
* \brief OpenCSD : Standard printable element base class.
|
||||
*
|
||||
* \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef ARM_TRC_PRINTABLE_ELEM_H_INCLUDED
|
||||
#define ARM_TRC_PRINTABLE_ELEM_H_INCLUDED
|
||||
|
||||
#include <string>
|
||||
#include <cstdint>
|
||||
|
||||
/** @addtogroup ocsd_infrastructure
|
||||
@{*/
|
||||
|
||||
/*!
|
||||
* @class trcPrintableElem
|
||||
* @brief Class to provide trace element strings for printing
|
||||
*
|
||||
* Provide a standard interface to the trace packet classes to allow the packets
|
||||
* to be printed in logging or tools.
|
||||
*
|
||||
* Provides some standard formatting functionality
|
||||
*
|
||||
*/
|
||||
class trcPrintableElem
|
||||
{
|
||||
public:
|
||||
trcPrintableElem() {};
|
||||
virtual ~trcPrintableElem() {};
|
||||
virtual void toString(std::string &str) const;
|
||||
virtual void toStringFmt(const uint32_t fmtFlags, std::string &str) const;
|
||||
|
||||
// print formatting utilities
|
||||
static void getValStr(std::string &valStr, const int valTotalBitSize, const int valValidBits, const uint64_t value, const bool asHex = true, const int updateBits = 0);
|
||||
|
||||
};
|
||||
|
||||
inline void trcPrintableElem::toString(std::string &str) const
|
||||
{
|
||||
str = "Trace Element : print not implemented";
|
||||
}
|
||||
|
||||
inline void trcPrintableElem::toStringFmt(const uint32_t /*fmtFlags*/, std::string &str) const
|
||||
{
|
||||
toString(str);
|
||||
}
|
||||
|
||||
/** static template string function - used in "C" API to provide generic printing */
|
||||
template<class Pc, class Pt>
|
||||
void trcPrintElemToString(const void *p_pkt, std::string &str)
|
||||
{
|
||||
Pc pktClass;
|
||||
pktClass = static_cast<const Pt *>(p_pkt);
|
||||
pktClass.toString(str);
|
||||
}
|
||||
|
||||
/** @}*/
|
||||
|
||||
#endif // ARM_TRC_PRINTABLE_ELEM_H_INCLUDED
|
||||
|
||||
/* End of File trc_printable_elem.h */
|
114
decoder/include/common/trc_ret_stack.h
Normal file
114
decoder/include/common/trc_ret_stack.h
Normal file
@ -0,0 +1,114 @@
|
||||
/*
|
||||
* \file trc_ret_stack.h
|
||||
* \brief OpenCSD : trace decoder return stack feature.
|
||||
*
|
||||
* \copyright Copyright (c) 2017, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef ARM_TRC_RET_STACK_H_INCLUDED
|
||||
#define ARM_TRC_RET_STACK_H_INCLUDED
|
||||
|
||||
#include "opencsd/ocsd_if_types.h"
|
||||
|
||||
// uncomment below for return stack logging
|
||||
// #define TRC_RET_STACK_DEBUG
|
||||
|
||||
#ifdef TRC_RET_STACK_DEBUG
|
||||
class TraceComponent;
|
||||
#endif
|
||||
|
||||
typedef struct _retStackElement
|
||||
{
|
||||
ocsd_vaddr_t ret_addr;
|
||||
ocsd_isa ret_isa;
|
||||
} retStackElement;
|
||||
|
||||
class TrcAddrReturnStack
|
||||
{
|
||||
public:
|
||||
TrcAddrReturnStack();
|
||||
~TrcAddrReturnStack() {};
|
||||
|
||||
void set_active(bool active)
|
||||
{
|
||||
m_active = active;
|
||||
};
|
||||
|
||||
bool is_active() const
|
||||
{
|
||||
return m_active;
|
||||
};
|
||||
|
||||
void push(const ocsd_vaddr_t addr, const ocsd_isa isa);
|
||||
ocsd_vaddr_t pop(ocsd_isa &isa);
|
||||
void flush();
|
||||
|
||||
bool overflow() const
|
||||
{
|
||||
return (bool)(num_entries < 0);
|
||||
};
|
||||
|
||||
void set_pop_pending()
|
||||
{
|
||||
if (m_active)
|
||||
m_pop_pending = true;
|
||||
}
|
||||
|
||||
void clear_pop_pending()
|
||||
{
|
||||
m_pop_pending = false;
|
||||
}
|
||||
|
||||
bool pop_pending() const
|
||||
{
|
||||
return m_pop_pending;
|
||||
};
|
||||
|
||||
private:
|
||||
bool m_active;
|
||||
bool m_pop_pending; // flag for decoder to indicate a pop might be needed depending on the next packet (ETMv4)
|
||||
|
||||
int head_idx;
|
||||
int num_entries;
|
||||
retStackElement m_stack[16];
|
||||
|
||||
#ifdef TRC_RET_STACK_DEBUG
|
||||
public:
|
||||
void set_dbg_logger(TraceComponent *pLogger) { m_p_debug_logger = pLogger; };
|
||||
private:
|
||||
void LogOp(const char *pszOpString, ocsd_vaddr_t addr, int head_off, ocsd_isa isa);
|
||||
|
||||
TraceComponent *m_p_debug_logger;
|
||||
#endif // TRC_RET_STACK_DEBUG
|
||||
};
|
||||
|
||||
#endif // ARM_TRC_RET_STACK_H_INCLUDED
|
||||
|
||||
/* End of File trc_ret_stack.h */
|
56
decoder/include/i_dec/trc_i_decode.h
Normal file
56
decoder/include/i_dec/trc_i_decode.h
Normal file
@ -0,0 +1,56 @@
|
||||
/*
|
||||
* \file trc_i_decode.h
|
||||
* \brief OpenCSD :
|
||||
*
|
||||
* \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
#ifndef ARM_TRC_I_DECODE_H_INCLUDED
|
||||
#define ARM_TRC_I_DECODE_H_INCLUDED
|
||||
|
||||
#include "interfaces/trc_instr_decode_i.h"
|
||||
#include "opencsd/ocsd_if_types.h"
|
||||
|
||||
class TrcIDecode : public IInstrDecode
|
||||
{
|
||||
public:
|
||||
TrcIDecode() {};
|
||||
virtual ~TrcIDecode() {};
|
||||
|
||||
virtual ocsd_err_t DecodeInstruction(ocsd_instr_info *instr_info);
|
||||
|
||||
private:
|
||||
ocsd_err_t DecodeA32(ocsd_instr_info *instr_info);
|
||||
ocsd_err_t DecodeA64(ocsd_instr_info *instr_info);
|
||||
ocsd_err_t DecodeT32(ocsd_instr_info *instr_info);
|
||||
};
|
||||
|
||||
#endif // ARM_TRC_I_DECODE_H_INCLUDED
|
||||
|
||||
/* End of File trc_i_decode.h */
|
130
decoder/include/i_dec/trc_idec_arminst.h
Normal file
130
decoder/include/i_dec/trc_idec_arminst.h
Normal file
@ -0,0 +1,130 @@
|
||||
/*
|
||||
* \file trc_idec_arminst.h
|
||||
* \brief OpenCSD :
|
||||
*
|
||||
* \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef ARM_TRC_IDEC_ARMINST_H_INCLUDED
|
||||
#define ARM_TRC_IDEC_ARMINST_H_INCLUDED
|
||||
|
||||
#ifndef __STDC_CONSTANT_MACROS
|
||||
#define __STDC_CONSTANT_MACROS 1
|
||||
#endif
|
||||
|
||||
#include "opencsd/ocsd_if_types.h"
|
||||
#include <cstdint>
|
||||
|
||||
/*
|
||||
For Thumb2, test if a halfword is the first half of a 32-bit instruction,
|
||||
as opposed to a complete 16-bit instruction.
|
||||
*/
|
||||
inline int is_wide_thumb(uint16_t insthw)
|
||||
{
|
||||
return (insthw & 0xF800) >= 0xE800;
|
||||
}
|
||||
|
||||
/*
|
||||
In the following queries, 16-bit Thumb2 instructions should be
|
||||
passed in as the high halfword, e.g. xxxx0000.
|
||||
*/
|
||||
|
||||
/*
|
||||
Test whether an instruction is a branch (software change of the PC).
|
||||
This includes branch instructions and all loads and data-processing
|
||||
instructions that write to the PC. It does not include exception
|
||||
instructions such as SVC, HVC and SMC.
|
||||
(Performance event 0x0C includes these.)
|
||||
*/
|
||||
int inst_ARM_is_branch(uint32_t inst);
|
||||
int inst_Thumb_is_branch(uint32_t inst);
|
||||
int inst_A64_is_branch(uint32_t inst);
|
||||
|
||||
/*
|
||||
Test whether an instruction is a direct (aka immediate) branch.
|
||||
Performance event 0x0D counts these.
|
||||
*/
|
||||
int inst_ARM_is_direct_branch(uint32_t inst);
|
||||
int inst_Thumb_is_direct_branch(uint32_t inst);
|
||||
int inst_A64_is_direct_branch(uint32_t inst);
|
||||
|
||||
/*
|
||||
Get branch destination for a direct branch.
|
||||
*/
|
||||
int inst_ARM_branch_destination(uint32_t addr, uint32_t inst, uint32_t *pnpc);
|
||||
int inst_Thumb_branch_destination(uint32_t addr, uint32_t inst, uint32_t *pnpc);
|
||||
int inst_A64_branch_destination(uint64_t addr, uint32_t inst, uint64_t *pnpc);
|
||||
|
||||
int inst_ARM_is_indirect_branch(uint32_t inst);
|
||||
int inst_Thumb_is_indirect_branch(uint32_t inst);
|
||||
int inst_A64_is_indirect_branch(uint32_t inst);
|
||||
|
||||
int inst_ARM_is_branch_and_link(uint32_t inst);
|
||||
int inst_Thumb_is_branch_and_link(uint32_t inst);
|
||||
int inst_A64_is_branch_and_link(uint32_t inst);
|
||||
|
||||
int inst_ARM_is_conditional(uint32_t inst);
|
||||
int inst_Thumb_is_conditional(uint32_t inst);
|
||||
int inst_A64_is_conditional(uint32_t inst);
|
||||
|
||||
/* For an IT instruction, return the number of instructions conditionalized
|
||||
(from 1 to 4). For other instructions, return zero. */
|
||||
unsigned int inst_Thumb_is_IT(uint32_t inst);
|
||||
|
||||
typedef enum {
|
||||
ARM_BARRIER_NONE,
|
||||
ARM_BARRIER_ISB,
|
||||
ARM_BARRIER_DMB,
|
||||
ARM_BARRIER_DSB
|
||||
} arm_barrier_t;
|
||||
|
||||
arm_barrier_t inst_ARM_barrier(uint32_t inst);
|
||||
arm_barrier_t inst_Thumb_barrier(uint32_t inst);
|
||||
arm_barrier_t inst_A64_barrier(uint32_t inst);
|
||||
|
||||
/*
|
||||
Test whether an instruction is definitely undefined, e.g. because
|
||||
allocated to a "permanently UNDEFINED" space (UDF mnemonic).
|
||||
Other instructions besides the ones indicated, may always or
|
||||
sometimes cause an undefined instruction trap. This call is
|
||||
intended to be helpful in 'runaway decode' prevention.
|
||||
*/
|
||||
int inst_ARM_is_UDF(uint32_t inst);
|
||||
int inst_Thumb_is_UDF(uint32_t inst);
|
||||
int inst_A64_is_UDF(uint32_t inst);
|
||||
|
||||
|
||||
/* access sub-type information */
|
||||
ocsd_instr_subtype get_instr_subtype();
|
||||
void clear_instr_subtype();
|
||||
|
||||
#endif // ARM_TRC_IDEC_ARMINST_H_INCLUDED
|
||||
|
||||
/* End of File trc_idec_arminst.h */
|
58
decoder/include/interfaces/trc_abs_typed_base_i.h
Normal file
58
decoder/include/interfaces/trc_abs_typed_base_i.h
Normal file
@ -0,0 +1,58 @@
|
||||
/*
|
||||
* \file trc_abs_typed_base_i.h
|
||||
* \brief OpenCSD :
|
||||
*
|
||||
* \copyright Copyright (c) 2016, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef ARM_TRC_ABS_TYPED_BASE_I_H_INCLUDED
|
||||
#define ARM_TRC_ABS_TYPED_BASE_I_H_INCLUDED
|
||||
|
||||
/*!
|
||||
* @class ITrcTypedBase
|
||||
* @brief Abstract base class to for interfaces templated types.
|
||||
*
|
||||
* This class is used as an abstract base for any interfaces that are specialised using
|
||||
* template<> types.
|
||||
*
|
||||
* Designed to allow interface objects to be passed through generic interfaces into type
|
||||
* specific templated implmentation handlers and converted/checked using RTTI.
|
||||
*/
|
||||
class ITrcTypedBase
|
||||
{
|
||||
public:
|
||||
ITrcTypedBase() {};
|
||||
virtual ~ITrcTypedBase() {};
|
||||
};
|
||||
|
||||
#endif // ARM_TRC_ABS_TYPED_BASE_I_H_INCLUDED
|
||||
|
||||
/* End of File trc_abs_typed_base_i.h */
|
84
decoder/include/interfaces/trc_data_raw_in_i.h
Normal file
84
decoder/include/interfaces/trc_data_raw_in_i.h
Normal file
@ -0,0 +1,84 @@
|
||||
/*
|
||||
* \file trc_data_raw_in_i.h
|
||||
* \brief OpenCSD :
|
||||
*
|
||||
* \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef ARM_TRCDATA_RAW_IN_I_H_INCLUDED
|
||||
#define ARM_TRCDATA_RAW_IN_I_H_INCLUDED
|
||||
|
||||
#include "opencsd/ocsd_if_types.h"
|
||||
|
||||
/** @class ITrcDataIn
|
||||
*
|
||||
* @brief Interface to either trace data frame deformatter or packet processor.
|
||||
*
|
||||
* @ingroup ocsd_interfaces
|
||||
*
|
||||
* Interface class to a processor that can consume raw formatted trace byte stream from a trace reader
|
||||
* or raw source buffer into a deformatter object.
|
||||
*
|
||||
* Also used to interface a single trace source ID data stream into a packet processor.
|
||||
*
|
||||
*/
|
||||
class ITrcDataIn {
|
||||
public:
|
||||
ITrcDataIn() {}; /**< Default constructor. */
|
||||
virtual ~ITrcDataIn() {}; /**< Default destructor. */
|
||||
|
||||
/*!
|
||||
* Data input method for a component on the Trace decode datapath.
|
||||
* Datapath operations passed to the component, which responds with data path response codes.
|
||||
*
|
||||
* This API is for raw trace data, which can be:-
|
||||
* - CoreSight formatted frame data for input to the frame deformatter.
|
||||
* - Single binary source data for input to a packet decoder.
|
||||
*
|
||||
* @param op : Data path operation.
|
||||
* @param index : Byte index of start of pDataBlock data as offset from start of captured data. May be zero for none-data operation
|
||||
* @param dataBlockSize : Size of data block. Zero for none-data operation.
|
||||
* @param *pDataBlock : pointer to data block. Null for none-data operation
|
||||
* @param *numBytesProcessed : Pointer to count of data used by processor. Set by processor on data operation. Null for none-data operation
|
||||
*
|
||||
* @return ocsd_datapath_resp_t : Standard data path response code.
|
||||
*/
|
||||
virtual ocsd_datapath_resp_t TraceDataIn( const ocsd_datapath_op_t op,
|
||||
const ocsd_trc_index_t index,
|
||||
const uint32_t dataBlockSize,
|
||||
const uint8_t *pDataBlock,
|
||||
uint32_t *numBytesProcessed) = 0;
|
||||
|
||||
};
|
||||
|
||||
#endif // ARM_TRCDATA_RAW_IN_I_H_INCLUDED
|
||||
|
||||
|
||||
/* End of File trc_data_raw_in_i.h */
|
81
decoder/include/interfaces/trc_data_rawframe_in_i.h
Normal file
81
decoder/include/interfaces/trc_data_rawframe_in_i.h
Normal file
@ -0,0 +1,81 @@
|
||||
/*
|
||||
* \file trc_data_rawframe_in_i.h
|
||||
* \brief OpenCSD :
|
||||
*
|
||||
* \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef ARM_TRCDATA_RAWFRAME_IN_I_H_INCLUDED
|
||||
#define ARM_TRCDATA_RAWFRAME_IN_I_H_INCLUDED
|
||||
|
||||
#include "opencsd/ocsd_if_types.h"
|
||||
|
||||
/*!
|
||||
* @class ITrcRawFrameIn
|
||||
*
|
||||
* @brief Interface to monitor the raw frame decode progress..
|
||||
*
|
||||
* @ingroup ocsd_interfaces
|
||||
*
|
||||
* This interface allows a program to monitor the contents of the CoreSight frames passing through the
|
||||
* frame deformatter.
|
||||
*
|
||||
*
|
||||
*/
|
||||
class ITrcRawFrameIn {
|
||||
public:
|
||||
ITrcRawFrameIn() {}; /**< Default constructor. */
|
||||
virtual ~ITrcRawFrameIn() {}; /**< Default destructor. */
|
||||
|
||||
/*!
|
||||
* Interface to monitor CoreSight frame data. Output as blocks of data.
|
||||
*
|
||||
* @param op : Data path operation.
|
||||
* @param index : Byte index of start of pDataBlock data as offset from start of captured data. May be zero for none-data operation
|
||||
* @param frame_element : Type of frame element being output.
|
||||
* @param dataBlockSize : size of frame element.
|
||||
* @param *pDataBlock : pointer to frame data.
|
||||
* @param traceID : Trace ID when element type ID data.
|
||||
*
|
||||
* @return ocsd_err_t : Standard library erroc code. Monitor only, not on data path.
|
||||
*/
|
||||
virtual ocsd_err_t TraceRawFrameIn( const ocsd_datapath_op_t op,
|
||||
const ocsd_trc_index_t index,
|
||||
const ocsd_rawframe_elem_t frame_element,
|
||||
const int dataBlockSize,
|
||||
const uint8_t *pDataBlock,
|
||||
const uint8_t traceID) = 0;
|
||||
};
|
||||
|
||||
|
||||
#endif // ARM_TRCDATA_RAWFRAME_IN_I_H_INCLUDED
|
||||
|
||||
/* End of File trc_data_rawframe_in_i.h */
|
134
decoder/include/interfaces/trc_error_log_i.h
Normal file
134
decoder/include/interfaces/trc_error_log_i.h
Normal file
@ -0,0 +1,134 @@
|
||||
/*!
|
||||
* \file trc_error_log_i.h
|
||||
* \brief OpenCSD :
|
||||
*
|
||||
* \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef ARM_TRC_ERROR_LOG_I_H_INCLUDED
|
||||
#define ARM_TRC_ERROR_LOG_I_H_INCLUDED
|
||||
|
||||
#include "opencsd/ocsd_if_types.h"
|
||||
#include <string>
|
||||
|
||||
class ocsdError;
|
||||
class ocsdMsgLogger;
|
||||
|
||||
/*!
|
||||
* @class ITraceErrorLog
|
||||
* @brief Error logging interface.
|
||||
* @ingroup ocsd_interfaces
|
||||
*
|
||||
* This class provides a standard interface to the decoder error logger for all trace decode and
|
||||
* reader components.
|
||||
*
|
||||
* Implementation will determine if and how the errors and messages are logged.
|
||||
*
|
||||
*/
|
||||
class ITraceErrorLog
|
||||
{
|
||||
public:
|
||||
ITraceErrorLog() {}; /**< default constructor */
|
||||
virtual ~ITraceErrorLog() {}; /**< default destructor */
|
||||
|
||||
/*!
|
||||
* Register a named component error source. Allows the logger to associate errors with components.
|
||||
* returned handle to be used with subsequent error log calls.
|
||||
*
|
||||
* @param &component_name : name of the component.
|
||||
*
|
||||
* @return virtual const : Handle associated with the component.
|
||||
*/
|
||||
virtual const ocsd_hndl_err_log_t RegisterErrorSource(const std::string &component_name) = 0;
|
||||
|
||||
/*!
|
||||
* Return the verbosity level of the logger. Errors of the returned ocsd_err_severity_t severity
|
||||
* or lower will be logged, others are ignored.
|
||||
*
|
||||
* @return ocsd_err_severity_t : Current logging severity level.
|
||||
*/
|
||||
virtual const ocsd_err_severity_t GetErrorLogVerbosity() const = 0;
|
||||
|
||||
/*!
|
||||
* Log an error.
|
||||
* Pass an error object and the component or generic handle to associate with the error.
|
||||
* Error will be saved for access by GetLastError().
|
||||
*
|
||||
* If logger implementation has output print logging enabled then this may be printed to file or screen.
|
||||
*
|
||||
* @param handle : Component handle or standard generic handle
|
||||
* @param *Error : Pointer to an error object.
|
||||
*/
|
||||
virtual void LogError(const ocsd_hndl_err_log_t handle, const ocsdError *Error) = 0;
|
||||
|
||||
/*!
|
||||
* Log a general message. Associated with component or use generic handle.
|
||||
* Message logged to same output as errors if output enabled, but not saved for GetLastError()
|
||||
*
|
||||
* @param handle : Component handle or standard generic handle.
|
||||
* @param filter_level : Verbosity filter.
|
||||
* @param msg : Pointer to an error object.
|
||||
*/
|
||||
virtual void LogMessage(const ocsd_hndl_err_log_t handle, const ocsd_err_severity_t filter_level, const std::string &msg ) = 0;
|
||||
|
||||
/*!
|
||||
* Get a pointer to the last logged error.
|
||||
* Returns 0 if no errors have been logged.
|
||||
*
|
||||
* @return ocsdError *: last error pointer.
|
||||
*/
|
||||
virtual ocsdError *GetLastError() = 0;
|
||||
|
||||
/*!
|
||||
* Get the last error associated with the given Trace source channel ID.
|
||||
* returns a pointer to the error or 0 if no errors associated with the ID.
|
||||
*
|
||||
* @param chan_id : ID.
|
||||
*
|
||||
* @return ocsdError *: last error pointer for ID or 0.
|
||||
*/
|
||||
virtual ocsdError *GetLastIDError(const uint8_t chan_id) = 0;
|
||||
|
||||
virtual ocsdMsgLogger *getOutputLogger() = 0;
|
||||
virtual void setOutputLogger(ocsdMsgLogger *pLogger) = 0;
|
||||
|
||||
enum generic_handles {
|
||||
HANDLE_GEN_ERR = 0,
|
||||
HANDLE_GEN_WARN,
|
||||
HANDLE_GEN_INFO,
|
||||
/* last value in list */
|
||||
HANDLE_FIRST_REGISTERED_COMPONENT /**< 1st valid handle value for components registered with logger */
|
||||
};
|
||||
};
|
||||
|
||||
#endif // ARM_TRC_ERROR_LOG_I_H_INCLUDED
|
||||
|
||||
/* End of File trc_error_log_i.h */
|
77
decoder/include/interfaces/trc_gen_elem_in_i.h
Normal file
77
decoder/include/interfaces/trc_gen_elem_in_i.h
Normal file
@ -0,0 +1,77 @@
|
||||
/*
|
||||
* \file trc_gen_elem_in_i.h
|
||||
* \brief OpenCSD : Generic Trace Element interface.
|
||||
*
|
||||
* \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef ARM_TRC_GEN_ELEM_IN_I_H_INCLUDED
|
||||
#define ARM_TRC_GEN_ELEM_IN_I_H_INCLUDED
|
||||
|
||||
class OcsdTraceElement;
|
||||
|
||||
/*!
|
||||
* @class ITrcGenElemIn
|
||||
|
||||
* @brief Interface for the input of generic trace elements.
|
||||
*
|
||||
* @ingroup ocsd_interfaces
|
||||
*
|
||||
* This interface is the principal output attachment point for the trace packet decoders.
|
||||
*
|
||||
*/
|
||||
class ITrcGenElemIn
|
||||
{
|
||||
public:
|
||||
ITrcGenElemIn() {}; /**< Default constructor. */
|
||||
virtual ~ITrcGenElemIn() {}; /**< Default destructor. */
|
||||
|
||||
|
||||
/*!
|
||||
* Interface for analysis blocks that take generic trace elements as their input.
|
||||
* Final interface on the decode data path. The index provided is that for the generating
|
||||
* trace packet. Multiple generic elements may be produced from a single packet so they will
|
||||
* all have the same start index.
|
||||
*
|
||||
* @param index_sop : Trace index for start of packet generating this element.
|
||||
* @param trc_chan_id : CoreSight Trace ID for this source.
|
||||
* @param &elem : Generic trace element generated from the deocde data path
|
||||
*
|
||||
* @return ocsd_datapath_resp_t : Standard data path response.
|
||||
*/
|
||||
virtual ocsd_datapath_resp_t TraceElemIn(const ocsd_trc_index_t index_sop,
|
||||
const uint8_t trc_chan_id,
|
||||
const OcsdTraceElement &elem) = 0;
|
||||
};
|
||||
|
||||
#endif // ARM_TRC_GEN_ELEM_IN_I_H_INCLUDED
|
||||
|
||||
/* End of File trc_gen_elem_in_i.h */
|
77
decoder/include/interfaces/trc_indexer_pkt_i.h
Normal file
77
decoder/include/interfaces/trc_indexer_pkt_i.h
Normal file
@ -0,0 +1,77 @@
|
||||
/*
|
||||
* \file trc_indexer_pkt_i.h
|
||||
* \brief OpenCSD : Trace packet indexer
|
||||
*
|
||||
* \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef ARM_TRC_INDEXER_PKT_I_H_INCLUDED
|
||||
#define ARM_TRC_INDEXER_PKT_I_H_INCLUDED
|
||||
|
||||
#include "trc_abs_typed_base_i.h"
|
||||
|
||||
/*!
|
||||
* @class ITrcPktIndexer
|
||||
|
||||
* @brief Templated interface class to index packet types.
|
||||
*
|
||||
* @ingroup ocsd_interfaces
|
||||
*
|
||||
* Each protocol version will have an associated indexer that will index significant
|
||||
* packets such as synchronisation points, timestamps, trigger events.
|
||||
*
|
||||
* Creating an index is optional at runtime, but will allow any analysis program to synchronise the
|
||||
* different trace streams.
|
||||
*
|
||||
* Indexes need to be created only once and can be saved for re-use.
|
||||
*
|
||||
* Packet processors should be created to support the attachment of an indexer.
|
||||
*
|
||||
*/
|
||||
template <class Pt>
|
||||
class ITrcPktIndexer : public ITrcTypedBase
|
||||
{
|
||||
public:
|
||||
ITrcPktIndexer() {}; /**< Default constructor. */
|
||||
virtual ~ITrcPktIndexer() {}; /**< Default destructor. */
|
||||
|
||||
/*!
|
||||
* Interface method for trace packet indexing. Implementated by a channel packet indexer.
|
||||
*
|
||||
* @param index_sop : trace index at the start of the packet.
|
||||
* @param *packet_type : The packet type being indexed.
|
||||
*/
|
||||
virtual void TracePktIndex(const ocsd_trc_index_t index_sop, const Pt *packet_type) = 0;
|
||||
};
|
||||
|
||||
#endif // ARM_TRC_INDEXER_PKT_I_H_INCLUDED
|
||||
|
||||
/* End of File trc_indexer_pkt_i.h */
|
124
decoder/include/interfaces/trc_indexer_src_i.h
Normal file
124
decoder/include/interfaces/trc_indexer_src_i.h
Normal file
@ -0,0 +1,124 @@
|
||||
/*
|
||||
* \file trc_indexer_src_i.h
|
||||
* \brief OpenCSD :
|
||||
*
|
||||
* \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef ARM_TRC_INDEXER_SRC_I_H_INCLUDED
|
||||
#define ARM_TRC_INDEXER_SRC_I_H_INCLUDED
|
||||
|
||||
#include <vector>
|
||||
#include "opencsd/ocsd_if_types.h"
|
||||
|
||||
/*!
|
||||
* @class ITrcSrcIndexCreator
|
||||
*
|
||||
* @brief Interface class to index the frame formatted trace stream
|
||||
*
|
||||
* @ingroup ocsd_interfaces
|
||||
*
|
||||
* This indexer creates an index of trace IDs present in the frame formatted trace stream.
|
||||
* It will also index any trigger point markers indicated in the frame format.
|
||||
*
|
||||
* Indexing is optional at runtime. Indexes can be saved and re-used.
|
||||
*/
|
||||
class ITrcSrcIndexCreator
|
||||
{
|
||||
public:
|
||||
ITrcSrcIndexCreator() {}; /**< Default constructor. */
|
||||
virtual ~ITrcSrcIndexCreator() {}; /**< Default destructor. */
|
||||
|
||||
/*!
|
||||
* The size of block that the indexer will split trace into - this is effectively the
|
||||
* index granularity. The indexing will indicate if an indexed element - e.g. a source
|
||||
* ID - is present in the block. Smaller granularity will mean a larger index but more
|
||||
* resolution in IDs and event positions.
|
||||
*
|
||||
* Block sizes will be power of 2 aligned, not less 256 bytes (16 frames).
|
||||
* Indexer will choose block size based on total trace size and desired granularity.
|
||||
*
|
||||
* @return uint32_t : Size of indexing block.
|
||||
*/
|
||||
virtual const uint32_t IndexBlockSize() const;
|
||||
|
||||
/*!
|
||||
* Index a single ID
|
||||
*
|
||||
* @param src_idx : trace index of source ID
|
||||
* @param ID : The source ID.
|
||||
*
|
||||
* @return virtual ocsd_err_t : OCSD_OK if successful.
|
||||
*/
|
||||
virtual ocsd_err_t TrcIDIndex(const ocsd_trc_index_t src_idx, const uint8_t ID) = 0;
|
||||
|
||||
/*!
|
||||
* Index a set of IDs in a block.
|
||||
* Block is assumed to be one of size IndexBlockSize()
|
||||
*
|
||||
* May be used by the deformatter to collate IDs and reduce indexing calls.
|
||||
* May be used by hardware capture source that has its own index of IDs, to transfer
|
||||
* indexing information into the decoder indexer.
|
||||
*
|
||||
* @param src_idx_start : Index of start of block.
|
||||
* @param IDs : IDs within the block.
|
||||
*
|
||||
* @return virtual ocsd_err_t : OCSD_OK if successful.
|
||||
*/
|
||||
virtual ocsd_err_t TrcIDBlockMap(const ocsd_trc_index_t src_idx_start, const std::vector<uint8_t> IDs) = 0;
|
||||
|
||||
/*!
|
||||
* The CoreSight frame format can use a reserved ID to indicate trigger or other
|
||||
* events programmed into the trace protocol generator.
|
||||
* This call indexes these events.
|
||||
*
|
||||
* @param src_idx : trace index of the event.
|
||||
* @param event_type : type of event.
|
||||
*
|
||||
* @return ocsd_err_t : OCSD_OK if indexed correctly, OCSD_ERR_INVALID_PARAM_VAL if incorrect value used.
|
||||
*/
|
||||
virtual ocsd_err_t TrcEventIndex(const ocsd_trc_index_t src_idx, const int event_type) = 0;
|
||||
|
||||
|
||||
/*!
|
||||
* When the frame formatter is using frame syncs (typically TPIU output captured on off chip capture
|
||||
* device), this index call notes the position of these elements.
|
||||
*
|
||||
* @param src_idx : trace index of sync point.
|
||||
*/
|
||||
virtual void TrcSyncIndex(const ocsd_trc_index_t src_idx);
|
||||
|
||||
};
|
||||
|
||||
#endif // ARM_TRC_INDEXER_SRC_I_H_INCLUDED
|
||||
|
||||
/* End of File trc_indexer_src_i.h */
|
66
decoder/include/interfaces/trc_instr_decode_i.h
Normal file
66
decoder/include/interfaces/trc_instr_decode_i.h
Normal file
@ -0,0 +1,66 @@
|
||||
/*
|
||||
* \file trc_instr_decode_i.h
|
||||
* \brief OpenCSD : Interface for instruction decode.
|
||||
*
|
||||
* \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef ARM_TRC_INSTR_DECODE_I_H_INCLUDED
|
||||
#define ARM_TRC_INSTR_DECODE_I_H_INCLUDED
|
||||
|
||||
/*!
|
||||
* @class IInstrDecode
|
||||
* @ingroup ocsd_interfaces
|
||||
* @brief Interface class to an instruction opcode decoder.
|
||||
*
|
||||
* The opcode decoder needs to be capable of limited decode required for trace
|
||||
* execution flow determination.
|
||||
*
|
||||
*/
|
||||
class IInstrDecode
|
||||
{
|
||||
public:
|
||||
IInstrDecode() {}; /**< Default constructor. */
|
||||
virtual ~IInstrDecode() {}; /**< Default destructor. */
|
||||
|
||||
/*!
|
||||
* Instruction opcode decode for the packet trace decoder to follow the
|
||||
* instruction execution flow.
|
||||
*
|
||||
* @param *instr_info : Structure to pass current opcode, and receive required decode information.
|
||||
*
|
||||
* @return ocsd_err_t : OCSD_OK if successful.
|
||||
*/
|
||||
virtual ocsd_err_t DecodeInstruction(ocsd_instr_info *instr_info) = 0;
|
||||
};
|
||||
|
||||
#endif // ARM_TRC_INSTR_DECODE_I_H_INCLUDED
|
||||
|
||||
/* End of File trc_instr_decode_i.h */
|
80
decoder/include/interfaces/trc_pkt_in_i.h
Normal file
80
decoder/include/interfaces/trc_pkt_in_i.h
Normal file
@ -0,0 +1,80 @@
|
||||
/*
|
||||
* \file trc_pkt_in_i.h
|
||||
* \brief OpenCSD : Interface for trace protocol packet input
|
||||
*
|
||||
* \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef ARM_TRC_PKT_IN_I_H_INCLUDED
|
||||
#define ARM_TRC_PKT_IN_I_H_INCLUDED
|
||||
|
||||
#include "trc_abs_typed_base_i.h"
|
||||
|
||||
/*!
|
||||
* @class IPktDataIn
|
||||
* @ingroup ocsd_interfaces
|
||||
* @brief Interface class providing an input for discrete protocol packets.
|
||||
*
|
||||
* Implemented by trace protocol packet decoders to convert packets into
|
||||
* generic trace elements.
|
||||
*
|
||||
* Packet class used will contain information on the latest packet,
|
||||
* and any intra-packet state.
|
||||
*
|
||||
*/
|
||||
template<class P>
|
||||
class IPktDataIn : public ITrcTypedBase
|
||||
{
|
||||
public:
|
||||
IPktDataIn() {}; /**< Default constructor. */
|
||||
virtual ~IPktDataIn() {}; /**< Default destructor. */
|
||||
|
||||
/*!
|
||||
* Interface function to process a single protocol packet.
|
||||
* Pass a trace index for the start of packet and a pointer to a packet when the
|
||||
* datapath operation is OCSD_OP_DATA.
|
||||
*
|
||||
* @param op : Datapath operation.
|
||||
* @param index_sop : Trace index for the start of the packet, 0 if not OCSD_OP_DATA.
|
||||
* @param *p_packet_in : Protocol Packet - when data path operation is OCSD_OP_DATA. null otherwise.
|
||||
*
|
||||
* @return ocsd_datapath_resp_t : Standard data path response.
|
||||
*/
|
||||
virtual ocsd_datapath_resp_t PacketDataIn( const ocsd_datapath_op_t op,
|
||||
const ocsd_trc_index_t index_sop,
|
||||
const P *p_packet_in) = 0;
|
||||
|
||||
|
||||
};
|
||||
|
||||
#endif // ARM_TRC_PKT_IN_I_H_INCLUDED
|
||||
|
||||
/* End of File trc_proc_pkt_in_i.h */
|
83
decoder/include/interfaces/trc_pkt_raw_in_i.h
Normal file
83
decoder/include/interfaces/trc_pkt_raw_in_i.h
Normal file
@ -0,0 +1,83 @@
|
||||
/*
|
||||
* \file trc_pkt_raw_in_i.h
|
||||
* \brief OpenCSD :
|
||||
*
|
||||
* \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef ARM_TRC_PKT_RAW_IN_I_H_INCLUDED
|
||||
#define ARM_TRC_PKT_RAW_IN_I_H_INCLUDED
|
||||
|
||||
#include "trc_abs_typed_base_i.h"
|
||||
|
||||
/*!
|
||||
* @class IPktRawDataMon
|
||||
*
|
||||
* @brief Interface class for packet processor monitor.
|
||||
*
|
||||
* @addtogroup ocsd_interfaces
|
||||
*
|
||||
* This interface provides a monitor point for the packet processor block.
|
||||
* The templated interface is called with a complete packet of the given
|
||||
* type, plus the raw packet bytes. Use for tools which need to display compplete
|
||||
* packets or require additional processing on raw packet data.
|
||||
*
|
||||
* This interface is not part of the data decode path and cannot provide feedback.
|
||||
*
|
||||
*/
|
||||
template<class P>
|
||||
class IPktRawDataMon : public ITrcTypedBase
|
||||
{
|
||||
public:
|
||||
IPktRawDataMon() {}; /**< Default constructor. */
|
||||
virtual ~IPktRawDataMon() {}; /**< Default destructor. */
|
||||
|
||||
/*!
|
||||
* Interface monitor function called with a complete packet, or other
|
||||
* data path operation.
|
||||
*
|
||||
* @param op : Datapath operation
|
||||
* @param index_sop : start of packet index
|
||||
* @param *pkt : The expanded packet
|
||||
* @param size : size of packet data bytes
|
||||
* @param *p_data : the packet data bytes.
|
||||
*
|
||||
*/
|
||||
virtual void RawPacketDataMon( const ocsd_datapath_op_t op,
|
||||
const ocsd_trc_index_t index_sop,
|
||||
const P *pkt,
|
||||
const uint32_t size,
|
||||
const uint8_t *p_data) = 0;
|
||||
};
|
||||
|
||||
#endif // ARM_TRC_PKT_RAW_IN_I_H_INCLUDED
|
||||
|
||||
/* End of File trc_pkt_raw_in_i.h */
|
91
decoder/include/interfaces/trc_tgt_mem_access_i.h
Normal file
91
decoder/include/interfaces/trc_tgt_mem_access_i.h
Normal file
@ -0,0 +1,91 @@
|
||||
/*
|
||||
* \file trc_tgt_mem_access_i.h
|
||||
* \brief OpenCSD : Target memory read interface.
|
||||
*
|
||||
* \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef ARM_TRC_TGT_MEM_ACCESS_I_H_INCLUDED
|
||||
#define ARM_TRC_TGT_MEM_ACCESS_I_H_INCLUDED
|
||||
|
||||
/*!
|
||||
* @class ITargetMemAccess
|
||||
*
|
||||
* @brief Interface to target memory access.
|
||||
*
|
||||
* @ingroup ocsd_interfaces
|
||||
*
|
||||
* Read Target memory call is used by the decoder to access the memory location in the
|
||||
* target memory space for the next instruction(s) to be traced.
|
||||
*
|
||||
* Memory data returned is to be little-endian.
|
||||
*
|
||||
* The implementator of this interface could either use file(s) containing dumps of memory
|
||||
* locations from the target, be an elf file reader extracting code, or a live target
|
||||
* connection, depending on the tool execution context.
|
||||
*
|
||||
*
|
||||
*/
|
||||
class ITargetMemAccess
|
||||
{
|
||||
public:
|
||||
ITargetMemAccess() {}; /**< default interface constructor */
|
||||
virtual ~ITargetMemAccess() {}; /**< default interface destructor */
|
||||
|
||||
/*!
|
||||
* Read a block of target memory into supplied buffer.
|
||||
*
|
||||
* Bytes read set less than bytes required, along with a success return code indicates full memory
|
||||
* location not accessible. Function will return all accessible bytes from the address up to the point
|
||||
* where the first inaccessible location appears.
|
||||
*
|
||||
* The cs_trace_id associates a memory read with a core. Different cores may have different memory spaces,
|
||||
* the memory access may take this into account. Access will first look in the registered memory areas
|
||||
* associated with the ID, failing that will look into any global memory spaces.
|
||||
*
|
||||
* @param address : Address to access.
|
||||
* @param cs_trace_id : protocol source trace ID.
|
||||
* @param mem_space : Memory space to access, (secure, non-secure, optionally with EL, or any).
|
||||
* @param num_bytes : [in] Number of bytes required. [out] Number of bytes actually read.
|
||||
* @param *p_buffer : Buffer to fill with the bytes.
|
||||
*
|
||||
* @return ocsd_err_t : OCSD_OK on successful access (including memory not available)
|
||||
*/
|
||||
virtual ocsd_err_t ReadTargetMemory( const ocsd_vaddr_t address,
|
||||
const uint8_t cs_trace_id,
|
||||
const ocsd_mem_space_acc_t mem_space,
|
||||
uint32_t *num_bytes,
|
||||
uint8_t *p_buffer) = 0;
|
||||
};
|
||||
|
||||
|
||||
#endif // ARM_TRC_TGT_MEM_ACCESS_I_H_INCLUDED
|
||||
|
||||
/* End of File trc_tgt_mem_access_i.h */
|
47
decoder/include/mem_acc/trc_mem_acc.h
Normal file
47
decoder/include/mem_acc/trc_mem_acc.h
Normal file
@ -0,0 +1,47 @@
|
||||
/*
|
||||
* \file trc_mem_acc.h
|
||||
* \brief OpenCSD :
|
||||
*
|
||||
* \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef ARM_TRC_MEM_ACC_H_INCLUDED
|
||||
#define ARM_TRC_MEM_ACC_H_INCLUDED
|
||||
|
||||
#include "trc_mem_acc_base.h"
|
||||
#include "trc_mem_acc_bufptr.h"
|
||||
#include "trc_mem_acc_file.h"
|
||||
#include "trc_mem_acc_mapper.h"
|
||||
#include "trc_mem_acc_cb.h"
|
||||
|
||||
|
||||
#endif // ARM_TRC_MEM_ACC_H_INCLUDED
|
||||
|
||||
/* End of File trc_mem_acc.h */
|
244
decoder/include/mem_acc/trc_mem_acc_base.h
Normal file
244
decoder/include/mem_acc/trc_mem_acc_base.h
Normal file
@ -0,0 +1,244 @@
|
||||
/*!
|
||||
* \file trc_mem_acc_base.h
|
||||
* \brief OpenCSD : Memory accessor base class.
|
||||
*
|
||||
* \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef ARM_TRC_MEM_ACC_BASE_H_INCLUDED
|
||||
#define ARM_TRC_MEM_ACC_BASE_H_INCLUDED
|
||||
|
||||
#include "opencsd/ocsd_if_types.h"
|
||||
#include <string>
|
||||
|
||||
/*!
|
||||
* @class TrcMemAccessorBase
|
||||
* @brief Memory range to access by trace decoder.
|
||||
*
|
||||
* Represents a memory access range for the trace decoder.
|
||||
* Range inclusive from m_startAddress to m_endAddress.
|
||||
* e.g. a 1k range from 0x1000 has start of 0x1000 and end of 0x13FF
|
||||
*
|
||||
* Derived classes provide specific access types such as binary files and memory buffers.
|
||||
*
|
||||
*/
|
||||
class TrcMemAccessorBase
|
||||
{
|
||||
public:
|
||||
|
||||
/** Describes the storage type of the underlying memory accessor */
|
||||
enum MemAccTypes {
|
||||
MEMACC_UNKNOWN,
|
||||
MEMACC_FILE, //<! Binary data file accessor
|
||||
MEMACC_BUFPTR, //<! memory buffer accessor
|
||||
MEMACC_CB_IF, //<! callback interface accessor - use for live memory access
|
||||
};
|
||||
|
||||
/** default constructor */
|
||||
TrcMemAccessorBase(MemAccTypes type);
|
||||
|
||||
/** costruct with address range values */
|
||||
TrcMemAccessorBase(MemAccTypes type, ocsd_vaddr_t startAddr, ocsd_vaddr_t endAddr);
|
||||
|
||||
/** default desctructor */
|
||||
virtual ~TrcMemAccessorBase() {};
|
||||
|
||||
/*!
|
||||
* Set the inclusive address range of this accessor.
|
||||
*
|
||||
* @param startAddr : start address of the range.
|
||||
* @param endAddr : end address of the range.
|
||||
*/
|
||||
void setRange(ocsd_vaddr_t startAddr, ocsd_vaddr_t endAddr);
|
||||
|
||||
/*!
|
||||
* test if an address is in the inclusive range for this accessor
|
||||
*
|
||||
* @param s_address : Address to test.
|
||||
*
|
||||
* @return const bool : true if the address is in range.
|
||||
*/
|
||||
virtual const bool addrInRange(const ocsd_vaddr_t s_address) const;
|
||||
|
||||
|
||||
/*!
|
||||
* test if an address is the start of range for this accessor
|
||||
*
|
||||
* @param s_address : Address to test.
|
||||
*
|
||||
* @return const bool : true if the address is start of range.
|
||||
*/
|
||||
virtual const bool addrStartOfRange(const ocsd_vaddr_t s_address) const;
|
||||
|
||||
/*!
|
||||
* Test number of bytes available from the start address, up to the number of requested bytes.
|
||||
* Tests if all the requested bytes are available from the supplied start address.
|
||||
* Returns the number available up to full requested amount.
|
||||
*
|
||||
* @param s_address : Start address within the range.
|
||||
* @param reqBytes : Number of bytes needed from the start address.
|
||||
*
|
||||
* @return const uint32_t : Bytes available, up to reqBytes. 0 is s_address not in range.
|
||||
*/
|
||||
virtual const uint32_t bytesInRange(const ocsd_vaddr_t s_address, const uint32_t reqBytes) const;
|
||||
|
||||
/*!
|
||||
* test is supplied range accessor overlaps this range.
|
||||
*
|
||||
* @param *p_test_acc : Accessor to test for overlap.
|
||||
*
|
||||
* @return bool : true if overlap, false if not.
|
||||
*/
|
||||
virtual const bool overLapRange(const TrcMemAccessorBase *p_test_acc) const;
|
||||
|
||||
/*!
|
||||
* Read bytes from via the accessor from the memory range.
|
||||
*
|
||||
* @param s_address : Start address of the read.
|
||||
* @param memSpace : memory space for this access.
|
||||
* @param reqBytes : Number of bytes required.
|
||||
* @param *byteBuffer : Buffer to copy the bytes into.
|
||||
*
|
||||
* @return uint32_t : Number of bytes read, 0 if s_address out of range, or mem space not accessible.
|
||||
*/
|
||||
virtual const uint32_t readBytes(const ocsd_vaddr_t s_address, const ocsd_mem_space_acc_t memSpace, const uint32_t reqBytes, uint8_t *byteBuffer) = 0;
|
||||
|
||||
/*!
|
||||
* Validate the address range - ensure addresses aligned, different, st < en etc.
|
||||
*
|
||||
* @return bool : true if valid range.
|
||||
*/
|
||||
virtual const bool validateRange();
|
||||
|
||||
|
||||
const enum MemAccTypes getType() const { return m_type; };
|
||||
|
||||
/* handle memory spaces */
|
||||
void setMemSpace(ocsd_mem_space_acc_t memSpace) { m_mem_space = memSpace; };
|
||||
const ocsd_mem_space_acc_t getMemSpace() const { return m_mem_space; };
|
||||
const bool inMemSpace(const ocsd_mem_space_acc_t mem_space) const { return (bool)(((uint8_t)m_mem_space & (uint8_t)mem_space) != 0); };
|
||||
|
||||
/* memory access info logging */
|
||||
virtual void getMemAccString(std::string &accStr) const;
|
||||
|
||||
protected:
|
||||
ocsd_vaddr_t m_startAddress; /**< accessible range start address */
|
||||
ocsd_vaddr_t m_endAddress; /**< accessible range end address */
|
||||
const MemAccTypes m_type; /**< memory accessor type */
|
||||
ocsd_mem_space_acc_t m_mem_space;
|
||||
};
|
||||
|
||||
inline TrcMemAccessorBase::TrcMemAccessorBase(MemAccTypes accType, ocsd_vaddr_t startAddr, ocsd_vaddr_t endAddr) :
|
||||
m_startAddress(startAddr),
|
||||
m_endAddress(endAddr),
|
||||
m_type(accType),
|
||||
m_mem_space(OCSD_MEM_SPACE_ANY)
|
||||
{
|
||||
}
|
||||
|
||||
inline TrcMemAccessorBase::TrcMemAccessorBase(MemAccTypes accType) :
|
||||
m_startAddress(0),
|
||||
m_endAddress(0),
|
||||
m_type(accType),
|
||||
m_mem_space(OCSD_MEM_SPACE_ANY)
|
||||
{
|
||||
}
|
||||
|
||||
inline void TrcMemAccessorBase::setRange(ocsd_vaddr_t startAddr, ocsd_vaddr_t endAddr)
|
||||
{
|
||||
m_startAddress = startAddr;
|
||||
m_endAddress = endAddr;
|
||||
}
|
||||
|
||||
inline const bool TrcMemAccessorBase::addrInRange(const ocsd_vaddr_t s_address) const
|
||||
{
|
||||
return (s_address >= m_startAddress) && (s_address <= m_endAddress);
|
||||
}
|
||||
|
||||
inline const bool TrcMemAccessorBase::addrStartOfRange(const ocsd_vaddr_t s_address) const
|
||||
{
|
||||
return (s_address == m_startAddress);
|
||||
}
|
||||
|
||||
|
||||
inline const uint32_t TrcMemAccessorBase::bytesInRange(const ocsd_vaddr_t s_address, const uint32_t reqBytes) const
|
||||
{
|
||||
ocsd_vaddr_t bytesInRange = 0;
|
||||
if(addrInRange(s_address)) // start not in range, return 0.
|
||||
{
|
||||
// bytes available till end address.
|
||||
bytesInRange = m_endAddress - s_address + 1;
|
||||
if(bytesInRange > reqBytes)
|
||||
bytesInRange = reqBytes;
|
||||
}
|
||||
return (uint32_t)bytesInRange;
|
||||
}
|
||||
|
||||
inline const bool TrcMemAccessorBase::overLapRange(const TrcMemAccessorBase *p_test_acc) const
|
||||
{
|
||||
if( addrInRange(p_test_acc->m_startAddress) ||
|
||||
addrInRange(p_test_acc->m_endAddress)
|
||||
)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
inline const bool TrcMemAccessorBase::validateRange()
|
||||
{
|
||||
if(m_startAddress & 0x1) // at least hword aligned for thumb
|
||||
return false;
|
||||
if((m_endAddress + 1) & 0x1)
|
||||
return false;
|
||||
if(m_startAddress == m_endAddress) // zero length range.
|
||||
return false;
|
||||
if(m_startAddress > m_endAddress) // values bakcwards / invalid
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
class TrcMemAccFactory
|
||||
{
|
||||
public:
|
||||
/** Accessor Creation */
|
||||
static ocsd_err_t CreateBufferAccessor(TrcMemAccessorBase **pAccessor, const ocsd_vaddr_t s_address, const uint8_t *p_buffer, const uint32_t size);
|
||||
static ocsd_err_t CreateFileAccessor(TrcMemAccessorBase **pAccessor, const std::string &pathToFile, ocsd_vaddr_t startAddr, size_t offset = 0, size_t size = 0);
|
||||
static ocsd_err_t CreateCBAccessor(TrcMemAccessorBase **pAccessor, const ocsd_vaddr_t s_address, const ocsd_vaddr_t e_address, const ocsd_mem_space_acc_t mem_space);
|
||||
|
||||
/** Accessor Destruction */
|
||||
static void DestroyAccessor(TrcMemAccessorBase *pAccessor);
|
||||
private:
|
||||
TrcMemAccFactory() {};
|
||||
~TrcMemAccFactory() {};
|
||||
};
|
||||
|
||||
#endif // ARM_TRC_MEM_ACC_BASE_H_INCLUDED
|
||||
|
||||
/* End of File trc_mem_acc_base.h */
|
76
decoder/include/mem_acc/trc_mem_acc_bufptr.h
Normal file
76
decoder/include/mem_acc/trc_mem_acc_bufptr.h
Normal file
@ -0,0 +1,76 @@
|
||||
/*
|
||||
* \file trc_mem_acc_bufptr.h
|
||||
* \brief OpenCSD :
|
||||
*
|
||||
* \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef ARM_TRC_MEM_ACC_BUFPTR_H_INCLUDED
|
||||
#define ARM_TRC_MEM_ACC_BUFPTR_H_INCLUDED
|
||||
|
||||
#include "mem_acc/trc_mem_acc_base.h"
|
||||
|
||||
/*!
|
||||
* @class TrcMemAccBufPtr:
|
||||
* @brief Trace memory accessor for a memory buffer.
|
||||
*
|
||||
* Wraps a memory buffer in an memory range accessor object.
|
||||
* Takes a copy of the buffer pointer which must remain valid
|
||||
* for the lifetime of the object.
|
||||
*
|
||||
*/
|
||||
class TrcMemAccBufPtr: public TrcMemAccessorBase
|
||||
{
|
||||
public:
|
||||
/*!
|
||||
* Construct the accessor.
|
||||
* uses the start address as the start of range and calculates the end address
|
||||
* according to the buffer size
|
||||
*
|
||||
* @param s_address : Start address in memory map represented by the data in the buffer.
|
||||
* @param *p_buffer : pointer to a buffer of binary data.
|
||||
* @param size : size of the buffer.
|
||||
*
|
||||
*/
|
||||
TrcMemAccBufPtr(const ocsd_vaddr_t s_address, const uint8_t *p_buffer, const uint32_t size);
|
||||
|
||||
virtual ~TrcMemAccBufPtr() {}; /**< default destructor */
|
||||
|
||||
/** Memory access override - allow decoder to read bytes from the buffer. */
|
||||
virtual const uint32_t readBytes(const ocsd_vaddr_t address, const ocsd_mem_space_acc_t memSpace, const uint32_t reqBytes, uint8_t *byteBuffer);
|
||||
|
||||
private:
|
||||
const uint8_t *m_p_buffer; /**< pointer to the memory buffer */
|
||||
const uint32_t m_size; /**< size of the memory buffer. */
|
||||
};
|
||||
|
||||
#endif // ARM_TRC_MEM_ACC_BUFPTR_H_INCLUDED
|
||||
|
||||
/* End of File trc_mem_acc_bufptr.h */
|
81
decoder/include/mem_acc/trc_mem_acc_cb.h
Normal file
81
decoder/include/mem_acc/trc_mem_acc_cb.h
Normal file
@ -0,0 +1,81 @@
|
||||
/*!
|
||||
* \file trc_mem_acc_cb.h
|
||||
* \brief OpenCSD : Callback trace memory accessor.
|
||||
*
|
||||
* \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef ARM_TRC_MEM_ACC_CB_H_INCLUDED
|
||||
#define ARM_TRC_MEM_ACC_CB_H_INCLUDED
|
||||
|
||||
#include "mem_acc/trc_mem_acc_base.h"
|
||||
#include "mem_acc/trc_mem_acc_cb_if.h"
|
||||
|
||||
class TrcMemAccCB : public TrcMemAccessorBase
|
||||
{
|
||||
public:
|
||||
TrcMemAccCB(const ocsd_vaddr_t s_address,
|
||||
const ocsd_vaddr_t e_address,
|
||||
const ocsd_mem_space_acc_t mem_space);
|
||||
|
||||
|
||||
virtual ~TrcMemAccCB() {};
|
||||
|
||||
/** Memory access override - allow decoder to read bytes from the buffer. */
|
||||
virtual const uint32_t readBytes(const ocsd_vaddr_t address, const ocsd_mem_space_acc_t memSpace, const uint32_t reqBytes, uint8_t *byteBuffer);
|
||||
|
||||
void setCBIfClass(TrcMemAccCBIF *p_if);
|
||||
void setCBIfFn(Fn_MemAcc_CB p_fn, const void *p_context);
|
||||
|
||||
private:
|
||||
TrcMemAccCBIF *m_p_CBclass; //<! callback class.
|
||||
Fn_MemAcc_CB m_p_CBfn; //<! callback function.
|
||||
const void *m_p_cbfn_context; //<! context pointer for callback function.
|
||||
};
|
||||
|
||||
inline void TrcMemAccCB::setCBIfClass(TrcMemAccCBIF *p_if)
|
||||
{
|
||||
m_p_CBclass = p_if;
|
||||
m_p_CBfn = 0; // only one callback type per accessor.
|
||||
m_p_cbfn_context = 0;
|
||||
}
|
||||
|
||||
inline void TrcMemAccCB::setCBIfFn(Fn_MemAcc_CB p_fn, const void *p_context)
|
||||
{
|
||||
m_p_CBfn = p_fn;
|
||||
m_p_cbfn_context = p_context;
|
||||
m_p_CBclass = 0; // only one callback type per accessor.
|
||||
}
|
||||
|
||||
|
||||
|
||||
#endif // ARM_TRC_MEM_ACC_CB_H_INCLUDED
|
||||
|
||||
/* End of File trc_mem_acc_cb.h */
|
71
decoder/include/mem_acc/trc_mem_acc_cb_if.h
Normal file
71
decoder/include/mem_acc/trc_mem_acc_cb_if.h
Normal file
@ -0,0 +1,71 @@
|
||||
/*!
|
||||
* \file trc_mem_acc_cb_if.h
|
||||
* \brief OpenCSD : Memory Accessor Callback Direct Interface
|
||||
*
|
||||
* \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef ARM_TRC_MEM_ACC_CB_IF_H_INCLUDED
|
||||
#define ARM_TRC_MEM_ACC_CB_IF_H_INCLUDED
|
||||
|
||||
#include "opencsd/ocsd_if_types.h"
|
||||
|
||||
/*!
|
||||
* @class TrcMemAccCBIF
|
||||
* @brief Interface class to implement memory accessor callbacks
|
||||
*
|
||||
* Implement an object with this interface to use in a memory accessor callback type.
|
||||
* Callback accesses the memory according to address and memory space.
|
||||
* Use for trace decode memory access on live systems, or where the implemented accessor types
|
||||
* are not suitable for the memory data being accessed.
|
||||
*
|
||||
*/
|
||||
class TrcMemAccCBIF
|
||||
{
|
||||
public:
|
||||
TrcMemAccCBIF() {};
|
||||
virtual ~TrcMemAccCBIF() {};
|
||||
|
||||
/*!
|
||||
* Read bytes from via the accessor from the memory range.
|
||||
*
|
||||
* @param s_address : Start address of the read.
|
||||
* @param memSpace : memory space for this access.
|
||||
* @param reqBytes : Number of bytes required.
|
||||
* @param *byteBuffer : Buffer to copy the bytes into.
|
||||
*
|
||||
* @return uint32_t : Number of bytes read, 0 if s_address out of range, or mem space not accessible.
|
||||
*/
|
||||
virtual const uint32_t readBytes(const ocsd_vaddr_t s_address, const ocsd_mem_space_acc_t memSpace, const uint32_t reqBytes, uint8_t *byteBuffer) = 0;
|
||||
};
|
||||
|
||||
#endif // ARM_TRC_MEM_ACC_CB_IF_H_INCLUDED
|
||||
|
||||
/* End of File trc_mem_acc_cb_if.h */
|
234
decoder/include/mem_acc/trc_mem_acc_file.h
Normal file
234
decoder/include/mem_acc/trc_mem_acc_file.h
Normal file
@ -0,0 +1,234 @@
|
||||
/*
|
||||
* \file trc_mem_acc_file.h
|
||||
* \brief OpenCSD : Access binary target memory file
|
||||
*
|
||||
* \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef ARM_TRC_MEM_ACC_FILE_H_INCLUDED
|
||||
#define ARM_TRC_MEM_ACC_FILE_H_INCLUDED
|
||||
|
||||
#include <map>
|
||||
#include <string>
|
||||
#include <fstream>
|
||||
#include <list>
|
||||
|
||||
#include "opencsd/ocsd_if_types.h"
|
||||
#include "mem_acc/trc_mem_acc_base.h"
|
||||
|
||||
// an add-on region to a file - allows setting of a region at a none-zero offset for a file.
|
||||
class FileRegionMemAccessor : public TrcMemAccessorBase
|
||||
{
|
||||
public:
|
||||
FileRegionMemAccessor() : TrcMemAccessorBase(MEMACC_FILE) {};
|
||||
virtual ~FileRegionMemAccessor() {};
|
||||
|
||||
void setOffset(const size_t offset) { m_file_offset = offset; };
|
||||
const size_t getOffset() const { return m_file_offset; };
|
||||
|
||||
bool operator<(const FileRegionMemAccessor& rhs) { return this->m_startAddress < rhs.m_startAddress; };
|
||||
|
||||
// not going to use these objects to read bytes - defer to the file class for that.
|
||||
virtual const uint32_t readBytes(const ocsd_vaddr_t s_address, const ocsd_mem_space_acc_t memSpace, const uint32_t reqBytes, uint8_t *byteBuffer) { return 0; };
|
||||
|
||||
const ocsd_vaddr_t regionStartAddress() const { return m_startAddress; };
|
||||
|
||||
private:
|
||||
size_t m_file_offset;
|
||||
};
|
||||
|
||||
/*!
|
||||
* @class TrcMemAccessorFile
|
||||
* @brief Memory accessor for a binary file.
|
||||
*
|
||||
* Memory accessor based on a binary file snapshot of some memory.
|
||||
*
|
||||
* Static creation code to allow reference counted accessor usable for
|
||||
* multiple access maps attached to multiple source trees for the same system.
|
||||
*/
|
||||
class TrcMemAccessorFile : public TrcMemAccessorBase
|
||||
{
|
||||
public:
|
||||
/** read bytes override - reads from file */
|
||||
virtual const uint32_t readBytes(const ocsd_vaddr_t address, const ocsd_mem_space_acc_t memSpace, const uint32_t reqBytes, uint8_t *byteBuffer);
|
||||
|
||||
protected:
|
||||
TrcMemAccessorFile(); /**< protected default constructor */
|
||||
virtual ~ TrcMemAccessorFile(); /**< protected default destructor */
|
||||
|
||||
/** increment reference counter */
|
||||
void IncRefCount() { m_ref_count++; };
|
||||
|
||||
/** decrement reference counter */
|
||||
void DecRefCount() { m_ref_count--; };
|
||||
|
||||
/** get current reference count */
|
||||
const int getRefCount() const { return m_ref_count; };
|
||||
|
||||
/*!
|
||||
* Initialise accessor with file name and path, and start address.
|
||||
* File opened and length calculated to determine end address for the range.
|
||||
*
|
||||
* @param &pathToFile : Binary file path and name
|
||||
* @param startAddr : system memory address associated with start of binary datain file.
|
||||
*
|
||||
* @return bool : true if set up successfully, false if file could not be opened.
|
||||
*/
|
||||
ocsd_err_t initAccessor(const std::string &pathToFile, ocsd_vaddr_t startAddr, size_t offset, size_t size);
|
||||
|
||||
/** get the file path */
|
||||
const std::string &getFilePath() const { return m_file_path; };
|
||||
|
||||
/** get an offset region if extant for the address */
|
||||
FileRegionMemAccessor *getRegionForAddress(const ocsd_vaddr_t startAddr) const;
|
||||
|
||||
/* validate ranges */
|
||||
virtual const bool validateRange();
|
||||
|
||||
public:
|
||||
|
||||
/*!
|
||||
* File may contain multiple none-overlapping ranges in a single file.
|
||||
*
|
||||
* @param startAddr : Address for beginning of byte data.
|
||||
* @param size : size of range in bytes.
|
||||
* @param offset : offset into file for that data.
|
||||
*
|
||||
* @return bool : true if set successfully.
|
||||
*/
|
||||
bool AddOffsetRange(const ocsd_vaddr_t startAddr, const size_t size, const size_t offset);
|
||||
|
||||
/*!
|
||||
* Override in case we have multiple regions in the file.
|
||||
*
|
||||
* @param s_address : Address to test.
|
||||
*
|
||||
* @return const bool : true if the address is in range.
|
||||
*/
|
||||
virtual const bool addrInRange(const ocsd_vaddr_t s_address) const;
|
||||
|
||||
/*!
|
||||
* test if an address is the start of range for this accessor
|
||||
*
|
||||
* @param s_address : Address to test.
|
||||
*
|
||||
* @return const bool : true if the address is start of range.
|
||||
*/
|
||||
virtual const bool addrStartOfRange(const ocsd_vaddr_t s_address) const;
|
||||
|
||||
/*!
|
||||
* Test number of bytes available from the start address, up to the number of requested bytes.
|
||||
* Tests if all the requested bytes are available from the supplied start address.
|
||||
* Returns the number available up to full requested amount.
|
||||
*
|
||||
* @param s_address : Start address within the range.
|
||||
* @param reqBytes : Number of bytes needed from the start address.
|
||||
*
|
||||
* @return const uint32_t : Bytes available, up to reqBytes. 0 is s_address not in range.
|
||||
*/
|
||||
virtual const uint32_t bytesInRange(const ocsd_vaddr_t s_address, const uint32_t reqBytes) const;
|
||||
|
||||
/*!
|
||||
* test is supplied range accessor overlaps this range.
|
||||
*
|
||||
* @param *p_test_acc : Accessor to test for overlap.
|
||||
*
|
||||
* @return bool : true if overlap, false if not.
|
||||
*/
|
||||
virtual const bool overLapRange(const TrcMemAccessorBase *p_test_acc) const;
|
||||
|
||||
/*! Override to handle ranges and offset accessors plus add in file name. */
|
||||
virtual void getMemAccString(std::string &accStr) const;
|
||||
|
||||
|
||||
/*!
|
||||
* Create a file accessor based on the supplied path and address.
|
||||
* Keeps a list of file accessors created.
|
||||
*
|
||||
* File will be checked to ensure valid accessor can be created.
|
||||
*
|
||||
* If an accessor using the supplied file is currently in use then a reference to that
|
||||
* accessor will be returned and the accessor reference counter updated.
|
||||
*
|
||||
* @param &pathToFile : Path to binary file
|
||||
* @param startAddr : Start address of data represented by file.
|
||||
*
|
||||
* @return TrcMemAccessorFile * : pointer to accessor if successful, 0 if it could not be created.
|
||||
*/
|
||||
static ocsd_err_t createFileAccessor(TrcMemAccessorFile **p_acc, const std::string &pathToFile, ocsd_vaddr_t startAddr, size_t offset = 0, size_t size = 0);
|
||||
|
||||
/*!
|
||||
* Destroy supplied accessor.
|
||||
*
|
||||
* Reference counter decremented and checked and accessor destroyed if no longer in use.
|
||||
*
|
||||
* @param *p_accessor : File Accessor to destroy.
|
||||
*/
|
||||
static void destroyFileAccessor(TrcMemAccessorFile *p_accessor);
|
||||
|
||||
/*!
|
||||
* Test if any accessor is currently using the supplied file path
|
||||
*
|
||||
* @param &pathToFile : Path to test.
|
||||
*
|
||||
* @return bool : true if an accessor exists with this file path.
|
||||
*/
|
||||
static const bool isExistingFileAccessor(const std::string &pathToFile);
|
||||
|
||||
/*!
|
||||
* Get the accessor using the supplied file path
|
||||
* Use after createFileAccessor if additional memory ranges need
|
||||
* adding to an exiting file accessor.
|
||||
*
|
||||
* @param &pathToFile : Path to test.
|
||||
*
|
||||
* @return TrcMemAccessorFile * : none 0 if an accessor exists with this file path.
|
||||
*/
|
||||
static TrcMemAccessorFile * getExistingFileAccessor(const std::string &pathToFile);
|
||||
|
||||
|
||||
|
||||
|
||||
private:
|
||||
static std::map<std::string, TrcMemAccessorFile *> s_FileAccessorMap; /**< map of file accessors in use. */
|
||||
|
||||
private:
|
||||
std::ifstream m_mem_file; /**< input binary file stream */
|
||||
ocsd_vaddr_t m_file_size; /**< size of the file */
|
||||
int m_ref_count; /**< accessor reference count */
|
||||
std::string m_file_path; /**< path to input file */
|
||||
std::list<FileRegionMemAccessor *> m_access_regions; /**< additional regions in the file at non-zero offsets */
|
||||
bool m_base_range_set; /**< true when offset 0 set */
|
||||
bool m_has_access_regions; /**< true if single file contains multiple regions */
|
||||
};
|
||||
|
||||
#endif // ARM_TRC_MEM_ACC_FILE_H_INCLUDED
|
||||
|
||||
/* End of File trc_mem_acc_file.h */
|
128
decoder/include/mem_acc/trc_mem_acc_mapper.h
Normal file
128
decoder/include/mem_acc/trc_mem_acc_mapper.h
Normal file
@ -0,0 +1,128 @@
|
||||
/*
|
||||
* \file trc_mem_acc_mapper.h
|
||||
* \brief OpenCSD :
|
||||
*
|
||||
* \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef ARM_TRC_MEM_ACC_MAPPER_H_INCLUDED
|
||||
#define ARM_TRC_MEM_ACC_MAPPER_H_INCLUDED
|
||||
|
||||
#include <vector>
|
||||
|
||||
#include "opencsd/ocsd_if_types.h"
|
||||
#include "interfaces/trc_tgt_mem_access_i.h"
|
||||
#include "interfaces/trc_error_log_i.h"
|
||||
#include "mem_acc/trc_mem_acc_base.h"
|
||||
|
||||
typedef enum _memacc_mapper_t {
|
||||
MEMACC_MAP_GLOBAL,
|
||||
} memacc_mapper_t;
|
||||
|
||||
class TrcMemAccMapper : public ITargetMemAccess
|
||||
{
|
||||
public:
|
||||
TrcMemAccMapper();
|
||||
TrcMemAccMapper(bool using_trace_id);
|
||||
virtual ~TrcMemAccMapper();
|
||||
|
||||
// decoder memory access interface
|
||||
virtual ocsd_err_t ReadTargetMemory( const ocsd_vaddr_t address,
|
||||
const uint8_t cs_trace_id,
|
||||
const ocsd_mem_space_acc_t mem_space,
|
||||
uint32_t *num_bytes,
|
||||
uint8_t *p_buffer);
|
||||
|
||||
// mapper memory area configuration interface
|
||||
|
||||
// add an accessor to this map
|
||||
virtual ocsd_err_t AddAccessor(TrcMemAccessorBase *p_accessor, const uint8_t cs_trace_id) = 0;
|
||||
|
||||
// remove a specific accessor
|
||||
virtual ocsd_err_t RemoveAccessor(const TrcMemAccessorBase *p_accessor) = 0;
|
||||
|
||||
|
||||
// clear all attached accessors from the map
|
||||
void RemoveAllAccessors();
|
||||
|
||||
// remove a single accessor based on address.
|
||||
ocsd_err_t RemoveAccessorByAddress(const ocsd_vaddr_t st_address, const ocsd_mem_space_acc_t mem_space, const uint8_t cs_trace_id = 0);
|
||||
|
||||
// set the error log.
|
||||
void setErrorLog(ITraceErrorLog *err_log_i) { m_err_log = err_log_i; };
|
||||
|
||||
// print out the ranges in this mapper.
|
||||
virtual void logMappedRanges() = 0;
|
||||
|
||||
protected:
|
||||
virtual bool findAccessor(const ocsd_vaddr_t address, const ocsd_mem_space_acc_t mem_space, const uint8_t cs_trace_id) = 0; // set m_acc_curr if found valid range, leave unchanged if not.
|
||||
virtual bool readFromCurrent(const ocsd_vaddr_t address, const ocsd_mem_space_acc_t mem_space, const uint8_t cs_trace_id) = 0;
|
||||
virtual TrcMemAccessorBase *getFirstAccessor() = 0;
|
||||
virtual TrcMemAccessorBase *getNextAccessor() = 0;
|
||||
virtual void clearAccessorList() = 0;
|
||||
|
||||
void LogMessage(const std::string &msg);
|
||||
|
||||
TrcMemAccessorBase *m_acc_curr; // most recently used - try this first.
|
||||
uint8_t m_trace_id_curr; // trace ID for the current accessor
|
||||
const bool m_using_trace_id; // true if we are using separate memory spaces by TraceID.
|
||||
ITraceErrorLog *m_err_log; // error log to print out mappings on request.
|
||||
};
|
||||
|
||||
|
||||
// address spaces common to all sources using this mapper.
|
||||
// trace id unused.
|
||||
class TrcMemAccMapGlobalSpace : public TrcMemAccMapper
|
||||
{
|
||||
public:
|
||||
TrcMemAccMapGlobalSpace();
|
||||
virtual ~TrcMemAccMapGlobalSpace();
|
||||
|
||||
// mapper creation interface - prevent overlaps
|
||||
virtual ocsd_err_t AddAccessor(TrcMemAccessorBase *p_accessor, const uint8_t cs_trace_id);
|
||||
|
||||
// print out the ranges in this mapper.
|
||||
virtual void logMappedRanges();
|
||||
|
||||
protected:
|
||||
virtual bool findAccessor(const ocsd_vaddr_t address, const ocsd_mem_space_acc_t mem_space, const uint8_t cs_trace_id);
|
||||
virtual bool readFromCurrent(const ocsd_vaddr_t address,const ocsd_mem_space_acc_t mem_space, const uint8_t cs_trace_id);
|
||||
virtual TrcMemAccessorBase *getFirstAccessor();
|
||||
virtual TrcMemAccessorBase *getNextAccessor();
|
||||
virtual void clearAccessorList();
|
||||
virtual ocsd_err_t RemoveAccessor(const TrcMemAccessorBase *p_accessor);
|
||||
|
||||
std::vector<TrcMemAccessorBase *> m_acc_global;
|
||||
std::vector<TrcMemAccessorBase *>::iterator m_acc_it;
|
||||
};
|
||||
|
||||
#endif // ARM_TRC_MEM_ACC_MAPPER_H_INCLUDED
|
||||
|
||||
/* End of File trc_mem_acc_mapper.h */
|
65
decoder/include/ocsd_if_version.h
Normal file
65
decoder/include/ocsd_if_version.h
Normal file
@ -0,0 +1,65 @@
|
||||
/*
|
||||
* \file ocsd_if_version.h
|
||||
* \brief OpenCSD : Library API versioning
|
||||
*
|
||||
* \copyright Copyright (c) 2016, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef ARM_OCSD_IF_VERSION_H_INCLUDED
|
||||
#define ARM_OCSD_IF_VERSION_H_INCLUDED
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
/** @addtogroup ocsd_interfaces
|
||||
@{*/
|
||||
|
||||
/** @name Library Versioning
|
||||
@{*/
|
||||
#define OCSD_VER_MAJOR 0x0 /**< Library Major Version */
|
||||
#define OCSD_VER_MINOR 0x8 /**< Library Minor Version */
|
||||
#define OCSD_VER_PATCH 0x2 /**< Library Patch Version */
|
||||
|
||||
/** Library version number - MMMMnnpp format.
|
||||
MMMM = major version,
|
||||
nn = minor version,
|
||||
pp = patch version
|
||||
*/
|
||||
#define OCSD_VER_NUM (((uint32_t)OCSD_VER_MAJOR << 16) | ((uint32_t)OCSD_VER_MINOR << 8) | ((uint32_t)OCSD_VER_PATCH))
|
||||
|
||||
#define OCSD_VER_STRING "0.8.2" /**< Library Version string */
|
||||
#define OCSD_LIB_NAME "OpenCSD Library" /**< Library name string */
|
||||
#define OCSD_LIB_SHORT_NAME "OCSD" /**< Library Short name string */
|
||||
/** @}*/
|
||||
|
||||
/** @}*/
|
||||
|
||||
#endif // ARM_OCSD_IF_VERSION_H_INCLUDED
|
||||
|
||||
/* End of File ocsd_if_version.h */
|
84
decoder/include/opencsd.h
Normal file
84
decoder/include/opencsd.h
Normal file
@ -0,0 +1,84 @@
|
||||
/*!
|
||||
* \file opencsd.h
|
||||
* \brief OpenCSD: Open CoreSight Trace Decoder -Master include file for C++ library
|
||||
*
|
||||
* \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef ARM_OPENCSD_H_INCLUDED
|
||||
#define ARM_OPENCSD_H_INCLUDED
|
||||
|
||||
/** C interface types */
|
||||
#include "opencsd/ocsd_if_types.h"
|
||||
#include "opencsd/trc_pkt_types.h"
|
||||
#include "opencsd/trc_gen_elem_types.h"
|
||||
|
||||
/* C++ abstract interfaces */
|
||||
#include "interfaces/trc_data_raw_in_i.h"
|
||||
#include "interfaces/trc_data_rawframe_in_i.h"
|
||||
#include "interfaces/trc_error_log_i.h"
|
||||
#include "interfaces/trc_gen_elem_in_i.h"
|
||||
#include "interfaces/trc_instr_decode_i.h"
|
||||
#include "interfaces/trc_pkt_in_i.h"
|
||||
#include "interfaces/trc_pkt_raw_in_i.h"
|
||||
#include "interfaces/trc_tgt_mem_access_i.h"
|
||||
|
||||
/* protocol base classes and generic elements */
|
||||
#include "common/ocsd_version.h"
|
||||
#include "common/ocsd_error.h"
|
||||
#include "common/trc_gen_elem.h"
|
||||
#include "common/trc_core_arch_map.h"
|
||||
|
||||
/** Implemented Protocol decoders */
|
||||
#include "common/trc_frame_deformatter.h"
|
||||
|
||||
#include "opencsd/etmv3/etmv3_decoder.h"
|
||||
#include "opencsd/etmv4/etmv4_decoder.h"
|
||||
#include "opencsd/ptm/ptm_decoder.h"
|
||||
#include "opencsd/stm/stm_decoder.h"
|
||||
|
||||
/** C++ library object types */
|
||||
#include "common/ocsd_error_logger.h"
|
||||
#include "common/ocsd_msg_logger.h"
|
||||
#include "i_dec/trc_i_decode.h"
|
||||
#include "mem_acc/trc_mem_acc.h"
|
||||
|
||||
/* printers for builtin packet elements */
|
||||
#include "pkt_printers/trc_pkt_printers.h"
|
||||
#include "pkt_printers/trc_print_fact.h"
|
||||
|
||||
/** The decode tree and decoder register*/
|
||||
#include "common/ocsd_lib_dcd_register.h"
|
||||
#include "common/ocsd_dcd_tree.h"
|
||||
|
||||
|
||||
#endif // ARM_OPENCSD_H_INCLUDED
|
||||
|
||||
/* End of File opencsd.h */
|
54
decoder/include/opencsd/c_api/ocsd_c_api_cust_fact.h
Normal file
54
decoder/include/opencsd/c_api/ocsd_c_api_cust_fact.h
Normal file
@ -0,0 +1,54 @@
|
||||
/*
|
||||
* \file ocsd_c_api_cust_fact.h
|
||||
* \brief OpenCSD : Custom decoder factory API functions
|
||||
*
|
||||
* \copyright Copyright (c) 2016, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
#ifndef ARM_OCSD_C_API_CUST_FACT_H_INCLUDED
|
||||
#define ARM_OCSD_C_API_CUST_FACT_H_INCLUDED
|
||||
|
||||
#include "ocsd_c_api_types.h"
|
||||
#include "ocsd_c_api_custom.h"
|
||||
|
||||
/* Declarations for the functions implemented in the custom decoder factory. */
|
||||
|
||||
/** Required function to create a decoder instance - fills in the decoder struct supplied. */
|
||||
ocsd_err_t CreateCustomDecoder(const int create_flags, const void *decoder_cfg, ocsd_extern_dcd_inst_t *p_decoder_inst);
|
||||
|
||||
/** Required Function to destroy a decoder instance - indicated by decoder handle */
|
||||
ocsd_err_t DestroyCustomDecoder(const void *decoder_handle);
|
||||
|
||||
/** Required Function to extract the CoreSight Trace ID from the configuration structure */
|
||||
ocsd_err_t GetCSIDFromConfig(const void *decoder_cfg, unsigned char *p_csid);
|
||||
|
||||
/** Optional Function to convert a protocol specific trace packet to human readable string */
|
||||
ocsd_err_t PacketToString(const void *trc_pkt, char *buffer, const int buflen);
|
||||
|
||||
#endif /* ARM_OCSD_C_API_CUST_FACT_H_INCLUDED */
|
158
decoder/include/opencsd/c_api/ocsd_c_api_cust_impl.h
Normal file
158
decoder/include/opencsd/c_api/ocsd_c_api_cust_impl.h
Normal file
@ -0,0 +1,158 @@
|
||||
/*
|
||||
* \file ocsd_c_api_cust_impl.h
|
||||
* \brief OpenCSD : Custom decoder implementation common API definitions
|
||||
*
|
||||
* \copyright Copyright (c) 2016, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
#ifndef ARM_OCSD_C_API_CUST_IMPL_H_INCLUDED
|
||||
#define ARM_OCSD_C_API_CUST_IMPL_H_INCLUDED
|
||||
|
||||
#include "opencsd/c_api/ocsd_c_api_types.h"
|
||||
#include "opencsd/c_api/ocsd_c_api_custom.h"
|
||||
|
||||
/** @addtogroup ocsd_ext_dcd
|
||||
@{*/
|
||||
|
||||
/**@name External decoder - Inline utility functions.
|
||||
@brief inline functions used in decoders to call the various library callback functionality.
|
||||
|
||||
Functions manipulate and use the ocsd_extern_dcd_cb_fns structure to call into the library,
|
||||
with appropriate checking for initialisation and usage flags.
|
||||
|
||||
@{*/
|
||||
|
||||
static inline ocsd_datapath_resp_t lib_cb_GenElemOp(const ocsd_extern_dcd_cb_fns *callbacks,
|
||||
const ocsd_trc_index_t index_sop,
|
||||
const uint8_t trc_chan_id,
|
||||
const ocsd_generic_trace_elem *elem)
|
||||
{
|
||||
if (callbacks->fn_gen_elem_out)
|
||||
return callbacks->fn_gen_elem_out(callbacks->lib_context, index_sop, trc_chan_id, elem);
|
||||
return OCSD_RESP_FATAL_NOT_INIT;
|
||||
}
|
||||
|
||||
static inline ocsd_err_t lib_cb_LogError(const ocsd_extern_dcd_cb_fns *callbacks,
|
||||
const ocsd_err_severity_t filter_level,
|
||||
const ocsd_err_t code,
|
||||
const ocsd_trc_index_t idx,
|
||||
const uint8_t chan_id,
|
||||
const char *pMsg)
|
||||
{
|
||||
if (callbacks->fn_log_error)
|
||||
{
|
||||
callbacks->fn_log_error(callbacks->lib_context, filter_level, code, idx, chan_id, pMsg);
|
||||
return OCSD_OK;
|
||||
}
|
||||
return OCSD_ERR_NOT_INIT;
|
||||
}
|
||||
|
||||
static inline ocsd_err_t lib_cb_LogMsg(const ocsd_extern_dcd_cb_fns *callbacks,
|
||||
const ocsd_err_severity_t filter_level,
|
||||
const char *pMsg)
|
||||
{
|
||||
if (callbacks->fn_log_msg)
|
||||
{
|
||||
callbacks->fn_log_msg(callbacks->lib_context, filter_level, pMsg);
|
||||
return OCSD_OK;
|
||||
}
|
||||
return OCSD_ERR_NOT_INIT;
|
||||
}
|
||||
|
||||
static inline ocsd_err_t lib_cb_DecodeArmInst(const ocsd_extern_dcd_cb_fns *callbacks,
|
||||
ocsd_instr_info *instr_info)
|
||||
{
|
||||
if (callbacks->fn_arm_instruction_decode)
|
||||
return callbacks->fn_arm_instruction_decode(callbacks->lib_context, instr_info);
|
||||
return OCSD_ERR_NOT_INIT;
|
||||
}
|
||||
|
||||
static inline ocsd_err_t lib_cb_MemAccess(const ocsd_extern_dcd_cb_fns *callbacks,
|
||||
const ocsd_vaddr_t address,
|
||||
const uint8_t cs_trace_id,
|
||||
const ocsd_mem_space_acc_t mem_space,
|
||||
uint32_t *num_bytes,
|
||||
uint8_t *p_buffer)
|
||||
{
|
||||
if (callbacks->fn_memory_access)
|
||||
return callbacks->fn_memory_access(callbacks->lib_context, address, cs_trace_id, mem_space, num_bytes, p_buffer);
|
||||
return OCSD_ERR_NOT_INIT;
|
||||
}
|
||||
|
||||
static inline void lib_cb_PktMon(const ocsd_extern_dcd_cb_fns *callbacks,
|
||||
const ocsd_datapath_op_t op,
|
||||
const ocsd_trc_index_t index_sop,
|
||||
const void *pkt,
|
||||
const uint32_t size,
|
||||
const uint8_t *p_data)
|
||||
{
|
||||
if (callbacks->packetCBFlags & OCSD_CUST_DCD_PKT_CB_USE_MON)
|
||||
{
|
||||
if (callbacks->fn_packet_mon)
|
||||
callbacks->fn_packet_mon(callbacks->lib_context, op, index_sop, pkt, size, p_data);
|
||||
}
|
||||
}
|
||||
|
||||
static inline int lib_cb_usePktMon(const ocsd_extern_dcd_cb_fns *callbacks)
|
||||
{
|
||||
return (callbacks->packetCBFlags & OCSD_CUST_DCD_PKT_CB_USE_MON);
|
||||
}
|
||||
|
||||
/* callback function to connect to the packet sink interface, on the main decode
|
||||
data path - used if decoder created as packet processor only */
|
||||
static inline ocsd_datapath_resp_t lib_cb_PktDataSink(const ocsd_extern_dcd_cb_fns *callbacks,
|
||||
const ocsd_datapath_op_t op,
|
||||
const ocsd_trc_index_t index_sop,
|
||||
const void *pkt)
|
||||
{
|
||||
if (callbacks->packetCBFlags & OCSD_CUST_DCD_PKT_CB_USE_SINK)
|
||||
{
|
||||
if (callbacks->fn_packet_data_sink)
|
||||
return callbacks->fn_packet_data_sink(callbacks->lib_context, op, index_sop, pkt);
|
||||
else
|
||||
return OCSD_RESP_FATAL_NOT_INIT;
|
||||
}
|
||||
return OCSD_RESP_CONT;
|
||||
}
|
||||
|
||||
static inline int lib_cb_usePktSink(const ocsd_extern_dcd_cb_fns *callbacks)
|
||||
{
|
||||
return (callbacks->packetCBFlags & OCSD_CUST_DCD_PKT_CB_USE_SINK);
|
||||
}
|
||||
|
||||
static inline void lib_cb_updatePktCBFlags(ocsd_extern_dcd_cb_fns *callbacks, const int newFlags)
|
||||
{
|
||||
callbacks->packetCBFlags = newFlags;
|
||||
}
|
||||
|
||||
/** @}*/
|
||||
|
||||
/** @}*/
|
||||
|
||||
#endif /* ARM_OCSD_C_API_CUST_IMPL_H_INCLUDED */
|
253
decoder/include/opencsd/c_api/ocsd_c_api_custom.h
Normal file
253
decoder/include/opencsd/c_api/ocsd_c_api_custom.h
Normal file
@ -0,0 +1,253 @@
|
||||
/*
|
||||
* \file ocsd_c_api_custom.h
|
||||
* \brief OpenCSD : Custom decoder interface types and structures
|
||||
*
|
||||
* \copyright Copyright (c) 2016, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
#ifndef ARM_OCSD_C_API_CUSTOM_H_INCLUDED
|
||||
#define ARM_OCSD_C_API_CUSTOM_H_INCLUDED
|
||||
|
||||
#include "ocsd_c_api_types.h"
|
||||
|
||||
|
||||
/** @defgroup ocsd_ext_dcd OpenCSD Library : Custom External Decoder C-API
|
||||
@brief Set of types, structures and interfaces for attaching custom decoders via the C-API
|
||||
|
||||
These types, functions and structures define the required API between a custom external decoder
|
||||
and the library, which will allow the decoder to interact with the library and use library
|
||||
resources in the same way as the built-in decoders.
|
||||
|
||||
The external decoder must implement:-
|
||||
- A set of factory functions that allow the creation and destruction of decoder instances.
|
||||
- A set of call-in and call-back functions plus data structures allowing interaction with the library.
|
||||
|
||||
@{*/
|
||||
|
||||
|
||||
/**@name External decoder - Input Interfaces
|
||||
@{*/
|
||||
|
||||
/* Custom decoder C-API interface types. */
|
||||
|
||||
/** Raw trace data input function - a decoder must have one of these
|
||||
Implements ITrcDataIn with the addition of a decoder handle to provide context in the decoder.
|
||||
*/
|
||||
typedef ocsd_datapath_resp_t (* fnTraceDataIn)( const void *decoder_handle,
|
||||
const ocsd_datapath_op_t op,
|
||||
const ocsd_trc_index_t index,
|
||||
const uint32_t dataBlockSize,
|
||||
const uint8_t *pDataBlock,
|
||||
uint32_t *numBytesProcessed);
|
||||
|
||||
/** Function to update the in-use flags for the packet sinks
|
||||
|
||||
Defines if the fnPktMonCB or fnPktDataSinkCB callbacks are in use by the library.
|
||||
If so then it is expected that the decoder should call them when trace protocol packets are generated.
|
||||
|
||||
This function must be implemented in the decoder.
|
||||
|
||||
@param decoder_handle : handle for decoder accessed by this call.
|
||||
@param flags: Values indicating interfaces in use / not in use. [ OCSD_CUST_DCD_PKT_CB_USE_MON or OCSD_CUST_DCD_PKT_CB_USE_SINK]
|
||||
*/
|
||||
typedef void (* fnUpdatePktMonFlags)(const void *decoder_handle, const int flags);
|
||||
|
||||
|
||||
|
||||
/** Flag to indicate the the packet monitor (fnPktMonCB) is in use in the library */
|
||||
#define OCSD_CUST_DCD_PKT_CB_USE_MON 0x1
|
||||
|
||||
/** Flag to indicate the the packet sink (fnPktDataSinkCB) is in use in the library - only if trace packet processing only mode. */
|
||||
#define OCSD_CUST_DCD_PKT_CB_USE_SINK 0x2
|
||||
|
||||
/** Owned by the library instance object, this structure is filled in by the ocsd_extern_dcd_fact_t createDecoder() function. */
|
||||
typedef struct _ocsd_extern_dcd_inst {
|
||||
/* Mandatory decoder call back functions - library initialisation will fail without these. */
|
||||
fnTraceDataIn fn_data_in; /**< raw trace data input function to decoder */
|
||||
fnUpdatePktMonFlags fn_update_pkt_mon; /**< update the packet monitor / sink usage flags */
|
||||
|
||||
/* Decoder instance data */
|
||||
void *decoder_handle; /**< Instance handle for the decoder - used by library to call the decoder call in functions */
|
||||
char *p_decoder_name; /**< type name of the decoder - may be used in logging */
|
||||
uint8_t cs_id; /**< Coresight ID for the instance - extracted from the config on creation. */
|
||||
|
||||
} ocsd_extern_dcd_inst_t;
|
||||
|
||||
/** @}*/
|
||||
|
||||
|
||||
/**@name External decoder - Callback Interfaces
|
||||
@{*/
|
||||
|
||||
|
||||
/** callback function to connect into the generic element output point
|
||||
Implements ITrcGenElemIn::TraceElemIn with addition of library context pointer.
|
||||
*/
|
||||
typedef ocsd_datapath_resp_t (* fnGenElemOpCB)( const void *lib_context,
|
||||
const ocsd_trc_index_t index_sop,
|
||||
const uint8_t trc_chan_id,
|
||||
const ocsd_generic_trace_elem *elem);
|
||||
|
||||
/** callback functions to connect into the library error logging mechanism
|
||||
Implements ITraceErrorLog::LogError with addition of library context pointer.
|
||||
*/
|
||||
typedef void (* fnLogErrorCB)( const void *lib_context,
|
||||
const ocsd_err_severity_t filter_level,
|
||||
const ocsd_err_t code,
|
||||
const ocsd_trc_index_t idx,
|
||||
const uint8_t chan_id,
|
||||
const char *pMsg);
|
||||
|
||||
/** callback functions to connect into the library error logging mechanism
|
||||
Implements ITraceErrorLog::LogMessage with addition of library context pointer.
|
||||
*/
|
||||
typedef void (* fnLogMsgCB)(const void *lib_context, const ocsd_err_severity_t filter_level, const char *msg);
|
||||
|
||||
/** callback function to connect an ARM instruction decoder
|
||||
Implements IInstrDecode::DecodeInstruction with addition of library context pointer.
|
||||
*/
|
||||
typedef ocsd_err_t (* fnDecodeArmInstCB)(const void *lib_context, ocsd_instr_info *instr_info);
|
||||
|
||||
/** callback function to connect the memory accessor interface
|
||||
Implements ITargetMemAccess::ReadTargetMemory with addition of library context pointer.
|
||||
*/
|
||||
typedef ocsd_err_t (* fnMemAccessCB)(const void *lib_context,
|
||||
const ocsd_vaddr_t address,
|
||||
const uint8_t cs_trace_id,
|
||||
const ocsd_mem_space_acc_t mem_space,
|
||||
uint32_t *num_bytes,
|
||||
uint8_t *p_buffer);
|
||||
|
||||
/** callback function to connect to the packet monitor interface of the packet processor
|
||||
Implements IPktRawDataMon::RawPacketDataMon <void> with addition of library context pointer.
|
||||
*/
|
||||
typedef void (* fnPktMonCB)( const void *lib_context,
|
||||
const ocsd_datapath_op_t op,
|
||||
const ocsd_trc_index_t index_sop,
|
||||
const void *pkt,
|
||||
const uint32_t size,
|
||||
const uint8_t *p_data);
|
||||
|
||||
/** callback function to connect to the packet sink interface, on the main decode
|
||||
data path - use if decoder created as packet processor only
|
||||
|
||||
Implements IPktDataIn::PacketDataIn <void> with addition of library context pointer.
|
||||
*/
|
||||
typedef ocsd_datapath_resp_t (* fnPktDataSinkCB)( const void *lib_context,
|
||||
const ocsd_datapath_op_t op,
|
||||
const ocsd_trc_index_t index_sop,
|
||||
const void *pkt);
|
||||
|
||||
/** an instance of this is owned by the decoder, filled in by the library - allows the CB fns in the library decode tree to be called. */
|
||||
typedef struct _ocsd_extern_dcd_cb_fns {
|
||||
/* Callback functions */
|
||||
fnGenElemOpCB fn_gen_elem_out; /**< Callback to output a generic element. */
|
||||
fnLogErrorCB fn_log_error; /**< Callback to output an error. */
|
||||
fnLogMsgCB fn_log_msg; /**< Callback to output a message. */
|
||||
fnDecodeArmInstCB fn_arm_instruction_decode; /**< Callback to decode an ARM instruction. */
|
||||
fnMemAccessCB fn_memory_access; /**< Callback to access memory images related to the trace capture. */
|
||||
fnPktMonCB fn_packet_mon; /**< Callback to output trace packet to packet monitor. */
|
||||
fnPktDataSinkCB fn_packet_data_sink; /**< Callback to output trace packet to packet sink - if in pack processing only mode. */
|
||||
/* CB in use flags. */
|
||||
int packetCBFlags; /**< Flags to indicate if the packet sink / packet monitor callbacks are in use. ( OCSD_CUST_DCD_PKT_CB_USE_MON / OCSD_CUST_DCD_PKT_CB_USE_SINK) */
|
||||
/* library context */
|
||||
const void *lib_context; /**< library context pointer - use in callbacks to allow the library to load the correct context data. */
|
||||
} ocsd_extern_dcd_cb_fns;
|
||||
|
||||
/** @}*/
|
||||
|
||||
/**@name External decoder - Decoder Factory
|
||||
@{*/
|
||||
|
||||
/** Function to create a decoder instance
|
||||
|
||||
Create a decoder instance according to the create_flags parameter and the supplied decoder_cfg structure.
|
||||
Fill in the p_decoder_inst structure, copy the p_lib_callbacks information for use in the decoder instance.
|
||||
|
||||
Create flags can be:
|
||||
- OCSD_CREATE_FLG_PACKET_PROC: decoder will split the incoming trace into trace protocol packets and not further decode them. fnPktDataSinkCB likely to be in use.
|
||||
- OCSD_CREATE_FLG_FULL_DECODER: decoder will split the incoming trace into trace protocol packets and further decode them to recreate program flow or other generic trace output.
|
||||
|
||||
@param create_flags : Sets the decoder operating mode.
|
||||
@param *decoder_cfg : Hardware specific configuration for this trace element.
|
||||
@param *p_lib_callbacks : Library callbacks plus context pointer.
|
||||
@param *p_decoder_inst : Structure representing the new decoder instance being created. Filled in by create function to contain handle and call-in functions for the library.
|
||||
|
||||
@return ocsd_err_t : Library error code - RCDTL_OK if successful
|
||||
*/
|
||||
typedef ocsd_err_t (* fnCreateCustomDecoder)(const int create_flags, const void *decoder_cfg, const ocsd_extern_dcd_cb_fns *p_lib_callbacks, ocsd_extern_dcd_inst_t *p_decoder_inst);
|
||||
|
||||
/** Function to destroy a decoder instance indicated by decoder handle.
|
||||
|
||||
@param decoder_handle : Instance handle for decoder.
|
||||
|
||||
@return ocsd_err_t : Library error code - RCDTL_OK if successful
|
||||
*/
|
||||
typedef ocsd_err_t (* fnDestroyCustomDecoder)(const void *decoder_handle);
|
||||
|
||||
/** Function to extract the CoreSight Trace ID from the configuration structure.
|
||||
|
||||
@param *decoder_cfg : Hardware specific configuration for this trace element.
|
||||
@parma *p_csid : location to write CoreSight Trace ID value.
|
||||
|
||||
@return ocsd_err_t : Library error code - RCDTL_OK if successful
|
||||
*/
|
||||
typedef ocsd_err_t (* fnGetCSIDFromConfig)(const void *decoder_cfg, unsigned char *p_csid);
|
||||
|
||||
/** Function to convert a protocol specific trace packet to human readable string
|
||||
|
||||
@param *trc_pkt : protocol specific packet structure.
|
||||
@param *buffer : buffer to fill with string.
|
||||
@param buflen : length of string buffer.
|
||||
|
||||
@return ocsd_err_t : Library error code - RCDTL_OK if successful
|
||||
*/
|
||||
typedef ocsd_err_t (* fnPacketToString)(const void *trc_pkt, char *buffer, const int buflen);
|
||||
|
||||
/** set of functions and callbacks to create an extern custom decoder in the library
|
||||
via the C API interface. This structure is registered with the library by name and
|
||||
then decoders of the type can be created on the decode tree.
|
||||
*/
|
||||
typedef struct _ocsd_extern_dcd_fact {
|
||||
fnCreateCustomDecoder createDecoder; /**< Function pointer to create a decoder instance. */
|
||||
fnDestroyCustomDecoder destroyDecoder; /**< Function pointer to destroy a decoder instance. */
|
||||
fnGetCSIDFromConfig csidFromConfig; /**< Function pointer to extract the CSID from a config structure */
|
||||
fnPacketToString pktToString; /**< Function pointer to print a trace protocol packet in this decoder */
|
||||
|
||||
ocsd_trace_protocol_t protocol_id; /**< protocol ID assigned during registration. */
|
||||
} ocsd_extern_dcd_fact_t;
|
||||
|
||||
/** @}*/
|
||||
|
||||
/** @}*/
|
||||
|
||||
|
||||
#endif // ARM_OCSD_C_API_CUSTOM_H_INCLUDED
|
||||
|
||||
/* End of File ocsd_c_api_custom.h */
|
105
decoder/include/opencsd/c_api/ocsd_c_api_types.h
Normal file
105
decoder/include/opencsd/c_api/ocsd_c_api_types.h
Normal file
@ -0,0 +1,105 @@
|
||||
/*!
|
||||
* \file ocsd_c_api_types.h
|
||||
* \brief OpenCSD : Trace Decoder "C" API types.
|
||||
*
|
||||
* \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef ARM_OCSD_C_API_TYPES_H_INCLUDED
|
||||
#define ARM_OCSD_C_API_TYPES_H_INCLUDED
|
||||
|
||||
/* select the library types that are C compatible - the interface data types */
|
||||
#include "opencsd/ocsd_if_types.h"
|
||||
#include "opencsd/trc_gen_elem_types.h"
|
||||
#include "opencsd/trc_pkt_types.h"
|
||||
|
||||
/* pull in the protocol decoder types. */
|
||||
#include "opencsd/etmv3/trc_pkt_types_etmv3.h"
|
||||
#include "opencsd/etmv4/trc_pkt_types_etmv4.h"
|
||||
#include "opencsd/ptm/trc_pkt_types_ptm.h"
|
||||
#include "opencsd/stm/trc_pkt_types_stm.h"
|
||||
|
||||
/** @ingroup lib_c_api
|
||||
@{*/
|
||||
|
||||
|
||||
/* Specific C-API only types */
|
||||
|
||||
/** Handle to decode tree */
|
||||
typedef void * dcd_tree_handle_t;
|
||||
|
||||
/** define invalid handle value for decode tree handle */
|
||||
#define C_API_INVALID_TREE_HANDLE (dcd_tree_handle_t)0
|
||||
|
||||
/** Logger output printer - no output. */
|
||||
#define C_API_MSGLOGOUT_FLG_NONE 0x0
|
||||
/** Logger output printer - output to file. */
|
||||
#define C_API_MSGLOGOUT_FLG_FILE 0x1
|
||||
/** Logger output printer - output to stderr. */
|
||||
#define C_API_MSGLOGOUT_FLG_STDERR 0x2
|
||||
/** Logger output printer - output to stdout. */
|
||||
#define C_API_MSGLOGOUT_FLG_STDOUT 0x4
|
||||
/** Logger output printer - mask of valid flags. */
|
||||
#define C_API_MSGLOGOUT_MASK 0x7
|
||||
|
||||
/** function pointer type for decoder outputs. all protocols, generic data element input */
|
||||
typedef ocsd_datapath_resp_t (* FnTraceElemIn)( const void *p_context,
|
||||
const ocsd_trc_index_t index_sop,
|
||||
const uint8_t trc_chan_id,
|
||||
const ocsd_generic_trace_elem *elem);
|
||||
|
||||
/** function pointer type for packet processor packet output sink, packet analyser/decoder input - generic declaration */
|
||||
typedef ocsd_datapath_resp_t (* FnDefPktDataIn)(const void *p_context,
|
||||
const ocsd_datapath_op_t op,
|
||||
const ocsd_trc_index_t index_sop,
|
||||
const void *p_packet_in);
|
||||
|
||||
/** function pointer type for packet processor packet monitor sink, raw packet monitor / display input - generic declaration */
|
||||
typedef void (* FnDefPktDataMon)(const void *p_context,
|
||||
const ocsd_datapath_op_t op,
|
||||
const ocsd_trc_index_t index_sop,
|
||||
const void *p_packet_in,
|
||||
const uint32_t size,
|
||||
const uint8_t *p_data);
|
||||
|
||||
/** function pointer tyee for library default logger output to allow client to print zero terminated output string */
|
||||
typedef void (* FnDefLoggerPrintStrCB)(const void *p_context, const char *psz_msg_str, const int str_len);
|
||||
|
||||
/** Callback interface type when attaching monitor/sink to packet processor */
|
||||
typedef enum _ocsd_c_api_cb_types {
|
||||
OCSD_C_API_CB_PKT_SINK, /** Attach to the packet processor primary packet output (CB fn is FnDefPktDataIn) */
|
||||
OCSD_C_API_CB_PKT_MON, /** Attach to the packet processor packet monitor output (CB fn is FnDefPktDataMon) */
|
||||
} ocsd_c_api_cb_types;
|
||||
|
||||
/** @}*/
|
||||
|
||||
#endif // ARM_OCSD_C_API_TYPES_H_INCLUDED
|
||||
|
||||
/* End of File ocsd_c_api_types.h */
|
485
decoder/include/opencsd/c_api/opencsd_c_api.h
Normal file
485
decoder/include/opencsd/c_api/opencsd_c_api.h
Normal file
@ -0,0 +1,485 @@
|
||||
/*!
|
||||
* \file opencsd_c_api.h
|
||||
* \brief OpenCSD : "C" API
|
||||
*
|
||||
* \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef ARM_OPENCSD_C_API_H_INCLUDED
|
||||
#define ARM_OPENCSD_C_API_H_INCLUDED
|
||||
|
||||
/** @defgroup lib_c_api OpenCSD Library : Library "C" API.
|
||||
@brief "C" API for the OpenCSD Library
|
||||
|
||||
Set of "C" wrapper functions for the OpenCSD library.
|
||||
|
||||
Defines API, functions and callback types.
|
||||
@{*/
|
||||
|
||||
/* ensure C bindings */
|
||||
|
||||
#if defined(WIN32) /* windows bindings */
|
||||
/** Building the C-API DLL **/
|
||||
#ifdef _OCSD_C_API_DLL_EXPORT
|
||||
#ifdef __cplusplus
|
||||
#define OCSD_C_API extern "C" __declspec(dllexport)
|
||||
#else
|
||||
#define OCSD_C_API __declspec(dllexport)
|
||||
#endif
|
||||
#else
|
||||
/** building or using the static C-API library **/
|
||||
#if defined(_LIB) || defined(OCSD_USE_STATIC_C_API)
|
||||
#ifdef __cplusplus
|
||||
#define OCSD_C_API extern "C"
|
||||
#else
|
||||
#define OCSD_C_API
|
||||
#endif
|
||||
#else
|
||||
/** using the C-API DLL **/
|
||||
#ifdef __cplusplus
|
||||
#define OCSD_C_API extern "C" __declspec(dllimport)
|
||||
#else
|
||||
#define OCSD_C_API __declspec(dllimport)
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
#else /* linux bindings */
|
||||
#ifdef __cplusplus
|
||||
#define OCSD_C_API extern "C"
|
||||
#else
|
||||
#define OCSD_C_API
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include "ocsd_c_api_types.h"
|
||||
#include "ocsd_c_api_custom.h"
|
||||
|
||||
/** @name Library Version API
|
||||
|
||||
@{*/
|
||||
/** Get Library version. Return a 32 bit version in form MMMMnnpp - MMMM = major verison, nn = minor version, pp = patch version */
|
||||
OCSD_C_API uint32_t ocsd_get_version(void);
|
||||
|
||||
/** Get library version string */
|
||||
OCSD_C_API const char * ocsd_get_version_str(void);
|
||||
/** @}*/
|
||||
|
||||
/*---------------------- Trace Decode Tree ----------------------------------------------------------------------------------*/
|
||||
|
||||
/** @name Library Decode Tree API
|
||||
@{*/
|
||||
|
||||
/*!
|
||||
* Create a decode tree.
|
||||
*
|
||||
* @param src_type : Type of tree - formatted input, or single source input
|
||||
* @param deformatterCfgFlags : Formatter flags - determine presence of frame syncs etc.
|
||||
*
|
||||
* @return dcd_tree_handle_t : Handle to the decode tree. Handle value set to 0 if creation failed.
|
||||
*/
|
||||
OCSD_C_API dcd_tree_handle_t ocsd_create_dcd_tree(const ocsd_dcd_tree_src_t src_type, const uint32_t deformatterCfgFlags);
|
||||
|
||||
/*!
|
||||
* Destroy a decode tree.
|
||||
*
|
||||
* Also destroys all the associated processors and decoders for the tree.
|
||||
*
|
||||
* @param handle : Handle for decode tree to destroy.
|
||||
*/
|
||||
OCSD_C_API void ocsd_destroy_dcd_tree(const dcd_tree_handle_t handle);
|
||||
|
||||
/*!
|
||||
* Input trace data into the decoder.
|
||||
*
|
||||
* Large trace source buffers can be broken down into smaller fragments.
|
||||
*
|
||||
* @param handle : Handle to decode tree.
|
||||
* @param op : Datapath operation.
|
||||
* @param index : Trace buffer byte index for the start of the supplied data block.
|
||||
* @param dataBlockSize : Size of data block.
|
||||
* @param *pDataBlock : Pointer to data block.
|
||||
* @param *numBytesProcessed : Number of bytes actually processed by the decoder.
|
||||
*
|
||||
* @return ocsd_datapath_resp_t : Datapath response code (CONT/WAIT/FATAL)
|
||||
*/
|
||||
OCSD_C_API ocsd_datapath_resp_t ocsd_dt_process_data(const dcd_tree_handle_t handle,
|
||||
const ocsd_datapath_op_t op,
|
||||
const ocsd_trc_index_t index,
|
||||
const uint32_t dataBlockSize,
|
||||
const uint8_t *pDataBlock,
|
||||
uint32_t *numBytesProcessed);
|
||||
|
||||
|
||||
/*---------------------- Generic Trace Element Output --------------------------------------------------------------*/
|
||||
|
||||
/*!
|
||||
* Set the trace element output callback function.
|
||||
*
|
||||
* This function will be called for each decoded generic trace element generated by
|
||||
* any full trace decoder in the decode tree.
|
||||
*
|
||||
* A single function is used for all trace source IDs in the decode tree.
|
||||
*
|
||||
* @param handle : Handle to decode tree.
|
||||
* @param pFn : Pointer to the callback function.
|
||||
* @param p_context : opaque context pointer value used in callback function.
|
||||
*
|
||||
* @return ocsd_err_t : Library error code - OCSD_OK if successful.
|
||||
*/
|
||||
OCSD_C_API ocsd_err_t ocsd_dt_set_gen_elem_outfn(const dcd_tree_handle_t handle, FnTraceElemIn pFn, const void *p_context);
|
||||
|
||||
/*---------------------- Trace Decoders ----------------------------------------------------------------------------------*/
|
||||
/*!
|
||||
* Creates a decoder that is registered with the library under the supplied name.
|
||||
* Flags determine if a full packet processor / packet decoder pair or
|
||||
* packet processor only is created.
|
||||
* Uses the supplied configuration structure.
|
||||
*
|
||||
* @param handle : Handle to decode tree.
|
||||
* @param *decoder_name : Registered name of the decoder to create.
|
||||
* @param create_flags : Decoder creation options.
|
||||
* @param *decoder_cfg : Pointer to a valid configuration structure for the named decoder.
|
||||
* @param *pCSID : Pointer to location to return the configured CoreSight trace ID for the decoder.
|
||||
*
|
||||
* @return ocsd_err_t : Library error code - OCSD_OK if successful.
|
||||
*/
|
||||
OCSD_C_API ocsd_err_t ocsd_dt_create_decoder(const dcd_tree_handle_t handle,
|
||||
const char *decoder_name,
|
||||
const int create_flags,
|
||||
const void *decoder_cfg,
|
||||
unsigned char *pCSID
|
||||
);
|
||||
|
||||
/*!
|
||||
* Remove a decoder from the tree and destroy it.
|
||||
*
|
||||
* @param handle : Handle to decode tree.
|
||||
* @param CSID : Configured CoreSight trace ID for the decoder.
|
||||
*
|
||||
* @return ocsd_err_t : Library error code - OCSD_OK if successful.
|
||||
*/
|
||||
OCSD_C_API ocsd_err_t ocsd_dt_remove_decoder( const dcd_tree_handle_t handle,
|
||||
const unsigned char CSID);
|
||||
|
||||
|
||||
/*!
|
||||
* Attach a callback function to the packet processor.
|
||||
*
|
||||
* The callback_type defines the attachment point, either the main packet output
|
||||
* (only if no decoder attached), or the packet monitor.
|
||||
*
|
||||
* @param handle : Handle to decode tree.
|
||||
* @param CSID : Configured CoreSight trace ID for the decoder.
|
||||
* @param callback_type : Attachment point
|
||||
* @param p_fn_pkt_data_in : Pointer to the callback function.
|
||||
* @param p_context : Opaque context pointer value used in callback function.
|
||||
*
|
||||
* @return ocsd_err_t : Library error code - OCSD_OK if successful.
|
||||
*/
|
||||
OCSD_C_API ocsd_err_t ocsd_dt_attach_packet_callback( const dcd_tree_handle_t handle,
|
||||
const unsigned char CSID,
|
||||
const ocsd_c_api_cb_types callback_type,
|
||||
void *p_fn_callback_data,
|
||||
const void *p_context);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/** @}*/
|
||||
/*---------------------- Memory Access for traced opcodes ----------------------------------------------------------------------------------*/
|
||||
/** @name Library Memory Accessor configuration on decode tree.
|
||||
@brief Configure the memory regions available for decode.
|
||||
|
||||
Full decode requires memory regions set up to allow access to the traced
|
||||
opcodes. Add memory buffers or binary file regions to a map of regions.
|
||||
|
||||
@{*/
|
||||
|
||||
/*!
|
||||
* Add a binary file based memory range accessor to the decode tree.
|
||||
*
|
||||
* Adds the entire binary file as a memory space to be accessed
|
||||
*
|
||||
* @param handle : Handle to decode tree.
|
||||
* @param address : Start address of memory area.
|
||||
* @param mem_space : Associated memory space.
|
||||
* @param *filepath : Path to binary data file.
|
||||
*
|
||||
* @return ocsd_err_t : Library error code - RCDTL_OK if successful.
|
||||
*/
|
||||
OCSD_C_API ocsd_err_t ocsd_dt_add_binfile_mem_acc(const dcd_tree_handle_t handle, const ocsd_vaddr_t address, const ocsd_mem_space_acc_t mem_space, const char *filepath);
|
||||
|
||||
/*!
|
||||
* Add a binary file based memory range accessor to the decode tree.
|
||||
*
|
||||
* Add a binary file that contains multiple regions of memory with differing
|
||||
* offsets wihtin the file.
|
||||
*
|
||||
* A linked list of file_mem_region_t structures is supplied. Each structure contains an
|
||||
* offset into the binary file, the start address for this offset and the size of the region.
|
||||
*
|
||||
* @param handle : Handle to decode tree.
|
||||
* @param region_list : Array of memory regions in the file.
|
||||
* @param num_regions : Size of region array
|
||||
* @param mem_space : Associated memory space.
|
||||
* @param *filepath : Path to binary data file.
|
||||
*
|
||||
* @return ocsd_err_t : Library error code - RCDTL_OK if successful.
|
||||
*/
|
||||
OCSD_C_API ocsd_err_t ocsd_dt_add_binfile_region_mem_acc(const dcd_tree_handle_t handle, const ocsd_file_mem_region_t *region_array, const int num_regions, const ocsd_mem_space_acc_t mem_space, const char *filepath);
|
||||
|
||||
/*!
|
||||
* Add a memory buffer based memory range accessor to the decode tree.
|
||||
*
|
||||
* @param handle : Handle to decode tree.
|
||||
* @param address : Start address of memory area.
|
||||
* @param mem_space : Associated memory space.
|
||||
* @param *p_mem_buffer : pointer to memory buffer.
|
||||
* @param mem_length : Size of memory buffer.
|
||||
*
|
||||
* @return ocsd_err_t : Library error code - RCDTL_OK if successful.
|
||||
*/
|
||||
OCSD_C_API ocsd_err_t ocsd_dt_add_buffer_mem_acc(const dcd_tree_handle_t handle, const ocsd_vaddr_t address, const ocsd_mem_space_acc_t mem_space, const uint8_t *p_mem_buffer, const uint32_t mem_length);
|
||||
|
||||
|
||||
/*!
|
||||
* Add a memory access callback function. The decoder will call the function for opcode addresses in the
|
||||
* address range supplied for the memory spaces covered.
|
||||
*
|
||||
* @param handle : Handle to decode tree.
|
||||
* @param st_address : Start address of memory area covered by the callback.
|
||||
* @param en_address : End address of the memory area covered by the callback. (inclusive)
|
||||
* @param mem_space : Memory space(s) covered by the callback.
|
||||
* @param p_cb_func : Callback function
|
||||
* @param p_context : opaque context pointer value used in callback function.
|
||||
*
|
||||
* @return OCSD_C_API ocsd_err_t : Library error code - RCDTL_OK if successful.
|
||||
*/
|
||||
OCSD_C_API ocsd_err_t ocsd_dt_add_callback_mem_acc(const dcd_tree_handle_t handle, const ocsd_vaddr_t st_address, const ocsd_vaddr_t en_address, const ocsd_mem_space_acc_t mem_space, Fn_MemAcc_CB p_cb_func, const void *p_context);
|
||||
|
||||
/*!
|
||||
* Remove a memory accessor by address and memory space.
|
||||
*
|
||||
* @param handle : Handle to decode tree.
|
||||
* @param st_address : Start address of memory accessor.
|
||||
* @param mem_space : Memory space(s) covered by the accessor.
|
||||
*
|
||||
* @return OCSD_C_API ocsd_err_t : Library error code - RCDTL_OK if successful.
|
||||
*/
|
||||
OCSD_C_API ocsd_err_t ocsd_dt_remove_mem_acc(const dcd_tree_handle_t handle, const ocsd_vaddr_t st_address, const ocsd_mem_space_acc_t mem_space);
|
||||
|
||||
/*
|
||||
* Print the mapped memory accessor ranges to the configured logger.
|
||||
*
|
||||
* @param handle : Handle to decode tree.
|
||||
*/
|
||||
OCSD_C_API void ocsd_tl_log_mapped_mem_ranges(const dcd_tree_handle_t handle);
|
||||
|
||||
/** @}*/
|
||||
|
||||
/** @name Library Default Error Log Object API
|
||||
@brief Configure the default error logging object in the library.
|
||||
|
||||
Objects created by the decode trees will use this error logger. Configure for
|
||||
desired error severity, and to enable print or logfile output.
|
||||
|
||||
@{*/
|
||||
|
||||
/*---------------------- Library Logging and debug ----------------------------------------------------------------------------------*/
|
||||
/*!
|
||||
* Initialise the library error logger.
|
||||
*
|
||||
* Choose severity of errors logger, and if the errors will be logged to screen and / or logfile.
|
||||
*
|
||||
* @param verbosity : Severity of errors that will be logged.
|
||||
* @param create_output_logger : Set to none-zero to create an output printer.
|
||||
*
|
||||
* @return ocsd_err_t : Library error code - RCDTL_OK if successful.
|
||||
*/
|
||||
OCSD_C_API ocsd_err_t ocsd_def_errlog_init(const ocsd_err_severity_t verbosity, const int create_output_logger);
|
||||
|
||||
/*!
|
||||
* Configure the output logger. Choose STDOUT, STDERR and/or log to file.
|
||||
* Optionally provide a log file name.
|
||||
*
|
||||
* @param output_flags : OR combination of required C_API_MSGLOGOUT_FLG_* flags.
|
||||
* @param *log_file_name : optional filename if logging to file. Set to NULL if not needed.
|
||||
*
|
||||
* @return OCSD_C_API ocsd_err_t : Library error code - RCDTL_OK if successful.
|
||||
*/
|
||||
OCSD_C_API ocsd_err_t ocsd_def_errlog_config_output(const int output_flags, const char *log_file_name);
|
||||
|
||||
/*!
|
||||
* Configure the library default error logger to send all strings it is outputting back to the client
|
||||
* to allow printing within the client application. This is in additional to any other log destinations
|
||||
* set in ocsd_def_errlog_init().
|
||||
*
|
||||
* @param *p_context : opaque context pointer
|
||||
* @param p_str_print_cb : client callback function to "print" logstring.
|
||||
*/
|
||||
OCSD_C_API ocsd_err_t ocsd_def_errlog_set_strprint_cb(const dcd_tree_handle_t handle, void *p_context, FnDefLoggerPrintStrCB p_str_print_cb);
|
||||
|
||||
/*!
|
||||
* Print a message via the library output printer - if enabled.
|
||||
*
|
||||
* @param *msg : Message to output.
|
||||
*
|
||||
*/
|
||||
OCSD_C_API void ocsd_def_errlog_msgout(const char *msg);
|
||||
|
||||
|
||||
/** @}*/
|
||||
|
||||
/** @name Packet to string interface
|
||||
|
||||
@{*/
|
||||
|
||||
/*!
|
||||
* Take a packet structure and render a string representation of the packet data.
|
||||
*
|
||||
* Returns a '0' terminated string of (buffer_size - 1) length or less.
|
||||
*
|
||||
* @param pkt_protocol : Packet protocol type - used to interpret the packet pointer
|
||||
* @param *p_pkt : pointer to a valid packet structure of protocol type. cast to void *.
|
||||
* @param *buffer : character buffer for string.
|
||||
* @param buffer_size : size of character buffer.
|
||||
*
|
||||
* @return ocsd_err_t : Library error code - RCDTL_OK if successful.
|
||||
*/
|
||||
OCSD_C_API ocsd_err_t ocsd_pkt_str(const ocsd_trace_protocol_t pkt_protocol, const void *p_pkt, char *buffer, const int buffer_size);
|
||||
|
||||
/*!
|
||||
* Get a string representation of the generic trace element.
|
||||
*
|
||||
* @param *p_pkt : pointer to valid generic element structure.
|
||||
* @param *buffer : character buffer for string.
|
||||
* @param buffer_size : size of character buffer.
|
||||
*
|
||||
* @return ocsd_err_t : Library error code - RCDTL_OK if successful.
|
||||
*/
|
||||
OCSD_C_API ocsd_err_t ocsd_gen_elem_str(const ocsd_generic_trace_elem *p_pkt, char *buffer, const int buffer_size);
|
||||
|
||||
|
||||
/*!
|
||||
* Init a generic element with type, clearing any flags etc.
|
||||
*/
|
||||
OCSD_C_API void ocsd_gen_elem_init(ocsd_generic_trace_elem *p_pkt, const ocsd_gen_trc_elem_t elem_type);
|
||||
|
||||
/** @}*/
|
||||
|
||||
/** @name Library packet and data printer control API
|
||||
@brief Allows client to use libraries packet and data printers to log packets etc rather than attach callbacks
|
||||
to packet output and use packet to string calls.
|
||||
@{*/
|
||||
|
||||
/*!
|
||||
* Set a raw frame printer on the trace frame demuxer. Allows inspection of raw trace data frames for debug.
|
||||
* Prints via the library default error logging mechanisms.
|
||||
*
|
||||
* The flags input determines the data printed. OR combination of one or both of:
|
||||
* OCSD_DFRMTR_PACKED_RAW_OUT : Output the undemuxed raw data frames.
|
||||
* OCSD_DFRMTR_UNPACKED_RAW_OUT : Output the raw data by trace ID after unpacking the frame.
|
||||
*
|
||||
* @param handle : Handle to decode tree.
|
||||
* @param flags : indicates type of raw frames to print.
|
||||
*
|
||||
* @return ocsd_err_t : Library error code - RCDTL_OK if successful.
|
||||
*/
|
||||
OCSD_C_API ocsd_err_t ocsd_dt_set_raw_frame_printer(const dcd_tree_handle_t handle, int flags);
|
||||
|
||||
/*!
|
||||
* Set a library printer on the generic element output of a full decoder.
|
||||
*
|
||||
* @param handle : Handle to decode tree.
|
||||
*
|
||||
* @return ocsd_err_t : Library error code - RCDTL_OK if successful.
|
||||
*/
|
||||
OCSD_C_API ocsd_err_t ocsd_dt_set_gen_elem_printer(const dcd_tree_handle_t handle);
|
||||
|
||||
/*!
|
||||
* Attach a library printer to the packet processor. May be attached to the main packet output, or the monitor
|
||||
* output if the main packet output is to be attached to a packet decoder in the datapath.
|
||||
*
|
||||
* @param handle : Handle to decode tree.
|
||||
* @param cs_id : Coresight trace ID for stream to print.
|
||||
* @param monitor: 0 to attach printer directly to datapath packet output, 1 to attach to packet monitor output
|
||||
*
|
||||
* @return ocsd_err_t : Library error code - RCDTL_OK if successful.
|
||||
*/
|
||||
OCSD_C_API ocsd_err_t ocsd_dt_set_pkt_protocol_printer(const dcd_tree_handle_t handle, uint8_t cs_id, int monitor);
|
||||
|
||||
/** @}*/
|
||||
|
||||
|
||||
/** @name Custom Decoder API functions
|
||||
|
||||
@{*/
|
||||
|
||||
/** Register a custom decoder with the library
|
||||
|
||||
@param *name : Name under which to register the decoder.
|
||||
@param *p_dcd_fact : Custom decoder factory structure.
|
||||
|
||||
@return ocsd_err_t : Library error code - RCDTL_OK if successful.
|
||||
*/
|
||||
OCSD_C_API ocsd_err_t ocsd_register_custom_decoder(const char *name, ocsd_extern_dcd_fact_t *p_dcd_fact);
|
||||
|
||||
/** Clear all registered decoders - library cleanup
|
||||
|
||||
@return ocsd_err_t : Library error code - RCDTL_OK if successful.
|
||||
*/
|
||||
OCSD_C_API ocsd_err_t ocsd_deregister_decoders(void);
|
||||
|
||||
/** Get a string representation of a custom protocol packet.
|
||||
|
||||
Specific function to extract the packet string for a custom protocol ID only. Custom IDs are allocated to decoder factories
|
||||
during the ocsd_register_custom_decoder() process.
|
||||
|
||||
This function is called by ocsd_pkt_str() when the incoming protocol is a custom ID.
|
||||
|
||||
@param pkt_protocol : Packet protocol type - must be in the custom ID range ( >= OCSD_PROTOCOL_CUSTOM_0, < OCSD_PROTOCOL_END)
|
||||
@param *p_pkt : pointer to a valid packet structure of protocol type. cast to void *.
|
||||
@param *buffer : character buffer for string.
|
||||
@param buffer_size : size of character buffer.
|
||||
|
||||
@return ocsd_err_t : Library error code - RCDTL_OK if successful, OCSD_ERR_NO_PROTOCOL if input ID not in custom range or not in use.
|
||||
*/
|
||||
OCSD_C_API ocsd_err_t ocsd_cust_protocol_to_str(const ocsd_trace_protocol_t pkt_protocol, const void *trc_pkt, char *buffer, const int buflen);
|
||||
|
||||
/** @}*/
|
||||
|
||||
|
||||
/** @}*/
|
||||
|
||||
#endif // ARM_OPENCSD_C_API_H_INCLUDED
|
||||
|
||||
/* End of File opencsd_c_api.h */
|
47
decoder/include/opencsd/etmv3/etmv3_decoder.h
Normal file
47
decoder/include/opencsd/etmv3/etmv3_decoder.h
Normal file
@ -0,0 +1,47 @@
|
||||
/*
|
||||
* \file etmv3_decoder.h
|
||||
* \brief OpenCSD : Top level header file for ETMv3 decoder
|
||||
*
|
||||
* \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef ARM_ETMV3_DECODER_H_INCLUDED
|
||||
#define ARM_ETMV3_DECODER_H_INCLUDED
|
||||
|
||||
#include "opencsd/etmv3/trc_cmp_cfg_etmv3.h"
|
||||
#include "opencsd/etmv3/trc_pkt_elem_etmv3.h"
|
||||
#include "opencsd/etmv3/trc_pkt_proc_etmv3.h"
|
||||
#include "opencsd/etmv3/trc_pkt_types_etmv3.h"
|
||||
#include "opencsd/etmv3/trc_pkt_decode_etmv3.h"
|
||||
|
||||
#endif // ARM_ETMV3_DECODER_H_INCLUDED
|
||||
|
||||
/* End of File etmv3_decoder.h */
|
235
decoder/include/opencsd/etmv3/trc_cmp_cfg_etmv3.h
Normal file
235
decoder/include/opencsd/etmv3/trc_cmp_cfg_etmv3.h
Normal file
@ -0,0 +1,235 @@
|
||||
/*
|
||||
* \file trc_cmp_cfg_etmv3.h
|
||||
* \brief OpenCSD :
|
||||
*
|
||||
* \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef ARM_TRC_CMP_CFG_ETMV3_H_INCLUDED
|
||||
#define ARM_TRC_CMP_CFG_ETMV3_H_INCLUDED
|
||||
|
||||
#include "trc_pkt_types_etmv3.h"
|
||||
#include "common/trc_cs_config.h"
|
||||
|
||||
|
||||
/** @addtogroup ocsd_protocol_cfg
|
||||
@{*/
|
||||
|
||||
/** @name ETMV3 configuration
|
||||
@{*/
|
||||
|
||||
|
||||
/*!
|
||||
* @class EtmV3Config
|
||||
* @brief Interpreter class for etm v3 config structure.
|
||||
*
|
||||
* Provides quick value interpretation methods for the ETMv3 config register values.
|
||||
* Primarily inlined for efficient code.
|
||||
*
|
||||
*/
|
||||
class EtmV3Config : public CSConfig
|
||||
{
|
||||
public:
|
||||
EtmV3Config(); /**< Default constructor */
|
||||
EtmV3Config(const ocsd_etmv3_cfg *cfg_regs);
|
||||
~EtmV3Config() {}; /**< Default destructor */
|
||||
|
||||
/* register bit constants. */
|
||||
static const uint32_t CTRL_DATAVAL = 0x4;
|
||||
static const uint32_t CTRL_DATAADDR = 0x8;
|
||||
static const uint32_t CTRL_CYCLEACC = 0x1000;
|
||||
static const uint32_t CTRL_DATAONLY = 0x100000;
|
||||
static const uint32_t CTRL_TS_ENA = (0x1 << 28);
|
||||
static const uint32_t CTRL_VMID_ENA = (0x1 << 30);
|
||||
|
||||
static const uint32_t CCER_HAS_TS = (0x1 << 22);
|
||||
static const uint32_t CCER_VIRTEXT = (0x1 << 26);
|
||||
static const uint32_t CCER_TS64BIT = (0x1 << 29);
|
||||
|
||||
static const uint32_t IDR_ALTBRANCH = 0x100000;
|
||||
|
||||
// operations to convert to and from C-API structure
|
||||
|
||||
//! copy assignment operator for C-API base structure into class.
|
||||
EtmV3Config & operator=(const ocsd_etmv3_cfg *p_cfg);
|
||||
|
||||
//! cast operator returning struct const reference
|
||||
operator const ocsd_etmv3_cfg &() const { return m_cfg; };
|
||||
//! cast operator returning struct const pointer
|
||||
operator const ocsd_etmv3_cfg *() const { return &m_cfg; };
|
||||
|
||||
//! combination enum to describe trace mode.
|
||||
enum EtmTraceMode {
|
||||
TM_INSTR_ONLY, //!< instruction only trace
|
||||
TM_I_DATA_VAL, //!< instruction + data value
|
||||
TM_I_DATA_ADDR, //!< instruction + data address
|
||||
TM_I_DATA_VAL_ADDR, //!< instr + data value + data address
|
||||
TM_DATAONLY_VAL, //!< data value trace
|
||||
TM_DATAONLY_ADDR, //!< data address trace
|
||||
TM_DATAONLY_VAL_ADDR //!< data value + address trace
|
||||
};
|
||||
|
||||
EtmTraceMode const GetTraceMode() const; //!< return trace mode
|
||||
|
||||
const bool isInstrTrace() const; //!< instruction trace present.
|
||||
const bool isDataValTrace() const; //!< data value trace present.
|
||||
const bool isDataAddrTrace() const; //!< data address trace present.
|
||||
const bool isDataTrace() const; //!< either or both data trace types present.
|
||||
|
||||
const bool isCycleAcc() const; //!< return true if cycle accurate tracing enabled.
|
||||
|
||||
const int MinorRev() const; //!< return X revision in 3.X
|
||||
|
||||
const bool isV7MArch() const; //!< source is V7M architecture
|
||||
const bool isAltBranch() const; //!< Alternate branch packet encoding used.
|
||||
|
||||
const int CtxtIDBytes() const; //!< number of context ID bytes traced 1,2,4;
|
||||
const bool hasVirtExt() const; //!< processor has virtualisation extensions.
|
||||
const bool isVMIDTrace() const; //!< VMID tracing enabled.
|
||||
|
||||
const bool hasTS() const; //!< Timestamps implemented in trace.
|
||||
const bool isTSEnabled() const; //!< Timestamp trace is enabled.
|
||||
const bool TSPkt64() const; //!< timestamp packet is 64 bits in size.
|
||||
|
||||
virtual const uint8_t getTraceID() const; //!< CoreSight Trace ID for this device.
|
||||
|
||||
const ocsd_arch_version_t getArchVersion() const; //!< architecture version
|
||||
const ocsd_core_profile_t getCoreProfile() const; //!< core profile.
|
||||
|
||||
private:
|
||||
ocsd_etmv3_cfg m_cfg;
|
||||
|
||||
};
|
||||
|
||||
|
||||
/* inlines for the bit interpretations */
|
||||
|
||||
inline EtmV3Config & EtmV3Config::operator=(const ocsd_etmv3_cfg *p_cfg)
|
||||
{
|
||||
m_cfg = *p_cfg;
|
||||
return *this;
|
||||
}
|
||||
|
||||
inline const bool EtmV3Config::isCycleAcc() const
|
||||
{
|
||||
return (bool)((m_cfg.reg_ctrl & CTRL_CYCLEACC) != 0);
|
||||
}
|
||||
|
||||
//! return X revision in 3.X
|
||||
inline const int EtmV3Config::MinorRev() const
|
||||
{
|
||||
return ((int)m_cfg.reg_idr & 0xF0) >> 4;
|
||||
}
|
||||
|
||||
inline const bool EtmV3Config::isInstrTrace() const
|
||||
{
|
||||
return (bool)((m_cfg.reg_ctrl & CTRL_DATAONLY) == 0);
|
||||
}
|
||||
|
||||
inline const bool EtmV3Config::isDataValTrace() const
|
||||
{
|
||||
return (bool)((m_cfg.reg_ctrl & CTRL_DATAVAL) != 0);
|
||||
}
|
||||
|
||||
inline const bool EtmV3Config::isDataAddrTrace() const
|
||||
{
|
||||
return (bool)((m_cfg.reg_ctrl & CTRL_DATAADDR) != 0);
|
||||
}
|
||||
|
||||
//! either or both data trace present
|
||||
inline const bool EtmV3Config::isDataTrace() const
|
||||
{
|
||||
return (bool)((m_cfg.reg_ctrl & (CTRL_DATAADDR | CTRL_DATAVAL)) != 0);
|
||||
}
|
||||
|
||||
inline const bool EtmV3Config::isV7MArch() const
|
||||
{
|
||||
return (bool)((m_cfg.arch_ver == ARCH_V7) && (m_cfg.core_prof == profile_CortexM));
|
||||
}
|
||||
|
||||
//! has alternate branch encoding
|
||||
inline const bool EtmV3Config::isAltBranch() const
|
||||
{
|
||||
return (bool)(((m_cfg.reg_idr & IDR_ALTBRANCH) != 0) && (MinorRev() >= 4));
|
||||
}
|
||||
|
||||
//! processor implements virtualisation extensions.
|
||||
inline const bool EtmV3Config::hasVirtExt() const
|
||||
{
|
||||
return (bool)((m_cfg.reg_ccer & CCER_VIRTEXT) != 0);
|
||||
}
|
||||
|
||||
//! TS packet is 64 bit.
|
||||
inline const bool EtmV3Config::TSPkt64() const
|
||||
{
|
||||
return (bool)((m_cfg.reg_ccer & CCER_TS64BIT) != 0);
|
||||
}
|
||||
|
||||
//! TS implemented.
|
||||
inline const bool EtmV3Config::hasTS() const
|
||||
{
|
||||
return (bool)((m_cfg.reg_ccer & CCER_HAS_TS) != 0);
|
||||
}
|
||||
|
||||
//! TS is enabled in the trace
|
||||
inline const bool EtmV3Config::isTSEnabled() const
|
||||
{
|
||||
return (bool)((m_cfg.reg_ctrl & CTRL_TS_ENA) != 0);
|
||||
}
|
||||
|
||||
//! tracing VMID
|
||||
inline const bool EtmV3Config::isVMIDTrace() const
|
||||
{
|
||||
return (bool)((m_cfg.reg_ctrl & CTRL_VMID_ENA) != 0);
|
||||
}
|
||||
|
||||
inline const uint8_t EtmV3Config::getTraceID() const
|
||||
{
|
||||
return (uint8_t)(m_cfg.reg_trc_id & 0x7F);
|
||||
}
|
||||
|
||||
inline const ocsd_arch_version_t EtmV3Config::getArchVersion() const
|
||||
{
|
||||
return m_cfg.arch_ver;
|
||||
}
|
||||
|
||||
inline const ocsd_core_profile_t EtmV3Config::getCoreProfile() const
|
||||
{
|
||||
return m_cfg.core_prof;
|
||||
}
|
||||
|
||||
/** @}*/
|
||||
|
||||
/** @}*/
|
||||
|
||||
#endif // ARM_TRC_CMP_CFG_ETMV3_H_INCLUDED
|
||||
|
||||
/* End of File trc_cmp_cfg_etmv3.h */
|
57
decoder/include/opencsd/etmv3/trc_dcd_mngr_etmv3.h
Normal file
57
decoder/include/opencsd/etmv3/trc_dcd_mngr_etmv3.h
Normal file
@ -0,0 +1,57 @@
|
||||
/*
|
||||
* \file trc_dcd_mngr_etmv3.h
|
||||
* \brief OpenCSD : ETMv3 decoder manager / handler specialisation
|
||||
*
|
||||
* \copyright Copyright (c) 2016, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
#ifndef ARM_TRC_DCD_MNGR_ETMV3_H_INCLUDED
|
||||
#define ARM_TRC_DCD_MNGR_ETMV3_H_INCLUDED
|
||||
|
||||
#include "common/ocsd_dcd_mngr.h"
|
||||
#include "trc_pkt_decode_etmv3.h"
|
||||
#include "trc_pkt_proc_etmv3.h"
|
||||
#include "trc_cmp_cfg_etmv3.h"
|
||||
#include "trc_pkt_types_etmv3.h"
|
||||
|
||||
class DecoderMngrEtmV3 : public DecodeMngrFullDcd< EtmV3TrcPacket,
|
||||
ocsd_etmv3_pkt_type,
|
||||
EtmV3Config,
|
||||
ocsd_etmv3_cfg,
|
||||
TrcPktProcEtmV3,
|
||||
TrcPktDecodeEtmV3>
|
||||
{
|
||||
public:
|
||||
DecoderMngrEtmV3(const std::string &name) : DecodeMngrFullDcd(name,OCSD_PROTOCOL_ETMV3) {};
|
||||
virtual ~DecoderMngrEtmV3() {};
|
||||
};
|
||||
|
||||
#endif // ARM_TRC_DCD_MNGR_ETMV3_H_INCLUDED
|
||||
|
||||
/* End of File trc_dcd_mngr_etmv3.h */
|
274
decoder/include/opencsd/etmv3/trc_pkt_decode_etmv3.h
Normal file
274
decoder/include/opencsd/etmv3/trc_pkt_decode_etmv3.h
Normal file
@ -0,0 +1,274 @@
|
||||
/*!
|
||||
* \file trc_pkt_decode_etmv3.h
|
||||
* \brief OpenCSD : ETMv3 decode
|
||||
*
|
||||
* \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef ARM_TRC_PKT_DECODE_ETMV3_H_INCLUDED
|
||||
#define ARM_TRC_PKT_DECODE_ETMV3_H_INCLUDED
|
||||
|
||||
#include "common/trc_pkt_decode_base.h"
|
||||
#include "common/trc_gen_elem.h"
|
||||
#include "common/ocsd_pe_context.h"
|
||||
#include "common/ocsd_code_follower.h"
|
||||
#include "common/ocsd_gen_elem_list.h"
|
||||
|
||||
#include "opencsd/etmv3/trc_pkt_elem_etmv3.h"
|
||||
#include "opencsd/etmv3/trc_cmp_cfg_etmv3.h"
|
||||
|
||||
/**************** Atom handling class **************************************/
|
||||
class Etmv3Atoms
|
||||
{
|
||||
public:
|
||||
Etmv3Atoms(const bool isCycleAcc);
|
||||
~Etmv3Atoms() {};
|
||||
|
||||
//! initialise the atom and index values
|
||||
void initAtomPkt(const EtmV3TrcPacket *in_pkt, const ocsd_trc_index_t &root_index);
|
||||
|
||||
const ocsd_atm_val getCurrAtomVal() const;
|
||||
const int numAtoms() const; //!< number of atoms
|
||||
const ocsd_trc_index_t pktIndex() const; //!< originating packet index
|
||||
|
||||
const bool hasAtomCC() const; //!< cycle count for current atom?
|
||||
const uint32_t getAtomCC() const; //!< cycle count for current atom
|
||||
const uint32_t getRemainCC() const; //!< get residual cycle count for remaining atoms
|
||||
|
||||
void clearAtom(); //!< clear the current atom, set the next.
|
||||
void clearAll(); //!< clear all
|
||||
|
||||
private:
|
||||
|
||||
// Atom PHDR packet formats from ETMv3 spec - defines content of header.
|
||||
enum {
|
||||
ATOM_PHDR_FMT_1 = 1,
|
||||
ATOM_PHDR_FMT_2,
|
||||
ATOM_PHDR_FMT_3,
|
||||
ATOM_PHDR_FMT_4,
|
||||
};
|
||||
|
||||
|
||||
|
||||
ocsd_pkt_atom m_atom; /**< atom elements - non zero number indicates valid atom count */
|
||||
uint8_t m_p_hdr_fmt; /**< if atom elements, associated phdr format */
|
||||
uint32_t m_cycle_count;
|
||||
ocsd_trc_index_t m_root_index; //!< root index for the atom packet
|
||||
bool m_isCCPacket;
|
||||
};
|
||||
|
||||
|
||||
inline Etmv3Atoms::Etmv3Atoms(const bool isCycleAcc)
|
||||
{
|
||||
m_isCCPacket = isCycleAcc;
|
||||
}
|
||||
|
||||
//! initialise the atom and index values
|
||||
inline void Etmv3Atoms::initAtomPkt(const EtmV3TrcPacket *in_pkt, const ocsd_trc_index_t &root_index)
|
||||
{
|
||||
m_atom = in_pkt->getAtom();
|
||||
m_p_hdr_fmt = in_pkt->getPHdrFmt();
|
||||
m_cycle_count = in_pkt->getCycleCount();
|
||||
}
|
||||
|
||||
inline const ocsd_atm_val Etmv3Atoms::getCurrAtomVal() const
|
||||
{
|
||||
return (m_atom.En_bits & 0x1) ? ATOM_E : ATOM_N;
|
||||
}
|
||||
|
||||
inline const int Etmv3Atoms::numAtoms() const
|
||||
{
|
||||
return m_atom.num;
|
||||
}
|
||||
|
||||
inline const ocsd_trc_index_t Etmv3Atoms::pktIndex() const
|
||||
{
|
||||
return m_root_index;
|
||||
}
|
||||
|
||||
inline const bool Etmv3Atoms::hasAtomCC() const
|
||||
{
|
||||
bool hasCC = false;
|
||||
if(!m_isCCPacket)
|
||||
return hasCC;
|
||||
|
||||
switch(m_p_hdr_fmt)
|
||||
{
|
||||
case ATOM_PHDR_FMT_4:
|
||||
default:
|
||||
break;
|
||||
|
||||
case ATOM_PHDR_FMT_3:
|
||||
case ATOM_PHDR_FMT_1:
|
||||
hasCC = true;
|
||||
break;
|
||||
|
||||
case ATOM_PHDR_FMT_2:
|
||||
hasCC = (m_atom.num > 1); // first of 2 has W state
|
||||
break;
|
||||
}
|
||||
return hasCC;
|
||||
}
|
||||
|
||||
inline const uint32_t Etmv3Atoms::getAtomCC() const
|
||||
{
|
||||
uint32_t CC = 0;
|
||||
if(!m_isCCPacket)
|
||||
return CC;
|
||||
|
||||
switch(m_p_hdr_fmt)
|
||||
{
|
||||
case ATOM_PHDR_FMT_4: // no CC in format 4
|
||||
default:
|
||||
break;
|
||||
|
||||
case ATOM_PHDR_FMT_3: // single CC with optional E atom
|
||||
CC = m_cycle_count;
|
||||
break;
|
||||
|
||||
case ATOM_PHDR_FMT_2: // single W on first of 2 atoms
|
||||
CC = (m_atom.num > 1) ? 1: 0;
|
||||
break;
|
||||
|
||||
case ATOM_PHDR_FMT_1: // each atom has 1 CC.
|
||||
CC = 1;
|
||||
break;
|
||||
}
|
||||
return CC;
|
||||
}
|
||||
|
||||
inline const uint32_t Etmv3Atoms::getRemainCC() const
|
||||
{
|
||||
uint32_t CC = 0;
|
||||
if(!m_isCCPacket)
|
||||
return CC;
|
||||
|
||||
switch(m_p_hdr_fmt)
|
||||
{
|
||||
case ATOM_PHDR_FMT_4: // no CC in format 4
|
||||
default:
|
||||
break;
|
||||
|
||||
case ATOM_PHDR_FMT_3:
|
||||
CC = m_cycle_count;
|
||||
break;
|
||||
|
||||
case ATOM_PHDR_FMT_2:
|
||||
CC = (m_atom.num > 1) ? 1: 0;
|
||||
break;
|
||||
|
||||
case ATOM_PHDR_FMT_1:
|
||||
CC = m_atom.num;
|
||||
break;
|
||||
}
|
||||
return CC;
|
||||
}
|
||||
|
||||
inline void Etmv3Atoms::clearAtom()
|
||||
{
|
||||
m_atom.En_bits >>=1;
|
||||
if(m_atom.num)
|
||||
m_atom.num--;
|
||||
}
|
||||
|
||||
inline void Etmv3Atoms::clearAll()
|
||||
{
|
||||
m_atom.num = 0;
|
||||
}
|
||||
|
||||
/********** Main decode class ****************************************************/
|
||||
class TrcPktDecodeEtmV3 : public TrcPktDecodeBase<EtmV3TrcPacket, EtmV3Config>
|
||||
{
|
||||
public:
|
||||
TrcPktDecodeEtmV3();
|
||||
TrcPktDecodeEtmV3(int instIDNum);
|
||||
virtual ~TrcPktDecodeEtmV3();
|
||||
|
||||
protected:
|
||||
/* implementation packet decoding interface */
|
||||
virtual ocsd_datapath_resp_t processPacket();
|
||||
virtual ocsd_datapath_resp_t onEOT();
|
||||
virtual ocsd_datapath_resp_t onReset();
|
||||
virtual ocsd_datapath_resp_t onFlush();
|
||||
virtual ocsd_err_t onProtocolConfig();
|
||||
virtual const uint8_t getCoreSightTraceID() { return m_CSID; };
|
||||
|
||||
/* local decode methods */
|
||||
void initDecoder(); //!< initial state on creation (zeros all config)
|
||||
void resetDecoder(); //!< reset state to start of decode. (moves state, retains config)
|
||||
|
||||
ocsd_datapath_resp_t decodePacket(bool &pktDone); //!< decode a packet
|
||||
|
||||
ocsd_datapath_resp_t processISync(const bool withCC, const bool firstSync = false);
|
||||
ocsd_datapath_resp_t processBranchAddr();
|
||||
ocsd_datapath_resp_t processPHdr();
|
||||
|
||||
ocsd_datapath_resp_t sendUnsyncPacket(); //!< send an initial unsync packet when decoder starts
|
||||
|
||||
OcsdTraceElement *GetNextOpElem(ocsd_datapath_resp_t &resp); //!< get the next element from the element list.
|
||||
|
||||
private:
|
||||
void setNeedAddr(bool bNeedAddr);
|
||||
void pendExceptionReturn();
|
||||
bool preISyncValid(ocsd_etmv3_pkt_type pkt_type);
|
||||
//** intra packet state;
|
||||
|
||||
OcsdCodeFollower m_code_follower; //!< code follower for instruction trace
|
||||
|
||||
ocsd_vaddr_t m_IAddr; //!< next instruction address
|
||||
bool m_bNeedAddr; //!< true if an address is needed (current out of date / invalid)
|
||||
bool m_bSentUnknown; //!< true if we have sent an unknown address packet for this phase of needing an address.
|
||||
bool m_bWaitISync; //!< true if waiting for first ISync packet
|
||||
|
||||
OcsdPeContext m_PeContext; //!< save context data before sending in output packet
|
||||
|
||||
OcsdGenElemList m_outputElemList; //!< list of output elements
|
||||
|
||||
|
||||
//** Other packet decoder state;
|
||||
|
||||
// trace decode FSM
|
||||
typedef enum {
|
||||
NO_SYNC, //!< pre start trace - init state or after reset or overflow, loss of sync.
|
||||
WAIT_ASYNC, //!< waiting for a-sync packet.
|
||||
WAIT_ISYNC, //!< waiting for i-sync packet.
|
||||
DECODE_PKTS, //!< processing a packet
|
||||
SEND_PKTS, //!< sending packets.
|
||||
} processor_state_t;
|
||||
|
||||
processor_state_t m_curr_state;
|
||||
|
||||
uint8_t m_CSID; //!< Coresight trace ID for this decoder.
|
||||
};
|
||||
|
||||
|
||||
#endif // ARM_TRC_PKT_DECODE_ETMV3_H_INCLUDED
|
||||
|
||||
/* End of File trc_pkt_decode_etmv3.h */
|
261
decoder/include/opencsd/etmv3/trc_pkt_elem_etmv3.h
Normal file
261
decoder/include/opencsd/etmv3/trc_pkt_elem_etmv3.h
Normal file
@ -0,0 +1,261 @@
|
||||
/*
|
||||
* \file trc_pkt_elem_etmv3.h
|
||||
* \brief OpenCSD :
|
||||
*
|
||||
* \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef ARM_TRC_PKT_ELEM_ETMV3_H_INCLUDED
|
||||
#define ARM_TRC_PKT_ELEM_ETMV3_H_INCLUDED
|
||||
|
||||
#include "trc_pkt_types_etmv3.h"
|
||||
#include "common/trc_printable_elem.h"
|
||||
#include "common/trc_pkt_elem_base.h"
|
||||
|
||||
/** @addtogroup trc_pkts
|
||||
@{*/
|
||||
|
||||
/*!
|
||||
* @class EtmV3TrcPacket
|
||||
* @brief ETMv3 Trace Protocol Packet.
|
||||
*
|
||||
* This class represents a single ETMv3 trace packet, along with intra packet state.
|
||||
*
|
||||
*/
|
||||
class EtmV3TrcPacket : public TrcPacketBase, public trcPrintableElem
|
||||
{
|
||||
public:
|
||||
EtmV3TrcPacket();
|
||||
~EtmV3TrcPacket();
|
||||
|
||||
// conversions between C-API struct and C++ object types
|
||||
// assign from C-API struct
|
||||
EtmV3TrcPacket &operator =(const ocsd_etmv3_pkt* p_pkt);
|
||||
|
||||
// allow const cast to C-API struct to pass C++ object
|
||||
operator const ocsd_etmv3_pkt*() const { return &m_pkt_data; };
|
||||
operator const ocsd_etmv3_pkt&() const { return m_pkt_data; };
|
||||
|
||||
// override c_pkt to pass out the packet data struct.
|
||||
virtual const void *c_pkt() const { return &m_pkt_data; };
|
||||
|
||||
// update interface - set packet values
|
||||
void Clear(); //!< clear update data in packet ready for new one.
|
||||
void ResetState(); //!< reset intra packet state data -on full decoder reset.
|
||||
|
||||
void SetType(const ocsd_etmv3_pkt_type p_type);
|
||||
void SetErrType(const ocsd_etmv3_pkt_type e_type);
|
||||
void UpdateAddress(const ocsd_vaddr_t partAddrVal, const int updateBits);
|
||||
void SetException( const ocsd_armv7_exception type,
|
||||
const uint16_t number,
|
||||
const bool cancel,
|
||||
const bool cm_type,
|
||||
const int irq_n = 0,
|
||||
const int resume = 0);
|
||||
void UpdateNS(const int NS);
|
||||
void UpdateAltISA(const int AltISA);
|
||||
void UpdateHyp(const int Hyp);
|
||||
void UpdateISA(const ocsd_isa isa);
|
||||
void UpdateContextID(const uint32_t contextID);
|
||||
void UpdateVMID(const uint8_t VMID);
|
||||
void UpdateTimestamp(const uint64_t tsVal, const uint8_t updateBits);
|
||||
|
||||
bool UpdateAtomFromPHdr(const uint8_t pHdr, const bool cycleAccurate); //!< Interpret P Hdr, return true if valid, false if not.
|
||||
|
||||
void SetDataOOOTag(const uint8_t tag);
|
||||
void SetDataValue(const uint32_t value);
|
||||
void UpdateDataAddress(const uint32_t value, const uint8_t valid_bits);
|
||||
void UpdateDataEndian(const uint8_t BE_Val);
|
||||
void SetCycleCount(const uint32_t cycleCount);
|
||||
void SetISyncReason(const ocsd_iSync_reason reason);
|
||||
void SetISyncHasCC();
|
||||
void SetISyncIsLSiP();
|
||||
void SetISyncNoAddr();
|
||||
|
||||
// packet status interface - get packet info.
|
||||
const ocsd_etmv3_pkt_type getType() const { return m_pkt_data.type; };
|
||||
const bool isBadPacket() const;
|
||||
|
||||
const int AltISA() const { return m_pkt_data.context.curr_alt_isa; };
|
||||
const ocsd_isa ISA() const { return m_pkt_data.curr_isa; };
|
||||
const bool changedISA() const { return m_pkt_data.curr_isa != m_pkt_data.prev_isa; };
|
||||
|
||||
// any of the context elements updated?
|
||||
const bool isCtxtUpdated() const;
|
||||
const bool isCtxtFlagsUpdated() const { return (m_pkt_data.context.updated == 1); };
|
||||
const bool isNS() const { return m_pkt_data.context.curr_NS; };
|
||||
const bool isHyp() const { return m_pkt_data.context.curr_Hyp; };
|
||||
|
||||
const bool isCtxtIDUpdated() const { return (m_pkt_data.context.updated_c == 1); }
|
||||
const uint32_t getCtxtID() const { return m_pkt_data.context.ctxtID; };
|
||||
const bool isVMIDUpdated() const { return (m_pkt_data.context.updated_v == 1); }
|
||||
const uint32_t getVMID() const { return m_pkt_data.context.VMID; };
|
||||
|
||||
const uint32_t getCycleCount() const { return m_pkt_data.cycle_count; };
|
||||
const uint64_t getTS() const { return m_pkt_data.timestamp; };
|
||||
|
||||
const bool isExcepPkt() const { return (m_pkt_data.exception.bits.present == 1); };
|
||||
const ocsd_armv7_exception excepType() const { return m_pkt_data.exception.type; };
|
||||
const uint16_t excepNum() const { return m_pkt_data.exception.number; };
|
||||
const bool isExcepCancel() const { return (m_pkt_data.exception.bits.present == 1) && (m_pkt_data.exception.bits.cancel == 1); };
|
||||
|
||||
const ocsd_iSync_reason getISyncReason() const { return m_pkt_data.isync_info.reason; };
|
||||
const bool getISyncHasCC() const { return m_pkt_data.isync_info.has_cycle_count; };
|
||||
const bool getISyncIsLSiPAddr() const { return m_pkt_data.isync_info.has_LSipAddress; };
|
||||
const bool getISyncNoAddr() const { return m_pkt_data.isync_info.no_address; };
|
||||
|
||||
const ocsd_vaddr_t getAddr() const { return m_pkt_data.addr.val; };
|
||||
const ocsd_vaddr_t getDataAddr() const { return m_pkt_data.data.addr.val; };
|
||||
|
||||
const ocsd_pkt_atom &getAtom() const { return m_pkt_data.atom; };
|
||||
const uint8_t getPHdrFmt() const { return m_pkt_data.p_hdr_fmt; };
|
||||
|
||||
|
||||
// printing
|
||||
virtual void toString(std::string &str) const;
|
||||
virtual void toStringFmt(const uint32_t fmtFlags, std::string &str) const;
|
||||
|
||||
private:
|
||||
const char *packetTypeName(const ocsd_etmv3_pkt_type type, const char **ppDesc) const;
|
||||
void getBranchAddressStr(std::string &valStr) const;
|
||||
void getAtomStr(std::string &valStr) const;
|
||||
void getISyncStr(std::string &valStr) const;
|
||||
void getISAStr(std::string &isaStr) const;
|
||||
void getExcepStr(std::string &excepStr) const;
|
||||
|
||||
ocsd_etmv3_pkt m_pkt_data;
|
||||
};
|
||||
|
||||
inline void EtmV3TrcPacket::UpdateNS(const int NS)
|
||||
{
|
||||
m_pkt_data.context.curr_NS = NS;
|
||||
m_pkt_data.context.updated = 1;
|
||||
};
|
||||
|
||||
inline void EtmV3TrcPacket::UpdateAltISA(const int AltISA)
|
||||
{
|
||||
m_pkt_data.context.curr_alt_isa = AltISA;
|
||||
m_pkt_data.context.updated = 1;
|
||||
}
|
||||
|
||||
inline void EtmV3TrcPacket::UpdateHyp(const int Hyp)
|
||||
{
|
||||
m_pkt_data.context.curr_Hyp = Hyp;
|
||||
m_pkt_data.context.updated = 1;
|
||||
}
|
||||
|
||||
inline void EtmV3TrcPacket::UpdateISA(const ocsd_isa isa)
|
||||
{
|
||||
m_pkt_data.prev_isa = m_pkt_data.curr_isa;
|
||||
m_pkt_data.curr_isa = isa;
|
||||
}
|
||||
|
||||
inline void EtmV3TrcPacket::SetType(const ocsd_etmv3_pkt_type p_type)
|
||||
{
|
||||
m_pkt_data.type = p_type;
|
||||
}
|
||||
|
||||
inline void EtmV3TrcPacket::SetErrType(const ocsd_etmv3_pkt_type e_type)
|
||||
{
|
||||
m_pkt_data.err_type = m_pkt_data.type;
|
||||
m_pkt_data.type = e_type;
|
||||
}
|
||||
|
||||
inline const bool EtmV3TrcPacket::isBadPacket() const
|
||||
{
|
||||
return (m_pkt_data.type >= ETM3_PKT_BAD_SEQUENCE);
|
||||
}
|
||||
|
||||
inline void EtmV3TrcPacket::SetDataOOOTag(const uint8_t tag)
|
||||
{
|
||||
m_pkt_data.data.ooo_tag = tag;
|
||||
}
|
||||
|
||||
inline void EtmV3TrcPacket::SetDataValue(const uint32_t value)
|
||||
{
|
||||
m_pkt_data.data.value = value;
|
||||
m_pkt_data.data.update_dval = 1;
|
||||
}
|
||||
|
||||
inline void EtmV3TrcPacket::UpdateContextID(const uint32_t contextID)
|
||||
{
|
||||
m_pkt_data.context.updated_c = 1;
|
||||
m_pkt_data.context.ctxtID = contextID;
|
||||
}
|
||||
|
||||
inline void EtmV3TrcPacket::UpdateVMID(const uint8_t VMID)
|
||||
{
|
||||
m_pkt_data.context.updated_v = 1;
|
||||
m_pkt_data.context.VMID = VMID;
|
||||
}
|
||||
|
||||
inline void EtmV3TrcPacket::UpdateDataEndian(const uint8_t BE_Val)
|
||||
{
|
||||
m_pkt_data.data.be = BE_Val;
|
||||
m_pkt_data.data.update_be = 1;
|
||||
}
|
||||
|
||||
inline void EtmV3TrcPacket::SetCycleCount(const uint32_t cycleCount)
|
||||
{
|
||||
m_pkt_data.cycle_count = cycleCount;
|
||||
}
|
||||
|
||||
inline void EtmV3TrcPacket::SetISyncReason(const ocsd_iSync_reason reason)
|
||||
{
|
||||
m_pkt_data.isync_info.reason = reason;
|
||||
}
|
||||
|
||||
inline void EtmV3TrcPacket::SetISyncHasCC()
|
||||
{
|
||||
m_pkt_data.isync_info.has_cycle_count = 1;
|
||||
}
|
||||
|
||||
inline void EtmV3TrcPacket::SetISyncIsLSiP()
|
||||
{
|
||||
m_pkt_data.isync_info.has_LSipAddress = 1;
|
||||
}
|
||||
|
||||
inline void EtmV3TrcPacket::SetISyncNoAddr()
|
||||
{
|
||||
m_pkt_data.isync_info.no_address = 1;
|
||||
}
|
||||
|
||||
inline const bool EtmV3TrcPacket::isCtxtUpdated() const
|
||||
{
|
||||
return (m_pkt_data.context.updated_v == 1) ||
|
||||
(m_pkt_data.context.updated == 1) ||
|
||||
(m_pkt_data.context.updated_c == 1);
|
||||
}
|
||||
|
||||
/** @}*/
|
||||
#endif // ARM_TRC_PKT_ELEM_ETMV3_H_INCLUDED
|
||||
|
||||
/* End of File trc_pkt_elem_etmv3.h */
|
81
decoder/include/opencsd/etmv3/trc_pkt_proc_etmv3.h
Normal file
81
decoder/include/opencsd/etmv3/trc_pkt_proc_etmv3.h
Normal file
@ -0,0 +1,81 @@
|
||||
/*
|
||||
* \file trc_pkt_proc_etmv3.h
|
||||
* \brief OpenCSD :
|
||||
*
|
||||
* \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef ARM_TRC_PKT_PROC_ETMV3_H_INCLUDED
|
||||
#define ARM_TRC_PKT_PROC_ETMV3_H_INCLUDED
|
||||
|
||||
#include "trc_pkt_types_etmv3.h"
|
||||
#include "common/trc_pkt_proc_base.h"
|
||||
|
||||
class EtmV3PktProcImpl;
|
||||
class EtmV3TrcPacket;
|
||||
class EtmV3Config;
|
||||
|
||||
/** @addtogroup ocsd_pkt_proc
|
||||
@{*/
|
||||
|
||||
|
||||
class TrcPktProcEtmV3 : public TrcPktProcBase< EtmV3TrcPacket, ocsd_etmv3_pkt_type, EtmV3Config>
|
||||
{
|
||||
public:
|
||||
TrcPktProcEtmV3();
|
||||
TrcPktProcEtmV3(int instIDNum);
|
||||
virtual ~TrcPktProcEtmV3();
|
||||
|
||||
protected:
|
||||
/* implementation packet processing interface */
|
||||
virtual ocsd_datapath_resp_t processData( const ocsd_trc_index_t index,
|
||||
const uint32_t dataBlockSize,
|
||||
const uint8_t *pDataBlock,
|
||||
uint32_t *numBytesProcessed);
|
||||
virtual ocsd_datapath_resp_t onEOT();
|
||||
virtual ocsd_datapath_resp_t onReset();
|
||||
virtual ocsd_datapath_resp_t onFlush();
|
||||
virtual ocsd_err_t onProtocolConfig();
|
||||
virtual const bool isBadPacket() const;
|
||||
|
||||
friend class EtmV3PktProcImpl;
|
||||
|
||||
EtmV3PktProcImpl *m_pProcessor;
|
||||
};
|
||||
|
||||
|
||||
#define ETMV3_OPFLG_UNFORMATTED_SOURCE 0x00010000 /**< Single ETM source from bypassed formatter - need to check for EOT markers */
|
||||
|
||||
/** @}*/
|
||||
|
||||
#endif // ARM_TRC_PKT_PROC_ETMV3_H_INCLUDED
|
||||
|
||||
/* End of File trc_pkt_proc_etm.h */
|
178
decoder/include/opencsd/etmv3/trc_pkt_types_etmv3.h
Normal file
178
decoder/include/opencsd/etmv3/trc_pkt_types_etmv3.h
Normal file
@ -0,0 +1,178 @@
|
||||
/*
|
||||
* \file trc_pkt_types_etmv3.h
|
||||
* \brief OpenCSD :
|
||||
*
|
||||
* \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef ARM_TRC_ETM3_PKT_TYPES_ETMV3_H_INCLUDED
|
||||
#define ARM_TRC_ETM3_PKT_TYPES_ETMV3_H_INCLUDED
|
||||
|
||||
#include "opencsd/trc_pkt_types.h"
|
||||
|
||||
/** @addtogroup trc_pkts
|
||||
@{*/
|
||||
|
||||
/** @name ETMv3 Packet Types
|
||||
@{*/
|
||||
|
||||
typedef enum _ocsd_etmv3_pkt_type
|
||||
{
|
||||
|
||||
// markers for unknown packets
|
||||
ETM3_PKT_NOERROR, //!< no error in packet - supplimentary data.
|
||||
ETM3_PKT_NOTSYNC, //!< no sync found yet
|
||||
ETM3_PKT_INCOMPLETE_EOT, //!< flushing incomplete/empty packet at end of trace.
|
||||
|
||||
// markers for valid packets
|
||||
ETM3_PKT_BRANCH_ADDRESS,
|
||||
ETM3_PKT_A_SYNC,
|
||||
ETM3_PKT_CYCLE_COUNT,
|
||||
ETM3_PKT_I_SYNC,
|
||||
ETM3_PKT_I_SYNC_CYCLE,
|
||||
ETM3_PKT_TRIGGER,
|
||||
ETM3_PKT_P_HDR,
|
||||
ETM3_PKT_STORE_FAIL,
|
||||
ETM3_PKT_OOO_DATA,
|
||||
ETM3_PKT_OOO_ADDR_PLC,
|
||||
ETM3_PKT_NORM_DATA,
|
||||
ETM3_PKT_DATA_SUPPRESSED,
|
||||
ETM3_PKT_VAL_NOT_TRACED,
|
||||
ETM3_PKT_IGNORE,
|
||||
ETM3_PKT_CONTEXT_ID,
|
||||
ETM3_PKT_VMID,
|
||||
ETM3_PKT_EXCEPTION_ENTRY,
|
||||
ETM3_PKT_EXCEPTION_EXIT,
|
||||
ETM3_PKT_TIMESTAMP,
|
||||
|
||||
// internal processing types
|
||||
ETM3_PKT_BRANCH_OR_BYPASS_EOT,
|
||||
|
||||
// packet errors
|
||||
ETM3_PKT_BAD_SEQUENCE, //!< invalid sequence for packet type
|
||||
ETM3_PKT_BAD_TRACEMODE, //!< invalid packet type for this trace mode.
|
||||
ETM3_PKT_RESERVED //!< packet type reserved.
|
||||
|
||||
} ocsd_etmv3_pkt_type;
|
||||
|
||||
typedef struct _ocsd_etmv3_excep {
|
||||
ocsd_armv7_exception type; /**< exception type. */
|
||||
uint16_t number; /**< exception as number */
|
||||
struct {
|
||||
uint32_t present:1; /**< exception present in packet */
|
||||
uint32_t cancel:1; /**< exception cancels prev instruction traced. */
|
||||
uint32_t cm_type:1;
|
||||
uint32_t cm_resume:4; /**< M class resume code */
|
||||
uint32_t cm_irq_n:9; /**< M class IRQ n */
|
||||
} bits;
|
||||
} ocsd_etmv3_excep;
|
||||
|
||||
typedef struct _etmv3_context_t {
|
||||
struct {
|
||||
uint32_t curr_alt_isa:1; /**< current Alt ISA flag for Tee / T32 (used if not in present packet) */
|
||||
uint32_t curr_NS:1; /**< current NS flag (used if not in present packet) */
|
||||
uint32_t curr_Hyp:1; /**< current Hyp flag (used if not in present packet) */
|
||||
uint32_t updated:1; /**< context updated */
|
||||
uint32_t updated_c:1; /**< updated CtxtID */
|
||||
uint32_t updated_v:1; /**< updated VMID */
|
||||
};
|
||||
uint32_t ctxtID; /**< Context ID */
|
||||
uint8_t VMID; /**< VMID */
|
||||
} etmv3_context_t;
|
||||
|
||||
|
||||
typedef struct _etmv3_data_t {
|
||||
|
||||
uint32_t value; /**< Data value */
|
||||
ocsd_pkt_vaddr addr; /**< current data address */
|
||||
|
||||
struct {
|
||||
uint32_t ooo_tag:2; /**< Out of order data tag. */
|
||||
uint32_t be:1; /**< data transfers big-endian */
|
||||
uint32_t update_be:1; /**< updated Be flag */
|
||||
uint32_t update_addr:1; /**< updated address */
|
||||
uint32_t update_dval:1; /**< updated data value */
|
||||
};
|
||||
} etmv3_data_t;
|
||||
|
||||
typedef struct _etmv3_isync_t {
|
||||
ocsd_iSync_reason reason;
|
||||
struct {
|
||||
uint32_t has_cycle_count:1; /**< updated cycle count */
|
||||
uint32_t has_LSipAddress:1; /**< main address is load-store instuction, data address is overlapping instruction @ start of trace */
|
||||
uint32_t no_address:1; /**< data only ISync */
|
||||
};
|
||||
} etmv3_isync_t;
|
||||
|
||||
typedef struct _ocsd_etmv3_pkt
|
||||
{
|
||||
ocsd_etmv3_pkt_type type; /**< Primary packet type. */
|
||||
|
||||
ocsd_isa curr_isa; /**< current ISA */
|
||||
ocsd_isa prev_isa; /**< ISA in previous packet */
|
||||
|
||||
etmv3_context_t context; /**< current context */
|
||||
ocsd_pkt_vaddr addr; /**< current Addr */
|
||||
|
||||
etmv3_isync_t isync_info;
|
||||
|
||||
ocsd_etmv3_excep exception;
|
||||
|
||||
ocsd_pkt_atom atom; /**< atom elements - non zerom number indicates valid atom count */
|
||||
uint8_t p_hdr_fmt; /**< if atom elements, associated phdr format */
|
||||
uint32_t cycle_count; /**< cycle count associated with this packet (ETMv3 has counts in atom packets and as individual packets */
|
||||
|
||||
uint64_t timestamp; /**< current timestamp value */
|
||||
uint8_t ts_update_bits; /**< bits of ts updated this packet (if TS packet) */
|
||||
|
||||
etmv3_data_t data; /**< data transfer values */
|
||||
|
||||
ocsd_etmv3_pkt_type err_type; /**< Basic packet type if primary type indicates error or incomplete. (header type) */
|
||||
|
||||
} ocsd_etmv3_pkt;
|
||||
|
||||
typedef struct _ocsd_etmv3_cfg
|
||||
{
|
||||
uint32_t reg_idr; /**< ID register */
|
||||
uint32_t reg_ctrl; /**< Control Register */
|
||||
uint32_t reg_ccer; /**< CCER register */
|
||||
uint32_t reg_trc_id; /**< Trace Stream ID register */
|
||||
ocsd_arch_version_t arch_ver; /**< Architecture version */
|
||||
ocsd_core_profile_t core_prof; /**< Core Profile */
|
||||
} ocsd_etmv3_cfg;
|
||||
|
||||
|
||||
#define DATA_ADDR_EXPECTED_FLAG 0x20 /**< Bit set for data trace headers if data address packets follow */
|
||||
|
||||
/** @}*/
|
||||
/** @}*/
|
||||
#endif // ARM_TRC_ETM3_PKT_TYPES_ETMV3_H_INCLUDED
|
||||
|
||||
/* End of File trc_pkt_types_etmv3.h */
|
48
decoder/include/opencsd/etmv4/etmv4_decoder.h
Normal file
48
decoder/include/opencsd/etmv4/etmv4_decoder.h
Normal file
@ -0,0 +1,48 @@
|
||||
/*
|
||||
* \file etmv4_decoder.h
|
||||
* \brief OpenCSD : Top level header file for ETMv4 decoders
|
||||
*
|
||||
* \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef ARM_ETMV4_DECODER_H_INCLUDED
|
||||
#define ARM_ETMV4_DECODER_H_INCLUDED
|
||||
|
||||
#include "trc_cmp_cfg_etmv4.h"
|
||||
#include "trc_pkt_elem_etmv4i.h"
|
||||
#include "trc_pkt_elem_etmv4d.h"
|
||||
#include "trc_pkt_proc_etmv4.h"
|
||||
#include "trc_pkt_types_etmv4.h"
|
||||
#include "trc_pkt_decode_etmv4i.h"
|
||||
|
||||
#endif // ARM_ETMV4_DECODER_H_INCLUDED
|
||||
|
||||
/* End of File etmv4_decoder.h */
|
449
decoder/include/opencsd/etmv4/trc_cmp_cfg_etmv4.h
Normal file
449
decoder/include/opencsd/etmv4/trc_cmp_cfg_etmv4.h
Normal file
@ -0,0 +1,449 @@
|
||||
/*
|
||||
* \file trc_cmp_cfg_etmv4.h
|
||||
* \brief OpenCSD :
|
||||
*
|
||||
* \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef ARM_TRC_CMP_CFG_ETMV4_H_INCLUDED
|
||||
#define ARM_TRC_CMP_CFG_ETMV4_H_INCLUDED
|
||||
|
||||
#include "trc_pkt_types_etmv4.h"
|
||||
#include "common/trc_cs_config.h"
|
||||
|
||||
|
||||
/** @addtogroup ocsd_protocol_cfg
|
||||
@{*/
|
||||
|
||||
/** @name ETMv4 configuration
|
||||
@{*/
|
||||
|
||||
/*!
|
||||
* @class EtmV4Config
|
||||
* @brief Interpreter class for etm v4 config structure.
|
||||
*
|
||||
* Provides quick value interpretation methods for the ETMv4 config register values.
|
||||
* Primarily inlined for efficient code.
|
||||
*/
|
||||
class EtmV4Config : public CSConfig // public ocsd_etmv4_cfg
|
||||
{
|
||||
public:
|
||||
EtmV4Config(); /**< Default constructor */
|
||||
EtmV4Config(const ocsd_etmv4_cfg *cfg_regs);
|
||||
~EtmV4Config() {}; /**< Default destructor */
|
||||
|
||||
// operations to convert to and from C-API structure
|
||||
|
||||
//! copy assignment operator for base structure into class.
|
||||
EtmV4Config & operator=(const ocsd_etmv4_cfg *p_cfg);
|
||||
|
||||
//! cast operator returning struct const reference
|
||||
operator const ocsd_etmv4_cfg &() const { return m_cfg; };
|
||||
//! cast operator returning struct const pointer
|
||||
operator const ocsd_etmv4_cfg *() const { return &m_cfg; };
|
||||
|
||||
const ocsd_core_profile_t &coreProfile() const { return m_cfg.core_prof; };
|
||||
const ocsd_arch_version_t &archVersion() const { return m_cfg.arch_ver; };
|
||||
|
||||
/* idr 0 */
|
||||
const bool LSasInstP0() const;
|
||||
const bool hasDataTrace() const;
|
||||
const bool hasBranchBroadcast() const;
|
||||
const bool hasCondTrace() const;
|
||||
const bool hasCycleCountI() const;
|
||||
const bool hasRetStack() const;
|
||||
const uint8_t numEvents() const;
|
||||
|
||||
typedef enum _condType {
|
||||
COND_PASS_FAIL,
|
||||
COND_HAS_ASPR
|
||||
} condType;
|
||||
|
||||
const condType hasCondType() const;
|
||||
|
||||
typedef enum _QSuppType {
|
||||
Q_NONE,
|
||||
Q_ICOUNT_ONLY,
|
||||
Q_NO_ICOUNT_ONLY,
|
||||
Q_FULL
|
||||
} QSuppType;
|
||||
|
||||
const QSuppType getQSuppType();
|
||||
const bool hasQElem();
|
||||
const bool hasQFilter();
|
||||
|
||||
const bool hasTrcExcpData() const;
|
||||
const uint32_t TimeStampSize() const;
|
||||
|
||||
const bool commitOpt1() const;
|
||||
|
||||
/* idr 1 */
|
||||
const uint8_t MajVersion() const;
|
||||
const uint8_t MinVersion() const;
|
||||
|
||||
/* idr 2 */
|
||||
const uint32_t iaSizeMax() const;
|
||||
const uint32_t cidSize() const;
|
||||
const uint32_t vmidSize();
|
||||
const uint32_t daSize() const;
|
||||
const uint32_t dvSize() const;
|
||||
const uint32_t ccSize() const;
|
||||
const bool vmidOpt() const;
|
||||
|
||||
/* id regs 8-13*/
|
||||
const uint32_t MaxSpecDepth() const;
|
||||
const uint32_t P0_Key_Max() const;
|
||||
const uint32_t P1_Key_Max() const;
|
||||
const uint32_t P1_Spcl_Key_Max() const;
|
||||
const uint32_t CondKeyMax() const;
|
||||
const uint32_t CondSpecKeyMax() const;
|
||||
const uint32_t CondKeyMaxIncr() const;
|
||||
|
||||
/* trace idr */
|
||||
virtual const uint8_t getTraceID() const; //!< CoreSight Trace ID for this device.
|
||||
|
||||
/* config R */
|
||||
const bool enabledDVTrace() const;
|
||||
const bool enabledDATrace() const;
|
||||
const bool enabledDataTrace() const;
|
||||
|
||||
typedef enum {
|
||||
LSP0_NONE,
|
||||
LSP0_L,
|
||||
LSP0_S,
|
||||
LSP0_LS
|
||||
} LSP0_t;
|
||||
|
||||
const bool enabledLSP0Trace() const;
|
||||
const LSP0_t LSP0Type() const;
|
||||
|
||||
const bool enabledBrBroad() const;
|
||||
const bool enabledCCI() const;
|
||||
const bool enabledCID() const;
|
||||
const bool enabledVMID() const;
|
||||
|
||||
typedef enum {
|
||||
COND_TR_DIS,
|
||||
COND_TR_LD,
|
||||
COND_TR_ST,
|
||||
COND_TR_LDST,
|
||||
COND_TR_ALL
|
||||
} CondITrace_t;
|
||||
|
||||
const CondITrace_t enabledCondITrace();
|
||||
|
||||
const bool enabledTS() const;
|
||||
const bool enabledRetStack() const;
|
||||
|
||||
const bool enabledQE() const;
|
||||
|
||||
private:
|
||||
void PrivateInit();
|
||||
void CalcQSupp();
|
||||
void CalcVMIDSize();
|
||||
|
||||
bool m_QSuppCalc;
|
||||
bool m_QSuppFilter;
|
||||
QSuppType m_QSuppType;
|
||||
|
||||
bool m_VMIDSzCalc;
|
||||
uint32_t m_VMIDSize;
|
||||
|
||||
bool m_condTraceCalc;
|
||||
CondITrace_t m_CondTrace;
|
||||
|
||||
ocsd_etmv4_cfg m_cfg;
|
||||
};
|
||||
|
||||
/* idr 0 */
|
||||
inline const bool EtmV4Config::LSasInstP0() const
|
||||
{
|
||||
return (bool)((m_cfg.reg_idr0 & 0x6) == 0x6);
|
||||
}
|
||||
|
||||
inline const bool EtmV4Config::hasDataTrace() const
|
||||
{
|
||||
return (bool)((m_cfg.reg_idr0 & 0x18) == 0x18);
|
||||
}
|
||||
|
||||
inline const bool EtmV4Config::hasBranchBroadcast() const
|
||||
{
|
||||
return (bool)((m_cfg.reg_idr0 & 0x20) == 0x20);
|
||||
}
|
||||
|
||||
inline const bool EtmV4Config::hasCondTrace() const
|
||||
{
|
||||
return (bool)((m_cfg.reg_idr0 & 0x40) == 0x40);
|
||||
}
|
||||
|
||||
inline const bool EtmV4Config::hasCycleCountI() const
|
||||
{
|
||||
return (bool)((m_cfg.reg_idr0 & 0x80) == 0x80);
|
||||
}
|
||||
|
||||
inline const bool EtmV4Config::hasRetStack() const
|
||||
{
|
||||
return (bool)((m_cfg.reg_idr0 & 0x200) == 0x200);
|
||||
}
|
||||
|
||||
inline const uint8_t EtmV4Config::numEvents() const
|
||||
{
|
||||
return ((m_cfg.reg_idr0 >> 10) & 0x3) + 1;
|
||||
}
|
||||
|
||||
inline const EtmV4Config::condType EtmV4Config::hasCondType() const
|
||||
{
|
||||
return ((m_cfg.reg_idr0 & 0x3000) == 0x1000) ? EtmV4Config::COND_HAS_ASPR : EtmV4Config::COND_PASS_FAIL;
|
||||
}
|
||||
|
||||
inline const EtmV4Config::QSuppType EtmV4Config::getQSuppType()
|
||||
{
|
||||
if(!m_QSuppCalc) CalcQSupp();
|
||||
return m_QSuppType;
|
||||
}
|
||||
|
||||
inline const bool EtmV4Config::hasQElem()
|
||||
{
|
||||
if(!m_QSuppCalc) CalcQSupp();
|
||||
return (bool)(m_QSuppType != Q_NONE);
|
||||
}
|
||||
|
||||
inline const bool EtmV4Config::hasQFilter()
|
||||
{
|
||||
if(!m_QSuppCalc) CalcQSupp();
|
||||
return m_QSuppFilter;
|
||||
}
|
||||
|
||||
inline const bool EtmV4Config::hasTrcExcpData() const
|
||||
{
|
||||
return (bool)((m_cfg.reg_idr0 & 0x20000) == 0x20000);
|
||||
}
|
||||
|
||||
inline const uint32_t EtmV4Config::TimeStampSize() const
|
||||
{
|
||||
uint32_t tsSizeF = (m_cfg.reg_idr0 >> 24) & 0x1F;
|
||||
if(tsSizeF == 0x6)
|
||||
return 48;
|
||||
if(tsSizeF == 0x8)
|
||||
return 64;
|
||||
return 0;
|
||||
}
|
||||
|
||||
inline const bool EtmV4Config::commitOpt1() const
|
||||
{
|
||||
return (bool)((m_cfg.reg_idr0 & 0x20000000) == 0x20000000) && hasCycleCountI();
|
||||
}
|
||||
|
||||
/* idr 1 */
|
||||
inline const uint8_t EtmV4Config::MajVersion() const
|
||||
{
|
||||
return (uint8_t)((m_cfg.reg_idr1 >> 8) & 0xF);
|
||||
}
|
||||
|
||||
inline const uint8_t EtmV4Config::MinVersion() const
|
||||
{
|
||||
return (uint8_t)((m_cfg.reg_idr1 >> 4) & 0xF);
|
||||
}
|
||||
|
||||
|
||||
/* idr 2 */
|
||||
inline const uint32_t EtmV4Config::iaSizeMax() const
|
||||
{
|
||||
return ((m_cfg.reg_idr2 & 0x1F) == 0x8) ? 64 : 32;
|
||||
}
|
||||
|
||||
inline const uint32_t EtmV4Config::cidSize() const
|
||||
{
|
||||
return (((m_cfg.reg_idr2 >> 5) & 0x1F) == 0x4) ? 32 : 0;
|
||||
}
|
||||
|
||||
inline const uint32_t EtmV4Config::vmidSize()
|
||||
{
|
||||
if(!m_VMIDSzCalc)
|
||||
{
|
||||
CalcVMIDSize();
|
||||
}
|
||||
return m_VMIDSize;
|
||||
}
|
||||
|
||||
inline const uint32_t EtmV4Config::daSize() const
|
||||
{
|
||||
uint32_t daSizeF = ((m_cfg.reg_idr2 >> 15) & 0x1F);
|
||||
if(daSizeF)
|
||||
return (((m_cfg.reg_idr2 >> 15) & 0x1F) == 0x8) ? 64 : 32;
|
||||
return 0;
|
||||
}
|
||||
|
||||
inline const uint32_t EtmV4Config::dvSize() const
|
||||
{
|
||||
uint32_t dvSizeF = ((m_cfg.reg_idr2 >> 20) & 0x1F);
|
||||
if(dvSizeF)
|
||||
return (((m_cfg.reg_idr2 >> 20) & 0x1F) == 0x8) ? 64 : 32;
|
||||
return 0;
|
||||
}
|
||||
|
||||
inline const uint32_t EtmV4Config::ccSize() const
|
||||
{
|
||||
return ((m_cfg.reg_idr2 >> 25) & 0xF) + 12;
|
||||
}
|
||||
|
||||
inline const bool EtmV4Config::vmidOpt() const
|
||||
{
|
||||
return (bool)((m_cfg.reg_idr2 & 0x20000000) == 0x20000000) && (MinVersion() > 0);
|
||||
}
|
||||
|
||||
/* id regs 8-13*/
|
||||
|
||||
inline const uint32_t EtmV4Config::MaxSpecDepth() const
|
||||
{
|
||||
return m_cfg.reg_idr8;
|
||||
}
|
||||
|
||||
inline const uint32_t EtmV4Config::P0_Key_Max() const
|
||||
{
|
||||
return (m_cfg.reg_idr9 == 0) ? 1 : m_cfg.reg_idr9;
|
||||
}
|
||||
|
||||
inline const uint32_t EtmV4Config::P1_Key_Max() const
|
||||
{
|
||||
return m_cfg.reg_idr10;
|
||||
}
|
||||
|
||||
inline const uint32_t EtmV4Config::P1_Spcl_Key_Max() const
|
||||
{
|
||||
return m_cfg.reg_idr11;
|
||||
}
|
||||
|
||||
inline const uint32_t EtmV4Config::CondKeyMax() const
|
||||
{
|
||||
return m_cfg.reg_idr12;
|
||||
}
|
||||
|
||||
inline const uint32_t EtmV4Config::CondSpecKeyMax() const
|
||||
{
|
||||
return m_cfg.reg_idr13;
|
||||
}
|
||||
|
||||
inline const uint32_t EtmV4Config::CondKeyMaxIncr() const
|
||||
{
|
||||
return m_cfg.reg_idr12 - m_cfg.reg_idr13;
|
||||
}
|
||||
|
||||
inline const uint8_t EtmV4Config::getTraceID() const
|
||||
{
|
||||
return (uint8_t)(m_cfg.reg_traceidr & 0x7F);
|
||||
}
|
||||
|
||||
/* config R */
|
||||
inline const bool EtmV4Config::enabledDVTrace() const
|
||||
{
|
||||
return hasDataTrace() && enabledLSP0Trace() && ((m_cfg.reg_configr & (0x1 << 17)) != 0);
|
||||
}
|
||||
|
||||
inline const bool EtmV4Config::enabledDATrace() const
|
||||
{
|
||||
return hasDataTrace() && enabledLSP0Trace() && ((m_cfg.reg_configr & (0x1 << 16)) != 0);
|
||||
}
|
||||
|
||||
inline const bool EtmV4Config::enabledDataTrace() const
|
||||
{
|
||||
return enabledDATrace() || enabledDVTrace();
|
||||
}
|
||||
|
||||
inline const bool EtmV4Config::enabledLSP0Trace() const
|
||||
{
|
||||
return ((m_cfg.reg_configr & 0x6) != 0);
|
||||
}
|
||||
|
||||
inline const EtmV4Config::LSP0_t EtmV4Config::LSP0Type() const
|
||||
{
|
||||
return (LSP0_t)((m_cfg.reg_configr & 0x6) >> 1);
|
||||
}
|
||||
|
||||
inline const bool EtmV4Config::enabledBrBroad() const
|
||||
{
|
||||
return ((m_cfg.reg_configr & (0x1 << 3)) != 0);
|
||||
}
|
||||
|
||||
inline const bool EtmV4Config::enabledCCI() const
|
||||
{
|
||||
return ((m_cfg.reg_configr & (0x1 << 4)) != 0);
|
||||
}
|
||||
|
||||
inline const bool EtmV4Config::enabledCID() const
|
||||
{
|
||||
return ((m_cfg.reg_configr & (0x1 << 6)) != 0);
|
||||
}
|
||||
|
||||
inline const bool EtmV4Config::enabledVMID() const
|
||||
{
|
||||
return ((m_cfg.reg_configr & (0x1 << 7)) != 0);
|
||||
}
|
||||
|
||||
inline const EtmV4Config::CondITrace_t EtmV4Config::enabledCondITrace()
|
||||
{
|
||||
if(!m_condTraceCalc)
|
||||
{
|
||||
switch((m_cfg.reg_configr >> 8) & 0x7)
|
||||
{
|
||||
default:
|
||||
case 0: m_CondTrace = COND_TR_DIS; break;
|
||||
case 1: m_CondTrace = COND_TR_LD; break;
|
||||
case 2: m_CondTrace = COND_TR_ST; break;
|
||||
case 3: m_CondTrace = COND_TR_LDST; break;
|
||||
case 7: m_CondTrace = COND_TR_ALL; break;
|
||||
}
|
||||
m_condTraceCalc = true;
|
||||
}
|
||||
return m_CondTrace;
|
||||
}
|
||||
|
||||
inline const bool EtmV4Config::enabledTS() const
|
||||
{
|
||||
return ((m_cfg.reg_configr & (0x1 << 11)) != 0);
|
||||
}
|
||||
|
||||
inline const bool EtmV4Config::enabledRetStack() const
|
||||
{
|
||||
return ((m_cfg.reg_configr & (0x1 << 12)) != 0);
|
||||
}
|
||||
|
||||
inline const bool EtmV4Config::enabledQE() const
|
||||
{
|
||||
return ((m_cfg.reg_configr & (0x3 << 13)) != 0);
|
||||
}
|
||||
|
||||
/** @}*/
|
||||
/** @}*/
|
||||
|
||||
#endif // ARM_TRC_CMP_CFG_ETMV4_H_INCLUDED
|
||||
|
||||
/* End of File trc_cmp_cfg_etmv4.h */
|
31
decoder/include/opencsd/etmv4/trc_dcd_mngr_etmv4i.h
Normal file
31
decoder/include/opencsd/etmv4/trc_dcd_mngr_etmv4i.h
Normal file
@ -0,0 +1,31 @@
|
||||
/*
|
||||
* \file trc_dcd_mngr_etmv4i.h
|
||||
* \brief Reference CoreSight Trace Decoder :
|
||||
*
|
||||
* \copyright Copyright (c) 2016, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
#ifndef ARM_TRC_DCD_MNGR_ETMV4I_H_INCLUDED
|
||||
#define ARM_TRC_DCD_MNGR_ETMV4I_H_INCLUDED
|
||||
|
||||
#include "common/ocsd_dcd_mngr.h"
|
||||
#include "trc_pkt_decode_etmv4i.h"
|
||||
#include "trc_pkt_proc_etmv4.h"
|
||||
#include "trc_cmp_cfg_etmv4.h"
|
||||
#include "trc_pkt_types_etmv4.h"
|
||||
|
||||
class DecoderMngrEtmV4I : public DecodeMngrFullDcd< EtmV4ITrcPacket,
|
||||
ocsd_etmv4_i_pkt_type,
|
||||
EtmV4Config,
|
||||
ocsd_etmv4_cfg,
|
||||
TrcPktProcEtmV4I,
|
||||
TrcPktDecodeEtmV4I>
|
||||
{
|
||||
public:
|
||||
DecoderMngrEtmV4I(const std::string &name) : DecodeMngrFullDcd(name,OCSD_PROTOCOL_ETMV4I) {};
|
||||
virtual ~DecoderMngrEtmV4I() {};
|
||||
};
|
||||
|
||||
#endif // ARM_TRC_DCD_MNGR_ETMV4I_H_INCLUDED
|
||||
|
||||
/* End of File trc_dcd_mngr_etmv4i.h */
|
338
decoder/include/opencsd/etmv4/trc_etmv4_stack_elem.h
Normal file
338
decoder/include/opencsd/etmv4/trc_etmv4_stack_elem.h
Normal file
@ -0,0 +1,338 @@
|
||||
/*
|
||||
* \file trc_etmv4_stack_elem.h
|
||||
* \brief OpenCSD :
|
||||
*
|
||||
* \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
#ifndef ARM_TRC_ETMV4_STACK_ELEM_H_INCLUDED
|
||||
#define ARM_TRC_ETMV4_STACK_ELEM_H_INCLUDED
|
||||
|
||||
#include "opencsd/etmv4/trc_pkt_types_etmv4.h"
|
||||
|
||||
#include <deque>
|
||||
#include <vector>
|
||||
|
||||
/* ETMv4 I trace stack elements
|
||||
Speculation requires that we stack certain elements till they are committed or
|
||||
cancelled. (P0 elements + other associated parts.)
|
||||
*/
|
||||
|
||||
typedef enum _p0_elem_t
|
||||
{
|
||||
P0_UNKNOWN,
|
||||
P0_ATOM,
|
||||
P0_ADDR,
|
||||
P0_CTXT,
|
||||
P0_TRC_ON,
|
||||
P0_EXCEP,
|
||||
P0_EXCEP_RET,
|
||||
P0_EVENT,
|
||||
P0_TS,
|
||||
P0_CC,
|
||||
P0_TS_CC,
|
||||
P0_OVERFLOW
|
||||
} p0_elem_t;
|
||||
|
||||
|
||||
/************************************************************/
|
||||
/***Trace stack element base class -
|
||||
record originating packet type and index in buffer*/
|
||||
|
||||
class TrcStackElem {
|
||||
public:
|
||||
TrcStackElem(const p0_elem_t p0_type, const bool isP0, const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index);
|
||||
virtual ~TrcStackElem() {};
|
||||
|
||||
const p0_elem_t getP0Type() const { return m_P0_type; };
|
||||
const ocsd_etmv4_i_pkt_type getRootPkt() const { return m_root_pkt; };
|
||||
const ocsd_trc_index_t getRootIndex() const { return m_root_idx; };
|
||||
const bool isP0() const { return m_is_P0; };
|
||||
|
||||
private:
|
||||
ocsd_etmv4_i_pkt_type m_root_pkt;
|
||||
ocsd_trc_index_t m_root_idx;
|
||||
p0_elem_t m_P0_type;
|
||||
|
||||
protected:
|
||||
bool m_is_P0; // true if genuine P0 - commit / cancellable, false otherwise
|
||||
|
||||
};
|
||||
|
||||
inline TrcStackElem::TrcStackElem(p0_elem_t p0_type, const bool isP0, ocsd_etmv4_i_pkt_type root_pkt, ocsd_trc_index_t root_index) :
|
||||
m_root_pkt(root_pkt),
|
||||
m_root_idx(root_index),
|
||||
m_P0_type(p0_type),
|
||||
m_is_P0(isP0)
|
||||
{
|
||||
}
|
||||
|
||||
/************************************************************/
|
||||
/** Address element */
|
||||
|
||||
class TrcStackElemAddr : public TrcStackElem
|
||||
{
|
||||
protected:
|
||||
TrcStackElemAddr(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index);
|
||||
virtual ~TrcStackElemAddr() {};
|
||||
|
||||
friend class EtmV4P0Stack;
|
||||
|
||||
public:
|
||||
void setAddr(const etmv4_addr_val_t &addr_val) { m_addr_val = addr_val; };
|
||||
const etmv4_addr_val_t &getAddr() const { return m_addr_val; };
|
||||
|
||||
private:
|
||||
etmv4_addr_val_t m_addr_val;
|
||||
};
|
||||
|
||||
inline TrcStackElemAddr::TrcStackElemAddr(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index) :
|
||||
TrcStackElem(P0_ADDR, false, root_pkt,root_index)
|
||||
{
|
||||
m_addr_val.val = 0;
|
||||
m_addr_val.isa = 0;
|
||||
}
|
||||
|
||||
/************************************************************/
|
||||
/** Context element */
|
||||
|
||||
class TrcStackElemCtxt : public TrcStackElem
|
||||
{
|
||||
protected:
|
||||
TrcStackElemCtxt(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index);
|
||||
virtual ~TrcStackElemCtxt() {};
|
||||
|
||||
friend class EtmV4P0Stack;
|
||||
|
||||
public:
|
||||
void setContext(const etmv4_context_t &ctxt) { m_context = ctxt; };
|
||||
const etmv4_context_t &getContext() const { return m_context; };
|
||||
|
||||
private:
|
||||
etmv4_context_t m_context;
|
||||
};
|
||||
|
||||
inline TrcStackElemCtxt::TrcStackElemCtxt(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index) :
|
||||
TrcStackElem(P0_CTXT, false, root_pkt,root_index)
|
||||
{
|
||||
}
|
||||
|
||||
/************************************************************/
|
||||
/** Exception element */
|
||||
|
||||
class TrcStackElemExcept : public TrcStackElem
|
||||
{
|
||||
protected:
|
||||
TrcStackElemExcept(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index);
|
||||
virtual ~TrcStackElemExcept() {};
|
||||
|
||||
friend class EtmV4P0Stack;
|
||||
|
||||
public:
|
||||
void setPrevSame(bool bSame) { m_prev_addr_same = bSame; };
|
||||
const bool getPrevSame() const { return m_prev_addr_same; };
|
||||
|
||||
void setExcepNum(const uint16_t num) { m_excep_num = num; };
|
||||
const uint16_t getExcepNum() const { return m_excep_num; };
|
||||
|
||||
private:
|
||||
bool m_prev_addr_same;
|
||||
uint16_t m_excep_num;
|
||||
};
|
||||
|
||||
inline TrcStackElemExcept::TrcStackElemExcept(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index) :
|
||||
TrcStackElem(P0_EXCEP, true, root_pkt,root_index),
|
||||
m_prev_addr_same(false)
|
||||
{
|
||||
}
|
||||
|
||||
/************************************************************/
|
||||
/** Atom element */
|
||||
|
||||
class TrcStackElemAtom : public TrcStackElem
|
||||
{
|
||||
protected:
|
||||
TrcStackElemAtom(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index);
|
||||
virtual ~TrcStackElemAtom() {};
|
||||
|
||||
friend class EtmV4P0Stack;
|
||||
|
||||
public:
|
||||
void setAtom(const ocsd_pkt_atom &atom) { m_atom = atom; };
|
||||
|
||||
const ocsd_atm_val commitOldest();
|
||||
int cancelNewest(const int nCancel);
|
||||
const bool isEmpty() const { return (m_atom.num == 0); };
|
||||
|
||||
private:
|
||||
ocsd_pkt_atom m_atom;
|
||||
};
|
||||
|
||||
inline TrcStackElemAtom::TrcStackElemAtom(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index) :
|
||||
TrcStackElem(P0_ATOM, true, root_pkt,root_index)
|
||||
{
|
||||
m_atom.num = 0;
|
||||
}
|
||||
|
||||
// commit oldest - get value and remove it from pattern
|
||||
inline const ocsd_atm_val TrcStackElemAtom::commitOldest()
|
||||
{
|
||||
ocsd_atm_val val = (m_atom.En_bits & 0x1) ? ATOM_E : ATOM_N;
|
||||
m_atom.num--;
|
||||
m_atom.En_bits >>= 1;
|
||||
return val;
|
||||
}
|
||||
|
||||
// cancel newest - just reduce the atom count.
|
||||
inline int TrcStackElemAtom::cancelNewest(const int nCancel)
|
||||
{
|
||||
int nRemove = (nCancel <= m_atom.num) ? nCancel : m_atom.num;
|
||||
m_atom.num -= nRemove;
|
||||
return nRemove;
|
||||
}
|
||||
|
||||
/************************************************************/
|
||||
/** Generic param element */
|
||||
|
||||
class TrcStackElemParam : public TrcStackElem
|
||||
{
|
||||
protected:
|
||||
TrcStackElemParam(const p0_elem_t p0_type, const bool isP0, const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index);
|
||||
virtual ~TrcStackElemParam() {};
|
||||
|
||||
friend class EtmV4P0Stack;
|
||||
|
||||
public:
|
||||
void setParam(const uint32_t param, const int nParamNum) { m_param[(nParamNum & 0x3)] = param; };
|
||||
const uint32_t &getParam(const int nParamNum) const { return m_param[(nParamNum & 0x3)]; };
|
||||
|
||||
private:
|
||||
uint32_t m_param[4];
|
||||
};
|
||||
|
||||
inline TrcStackElemParam::TrcStackElemParam(const p0_elem_t p0_type, const bool isP0, const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index) :
|
||||
TrcStackElem(p0_type, isP0, root_pkt,root_index)
|
||||
{
|
||||
}
|
||||
|
||||
/************************************************************/
|
||||
/* P0 element stack that allows push of elements, and deletion of elements when done.
|
||||
*/
|
||||
class EtmV4P0Stack
|
||||
{
|
||||
public:
|
||||
EtmV4P0Stack() {};
|
||||
~EtmV4P0Stack();
|
||||
|
||||
void push_front(TrcStackElem *pElem);
|
||||
void pop_back();
|
||||
TrcStackElem *back();
|
||||
size_t size();
|
||||
|
||||
void delete_all();
|
||||
void delete_back();
|
||||
void delete_popped();
|
||||
|
||||
// creation functions - create and push if successful.
|
||||
TrcStackElemParam *createParamElem(const p0_elem_t p0_type, const bool isP0, const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index, const std::vector<uint32_t> ¶ms);
|
||||
TrcStackElemParam *createParamElemNoParam(const p0_elem_t p0_type, const bool isP0, const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index);
|
||||
TrcStackElemAtom *createAtomElem (const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index, const ocsd_pkt_atom &atom);
|
||||
TrcStackElemExcept *createExceptElem(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index, const bool bSame, const uint16_t excepNum);
|
||||
TrcStackElemCtxt *createContextElem(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index, const etmv4_context_t &context);
|
||||
TrcStackElemAddr *createAddrElem(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index, const etmv4_addr_val_t &addr_val);
|
||||
|
||||
private:
|
||||
std::deque<TrcStackElem *> m_P0_stack; //!< P0 decode element stack
|
||||
std::vector<TrcStackElem *> m_popped_elem; //!< save list of popped but not deleted elements.
|
||||
|
||||
};
|
||||
|
||||
inline EtmV4P0Stack::~EtmV4P0Stack()
|
||||
{
|
||||
delete_all();
|
||||
delete_popped();
|
||||
}
|
||||
|
||||
// put an element on the front of the stack
|
||||
inline void EtmV4P0Stack::push_front(TrcStackElem *pElem)
|
||||
{
|
||||
m_P0_stack.push_front(pElem);
|
||||
}
|
||||
|
||||
// pop last element pointer off the stack and stash it for later deletion
|
||||
inline void EtmV4P0Stack::pop_back()
|
||||
{
|
||||
m_popped_elem.push_back(m_P0_stack.back());
|
||||
m_P0_stack.pop_back();
|
||||
}
|
||||
|
||||
// pop last element pointer off the stack and delete immediately
|
||||
inline void EtmV4P0Stack::delete_back()
|
||||
{
|
||||
if (m_P0_stack.size() > 0)
|
||||
{
|
||||
TrcStackElem* pElem = m_P0_stack.back();
|
||||
delete pElem;
|
||||
m_P0_stack.pop_back();
|
||||
}
|
||||
}
|
||||
|
||||
// get a pointer to the last element on the stack
|
||||
inline TrcStackElem *EtmV4P0Stack::back()
|
||||
{
|
||||
return m_P0_stack.back();
|
||||
}
|
||||
|
||||
// remove and delete all the elements left on the stack
|
||||
inline void EtmV4P0Stack::delete_all()
|
||||
{
|
||||
while (m_P0_stack.size() > 0)
|
||||
delete_back();
|
||||
m_P0_stack.clear();
|
||||
}
|
||||
|
||||
// delete list of popped elements.
|
||||
inline void EtmV4P0Stack::delete_popped()
|
||||
{
|
||||
while (m_popped_elem.size() > 0)
|
||||
{
|
||||
delete m_popped_elem.back();
|
||||
m_popped_elem.pop_back();
|
||||
}
|
||||
m_popped_elem.clear();
|
||||
}
|
||||
|
||||
// get current number of elements on the stack
|
||||
inline size_t EtmV4P0Stack::size()
|
||||
{
|
||||
return m_P0_stack.size();
|
||||
}
|
||||
|
||||
#endif // ARM_TRC_ETMV4_STACK_ELEM_H_INCLUDED
|
||||
|
||||
/* End of File trc_etmv4_stack_elem.h */
|
183
decoder/include/opencsd/etmv4/trc_pkt_decode_etmv4i.h
Normal file
183
decoder/include/opencsd/etmv4/trc_pkt_decode_etmv4i.h
Normal file
@ -0,0 +1,183 @@
|
||||
/*
|
||||
* \file trc_pkt_decode_etmv4i.h
|
||||
* \brief OpenCSD : ETMv4 instruction decoder
|
||||
*
|
||||
* \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef ARM_TRC_PKT_DECODE_ETMV4I_H_INCLUDED
|
||||
#define ARM_TRC_PKT_DECODE_ETMV4I_H_INCLUDED
|
||||
|
||||
#include "common/trc_pkt_decode_base.h"
|
||||
#include "opencsd/etmv4/trc_pkt_elem_etmv4i.h"
|
||||
#include "opencsd/etmv4/trc_cmp_cfg_etmv4.h"
|
||||
#include "common/trc_gen_elem.h"
|
||||
#include "common/trc_ret_stack.h"
|
||||
#include "opencsd/etmv4/trc_etmv4_stack_elem.h"
|
||||
|
||||
class TrcStackElem;
|
||||
class TrcStackElemParam;
|
||||
class TrcStackElemCtxt;
|
||||
|
||||
class TrcPktDecodeEtmV4I : public TrcPktDecodeBase<EtmV4ITrcPacket, EtmV4Config>
|
||||
{
|
||||
public:
|
||||
TrcPktDecodeEtmV4I();
|
||||
TrcPktDecodeEtmV4I(int instIDNum);
|
||||
virtual ~TrcPktDecodeEtmV4I();
|
||||
|
||||
protected:
|
||||
/* implementation packet decoding interface */
|
||||
virtual ocsd_datapath_resp_t processPacket();
|
||||
virtual ocsd_datapath_resp_t onEOT();
|
||||
virtual ocsd_datapath_resp_t onReset();
|
||||
virtual ocsd_datapath_resp_t onFlush();
|
||||
virtual ocsd_err_t onProtocolConfig();
|
||||
virtual const uint8_t getCoreSightTraceID() { return m_CSID; };
|
||||
|
||||
/* local decode methods */
|
||||
void initDecoder(); // initial state on creation (zeros all config)
|
||||
void resetDecoder(); // reset state to start of decode. (moves state, retains config)
|
||||
|
||||
ocsd_datapath_resp_t decodePacket(bool &Complete); // return true to indicate decode complete - can change FSM to commit state - return is false.
|
||||
ocsd_datapath_resp_t commitElements(bool &Complete); // commit elements - may get wait response, or flag completion.
|
||||
ocsd_datapath_resp_t flushEOT();
|
||||
|
||||
void doTraceInfoPacket();
|
||||
void updateContext(TrcStackElemCtxt *pCtxtElem);
|
||||
|
||||
// process atom will output instruction trace, or no memory access trace elements.
|
||||
ocsd_datapath_resp_t processAtom(const ocsd_atm_val, bool &bCont);
|
||||
|
||||
// process an exception element - output instruction trace + exception generic type.
|
||||
ocsd_datapath_resp_t processException();
|
||||
|
||||
// process a bad packet
|
||||
ocsd_datapath_resp_t handleBadPacket(const char *reason);
|
||||
|
||||
ocsd_datapath_resp_t outputCC(TrcStackElemParam *pParamElem);
|
||||
ocsd_datapath_resp_t outputTS(TrcStackElemParam *pParamElem, bool withCC);
|
||||
ocsd_datapath_resp_t outputEvent(TrcStackElemParam *pParamElem);
|
||||
|
||||
private:
|
||||
void SetInstrInfoInAddrISA(const ocsd_vaddr_t addr_val, const uint8_t isa);
|
||||
|
||||
ocsd_err_t traceInstrToWP(bool &bWPFound, const bool traceToAddrNext = false, const ocsd_vaddr_t nextAddrMatch = 0); //!< follow instructions from the current address to a WP. true if good, false if memory cannot be accessed.
|
||||
|
||||
ocsd_datapath_resp_t returnStackPop(); // pop return stack and update instruction address.
|
||||
|
||||
//** intra packet state (see ETMv4 spec 6.2.1);
|
||||
|
||||
// timestamping
|
||||
uint64_t m_timestamp; // last broadcast global Timestamp.
|
||||
|
||||
// state and context
|
||||
uint32_t m_context_id; // most recent context ID
|
||||
uint32_t m_vmid_id; // most recent VMID
|
||||
bool m_is_secure; // true if Secure
|
||||
bool m_is_64bit; // true if 64 bit
|
||||
|
||||
// cycle counts
|
||||
int m_cc_threshold;
|
||||
|
||||
// speculative trace (unsupported at present in the decoder).
|
||||
int m_curr_spec_depth;
|
||||
int m_max_spec_depth;
|
||||
|
||||
// data trace associative elements (unsupported at present in the decoder).
|
||||
int m_p0_key;
|
||||
int m_p0_key_max;
|
||||
|
||||
// conditional non-branch trace - when data trace active (unsupported at present in the decoder)
|
||||
int m_cond_c_key;
|
||||
int m_cond_r_key;
|
||||
int m_cond_key_max_incr;
|
||||
|
||||
uint8_t m_CSID; //!< Coresight trace ID for this decoder.
|
||||
|
||||
bool m_IASize64; //!< True if 64 bit instruction addresses supported.
|
||||
|
||||
//** Other processor state;
|
||||
|
||||
// trace decode FSM
|
||||
typedef enum {
|
||||
NO_SYNC, //!< pre start trace - init state or after reset or overflow, loss of sync.
|
||||
WAIT_SYNC, //!< waiting for sync packet.
|
||||
WAIT_TINFO, //!< waiting for trace info packet.
|
||||
DECODE_PKTS, //!< processing packets - creating decode elements on stack
|
||||
COMMIT_ELEM, //!< commit elements for execution - create generic trace elements and pass on.
|
||||
} processor_state_t;
|
||||
|
||||
processor_state_t m_curr_state;
|
||||
|
||||
//** P0 element stack
|
||||
EtmV4P0Stack m_P0_stack; //!< P0 decode element stack
|
||||
|
||||
int m_P0_commit; //!< number of elements to commit
|
||||
|
||||
// packet decode state
|
||||
bool m_need_ctxt; //!< need context to continue
|
||||
bool m_need_addr; //!< need an address to continue
|
||||
bool m_except_pending_addr; //!< next address packet is part of exception.
|
||||
|
||||
// exception packet processing state (may need excep elem only, range+excep, range+
|
||||
typedef enum {
|
||||
EXCEP_POP, // start of processing read exception packets off the stack and analyze
|
||||
EXCEP_RANGE, // output a range element
|
||||
EXCEP_NACC, // output a nacc element
|
||||
EXCEP_EXCEP, // output an ecxeption element.
|
||||
} excep_proc_state_t;
|
||||
|
||||
excep_proc_state_t m_excep_proc; //!< state of exception processing
|
||||
etmv4_addr_val_t m_excep_addr; //!< excepiton return address.
|
||||
ocsd_trc_index_t m_excep_index; //!< trace index for exception element
|
||||
|
||||
ocsd_instr_info m_instr_info; //!< instruction info for code follower - in address is the next to be decoded.
|
||||
|
||||
bool m_mem_nacc_pending; //!< need to output a memory access failure packet
|
||||
ocsd_vaddr_t m_nacc_addr; //!< record unaccessible address
|
||||
|
||||
ocsd_pe_context m_pe_context; //!< current context information
|
||||
etmv4_trace_info_t m_trace_info; //!< trace info for this trace run.
|
||||
|
||||
bool m_prev_overflow;
|
||||
|
||||
bool m_flush_EOT; //!< true if doing an end of trace flush - cleans up lingering events / TS / CC
|
||||
|
||||
TrcAddrReturnStack m_return_stack;
|
||||
|
||||
//** output element
|
||||
OcsdTraceElement m_output_elem;
|
||||
|
||||
};
|
||||
|
||||
#endif // ARM_TRC_PKT_DECODE_ETMV4I_H_INCLUDED
|
||||
|
||||
/* End of File trc_pkt_decode_etmv4i.h */
|
73
decoder/include/opencsd/etmv4/trc_pkt_elem_etmv4d.h
Normal file
73
decoder/include/opencsd/etmv4/trc_pkt_elem_etmv4d.h
Normal file
@ -0,0 +1,73 @@
|
||||
/*
|
||||
* \file trc_pkt_elem_etmv4d.h
|
||||
* \brief OpenCSD :
|
||||
*
|
||||
* \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef ARM_TRC_PKT_ELEM_ETMV4D_H_INCLUDED
|
||||
#define ARM_TRC_PKT_ELEM_ETMV4D_H_INCLUDED
|
||||
|
||||
#include "trc_pkt_types_etmv4.h"
|
||||
#include "common/trc_printable_elem.h"
|
||||
#include "common/trc_pkt_elem_base.h"
|
||||
|
||||
/** @addtogroup trc_pkts
|
||||
@{*/
|
||||
/*!
|
||||
* @class EtmV4DTrcPacket
|
||||
* @brief ETMv4 Data Trace Protocol Packet .
|
||||
*
|
||||
* This class represents a single ETMv4 instruction trace packet, along with intra packet state.
|
||||
*
|
||||
*/
|
||||
class EtmV4DTrcPacket : public TrcPacketBase, public ocsd_etmv4_d_pkt, trcPrintableElem
|
||||
{
|
||||
public:
|
||||
EtmV4DTrcPacket();
|
||||
~EtmV4DTrcPacket();
|
||||
|
||||
// update interface - set packet values
|
||||
|
||||
|
||||
|
||||
// packet status interface - get packet info.
|
||||
|
||||
|
||||
// printing
|
||||
virtual void toString(std::string &str) const;
|
||||
virtual void toStringFmt(const uint32_t fmtFlags, std::string &str) const;
|
||||
};
|
||||
|
||||
/** @}*/
|
||||
|
||||
#endif // ARM_TRC_PKT_ELEM_ETMV4D_H_INCLUDED
|
||||
|
||||
/* End of File trc_pkt_elem_etmv4d.h */
|
520
decoder/include/opencsd/etmv4/trc_pkt_elem_etmv4i.h
Normal file
520
decoder/include/opencsd/etmv4/trc_pkt_elem_etmv4i.h
Normal file
@ -0,0 +1,520 @@
|
||||
/*
|
||||
* \file trc_pkt_elem_etmv4i.h
|
||||
* \brief OpenCSD :
|
||||
*
|
||||
* \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef ARM_TRC_PKT_ELEM_ETMV4I_H_INCLUDED
|
||||
#define ARM_TRC_PKT_ELEM_ETMV4I_H_INCLUDED
|
||||
|
||||
#include "trc_pkt_types_etmv4.h"
|
||||
#include "common/trc_printable_elem.h"
|
||||
#include "common/trc_pkt_elem_base.h"
|
||||
|
||||
/** @addtogroup trc_pkts
|
||||
@{*/
|
||||
|
||||
/*!
|
||||
* @class Etmv4PktAddrStack
|
||||
* @brief ETMv4 Address packet values stack
|
||||
* @ingroup trc_pkts
|
||||
*
|
||||
* This class represents a stack of recent broadcast address values -
|
||||
* used to fulfil the ExactMatch address type where no address is output.
|
||||
*
|
||||
*/
|
||||
class Etmv4PktAddrStack
|
||||
{
|
||||
public:
|
||||
Etmv4PktAddrStack()
|
||||
{
|
||||
for (int i = 0; i < 3; i++)
|
||||
{
|
||||
m_v_addr[i].pkt_bits = 0;
|
||||
m_v_addr[i].size = VA_64BIT;
|
||||
m_v_addr[i].val = 0;
|
||||
m_v_addr[i].valid_bits = 0;
|
||||
m_v_addr_ISA[i] = 0;
|
||||
}
|
||||
}
|
||||
~Etmv4PktAddrStack() {};
|
||||
|
||||
void push(const ocsd_pkt_vaddr vaddr, const uint8_t isa)
|
||||
{
|
||||
m_v_addr[2] = m_v_addr[1];
|
||||
m_v_addr[1] = m_v_addr[0];
|
||||
m_v_addr[0] = vaddr;
|
||||
m_v_addr_ISA[2] = m_v_addr_ISA[1];
|
||||
m_v_addr_ISA[1] = m_v_addr_ISA[0];
|
||||
m_v_addr_ISA[0] = isa;
|
||||
}
|
||||
|
||||
void get_idx(const uint8_t idx, ocsd_pkt_vaddr &vaddr, uint8_t &isa)
|
||||
{
|
||||
if (idx < 3)
|
||||
{
|
||||
vaddr = m_v_addr[idx];
|
||||
isa = m_v_addr_ISA[idx];
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
ocsd_pkt_vaddr m_v_addr[3]; //!< most recently broadcast address packet
|
||||
uint8_t m_v_addr_ISA[3];
|
||||
};
|
||||
|
||||
/*!
|
||||
* @class EtmV4ITrcPacket
|
||||
* @brief ETMv4 Instuction Trace Protocol Packet.
|
||||
* @ingroup trc_pkts
|
||||
*
|
||||
* This class represents a single ETMv4 data trace packet, along with intra packet state.
|
||||
*
|
||||
*/
|
||||
class EtmV4ITrcPacket : public TrcPacketBase, public ocsd_etmv4_i_pkt, public trcPrintableElem
|
||||
{
|
||||
public:
|
||||
EtmV4ITrcPacket();
|
||||
~EtmV4ITrcPacket();
|
||||
|
||||
EtmV4ITrcPacket &operator =(const ocsd_etmv4_i_pkt* p_pkt);
|
||||
|
||||
virtual const void *c_pkt() const { return (const ocsd_etmv4_i_pkt *)this; };
|
||||
|
||||
// update interface - set packet values
|
||||
void initStartState(); //!< Set to initial state - no intra packet state valid. Use on start of trace / discontinuities.
|
||||
void initNextPacket(); //!< clear any single packet only flags / state.
|
||||
|
||||
void setType(const ocsd_etmv4_i_pkt_type pkt_type) { type = pkt_type; };
|
||||
void updateErrType(const ocsd_etmv4_i_pkt_type err_pkt_type);
|
||||
|
||||
void clearTraceInfo(); //!< clear all the trace info data prior to setting for new trace info packet.
|
||||
void setTraceInfo(const uint32_t infoVal);
|
||||
void setTraceInfoKey(const uint32_t keyVal);
|
||||
void setTraceInfoSpec(const uint32_t specVal);
|
||||
void setTraceInfoCyct(const uint32_t cyctVal);
|
||||
|
||||
void setTS(const uint64_t value, const uint8_t bits);
|
||||
void setCycleCount(const uint32_t value);
|
||||
void setCommitElements(const uint32_t commit_elem);
|
||||
void setCancelElements(const uint32_t cancel_elem);
|
||||
void setAtomPacket(const ocsd_pkt_atm_type type, const uint32_t En_bits, const uint8_t num);
|
||||
|
||||
void setCondIF1(uint32_t const cond_key);
|
||||
void setCondIF2(uint8_t const c_elem_idx);
|
||||
void setCondIF3(uint8_t const num_c_elem, const bool finalElem);
|
||||
|
||||
void setCondRF1(const uint32_t key[2], const uint8_t res[2], const uint8_t CI[2], const bool set2Keys);
|
||||
void setCondRF2(const uint8_t key_incr, const uint8_t token);
|
||||
void setCondRF3(const uint16_t tokens);
|
||||
void setCondRF4(const uint8_t token);
|
||||
|
||||
void setContextInfo(const bool update, const uint8_t EL = 0, const uint8_t NS = 0, const uint8_t SF = 0);
|
||||
void setContextVMID(const uint32_t VMID);
|
||||
void setContextCID(const uint32_t CID);
|
||||
|
||||
void setExceptionInfo(const uint16_t excep_type, const uint8_t addr_interp, const uint8_t m_fault_pending, const uint8_t m_type);
|
||||
|
||||
void set64BitAddress(const uint64_t addr, const uint8_t IS);
|
||||
void set32BitAddress(const uint32_t addr, const uint8_t IS);
|
||||
void updateShortAddress(const uint32_t addr, const uint8_t IS, const uint8_t update_bits);
|
||||
void setAddressExactMatch(const uint8_t idx);
|
||||
|
||||
void setDataSyncMarker(const uint8_t dsm_val);
|
||||
void setEvent(const uint8_t event_val);
|
||||
|
||||
void setQType(const bool has_count, const uint32_t count, const bool has_addr, const bool addr_match, const uint8_t type);
|
||||
|
||||
// packet status interface - get packet info.
|
||||
const ocsd_etmv4_i_pkt_type getType() const { return type; };
|
||||
const ocsd_etmv4_i_pkt_type getErrType() const { return err_type; };
|
||||
|
||||
//! return true if this packet has set the commit packet count.
|
||||
const bool hasCommitElementsCount() const
|
||||
{
|
||||
return pkt_valid.bits.commit_elem_valid ? true : false;
|
||||
};
|
||||
|
||||
// trace info
|
||||
const etmv4_trace_info_t &getTraceInfo() const { return trace_info; };
|
||||
const uint32_t getCCThreshold() const;
|
||||
const uint32_t getP0Key() const;
|
||||
const uint32_t getCurrSpecDepth() const;
|
||||
|
||||
// atom
|
||||
const ocsd_pkt_atom &getAtom() const { return atom; };
|
||||
|
||||
// context
|
||||
const etmv4_context_t &getContext() const { return context; };
|
||||
|
||||
// address
|
||||
const uint8_t &getAddrMatch() const { return addr_exact_match_idx; };
|
||||
const ocsd_vaddr_t &getAddrVal() const { return v_addr.val; };
|
||||
const uint8_t &getAddrIS() const { return v_addr_ISA; };
|
||||
const bool getAddr64Bit() const { return v_addr.size == VA_64BIT; };
|
||||
|
||||
// ts
|
||||
const uint64_t getTS() const { return pkt_valid.bits.ts_valid ? ts.timestamp : 0; };
|
||||
|
||||
// cc
|
||||
const uint32_t getCC() const { return pkt_valid.bits.cc_valid ? cycle_count : 0; };
|
||||
|
||||
// packet type
|
||||
const bool isBadPacket() const;
|
||||
|
||||
// printing
|
||||
virtual void toString(std::string &str) const;
|
||||
virtual void toStringFmt(const uint32_t fmtFlags, std::string &str) const;
|
||||
|
||||
private:
|
||||
const char *packetTypeName(const ocsd_etmv4_i_pkt_type type, const char **pDesc) const;
|
||||
void contextStr(std::string &ctxtStr) const;
|
||||
void atomSeq(std::string &valStr) const;
|
||||
void addrMatchIdx(std::string &valStr) const;
|
||||
void exceptionInfo(std::string &valStr) const;
|
||||
|
||||
void push_vaddr();
|
||||
void pop_vaddr_idx(const uint8_t idx);
|
||||
|
||||
Etmv4PktAddrStack m_addr_stack;
|
||||
};
|
||||
|
||||
inline void EtmV4ITrcPacket::updateErrType(const ocsd_etmv4_i_pkt_type err_pkt_type)
|
||||
{
|
||||
// set primary type to incoming error type, set packet err type to previous primary type.
|
||||
err_type = type;
|
||||
type = err_pkt_type;
|
||||
}
|
||||
|
||||
inline void EtmV4ITrcPacket::clearTraceInfo()
|
||||
{
|
||||
pkt_valid.bits.ts_valid = 0;
|
||||
pkt_valid.bits.trace_info_valid = 0;
|
||||
pkt_valid.bits.p0_key_valid = 0;
|
||||
pkt_valid.bits.spec_depth_valid = 0;
|
||||
pkt_valid.bits.cc_thresh_valid = 0;
|
||||
|
||||
pkt_valid.bits.ts_valid = 0; // mark TS as invalid - must be re-updated after trace info.
|
||||
}
|
||||
|
||||
inline void EtmV4ITrcPacket::setTraceInfo(const uint32_t infoVal)
|
||||
{
|
||||
trace_info.val = infoVal;
|
||||
pkt_valid.bits.trace_info_valid = 1;
|
||||
}
|
||||
|
||||
inline void EtmV4ITrcPacket::setTraceInfoKey(const uint32_t keyVal)
|
||||
{
|
||||
p0_key = keyVal;
|
||||
pkt_valid.bits.p0_key_valid = 1;
|
||||
}
|
||||
|
||||
inline void EtmV4ITrcPacket::setTraceInfoSpec(const uint32_t specVal)
|
||||
{
|
||||
curr_spec_depth = specVal;
|
||||
pkt_valid.bits.spec_depth_valid = 1;
|
||||
}
|
||||
|
||||
inline void EtmV4ITrcPacket::setTraceInfoCyct(const uint32_t cyctVal)
|
||||
{
|
||||
cc_threshold = cyctVal;
|
||||
pkt_valid.bits.cc_thresh_valid = 1;
|
||||
}
|
||||
|
||||
inline void EtmV4ITrcPacket::setTS(const uint64_t value, const uint8_t bits)
|
||||
{
|
||||
uint64_t mask = (uint64_t)-1LL;
|
||||
if(bits < 64) mask = (1ULL << bits) - 1;
|
||||
ts.timestamp = (ts.timestamp & ~mask) | (value & mask);
|
||||
ts.bits_changed = bits;
|
||||
pkt_valid.bits.ts_valid = 1;
|
||||
}
|
||||
|
||||
inline void EtmV4ITrcPacket::setCycleCount(const uint32_t value)
|
||||
{
|
||||
pkt_valid.bits.cc_valid = 1;
|
||||
cycle_count = value;
|
||||
}
|
||||
|
||||
inline void EtmV4ITrcPacket::setCommitElements(const uint32_t commit_elem)
|
||||
{
|
||||
pkt_valid.bits.commit_elem_valid = 1;
|
||||
commit_elements = commit_elem;
|
||||
}
|
||||
|
||||
inline const uint32_t EtmV4ITrcPacket::getCCThreshold() const
|
||||
{
|
||||
if(pkt_valid.bits.cc_thresh_valid)
|
||||
return cc_threshold;
|
||||
return 0;
|
||||
}
|
||||
|
||||
inline const uint32_t EtmV4ITrcPacket::getP0Key() const
|
||||
{
|
||||
if(pkt_valid.bits.p0_key_valid)
|
||||
return p0_key;
|
||||
return 0;
|
||||
}
|
||||
|
||||
inline const uint32_t EtmV4ITrcPacket::getCurrSpecDepth() const
|
||||
{
|
||||
if(pkt_valid.bits.spec_depth_valid)
|
||||
return curr_spec_depth;
|
||||
return 0;
|
||||
}
|
||||
|
||||
inline void EtmV4ITrcPacket::setCancelElements(const uint32_t cancel_elem)
|
||||
{
|
||||
cancel_elements = cancel_elem;
|
||||
}
|
||||
|
||||
inline void EtmV4ITrcPacket::setAtomPacket(const ocsd_pkt_atm_type type, const uint32_t En_bits, const uint8_t num)
|
||||
{
|
||||
if(type == ATOM_REPEAT)
|
||||
{
|
||||
uint32_t bit_patt = En_bits & 0x1;
|
||||
if(bit_patt)
|
||||
{
|
||||
// none zero - all 1s
|
||||
bit_patt = (bit_patt << num) - 1;
|
||||
}
|
||||
atom.En_bits = bit_patt;
|
||||
}
|
||||
else
|
||||
atom.En_bits = En_bits;
|
||||
atom.num = num;
|
||||
}
|
||||
|
||||
inline void EtmV4ITrcPacket::setCondIF1(const uint32_t cond_key)
|
||||
{
|
||||
cond_instr.cond_key_set = 1;
|
||||
cond_instr.f3_final_elem = 0;
|
||||
cond_instr.f2_cond_incr = 0;
|
||||
cond_instr.num_c_elem = 1;
|
||||
cond_instr.cond_c_key = cond_key;
|
||||
}
|
||||
|
||||
inline void EtmV4ITrcPacket::setCondIF2(const uint8_t c_elem_idx)
|
||||
{
|
||||
cond_instr.cond_key_set = 0;
|
||||
cond_instr.f3_final_elem = 0;
|
||||
switch(c_elem_idx & 0x3)
|
||||
{
|
||||
case 0:
|
||||
cond_instr.f2_cond_incr = 1;
|
||||
cond_instr.num_c_elem = 1;
|
||||
break;
|
||||
|
||||
case 1:
|
||||
cond_instr.f2_cond_incr = 0;
|
||||
cond_instr.num_c_elem = 1;
|
||||
break;
|
||||
|
||||
case 2:
|
||||
cond_instr.f2_cond_incr = 1;
|
||||
cond_instr.num_c_elem = 2;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
inline void EtmV4ITrcPacket::setCondIF3(const uint8_t num_c_elem, const bool finalElem)
|
||||
{
|
||||
cond_instr.cond_key_set = 0;
|
||||
cond_instr.f3_final_elem = finalElem ? 1: 0;
|
||||
cond_instr.f2_cond_incr = 0;
|
||||
cond_instr.num_c_elem = num_c_elem;
|
||||
}
|
||||
|
||||
inline void EtmV4ITrcPacket::setCondRF1(const uint32_t key[2], const uint8_t res[2], const uint8_t CI[2],const bool set2Keys)
|
||||
{
|
||||
cond_result.key_res_0_set = 1;
|
||||
cond_result.cond_r_key_0 = key[0];
|
||||
cond_result.res_0 = res[0];
|
||||
cond_result.ci_0 = CI[0];
|
||||
|
||||
if(set2Keys)
|
||||
{
|
||||
cond_result.key_res_1_set = 1;
|
||||
cond_result.cond_r_key_1 = key[1];
|
||||
cond_result.res_1 = res[1];
|
||||
cond_result.ci_1 = CI[1];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
inline void EtmV4ITrcPacket::setCondRF2(const uint8_t key_incr, const uint8_t token)
|
||||
{
|
||||
cond_result.key_res_0_set = 0;
|
||||
cond_result.key_res_1_set = 0;
|
||||
cond_result.f2_key_incr = key_incr;
|
||||
cond_result.f2f4_token = token;
|
||||
}
|
||||
|
||||
inline void EtmV4ITrcPacket::setCondRF3(const uint16_t tokens)
|
||||
{
|
||||
cond_result.key_res_0_set = 0;
|
||||
cond_result.key_res_1_set = 0;
|
||||
cond_result.f3_tokens = tokens;
|
||||
}
|
||||
|
||||
inline void EtmV4ITrcPacket::setCondRF4(const uint8_t token)
|
||||
{
|
||||
cond_result.key_res_0_set = 0;
|
||||
cond_result.key_res_1_set = 0;
|
||||
cond_result.f2f4_token = token;
|
||||
}
|
||||
|
||||
inline void EtmV4ITrcPacket::setContextInfo(const bool update, const uint8_t EL, const uint8_t NS, const uint8_t SF)
|
||||
{
|
||||
pkt_valid.bits.context_valid = 1;
|
||||
if(update)
|
||||
{
|
||||
context.updated = 1;
|
||||
context.EL = EL;
|
||||
context.NS = NS;
|
||||
context.SF = SF;
|
||||
}
|
||||
}
|
||||
|
||||
inline void EtmV4ITrcPacket::setContextVMID(const uint32_t VMID)
|
||||
{
|
||||
pkt_valid.bits.context_valid = 1;
|
||||
context.updated = 1;
|
||||
context.VMID = VMID;
|
||||
context.updated_v = 1;
|
||||
}
|
||||
|
||||
inline void EtmV4ITrcPacket::setContextCID(const uint32_t CID)
|
||||
{
|
||||
pkt_valid.bits.context_valid = 1;
|
||||
context.updated = 1;
|
||||
context.ctxtID = CID;
|
||||
context.updated_c = 1;
|
||||
}
|
||||
|
||||
inline void EtmV4ITrcPacket::setExceptionInfo(const uint16_t excep_type, const uint8_t addr_interp, const uint8_t m_fault_pending, const uint8_t m_type)
|
||||
{
|
||||
exception_info.exceptionType = excep_type;
|
||||
exception_info.addr_interp = addr_interp;
|
||||
exception_info.m_fault_pending = m_fault_pending;
|
||||
exception_info.m_type = m_type;
|
||||
}
|
||||
|
||||
inline void EtmV4ITrcPacket::set64BitAddress(const uint64_t addr, const uint8_t IS)
|
||||
{
|
||||
v_addr.pkt_bits = 64;
|
||||
v_addr.valid_bits = 64;
|
||||
v_addr.size = VA_64BIT;
|
||||
v_addr.val = addr;
|
||||
v_addr_ISA = IS;
|
||||
push_vaddr();
|
||||
}
|
||||
|
||||
inline void EtmV4ITrcPacket::set32BitAddress(const uint32_t addr, const uint8_t IS)
|
||||
{
|
||||
uint64_t mask = OCSD_BIT_MASK(32);
|
||||
v_addr.pkt_bits = 32;
|
||||
|
||||
if (pkt_valid.bits.context_valid && context.SF)
|
||||
v_addr.size = VA_64BIT;
|
||||
else
|
||||
{
|
||||
v_addr.val &= 0xFFFFFFFF; // ensure vaddr is only 32 bits if not 64 bit
|
||||
v_addr.size = VA_32BIT;
|
||||
}
|
||||
|
||||
if (v_addr.valid_bits < 32) // may be 64 bit address so only set 32 if less
|
||||
v_addr.valid_bits = 32;
|
||||
|
||||
v_addr.val = (v_addr.val & ~mask) | (addr & mask);
|
||||
v_addr_ISA = IS;
|
||||
push_vaddr();
|
||||
}
|
||||
|
||||
inline void EtmV4ITrcPacket::updateShortAddress(const uint32_t addr, const uint8_t IS, const uint8_t update_bits)
|
||||
{
|
||||
ocsd_vaddr_t update_mask = OCSD_BIT_MASK(update_bits);
|
||||
v_addr.pkt_bits = update_bits;
|
||||
if(v_addr.valid_bits < update_bits)
|
||||
v_addr.valid_bits = update_bits;
|
||||
|
||||
v_addr.val = (v_addr.val & ~update_mask) | (addr & update_mask);
|
||||
v_addr_ISA = IS;
|
||||
push_vaddr();
|
||||
}
|
||||
|
||||
inline void EtmV4ITrcPacket::setAddressExactMatch(const uint8_t idx)
|
||||
{
|
||||
addr_exact_match_idx = idx;
|
||||
pop_vaddr_idx(idx);
|
||||
push_vaddr();
|
||||
}
|
||||
|
||||
inline void EtmV4ITrcPacket::setDataSyncMarker(const uint8_t dsm_value)
|
||||
{
|
||||
dsm_val = dsm_value;
|
||||
}
|
||||
|
||||
inline void EtmV4ITrcPacket::setEvent(const uint8_t event_value)
|
||||
{
|
||||
event_val = event_value;
|
||||
}
|
||||
|
||||
inline void EtmV4ITrcPacket::setQType(const bool has_count, const uint32_t count, const bool has_addr, const bool addr_match, const uint8_t type)
|
||||
{
|
||||
Q_pkt.q_count = count;
|
||||
Q_pkt.q_type = type;
|
||||
Q_pkt.count_present = has_count ? 1 : 0;
|
||||
Q_pkt.addr_present = has_addr ? 1: 0;
|
||||
Q_pkt.addr_match = addr_match ? 1 :0;
|
||||
}
|
||||
|
||||
inline const bool EtmV4ITrcPacket::isBadPacket() const
|
||||
{
|
||||
return (type >= ETM4_PKT_I_BAD_SEQUENCE);
|
||||
}
|
||||
|
||||
inline void EtmV4ITrcPacket::push_vaddr()
|
||||
{
|
||||
m_addr_stack.push(v_addr, v_addr_ISA);
|
||||
}
|
||||
|
||||
inline void EtmV4ITrcPacket::pop_vaddr_idx(const uint8_t idx)
|
||||
{
|
||||
m_addr_stack.get_idx(idx, v_addr, v_addr_ISA);
|
||||
}
|
||||
|
||||
/** @}*/
|
||||
|
||||
#endif // ARM_TRC_PKT_ELEM_ETMV4I_H_INCLUDED
|
||||
|
||||
/* End of File trc_pkt_elem_etmv4i.h */
|
104
decoder/include/opencsd/etmv4/trc_pkt_proc_etmv4.h
Normal file
104
decoder/include/opencsd/etmv4/trc_pkt_proc_etmv4.h
Normal file
@ -0,0 +1,104 @@
|
||||
/*
|
||||
* \file trc_pkt_proc_etmv4.h
|
||||
* \brief OpenCSD : ETMv4 packet processor interface classes.
|
||||
*
|
||||
* \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef ARM_TRC_PKT_PROC_ETMV4_H_INCLUDED
|
||||
#define ARM_TRC_PKT_PROC_ETMV4_H_INCLUDED
|
||||
|
||||
|
||||
#include "trc_pkt_types_etmv4.h"
|
||||
#include "common/trc_pkt_proc_base.h"
|
||||
|
||||
class EtmV4IPktProcImpl; /**< ETMv4 I channel packet processor */
|
||||
class EtmV4DPktProcImpl; /**< ETMv4 D channel packet processor */
|
||||
class EtmV4ITrcPacket;
|
||||
class EtmV4DTrcPacket;
|
||||
class EtmV4Config;
|
||||
|
||||
/** @addtogroup ocsd_pkt_proc
|
||||
@{*/
|
||||
|
||||
class TrcPktProcEtmV4I : public TrcPktProcBase< EtmV4ITrcPacket, ocsd_etmv4_i_pkt_type, EtmV4Config>
|
||||
{
|
||||
public:
|
||||
TrcPktProcEtmV4I();
|
||||
TrcPktProcEtmV4I(int instIDNum);
|
||||
virtual ~TrcPktProcEtmV4I();
|
||||
|
||||
protected:
|
||||
/* implementation packet processing interface */
|
||||
virtual ocsd_datapath_resp_t processData( const ocsd_trc_index_t index,
|
||||
const uint32_t dataBlockSize,
|
||||
const uint8_t *pDataBlock,
|
||||
uint32_t *numBytesProcessed);
|
||||
virtual ocsd_datapath_resp_t onEOT();
|
||||
virtual ocsd_datapath_resp_t onReset();
|
||||
virtual ocsd_datapath_resp_t onFlush();
|
||||
virtual ocsd_err_t onProtocolConfig();
|
||||
virtual const bool isBadPacket() const;
|
||||
|
||||
friend class EtmV4IPktProcImpl;
|
||||
|
||||
EtmV4IPktProcImpl *m_pProcessor;
|
||||
};
|
||||
|
||||
|
||||
class TrcPktProcEtmV4D : public TrcPktProcBase< EtmV4DTrcPacket, ocsd_etmv4_d_pkt_type, EtmV4Config>
|
||||
{
|
||||
public:
|
||||
TrcPktProcEtmV4D();
|
||||
TrcPktProcEtmV4D(int instIDNum);
|
||||
virtual ~TrcPktProcEtmV4D();
|
||||
|
||||
protected:
|
||||
/* implementation packet processing interface */
|
||||
virtual ocsd_datapath_resp_t processData( const ocsd_trc_index_t index,
|
||||
const uint32_t dataBlockSize,
|
||||
const uint8_t *pDataBlock,
|
||||
uint32_t *numBytesProcessed);
|
||||
virtual ocsd_datapath_resp_t onEOT();
|
||||
virtual ocsd_datapath_resp_t onReset();
|
||||
virtual ocsd_datapath_resp_t onFlush();
|
||||
virtual ocsd_err_t onProtocolConfig();
|
||||
virtual const bool isBadPacket() const;
|
||||
|
||||
friend class EtmV4DPktProcImpl;
|
||||
|
||||
EtmV4DPktProcImpl *m_pProcessor;
|
||||
};
|
||||
|
||||
/** @}*/
|
||||
|
||||
#endif // ARM_TRC_PKT_PROC_ETMV4_H_INCLUDED
|
||||
|
||||
/* End of File trc_pkt_proc_etmv4.h */
|
350
decoder/include/opencsd/etmv4/trc_pkt_types_etmv4.h
Normal file
350
decoder/include/opencsd/etmv4/trc_pkt_types_etmv4.h
Normal file
@ -0,0 +1,350 @@
|
||||
/*
|
||||
* \file trc_pkt_types_etmv4.h
|
||||
* \brief OpenCSD :
|
||||
*
|
||||
* \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef ARM_TRC_PKT_TYPES_ETMV4_H_INCLUDED
|
||||
#define ARM_TRC_PKT_TYPES_ETMV4_H_INCLUDED
|
||||
|
||||
#include "opencsd/trc_pkt_types.h"
|
||||
|
||||
/** @addtogroup trc_pkts
|
||||
@{*/
|
||||
|
||||
/** @name ETMv4 Packet Types
|
||||
@{*/
|
||||
|
||||
/** I stream packets. */
|
||||
typedef enum _ocsd_etmv4_i_pkt_type
|
||||
{
|
||||
/* state of decode markers */
|
||||
ETM4_PKT_I_NOTSYNC = 0x200, /*!< no sync found yet. */
|
||||
ETM4_PKT_I_INCOMPLETE_EOT, /*!< flushing incomplete/empty packet at end of trace.*/
|
||||
ETM4_PKT_I_NO_ERR_TYPE, /*!< error type not set for packet. */
|
||||
|
||||
/* markers for unknown/bad packets */
|
||||
ETM4_PKT_I_BAD_SEQUENCE = 0x300, /*!< invalid sequence for packet type. */
|
||||
ETM4_PKT_I_BAD_TRACEMODE, /*!< invalid packet type for this trace mode. */
|
||||
ETM4_PKT_I_RESERVED, /*!< packet type reserved. */
|
||||
|
||||
/* I stream packet types. */
|
||||
/* extension header. */
|
||||
ETM4_PKT_I_EXTENSION = 0x00, /*!< b00000000 */
|
||||
|
||||
/* address amd context */
|
||||
ETM4_PKT_I_ADDR_CTXT_L_32IS0 = 0x82, /*!< b10000010 */
|
||||
ETM4_PKT_I_ADDR_CTXT_L_32IS1, /*!< b10000011 */
|
||||
/* unused encoding b10000100 */
|
||||
ETM4_PKT_I_ADDR_CTXT_L_64IS0 = 0x85, /*!< b10000101 */
|
||||
ETM4_PKT_I_ADDR_CTXT_L_64IS1, /*!< b10000110 */
|
||||
/* unused encoding b10000111 */
|
||||
ETM4_PKT_I_CTXT = 0x80, /*!< b1000000x */
|
||||
ETM4_PKT_I_ADDR_MATCH = 0x90, /*!< b10010000 to b10010010 */
|
||||
ETM4_PKT_I_ADDR_L_32IS0 = 0x9A, /*!< b10011010 */
|
||||
ETM4_PKT_I_ADDR_L_32IS1, /*!< b10011011 */
|
||||
/* unused encoding b10011100 */
|
||||
ETM4_PKT_I_ADDR_L_64IS0 = 0x9D, /*!< b10011101 */
|
||||
ETM4_PKT_I_ADDR_L_64IS1, /*!< b10011110 */
|
||||
/* unused encoding b10011111 */
|
||||
ETM4_PKT_I_ADDR_S_IS0 = 0x95, /*!< b10010101 */
|
||||
ETM4_PKT_I_ADDR_S_IS1, /*!< b10010110 */
|
||||
/* unused encoding b10010111
|
||||
unused encoding b10011000
|
||||
unused encoding b10011001 */
|
||||
|
||||
/* Q packets */
|
||||
ETM4_PKT_I_Q = 0xA0, /*!< b1010xxxx */
|
||||
|
||||
/* Atom packets */
|
||||
ETM4_PKT_I_ATOM_F1 = 0xF6, /*!< b1111011x */
|
||||
ETM4_PKT_I_ATOM_F2 = 0xD8, /*!< b110110xx */
|
||||
ETM4_PKT_I_ATOM_F3 = 0xF8, //!< b11111xxx
|
||||
ETM4_PKT_I_ATOM_F4 = 0xDC, //!< b110111xx
|
||||
ETM4_PKT_I_ATOM_F5 = 0xD5, //!< b11010101 - b11010111, b11110101
|
||||
ETM4_PKT_I_ATOM_F6 = 0xC0, //!< b11000000 - b11010100, b11100000 - b11110100
|
||||
|
||||
/* conditional instruction tracing */
|
||||
ETM4_PKT_I_COND_FLUSH = 0x43, //!< b01000011
|
||||
ETM4_PKT_I_COND_I_F1 = 0x6C, //!< b01101100
|
||||
ETM4_PKT_I_COND_I_F2 = 0x40, //!< b01000000 - b01000010
|
||||
ETM4_PKT_I_COND_I_F3 = 0x6D, //!< b01101101
|
||||
ETM4_PKT_I_COND_RES_F1 = 0x68, //!< b0110111x, b011010xx
|
||||
ETM4_PKT_I_COND_RES_F2 = 0x48, //!< b0100100x, b01001010, b0100110x, b01001110
|
||||
ETM4_PKT_I_COND_RES_F3 = 0x50, //!< b0101xxxx
|
||||
ETM4_PKT_I_COND_RES_F4 = 0x44, //!< b0100010x, b01000110
|
||||
|
||||
/* cycle count packets */
|
||||
ETM4_PKT_I_CCNT_F1 = 0x0E, //!< b0000111x
|
||||
ETM4_PKT_I_CCNT_F2 = 0x0C, //!< b0000110x
|
||||
ETM4_PKT_I_CCNT_F3 = 0x10, //!< b0001xxxx
|
||||
// data synchronisation markers
|
||||
ETM4_PKT_I_NUM_DS_MKR = 0x20, //!< b00100xxx
|
||||
ETM4_PKT_I_UNNUM_DS_MKR = 0x28, //!< b00101000 - b00101100
|
||||
// event trace
|
||||
ETM4_PKT_I_EVENT = 0x70, //!< b0111xxxx
|
||||
// Exceptions
|
||||
ETM4_PKT_I_EXCEPT = 0x06, //!< b00000110
|
||||
ETM4_PKT_I_EXCEPT_RTN = 0x07, //!< b00000111
|
||||
// timestamp
|
||||
ETM4_PKT_I_TIMESTAMP = 0x02, //!< b0000001x
|
||||
// speculation
|
||||
ETM4_PKT_I_CANCEL_F1 = 0x2E, //!< b0010111x
|
||||
ETM4_PKT_I_CANCEL_F2 = 0x34, //!< b001101xx
|
||||
ETM4_PKT_I_CANCEL_F3 = 0x38, //!< b00111xxx
|
||||
ETM4_PKT_I_COMMIT = 0x2D, //!< b00101101
|
||||
ETM4_PKT_I_MISPREDICT = 0x30, //!< b001100xx
|
||||
// Sync
|
||||
ETM4_PKT_I_TRACE_INFO = 0x01, //!< b00000001
|
||||
ETM4_PKT_I_TRACE_ON = 0x04, //!< b00000100
|
||||
// extension packets - follow 0x00 header
|
||||
ETM4_PKT_I_ASYNC = 0x100, //!< b00000000
|
||||
ETM4_PKT_I_DISCARD = 0x103, //!< b00000011
|
||||
ETM4_PKT_I_OVERFLOW = 0x105 //!< b00000101
|
||||
|
||||
} ocsd_etmv4_i_pkt_type;
|
||||
|
||||
typedef union _etmv4_trace_info_t {
|
||||
uint32_t val; //!< trace info full value.
|
||||
struct {
|
||||
uint32_t cc_enabled:1; //!< 1 if cycle count enabled
|
||||
uint32_t cond_enabled:3; //!< conditional trace enabeld type
|
||||
uint32_t p0_load:1; //!< 1 if tracing with P0 load elements (for data trace)
|
||||
uint32_t p0_store:1; //1< 1 if tracing with P0 store elements (for data trace)
|
||||
} bits; //!< bitfields for trace info value.
|
||||
} etmv4_trace_info_t;
|
||||
|
||||
typedef struct _etmv4_context_t {
|
||||
struct {
|
||||
uint32_t EL:2; //!< exception level.
|
||||
uint32_t SF:1; //!< sixty four bit
|
||||
uint32_t NS:1; //!< none secure
|
||||
uint32_t updated:1; //!< updated this context packet (otherwise same as last time)
|
||||
uint32_t updated_c:1; //!< updated CtxtID
|
||||
uint32_t updated_v:1; //!< updated VMID
|
||||
};
|
||||
uint32_t ctxtID; //!< Current ctxtID
|
||||
uint32_t VMID; //!< current VMID
|
||||
} etmv4_context_t;
|
||||
|
||||
/** a broadcast address value. */
|
||||
typedef struct _etmv4_addr_val_t {
|
||||
ocsd_vaddr_t val; //!< Address value.
|
||||
uint8_t isa; //!< instruction set.
|
||||
} etmv4_addr_val_t;
|
||||
|
||||
typedef struct _ocsd_etmv4_i_pkt
|
||||
{
|
||||
ocsd_etmv4_i_pkt_type type; /**< Trace packet type derived from header byte */
|
||||
|
||||
//** intra-packet data - valid across packets.
|
||||
|
||||
ocsd_pkt_vaddr v_addr; //!< most recently broadcast address packet
|
||||
uint8_t v_addr_ISA; //!< ISA for the address packet. (0 = IS0 / 1 = IS1)
|
||||
|
||||
etmv4_context_t context; //!< current context for PE
|
||||
|
||||
struct {
|
||||
uint64_t timestamp; //!< current timestamp value
|
||||
uint8_t bits_changed; //!< bits updated in this timestamp packet.
|
||||
} ts;
|
||||
|
||||
uint32_t cc_threshold; //!< cycle count threshold - from trace info.
|
||||
|
||||
// single packet data - only valid for specific packet types on packet instance.
|
||||
ocsd_pkt_atom atom; //!< atom elements - number of atoms indicates validity of packet
|
||||
uint32_t cycle_count; //!< cycle count
|
||||
|
||||
uint32_t curr_spec_depth; //!< current speculation depth
|
||||
uint32_t p0_key; //!< current P0 key value for data packet synchronisation
|
||||
|
||||
uint32_t commit_elements; //<! commit elements indicated by this packet - valid dependent on the packet type.
|
||||
uint32_t cancel_elements; //<! cancel elements indicated by this packet - valid dependent on the packet type.
|
||||
|
||||
etmv4_trace_info_t trace_info; //!< trace info structure - programmed configuration of trace capture.
|
||||
|
||||
struct {
|
||||
uint32_t exceptionType:10; //!< exception number
|
||||
uint32_t addr_interp:2; //!< address value interpretation
|
||||
uint32_t m_fault_pending:1; //!< M class fault pending.
|
||||
uint32_t m_type:1; //!< 1 if M class exception.
|
||||
} exception_info;
|
||||
|
||||
|
||||
uint8_t addr_exact_match_idx; //!< address match index in this packet.
|
||||
uint8_t dsm_val; //!< Data Sync Marker number, or unnumbered atom count - packet type determines.
|
||||
uint8_t event_val; //!< Event value on event packet.
|
||||
|
||||
struct {
|
||||
uint32_t cond_c_key;
|
||||
uint8_t num_c_elem;
|
||||
struct {
|
||||
uint32_t cond_key_set:1;
|
||||
uint32_t f3_final_elem:1;
|
||||
uint32_t f2_cond_incr:1;
|
||||
};
|
||||
} cond_instr;
|
||||
|
||||
struct {
|
||||
uint32_t cond_r_key_0;
|
||||
uint32_t cond_r_key_1;
|
||||
struct {
|
||||
uint32_t res_0:4;
|
||||
uint32_t res_1:4;
|
||||
uint32_t ci_0:1;
|
||||
uint32_t ci_1:1;
|
||||
uint32_t key_res_0_set:1;
|
||||
uint32_t key_res_1_set:1;
|
||||
uint32_t f2_key_incr:2;
|
||||
uint32_t f2f4_token:2;
|
||||
uint32_t f3_tokens:12;
|
||||
};
|
||||
} cond_result;
|
||||
|
||||
struct {
|
||||
uint32_t q_count;
|
||||
struct {
|
||||
uint32_t addr_present:1;
|
||||
uint32_t addr_match:1;
|
||||
uint32_t count_present:1;
|
||||
uint32_t q_type:4;
|
||||
};
|
||||
} Q_pkt;
|
||||
|
||||
//! valid bits for packet elements (addresses have their own valid bits).
|
||||
union {
|
||||
uint32_t val;
|
||||
struct {
|
||||
uint32_t context_valid:1;
|
||||
uint32_t ts_valid:1;
|
||||
uint32_t spec_depth_valid:1;
|
||||
uint32_t p0_key_valid:1;
|
||||
uint32_t cond_c_key_valid:1;
|
||||
uint32_t cond_r_key_valid:1;
|
||||
uint32_t trace_info_valid:1;
|
||||
uint32_t cc_thresh_valid:1;
|
||||
uint32_t cc_valid:1;
|
||||
uint32_t commit_elem_valid:1;
|
||||
} bits;
|
||||
} pkt_valid;
|
||||
|
||||
// original header type when packet type changed to error on decode error.
|
||||
ocsd_etmv4_i_pkt_type err_type;
|
||||
|
||||
} ocsd_etmv4_i_pkt;
|
||||
|
||||
|
||||
// D stream packets
|
||||
typedef enum _ocsd_etmv4_d_pkt_type
|
||||
{
|
||||
// markers for unknown/bad packets
|
||||
ETM4_PKT_D_NOTSYNC = 0x200, //!< no sync found yet
|
||||
ETM4_PKT_D_BAD_SEQUENCE, //!< invalid sequence for packet type
|
||||
ETM4_PKT_D_BAD_TRACEMODE, //!< invalid packet type for this trace mode.
|
||||
ETM4_PKT_D_RESERVED, //!< packet type reserved.
|
||||
ETM4_PKT_D_INCOMPLETE_EOT, //!< flushing incomplete packet at end of trace.
|
||||
ETM4_PKT_D_NO_HEADER, //!< waiting for a header byte
|
||||
ETM4_PKT_D_NO_ERR_TYPE, //!< error packet has no header based type. Use with unknown/res packet types.
|
||||
|
||||
// data sync markers
|
||||
ETM4_PKT_DNUM_DS_MKR = 0x111, // ext packet, b0001xxx1
|
||||
// extension header
|
||||
ETM4_PKT_D_EXTENSION = 0x00, //!< b00000000
|
||||
|
||||
ETM4_PKT_DUNNUM_DS_MKR = 0x01, //!< b00000001
|
||||
// event trace
|
||||
ETM4_PKT_DEVENT = 0x04, //!< b00000100
|
||||
// timestamp
|
||||
ETM4_PKT_DTIMESTAMP = 0x02, //!< b00000010
|
||||
// P1 Data address
|
||||
ETM4_PKT_DADDR_P1_F1 = 0x70, //!< b0111xxxx
|
||||
ETM4_PKT_DADDR_P1_F2 = 0x80, //!< b10xxxxxx
|
||||
ETM4_PKT_DADDR_P1_F3 = 0x14, //!< b000101xx
|
||||
ETM4_PKT_DADDR_P1_F4 = 0x60, //!< b0110xxxx
|
||||
ETM4_PKT_DADDR_P1_F5 = 0xF8, //!< b11111xxx
|
||||
ETM4_PKT_DADDR_P1_F6 = 0xF6, //!< b1111011x
|
||||
ETM4_PKT_DADDR_P1_F7 = 0xF5, //!< b11110101
|
||||
// P2 Data value
|
||||
ETM4_PKT_DVAL_P2_F1 = 0x20, //!< b0010xxxx
|
||||
ETM4_PKT_DVAL_P2_F2 = 0x30, //!< b00110xxx
|
||||
ETM4_PKT_DVAL_P2_F3 = 0x40, //!< b010xxxxx
|
||||
ETM4_PKT_DVAL_P2_F4 = 0x10, //!< b000100xx
|
||||
ETM4_PKT_DVAL_P2_F5 = 0x18, //!< b00011xxx
|
||||
ETM4_PKT_DVAL_P2_F6 = 0x38, //!< b00111xxx
|
||||
// suppression
|
||||
ETM4_PKT_DSUPPRESSION = 0x03, //!< b00000011
|
||||
// synchronisation- extension packets - follow 0x00 header
|
||||
ETM4_PKT_DTRACE_INFO = 0x101, //!< b00000001
|
||||
|
||||
// extension packets - follow 0x00 header
|
||||
ETM4_PKT_D_ASYNC = 0x100, //!< b00000000
|
||||
ETM4_PKT_D_DISCARD = 0x103, //!< b00000011
|
||||
ETM4_PKT_D_OVERFLOW = 0x105 //!< b00000101
|
||||
|
||||
} ocsd_etmv4_d_pkt_type;
|
||||
|
||||
|
||||
typedef struct _ocsd_etmv4_d_pkt
|
||||
{
|
||||
ocsd_etmv4_d_pkt_type type;
|
||||
|
||||
ocsd_pkt_vaddr d_addr;
|
||||
|
||||
uint64_t pkt_val; /**< Packet value -> data value, timestamp value, event value */
|
||||
|
||||
ocsd_etmv4_d_pkt_type err_type;
|
||||
|
||||
} ocsd_etmv4_d_pkt;
|
||||
|
||||
typedef struct _ocsd_etmv4_cfg
|
||||
{
|
||||
uint32_t reg_idr0; /**< ID0 register */
|
||||
uint32_t reg_idr1; /**< ID1 register */
|
||||
uint32_t reg_idr2; /**< ID2 register */
|
||||
uint32_t reg_idr8;
|
||||
uint32_t reg_idr9;
|
||||
uint32_t reg_idr10;
|
||||
uint32_t reg_idr11;
|
||||
uint32_t reg_idr12;
|
||||
uint32_t reg_idr13;
|
||||
uint32_t reg_configr; /**< Config Register */
|
||||
uint32_t reg_traceidr; /**< Trace Stream ID register */
|
||||
ocsd_arch_version_t arch_ver; /**< Architecture version */
|
||||
ocsd_core_profile_t core_prof; /**< Core Profile */
|
||||
} ocsd_etmv4_cfg;
|
||||
|
||||
/** @}*/
|
||||
/** @}*/
|
||||
#endif // ARM_TRC_PKT_TYPES_ETMV4_H_INCLUDED
|
||||
|
||||
/* End of File trc_pkt_types_etmv4.h */
|
||||
|
592
decoder/include/opencsd/ocsd_if_types.h
Normal file
592
decoder/include/opencsd/ocsd_if_types.h
Normal file
@ -0,0 +1,592 @@
|
||||
/*!
|
||||
* \file opencsd/ocsd_if_types.h
|
||||
* \brief OpenCSD : Standard Types used in the library interfaces.
|
||||
*
|
||||
* \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef ARM_OCSD_IF_TYPES_H_INCLUDED
|
||||
#define ARM_OCSD_IF_TYPES_H_INCLUDED
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stddef.h>
|
||||
#if defined(_MSC_VER) && (_MSC_VER < 1900)
|
||||
/** VS2010 does not support inttypes - remove when VS2010 support is dropped */
|
||||
#define __PRI64_PREFIX "ll"
|
||||
#define PRIX64 __PRI64_PREFIX "X"
|
||||
#define PRIu64 __PRI64_PREFIX "u"
|
||||
#define PRIu32 "u"
|
||||
#else
|
||||
#include <inttypes.h>
|
||||
#endif
|
||||
|
||||
|
||||
/** @defgroup ocsd_interfaces OpenCSD Library : Interfaces
|
||||
@brief Set of types, structures and virtual interface classes making up the primary API
|
||||
|
||||
Set of component interfaces that connect various source reader and decode components into a
|
||||
decode tree to allow trace decode for the trace data being output by the source reader.
|
||||
|
||||
@{*/
|
||||
|
||||
|
||||
|
||||
/** @name Trace Indexing and Channel IDs
|
||||
@{*/
|
||||
#ifdef ENABLE_LARGE_TRACE_SOURCES
|
||||
typedef uint64_t ocsd_trc_index_t; /**< Trace source index type - 64 bit size */
|
||||
#define OCSD_TRC_IDX_STR PRIu64
|
||||
#else
|
||||
typedef uint32_t ocsd_trc_index_t; /**< Trace source index type - 32 bit size */
|
||||
#define OCSD_TRC_IDX_STR PRIu32
|
||||
#endif
|
||||
|
||||
/** Invalid trace index value */
|
||||
#define OCSD_BAD_TRC_INDEX ((ocsd_trc_index_t)-1)
|
||||
/** Invalid trace source ID value */
|
||||
#define OCSD_BAD_CS_SRC_ID ((uint8_t)-1)
|
||||
/** macro returing true if trace source ID is in valid range (0x0 < ID < 0x70) */
|
||||
#define OCSD_IS_VALID_CS_SRC_ID(id) ((id > 0) && (id < 0x70))
|
||||
/** macro returing true if trace source ID is in reserved range (ID == 0x0 || 0x70 <= ID <= 0x7F) */
|
||||
#define OCSD_IS_RESERVED_CS_SRC_ID(id) ((id == 0) || ((id >= 0x70) && (id <= 0x7F))
|
||||
/** @}*/
|
||||
|
||||
/** @name General Library Return and Error Codes
|
||||
@{*/
|
||||
|
||||
/** Library Error return type */
|
||||
typedef enum _ocsd_err_t {
|
||||
|
||||
/* general return errors */
|
||||
OCSD_OK = 0, /**< No Error. */
|
||||
OCSD_ERR_FAIL, /**< General systemic failure. */
|
||||
OCSD_ERR_MEM, /**< Internal memory allocation error. */
|
||||
OCSD_ERR_NOT_INIT, /**< Component not initialised or initialisation failure. */
|
||||
OCSD_ERR_INVALID_ID, /**< Invalid CoreSight Trace Source ID. */
|
||||
OCSD_ERR_BAD_HANDLE, /**< Invalid handle passed to component. */
|
||||
OCSD_ERR_INVALID_PARAM_VAL, /**< Invalid value parameter passed to component. */
|
||||
OCSD_ERR_INVALID_PARAM_TYPE, /**< Type mismatch on abstract interface */
|
||||
OCSD_ERR_FILE_ERROR, /**< File access error */
|
||||
OCSD_ERR_NO_PROTOCOL, /**< Trace protocol unsupported */
|
||||
/* attachment point errors */
|
||||
OCSD_ERR_ATTACH_TOO_MANY, /**< Cannot attach - attach device limit reached. */
|
||||
OCSD_ERR_ATTACH_INVALID_PARAM, /**< Cannot attach - invalid parameter. */
|
||||
OCSD_ERR_ATTACH_COMP_NOT_FOUND,/**< Cannot detach - component not found. */
|
||||
/* source reader errors */
|
||||
OCSD_ERR_RDR_FILE_NOT_FOUND, /**< source reader - file not found. */
|
||||
OCSD_ERR_RDR_INVALID_INIT, /**< source reader - invalid initialisation parameter. */
|
||||
OCSD_ERR_RDR_NO_DECODER, /**< source reader - not trace decoder set. */
|
||||
/* data path errors */
|
||||
OCSD_ERR_DATA_DECODE_FATAL, /**< A decoder in the data path has returned a fatal error. */
|
||||
/* frame deformatter errors */
|
||||
OCSD_ERR_DFMTR_NOTCONTTRACE, /**< Trace input to deformatter none-continuous */
|
||||
/* packet processor errors - protocol issues etc */
|
||||
OCSD_ERR_BAD_PACKET_SEQ, /**< Bad packet sequence */
|
||||
OCSD_ERR_INVALID_PCKT_HDR, /**< Invalid packet header */
|
||||
OCSD_ERR_PKT_INTERP_FAIL, /**< Interpreter failed - cannot recover - bad data or sequence */
|
||||
/* packet decoder errors */
|
||||
OCSD_ERR_UNSUPPORTED_ISA, /**< ISA not supported in decoder. */
|
||||
OCSD_ERR_HW_CFG_UNSUPP, /**< Programmed trace configuration not supported by decoder.*/
|
||||
OCSD_ERR_UNSUPP_DECODE_PKT, /**< Packet not supported in decoder */
|
||||
OCSD_ERR_BAD_DECODE_PKT, /**< reserved or unknown packet in decoder. */
|
||||
OCSD_ERR_COMMIT_PKT_OVERRUN, /**< overrun in commit packet stack - tried to commit more than available */
|
||||
OCSD_ERR_MEM_NACC, /**< unable to access required memory address */
|
||||
OCSD_ERR_RET_STACK_OVERFLOW, /**< internal return stack overflow checks failed - popped more than we pushed. */
|
||||
/* decode tree errors */
|
||||
OCSD_ERR_DCDT_NO_FORMATTER, /**< No formatter in use - operation not valid. */
|
||||
/* target memory access errors */
|
||||
OCSD_ERR_MEM_ACC_OVERLAP, /**< Attempted to set an overlapping range in memory access map */
|
||||
OCSD_ERR_MEM_ACC_FILE_NOT_FOUND, /**< Memory access file could not be opened */
|
||||
OCSD_ERR_MEM_ACC_FILE_DIFF_RANGE, /**< Attempt to re-use the same memory access file for a different address range */
|
||||
OCSD_ERR_MEM_ACC_RANGE_INVALID, /**< Address range in accessor set to invalid values */
|
||||
/* test errors - errors generated only by the test code, not the library */
|
||||
OCSD_ERR_TEST_SNAPSHOT_PARSE, /**< test snapshot file parse error */
|
||||
OCSD_ERR_TEST_SNAPSHOT_PARSE_INFO, /**< test snapshot file parse information */
|
||||
OCSD_ERR_TEST_SNAPSHOT_READ, /**< test snapshot reader error */
|
||||
OCSD_ERR_TEST_SS_TO_DECODER, /**< test snapshot to decode tree conversion error */
|
||||
/* decoder registration */
|
||||
OCSD_ERR_DCDREG_NAME_REPEAT, /**< attempted to register a decoder with the same name as another one */
|
||||
OCSD_ERR_DCDREG_NAME_UNKNOWN, /**< attempted to find a decoder with a name that is not known in the library */
|
||||
OCSD_ERR_DCDREG_TYPE_UNKNOWN, /**< attempted to find a decoder with a type that is not known in the library */
|
||||
OCSD_ERR_DCDREG_TOOMANY, /**< attempted to register too many custom decoders */
|
||||
/* decoder config */
|
||||
OCSD_ERR_DCD_INTERFACE_UNUSED, /**< Attempt to connect or use and inteface not supported by this decoder. */
|
||||
/* end marker*/
|
||||
OCSD_ERR_LAST
|
||||
} ocsd_err_t;
|
||||
|
||||
/* component handle types */
|
||||
typedef unsigned int ocsd_hndl_rdr_t; /**< reader control handle */
|
||||
typedef unsigned int ocsd_hndl_err_log_t; /**< error logger connection handle */
|
||||
|
||||
/* common invalid handle type */
|
||||
#define OCSD_INVALID_HANDLE (unsigned int)-1 /**< Global invalid handle value */
|
||||
|
||||
/*! Error Severity Type
|
||||
*
|
||||
* Used to indicate the severity of an error, and also as the
|
||||
* error log verbosity level in the error logger.
|
||||
*
|
||||
* The logger will ignore errors with a severity value higher than the
|
||||
* current verbosity level.
|
||||
*
|
||||
* The value OCSD_ERR_SEV_NONE can only be used as a verbosity level to switch off logging,
|
||||
* not as a severity value on an error. The other values can be used as both error severity and
|
||||
* logger verbosity values.
|
||||
*/
|
||||
typedef enum _ocsd_err_severity_t {
|
||||
OCSD_ERR_SEV_NONE, /**< No error logging. */
|
||||
OCSD_ERR_SEV_ERROR, /**< Most severe error - perhaps fatal. */
|
||||
OCSD_ERR_SEV_WARN, /**< Warning level. Inconsistent or incorrect data seen but can carry on decode processing */
|
||||
OCSD_ERR_SEV_INFO, /**< Information only message. Use for debugging code or suspect input data. */
|
||||
} ocsd_err_severity_t;
|
||||
|
||||
/** @}*/
|
||||
|
||||
/** @name Trace Datapath
|
||||
@{*/
|
||||
|
||||
/** Trace Datapath operations.
|
||||
*/
|
||||
typedef enum _ocsd_datapath_op_t {
|
||||
OCSD_OP_DATA = 0, /**< Standard index + data packet */
|
||||
OCSD_OP_EOT, /**< End of available trace data. No data packet. */
|
||||
OCSD_OP_FLUSH, /**< Flush existing data where possible, retain decode state. No data packet. */
|
||||
OCSD_OP_RESET, /**< Reset decode state - drop any existing partial data. No data packet. */
|
||||
} ocsd_datapath_op_t;
|
||||
|
||||
/**
|
||||
* Trace Datapath responses
|
||||
*/
|
||||
typedef enum _ocsd_datapath_resp_t {
|
||||
OCSD_RESP_CONT, /**< Continue processing */
|
||||
OCSD_RESP_WARN_CONT, /**< Continue processing : a component logged a warning. */
|
||||
OCSD_RESP_ERR_CONT, /**< Continue processing : a component logged an error.*/
|
||||
OCSD_RESP_WAIT, /**< Pause processing */
|
||||
OCSD_RESP_WARN_WAIT, /**< Pause processing : a component logged a warning. */
|
||||
OCSD_RESP_ERR_WAIT, /**< Pause processing : a component logged an error. */
|
||||
OCSD_RESP_FATAL_NOT_INIT, /**< Processing Fatal Error : component unintialised. */
|
||||
OCSD_RESP_FATAL_INVALID_OP, /**< Processing Fatal Error : invalid data path operation. */
|
||||
OCSD_RESP_FATAL_INVALID_PARAM, /**< Processing Fatal Error : invalid parameter in datapath call. */
|
||||
OCSD_RESP_FATAL_INVALID_DATA, /**< Processing Fatal Error : invalid trace data */
|
||||
OCSD_RESP_FATAL_SYS_ERR, /**< Processing Fatal Error : internal system error. */
|
||||
} ocsd_datapath_resp_t;
|
||||
|
||||
/*! Macro returning true if datapath response value is FATAL. */
|
||||
#define OCSD_DATA_RESP_IS_FATAL(x) (x >= OCSD_RESP_FATAL_NOT_INIT)
|
||||
/*! Macro returning true if datapath response value indicates WARNING logged. */
|
||||
#define OCSD_DATA_RESP_IS_WARN(x) ((x == OCSD_RESP_WARN_CONT) || (x == OCSD_RESP_WARN_WAIT))
|
||||
/*! Macro returning true if datapath response value indicates ERROR logged. */
|
||||
#define OCSD_DATA_RESP_IS_ERR(x) ((x == OCSD_RESP_ERR_CONT) || (x == OCSD_RESP_ERR_WAIT))
|
||||
/*! Macro returning true if datapath response value indicates WARNING or ERROR logged. */
|
||||
#define OCSD_DATA_RESP_IS_WARN_OR_ERR(x) (OCSD_DATA_RESP_IS_ERR(x) || OCSD_DATA_RESP_IS_WARN(x))
|
||||
/*! Macro returning true if datapath response value is CONT. */
|
||||
#define OCSD_DATA_RESP_IS_CONT(x) (x < OCSD_RESP_WAIT)
|
||||
/*! Macro returning true if datapath response value is WAIT. */
|
||||
#define OCSD_DATA_RESP_IS_WAIT(x) ((x >= OCSD_RESP_WAIT) && (x < OCSD_RESP_FATAL_NOT_INIT))
|
||||
|
||||
/** @}*/
|
||||
|
||||
/** @name Trace Decode component types
|
||||
@{*/
|
||||
|
||||
|
||||
/** Raw frame element data types
|
||||
Data blocks types output from ITrcRawFrameIn.
|
||||
*/
|
||||
typedef enum _rcdtl_rawframe_elem_t {
|
||||
OCSD_FRM_NONE, /**< None data operation on data path. (EOT etc.) */
|
||||
OCSD_FRM_PACKED, /**< Raw packed frame data */
|
||||
OCSD_FRM_HSYNC, /**< HSYNC data */
|
||||
OCSD_FRM_FSYNC, /**< Frame Sync Data */
|
||||
OCSD_FRM_ID_DATA, /**< unpacked data for ID */
|
||||
} ocsd_rawframe_elem_t;
|
||||
|
||||
|
||||
/** Indicates if the trace source will be frame formatted or a single protocol source.
|
||||
Used in decode tree creation and configuration code.
|
||||
*/
|
||||
typedef enum _ocsd_dcd_tree_src_t {
|
||||
OCSD_TRC_SRC_FRAME_FORMATTED, /**< input source is frame formatted. */
|
||||
OCSD_TRC_SRC_SINGLE, /**< input source is from a single protocol generator. */
|
||||
} ocsd_dcd_tree_src_t;
|
||||
|
||||
#define OCSD_DFRMTR_HAS_FSYNCS 0x01 /**< Deformatter Config : formatted data has fsyncs - input data 4 byte aligned */
|
||||
#define OCSD_DFRMTR_HAS_HSYNCS 0x02 /**< Deformatter Config : formatted data has hsyncs - input data 2 byte aligned */
|
||||
#define OCSD_DFRMTR_FRAME_MEM_ALIGN 0x04 /**< Deformatter Config : formatted frames are memory aligned, no syncs. Input data 16 byte frame aligned. */
|
||||
#define OCSD_DFRMTR_PACKED_RAW_OUT 0x08 /**< Deformatter Config : output raw packed frame data if raw monitor attached. */
|
||||
#define OCSD_DFRMTR_UNPACKED_RAW_OUT 0x10 /**< Deformatter Config : output raw unpacked frame data if raw monitor attached. */
|
||||
#define OCSD_DFRMTR_RESET_ON_4X_FSYNC 0x20 /**< Deformatter Config : reset downstream decoders if frame aligned 4x consecutive fsyncs spotted. (perf workaround) */
|
||||
#define OCSD_DFRMTR_VALID_MASK 0x3F /**< Deformatter Config : valid mask for deformatter configuration */
|
||||
|
||||
#define OCSD_DFRMTR_FRAME_SIZE 0x10 /**< CoreSight frame formatter frame size constant in bytes. */
|
||||
|
||||
/** @}*/
|
||||
|
||||
/** @name Trace Decode Component Name Prefixes
|
||||
*
|
||||
* Set of standard prefixes to be used for component names
|
||||
@{*/
|
||||
|
||||
/** Component name prefix for trace source reader components */
|
||||
#define OCSD_CMPNAME_PREFIX_SOURCE_READER "SRDR"
|
||||
/** Component name prefix for trace frame deformatter component */
|
||||
#define OCSD_CMPNAME_PREFIX_FRAMEDEFORMATTER "DFMT"
|
||||
/** Component name prefix for trace packet processor. */
|
||||
#define OCSD_CMPNAME_PREFIX_PKTPROC "PKTP"
|
||||
/** Component name prefix for trace packet decoder. */
|
||||
#define OCSD_CMPNAME_PREFIX_PKTDEC "PDEC"
|
||||
|
||||
/** @}*/
|
||||
|
||||
/** @name Trace Decode Arch and Profile
|
||||
@{*/
|
||||
|
||||
/** Core Architecture Version */
|
||||
typedef enum _ocsd_arch_version {
|
||||
ARCH_UNKNOWN, /**< unknown architecture */
|
||||
ARCH_V7, /**< V7 architecture */
|
||||
ARCH_V8, /**< V8 architecture */
|
||||
ARCH_CUSTOM, /**< None ARM, custom architecture */
|
||||
} ocsd_arch_version_t;
|
||||
|
||||
/** Core Profile */
|
||||
typedef enum _ocsd_core_profile {
|
||||
profile_Unknown, /**< Unknown profile */
|
||||
profile_CortexM, /**< Cortex-M profile */
|
||||
profile_CortexR, /**< Cortex-R profile */
|
||||
profile_CortexA, /**< Cortex-A profile */
|
||||
profile_Custom, /**< None ARM, custom arch profile */
|
||||
} ocsd_core_profile_t;
|
||||
|
||||
/** Combined architecture and profile descriptor for a core */
|
||||
typedef struct _ocsd_arch_profile_t {
|
||||
ocsd_arch_version_t arch; /**< core architecture */
|
||||
ocsd_core_profile_t profile; /**< core profile */
|
||||
} ocsd_arch_profile_t;
|
||||
|
||||
/* may want to use a 32 bit v-addr when running on 32 bit only ARM platforms. */
|
||||
#ifdef USE_32BIT_V_ADDR
|
||||
typedef uint32_t ocsd_vaddr_t; /**< 32 bit virtual addressing in library - use if compiling on 32 bit platforms */
|
||||
#define OCSD_MAX_VA_BITSIZE 32 /**< 32 bit Virtual address bitsize macro */
|
||||
#define OCSD_VA_MASK ~0UL /**< 32 bit Virtual address bitsize mask */
|
||||
#else
|
||||
typedef uint64_t ocsd_vaddr_t; /**< 64 bit virtual addressing in library */
|
||||
#define OCSD_MAX_VA_BITSIZE 64 /**< 64 bit Virtual address bitsize macro */
|
||||
#define OCSD_VA_MASK ~0ULL /**< 64 bit Virtual address bitsize mask */
|
||||
#endif
|
||||
|
||||
/** A bit mask for the first 'bits' consecutive bits of an address */
|
||||
#define OCSD_BIT_MASK(bits) (bits == OCSD_MAX_VA_BITSIZE) ? OCSD_VA_MASK : ((ocsd_vaddr_t)1 << bits) - 1
|
||||
|
||||
/** @}*/
|
||||
|
||||
/** @name Instruction Decode Information
|
||||
@{*/
|
||||
|
||||
/** Instruction Set Architecture type
|
||||
*
|
||||
*/
|
||||
typedef enum _ocsd_isa
|
||||
{
|
||||
ocsd_isa_arm, /**< V7 ARM 32, V8 AArch32 */
|
||||
ocsd_isa_thumb2, /**< Thumb2 -> 16/32 bit instructions */
|
||||
ocsd_isa_aarch64, /**< V8 AArch64 */
|
||||
ocsd_isa_tee, /**< Thumb EE - unsupported */
|
||||
ocsd_isa_jazelle, /**< Jazelle - unsupported in trace */
|
||||
ocsd_isa_custom, /**< Instruction set - custom arch decoder */
|
||||
ocsd_isa_unknown /**< ISA not yet known */
|
||||
} ocsd_isa;
|
||||
|
||||
/** Security level type
|
||||
*/
|
||||
typedef enum _ocsd_sec_level
|
||||
{
|
||||
ocsd_sec_secure, /**< Core is in secure state */
|
||||
ocsd_sec_nonsecure /**< Core is in non-secure state */
|
||||
} ocsd_sec_level ;
|
||||
|
||||
/** Exception level type
|
||||
*/
|
||||
typedef enum _ocsd_ex_level
|
||||
{
|
||||
ocsd_EL_unknown = -1, /**< EL unknown / unsupported in trace */
|
||||
ocsd_EL0 = 0, /**< EL0 */
|
||||
ocsd_EL1, /**< EL1 */
|
||||
ocsd_EL2, /**< EL2 */
|
||||
ocsd_EL3, /**< EL3 */
|
||||
} ocsd_ex_level;
|
||||
|
||||
|
||||
/** instruction types - significant for waypoint calculaitons */
|
||||
typedef enum _ocsd_instr_type {
|
||||
OCSD_INSTR_OTHER, /**< Other instruction - not significant for waypoints. */
|
||||
OCSD_INSTR_BR, /**< Immediate Branch instruction */
|
||||
OCSD_INSTR_BR_INDIRECT, /**< Indirect Branch instruction */
|
||||
OCSD_INSTR_ISB, /**< Barrier : ISB instruction */
|
||||
OCSD_INSTR_DSB_DMB /**< Barrier : DSB or DMB instruction */
|
||||
} ocsd_instr_type;
|
||||
|
||||
/** instruction sub types - addiitonal information passed to the output packets
|
||||
for trace analysis tools.
|
||||
*/
|
||||
typedef enum _ocsd_instr_subtype {
|
||||
OCSD_S_INSTR_NONE, /**< no subtype set */
|
||||
OCSD_S_INSTR_BR_LINK, /**< branch with link */
|
||||
OCSD_S_INSTR_V8_RET, /**< v8 ret instruction - subtype of BR_INDIRECT */
|
||||
OCSD_S_INSTR_V8_ERET, /**< v8 eret instruction - subtype of BR_INDIRECT */
|
||||
} ocsd_instr_subtype;
|
||||
|
||||
/** Instruction decode request structure.
|
||||
*
|
||||
* Used in IInstrDecode interface.
|
||||
*
|
||||
* Caller fills in the input: information, callee then fills in the decoder: information.
|
||||
*/
|
||||
typedef struct _ocsd_instr_info {
|
||||
/* input information */
|
||||
ocsd_arch_profile_t pe_type; /**< input: Core Arch and profile */
|
||||
ocsd_isa isa; /**< Input: Current ISA. */
|
||||
ocsd_vaddr_t instr_addr; /**< Input: Instruction address. */
|
||||
uint32_t opcode; /**< Input: Opcode at address. 16 bit opcodes will use MS 16bits of parameter. */
|
||||
uint8_t dsb_dmb_waypoints; /**< Input: DMB and DSB are waypoints */
|
||||
|
||||
/* instruction decode info */
|
||||
ocsd_instr_type type; /**< Decoder: Current instruction type. */
|
||||
ocsd_vaddr_t branch_addr; /**< Decoder: Calculated address of branch instrcution (direct branches only) */
|
||||
ocsd_isa next_isa; /**< Decoder: ISA for next intruction. */
|
||||
uint8_t instr_size; /**< Decoder : size of the decoded instruction */
|
||||
uint8_t is_conditional; /**< Decoder : set to 1 if this instruction is conditional */
|
||||
uint8_t is_link; /**< Decoder : is a branch with link instruction */
|
||||
uint8_t thumb_it_conditions; /**< Decoder : return number of following instructions set with conditions by this Thumb IT instruction */
|
||||
ocsd_instr_subtype sub_type; /**< Decoder : current instruction sub-type if known */
|
||||
} ocsd_instr_info;
|
||||
|
||||
|
||||
/** Core(PE) context structure
|
||||
records current security state, exception level, VMID and ContextID for core.
|
||||
*/
|
||||
typedef struct _ocsd_pe_context {
|
||||
ocsd_sec_level security_level; /**< security state */
|
||||
ocsd_ex_level exception_level; /**< exception level */
|
||||
uint32_t context_id; /**< context ID */
|
||||
uint32_t vmid; /**< VMID */
|
||||
struct {
|
||||
uint32_t bits64:1; /**< 1 if 64 bit operation */
|
||||
uint32_t ctxt_id_valid:1; /**< 1 if context ID value valid */
|
||||
uint32_t vmid_valid:1; /**< 1 if VMID value is valid */
|
||||
uint32_t el_valid:1; /**< 1 if EL value is valid (ETMv4 traces EL, other protocols do not) */
|
||||
};
|
||||
} ocsd_pe_context;
|
||||
|
||||
|
||||
/** @}*/
|
||||
|
||||
/** @name Opcode Memory Access
|
||||
Types used when accessing memory storage for traced opcodes..
|
||||
@{*/
|
||||
|
||||
/** memory space bitfield enum for available security states and exception levels used
|
||||
when accessing memory. */
|
||||
typedef enum _ocsd_mem_space_acc_t {
|
||||
OCSD_MEM_SPACE_EL1S = 0x1, /**< S EL1/0 */
|
||||
OCSD_MEM_SPACE_EL1N = 0x2, /**< NS EL1/0 */
|
||||
OCSD_MEM_SPACE_EL2 = 0x4, /**< NS EL2 */
|
||||
OCSD_MEM_SPACE_EL3 = 0x8, /**< S EL3 */
|
||||
OCSD_MEM_SPACE_S = 0x9, /**< Any S */
|
||||
OCSD_MEM_SPACE_N = 0x6, /**< Any NS */
|
||||
OCSD_MEM_SPACE_ANY = 0xF, /**< Any sec level / EL - live system use current EL + sec state */
|
||||
} ocsd_mem_space_acc_t;
|
||||
|
||||
/**
|
||||
* Callback function definition for callback function memory accessor type.
|
||||
*
|
||||
* When using callback memory accessor, the decoder will call this function to obtain the
|
||||
* memory at the address for the current opcodes. The memory space will represent the current
|
||||
* exception level and security context of the traced code.
|
||||
*
|
||||
* Return the number of bytes read, which can be less than the amount requested if this would take the
|
||||
* access address outside the range of addresses defined when this callback was registered with the decoder.
|
||||
*
|
||||
* Return 0 bytes if start address out of covered range, or memory space is not one of those defined as supported
|
||||
* when the callback was registered.
|
||||
*
|
||||
* @param p_context : opaque context pointer set by callback client.
|
||||
* @param address : start address of memory to be accessed
|
||||
* @param mem_space : memory space of accessed memory (current EL & security state)
|
||||
* @param reqBytes : number of bytes required
|
||||
* @param *byteBuffer : buffer for data.
|
||||
*
|
||||
* @return uint32_t : Number of bytes actually read, or 0 for access error.
|
||||
*/
|
||||
typedef uint32_t (* Fn_MemAcc_CB)(const void *p_context, const ocsd_vaddr_t address, const ocsd_mem_space_acc_t mem_space, const uint32_t reqBytes, uint8_t *byteBuffer);
|
||||
|
||||
|
||||
/** memory region type for adding multi-region binary files to memory access interface */
|
||||
typedef struct _ocsd_file_mem_region {
|
||||
size_t file_offset; /**< Offset from start of file for memory region */
|
||||
ocsd_vaddr_t start_address; /**< Start address of memory region */
|
||||
size_t region_size; /**< size in bytes of memory region */
|
||||
} ocsd_file_mem_region_t;
|
||||
|
||||
/** @}*/
|
||||
|
||||
/** @name Packet Processor Operation Control Flags
|
||||
common operational flags - bottom 16 bits,
|
||||
component specific - top 16 bits.
|
||||
@{*/
|
||||
|
||||
#define OCSD_OPFLG_PKTPROC_NOFWD_BAD_PKTS 0x00000001 /**< don't forward bad packets up data path */
|
||||
#define OCSD_OPFLG_PKTPROC_NOMON_BAD_PKTS 0x00000002 /**< don't forward bad packets to monitor interface */
|
||||
#define OCSD_OPFLG_PKTPROC_ERR_BAD_PKTS 0x00000004 /**< throw error for bad packets - halt decoding. */
|
||||
#define OCSD_OPFLG_PKTPROC_UNSYNC_ON_BAD_PKTS 0x00000008 /**< switch to unsynced state on bad packets - wait for next sync point */
|
||||
|
||||
/** mask to combine all common packet processor operational control flags */
|
||||
#define OCSD_OPFLG_PKTPROC_COMMON (OCSD_OPFLG_PKTPROC_NOFWD_BAD_PKTS | \
|
||||
OCSD_OPFLG_PKTPROC_NOMON_BAD_PKTS | \
|
||||
OCSD_OPFLG_PKTPROC_ERR_BAD_PKTS | \
|
||||
OCSD_OPFLG_PKTPROC_UNSYNC_ON_BAD_PKTS )
|
||||
|
||||
/** @}*/
|
||||
|
||||
/** @name Packet Decoder Operation Control Flags
|
||||
common operational flags - bottom 16 bits,
|
||||
component specific - top 16 bits.
|
||||
@{*/
|
||||
|
||||
#define OCSD_OPFLG_PKTDEC_ERROR_BAD_PKTS 0x00000001 /**< throw error on bad packets input (default is to unsync and wait) */
|
||||
|
||||
/** mask to combine all common packet processor operational control flags */
|
||||
#define OCSD_OPFLG_PKTDEC_COMMON (OCSD_OPFLG_PKTDEC_ERROR_BAD_PKTS)
|
||||
|
||||
/** @}*/
|
||||
|
||||
/** @name Decoder creation information
|
||||
|
||||
Flags to use when creating decoders by name
|
||||
|
||||
Builtin decoder names.
|
||||
|
||||
Protocol type enum.
|
||||
@{*/
|
||||
|
||||
#define OCSD_CREATE_FLG_PACKET_PROC 0x01 /**< Create packet processor only. */
|
||||
#define OCSD_CREATE_FLG_FULL_DECODER 0x02 /**< Create packet processor + decoder pair */
|
||||
#define OCSD_CREATE_FLG_INST_ID 0x04 /**< Use instance ID in decoder instance name */
|
||||
|
||||
#define OCSD_BUILTIN_DCD_STM "STM" /**< STM decoder */
|
||||
#define OCSD_BUILTIN_DCD_ETMV3 "ETMV3" /**< ETMv3 decoder */
|
||||
#define OCSD_BUILTIN_DCD_ETMV4I "ETMV4I" /**< ETMv4 instruction decoder */
|
||||
#define OCSD_BUILTIN_DCD_ETMV4D "ETMV4D" /**< ETMv4 data decoder */
|
||||
#define OCSD_BUILTIN_DCD_PTM "PTM" /**< PTM decoder */
|
||||
|
||||
/*! Trace Protocol Builtin Types + extern
|
||||
*/
|
||||
typedef enum _ocsd_trace_protocol_t {
|
||||
OCSD_PROTOCOL_UNKNOWN = 0, /**< Protocol unknown */
|
||||
|
||||
/* Built in library decoders */
|
||||
OCSD_PROTOCOL_ETMV3, /**< ETMV3 instruction and data trace protocol decoder. */
|
||||
OCSD_PROTOCOL_ETMV4I, /**< ETMV4 instruction trace protocol decoder. */
|
||||
OCSD_PROTOCOL_ETMV4D, /**< ETMV4 data trace protocol decoder. */
|
||||
OCSD_PROTOCOL_PTM, /**< PTM program flow instruction trace protocol decoder. */
|
||||
OCSD_PROTOCOL_STM, /**< STM system trace protocol decoder. */
|
||||
|
||||
/* others to be added here */
|
||||
OCSD_PROTOCOL_BUILTIN_END, /**< Invalid protocol - built-in protocol types end marker */
|
||||
|
||||
/* Custom / external decoders */
|
||||
OCSD_PROTOCOL_CUSTOM_0 = 100, /**< Values from this onwards are assigned to external registered decoders */
|
||||
OCSD_PROTOCOL_CUSTOM_1,
|
||||
OCSD_PROTOCOL_CUSTOM_2,
|
||||
OCSD_PROTOCOL_CUSTOM_3,
|
||||
OCSD_PROTOCOL_CUSTOM_4,
|
||||
OCSD_PROTOCOL_CUSTOM_5,
|
||||
OCSD_PROTOCOL_CUSTOM_6,
|
||||
OCSD_PROTOCOL_CUSTOM_7,
|
||||
OCSD_PROTOCOL_CUSTOM_8,
|
||||
OCSD_PROTOCOL_CUSTOM_9,
|
||||
|
||||
OCSD_PROTOCOL_END /**< Invalid protocol - protocol types end marker */
|
||||
} ocsd_trace_protocol_t;
|
||||
|
||||
/** Test if protocol type is a library built-in decoder */
|
||||
#define OCSD_PROTOCOL_IS_BUILTIN(P) ((P > OCSD_PROTOCOL_UNKNOWN) && (P < OCSD_PROTOCOL_BUILTIN_END))
|
||||
|
||||
/** Test if protocol type is a custom external registered decoder */
|
||||
#define OCSD_PROTOCOL_IS_CUSTOM(P) ((P >= OCSD_PROTOCOL_CUSTOM_0) && (P < OCSD_PROTOCOL_END ))
|
||||
|
||||
/** @}*/
|
||||
|
||||
|
||||
/** @name Software Trace Packets Info
|
||||
|
||||
Contains the information for the generic software trace output packet.
|
||||
|
||||
Software trace packet master and channel data.
|
||||
Payload info:
|
||||
size - packet payload size in bits;
|
||||
marker - if this packet has a marker/flag
|
||||
timestamp - if this packet has a timestamp associated
|
||||
number of packets - packet processor can optionally correlate identically
|
||||
sized packets on the same master / channel to be output as a single generic packet
|
||||
|
||||
Payload output as separate LE buffer, of sufficient bytes to hold all the packets.
|
||||
@{*/
|
||||
|
||||
typedef struct _ocsd_swt_info {
|
||||
uint16_t swt_master_id;
|
||||
uint16_t swt_channel_id;
|
||||
union {
|
||||
struct {
|
||||
uint32_t swt_payload_pkt_bitsize:8; /**< [bits 0:7 ] Packet size in bits of the payload packets */
|
||||
uint32_t swt_payload_num_packets:8; /**< [bits 8:15 ] number of consecutive packets of this type in the payload data */
|
||||
uint32_t swt_marker_packet:1; /**< [bit 16 ] packet is marker / flag packet */
|
||||
uint32_t swt_has_timestamp:1; /**< [bit 17 ] packet has timestamp. */
|
||||
uint32_t swt_marker_first:1; /**< [bit 18 ] for multiple packet payloads, this indicates if any marker is on first or last packet */
|
||||
uint32_t swt_master_err:1; /**< [bit 19 ] current master has error - payload is error code */
|
||||
uint32_t swt_global_err:1; /**< [bit 20 ] global error - payload is error code - master and channel ID not valid */
|
||||
uint32_t swt_trigger_event:1; /**< [bit 21 ] trigger event packet - payload is event number */
|
||||
uint32_t swt_frequency:1; /**< [bit 22 ] frequency packet - payload is frequency */
|
||||
uint32_t swt_id_valid:1; /**< [bit 23 ] master & channel ID has been set by input stream */
|
||||
};
|
||||
uint32_t swt_flag_bits;
|
||||
};
|
||||
} ocsd_swt_info_t;
|
||||
|
||||
/** mask for the swt_id_valid flag - need to retain between packets */
|
||||
#define SWT_ID_VALID_MASK (0x1 << 23)
|
||||
|
||||
/** @}*/
|
||||
|
||||
/** @}*/
|
||||
#endif // ARM_OCSD_IF_TYPES_H_INCLUDED
|
||||
|
||||
/* End of File opencsd/ocsd_if_types.h */
|
46
decoder/include/opencsd/ptm/ptm_decoder.h
Normal file
46
decoder/include/opencsd/ptm/ptm_decoder.h
Normal file
@ -0,0 +1,46 @@
|
||||
/*
|
||||
* \file ptm_decoder.h
|
||||
* \brief OpenCSD :
|
||||
*
|
||||
* \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef ARM_PTM_DECODER_H_INCLUDED
|
||||
#define ARM_PTM_DECODER_H_INCLUDED
|
||||
|
||||
#include "trc_cmp_cfg_ptm.h"
|
||||
#include "trc_pkt_elem_ptm.h"
|
||||
#include "trc_pkt_proc_ptm.h"
|
||||
#include "trc_pkt_types_ptm.h"
|
||||
#include "trc_pkt_decode_ptm.h"
|
||||
|
||||
#endif // ARM_PTM_DECODER_H_INCLUDED
|
||||
|
||||
/* End of File ptm_decoder.h */
|
210
decoder/include/opencsd/ptm/trc_cmp_cfg_ptm.h
Normal file
210
decoder/include/opencsd/ptm/trc_cmp_cfg_ptm.h
Normal file
@ -0,0 +1,210 @@
|
||||
/*
|
||||
* \file trc_cmp_cfg_ptm.h
|
||||
* \brief OpenCSD :
|
||||
*
|
||||
* \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef ARM_TRC_CMP_CFG_PTM_H_INCLUDED
|
||||
#define ARM_TRC_CMP_CFG_PTM_H_INCLUDED
|
||||
|
||||
#include "trc_pkt_types_ptm.h"
|
||||
#include "common/trc_cs_config.h"
|
||||
|
||||
/** @defgroup ocsd_protocol_cfg OpenCSD Library : Trace Source Protocol Configuration.
|
||||
|
||||
@brief Classes describing the trace capture time configuration of the trace source hardware.
|
||||
|
||||
Protocol configuration represents the trace capture time settings for the CoreSight hardware
|
||||
component generating the trace. The packet processors and packet decoders require this configuration
|
||||
information to correctly interpret packets and decode trace.
|
||||
|
||||
@{*/
|
||||
|
||||
/** @name PTM configuration
|
||||
@{*/
|
||||
|
||||
/*!
|
||||
* @class PtmConfig
|
||||
* @brief Interpreter class for PTM Hardware configuration.
|
||||
*
|
||||
* Provides quick value interpretation methods for the PTM config register values.
|
||||
* Primarily inlined for efficient code.
|
||||
*/
|
||||
class PtmConfig : public CSConfig // public ocsd_ptm_cfg
|
||||
{
|
||||
public:
|
||||
PtmConfig(); /**< Default constructor */
|
||||
PtmConfig(const ocsd_ptm_cfg *cfg_regs);
|
||||
~PtmConfig() {}; /**< Default destructor */
|
||||
|
||||
/* register bit constants. */
|
||||
static const uint32_t CTRL_BRANCH_BCAST = (0x1 << 8);
|
||||
static const uint32_t CTRL_CYCLEACC = (0x1 << 12);
|
||||
static const uint32_t CTRL_TS_ENA = (0x1 << 28);
|
||||
static const uint32_t CTRL_RETSTACK_ENA = (0x1 << 29);
|
||||
static const uint32_t CTRL_VMID_ENA = (0x1 << 30);
|
||||
|
||||
static const uint32_t CCER_TS_IMPL = (0x1 << 22);
|
||||
static const uint32_t CCER_RESTACK_IMPL = (0x1 << 23);
|
||||
static const uint32_t CCER_DMSB_WPT = (0x1 << 24);
|
||||
static const uint32_t CCER_TS_DMSB = (0x1 << 25);
|
||||
static const uint32_t CCER_VIRTEXT = (0x1 << 26);
|
||||
static const uint32_t CCER_TS_ENC_NAT = (0x1 << 28);
|
||||
static const uint32_t CCER_TS_64BIT = (0x1 << 29);
|
||||
|
||||
// operations to convert to and from C-API structure
|
||||
|
||||
//! copy assignment operator for base structure into class.
|
||||
PtmConfig & operator=(const ocsd_ptm_cfg *p_cfg);
|
||||
|
||||
//! cast operator returning struct const reference
|
||||
operator const ocsd_ptm_cfg &() const { return m_cfg; };
|
||||
//! cast operator returning struct const pointer
|
||||
operator const ocsd_ptm_cfg *() const { return &m_cfg; };
|
||||
|
||||
// access functions
|
||||
|
||||
const bool enaBranchBCast() const; //!< Branch broadcast enabled.
|
||||
const bool enaCycleAcc() const; //!< cycle accurate tracing enabled.
|
||||
|
||||
const bool enaRetStack() const; //!< return stack enabled.
|
||||
const bool hasRetStack() const; //!< return stack implemented.
|
||||
|
||||
const int MinorRev() const; //!< return X revision in 1.X
|
||||
|
||||
const bool hasTS() const; //!< Timestamps implemented in trace.
|
||||
const bool enaTS() const; //!< Timestamp trace is enabled.
|
||||
const bool TSPkt64() const; //!< timestamp packet is 64 bits in size.
|
||||
const bool TSBinEnc() const; //!< Timestamp encoded as natural binary number.
|
||||
|
||||
const int CtxtIDBytes() const; //!< number of context ID bytes traced 1,2,4;
|
||||
const bool hasVirtExt() const; //!< processor has virtualisation extensions.
|
||||
const bool enaVMID() const; //!< VMID tracing enabled.
|
||||
|
||||
const bool dmsbGenTS() const; //!< TS generated for DMB and DSB
|
||||
const bool dmsbWayPt() const; //!< DMB and DSB are waypoint instructions.
|
||||
|
||||
virtual const uint8_t getTraceID() const; //!< CoreSight Trace ID for this device.
|
||||
|
||||
const ocsd_core_profile_t &coreProfile() const { return m_cfg.core_prof; };
|
||||
const ocsd_arch_version_t &archVersion() const { return m_cfg.arch_ver; };
|
||||
|
||||
private:
|
||||
ocsd_ptm_cfg m_cfg;
|
||||
};
|
||||
|
||||
/* inlines */
|
||||
|
||||
inline PtmConfig & PtmConfig::operator=(const ocsd_ptm_cfg *p_cfg)
|
||||
{
|
||||
// object of base class ocsd_ptm_cfg
|
||||
m_cfg = *p_cfg;
|
||||
return *this;
|
||||
}
|
||||
|
||||
inline const bool PtmConfig::enaBranchBCast() const
|
||||
{
|
||||
return (bool)((m_cfg.reg_ctrl & CTRL_BRANCH_BCAST) != 0);
|
||||
}
|
||||
|
||||
inline const bool PtmConfig::enaCycleAcc() const
|
||||
{
|
||||
return (bool)((m_cfg.reg_ctrl & CTRL_CYCLEACC) != 0);
|
||||
}
|
||||
|
||||
inline const bool PtmConfig::enaRetStack() const
|
||||
{
|
||||
return (bool)((m_cfg.reg_ctrl & CTRL_RETSTACK_ENA) != 0);
|
||||
}
|
||||
|
||||
inline const bool PtmConfig::hasRetStack() const
|
||||
{
|
||||
return (bool)((m_cfg.reg_ccer & CCER_RESTACK_IMPL) != 0);
|
||||
}
|
||||
|
||||
inline const int PtmConfig::MinorRev() const
|
||||
{
|
||||
return ((int)m_cfg.reg_idr & 0xF0) >> 4;
|
||||
}
|
||||
|
||||
inline const bool PtmConfig::hasTS() const
|
||||
{
|
||||
return (bool)((m_cfg.reg_ccer & CCER_TS_IMPL) != 0);
|
||||
}
|
||||
|
||||
inline const bool PtmConfig::enaTS() const
|
||||
{
|
||||
return (bool)((m_cfg.reg_ctrl & CTRL_TS_ENA) != 0);
|
||||
}
|
||||
|
||||
inline const bool PtmConfig::TSPkt64() const
|
||||
{
|
||||
if(MinorRev() == 0) return false;
|
||||
return (bool)((m_cfg.reg_ccer & CCER_TS_64BIT) != 0);
|
||||
}
|
||||
|
||||
inline const bool PtmConfig::TSBinEnc() const
|
||||
{
|
||||
if(MinorRev() == 0) return false;
|
||||
return (bool)((m_cfg.reg_ccer & CCER_TS_ENC_NAT) != 0);
|
||||
}
|
||||
|
||||
inline const bool PtmConfig::hasVirtExt() const
|
||||
{
|
||||
return (bool)((m_cfg.reg_ccer & CCER_VIRTEXT) != 0);
|
||||
}
|
||||
|
||||
inline const bool PtmConfig::enaVMID() const
|
||||
{
|
||||
return (bool)((m_cfg.reg_ctrl & CTRL_VMID_ENA) != 0);
|
||||
}
|
||||
|
||||
inline const bool PtmConfig::dmsbGenTS() const
|
||||
{
|
||||
return (bool)((m_cfg.reg_ccer & CCER_TS_DMSB) != 0);
|
||||
}
|
||||
|
||||
inline const bool PtmConfig::dmsbWayPt() const
|
||||
{
|
||||
return (bool)((m_cfg.reg_ccer & CCER_DMSB_WPT) != 0);
|
||||
}
|
||||
|
||||
inline const uint8_t PtmConfig::getTraceID() const
|
||||
{
|
||||
return (uint8_t)(m_cfg.reg_trc_id & 0x7F);
|
||||
}
|
||||
|
||||
/** @}*/
|
||||
/** @}*/
|
||||
#endif // ARM_TRC_CMP_CFG_PTM_H_INCLUDED
|
||||
|
||||
/* End of File trc_cmp_cfg_ptm.h */
|
57
decoder/include/opencsd/ptm/trc_dcd_mngr_ptm.h
Normal file
57
decoder/include/opencsd/ptm/trc_dcd_mngr_ptm.h
Normal file
@ -0,0 +1,57 @@
|
||||
/*
|
||||
* \file trc_dcd_mngr_ptm.h
|
||||
* \brief OpenCSD : PTM decoder manager / handler specialisation
|
||||
*
|
||||
* \copyright Copyright (c) 2016, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
#ifndef ARM_TRC_DCD_MNGR_PTM_H_INCLUDED
|
||||
#define ARM_TRC_DCD_MNGR_PTM_H_INCLUDED
|
||||
|
||||
#include "common/ocsd_dcd_mngr.h"
|
||||
#include "trc_pkt_decode_ptm.h"
|
||||
#include "trc_pkt_proc_ptm.h"
|
||||
#include "trc_cmp_cfg_ptm.h"
|
||||
#include "trc_pkt_types_ptm.h"
|
||||
|
||||
class DecoderMngrPtm : public DecodeMngrFullDcd< PtmTrcPacket,
|
||||
ocsd_ptm_pkt_type,
|
||||
PtmConfig,
|
||||
ocsd_ptm_cfg,
|
||||
TrcPktProcPtm,
|
||||
TrcPktDecodePtm>
|
||||
{
|
||||
public:
|
||||
DecoderMngrPtm(const std::string &name) : DecodeMngrFullDcd(name,OCSD_PROTOCOL_PTM) {};
|
||||
virtual ~DecoderMngrPtm() {};
|
||||
};
|
||||
|
||||
#endif // ARM_TRC_DCD_MNGR_PTM_H_INCLUDED
|
||||
|
||||
/* End of File trc_dcd_mngr_ptm.h */
|
197
decoder/include/opencsd/ptm/trc_pkt_decode_ptm.h
Normal file
197
decoder/include/opencsd/ptm/trc_pkt_decode_ptm.h
Normal file
@ -0,0 +1,197 @@
|
||||
/*
|
||||
* \file trc_pkt_decode_ptm.h
|
||||
* \brief OpenCSD : PTM packet decoder.
|
||||
*
|
||||
* \copyright Copyright (c) 2016, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
#ifndef ARM_TRC_PKT_DECODE_PTM_H_INCLUDED
|
||||
#define ARM_TRC_PKT_DECODE_PTM_H_INCLUDED
|
||||
|
||||
#include "common/trc_pkt_decode_base.h"
|
||||
#include "opencsd/ptm/trc_pkt_elem_ptm.h"
|
||||
#include "opencsd/ptm/trc_cmp_cfg_ptm.h"
|
||||
#include "common/trc_gen_elem.h"
|
||||
#include "common/trc_ret_stack.h"
|
||||
|
||||
/**************** Atom handling class **************************************/
|
||||
class PtmAtoms
|
||||
{
|
||||
public:
|
||||
PtmAtoms() {};
|
||||
~PtmAtoms() {};
|
||||
|
||||
//! initialise the atom and index values
|
||||
void initAtomPkt(const ocsd_pkt_atom &atom, const ocsd_trc_index_t &root_index);
|
||||
|
||||
const ocsd_atm_val getCurrAtomVal() const;
|
||||
const int numAtoms() const; //!< number of atoms
|
||||
const ocsd_trc_index_t pktIndex() const; //!< originating packet index
|
||||
|
||||
void clearAtom(); //!< clear the current atom, set the next.
|
||||
void clearAll(); //!< clear all
|
||||
|
||||
private:
|
||||
ocsd_pkt_atom m_atom;
|
||||
ocsd_trc_index_t m_root_index; //!< root index for the atom packet
|
||||
};
|
||||
|
||||
inline void PtmAtoms::initAtomPkt(const ocsd_pkt_atom &atom, const ocsd_trc_index_t &root_index)
|
||||
{
|
||||
m_atom = atom;
|
||||
m_root_index = root_index;
|
||||
}
|
||||
|
||||
inline const ocsd_atm_val PtmAtoms::getCurrAtomVal() const
|
||||
{
|
||||
return (m_atom.En_bits & 0x1) ? ATOM_E : ATOM_N;
|
||||
}
|
||||
|
||||
inline const int PtmAtoms::numAtoms() const
|
||||
{
|
||||
return m_atom.num;
|
||||
}
|
||||
|
||||
inline const ocsd_trc_index_t PtmAtoms::pktIndex() const
|
||||
{
|
||||
return m_root_index;
|
||||
}
|
||||
|
||||
inline void PtmAtoms::clearAtom()
|
||||
{
|
||||
if(m_atom.num)
|
||||
{
|
||||
m_atom.num--;
|
||||
m_atom.En_bits >>=1;
|
||||
}
|
||||
}
|
||||
|
||||
inline void PtmAtoms::clearAll()
|
||||
{
|
||||
m_atom.num = 0;
|
||||
}
|
||||
|
||||
/********** Main decode class ****************************************************/
|
||||
class TrcPktDecodePtm : public TrcPktDecodeBase<PtmTrcPacket, PtmConfig>
|
||||
{
|
||||
public:
|
||||
TrcPktDecodePtm();
|
||||
TrcPktDecodePtm(int instIDNum);
|
||||
virtual ~TrcPktDecodePtm();
|
||||
|
||||
protected:
|
||||
/* implementation packet decoding interface */
|
||||
virtual ocsd_datapath_resp_t processPacket();
|
||||
virtual ocsd_datapath_resp_t onEOT();
|
||||
virtual ocsd_datapath_resp_t onReset();
|
||||
virtual ocsd_datapath_resp_t onFlush();
|
||||
virtual ocsd_err_t onProtocolConfig();
|
||||
virtual const uint8_t getCoreSightTraceID() { return m_CSID; };
|
||||
|
||||
/* local decode methods */
|
||||
|
||||
private:
|
||||
/** operation for the trace instruction follower */
|
||||
typedef enum {
|
||||
TRACE_WAYPOINT, //!< standard operation - trace to waypoint - default op
|
||||
TRACE_TO_ADDR_EXCL, //!< trace to supplied address - address is 1st instuction not executed.
|
||||
TRACE_TO_ADDR_INCL //!< trace to supplied address - address is last instruction executed.
|
||||
} waypoint_trace_t;
|
||||
|
||||
void initDecoder();
|
||||
void resetDecoder();
|
||||
|
||||
ocsd_datapath_resp_t decodePacket();
|
||||
ocsd_datapath_resp_t contProcess();
|
||||
ocsd_datapath_resp_t processIsync();
|
||||
ocsd_datapath_resp_t processBranch();
|
||||
ocsd_datapath_resp_t processWPUpdate();
|
||||
ocsd_datapath_resp_t processAtom();
|
||||
ocsd_err_t traceInstrToWP(bool &bWPFound, const waypoint_trace_t traceWPOp = TRACE_WAYPOINT, const ocsd_vaddr_t nextAddrMatch = 0); //!< follow instructions from the current address to a WP. true if good, false if memory cannot be accessed.
|
||||
ocsd_datapath_resp_t processAtomRange(const ocsd_atm_val A, const char *pkt_msg, const waypoint_trace_t traceWPOp = TRACE_WAYPOINT, const ocsd_vaddr_t nextAddrMatch = 0);
|
||||
void checkPendingNacc(ocsd_datapath_resp_t &resp);
|
||||
|
||||
uint8_t m_CSID; //!< Coresight trace ID for this decoder.
|
||||
|
||||
//** Other processor state;
|
||||
|
||||
// trace decode FSM
|
||||
typedef enum {
|
||||
NO_SYNC, //!< pre start trace - init state or after reset or overflow, loss of sync.
|
||||
WAIT_SYNC, //!< waiting for sync packet.
|
||||
WAIT_ISYNC, //!< waiting for isync packet after 1st ASYNC.
|
||||
DECODE_PKTS, //!< processing input packet
|
||||
CONT_ISYNC, //!< continue processing isync packet after WAIT.
|
||||
CONT_ATOM, //!< continue processing atom packet after WAIT.
|
||||
CONT_WPUP, //!< continue processing WP update packet after WAIT.
|
||||
CONT_BRANCH, //!< continue processing Branch packet after WAIT.
|
||||
} processor_state_t;
|
||||
|
||||
processor_state_t m_curr_state;
|
||||
|
||||
const bool processStateIsCont() const;
|
||||
|
||||
// PE decode state - address and isa
|
||||
|
||||
//! Structure to contain the PE addr and ISA state.
|
||||
typedef struct _ptm_pe_addr_state {
|
||||
ocsd_isa isa; //!< current isa.
|
||||
ocsd_vaddr_t instr_addr; //!< current address.
|
||||
bool valid; //!< address valid - false if we need an address to continue decode.
|
||||
} ptm_pe_addr_state;
|
||||
|
||||
ptm_pe_addr_state m_curr_pe_state; //!< current instruction state for PTM decode.
|
||||
ocsd_pe_context m_pe_context; //!< current context information
|
||||
|
||||
// packet decode state
|
||||
bool m_need_isync; //!< need context to continue
|
||||
|
||||
ocsd_instr_info m_instr_info; //!< instruction info for code follower - in address is the next to be decoded.
|
||||
|
||||
bool m_mem_nacc_pending; //!< need to output a memory access failure packet
|
||||
ocsd_vaddr_t m_nacc_addr; //!< address of memory access failure
|
||||
|
||||
bool m_i_sync_pe_ctxt; //!< isync has pe context.
|
||||
|
||||
PtmAtoms m_atoms; //!< atoms to process in an atom packet
|
||||
|
||||
TrcAddrReturnStack m_return_stack; //!< trace return stack.
|
||||
|
||||
//** output element
|
||||
OcsdTraceElement m_output_elem;
|
||||
};
|
||||
|
||||
inline const bool TrcPktDecodePtm::processStateIsCont() const
|
||||
{
|
||||
return (bool)(m_curr_state >= CONT_ISYNC);
|
||||
}
|
||||
|
||||
#endif // ARM_TRC_PKT_DECODE_PTM_H_INCLUDED
|
||||
|
||||
/* End of File trc_pkt_decode_ptm.h */
|
221
decoder/include/opencsd/ptm/trc_pkt_elem_ptm.h
Normal file
221
decoder/include/opencsd/ptm/trc_pkt_elem_ptm.h
Normal file
@ -0,0 +1,221 @@
|
||||
/*
|
||||
* \file trc_pkt_elem_ptm.h
|
||||
* \brief OpenCSD :
|
||||
*
|
||||
* \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef ARM_TRC_PKT_ELEM_PTM_H_INCLUDED
|
||||
#define ARM_TRC_PKT_ELEM_PTM_H_INCLUDED
|
||||
|
||||
#include "trc_pkt_types_ptm.h"
|
||||
#include "common/trc_printable_elem.h"
|
||||
#include "common/trc_pkt_elem_base.h"
|
||||
|
||||
/** @addtogroup trc_pkts
|
||||
@{*/
|
||||
|
||||
|
||||
class PtmTrcPacket : public TrcPacketBase, public ocsd_ptm_pkt, trcPrintableElem
|
||||
{
|
||||
public:
|
||||
PtmTrcPacket();
|
||||
~PtmTrcPacket();
|
||||
|
||||
PtmTrcPacket &operator =(const ocsd_ptm_pkt* p_pkt);
|
||||
|
||||
virtual const void *c_pkt() const { return (const ocsd_ptm_pkt *)this; };
|
||||
|
||||
// update interface - set packet values
|
||||
|
||||
void Clear(); //!< clear update data in packet ready for new one.
|
||||
void ResetState(); //!< reset intra packet state data - on full decoder reset.
|
||||
|
||||
void SetType(const ocsd_ptm_pkt_type p_type);
|
||||
void SetErrType(const ocsd_ptm_pkt_type e_type);
|
||||
|
||||
void SetException( const ocsd_armv7_exception type,
|
||||
const uint16_t number);
|
||||
void SetISyncReason(const ocsd_iSync_reason reason);
|
||||
void SetCycleCount(const uint32_t cycleCount);
|
||||
void SetAtomFromPHdr(const uint8_t pHdr);
|
||||
void SetCycleAccAtomFromPHdr(const uint8_t pHdr);
|
||||
|
||||
void UpdateAddress(const ocsd_vaddr_t partAddrVal, const int updateBits);
|
||||
void UpdateNS(const int NS);
|
||||
void UpdateAltISA(const int AltISA);
|
||||
void UpdateHyp(const int Hyp);
|
||||
void UpdateISA(const ocsd_isa isa);
|
||||
void UpdateContextID(const uint32_t contextID);
|
||||
void UpdateVMID(const uint8_t VMID);
|
||||
void UpdateTimestamp(const uint64_t tsVal, const uint8_t updateBits);
|
||||
|
||||
// packet status interface
|
||||
|
||||
// get packet info.
|
||||
const bool isBadPacket() const;
|
||||
const ocsd_ptm_pkt_type getType() const;
|
||||
|
||||
// isa
|
||||
const ocsd_isa getISA() const;
|
||||
const bool ISAChanged() const { return (bool)(curr_isa != prev_isa); };
|
||||
const uint8_t getAltISA() const { return context.curr_alt_isa; };
|
||||
const uint8_t getNS() const { return context.curr_NS; };
|
||||
const uint8_t getHyp() const { return context.curr_Hyp; };
|
||||
|
||||
// address
|
||||
const ocsd_vaddr_t getAddrVal() const { return addr.val; };
|
||||
|
||||
// pe context information
|
||||
const bool CtxtIDUpdated() const { return (bool)(context.updated_c == 1); };
|
||||
const bool VMIDUpdated() const { return (bool)(context.updated_v == 1); };
|
||||
const uint32_t getCtxtID() const { return context.ctxtID; };
|
||||
const uint8_t getVMID() const { return context.VMID; };
|
||||
const bool PEContextUpdated() const { return context.updated; };
|
||||
|
||||
// atom info
|
||||
const ocsd_pkt_atom &getAtom() const { return atom; };
|
||||
|
||||
// branch address info
|
||||
const bool isBranchExcepPacket() const { return (exception.bits.present == 1); };
|
||||
const ocsd_armv7_exception excepType() const { return exception.type; };
|
||||
const uint16_t excepNum() const { return exception.number; };
|
||||
|
||||
// isync
|
||||
const ocsd_iSync_reason iSyncReason() const { return i_sync_reason; };
|
||||
|
||||
// cycle count
|
||||
const bool hasCC() const { return (cc_valid == 1); };
|
||||
const uint32_t getCCVal() const { return cycle_count; };
|
||||
|
||||
// printing
|
||||
virtual void toString(std::string &str) const;
|
||||
virtual void toStringFmt(const uint32_t fmtFlags, std::string &str) const;
|
||||
|
||||
private:
|
||||
void packetTypeName(const ocsd_ptm_pkt_type pkt_type, std::string &name, std::string &desc) const;
|
||||
void getAtomStr(std::string &valStr) const;
|
||||
void getBranchAddressStr(std::string &valStr) const;
|
||||
void getExcepStr(std::string &excepStr) const;
|
||||
void getISAStr(std::string &isaStr) const;
|
||||
void getCycleCountStr(std::string &subStr) const;
|
||||
void getISyncStr(std::string &valStr) const;
|
||||
void getTSStr(std::string &valStr) const;
|
||||
};
|
||||
|
||||
|
||||
//*** update interface - set packet values
|
||||
inline void PtmTrcPacket::SetType(const ocsd_ptm_pkt_type p_type)
|
||||
{
|
||||
type = p_type;
|
||||
}
|
||||
|
||||
inline void PtmTrcPacket::SetErrType(const ocsd_ptm_pkt_type e_type)
|
||||
{
|
||||
err_type = type;
|
||||
type = e_type;
|
||||
}
|
||||
|
||||
inline void PtmTrcPacket::UpdateNS(const int NS)
|
||||
{
|
||||
context.curr_NS = NS;
|
||||
context.updated = 1;
|
||||
};
|
||||
|
||||
inline void PtmTrcPacket::UpdateAltISA(const int AltISA)
|
||||
{
|
||||
context.curr_alt_isa = AltISA;
|
||||
context.updated = 1;
|
||||
}
|
||||
|
||||
inline void PtmTrcPacket::UpdateHyp(const int Hyp)
|
||||
{
|
||||
context.curr_Hyp = Hyp;
|
||||
context.updated = 1;
|
||||
}
|
||||
|
||||
inline void PtmTrcPacket::UpdateISA(const ocsd_isa isa)
|
||||
{
|
||||
prev_isa = curr_isa;
|
||||
curr_isa = isa;
|
||||
}
|
||||
|
||||
inline void PtmTrcPacket::UpdateContextID(const uint32_t contextID)
|
||||
{
|
||||
context.ctxtID = contextID;
|
||||
context.updated_c = 1;
|
||||
}
|
||||
|
||||
inline void PtmTrcPacket::UpdateVMID(const uint8_t VMID)
|
||||
{
|
||||
context.VMID = VMID;
|
||||
context.updated_v = 1;
|
||||
}
|
||||
|
||||
inline void PtmTrcPacket::SetException( const ocsd_armv7_exception type, const uint16_t number)
|
||||
{
|
||||
exception.bits.present = 1;
|
||||
exception.number = number;
|
||||
exception.type = type;
|
||||
}
|
||||
|
||||
inline void PtmTrcPacket::SetISyncReason(const ocsd_iSync_reason reason)
|
||||
{
|
||||
i_sync_reason = reason;
|
||||
}
|
||||
|
||||
inline void PtmTrcPacket::SetCycleCount(const uint32_t cycleCount)
|
||||
{
|
||||
cycle_count = cycleCount;
|
||||
cc_valid = 1;
|
||||
}
|
||||
|
||||
//*** packet status interface - get packet info.
|
||||
inline const bool PtmTrcPacket::isBadPacket() const
|
||||
{
|
||||
return (bool)(type >= PTM_PKT_BAD_SEQUENCE);
|
||||
}
|
||||
|
||||
inline const ocsd_ptm_pkt_type PtmTrcPacket::getType() const
|
||||
{
|
||||
return type;
|
||||
}
|
||||
|
||||
inline const ocsd_isa PtmTrcPacket::getISA() const
|
||||
{
|
||||
return curr_isa;
|
||||
}
|
||||
|
||||
/** @}*/
|
||||
#endif // ARM_TRC_PKT_ELEM_PTM_H_INCLUDED
|
||||
|
||||
/* End of File trc_pkt_elem_ptm.h */
|
215
decoder/include/opencsd/ptm/trc_pkt_proc_ptm.h
Normal file
215
decoder/include/opencsd/ptm/trc_pkt_proc_ptm.h
Normal file
@ -0,0 +1,215 @@
|
||||
/*
|
||||
* \file trc_pkt_proc_ptm.h
|
||||
* \brief OpenCSD :
|
||||
*
|
||||
* \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef ARM_TRC_PKT_PROC_PTM_H_INCLUDED
|
||||
#define ARM_TRC_PKT_PROC_PTM_H_INCLUDED
|
||||
|
||||
#include "trc_pkt_types_ptm.h"
|
||||
#include "common/trc_pkt_proc_base.h"
|
||||
#include "trc_pkt_elem_ptm.h"
|
||||
#include "trc_cmp_cfg_ptm.h"
|
||||
|
||||
class PtmTrcPacket;
|
||||
class PtmConfig;
|
||||
|
||||
/** @addtogroup ocsd_pkt_proc
|
||||
@{*/
|
||||
|
||||
|
||||
|
||||
class TrcPktProcPtm : public TrcPktProcBase< PtmTrcPacket, ocsd_ptm_pkt_type, PtmConfig>
|
||||
{
|
||||
public:
|
||||
TrcPktProcPtm();
|
||||
TrcPktProcPtm(int instIDNum);
|
||||
virtual ~TrcPktProcPtm();
|
||||
|
||||
protected:
|
||||
/* implementation packet processing interface */
|
||||
virtual ocsd_datapath_resp_t processData( const ocsd_trc_index_t index,
|
||||
const uint32_t dataBlockSize,
|
||||
const uint8_t *pDataBlock,
|
||||
uint32_t *numBytesProcessed);
|
||||
virtual ocsd_datapath_resp_t onEOT();
|
||||
virtual ocsd_datapath_resp_t onReset();
|
||||
virtual ocsd_datapath_resp_t onFlush();
|
||||
virtual ocsd_err_t onProtocolConfig();
|
||||
virtual const bool isBadPacket() const;
|
||||
|
||||
void InitPacketState(); // clear current packet state.
|
||||
void InitProcessorState(); // clear all previous process state
|
||||
|
||||
ocsd_datapath_resp_t outputPacket();
|
||||
|
||||
typedef enum _process_state {
|
||||
WAIT_SYNC,
|
||||
PROC_HDR,
|
||||
PROC_DATA,
|
||||
SEND_PKT,
|
||||
} process_state;
|
||||
|
||||
process_state m_process_state; // process algorithm state.
|
||||
|
||||
std::vector<uint8_t> m_currPacketData; // raw data
|
||||
uint32_t m_currPktIdx; // index into packet when expanding
|
||||
PtmTrcPacket m_curr_packet; // expanded packet
|
||||
ocsd_trc_index_t m_curr_pkt_index; // trace index at start of packet.
|
||||
|
||||
const bool readByte(uint8_t &currByte);
|
||||
const bool readByte(); // just read into buffer, don't need the value
|
||||
void unReadByte(); // remove last byte from the buffer.
|
||||
|
||||
uint8_t m_chanIDCopy;
|
||||
|
||||
// current data block being processed.
|
||||
const uint8_t *m_pDataIn;
|
||||
uint32_t m_dataInLen;
|
||||
uint32_t m_dataInProcessed;
|
||||
ocsd_trc_index_t m_block_idx; // index start for current block
|
||||
|
||||
// processor synchronisation
|
||||
const bool isSync() const;
|
||||
ocsd_datapath_resp_t waitASync(); //!< look for first synchronisation point in the packet stream
|
||||
bool m_waitASyncSOPkt;
|
||||
bool m_bAsyncRawOp;
|
||||
bool m_bOPNotSyncPkt; //!< true if output not sync packet when waiting for ASYNC
|
||||
|
||||
// ** packet processing functions.
|
||||
void pktASync();
|
||||
void pktISync();
|
||||
void pktTrigger();
|
||||
void pktWPointUpdate();
|
||||
void pktIgnore();
|
||||
void pktCtxtID();
|
||||
void pktVMID();
|
||||
void pktAtom();
|
||||
void pktTimeStamp();
|
||||
void pktExceptionRet();
|
||||
void pktBranchAddr();
|
||||
void pktReserved();
|
||||
|
||||
// async finder
|
||||
typedef enum _async_result {
|
||||
ASYNC, //!< pattern confirmed async 0x00 x 5, 0x80
|
||||
NOT_ASYNC, //!< pattern confirmed not async
|
||||
ASYNC_EXTRA_0, //!< pattern confirmed 0x00 x N + ASYNC
|
||||
THROW_0, //!< long pattern of 0x00 - throw some away.
|
||||
ASYNC_INCOMPLETE, //!< not enough input data.
|
||||
} async_result_t;
|
||||
|
||||
async_result_t findAsync();
|
||||
|
||||
int m_async_0; // number of current consecutive async 0s
|
||||
|
||||
bool m_part_async;
|
||||
|
||||
// number of extra 0s before we throw 0 on async detect.
|
||||
#define ASYNC_PAD_0_LIMIT 11
|
||||
// number of 0s minimum to form an async
|
||||
#define ASYNC_REQ_0 5
|
||||
|
||||
// extraction sub-routines
|
||||
void extractCtxtID(int idx, uint32_t &ctxtID);
|
||||
void extractCycleCount(int idx, uint32_t &cycleCount);
|
||||
int extractTS(uint64_t &tsVal, uint8_t &tsUpdateBits);
|
||||
uint32_t extractAddress(const int offset,uint8_t &total_bits);
|
||||
|
||||
// number of bytes required for a complete packet - used in some multi byte packets
|
||||
int m_numPktBytesReq;
|
||||
|
||||
// packet processing state
|
||||
bool m_needCycleCount;
|
||||
bool m_gotCycleCount;
|
||||
int m_gotCCBytes; // number of CC bytes read so far
|
||||
|
||||
int m_numCtxtIDBytes;
|
||||
int m_gotCtxtIDBytes;
|
||||
|
||||
bool m_gotTSBytes; //!< got all TS bytes
|
||||
int m_tsByteMax; //!< max size for TS portion of TS packet.
|
||||
|
||||
// branch address state
|
||||
bool m_gotAddrBytes; //!< got all Addr bytes in branch packet
|
||||
int m_numAddrBytes; //!< number of address bytes
|
||||
bool m_gotExcepBytes; //!< got all needed exception bytes
|
||||
int m_numExcepBytes; //!< got 1st exception byte
|
||||
ocsd_isa m_addrPktIsa; //!< ISA of the branch address packet
|
||||
int m_excepAltISA; //!< Alt ISA bit iff exception bytes
|
||||
|
||||
// bad packets
|
||||
void throwMalformedPacketErr(const char *pszErrMsg);
|
||||
void throwPacketHeaderErr(const char *pszErrMsg);
|
||||
|
||||
|
||||
// packet processing function table
|
||||
typedef void (TrcPktProcPtm::*PPKTFN)(void);
|
||||
PPKTFN m_pIPktFn;
|
||||
|
||||
struct _pkt_i_table_t {
|
||||
ocsd_ptm_pkt_type pkt_type;
|
||||
PPKTFN pptkFn;
|
||||
} m_i_table[256];
|
||||
|
||||
void BuildIPacketTable();
|
||||
|
||||
};
|
||||
|
||||
inline const bool TrcPktProcPtm::isSync() const
|
||||
{
|
||||
return (bool)(m_curr_packet.getType() == PTM_PKT_NOTSYNC);
|
||||
}
|
||||
|
||||
inline void TrcPktProcPtm::throwMalformedPacketErr(const char *pszErrMsg)
|
||||
{
|
||||
m_curr_packet.SetErrType(PTM_PKT_BAD_SEQUENCE);
|
||||
throw ocsdError(OCSD_ERR_SEV_ERROR,OCSD_ERR_BAD_PACKET_SEQ,m_curr_pkt_index,m_chanIDCopy,pszErrMsg);
|
||||
}
|
||||
|
||||
inline void TrcPktProcPtm::throwPacketHeaderErr(const char *pszErrMsg)
|
||||
{
|
||||
throw ocsdError(OCSD_ERR_SEV_ERROR,OCSD_ERR_INVALID_PCKT_HDR,m_curr_pkt_index,m_chanIDCopy,pszErrMsg);
|
||||
}
|
||||
|
||||
inline const bool TrcPktProcPtm::readByte()
|
||||
{
|
||||
uint8_t currByte;
|
||||
return readByte(currByte);
|
||||
}
|
||||
|
||||
/** @}*/
|
||||
|
||||
#endif // ARM_TRC_PKT_PROC_PTM_H_INCLUDED
|
||||
|
||||
/* End of File trc_pkt_proc_ptm.h */
|
137
decoder/include/opencsd/ptm/trc_pkt_types_ptm.h
Normal file
137
decoder/include/opencsd/ptm/trc_pkt_types_ptm.h
Normal file
@ -0,0 +1,137 @@
|
||||
/*
|
||||
* \file trc_pkt_ptm_types.h
|
||||
* \brief OpenCSD : PTM specific types
|
||||
*
|
||||
* \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef ARM_TRC_PKT_PTM_TYPES_H_INCLUDED
|
||||
#define ARM_TRC_PKT_PTM_TYPES_H_INCLUDED
|
||||
|
||||
#include "opencsd/trc_pkt_types.h"
|
||||
|
||||
/** @addtogroup trc_pkts
|
||||
@{*/
|
||||
|
||||
/** @name PTM Packet Types
|
||||
@{*/
|
||||
|
||||
typedef enum _ocsd_ptm_pkt_type
|
||||
{
|
||||
// markers for unknown packets
|
||||
PTM_PKT_NOTSYNC, //!< no sync found yet
|
||||
PTM_PKT_INCOMPLETE_EOT, //!< flushing incomplete packet at end of trace.
|
||||
PTM_PKT_NOERROR, //!< no error base type packet.
|
||||
|
||||
// markers for valid packets
|
||||
PTM_PKT_BRANCH_ADDRESS, //!< Branch address with optional exception.
|
||||
PTM_PKT_A_SYNC, //!< Alignment Synchronisation.
|
||||
PTM_PKT_I_SYNC, //!< Instruction sync with address.
|
||||
PTM_PKT_TRIGGER, //!< trigger packet
|
||||
PTM_PKT_WPOINT_UPDATE, //!< Waypoint update.
|
||||
PTM_PKT_IGNORE, //!< ignore packet.
|
||||
PTM_PKT_CONTEXT_ID, //!< context id packet.
|
||||
PTM_PKT_VMID, //!< VMID packet
|
||||
PTM_PKT_ATOM, //!< atom waypoint packet.
|
||||
PTM_PKT_TIMESTAMP, //!< timestamp packet.
|
||||
PTM_PKT_EXCEPTION_RET, //!< exception return.
|
||||
PTM_PKT_BRANCH_OR_BYPASS_EOT, // interpreter FSM 'state' : unsure if branch 0 packet or bypass flush end of trace
|
||||
PTM_PKT_TPIU_PAD_EOB, // pad end of a buffer - no valid trace at this point
|
||||
|
||||
// markers for bad packets
|
||||
PTM_PKT_BAD_SEQUENCE, //!< invalid sequence for packet type
|
||||
PTM_PKT_RESERVED, //!< Reserved packet encoding
|
||||
|
||||
} ocsd_ptm_pkt_type;
|
||||
|
||||
typedef struct _ptm_context_t {
|
||||
struct {
|
||||
uint32_t curr_alt_isa:1; /**< current Alt ISA flag for Tee / T32 (used if not in present packet) */
|
||||
uint32_t curr_NS:1; /**< current NS flag (used if not in present packet) */
|
||||
uint32_t curr_Hyp:1; /**< current Hyp flag (used if not in present packet) */
|
||||
uint32_t updated:1; /**< context updated */
|
||||
uint32_t updated_c:1; /**< updated CtxtID */
|
||||
uint32_t updated_v:1; /**< updated VMID */
|
||||
};
|
||||
uint32_t ctxtID; /**< Context ID */
|
||||
uint8_t VMID; /**< VMID */
|
||||
} ptm_context_t;
|
||||
|
||||
typedef struct _ocsd_ptm_excep {
|
||||
ocsd_armv7_exception type; /**< exception type. */
|
||||
uint16_t number; /**< exception as number */
|
||||
struct {
|
||||
uint32_t present:1; /**< exception present in packet */
|
||||
} bits;
|
||||
} ocsd_ptm_excep;
|
||||
|
||||
|
||||
typedef struct _ocsd_ptm_pkt
|
||||
{
|
||||
ocsd_ptm_pkt_type type; /**< Primary packet type. */
|
||||
|
||||
ocsd_isa curr_isa; /**< current ISA. */
|
||||
ocsd_isa prev_isa; /**< previous ISA */
|
||||
|
||||
ocsd_pkt_vaddr addr; /**< current address. */
|
||||
ptm_context_t context; /**< current context. */
|
||||
ocsd_pkt_atom atom;
|
||||
|
||||
ocsd_iSync_reason i_sync_reason; /**< reason for ISync Packet. */
|
||||
|
||||
uint32_t cycle_count; /**< cycle count value associated with this packet. */
|
||||
uint8_t cc_valid; /**< cycle count value valid. */
|
||||
|
||||
uint64_t timestamp; /**< timestamp value. */
|
||||
uint8_t ts_update_bits; /**< bits of ts updated this packet. (if TS packet) */
|
||||
|
||||
ocsd_ptm_excep exception; /**< exception information in packet */
|
||||
|
||||
ocsd_ptm_pkt_type err_type; /**< Basic packet type if primary type indicates error or incomplete. */
|
||||
|
||||
} ocsd_ptm_pkt;
|
||||
|
||||
typedef struct _ocsd_ptm_cfg
|
||||
{
|
||||
uint32_t reg_idr; /**< PTM ID register */
|
||||
uint32_t reg_ctrl; /**< Control Register */
|
||||
uint32_t reg_ccer; /**< Condition code extension register */
|
||||
uint32_t reg_trc_id; /**< CoreSight Trace ID register */
|
||||
ocsd_arch_version_t arch_ver; /**< Architecture version */
|
||||
ocsd_core_profile_t core_prof; /**< Core Profile */
|
||||
} ocsd_ptm_cfg;
|
||||
|
||||
/** @}*/
|
||||
|
||||
|
||||
/** @}*/
|
||||
#endif // ARM_TRC_PKT_PTM_TYPES_H_INCLUDED
|
||||
|
||||
/* End of File trc_pkt_ptm_types.h */
|
45
decoder/include/opencsd/stm/stm_decoder.h
Normal file
45
decoder/include/opencsd/stm/stm_decoder.h
Normal file
@ -0,0 +1,45 @@
|
||||
/*
|
||||
* \file stm_decoder.h
|
||||
* \brief OpenCSD : STM decoder
|
||||
*
|
||||
* \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef ARM_STM_DECODER_H_INCLUDED
|
||||
#define ARM_STM_DECODER_H_INCLUDED
|
||||
|
||||
#include "trc_pkt_types_stm.h"
|
||||
#include "trc_pkt_elem_stm.h"
|
||||
#include "trc_pkt_proc_stm.h"
|
||||
|
||||
|
||||
#endif // ARM_STM_DECODER_H_INCLUDED
|
||||
|
||||
/* End of File stm_decoder.h */
|
161
decoder/include/opencsd/stm/trc_cmp_cfg_stm.h
Normal file
161
decoder/include/opencsd/stm/trc_cmp_cfg_stm.h
Normal file
@ -0,0 +1,161 @@
|
||||
/*
|
||||
* \file trc_cmp_cfg_stm.h
|
||||
* \brief OpenCSD : STM compnent configuration.
|
||||
*
|
||||
* \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef ARM_TRC_CMP_CFG_STM_H_INCLUDED
|
||||
#define ARM_TRC_CMP_CFG_STM_H_INCLUDED
|
||||
|
||||
#include "trc_pkt_types_stm.h"
|
||||
#include "common/trc_cs_config.h"
|
||||
|
||||
/** @addtogroup ocsd_protocol_cfg
|
||||
@{*/
|
||||
|
||||
/** @name STM configuration
|
||||
@{*/
|
||||
|
||||
/*!
|
||||
* @class STMConfig
|
||||
* @brief STM hardware configuration data.
|
||||
*
|
||||
* Represents the programmed and hardware configured state of an STM device.
|
||||
* Creates default values for most RO register values to effect a default STM
|
||||
* with values of 256 masters, 65536 channels, HW event trace not present / disabled.
|
||||
*
|
||||
* If this default is sufficient a single call to setTraceID() will be all that is
|
||||
* required to decode the STM protocol.
|
||||
*
|
||||
* Can also be initialised with a fully populated ocsd_stm_cfg structure.
|
||||
*/
|
||||
class STMConfig : public CSConfig // public ocsd_stm_cfg
|
||||
{
|
||||
public:
|
||||
STMConfig(); //!< Constructor - creates a default configuration
|
||||
STMConfig(const ocsd_stm_cfg *cfg_regs);
|
||||
~STMConfig() {};
|
||||
|
||||
// operations to convert to and from C-API structure
|
||||
|
||||
STMConfig & operator=(const ocsd_stm_cfg *p_cfg); //!< set from full configuration structure.
|
||||
//! cast operator returning struct const reference
|
||||
operator const ocsd_stm_cfg &() const { return m_cfg; };
|
||||
//! cast operator returning struct const pointer
|
||||
operator const ocsd_stm_cfg *() const { return &m_cfg; };
|
||||
|
||||
// access functions
|
||||
void setTraceID(const uint8_t traceID); //!< Set the CoreSight trace ID.
|
||||
void setHWTraceFeat(const hw_event_feat_t hw_feat); //!< set usage of STM HW event trace.
|
||||
|
||||
virtual const uint8_t getTraceID() const; //!< Get the CoreSight trace ID.
|
||||
const uint8_t getMaxMasterIdx() const; //!< Get the maximum master index
|
||||
const uint16_t getMaxChannelIdx() const; //!< Get the maximum channel index.
|
||||
const uint16_t getHWTraceMasterIdx() const; //!< Get the master used for HW event trace.
|
||||
bool getHWTraceEn() const; //!< return true if HW trace is present and enabled.
|
||||
|
||||
private:
|
||||
bool m_bHWTraceEn;
|
||||
ocsd_stm_cfg m_cfg;
|
||||
};
|
||||
|
||||
inline STMConfig::STMConfig()
|
||||
{
|
||||
m_cfg.reg_tcsr = 0;
|
||||
m_cfg.reg_devid = 0xFF; // default to 256 masters.
|
||||
m_cfg.reg_feat3r = 0x10000; // default to 65536 channels.
|
||||
m_cfg.reg_feat1r = 0x0;
|
||||
m_cfg.reg_hwev_mast = 0; // default hwtrace master = 0;
|
||||
m_cfg.hw_event = HwEvent_Unknown_Disabled; // default to not present / disabled.
|
||||
m_bHWTraceEn = false;
|
||||
}
|
||||
|
||||
inline STMConfig::STMConfig(const ocsd_stm_cfg *cfg_regs)
|
||||
{
|
||||
m_cfg = *cfg_regs;
|
||||
setHWTraceFeat(m_cfg.hw_event);
|
||||
}
|
||||
|
||||
inline STMConfig & STMConfig::operator=(const ocsd_stm_cfg *p_cfg)
|
||||
{
|
||||
m_cfg = *p_cfg;
|
||||
setHWTraceFeat(p_cfg->hw_event);
|
||||
return *this;
|
||||
}
|
||||
|
||||
inline void STMConfig::setTraceID(const uint8_t traceID)
|
||||
{
|
||||
uint32_t IDmask = 0x007F0000;
|
||||
m_cfg.reg_tcsr &= ~IDmask;
|
||||
m_cfg.reg_tcsr |= (((uint32_t)traceID) << 16) & IDmask;
|
||||
}
|
||||
|
||||
inline void STMConfig::setHWTraceFeat(const hw_event_feat_t hw_feat)
|
||||
{
|
||||
m_cfg.hw_event = hw_feat;
|
||||
m_bHWTraceEn = (m_cfg.hw_event == HwEvent_Enabled);
|
||||
if(m_cfg.hw_event == HwEvent_UseRegisters)
|
||||
m_bHWTraceEn = (((m_cfg.reg_feat1r & 0xC0000) == 0x80000) && ((m_cfg.reg_tcsr & 0x8) == 0x8));
|
||||
}
|
||||
|
||||
inline const uint8_t STMConfig::getTraceID() const
|
||||
{
|
||||
return (uint8_t)((m_cfg.reg_tcsr >> 16) & 0x7F);
|
||||
}
|
||||
|
||||
inline const uint8_t STMConfig::getMaxMasterIdx() const
|
||||
{
|
||||
return (uint8_t)(m_cfg.reg_devid & 0xFF);
|
||||
}
|
||||
|
||||
inline const uint16_t STMConfig::getMaxChannelIdx() const
|
||||
{
|
||||
return (uint16_t)(m_cfg.reg_feat3r - 1);
|
||||
}
|
||||
|
||||
inline const uint16_t STMConfig::getHWTraceMasterIdx() const
|
||||
{
|
||||
return (uint16_t)(m_cfg.reg_hwev_mast & 0xFFFF);
|
||||
}
|
||||
|
||||
inline bool STMConfig::getHWTraceEn() const
|
||||
{
|
||||
return m_bHWTraceEn;
|
||||
}
|
||||
|
||||
|
||||
/** @}*/
|
||||
|
||||
/** @}*/
|
||||
|
||||
#endif // ARM_TRC_CMP_CFG_STM_H_INCLUDED
|
||||
|
||||
/* End of File trc_cmp_cfg_stm.h */
|
57
decoder/include/opencsd/stm/trc_dcd_mngr_stm.h
Normal file
57
decoder/include/opencsd/stm/trc_dcd_mngr_stm.h
Normal file
@ -0,0 +1,57 @@
|
||||
/*
|
||||
* \file trc_dcd_mngr_stm.h
|
||||
* \brief OpenCSD : STM decoder manager / handler specialisation
|
||||
*
|
||||
* \copyright Copyright (c) 2016, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
#ifndef ARM_TRC_DCD_MNGR_STM_H_INCLUDED
|
||||
#define ARM_TRC_DCD_MNGR_STM_H_INCLUDED
|
||||
|
||||
#include "common/ocsd_dcd_mngr.h"
|
||||
#include "trc_pkt_decode_stm.h"
|
||||
#include "trc_pkt_proc_stm.h"
|
||||
#include "trc_cmp_cfg_stm.h"
|
||||
#include "trc_pkt_types_stm.h"
|
||||
|
||||
class DecoderMngrStm : public DecodeMngrFullDcd< StmTrcPacket,
|
||||
ocsd_stm_pkt_type,
|
||||
STMConfig,
|
||||
ocsd_stm_cfg,
|
||||
TrcPktProcStm,
|
||||
TrcPktDecodeStm>
|
||||
{
|
||||
public:
|
||||
DecoderMngrStm(const std::string &name) : DecodeMngrFullDcd(name,OCSD_PROTOCOL_STM) {};
|
||||
virtual ~DecoderMngrStm() {};
|
||||
};
|
||||
|
||||
#endif // ARM_TRC_DCD_MNGR_STM_H_INCLUDED
|
||||
|
||||
/* End of File trc_dcd_mngr_stm.h */
|
103
decoder/include/opencsd/stm/trc_pkt_decode_stm.h
Normal file
103
decoder/include/opencsd/stm/trc_pkt_decode_stm.h
Normal file
@ -0,0 +1,103 @@
|
||||
/*
|
||||
* \file trc_pkt_decode_stm.h
|
||||
* \brief OpenCSD : STM packet decoder
|
||||
*
|
||||
* Convert the incoming indidvidual STM packets to
|
||||
*
|
||||
* \copyright Copyright (c) 2016, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef ARM_TRC_PKT_DECODE_STM_H_INCLUDED
|
||||
#define ARM_TRC_PKT_DECODE_STM_H_INCLUDED
|
||||
|
||||
|
||||
#include "common/trc_pkt_decode_base.h"
|
||||
#include "opencsd/stm/trc_pkt_elem_stm.h"
|
||||
#include "opencsd/stm/trc_cmp_cfg_stm.h"
|
||||
#include "common/trc_gen_elem.h"
|
||||
|
||||
class TrcPktDecodeStm : public TrcPktDecodeBase<StmTrcPacket, STMConfig>
|
||||
{
|
||||
public:
|
||||
TrcPktDecodeStm();
|
||||
TrcPktDecodeStm(int instIDNum);
|
||||
virtual ~TrcPktDecodeStm();
|
||||
|
||||
protected:
|
||||
/* implementation packet decoding interface */
|
||||
virtual ocsd_datapath_resp_t processPacket();
|
||||
virtual ocsd_datapath_resp_t onEOT();
|
||||
virtual ocsd_datapath_resp_t onReset();
|
||||
virtual ocsd_datapath_resp_t onFlush();
|
||||
virtual ocsd_err_t onProtocolConfig();
|
||||
virtual const uint8_t getCoreSightTraceID() { return m_CSID; };
|
||||
|
||||
/* local decode methods */
|
||||
|
||||
private:
|
||||
void initDecoder();
|
||||
void resetDecoder();
|
||||
void initPayloadBuffer();
|
||||
bool isInit() { return (bool)((m_config != 0) && (m_payload_buffer != 0)); };
|
||||
ocsd_datapath_resp_t decodePacket(bool &bPktDone); //!< decode the current incoming packet
|
||||
void clearSWTPerPcktInfo();
|
||||
void updatePayload(bool &bSendPacket);
|
||||
|
||||
typedef enum {
|
||||
NO_SYNC, //!< pre start trace - init state or after reset or overflow, loss of sync.
|
||||
WAIT_SYNC, //!< waiting for sync packet.
|
||||
DECODE_PKTS //!< processing input packet.
|
||||
} processor_state_t;
|
||||
|
||||
processor_state_t m_curr_state;
|
||||
|
||||
ocsd_swt_info_t m_swt_packet_info;
|
||||
|
||||
uint8_t *m_payload_buffer; //!< payload buffer - allocated for one or multiple packets according to config
|
||||
int m_payload_size; //!< payload buffer total size in bytes.
|
||||
int m_payload_used; //!< payload buffer used in bytes - current payload size.
|
||||
bool m_payload_odd_nibble; //!< last used byte in payload contains a single 4 bit packet.
|
||||
int m_num_pkt_correlation; //!< number of identical payload packets to buffer up before output. - fixed at 1 till later update
|
||||
|
||||
uint8_t m_CSID; //!< Coresight trace ID for this decoder.
|
||||
|
||||
bool m_decode_pass1; //!< flag to indicate 1st pass of packet decode.
|
||||
|
||||
|
||||
|
||||
//** output element
|
||||
OcsdTraceElement m_output_elem; //!< output packet
|
||||
};
|
||||
|
||||
#endif // ARM_TRC_PKT_DECODE_STM_H_INCLUDED
|
||||
|
||||
/* End of File trc_pkt_decode_stm.h */
|
238
decoder/include/opencsd/stm/trc_pkt_elem_stm.h
Normal file
238
decoder/include/opencsd/stm/trc_pkt_elem_stm.h
Normal file
@ -0,0 +1,238 @@
|
||||
/*!
|
||||
* \file trc_pkt_elem_stm.h
|
||||
* \brief OpenCSD : STM packet class.
|
||||
*
|
||||
* \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef ARM_TRC_PKT_ELEM_STM_H_INCLUDED
|
||||
#define ARM_TRC_PKT_ELEM_STM_H_INCLUDED
|
||||
|
||||
#include "trc_pkt_types_stm.h"
|
||||
#include "common/trc_printable_elem.h"
|
||||
#include "common/trc_pkt_elem_base.h"
|
||||
|
||||
/*!
|
||||
* @class StmTrcPacket
|
||||
* @brief STM trace packet with packet printing functionality
|
||||
*
|
||||
* This class allows for the update and access of the current STM trace
|
||||
* packet, implementing the STM protocol rules as appropriate. Maintains
|
||||
* the intra packet state as well as updates on a per packet basis.
|
||||
*
|
||||
* Based on data structure ocsd_stm_pkt.
|
||||
*
|
||||
*/
|
||||
class StmTrcPacket : public TrcPacketBase, public ocsd_stm_pkt, public trcPrintableElem
|
||||
{
|
||||
public:
|
||||
StmTrcPacket();
|
||||
~StmTrcPacket() {};
|
||||
|
||||
StmTrcPacket &operator =(const ocsd_stm_pkt *p_pkt);
|
||||
|
||||
virtual const void *c_pkt() const { return (const ocsd_stm_pkt *)this; };
|
||||
|
||||
void initStartState(); //!< Initialise packet state at start of decoder.
|
||||
void initNextPacket(); //!< Initialise state for next packet.
|
||||
|
||||
void setPacketType(const ocsd_stm_pkt_type type, const bool bMarker);
|
||||
void updateErrType(const ocsd_stm_pkt_type err_type);
|
||||
void setMaster(const uint8_t master);
|
||||
void setChannel(const uint16_t channel, const bool b8Bit);
|
||||
void setTS(const uint64_t ts_val, const uint8_t updatedBits);
|
||||
void onVersionPkt(const ocsd_stm_ts_type type);
|
||||
|
||||
void setD4Payload(const uint8_t value);
|
||||
void setD8Payload(const uint8_t value);
|
||||
void setD16Payload(const uint16_t value);
|
||||
void setD32Payload(const uint32_t value);
|
||||
void setD64Payload(const uint64_t value);
|
||||
|
||||
const bool isMarkerPkt() const;
|
||||
const bool isTSPkt() const;
|
||||
|
||||
const ocsd_stm_pkt_type getPktType() const;
|
||||
const ocsd_stm_pkt_type getPktErrType() const;
|
||||
const uint8_t getMaster() const;
|
||||
const uint16_t getChannel() const;
|
||||
const ocsd_stm_ts_type getTSType() const;
|
||||
const uint64_t getTSVal() const;
|
||||
|
||||
const uint8_t getD4Val() const;
|
||||
const uint8_t getD8Val() const;
|
||||
const uint16_t getD16Val() const;
|
||||
const uint32_t getD32Val() const;
|
||||
const uint64_t getD64Val() const;
|
||||
|
||||
const bool isBadPacket() const;
|
||||
|
||||
// printing
|
||||
virtual void toString(std::string &str) const;
|
||||
virtual void toStringFmt(const uint32_t fmtFlags, std::string &str) const;
|
||||
|
||||
|
||||
private:
|
||||
void pktTypeName(const ocsd_stm_pkt_type pkt_type, std::string &name, std::string &desc) const;
|
||||
};
|
||||
|
||||
inline void StmTrcPacket::setPacketType(const ocsd_stm_pkt_type type, const bool bMarker)
|
||||
{
|
||||
this->type = type;
|
||||
if(bMarker)
|
||||
pkt_has_marker = 1;
|
||||
}
|
||||
|
||||
inline void StmTrcPacket::updateErrType(const ocsd_stm_pkt_type err_type)
|
||||
{
|
||||
this->err_type = this->type; // original type is the err type;
|
||||
this->type = err_type; // mark main type as an error.
|
||||
}
|
||||
|
||||
inline void StmTrcPacket::setMaster(const uint8_t master)
|
||||
{
|
||||
this->master = master;
|
||||
channel = 0; // M8 forces current channel to 0.
|
||||
}
|
||||
|
||||
inline void StmTrcPacket::setChannel(const uint16_t channel, const bool b8Bit)
|
||||
{
|
||||
if(b8Bit)
|
||||
this->channel = (this->channel & 0xFF00) | (channel & 0xFF);
|
||||
else
|
||||
this->channel = channel;
|
||||
}
|
||||
|
||||
inline void StmTrcPacket::onVersionPkt(const ocsd_stm_ts_type type)
|
||||
{
|
||||
this->ts_type = type;
|
||||
master = 0;
|
||||
channel = 0;
|
||||
}
|
||||
|
||||
inline void StmTrcPacket::setD4Payload(const uint8_t value)
|
||||
{
|
||||
payload.D8 = value & 0xF;
|
||||
}
|
||||
|
||||
inline void StmTrcPacket::setD8Payload(const uint8_t value)
|
||||
{
|
||||
payload.D8 = value;
|
||||
}
|
||||
|
||||
inline void StmTrcPacket::setD16Payload(const uint16_t value)
|
||||
{
|
||||
payload.D16 = value;
|
||||
}
|
||||
|
||||
inline void StmTrcPacket::setD32Payload(const uint32_t value)
|
||||
{
|
||||
payload.D32 = value;
|
||||
}
|
||||
|
||||
inline void StmTrcPacket::setD64Payload(const uint64_t value)
|
||||
{
|
||||
payload.D64 = value;
|
||||
}
|
||||
|
||||
inline const bool StmTrcPacket::isMarkerPkt() const
|
||||
{
|
||||
return (pkt_has_marker != 0);
|
||||
}
|
||||
|
||||
inline const bool StmTrcPacket::isTSPkt() const
|
||||
{
|
||||
return (pkt_has_ts != 0);
|
||||
}
|
||||
|
||||
inline const ocsd_stm_pkt_type StmTrcPacket::getPktType() const
|
||||
{
|
||||
return type;
|
||||
}
|
||||
|
||||
inline const ocsd_stm_pkt_type StmTrcPacket::getPktErrType() const
|
||||
{
|
||||
return err_type;
|
||||
}
|
||||
|
||||
inline const uint8_t StmTrcPacket::getMaster() const
|
||||
{
|
||||
return master;
|
||||
}
|
||||
|
||||
inline const uint16_t StmTrcPacket::getChannel() const
|
||||
{
|
||||
return channel;
|
||||
}
|
||||
|
||||
inline const ocsd_stm_ts_type StmTrcPacket::getTSType() const
|
||||
{
|
||||
return ts_type;
|
||||
}
|
||||
|
||||
inline const uint64_t StmTrcPacket::getTSVal() const
|
||||
{
|
||||
return timestamp;
|
||||
}
|
||||
|
||||
inline const uint8_t StmTrcPacket::getD4Val() const
|
||||
{
|
||||
return payload.D8;
|
||||
}
|
||||
|
||||
inline const uint8_t StmTrcPacket::getD8Val() const
|
||||
{
|
||||
return payload.D8;
|
||||
}
|
||||
|
||||
inline const uint16_t StmTrcPacket::getD16Val() const
|
||||
{
|
||||
return payload.D16;
|
||||
}
|
||||
|
||||
inline const uint32_t StmTrcPacket::getD32Val() const
|
||||
{
|
||||
return payload.D32;
|
||||
}
|
||||
|
||||
inline const uint64_t StmTrcPacket::getD64Val() const
|
||||
{
|
||||
return payload.D64;
|
||||
}
|
||||
|
||||
inline const bool StmTrcPacket::isBadPacket() const
|
||||
{
|
||||
return (bool)(type >= STM_PKT_BAD_SEQUENCE);
|
||||
}
|
||||
|
||||
|
||||
#endif // ARM_TRC_PKT_ELEM_STM_H_INCLUDED
|
||||
|
||||
/* End of File trc_pkt_elem_stm.h */
|
289
decoder/include/opencsd/stm/trc_pkt_proc_stm.h
Normal file
289
decoder/include/opencsd/stm/trc_pkt_proc_stm.h
Normal file
@ -0,0 +1,289 @@
|
||||
/*
|
||||
* \file trc_pkt_proc_stm.h
|
||||
* \brief OpenCSD : STM packet processing
|
||||
*
|
||||
* \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef ARM_TRC_PKT_PROC_STM_H_INCLUDED
|
||||
#define ARM_TRC_PKT_PROC_STM_H_INCLUDED
|
||||
|
||||
#include <vector>
|
||||
|
||||
#include "trc_pkt_types_stm.h"
|
||||
#include "common/trc_pkt_proc_base.h"
|
||||
#include "trc_pkt_elem_stm.h"
|
||||
#include "trc_cmp_cfg_stm.h"
|
||||
|
||||
/** @addtogroup ocsd_pkt_proc
|
||||
@{*/
|
||||
|
||||
class TrcPktProcStm : public TrcPktProcBase<StmTrcPacket, ocsd_stm_pkt_type, STMConfig>
|
||||
{
|
||||
public:
|
||||
TrcPktProcStm();
|
||||
TrcPktProcStm(int instIDNum);
|
||||
virtual ~TrcPktProcStm();
|
||||
|
||||
protected:
|
||||
/* implementation packet processing interface */
|
||||
virtual ocsd_datapath_resp_t processData( const ocsd_trc_index_t index,
|
||||
const uint32_t dataBlockSize,
|
||||
const uint8_t *pDataBlock,
|
||||
uint32_t *numBytesProcessed);
|
||||
virtual ocsd_datapath_resp_t onEOT();
|
||||
virtual ocsd_datapath_resp_t onReset();
|
||||
virtual ocsd_datapath_resp_t onFlush();
|
||||
virtual ocsd_err_t onProtocolConfig();
|
||||
virtual const bool isBadPacket() const;
|
||||
|
||||
|
||||
typedef enum _process_state {
|
||||
WAIT_SYNC,
|
||||
PROC_HDR,
|
||||
PROC_DATA,
|
||||
SEND_PKT
|
||||
} process_state;
|
||||
|
||||
process_state m_proc_state;
|
||||
|
||||
private:
|
||||
|
||||
void initObj();
|
||||
void initProcessorState();
|
||||
void initNextPacket();
|
||||
void waitForSync(const ocsd_trc_index_t blk_st_index);
|
||||
|
||||
ocsd_datapath_resp_t outputPacket(); //!< send packet on output
|
||||
void sendPacket(); //!< mark packet for send.
|
||||
void setProcUnsynced(); //!< set processor state to unsynced
|
||||
void throwBadSequenceError(const char *pszMessage = "");
|
||||
void throwReservedHdrError(const char *pszMessage = "");
|
||||
|
||||
// packet processing routines
|
||||
// 1 nibble opcodes
|
||||
void stmPktReserved();
|
||||
void stmPktNull();
|
||||
void stmPktM8();
|
||||
void stmPktMERR();
|
||||
void stmPktC8();
|
||||
void stmPktD4();
|
||||
void stmPktD8();
|
||||
void stmPktD16();
|
||||
void stmPktD32();
|
||||
void stmPktD64();
|
||||
void stmPktD4MTS();
|
||||
void stmPktD8MTS();
|
||||
void stmPktD16MTS();
|
||||
void stmPktD32MTS();
|
||||
void stmPktD64MTS();
|
||||
void stmPktFlagTS();
|
||||
void stmPktFExt();
|
||||
|
||||
// 2 nibble opcodes 0xFn
|
||||
void stmPktReservedFn();
|
||||
void stmPktF0Ext();
|
||||
void stmPktGERR();
|
||||
void stmPktC16();
|
||||
void stmPktD4TS();
|
||||
void stmPktD8TS();
|
||||
void stmPktD16TS();
|
||||
void stmPktD32TS();
|
||||
void stmPktD64TS();
|
||||
void stmPktD4M();
|
||||
void stmPktD8M();
|
||||
void stmPktD16M();
|
||||
void stmPktD32M();
|
||||
void stmPktD64M();
|
||||
void stmPktFlag();
|
||||
void stmPktASync();
|
||||
|
||||
// 3 nibble opcodes 0xF0n
|
||||
void stmPktReservedF0n();
|
||||
void stmPktVersion();
|
||||
void stmPktNullTS();
|
||||
void stmPktTrigger();
|
||||
void stmPktTriggerTS();
|
||||
void stmPktFreq();
|
||||
|
||||
void stmExtractTS(); // extract a TS in packets that require it.
|
||||
void stmExtractVal8(uint8_t nibbles_to_val);
|
||||
void stmExtractVal16(uint8_t nibbles_to_val);
|
||||
void stmExtractVal32(uint8_t nibbles_to_val);
|
||||
void stmExtractVal64(uint8_t nibbles_to_val);
|
||||
|
||||
uint64_t bin_to_gray(uint64_t bin_value);
|
||||
uint64_t gray_to_bin(uint64_t gray_value);
|
||||
void pktNeedsTS(); // init the TS extraction routines
|
||||
|
||||
// data processing op function tables
|
||||
void buildOpTables();
|
||||
|
||||
typedef void (TrcPktProcStm::*PPKTFN)(void);
|
||||
PPKTFN m_pCurrPktFn; // current active processing function.
|
||||
|
||||
PPKTFN m_1N_ops[0x10];
|
||||
PPKTFN m_2N_ops[0x10];
|
||||
PPKTFN m_3N_ops[0x10];
|
||||
|
||||
// read a nibble from the input data - may read a byte and set spare or return spare.
|
||||
// handles setting up packet data block and end of input
|
||||
bool readNibble();
|
||||
|
||||
const bool dataToProcess() const; //!< true if data to process, or packet to send
|
||||
|
||||
void savePacketByte(const uint8_t val); //!< save data to packet buffer if we need it for monitor.
|
||||
|
||||
// packet data
|
||||
StmTrcPacket m_curr_packet; //!< current packet.
|
||||
bool m_bNeedsTS; //!< packet requires a TS
|
||||
bool m_bIsMarker;
|
||||
|
||||
|
||||
bool m_bStreamSync; //!< packet stream is synced
|
||||
|
||||
// input data handling
|
||||
uint8_t m_num_nibbles; //!< number of nibbles in the current packet
|
||||
uint8_t m_nibble; //!< current nibble being processed.
|
||||
uint8_t m_nibble_2nd; //!< 2nd unused nibble from a processed byte.
|
||||
bool m_nibble_2nd_valid; //!< 2nd nibble is valid;
|
||||
uint8_t m_num_data_nibbles; //!< number of nibbles needed to acheive payload.
|
||||
|
||||
const uint8_t *m_p_data_in; //!< pointer to input data.
|
||||
uint32_t m_data_in_size; //!< amount of data in.
|
||||
uint32_t m_data_in_used; //!< amount of data processed.
|
||||
ocsd_trc_index_t m_packet_index; //!< byte index for start of current packet
|
||||
|
||||
std::vector<uint8_t> m_packet_data; //!< current packet data (bytes) - only saved if needed to output to monitor.
|
||||
bool m_bWaitSyncSaveSuppressed; //!< don't save byte at a time when waitsync
|
||||
|
||||
// payload data
|
||||
uint8_t m_val8; //!< 8 bit payload.
|
||||
uint16_t m_val16; //!< 16 bit payload
|
||||
uint32_t m_val32; //!< 32 bit payload
|
||||
uint64_t m_val64; //!< 64 bit payload
|
||||
|
||||
// timestamp handling
|
||||
uint8_t m_req_ts_nibbles;
|
||||
uint8_t m_curr_ts_nibbles;
|
||||
uint64_t m_ts_update_value;
|
||||
bool m_ts_req_set;
|
||||
|
||||
|
||||
// sync handling - need to spot sync mid other packet in case of wrap / discontinuity
|
||||
uint8_t m_num_F_nibbles; //!< count consecutive F nibbles.
|
||||
bool m_sync_start; //!< possible start of sync
|
||||
bool m_is_sync; //!< true if found sync at current nibble
|
||||
ocsd_trc_index_t m_sync_index; //!< index of start of possible sync packet
|
||||
|
||||
void checkSyncNibble(); //!< check current nibble as part of sync.
|
||||
void clearSyncCount(); //!< valid packet, so clear sync counters (i.e. a trailing ffff is not part of sync).
|
||||
|
||||
class monAttachNotify : public IComponentAttachNotifier
|
||||
{
|
||||
public:
|
||||
monAttachNotify() { m_bInUse = false; };
|
||||
virtual ~monAttachNotify() {};
|
||||
virtual void attachNotify(const int num_attached) { m_bInUse = (num_attached > 0); };
|
||||
|
||||
const bool usingMonitor() const { return m_bInUse; };
|
||||
|
||||
private:
|
||||
bool m_bInUse;
|
||||
} mon_in_use;
|
||||
};
|
||||
|
||||
inline const bool TrcPktProcStm::dataToProcess() const
|
||||
{
|
||||
// data to process if
|
||||
// 1) not processed all the input bytes
|
||||
// 2) there is still a nibble available from the last byte.
|
||||
// 3) bytes processed, but there is a full packet to send
|
||||
return (m_data_in_used < m_data_in_size) || m_nibble_2nd_valid || (m_proc_state == SEND_PKT);
|
||||
}
|
||||
|
||||
|
||||
inline void TrcPktProcStm::checkSyncNibble()
|
||||
{
|
||||
if(m_nibble != 0xF)
|
||||
{
|
||||
if(!m_sync_start)
|
||||
return;
|
||||
|
||||
if((m_nibble == 0) && (m_num_F_nibbles >= 21))
|
||||
{
|
||||
m_is_sync = true; //this nibble marks a sync sequence - keep the F nibble count
|
||||
}
|
||||
else
|
||||
{
|
||||
clearSyncCount(); // clear all sync counters
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
m_num_F_nibbles++;
|
||||
if(!m_sync_start)
|
||||
{
|
||||
m_sync_start = true;
|
||||
m_sync_index = m_packet_index + ((m_num_nibbles - 1) / 2);
|
||||
}
|
||||
}
|
||||
|
||||
inline void TrcPktProcStm::clearSyncCount()
|
||||
{
|
||||
m_num_F_nibbles = 0;
|
||||
m_sync_start = false;
|
||||
m_is_sync = false;
|
||||
}
|
||||
|
||||
inline void TrcPktProcStm::sendPacket()
|
||||
{
|
||||
m_proc_state = SEND_PKT;
|
||||
}
|
||||
|
||||
inline void TrcPktProcStm::setProcUnsynced()
|
||||
{
|
||||
m_proc_state = WAIT_SYNC;
|
||||
m_bStreamSync = false;
|
||||
}
|
||||
|
||||
|
||||
inline void TrcPktProcStm::savePacketByte(const uint8_t val)
|
||||
{
|
||||
// save packet data if using monitor and synchronised.
|
||||
if(mon_in_use.usingMonitor() && !m_bWaitSyncSaveSuppressed)
|
||||
m_packet_data.push_back(val);
|
||||
}
|
||||
|
||||
/** @}*/
|
||||
|
||||
#endif // ARM_TRC_PKT_PROC_STM_H_INCLUDED
|
||||
|
||||
/* End of File trc_pkt_proc_stm.h */
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user