Update OpenCSD to v1.4.0.
Sponsored by: UKRI
This commit is contained in:
parent
d7aa8d0a1f
commit
974000f192
5
.gitignore
vendored
5
.gitignore
vendored
@ -14,6 +14,9 @@
|
|||||||
*.la
|
*.la
|
||||||
*.lo
|
*.lo
|
||||||
|
|
||||||
|
# gcc dependency files
|
||||||
|
*.d
|
||||||
|
|
||||||
# Shared objects (inc. Windows DLLs)
|
# Shared objects (inc. Windows DLLs)
|
||||||
*.dll
|
*.dll
|
||||||
*.so
|
*.so
|
||||||
@ -43,6 +46,7 @@ ipch/
|
|||||||
*.pdb
|
*.pdb
|
||||||
*.exp
|
*.exp
|
||||||
*.ilk
|
*.ilk
|
||||||
|
.vs/
|
||||||
|
|
||||||
# ignore emacs backup saves
|
# ignore emacs backup saves
|
||||||
*~
|
*~
|
||||||
@ -74,3 +78,4 @@ decoder/docs/html/*
|
|||||||
*.VC.VC.opendb
|
*.VC.VC.opendb
|
||||||
*.iobj
|
*.iobj
|
||||||
*.ipdb
|
*.ipdb
|
||||||
|
decoder/tests/results*
|
||||||
|
84
README.md
84
README.md
@ -27,11 +27,12 @@ Releases will appear on the master branch in the git repository with an appropri
|
|||||||
CoreSight Trace Component Support.
|
CoreSight Trace Component Support.
|
||||||
----------------------------------
|
----------------------------------
|
||||||
|
|
||||||
_Current Version 0.14.2_
|
_Current Version 1.4.0_
|
||||||
|
|
||||||
### Current support:
|
### Current support:
|
||||||
|
|
||||||
- ETMv4 (v4.5 [A/R profile] v4.4 [M profile]) instruction trace - packet processing and packet decode.
|
- ETE (v1.3) instruction trace - packet processing and packet decode.
|
||||||
|
- ETMv4 (v4.6 [A/R profile] v4.4 [M profile]) instruction trace - packet processing and packet decode.
|
||||||
- PTM (v1.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) instruction trace - packet processing and packet decode.
|
||||||
- ETMv3 (v3.5) data trace - packet processing.
|
- ETMv3 (v3.5) data trace - packet processing.
|
||||||
@ -211,6 +212,85 @@ Version and Modification Information
|
|||||||
- __Bugfix__: I-decode: Some Thumb instructions not correctly reported as implied returns.
|
- __Bugfix__: I-decode: Some Thumb instructions not correctly reported as implied returns.
|
||||||
(github issue #24, submitted by kongy).
|
(github issue #24, submitted by kongy).
|
||||||
|
|
||||||
|
- _Version 0.14.3_:
|
||||||
|
- __Update__: Fix makefile to be compliant with RPM base distros. (github issue #26, submitted by jlinton)
|
||||||
|
- __Update__: Add section to autofdo document.
|
||||||
|
- __Bugfix__: STM: fix bug that was missing ASYNC packets. (github issue #27, reported by subhasish Karmakar)
|
||||||
|
|
||||||
|
- _Version 0.14.4_:
|
||||||
|
- __Update__: makefile: Add DESTDIR to install targets. (github issue #30)
|
||||||
|
- __Update__: tests: add script to run single test only.
|
||||||
|
- __Update__: docs: update to location of ARM coresight driver backports directory.
|
||||||
|
- __Bugfix__: ETMv3: Fix missing comma in string list. (github issue #31)
|
||||||
|
- __Bugfix__: makefile: tests: Fix build race problem (github issue #32)
|
||||||
|
- __Bugfix__: tests: fix ignore tpiu command line options (github issue #28)
|
||||||
|
|
||||||
|
- _Version 1.0.0_:
|
||||||
|
- __New Decode Protocol__: Support added for the ETE protocol, used by ARM PEs that implement the FEAT_ETE
|
||||||
|
feature. Supports new architectural features in this trace, including FEAT_TME.
|
||||||
|
- __Update__: Output Elememts: New protocol defines two new output elements.
|
||||||
|
- __Update__: Add support for WFIT / WFET instructions traced as P0 elements.
|
||||||
|
- __Update__: Architecture versioning. Arch v8 + PEs may add features in a flexible manner, and ARM also
|
||||||
|
declares future features ahead of architecture versions to allow support to be added.
|
||||||
|
APIs requiring an architecture version can now use ARCH_AA64 to declare a version of v8.3 +
|
||||||
|
additional features. This relaxes the strict versionnig rules that the decoder uses when
|
||||||
|
looking for Opcodes as trace waypoints.
|
||||||
|
- __Update__: docs: Add linux 'man' file and installation.
|
||||||
|
- __Bugfix__: build: Fix clean install, and remove static lib build test from main makefile to
|
||||||
|
dev makefile only. (github issue #33)
|
||||||
|
|
||||||
|
- _Version 1.1.0_:
|
||||||
|
- __Update__: ETM v4.6 support.
|
||||||
|
- __Update__: C-API - add API functions to get last error and convert error code to string.
|
||||||
|
- __Bugfix__: ETMv4/ETE - fix loop problem in commit elements.
|
||||||
|
- __Bugfix__: ETMv4/ETE - make error handling consistent.
|
||||||
|
- __Bugfix__: Add Pull request #36 from github (Ross Burton)
|
||||||
|
- __Bugfix__: Add Pull request #37 from github (Ian Rogers)
|
||||||
|
|
||||||
|
- _Version 1.1.1_:
|
||||||
|
- __Bugfix__: Fix include and install for ETE decoder headers.
|
||||||
|
|
||||||
|
- _Version 1.2.0_:
|
||||||
|
- __Update__: Add API for counting packet decode statistics, and Frame debmux statistics.
|
||||||
|
- __Update__: Update test scripts to allow additional command line options to be passed.
|
||||||
|
- __Bugfix__: Fix various build warnings.
|
||||||
|
- __Bugfix__: Remove unused variable (github issue #38 from Yi Kong)
|
||||||
|
- __Bugfix__: Remove noisy printf (James Clark)
|
||||||
|
- __Bugfix__: Fix documentation issues (github issues #39 & #40 from rbresalier)
|
||||||
|
|
||||||
|
- _Version 1.2.1_:
|
||||||
|
- __Bugfix__: ETM4x / ETE - output of context elements to client can in some circumstances
|
||||||
|
be delayed until after subsequent atoms have been processed leading to incorrect
|
||||||
|
memory decode access via the client callbacks.
|
||||||
|
Fixed to flush context elements immediately they are committed.
|
||||||
|
|
||||||
|
- _Version 1.3.0_:
|
||||||
|
- __Admin__: Dev versions now have patch versions at least +100 from root public version
|
||||||
|
- __Update__: Add support for conditional branch (BC.cond) introduced for v8.8 / v9.3 architecture.
|
||||||
|
- __Update__: ETE: Add support for NSE bit - security state bit defining Root / Realm states in FEAT_RME.
|
||||||
|
|
||||||
|
- _Version 1.3.1_:
|
||||||
|
- __Bugfix__: Add header file in snapshot parser - fix build for certain libc++ libs (github issue #43 from manojgupta)
|
||||||
|
- __Bugfix__: Fix typo in comment (github issue #42 from nothatDinger)
|
||||||
|
|
||||||
|
- _Version 1.3.2_:
|
||||||
|
- __Bugfix__: ETM4x / ETE - 64 bit timestamp value - MS bit incorrectly masked to 1b0 during extraction from packet.
|
||||||
|
|
||||||
|
- _Version 1.3.3_:
|
||||||
|
- __Update__: Add build directory for VS2022 build.
|
||||||
|
- __Update__: Add test program for Coresight Frame Demux code
|
||||||
|
- __Bugfix__: PTM: Fix incorrect extraction of Waypoint Address packet (github issue #48)
|
||||||
|
- __Bugfix__: Frame Demux: Fix HSYNC, FSYNC and 4xFSYNC handling that was causing out-of-bounds reads
|
||||||
|
on invalid data input. (issues #49, #50 and #51). Fixed error handling for incorrect
|
||||||
|
number of FSYNC packets in 4xFSYNC frame reset code that was not triggering an error
|
||||||
|
and allowing fun with mis-aligned input data.
|
||||||
|
- __Bugfix__: Fix silent failure if incorrect config flags set when setting up frame demux modes.
|
||||||
|
|
||||||
|
- _Version 1.4.0_:
|
||||||
|
- __Update__: ETE: Add support for Arch v9.4 FEAT_ITE. ETE v1p3, sw trace instrumentation.
|
||||||
|
Adds in new generic output packet type: OCSD_GEN_TRC_ELEM_INSTRUMENTATION.
|
||||||
|
- __Bugfix__: Fix memory leak in mispredict handling (github issue #52 from yabinc)
|
||||||
|
|
||||||
|
|
||||||
Licence Information
|
Licence Information
|
||||||
===================
|
===================
|
||||||
|
@ -65,9 +65,10 @@ export INSTALL=install
|
|||||||
# installation directory
|
# installation directory
|
||||||
PREFIX ?=/usr
|
PREFIX ?=/usr
|
||||||
LIB_PATH ?= lib
|
LIB_PATH ?= lib
|
||||||
INSTALL_LIB_DIR=$(PREFIX)/$(LIB_PATH)
|
INSTALL_LIB_DIR=$(DESTDIR)$(PREFIX)/$(LIB_PATH)
|
||||||
INSTALL_BIN_DIR=$(PREFIX)/bin
|
INSTALL_BIN_DIR=$(DESTDIR)$(PREFIX)/bin
|
||||||
export INSTALL_INCLUDE_DIR=$(PREFIX)/include/
|
export INSTALL_INCLUDE_DIR=$(DESTDIR)$(PREFIX)/include/
|
||||||
|
INSTALL_MAN_DIR=$(DESTDIR)$(PREFIX)/share/man/man1
|
||||||
|
|
||||||
# compile flags
|
# compile flags
|
||||||
CFLAGS += $(CPPFLAGS) -c -Wall -DLINUX -Wno-switch -Wlogical-op -fPIC
|
CFLAGS += $(CPPFLAGS) -c -Wall -DLINUX -Wno-switch -Wlogical-op -fPIC
|
||||||
@ -114,19 +115,27 @@ all: libs tests
|
|||||||
|
|
||||||
libs: $(LIB_BASE_NAME)_lib $(LIB_CAPI_NAME)_lib
|
libs: $(LIB_BASE_NAME)_lib $(LIB_CAPI_NAME)_lib
|
||||||
|
|
||||||
|
DEF_SO_PERM ?= 644
|
||||||
|
|
||||||
install: libs tests
|
install: libs tests
|
||||||
mkdir -p $(INSTALL_LIB_DIR) $(INSTALL_INCLUDE_DIR) $(INSTALL_BIN_DIR)
|
mkdir -p $(INSTALL_LIB_DIR) $(INSTALL_INCLUDE_DIR) $(INSTALL_BIN_DIR)
|
||||||
cp -d $(LIB_TARGET_DIR)/lib$(LIB_BASE_NAME).so $(INSTALL_LIB_DIR)/
|
cp -d $(LIB_TARGET_DIR)/lib$(LIB_BASE_NAME).so $(INSTALL_LIB_DIR)/
|
||||||
cp -d $(LIB_TARGET_DIR)/lib$(LIB_BASE_NAME).so.$(SO_MAJOR_VER) $(INSTALL_LIB_DIR)/
|
cp -d $(LIB_TARGET_DIR)/lib$(LIB_BASE_NAME).so.$(SO_MAJOR_VER) $(INSTALL_LIB_DIR)/
|
||||||
$(INSTALL) --mode=644 $(LIB_TARGET_DIR)/lib$(LIB_BASE_NAME).so.$(SO_VER) $(INSTALL_LIB_DIR)/
|
$(INSTALL) --mode=$(DEF_SO_PERM) $(LIB_TARGET_DIR)/lib$(LIB_BASE_NAME).so.$(SO_VER) $(INSTALL_LIB_DIR)/
|
||||||
cp -d $(LIB_TARGET_DIR)/lib$(LIB_CAPI_NAME).so $(INSTALL_LIB_DIR)/
|
cp -d $(LIB_TARGET_DIR)/lib$(LIB_CAPI_NAME).so $(INSTALL_LIB_DIR)/
|
||||||
cp -d $(LIB_TARGET_DIR)/lib$(LIB_CAPI_NAME).so.$(SO_MAJOR_VER) $(INSTALL_LIB_DIR)/
|
cp -d $(LIB_TARGET_DIR)/lib$(LIB_CAPI_NAME).so.$(SO_MAJOR_VER) $(INSTALL_LIB_DIR)/
|
||||||
$(INSTALL) --mode=644 $(LIB_TARGET_DIR)/lib$(LIB_CAPI_NAME).so.$(SO_VER) $(INSTALL_LIB_DIR)/
|
$(INSTALL) --mode=$(DEF_SO_PERM) $(LIB_TARGET_DIR)/lib$(LIB_CAPI_NAME).so.$(SO_VER) $(INSTALL_LIB_DIR)/
|
||||||
|
ifndef DISABLE_STATIC
|
||||||
$(INSTALL) --mode=644 $(LIB_TARGET_DIR)/lib$(LIB_BASE_NAME).a $(INSTALL_LIB_DIR)/
|
$(INSTALL) --mode=644 $(LIB_TARGET_DIR)/lib$(LIB_BASE_NAME).a $(INSTALL_LIB_DIR)/
|
||||||
$(INSTALL) --mode=644 $(LIB_TARGET_DIR)/lib$(LIB_CAPI_NAME).a $(INSTALL_LIB_DIR)/
|
$(INSTALL) --mode=644 $(LIB_TARGET_DIR)/lib$(LIB_CAPI_NAME).a $(INSTALL_LIB_DIR)/
|
||||||
|
endif
|
||||||
cd $(OCSD_ROOT)/build/linux/rctdl_c_api_lib && make install_inc
|
cd $(OCSD_ROOT)/build/linux/rctdl_c_api_lib && make install_inc
|
||||||
$(INSTALL) --mode=755 $(BIN_TEST_TARGET_DIR)/trc_pkt_lister $(INSTALL_BIN_DIR)/
|
$(INSTALL) --mode=755 $(BIN_TEST_TARGET_DIR)/trc_pkt_lister $(INSTALL_BIN_DIR)/
|
||||||
|
|
||||||
|
install_man:
|
||||||
|
mkdir -p $(INSTALL_MAN_DIR)
|
||||||
|
$(INSTALL) --mode=644 $(OCSD_ROOT)/docs/man/trc_pkt_lister.1 $(INSTALL_MAN_DIR)/
|
||||||
|
|
||||||
|
|
||||||
################################
|
################################
|
||||||
# build OpenCSD trace decode library
|
# build OpenCSD trace decode library
|
||||||
@ -164,6 +173,7 @@ tests: libs
|
|||||||
cd $(OCSD_ROOT)/tests/build/linux/trc_pkt_lister && $(MAKE)
|
cd $(OCSD_ROOT)/tests/build/linux/trc_pkt_lister && $(MAKE)
|
||||||
cd $(OCSD_ROOT)/tests/build/linux/c_api_pkt_print_test && $(MAKE)
|
cd $(OCSD_ROOT)/tests/build/linux/c_api_pkt_print_test && $(MAKE)
|
||||||
cd $(OCSD_ROOT)/tests/build/linux/mem_buffer_eg && $(MAKE)
|
cd $(OCSD_ROOT)/tests/build/linux/mem_buffer_eg && $(MAKE)
|
||||||
|
cd $(OCSD_ROOT)/tests/build/linux/frame_demux_test && $(MAKE)
|
||||||
|
|
||||||
#
|
#
|
||||||
# build docs
|
# build docs
|
||||||
@ -189,6 +199,7 @@ clean_tests:
|
|||||||
cd $(OCSD_ROOT)/tests/build/linux/trc_pkt_lister && $(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
|
cd $(OCSD_ROOT)/tests/build/linux/c_api_pkt_print_test && $(MAKE) clean
|
||||||
cd $(OCSD_ROOT)/tests/build/linux/mem_buffer_eg && $(MAKE) clean
|
cd $(OCSD_ROOT)/tests/build/linux/mem_buffer_eg && $(MAKE) clean
|
||||||
|
cd $(OCSD_ROOT)/tests/build/linux/frame_demux_test && $(MAKE) clean
|
||||||
-rmdir $(OCSD_TESTS)/lib
|
-rmdir $(OCSD_TESTS)/lib
|
||||||
|
|
||||||
clean_docs:
|
clean_docs:
|
||||||
@ -198,3 +209,5 @@ clean_install:
|
|||||||
-rm $(INSTALL_LIB_DIR)/lib$(LIB_BASE_NAME).*
|
-rm $(INSTALL_LIB_DIR)/lib$(LIB_BASE_NAME).*
|
||||||
-rm $(INSTALL_LIB_DIR)/lib$(LIB_CAPI_NAME).*
|
-rm $(INSTALL_LIB_DIR)/lib$(LIB_CAPI_NAME).*
|
||||||
-rm -r $(INSTALL_INCLUDE_DIR)/$(LIB_UAPI_INC_DIR)
|
-rm -r $(INSTALL_INCLUDE_DIR)/$(LIB_UAPI_INC_DIR)
|
||||||
|
-rm $(INSTALL_BIN_DIR)/trc_pkt_lister
|
||||||
|
-rm $(INSTALL_MAN_DIR)/trc_pkt_lister.1
|
||||||
|
@ -63,5 +63,8 @@ else
|
|||||||
PLAT_DIR=linux$(BIT_VARIANT)/$(BUILD_VARIANT)
|
PLAT_DIR=linux$(BIT_VARIANT)/$(BUILD_VARIANT)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
# for dev env, enable static link build test
|
||||||
|
export TEST_STATIC_LINKING=1
|
||||||
|
|
||||||
# include the main makefile
|
# include the main makefile
|
||||||
include makefile
|
include makefile
|
||||||
|
@ -113,6 +113,8 @@ install_inc:
|
|||||||
$(INSTALL) --mode=0644 $(INST_INC_SRC)/etmv3/trc_pkt_types_etmv3.h $(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) -d --mode=0755 $(INST_INC_DST)/etmv4
|
||||||
$(INSTALL) --mode=0644 $(INST_INC_SRC)/etmv4/trc_pkt_types_etmv4.h $(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)/ete
|
||||||
|
$(INSTALL) --mode=0644 $(INST_INC_SRC)/ete/trc_pkt_types_ete.h $(INST_INC_DST)/ete/
|
||||||
$(INSTALL) -d --mode=0755 $(INST_INC_DST)/c_api
|
$(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/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/opencsd_c_api.h $(INST_INC_DST)/c_api/
|
||||||
|
@ -41,6 +41,7 @@ BUILD_DIR=./$(PLAT_DIR)
|
|||||||
VPATH= $(OCSD_SOURCE) \
|
VPATH= $(OCSD_SOURCE) \
|
||||||
$(OCSD_SOURCE)/etmv3 \
|
$(OCSD_SOURCE)/etmv3 \
|
||||||
$(OCSD_SOURCE)/etmv4 \
|
$(OCSD_SOURCE)/etmv4 \
|
||||||
|
$(OCSD_SOURCE)/ete \
|
||||||
$(OCSD_SOURCE)/ptm \
|
$(OCSD_SOURCE)/ptm \
|
||||||
$(OCSD_SOURCE)/i_dec \
|
$(OCSD_SOURCE)/i_dec \
|
||||||
$(OCSD_SOURCE)/mem_acc \
|
$(OCSD_SOURCE)/mem_acc \
|
||||||
@ -59,10 +60,11 @@ ETMV3OBJ= $(BUILD_DIR)/trc_cmp_cfg_etmv3.o \
|
|||||||
$(BUILD_DIR)/trc_pkt_proc_etmv3_impl.o
|
$(BUILD_DIR)/trc_pkt_proc_etmv3_impl.o
|
||||||
|
|
||||||
ETMV4OBJ= $(BUILD_DIR)/trc_cmp_cfg_etmv4.o \
|
ETMV4OBJ= $(BUILD_DIR)/trc_cmp_cfg_etmv4.o \
|
||||||
|
$(BUILD_DIR)/trc_etmv4_stack_elem.o \
|
||||||
$(BUILD_DIR)/trc_pkt_proc_etmv4i.o \
|
$(BUILD_DIR)/trc_pkt_proc_etmv4i.o \
|
||||||
$(BUILD_DIR)/trc_pkt_decode_etmv4i.o \
|
$(BUILD_DIR)/trc_pkt_decode_etmv4i.o \
|
||||||
$(BUILD_DIR)/trc_pkt_elem_etmv4i.o \
|
$(BUILD_DIR)/trc_pkt_elem_etmv4i.o \
|
||||||
$(BUILD_DIR)/trc_etmv4_stack_elem.o
|
$(BUILD_DIR)/trc_cmp_cfg_ete.o
|
||||||
|
|
||||||
PTMOBJ= $(BUILD_DIR)/trc_cmp_cfg_ptm.o \
|
PTMOBJ= $(BUILD_DIR)/trc_cmp_cfg_ptm.o \
|
||||||
$(BUILD_DIR)/trc_pkt_elem_ptm.o \
|
$(BUILD_DIR)/trc_pkt_elem_ptm.o \
|
||||||
|
@ -310,6 +310,7 @@
|
|||||||
<None Include="..\..\..\..\TODO" />
|
<None Include="..\..\..\..\TODO" />
|
||||||
<None Include="..\..\..\docs\build_libs.md" />
|
<None Include="..\..\..\docs\build_libs.md" />
|
||||||
<None Include="..\..\..\docs\external_custom.md" />
|
<None Include="..\..\..\docs\external_custom.md" />
|
||||||
|
<None Include="..\..\..\docs\man\trc_pkt_lister.1" />
|
||||||
<None Include="..\..\..\docs\test_progs.md" />
|
<None Include="..\..\..\docs\test_progs.md" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
@ -339,6 +340,10 @@
|
|||||||
<ClInclude Include="..\..\..\include\common\trc_printable_elem.h" />
|
<ClInclude Include="..\..\..\include\common\trc_printable_elem.h" />
|
||||||
<ClInclude Include="..\..\..\include\common\trc_ret_stack.h" />
|
<ClInclude Include="..\..\..\include\common\trc_ret_stack.h" />
|
||||||
<ClInclude Include="..\..\..\include\mem_acc\trc_mem_acc_cache.h" />
|
<ClInclude Include="..\..\..\include\mem_acc\trc_mem_acc_cache.h" />
|
||||||
|
<ClInclude Include="..\..\..\include\opencsd\ete\ete_decoder.h" />
|
||||||
|
<ClInclude Include="..\..\..\include\opencsd\ete\trc_cmp_cfg_ete.h" />
|
||||||
|
<ClInclude Include="..\..\..\include\opencsd\ete\trc_dcd_mngr_ete.h" />
|
||||||
|
<ClInclude Include="..\..\..\include\opencsd\ete\trc_pkt_types_ete.h" />
|
||||||
<ClInclude Include="..\..\..\include\opencsd\etmv3\etmv3_decoder.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_cmp_cfg_etmv3.h" />
|
||||||
<ClInclude Include="..\..\..\include\opencsd\etmv3\trc_dcd_mngr_etmv3.h" />
|
<ClInclude Include="..\..\..\include\opencsd\etmv3\trc_dcd_mngr_etmv3.h" />
|
||||||
@ -354,6 +359,7 @@
|
|||||||
<ClInclude Include="..\..\..\include\opencsd\etmv4\trc_pkt_elem_etmv4d.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_elem_etmv4i.h" />
|
||||||
<ClInclude Include="..\..\..\include\opencsd\etmv4\trc_pkt_proc_etmv4.h" />
|
<ClInclude Include="..\..\..\include\opencsd\etmv4\trc_pkt_proc_etmv4.h" />
|
||||||
|
<ClInclude Include="..\..\..\include\opencsd\etmv4\trc_pkt_proc_etmv4i.h" />
|
||||||
<ClInclude Include="..\..\..\include\opencsd\etmv4\trc_pkt_types_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_abs_typed_base_i.h" />
|
||||||
<ClInclude Include="..\..\..\include\interfaces\trc_data_rawframe_in_i.h" />
|
<ClInclude Include="..\..\..\include\interfaces\trc_data_rawframe_in_i.h" />
|
||||||
@ -404,6 +410,7 @@
|
|||||||
<ClInclude Include="..\..\..\source\trc_frame_deformatter_impl.h" />
|
<ClInclude Include="..\..\..\source\trc_frame_deformatter_impl.h" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<ClCompile Include="..\..\..\source\ete\trc_cmp_cfg_ete.cpp" />
|
||||||
<ClCompile Include="..\..\..\source\etmv3\trc_cmp_cfg_etmv3.cpp" />
|
<ClCompile Include="..\..\..\source\etmv3\trc_cmp_cfg_etmv3.cpp" />
|
||||||
<ClCompile Include="..\..\..\source\etmv3\trc_pkt_decode_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_elem_etmv3.cpp" />
|
||||||
|
@ -64,6 +64,12 @@
|
|||||||
<Filter Include="Source Files\pkt_printers">
|
<Filter Include="Source Files\pkt_printers">
|
||||||
<UniqueIdentifier>{baf047d0-0ff7-4502-b42b-4f1fda94d54b}</UniqueIdentifier>
|
<UniqueIdentifier>{baf047d0-0ff7-4502-b42b-4f1fda94d54b}</UniqueIdentifier>
|
||||||
</Filter>
|
</Filter>
|
||||||
|
<Filter Include="Header Files\ete">
|
||||||
|
<UniqueIdentifier>{3d119e90-c89b-4f27-8163-305924453e1f}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Source Files\ete">
|
||||||
|
<UniqueIdentifier>{8cfdb19c-28fc-4e79-b8d5-4e54907b1f82}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="..\..\..\..\LICENSE">
|
<None Include="..\..\..\..\LICENSE">
|
||||||
@ -87,6 +93,9 @@
|
|||||||
<None Include="..\..\..\docs\external_custom.md">
|
<None Include="..\..\..\docs\external_custom.md">
|
||||||
<Filter>docs-files</Filter>
|
<Filter>docs-files</Filter>
|
||||||
</None>
|
</None>
|
||||||
|
<None Include="..\..\..\docs\man\trc_pkt_lister.1">
|
||||||
|
<Filter>docs-files</Filter>
|
||||||
|
</None>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="..\..\..\source\trc_frame_deformatter_impl.h">
|
<ClInclude Include="..\..\..\source\trc_frame_deformatter_impl.h">
|
||||||
@ -356,6 +365,21 @@
|
|||||||
<ClInclude Include="..\..\..\include\common\ocsd_gen_elem_stack.h">
|
<ClInclude Include="..\..\..\include\common\ocsd_gen_elem_stack.h">
|
||||||
<Filter>Header Files\common</Filter>
|
<Filter>Header Files\common</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\include\opencsd\ete\trc_pkt_types_ete.h">
|
||||||
|
<Filter>Header Files\ete</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\include\opencsd\ete\trc_cmp_cfg_ete.h">
|
||||||
|
<Filter>Header Files\ete</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\include\opencsd\ete\trc_dcd_mngr_ete.h">
|
||||||
|
<Filter>Header Files\ete</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\include\opencsd\ete\ete_decoder.h">
|
||||||
|
<Filter>Header Files\ete</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\include\opencsd\etmv4\trc_pkt_proc_etmv4i.h">
|
||||||
|
<Filter>Header Files\etmv4</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="..\..\..\source\trc_component.cpp">
|
<ClCompile Include="..\..\..\source\trc_component.cpp">
|
||||||
@ -484,5 +508,8 @@
|
|||||||
<ClCompile Include="..\..\..\source\ocsd_gen_elem_stack.cpp">
|
<ClCompile Include="..\..\..\source\ocsd_gen_elem_stack.cpp">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\..\source\ete\trc_cmp_cfg_ete.cpp">
|
||||||
|
<Filter>Source Files\ete</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
20
decoder/build/win-vs2022/opencsd.props
Normal file
20
decoder/build/win-vs2022/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>
|
@ -0,0 +1,11 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project>
|
||||||
|
<ProjectOutputs>
|
||||||
|
<ProjectOutput>
|
||||||
|
<FullPath>C:\work\OpenCSD\ocsd-linaro\decoder\lib\win32\dbg\libopencsd_c_api.dll</FullPath>
|
||||||
|
</ProjectOutput>
|
||||||
|
</ProjectOutputs>
|
||||||
|
<ContentFiles />
|
||||||
|
<SatelliteDlls />
|
||||||
|
<NonRecipeFileRefs />
|
||||||
|
</Project>
|
@ -0,0 +1,11 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project>
|
||||||
|
<ProjectOutputs>
|
||||||
|
<ProjectOutput>
|
||||||
|
<FullPath>C:\work\OpenCSD\ocsd-linaro\decoder\lib\win32\rel\libopencsd_c_api.dll</FullPath>
|
||||||
|
</ProjectOutput>
|
||||||
|
</ProjectOutputs>
|
||||||
|
<ContentFiles />
|
||||||
|
<SatelliteDlls />
|
||||||
|
<NonRecipeFileRefs />
|
||||||
|
</Project>
|
@ -0,0 +1,11 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project>
|
||||||
|
<ProjectOutputs>
|
||||||
|
<ProjectOutput>
|
||||||
|
<FullPath>C:\work\OpenCSD\ocsd-linaro\decoder\lib\win32\rel\opencsd_c_api.dll</FullPath>
|
||||||
|
</ProjectOutput>
|
||||||
|
</ProjectOutputs>
|
||||||
|
<ContentFiles />
|
||||||
|
<SatelliteDlls />
|
||||||
|
<NonRecipeFileRefs />
|
||||||
|
</Project>
|
@ -0,0 +1,7 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project>
|
||||||
|
<ProjectOutputs />
|
||||||
|
<ContentFiles />
|
||||||
|
<SatelliteDlls />
|
||||||
|
<NonRecipeFileRefs />
|
||||||
|
</Project>
|
327
decoder/build/win-vs2022/rctdl_c_api_lib/rctdl_c_api_lib.vcxproj
Normal file
327
decoder/build/win-vs2022/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>
|
||||||
|
<WindowsTargetPlatformVersion>10.0</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>v143</PlatformToolset>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug-dll|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
<PlatformToolset>v143</PlatformToolset>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
<PlatformToolset>v143</PlatformToolset>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug-dll|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
<PlatformToolset>v143</PlatformToolset>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
<PlatformToolset>v143</PlatformToolset>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release-dll|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
<PlatformToolset>v143</PlatformToolset>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
<PlatformToolset>v143</PlatformToolset>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release-dll|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
<PlatformToolset>v143</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>
|
||||||
|
<TargetName>lib$(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$(LIB_CAPI_NAME)</TargetName>
|
||||||
|
</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$(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>
|
||||||
|
<TargetName>lib$(LIB_CAPI_NAME)</TargetName>
|
||||||
|
<IntDir>$(Platform)\$(Configuration)\</IntDir>
|
||||||
|
</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>
|
||||||
|
<BasicRuntimeChecks />
|
||||||
|
</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;_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;_LIB;_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;_LIB;_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>
|
||||||
|
<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;_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,11 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project>
|
||||||
|
<ProjectOutputs>
|
||||||
|
<ProjectOutput>
|
||||||
|
<FullPath>C:\work\OpenCSD\ocsd-linaro\decoder\lib\win64\dbg\libopencsd_c_api.dll</FullPath>
|
||||||
|
</ProjectOutput>
|
||||||
|
</ProjectOutputs>
|
||||||
|
<ContentFiles />
|
||||||
|
<SatelliteDlls />
|
||||||
|
<NonRecipeFileRefs />
|
||||||
|
</Project>
|
@ -0,0 +1,11 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project>
|
||||||
|
<ProjectOutputs>
|
||||||
|
<ProjectOutput>
|
||||||
|
<FullPath>C:\work\OpenCSD\ocsd-linaro\decoder\lib\win64\rel\libopencsd_c_api.dll</FullPath>
|
||||||
|
</ProjectOutput>
|
||||||
|
</ProjectOutputs>
|
||||||
|
<ContentFiles />
|
||||||
|
<SatelliteDlls />
|
||||||
|
<NonRecipeFileRefs />
|
||||||
|
</Project>
|
@ -0,0 +1,7 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project>
|
||||||
|
<ProjectOutputs />
|
||||||
|
<ContentFiles />
|
||||||
|
<SatelliteDlls />
|
||||||
|
<NonRecipeFileRefs />
|
||||||
|
</Project>
|
@ -0,0 +1,11 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project>
|
||||||
|
<ProjectOutputs>
|
||||||
|
<ProjectOutput>
|
||||||
|
<FullPath>C:\work\OpenCSD\ocsd-linaro\decoder\lib\win32\dbg\libopencsd.dll</FullPath>
|
||||||
|
</ProjectOutput>
|
||||||
|
</ProjectOutputs>
|
||||||
|
<ContentFiles />
|
||||||
|
<SatelliteDlls />
|
||||||
|
<NonRecipeFileRefs />
|
||||||
|
</Project>
|
@ -0,0 +1,7 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project>
|
||||||
|
<ProjectOutputs />
|
||||||
|
<ContentFiles />
|
||||||
|
<SatelliteDlls />
|
||||||
|
<NonRecipeFileRefs />
|
||||||
|
</Project>
|
@ -0,0 +1,7 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project>
|
||||||
|
<ProjectOutputs />
|
||||||
|
<ContentFiles />
|
||||||
|
<SatelliteDlls />
|
||||||
|
<NonRecipeFileRefs />
|
||||||
|
</Project>
|
@ -0,0 +1,166 @@
|
|||||||
|
|
||||||
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
|
# Visual Studio Version 17
|
||||||
|
VisualStudioVersion = 17.0.32929.387
|
||||||
|
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}") = "c_api_pkt_print_test", "..\..\..\tests\build\win-vs2022\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-vs2022\ext_dcd_echo_test\ext_dcd_echo_test.vcxproj", "{46219A32-8178-41C1-B3B1-B5A6E547515F}"
|
||||||
|
EndProject
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mem-buffer-eg", "..\..\..\tests\build\win-vs2022\mem-buffer-eg\mem-buffer-eg.vcxproj", "{BC090130-2C53-4CF6-8AD4-37BF72B8D01A}"
|
||||||
|
ProjectSection(ProjectDependencies) = postProject
|
||||||
|
{7F500891-CC76-405F-933F-F682BC39F923} = {7F500891-CC76-405F-933F-F682BC39F923}
|
||||||
|
EndProjectSection
|
||||||
|
EndProject
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "snapshot_parser_lib", "..\..\..\tests\build\win-vs2022\snapshot_parser_lib\snapshot_parser_lib.vcxproj", "{DE1F395D-4F53-42FB-8AEF-993A4BF7E411}"
|
||||||
|
EndProject
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "trc_pkt_lister", "..\..\..\tests\build\win-vs2022\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}") = "frame_demux_test", "..\..\..\tests\build\win-vs2022\frame_demux_test\frame_demux_test.vcxproj", "{98EE9884-A4EB-4C75-A911-DFEDF992754F}"
|
||||||
|
ProjectSection(ProjectDependencies) = postProject
|
||||||
|
{7F500891-CC76-405F-933F-F682BC39F923} = {7F500891-CC76-405F-933F-F682BC39F923}
|
||||||
|
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|Win32
|
||||||
|
{7F500891-CC76-405F-933F-F682BC39F923}.Debug-dll|Win32.Build.0 = Debug|Win32
|
||||||
|
{7F500891-CC76-405F-933F-F682BC39F923}.Debug-dll|x64.ActiveCfg = Debug|x64
|
||||||
|
{7F500891-CC76-405F-933F-F682BC39F923}.Debug-dll|x64.Build.0 = Debug|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|Win32
|
||||||
|
{7F500891-CC76-405F-933F-F682BC39F923}.Release-dll|Win32.Build.0 = Release|Win32
|
||||||
|
{7F500891-CC76-405F-933F-F682BC39F923}.Release-dll|x64.ActiveCfg = Release|x64
|
||||||
|
{7F500891-CC76-405F-933F-F682BC39F923}.Release-dll|x64.Build.0 = Release|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
|
||||||
|
{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
|
||||||
|
{BC090130-2C53-4CF6-8AD4-37BF72B8D01A}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||||
|
{BC090130-2C53-4CF6-8AD4-37BF72B8D01A}.Debug|Win32.Build.0 = Debug|Win32
|
||||||
|
{BC090130-2C53-4CF6-8AD4-37BF72B8D01A}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
|
{BC090130-2C53-4CF6-8AD4-37BF72B8D01A}.Debug|x64.Build.0 = Debug|x64
|
||||||
|
{BC090130-2C53-4CF6-8AD4-37BF72B8D01A}.Debug-dll|Win32.ActiveCfg = Debug|Win32
|
||||||
|
{BC090130-2C53-4CF6-8AD4-37BF72B8D01A}.Debug-dll|x64.ActiveCfg = Debug|x64
|
||||||
|
{BC090130-2C53-4CF6-8AD4-37BF72B8D01A}.Release|Win32.ActiveCfg = Release|Win32
|
||||||
|
{BC090130-2C53-4CF6-8AD4-37BF72B8D01A}.Release|Win32.Build.0 = Release|Win32
|
||||||
|
{BC090130-2C53-4CF6-8AD4-37BF72B8D01A}.Release|x64.ActiveCfg = Release|x64
|
||||||
|
{BC090130-2C53-4CF6-8AD4-37BF72B8D01A}.Release|x64.Build.0 = Release|x64
|
||||||
|
{BC090130-2C53-4CF6-8AD4-37BF72B8D01A}.Release-dll|Win32.ActiveCfg = Release|Win32
|
||||||
|
{BC090130-2C53-4CF6-8AD4-37BF72B8D01A}.Release-dll|x64.ActiveCfg = Release|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|Win32
|
||||||
|
{DE1F395D-4F53-42FB-8AEF-993A4BF7E411}.Debug-dll|x64.ActiveCfg = Debug|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|Win32
|
||||||
|
{DE1F395D-4F53-42FB-8AEF-993A4BF7E411}.Release-dll|x64.ActiveCfg = Release|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|Win32
|
||||||
|
{18ABC652-AB11-4993-9491-1A7FB7117339}.Debug-dll|x64.ActiveCfg = Debug|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|Win32
|
||||||
|
{18ABC652-AB11-4993-9491-1A7FB7117339}.Release-dll|x64.ActiveCfg = Release|x64
|
||||||
|
{98EE9884-A4EB-4C75-A911-DFEDF992754F}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||||
|
{98EE9884-A4EB-4C75-A911-DFEDF992754F}.Debug|Win32.Build.0 = Debug|Win32
|
||||||
|
{98EE9884-A4EB-4C75-A911-DFEDF992754F}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
|
{98EE9884-A4EB-4C75-A911-DFEDF992754F}.Debug|x64.Build.0 = Debug|x64
|
||||||
|
{98EE9884-A4EB-4C75-A911-DFEDF992754F}.Debug-dll|Win32.ActiveCfg = Debug|Win32
|
||||||
|
{98EE9884-A4EB-4C75-A911-DFEDF992754F}.Debug-dll|x64.ActiveCfg = Debug|x64
|
||||||
|
{98EE9884-A4EB-4C75-A911-DFEDF992754F}.Release|Win32.ActiveCfg = Release|Win32
|
||||||
|
{98EE9884-A4EB-4C75-A911-DFEDF992754F}.Release|Win32.Build.0 = Release|Win32
|
||||||
|
{98EE9884-A4EB-4C75-A911-DFEDF992754F}.Release|x64.ActiveCfg = Release|x64
|
||||||
|
{98EE9884-A4EB-4C75-A911-DFEDF992754F}.Release|x64.Build.0 = Release|x64
|
||||||
|
{98EE9884-A4EB-4C75-A911-DFEDF992754F}.Release-dll|Win32.ActiveCfg = Release|Win32
|
||||||
|
{98EE9884-A4EB-4C75-A911-DFEDF992754F}.Release-dll|x64.ActiveCfg = Release|x64
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
|
HideSolutionNode = FALSE
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
|
SolutionGuid = {8A5D77A4-7683-4395-84D4-9A22BD625E52}
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
@ -0,0 +1,462 @@
|
|||||||
|
<?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>10.0</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>v143</PlatformToolset>
|
||||||
|
<EnableASAN>true</EnableASAN>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug-dll|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
<PlatformToolset>v143</PlatformToolset>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
<PlatformToolset>v143</PlatformToolset>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug-dll|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
<PlatformToolset>v143</PlatformToolset>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
<PlatformToolset>v143</PlatformToolset>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release-dll|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
<PlatformToolset>v143</PlatformToolset>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
<PlatformToolset>v143</PlatformToolset>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release-dll|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
<PlatformToolset>v143</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>
|
||||||
|
<IntDir>$(Platform)\$(Configuration)\</IntDir>
|
||||||
|
<TargetName>lib$(LIB_BASE_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>
|
||||||
|
<BasicRuntimeChecks>UninitializedLocalUsageCheck</BasicRuntimeChecks>
|
||||||
|
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||||
|
</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\man\trc_pkt_lister.1" />
|
||||||
|
<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_gen_elem_stack.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\mem_acc\trc_mem_acc_cache.h" />
|
||||||
|
<ClInclude Include="..\..\..\include\opencsd\ete\ete_decoder.h" />
|
||||||
|
<ClInclude Include="..\..\..\include\opencsd\ete\trc_cmp_cfg_ete.h" />
|
||||||
|
<ClInclude Include="..\..\..\include\opencsd\ete\trc_dcd_mngr_ete.h" />
|
||||||
|
<ClInclude Include="..\..\..\include\opencsd\ete\trc_pkt_types_ete.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_proc_etmv4i.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\opencsd.h" />
|
||||||
|
<ClInclude Include="..\..\..\include\opencsd\ocsd_if_version.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\trc_frame_deformatter_impl.h" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="..\..\..\source\ete\trc_cmp_cfg_ete.cpp" />
|
||||||
|
<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_etmv4i.cpp" />
|
||||||
|
<ClCompile Include="..\..\..\source\etmv4\trc_pkt_proc_etmv4i.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_cache.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_gen_elem_stack.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,515 @@
|
|||||||
|
<?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>
|
||||||
|
<Filter Include="Header Files\ete">
|
||||||
|
<UniqueIdentifier>{3d119e90-c89b-4f27-8163-305924453e1f}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Source Files\ete">
|
||||||
|
<UniqueIdentifier>{8cfdb19c-28fc-4e79-b8d5-4e54907b1f82}</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>
|
||||||
|
<None Include="..\..\..\docs\man\trc_pkt_lister.1">
|
||||||
|
<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\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\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>
|
||||||
|
<ClInclude Include="..\..\..\include\mem_acc\trc_mem_acc_cache.h">
|
||||||
|
<Filter>Header Files\mem_acc</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\include\opencsd\ocsd_if_version.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\include\common\ocsd_gen_elem_stack.h">
|
||||||
|
<Filter>Header Files\common</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\include\opencsd\ete\trc_pkt_types_ete.h">
|
||||||
|
<Filter>Header Files\ete</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\include\opencsd\ete\trc_cmp_cfg_ete.h">
|
||||||
|
<Filter>Header Files\ete</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\include\opencsd\ete\trc_dcd_mngr_ete.h">
|
||||||
|
<Filter>Header Files\ete</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\include\opencsd\ete\ete_decoder.h">
|
||||||
|
<Filter>Header Files\ete</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\..\include\opencsd\etmv4\trc_pkt_proc_etmv4i.h">
|
||||||
|
<Filter>Header Files\etmv4</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_etmv4i.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>
|
||||||
|
<ClCompile Include="..\..\..\source\mem_acc\trc_mem_acc_cache.cpp">
|
||||||
|
<Filter>Source Files\mem_acc</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\..\source\etmv4\trc_pkt_proc_etmv4i.cpp">
|
||||||
|
<Filter>Source Files\etmv4</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\..\source\ocsd_gen_elem_stack.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\..\source\ete\trc_cmp_cfg_ete.cpp">
|
||||||
|
<Filter>Source Files\ete</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
@ -0,0 +1,7 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project>
|
||||||
|
<ProjectOutputs />
|
||||||
|
<ContentFiles />
|
||||||
|
<SatelliteDlls />
|
||||||
|
<NonRecipeFileRefs />
|
||||||
|
</Project>
|
@ -18,7 +18,7 @@ Building the Library
|
|||||||
--------------------
|
--------------------
|
||||||
|
|
||||||
The library and test programs are built from the library `./build/<platform>` directory, where
|
The library and test programs are built from the library `./build/<platform>` directory, where
|
||||||
<platform> is either 'linux' or 'win-vs2015'
|
<platform> is either 'linux' or 'win-vs2015' / 'win-vs2022'
|
||||||
|
|
||||||
See [`./docs/test_progs.md`](@ref test_progs) for further information on use of the test
|
See [`./docs/test_progs.md`](@ref test_progs) for further information on use of the test
|
||||||
programs.
|
programs.
|
||||||
@ -86,6 +86,12 @@ The test programs are built to used the .so versions of the libraries.
|
|||||||
The test program build for `trc_pkt_lister` also builds an auxiliary library used by this program for test purposes only.
|
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/<tgt_dir>` directories.
|
This is the `libsnapshot_parser.a` library, delivered to the `./tests/lib/<tgt_dir>` directories.
|
||||||
|
|
||||||
|
**Note on Linux Build Directory Names**
|
||||||
|
|
||||||
|
Due to tool limitations, the makefiles will not operate correctly if the path to the opencsd directories contains spaces.
|
||||||
|
|
||||||
|
e.g. checking out the project into a directory such as ` /home/name/my opencsd/` will result in build failures.
|
||||||
|
|
||||||
__Installing on Linux__
|
__Installing on Linux__
|
||||||
|
|
||||||
The libraries can be installed on linux using the `make install` command. This will usually require root privileges. Installation will be the version in the `./lib/<tgt_dir>` directory, according to options chosen.
|
The libraries can be installed on linux using the `make install` command. This will usually require root privileges. Installation will be the version in the `./lib/<tgt_dir>` directory, according to options chosen.
|
||||||
|
@ -38,7 +38,7 @@ PROJECT_NAME = "OpenCSD - CoreSight Trace Decode Library"
|
|||||||
# could be handy for archiving the generated documentation or if some version
|
# could be handy for archiving the generated documentation or if some version
|
||||||
# control system is used.
|
# control system is used.
|
||||||
|
|
||||||
PROJECT_NUMBER = 0.14.2
|
PROJECT_NUMBER = 1.4.0
|
||||||
|
|
||||||
# Using the PROJECT_BRIEF tag one can provide an optional one line description
|
# Using the PROJECT_BRIEF tag one can provide an optional one line description
|
||||||
# for a project that appears at the top of each page and should give viewer a
|
# for a project that appears at the top of each page and should give viewer a
|
||||||
@ -805,7 +805,8 @@ INPUT = ../include \
|
|||||||
./prog_guide \
|
./prog_guide \
|
||||||
../include/opencsd \
|
../include/opencsd \
|
||||||
../include \
|
../include \
|
||||||
../tests/auto-fdo/autofdo.md
|
../tests/auto-fdo/autofdo.md \
|
||||||
|
../include/opencsd/ete
|
||||||
|
|
||||||
# This tag can be used to specify the character encoding of the source files
|
# This tag can be used to specify the character encoding of the source files
|
||||||
# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
|
# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
|
||||||
|
127
decoder/docs/man/trc_pkt_lister.1
Normal file
127
decoder/docs/man/trc_pkt_lister.1
Normal file
@ -0,0 +1,127 @@
|
|||||||
|
.\" Hey, EMACS: -*- nroff -*-
|
||||||
|
.TH TRC_PKT_LISTER 1 "2018-03-28"
|
||||||
|
|
||||||
|
.SH NAME
|
||||||
|
trc_pkt_lister \- decodes captured CoreSight\*R trace
|
||||||
|
.SH SYNOPSIS
|
||||||
|
.RI trc_pkt_lister
|
||||||
|
[ \-ss_dir \fI<dir>\fP ]
|
||||||
|
[ -ss_verbose ]
|
||||||
|
[ \-id \fI<n>\fP ]
|
||||||
|
[ \-src_name \fI<name>\fP ]
|
||||||
|
[ \-decode ]
|
||||||
|
[ \-decode_only ]
|
||||||
|
[ \-src_addr_n ]
|
||||||
|
[ \-o_raw_packed ]
|
||||||
|
[ \-o_raw_unpacked ]
|
||||||
|
[ \-logstdout ]
|
||||||
|
[ \-logstderr ]
|
||||||
|
[ \-logfile ]
|
||||||
|
[ \-logfilename \fI<name>\fP ]
|
||||||
|
.br
|
||||||
|
.SH DESCRIPTION
|
||||||
|
.B trc_pkt_lister
|
||||||
|
is a tool that takes a snapshot directory as an input, and lists and/or
|
||||||
|
decodes all the trace packets for a single source, for any currently
|
||||||
|
supported protocol.
|
||||||
|
.PP
|
||||||
|
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.
|
||||||
|
.PP
|
||||||
|
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.
|
||||||
|
.SH OPTIONS
|
||||||
|
.SS Snapshot selection
|
||||||
|
The program defaults to \./ if no \-ss_dir option is given
|
||||||
|
.TP
|
||||||
|
.B \-ss\_dir <dir>
|
||||||
|
Set the directory path to a trace snapshot.
|
||||||
|
.TP
|
||||||
|
\fB\fC\-ss\_verbose\fR
|
||||||
|
Verbose output when reading the snapshot.
|
||||||
|
.SS Decode options
|
||||||
|
.TP
|
||||||
|
.B \-id <n>
|
||||||
|
Set an ID to list (may be used multiple times) \- default if no id set is for all IDs to be printed.
|
||||||
|
.TP
|
||||||
|
.B \-src\_name <name>
|
||||||
|
List packets from a given snapshot source name (defaults to first source found).
|
||||||
|
.TP
|
||||||
|
.B \-decode
|
||||||
|
Full decode of the packets from the trace snapshot (default is to list undecoded packets only.
|
||||||
|
.TP
|
||||||
|
.B \-decode_only
|
||||||
|
Does not list the undecoded packets, just the trace decode.
|
||||||
|
.TP
|
||||||
|
.B \-src\_addr\_n
|
||||||
|
In ETE protocol, indicate skipped N atoms in source address packet ranges by breaking the decode
|
||||||
|
range into multiple ranges on N atoms.
|
||||||
|
.TP
|
||||||
|
.B \-o\_raw\_packed
|
||||||
|
Output raw packed trace frames.
|
||||||
|
.TP
|
||||||
|
.B \-o\_raw\_unpacked
|
||||||
|
Output raw unpacked trace data per ID.
|
||||||
|
.SS Output options
|
||||||
|
Default is to output to file and stdout. Setting any option overrides and limits to only
|
||||||
|
the options set.
|
||||||
|
.TP
|
||||||
|
.B \-logstdout
|
||||||
|
output to stdout.
|
||||||
|
.TP
|
||||||
|
.B \-logstderr
|
||||||
|
output to stderr.
|
||||||
|
.TP
|
||||||
|
.B \-logfile
|
||||||
|
output to file using the default log file name.
|
||||||
|
.TP
|
||||||
|
.B \-logfilename <name>
|
||||||
|
change the name of the output log file.
|
||||||
|
.SH FILES
|
||||||
|
.B Trace Snapshot directory.
|
||||||
|
.PP
|
||||||
|
The \fR./tests/snapshots\fP 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.
|
||||||
|
.PP
|
||||||
|
Snapshots are generated on ARM targets and can then be analysed
|
||||||
|
offline. The snapshot format is available in a separate document.
|
||||||
|
.SH EXAMPLE
|
||||||
|
Example command lines with short output excerpts.
|
||||||
|
.PP
|
||||||
|
.BI TC2 " ETMv3 packet processor output, raw packet output."
|
||||||
|
.br
|
||||||
|
Command line:
|
||||||
|
.br
|
||||||
|
.RI "trc\_pkt\_lister -ss\_dir ../../snapshots/TC2 -o_raw_unpacked"
|
||||||
|
.PP
|
||||||
|
Output:
|
||||||
|
.br
|
||||||
|
Frame Data; Index 17958; ID_DATA[0x11]; 16 04 c0 86 42 97 e1 c4
|
||||||
|
.br
|
||||||
|
Idx:17945; ID:11; I_SYNC : Instruction Packet synchronisation.; (Periodic); Addr=0xc00
|
||||||
|
416e2; S; ISA=Thumb2;
|
||||||
|
.br
|
||||||
|
Idx:17961; ID:11; P_HDR : Atom P-header.; WEN; Cycles=1
|
||||||
|
.br
|
||||||
|
Frame Data; Index 17968; ID_DATA[0x11]; ce af 90 80 80 00 a4 84 a0 84 a4 88
|
||||||
|
.br
|
||||||
|
Idx:17962; ID:11; TIMESTAMP : Timestamp Value.; TS=0x82f9d13097 (562536984727)
|
||||||
|
.br
|
||||||
|
Idx:17974; ID:11; P_HDR : Atom P-header.; WW; Cycles=2
|
||||||
|
.PP
|
||||||
|
.BI Juno " ETB\_1 selected for STM packet output, raw packet output"
|
||||||
|
.br
|
||||||
|
Command line:
|
||||||
|
.br
|
||||||
|
.RI "trc\_pkt\_lister -ss\_dir ../../snapshots/juno_r1_1 -o\_raw\_unpacked -src\_name ETB\_1"
|
||||||
|
.PP
|
||||||
|
.BI Juno " ETMv4 full trace decode + packet monitor, source trace ID 0x10 only."
|
||||||
|
.br
|
||||||
|
Command line:
|
||||||
|
.br
|
||||||
|
.RI "trc\_pkt\_lister -ss\_dir ../../snapshots/juno\_r1\_1 -decode -id 0x10"
|
||||||
|
|
@ -84,7 +84,11 @@ typedef struct _ocsd_generic_trace_elem {
|
|||||||
ocsd_swt_info_t sw_trace_info; /* software trace packet info */
|
ocsd_swt_info_t sw_trace_info; /* software trace packet info */
|
||||||
uint32_t num_instr_range; /* number of instructions covered by range packet (for T32 this cannot be calculated from en-st/i_size) */
|
uint32_t num_instr_range; /* number of instructions covered by range packet (for T32 this cannot be calculated from en-st/i_size) */
|
||||||
unsync_info_t unsync_eot_info; /* additional information for unsync / end-of-trace packets. */
|
unsync_info_t unsync_eot_info; /* additional information for unsync / end-of-trace packets. */
|
||||||
};
|
trace_marker_payload_t sync_marker; /* marker element - sync later element to position in stream */
|
||||||
|
trace_memtrans_t mem_trans; /* memory transaction packet - transaction event */
|
||||||
|
trace_sw_ite_t sw_ite; /* PE sw instrumentation using FEAT_ITE */
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
const void *ptr_extended_data; /* pointer to extended data buffer (data trace, sw trace payload) / custom structure */
|
const void *ptr_extended_data; /* pointer to extended data buffer (data trace, sw trace payload) / custom structure */
|
||||||
|
|
||||||
@ -325,6 +329,58 @@ SW trace packets that have a payload will use the extended_data flag and pointer
|
|||||||
|
|
||||||
SW trace packets that include timestamp information will us the `has_ts` flag and fill in the timestamp value.
|
SW trace packets that include timestamp information will us the `has_ts` flag and fill in the timestamp value.
|
||||||
|
|
||||||
|
These packets are generated by memory writes to STM / ITM trace hardware.
|
||||||
|
|
||||||
|
### OCSD_GEN_TRC_ELEM_SYNC_MARKER ###
|
||||||
|
__packet fields valid__: `sync_marker`
|
||||||
|
|
||||||
|
Synchronisation marker - marks position in stream of an element that is output later.
|
||||||
|
e.g. a timestamp marker can be output to represent the correct position in the stream for a
|
||||||
|
timestamp packet the is output later.
|
||||||
|
|
||||||
|
The `sync_marker` field has a structure as shown below.
|
||||||
|
|
||||||
|
~~~{.c}
|
||||||
|
typedef enum _trace_sync_marker_t {
|
||||||
|
ELEM_MARKER_TS, /**< Marker for timestamp element */
|
||||||
|
} trace_sync_marker_t;
|
||||||
|
|
||||||
|
typedef struct _trace_marker_payload_t {
|
||||||
|
trace_sync_marker_t type; /**< type of sync marker */
|
||||||
|
uint32_t value; /**< sync marker value - usage depends on type */
|
||||||
|
} trace_marker_payload_t;
|
||||||
|
~~~
|
||||||
|
|
||||||
|
### OCSD_GEN_TRC_ELEM_MEMTRANS ###
|
||||||
|
__packet fields valid__: `mem_trans`
|
||||||
|
|
||||||
|
Memory transaction elements may appear in the output stream, if they are not otherwise cancelled
|
||||||
|
by speculative trace packets.
|
||||||
|
|
||||||
|
The memory transaction field has values as defined in the enum below:-
|
||||||
|
|
||||||
|
~~~{.c}
|
||||||
|
typedef enum _memtrans_t {
|
||||||
|
OCSD_MEM_TRANS_TRACE_INIT,/* Trace started while PE in transactional state */
|
||||||
|
OCSD_MEM_TRANS_START, /* Trace after this packet is part of a transactional memory sequence */
|
||||||
|
OCSD_MEM_TRANS_COMMIT, /* Transactional memory sequence valid. */
|
||||||
|
OCSD_MEM_TRANS_FAIL, /* Transactional memory sequence failed - operations since start of transaction have been unwound. */
|
||||||
|
} trace_memtrans_t;
|
||||||
|
~~~
|
||||||
|
|
||||||
|
### OCSD_GEN_TRC_ELEM_INSTRUMENTATION ###
|
||||||
|
__packet fields valid__: `sw_ite`
|
||||||
|
|
||||||
|
Software instrumentation packets generated by the PE `TRCIT` instruction (on cores with `FEAT_ITE`).
|
||||||
|
|
||||||
|
The `sw_ite` structure has the fields defined below:-
|
||||||
|
|
||||||
|
~~~{.c}
|
||||||
|
typedef struct _sw_ite_t {
|
||||||
|
uint8_t el; /* exception level for PE sw instrumentation instruction */
|
||||||
|
uint64_t value; /* payload for PE sw instrumentation instruction */
|
||||||
|
} trace_sw_ite_t;
|
||||||
|
~~~
|
||||||
|
|
||||||
### OCSD_GEN_TRC_ELEM_CUSTOM ###
|
### OCSD_GEN_TRC_ELEM_CUSTOM ###
|
||||||
__packet fields optional__: `extended_data -> ptr_extended_data`,_any others_
|
__packet fields optional__: `extended_data -> ptr_extended_data`,_any others_
|
||||||
|
@ -138,9 +138,17 @@ The error logger can be attached to an output logger - ocsdMsgLogger - which can
|
|||||||
error, or other error messages, out to screen or logging file. Errors can be filtered according to a severity rating,
|
error, or other error messages, out to screen or logging file. Errors can be filtered according to a severity rating,
|
||||||
defined by @ref ocsd_err_severity_t.
|
defined by @ref ocsd_err_severity_t.
|
||||||
|
|
||||||
The DecodeTree will use a default error logger from the library - with a message logger
|
The DecodeTree can use a default error logger from the library - with a message logger that will output to `stderr`.
|
||||||
that will output to `stderr`. Client applications can adjust the configuration of this error logger and
|
|
||||||
message logger, or provide their own configured error logger / message logger pair.
|
Client applications can create and adjust the configuration of this error logger and message logger by getting and intialising
|
||||||
|
the logger.
|
||||||
|
|
||||||
|
~~~{.cpp}
|
||||||
|
// ** Initialise default error logger.
|
||||||
|
DecodeTree::getDefaultErrorLogger()->initErrorLogger(verbosity,true);
|
||||||
|
~~~
|
||||||
|
|
||||||
|
Alternatively clients may provide their own configured error logger / message logger pair.
|
||||||
|
|
||||||
The test program `trc_pkt_lister` provides a customised version of an `ocsdMsgLogger` / `ocsdDefaultErrorLogger` pair
|
The test program `trc_pkt_lister` provides a customised version of an `ocsdMsgLogger` / `ocsdDefaultErrorLogger` pair
|
||||||
to ensure that messages and errors are logged to the screen and a file of its choice. This logger is eventually
|
to ensure that messages and errors are logged to the screen and a file of its choice. This logger is eventually
|
||||||
@ -272,6 +280,7 @@ The different trace source types have different configuration structures, classe
|
|||||||
|
|
||||||
| protocol | config struct | class | name define |
|
| protocol | config struct | class | name define |
|
||||||
|:----------|:--------------------|:------------|:-----------------------------|
|
|:----------|:--------------------|:------------|:-----------------------------|
|
||||||
|
| __ETE__ | @ref ocsd_ete_cfg | ETEConfig | @ref OCSD_BUILTIN_DCD_ETE |
|
||||||
| __ETMv4__ | @ref ocsd_etmv4_cfg | EtmV4Config | @ref OCSD_BUILTIN_DCD_ETMV4I |
|
| __ETMv4__ | @ref ocsd_etmv4_cfg | EtmV4Config | @ref OCSD_BUILTIN_DCD_ETMV4I |
|
||||||
| __ETMv3__ | @ref ocsd_etmv3_cfg | EtmV3Config | @ref OCSD_BUILTIN_DCD_ETMV3 |
|
| __ETMv3__ | @ref ocsd_etmv3_cfg | EtmV3Config | @ref OCSD_BUILTIN_DCD_ETMV3 |
|
||||||
| __PTM__ | @ref ocsd_ptm_cfg | PtmConfig | @ref OCSD_BUILTIN_DCD_PTM |
|
| __PTM__ | @ref ocsd_ptm_cfg | PtmConfig | @ref OCSD_BUILTIN_DCD_PTM |
|
||||||
@ -300,15 +309,19 @@ types to be managed by a memory access mapper:-
|
|||||||
|
|
||||||
~~~{.cpp}
|
~~~{.cpp}
|
||||||
class DecodeTree {
|
class DecodeTree {
|
||||||
///...
|
// ...
|
||||||
|
ocsd_err_t createMemAccMapper(memacc_mapper_t type = MEMACC_MAP_GLOBAL);
|
||||||
|
// ...
|
||||||
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);
|
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);
|
||||||
ocsd_err_t addBinFileMemAcc(const ocsd_vaddr_t address, const ocsd_mem_space_acc_t mem_space, const std::string &filepath);
|
ocsd_err_t addBinFileMemAcc(const ocsd_vaddr_t address, const ocsd_mem_space_acc_t mem_space, const std::string &filepath);
|
||||||
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); */
|
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); */
|
||||||
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);
|
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);
|
||||||
///...
|
// ...
|
||||||
}
|
}
|
||||||
~~~
|
~~~
|
||||||
|
|
||||||
|
The `createMemAccMapper()` function must be called to create the mapper, before the `add...MemAcc()` calls are used.
|
||||||
|
|
||||||
It is further possible to differentiate between memory image access objects by the memory space for which they are valid. If it is known that a certain code image
|
It is further possible to differentiate between memory image access objects by the memory space for which they are valid. If it is known that a certain code image
|
||||||
is present in secure EL3, then an image can be associated with the @ref ocsd_mem_space_acc_t type value @ref OCSD_MEM_SPACE_EL3, which will allow another image to be
|
is present in secure EL3, then an image can be associated with the @ref ocsd_mem_space_acc_t type value @ref OCSD_MEM_SPACE_EL3, which will allow another image to be
|
||||||
present at the same address but a different exception level. However, for the majority of systems, such detailed knowledge of the code is not available, or
|
present at the same address but a different exception level. However, for the majority of systems, such detailed knowledge of the code is not available, or
|
||||||
@ -323,6 +336,7 @@ The C-API contains a similar set of calls to set up memory access objects:-
|
|||||||
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);
|
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);
|
||||||
~~~
|
~~~
|
||||||
|
|
||||||
|
Note that the C-API will automatically create a default mapper when the first memory access object is added.
|
||||||
|
|
||||||
### Adding the output callbacks ###
|
### Adding the output callbacks ###
|
||||||
|
|
||||||
|
@ -61,6 +61,8 @@ __Command Line Options__
|
|||||||
- `-tpiu_hsync` : Input data is from a TPIU source that has both TPIU FSYNC and HSYNC packets present.
|
- `-tpiu_hsync` : Input data is from a TPIU source that has both TPIU FSYNC and HSYNC packets present.
|
||||||
- `-decode` : Full decode of the packets from the trace snapshot (default is to list undecoded packets only.
|
- `-decode` : 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.
|
- `-decode_only` : Does not list the undecoded packets, just the trace decode.
|
||||||
|
- `-src_addr_n` : ETE protocol; Indicate skipped N atoms in source address packet ranges by breaking the decode
|
||||||
|
range into multiple ranges on N atoms.
|
||||||
- `-o_raw_packed` : Output raw packed trace frames.
|
- `-o_raw_packed` : Output raw packed trace frames.
|
||||||
- `-o_raw_unpacked` : Output raw unpacked trace data per ID.
|
- `-o_raw_unpacked` : Output raw unpacked trace data per ID.
|
||||||
|
|
||||||
|
@ -80,16 +80,16 @@ class DecoderMngrBase : public IDecoderMngr
|
|||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ocsd_trace_protocol_t m_builtInProtocol; //!< Protocol ID if built in type.
|
const ocsd_trace_protocol_t m_builtInProtocol; //!< Protocol ID if built in type.
|
||||||
};
|
};
|
||||||
|
|
||||||
template <class P, class Pt, class Pc>
|
template <class P, class Pt, class Pc>
|
||||||
DecoderMngrBase<P,Pt,Pc>::DecoderMngrBase(const std::string &decoderTypeName, ocsd_trace_protocol_t builtInProtocol)
|
DecoderMngrBase<P,Pt,Pc>::DecoderMngrBase(const std::string &decoderTypeName, ocsd_trace_protocol_t builtInProtocol) :
|
||||||
|
m_builtInProtocol(builtInProtocol)
|
||||||
{
|
{
|
||||||
OcsdLibDcdRegister *pDcdReg = OcsdLibDcdRegister::getDecoderRegister();
|
OcsdLibDcdRegister *pDcdReg = OcsdLibDcdRegister::getDecoderRegister();
|
||||||
if(pDcdReg)
|
if(pDcdReg)
|
||||||
pDcdReg->registerDecoderTypeByName(decoderTypeName,this);
|
pDcdReg->registerDecoderTypeByName(decoderTypeName,this);
|
||||||
m_builtInProtocol = builtInProtocol;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class P, class Pt, class Pc>
|
template <class P, class Pt, class Pc>
|
||||||
@ -362,6 +362,49 @@ class DecodeMngrFullDcd : public DecoderMngrBase<P,Pt,Pc>
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* full decode - extended config object - base + derived. */
|
||||||
|
template< class P, // Packet class.
|
||||||
|
class Pt, // Packet enum type ID.
|
||||||
|
class Pc, // Processor config base class.
|
||||||
|
class PcEx, // Processor config derived class
|
||||||
|
class PcSt, // Processor config struct type
|
||||||
|
class PktProc, // Packet processor class.
|
||||||
|
class PktDcd> // Packet decoder class.
|
||||||
|
class DecodeMngrFullDcdExCfg : public DecoderMngrBase<P, Pt, Pc>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
DecodeMngrFullDcdExCfg(const std::string &name, ocsd_trace_protocol_t builtInProtocol)
|
||||||
|
: DecoderMngrBase<P, Pt, Pc>(name, builtInProtocol) {};
|
||||||
|
|
||||||
|
virtual ~DecodeMngrFullDcdExCfg() {};
|
||||||
|
|
||||||
|
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) PcEx((PcSt *)pDataStruct);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/****************************************************************************************************/
|
/****************************************************************************************************/
|
||||||
/* Packet processor only, templated base for creating decoder objects */
|
/* Packet processor only, templated base for creating decoder objects */
|
||||||
/****************************************************************************************************/
|
/****************************************************************************************************/
|
||||||
|
@ -168,6 +168,30 @@ class DecodeTree : public ITrcDataIn
|
|||||||
*/
|
*/
|
||||||
ocsd_err_t removeDecoder(const uint8_t CSID);
|
ocsd_err_t removeDecoder(const uint8_t CSID);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* Get the stats block for the channel indicated.
|
||||||
|
* Caller must check p_stats_block->version to esure that the block
|
||||||
|
* is filled in a compatible manner.
|
||||||
|
*
|
||||||
|
* @param CSID : Configured CoreSight trace ID for the decoder.
|
||||||
|
* @param p_stats_block: block pointer to set to reference the stats block.
|
||||||
|
*
|
||||||
|
* @return ocsd_err_t : Library error code - OCSD_OK if valid block pointer returned,
|
||||||
|
* OCSD_ERR_NOTINIT if decoder does not support stats counting.
|
||||||
|
*/
|
||||||
|
ocsd_err_t getDecoderStats(const uint8_t CSID, ocsd_decode_stats_t **p_stats_block);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* Reset the stats block for the chosens decode channel.
|
||||||
|
* stats block is reset independently of the decoder reset to allow counts across
|
||||||
|
* multiple decode runs.
|
||||||
|
*
|
||||||
|
* @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_err_t resetDecoderStats(const uint8_t CSID);
|
||||||
|
|
||||||
/* get decoder elements currently in use */
|
/* get decoder elements currently in use */
|
||||||
|
|
||||||
@ -387,7 +411,7 @@ class DecodeTree : public ITrcDataIn
|
|||||||
void destroyMemAccMapper();
|
void destroyMemAccMapper();
|
||||||
ocsd_err_t initCallbackMemAcc(const ocsd_vaddr_t st_address, const ocsd_vaddr_t en_address,
|
ocsd_err_t initCallbackMemAcc(const ocsd_vaddr_t st_address, const ocsd_vaddr_t en_address,
|
||||||
const ocsd_mem_space_acc_t mem_space, void *p_cb_func, bool IDfn, const void *p_context);
|
const ocsd_mem_space_acc_t mem_space, void *p_cb_func, bool IDfn, const void *p_context);
|
||||||
|
TrcPktProcI *getPktProcI(const uint8_t CSID);
|
||||||
|
|
||||||
ocsd_dcd_tree_src_t m_dcd_tree_type;
|
ocsd_dcd_tree_src_t m_dcd_tree_type;
|
||||||
|
|
||||||
@ -417,6 +441,9 @@ class DecodeTree : public ITrcDataIn
|
|||||||
|
|
||||||
/**! default instruction decoder */
|
/**! default instruction decoder */
|
||||||
static TrcIDecode s_instruction_decoder;
|
static TrcIDecode s_instruction_decoder;
|
||||||
|
|
||||||
|
/**! demux stats block */
|
||||||
|
ocsd_demux_stats_t m_demux_stats;
|
||||||
};
|
};
|
||||||
|
|
||||||
/** @}*/
|
/** @}*/
|
||||||
|
@ -108,6 +108,17 @@ inline ocsdError& ocsdError::operator=(const ocsdError &err)
|
|||||||
return (*this = &err);
|
return (*this = &err);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* class to get data path response values as strings */
|
||||||
|
class ocsdDataRespStr
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ocsdDataRespStr(ocsd_datapath_resp_t type) { m_type = type; }
|
||||||
|
~ocsdDataRespStr() {};
|
||||||
|
|
||||||
|
const char* getStr();
|
||||||
|
private:
|
||||||
|
ocsd_datapath_resp_t m_type;
|
||||||
|
};
|
||||||
|
|
||||||
/** @}*/
|
/** @}*/
|
||||||
|
|
||||||
|
@ -53,7 +53,8 @@
|
|||||||
*
|
*
|
||||||
* Valid architecture profile names are:-
|
* Valid architecture profile names are:-
|
||||||
* - ARMv7-A, ARMv7-R, ARMv7-M;
|
* - ARMv7-A, ARMv7-R, ARMv7-M;
|
||||||
* - ARMv8-A, ARMv8.3A, ARMv8-R, ARMv8-M;
|
* - ARMv8-A, ARMv8.x-A, ARMv8-R, ARMv8-M;
|
||||||
|
* - ARM-AA64, ARM-aa64
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
class CoreArchProfileMap
|
class CoreArchProfileMap
|
||||||
@ -65,36 +66,12 @@ class CoreArchProfileMap
|
|||||||
ocsd_arch_profile_t getArchProfile(const std::string &coreName);
|
ocsd_arch_profile_t getArchProfile(const std::string &coreName);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
ocsd_arch_profile_t getPatternMatchCoreName(const std::string &coreName);
|
||||||
|
|
||||||
std::map<std::string, ocsd_arch_profile_t> core_profiles;
|
std::map<std::string, ocsd_arch_profile_t> core_profiles;
|
||||||
std::map<std::string, ocsd_arch_profile_t> arch_profiles;
|
std::map<std::string, ocsd_arch_profile_t> arch_profiles;
|
||||||
};
|
};
|
||||||
|
|
||||||
inline ocsd_arch_profile_t CoreArchProfileMap::getArchProfile(const std::string &coreName)
|
|
||||||
{
|
|
||||||
ocsd_arch_profile_t ap = { ARCH_UNKNOWN, profile_Unknown };
|
|
||||||
bool bFound = false;
|
|
||||||
|
|
||||||
std::map<std::string, ocsd_arch_profile_t>::const_iterator it;
|
|
||||||
|
|
||||||
/* match against the core name map. */
|
|
||||||
it = core_profiles.find(coreName);
|
|
||||||
if (it != core_profiles.end())
|
|
||||||
{
|
|
||||||
ap = it->second;
|
|
||||||
bFound = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* scan architecture profiles on no core name match */
|
|
||||||
if (!bFound)
|
|
||||||
{
|
|
||||||
it = arch_profiles.find(coreName);
|
|
||||||
if (it != arch_profiles.end())
|
|
||||||
ap = it->second;
|
|
||||||
}
|
|
||||||
return ap;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // ARM_TRC_CORE_ARCH_MAP_H_INCLUDED
|
#endif // ARM_TRC_CORE_ARCH_MAP_H_INCLUDED
|
||||||
|
|
||||||
/* End of File trc_core_arch_map.h */
|
/* End of File trc_core_arch_map.h */
|
||||||
|
@ -73,6 +73,9 @@ class TraceFormatterFrameDecoder : public ITrcDataIn
|
|||||||
|
|
||||||
componentAttachPt<ITraceErrorLog> *getErrLogAttachPt();
|
componentAttachPt<ITraceErrorLog> *getErrLogAttachPt();
|
||||||
|
|
||||||
|
/* init decoder implementation object */
|
||||||
|
ocsd_err_t Init();
|
||||||
|
|
||||||
/* configuration - set operational mode for incoming stream (has FSYNCS etc) */
|
/* configuration - set operational mode for incoming stream (has FSYNCS etc) */
|
||||||
ocsd_err_t Configure(uint32_t cfg_flags);
|
ocsd_err_t Configure(uint32_t cfg_flags);
|
||||||
const uint32_t getConfigFlags() const;
|
const uint32_t getConfigFlags() const;
|
||||||
@ -85,9 +88,13 @@ class TraceFormatterFrameDecoder : public ITrcDataIn
|
|||||||
ocsd_datapath_resp_t Reset(); /* reset the decode to the start state, drop partial data - propogate to attached components */
|
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 */
|
ocsd_datapath_resp_t Flush(); /* flush existing data if possible, retain state - propogate to attached components */
|
||||||
|
|
||||||
|
/* demux stats */
|
||||||
|
void SetDemuxStatsBlock(ocsd_demux_stats_t *pStatsBlock);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
TraceFmtDcdImpl *m_pDecoder;
|
TraceFmtDcdImpl *m_pDecoder;
|
||||||
int m_instNum;
|
int m_instNum;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/** @}*/
|
/** @}*/
|
||||||
|
@ -69,19 +69,22 @@ class OcsdTraceElement : public trcPrintableElem, public ocsd_generic_trace_elem
|
|||||||
|
|
||||||
void setExcepMarker() { excep_data_marker = 1; };
|
void setExcepMarker() { excep_data_marker = 1; };
|
||||||
void setExceptionNum(uint32_t excepNum) { exception_number = excepNum; };
|
void setExceptionNum(uint32_t excepNum) { exception_number = excepNum; };
|
||||||
|
|
||||||
|
|
||||||
void setTraceOnReason(const trace_on_reason_t reason);
|
void setTraceOnReason(const trace_on_reason_t reason);
|
||||||
void setUnSyncEOTReason(const unsync_info_t reason);
|
void setUnSyncEOTReason(const unsync_info_t reason);
|
||||||
|
void setTransactionType(const trace_memtrans_t trans) { mem_trans = trans; };
|
||||||
|
|
||||||
void setAddrRange(const ocsd_vaddr_t st_addr, const ocsd_vaddr_t en_addr, const int num_instr = 1);
|
void setAddrRange(const ocsd_vaddr_t st_addr, const ocsd_vaddr_t en_addr, const int num_instr = 1);
|
||||||
void setLastInstrInfo(const bool exec, const ocsd_instr_type last_i_type, const ocsd_instr_subtype last_i_subtype, const uint8_t size);
|
void setLastInstrInfo(const bool exec, const ocsd_instr_type last_i_type, const ocsd_instr_subtype last_i_subtype, const uint8_t size);
|
||||||
void setAddrStart(const ocsd_vaddr_t st_addr) { this->st_addr = st_addr; };
|
void setAddrStart(const ocsd_vaddr_t st_addr) { this->st_addr = st_addr; };
|
||||||
void setLastInstrCond(const int is_cond) { this->last_instr_cond = is_cond; };
|
void setLastInstrCond(const int is_cond) { this->last_instr_cond = is_cond; };
|
||||||
|
|
||||||
void setSWTInfo(const ocsd_swt_info_t swt_info) { sw_trace_info = swt_info; };
|
void setSWTInfo(const ocsd_swt_info_t swt_info) { sw_trace_info = swt_info; };
|
||||||
void setExtendedDataPtr(const void *data_ptr);
|
void setExtendedDataPtr(const void *data_ptr);
|
||||||
|
|
||||||
|
void setITEInfo(const trace_sw_ite_t sw_instrumentation) { sw_ite = sw_instrumentation; };
|
||||||
|
|
||||||
|
void setSyncMarker(const trace_marker_payload_t &marker);
|
||||||
|
|
||||||
// stringize the element
|
// stringize the element
|
||||||
|
|
||||||
virtual void toString(std::string &str) const;
|
virtual void toString(std::string &str) const;
|
||||||
@ -208,6 +211,11 @@ inline void OcsdTraceElement::setExtendedDataPtr(const void *data_ptr)
|
|||||||
ptr_extended_data = data_ptr;
|
ptr_extended_data = data_ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline void OcsdTraceElement::setSyncMarker(const trace_marker_payload_t &marker)
|
||||||
|
{
|
||||||
|
sync_marker = marker;
|
||||||
|
}
|
||||||
|
|
||||||
// set persistent data between output packets.
|
// set persistent data between output packets.
|
||||||
inline void OcsdTraceElement::copyPersistentData(const OcsdTraceElement &src)
|
inline void OcsdTraceElement::copyPersistentData(const OcsdTraceElement &src)
|
||||||
{
|
{
|
||||||
|
@ -96,6 +96,7 @@ class TrcPktDecodeI : public TraceComponent
|
|||||||
|
|
||||||
/* target access */
|
/* 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);
|
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);
|
||||||
|
ocsd_err_t invalidateMemAccCache();
|
||||||
|
|
||||||
/* instruction decode */
|
/* instruction decode */
|
||||||
ocsd_err_t instrDecode(ocsd_instr_info *instr_info);
|
ocsd_err_t instrDecode(ocsd_instr_info *instr_info);
|
||||||
@ -180,6 +181,14 @@ inline ocsd_err_t TrcPktDecodeI::accessMemory(const ocsd_vaddr_t address, const
|
|||||||
return OCSD_ERR_DCD_INTERFACE_UNUSED;
|
return OCSD_ERR_DCD_INTERFACE_UNUSED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline ocsd_err_t TrcPktDecodeI::invalidateMemAccCache()
|
||||||
|
{
|
||||||
|
if (!m_uses_memaccess)
|
||||||
|
return OCSD_ERR_DCD_INTERFACE_UNUSED;
|
||||||
|
m_mem_access.first()->InvalidateMemAccCache(getCoreSightTraceID());
|
||||||
|
return OCSD_OK;
|
||||||
|
}
|
||||||
|
|
||||||
/**********************************************************************/
|
/**********************************************************************/
|
||||||
template <class P, class Pc>
|
template <class P, class Pc>
|
||||||
class TrcPktDecodeBase : public TrcPktDecodeI, public IPktDataIn<P>
|
class TrcPktDecodeBase : public TrcPktDecodeI, public IPktDataIn<P>
|
||||||
|
@ -43,6 +43,7 @@
|
|||||||
|
|
||||||
#include "trc_component.h"
|
#include "trc_component.h"
|
||||||
#include "comp_attach_pt_t.h"
|
#include "comp_attach_pt_t.h"
|
||||||
|
#include "opencsd/ocsd_if_version.h"
|
||||||
|
|
||||||
/** @defgroup ocsd_pkt_proc OpenCSD Library : Packet Processors.
|
/** @defgroup ocsd_pkt_proc OpenCSD Library : Packet Processors.
|
||||||
@brief Classes providing Protocol Packet Processing capability.
|
@brief Classes providing Protocol Packet Processing capability.
|
||||||
@ -76,6 +77,8 @@ class TrcPktProcI : public TraceComponent, public ITrcDataIn
|
|||||||
const uint8_t *pDataBlock,
|
const uint8_t *pDataBlock,
|
||||||
uint32_t *numBytesProcessed) = 0;
|
uint32_t *numBytesProcessed) = 0;
|
||||||
|
|
||||||
|
virtual ocsd_err_t getStatsBlock(ocsd_decode_stats_t **pp_stats) = 0;
|
||||||
|
virtual void resetStats() = 0;
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
/* implementation packet processing interface */
|
/* implementation packet processing interface */
|
||||||
@ -155,6 +158,10 @@ class TrcPktProcBase : public TrcPktProcI
|
|||||||
//!< Get the configuration for the decoder.
|
//!< Get the configuration for the decoder.
|
||||||
virtual const Pc *getProtocolConfig() const { return m_config; };
|
virtual const Pc *getProtocolConfig() const { return m_config; };
|
||||||
|
|
||||||
|
/* stats block access - derived class must init stats for the block to be returned. */
|
||||||
|
virtual ocsd_err_t getStatsBlock(ocsd_decode_stats_t **pp_stats);
|
||||||
|
virtual void resetStats(); /* reset the counts - operates separately from decoder reset. */
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
/* data output functions */
|
/* data output functions */
|
||||||
@ -183,6 +190,14 @@ class TrcPktProcBase : public TrcPktProcI
|
|||||||
|
|
||||||
const bool checkInit(); // return true if init (configured and at least one output sink attached), false otherwise.
|
const bool checkInit(); // return true if init (configured and at least one output sink attached), false otherwise.
|
||||||
|
|
||||||
|
/* stats block updates - called by derived protocol specific decoder */
|
||||||
|
void statsAddTotalCount(const uint64_t count) { m_stats.channel_total += count; };
|
||||||
|
void statsAddUnsyncCount(const uint64_t count) { m_stats.channel_unsynced += count; };
|
||||||
|
void statsAddBadSeqCount(const uint32_t count) { m_stats.bad_sequence_errs += count; };
|
||||||
|
void statsAddBadHdrCount(const uint32_t count) { m_stats.bad_header_errs += count; };
|
||||||
|
void statsInit() { m_stats_init = true; }; /* mark stats as in use */
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/* decode control */
|
/* decode control */
|
||||||
ocsd_datapath_resp_t Reset(const ocsd_trc_index_t index);
|
ocsd_datapath_resp_t Reset(const ocsd_trc_index_t index);
|
||||||
@ -195,20 +210,29 @@ class TrcPktProcBase : public TrcPktProcI
|
|||||||
componentAttachPt<ITrcPktIndexer<Pt>> m_pkt_indexer_i;
|
componentAttachPt<ITrcPktIndexer<Pt>> m_pkt_indexer_i;
|
||||||
|
|
||||||
bool m_b_is_init;
|
bool m_b_is_init;
|
||||||
|
|
||||||
|
/* decode statistics block */
|
||||||
|
ocsd_decode_stats_t m_stats;
|
||||||
|
bool m_stats_init; /*< true if the specific decoder is using the stats */
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
template<class P,class Pt, class Pc> TrcPktProcBase<P, Pt, Pc>::TrcPktProcBase(const char *component_name) :
|
template<class P,class Pt, class Pc> TrcPktProcBase<P, Pt, Pc>::TrcPktProcBase(const char *component_name) :
|
||||||
TrcPktProcI(component_name),
|
TrcPktProcI(component_name),
|
||||||
m_config(0),
|
m_config(0),
|
||||||
m_b_is_init(false)
|
m_b_is_init(false),
|
||||||
|
m_stats_init(false)
|
||||||
{
|
{
|
||||||
|
resetStats();
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class P,class Pt, class Pc> TrcPktProcBase<P, Pt, Pc>::TrcPktProcBase(const char *component_name, int instIDNum) :
|
template<class P,class Pt, class Pc> TrcPktProcBase<P, Pt, Pc>::TrcPktProcBase(const char *component_name, int instIDNum) :
|
||||||
TrcPktProcI(component_name, instIDNum),
|
TrcPktProcI(component_name, instIDNum),
|
||||||
m_config(0),
|
m_config(0),
|
||||||
m_b_is_init(false)
|
m_b_is_init(false),
|
||||||
|
m_stats_init(false)
|
||||||
{
|
{
|
||||||
|
resetStats();
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class P,class Pt, class Pc> TrcPktProcBase<P, Pt, Pc>::~TrcPktProcBase()
|
template<class P,class Pt, class Pc> TrcPktProcBase<P, Pt, Pc>::~TrcPktProcBase()
|
||||||
@ -405,6 +429,26 @@ template<class P,class Pt, class Pc> const bool TrcPktProcBase<P, Pt, Pc>::check
|
|||||||
return m_b_is_init;
|
return m_b_is_init;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<class P,class Pt, class Pc> ocsd_err_t TrcPktProcBase<P, Pt, Pc>::getStatsBlock(ocsd_decode_stats_t **pp_stats)
|
||||||
|
{
|
||||||
|
|
||||||
|
*pp_stats = &m_stats;
|
||||||
|
return m_stats_init ? OCSD_OK : OCSD_ERR_NOT_INIT;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class P,class Pt, class Pc> void TrcPktProcBase<P, Pt, Pc>::resetStats()
|
||||||
|
{
|
||||||
|
m_stats.version = OCSD_VER_NUM;
|
||||||
|
m_stats.revision = OCSD_STATS_REVISION;
|
||||||
|
m_stats.channel_total = 0;
|
||||||
|
m_stats.channel_unsynced = 0;
|
||||||
|
m_stats.bad_header_errs = 0;
|
||||||
|
m_stats.bad_sequence_errs = 0;
|
||||||
|
m_stats.demux.frame_bytes = 0;
|
||||||
|
m_stats.demux.no_id_bytes = 0;
|
||||||
|
m_stats.demux.valid_id_bytes = 0;
|
||||||
|
}
|
||||||
|
|
||||||
/** @}*/
|
/** @}*/
|
||||||
|
|
||||||
#endif // ARM_TRC_PKT_PROC_BASE_H_INCLUDED
|
#endif // ARM_TRC_PKT_PROC_BASE_H_INCLUDED
|
||||||
|
@ -44,7 +44,7 @@
|
|||||||
|
|
||||||
/* supplementary decode information */
|
/* supplementary decode information */
|
||||||
struct decode_info {
|
struct decode_info {
|
||||||
uint16_t arch_version;
|
ocsd_arch_version_t arch_version;
|
||||||
ocsd_instr_subtype instr_sub_type;
|
ocsd_instr_subtype instr_sub_type;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -121,7 +121,8 @@ arm_barrier_t inst_A64_barrier(uint32_t inst);
|
|||||||
|
|
||||||
int inst_ARM_wfiwfe(uint32_t inst);
|
int inst_ARM_wfiwfe(uint32_t inst);
|
||||||
int inst_Thumb_wfiwfe(uint32_t inst);
|
int inst_Thumb_wfiwfe(uint32_t inst);
|
||||||
int inst_A64_wfiwfe(uint32_t inst);
|
int inst_A64_wfiwfe(uint32_t inst, struct decode_info *info);
|
||||||
|
int inst_A64_Tstart(uint32_t inst);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Test whether an instruction is definitely undefined, e.g. because
|
Test whether an instruction is definitely undefined, e.g. because
|
||||||
|
@ -47,7 +47,7 @@
|
|||||||
*
|
*
|
||||||
* This interface provides a monitor point for the packet processor block.
|
* This interface provides a monitor point for the packet processor block.
|
||||||
* The templated interface is called with a complete packet of the given
|
* 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
|
* type, plus the raw packet bytes. Use for tools which need to display complete
|
||||||
* packets or require additional processing on raw packet data.
|
* packets or require additional processing on raw packet data.
|
||||||
*
|
*
|
||||||
* This interface is not part of the data decode path and cannot provide feedback.
|
* This interface is not part of the data decode path and cannot provide feedback.
|
||||||
|
@ -83,6 +83,14 @@ class ITargetMemAccess
|
|||||||
const ocsd_mem_space_acc_t mem_space,
|
const ocsd_mem_space_acc_t mem_space,
|
||||||
uint32_t *num_bytes,
|
uint32_t *num_bytes,
|
||||||
uint8_t *p_buffer) = 0;
|
uint8_t *p_buffer) = 0;
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* Invalidate any caching that the memory accessor functions are using.
|
||||||
|
* Generally called when a memory context changes in the trace.
|
||||||
|
*
|
||||||
|
* @param cs_trace_id : protocol source trace ID.
|
||||||
|
*/
|
||||||
|
virtual void InvalidateMemAccCache(const uint8_t cs_trace_id) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -61,6 +61,8 @@ class TrcMemAccMapper : public ITargetMemAccess
|
|||||||
uint32_t *num_bytes,
|
uint32_t *num_bytes,
|
||||||
uint8_t *p_buffer);
|
uint8_t *p_buffer);
|
||||||
|
|
||||||
|
virtual void InvalidateMemAccCache(const uint8_t cs_trace_id);
|
||||||
|
|
||||||
// mapper memory area configuration interface
|
// mapper memory area configuration interface
|
||||||
|
|
||||||
// add an accessor to this map
|
// add an accessor to this map
|
||||||
|
@ -63,6 +63,7 @@
|
|||||||
#include "opencsd/etmv4/etmv4_decoder.h"
|
#include "opencsd/etmv4/etmv4_decoder.h"
|
||||||
#include "opencsd/ptm/ptm_decoder.h"
|
#include "opencsd/ptm/ptm_decoder.h"
|
||||||
#include "opencsd/stm/stm_decoder.h"
|
#include "opencsd/stm/stm_decoder.h"
|
||||||
|
#include "opencsd/ete/ete_decoder.h"
|
||||||
|
|
||||||
/** C++ library object types */
|
/** C++ library object types */
|
||||||
#include "common/ocsd_error_logger.h"
|
#include "common/ocsd_error_logger.h"
|
||||||
|
@ -46,6 +46,7 @@
|
|||||||
#include "opencsd/etmv4/trc_pkt_types_etmv4.h"
|
#include "opencsd/etmv4/trc_pkt_types_etmv4.h"
|
||||||
#include "opencsd/ptm/trc_pkt_types_ptm.h"
|
#include "opencsd/ptm/trc_pkt_types_ptm.h"
|
||||||
#include "opencsd/stm/trc_pkt_types_stm.h"
|
#include "opencsd/stm/trc_pkt_types_stm.h"
|
||||||
|
#include "opencsd/ete/trc_pkt_types_ete.h"
|
||||||
|
|
||||||
/** @ingroup lib_c_api
|
/** @ingroup lib_c_api
|
||||||
@{*/
|
@{*/
|
||||||
|
@ -210,9 +210,35 @@ OCSD_C_API ocsd_err_t ocsd_dt_attach_packet_callback( const dcd_tree_handle_t h
|
|||||||
const void *p_context);
|
const void *p_context);
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* Get the stats block for the channel indicated.
|
||||||
|
* Caller must check p_stats_block->version to esure that the block
|
||||||
|
* is filled in a compatible manner.
|
||||||
|
*
|
||||||
|
* @param handle : Handle to decode tree.
|
||||||
|
* @param CSID : Configured CoreSight trace ID for the decoder.
|
||||||
|
* @param p_stats_block: block pointer to set to reference the stats block.
|
||||||
|
*
|
||||||
|
* @return ocsd_err_t : Library error code - OCSD_OK if valid block pointer returned,
|
||||||
|
* OCSD_ERR_NOTINIT if decoder does not support stats counting.
|
||||||
|
*/
|
||||||
|
OCSD_C_API ocsd_err_t ocsd_dt_get_decode_stats( const dcd_tree_handle_t handle,
|
||||||
|
const unsigned char CSID,
|
||||||
|
ocsd_decode_stats_t **p_stats_block);
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* Reset the stats block for the chosens decode channel.
|
||||||
|
* stats block is reset independently of the decoder reset to allow counts across
|
||||||
|
* multiple decode runs.
|
||||||
|
*
|
||||||
|
* @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_reset_decode_stats( const dcd_tree_handle_t handle,
|
||||||
|
const unsigned char CSID);
|
||||||
|
|
||||||
/** @}*/
|
/** @}*/
|
||||||
/*---------------------- Memory Access for traced opcodes ----------------------------------------------------------------------------------*/
|
/*---------------------- Memory Access for traced opcodes ----------------------------------------------------------------------------------*/
|
||||||
@ -373,6 +399,28 @@ OCSD_C_API ocsd_err_t ocsd_def_errlog_set_strprint_cb(const dcd_tree_handle_t ha
|
|||||||
*/
|
*/
|
||||||
OCSD_C_API void ocsd_def_errlog_msgout(const char *msg);
|
OCSD_C_API void ocsd_def_errlog_msgout(const char *msg);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* Convert an error code into a string.
|
||||||
|
*
|
||||||
|
* @param err : error code.
|
||||||
|
* @param buffer : buffer for return string
|
||||||
|
* @param buffer_size : length of buffer.
|
||||||
|
*/
|
||||||
|
OCSD_C_API void ocsd_err_str(const ocsd_err_t err, char *buffer, const int buffer_size);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* returns the last error logged by the system, with the related trace byte index, trace channel id,
|
||||||
|
* and any error message related string.
|
||||||
|
* If index or channel ID are not valid these will return OCSD_BAD_TRC_INDEX and OCSD_BAD_CS_SRC_ID.
|
||||||
|
*
|
||||||
|
* return value is the error code of the last logged error, OCSD_OK for no error available.
|
||||||
|
*
|
||||||
|
* @param index : returns trace byte index relating to error, or OCSD_BAD_TRC_INDEX
|
||||||
|
* @param chan_id : returns trace channel ID relating to error, or OCSD_BAD_CS_SRC_ID
|
||||||
|
* @param message : buffer to copy the last error message.
|
||||||
|
* @param message_len: length of message buffer.
|
||||||
|
*/
|
||||||
|
OCSD_C_API ocsd_err_t ocsd_get_last_err(ocsd_trc_index_t *index, uint8_t *chan_id, char *message, const int message_len);
|
||||||
|
|
||||||
/** @}*/
|
/** @}*/
|
||||||
|
|
||||||
|
47
decoder/include/opencsd/ete/ete_decoder.h
Normal file
47
decoder/include/opencsd/ete/ete_decoder.h
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
/*
|
||||||
|
* \file ete_decoder.h
|
||||||
|
* \brief OpenCSD : Top level header file for ETE decoder.
|
||||||
|
*
|
||||||
|
* \copyright Copyright (c) 2019, 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_ETE_DECODER_H_INCLUDED
|
||||||
|
#define ARM_ETE_DECODER_H_INCLUDED
|
||||||
|
|
||||||
|
// ETE actually uses extended ETMv4 packet processor and decode
|
||||||
|
// ETE specifics limited to configuration
|
||||||
|
//
|
||||||
|
#include "trc_cmp_cfg_ete.h"
|
||||||
|
#include "trc_pkt_types_ete.h"
|
||||||
|
|
||||||
|
#endif // ARM_ETE_DECODER_H_INCLUDED
|
||||||
|
|
||||||
|
/* End of File ete_decoder.h */
|
||||||
|
|
81
decoder/include/opencsd/ete/trc_cmp_cfg_ete.h
Normal file
81
decoder/include/opencsd/ete/trc_cmp_cfg_ete.h
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
/*
|
||||||
|
* \file trc_cmp_cfg_ete.h
|
||||||
|
* \brief OpenCSD : ETE configuration
|
||||||
|
*
|
||||||
|
* \copyright Copyright (c) 2019, 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_ETE_H_INCLUDED
|
||||||
|
#define ARM_TRC_CMP_CFG_ETE_H_INCLUDED
|
||||||
|
|
||||||
|
#include "trc_pkt_types_ete.h"
|
||||||
|
#include "opencsd/etmv4/trc_cmp_cfg_etmv4.h"
|
||||||
|
|
||||||
|
/** @addtogroup ocsd_protocol_cfg
|
||||||
|
@{*/
|
||||||
|
|
||||||
|
/** @name ETE configuration
|
||||||
|
@{*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @class ETEConfig
|
||||||
|
* @brief Interpreter class for ETE config structure
|
||||||
|
*
|
||||||
|
* ETE trace and config are a superset of ETMv4 trace and config - hence
|
||||||
|
* use the EtmV4Config class as a base.
|
||||||
|
*/
|
||||||
|
class ETEConfig : public EtmV4Config
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ETEConfig();
|
||||||
|
ETEConfig(const ocsd_ete_cfg *cfg_regs);
|
||||||
|
~ETEConfig();
|
||||||
|
|
||||||
|
//! copy assignment operator for base structure into class.
|
||||||
|
ETEConfig & operator=(const ocsd_ete_cfg *p_cfg);
|
||||||
|
|
||||||
|
//! cast operator returning struct const reference
|
||||||
|
operator const ocsd_ete_cfg &() const { return m_ete_cfg; };
|
||||||
|
//! cast operator returning struct const pointer
|
||||||
|
operator const ocsd_ete_cfg *() const { return &m_ete_cfg; };
|
||||||
|
|
||||||
|
private:
|
||||||
|
void copyV4(); // copy relevent config to underlying structure.
|
||||||
|
|
||||||
|
ocsd_ete_cfg m_ete_cfg;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/** @}*/
|
||||||
|
/** @}*/
|
||||||
|
|
||||||
|
#endif // ARM_TRC_CMP_CFG_ETE_H_INCLUDED
|
||||||
|
|
||||||
|
/* End of File trc_cmp_cfg_ete.h */
|
58
decoder/include/opencsd/ete/trc_dcd_mngr_ete.h
Normal file
58
decoder/include/opencsd/ete/trc_dcd_mngr_ete.h
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
/*
|
||||||
|
* \file trc_dcd_mngr_ete.h
|
||||||
|
* \brief OpenCSD : ETE decoder creation.
|
||||||
|
*
|
||||||
|
* \copyright Copyright (c) 2019, 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_ETE_H_INCLUDED
|
||||||
|
#define ARM_TRC_DCD_MNGR_ETE_H_INCLUDED
|
||||||
|
|
||||||
|
#include "common/ocsd_dcd_mngr.h"
|
||||||
|
#include "trc_cmp_cfg_ete.h"
|
||||||
|
#include "opencsd/etmv4/trc_pkt_decode_etmv4i.h"
|
||||||
|
#include "opencsd/etmv4/trc_pkt_proc_etmv4.h"
|
||||||
|
|
||||||
|
class DecoderMngrETE : public DecodeMngrFullDcdExCfg< EtmV4ITrcPacket,
|
||||||
|
ocsd_etmv4_i_pkt_type,
|
||||||
|
EtmV4Config,
|
||||||
|
ETEConfig,
|
||||||
|
ocsd_ete_cfg,
|
||||||
|
TrcPktProcEtmV4I,
|
||||||
|
TrcPktDecodeEtmV4I>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
DecoderMngrETE(const std::string &name) : DecodeMngrFullDcdExCfg(name, OCSD_PROTOCOL_ETE) {};
|
||||||
|
virtual ~DecoderMngrETE() {};
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // ARM_TRC_DCD_MNGR_ETE_H_INCLUDED
|
||||||
|
|
||||||
|
/* End of File trc_dcd_mngr_ete.h */
|
66
decoder/include/opencsd/ete/trc_pkt_types_ete.h
Normal file
66
decoder/include/opencsd/ete/trc_pkt_types_ete.h
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
/*
|
||||||
|
* \file trc_pkt_types_ete.h
|
||||||
|
* \brief OpenCSD : ETE types
|
||||||
|
*
|
||||||
|
* \copyright Copyright (c) 2019, 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_ETE_H_INCLUDED
|
||||||
|
#define ARM_TRC_PKT_TYPES_ETE_H_INCLUDED
|
||||||
|
|
||||||
|
#include "opencsd/trc_pkt_types.h"
|
||||||
|
#include "opencsd/etmv4/trc_pkt_types_etmv4.h"
|
||||||
|
/** @addtogroup trc_pkts
|
||||||
|
@{*/
|
||||||
|
|
||||||
|
/** @name ETE config Types
|
||||||
|
@{*/
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct _ocsd_ete_cfg
|
||||||
|
{
|
||||||
|
uint32_t reg_idr0; /**< ID0 register */
|
||||||
|
uint32_t reg_idr1; /**< ID1 register */
|
||||||
|
uint32_t reg_idr2; /**< ID2 register */
|
||||||
|
uint32_t reg_idr8; /**< ID8 - maxspec */
|
||||||
|
uint32_t reg_devarch; /**< DevArch register */
|
||||||
|
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_ete_cfg;
|
||||||
|
|
||||||
|
|
||||||
|
/** @}*/
|
||||||
|
/** @}*/
|
||||||
|
|
||||||
|
#endif // ARM_TRC_PKT_TYPES_ETE_H_INCLUDED
|
||||||
|
|
||||||
|
/* End of File trc_pkt_types_ete.h */
|
@ -81,6 +81,7 @@ class EtmV4Config : public CSConfig // public ocsd_etmv4_cfg
|
|||||||
const bool hasCycleCountI() const;
|
const bool hasCycleCountI() const;
|
||||||
const bool hasRetStack() const;
|
const bool hasRetStack() const;
|
||||||
const uint8_t numEvents() const;
|
const uint8_t numEvents() const;
|
||||||
|
const bool eteHasTSMarker() const;
|
||||||
|
|
||||||
typedef enum _condType {
|
typedef enum _condType {
|
||||||
COND_PASS_FAIL,
|
COND_PASS_FAIL,
|
||||||
@ -104,6 +105,7 @@ class EtmV4Config : public CSConfig // public ocsd_etmv4_cfg
|
|||||||
const uint32_t TimeStampSize() const;
|
const uint32_t TimeStampSize() const;
|
||||||
|
|
||||||
const bool commitOpt1() const;
|
const bool commitOpt1() const;
|
||||||
|
const bool commTransP0() const;
|
||||||
|
|
||||||
/* idr 1 */
|
/* idr 1 */
|
||||||
const uint8_t MajVersion() const;
|
const uint8_t MajVersion() const;
|
||||||
@ -151,6 +153,7 @@ class EtmV4Config : public CSConfig // public ocsd_etmv4_cfg
|
|||||||
const bool enabledCCI() const;
|
const bool enabledCCI() const;
|
||||||
const bool enabledCID() const;
|
const bool enabledCID() const;
|
||||||
const bool enabledVMID() const;
|
const bool enabledVMID() const;
|
||||||
|
const bool enabledVMIDOpt() const;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
COND_TR_DIS,
|
COND_TR_DIS,
|
||||||
@ -253,6 +256,11 @@ inline const bool EtmV4Config::hasTrcExcpData() const
|
|||||||
return (bool)((m_cfg.reg_idr0 & 0x20000) == 0x20000);
|
return (bool)((m_cfg.reg_idr0 & 0x20000) == 0x20000);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline const bool EtmV4Config::eteHasTSMarker() const
|
||||||
|
{
|
||||||
|
return (FullVersion() >= 0x51) && ((m_cfg.reg_idr0 & 0x800000) == 0x800000);
|
||||||
|
}
|
||||||
|
|
||||||
inline const uint32_t EtmV4Config::TimeStampSize() const
|
inline const uint32_t EtmV4Config::TimeStampSize() const
|
||||||
{
|
{
|
||||||
uint32_t tsSizeF = (m_cfg.reg_idr0 >> 24) & 0x1F;
|
uint32_t tsSizeF = (m_cfg.reg_idr0 >> 24) & 0x1F;
|
||||||
@ -268,6 +276,11 @@ inline const bool EtmV4Config::commitOpt1() const
|
|||||||
return (bool)((m_cfg.reg_idr0 & 0x20000000) == 0x20000000) && hasCycleCountI();
|
return (bool)((m_cfg.reg_idr0 & 0x20000000) == 0x20000000) && hasCycleCountI();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline const bool EtmV4Config::commTransP0() const
|
||||||
|
{
|
||||||
|
return (bool)((m_cfg.reg_idr0 & 0x40000000) == 0x0);
|
||||||
|
}
|
||||||
|
|
||||||
/* idr 1 */
|
/* idr 1 */
|
||||||
inline const uint8_t EtmV4Config::MajVersion() const
|
inline const uint8_t EtmV4Config::MajVersion() const
|
||||||
{
|
{
|
||||||
@ -424,6 +437,20 @@ inline const bool EtmV4Config::enabledVMID() const
|
|||||||
return ((m_cfg.reg_configr & (0x1 << 7)) != 0);
|
return ((m_cfg.reg_configr & (0x1 << 7)) != 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline const bool EtmV4Config::enabledVMIDOpt() const
|
||||||
|
{
|
||||||
|
bool vmidOptVal = ((m_cfg.reg_configr & (0x1 << 15)) != 0);
|
||||||
|
/* TRIDR2.VMIDOPT[30:29] determine value used */
|
||||||
|
if (!vmidOpt()) { /* [29] = 1'b0 */
|
||||||
|
vmidOptVal = false; /* res0 */
|
||||||
|
if (FullVersion() >= 0x45) {
|
||||||
|
/* umless version > 4.5 in which case [30] determines res val */
|
||||||
|
vmidOptVal = ((m_cfg.reg_idr2 & (0x1 << 30)) != 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return vmidOptVal;
|
||||||
|
}
|
||||||
|
|
||||||
inline const EtmV4Config::CondITrace_t EtmV4Config::enabledCondITrace()
|
inline const EtmV4Config::CondITrace_t EtmV4Config::enabledCondITrace()
|
||||||
{
|
{
|
||||||
if(!m_condTraceCalc)
|
if(!m_condTraceCalc)
|
||||||
|
@ -34,6 +34,7 @@
|
|||||||
#define ARM_TRC_ETMV4_STACK_ELEM_H_INCLUDED
|
#define ARM_TRC_ETMV4_STACK_ELEM_H_INCLUDED
|
||||||
|
|
||||||
#include "opencsd/etmv4/trc_pkt_types_etmv4.h"
|
#include "opencsd/etmv4/trc_pkt_types_etmv4.h"
|
||||||
|
#include "opencsd/trc_gen_elem_types.h"
|
||||||
|
|
||||||
#include <deque>
|
#include <deque>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
@ -56,9 +57,16 @@ typedef enum _p0_elem_t
|
|||||||
P0_TS,
|
P0_TS,
|
||||||
P0_CC,
|
P0_CC,
|
||||||
P0_TS_CC,
|
P0_TS_CC,
|
||||||
|
P0_MARKER,
|
||||||
P0_Q,
|
P0_Q,
|
||||||
P0_OVERFLOW,
|
P0_OVERFLOW,
|
||||||
P0_FUNC_RET,
|
P0_FUNC_RET,
|
||||||
|
P0_SRC_ADDR,
|
||||||
|
P0_TRANS_TRACE_INIT,
|
||||||
|
P0_TRANS_START,
|
||||||
|
P0_TRANS_COMMIT,
|
||||||
|
P0_TRANS_FAIL,
|
||||||
|
P0_ITE,
|
||||||
} p0_elem_t;
|
} p0_elem_t;
|
||||||
|
|
||||||
|
|
||||||
@ -101,6 +109,7 @@ class TrcStackElemAddr : public TrcStackElem
|
|||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
TrcStackElemAddr(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index);
|
TrcStackElemAddr(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index);
|
||||||
|
TrcStackElemAddr(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index, const bool src_addr);
|
||||||
virtual ~TrcStackElemAddr() {};
|
virtual ~TrcStackElemAddr() {};
|
||||||
|
|
||||||
friend class EtmV4P0Stack;
|
friend class EtmV4P0Stack;
|
||||||
@ -120,6 +129,14 @@ inline TrcStackElemAddr::TrcStackElemAddr(const ocsd_etmv4_i_pkt_type root_pkt,
|
|||||||
m_addr_val.isa = 0;
|
m_addr_val.isa = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline TrcStackElemAddr::TrcStackElemAddr(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index, const bool src_addr) :
|
||||||
|
TrcStackElem(src_addr ? P0_SRC_ADDR : P0_ADDR, false, root_pkt, root_index)
|
||||||
|
{
|
||||||
|
m_addr_val.val = 0;
|
||||||
|
m_addr_val.isa = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/************************************************************/
|
/************************************************************/
|
||||||
/** Q element */
|
/** Q element */
|
||||||
class TrcStackQElem : public TrcStackElem
|
class TrcStackQElem : public TrcStackElem
|
||||||
@ -294,6 +311,55 @@ inline TrcStackElemParam::TrcStackElemParam(const p0_elem_t p0_type, const bool
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/************************************************************/
|
||||||
|
/** Marker element */
|
||||||
|
|
||||||
|
class TrcStackElemMarker : public TrcStackElem
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
TrcStackElemMarker(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index);
|
||||||
|
virtual ~TrcStackElemMarker() {};
|
||||||
|
|
||||||
|
friend class EtmV4P0Stack;
|
||||||
|
|
||||||
|
public:
|
||||||
|
void setMarker(const trace_marker_payload_t &marker) { m_marker = marker; };
|
||||||
|
const trace_marker_payload_t &getMarker() const { return m_marker; };
|
||||||
|
|
||||||
|
private:
|
||||||
|
trace_marker_payload_t m_marker;
|
||||||
|
};
|
||||||
|
|
||||||
|
inline TrcStackElemMarker::TrcStackElemMarker(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index) :
|
||||||
|
TrcStackElem(P0_MARKER, false, root_pkt, root_index)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/************************************************************/
|
||||||
|
/* Instrumentation element
|
||||||
|
*/
|
||||||
|
|
||||||
|
class TrcStackElemITE : public TrcStackElem
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
TrcStackElemITE(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index);
|
||||||
|
virtual ~TrcStackElemITE() {};
|
||||||
|
|
||||||
|
friend class EtmV4P0Stack;
|
||||||
|
|
||||||
|
public:
|
||||||
|
void setITE(const trace_sw_ite_t &ite) { m_ite = ite; };
|
||||||
|
const trace_sw_ite_t &getITE() { return m_ite; };
|
||||||
|
|
||||||
|
private:
|
||||||
|
trace_sw_ite_t m_ite;
|
||||||
|
};
|
||||||
|
|
||||||
|
inline TrcStackElemITE::TrcStackElemITE(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index) :
|
||||||
|
TrcStackElem(P0_ITE, false, root_pkt, root_index)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
/************************************************************/
|
/************************************************************/
|
||||||
/* P0 element stack that allows push of elements, and deletion of elements when done.
|
/* P0 element stack that allows push of elements, and deletion of elements when done.
|
||||||
*/
|
*/
|
||||||
@ -329,6 +395,10 @@ class EtmV4P0Stack
|
|||||||
TrcStackElemCtxt *createContextElem(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index, const etmv4_context_t &context, const uint8_t IS, const bool back = false);
|
TrcStackElemCtxt *createContextElem(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index, const etmv4_context_t &context, const uint8_t IS, const bool back = false);
|
||||||
TrcStackElemAddr *createAddrElem(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index, const etmv4_addr_val_t &addr_val);
|
TrcStackElemAddr *createAddrElem(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index, const etmv4_addr_val_t &addr_val);
|
||||||
TrcStackQElem *createQElem(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index, const int count);
|
TrcStackQElem *createQElem(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index, const int count);
|
||||||
|
TrcStackElemMarker *createMarkerElem(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index, const trace_marker_payload_t &marker);
|
||||||
|
TrcStackElemAddr *createSrcAddrElem(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index, const etmv4_addr_val_t &addr_val);
|
||||||
|
TrcStackElemITE *createITEElem(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index, const trace_sw_ite_t &ite);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::deque<TrcStackElem *> m_P0_stack; //!< P0 decode element stack
|
std::deque<TrcStackElem *> m_P0_stack; //!< P0 decode element stack
|
||||||
std::vector<TrcStackElem *> m_popped_elem; //!< save list of popped but not deleted elements.
|
std::vector<TrcStackElem *> m_popped_elem; //!< save list of popped but not deleted elements.
|
||||||
|
@ -88,11 +88,29 @@ class TrcPktDecodeEtmV4I : public TrcPktDecodeBase<EtmV4ITrcPacket, EtmV4Config>
|
|||||||
// process Q element
|
// process Q element
|
||||||
ocsd_err_t processQElement();
|
ocsd_err_t processQElement();
|
||||||
|
|
||||||
|
// process a source address element
|
||||||
|
ocsd_err_t processSourceAddress();
|
||||||
|
|
||||||
// process an element that cannot be cancelled / discarded
|
// process an element that cannot be cancelled / discarded
|
||||||
ocsd_err_t processTS_CC_EventElem(TrcStackElem *pElem);
|
ocsd_err_t processTS_CC_EventElem(TrcStackElem *pElem);
|
||||||
|
|
||||||
|
// process marker elements
|
||||||
|
ocsd_err_t processMarkerElem(TrcStackElem *pElem);
|
||||||
|
|
||||||
|
// process a transaction element
|
||||||
|
ocsd_err_t processTransElem(TrcStackElem *pElem);
|
||||||
|
|
||||||
|
// process an Instrumentation element
|
||||||
|
ocsd_err_t processITEElem(TrcStackElem *pElem);
|
||||||
|
|
||||||
// process a bad packet
|
// process a bad packet
|
||||||
ocsd_err_t handleBadPacket(const char *reason);
|
ocsd_err_t handleBadPacket(const char *reason, ocsd_trc_index_t index = OCSD_BAD_TRC_INDEX);
|
||||||
|
|
||||||
|
// sequencing error on packet processing - optionally continue
|
||||||
|
ocsd_err_t handlePacketSeqErr(ocsd_err_t err, ocsd_trc_index_t index, const char *reason);
|
||||||
|
|
||||||
|
// common packet error routine
|
||||||
|
ocsd_err_t handlePacketErr(ocsd_err_t err, ocsd_err_severity_t sev, ocsd_trc_index_t index, const char *reason);
|
||||||
|
|
||||||
ocsd_err_t addElemCC(TrcStackElemParam *pParamElem);
|
ocsd_err_t addElemCC(TrcStackElemParam *pParamElem);
|
||||||
ocsd_err_t addElemTS(TrcStackElemParam *pParamElem, bool withCC);
|
ocsd_err_t addElemTS(TrcStackElemParam *pParamElem, bool withCC);
|
||||||
@ -127,6 +145,13 @@ class TrcPktDecodeEtmV4I : public TrcPktDecodeBase<EtmV4ITrcPacket, EtmV4Config>
|
|||||||
ocsd_err_t returnStackPop(); // pop return stack and update instruction address.
|
ocsd_err_t returnStackPop(); // pop return stack and update instruction address.
|
||||||
|
|
||||||
void setElemTraceRange(OcsdTraceElement &elemIn, const instr_range_t &addr_range, const bool executed, ocsd_trc_index_t index);
|
void setElemTraceRange(OcsdTraceElement &elemIn, const instr_range_t &addr_range, const bool executed, ocsd_trc_index_t index);
|
||||||
|
void setElemTraceRangeInstr(OcsdTraceElement &elemIn, const instr_range_t &addr_range,
|
||||||
|
const bool executed, ocsd_trc_index_t index, ocsd_instr_info &instr);
|
||||||
|
|
||||||
|
// true if we are ETE configured.
|
||||||
|
inline bool isETEConfig() {
|
||||||
|
return (m_config->MajVersion() >= ETE_ARCH_VERSION);
|
||||||
|
}
|
||||||
|
|
||||||
ocsd_mem_space_acc_t getCurrMemSpace();
|
ocsd_mem_space_acc_t getCurrMemSpace();
|
||||||
|
|
||||||
@ -134,6 +159,7 @@ class TrcPktDecodeEtmV4I : public TrcPktDecodeBase<EtmV4ITrcPacket, EtmV4Config>
|
|||||||
|
|
||||||
// timestamping
|
// timestamping
|
||||||
uint64_t m_timestamp; // last broadcast global Timestamp.
|
uint64_t m_timestamp; // last broadcast global Timestamp.
|
||||||
|
bool m_ete_first_ts_marker;
|
||||||
|
|
||||||
// state and context
|
// state and context
|
||||||
uint32_t m_context_id; // most recent context ID
|
uint32_t m_context_id; // most recent context ID
|
||||||
|
@ -145,7 +145,7 @@ class EtmV4ITrcPacket : public TrcPacketBase, public ocsd_etmv4_i_pkt, public t
|
|||||||
void setCondRF3(const uint16_t tokens);
|
void setCondRF3(const uint16_t tokens);
|
||||||
void setCondRF4(const uint8_t token);
|
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 setContextInfo(const bool update, const uint8_t EL = 0, const uint8_t NS = 0, const uint8_t SF = 0, const uint8_t NSE = 0);
|
||||||
void setContextVMID(const uint32_t VMID);
|
void setContextVMID(const uint32_t VMID);
|
||||||
void setContextCID(const uint32_t CID);
|
void setContextCID(const uint32_t CID);
|
||||||
|
|
||||||
@ -160,6 +160,7 @@ class EtmV4ITrcPacket : public TrcPacketBase, public ocsd_etmv4_i_pkt, public t
|
|||||||
void setEvent(const uint8_t event_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);
|
void setQType(const bool has_count, const uint32_t count, const bool has_addr, const bool addr_match, const uint8_t type);
|
||||||
|
void setITE(const uint8_t el, const uint64_t value);
|
||||||
|
|
||||||
// packet status interface - get packet info.
|
// packet status interface - get packet info.
|
||||||
const ocsd_etmv4_i_pkt_type getType() const { return type; };
|
const ocsd_etmv4_i_pkt_type getType() const { return type; };
|
||||||
@ -200,6 +201,10 @@ class EtmV4ITrcPacket : public TrcPacketBase, public ocsd_etmv4_i_pkt, public t
|
|||||||
const int getCommitElem() const { return commit_elements; };
|
const int getCommitElem() const { return commit_elements; };
|
||||||
const int getCancelElem() const { return cancel_elements; };
|
const int getCancelElem() const { return cancel_elements; };
|
||||||
|
|
||||||
|
// ITE
|
||||||
|
const uint8_t getITE_EL() const { return ite_pkt.el; };
|
||||||
|
const uint64_t getITE_value() const { return ite_pkt.value; };
|
||||||
|
|
||||||
// packet type
|
// packet type
|
||||||
const bool isBadPacket() const;
|
const bool isBadPacket() const;
|
||||||
|
|
||||||
@ -207,6 +212,8 @@ class EtmV4ITrcPacket : public TrcPacketBase, public ocsd_etmv4_i_pkt, public t
|
|||||||
virtual void toString(std::string &str) const;
|
virtual void toString(std::string &str) const;
|
||||||
virtual void toStringFmt(const uint32_t fmtFlags, std::string &str) const;
|
virtual void toStringFmt(const uint32_t fmtFlags, std::string &str) const;
|
||||||
|
|
||||||
|
void setProtocolVersion(const uint8_t version) { protocol_version = version; };
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const char *packetTypeName(const ocsd_etmv4_i_pkt_type type, const char **pDesc) const;
|
const char *packetTypeName(const ocsd_etmv4_i_pkt_type type, const char **pDesc) const;
|
||||||
void contextStr(std::string &ctxtStr) const;
|
void contextStr(std::string &ctxtStr) const;
|
||||||
@ -217,6 +224,8 @@ class EtmV4ITrcPacket : public TrcPacketBase, public ocsd_etmv4_i_pkt, public t
|
|||||||
void push_vaddr();
|
void push_vaddr();
|
||||||
void pop_vaddr_idx(const uint8_t idx);
|
void pop_vaddr_idx(const uint8_t idx);
|
||||||
|
|
||||||
|
const bool isETE() const { return (protocol_version & 0xF0) == 0x50; };
|
||||||
|
|
||||||
Etmv4PktAddrStack m_addr_stack;
|
Etmv4PktAddrStack m_addr_stack;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -412,7 +421,7 @@ inline void EtmV4ITrcPacket::setCondRF4(const uint8_t token)
|
|||||||
cond_result.f2f4_token = token;
|
cond_result.f2f4_token = token;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void EtmV4ITrcPacket::setContextInfo(const bool update, const uint8_t EL, const uint8_t NS, const uint8_t SF)
|
inline void EtmV4ITrcPacket::setContextInfo(const bool update, const uint8_t EL, const uint8_t NS, const uint8_t SF, const uint8_t NSE)
|
||||||
{
|
{
|
||||||
pkt_valid.bits.context_valid = 1;
|
pkt_valid.bits.context_valid = 1;
|
||||||
if(update)
|
if(update)
|
||||||
@ -421,6 +430,7 @@ inline void EtmV4ITrcPacket::setContextInfo(const bool update, const uint8_t EL,
|
|||||||
context.EL = EL;
|
context.EL = EL;
|
||||||
context.NS = NS;
|
context.NS = NS;
|
||||||
context.SF = SF;
|
context.SF = SF;
|
||||||
|
context.NSE = NSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -534,6 +544,12 @@ inline void EtmV4ITrcPacket::pop_vaddr_idx(const uint8_t idx)
|
|||||||
m_addr_stack.get_idx(idx, v_addr, v_addr_ISA);
|
m_addr_stack.get_idx(idx, v_addr, v_addr_ISA);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline void EtmV4ITrcPacket::setITE(const uint8_t el, const uint64_t value)
|
||||||
|
{
|
||||||
|
ite_pkt.el = el;
|
||||||
|
ite_pkt.value = value;
|
||||||
|
}
|
||||||
|
|
||||||
/** @}*/
|
/** @}*/
|
||||||
|
|
||||||
#endif // ARM_TRC_PKT_ELEM_ETMV4I_H_INCLUDED
|
#endif // ARM_TRC_PKT_ELEM_ETMV4I_H_INCLUDED
|
||||||
|
@ -117,6 +117,7 @@ class TrcPktProcEtmV4I : public TrcPktProcBase< EtmV4ITrcPacket, ocsd_etmv4_i_pk
|
|||||||
#define TINFO_KEY_SECT 0x02
|
#define TINFO_KEY_SECT 0x02
|
||||||
#define TINFO_SPEC_SECT 0x04
|
#define TINFO_SPEC_SECT 0x04
|
||||||
#define TINFO_CYCT_SECT 0x08
|
#define TINFO_CYCT_SECT 0x08
|
||||||
|
#define TINFO_WNDW_SECT 0x10
|
||||||
#define TINFO_CTRL 0x20
|
#define TINFO_CTRL 0x20
|
||||||
#define TINFO_ALL_SECT 0x1F
|
#define TINFO_ALL_SECT 0x1F
|
||||||
#define TINFO_ALL 0x3F
|
#define TINFO_ALL 0x3F
|
||||||
@ -178,9 +179,10 @@ class TrcPktProcEtmV4I : public TrcPktProcBase< EtmV4ITrcPacket, ocsd_etmv4_i_pk
|
|||||||
void iPktQ(const uint8_t lastByte);
|
void iPktQ(const uint8_t lastByte);
|
||||||
void iAtom(const uint8_t lastByte);
|
void iAtom(const uint8_t lastByte);
|
||||||
void iPktInvalidCfg(const uint8_t lastByte); // packet invalid in current config.
|
void iPktInvalidCfg(const uint8_t lastByte); // packet invalid in current config.
|
||||||
|
void iPktITE(const uint8_t lastByte);
|
||||||
|
|
||||||
unsigned extractContField(const std::vector<uint8_t> &buffer, const unsigned st_idx, uint32_t &value, const unsigned byte_limit = 5);
|
unsigned extractContField(const std::vector<uint8_t> &buffer, const unsigned st_idx, uint32_t &value, const unsigned byte_limit = 5);
|
||||||
unsigned extractContField64(const std::vector<uint8_t> &buffer, const unsigned st_idx, uint64_t &value, const unsigned byte_limit = 9);
|
unsigned extractTSField64(const std::vector<uint8_t> &buffer, const unsigned st_idx, uint64_t &value);
|
||||||
unsigned extractCondResult(const std::vector<uint8_t> &buffer, const unsigned st_idx, uint32_t& key, uint8_t &result);
|
unsigned extractCondResult(const std::vector<uint8_t> &buffer, const unsigned st_idx, uint32_t& key, uint8_t &result);
|
||||||
void extractAndSetContextInfo(const std::vector<uint8_t> &buffer, const int st_idx);
|
void extractAndSetContextInfo(const std::vector<uint8_t> &buffer, const int st_idx);
|
||||||
int extract64BitLongAddr(const std::vector<uint8_t> &buffer, const int st_idx, const uint8_t IS, uint64_t &value);
|
int extract64BitLongAddr(const std::vector<uint8_t> &buffer, const int st_idx, const uint8_t IS, uint64_t &value);
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
/*
|
/*
|
||||||
* \file trc_pkt_types_etmv4.h
|
* \file trc_pkt_types_etmv4.h
|
||||||
* \brief OpenCSD : ETMv4 packet info
|
* \brief OpenCSD : ETMv4 / ETE packet info
|
||||||
*
|
*
|
||||||
* \copyright Copyright (c) 2015,2019 ARM Limited. All Rights Reserved.
|
* \copyright Copyright (c) 2015,2019,2022 ARM Limited. All Rights Reserved.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
@ -41,7 +41,7 @@
|
|||||||
/** @addtogroup trc_pkts
|
/** @addtogroup trc_pkts
|
||||||
@{*/
|
@{*/
|
||||||
|
|
||||||
/** @name ETMv4 Packet Types
|
/** @name ETMv4 Packet Types, ETE packet Types
|
||||||
@{*/
|
@{*/
|
||||||
|
|
||||||
/** I stream packets. */
|
/** I stream packets. */
|
||||||
@ -70,9 +70,12 @@ typedef enum _ocsd_etmv4_i_pkt_type
|
|||||||
ETM4_PKT_I_FUNC_RET = 0x05, /*!< b00000101 (V8M only) */
|
ETM4_PKT_I_FUNC_RET = 0x05, /*!< b00000101 (V8M only) */
|
||||||
// Exceptions
|
// Exceptions
|
||||||
ETM4_PKT_I_EXCEPT = 0x06, /*!< b00000110 */
|
ETM4_PKT_I_EXCEPT = 0x06, /*!< b00000110 */
|
||||||
ETM4_PKT_I_EXCEPT_RTN = 0x07, /*!< b00000111 */
|
ETM4_PKT_I_EXCEPT_RTN = 0x07, /*!< b00000111 (ETE invalid) */
|
||||||
|
|
||||||
/* unused encodings 0x08-0xB b00001000 to b00001011 */
|
/* unused encoding 0x08 b00001000 */
|
||||||
|
ETE_PKT_I_ITE = 0x09, /*! b00001001 (ETE only) */
|
||||||
|
ETE_PKT_I_TRANS_ST = 0x0A, /*! b00001010 (ETE only) */
|
||||||
|
ETE_PKT_I_TRANS_COMMIT = 0x0B, /*! b00001011 (ETE only) */
|
||||||
|
|
||||||
/* cycle count packets */
|
/* cycle count packets */
|
||||||
ETM4_PKT_I_CCNT_F2 = 0x0C, /*!< b0000110x */
|
ETM4_PKT_I_CCNT_F2 = 0x0C, /*!< b0000110x */
|
||||||
@ -91,7 +94,7 @@ typedef enum _ocsd_etmv4_i_pkt_type
|
|||||||
ETM4_PKT_I_CANCEL_F2 = 0x34, /*!< b001101xx */
|
ETM4_PKT_I_CANCEL_F2 = 0x34, /*!< b001101xx */
|
||||||
ETM4_PKT_I_CANCEL_F3 = 0x38, /*!< b00111xxx */
|
ETM4_PKT_I_CANCEL_F3 = 0x38, /*!< b00111xxx */
|
||||||
|
|
||||||
/* conditional instruction tracing */
|
/* conditional instruction tracing - (reserved encodings ETE) */
|
||||||
ETM4_PKT_I_COND_I_F2 = 0x40, /*!< b01000000 - b01000010 */
|
ETM4_PKT_I_COND_I_F2 = 0x40, /*!< b01000000 - b01000010 */
|
||||||
ETM4_PKT_I_COND_FLUSH = 0x43, /*!< b01000011 */
|
ETM4_PKT_I_COND_FLUSH = 0x43, /*!< b01000011 */
|
||||||
ETM4_PKT_I_COND_RES_F4 = 0x44, /*!< b0100010x, b01000110 */
|
ETM4_PKT_I_COND_RES_F4 = 0x44, /*!< b0100010x, b01000110 */
|
||||||
@ -116,7 +119,8 @@ typedef enum _ocsd_etmv4_i_pkt_type
|
|||||||
ETM4_PKT_I_ADDR_CTXT_L_64IS0 = 0x85, /*!< b10000101 */
|
ETM4_PKT_I_ADDR_CTXT_L_64IS0 = 0x85, /*!< b10000101 */
|
||||||
ETM4_PKT_I_ADDR_CTXT_L_64IS1, /*!< b10000110 */
|
ETM4_PKT_I_ADDR_CTXT_L_64IS1, /*!< b10000110 */
|
||||||
/* unused encoding 0x87 b10000111 */
|
/* unused encoding 0x87 b10000111 */
|
||||||
/* unused encodings 0x88-0x8F b10001xxx */
|
ETE_PKT_I_TS_MARKER = 0x88, /*!< b10001000 */
|
||||||
|
/* unused encodings 0x89-0x8F b10001001 to b10001111 */
|
||||||
ETM4_PKT_I_ADDR_MATCH = 0x90, /*!< b10010000 to b10010010 0x92 */
|
ETM4_PKT_I_ADDR_MATCH = 0x90, /*!< b10010000 to b10010010 0x92 */
|
||||||
/* unused encodings 0x93-0x94 b10010011 to b10010010 */
|
/* unused encodings 0x93-0x94 b10010011 to b10010010 */
|
||||||
ETM4_PKT_I_ADDR_S_IS0 = 0x95, /*!< b10010101 */
|
ETM4_PKT_I_ADDR_S_IS0 = 0x95, /*!< b10010101 */
|
||||||
@ -132,7 +136,15 @@ typedef enum _ocsd_etmv4_i_pkt_type
|
|||||||
/* Q packets */
|
/* Q packets */
|
||||||
ETM4_PKT_I_Q = 0xA0, /*!< b1010xxxx */
|
ETM4_PKT_I_Q = 0xA0, /*!< b1010xxxx */
|
||||||
|
|
||||||
/* unused encodings 0xB0-0xBF b1011xxxx */
|
/* ETE source address packets, unused ETMv4 */
|
||||||
|
ETE_PKT_I_SRC_ADDR_MATCH = 0xB0, /*!< b101100xx */
|
||||||
|
ETE_PKT_I_SRC_ADDR_S_IS0 = 0xB4, /*!< b10110100 */
|
||||||
|
ETE_PKT_I_SRC_ADDR_S_IS1 = 0xB5, /*!< b10110101 */
|
||||||
|
ETE_PKT_I_SRC_ADDR_L_32IS0 = 0xB6, /*!< b10110110 */
|
||||||
|
ETE_PKT_I_SRC_ADDR_L_32IS1 = 0xB7, /*!< b10110111 */
|
||||||
|
ETE_PKT_I_SRC_ADDR_L_64IS0 = 0xB8, /*!< b10111000 */
|
||||||
|
ETE_PKT_I_SRC_ADDR_L_64IS1 = 0xB9, /*!< b10111001 */
|
||||||
|
/* unused encodings 0xBA-0xBF b10111010 - b10111111 */
|
||||||
|
|
||||||
/* Atom packets */
|
/* Atom packets */
|
||||||
ETM4_PKT_I_ATOM_F6 = 0xC0, /*!< b11000000 - b11010100 0xC0 - 0xD4, b11100000 - b11110100 0xE0 - 0xF4 */
|
ETM4_PKT_I_ATOM_F6 = 0xC0, /*!< b11000000 - b11010100 0xC0 - 0xD4, b11100000 - b11110100 0xE0 - 0xF4 */
|
||||||
@ -147,15 +159,20 @@ typedef enum _ocsd_etmv4_i_pkt_type
|
|||||||
ETM4_PKT_I_DISCARD = 0x103, //!< b00000011
|
ETM4_PKT_I_DISCARD = 0x103, //!< b00000011
|
||||||
ETM4_PKT_I_OVERFLOW = 0x105, //!< b00000101
|
ETM4_PKT_I_OVERFLOW = 0x105, //!< b00000101
|
||||||
|
|
||||||
|
// ETE extended types
|
||||||
|
ETE_PKT_I_PE_RESET = 0x400, // base type is exception packet.
|
||||||
|
ETE_PKT_I_TRANS_FAIL = 0x401, // base type is exception packet.
|
||||||
|
|
||||||
} ocsd_etmv4_i_pkt_type;
|
} ocsd_etmv4_i_pkt_type;
|
||||||
|
|
||||||
typedef union _etmv4_trace_info_t {
|
typedef union _etmv4_trace_info_t {
|
||||||
uint32_t val; //!< trace info full value.
|
uint32_t val; //!< trace info full value.
|
||||||
struct {
|
struct {
|
||||||
uint32_t cc_enabled:1; //!< 1 if cycle count enabled
|
uint32_t cc_enabled:1; //!< 1 if cycle count enabled
|
||||||
uint32_t cond_enabled:3; //!< conditional trace enabeld type
|
uint32_t cond_enabled:3; //!< conditional trace enabled type.
|
||||||
uint32_t p0_load:1; //!< 1 if tracing with P0 load elements (for data trace)
|
uint32_t p0_load:1; //!< 1 if tracing with P0 load elements (for data trace)
|
||||||
uint32_t p0_store:1; //!< 1 if tracing with P0 store elements (for data trace)
|
uint32_t p0_store:1; //!< 1 if tracing with P0 store elements (for data trace)
|
||||||
|
uint32_t in_trans_state:1; //!< 1 if starting trace when in a transactional state (ETE trace).
|
||||||
} bits; //!< bitfields for trace info value.
|
} bits; //!< bitfields for trace info value.
|
||||||
} etmv4_trace_info_t;
|
} etmv4_trace_info_t;
|
||||||
|
|
||||||
@ -167,6 +184,7 @@ typedef struct _etmv4_context_t {
|
|||||||
uint32_t updated:1; //!< updated this context packet (otherwise same as last time)
|
uint32_t updated:1; //!< updated this context packet (otherwise same as last time)
|
||||||
uint32_t updated_c:1; //!< updated CtxtID
|
uint32_t updated_c:1; //!< updated CtxtID
|
||||||
uint32_t updated_v:1; //!< updated VMID
|
uint32_t updated_v:1; //!< updated VMID
|
||||||
|
uint32_t NSE:1; //!< PE FEAT_RME: root / realm indicator
|
||||||
};
|
};
|
||||||
uint32_t ctxtID; //!< Current ctxtID
|
uint32_t ctxtID; //!< Current ctxtID
|
||||||
uint32_t VMID; //!< current VMID
|
uint32_t VMID; //!< current VMID
|
||||||
@ -256,6 +274,11 @@ typedef struct _ocsd_etmv4_i_pkt
|
|||||||
};
|
};
|
||||||
} Q_pkt;
|
} Q_pkt;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
uint8_t el;
|
||||||
|
uint64_t value;
|
||||||
|
} ite_pkt;
|
||||||
|
|
||||||
//! valid bits for packet elements (addresses have their own valid bits).
|
//! valid bits for packet elements (addresses have their own valid bits).
|
||||||
union {
|
union {
|
||||||
uint32_t val;
|
uint32_t val;
|
||||||
@ -277,6 +300,9 @@ typedef struct _ocsd_etmv4_i_pkt
|
|||||||
ocsd_etmv4_i_pkt_type err_type;
|
ocsd_etmv4_i_pkt_type err_type;
|
||||||
uint8_t err_hdr_val;
|
uint8_t err_hdr_val;
|
||||||
|
|
||||||
|
// protocol version - validity of ETE specific fields 0xMm == v Major.minor
|
||||||
|
uint8_t protocol_version;
|
||||||
|
|
||||||
} ocsd_etmv4_i_pkt;
|
} ocsd_etmv4_i_pkt;
|
||||||
|
|
||||||
|
|
||||||
@ -359,6 +385,9 @@ typedef struct _ocsd_etmv4_cfg
|
|||||||
ocsd_core_profile_t core_prof; /**< Core Profile */
|
ocsd_core_profile_t core_prof; /**< Core Profile */
|
||||||
} ocsd_etmv4_cfg;
|
} ocsd_etmv4_cfg;
|
||||||
|
|
||||||
|
#define ETE_ARCH_VERSION 0x5
|
||||||
|
|
||||||
|
#define ETE_OPFLG_PKTDEC_SRCADDR_N_ATOMS 0x00010000 /**< Split source address output ranges for N-atoms */
|
||||||
|
|
||||||
/** @}*/
|
/** @}*/
|
||||||
/** @}*/
|
/** @}*/
|
||||||
|
@ -278,11 +278,13 @@ typedef enum _ocsd_arch_version {
|
|||||||
ARCH_V7 = 0x0700, /**< V7 architecture */
|
ARCH_V7 = 0x0700, /**< V7 architecture */
|
||||||
ARCH_V8 = 0x0800, /**< V8 architecture */
|
ARCH_V8 = 0x0800, /**< V8 architecture */
|
||||||
ARCH_V8r3 = 0x0803, /**< V8.3 architecture */
|
ARCH_V8r3 = 0x0803, /**< V8.3 architecture */
|
||||||
|
ARCH_AA64 = 0x0864, /**< Min v8r3 plus additional AA64 PE features */
|
||||||
|
ARCH_V8_max = ARCH_AA64,
|
||||||
} ocsd_arch_version_t;
|
} ocsd_arch_version_t;
|
||||||
|
|
||||||
// macros for arch version comparisons.
|
// macros for arch version comparisons.
|
||||||
#define OCSD_IS_V8_ARCH(arch) ((arch >= ARCH_V8) && (arch <= ARCH_V8r3))
|
#define OCSD_IS_V8_ARCH(arch) ((arch >= ARCH_V8) && (arch <= ARCH_V8_max))
|
||||||
#define OCSD_MIN_V8_ARCH(arch) (arch >= ARCH_V8)
|
#define OCSD_IS_ARCH_MINVER(arch, min_arch) (arch >= min_arch)
|
||||||
|
|
||||||
/** Core Profile */
|
/** Core Profile */
|
||||||
typedef enum _ocsd_core_profile {
|
typedef enum _ocsd_core_profile {
|
||||||
@ -336,8 +338,10 @@ typedef enum _ocsd_isa
|
|||||||
*/
|
*/
|
||||||
typedef enum _ocsd_sec_level
|
typedef enum _ocsd_sec_level
|
||||||
{
|
{
|
||||||
ocsd_sec_secure, /**< Core is in secure state */
|
ocsd_sec_secure, /**< Core is in secure state */
|
||||||
ocsd_sec_nonsecure /**< Core is in non-secure state */
|
ocsd_sec_nonsecure, /**< Core is in non-secure state */
|
||||||
|
ocsd_sec_root, /**< PE FEAT_RME: Core is in root state. */
|
||||||
|
ocsd_sec_realm, /**< PE FEAT_RME: Core is in realm state. */
|
||||||
} ocsd_sec_level ;
|
} ocsd_sec_level ;
|
||||||
|
|
||||||
/** Exception level type
|
/** Exception level type
|
||||||
@ -352,7 +356,7 @@ typedef enum _ocsd_ex_level
|
|||||||
} ocsd_ex_level;
|
} ocsd_ex_level;
|
||||||
|
|
||||||
|
|
||||||
/** instruction types - significant for waypoint calculaitons */
|
/** instruction types - significant for waypoint calculations */
|
||||||
typedef enum _ocsd_instr_type {
|
typedef enum _ocsd_instr_type {
|
||||||
OCSD_INSTR_OTHER, /**< Other instruction - not significant for waypoints. */
|
OCSD_INSTR_OTHER, /**< Other instruction - not significant for waypoints. */
|
||||||
OCSD_INSTR_BR, /**< Immediate Branch instruction */
|
OCSD_INSTR_BR, /**< Immediate Branch instruction */
|
||||||
@ -360,6 +364,7 @@ typedef enum _ocsd_instr_type {
|
|||||||
OCSD_INSTR_ISB, /**< Barrier : ISB instruction */
|
OCSD_INSTR_ISB, /**< Barrier : ISB instruction */
|
||||||
OCSD_INSTR_DSB_DMB, /**< Barrier : DSB or DMB instruction */
|
OCSD_INSTR_DSB_DMB, /**< Barrier : DSB or DMB instruction */
|
||||||
OCSD_INSTR_WFI_WFE, /**< WFI or WFE traced as direct branch */
|
OCSD_INSTR_WFI_WFE, /**< WFI or WFE traced as direct branch */
|
||||||
|
OCSD_INSTR_TSTART, /**< PE Arch feature FEAT_TME - TSTART instruction */
|
||||||
} ocsd_instr_type;
|
} ocsd_instr_type;
|
||||||
|
|
||||||
/** instruction sub types - addiitonal information passed to the output packets
|
/** instruction sub types - addiitonal information passed to the output packets
|
||||||
@ -521,10 +526,11 @@ typedef struct _ocsd_file_mem_region {
|
|||||||
(common flags share bitfield with pkt processor common flags and create flags)
|
(common flags share bitfield with pkt processor common flags and create flags)
|
||||||
@{*/
|
@{*/
|
||||||
|
|
||||||
#define OCSD_OPFLG_PKTDEC_ERROR_BAD_PKTS 0x00000100 /**< throw error on bad packets input (default is to unsync and wait) */
|
#define OCSD_OPFLG_PKTDEC_ERROR_BAD_PKTS 0x00000100 /**< throw error on bad packets input (default is to warn) */
|
||||||
|
#define OCSD_OPFLG_PKTDEC_HALT_BAD_PKTS 0x00000200 /**< halt decoder on bad packets (default is to log error and continue by resetting decoder and wait for sync */
|
||||||
|
|
||||||
/** mask to combine all common packet processor operational control flags */
|
/** mask to combine all common packet processor operational control flags */
|
||||||
#define OCSD_OPFLG_PKTDEC_COMMON (OCSD_OPFLG_PKTDEC_ERROR_BAD_PKTS)
|
#define OCSD_OPFLG_PKTDEC_COMMON (OCSD_OPFLG_PKTDEC_ERROR_BAD_PKTS | OCSD_OPFLG_PKTDEC_HALT_BAD_PKTS)
|
||||||
|
|
||||||
/** @}*/
|
/** @}*/
|
||||||
|
|
||||||
@ -547,6 +553,7 @@ typedef struct _ocsd_file_mem_region {
|
|||||||
#define OCSD_BUILTIN_DCD_ETMV4I "ETMV4I" /**< ETMv4 instruction decoder */
|
#define OCSD_BUILTIN_DCD_ETMV4I "ETMV4I" /**< ETMv4 instruction decoder */
|
||||||
#define OCSD_BUILTIN_DCD_ETMV4D "ETMV4D" /**< ETMv4 data decoder */
|
#define OCSD_BUILTIN_DCD_ETMV4D "ETMV4D" /**< ETMv4 data decoder */
|
||||||
#define OCSD_BUILTIN_DCD_PTM "PTM" /**< PTM decoder */
|
#define OCSD_BUILTIN_DCD_PTM "PTM" /**< PTM decoder */
|
||||||
|
#define OCSD_BUILTIN_DCD_ETE "ETE" /**< ETE decoder */
|
||||||
|
|
||||||
/*! Trace Protocol Builtin Types + extern
|
/*! Trace Protocol Builtin Types + extern
|
||||||
*/
|
*/
|
||||||
@ -559,6 +566,7 @@ typedef enum _ocsd_trace_protocol_t {
|
|||||||
OCSD_PROTOCOL_ETMV4D, /**< ETMV4 data trace protocol decoder. */
|
OCSD_PROTOCOL_ETMV4D, /**< ETMV4 data trace protocol decoder. */
|
||||||
OCSD_PROTOCOL_PTM, /**< PTM program flow instruction trace protocol decoder. */
|
OCSD_PROTOCOL_PTM, /**< PTM program flow instruction trace protocol decoder. */
|
||||||
OCSD_PROTOCOL_STM, /**< STM system trace protocol decoder. */
|
OCSD_PROTOCOL_STM, /**< STM system trace protocol decoder. */
|
||||||
|
OCSD_PROTOCOL_ETE, /**< ETE trace protocol decoder */
|
||||||
|
|
||||||
/* others to be added here */
|
/* others to be added here */
|
||||||
OCSD_PROTOCOL_BUILTIN_END, /**< Invalid protocol - built-in protocol types end marker */
|
OCSD_PROTOCOL_BUILTIN_END, /**< Invalid protocol - built-in protocol types end marker */
|
||||||
@ -627,6 +635,56 @@ typedef struct _ocsd_swt_info {
|
|||||||
|
|
||||||
/** @}*/
|
/** @}*/
|
||||||
|
|
||||||
|
/** @name Demux Statistics
|
||||||
|
|
||||||
|
Contains statistics for the CoreSight frame demultiplexor.
|
||||||
|
|
||||||
|
Counts total bytes sent to decoders registered against a trace ID, bytes in the input stream that are
|
||||||
|
associated with a trace ID that has no registered decoder, and frame bytes that are not trace data, but
|
||||||
|
are used to decode the frames - ID bytes, sync bytes etc.
|
||||||
|
@{*/
|
||||||
|
|
||||||
|
typedef struct _ocsd_demux_stats {
|
||||||
|
uint64_t valid_id_bytes; /**< number of bytes associated with an ID that has a registered decoder */
|
||||||
|
uint64_t no_id_bytes; /**< number of bytes associated with an ID that has no decoder */
|
||||||
|
uint64_t reserved_id_bytes; /**< number of bytes associated with reserved IDs */
|
||||||
|
uint64_t unknown_id_bytes; /**< bytes processed before ID seen in input frames */
|
||||||
|
uint64_t frame_bytes; /**< number of non-data bytes used for frame de-mux - ID bytes, sync etc */
|
||||||
|
} ocsd_demux_stats_t;
|
||||||
|
|
||||||
|
/** @}*/
|
||||||
|
|
||||||
|
/** @name Decode statistics
|
||||||
|
|
||||||
|
Contains statistics for bytes decoded by the packet decoder, if statistics are supported.
|
||||||
|
|
||||||
|
Stats block instantiated in the base class - derived protocol specific decoder must initialise and
|
||||||
|
use as required.
|
||||||
|
|
||||||
|
The single channel block contains the stats for the requested channel via the API call.
|
||||||
|
|
||||||
|
The global demux block contains the totals for all channels and non-data bytes used in CoreSight
|
||||||
|
frame demux. This block will show identical data for every requested channel via the API.
|
||||||
|
|
||||||
|
@{*/
|
||||||
|
|
||||||
|
typedef struct _ocsd_decode_stats {
|
||||||
|
uint32_t version; /**< library version number */
|
||||||
|
uint16_t revision; /**< revision number - defines the structure version for the stats. */
|
||||||
|
/* single channel block */
|
||||||
|
uint64_t channel_total; /**< total bytes processed for this channel */
|
||||||
|
uint64_t channel_unsynced; /**< number of unsynced bytes processed on this channel */
|
||||||
|
uint32_t bad_header_errs; /**< number of bad packet header errors */
|
||||||
|
uint32_t bad_sequence_errs; /**< number of bad packet sequence errors */
|
||||||
|
|
||||||
|
ocsd_demux_stats_t demux; /**< global demux stats block */
|
||||||
|
} ocsd_decode_stats_t;
|
||||||
|
|
||||||
|
#define OCSD_STATS_REVISION 0x1
|
||||||
|
|
||||||
|
/** @}*/
|
||||||
|
|
||||||
|
|
||||||
/** @}*/
|
/** @}*/
|
||||||
#endif // ARM_OCSD_IF_TYPES_H_INCLUDED
|
#endif // ARM_OCSD_IF_TYPES_H_INCLUDED
|
||||||
|
|
||||||
|
@ -42,9 +42,9 @@
|
|||||||
|
|
||||||
/** @name Library Versioning
|
/** @name Library Versioning
|
||||||
@{*/
|
@{*/
|
||||||
#define OCSD_VER_MAJOR 0x0 /**< Library Major Version */
|
#define OCSD_VER_MAJOR 0x1 /**< Library Major Version */
|
||||||
#define OCSD_VER_MINOR 0xE /**< Library Minor Version */
|
#define OCSD_VER_MINOR 0x4 /**< Library Minor Version */
|
||||||
#define OCSD_VER_PATCH 0x2 /**< Library Patch Version */
|
#define OCSD_VER_PATCH 0x0 /**< Library Patch Version */
|
||||||
|
|
||||||
/** Library version number - MMMMnnpp format.
|
/** Library version number - MMMMnnpp format.
|
||||||
MMMM = major version,
|
MMMM = major version,
|
||||||
@ -53,7 +53,7 @@
|
|||||||
*/
|
*/
|
||||||
#define OCSD_VER_NUM ((OCSD_VER_MAJOR << 16) | (OCSD_VER_MINOR << 8) | OCSD_VER_PATCH)
|
#define OCSD_VER_NUM ((OCSD_VER_MAJOR << 16) | (OCSD_VER_MINOR << 8) | OCSD_VER_PATCH)
|
||||||
|
|
||||||
#define OCSD_VER_STRING "0.14.2" /**< Library Version string */
|
#define OCSD_VER_STRING "1.4.0" /**< Library Version string */
|
||||||
#define OCSD_LIB_NAME "OpenCSD Library" /**< Library name string */
|
#define OCSD_LIB_NAME "OpenCSD Library" /**< Library name string */
|
||||||
#define OCSD_LIB_SHORT_NAME "OCSD" /**< Library Short name string */
|
#define OCSD_LIB_SHORT_NAME "OCSD" /**< Library Short name string */
|
||||||
/** @}*/
|
/** @}*/
|
||||||
|
@ -239,7 +239,8 @@ inline void TrcPktProcStm::checkSyncNibble()
|
|||||||
|
|
||||||
if((m_nibble == 0) && (m_num_F_nibbles >= 21))
|
if((m_nibble == 0) && (m_num_F_nibbles >= 21))
|
||||||
{
|
{
|
||||||
m_is_sync = true; //this nibble marks a sync sequence - keep the F nibble count
|
m_is_sync = true; //this nibble marks a sync sequence
|
||||||
|
m_num_F_nibbles = 21; // set the F nibble count - lose any extra as unsynced data.
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -60,7 +60,10 @@ typedef enum _ocsd_gen_trc_elem_t
|
|||||||
OCSD_GEN_TRC_ELEM_TIMESTAMP, /*!< Timestamp - preceding elements happeded before this time. */
|
OCSD_GEN_TRC_ELEM_TIMESTAMP, /*!< Timestamp - preceding elements happeded before this time. */
|
||||||
OCSD_GEN_TRC_ELEM_CYCLE_COUNT, /*!< Cycle count - cycles since last cycle count value - associated with a preceding instruction range. */
|
OCSD_GEN_TRC_ELEM_CYCLE_COUNT, /*!< Cycle count - cycles since last cycle count value - associated with a preceding instruction range. */
|
||||||
OCSD_GEN_TRC_ELEM_EVENT, /*!< Event - trigger or numbered event */
|
OCSD_GEN_TRC_ELEM_EVENT, /*!< Event - trigger or numbered event */
|
||||||
OCSD_GEN_TRC_ELEM_SWTRACE, /*!< Software trace packet - may contain data payload. */
|
OCSD_GEN_TRC_ELEM_SWTRACE, /*!< Software trace packet - may contain data payload. STM / ITM hardware trace with channel protocol */
|
||||||
|
OCSD_GEN_TRC_ELEM_SYNC_MARKER, /*!< Synchronisation marker - marks position in stream of an element that is output later. */
|
||||||
|
OCSD_GEN_TRC_ELEM_MEMTRANS, /*!< Trace indication of transactional memory operations. */
|
||||||
|
OCSD_GEN_TRC_ELEM_INSTRUMENTATION, /*!< PE instrumentation trace - PE generated SW trace, application dependent protocol. */
|
||||||
OCSD_GEN_TRC_ELEM_CUSTOM, /*!< Fully custom packet type - used by none-ARM architecture decoders */
|
OCSD_GEN_TRC_ELEM_CUSTOM, /*!< Fully custom packet type - used by none-ARM architecture decoders */
|
||||||
} ocsd_gen_trc_elem_t;
|
} ocsd_gen_trc_elem_t;
|
||||||
|
|
||||||
@ -86,6 +89,27 @@ typedef enum _unsync_info_t {
|
|||||||
UNSYNC_EOT, /**< end of trace - no additional info */
|
UNSYNC_EOT, /**< end of trace - no additional info */
|
||||||
} unsync_info_t;
|
} unsync_info_t;
|
||||||
|
|
||||||
|
typedef enum _trace_sync_marker_t {
|
||||||
|
ELEM_MARKER_TS, /**< Marker for timestamp element */
|
||||||
|
} trace_sync_marker_t;
|
||||||
|
|
||||||
|
typedef struct _trace_marker_payload_t {
|
||||||
|
trace_sync_marker_t type; /**< type of sync marker */
|
||||||
|
uint32_t value; /**< sync marker value - usage depends on type */
|
||||||
|
} trace_marker_payload_t;
|
||||||
|
|
||||||
|
typedef enum _memtrans_t {
|
||||||
|
OCSD_MEM_TRANS_TRACE_INIT,/**< Trace started while PE in transactional state */
|
||||||
|
OCSD_MEM_TRANS_START, /**< Trace after this packet is part of a transactional memory sequence */
|
||||||
|
OCSD_MEM_TRANS_COMMIT, /**< Transactional memory sequence valid. */
|
||||||
|
OCSD_MEM_TRANS_FAIL, /**< Transactional memory sequence failed - operations since start of transaction have been unwound. */
|
||||||
|
} trace_memtrans_t;
|
||||||
|
|
||||||
|
typedef struct _sw_ite_t {
|
||||||
|
uint8_t el; /**< exception level for PE sw instrumentation instruction */
|
||||||
|
uint64_t value; /**< payload for PE sw instrumentation instruction */
|
||||||
|
} trace_sw_ite_t;
|
||||||
|
|
||||||
typedef struct _ocsd_generic_trace_elem {
|
typedef struct _ocsd_generic_trace_elem {
|
||||||
ocsd_gen_trc_elem_t elem_type; /**< Element type - remaining data interpreted according to this value */
|
ocsd_gen_trc_elem_t elem_type; /**< Element type - remaining data interpreted according to this value */
|
||||||
ocsd_isa isa; /**< instruction set for executed instructions */
|
ocsd_isa isa; /**< instruction set for executed instructions */
|
||||||
@ -122,6 +146,9 @@ typedef struct _ocsd_generic_trace_elem {
|
|||||||
ocsd_swt_info_t sw_trace_info; /**< software trace packet info */
|
ocsd_swt_info_t sw_trace_info; /**< software trace packet info */
|
||||||
uint32_t num_instr_range; /**< number of instructions covered by range packet (for T32 this cannot be calculated from en-st/i_size) */
|
uint32_t num_instr_range; /**< number of instructions covered by range packet (for T32 this cannot be calculated from en-st/i_size) */
|
||||||
unsync_info_t unsync_eot_info; /**< additional information for unsync / end-of-trace packets. */
|
unsync_info_t unsync_eot_info; /**< additional information for unsync / end-of-trace packets. */
|
||||||
|
trace_marker_payload_t sync_marker; /**< marker element - sync later element to position in stream */
|
||||||
|
trace_memtrans_t mem_trans; /**< memory transaction packet - transaction event */
|
||||||
|
trace_sw_ite_t sw_ite; /**< PE sw instrumentation using FEAT_ITE */
|
||||||
};
|
};
|
||||||
|
|
||||||
const void *ptr_extended_data; /**< pointer to extended data buffer (data trace, sw trace payload) / custom structure */
|
const void *ptr_extended_data; /**< pointer to extended data buffer (data trace, sw trace payload) / custom structure */
|
||||||
|
@ -234,8 +234,24 @@ OCSD_C_API ocsd_err_t ocsd_dt_attach_packet_callback( const dcd_tree_handle_t h
|
|||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*** Decode tree set element output */
|
OCSD_C_API ocsd_err_t ocsd_dt_get_decode_stats(const dcd_tree_handle_t handle,
|
||||||
|
const unsigned char CSID,
|
||||||
|
ocsd_decode_stats_t **p_stats_block)
|
||||||
|
{
|
||||||
|
DecodeTree *pDT = static_cast<DecodeTree *>(handle);
|
||||||
|
|
||||||
|
return pDT->getDecoderStats(CSID, p_stats_block);
|
||||||
|
}
|
||||||
|
|
||||||
|
OCSD_C_API ocsd_err_t ocsd_dt_reset_decode_stats(const dcd_tree_handle_t handle,
|
||||||
|
const unsigned char CSID)
|
||||||
|
{
|
||||||
|
DecodeTree *pDT = static_cast<DecodeTree *>(handle);
|
||||||
|
|
||||||
|
return pDT->resetDecoderStats(CSID);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*** Decode tree set element output */
|
||||||
OCSD_C_API ocsd_err_t ocsd_dt_set_gen_elem_outfn(const dcd_tree_handle_t handle, FnTraceElemIn pFn, const void *p_context)
|
OCSD_C_API ocsd_err_t ocsd_dt_set_gen_elem_outfn(const dcd_tree_handle_t handle, FnTraceElemIn pFn, const void *p_context)
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -470,6 +486,39 @@ OCSD_C_API ocsd_err_t ocsd_dt_set_pkt_protocol_printer(const dcd_tree_handle_t h
|
|||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
OCSD_C_API void ocsd_err_str(const ocsd_err_t err, char *buffer, const int buffer_size)
|
||||||
|
{
|
||||||
|
std::string err_str;
|
||||||
|
err_str = ocsdError::getErrorString(ocsdError(OCSD_ERR_SEV_ERROR, err));
|
||||||
|
strncpy(buffer, err_str.c_str(), buffer_size - 1);
|
||||||
|
buffer[buffer_size - 1] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
OCSD_C_API ocsd_err_t ocsd_get_last_err(ocsd_trc_index_t *index, uint8_t *chan_id, char *message, const int message_len)
|
||||||
|
{
|
||||||
|
ocsdError *p_err;
|
||||||
|
ocsd_err_t err = OCSD_OK;
|
||||||
|
std::string err_str;
|
||||||
|
|
||||||
|
p_err = DecodeTree::getDefaultErrorLogger()->GetLastError();
|
||||||
|
if (p_err)
|
||||||
|
{
|
||||||
|
*index = p_err->getErrorIndex();
|
||||||
|
*chan_id = p_err->getErrorChanID();
|
||||||
|
err_str = p_err->getErrorString(ocsdError(p_err));
|
||||||
|
strncpy(message, err_str.c_str(), message_len - 1);
|
||||||
|
message[message_len - 1] = 0;
|
||||||
|
err = p_err->getErrorCode();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
message[0] = 0;
|
||||||
|
*index = OCSD_BAD_TRC_INDEX;
|
||||||
|
*chan_id = OCSD_BAD_CS_SRC_ID;
|
||||||
|
}
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
/*******************************************************************************/
|
/*******************************************************************************/
|
||||||
/* C API local fns */
|
/* C API local fns */
|
||||||
/*******************************************************************************/
|
/*******************************************************************************/
|
||||||
|
98
decoder/source/ete/trc_cmp_cfg_ete.cpp
Normal file
98
decoder/source/ete/trc_cmp_cfg_ete.cpp
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
/*
|
||||||
|
* \file trc_cmp_cfg_ete.cpp
|
||||||
|
* \brief OpenCSD : ETE config class
|
||||||
|
*
|
||||||
|
* \copyright Copyright (c) 2019, 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 "opencsd/ete/trc_cmp_cfg_ete.h"
|
||||||
|
|
||||||
|
ETEConfig::ETEConfig() : EtmV4Config()
|
||||||
|
{
|
||||||
|
m_ete_cfg.reg_idr0 = 0x28000EA1;
|
||||||
|
m_ete_cfg.reg_idr1 = 0x4100FFF3;
|
||||||
|
m_ete_cfg.reg_idr2 = 0x00000488;
|
||||||
|
m_ete_cfg.reg_idr8 = 0;
|
||||||
|
m_ete_cfg.reg_configr = 0xC1;
|
||||||
|
m_ete_cfg.reg_traceidr = 0;
|
||||||
|
m_ete_cfg.arch_ver = ARCH_AA64;
|
||||||
|
m_ete_cfg.core_prof = profile_CortexA;
|
||||||
|
m_ete_cfg.reg_devarch = 0x47705A13;
|
||||||
|
copyV4();
|
||||||
|
}
|
||||||
|
|
||||||
|
ETEConfig::ETEConfig(const ocsd_ete_cfg *cfg_regs) : EtmV4Config()
|
||||||
|
{
|
||||||
|
m_ete_cfg = *cfg_regs;
|
||||||
|
copyV4();
|
||||||
|
}
|
||||||
|
|
||||||
|
ETEConfig::~ETEConfig()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//! copy assignment operator for base structure into class.
|
||||||
|
ETEConfig & ETEConfig::operator=(const ocsd_ete_cfg *p_cfg)
|
||||||
|
{
|
||||||
|
m_ete_cfg = *p_cfg;
|
||||||
|
copyV4();
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
//! cast operator returning struct const reference
|
||||||
|
//operator const ocsd_ete_cfg &() const { return m_ete_cfg; };
|
||||||
|
//! cast operator returning struct const pointer
|
||||||
|
//operator const ocsd_ete_cfg *() const { return &m_ete_cfg; };
|
||||||
|
|
||||||
|
// ete superset of etmv4 - move info to underlying structure.
|
||||||
|
void ETEConfig::copyV4()
|
||||||
|
{
|
||||||
|
// copy over 1:1 regs
|
||||||
|
m_cfg.reg_idr0 = m_ete_cfg.reg_idr0;
|
||||||
|
m_cfg.reg_idr1 = m_ete_cfg.reg_idr1;
|
||||||
|
m_cfg.reg_idr2 = m_ete_cfg.reg_idr2;
|
||||||
|
m_cfg.reg_idr8 = m_ete_cfg.reg_idr8;
|
||||||
|
m_cfg.reg_idr9 = 0;
|
||||||
|
m_cfg.reg_idr10 = 0;
|
||||||
|
m_cfg.reg_idr11 = 0;
|
||||||
|
m_cfg.reg_idr12 = 0;
|
||||||
|
m_cfg.reg_idr13 = 0;
|
||||||
|
m_cfg.reg_configr = m_ete_cfg.reg_configr;
|
||||||
|
m_cfg.reg_traceidr = m_ete_cfg.reg_traceidr;
|
||||||
|
m_cfg.core_prof = m_ete_cfg.core_prof;
|
||||||
|
m_cfg.arch_ver = m_ete_cfg.arch_ver;
|
||||||
|
|
||||||
|
// override major / minor version as part of devarch
|
||||||
|
m_MajVer = (uint8_t)((m_ete_cfg.reg_devarch & 0xF000) >> 12);
|
||||||
|
m_MinVer = (uint8_t)((m_ete_cfg.reg_devarch & 0xF0000) >> 16);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* End of File trc_cmp_cfg_ete.cpp */
|
@ -659,7 +659,7 @@ void EtmV3TrcPacket::getExcepStr(std::string &excepStr) const
|
|||||||
"IRQ4", "IRQ5", "IRQ6", "IRQ7",
|
"IRQ4", "IRQ5", "IRQ6", "IRQ7",
|
||||||
"IRQ0","usage Fault","NMI","SVC",
|
"IRQ0","usage Fault","NMI","SVC",
|
||||||
"DebugMonitor", "Mem Manage","PendSV","SysTick",
|
"DebugMonitor", "Mem Manage","PendSV","SysTick",
|
||||||
"Reserved","PE Reset","Reserved","HardFault"
|
"Reserved","PE Reset","Reserved","HardFault",
|
||||||
"Reserved","BusFault","Reserved","Reserved"
|
"Reserved","BusFault","Reserved","Reserved"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -98,7 +98,7 @@ void EtmV4Config::CalcVMIDSize()
|
|||||||
uint32_t vmidszF = (m_cfg.reg_idr2 >> 10) & 0x1F;
|
uint32_t vmidszF = (m_cfg.reg_idr2 >> 10) & 0x1F;
|
||||||
if(vmidszF == 1)
|
if(vmidszF == 1)
|
||||||
m_VMIDSize = 8;
|
m_VMIDSize = 8;
|
||||||
else if(MinVersion() > 0)
|
else if(FullVersion() > 0x40)
|
||||||
{
|
{
|
||||||
if(vmidszF == 2)
|
if(vmidszF == 2)
|
||||||
m_VMIDSize = 16;
|
m_VMIDSize = 16;
|
||||||
|
@ -128,6 +128,40 @@ TrcStackQElem *EtmV4P0Stack::createQElem(const ocsd_etmv4_i_pkt_type root_pkt, c
|
|||||||
return pElem;
|
return pElem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TrcStackElemMarker *EtmV4P0Stack::createMarkerElem(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index, const trace_marker_payload_t &marker)
|
||||||
|
{
|
||||||
|
TrcStackElemMarker *pElem = new (std::nothrow) TrcStackElemMarker(root_pkt, root_index);
|
||||||
|
if (pElem)
|
||||||
|
{
|
||||||
|
pElem->setMarker(marker);
|
||||||
|
push_front(pElem);
|
||||||
|
}
|
||||||
|
return pElem;
|
||||||
|
}
|
||||||
|
|
||||||
|
TrcStackElemAddr *EtmV4P0Stack::createSrcAddrElem(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index, const etmv4_addr_val_t &addr_val)
|
||||||
|
{
|
||||||
|
TrcStackElemAddr *pElem = new (std::nothrow) TrcStackElemAddr(root_pkt, root_index, true);
|
||||||
|
if (pElem)
|
||||||
|
{
|
||||||
|
pElem->setAddr(addr_val);
|
||||||
|
push_front(pElem);
|
||||||
|
}
|
||||||
|
return pElem;
|
||||||
|
}
|
||||||
|
|
||||||
|
TrcStackElemITE *EtmV4P0Stack::createITEElem(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index, const trace_sw_ite_t &ite)
|
||||||
|
{
|
||||||
|
TrcStackElemITE *pElem = new (std::nothrow) TrcStackElemITE(root_pkt, root_index);
|
||||||
|
if (pElem)
|
||||||
|
{
|
||||||
|
pElem->setITE(ite);
|
||||||
|
push_front(pElem);
|
||||||
|
}
|
||||||
|
return pElem;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// iteration functions
|
// iteration functions
|
||||||
void EtmV4P0Stack::from_front_init()
|
void EtmV4P0Stack::from_front_init()
|
||||||
{
|
{
|
||||||
@ -150,6 +184,10 @@ void EtmV4P0Stack::erase_curr_from_front()
|
|||||||
erase_iter = m_iter;
|
erase_iter = m_iter;
|
||||||
erase_iter--;
|
erase_iter--;
|
||||||
m_P0_stack.erase(erase_iter);
|
m_P0_stack.erase(erase_iter);
|
||||||
|
|
||||||
|
// explicitly delete the item here as the caller can no longer reference it.
|
||||||
|
// fixes memory leak from github issue #52
|
||||||
|
delete *erase_iter;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -39,7 +39,8 @@
|
|||||||
|
|
||||||
#define DCD_NAME "DCD_ETMV4"
|
#define DCD_NAME "DCD_ETMV4"
|
||||||
|
|
||||||
static const uint32_t ETMV4_SUPPORTED_DECODE_OP_FLAGS = OCSD_OPFLG_PKTDEC_COMMON;
|
static const uint32_t ETMV4_SUPPORTED_DECODE_OP_FLAGS = OCSD_OPFLG_PKTDEC_COMMON |
|
||||||
|
ETE_OPFLG_PKTDEC_SRCADDR_N_ATOMS;
|
||||||
|
|
||||||
TrcPktDecodeEtmV4I::TrcPktDecodeEtmV4I()
|
TrcPktDecodeEtmV4I::TrcPktDecodeEtmV4I()
|
||||||
: TrcPktDecodeBase(DCD_NAME)
|
: TrcPktDecodeBase(DCD_NAME)
|
||||||
@ -101,6 +102,14 @@ ocsd_datapath_resp_t TrcPktDecodeEtmV4I::processPacket()
|
|||||||
m_curr_state = DECODE_PKTS;
|
m_curr_state = DECODE_PKTS;
|
||||||
m_return_stack.flush();
|
m_return_stack.flush();
|
||||||
}
|
}
|
||||||
|
/* ETE spec allows early event packets. */
|
||||||
|
else if ((m_config->MajVersion() >= 0x5) &&
|
||||||
|
(m_curr_packet_in->getType() == ETM4_PKT_I_EVENT))
|
||||||
|
{
|
||||||
|
err = decodePacket();
|
||||||
|
if (err)
|
||||||
|
resp = OCSD_RESP_FATAL_INVALID_DATA;
|
||||||
|
}
|
||||||
bPktDone = true;
|
bPktDone = true;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -261,6 +270,7 @@ void TrcPktDecodeEtmV4I::resetDecoder()
|
|||||||
m_out_elem.resetElemStack();
|
m_out_elem.resetElemStack();
|
||||||
m_last_IS = 0;
|
m_last_IS = 0;
|
||||||
clearElemRes();
|
clearElemRes();
|
||||||
|
m_ete_first_ts_marker = false;
|
||||||
|
|
||||||
// elements associated with data trace
|
// elements associated with data trace
|
||||||
#ifdef DATA_TRACE_SUPPORTED
|
#ifdef DATA_TRACE_SUPPORTED
|
||||||
@ -358,7 +368,25 @@ ocsd_err_t TrcPktDecodeEtmV4I::decodePacket()
|
|||||||
|
|
||||||
if (m_P0_stack.createAddrElem(m_curr_packet_in->getType(), m_index_curr_pkt, addr) == 0)
|
if (m_P0_stack.createAddrElem(m_curr_packet_in->getType(), m_index_curr_pkt, addr) == 0)
|
||||||
bAllocErr = true;
|
bAllocErr = true;
|
||||||
is_addr = true;
|
is_addr = true; // may be waiting for target address from indirect branch
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ETE_PKT_I_SRC_ADDR_MATCH:
|
||||||
|
case ETE_PKT_I_SRC_ADDR_S_IS0:
|
||||||
|
case ETE_PKT_I_SRC_ADDR_S_IS1:
|
||||||
|
case ETE_PKT_I_SRC_ADDR_L_32IS0:
|
||||||
|
case ETE_PKT_I_SRC_ADDR_L_32IS1:
|
||||||
|
case ETE_PKT_I_SRC_ADDR_L_64IS0:
|
||||||
|
case ETE_PKT_I_SRC_ADDR_L_64IS1:
|
||||||
|
{
|
||||||
|
etmv4_addr_val_t addr;
|
||||||
|
|
||||||
|
addr.val = m_curr_packet_in->getAddrVal();
|
||||||
|
addr.isa = m_curr_packet_in->getAddrIS();
|
||||||
|
if (m_P0_stack.createSrcAddrElem(m_curr_packet_in->getType(), m_index_curr_pkt, addr) == 0)
|
||||||
|
bAllocErr = true;
|
||||||
|
m_curr_spec_depth++;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -438,16 +466,26 @@ ocsd_err_t TrcPktDecodeEtmV4I::decodePacket()
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case ETE_PKT_I_TS_MARKER:
|
||||||
|
{
|
||||||
|
trace_marker_payload_t marker;
|
||||||
|
marker.type = ELEM_MARKER_TS;
|
||||||
|
marker.value = 0;
|
||||||
|
if (m_P0_stack.createMarkerElem(m_curr_packet_in->getType(), m_index_curr_pkt, marker) == 0)
|
||||||
|
bAllocErr = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case ETM4_PKT_I_BAD_SEQUENCE:
|
case ETM4_PKT_I_BAD_SEQUENCE:
|
||||||
err = handleBadPacket("Bad byte sequence in packet.");
|
err = handleBadPacket("Bad byte sequence in packet.", m_index_curr_pkt);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ETM4_PKT_I_BAD_TRACEMODE:
|
case ETM4_PKT_I_BAD_TRACEMODE:
|
||||||
err = handleBadPacket("Invalid packet type for trace mode.");
|
err = handleBadPacket("Invalid packet type for trace mode.", m_index_curr_pkt);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ETM4_PKT_I_RESERVED:
|
case ETM4_PKT_I_RESERVED:
|
||||||
err = handleBadPacket("Reserved packet header");
|
err = handleBadPacket("Reserved packet header", m_index_curr_pkt);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// speculation
|
// speculation
|
||||||
@ -502,8 +540,44 @@ ocsd_err_t TrcPktDecodeEtmV4I::decodePacket()
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
/* transactional memory packets */
|
||||||
|
case ETE_PKT_I_TRANS_ST:
|
||||||
|
{
|
||||||
|
if (m_P0_stack.createParamElemNoParam(P0_TRANS_START, m_config->commTransP0(), m_curr_packet_in->getType(), m_index_curr_pkt) == 0)
|
||||||
|
bAllocErr = true;
|
||||||
|
if (m_config->commTransP0())
|
||||||
|
m_curr_spec_depth++;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ETE_PKT_I_TRANS_COMMIT:
|
||||||
|
{
|
||||||
|
if (m_P0_stack.createParamElemNoParam(P0_TRANS_COMMIT, false, m_curr_packet_in->getType(), m_index_curr_pkt) == 0)
|
||||||
|
bAllocErr = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ETE_PKT_I_TRANS_FAIL:
|
||||||
|
{
|
||||||
|
if (m_P0_stack.createParamElemNoParam(P0_TRANS_FAIL, false, m_curr_packet_in->getType(), m_index_curr_pkt) == 0)
|
||||||
|
bAllocErr = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* PE Instrumentation packet */
|
||||||
|
case ETE_PKT_I_ITE:
|
||||||
|
{
|
||||||
|
trace_sw_ite_t ite_pkt;
|
||||||
|
|
||||||
|
ite_pkt.el = m_curr_packet_in->getITE_EL();
|
||||||
|
ite_pkt.value = m_curr_packet_in->getITE_value();
|
||||||
|
if (m_P0_stack.createITEElem(m_curr_packet_in->getType(), m_index_curr_pkt, ite_pkt) == 0)
|
||||||
|
bAllocErr = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
/*** presently unsupported packets ***/
|
/*** presently unsupported packets ***/
|
||||||
/* conditional instruction tracing */
|
/* conditional instruction tracing */
|
||||||
case ETM4_PKT_I_COND_FLUSH:
|
case ETM4_PKT_I_COND_FLUSH:
|
||||||
case ETM4_PKT_I_COND_I_F1:
|
case ETM4_PKT_I_COND_I_F1:
|
||||||
case ETM4_PKT_I_COND_I_F2:
|
case ETM4_PKT_I_COND_I_F2:
|
||||||
@ -525,14 +599,16 @@ ocsd_err_t TrcPktDecodeEtmV4I::decodePacket()
|
|||||||
//resp = OCSD_RESP_FATAL_INVALID_DATA;
|
//resp = OCSD_RESP_FATAL_INVALID_DATA;
|
||||||
#endif
|
#endif
|
||||||
err = OCSD_ERR_UNSUPP_DECODE_PKT;
|
err = OCSD_ERR_UNSUPP_DECODE_PKT;
|
||||||
LogError(ocsdError(sev, err, "Data trace releated, unsupported packet type."));
|
if (sev == OCSD_ERR_SEV_WARN)
|
||||||
|
LogError(ocsdError(sev, err, "Data trace related, unsupported packet type."));
|
||||||
|
else
|
||||||
|
err = handlePacketSeqErr(err, m_index_curr_pkt, "Data trace related, unsupported packet type.");
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
// any other packet - bad packet error
|
// any other packet - bad packet error
|
||||||
err = OCSD_ERR_BAD_DECODE_PKT;
|
err = handleBadPacket("Unknown packet type.", m_index_curr_pkt);
|
||||||
LogError(ocsdError(OCSD_ERR_SEV_ERROR,err,"Unknown packet type."));
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -566,6 +642,9 @@ void TrcPktDecodeEtmV4I::doTraceInfoPacket()
|
|||||||
m_trace_info = m_curr_packet_in->getTraceInfo();
|
m_trace_info = m_curr_packet_in->getTraceInfo();
|
||||||
m_cc_threshold = m_curr_packet_in->getCCThreshold();
|
m_cc_threshold = m_curr_packet_in->getCCThreshold();
|
||||||
m_curr_spec_depth = m_curr_packet_in->getCurrSpecDepth();
|
m_curr_spec_depth = m_curr_packet_in->getCurrSpecDepth();
|
||||||
|
/* put a trans marker in stack if started in trans state */
|
||||||
|
if (m_trace_info.bits.in_trans_state)
|
||||||
|
m_P0_stack.createParamElemNoParam(P0_TRANS_TRACE_INIT, false, m_curr_packet_in->getType(), m_index_curr_pkt);
|
||||||
|
|
||||||
// elements associated with data trace
|
// elements associated with data trace
|
||||||
#ifdef DATA_TRACE_SUPPORTED
|
#ifdef DATA_TRACE_SUPPORTED
|
||||||
@ -592,14 +671,18 @@ ocsd_datapath_resp_t TrcPktDecodeEtmV4I::resolveElements()
|
|||||||
if (m_elem_res.P0_commit)
|
if (m_elem_res.P0_commit)
|
||||||
err = commitElements();
|
err = commitElements();
|
||||||
|
|
||||||
if (!err && m_elem_res.P0_cancel)
|
// allow for early flush on context element
|
||||||
err = cancelElements();
|
if (!m_elem_res.P0_commit) {
|
||||||
|
|
||||||
if (!err && m_elem_res.mispredict)
|
if (!err && m_elem_res.P0_cancel)
|
||||||
err = mispredictAtom();
|
err = cancelElements();
|
||||||
|
|
||||||
if (!err && m_elem_res.discard)
|
if (!err && m_elem_res.mispredict)
|
||||||
err = discardElements();
|
err = mispredictAtom();
|
||||||
|
|
||||||
|
if (!err && m_elem_res.discard)
|
||||||
|
err = discardElements();
|
||||||
|
}
|
||||||
|
|
||||||
if (err != OCSD_OK)
|
if (err != OCSD_OK)
|
||||||
resp = OCSD_RESP_FATAL_INVALID_DATA;
|
resp = OCSD_RESP_FATAL_INVALID_DATA;
|
||||||
@ -634,10 +717,11 @@ ocsd_err_t TrcPktDecodeEtmV4I::commitElements()
|
|||||||
int num_commit_req = m_elem_res.P0_commit;
|
int num_commit_req = m_elem_res.P0_commit;
|
||||||
ocsd_trc_index_t err_idx = 0;
|
ocsd_trc_index_t err_idx = 0;
|
||||||
TrcStackElem *pElem = 0; // stacked element pointer
|
TrcStackElem *pElem = 0; // stacked element pointer
|
||||||
|
bool contextFlush = false;
|
||||||
|
|
||||||
err = m_out_elem.resetElemStack();
|
err = m_out_elem.resetElemStack();
|
||||||
|
|
||||||
while(m_elem_res.P0_commit && !err)
|
while(m_elem_res.P0_commit && !err && !contextFlush)
|
||||||
{
|
{
|
||||||
if (m_P0_stack.size() > 0)
|
if (m_P0_stack.size() > 0)
|
||||||
{
|
{
|
||||||
@ -646,7 +730,7 @@ ocsd_err_t TrcPktDecodeEtmV4I::commitElements()
|
|||||||
|
|
||||||
switch (pElem->getP0Type())
|
switch (pElem->getP0Type())
|
||||||
{
|
{
|
||||||
// indicates a trace restart - beginning of trace or discontinuiuty
|
// indicates a trace restart - beginning of trace or discontinuiuty
|
||||||
case P0_TRC_ON:
|
case P0_TRC_ON:
|
||||||
err = m_out_elem.addElemType(pElem->getRootIndex(), OCSD_GEN_TRC_ELEM_TRACE_ON);
|
err = m_out_elem.addElemType(pElem->getRootIndex(), OCSD_GEN_TRC_ELEM_TRACE_ON);
|
||||||
if (!err)
|
if (!err)
|
||||||
@ -661,7 +745,7 @@ ocsd_err_t TrcPktDecodeEtmV4I::commitElements()
|
|||||||
{
|
{
|
||||||
TrcStackElemAddr *pAddrElem = dynamic_cast<TrcStackElemAddr *>(pElem);
|
TrcStackElemAddr *pAddrElem = dynamic_cast<TrcStackElemAddr *>(pElem);
|
||||||
m_return_stack.clear_pop_pending(); // address removes the need to pop the indirect address target from the stack
|
m_return_stack.clear_pop_pending(); // address removes the need to pop the indirect address target from the stack
|
||||||
if(pAddrElem)
|
if (pAddrElem)
|
||||||
{
|
{
|
||||||
SetInstrInfoInAddrISA(pAddrElem->getAddr().val, pAddrElem->getAddr().isa);
|
SetInstrInfoInAddrISA(pAddrElem->getAddr().val, pAddrElem->getAddr().isa);
|
||||||
m_need_addr = false;
|
m_need_addr = false;
|
||||||
@ -672,15 +756,24 @@ ocsd_err_t TrcPktDecodeEtmV4I::commitElements()
|
|||||||
case P0_CTXT:
|
case P0_CTXT:
|
||||||
{
|
{
|
||||||
TrcStackElemCtxt *pCtxtElem = dynamic_cast<TrcStackElemCtxt *>(pElem);
|
TrcStackElemCtxt *pCtxtElem = dynamic_cast<TrcStackElemCtxt *>(pElem);
|
||||||
if(pCtxtElem)
|
if (pCtxtElem)
|
||||||
{
|
{
|
||||||
etmv4_context_t ctxt = pCtxtElem->getContext();
|
etmv4_context_t ctxt = pCtxtElem->getContext();
|
||||||
// check this is an updated context
|
// check this is an updated context
|
||||||
if(ctxt.updated)
|
if(ctxt.updated)
|
||||||
{
|
{
|
||||||
err = m_out_elem.addElem(pElem->getRootIndex());
|
err = m_out_elem.addElem(pElem->getRootIndex());
|
||||||
if (!err)
|
if (!err) {
|
||||||
updateContext(pCtxtElem, outElem());
|
updateContext(pCtxtElem, outElem());
|
||||||
|
|
||||||
|
// updated context - need to force this to be output to the client so correct memory
|
||||||
|
// context can be used.
|
||||||
|
contextFlush = true;
|
||||||
|
|
||||||
|
// invalidate memory accessor cacheing - force next memory access out to client to
|
||||||
|
// ensure that the correct memory context is in play when decoding subsequent atoms.
|
||||||
|
invalidateMemAccCache();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -693,11 +786,15 @@ ocsd_err_t TrcPktDecodeEtmV4I::commitElements()
|
|||||||
err = processTS_CC_EventElem(pElem);
|
err = processTS_CC_EventElem(pElem);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case P0_MARKER:
|
||||||
|
err = processMarkerElem(pElem);
|
||||||
|
break;
|
||||||
|
|
||||||
case P0_ATOM:
|
case P0_ATOM:
|
||||||
{
|
{
|
||||||
TrcStackElemAtom *pAtomElem = dynamic_cast<TrcStackElemAtom *>(pElem);
|
TrcStackElemAtom *pAtomElem = dynamic_cast<TrcStackElemAtom *>(pElem);
|
||||||
|
|
||||||
if(pAtomElem)
|
if (pAtomElem)
|
||||||
{
|
{
|
||||||
while(!pAtomElem->isEmpty() && m_elem_res.P0_commit && !err)
|
while(!pAtomElem->isEmpty() && m_elem_res.P0_commit && !err)
|
||||||
{
|
{
|
||||||
@ -709,13 +806,13 @@ ocsd_err_t TrcPktDecodeEtmV4I::commitElements()
|
|||||||
|
|
||||||
// if address and context do instruction trace follower.
|
// if address and context do instruction trace follower.
|
||||||
// otherwise skip atom and reduce committed elements
|
// otherwise skip atom and reduce committed elements
|
||||||
if(!m_need_ctxt && !m_need_addr)
|
if (!m_need_ctxt && !m_need_addr)
|
||||||
{
|
{
|
||||||
err = processAtom(atom);
|
err = processAtom(atom);
|
||||||
}
|
}
|
||||||
m_elem_res.P0_commit--; // mark committed
|
m_elem_res.P0_commit--; // mark committed
|
||||||
}
|
}
|
||||||
if(!pAtomElem->isEmpty())
|
if (!pAtomElem->isEmpty())
|
||||||
bPopElem = false; // don't remove if still atoms to process.
|
bPopElem = false; // don't remove if still atoms to process.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -746,9 +843,27 @@ ocsd_err_t TrcPktDecodeEtmV4I::commitElements()
|
|||||||
m_elem_res.P0_commit--;
|
m_elem_res.P0_commit--;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case P0_SRC_ADDR:
|
||||||
|
err = processSourceAddress();
|
||||||
|
m_elem_res.P0_commit--;
|
||||||
|
break;
|
||||||
|
|
||||||
case P0_Q:
|
case P0_Q:
|
||||||
err = processQElement();
|
err = processQElement();
|
||||||
m_elem_res.P0_commit--;
|
m_elem_res.P0_commit--;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case P0_TRANS_START:
|
||||||
|
if (m_config->commTransP0())
|
||||||
|
m_elem_res.P0_commit--;
|
||||||
|
case P0_TRANS_COMMIT:
|
||||||
|
case P0_TRANS_FAIL:
|
||||||
|
case P0_TRANS_TRACE_INIT:
|
||||||
|
err = processTransElem(pElem);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case P0_ITE:
|
||||||
|
err = processITEElem(pElem);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -758,8 +873,7 @@ ocsd_err_t TrcPktDecodeEtmV4I::commitElements()
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
// too few elements for commit operation - decode error.
|
// too few elements for commit operation - decode error.
|
||||||
err = OCSD_ERR_COMMIT_PKT_OVERRUN;
|
err = handlePacketSeqErr(OCSD_ERR_COMMIT_PKT_OVERRUN, err_idx, "Not enough elements to commit");
|
||||||
LogError(ocsdError(OCSD_ERR_SEV_ERROR,OCSD_ERR_COMMIT_PKT_OVERRUN,err_idx,m_CSID,"Not enough elements to commit"));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -779,7 +893,7 @@ ocsd_err_t TrcPktDecodeEtmV4I::returnStackPop()
|
|||||||
if (m_return_stack.overflow())
|
if (m_return_stack.overflow())
|
||||||
{
|
{
|
||||||
err = OCSD_ERR_RET_STACK_OVERFLOW;
|
err = OCSD_ERR_RET_STACK_OVERFLOW;
|
||||||
LogError(ocsdError(OCSD_ERR_SEV_ERROR, err, "Trace Return Stack Overflow."));
|
err = handlePacketSeqErr(err, OCSD_BAD_TRC_INDEX, "Trace Return Stack Overflow.");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -824,6 +938,25 @@ ocsd_err_t TrcPktDecodeEtmV4I::commitElemOnEOT()
|
|||||||
case P0_CTXT:
|
case P0_CTXT:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
// trans
|
||||||
|
// P0 trans - clear and stop, otherwise skip
|
||||||
|
case P0_TRANS_START:
|
||||||
|
if (m_config->commTransP0())
|
||||||
|
m_P0_stack.delete_all();
|
||||||
|
break;
|
||||||
|
|
||||||
|
// non-speculative trans fail / commit - could appear at EoT after valid trace
|
||||||
|
// but without a subsequent P0 that would force output.
|
||||||
|
case P0_TRANS_FAIL:
|
||||||
|
case P0_TRANS_COMMIT:
|
||||||
|
if (m_max_spec_depth == 0 || m_curr_spec_depth == 0)
|
||||||
|
err = processTransElem(pElem);
|
||||||
|
break;
|
||||||
|
|
||||||
|
// others - skip non P0
|
||||||
|
case P0_TRANS_TRACE_INIT:
|
||||||
|
break;
|
||||||
|
|
||||||
// output
|
// output
|
||||||
case P0_EVENT:
|
case P0_EVENT:
|
||||||
case P0_TS:
|
case P0_TS:
|
||||||
@ -831,6 +964,14 @@ ocsd_err_t TrcPktDecodeEtmV4I::commitElemOnEOT()
|
|||||||
case P0_TS_CC:
|
case P0_TS_CC:
|
||||||
err = processTS_CC_EventElem(pElem);
|
err = processTS_CC_EventElem(pElem);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case P0_MARKER:
|
||||||
|
err = processMarkerElem(pElem);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case P0_ITE:
|
||||||
|
err = processITEElem(pElem);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
m_P0_stack.delete_back();
|
m_P0_stack.delete_back();
|
||||||
}
|
}
|
||||||
@ -886,6 +1027,8 @@ ocsd_err_t TrcPktDecodeEtmV4I::cancelElements()
|
|||||||
case P0_TS:
|
case P0_TS:
|
||||||
case P0_CC:
|
case P0_CC:
|
||||||
case P0_TS_CC:
|
case P0_TS_CC:
|
||||||
|
case P0_MARKER:
|
||||||
|
case P0_ITE:
|
||||||
m_P0_stack.pop_front(false);
|
m_P0_stack.pop_front(false);
|
||||||
temp.push_back(pElem);
|
temp.push_back(pElem);
|
||||||
break;
|
break;
|
||||||
@ -895,6 +1038,8 @@ ocsd_err_t TrcPktDecodeEtmV4I::cancelElements()
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (m_P0_stack.size() == 0)
|
||||||
|
P0StackDone = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// may have some unseen elements
|
// may have some unseen elements
|
||||||
@ -908,21 +1053,23 @@ ocsd_err_t TrcPktDecodeEtmV4I::cancelElements()
|
|||||||
{
|
{
|
||||||
// too few elements for commit operation - decode error.
|
// too few elements for commit operation - decode error.
|
||||||
err = OCSD_ERR_COMMIT_PKT_OVERRUN;
|
err = OCSD_ERR_COMMIT_PKT_OVERRUN;
|
||||||
LogError(ocsdError(OCSD_ERR_SEV_ERROR, err, m_index_curr_pkt, m_CSID, "Not enough elements to cancel"));
|
err = handlePacketSeqErr(err, m_index_curr_pkt, "Not enough elements to cancel");
|
||||||
m_elem_res.P0_cancel = 0;
|
m_elem_res.P0_cancel = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (temp.size())
|
/* restore any saved elements that are unaffected by cancel. */
|
||||||
|
if (temp.size())
|
||||||
|
{
|
||||||
|
while (temp.size())
|
||||||
{
|
{
|
||||||
while (temp.size())
|
pElem = temp.back();
|
||||||
{
|
m_P0_stack.push_front(pElem);
|
||||||
pElem = temp.back();
|
temp.pop_back(false);
|
||||||
m_P0_stack.push_front(pElem);
|
|
||||||
temp.pop_back(false);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
m_curr_spec_depth -= num_cancel_req - m_elem_res.P0_cancel;
|
m_curr_spec_depth -= num_cancel_req - m_elem_res.P0_cancel;
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
@ -964,7 +1111,8 @@ ocsd_err_t TrcPktDecodeEtmV4I::mispredictAtom()
|
|||||||
if (!bFoundAtom && !m_unseen_spec_elem)
|
if (!bFoundAtom && !m_unseen_spec_elem)
|
||||||
{
|
{
|
||||||
err = OCSD_ERR_COMMIT_PKT_OVERRUN;
|
err = OCSD_ERR_COMMIT_PKT_OVERRUN;
|
||||||
LogError(ocsdError(OCSD_ERR_SEV_ERROR, err, m_index_curr_pkt, m_CSID, "Not found mispredict atom"));
|
err = handlePacketSeqErr(err, m_index_curr_pkt, "Not found mispredict atom");
|
||||||
|
//LogError(ocsdError(OCSD_ERR_SEV_ERROR, err, m_index_curr_pkt, m_CSID, "Not found mispredict atom"));
|
||||||
}
|
}
|
||||||
m_elem_res.mispredict = false;
|
m_elem_res.mispredict = false;
|
||||||
return err;
|
return err;
|
||||||
@ -980,7 +1128,12 @@ ocsd_err_t TrcPktDecodeEtmV4I::discardElements()
|
|||||||
while ((m_P0_stack.size() > 0) && !err)
|
while ((m_P0_stack.size() > 0) && !err)
|
||||||
{
|
{
|
||||||
pElem = m_P0_stack.back();
|
pElem = m_P0_stack.back();
|
||||||
err = processTS_CC_EventElem(pElem);
|
if (pElem->getP0Type() == P0_MARKER)
|
||||||
|
err = processMarkerElem(pElem);
|
||||||
|
else if (pElem->getP0Type() == P0_MARKER)
|
||||||
|
err = processITEElem(pElem);
|
||||||
|
else
|
||||||
|
err = processTS_CC_EventElem(pElem);
|
||||||
m_P0_stack.delete_back();
|
m_P0_stack.delete_back();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1002,6 +1155,8 @@ ocsd_err_t TrcPktDecodeEtmV4I::discardElements()
|
|||||||
ocsd_err_t TrcPktDecodeEtmV4I::processTS_CC_EventElem(TrcStackElem *pElem)
|
ocsd_err_t TrcPktDecodeEtmV4I::processTS_CC_EventElem(TrcStackElem *pElem)
|
||||||
{
|
{
|
||||||
ocsd_err_t err = OCSD_OK;
|
ocsd_err_t err = OCSD_OK;
|
||||||
|
// ignore ts for ETE if not seen first TS marker on systems that use this.
|
||||||
|
bool bPermitTS = !m_config->eteHasTSMarker() || m_ete_first_ts_marker;
|
||||||
|
|
||||||
switch (pElem->getP0Type())
|
switch (pElem->getP0Type())
|
||||||
{
|
{
|
||||||
@ -1016,7 +1171,7 @@ ocsd_err_t TrcPktDecodeEtmV4I::processTS_CC_EventElem(TrcStackElem *pElem)
|
|||||||
case P0_TS:
|
case P0_TS:
|
||||||
{
|
{
|
||||||
TrcStackElemParam *pParamElem = dynamic_cast<TrcStackElemParam *>(pElem);
|
TrcStackElemParam *pParamElem = dynamic_cast<TrcStackElemParam *>(pElem);
|
||||||
if (pParamElem)
|
if (pParamElem && bPermitTS)
|
||||||
err = addElemTS(pParamElem, false);
|
err = addElemTS(pParamElem, false);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -1032,7 +1187,7 @@ ocsd_err_t TrcPktDecodeEtmV4I::processTS_CC_EventElem(TrcStackElem *pElem)
|
|||||||
case P0_TS_CC:
|
case P0_TS_CC:
|
||||||
{
|
{
|
||||||
TrcStackElemParam *pParamElem = dynamic_cast<TrcStackElemParam *>(pElem);
|
TrcStackElemParam *pParamElem = dynamic_cast<TrcStackElemParam *>(pElem);
|
||||||
if (pParamElem)
|
if (pParamElem && bPermitTS)
|
||||||
err = addElemTS(pParamElem, true);
|
err = addElemTS(pParamElem, true);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -1041,6 +1196,46 @@ ocsd_err_t TrcPktDecodeEtmV4I::processTS_CC_EventElem(TrcStackElem *pElem)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ocsd_err_t TrcPktDecodeEtmV4I::processMarkerElem(TrcStackElem *pElem)
|
||||||
|
{
|
||||||
|
ocsd_err_t err = OCSD_OK;
|
||||||
|
TrcStackElemMarker *pMarkerElem = dynamic_cast<TrcStackElemMarker *>(pElem);
|
||||||
|
|
||||||
|
if (m_config->eteHasTSMarker() && (pMarkerElem->getMarker().type == ELEM_MARKER_TS))
|
||||||
|
m_ete_first_ts_marker = true;
|
||||||
|
|
||||||
|
if (!err)
|
||||||
|
{
|
||||||
|
err = m_out_elem.addElemType(pElem->getRootIndex(), OCSD_GEN_TRC_ELEM_SYNC_MARKER);
|
||||||
|
if (!err)
|
||||||
|
m_out_elem.getCurrElem().setSyncMarker(pMarkerElem->getMarker());
|
||||||
|
}
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
ocsd_err_t TrcPktDecodeEtmV4I::processTransElem(TrcStackElem *pElem)
|
||||||
|
{
|
||||||
|
ocsd_err_t err = m_out_elem.addElemType(pElem->getRootIndex(), OCSD_GEN_TRC_ELEM_MEMTRANS);
|
||||||
|
if (!err)
|
||||||
|
{
|
||||||
|
outElem().setTransactionType((trace_memtrans_t)((int)OCSD_MEM_TRANS_FAIL -
|
||||||
|
((int)P0_TRANS_FAIL - (int)pElem->getP0Type())));
|
||||||
|
}
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
ocsd_err_t TrcPktDecodeEtmV4I::processITEElem(TrcStackElem *pElem)
|
||||||
|
{
|
||||||
|
ocsd_err_t err = OCSD_OK;
|
||||||
|
TrcStackElemITE *pITEElem = dynamic_cast<TrcStackElemITE *>(pElem);
|
||||||
|
|
||||||
|
err = m_out_elem.addElemType(pElem->getRootIndex(), OCSD_GEN_TRC_ELEM_INSTRUMENTATION);
|
||||||
|
if (!err) {
|
||||||
|
outElem().setITEInfo(pITEElem->getITE());
|
||||||
|
}
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
ocsd_err_t TrcPktDecodeEtmV4I::addElemCC(TrcStackElemParam *pParamElem)
|
ocsd_err_t TrcPktDecodeEtmV4I::addElemCC(TrcStackElemParam *pParamElem)
|
||||||
{
|
{
|
||||||
ocsd_err_t err = OCSD_OK;
|
ocsd_err_t err = OCSD_OK;
|
||||||
@ -1079,15 +1274,21 @@ ocsd_err_t TrcPktDecodeEtmV4I::addElemEvent(TrcStackElemParam *pParamElem)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void TrcPktDecodeEtmV4I::setElemTraceRange(OcsdTraceElement &elemIn, const instr_range_t &addr_range,
|
void TrcPktDecodeEtmV4I::setElemTraceRange(OcsdTraceElement &elemIn, const instr_range_t &addr_range,
|
||||||
const bool executed, ocsd_trc_index_t index)
|
const bool executed, ocsd_trc_index_t index)
|
||||||
|
{
|
||||||
|
setElemTraceRangeInstr(elemIn, addr_range, executed, index, m_instr_info);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TrcPktDecodeEtmV4I::setElemTraceRangeInstr(OcsdTraceElement &elemIn, const instr_range_t &addr_range,
|
||||||
|
const bool executed, ocsd_trc_index_t index, ocsd_instr_info &instr)
|
||||||
{
|
{
|
||||||
elemIn.setType(OCSD_GEN_TRC_ELEM_INSTR_RANGE);
|
elemIn.setType(OCSD_GEN_TRC_ELEM_INSTR_RANGE);
|
||||||
elemIn.setLastInstrInfo(executed, m_instr_info.type, m_instr_info.sub_type, m_instr_info.instr_size);
|
elemIn.setLastInstrInfo(executed, instr.type, instr.sub_type, instr.instr_size);
|
||||||
elemIn.setISA(m_instr_info.isa);
|
elemIn.setISA(instr.isa);
|
||||||
elemIn.setLastInstrCond(m_instr_info.is_conditional);
|
elemIn.setLastInstrCond(instr.is_conditional);
|
||||||
elemIn.setAddrRange(addr_range.st_addr, addr_range.en_addr, addr_range.num_instr);
|
elemIn.setAddrRange(addr_range.st_addr, addr_range.en_addr, addr_range.num_instr);
|
||||||
if (executed)
|
if (executed)
|
||||||
m_instr_info.isa = m_instr_info.next_isa;
|
instr.isa = instr.next_isa;
|
||||||
}
|
}
|
||||||
|
|
||||||
ocsd_err_t TrcPktDecodeEtmV4I::processAtom(const ocsd_atm_val atom)
|
ocsd_err_t TrcPktDecodeEtmV4I::processAtom(const ocsd_atm_val atom)
|
||||||
@ -1096,6 +1297,7 @@ ocsd_err_t TrcPktDecodeEtmV4I::processAtom(const ocsd_atm_val atom)
|
|||||||
TrcStackElem *pElem = m_P0_stack.back(); // get the atom element
|
TrcStackElem *pElem = m_P0_stack.back(); // get the atom element
|
||||||
WP_res_t WPRes;
|
WP_res_t WPRes;
|
||||||
instr_range_t addr_range;
|
instr_range_t addr_range;
|
||||||
|
bool ETE_ERET = false;
|
||||||
|
|
||||||
// new element for this processed atom
|
// new element for this processed atom
|
||||||
if ((err = m_out_elem.addElem(pElem->getRootIndex())) != OCSD_OK)
|
if ((err = m_out_elem.addElem(pElem->getRootIndex())) != OCSD_OK)
|
||||||
@ -1114,7 +1316,8 @@ ocsd_err_t TrcPktDecodeEtmV4I::processAtom(const ocsd_atm_val atom)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
LogError(ocsdError(OCSD_ERR_SEV_ERROR,err,pElem->getRootIndex(),m_CSID,"Error processing atom packet."));
|
err = handlePacketSeqErr(err, pElem->getRootIndex(), "Error processing atom packet.");
|
||||||
|
//LogError(ocsdError(OCSD_ERR_SEV_ERROR,err,pElem->getRootIndex(),m_CSID,"Error processing atom packet."));
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1144,10 +1347,22 @@ ocsd_err_t TrcPktDecodeEtmV4I::processAtom(const ocsd_atm_val atom)
|
|||||||
if (m_instr_info.is_link)
|
if (m_instr_info.is_link)
|
||||||
m_return_stack.push(nextAddr,m_instr_info.isa);
|
m_return_stack.push(nextAddr,m_instr_info.isa);
|
||||||
m_return_stack.set_pop_pending(); // need to know next packet before we know what is to happen
|
m_return_stack.set_pop_pending(); // need to know next packet before we know what is to happen
|
||||||
|
|
||||||
|
/* ETE does not have ERET trace packets - however to maintain the illusion if we see an ERET
|
||||||
|
output a gen elem ERET packet */
|
||||||
|
if (isETEConfig() && (m_instr_info.sub_type == OCSD_S_INSTR_V8_ERET))
|
||||||
|
ETE_ERET = true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
setElemTraceRange(outElem(), addr_range, (atom == ATOM_E), pElem->getRootIndex());
|
setElemTraceRange(outElem(), addr_range, (atom == ATOM_E), pElem->getRootIndex());
|
||||||
|
|
||||||
|
if (ETE_ERET)
|
||||||
|
{
|
||||||
|
err = m_out_elem.addElemType(pElem->getRootIndex(), OCSD_GEN_TRC_ELEM_EXCEPTION_RET);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -1182,53 +1397,62 @@ ocsd_err_t TrcPktDecodeEtmV4I::processException()
|
|||||||
TrcStackElemAddr *pAddressElem = 0;
|
TrcStackElemAddr *pAddressElem = 0;
|
||||||
TrcStackElemCtxt *pCtxtElem = 0;
|
TrcStackElemCtxt *pCtxtElem = 0;
|
||||||
bool branch_target = false; // exception address implies prior branch target address
|
bool branch_target = false; // exception address implies prior branch target address
|
||||||
ocsd_vaddr_t excep_ret_addr;
|
ocsd_vaddr_t excep_ret_addr = 0;
|
||||||
ocsd_trc_index_t excep_pkt_index;
|
ocsd_trc_index_t excep_pkt_index;
|
||||||
WP_res_t WPRes = WP_NOT_FOUND;
|
WP_res_t WPRes = WP_NOT_FOUND;
|
||||||
|
bool ETE_resetPkt = false;
|
||||||
|
|
||||||
// grab the exception element off the stack
|
// grab the exception element off the stack
|
||||||
pExceptElem = dynamic_cast<TrcStackElemExcept *>(m_P0_stack.back()); // get the exception element
|
pExceptElem = dynamic_cast<TrcStackElemExcept *>(m_P0_stack.back()); // get the exception element
|
||||||
excep_pkt_index = pExceptElem->getRootIndex();
|
excep_pkt_index = pExceptElem->getRootIndex();
|
||||||
branch_target = pExceptElem->getPrevSame();
|
branch_target = pExceptElem->getPrevSame();
|
||||||
|
if (pExceptElem->getRootPkt() == ETE_PKT_I_PE_RESET)
|
||||||
|
ETE_resetPkt = true;
|
||||||
m_P0_stack.pop_back(); // remove the exception element
|
m_P0_stack.pop_back(); // remove the exception element
|
||||||
|
|
||||||
pElem = m_P0_stack.back(); // look at next element.
|
// ETE reset has no follow up address, the rest of the exceptions do....
|
||||||
if(pElem->getP0Type() == P0_CTXT)
|
if (!ETE_resetPkt)
|
||||||
{
|
{
|
||||||
pCtxtElem = dynamic_cast<TrcStackElemCtxt *>(pElem);
|
pElem = m_P0_stack.back(); // look at next element.
|
||||||
m_P0_stack.pop_back(); // remove the context element
|
if (pElem->getP0Type() == P0_CTXT)
|
||||||
pElem = m_P0_stack.back(); // next one should be an address element
|
|
||||||
}
|
|
||||||
|
|
||||||
if(pElem->getP0Type() != P0_ADDR)
|
|
||||||
{
|
|
||||||
// no following address element - indicate processing error.
|
|
||||||
LogError(ocsdError(OCSD_ERR_SEV_ERROR,OCSD_ERR_BAD_PACKET_SEQ, excep_pkt_index,m_CSID,"Address missing in exception packet."));
|
|
||||||
return OCSD_ERR_BAD_PACKET_SEQ;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// extract address
|
|
||||||
pAddressElem = static_cast<TrcStackElemAddr *>(pElem);
|
|
||||||
excep_ret_addr = pAddressElem->getAddr().val;
|
|
||||||
|
|
||||||
// see if there is an address + optional context element implied
|
|
||||||
// prior to the exception.
|
|
||||||
if (branch_target)
|
|
||||||
{
|
{
|
||||||
// this was a branch target address - update current setting
|
pCtxtElem = dynamic_cast<TrcStackElemCtxt *>(pElem);
|
||||||
bool b64bit = m_instr_info.isa == ocsd_isa_aarch64;
|
m_P0_stack.pop_back(); // remove the context element
|
||||||
if (pCtxtElem) {
|
pElem = m_P0_stack.back(); // next one should be an address element
|
||||||
b64bit = pCtxtElem->getContext().SF;
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// as the exception address was also a branch target address then update the
|
if (pElem->getP0Type() != P0_ADDR)
|
||||||
// current maintained address value. This also means that there is no range to
|
{
|
||||||
// output before the exception packet.
|
// no following address element - indicate processing error.
|
||||||
m_instr_info.instr_addr = excep_ret_addr;
|
|
||||||
m_instr_info.isa = (pAddressElem->getAddr().isa == 0) ?
|
err = handlePacketSeqErr(OCSD_ERR_BAD_PACKET_SEQ, m_index_curr_pkt, "Address missing in exception packet.");
|
||||||
|
//LogError(ocsdError(OCSD_ERR_SEV_ERROR, OCSD_ERR_BAD_PACKET_SEQ, excep_pkt_index, m_CSID, "Address missing in exception packet."));
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// extract address
|
||||||
|
pAddressElem = static_cast<TrcStackElemAddr *>(pElem);
|
||||||
|
excep_ret_addr = pAddressElem->getAddr().val;
|
||||||
|
|
||||||
|
// see if there is an address + optional context element implied
|
||||||
|
// prior to the exception.
|
||||||
|
if (branch_target)
|
||||||
|
{
|
||||||
|
// this was a branch target address - update current setting
|
||||||
|
bool b64bit = m_instr_info.isa == ocsd_isa_aarch64;
|
||||||
|
if (pCtxtElem) {
|
||||||
|
b64bit = pCtxtElem->getContext().SF;
|
||||||
|
}
|
||||||
|
|
||||||
|
// as the exception address was also a branch target address then update the
|
||||||
|
// current maintained address value. This also means that there is no range to
|
||||||
|
// output before the exception packet.
|
||||||
|
m_instr_info.instr_addr = excep_ret_addr;
|
||||||
|
m_instr_info.isa = (pAddressElem->getAddr().isa == 0) ?
|
||||||
(b64bit ? ocsd_isa_aarch64 : ocsd_isa_arm) : ocsd_isa_thumb2;
|
(b64bit ? ocsd_isa_aarch64 : ocsd_isa_arm) : ocsd_isa_thumb2;
|
||||||
m_need_addr = false;
|
m_need_addr = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1246,69 +1470,72 @@ ocsd_err_t TrcPktDecodeEtmV4I::processException()
|
|||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
// if the preferred return address is not the end of the last output range...
|
if (!ETE_resetPkt)
|
||||||
if (m_instr_info.instr_addr != excep_ret_addr)
|
|
||||||
{
|
{
|
||||||
bool range_out = false;
|
// if the preferred return address is not the end of the last output range...
|
||||||
instr_range_t addr_range;
|
if (m_instr_info.instr_addr != excep_ret_addr)
|
||||||
|
|
||||||
// look for match to return address.
|
|
||||||
err = traceInstrToWP(addr_range, WPRes, true, excep_ret_addr);
|
|
||||||
|
|
||||||
if(err != OCSD_OK)
|
|
||||||
{
|
{
|
||||||
if(err == OCSD_ERR_UNSUPPORTED_ISA)
|
bool range_out = false;
|
||||||
|
instr_range_t addr_range;
|
||||||
|
|
||||||
|
// look for match to return address.
|
||||||
|
err = traceInstrToWP(addr_range, WPRes, true, excep_ret_addr);
|
||||||
|
|
||||||
|
if (err != OCSD_OK)
|
||||||
{
|
{
|
||||||
m_need_addr = true;
|
if (err == OCSD_ERR_UNSUPPORTED_ISA)
|
||||||
m_need_ctxt = true;
|
{
|
||||||
LogError(ocsdError(OCSD_ERR_SEV_WARN,err, excep_pkt_index,m_CSID,"Warning: unsupported instruction set processing exception packet."));
|
m_need_addr = true;
|
||||||
|
m_need_ctxt = true;
|
||||||
|
LogError(ocsdError(OCSD_ERR_SEV_WARN, err, excep_pkt_index, m_CSID, "Warning: unsupported instruction set processing exception packet."));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LogError(ocsdError(OCSD_ERR_SEV_ERROR, err, excep_pkt_index, m_CSID, "Error processing exception packet."));
|
||||||
|
}
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
LogError(ocsdError(OCSD_ERR_SEV_ERROR,err, excep_pkt_index,m_CSID,"Error processing exception packet."));
|
|
||||||
}
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(WPFound(WPRes))
|
if (WPFound(WPRes))
|
||||||
{
|
|
||||||
// waypoint address found - output range
|
|
||||||
setElemTraceRange(outElem(), addr_range, true, excep_pkt_index);
|
|
||||||
range_out = true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// no waypoint - likely inaccessible memory range.
|
|
||||||
m_need_addr = true; // need an address update
|
|
||||||
|
|
||||||
if(addr_range.st_addr != addr_range.en_addr)
|
|
||||||
{
|
{
|
||||||
// some trace before we were out of memory access range
|
// waypoint address found - output range
|
||||||
setElemTraceRange(outElem(), addr_range, true, excep_pkt_index);
|
setElemTraceRange(outElem(), addr_range, true, excep_pkt_index);
|
||||||
range_out = true;
|
range_out = true;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// no waypoint - likely inaccessible memory range.
|
||||||
|
m_need_addr = true; // need an address update
|
||||||
|
|
||||||
|
if (addr_range.st_addr != addr_range.en_addr)
|
||||||
|
{
|
||||||
|
// some trace before we were out of memory access range
|
||||||
|
setElemTraceRange(outElem(), addr_range, true, excep_pkt_index);
|
||||||
|
range_out = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// used the element need another for NACC or EXCEP.
|
||||||
|
if (range_out)
|
||||||
|
{
|
||||||
|
if ((err = m_out_elem.addElem(excep_pkt_index)))
|
||||||
|
return err;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// used the element need another for NACC or EXCEP.
|
// watchpoint walk resulted in inaccessible memory call...
|
||||||
if (range_out)
|
if (WPNacc(WPRes))
|
||||||
{
|
{
|
||||||
|
|
||||||
|
outElem().setType(OCSD_GEN_TRC_ELEM_ADDR_NACC);
|
||||||
|
outElem().st_addr = m_instr_info.instr_addr;
|
||||||
|
|
||||||
|
// used the element - need another for the final exception packet.
|
||||||
if ((err = m_out_elem.addElem(excep_pkt_index)))
|
if ((err = m_out_elem.addElem(excep_pkt_index)))
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// watchpoint walk resulted in inaccessible memory call...
|
|
||||||
if (WPNacc(WPRes))
|
|
||||||
{
|
|
||||||
|
|
||||||
outElem().setType(OCSD_GEN_TRC_ELEM_ADDR_NACC);
|
|
||||||
outElem().st_addr = m_instr_info.instr_addr;
|
|
||||||
|
|
||||||
// used the element - need another for the final exception packet.
|
|
||||||
if ((err = m_out_elem.addElem(excep_pkt_index)))
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
// output exception element.
|
// output exception element.
|
||||||
outElem().setType(OCSD_GEN_TRC_ELEM_EXCEPTION);
|
outElem().setType(OCSD_GEN_TRC_ELEM_EXCEPTION);
|
||||||
|
|
||||||
@ -1453,6 +1680,163 @@ ocsd_err_t TrcPktDecodeEtmV4I::processQElement()
|
|||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ocsd_err_t TrcPktDecodeEtmV4I::processSourceAddress()
|
||||||
|
{
|
||||||
|
ocsd_err_t err = OCSD_OK;
|
||||||
|
TrcStackElemAddr *pElem = dynamic_cast<TrcStackElemAddr *>(m_P0_stack.back()); // get the address element
|
||||||
|
etmv4_addr_val_t srcAddr = pElem->getAddr();
|
||||||
|
uint32_t opcode, bytesReq = 4;
|
||||||
|
ocsd_vaddr_t currAddr = m_instr_info.instr_addr; // get the latest decoded address.
|
||||||
|
instr_range_t out_range;
|
||||||
|
bool bSplitRangeOnN = getComponentOpMode() & ETE_OPFLG_PKTDEC_SRCADDR_N_ATOMS ? true : false;
|
||||||
|
|
||||||
|
// check we can read instruction @ source address
|
||||||
|
err = accessMemory(srcAddr.val, getCurrMemSpace(), &bytesReq, (uint8_t *)&opcode);
|
||||||
|
if (err != OCSD_OK)
|
||||||
|
{
|
||||||
|
LogError(ocsdError(OCSD_ERR_SEV_ERROR, err, pElem->getRootIndex(), m_CSID, "Mem access error processing source address packet."));
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bytesReq != 4)
|
||||||
|
{
|
||||||
|
// can't access - no bytes returned - output nacc.
|
||||||
|
err = m_out_elem.addElemType(pElem->getRootIndex(), OCSD_GEN_TRC_ELEM_ADDR_NACC);
|
||||||
|
outElem().setAddrStart(srcAddr.val);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
// analyze opcode @ source address.
|
||||||
|
m_instr_info.opcode = opcode;
|
||||||
|
m_instr_info.instr_addr = srcAddr.val;
|
||||||
|
err = instrDecode(&m_instr_info);
|
||||||
|
if (err != OCSD_OK)
|
||||||
|
{
|
||||||
|
LogError(ocsdError(OCSD_ERR_SEV_ERROR, err, pElem->getRootIndex(), m_CSID, "Instruction decode error processing source address packet."));
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
m_instr_info.instr_addr += m_instr_info.instr_size;
|
||||||
|
|
||||||
|
// initial instruction count for the range.
|
||||||
|
out_range.num_instr = 1;
|
||||||
|
|
||||||
|
// calculate range traced...
|
||||||
|
if (m_need_addr || (currAddr > srcAddr.val))
|
||||||
|
{
|
||||||
|
// we were waiting for a target address, or missing trace
|
||||||
|
// that indicates how we got to the source address.
|
||||||
|
m_need_addr = false;
|
||||||
|
out_range.st_addr = srcAddr.val;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
out_range.st_addr = currAddr;
|
||||||
|
out_range.en_addr = m_instr_info.instr_addr;
|
||||||
|
|
||||||
|
// count instructions
|
||||||
|
if (out_range.en_addr - out_range.st_addr > m_instr_info.instr_size)
|
||||||
|
{
|
||||||
|
if ((m_instr_info.isa != ocsd_isa_thumb2) && !bSplitRangeOnN)
|
||||||
|
{
|
||||||
|
// all 4 byte instructions - just calculate...
|
||||||
|
out_range.num_instr = (uint32_t)(out_range.en_addr - out_range.st_addr) / 4;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// need to count T32 - 2 or 4 byte instructions or we are spotting N atoms
|
||||||
|
ocsd_instr_info instr; // going back to start of range so make a copy of info.
|
||||||
|
bool bMemAccErr = false;
|
||||||
|
|
||||||
|
instr.instr_addr = out_range.st_addr;
|
||||||
|
instr.isa = m_instr_info.isa;
|
||||||
|
instr.pe_type = m_instr_info.pe_type;
|
||||||
|
instr.dsb_dmb_waypoints = m_instr_info.dsb_dmb_waypoints;
|
||||||
|
instr.wfi_wfe_branch = m_instr_info.wfi_wfe_branch;
|
||||||
|
out_range.num_instr = 0;
|
||||||
|
|
||||||
|
while ((instr.instr_addr < out_range.en_addr) && !bMemAccErr)
|
||||||
|
{
|
||||||
|
bytesReq = 4;
|
||||||
|
err = accessMemory(instr.instr_addr, getCurrMemSpace(), &bytesReq, (uint8_t *)&opcode);
|
||||||
|
if (err != OCSD_OK)
|
||||||
|
{
|
||||||
|
LogError(ocsdError(OCSD_ERR_SEV_ERROR, err, pElem->getRootIndex(), m_CSID, "Mem access error processing source address packet."));
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bytesReq == 4)
|
||||||
|
{
|
||||||
|
instr.opcode = opcode;
|
||||||
|
err = instrDecode(&instr);
|
||||||
|
if (err != OCSD_OK)
|
||||||
|
{
|
||||||
|
LogError(ocsdError(OCSD_ERR_SEV_ERROR, err, pElem->getRootIndex(), m_CSID, "Instruction decode error processing source address packet."));
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
instr.instr_addr += instr.instr_size;
|
||||||
|
out_range.num_instr++;
|
||||||
|
|
||||||
|
/* if we are doing N atom ranges ...*/
|
||||||
|
if (bSplitRangeOnN && (instr.instr_addr < out_range.en_addr))
|
||||||
|
{
|
||||||
|
if (instr.type != OCSD_INSTR_OTHER)
|
||||||
|
{
|
||||||
|
instr_range_t mid_range = out_range;
|
||||||
|
mid_range.en_addr = instr.instr_addr;
|
||||||
|
|
||||||
|
err = m_out_elem.addElem(pElem->getRootIndex());
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
setElemTraceRangeInstr(outElem(), mid_range, false, pElem->getRootIndex(), instr);
|
||||||
|
|
||||||
|
out_range.st_addr = mid_range.en_addr;
|
||||||
|
out_range.num_instr = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// something inaccessible between last and current...
|
||||||
|
bMemAccErr = true;
|
||||||
|
|
||||||
|
err = m_out_elem.addElemType(pElem->getRootIndex(), OCSD_GEN_TRC_ELEM_ADDR_NACC);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
outElem().setAddrStart(srcAddr.val);
|
||||||
|
|
||||||
|
// force range to the one instruction
|
||||||
|
out_range.num_instr = 1;
|
||||||
|
out_range.st_addr = srcAddr.val;
|
||||||
|
out_range.en_addr = m_instr_info.instr_addr; // instr after the decoded instruction @ srcAddr.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// got to the source address - output trace range, and instruction as E atom.
|
||||||
|
switch (m_instr_info.type)
|
||||||
|
{
|
||||||
|
case OCSD_INSTR_BR:
|
||||||
|
if (m_instr_info.is_link)
|
||||||
|
m_return_stack.push(m_instr_info.instr_addr, m_instr_info.isa);
|
||||||
|
m_instr_info.instr_addr = m_instr_info.branch_addr;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OCSD_INSTR_BR_INDIRECT:
|
||||||
|
m_need_addr = true; // indirect branch taken - need new address.
|
||||||
|
if (m_instr_info.is_link)
|
||||||
|
m_return_stack.push(m_instr_info.instr_addr, m_instr_info.isa);
|
||||||
|
m_return_stack.set_pop_pending(); // need to know next packet before we know what is to happen
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
m_instr_info.isa = m_instr_info.next_isa;
|
||||||
|
|
||||||
|
// set the trace range element.
|
||||||
|
m_out_elem.addElem(pElem->getRootIndex());
|
||||||
|
setElemTraceRange(outElem(), out_range, true, pElem->getRootIndex());
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
void TrcPktDecodeEtmV4I::SetInstrInfoInAddrISA(const ocsd_vaddr_t addr_val, const uint8_t isa)
|
void TrcPktDecodeEtmV4I::SetInstrInfoInAddrISA(const ocsd_vaddr_t addr_val, const uint8_t isa)
|
||||||
{
|
{
|
||||||
m_instr_info.instr_addr = addr_val;
|
m_instr_info.instr_addr = addr_val;
|
||||||
@ -1518,7 +1902,10 @@ void TrcPktDecodeEtmV4I::updateContext(TrcStackElemCtxt *pCtxtElem, OcsdTraceEle
|
|||||||
m_is_64bit = (ctxt.SF != 0);
|
m_is_64bit = (ctxt.SF != 0);
|
||||||
elem.context.bits64 = ctxt.SF;
|
elem.context.bits64 = ctxt.SF;
|
||||||
m_is_secure = (ctxt.NS == 0);
|
m_is_secure = (ctxt.NS == 0);
|
||||||
elem.context.security_level = ctxt.NS ? ocsd_sec_nonsecure : ocsd_sec_secure;
|
if (ctxt.NSE)
|
||||||
|
elem.context.security_level = ctxt.NS ? ocsd_sec_realm : ocsd_sec_root;
|
||||||
|
else
|
||||||
|
elem.context.security_level = ctxt.NS ? ocsd_sec_nonsecure : ocsd_sec_secure;
|
||||||
elem.context.exception_level = (ocsd_ex_level)ctxt.EL;
|
elem.context.exception_level = (ocsd_ex_level)ctxt.EL;
|
||||||
elem.context.el_valid = 1;
|
elem.context.el_valid = 1;
|
||||||
if(ctxt.updated_c)
|
if(ctxt.updated_c)
|
||||||
@ -1537,27 +1924,42 @@ void TrcPktDecodeEtmV4I::updateContext(TrcStackElemCtxt *pCtxtElem, OcsdTraceEle
|
|||||||
m_need_ctxt = false;
|
m_need_ctxt = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
ocsd_err_t TrcPktDecodeEtmV4I::handleBadPacket(const char *reason)
|
ocsd_err_t TrcPktDecodeEtmV4I::handleBadPacket(const char *reason, ocsd_trc_index_t index /* = OCSD_BAD_TRC_INDEX */)
|
||||||
{
|
{
|
||||||
ocsd_err_t err = OCSD_OK;
|
ocsd_err_severity_t sev = OCSD_ERR_SEV_WARN;
|
||||||
|
if (getComponentOpMode() & OCSD_OPFLG_PKTDEC_ERROR_BAD_PKTS)
|
||||||
|
sev = OCSD_ERR_SEV_ERROR;
|
||||||
|
|
||||||
if(getComponentOpMode() & OCSD_OPFLG_PKTDEC_ERROR_BAD_PKTS)
|
return handlePacketErr(OCSD_ERR_BAD_DECODE_PKT, sev, index, reason);
|
||||||
|
}
|
||||||
|
|
||||||
|
ocsd_err_t TrcPktDecodeEtmV4I::handlePacketSeqErr(ocsd_err_t err, ocsd_trc_index_t index, const char *reason)
|
||||||
|
{
|
||||||
|
return handlePacketErr(err, OCSD_ERR_SEV_ERROR, index, reason);
|
||||||
|
}
|
||||||
|
|
||||||
|
ocsd_err_t TrcPktDecodeEtmV4I::handlePacketErr(ocsd_err_t err, ocsd_err_severity_t sev, ocsd_trc_index_t index, const char *reason)
|
||||||
|
{
|
||||||
|
bool resetOnBadPackets = true;
|
||||||
|
|
||||||
|
if(getComponentOpMode() & OCSD_OPFLG_PKTDEC_HALT_BAD_PKTS)
|
||||||
|
resetOnBadPackets = false;
|
||||||
|
|
||||||
|
LogError(ocsdError(sev, err, index, getCoreSightTraceID(), reason));
|
||||||
|
|
||||||
|
if (resetOnBadPackets)
|
||||||
{
|
{
|
||||||
// error out - stop decoding
|
|
||||||
err = OCSD_ERR_BAD_DECODE_PKT;
|
|
||||||
LogError(ocsdError(OCSD_ERR_SEV_ERROR,err,reason));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
LogError(ocsdError(OCSD_ERR_SEV_WARN, OCSD_ERR_BAD_DECODE_PKT, reason));
|
|
||||||
// switch to unsync - clear decode state
|
// switch to unsync - clear decode state
|
||||||
resetDecoder();
|
resetDecoder();
|
||||||
m_curr_state = NO_SYNC;
|
m_curr_state = NO_SYNC;
|
||||||
m_unsync_eot_info = UNSYNC_BAD_PACKET;
|
m_unsync_eot_info = UNSYNC_BAD_PACKET;
|
||||||
|
err = OCSD_OK;
|
||||||
}
|
}
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
inline ocsd_mem_space_acc_t TrcPktDecodeEtmV4I::getCurrMemSpace()
|
inline ocsd_mem_space_acc_t TrcPktDecodeEtmV4I::getCurrMemSpace()
|
||||||
{
|
{
|
||||||
static ocsd_mem_space_acc_t SMemSpace[] = {
|
static ocsd_mem_space_acc_t SMemSpace[] = {
|
||||||
|
@ -38,6 +38,7 @@
|
|||||||
|
|
||||||
EtmV4ITrcPacket::EtmV4ITrcPacket()
|
EtmV4ITrcPacket::EtmV4ITrcPacket()
|
||||||
{
|
{
|
||||||
|
protocol_version = 0x42; // min protocol version.
|
||||||
}
|
}
|
||||||
|
|
||||||
EtmV4ITrcPacket::~EtmV4ITrcPacket()
|
EtmV4ITrcPacket::~EtmV4ITrcPacket()
|
||||||
@ -101,6 +102,8 @@ void EtmV4ITrcPacket::toString(std::string &str) const
|
|||||||
contextStr(ctxtStr);
|
contextStr(ctxtStr);
|
||||||
case ETM4_PKT_I_ADDR_L_32IS0:
|
case ETM4_PKT_I_ADDR_L_32IS0:
|
||||||
case ETM4_PKT_I_ADDR_L_32IS1:
|
case ETM4_PKT_I_ADDR_L_32IS1:
|
||||||
|
case ETE_PKT_I_SRC_ADDR_L_32IS0:
|
||||||
|
case ETE_PKT_I_SRC_ADDR_L_32IS1:
|
||||||
trcPrintableElem::getValStr(valStr, (v_addr.size == VA_64BIT) ? 64 : 32, v_addr.valid_bits, v_addr.val, true, (v_addr.pkt_bits < 32) ? v_addr.pkt_bits : 0);
|
trcPrintableElem::getValStr(valStr, (v_addr.size == VA_64BIT) ? 64 : 32, v_addr.valid_bits, v_addr.val, true, (v_addr.pkt_bits < 32) ? v_addr.pkt_bits : 0);
|
||||||
str += "; Addr=" + valStr + "; " + ctxtStr;
|
str += "; Addr=" + valStr + "; " + ctxtStr;
|
||||||
break;
|
break;
|
||||||
@ -110,6 +113,8 @@ void EtmV4ITrcPacket::toString(std::string &str) const
|
|||||||
contextStr(ctxtStr);
|
contextStr(ctxtStr);
|
||||||
case ETM4_PKT_I_ADDR_L_64IS0:
|
case ETM4_PKT_I_ADDR_L_64IS0:
|
||||||
case ETM4_PKT_I_ADDR_L_64IS1:
|
case ETM4_PKT_I_ADDR_L_64IS1:
|
||||||
|
case ETE_PKT_I_SRC_ADDR_L_64IS0:
|
||||||
|
case ETE_PKT_I_SRC_ADDR_L_64IS1:
|
||||||
trcPrintableElem::getValStr(valStr, (v_addr.size == VA_64BIT) ? 64 : 32, v_addr.valid_bits, v_addr.val, true, (v_addr.pkt_bits < 64) ? v_addr.pkt_bits : 0);
|
trcPrintableElem::getValStr(valStr, (v_addr.size == VA_64BIT) ? 64 : 32, v_addr.valid_bits, v_addr.val, true, (v_addr.pkt_bits < 64) ? v_addr.pkt_bits : 0);
|
||||||
str += "; Addr=" + valStr + "; " + ctxtStr;
|
str += "; Addr=" + valStr + "; " + ctxtStr;
|
||||||
break;
|
break;
|
||||||
@ -121,11 +126,14 @@ void EtmV4ITrcPacket::toString(std::string &str) const
|
|||||||
|
|
||||||
case ETM4_PKT_I_ADDR_S_IS0:
|
case ETM4_PKT_I_ADDR_S_IS0:
|
||||||
case ETM4_PKT_I_ADDR_S_IS1:
|
case ETM4_PKT_I_ADDR_S_IS1:
|
||||||
|
case ETE_PKT_I_SRC_ADDR_S_IS0:
|
||||||
|
case ETE_PKT_I_SRC_ADDR_S_IS1:
|
||||||
trcPrintableElem::getValStr(valStr, (v_addr.size == VA_64BIT) ? 64 : 32, v_addr.valid_bits, v_addr.val, true, v_addr.pkt_bits);
|
trcPrintableElem::getValStr(valStr, (v_addr.size == VA_64BIT) ? 64 : 32, v_addr.valid_bits, v_addr.val, true, v_addr.pkt_bits);
|
||||||
str += "; Addr=" + valStr;
|
str += "; Addr=" + valStr;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ETM4_PKT_I_ADDR_MATCH:
|
case ETM4_PKT_I_ADDR_MATCH:
|
||||||
|
case ETE_PKT_I_SRC_ADDR_MATCH:
|
||||||
addrMatchIdx(valStr);
|
addrMatchIdx(valStr);
|
||||||
str += ", " + valStr;
|
str += ", " + valStr;
|
||||||
trcPrintableElem::getValStr(valStr, (v_addr.size == VA_64BIT) ? 64 : 32, v_addr.valid_bits, v_addr.val, true);
|
trcPrintableElem::getValStr(valStr, (v_addr.size == VA_64BIT) ? 64 : 32, v_addr.valid_bits, v_addr.val, true);
|
||||||
@ -161,7 +169,10 @@ void EtmV4ITrcPacket::toString(std::string &str) const
|
|||||||
{
|
{
|
||||||
std::ostringstream oss;
|
std::ostringstream oss;
|
||||||
oss << "; INFO=" << std::hex << "0x" << trace_info.val;
|
oss << "; INFO=" << std::hex << "0x" << trace_info.val;
|
||||||
oss << " { CC." << std::dec << trace_info.bits.cc_enabled << " }";
|
oss << " { CC." << std::dec << trace_info.bits.cc_enabled;
|
||||||
|
if (isETE())
|
||||||
|
oss << ", TSTATE." << std::dec << trace_info.bits.in_trans_state;
|
||||||
|
oss << " }";
|
||||||
if (trace_info.bits.cc_enabled)
|
if (trace_info.bits.cc_enabled)
|
||||||
oss << "; CC_THRESHOLD=" << std::hex << "0x" << cc_threshold;
|
oss << "; CC_THRESHOLD=" << std::hex << "0x" << cc_threshold;
|
||||||
str += oss.str();
|
str += oss.str();
|
||||||
@ -264,6 +275,14 @@ void EtmV4ITrcPacket::toString(std::string &str) const
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case ETE_PKT_I_ITE:
|
||||||
|
{
|
||||||
|
std::ostringstream oss;
|
||||||
|
oss << "; EL" << std::dec << (int)ite_pkt.el << "; Payload=0x" << std::hex << ite_pkt.value;
|
||||||
|
str += oss.str();
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -350,6 +369,16 @@ const char *EtmV4ITrcPacket::packetTypeName(const ocsd_etmv4_i_pkt_type type, co
|
|||||||
pDesc = "Exception Return.";
|
pDesc = "Exception Return.";
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case ETE_PKT_I_TRANS_ST:
|
||||||
|
pName = "I_TRANS_ST";
|
||||||
|
pDesc = "Transaction Start.";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ETE_PKT_I_TRANS_COMMIT:
|
||||||
|
pName = "I_TRANS_COMMIT";
|
||||||
|
pDesc = "Transaction Commit.";
|
||||||
|
break;
|
||||||
|
|
||||||
case ETM4_PKT_I_CCNT_F1:
|
case ETM4_PKT_I_CCNT_F1:
|
||||||
pName = "I_CCNT_F1";
|
pName = "I_CCNT_F1";
|
||||||
pDesc = "Cycle Count format 1.";
|
pDesc = "Cycle Count format 1.";
|
||||||
@ -481,6 +510,11 @@ const char *EtmV4ITrcPacket::packetTypeName(const ocsd_etmv4_i_pkt_type type, co
|
|||||||
pDesc = "Address & Context, Long, 64 bit, IS1.";
|
pDesc = "Address & Context, Long, 64 bit, IS1.";
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case ETE_PKT_I_TS_MARKER:
|
||||||
|
pName = "I_TS_MARKER";
|
||||||
|
pDesc = "Timestamp Marker";
|
||||||
|
break;
|
||||||
|
|
||||||
case ETM4_PKT_I_ADDR_MATCH:
|
case ETM4_PKT_I_ADDR_MATCH:
|
||||||
pName = "I_ADDR_MATCH";
|
pName = "I_ADDR_MATCH";
|
||||||
pDesc = "Exact Address Match.";
|
pDesc = "Exact Address Match.";
|
||||||
@ -521,6 +555,41 @@ const char *EtmV4ITrcPacket::packetTypeName(const ocsd_etmv4_i_pkt_type type, co
|
|||||||
pDesc = "Q Packet.";
|
pDesc = "Q Packet.";
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case ETE_PKT_I_SRC_ADDR_MATCH:
|
||||||
|
pName = "I_SRC_ADDR_MATCH";
|
||||||
|
pDesc = "Exact Source Address Match.";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ETE_PKT_I_SRC_ADDR_S_IS0:
|
||||||
|
pName = "I_SRC_ADDR_S_IS0";
|
||||||
|
pDesc = "Source Address, Short, IS0.";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ETE_PKT_I_SRC_ADDR_S_IS1:
|
||||||
|
pName = "I_SRC_ADDR_S_IS1";
|
||||||
|
pDesc = "Source Address, Short, IS1.";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ETE_PKT_I_SRC_ADDR_L_32IS0:
|
||||||
|
pName = "I_SCR_ADDR_L_32IS0";
|
||||||
|
pDesc = "Source Address, Long, 32 bit, IS0.";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ETE_PKT_I_SRC_ADDR_L_32IS1:
|
||||||
|
pName = "I_SRC_ADDR_L_32IS1";
|
||||||
|
pDesc = "Source Address, Long, 32 bit, IS1.";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ETE_PKT_I_SRC_ADDR_L_64IS0:
|
||||||
|
pName = "I_SRC_ADDR_L_64IS0";
|
||||||
|
pDesc = "Source Address, Long, 64 bit, IS0.";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ETE_PKT_I_SRC_ADDR_L_64IS1:
|
||||||
|
pName = "I_SRC_ADDR_L_64IS1";
|
||||||
|
pDesc = "Source Address, Long, 64 bit, IS1.";
|
||||||
|
break;
|
||||||
|
|
||||||
case ETM4_PKT_I_ATOM_F6:
|
case ETM4_PKT_I_ATOM_F6:
|
||||||
pName = "I_ATOM_F6";
|
pName = "I_ATOM_F6";
|
||||||
pDesc = "Atom format 6.";
|
pDesc = "Atom format 6.";
|
||||||
@ -566,6 +635,21 @@ const char *EtmV4ITrcPacket::packetTypeName(const ocsd_etmv4_i_pkt_type type, co
|
|||||||
pDesc = "Overflow.";
|
pDesc = "Overflow.";
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case ETE_PKT_I_PE_RESET:
|
||||||
|
pName = "I_PE_RESET";
|
||||||
|
pDesc = "PE Reset.";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ETE_PKT_I_TRANS_FAIL:
|
||||||
|
pName = "I_TRANS_FAIL";
|
||||||
|
pDesc = "Transaction Fail.";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ETE_PKT_I_ITE:
|
||||||
|
pName = "I_ITE";
|
||||||
|
pDesc = "Instrumentation";
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -45,6 +45,9 @@
|
|||||||
|
|
||||||
static const uint32_t ETMV4_SUPPORTED_OP_FLAGS = OCSD_OPFLG_PKTPROC_COMMON;
|
static const uint32_t ETMV4_SUPPORTED_OP_FLAGS = OCSD_OPFLG_PKTPROC_COMMON;
|
||||||
|
|
||||||
|
// test defines - if testing with ETMv4 sources, disable error on ERET.
|
||||||
|
// #define ETE_TRACE_ERET_AS_IGNORE
|
||||||
|
|
||||||
/* trace etmv4 packet processing class */
|
/* trace etmv4 packet processing class */
|
||||||
TrcPktProcEtmV4I::TrcPktProcEtmV4I() : TrcPktProcBase(ETMV4I_PKTS_NAME),
|
TrcPktProcEtmV4I::TrcPktProcEtmV4I() : TrcPktProcBase(ETMV4I_PKTS_NAME),
|
||||||
m_isInit(false),
|
m_isInit(false),
|
||||||
@ -70,7 +73,9 @@ ocsd_err_t TrcPktProcEtmV4I::onProtocolConfig()
|
|||||||
InitProcessorState();
|
InitProcessorState();
|
||||||
m_config = *TrcPktProcBase::getProtocolConfig();
|
m_config = *TrcPktProcBase::getProtocolConfig();
|
||||||
BuildIPacketTable(); // packet table based on config
|
BuildIPacketTable(); // packet table based on config
|
||||||
|
m_curr_packet.setProtocolVersion(m_config.FullVersion());
|
||||||
m_isInit = true;
|
m_isInit = true;
|
||||||
|
statsInit();
|
||||||
return OCSD_OK;
|
return OCSD_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -152,6 +157,10 @@ ocsd_datapath_resp_t TrcPktProcEtmV4I::processData( const ocsd_trc_index_t inde
|
|||||||
(err.getErrorCode() == OCSD_ERR_INVALID_PCKT_HDR))
|
(err.getErrorCode() == OCSD_ERR_INVALID_PCKT_HDR))
|
||||||
{
|
{
|
||||||
// send invalid packets up the pipe to let the next stage decide what to do.
|
// send invalid packets up the pipe to let the next stage decide what to do.
|
||||||
|
if (err.getErrorCode() == OCSD_ERR_INVALID_PCKT_HDR)
|
||||||
|
statsAddBadHdrCount(1);
|
||||||
|
else
|
||||||
|
statsAddBadSeqCount(1);
|
||||||
m_process_state = SEND_PKT;
|
m_process_state = SEND_PKT;
|
||||||
done = false;
|
done = false;
|
||||||
}
|
}
|
||||||
@ -171,6 +180,7 @@ ocsd_datapath_resp_t TrcPktProcEtmV4I::processData( const ocsd_trc_index_t inde
|
|||||||
}
|
}
|
||||||
} while (!done);
|
} while (!done);
|
||||||
|
|
||||||
|
statsAddTotalCount(m_trcIn.processed());
|
||||||
*numBytesProcessed = m_trcIn.processed();
|
*numBytesProcessed = m_trcIn.processed();
|
||||||
return resp;
|
return resp;
|
||||||
}
|
}
|
||||||
@ -241,8 +251,8 @@ ocsd_datapath_resp_t TrcPktProcEtmV4I::outputUnsyncedRawPacket()
|
|||||||
{
|
{
|
||||||
ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
|
ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
|
||||||
|
|
||||||
|
statsAddUnsyncCount(m_dump_unsynced_bytes);
|
||||||
outputRawPacketToMonitor(m_packet_index,&m_curr_packet,m_dump_unsynced_bytes,&m_currPacketData[0]);
|
outputRawPacketToMonitor(m_packet_index,&m_curr_packet,m_dump_unsynced_bytes,&m_currPacketData[0]);
|
||||||
|
|
||||||
if(!m_sent_notsync_packet)
|
if(!m_sent_notsync_packet)
|
||||||
{
|
{
|
||||||
@ -290,6 +300,7 @@ void TrcPktProcEtmV4I::iPktNoPayload(const uint8_t lastByte)
|
|||||||
switch(m_curr_packet.type)
|
switch(m_curr_packet.type)
|
||||||
{
|
{
|
||||||
case ETM4_PKT_I_ADDR_MATCH:
|
case ETM4_PKT_I_ADDR_MATCH:
|
||||||
|
case ETE_PKT_I_SRC_ADDR_MATCH:
|
||||||
m_curr_packet.setAddressExactMatch(lastByte & 0x3);
|
m_curr_packet.setAddressExactMatch(lastByte & 0x3);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -307,6 +318,8 @@ void TrcPktProcEtmV4I::iPktNoPayload(const uint8_t lastByte)
|
|||||||
case ETM4_PKT_I_EXCEPT_RTN:
|
case ETM4_PKT_I_EXCEPT_RTN:
|
||||||
case ETM4_PKT_I_TRACE_ON:
|
case ETM4_PKT_I_TRACE_ON:
|
||||||
case ETM4_PKT_I_FUNC_RET:
|
case ETM4_PKT_I_FUNC_RET:
|
||||||
|
case ETE_PKT_I_TRANS_ST:
|
||||||
|
case ETE_PKT_I_TRANS_COMMIT:
|
||||||
case ETM4_PKT_I_IGNORE:
|
case ETM4_PKT_I_IGNORE:
|
||||||
default: break;
|
default: break;
|
||||||
}
|
}
|
||||||
@ -437,6 +450,8 @@ void TrcPktProcEtmV4I::iPktTraceInfo(const uint8_t lastByte)
|
|||||||
m_tinfo_sections.sectFlags |= (lastByte & 0x80) ? 0 : TINFO_SPEC_SECT;
|
m_tinfo_sections.sectFlags |= (lastByte & 0x80) ? 0 : TINFO_SPEC_SECT;
|
||||||
else if(!(m_tinfo_sections.sectFlags & TINFO_CYCT_SECT))
|
else if(!(m_tinfo_sections.sectFlags & TINFO_CYCT_SECT))
|
||||||
m_tinfo_sections.sectFlags |= (lastByte & 0x80) ? 0 : TINFO_CYCT_SECT;
|
m_tinfo_sections.sectFlags |= (lastByte & 0x80) ? 0 : TINFO_CYCT_SECT;
|
||||||
|
else if (!(m_tinfo_sections.sectFlags & TINFO_WNDW_SECT))
|
||||||
|
m_tinfo_sections.sectFlags |= (lastByte & 0x80) ? 0 : TINFO_WNDW_SECT;
|
||||||
}
|
}
|
||||||
|
|
||||||
// all sections accounted for?
|
// all sections accounted for?
|
||||||
@ -469,6 +484,11 @@ void TrcPktProcEtmV4I::iPktTraceInfo(const uint8_t lastByte)
|
|||||||
idx += extractContField(m_currPacketData,idx,fieldVal);
|
idx += extractContField(m_currPacketData,idx,fieldVal);
|
||||||
m_curr_packet.setTraceInfoCyct(fieldVal);
|
m_curr_packet.setTraceInfoCyct(fieldVal);
|
||||||
}
|
}
|
||||||
|
if ((presSect & TINFO_WNDW_SECT) && (idx < m_currPacketData.size()))
|
||||||
|
{
|
||||||
|
idx += extractContField(m_currPacketData, idx, fieldVal);
|
||||||
|
/* Trace commit window unsupported in current ETE versions */
|
||||||
|
}
|
||||||
m_process_state = SEND_PKT;
|
m_process_state = SEND_PKT;
|
||||||
m_first_trace_info = true;
|
m_first_trace_info = true;
|
||||||
}
|
}
|
||||||
@ -502,8 +522,11 @@ void TrcPktProcEtmV4I::iPktTimestamp(const uint8_t lastByte)
|
|||||||
{
|
{
|
||||||
int idx = 1;
|
int idx = 1;
|
||||||
uint64_t tsVal;
|
uint64_t tsVal;
|
||||||
int ts_bytes = extractContField64(m_currPacketData, idx, tsVal);
|
int ts_bytes = extractTSField64(m_currPacketData, idx, tsVal);
|
||||||
int ts_bits = ts_bytes < 7 ? ts_bytes * 7 : 64;
|
int ts_bits;
|
||||||
|
|
||||||
|
// if ts_bytes 8 or less, then cont bits on each byte, otherwise full 64 bit value for 9 bytes
|
||||||
|
ts_bits = ts_bytes < 9 ? ts_bytes * 7 : 64;
|
||||||
|
|
||||||
if(!m_curr_packet.pkt_valid.bits.ts_valid && m_first_trace_info)
|
if(!m_curr_packet.pkt_valid.bits.ts_valid && m_first_trace_info)
|
||||||
ts_bits = 64; // after trace info, missing bits are all 0.
|
ts_bits = 64; // after trace info, missing bits are all 0.
|
||||||
@ -534,6 +557,13 @@ void TrcPktProcEtmV4I::iPktException(const uint8_t lastByte)
|
|||||||
case 1: m_excep_size = 3; break;
|
case 1: m_excep_size = 3; break;
|
||||||
case 2: if((lastByte & 0x80) == 0x00)
|
case 2: if((lastByte & 0x80) == 0x00)
|
||||||
m_excep_size = 2;
|
m_excep_size = 2;
|
||||||
|
// ETE exception reset or trans failed
|
||||||
|
if (m_config.MajVersion() >= 0x5)
|
||||||
|
{
|
||||||
|
excep_type = (m_currPacketData[1] >> 1) & 0x1F;
|
||||||
|
if ((excep_type == 0x0) || (excep_type == 0x18))
|
||||||
|
m_excep_size = 3;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -553,6 +583,18 @@ void TrcPktProcEtmV4I::iPktException(const uint8_t lastByte)
|
|||||||
m_curr_packet.setExceptionInfo(excep_type,addr_interp,m_fault_pending, m_type);
|
m_curr_packet.setExceptionInfo(excep_type,addr_interp,m_fault_pending, m_type);
|
||||||
m_process_state = SEND_PKT;
|
m_process_state = SEND_PKT;
|
||||||
|
|
||||||
|
// ETE exception reset or trans failed
|
||||||
|
if (m_config.MajVersion() >= 0x5)
|
||||||
|
{
|
||||||
|
if ((excep_type == 0x0) || (excep_type == 0x18))
|
||||||
|
{
|
||||||
|
m_curr_packet.set64BitAddress(0, 0);
|
||||||
|
if (excep_type == 0x18)
|
||||||
|
m_curr_packet.setType(ETE_PKT_I_TRANS_FAIL);
|
||||||
|
else
|
||||||
|
m_curr_packet.setType(ETE_PKT_I_PE_RESET);
|
||||||
|
}
|
||||||
|
}
|
||||||
// allow the standard address packet handlers to process the address packet field for the exception.
|
// allow the standard address packet handlers to process the address packet field for the exception.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -833,7 +875,7 @@ void TrcPktProcEtmV4I::extractAndSetContextInfo(const std::vector<uint8_t> &buff
|
|||||||
// on input, buffer index points at the info byte - always present
|
// on input, buffer index points at the info byte - always present
|
||||||
uint8_t infoByte = m_currPacketData[st_idx];
|
uint8_t infoByte = m_currPacketData[st_idx];
|
||||||
|
|
||||||
m_curr_packet.setContextInfo(true, (infoByte & 0x3), (infoByte >> 5) & 0x1, (infoByte >> 4) & 0x1);
|
m_curr_packet.setContextInfo(true, (infoByte & 0x3), (infoByte >> 5) & 0x1, (infoByte >> 4) & 0x1, (infoByte >> 3) & 0x1);
|
||||||
|
|
||||||
// see if there are VMID and CID bytes, and how many.
|
// see if there are VMID and CID bytes, and how many.
|
||||||
int nVMID_bytes = ((infoByte & 0x40) == 0x40) ? (m_config.vmidSize()/8) : 0;
|
int nVMID_bytes = ((infoByte & 0x40) == 0x40) ? (m_config.vmidSize()/8) : 0;
|
||||||
@ -937,7 +979,8 @@ void TrcPktProcEtmV4I::iPktShortAddr(const uint8_t lastByte)
|
|||||||
{
|
{
|
||||||
m_addr_done = false;
|
m_addr_done = false;
|
||||||
m_addrIS = 0;
|
m_addrIS = 0;
|
||||||
if (lastByte == ETM4_PKT_I_ADDR_S_IS1)
|
if ((lastByte == ETM4_PKT_I_ADDR_S_IS1) ||
|
||||||
|
(lastByte == ETE_PKT_I_SRC_ADDR_S_IS1))
|
||||||
m_addrIS = 1;
|
m_addrIS = 1;
|
||||||
}
|
}
|
||||||
else if(!m_addr_done)
|
else if(!m_addr_done)
|
||||||
@ -988,14 +1031,18 @@ void TrcPktProcEtmV4I::iPktLongAddr(const uint8_t lastByte)
|
|||||||
switch(m_curr_packet.type)
|
switch(m_curr_packet.type)
|
||||||
{
|
{
|
||||||
case ETM4_PKT_I_ADDR_L_32IS1:
|
case ETM4_PKT_I_ADDR_L_32IS1:
|
||||||
|
case ETE_PKT_I_SRC_ADDR_L_32IS1:
|
||||||
m_addrIS = 1;
|
m_addrIS = 1;
|
||||||
case ETM4_PKT_I_ADDR_L_32IS0:
|
case ETM4_PKT_I_ADDR_L_32IS0:
|
||||||
|
case ETE_PKT_I_SRC_ADDR_L_32IS0:
|
||||||
m_addrBytes = 4;
|
m_addrBytes = 4;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ETM4_PKT_I_ADDR_L_64IS1:
|
case ETM4_PKT_I_ADDR_L_64IS1:
|
||||||
|
case ETE_PKT_I_SRC_ADDR_L_64IS1:
|
||||||
m_addrIS = 1;
|
m_addrIS = 1;
|
||||||
case ETM4_PKT_I_ADDR_L_64IS0:
|
case ETM4_PKT_I_ADDR_L_64IS0:
|
||||||
|
case ETE_PKT_I_SRC_ADDR_L_64IS0:
|
||||||
m_addrBytes = 8;
|
m_addrBytes = 8;
|
||||||
m_bAddr64bit = true;
|
m_bAddr64bit = true;
|
||||||
break;
|
break;
|
||||||
@ -1203,6 +1250,23 @@ void TrcPktProcEtmV4I::iAtom(const uint8_t lastByte)
|
|||||||
m_process_state = SEND_PKT;
|
m_process_state = SEND_PKT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TrcPktProcEtmV4I::iPktITE(const uint8_t /* lastByte */)
|
||||||
|
{
|
||||||
|
uint64_t value;
|
||||||
|
int shift = 0;
|
||||||
|
|
||||||
|
/* packet is always 10 bytes, Header, EL info byte, 8 bytes payload */
|
||||||
|
if (m_currPacketData.size() == 10) {
|
||||||
|
value = 0;
|
||||||
|
for (int i = 2; i < 10; i++) {
|
||||||
|
value |= ((uint64_t)m_currPacketData[i]) << shift;
|
||||||
|
shift += 8;
|
||||||
|
}
|
||||||
|
m_curr_packet.setITE(m_currPacketData[1], value);
|
||||||
|
m_process_state = SEND_PKT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// header byte processing is table driven.
|
// header byte processing is table driven.
|
||||||
void TrcPktProcEtmV4I::BuildIPacketTable()
|
void TrcPktProcEtmV4I::BuildIPacketTable()
|
||||||
{
|
{
|
||||||
@ -1247,7 +1311,35 @@ void TrcPktProcEtmV4I::BuildIPacketTable()
|
|||||||
|
|
||||||
// b0000 0111 - exception return
|
// b0000 0111 - exception return
|
||||||
m_i_table[0x07].pkt_type = ETM4_PKT_I_EXCEPT_RTN;
|
m_i_table[0x07].pkt_type = ETM4_PKT_I_EXCEPT_RTN;
|
||||||
m_i_table[0x07].pptkFn = &TrcPktProcEtmV4I::iPktNoPayload;
|
if (m_config.MajVersion() >= 0x5) // not valid for ETE
|
||||||
|
{
|
||||||
|
#ifdef ETE_TRACE_ERET_AS_IGNORE
|
||||||
|
m_i_table[0x07].pkt_type = ETM4_PKT_I_IGNORE;
|
||||||
|
m_i_table[0x07].pptkFn = &EtmV4IPktProcImpl::iPktNoPayload;
|
||||||
|
#else
|
||||||
|
m_i_table[0x07].pptkFn = &TrcPktProcEtmV4I::iPktInvalidCfg;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else
|
||||||
|
m_i_table[0x07].pptkFn = &TrcPktProcEtmV4I::iPktNoPayload;
|
||||||
|
|
||||||
|
// b00001010, b00001011 ETE TRANS packets
|
||||||
|
// b00001001 - ETE sw instrumentation packet
|
||||||
|
if (m_config.MajVersion() >= 0x5)
|
||||||
|
{
|
||||||
|
m_i_table[0x0A].pkt_type = ETE_PKT_I_TRANS_ST;
|
||||||
|
m_i_table[0x0A].pptkFn = &TrcPktProcEtmV4I::iPktNoPayload;
|
||||||
|
|
||||||
|
m_i_table[0x0B].pkt_type = ETE_PKT_I_TRANS_COMMIT;
|
||||||
|
m_i_table[0x0B].pptkFn = &TrcPktProcEtmV4I::iPktNoPayload;
|
||||||
|
|
||||||
|
// FEAT_ITE - sw instrumentation packet
|
||||||
|
if (m_config.MinVersion() >= 0x3)
|
||||||
|
{
|
||||||
|
m_i_table[0x09].pkt_type = ETE_PKT_I_ITE;
|
||||||
|
m_i_table[0x09].pptkFn = &TrcPktProcEtmV4I::iPktITE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// b0000 110x - cycle count f2
|
// b0000 110x - cycle count f2
|
||||||
// b0000 111x - cycle count f1
|
// b0000 111x - cycle count f1
|
||||||
@ -1443,6 +1535,12 @@ void TrcPktProcEtmV4I::BuildIPacketTable()
|
|||||||
m_i_table[0x85+i].pptkFn = &TrcPktProcEtmV4I::iPktAddrCtxt;
|
m_i_table[0x85+i].pptkFn = &TrcPktProcEtmV4I::iPktAddrCtxt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 0b1000 1000 - ETE 1.1 TS Marker. also ETMv4.6
|
||||||
|
if(m_config.FullVersion() >= 0x46)
|
||||||
|
{
|
||||||
|
m_i_table[0x88].pkt_type = ETE_PKT_I_TS_MARKER;
|
||||||
|
m_i_table[0x88].pptkFn = &TrcPktProcEtmV4I::iPktNoPayload;
|
||||||
|
}
|
||||||
// 0b1001 0000 to b1001 0010 - exact match addr
|
// 0b1001 0000 to b1001 0010 - exact match addr
|
||||||
for(int i = 0; i < 3; i++)
|
for(int i = 0; i < 3; i++)
|
||||||
{
|
{
|
||||||
@ -1492,6 +1590,30 @@ void TrcPktProcEtmV4I::BuildIPacketTable()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// b10110000 - b10111001 - ETE src address packets
|
||||||
|
if (m_config.FullVersion() >= 0x50)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < 3; i++)
|
||||||
|
{
|
||||||
|
m_i_table[0xB0 + i].pkt_type = ETE_PKT_I_SRC_ADDR_MATCH;
|
||||||
|
m_i_table[0xB0 + i].pptkFn = &TrcPktProcEtmV4I::iPktNoPayload;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_i_table[0xB4].pkt_type = ETE_PKT_I_SRC_ADDR_S_IS0;
|
||||||
|
m_i_table[0xB4].pptkFn = &TrcPktProcEtmV4I::iPktShortAddr;
|
||||||
|
m_i_table[0xB5].pkt_type = ETE_PKT_I_SRC_ADDR_S_IS1;
|
||||||
|
m_i_table[0xB5].pptkFn = &TrcPktProcEtmV4I::iPktShortAddr;
|
||||||
|
|
||||||
|
m_i_table[0xB6].pkt_type = ETE_PKT_I_SRC_ADDR_L_32IS0;
|
||||||
|
m_i_table[0xB6].pptkFn = &TrcPktProcEtmV4I::iPktLongAddr;
|
||||||
|
m_i_table[0xB7].pkt_type = ETE_PKT_I_SRC_ADDR_L_32IS1;
|
||||||
|
m_i_table[0xB7].pptkFn = &TrcPktProcEtmV4I::iPktLongAddr;
|
||||||
|
m_i_table[0xB8].pkt_type = ETE_PKT_I_SRC_ADDR_L_64IS0;
|
||||||
|
m_i_table[0xB8].pptkFn = &TrcPktProcEtmV4I::iPktLongAddr;
|
||||||
|
m_i_table[0xB9].pkt_type = ETE_PKT_I_SRC_ADDR_L_64IS1;
|
||||||
|
m_i_table[0xB9].pptkFn = &TrcPktProcEtmV4I::iPktLongAddr;
|
||||||
|
}
|
||||||
|
|
||||||
// Atom Packets - all no payload but have specific pattern generation fn
|
// Atom Packets - all no payload but have specific pattern generation fn
|
||||||
for(int i = 0xC0; i <= 0xD4; i++) // atom f6
|
for(int i = 0xC0; i <= 0xD4; i++) // atom f6
|
||||||
{
|
{
|
||||||
@ -1559,20 +1681,33 @@ void TrcPktProcEtmV4I::BuildIPacketTable()
|
|||||||
return idx;
|
return idx;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned TrcPktProcEtmV4I::extractContField64(const std::vector<uint8_t> &buffer, const unsigned st_idx, uint64_t &value, const unsigned byte_limit /*= 9*/)
|
unsigned TrcPktProcEtmV4I::extractTSField64(const std::vector<uint8_t> &buffer, const unsigned st_idx, uint64_t &value)
|
||||||
{
|
{
|
||||||
|
const unsigned max_byte_idx = 8; /* the 9th byte, index 8, will use full 8 bits for value */
|
||||||
unsigned idx = 0;
|
unsigned idx = 0;
|
||||||
bool lastByte = false;
|
bool lastByte = false;
|
||||||
uint8_t byteVal;
|
uint8_t byteVal;
|
||||||
|
uint8_t byteValMask = 0x7f;
|
||||||
|
|
||||||
|
/* init value */
|
||||||
value = 0;
|
value = 0;
|
||||||
while(!lastByte && (idx < byte_limit)) // max 9 bytes for 64 bit value;
|
while(!lastByte) // max 9 bytes for 64 bit value;
|
||||||
{
|
{
|
||||||
if(buffer.size() > (st_idx + idx))
|
if(buffer.size() > (st_idx + idx))
|
||||||
{
|
{
|
||||||
// each byte has seven bits + cont bit
|
// each byte has seven bits + cont bit
|
||||||
byteVal = buffer[(st_idx + idx)];
|
byteVal = buffer[(st_idx + idx)];
|
||||||
lastByte = (byteVal & 0x80) != 0x80;
|
|
||||||
value |= ((uint64_t)(byteVal & 0x7F)) << (idx * 7);
|
/* detect the final byte - which uses full 8 bits as value */
|
||||||
|
if (idx == max_byte_idx)
|
||||||
|
{
|
||||||
|
byteValMask = 0xFF; /* last byte of 9, no cont bit */
|
||||||
|
lastByte = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
lastByte = (byteVal & 0x80) != 0x80;
|
||||||
|
|
||||||
|
value |= ((uint64_t)(byteVal & byteValMask)) << (idx * 7);
|
||||||
idx++;
|
idx++;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -1580,6 +1715,7 @@ unsigned TrcPktProcEtmV4I::extractContField64(const std::vector<uint8_t> &buffer
|
|||||||
throwBadSequenceError("Invalid 64 bit continuation fields in packet");
|
throwBadSequenceError("Invalid 64 bit continuation fields in packet");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// index is the count of bytes used here.
|
||||||
return idx;
|
return idx;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -42,7 +42,7 @@ ocsd_err_t TrcIDecode::DecodeInstruction(ocsd_instr_info *instr_info)
|
|||||||
struct decode_info info;
|
struct decode_info info;
|
||||||
|
|
||||||
info.instr_sub_type = OCSD_S_INSTR_NONE;
|
info.instr_sub_type = OCSD_S_INSTR_NONE;
|
||||||
info.arch_version = (uint16_t)(instr_info->pe_type.arch);
|
info.arch_version = instr_info->pe_type.arch;
|
||||||
|
|
||||||
switch(instr_info->isa)
|
switch(instr_info->isa)
|
||||||
{
|
{
|
||||||
@ -136,14 +136,12 @@ ocsd_err_t TrcIDecode::DecodeA64(ocsd_instr_info *instr_info, struct decode_info
|
|||||||
if(inst_A64_is_indirect_branch_link(instr_info->opcode, &instr_info->is_link, info))
|
if(inst_A64_is_indirect_branch_link(instr_info->opcode, &instr_info->is_link, info))
|
||||||
{
|
{
|
||||||
instr_info->type = OCSD_INSTR_BR_INDIRECT;
|
instr_info->type = OCSD_INSTR_BR_INDIRECT;
|
||||||
// instr_info->is_link = inst_A64_is_branch_and_link(instr_info->opcode);
|
|
||||||
}
|
}
|
||||||
else if(inst_A64_is_direct_branch_link(instr_info->opcode, &instr_info->is_link, info))
|
else if(inst_A64_is_direct_branch_link(instr_info->opcode, &instr_info->is_link, info))
|
||||||
{
|
{
|
||||||
inst_A64_branch_destination(instr_info->instr_addr,instr_info->opcode,&branchAddr);
|
inst_A64_branch_destination(instr_info->instr_addr,instr_info->opcode,&branchAddr);
|
||||||
instr_info->type = OCSD_INSTR_BR;
|
instr_info->type = OCSD_INSTR_BR;
|
||||||
instr_info->branch_addr = (ocsd_vaddr_t)branchAddr;
|
instr_info->branch_addr = (ocsd_vaddr_t)branchAddr;
|
||||||
// instr_info->is_link = inst_A64_is_branch_and_link(instr_info->opcode);
|
|
||||||
}
|
}
|
||||||
else if((barrier = inst_A64_barrier(instr_info->opcode)) != ARM_BARRIER_NONE)
|
else if((barrier = inst_A64_barrier(instr_info->opcode)) != ARM_BARRIER_NONE)
|
||||||
{
|
{
|
||||||
@ -160,12 +158,15 @@ ocsd_err_t TrcIDecode::DecodeA64(ocsd_instr_info *instr_info, struct decode_info
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (instr_info->wfi_wfe_branch)
|
else if (instr_info->wfi_wfe_branch &&
|
||||||
|
inst_A64_wfiwfe(instr_info->opcode, info))
|
||||||
{
|
{
|
||||||
if (inst_A64_wfiwfe(instr_info->opcode))
|
instr_info->type = OCSD_INSTR_WFI_WFE;
|
||||||
{
|
}
|
||||||
instr_info->type = OCSD_INSTR_WFI_WFE;
|
else if (OCSD_IS_ARCH_MINVER(info->arch_version, ARCH_AA64))
|
||||||
}
|
{
|
||||||
|
if (inst_A64_Tstart(instr_info->opcode))
|
||||||
|
instr_info->type = OCSD_INSTR_TSTART;
|
||||||
}
|
}
|
||||||
|
|
||||||
instr_info->is_conditional = inst_A64_is_conditional(instr_info->opcode);
|
instr_info->is_conditional = inst_A64_is_conditional(instr_info->opcode);
|
||||||
|
@ -244,8 +244,9 @@ int inst_A64_is_direct_branch_link(uint32_t inst, uint8_t *is_link, struct decod
|
|||||||
int is_direct_branch = 1;
|
int is_direct_branch = 1;
|
||||||
if ((inst & 0x7c000000) == 0x34000000) {
|
if ((inst & 0x7c000000) == 0x34000000) {
|
||||||
/* CB, TB */
|
/* CB, TB */
|
||||||
} else if ((inst & 0xff000010) == 0x54000000) {
|
} else if ((inst & 0xff000000) == 0x54000000) {
|
||||||
/* B<cond> */
|
/* B<cond> */
|
||||||
|
/* BC<cond> 8.8 / 9.3 arch - bit 4 = 1'b1 */
|
||||||
} else if ((inst & 0x7c000000) == 0x14000000) {
|
} else if ((inst & 0x7c000000) == 0x14000000) {
|
||||||
/* B, BL imm */
|
/* B, BL imm */
|
||||||
if (inst & 0x80000000) {
|
if (inst & 0x80000000) {
|
||||||
@ -258,11 +259,26 @@ int inst_A64_is_direct_branch_link(uint32_t inst, uint8_t *is_link, struct decod
|
|||||||
return is_direct_branch;
|
return is_direct_branch;
|
||||||
}
|
}
|
||||||
|
|
||||||
int inst_A64_wfiwfe(uint32_t inst)
|
int inst_A64_wfiwfe(uint32_t inst, struct decode_info *info)
|
||||||
{
|
{
|
||||||
/* WFI, WFE may be traced as branches in etm 4.3++ */
|
/* WFI, WFE may be traced as branches in etm 4.3++ */
|
||||||
if ((inst & 0xffffffdf) == 0xd503205f)
|
if ((inst & 0xffffffdf) == 0xd503205f)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
|
/* new feature introduced post v8.3 */
|
||||||
|
if (OCSD_IS_ARCH_MINVER(info->arch_version, ARCH_AA64))
|
||||||
|
{
|
||||||
|
/* WFIT / WFET for later archs */
|
||||||
|
if ((inst & 0xffffffc0) == 0xd5031000)
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int inst_A64_Tstart(uint32_t inst)
|
||||||
|
{
|
||||||
|
if ((inst & 0xffffffe0) == 0xd5233060)
|
||||||
|
return 1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -288,7 +304,7 @@ int inst_A64_is_indirect_branch_link(uint32_t inst, uint8_t *is_link, struct dec
|
|||||||
} else if ((inst & 0xffffffff) == 0xd69f03e0) {
|
} else if ((inst & 0xffffffff) == 0xd69f03e0) {
|
||||||
/* ERET */
|
/* ERET */
|
||||||
info->instr_sub_type = OCSD_S_INSTR_V8_ERET;
|
info->instr_sub_type = OCSD_S_INSTR_V8_ERET;
|
||||||
} else if (info->arch_version >= 0x0803) {
|
} else if (OCSD_IS_ARCH_MINVER(info->arch_version, ARCH_V8r3)) {
|
||||||
/* new pointer auth instr for v8.3 arch */
|
/* new pointer auth instr for v8.3 arch */
|
||||||
if ((inst & 0xffdff800) == 0xd71f0800) {
|
if ((inst & 0xffdff800) == 0xd71f0800) {
|
||||||
/* BRAA, BRAB, BLRAA, BLRBB */
|
/* BRAA, BRAB, BLRAA, BLRBB */
|
||||||
@ -399,8 +415,9 @@ int inst_A64_branch_destination(uint64_t addr, uint32_t inst, uint64_t *pnpc)
|
|||||||
{
|
{
|
||||||
uint64_t npc;
|
uint64_t npc;
|
||||||
int is_direct_branch = 1;
|
int is_direct_branch = 1;
|
||||||
if ((inst & 0xff000010) == 0x54000000) {
|
if ((inst & 0xff000000) == 0x54000000) {
|
||||||
/* B<cond> */
|
/* B<cond> */
|
||||||
|
/* BC<cond> */
|
||||||
npc = addr + ((int32_t)((inst & 0x00ffffe0) << 8) >> 11);
|
npc = addr + ((int32_t)((inst & 0x00ffffe0) << 8) >> 11);
|
||||||
} else if ((inst & 0x7c000000) == 0x14000000) {
|
} else if ((inst & 0x7c000000) == 0x14000000) {
|
||||||
/* B, BL imm */
|
/* B, BL imm */
|
||||||
@ -484,7 +501,7 @@ int inst_A64_is_branch_and_link(uint32_t inst, struct decode_info *info)
|
|||||||
} else if ((inst & 0xfc000000) == 0x94000000) {
|
} else if ((inst & 0xfc000000) == 0x94000000) {
|
||||||
/* BL */
|
/* BL */
|
||||||
info->instr_sub_type = OCSD_S_INSTR_BR_LINK;
|
info->instr_sub_type = OCSD_S_INSTR_BR_LINK;
|
||||||
} else if (info->arch_version >= 0x0803) {
|
} else if (OCSD_IS_ARCH_MINVER(info->arch_version, ARCH_V8r3)) {
|
||||||
/* new pointer auth instr for v8.3 arch */
|
/* new pointer auth instr for v8.3 arch */
|
||||||
if ((inst & 0xfffff800) == 0xd73f0800) {
|
if ((inst & 0xfffff800) == 0xd73f0800) {
|
||||||
/* BLRAA, BLRBB */
|
/* BLRAA, BLRBB */
|
||||||
@ -553,8 +570,9 @@ int inst_A64_is_conditional(uint32_t inst)
|
|||||||
if ((inst & 0x7c000000) == 0x34000000) {
|
if ((inst & 0x7c000000) == 0x34000000) {
|
||||||
/* CB, TB */
|
/* CB, TB */
|
||||||
return 1;
|
return 1;
|
||||||
} else if ((inst & 0xff000010) == 0x54000000) {
|
} else if ((inst & 0xff000000) == 0x54000000) {
|
||||||
/* B.cond */
|
/* B.cond */
|
||||||
|
/* BC.cond */
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -119,6 +119,14 @@ ocsd_err_t TrcMemAccMapper::ReadTargetMemory(const ocsd_vaddr_t address, const u
|
|||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TrcMemAccMapper::InvalidateMemAccCache(const uint8_t /* cs_trace_id */)
|
||||||
|
{
|
||||||
|
// default mapper does not use cs_trace_id for cache invalidation.
|
||||||
|
if (m_cache.enabled())
|
||||||
|
m_cache.invalidateAll();
|
||||||
|
m_acc_curr = 0;
|
||||||
|
}
|
||||||
|
|
||||||
void TrcMemAccMapper::RemoveAllAccessors()
|
void TrcMemAccMapper::RemoveAllAccessors()
|
||||||
{
|
{
|
||||||
TrcMemAccessorBase *pAcc = 0;
|
TrcMemAccessorBase *pAcc = 0;
|
||||||
|
@ -101,6 +101,13 @@ DecodeTree::DecodeTree() :
|
|||||||
{
|
{
|
||||||
for(int i = 0; i < 0x80; i++)
|
for(int i = 0; i < 0x80; i++)
|
||||||
m_decode_elements[i] = 0;
|
m_decode_elements[i] = 0;
|
||||||
|
|
||||||
|
// reset the global demux stats.
|
||||||
|
m_demux_stats.frame_bytes = 0;
|
||||||
|
m_demux_stats.no_id_bytes = 0;
|
||||||
|
m_demux_stats.valid_id_bytes = 0;
|
||||||
|
m_demux_stats.unknown_id_bytes = 0;
|
||||||
|
m_demux_stats.reserved_id_bytes = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
DecodeTree::~DecodeTree()
|
DecodeTree::~DecodeTree()
|
||||||
@ -486,6 +493,62 @@ ocsd_err_t DecodeTree::removeDecoder(const uint8_t CSID)
|
|||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ocsd_err_t DecodeTree::getDecoderStats(const uint8_t CSID, ocsd_decode_stats_t **p_stats_block)
|
||||||
|
{
|
||||||
|
ocsd_err_t err = OCSD_OK;
|
||||||
|
TrcPktProcI *pPktProc = getPktProcI(CSID);
|
||||||
|
if (!pPktProc)
|
||||||
|
return OCSD_ERR_INVALID_PARAM_VAL;
|
||||||
|
err = pPktProc->getStatsBlock(p_stats_block);
|
||||||
|
if (err == OCSD_OK) {
|
||||||
|
// copy in the global demux stats.
|
||||||
|
(*p_stats_block)->demux.frame_bytes = m_demux_stats.frame_bytes;
|
||||||
|
(*p_stats_block)->demux.no_id_bytes = m_demux_stats.no_id_bytes;
|
||||||
|
(*p_stats_block)->demux.valid_id_bytes = m_demux_stats.valid_id_bytes;
|
||||||
|
(*p_stats_block)->demux.unknown_id_bytes = m_demux_stats.unknown_id_bytes;
|
||||||
|
(*p_stats_block)->demux.reserved_id_bytes = m_demux_stats.reserved_id_bytes;
|
||||||
|
}
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
ocsd_err_t DecodeTree::resetDecoderStats(const uint8_t CSID)
|
||||||
|
{
|
||||||
|
TrcPktProcI *pPktProc = getPktProcI(CSID);
|
||||||
|
if (!pPktProc)
|
||||||
|
return OCSD_ERR_INVALID_PARAM_VAL;
|
||||||
|
pPktProc->resetStats();
|
||||||
|
|
||||||
|
// reset the global demux stats.
|
||||||
|
m_demux_stats.frame_bytes = 0;
|
||||||
|
m_demux_stats.no_id_bytes = 0;
|
||||||
|
m_demux_stats.valid_id_bytes = 0;
|
||||||
|
m_demux_stats.unknown_id_bytes = 0;
|
||||||
|
m_demux_stats.reserved_id_bytes = 0;
|
||||||
|
return OCSD_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
TrcPktProcI *DecodeTree::getPktProcI(const uint8_t CSID)
|
||||||
|
{
|
||||||
|
TrcPktProcI *pPktProc = 0;
|
||||||
|
TraceComponent *pComp, *pAssoc;
|
||||||
|
DecodeTreeElement *pElem = getDecoderElement(CSID);
|
||||||
|
|
||||||
|
if (pElem)
|
||||||
|
{
|
||||||
|
pComp = pElem->getDecoderHandle();
|
||||||
|
if (pComp)
|
||||||
|
{
|
||||||
|
/* if this is a full decoder then the associated component is the packet processor */
|
||||||
|
pAssoc = pComp->getAssocComponent();
|
||||||
|
if (pAssoc)
|
||||||
|
pPktProc = dynamic_cast<TrcPktProcI *>(pAssoc);
|
||||||
|
else
|
||||||
|
pPktProc = dynamic_cast<TrcPktProcI *>(pComp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return pPktProc;
|
||||||
|
}
|
||||||
|
|
||||||
DecodeTreeElement * DecodeTree::getDecoderElement(const uint8_t CSID) const
|
DecodeTreeElement * DecodeTree::getDecoderElement(const uint8_t CSID) const
|
||||||
{
|
{
|
||||||
DecodeTreeElement *ret_elem = 0;
|
DecodeTreeElement *ret_elem = 0;
|
||||||
@ -511,7 +574,7 @@ DecodeTreeElement *DecodeTree::getNextElement(uint8_t &elemID)
|
|||||||
if(m_decode_elem_iter < 0x80)
|
if(m_decode_elem_iter < 0x80)
|
||||||
{
|
{
|
||||||
// find a none zero entry or end of range
|
// find a none zero entry or end of range
|
||||||
while((m_decode_elements[m_decode_elem_iter] == 0) && (m_decode_elem_iter < 0x80))
|
while((m_decode_elem_iter < 0x80) && (m_decode_elements[m_decode_elem_iter] == 0))
|
||||||
m_decode_elem_iter++;
|
m_decode_elem_iter++;
|
||||||
|
|
||||||
// return entry unless end of range
|
// return entry unless end of range
|
||||||
@ -527,7 +590,7 @@ DecodeTreeElement *DecodeTree::getNextElement(uint8_t &elemID)
|
|||||||
|
|
||||||
bool DecodeTree::initialise(const ocsd_dcd_tree_src_t type, uint32_t formatterCfgFlags)
|
bool DecodeTree::initialise(const ocsd_dcd_tree_src_t type, uint32_t formatterCfgFlags)
|
||||||
{
|
{
|
||||||
bool initOK = true;
|
ocsd_err_t err;
|
||||||
m_dcd_tree_type = type;
|
m_dcd_tree_type = type;
|
||||||
if(type == OCSD_TRC_SRC_FRAME_FORMATTED)
|
if(type == OCSD_TRC_SRC_FRAME_FORMATTED)
|
||||||
{
|
{
|
||||||
@ -535,14 +598,19 @@ bool DecodeTree::initialise(const ocsd_dcd_tree_src_t type, uint32_t formatterCf
|
|||||||
m_frame_deformatter_root = new (std::nothrow) TraceFormatterFrameDecoder();
|
m_frame_deformatter_root = new (std::nothrow) TraceFormatterFrameDecoder();
|
||||||
if(m_frame_deformatter_root)
|
if(m_frame_deformatter_root)
|
||||||
{
|
{
|
||||||
m_frame_deformatter_root->Configure(formatterCfgFlags);
|
if (m_frame_deformatter_root->Init() != OCSD_OK)
|
||||||
|
return false;
|
||||||
m_frame_deformatter_root->getErrLogAttachPt()->attach(DecodeTree::s_i_error_logger);
|
m_frame_deformatter_root->getErrLogAttachPt()->attach(DecodeTree::s_i_error_logger);
|
||||||
|
err = m_frame_deformatter_root->Configure(formatterCfgFlags);
|
||||||
|
if (err != OCSD_OK)
|
||||||
|
return false;
|
||||||
m_i_decoder_root = dynamic_cast<ITrcDataIn*>(m_frame_deformatter_root);
|
m_i_decoder_root = dynamic_cast<ITrcDataIn*>(m_frame_deformatter_root);
|
||||||
|
m_frame_deformatter_root->SetDemuxStatsBlock(&m_demux_stats);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
initOK = false;
|
return false;
|
||||||
}
|
}
|
||||||
return initOK;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DecodeTree::setSingleRoot(TrcPktProcI *pComp)
|
void DecodeTree::setSingleRoot(TrcPktProcI *pComp)
|
||||||
@ -621,6 +689,7 @@ ocsd_err_t DecodeTree::addPacketPrinter(uint8_t CSID, bool bMonitor, ItemPrinter
|
|||||||
switch (protocol)
|
switch (protocol)
|
||||||
{
|
{
|
||||||
case OCSD_PROTOCOL_ETMV4I:
|
case OCSD_PROTOCOL_ETMV4I:
|
||||||
|
case OCSD_PROTOCOL_ETE:
|
||||||
{
|
{
|
||||||
PacketPrinter<EtmV4ITrcPacket> *pTPrinter = dynamic_cast<PacketPrinter<EtmV4ITrcPacket> *>(pPrinter);
|
PacketPrinter<EtmV4ITrcPacket> *pTPrinter = dynamic_cast<PacketPrinter<EtmV4ITrcPacket> *>(pPrinter);
|
||||||
if (bMonitor)
|
if (bMonitor)
|
||||||
|
@ -229,4 +229,25 @@ void ocsdError::appendErrorDetails(std::string &errStr, const ocsdError &error)
|
|||||||
errStr = oss.str();
|
errStr = oss.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const char* ocsdDataRespStr::getStr()
|
||||||
|
{
|
||||||
|
static const char* szRespStr[] = {
|
||||||
|
"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."
|
||||||
|
};
|
||||||
|
if ((m_type < OCSD_RESP_CONT) || (m_type > OCSD_RESP_FATAL_SYS_ERR))
|
||||||
|
return "Unknown OCSD_RESP type.";
|
||||||
|
return szRespStr[m_type];
|
||||||
|
}
|
||||||
|
|
||||||
/* End of File ocsd_error.cpp */
|
/* End of File ocsd_error.cpp */
|
||||||
|
@ -42,6 +42,7 @@ OcsdGenElemStack::OcsdGenElemStack() :
|
|||||||
m_curr_elem_idx(0),
|
m_curr_elem_idx(0),
|
||||||
m_send_elem_idx(0),
|
m_send_elem_idx(0),
|
||||||
m_CSID(0),
|
m_CSID(0),
|
||||||
|
m_sendIf(NULL),
|
||||||
m_is_init(false)
|
m_is_init(false)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -39,13 +39,15 @@
|
|||||||
#include "opencsd/etmv3/trc_dcd_mngr_etmv3.h"
|
#include "opencsd/etmv3/trc_dcd_mngr_etmv3.h"
|
||||||
#include "opencsd/ptm/trc_dcd_mngr_ptm.h"
|
#include "opencsd/ptm/trc_dcd_mngr_ptm.h"
|
||||||
#include "opencsd/stm/trc_dcd_mngr_stm.h"
|
#include "opencsd/stm/trc_dcd_mngr_stm.h"
|
||||||
|
#include "opencsd/ete/trc_dcd_mngr_ete.h"
|
||||||
|
|
||||||
// create array of built-in decoders to register with library
|
// create array of built-in decoders to register with library
|
||||||
static built_in_decoder_info_t sBuiltInArray[] = {
|
static built_in_decoder_info_t sBuiltInArray[] = {
|
||||||
CREATE_BUILTIN_ENTRY(DecoderMngrEtmV4I,OCSD_BUILTIN_DCD_ETMV4I),
|
CREATE_BUILTIN_ENTRY(DecoderMngrEtmV4I,OCSD_BUILTIN_DCD_ETMV4I),
|
||||||
CREATE_BUILTIN_ENTRY(DecoderMngrEtmV3, OCSD_BUILTIN_DCD_ETMV3),
|
CREATE_BUILTIN_ENTRY(DecoderMngrEtmV3, OCSD_BUILTIN_DCD_ETMV3),
|
||||||
CREATE_BUILTIN_ENTRY(DecoderMngrPtm, OCSD_BUILTIN_DCD_PTM),
|
CREATE_BUILTIN_ENTRY(DecoderMngrPtm, OCSD_BUILTIN_DCD_PTM),
|
||||||
CREATE_BUILTIN_ENTRY(DecoderMngrStm, OCSD_BUILTIN_DCD_STM)
|
CREATE_BUILTIN_ENTRY(DecoderMngrStm, OCSD_BUILTIN_DCD_STM),
|
||||||
|
CREATE_BUILTIN_ENTRY(DecoderMngrETE, OCSD_BUILTIN_DCD_ETE)
|
||||||
//{ 0, 0, 0}
|
//{ 0, 0, 0}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -90,7 +92,6 @@ OcsdLibDcdRegister::~OcsdLibDcdRegister()
|
|||||||
m_pLastTypedDecoderMngr = 0;
|
m_pLastTypedDecoderMngr = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
const ocsd_err_t OcsdLibDcdRegister::registerDecoderTypeByName(const std::string &name, IDecoderMngr *p_decoder_fact)
|
const ocsd_err_t OcsdLibDcdRegister::registerDecoderTypeByName(const std::string &name, IDecoderMngr *p_decoder_fact)
|
||||||
{
|
{
|
||||||
if(isRegisteredDecoder(name))
|
if(isRegisteredDecoder(name))
|
||||||
|
@ -57,6 +57,7 @@ ItemPrinter *PktPrinterFact::createProtocolPrinter(std::vector<ItemPrinter *> &p
|
|||||||
switch (protocol)
|
switch (protocol)
|
||||||
{
|
{
|
||||||
case OCSD_PROTOCOL_ETMV4I:
|
case OCSD_PROTOCOL_ETMV4I:
|
||||||
|
case OCSD_PROTOCOL_ETE:
|
||||||
pPrinter = new (std::nothrow) PacketPrinter<EtmV4ITrcPacket>(CSID);
|
pPrinter = new (std::nothrow) PacketPrinter<EtmV4ITrcPacket>(CSID);
|
||||||
break;
|
break;
|
||||||
case OCSD_PROTOCOL_ETMV3:
|
case OCSD_PROTOCOL_ETMV3:
|
||||||
|
@ -224,6 +224,7 @@ void TrcPktProcPtm::InitProcessorState()
|
|||||||
m_waitASyncSOPkt = false;
|
m_waitASyncSOPkt = false;
|
||||||
m_bAsyncRawOp = false;
|
m_bAsyncRawOp = false;
|
||||||
m_bOPNotSyncPkt = false;
|
m_bOPNotSyncPkt = false;
|
||||||
|
m_excepAltISA = 0;
|
||||||
|
|
||||||
m_curr_packet.ResetState();
|
m_curr_packet.ResetState();
|
||||||
InitPacketState();
|
InitPacketState();
|
||||||
@ -559,7 +560,7 @@ void TrcPktProcPtm::pktWPointUpdate()
|
|||||||
m_gotExcepBytes = false; // mark as not got all required exception bytes thus far
|
m_gotExcepBytes = false; // mark as not got all required exception bytes thus far
|
||||||
m_numExcepBytes = 0; // 0 read in
|
m_numExcepBytes = 0; // 0 read in
|
||||||
|
|
||||||
m_addrPktIsa = ocsd_isa_unknown; // not set by this packet as yet
|
m_addrPktIsa = ocsd_isa_unknown; // not set by this packet as yet
|
||||||
}
|
}
|
||||||
|
|
||||||
// collect all the bytes needed
|
// collect all the bytes needed
|
||||||
@ -567,10 +568,12 @@ void TrcPktProcPtm::pktWPointUpdate()
|
|||||||
{
|
{
|
||||||
if(readByte(currByte))
|
if(readByte(currByte))
|
||||||
{
|
{
|
||||||
|
|
||||||
byteIdx = m_currPacketData.size() - 1;
|
byteIdx = m_currPacketData.size() - 1;
|
||||||
if(!m_gotAddrBytes)
|
if(!m_gotAddrBytes)
|
||||||
{
|
{
|
||||||
if(byteIdx < 4)
|
// byteIdx for address byte will run from 1 to 5 - first 4 my have continuation or not.
|
||||||
|
if(byteIdx <= 4)
|
||||||
{
|
{
|
||||||
// address bytes 1 - 4;
|
// address bytes 1 - 4;
|
||||||
// ISA stays the same
|
// ISA stays the same
|
||||||
|
@ -72,17 +72,6 @@ static ap_map_elem_t ap_map_array[] =
|
|||||||
{ "Cortex-M4", { ARCH_V7, profile_CortexM } }
|
{ "Cortex-M4", { ARCH_V7, profile_CortexM } }
|
||||||
};
|
};
|
||||||
|
|
||||||
static ap_map_elem_t arch_map_array[] =
|
|
||||||
{
|
|
||||||
{ "ARMv7-A", { ARCH_V7, profile_CortexA } },
|
|
||||||
{ "ARMv7-R", { ARCH_V7, profile_CortexR } },
|
|
||||||
{ "ARMv7-M", { ARCH_V7, profile_CortexM } },
|
|
||||||
{ "ARMv8-A", { ARCH_V8, profile_CortexA } },
|
|
||||||
{ "ARMv8.3-A", { ARCH_V8r3, profile_CortexA } },
|
|
||||||
{ "ARMv8-R", { ARCH_V8, profile_CortexR } },
|
|
||||||
{ "ARMv8-M", { ARCH_V8, profile_CortexM } },
|
|
||||||
};
|
|
||||||
|
|
||||||
CoreArchProfileMap::CoreArchProfileMap()
|
CoreArchProfileMap::CoreArchProfileMap()
|
||||||
{
|
{
|
||||||
unsigned i;
|
unsigned i;
|
||||||
@ -90,10 +79,99 @@ CoreArchProfileMap::CoreArchProfileMap()
|
|||||||
{
|
{
|
||||||
core_profiles[ap_map_array[i].name] = ap_map_array[i].ap;
|
core_profiles[ap_map_array[i].name] = ap_map_array[i].ap;
|
||||||
}
|
}
|
||||||
for (i = 0; i < sizeof(arch_map_array) / sizeof(_ap_map_elements); i++)
|
|
||||||
{
|
|
||||||
arch_profiles[arch_map_array[i].name] = arch_map_array[i].ap;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ocsd_arch_profile_t CoreArchProfileMap::getArchProfile(const std::string &coreName)
|
||||||
|
{
|
||||||
|
ocsd_arch_profile_t ap = { ARCH_UNKNOWN, profile_Unknown };
|
||||||
|
bool bFound = false;
|
||||||
|
|
||||||
|
std::map<std::string, ocsd_arch_profile_t>::const_iterator it;
|
||||||
|
|
||||||
|
/* match against the core name map. */
|
||||||
|
it = core_profiles.find(coreName);
|
||||||
|
if (it != core_profiles.end())
|
||||||
|
{
|
||||||
|
ap = it->second;
|
||||||
|
bFound = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* try a pattern match on core name - pick up ARMvM[.m]-P and ARM-{aa|AA}64[-P] */
|
||||||
|
if (!bFound)
|
||||||
|
ap = getPatternMatchCoreName(coreName);
|
||||||
|
|
||||||
|
return ap;
|
||||||
|
}
|
||||||
|
ocsd_arch_profile_t CoreArchProfileMap::getPatternMatchCoreName(const std::string &coreName)
|
||||||
|
{
|
||||||
|
ocsd_arch_profile_t ap = { ARCH_UNKNOWN, profile_Unknown };
|
||||||
|
size_t pos;
|
||||||
|
|
||||||
|
/* look for ARMvM[.m]-P */
|
||||||
|
pos = coreName.find("ARMv");
|
||||||
|
if (pos == 0)
|
||||||
|
{
|
||||||
|
int majver = coreName[4] - '0';
|
||||||
|
int minver = 0;
|
||||||
|
int dotoffset = 0;
|
||||||
|
|
||||||
|
pos = coreName.find_first_of(".");
|
||||||
|
if (pos == 5) {
|
||||||
|
minver = coreName[6] - '0';
|
||||||
|
dotoffset = 2;
|
||||||
|
}
|
||||||
|
else if (pos != std::string::npos)
|
||||||
|
return ap;
|
||||||
|
|
||||||
|
if (majver == 7)
|
||||||
|
ap.arch = ARCH_V7;
|
||||||
|
else if (majver >= 8) {
|
||||||
|
ap.arch = ARCH_AA64; /* default to 8.3+*/
|
||||||
|
if (majver == 8) {
|
||||||
|
if (minver < 3)
|
||||||
|
ap.arch = ARCH_V8;
|
||||||
|
else if (minver == 3)
|
||||||
|
ap.arch = ARCH_V8r3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return ap; /* no valid version - return unknown */
|
||||||
|
|
||||||
|
if (coreName.find_first_of("-", 4) == (size_t)(5 + dotoffset)) {
|
||||||
|
int profile_idx = 6 + dotoffset;
|
||||||
|
if (coreName[profile_idx] == 'A')
|
||||||
|
ap.profile = profile_CortexA;
|
||||||
|
else if (coreName[profile_idx] == 'R')
|
||||||
|
ap.profile = profile_CortexR;
|
||||||
|
else if (coreName[profile_idx] == 'M')
|
||||||
|
ap.profile = profile_CortexM;
|
||||||
|
else
|
||||||
|
ap.arch = ARCH_UNKNOWN; /*reset arch, return unknown*/
|
||||||
|
}
|
||||||
|
else
|
||||||
|
ap.arch = ARCH_UNKNOWN; /*reset arch, return unknown*/
|
||||||
|
return ap;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* look for ARM-{AA|aa}64[-P] */
|
||||||
|
pos = coreName.find("ARM-");
|
||||||
|
if (pos == 0)
|
||||||
|
{
|
||||||
|
pos = coreName.find("aa64");
|
||||||
|
if (pos != 4)
|
||||||
|
pos = coreName.find("AA64");
|
||||||
|
if (pos == 4)
|
||||||
|
{
|
||||||
|
ap.arch = ARCH_AA64;
|
||||||
|
ap.profile = profile_CortexA;
|
||||||
|
if (coreName.find_first_of("-", 7) == 8) {
|
||||||
|
if (coreName[9] == 'R')
|
||||||
|
ap.profile = profile_CortexR;
|
||||||
|
else if (coreName[9] == 'M')
|
||||||
|
ap.profile = profile_CortexM;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ap;
|
||||||
|
}
|
||||||
/* End of File trc_core_arch_map.cpp */
|
/* End of File trc_core_arch_map.cpp */
|
||||||
|
@ -54,7 +54,8 @@ TraceFmtDcdImpl::TraceFmtDcdImpl() : TraceComponent(DEFORMATTER_NAME),
|
|||||||
m_use_force_sync(false),
|
m_use_force_sync(false),
|
||||||
m_alignment(16), // assume frame aligned data as default.
|
m_alignment(16), // assume frame aligned data as default.
|
||||||
m_b_output_packed_raw(false),
|
m_b_output_packed_raw(false),
|
||||||
m_b_output_unpacked_raw(false)
|
m_b_output_unpacked_raw(false),
|
||||||
|
m_pStatsBlock(0)
|
||||||
|
|
||||||
{
|
{
|
||||||
resetStateParams();
|
resetStateParams();
|
||||||
@ -245,6 +246,11 @@ ocsd_datapath_resp_t TraceFmtDcdImpl::processTraceData(
|
|||||||
throw ocsdError(OCSD_ERR_SEV_ERROR,OCSD_ERR_DFMTR_NOTCONTTRACE,index);
|
throw ocsdError(OCSD_ERR_SEV_ERROR,OCSD_ERR_DFMTR_NOTCONTTRACE,index);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// record the incoming block for extraction routines to use.
|
||||||
|
m_in_block_base = pDataBlock;
|
||||||
|
m_in_block_size = dataBlockSize;
|
||||||
|
m_in_block_processed = 0;
|
||||||
|
|
||||||
if(dataBlockSize % m_alignment) // must be correctly aligned data
|
if(dataBlockSize % m_alignment) // must be correctly aligned data
|
||||||
{
|
{
|
||||||
ocsdError err(OCSD_ERR_SEV_ERROR, OCSD_ERR_INVALID_PARAM_VAL);
|
ocsdError err(OCSD_ERR_SEV_ERROR, OCSD_ERR_INVALID_PARAM_VAL);
|
||||||
@ -254,11 +260,6 @@ ocsd_datapath_resp_t TraceFmtDcdImpl::processTraceData(
|
|||||||
throw ocsdError(&err);
|
throw ocsdError(&err);
|
||||||
}
|
}
|
||||||
|
|
||||||
// record the incoming block for extraction routines to use.
|
|
||||||
m_in_block_base = pDataBlock;
|
|
||||||
m_in_block_size = dataBlockSize;
|
|
||||||
m_in_block_processed = 0;
|
|
||||||
|
|
||||||
// processing loop...
|
// processing loop...
|
||||||
if(checkForSync())
|
if(checkForSync())
|
||||||
{
|
{
|
||||||
@ -324,12 +325,18 @@ ocsd_err_t TraceFmtDcdImpl::DecodeConfigure(uint32_t flags)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
// alightment is the multiple of bytes the buffer size must be.
|
||||||
m_cfgFlags = flags;
|
m_cfgFlags = flags;
|
||||||
|
|
||||||
|
// using memory aligned buffers, the formatter always outputs 16 byte frames so enforce
|
||||||
|
// this on the input
|
||||||
m_alignment = 16;
|
m_alignment = 16;
|
||||||
if(flags & OCSD_DFRMTR_HAS_FSYNCS)
|
// if we have HSYNCS then always align to 2 byte buffers
|
||||||
m_alignment = 4;
|
if(flags & OCSD_DFRMTR_HAS_HSYNCS)
|
||||||
else if(flags & OCSD_DFRMTR_HAS_HSYNCS)
|
|
||||||
m_alignment = 2;
|
m_alignment = 2;
|
||||||
|
// otherwise FSYNCS only can have 4 byte aligned buffers.
|
||||||
|
else if(flags & OCSD_DFRMTR_HAS_FSYNCS)
|
||||||
|
m_alignment = 4;
|
||||||
}
|
}
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
@ -344,6 +351,7 @@ void TraceFmtDcdImpl::resetStateParams()
|
|||||||
|
|
||||||
// current frame processing
|
// current frame processing
|
||||||
m_ex_frm_n_bytes = 0;
|
m_ex_frm_n_bytes = 0;
|
||||||
|
m_b_fsync_start_eob = false;
|
||||||
m_trc_curr_idx_sof = OCSD_BAD_TRC_INDEX;
|
m_trc_curr_idx_sof = OCSD_BAD_TRC_INDEX;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -415,20 +423,23 @@ void TraceFmtDcdImpl::outputUnsyncedBytes(uint32_t /*num_bytes*/)
|
|||||||
//**TBD:
|
//**TBD:
|
||||||
}
|
}
|
||||||
|
|
||||||
int TraceFmtDcdImpl::checkForResetFSyncPatterns()
|
ocsd_err_t TraceFmtDcdImpl::checkForResetFSyncPatterns(uint32_t &f_sync_bytes)
|
||||||
{
|
{
|
||||||
const uint32_t FSYNC_PATTERN = 0x7FFFFFFF; // LE host pattern for FSYNC
|
const uint32_t FSYNC_PATTERN = 0x7FFFFFFF; // LE host pattern for FSYNC
|
||||||
bool check_for_fsync = true;
|
bool check_for_fsync = true;
|
||||||
int num_fsyncs = 0;
|
int num_fsyncs = 0;
|
||||||
const uint8_t *dataPtr = m_in_block_base + m_in_block_processed;
|
uint32_t bytes_processed = m_in_block_processed;
|
||||||
|
const uint8_t *dataPtr = m_in_block_base + bytes_processed;
|
||||||
|
ocsd_err_t err = OCSD_OK;
|
||||||
|
|
||||||
while (check_for_fsync && (m_in_block_processed < m_in_block_size))
|
while (check_for_fsync && (bytes_processed < m_in_block_size))
|
||||||
{
|
{
|
||||||
// look for consecutive fsyncs as padding or for reset downstream - both cases will reset downstream....
|
// look for consecutive fsyncs as padding or for reset downstream - both cases will reset downstream....
|
||||||
if (*((uint32_t *)(dataPtr)) == FSYNC_PATTERN)
|
if (*((uint32_t *)(dataPtr)) == FSYNC_PATTERN)
|
||||||
{
|
{
|
||||||
dataPtr += sizeof(uint32_t);
|
dataPtr += sizeof(uint32_t);
|
||||||
num_fsyncs++;
|
num_fsyncs++;
|
||||||
|
bytes_processed += sizeof(uint32_t);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
check_for_fsync = false;
|
check_for_fsync = false;
|
||||||
@ -436,7 +447,6 @@ int TraceFmtDcdImpl::checkForResetFSyncPatterns()
|
|||||||
|
|
||||||
if (num_fsyncs)
|
if (num_fsyncs)
|
||||||
{
|
{
|
||||||
printf("Frame deformatter: Found %d FSYNCS\n",num_fsyncs);
|
|
||||||
if ((num_fsyncs % 4) == 0)
|
if ((num_fsyncs % 4) == 0)
|
||||||
{
|
{
|
||||||
// reset the upstream decoders
|
// reset the upstream decoders
|
||||||
@ -449,32 +459,40 @@ int TraceFmtDcdImpl::checkForResetFSyncPatterns()
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// TBD: throw processing error, none frame size block of fsyncs
|
err = OCSD_ERR_DFMTR_BAD_FHSYNC;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return num_fsyncs * 4;
|
f_sync_bytes += num_fsyncs * 4;
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Extract a single frame from the input buffer. */
|
||||||
bool TraceFmtDcdImpl::extractFrame()
|
bool TraceFmtDcdImpl::extractFrame()
|
||||||
{
|
{
|
||||||
const uint32_t FSYNC_PATTERN = 0x7FFFFFFF; // LE host pattern for FSYNC
|
const uint32_t FSYNC_PATTERN = 0x7FFFFFFF; // LE host pattern for FSYNC
|
||||||
const uint16_t HSYNC_PATTERN = 0x7FFF; // LE host pattern for HSYNC
|
const uint16_t HSYNC_PATTERN = 0x7FFF; // LE host pattern for HSYNC
|
||||||
|
const uint16_t FSYNC_START = 0xFFFF; // LE host pattern for start 2 bytes of fsync
|
||||||
|
|
||||||
|
ocsd_err_t err;
|
||||||
bool cont_process = true; // continue processing after extraction.
|
|
||||||
uint32_t f_sync_bytes = 0; // skipped f sync bytes
|
uint32_t f_sync_bytes = 0; // skipped f sync bytes
|
||||||
uint32_t h_sync_bytes = 0; // skipped h sync bytes
|
uint32_t h_sync_bytes = 0; // skipped h sync bytes
|
||||||
uint32_t ex_bytes = 0; // extracted this pass (may be filling out part frame)
|
uint32_t ex_bytes = 0; // extracted this pass (may be filling out part frame)
|
||||||
|
uint32_t buf_left = m_in_block_size - m_in_block_processed; // bytes remaining in buffer this pass.
|
||||||
|
|
||||||
// memory aligned sources are always multiples of frames, aligned to start.
|
// last call was end of input block - but carried on to process full frame.
|
||||||
|
// exit early here.
|
||||||
|
if (!buf_left)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// memory aligned input data is forced to be always multiples of 16 byte frames, aligned to start.
|
||||||
if( m_cfgFlags & OCSD_DFRMTR_FRAME_MEM_ALIGN)
|
if( m_cfgFlags & OCSD_DFRMTR_FRAME_MEM_ALIGN)
|
||||||
{
|
{
|
||||||
// some linux drivers (e.g. for perf) will insert FSYNCS to pad or differentiate
|
// some linux drivers (e.g. for perf) will insert FSYNCS to pad or differentiate
|
||||||
// between blocks of aligned data, always in frame aligned complete 16 byte frames.
|
// between blocks of aligned data, always in frame aligned complete 16 byte frames.
|
||||||
|
// we need to skip past these frames, resetting as we go.
|
||||||
if (m_cfgFlags & OCSD_DFRMTR_RESET_ON_4X_FSYNC)
|
if (m_cfgFlags & OCSD_DFRMTR_RESET_ON_4X_FSYNC)
|
||||||
{
|
{
|
||||||
f_sync_bytes = checkForResetFSyncPatterns();
|
err = checkForResetFSyncPatterns(f_sync_bytes);
|
||||||
|
|
||||||
/* in this case the FSYNC pattern is output on both packed and unpacked cases */
|
/* in this case the FSYNC pattern is output on both packed and unpacked cases */
|
||||||
if (f_sync_bytes && (m_b_output_packed_raw || m_b_output_unpacked_raw))
|
if (f_sync_bytes && (m_b_output_packed_raw || m_b_output_unpacked_raw))
|
||||||
@ -486,77 +504,96 @@ bool TraceFmtDcdImpl::extractFrame()
|
|||||||
m_in_block_base + m_in_block_processed,
|
m_in_block_base + m_in_block_processed,
|
||||||
0);
|
0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// throw processing error, none frame size block of fsyncs
|
||||||
|
if (err)
|
||||||
|
throw ocsdError(OCSD_ERR_SEV_ERROR, err, m_trc_curr_idx, "Incorrect FSYNC frame reset pattern");
|
||||||
|
|
||||||
|
buf_left -= f_sync_bytes;
|
||||||
}
|
}
|
||||||
|
|
||||||
if((m_in_block_processed+f_sync_bytes) == m_in_block_size)
|
if (buf_left)
|
||||||
{
|
{
|
||||||
m_ex_frm_n_bytes = 0;
|
// always a complete frame - the input data has to be 16 byte multiple alignment.
|
||||||
cont_process = false; // end of input data.
|
m_ex_frm_n_bytes = OCSD_DFRMTR_FRAME_SIZE;
|
||||||
}
|
memcpy(m_ex_frm_data, m_in_block_base + m_in_block_processed + f_sync_bytes, m_ex_frm_n_bytes);
|
||||||
else
|
m_trc_curr_idx_sof = m_trc_curr_idx + f_sync_bytes;
|
||||||
{
|
ex_bytes = OCSD_DFRMTR_FRAME_SIZE;
|
||||||
// always a complete frame.
|
|
||||||
m_ex_frm_n_bytes = OCSD_DFRMTR_FRAME_SIZE;
|
|
||||||
memcpy(m_ex_frm_data, m_in_block_base + m_in_block_processed + f_sync_bytes, m_ex_frm_n_bytes);
|
|
||||||
m_trc_curr_idx_sof = m_trc_curr_idx + f_sync_bytes;
|
|
||||||
ex_bytes = OCSD_DFRMTR_FRAME_SIZE;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// extract data accounting for frame syncs and hsyncs if present.
|
// extract data accounting for frame syncs and hsyncs if present.
|
||||||
// we know we are aligned at this point - could be FSYNC or HSYNCs here.
|
// we know we are aligned at this point - could be FSYNC or HSYNCs here.
|
||||||
|
// HSYNC present, library forces input to be aligned 2 byte multiples
|
||||||
|
// FSYNC - w/o HSYNCs, forces input to be aligned 4 byte multiples.
|
||||||
|
|
||||||
// check what we a looking for
|
// check what we a looking for
|
||||||
bool hasFSyncs = ((m_cfgFlags & OCSD_DFRMTR_HAS_FSYNCS) == OCSD_DFRMTR_HAS_FSYNCS);
|
bool hasFSyncs = ((m_cfgFlags & OCSD_DFRMTR_HAS_FSYNCS) == OCSD_DFRMTR_HAS_FSYNCS);
|
||||||
bool hasHSyncs = ((m_cfgFlags & OCSD_DFRMTR_HAS_HSYNCS) == OCSD_DFRMTR_HAS_HSYNCS);
|
bool hasHSyncs = ((m_cfgFlags & OCSD_DFRMTR_HAS_HSYNCS) == OCSD_DFRMTR_HAS_HSYNCS);
|
||||||
|
|
||||||
const uint8_t *dataPtr = m_in_block_base+m_in_block_processed;
|
const uint8_t* dataPtr = m_in_block_base + m_in_block_processed;
|
||||||
const uint8_t *eodPtr = m_in_block_base+m_in_block_size;
|
uint16_t data_pair_val;
|
||||||
|
|
||||||
cont_process = (bool)(dataPtr < eodPtr);
|
|
||||||
|
|
||||||
// can have FSYNCS at start of frame (in middle is an error).
|
// can have FSYNCS at start of frame (in middle is an error).
|
||||||
if(hasFSyncs && cont_process && (m_ex_frm_n_bytes == 0))
|
if (hasFSyncs && (m_ex_frm_n_bytes == 0))
|
||||||
{
|
{
|
||||||
while((*((uint32_t *)(dataPtr)) == FSYNC_PATTERN) && cont_process)
|
// was there an fsync start at the end of the last buffer?
|
||||||
|
if (m_b_fsync_start_eob) {
|
||||||
|
// last 2 of FSYNC look like HSYNC
|
||||||
|
if (*(uint16_t*)(dataPtr) != HSYNC_PATTERN)
|
||||||
|
{
|
||||||
|
// this means 0xFFFF followed by something else - invalid ID + ????
|
||||||
|
throw ocsdError(OCSD_ERR_SEV_ERROR, OCSD_ERR_DFMTR_BAD_FHSYNC, m_trc_curr_idx, "Bad FSYNC pattern before frame or invalid ID.(0x7F)");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
f_sync_bytes += 2;
|
||||||
|
buf_left -= 2;
|
||||||
|
dataPtr += 2;
|
||||||
|
}
|
||||||
|
m_b_fsync_start_eob = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// regular fsync checks
|
||||||
|
while ((buf_left >= 4) && (*((uint32_t*)(dataPtr)) == FSYNC_PATTERN))
|
||||||
{
|
{
|
||||||
f_sync_bytes += 4;
|
f_sync_bytes += 4;
|
||||||
dataPtr += 4;
|
dataPtr += 4;
|
||||||
cont_process = (bool)(dataPtr < eodPtr);
|
buf_left -= 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
// handle possible part fsync at the end of a buffer
|
||||||
|
if (buf_left == 2)
|
||||||
|
{
|
||||||
|
if (*(uint16_t*)(dataPtr) == FSYNC_START)
|
||||||
|
{
|
||||||
|
f_sync_bytes += 2;
|
||||||
|
buf_left -= 2;
|
||||||
|
dataPtr += 2;
|
||||||
|
m_b_fsync_start_eob = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// not an FSYNC
|
// process remaining data in pairs of bytes
|
||||||
while((m_ex_frm_n_bytes < OCSD_DFRMTR_FRAME_SIZE) && cont_process)
|
while ((m_ex_frm_n_bytes < OCSD_DFRMTR_FRAME_SIZE) && buf_left)
|
||||||
{
|
{
|
||||||
// check for illegal out of sequence FSYNC
|
|
||||||
if((m_ex_frm_n_bytes % 4) == 0)
|
|
||||||
{
|
|
||||||
if(*((uint32_t *)(dataPtr)) == FSYNC_PATTERN)
|
|
||||||
{
|
|
||||||
// throw an illegal FSYNC error
|
|
||||||
throw ocsdError(OCSD_ERR_SEV_ERROR, OCSD_ERR_DFMTR_BAD_FHSYNC, m_trc_curr_idx, "Bad FSYNC in frame.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// mark start of frame after FSyncs
|
// mark start of frame after FSyncs
|
||||||
if(m_ex_frm_n_bytes == 0)
|
if (m_ex_frm_n_bytes == 0)
|
||||||
m_trc_curr_idx_sof = m_trc_curr_idx + f_sync_bytes;
|
m_trc_curr_idx_sof = m_trc_curr_idx + f_sync_bytes;
|
||||||
|
|
||||||
m_ex_frm_data[m_ex_frm_n_bytes] = dataPtr[0];
|
m_ex_frm_data[m_ex_frm_n_bytes] = dataPtr[0];
|
||||||
m_ex_frm_data[m_ex_frm_n_bytes+1] = dataPtr[1];
|
m_ex_frm_data[m_ex_frm_n_bytes + 1] = dataPtr[1];
|
||||||
m_ex_frm_n_bytes+=2;
|
|
||||||
ex_bytes +=2;
|
data_pair_val = *((uint16_t*)(dataPtr));
|
||||||
|
|
||||||
// check pair is not HSYNC
|
// check pair is not HSYNC
|
||||||
if(*((uint16_t *)(dataPtr)) == HSYNC_PATTERN)
|
if (data_pair_val == HSYNC_PATTERN)
|
||||||
{
|
{
|
||||||
if(hasHSyncs)
|
if (hasHSyncs)
|
||||||
{
|
{
|
||||||
m_ex_frm_n_bytes-=2;
|
h_sync_bytes += 2;
|
||||||
ex_bytes -= 2;
|
|
||||||
h_sync_bytes+=2;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -564,22 +601,27 @@ bool TraceFmtDcdImpl::extractFrame()
|
|||||||
throw ocsdError(OCSD_ERR_SEV_ERROR, OCSD_ERR_DFMTR_BAD_FHSYNC, m_trc_curr_idx, "Bad HSYNC in frame.");
|
throw ocsdError(OCSD_ERR_SEV_ERROR, OCSD_ERR_DFMTR_BAD_FHSYNC, m_trc_curr_idx, "Bad HSYNC in frame.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// can't have a start of FSYNC here / illegal trace ID
|
||||||
|
else if (data_pair_val == FSYNC_START)
|
||||||
|
{
|
||||||
|
throw ocsdError(OCSD_ERR_SEV_ERROR, OCSD_ERR_DFMTR_BAD_FHSYNC, m_trc_curr_idx, "Bad FSYNC start in frame or invalid ID (0x7F).");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_ex_frm_n_bytes += 2;
|
||||||
|
ex_bytes += 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
buf_left -= 2;
|
||||||
dataPtr += 2;
|
dataPtr += 2;
|
||||||
cont_process = (bool)(dataPtr < eodPtr);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// if we hit the end of data but still have a complete frame waiting,
|
|
||||||
// need to continue processing to allow it to be used.
|
|
||||||
if(!cont_process && (m_ex_frm_n_bytes == OCSD_DFRMTR_FRAME_SIZE))
|
|
||||||
cont_process = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// total bytes processed this pass
|
// total bytes processed this pass
|
||||||
uint32_t total_processed = ex_bytes + f_sync_bytes + h_sync_bytes;
|
uint32_t total_processed = ex_bytes + f_sync_bytes + h_sync_bytes;
|
||||||
|
|
||||||
// output raw data on raw frame channel - packed raw.
|
// output raw data on raw frame channel - packed raw.
|
||||||
if (((m_ex_frm_n_bytes == OCSD_DFRMTR_FRAME_SIZE) || !cont_process) && m_b_output_packed_raw)
|
if (((m_ex_frm_n_bytes == OCSD_DFRMTR_FRAME_SIZE) || (buf_left == 0)) && m_b_output_packed_raw)
|
||||||
{
|
{
|
||||||
outputRawMonBytes( OCSD_OP_DATA,
|
outputRawMonBytes( OCSD_OP_DATA,
|
||||||
m_trc_curr_idx,
|
m_trc_curr_idx,
|
||||||
@ -595,7 +637,11 @@ bool TraceFmtDcdImpl::extractFrame()
|
|||||||
// update index past the processed data
|
// update index past the processed data
|
||||||
m_trc_curr_idx += total_processed;
|
m_trc_curr_idx += total_processed;
|
||||||
|
|
||||||
return cont_process;
|
// update any none trace data byte stats
|
||||||
|
addToFrameStats((uint64_t)(f_sync_bytes + h_sync_bytes));
|
||||||
|
|
||||||
|
// if we are exiting with a full frame then signal processing to continue
|
||||||
|
return (bool)(m_ex_frm_n_bytes == OCSD_DFRMTR_FRAME_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TraceFmtDcdImpl::unpackFrame()
|
bool TraceFmtDcdImpl::unpackFrame()
|
||||||
@ -604,6 +650,7 @@ bool TraceFmtDcdImpl::unpackFrame()
|
|||||||
uint8_t frameFlagBit = 0x1;
|
uint8_t frameFlagBit = 0x1;
|
||||||
uint8_t newSrcID = OCSD_BAD_CS_SRC_ID;
|
uint8_t newSrcID = OCSD_BAD_CS_SRC_ID;
|
||||||
bool PrevIDandIDChange = false;
|
bool PrevIDandIDChange = false;
|
||||||
|
uint64_t noneDataBytes = 0;
|
||||||
|
|
||||||
// init output processing
|
// init output processing
|
||||||
m_out_data_idx = 0;
|
m_out_data_idx = 0;
|
||||||
@ -650,6 +697,7 @@ bool TraceFmtDcdImpl::unpackFrame()
|
|||||||
|
|
||||||
/// TBD - ID indexing in here.
|
/// TBD - ID indexing in here.
|
||||||
}
|
}
|
||||||
|
noneDataBytes++;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
// it's just data
|
// it's just data
|
||||||
@ -671,6 +719,7 @@ bool TraceFmtDcdImpl::unpackFrame()
|
|||||||
{
|
{
|
||||||
// no matter if change or not, no associated data in byte 15 anyway so just set.
|
// no matter if change or not, no associated data in byte 15 anyway so just set.
|
||||||
m_curr_src_ID = (m_ex_frm_data[14] >> 1) & 0x7f;
|
m_curr_src_ID = (m_ex_frm_data[14] >> 1) & 0x7f;
|
||||||
|
noneDataBytes++;
|
||||||
}
|
}
|
||||||
// it's data
|
// it's data
|
||||||
else
|
else
|
||||||
@ -678,6 +727,9 @@ bool TraceFmtDcdImpl::unpackFrame()
|
|||||||
m_out_data[m_out_data_idx].data[m_out_data[m_out_data_idx].valid++] = m_ex_frm_data[14] | ((frameFlagBit & m_ex_frm_data[15]) ? 0x1 : 0x0);
|
m_out_data[m_out_data_idx].data[m_out_data[m_out_data_idx].valid++] = m_ex_frm_data[14] | ((frameFlagBit & m_ex_frm_data[15]) ? 0x1 : 0x0);
|
||||||
}
|
}
|
||||||
m_ex_frm_n_bytes = 0; // mark frame as empty;
|
m_ex_frm_n_bytes = 0; // mark frame as empty;
|
||||||
|
|
||||||
|
noneDataBytes++; // byte 15 is always non-data.
|
||||||
|
addToFrameStats(noneDataBytes); // update the non data byte stats.
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -716,6 +768,8 @@ bool TraceFmtDcdImpl::outputFrame()
|
|||||||
m_out_data[m_out_processed].data + m_out_data[m_out_processed].used,
|
m_out_data[m_out_processed].data + m_out_data[m_out_processed].used,
|
||||||
&bytes_used));
|
&bytes_used));
|
||||||
|
|
||||||
|
addToIDStats((uint64_t)bytes_used);
|
||||||
|
|
||||||
if(!dataPathCont())
|
if(!dataPathCont())
|
||||||
{
|
{
|
||||||
cont_processing = false;
|
cont_processing = false;
|
||||||
@ -740,6 +794,11 @@ bool TraceFmtDcdImpl::outputFrame()
|
|||||||
m_out_data[m_out_processed].data,
|
m_out_data[m_out_processed].data,
|
||||||
m_out_data[m_out_processed].id);
|
m_out_data[m_out_processed].id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (isReservedID(m_out_data[m_out_processed].id))
|
||||||
|
addToReservedIDStats((uint64_t)m_out_data[m_out_processed].valid);
|
||||||
|
else
|
||||||
|
addToNoIDStats((uint64_t)m_out_data[m_out_processed].valid);
|
||||||
m_out_processed++; // skip past this data.
|
m_out_processed++; // skip past this data.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -755,12 +814,43 @@ bool TraceFmtDcdImpl::outputFrame()
|
|||||||
m_out_data[m_out_processed].data,
|
m_out_data[m_out_processed].data,
|
||||||
m_out_data[m_out_processed].id);
|
m_out_data[m_out_processed].id);
|
||||||
}
|
}
|
||||||
|
addToUnknownIDStats((uint64_t)m_out_data[m_out_processed].valid);
|
||||||
m_out_processed++; // skip past this data.
|
m_out_processed++; // skip past this data.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return cont_processing;
|
return cont_processing;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TraceFmtDcdImpl::addToIDStats(uint64_t val)
|
||||||
|
{
|
||||||
|
if (m_pStatsBlock)
|
||||||
|
m_pStatsBlock->valid_id_bytes += val;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TraceFmtDcdImpl::addToNoIDStats(uint64_t val)
|
||||||
|
{
|
||||||
|
if (m_pStatsBlock)
|
||||||
|
m_pStatsBlock->no_id_bytes += val;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TraceFmtDcdImpl::addToFrameStats(uint64_t val)
|
||||||
|
{
|
||||||
|
if (m_pStatsBlock)
|
||||||
|
m_pStatsBlock->frame_bytes += val;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TraceFmtDcdImpl::addToUnknownIDStats(uint64_t val)
|
||||||
|
{
|
||||||
|
if (m_pStatsBlock)
|
||||||
|
m_pStatsBlock->unknown_id_bytes += val;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TraceFmtDcdImpl::addToReservedIDStats(uint64_t val)
|
||||||
|
{
|
||||||
|
if (m_pStatsBlock)
|
||||||
|
m_pStatsBlock->reserved_id_bytes += val;
|
||||||
|
}
|
||||||
|
|
||||||
/***************************************************************/
|
/***************************************************************/
|
||||||
/* interface */
|
/* interface */
|
||||||
/***************************************************************/
|
/***************************************************************/
|
||||||
@ -819,21 +909,27 @@ componentAttachPt<ITraceErrorLog> *TraceFormatterFrameDecoder::getErrLogAttachPt
|
|||||||
return (m_pDecoder != 0) ? m_pDecoder->getErrorLogAttachPt() : 0;
|
return (m_pDecoder != 0) ? m_pDecoder->getErrorLogAttachPt() : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* configuration - set operational mode for incoming stream (has FSYNCS etc) */
|
ocsd_err_t TraceFormatterFrameDecoder::Init()
|
||||||
ocsd_err_t TraceFormatterFrameDecoder::Configure(uint32_t cfg_flags)
|
|
||||||
{
|
{
|
||||||
if(!m_pDecoder)
|
if (!m_pDecoder)
|
||||||
{
|
{
|
||||||
if(m_instNum >= 0)
|
if (m_instNum >= 0)
|
||||||
m_pDecoder = new (std::nothrow) TraceFmtDcdImpl(m_instNum);
|
m_pDecoder = new (std::nothrow) TraceFmtDcdImpl(m_instNum);
|
||||||
else
|
else
|
||||||
m_pDecoder = new (std::nothrow) TraceFmtDcdImpl();
|
m_pDecoder = new (std::nothrow) TraceFmtDcdImpl();
|
||||||
if(!m_pDecoder) return OCSD_ERR_MEM;
|
if (!m_pDecoder) return OCSD_ERR_MEM;
|
||||||
}
|
}
|
||||||
m_pDecoder->DecodeConfigure(cfg_flags);
|
|
||||||
return OCSD_OK;
|
return OCSD_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* configuration - set operational mode for incoming stream (has FSYNCS etc) */
|
||||||
|
ocsd_err_t TraceFormatterFrameDecoder::Configure(uint32_t cfg_flags)
|
||||||
|
{
|
||||||
|
if (!m_pDecoder)
|
||||||
|
return OCSD_ERR_NOT_INIT;
|
||||||
|
return m_pDecoder->DecodeConfigure(cfg_flags);
|
||||||
|
}
|
||||||
|
|
||||||
const uint32_t TraceFormatterFrameDecoder::getConfigFlags() const
|
const uint32_t TraceFormatterFrameDecoder::getConfigFlags() const
|
||||||
{
|
{
|
||||||
uint32_t flags = 0;
|
uint32_t flags = 0;
|
||||||
@ -865,5 +961,10 @@ ocsd_datapath_resp_t TraceFormatterFrameDecoder::Flush()
|
|||||||
return (m_pDecoder == 0) ? OCSD_RESP_FATAL_NOT_INIT : m_pDecoder->Flush();
|
return (m_pDecoder == 0) ? OCSD_RESP_FATAL_NOT_INIT : m_pDecoder->Flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TraceFormatterFrameDecoder::SetDemuxStatsBlock(ocsd_demux_stats_t *pStatsBlock)
|
||||||
|
{
|
||||||
|
if (m_pDecoder)
|
||||||
|
m_pDecoder->SetDemuxStatsBlock(pStatsBlock);
|
||||||
|
}
|
||||||
|
|
||||||
/* End of File trc_frame_deformatter.cpp */
|
/* End of File trc_frame_deformatter.cpp */
|
||||||
|
@ -75,6 +75,8 @@ class TraceFmtDcdImpl : public TraceComponent, ITrcDataIn
|
|||||||
ocsd_err_t DecodeConfigure(uint32_t flags);
|
ocsd_err_t DecodeConfigure(uint32_t flags);
|
||||||
ocsd_err_t SetForcedSyncIndex(ocsd_trc_index_t index, bool bSet);
|
ocsd_err_t SetForcedSyncIndex(ocsd_trc_index_t index, bool bSet);
|
||||||
|
|
||||||
|
void SetDemuxStatsBlock(ocsd_demux_stats_t *pStatsBlock) { m_pStatsBlock = pStatsBlock; };
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ocsd_datapath_resp_t executeNoneDataOpAllIDs(ocsd_datapath_op_t op, const ocsd_trc_index_t index = 0);
|
ocsd_datapath_resp_t executeNoneDataOpAllIDs(ocsd_datapath_op_t op, const ocsd_trc_index_t index = 0);
|
||||||
ocsd_datapath_resp_t processTraceData(const ocsd_trc_index_t index,
|
ocsd_datapath_resp_t processTraceData(const ocsd_trc_index_t index,
|
||||||
@ -113,12 +115,20 @@ class TraceFmtDcdImpl : public TraceComponent, ITrcDataIn
|
|||||||
void setRawChanFilterAll(bool bEnable);
|
void setRawChanFilterAll(bool bEnable);
|
||||||
const bool rawChanEnabled(const uint8_t id) const;
|
const bool rawChanEnabled(const uint8_t id) const;
|
||||||
|
|
||||||
int checkForResetFSyncPatterns();
|
ocsd_err_t checkForResetFSyncPatterns(uint32_t &f_sync_bytes);
|
||||||
|
|
||||||
friend class TraceFormatterFrameDecoder;
|
friend class TraceFormatterFrameDecoder;
|
||||||
|
|
||||||
// attachment points
|
// stats updates
|
||||||
|
void addToIDStats(uint64_t val);
|
||||||
|
void addToNoIDStats(uint64_t val);
|
||||||
|
void addToFrameStats(uint64_t val);
|
||||||
|
void addToUnknownIDStats(uint64_t val);
|
||||||
|
void addToReservedIDStats(uint64_t val);
|
||||||
|
|
||||||
|
bool isReservedID(uint8_t ID) { return ((ID == 0) || (ID >= 0x70)); };
|
||||||
|
|
||||||
|
// attachment points
|
||||||
componentAttachPt<ITrcDataIn> m_IDStreams[128];
|
componentAttachPt<ITrcDataIn> m_IDStreams[128];
|
||||||
componentAttachPt<ITrcRawFrameIn> m_RawTraceFrame;
|
componentAttachPt<ITrcRawFrameIn> m_RawTraceFrame;
|
||||||
|
|
||||||
@ -142,12 +152,18 @@ class TraceFmtDcdImpl : public TraceComponent, ITrcDataIn
|
|||||||
// incoming frame buffer
|
// incoming frame buffer
|
||||||
uint8_t m_ex_frm_data[OCSD_DFRMTR_FRAME_SIZE]; // buffer the current frame in case we have to stop part way through
|
uint8_t m_ex_frm_data[OCSD_DFRMTR_FRAME_SIZE]; // buffer the current frame in case we have to stop part way through
|
||||||
int m_ex_frm_n_bytes; // number of valid bytes in the current frame (extraction)
|
int m_ex_frm_n_bytes; // number of valid bytes in the current frame (extraction)
|
||||||
|
bool m_b_fsync_start_eob; // flag to indicate that the end of the last buffer was a pair of bytes
|
||||||
|
// (0xffff) that could only validly be the start and FSYNC.
|
||||||
ocsd_trc_index_t m_trc_curr_idx_sof; // trace source index at start of frame.
|
ocsd_trc_index_t m_trc_curr_idx_sof; // trace source index at start of frame.
|
||||||
|
|
||||||
// channel output data - can never be more than a frame of data for a single ID.
|
/* channel output data - can never be more than a frame of data for a single ID.
|
||||||
out_chan_data m_out_data[7]; // can only be 8 ID changes in a frame, but last on has no associated data so 7 possible data blocks
|
* 8 possible ID changes per frame. Although the final one can have no associated data, a pathological
|
||||||
|
* case exists with 7 ID changes, all data associated with a previous frame, except for last
|
||||||
|
* ID / data byte which is data. Not possible with normal hardware but guard against corrupt input.
|
||||||
|
*/
|
||||||
|
out_chan_data m_out_data[8]; // output data for a given ID
|
||||||
int m_out_data_idx; // number of out_chan_data frames used.
|
int m_out_data_idx; // number of out_chan_data frames used.
|
||||||
int m_out_processed; // number of complete out_chan_data frames output.
|
int m_out_processed; // number of complete out_chan_data frames output.
|
||||||
|
|
||||||
/* local copy of input buffer pointers*/
|
/* local copy of input buffer pointers*/
|
||||||
const uint8_t *m_in_block_base;
|
const uint8_t *m_in_block_base;
|
||||||
@ -159,6 +175,8 @@ class TraceFmtDcdImpl : public TraceComponent, ITrcDataIn
|
|||||||
bool m_b_output_unpacked_raw;
|
bool m_b_output_unpacked_raw;
|
||||||
|
|
||||||
bool m_raw_chan_enable[128];
|
bool m_raw_chan_enable[128];
|
||||||
|
|
||||||
|
ocsd_demux_stats_t *m_pStatsBlock;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -54,7 +54,10 @@ static const char *s_elem_descs[][2] =
|
|||||||
{"OCSD_GEN_TRC_ELEM_TIMESTAMP","Timestamp - preceding elements happeded before this time."},
|
{"OCSD_GEN_TRC_ELEM_TIMESTAMP","Timestamp - preceding elements happeded before this time."},
|
||||||
{"OCSD_GEN_TRC_ELEM_CYCLE_COUNT","Cycle count - cycles since last cycle count value - associated with a preceding instruction range."},
|
{"OCSD_GEN_TRC_ELEM_CYCLE_COUNT","Cycle count - cycles since last cycle count value - associated with a preceding instruction range."},
|
||||||
{"OCSD_GEN_TRC_ELEM_EVENT","Event - numbered event or trigger"},
|
{"OCSD_GEN_TRC_ELEM_EVENT","Event - numbered event or trigger"},
|
||||||
{"OCSD_GEN_TRC_ELEM_SWTRACE","Software trace packet - may contain data payload."},
|
{"OCSD_GEN_TRC_ELEM_SWTRACE","Software trace packet - may contain data payload. STM / ITM hardware trace with channel protocol."},
|
||||||
|
{"OCSD_GEN_TRC_ELEM_SYNC_MARKER","Synchronisation marker - marks position in stream of an element that is output later."},
|
||||||
|
{"OCSD_GEN_TRC_ELEM_MEMTRANS","Trace indication of transactional memory operations."},
|
||||||
|
{"OCSD_GEN_TRC_ELEM_INSTRUMENTATION", "PE instrumentation trace - PE generated SW trace, application dependent protocol."},
|
||||||
{"OCSD_GEN_TRC_ELEM_CUSTOM","Fully custom packet type."}
|
{"OCSD_GEN_TRC_ELEM_CUSTOM","Fully custom packet type."}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -64,7 +67,8 @@ static const char *instr_type[] = {
|
|||||||
"iBR ",
|
"iBR ",
|
||||||
"ISB ",
|
"ISB ",
|
||||||
"DSB.DMB",
|
"DSB.DMB",
|
||||||
"WFI.WFE"
|
"WFI.WFE",
|
||||||
|
"TSTART"
|
||||||
};
|
};
|
||||||
|
|
||||||
#define T_SIZE (sizeof(instr_type) / sizeof(const char *))
|
#define T_SIZE (sizeof(instr_type) / sizeof(const char *))
|
||||||
@ -105,6 +109,16 @@ static const char *s_unsync_reason[] = {
|
|||||||
"bad-packet", // UNSYNC_BAD_PACKET - bad packet at input - resync to restart.
|
"bad-packet", // UNSYNC_BAD_PACKET - bad packet at input - resync to restart.
|
||||||
"end-of-trace", // UNSYNC_EOT - end of trace info.
|
"end-of-trace", // UNSYNC_EOT - end of trace info.
|
||||||
};
|
};
|
||||||
|
static const char *s_transaction_type[] = {
|
||||||
|
"Init",
|
||||||
|
"Start",
|
||||||
|
"Commit",
|
||||||
|
"Fail"
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char *s_marker_t[] = {
|
||||||
|
"Timestamp marker", // ELEM_MARKER_TS
|
||||||
|
};
|
||||||
|
|
||||||
void OcsdTraceElement::toString(std::string &str) const
|
void OcsdTraceElement::toString(std::string &str) const
|
||||||
{
|
{
|
||||||
@ -158,7 +172,14 @@ void OcsdTraceElement::toString(std::string &str) const
|
|||||||
{
|
{
|
||||||
oss << "EL" << std::dec << (int)(context.exception_level);
|
oss << "EL" << std::dec << (int)(context.exception_level);
|
||||||
}
|
}
|
||||||
oss << (context.security_level == ocsd_sec_secure ? "S; " : "N; ") << (context.bits64 ? "64-bit; " : "32-bit; ");
|
switch (context.security_level)
|
||||||
|
{
|
||||||
|
case ocsd_sec_secure: oss << "S; "; break;
|
||||||
|
case ocsd_sec_nonsecure: oss << "N; "; break;
|
||||||
|
case ocsd_sec_root: oss << "Root; "; break;
|
||||||
|
case ocsd_sec_realm: oss << "Realm; "; break;
|
||||||
|
}
|
||||||
|
oss << (context.bits64 ? "64-bit; " : "32-bit; ");
|
||||||
if(context.vmid_valid)
|
if(context.vmid_valid)
|
||||||
oss << "VMID=0x" << std::hex << context.vmid << "; ";
|
oss << "VMID=0x" << std::hex << context.vmid << "; ";
|
||||||
if(context.ctxt_id_valid)
|
if(context.ctxt_id_valid)
|
||||||
@ -190,6 +211,19 @@ void OcsdTraceElement::toString(std::string &str) const
|
|||||||
oss << " [" << s_unsync_reason[unsync_eot_info] << "]";
|
oss << " [" << s_unsync_reason[unsync_eot_info] << "]";
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case OCSD_GEN_TRC_ELEM_SYNC_MARKER:
|
||||||
|
oss << " [" << s_marker_t[sync_marker.type] << "(0x" << std::setfill('0') << std::setw(8) << std::hex << sync_marker.value << ")]";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OCSD_GEN_TRC_ELEM_MEMTRANS:
|
||||||
|
if (mem_trans <= OCSD_MEM_TRANS_FAIL)
|
||||||
|
oss << s_transaction_type[mem_trans];
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OCSD_GEN_TRC_ELEM_INSTRUMENTATION:
|
||||||
|
oss << "EL" << std::dec << (int)sw_ite.el << "; 0x" << std::setfill('0') << std::setw(16) << std::hex << sw_ite.value;
|
||||||
|
break;
|
||||||
|
|
||||||
default: break;
|
default: break;
|
||||||
}
|
}
|
||||||
if(has_cc)
|
if(has_cc)
|
||||||
|
@ -52,8 +52,6 @@ void trcPrintableElem::getValStr(std::string &valStr, const int valTotalBitSize,
|
|||||||
|
|
||||||
assert((valTotalBitSize >= 4) && (valTotalBitSize <= 64));
|
assert((valTotalBitSize >= 4) && (valTotalBitSize <= 64));
|
||||||
|
|
||||||
uint64_t LimitMask = ~0ULL;
|
|
||||||
LimitMask >>= 64-valTotalBitSize;
|
|
||||||
valStr = "0x";
|
valStr = "0x";
|
||||||
|
|
||||||
if(asHex)
|
if(asHex)
|
||||||
|
@ -87,12 +87,12 @@ kernel and many targets are using older kernels. To enable CoreSight trace
|
|||||||
on these targets, Arm have provided backports of the latest CoreSight
|
on these targets, Arm have provided backports of the latest CoreSight
|
||||||
drivers and ETM strobing patch at:
|
drivers and ETM strobing patch at:
|
||||||
|
|
||||||
<http://linux-arm.org/git?p=linux-coresight-backports.git>
|
<https://gitlab.arm.com/linux-arm/linux-coresight-backports>
|
||||||
|
|
||||||
This repository can be cloned with:
|
This repository can be cloned with:
|
||||||
|
|
||||||
```
|
```
|
||||||
git clone git://linux-arm.org/linux-coresight-backports.git
|
git clone https://git.gitlab.arm.com/linux-arm/linux-coresight-backports.git
|
||||||
```
|
```
|
||||||
|
|
||||||
You can include these backports in your kernel by either merging the
|
You can include these backports in your kernel by either merging the
|
||||||
@ -433,10 +433,50 @@ sudo ./set_strobing.sh 5000 10000
|
|||||||
perf record -e cs_etm/@tmc_etr0/u --per-thread -- <your app>"
|
perf record -e cs_etm/@tmc_etr0/u --per-thread -- <your app>"
|
||||||
perf inject -i perf.data -o inj.data --itrace=i100000il
|
perf inject -i perf.data -o inj.data --itrace=i100000il
|
||||||
create_llvm_prof -binary=/path/to/binary -profile=inj.data -out=program.llvmprof
|
create_llvm_prof -binary=/path/to/binary -profile=inj.data -out=program.llvmprof
|
||||||
|
clang -O2 -fprofile-sample-use=program.llvmprof -o program program.c
|
||||||
```
|
```
|
||||||
|
|
||||||
Use `create_gcov` for gcc.
|
Use `create_gcov` for gcc.
|
||||||
|
|
||||||
|
## High Level Summary for recoding on Arm board and decoding on different host
|
||||||
|
|
||||||
|
1. (on Arm board)
|
||||||
|
|
||||||
|
sudo ./set_strobing.sh 5000 10000
|
||||||
|
perf record -e cs_etm/@tmc_etr0/u --per-thread -- <your app>.
|
||||||
|
If you specify `-N, --no-buildid-cache`, perf will just take care of recording the target binary and nothing will be copied.<br> If you don't specify it, any recorded dynamic library will be copied to ~/.debug in the board.
|
||||||
|
|
||||||
|
2. (on Arm board) `perf archive` which saves all the found libraries in a tar (internally, it looks into perf.data file and performs a lookup using perf-buildid-list --with-hits)
|
||||||
|
3. (on host) `scp` to copy perf.data and the .tar file generated from `perf archive`.
|
||||||
|
4. (on host) Run `tar xvf perf_data.tar.bz2 -C ~/.debug` to populate the buildid-cache
|
||||||
|
5. (on host) Double check the setup is correct:
|
||||||
|
|
||||||
|
a. `perf buildid-list -i perf.data` gives you the list of dynamic libraries buildids whose trace has been recorded and saved in perf.data.
|
||||||
|
b. `perf buildid-cache --list` lists the dynamic libraries in the buildid cache that will be used by `perf inject`.
|
||||||
|
Make sure the output of (a) and (b) overlaps as in buildid value for those binaries you are interested into optimizing with afdo.
|
||||||
|
|
||||||
|
6. (on host) `perf inject -i perf.data -o inj.data --itrace=i100000il` will check for the dynamic libraries using the buildid inside the buildid-cache and post-process the trace.<br> buildids have to be the same, otherwise it won't be possible to post-process the trace.
|
||||||
|
|
||||||
|
7. (on host) `create_llvm_prof -binary=/path/to/binary -profile=inj.data -out=program.llvmprof` takes the output from perf-inject and tranforms it into a format that the compiler can read.
|
||||||
|
8. (on host) `clang -O2 -fprofile-sample-use=program.llvmprof -o program program.c` to make clang use the produced profile.<br>
|
||||||
|
If you are confident enough that your profile is accurate, you can add the `-fprofile-sample-accurate` flag, which will penalize all the callsites without corresponding profile, marking them as cold.
|
||||||
|
|
||||||
|
If you are using the same host for both building the binary to be traced and re-building it with afdo:
|
||||||
|
|
||||||
|
1. You won't need to copy back any dynamic libraries from the board (since you already have them), and can use `--no-buildid-cache` when recording
|
||||||
|
2. You have to make sure the relevant dynamic libraries to be optimized are present in the buildid-cache.
|
||||||
|
|
||||||
|
You can easily add a dynamic library manually into the build-id cache by running:
|
||||||
|
|
||||||
|
`perf buildid-cache --add <path/to/library/or/binary> -vvv`
|
||||||
|
|
||||||
|
You can easily check what is currently contained in you buildid-cache by running:
|
||||||
|
|
||||||
|
`perf buildid-cache --list`
|
||||||
|
|
||||||
|
You can check the buildid of a given binary/dynamic library:
|
||||||
|
|
||||||
|
`file <path/to/dynamic/library>`
|
||||||
|
|
||||||
## References
|
## References
|
||||||
|
|
||||||
|
@ -51,12 +51,12 @@ OBJECTS = $(BUILD_DIR)/c_api_pkt_print_test.o
|
|||||||
LIBS = -L$(LIB_TARGET_DIR) -l$(LIB_BASE_NAME) -l$(LIB_CAPI_NAME) \
|
LIBS = -L$(LIB_TARGET_DIR) -l$(LIB_BASE_NAME) -l$(LIB_CAPI_NAME) \
|
||||||
-L$(LIB_TEST_TARGET_DIR) -l_echo_test_dcd
|
-L$(LIB_TEST_TARGET_DIR) -l_echo_test_dcd
|
||||||
|
|
||||||
all: build_dir copy_libs
|
all: copy_libs
|
||||||
|
|
||||||
test_app: $(BIN_TEST_TARGET_DIR)/$(PROG)
|
test_app: $(BIN_TEST_TARGET_DIR)/$(PROG)
|
||||||
|
|
||||||
|
|
||||||
$(BIN_TEST_TARGET_DIR)/$(PROG): $(OBJECTS)
|
$(BIN_TEST_TARGET_DIR)/$(PROG): $(OBJECTS) | build_dir
|
||||||
mkdir -p $(BIN_TEST_TARGET_DIR)
|
mkdir -p $(BIN_TEST_TARGET_DIR)
|
||||||
$(LINKER) $(LDFLAGS) $(OBJECTS) -Wl,--start-group $(LIBS) -Wl,--end-group -o $(BIN_TEST_TARGET_DIR)/$(PROG)
|
$(LINKER) $(LDFLAGS) $(OBJECTS) -Wl,--start-group $(LIBS) -Wl,--end-group -o $(BIN_TEST_TARGET_DIR)/$(PROG)
|
||||||
cp $(LIB_TARGET_DIR)/*.so .
|
cp $(LIB_TARGET_DIR)/*.so .
|
||||||
@ -77,7 +77,7 @@ DEPS := $(OBJECTS:%.o=%.d)
|
|||||||
-include $(DEPS)
|
-include $(DEPS)
|
||||||
|
|
||||||
## object compile
|
## object compile
|
||||||
$(BUILD_DIR)/%.o : %.c
|
$(BUILD_DIR)/%.o : %.c | build_dir
|
||||||
$(CC) $(CFLAGS) $(CC_INCLUDES) -MMD $< -o $@
|
$(CC) $(CFLAGS) $(CC_INCLUDES) -MMD $< -o $@
|
||||||
|
|
||||||
#### clean
|
#### clean
|
||||||
|
@ -48,9 +48,9 @@ CC_INCLUDES = \
|
|||||||
OBJECTS = $(BUILD_DIR)/ext_dcd_echo_test.o \
|
OBJECTS = $(BUILD_DIR)/ext_dcd_echo_test.o \
|
||||||
$(BUILD_DIR)/ext_dcd_echo_test_fact.o
|
$(BUILD_DIR)/ext_dcd_echo_test_fact.o
|
||||||
|
|
||||||
all: build_dir $(LIB_TEST_TARGET_DIR)/$(LIB_NAME).a
|
all: $(LIB_TEST_TARGET_DIR)/$(LIB_NAME).a
|
||||||
|
|
||||||
$(LIB_TEST_TARGET_DIR)/$(LIB_NAME).a: $(OBJECTS)
|
$(LIB_TEST_TARGET_DIR)/$(LIB_NAME).a: $(OBJECTS) | build_dir
|
||||||
mkdir -p $(LIB_TEST_TARGET_DIR)
|
mkdir -p $(LIB_TEST_TARGET_DIR)
|
||||||
$(LIB) $(ARFLAGS) $(LIB_TEST_TARGET_DIR)/$(LIB_NAME).a $(OBJECTS)
|
$(LIB) $(ARFLAGS) $(LIB_TEST_TARGET_DIR)/$(LIB_NAME).a $(OBJECTS)
|
||||||
|
|
||||||
@ -64,7 +64,7 @@ DEPS := $(OBJECTS:%.o=%.d)
|
|||||||
-include $(DEPS)
|
-include $(DEPS)
|
||||||
|
|
||||||
## object compile
|
## object compile
|
||||||
$(BUILD_DIR)/%.o : %.c
|
$(BUILD_DIR)/%.o : %.c | build_dir
|
||||||
$(CC) $(CFLAGS) $(CC_INCLUDES) -MMD $< -o $@
|
$(CC) $(CFLAGS) $(CC_INCLUDES) -MMD $< -o $@
|
||||||
|
|
||||||
#### clean
|
#### clean
|
||||||
|
88
decoder/tests/build/linux/frame_demux_test/makefile
Normal file
88
decoder/tests/build/linux/frame_demux_test/makefile
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
########################################################
|
||||||
|
# Copyright 2022 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 the frame demux test program
|
||||||
|
#
|
||||||
|
|
||||||
|
CXX := $(MASTER_CXX)
|
||||||
|
LINKER := $(MASTER_LINKER)
|
||||||
|
|
||||||
|
PROG = frame-demux-test
|
||||||
|
|
||||||
|
BUILD_DIR=./$(PLAT_DIR)
|
||||||
|
|
||||||
|
VPATH = $(OCSD_TESTS)/source
|
||||||
|
|
||||||
|
CXX_INCLUDES = \
|
||||||
|
-I$(OCSD_TESTS)/source \
|
||||||
|
-I$(OCSD_INCLUDE)
|
||||||
|
|
||||||
|
OBJECTS = $(BUILD_DIR)/frame_demux_test.o
|
||||||
|
|
||||||
|
LIBS = -L$(LIB_TEST_TARGET_DIR) -L$(LIB_TARGET_DIR) -l$(LIB_BASE_NAME)
|
||||||
|
|
||||||
|
all: copy_libs
|
||||||
|
|
||||||
|
test_app: $(BIN_TEST_TARGET_DIR)/$(PROG)
|
||||||
|
|
||||||
|
|
||||||
|
$(BIN_TEST_TARGET_DIR)/$(PROG): $(OBJECTS) | build_dir
|
||||||
|
mkdir -p $(BIN_TEST_TARGET_DIR)
|
||||||
|
$(LINKER) $(LDFLAGS) $(OBJECTS) -Wl,--start-group $(LIBS) -Wl,--end-group -o $(BIN_TEST_TARGET_DIR)/$(PROG)
|
||||||
|
|
||||||
|
build_dir:
|
||||||
|
mkdir -p $(BUILD_DIR)
|
||||||
|
|
||||||
|
.PHONY: copy_libs
|
||||||
|
copy_libs: $(BIN_TEST_TARGET_DIR)/$(PROG)
|
||||||
|
cp $(LIB_TARGET_DIR)/*.so* $(BIN_TEST_TARGET_DIR)/.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#### build rules
|
||||||
|
## object dependencies
|
||||||
|
DEPS := $(OBJECTS:%.o=%.d)
|
||||||
|
|
||||||
|
-include $(DEPS)
|
||||||
|
|
||||||
|
## object compile
|
||||||
|
$(BUILD_DIR)/%.o : %.cpp | build_dir
|
||||||
|
$(CXX) $(CXXFLAGS) $(CXX_INCLUDES) -MMD $< -o $@
|
||||||
|
|
||||||
|
#### clean
|
||||||
|
.PHONY: clean
|
||||||
|
clean :
|
||||||
|
-rm $(BIN_TEST_TARGET_DIR)/$(PROG) $(OBJECTS)
|
||||||
|
-rm $(DEPS)
|
||||||
|
-rm $(BIN_TEST_TARGET_DIR)/*.so*
|
||||||
|
-rmdir $(BUILD_DIR)
|
||||||
|
|
||||||
|
# end of file makefile
|
@ -51,12 +51,12 @@ OBJECTS = $(BUILD_DIR)/mem_buff_demo.o
|
|||||||
LIBS = -L$(LIB_TEST_TARGET_DIR) -lsnapshot_parser \
|
LIBS = -L$(LIB_TEST_TARGET_DIR) -lsnapshot_parser \
|
||||||
-L$(LIB_TARGET_DIR) -l$(LIB_BASE_NAME)
|
-L$(LIB_TARGET_DIR) -l$(LIB_BASE_NAME)
|
||||||
|
|
||||||
all: build_dir copy_libs
|
all: copy_libs
|
||||||
|
|
||||||
test_app: $(BIN_TEST_TARGET_DIR)/$(PROG)
|
test_app: $(BIN_TEST_TARGET_DIR)/$(PROG)
|
||||||
|
|
||||||
|
|
||||||
$(BIN_TEST_TARGET_DIR)/$(PROG): $(OBJECTS)
|
$(BIN_TEST_TARGET_DIR)/$(PROG): $(OBJECTS) | build_dir
|
||||||
mkdir -p $(BIN_TEST_TARGET_DIR)
|
mkdir -p $(BIN_TEST_TARGET_DIR)
|
||||||
$(LINKER) $(LDFLAGS) $(OBJECTS) -Wl,--start-group $(LIBS) -Wl,--end-group -o $(BIN_TEST_TARGET_DIR)/$(PROG)
|
$(LINKER) $(LDFLAGS) $(OBJECTS) -Wl,--start-group $(LIBS) -Wl,--end-group -o $(BIN_TEST_TARGET_DIR)/$(PROG)
|
||||||
|
|
||||||
@ -76,7 +76,7 @@ DEPS := $(OBJECTS:%.o=%.d)
|
|||||||
-include $(DEPS)
|
-include $(DEPS)
|
||||||
|
|
||||||
## object compile
|
## object compile
|
||||||
$(BUILD_DIR)/%.o : %.cpp
|
$(BUILD_DIR)/%.o : %.cpp | build_dir
|
||||||
$(CXX) $(CXXFLAGS) $(CXX_INCLUDES) -MMD $< -o $@
|
$(CXX) $(CXXFLAGS) $(CXX_INCLUDES) -MMD $< -o $@
|
||||||
|
|
||||||
#### clean
|
#### clean
|
||||||
|
@ -63,9 +63,9 @@ OBJECTS=$(BUILD_DIR)/device_info.o \
|
|||||||
$(BUILD_DIR)/snapshot_reader.o \
|
$(BUILD_DIR)/snapshot_reader.o \
|
||||||
$(BUILD_DIR)/ss_to_dcdtree.o
|
$(BUILD_DIR)/ss_to_dcdtree.o
|
||||||
|
|
||||||
all: build_dir $(LIB_TEST_TARGET_DIR)/$(LIB_NAME).a
|
all: $(LIB_TEST_TARGET_DIR)/$(LIB_NAME).a
|
||||||
|
|
||||||
$(LIB_TEST_TARGET_DIR)/$(LIB_NAME).a: $(OBJECTS)
|
$(LIB_TEST_TARGET_DIR)/$(LIB_NAME).a: $(OBJECTS) | build_dir
|
||||||
mkdir -p $(LIB_TEST_TARGET_DIR)
|
mkdir -p $(LIB_TEST_TARGET_DIR)
|
||||||
$(LIB) $(ARFLAGS) $(LIB_TEST_TARGET_DIR)/$(LIB_NAME).a $(OBJECTS)
|
$(LIB) $(ARFLAGS) $(LIB_TEST_TARGET_DIR)/$(LIB_NAME).a $(OBJECTS)
|
||||||
|
|
||||||
@ -80,7 +80,7 @@ DEPS := $(OBJECTS:%.o=%.d)
|
|||||||
-include $(DEPS)
|
-include $(DEPS)
|
||||||
|
|
||||||
## object compile
|
## object compile
|
||||||
$(BUILD_DIR)/%.o : %.cpp
|
$(BUILD_DIR)/%.o : %.cpp | build_dir
|
||||||
$(CXX) $(CXXFLAGS) $(CXX_INCLUDES) -MMD $< -o $@
|
$(CXX) $(CXXFLAGS) $(CXX_INCLUDES) -MMD $< -o $@
|
||||||
|
|
||||||
### clean
|
### clean
|
||||||
|
@ -36,6 +36,7 @@ CXX := $(MASTER_CXX)
|
|||||||
LINKER := $(MASTER_LINKER)
|
LINKER := $(MASTER_LINKER)
|
||||||
|
|
||||||
PROG = trc_pkt_lister
|
PROG = trc_pkt_lister
|
||||||
|
PROG_S = trc_pkt_lister_s
|
||||||
|
|
||||||
BUILD_DIR=./$(PLAT_DIR)
|
BUILD_DIR=./$(PLAT_DIR)
|
||||||
|
|
||||||
@ -51,19 +52,28 @@ OBJECTS = $(BUILD_DIR)/trc_pkt_lister.o
|
|||||||
LIBS = -L$(LIB_TEST_TARGET_DIR) -lsnapshot_parser \
|
LIBS = -L$(LIB_TEST_TARGET_DIR) -lsnapshot_parser \
|
||||||
-L$(LIB_TARGET_DIR) -l$(LIB_BASE_NAME)
|
-L$(LIB_TARGET_DIR) -l$(LIB_BASE_NAME)
|
||||||
|
|
||||||
all: build_dir copy_libs
|
all: copy_libs
|
||||||
|
|
||||||
test_app: $(BIN_TEST_TARGET_DIR)/$(PROG)
|
test_app: $(BIN_TEST_TARGET_DIR)/$(PROG)
|
||||||
|
|
||||||
|
|
||||||
$(BIN_TEST_TARGET_DIR)/$(PROG): $(OBJECTS)
|
$(BIN_TEST_TARGET_DIR)/$(PROG): $(OBJECTS) | build_dir
|
||||||
mkdir -p $(BIN_TEST_TARGET_DIR)
|
mkdir -p $(BIN_TEST_TARGET_DIR)
|
||||||
$(LINKER) $(LDFLAGS) $(OBJECTS) -Wl,--start-group $(LIBS) -Wl,--end-group -o $(BIN_TEST_TARGET_DIR)/$(PROG)
|
$(LINKER) $(LDFLAGS) $(OBJECTS) -Wl,--start-group $(LIBS) -Wl,--end-group -o $(BIN_TEST_TARGET_DIR)/$(PROG)
|
||||||
|
|
||||||
|
$(BIN_TEST_TARGET_DIR)/$(PROG_S): $(OBJECTS) | build_dir
|
||||||
|
mkdir -p $(BIN_TEST_TARGET_DIR)
|
||||||
|
$(LINKER) -static $(LDFLAGS) $(OBJECTS) -Wl,--start-group $(LIBS) -Wl,--end-group -o $(BIN_TEST_TARGET_DIR)/$(PROG_S)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
build_dir:
|
build_dir:
|
||||||
mkdir -p $(BUILD_DIR)
|
mkdir -p $(BUILD_DIR)
|
||||||
|
|
||||||
.PHONY: copy_libs
|
.PHONY: copy_libs
|
||||||
|
ifdef TEST_STATIC_LINKING
|
||||||
|
copy_libs: $(BIN_TEST_TARGET_DIR)/$(PROG_S)
|
||||||
|
endif
|
||||||
copy_libs: $(BIN_TEST_TARGET_DIR)/$(PROG)
|
copy_libs: $(BIN_TEST_TARGET_DIR)/$(PROG)
|
||||||
cp $(LIB_TARGET_DIR)/*.so* $(BIN_TEST_TARGET_DIR)/.
|
cp $(LIB_TARGET_DIR)/*.so* $(BIN_TEST_TARGET_DIR)/.
|
||||||
|
|
||||||
@ -76,13 +86,16 @@ DEPS := $(OBJECTS:%.o=%.d)
|
|||||||
-include $(DEPS)
|
-include $(DEPS)
|
||||||
|
|
||||||
## object compile
|
## object compile
|
||||||
$(BUILD_DIR)/%.o : %.cpp
|
$(BUILD_DIR)/%.o : %.cpp | build_dir
|
||||||
$(CXX) $(CXXFLAGS) $(CXX_INCLUDES) -MMD $< -o $@
|
$(CXX) $(CXXFLAGS) $(CXX_INCLUDES) -MMD $< -o $@
|
||||||
|
|
||||||
#### clean
|
#### clean
|
||||||
.PHONY: clean
|
.PHONY: clean
|
||||||
clean :
|
clean :
|
||||||
-rm $(BIN_TEST_TARGET_DIR)/$(PROG) $(OBJECTS)
|
-rm $(BIN_TEST_TARGET_DIR)/$(PROG) $(OBJECTS)
|
||||||
|
ifdef TEST_STATIC_LINKING
|
||||||
|
-rm $(BIN_TEST_TARGET_DIR)/$(PROG_S)
|
||||||
|
endif
|
||||||
-rm $(DEPS)
|
-rm $(DEPS)
|
||||||
-rm $(BIN_TEST_TARGET_DIR)/*.so*
|
-rm $(BIN_TEST_TARGET_DIR)/*.so*
|
||||||
-rmdir $(BUILD_DIR)
|
-rmdir $(BUILD_DIR)
|
||||||
|
@ -0,0 +1,11 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project>
|
||||||
|
<ProjectOutputs>
|
||||||
|
<ProjectOutput>
|
||||||
|
<FullPath>C:\work\OpenCSD\ocsd-linaro\decoder\tests\bin\win32\rel\c_api_pkt_print_test-dl.exe</FullPath>
|
||||||
|
</ProjectOutput>
|
||||||
|
</ProjectOutputs>
|
||||||
|
<ContentFiles />
|
||||||
|
<SatelliteDlls />
|
||||||
|
<NonRecipeFileRefs />
|
||||||
|
</Project>
|
@ -0,0 +1,11 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project>
|
||||||
|
<ProjectOutputs>
|
||||||
|
<ProjectOutput>
|
||||||
|
<FullPath>C:\work\OpenCSD\ocsd-linaro\decoder\tests\bin\win32\rel\c_api_pkt_print_test.exe</FullPath>
|
||||||
|
</ProjectOutput>
|
||||||
|
</ProjectOutputs>
|
||||||
|
<ContentFiles />
|
||||||
|
<SatelliteDlls />
|
||||||
|
<NonRecipeFileRefs />
|
||||||
|
</Project>
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user