From c84325bae2bd505d91e824748c36e21a022885af Mon Sep 17 00:00:00 2001 From: Adam Charytoniuk Date: Fri, 16 Dec 2016 08:22:22 +0000 Subject: [PATCH] Removal of unnecessary files --- daemon/CMakeLists.txt | 237 --- daemon/Makefile_x86 | 9 - daemon/escape/CMakeLists.txt | 12 - daemon/events-x86.xml | 12 - driver/gator_events_mali_midgard_hw_test.c | 12 - examples/.gitignore | 11 - examples/Android.mk | 22 - examples/Application.mk | 3 - examples/Makefile | 50 - examples/absolute.c | 109 - examples/cam.c | 120 -- examples/delta.c | 43 - examples/readme.txt | 29 - examples/shared.c | 79 - examples/text.c | 41 - examples/visual.c | 229 -- notify/CMakeLists.txt | 150 -- protocol/annotate/annotate-1.html | 856 -------- protocol/annotate/annotate-2.html | 1080 ---------- protocol/annotate/annotate-3.html | 1086 ---------- protocol/gator/capture-14.png | Bin 11680 -> 0 bytes protocol/gator/capture.png | Bin 13846 -> 0 bytes protocol/gator/capture_ping.png | Bin 5029 -> 0 bytes protocol/gator/config-14.png | Bin 8707 -> 0 bytes protocol/gator/config.png | Bin 10149 -> 0 bytes protocol/gator/config_cancel.png | Bin 5338 -> 0 bytes protocol/gator/config_default.png | Bin 6405 -> 0 bytes protocol/gator/config_save.png | Bin 6566 -> 0 bytes protocol/gator/gator_protocol-5-12.html | 1509 ------------- protocol/gator/gator_protocol-5-13.html | 1686 --------------- protocol/gator/gator_protocol-5-14.html | 1886 ----------------- protocol/gator/gator_protocol-5-15.html | 2013 ------------------ protocol/gator/gator_protocol-5-16.html | 2042 ------------------ protocol/gator/gator_protocol-5-17.html | 2103 ------------------ protocol/gator/gator_protocol-5-18.html | 2103 ------------------ protocol/gator/gator_protocol-5-19.html | 2162 ------------------- protocol/gator/gator_protocol-5-20.html | 2232 -------------------- protocol/gator/gator_protocol-5-21.html | 2215 ------------------- protocol/gator/gator_protocol-5-22.html | 2185 ------------------- protocol/gator/gator_protocol-5-23.html | 2120 ------------------- protocol/index.html | 32 - setup/CMakeLists.txt | 139 -- 42 files changed, 28617 deletions(-) delete mode 100644 daemon/CMakeLists.txt delete mode 100644 daemon/Makefile_x86 delete mode 100644 daemon/escape/CMakeLists.txt delete mode 100644 daemon/events-x86.xml delete mode 100644 driver/gator_events_mali_midgard_hw_test.c delete mode 100644 examples/.gitignore delete mode 100644 examples/Android.mk delete mode 100644 examples/Application.mk delete mode 100644 examples/Makefile delete mode 100644 examples/absolute.c delete mode 100644 examples/cam.c delete mode 100644 examples/delta.c delete mode 100644 examples/readme.txt delete mode 100644 examples/shared.c delete mode 100644 examples/text.c delete mode 100644 examples/visual.c delete mode 100644 notify/CMakeLists.txt delete mode 100644 protocol/annotate/annotate-1.html delete mode 100644 protocol/annotate/annotate-2.html delete mode 100644 protocol/annotate/annotate-3.html delete mode 100644 protocol/gator/capture-14.png delete mode 100644 protocol/gator/capture.png delete mode 100644 protocol/gator/capture_ping.png delete mode 100644 protocol/gator/config-14.png delete mode 100644 protocol/gator/config.png delete mode 100644 protocol/gator/config_cancel.png delete mode 100644 protocol/gator/config_default.png delete mode 100644 protocol/gator/config_save.png delete mode 100644 protocol/gator/gator_protocol-5-12.html delete mode 100644 protocol/gator/gator_protocol-5-13.html delete mode 100644 protocol/gator/gator_protocol-5-14.html delete mode 100644 protocol/gator/gator_protocol-5-15.html delete mode 100644 protocol/gator/gator_protocol-5-16.html delete mode 100644 protocol/gator/gator_protocol-5-17.html delete mode 100644 protocol/gator/gator_protocol-5-18.html delete mode 100644 protocol/gator/gator_protocol-5-19.html delete mode 100644 protocol/gator/gator_protocol-5-20.html delete mode 100644 protocol/gator/gator_protocol-5-21.html delete mode 100644 protocol/gator/gator_protocol-5-22.html delete mode 100644 protocol/gator/gator_protocol-5-23.html delete mode 100644 protocol/index.html delete mode 100644 setup/CMakeLists.txt diff --git a/daemon/CMakeLists.txt b/daemon/CMakeLists.txt deleted file mode 100644 index 4ff76d6d..00000000 --- a/daemon/CMakeLists.txt +++ /dev/null @@ -1,237 +0,0 @@ -# Copyright (C) ARM Limited 2010-2016. All rights reserved. - -CMAKE_MINIMUM_REQUIRED(VERSION 2.8.10 FATAL_ERROR) - -PROJECT(gatord) - -# Configuration options -OPTION(GATORD_WERROR "Build with -Werror set" OFF) - -# Include the target detection code -INCLUDE(${CMAKE_CURRENT_SOURCE_DIR}/cmake/build-target.cmake) - -# Include the source MD5 macro -INCLUDE(${CMAKE_CURRENT_SOURCE_DIR}/cmake/create-src-md5.cmake) - -# Use ExternalProject to build the native gatord-xml-escape exe -INCLUDE(ExternalProject) - -# Include musl libc build commands -INCLUDE(${CMAKE_CURRENT_SOURCE_DIR}/cmake/musl-libc.cmake) - -# Native compiler configuration options (for gatord-xml-escape tool) -SET(CMAKE_NATIVE_GENERATOR "${CMAKE_GENERATOR}" - CACHE STRING "Native generator configuration") -SET(CMAKE_NATIVE_C_COMPILER "gcc" - CACHE STRING "Native GCC compiler to use") -SET(CMAKE_NATIVE_CXX_COMPILER "g++" - CACHE STRING "Native GCC C++ compiler to use") - -# Configure target flags -SET(GATORD_C_CXX_FLAGS "-pthread -Wall -fno-exceptions -pthread") -IF(GATORD_WERROR) - SET(GATORD_C_CXX_FLAGS "${GATORD_C_CXX_FLAGS} -Werror") -ENDIF() - -SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${GATORD_C_CXX_FLAGS}") -SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GATORD_C_CXX_FLAGS} -fno-rtti -Wextra -Wshadow -Wpointer-arith -Wundef") # -Weffc++ -Wmissing-declarations - -IF("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") - # add -fno-sized-deallocation - IF(NOT("${CMAKE_CXX_COMPILER_VERSION}" VERSION_LESS "5.0.0")) - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-sized-deallocation") - ENDIF() -ENDIF() - -ADD_DEFINITIONS(-DETCDIR="/etc") -INCLUDE_DIRECTORIES( ${CMAKE_CURRENT_SOURCE_DIR} - ${CMAKE_CURRENT_SOURCE_DIR}/libsensors - ${CMAKE_CURRENT_BINARY_DIR}) - -# This file is generated and contains a hash of the source files -SET(GENERATED_MD5_SOURCE ${CMAKE_CURRENT_BINARY_DIR}/SrcMd5.cpp) - -# The source files to build -SET(GATORD_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/mxml/mxml-private.c - ${CMAKE_CURRENT_SOURCE_DIR}/mxml/mxml-search.c - ${CMAKE_CURRENT_SOURCE_DIR}/mxml/mxml-set.c - ${CMAKE_CURRENT_SOURCE_DIR}/mxml/mxml-entity.c - ${CMAKE_CURRENT_SOURCE_DIR}/mxml/mxml-attr.c - ${CMAKE_CURRENT_SOURCE_DIR}/mxml/mxml-node.c - ${CMAKE_CURRENT_SOURCE_DIR}/mxml/mxml-index.c - ${CMAKE_CURRENT_SOURCE_DIR}/mxml/mxml-string.c - ${CMAKE_CURRENT_SOURCE_DIR}/mxml/mxml-file.c - ${CMAKE_CURRENT_SOURCE_DIR}/mxml/mxml-get.c - ${CMAKE_CURRENT_SOURCE_DIR}/libsensors/error.c - ${CMAKE_CURRENT_SOURCE_DIR}/libsensors/data.c - ${CMAKE_CURRENT_SOURCE_DIR}/libsensors/init.c - ${CMAKE_CURRENT_SOURCE_DIR}/libsensors/conf-parse.c - ${CMAKE_CURRENT_SOURCE_DIR}/libsensors/conf-lex.c - ${CMAKE_CURRENT_SOURCE_DIR}/libsensors/general.c - ${CMAKE_CURRENT_SOURCE_DIR}/libsensors/access.c - ${CMAKE_CURRENT_SOURCE_DIR}/libsensors/sysfs.c - ${CMAKE_CURRENT_SOURCE_DIR}/Monitor.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/ConfigurationXML.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Fifo.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/MemInfoDriver.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/EventsXML.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/ExternalSource.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/AtraceDriver.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/LocalCapture.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/PerfDriver.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Proc.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/FSDriver.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/PerfBuffer.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/NetDriver.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/UEvent.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/OlySocket.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/PerfSource.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/OlyUtility.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/CapturedXML.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/DiskIODriver.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Buffer.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/main.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/DriverSource.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/ExternalDriver.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/c++.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Child.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Command.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/AnnotateListener.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/SessionData.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Source.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/PmuXML.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/CCNDriver.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/UserSpaceSource.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/StreamlineSetup.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/PerfGroup.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/HwmonDriver.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Logging.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/MaliVideoDriver.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/MidgardDriver.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/KMod.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/FtraceDriver.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/DynBuf.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Driver.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/PolledDriver.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/SimpleDriver.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/DriverCounter.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/SessionXML.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Sender.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/TtraceDriver.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/mali_userspace/MaliDevice.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/mali_userspace/MaliInstanceLocator.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/mali_userspace/MaliHwCntrReader.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/mali_userspace/MaliHwCntrDriver.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/mali_userspace/MaliHwCntrSource.cpp - ${GENERATED_MD5_SOURCE} - ${CMAKE_CURRENT_BINARY_DIR}/defaults_xml.h - ${CMAKE_CURRENT_BINARY_DIR}/events_xml.h - ${CMAKE_CURRENT_BINARY_DIR}/pmus_xml.h) - -# Create a list of files to hash for the generated has file -FILE(GLOB_RECURSE FILES_TO_HASH - ${CMAKE_CURRENT_SOURCE_DIR}/*.c - ${CMAKE_CURRENT_SOURCE_DIR}/*.h - ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/*.hpp - ${CMAKE_CURRENT_SOURCE_DIR}/*.hpp - ${CMAKE_CURRENT_SOURCE_DIR}/*.xml - ${CMAKE_CURRENT_SOURCE_DIR}/*.cmake - ${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt) - -CREATE_SRC_MD5( "gSrcMd5" - ${GENERATED_MD5_SOURCE} - ${FILES_TO_HASH}) - -# Build the merged events.xml -FILE(GLOB EVENTS_XML_FILES - ${CMAKE_CURRENT_SOURCE_DIR}/events-*.xml) -LIST(SORT EVENTS_XML_FILES) -LIST(REMOVE_DUPLICATES EVENTS_XML_FILES) - -# Convert the list to a string that can be passed to the custom command -SET(EVENTS_XML_FILES_STRING "${CMAKE_CURRENT_SOURCE_DIR}/events_header.xml") -FOREACH(EVENTS_XML_FILE ${EVENTS_XML_FILES}) - SET(EVENTS_XML_FILES_STRING - "${EVENTS_XML_FILES_STRING};${EVENTS_XML_FILE}") -ENDFOREACH() -SET(EVENTS_XML_FILES_STRING "${EVENTS_XML_FILES_STRING};${CMAKE_CURRENT_SOURCE_DIR}/events_footer.xml") - -SET(CONCATENATED_EVENTS_XML ${CMAKE_CURRENT_BINARY_DIR}/events.xml) -ADD_CUSTOM_COMMAND(OUTPUT ${CONCATENATED_EVENTS_XML} - COMMAND ${CMAKE_COMMAND} -DOUTPUT_FILE="${CONCATENATED_EVENTS_XML}" - -DFILES_TO_CONCATENATE="${EVENTS_XML_FILES_STRING}" - -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/concatenate-files.cmake - DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/events_header.xml - ${CMAKE_CURRENT_SOURCE_DIR}/events_footer.xml - ${EVENTS_XML_FILES} - ${CMAKE_CURRENT_SOURCE_DIR}/cmake/concatenate-files.cmake) - -# Build the gatord-xml-escape using the native compiler -SET(GATORD_XML_ESCAPE_TOOL ${CMAKE_CURRENT_BINARY_DIR}/escape/gatord-xml-escape) - -ExternalProject_Add(gatord-xml-escape - DOWNLOAD_COMMAND "" - SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/escape" - CONFIGURE_COMMAND ${CMAKE_COMMAND} -G "${CMAKE_NATIVE_GENERATOR}" "${CMAKE_CURRENT_SOURCE_DIR}/escape" - -DCMAKE_C_COMPILER=${CMAKE_NATIVE_C_COMPILER} - -DCMAKE_CXX_COMPILER=${CMAKE_NATIVE_CXX_COMPILER} - -DCMAKE_C_FLAGS= - -DCMAKE_CXX_FLAGS= - INSTALL_COMMAND "" - BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/escape -) - -ADD_CUSTOM_COMMAND(OUTPUT ${GATORD_XML_ESCAPE_TOOL} - DEPENDS gatord-xml-escape) - -# Macro to aid generation of xml->header files -MACRO(CREATE_XML_HEADER CONSTANT_NAME - SOURCE_XML_FILE - OUTPUT_HEADER_FILE) - ADD_CUSTOM_COMMAND(OUTPUT ${OUTPUT_HEADER_FILE} - COMMAND ${GATORD_XML_ESCAPE_TOOL} ${CONSTANT_NAME} ${SOURCE_XML_FILE} ${OUTPUT_HEADER_FILE} - DEPENDS gatord-xml-escape - ${GATORD_XML_ESCAPE_TOOL} - ${SOURCE_XML_FILE}) -ENDMACRO() - -# Target to generate defaults_xml.h -CREATE_XML_HEADER( defaults.xml - ${CMAKE_CURRENT_SOURCE_DIR}/defaults.xml - ${CMAKE_CURRENT_BINARY_DIR}/defaults_xml.h) - -# Target to generate pmus_xml.h -CREATE_XML_HEADER( pmus.xml - ${CMAKE_CURRENT_SOURCE_DIR}/pmus.xml - ${CMAKE_CURRENT_BINARY_DIR}/pmus_xml.h) - -# Target to generate events.h -CREATE_XML_HEADER( events.xml - ${CONCATENATED_EVENTS_XML} - ${CMAKE_CURRENT_BINARY_DIR}/events_xml.h) - -# Generate the gatord executable -ADD_EXECUTABLE(gatord ${GATORD_SOURCES}) - -IF(NOT ANDROID) - TARGET_LINK_LIBRARIES(gatord rt - m) -ENDIF() - -ADD_MUSL_DEPENDENCY(gatord) - - -# Installation configuration -IF(NOT DEFINED GATOR_INSTALL_PREFIX) - SET(GATOR_INSTALL_PREFIX "share/gator-${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}") -ENDIF() - -SET(GATORD_INSTALL_DIR ./${GATOR_INSTALL_PREFIX}/daemon/) - -INSTALL(TARGETS gatord - RUNTIME DESTINATION ${GATORD_INSTALL_DIR}) - -INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/COPYING - DESTINATION ${GATORD_INSTALL_DIR}) - diff --git a/daemon/Makefile_x86 b/daemon/Makefile_x86 deleted file mode 100644 index c23d7a41..00000000 --- a/daemon/Makefile_x86 +++ /dev/null @@ -1,9 +0,0 @@ -# -# Makefile for ARM Streamline - Gator Daemon -# make -f Makefile_x86 -# - -CC = gcc -CXX = g++ - -include common.mk diff --git a/daemon/escape/CMakeLists.txt b/daemon/escape/CMakeLists.txt deleted file mode 100644 index 2d3c3148..00000000 --- a/daemon/escape/CMakeLists.txt +++ /dev/null @@ -1,12 +0,0 @@ -# Copyright (C) ARM Limited 2010-2016. All rights reserved. - -CMAKE_MINIMUM_REQUIRED(VERSION 2.8) - -PROJECT(gatord-xml-escape) - -# The source files to build -SET(GATORD_ESCAPE_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/escape.c) - -# Generate the gatord-xml-escape executable -ADD_EXECUTABLE(gatord-xml-escape ${GATORD_ESCAPE_SOURCES}) - diff --git a/daemon/events-x86.xml b/daemon/events-x86.xml deleted file mode 100644 index 0a2fcda5..00000000 --- a/daemon/events-x86.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/driver/gator_events_mali_midgard_hw_test.c b/driver/gator_events_mali_midgard_hw_test.c deleted file mode 100644 index ada43fd2..00000000 --- a/driver/gator_events_mali_midgard_hw_test.c +++ /dev/null @@ -1,12 +0,0 @@ -/** - * Copyright (C) ARM Limited 2012-2016. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - */ - -/** - * Test functions for mali_t600_hw code. - */ diff --git a/examples/.gitignore b/examples/.gitignore deleted file mode 100644 index babf2b23..00000000 --- a/examples/.gitignore +++ /dev/null @@ -1,11 +0,0 @@ -*.d -*.o -/absolute -/cam -/delta -/shared -/text -/visual -jni -libs -obj diff --git a/examples/Android.mk b/examples/Android.mk deleted file mode 100644 index f61ecd62..00000000 --- a/examples/Android.mk +++ /dev/null @@ -1,22 +0,0 @@ -LOCAL_PATH := $(call my-dir) - -define examples_build_executable - include $(CLEAR_VARS) - - LOCAL_SRC_FILES := $1.c ../gator/annotate/streamline_annotate.c - - LOCAL_CFLAGS += -I../gator/annotate -O0 -g3 -pthread -fPIE - LOCAL_CFLAGS += -Wall -Wextra -Wc++-compat -Wpointer-arith -Wmissing-prototypes -Wstrict-prototypes - LOCAL_LDFLAGS += -fPIE -pie - LOCAL_LDLIBS += -pthread - - LOCAL_C_INCLUDES := $(LOCAL_PATH) - - LOCAL_MODULE := $1 - LOCAL_MODULE_TAGS := optional - - include $(BUILD_EXECUTABLE) -endef - -TARGETS = absolute text cam delta visual shared -$(foreach target, $(TARGETS), $(eval $(call examples_build_executable, $(target)))) diff --git a/examples/Application.mk b/examples/Application.mk deleted file mode 100644 index 8b0a7882..00000000 --- a/examples/Application.mk +++ /dev/null @@ -1,3 +0,0 @@ -APP_PLATFORM := android-9 -# Replace armeabi-v7a with arm64-v8a to build an arm64 gatord or with armeabi to build an ARM11 gatord -APP_ABI := armeabi-v7a diff --git a/examples/Makefile b/examples/Makefile deleted file mode 100644 index 99d42a7a..00000000 --- a/examples/Makefile +++ /dev/null @@ -1,50 +0,0 @@ -CC = $(CROSS_COMPILE)gcc -CXX = $(CROSS_COMPILE)g++ - -CFLAGS += -CXXFLAGS += -CPPFLAGS += -I../annotate -O0 -g3 -MD -pthread -pipe -CPPFLAGS += -Wall -Wextra -Wshadow -Wc++-compat -Wpointer-arith -Wundef -Wmissing-prototypes -Wstrict-prototypes -LDFLAGS += -pthread -LDLIBS += -lrt - -OUTPUT_OPTION = -o $@ -COMPILE.c = $(CC) $(CFLAGS) $(CPPFLAGS) -c -COMPILE.cpp = $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c -LINK.o = $(CC) $(LDFLAGS) - -TARGETS = absolute text cam delta visual shared - -all: $(TARGETS) - -include $(wildcard *.d) - -%.o: %.c - $(COMPILE.c) $(OUTPUT_OPTION) $< - -%.o: %.cpp - $(COMPILE.cpp) $(OUTPUT_OPTION) $< - -streamline_annotate.o: ../annotate/streamline_annotate.c - $(COMPILE.c) $(OUTPUT_OPTION) $< - -absolute: absolute.o streamline_annotate.o - $(LINK.o) $^ $(LDLIBS) $(OUTPUT_OPTION) - -text: text.o streamline_annotate.o - $(LINK.o) $^ $(LDLIBS) $(OUTPUT_OPTION) - -cam: cam.o streamline_annotate.o - $(LINK.o) $^ $(LDLIBS) $(OUTPUT_OPTION) - -delta: delta.o streamline_annotate.o - $(LINK.o) $^ $(LDLIBS) $(OUTPUT_OPTION) - -visual: visual.o streamline_annotate.o - $(LINK.o) $^ $(LDLIBS) $(OUTPUT_OPTION) - -shared: shared.o streamline_annotate.o - $(LINK.o) $^ $(LDLIBS) $(OUTPUT_OPTION) - -clean: - rm -f *~ *.d *.i *.s *.o $(TARGETS) diff --git a/examples/absolute.c b/examples/absolute.c deleted file mode 100644 index 976274cf..00000000 --- a/examples/absolute.c +++ /dev/null @@ -1,109 +0,0 @@ -/** - * Copyright (C) ARM Limited 2014-2016. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#include -#include - -#include "streamline_annotate.h" - -/* This function "simulates" counters, generating values of fancy - * functions like sine or triangle... */ -static int mmapped_simulate(int counter, int delta_in_us) -{ - int result = 0; - - switch (counter) { - case 0: /* sort-of-sine */ - { - static int t = 0; - int x; - - t += delta_in_us; - if (t > 2048000) - t = 0; - - if (t % 1024000 < 512000) - x = 512000 - (t % 512000); - else - x = t % 512000; - - result = 32 * x / 512000; - result = result * result; - - if (t < 1024000) - result = 1922 - result; - } - break; - case 1: /* triangle */ - { - static int v, d = 1; - - v = v + d * delta_in_us; - if (v < 0) { - v = 0; - d = 1; - } else if (v > 1000000) { - v = 1000000; - d = -1; - } - - result = v; - } - break; - case 2: /* PWM signal */ - { - static int dc, x, t = 0; - - t += delta_in_us; - if (t > 1000000) - t = 0; - if (x / 1000000 != (x + delta_in_us) / 1000000) - dc = (dc + 100000) % 1000000; - x += delta_in_us; - - result = t < dc ? 0 : 10; - } - break; - } - - return result; -} - -int main(void) -{ - struct timespec ts; - int i; - - ANNOTATE_SETUP; - ANNOTATE_ABSOLUTE_COUNTER(0xa0, "Simulated4", "Sine"); - ANNOTATE_ABSOLUTE_COUNTER(0xa1, "Simulated5", "Triangle"); - ANNOTATE_ABSOLUTE_COUNTER(0xa2, "Simulated6", "PWM"); - - clock_gettime(CLOCK_MONOTONIC, &ts); - - for (i = 0; i < 2000; ++i) { - ANNOTATE_COUNTER_VALUE(0xa0, mmapped_simulate(0, 10000)); - ANNOTATE_COUNTER_VALUE(0xa1, mmapped_simulate(1, 10000)); - ANNOTATE_COUNTER_VALUE(0xa2, mmapped_simulate(2, 10000)); - - ts.tv_nsec += 10000000; - if (ts.tv_nsec > 1000000000) { - ts.tv_nsec -= 1000000000; - ++ts.tv_sec; - } - clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &ts, NULL); - } - - /* absolute counters will display the last value used, thus - * set all values to zero before exiting */ - ANNOTATE_COUNTER_VALUE(0xa0, 0); - ANNOTATE_COUNTER_VALUE(0xa1, 0); - ANNOTATE_COUNTER_VALUE(0xa2, 0); - - return 0; -} diff --git a/examples/cam.c b/examples/cam.c deleted file mode 100644 index 6360d2db..00000000 --- a/examples/cam.c +++ /dev/null @@ -1,120 +0,0 @@ -/** - * Copyright (C) ARM Limited 2014-2016. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -/** - * This is a contrived, bare-bones program to provide a simple - * example of how the Custom Activity Map (CAM) macros are used. - */ -#include -#include -#include -#include -#include -#include -#include -#include - -#include "streamline_annotate.h" - -#define NS_PER_S 1000000000LL - -#define VIEW_UID1 1 -#define VIEW_UID2 2 -#define TRACK_ROOT 1 -#define TRACK_CHILD 2 -#define TRACK_X 3 - -static long base_id; - -static void do_some_work(void) -{ - /* delay due to some fictitious work */ - sleep(1); -} - -static void create_base_id(void) -{ - /* - * create a random base_id so this application can be run - * multiple times within the same capture and still have - * unique ids this is not a perfect solution but is very - * simple and should work in a very high percentage of cases - */ - int fd = open("/dev/urandom", O_RDONLY); - if (fd < 0) { - printf("Error opening /dev/urandom: %s\n", strerror(errno)); - } else { - if (read(fd, &base_id, sizeof(base_id)) != sizeof(base_id)) { - printf("Error reading from /dev/urandom: %s\n", - strerror(errno)); - } - close(fd); - } -} - -int main(void) -{ - ANNOTATE_SETUP; - create_base_id(); - - /* view 1 */ - CAM_VIEW_NAME(VIEW_UID1, "Custom Activity Map 1"); - CAM_TRACK(VIEW_UID1, TRACK_ROOT, -1, "[track 1]"); - CAM_TRACK(VIEW_UID1, TRACK_CHILD, TRACK_ROOT, "[track 2]"); - - /* view 2 */ - CAM_VIEW_NAME(VIEW_UID2, "Custom Activity Map 2"); - CAM_TRACK(VIEW_UID2, TRACK_ROOT, -1, "[track 1]"); - CAM_TRACK(VIEW_UID2, TRACK_CHILD, TRACK_ROOT, "[track 2]"); - CAM_TRACK(VIEW_UID2, TRACK_X, -1, "[track X]"); - - uint64_t start_time = gator_get_time(); - { - CAM_JOB_START(VIEW_UID2, base_id, "$job$", TRACK_ROOT, - start_time, ANNOTATE_YELLOW); - CAM_JOB_START(VIEW_UID2, base_id + 1, "$job$", TRACK_X, - start_time, ANNOTATE_YELLOW); - } - do_some_work(); - { - uint64_t time = gator_get_time(); - - CAM_JOB(VIEW_UID1, base_id, "$job$", TRACK_CHILD, start_time, - time - start_time, ANNOTATE_WHITE); - CAM_JOB_STOP(VIEW_UID2, base_id, time); - CAM_JOB_STOP(VIEW_UID2, base_id + 1, time); - } - - /* job with a single dependency */ - { - uint64_t time = gator_get_time(); - - CAM_JOB_START(VIEW_UID2, base_id + 2, "dependent job", - TRACK_CHILD, time, ANNOTATE_COLOR_CYCLE); - CAM_JOB_SET_DEP(VIEW_UID2, base_id + 2, time, base_id); - } - do_some_work(); - CAM_JOB_STOP(VIEW_UID2, base_id + 2, gator_get_time()); - - /* job with multiple dependencies */ - { - uint64_t time = gator_get_time(); - uint32_t dependencies[2]; - - dependencies[0] = base_id + 1; - dependencies[1] = base_id + 2; - CAM_JOB_START(VIEW_UID2, base_id + 3, "dependent job", TRACK_X, - time, ANNOTATE_COLOR_CYCLE); - CAM_JOB_SET_DEPS(VIEW_UID2, base_id + 3, time, 2, - dependencies); - } - do_some_work(); - CAM_JOB_STOP(VIEW_UID2, base_id + 3, gator_get_time()); - - return 0; -} diff --git a/examples/delta.c b/examples/delta.c deleted file mode 100644 index 34702c02..00000000 --- a/examples/delta.c +++ /dev/null @@ -1,43 +0,0 @@ -/** - * Copyright (C) ARM Limited 2014-2016. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#include -#include - -#include "streamline_annotate.h" - -int main(void) -{ - struct timespec ts; - long long collatz = 9780657630LL; - - ANNOTATE_SETUP; - ANNOTATE_DELTA_COUNTER(0xd0, "collatz", "multiply"); - ANNOTATE_DELTA_COUNTER(0xd1, "collatz", "divide"); - - clock_gettime(CLOCK_MONOTONIC, &ts); - - while (collatz != 1) { - if (collatz & 1) { - ANNOTATE_COUNTER_VALUE(0xd0, 1); - collatz = 3*collatz + 1; - } else { - ANNOTATE_COUNTER_VALUE(0xd1, 1); - collatz = collatz/2; - } - - ts.tv_nsec += 10000000; - if (ts.tv_nsec > 1000000000) { - ts.tv_nsec -= 1000000000; - ++ts.tv_sec; - } - clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &ts, NULL); - } - - return 0; -} diff --git a/examples/readme.txt b/examples/readme.txt deleted file mode 100644 index 00d928f5..00000000 --- a/examples/readme.txt +++ /dev/null @@ -1,29 +0,0 @@ -*** Example Programs Extending Gator *** - -text.c: output bookmarks along with string annotations that make use of groups and channels. -visual.c: output the ARM logo as a visual annotation. -delta.c: generate a custom delta counter chart by emitting annotations. -absolute.c: generate a custom absolute counter chart by emitting annotations. -cam.c: generate a custom activity map (CAM) view by emitting CAM messages. -shared.c: generate a per-process unique counter and a counter shared by multiple processes. - -*** Building the examples *** - -The examples in this folder can be built natively on an ARM target by -running - make - -They can also be cross compiled by running - make CROSS_COMPILE=<...> - -*** Other Ways of Extending Gator *** - -- Regularly read the contents of a file and plot it in Streamline, see - streamline/gator/daemon/events-Filesystem.xml for an example. - -- Regularly read the contents of the ftrace buffer and plot it in - Streamline, see streamline/gator/daemon/events-ftrace.xml for an - example. - -- Generate a custom counter from the driver via gator.ko, see - streamline/gator/driver/gator_events_mmapped.c for an example. diff --git a/examples/shared.c b/examples/shared.c deleted file mode 100644 index 968c25ef..00000000 --- a/examples/shared.c +++ /dev/null @@ -1,79 +0,0 @@ -/** - * Copyright (C) ARM Limited 2014-2016. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "streamline_annotate.h" - -static const int shared_absolute_key = 0xb0; -static const int shared_delta_key = 0xb1; -static int unique_absolute_key; -static int unique_delta_key; - -static int get_sys_rand(void) -{ - int i; - - /* create a random base_id so this application can be run multiple times within the same capture and still have unique ids */ - /* this is not a perfect solution but is very simple and should work in a very high percentage of cases */ - int fd = open("/dev/urandom", O_RDONLY); - if (fd < 0) { - printf("Error opening /dev/urandom: %s\n", strerror(errno)); - abort(); - } else { - if (read(fd, &i, sizeof(i)) != sizeof(i)) { - printf("Error reading from /dev/urandom: %s\n", strerror(errno)); - abort(); - } - close(fd); - } - - return i; -} - -int main(void) -{ - const struct timespec ts = { 0, 10000000 }; - int i; - char buf[16]; - - ANNOTATE_SETUP; - - ANNOTATE_ABSOLUTE_COUNTER(shared_absolute_key, "Shared", "Absolute"); - ANNOTATE_DELTA_COUNTER(shared_delta_key, "Shared", "Delta"); - - unique_absolute_key = get_sys_rand(); - unique_delta_key = unique_absolute_key + 1; - snprintf(buf, sizeof(buf), "Unique %i", getpid()); - ANNOTATE_ABSOLUTE_COUNTER(unique_absolute_key, buf, "Absolute"); - ANNOTATE_DELTA_COUNTER(unique_delta_key, buf, "Delta"); - - for (i = 0; i < 500; ++i) { - nanosleep(&ts, NULL); - ANNOTATE_COUNTER_VALUE(shared_absolute_key, i); - nanosleep(&ts, NULL); - ANNOTATE_COUNTER_VALUE(shared_delta_key, 25); - nanosleep(&ts, NULL); - ANNOTATE_COUNTER_VALUE(unique_absolute_key, i); - nanosleep(&ts, NULL); - ANNOTATE_COUNTER_VALUE(unique_delta_key, 25); - } - - ANNOTATE_COUNTER_VALUE(shared_absolute_key, 0); - ANNOTATE_COUNTER_VALUE(unique_absolute_key, 0); - - return 0; -} diff --git a/examples/text.c b/examples/text.c deleted file mode 100644 index 40e40be3..00000000 --- a/examples/text.c +++ /dev/null @@ -1,41 +0,0 @@ -/** - * Copyright (C) ARM Limited 2014-2016. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#include - -#include "streamline_annotate.h" - -int main(void) -{ - const struct timespec ts = { 0, 100000000 }; - - ANNOTATE_SETUP; - - ANNOTATE("A simple textual annotation"); - nanosleep(&ts, NULL); - ANNOTATE_CHANNEL(1, "An annotation on another channel"); - nanosleep(&ts, NULL); - ANNOTATE_CHANNEL_COLOR(1, ANNOTATE_BLUE, "A blue annotation"); - nanosleep(&ts, NULL); - ANNOTATE_END(); - nanosleep(&ts, NULL); - ANNOTATE_CHANNEL_END(1); - - ANNOTATE_NAME_GROUP(2, "Groups can be named after use"); - ANNOTATE_NAME_CHANNEL(1, 2, "As can channels"); - - ANNOTATE_MARKER(); - nanosleep(&ts, NULL); - ANNOTATE_MARKER_STR("Markers can have comments"); - nanosleep(&ts, NULL); - ANNOTATE_MARKER_COLOR(ANNOTATE_PURPLE); - nanosleep(&ts, NULL); - ANNOTATE_MARKER_COLOR_STR(ANNOTATE_GREEN, "A green marker"); - - return 0; -} diff --git a/examples/visual.c b/examples/visual.c deleted file mode 100644 index 1db86330..00000000 --- a/examples/visual.c +++ /dev/null @@ -1,229 +0,0 @@ -/** - * Copyright (C) ARM Limited 2014-2016. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#include "streamline_annotate.h" - -static const unsigned char arm_logo_limited_use[] = { - 0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0x2c, 0x01, 0x7c, 0x00, 0xd5, 0x00, - 0x00, 0xc4, 0xe2, 0xe9, 0x4d, 0xa7, 0xbf, 0xbf, 0xbf, 0xbf, 0x40, 0x40, - 0x40, 0x7f, 0x7f, 0x7f, 0x88, 0xc4, 0xd4, 0xf0, 0xf8, 0xfa, 0x10, 0x10, - 0x10, 0xef, 0xef, 0xef, 0x21, 0x91, 0xae, 0xcf, 0xcf, 0xcf, 0x9f, 0x9f, - 0x9f, 0x6b, 0xb6, 0xc9, 0xa6, 0xd3, 0xdf, 0x60, 0x60, 0x60, 0x30, 0x99, - 0xb4, 0x30, 0x30, 0x30, 0x8f, 0x8f, 0x8f, 0x3f, 0xa0, 0xb9, 0x20, 0x20, - 0x20, 0xdf, 0xdf, 0xdf, 0xaf, 0xaf, 0xaf, 0xe1, 0xf0, 0xf4, 0xd2, 0xe9, - 0xef, 0x50, 0x50, 0x50, 0x70, 0x70, 0x70, 0x97, 0xcc, 0xd9, 0x5c, 0xaf, - 0xc4, 0xb5, 0xda, 0xe4, 0x7a, 0xbd, 0xcf, 0x00, 0x00, 0x00, 0x12, 0x8a, - 0xa9, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x01, 0x7c, 0x00, 0x00, 0x06, - 0xff, 0x40, 0x90, 0x70, 0x48, 0x2c, 0x1a, 0x8f, 0xc8, 0xa4, 0x72, 0xc9, - 0x6c, 0x3a, 0x9f, 0xd0, 0xa8, 0x74, 0x4a, 0xad, 0x5a, 0xaf, 0xd8, 0xac, - 0x76, 0xcb, 0xed, 0x7a, 0xbf, 0xe0, 0xb0, 0x78, 0x4c, 0x2e, 0x9b, 0xcf, - 0xe8, 0xb4, 0x7a, 0xcd, 0x6e, 0xbb, 0xdf, 0xf0, 0xb8, 0x7c, 0x4e, 0xaf, - 0xdb, 0xef, 0xf8, 0xbc, 0x7e, 0xcf, 0xef, 0xfb, 0xff, 0x80, 0x81, 0x82, - 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, - 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, - 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, - 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, - 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0x5e, 0x06, 0x09, 0x1f, - 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc0, 0x0d, 0x69, 0x05, 0xc4, 0xc9, 0xca, - 0xcb, 0xc9, 0x12, 0x01, 0x05, 0x1c, 0x16, 0x61, 0x01, 0xcc, 0xc4, 0x05, - 0x74, 0x17, 0xbe, 0xd5, 0xc2, 0x00, 0x4a, 0x16, 0x1d, 0x0f, 0xc1, 0x1b, - 0xdd, 0x66, 0x0d, 0xdb, 0xd5, 0x0f, 0xc7, 0xe7, 0xeb, 0xec, 0xbf, 0x12, - 0x1d, 0x17, 0x5e, 0xd4, 0xed, 0x1f, 0xc6, 0x71, 0x06, 0xe1, 0xf4, 0xe4, - 0x47, 0x1a, 0xc0, 0x01, 0x1d, 0x01, 0xf2, 0x05, 0x30, 0x50, 0x26, 0x1f, - 0xbd, 0x61, 0xfb, 0xca, 0x20, 0x3b, 0xc8, 0x70, 0x99, 0x04, 0x7b, 0x5a, - 0xe6, 0xe9, 0x83, 0x63, 0x40, 0x02, 0xc3, 0x84, 0x44, 0x18, 0x7c, 0x48, - 0xa0, 0x81, 0xe0, 0x10, 0x00, 0x16, 0x25, 0x78, 0x0c, 0x03, 0xa0, 0xe1, - 0xb0, 0x00, 0x68, 0x16, 0x9a, 0x5c, 0x29, 0xec, 0x01, 0xc4, 0x2b, 0x12, - 0xdb, 0x25, 0x88, 0xe7, 0x66, 0x43, 0x43, 0x8c, 0x42, 0xfa, 0x3d, 0xb8, - 0x00, 0x30, 0x80, 0xcf, 0xff, 0x02, 0xd2, 0x34, 0xa2, 0x14, 0xa3, 0x91, - 0x25, 0x30, 0x69, 0x66, 0x54, 0x1a, 0x5d, 0x1a, 0x00, 0xa9, 0x95, 0x98, - 0xed, 0x1e, 0x8c, 0x54, 0x53, 0xf4, 0xa2, 0x91, 0x5e, 0x33, 0x41, 0x40, - 0x4d, 0x40, 0x90, 0xda, 0xcb, 0x2e, 0x06, 0x96, 0x02, 0x63, 0x70, 0x46, - 0xa9, 0x58, 0x96, 0x09, 0xbe, 0x4a, 0x81, 0xda, 0x4e, 0xe4, 0x9a, 0x7e, - 0x26, 0x71, 0xf6, 0xbb, 0xa6, 0xf5, 0x83, 0x10, 0x0b, 0xe1, 0x8c, 0x5d, - 0xf8, 0x20, 0x21, 0x0c, 0xdc, 0xb3, 0x53, 0xc5, 0x98, 0x3d, 0xcb, 0x92, - 0x6c, 0x15, 0xb6, 0xed, 0x36, 0xa8, 0x31, 0xb7, 0x12, 0x27, 0x35, 0xa4, - 0xd4, 0x86, 0x84, 0xd3, 0x20, 0xc4, 0x62, 0xe0, 0x2d, 0x06, 0xc5, 0xd2, - 0x25, 0x33, 0x98, 0xf0, 0x4a, 0xc3, 0x53, 0x10, 0xb7, 0x03, 0x5d, 0x26, - 0x1b, 0x4b, 0x9c, 0x09, 0xd2, 0x09, 0xa1, 0xe6, 0x33, 0x5c, 0x02, 0xa4, - 0xc8, 0x70, 0x66, 0x29, 0xe9, 0x39, 0x41, 0x52, 0xcf, 0x84, 0x49, 0x43, - 0x11, 0xdd, 0x8e, 0x72, 0x69, 0x6d, 0x8d, 0x8d, 0x7c, 0x18, 0x5a, 0x37, - 0x18, 0x87, 0x21, 0xb1, 0xbf, 0x54, 0x25, 0xac, 0xf6, 0x4b, 0x67, 0xdc, - 0x26, 0x3b, 0x84, 0x5e, 0xda, 0x1c, 0xac, 0x45, 0xa3, 0xa8, 0x55, 0xd7, - 0x05, 0x00, 0x40, 0xa3, 0x6d, 0x21, 0x1d, 0x3e, 0xc8, 0xbe, 0x12, 0x16, - 0xba, 0x76, 0xc1, 0xd0, 0x09, 0x1f, 0x8f, 0xc2, 0x5b, 0x26, 0x4d, 0x30, - 0x15, 0xc5, 0x3a, 0xfe, 0x00, 0xd9, 0x2e, 0x88, 0xf2, 0x1e, 0x2d, 0x7b, - 0xf9, 0x8b, 0x7b, 0x3d, 0xfa, 0xf4, 0x62, 0x71, 0xc5, 0x5e, 0x80, 0xef, - 0x79, 0xb1, 0xdc, 0x69, 0x46, 0xcc, 0xb5, 0x9a, 0x7d, 0x20, 0xf8, 0xd2, - 0x4d, 0x49, 0xc4, 0x71, 0x91, 0x99, 0x67, 0x11, 0x82, 0xf1, 0x1c, 0x80, - 0x0c, 0xe9, 0xc6, 0x44, 0x7b, 0xf4, 0xb8, 0xe5, 0xff, 0x45, 0x78, 0x67, - 0xe1, 0xd4, 0xcb, 0x07, 0xf1, 0x44, 0xb6, 0x20, 0x65, 0x16, 0xf9, 0xb7, - 0x05, 0x07, 0x18, 0x92, 0x38, 0xc6, 0x85, 0x2d, 0xd2, 0x53, 0xe0, 0x86, - 0x84, 0x79, 0xb8, 0x05, 0x63, 0x21, 0x1e, 0x61, 0xce, 0x4c, 0x0d, 0x6c, - 0x06, 0x40, 0x01, 0x1a, 0x08, 0xf5, 0x85, 0x4d, 0x18, 0x6a, 0xd8, 0x05, - 0x8c, 0x31, 0xb2, 0xa3, 0xd8, 0x13, 0x1c, 0x1e, 0x64, 0x64, 0x15, 0x2c, - 0x7a, 0x36, 0x9e, 0x77, 0x05, 0x4c, 0xc5, 0x41, 0x38, 0x36, 0x6e, 0x61, - 0x41, 0x92, 0x4e, 0x39, 0xd7, 0x90, 0x4f, 0x60, 0x86, 0x19, 0xe6, 0x75, - 0x62, 0x75, 0xb9, 0x44, 0x93, 0x07, 0x49, 0x97, 0x85, 0x69, 0x52, 0x26, - 0xd1, 0x80, 0x36, 0x60, 0x6a, 0xb3, 0xc1, 0x65, 0x59, 0x20, 0xa9, 0xd9, - 0x7f, 0x07, 0x3d, 0x71, 0x81, 0x06, 0x13, 0x32, 0xb4, 0x19, 0x8d, 0xb8, - 0x55, 0x07, 0x85, 0x05, 0xc0, 0x11, 0x36, 0x9e, 0x10, 0x06, 0x14, 0x40, - 0x66, 0x02, 0x0c, 0x1c, 0x8a, 0x45, 0x9f, 0xd0, 0x09, 0x68, 0x61, 0x43, - 0x52, 0x5c, 0xb9, 0xd2, 0x79, 0x67, 0xa6, 0xa7, 0xa2, 0x14, 0xf1, 0x41, - 0xe7, 0x68, 0x1a, 0x51, 0x26, 0x29, 0x28, 0x16, 0x76, 0x2a, 0x33, 0x45, - 0xa7, 0x0d, 0x99, 0x99, 0x04, 0x9a, 0x0c, 0x65, 0x45, 0x05, 0xab, 0x56, - 0xc9, 0x41, 0x64, 0x92, 0x98, 0x72, 0x51, 0x6a, 0x32, 0x54, 0xe0, 0x63, - 0xd2, 0xa8, 0x44, 0xc0, 0x7a, 0xd0, 0x6b, 0x53, 0x1c, 0xd8, 0x66, 0x1c, - 0x5b, 0x26, 0x09, 0xcc, 0xa6, 0x5b, 0xdc, 0x4a, 0x4c, 0x15, 0x38, 0x1e, - 0xf4, 0xa7, 0x12, 0xbe, 0x1e, 0x94, 0x65, 0x13, 0xca, 0xde, 0x24, 0x47, - 0xb5, 0xe2, 0xcc, 0xda, 0x4e, 0x85, 0xc9, 0x52, 0x5a, 0x05, 0xa4, 0xe7, - 0x70, 0x8b, 0x44, 0xb4, 0x07, 0x89, 0xeb, 0x66, 0x8c, 0x9f, 0x9e, 0x51, - 0xff, 0x28, 0x3b, 0x1c, 0xd0, 0x76, 0xd0, 0x8c, 0x5a, 0x60, 0x1b, 0x8c, - 0x15, 0x20, 0x96, 0xeb, 0x04, 0xb9, 0x4e, 0x3a, 0xe1, 0x2e, 0x86, 0xe9, - 0x96, 0xd1, 0x2c, 0x3b, 0xdf, 0x81, 0x5b, 0xcd, 0x93, 0x57, 0xc8, 0x0b, - 0x8c, 0x15, 0xff, 0xb2, 0x63, 0xae, 0x11, 0xf8, 0x3a, 0xcb, 0x04, 0x9b, - 0x2d, 0xf6, 0x4b, 0x46, 0xc3, 0x6a, 0xf2, 0xd7, 0x8e, 0xaa, 0xa4, 0x7a, - 0x4b, 0xc5, 0xbe, 0xdb, 0xde, 0x6b, 0xec, 0xa8, 0xba, 0x26, 0x29, 0xb1, - 0x18, 0xc5, 0xbe, 0x8b, 0xe8, 0xba, 0xeb, 0x3c, 0x5b, 0xa7, 0xc6, 0x53, - 0x70, 0xac, 0xb0, 0xc7, 0xc6, 0x8e, 0x87, 0x2a, 0xba, 0x70, 0xd4, 0xdb, - 0x56, 0x46, 0xad, 0xd2, 0x69, 0x85, 0xc1, 0xbf, 0x58, 0x11, 0x2a, 0x3d, - 0x0b, 0x17, 0xd1, 0x70, 0xab, 0xf0, 0x82, 0xa0, 0x2d, 0xcd, 0x6f, 0xa0, - 0x7c, 0xce, 0x4b, 0x7b, 0x31, 0xe4, 0x5b, 0xb7, 0x0c, 0xed, 0xdc, 0xd0, - 0x92, 0x80, 0x1a, 0x2b, 0x55, 0x11, 0xc2, 0x46, 0xfc, 0x46, 0xc2, 0xeb, - 0x04, 0xd6, 0x70, 0xad, 0x05, 0xb3, 0x2c, 0x05, 0x99, 0xf4, 0xa8, 0x3c, - 0xae, 0xb1, 0xc0, 0xd8, 0x68, 0xb1, 0xc8, 0x6f, 0x34, 0xac, 0x21, 0xd7, - 0x4b, 0xdb, 0x2a, 0x36, 0x14, 0x2e, 0xb3, 0x0b, 0x33, 0xda, 0x1f, 0x2c, - 0x09, 0xb7, 0xd6, 0x6d, 0x94, 0x4c, 0x0f, 0xb2, 0x0d, 0x32, 0x14, 0xb4, - 0x14, 0x3c, 0x33, 0x38, 0xb6, 0x49, 0x3a, 0x33, 0x8c, 0xf7, 0x58, 0x10, - 0xe3, 0x3d, 0xf2, 0x17, 0x36, 0xb3, 0x03, 0x36, 0x08, 0x85, 0x3f, 0xbe, - 0x44, 0xe1, 0x54, 0x64, 0xbd, 0x4e, 0x5f, 0x77, 0x2f, 0xae, 0x34, 0xdb, - 0x6c, 0x8c, 0x98, 0x26, 0x12, 0x7e, 0x8f, 0x06, 0x75, 0x9e, 0x51, 0x18, - 0x70, 0x34, 0x3d, 0x4f, 0x57, 0x1d, 0xd5, 0xe7, 0xc6, 0xae, 0xbe, 0x8e, - 0xe5, 0x5c, 0xec, 0x5d, 0xff, 0x0d, 0xc6, 0x42, 0xc8, 0x7e, 0x0e, 0xee, - 0x84, 0xcf, 0xed, 0x4d, 0x01, 0xb0, 0x9f, 0x23, 0x69, 0x13, 0x0d, 0x07, - 0xd0, 0xf4, 0xe2, 0xbf, 0x34, 0x6a, 0x2d, 0x1b, 0x64, 0xbf, 0x9c, 0x44, - 0xdd, 0xe7, 0xa8, 0x99, 0xf1, 0x45, 0xdc, 0x55, 0x6f, 0x7d, 0xf5, 0x05, - 0x74, 0xd0, 0x7c, 0x43, 0x66, 0xaf, 0x2a, 0x38, 0x08, 0xb6, 0x03, 0x88, - 0x12, 0xf4, 0xdb, 0xd0, 0xae, 0xc5, 0xf1, 0xf4, 0xf0, 0x2a, 0x30, 0x33, - 0xc3, 0x4b, 0x8d, 0x3c, 0x3d, 0xed, 0xbb, 0xee, 0x7c, 0xe1, 0x0d, 0xb9, - 0x45, 0x7e, 0x35, 0xe6, 0x67, 0xa1, 0x79, 0x35, 0xf1, 0x27, 0xd8, 0x50, - 0xeb, 0x55, 0xa0, 0x1f, 0xda, 0x00, 0x07, 0xad, 0xef, 0x09, 0x61, 0x7f, - 0xb8, 0x01, 0x16, 0x08, 0xee, 0xc7, 0x8c, 0xfc, 0x91, 0x27, 0x78, 0xcb, - 0x20, 0xd8, 0x10, 0x44, 0x47, 0x8f, 0xc9, 0x45, 0x41, 0x80, 0x49, 0x92, - 0xe0, 0xd9, 0xec, 0x35, 0x84, 0xed, 0x45, 0xea, 0x3d, 0x0c, 0x5c, 0x86, - 0x03, 0x11, 0xb6, 0xbc, 0x25, 0x20, 0x90, 0x19, 0xbc, 0xa2, 0xd6, 0xfb, - 0xd8, 0xc1, 0xb9, 0x01, 0x71, 0x10, 0x51, 0x1e, 0xf4, 0x8c, 0x8a, 0x42, - 0xa8, 0x8c, 0x11, 0x56, 0x21, 0x86, 0xe8, 0x70, 0x02, 0xfa, 0x3a, 0x16, - 0xb6, 0x15, 0x6e, 0x63, 0x5a, 0x9d, 0x73, 0xde, 0x10, 0x08, 0x85, 0xa1, - 0xaf, 0xd0, 0x30, 0x19, 0x36, 0x9c, 0xc2, 0x0e, 0xd9, 0xd1, 0xbd, 0x23, - 0x0c, 0xcd, 0x86, 0x18, 0x14, 0x5f, 0xe2, 0x32, 0xf5, 0xc2, 0x21, 0x34, - 0x2e, 0x37, 0x46, 0x38, 0x22, 0x31, 0x92, 0x28, 0x85, 0x13, 0x2e, 0x83, - 0x77, 0x46, 0x08, 0xdf, 0x32, 0xa8, 0x46, 0x85, 0x28, 0x42, 0x47, 0x7a, - 0xd3, 0xa9, 0xe2, 0x10, 0xc4, 0xc8, 0x10, 0x32, 0x7e, 0xa4, 0x84, 0x66, - 0xa0, 0x60, 0x62, 0xa2, 0xb0, 0x3e, 0x66, 0x80, 0xff, 0x91, 0x09, 0x66, - 0x24, 0x4c, 0x02, 0x08, 0xc8, 0x24, 0x03, 0xfa, 0xaf, 0x46, 0x74, 0xd2, - 0x22, 0x42, 0xd2, 0xb0, 0xb6, 0x75, 0xa4, 0xb0, 0x08, 0x85, 0xd3, 0xe0, - 0xe5, 0x7c, 0x98, 0x8c, 0x0e, 0x4c, 0x31, 0x88, 0xeb, 0x58, 0x98, 0x17, - 0x25, 0xa7, 0x33, 0x41, 0x72, 0x23, 0x0d, 0x75, 0x54, 0xc6, 0x77, 0x06, - 0xd5, 0x90, 0xfe, 0x3d, 0x21, 0x8f, 0x46, 0x61, 0xc0, 0x1d, 0xfb, 0xa8, - 0xc6, 0x22, 0xe8, 0x0e, 0x7e, 0x45, 0x13, 0x82, 0x25, 0x83, 0xc1, 0xc5, - 0x27, 0xac, 0x72, 0x2c, 0xc1, 0xe2, 0x5e, 0x00, 0x19, 0x19, 0x8c, 0x07, - 0xb4, 0xb2, 0x38, 0x40, 0x53, 0xc2, 0xcc, 0xe0, 0x98, 0x45, 0x5e, 0x8e, - 0x61, 0x92, 0xc9, 0x48, 0xe5, 0x12, 0x5e, 0xf9, 0x0b, 0x0b, 0xe2, 0x91, - 0x96, 0xc2, 0x70, 0x64, 0x16, 0x8a, 0xb7, 0x04, 0x39, 0x1e, 0x84, 0x57, - 0xc4, 0x14, 0xcf, 0x19, 0xca, 0x73, 0x10, 0x63, 0x2e, 0x21, 0x93, 0xca, - 0x38, 0xe4, 0x11, 0x40, 0xb9, 0x14, 0x20, 0xae, 0xc5, 0x8f, 0x49, 0xb8, - 0x22, 0x3b, 0xd0, 0x88, 0x84, 0x68, 0xde, 0x92, 0x09, 0x85, 0x3c, 0x07, - 0x00, 0xa1, 0xc0, 0xc6, 0x66, 0x94, 0x11, 0x99, 0xc3, 0xf0, 0xe6, 0x6e, - 0xc0, 0x99, 0x84, 0x9f, 0xb1, 0x43, 0x91, 0x0b, 0xf4, 0x65, 0x18, 0xb0, - 0x99, 0x8c, 0x51, 0x26, 0xc1, 0x99, 0xec, 0x30, 0x1f, 0x37, 0xc5, 0x22, - 0x4f, 0x48, 0x86, 0xcb, 0x09, 0xed, 0x0c, 0x46, 0x0b, 0x87, 0xa9, 0xcf, - 0x2f, 0x44, 0xd3, 0x8d, 0x5d, 0x9c, 0xda, 0x14, 0x0a, 0x57, 0x80, 0x8a, - 0x5a, 0x34, 0x7b, 0x38, 0xa4, 0x07, 0x3e, 0xbd, 0x57, 0xca, 0x24, 0x44, - 0x8e, 0x19, 0x05, 0x2d, 0x82, 0x39, 0xcd, 0x00, 0x4c, 0x62, 0xf0, 0xd1, - 0x09, 0xa5, 0xbb, 0x58, 0xef, 0xa2, 0x86, 0x84, 0x44, 0x41, 0xf0, 0x1c, - 0xff, 0x27, 0xa5, 0x62, 0x2e, 0x9f, 0x00, 0x4c, 0x57, 0x35, 0x61, 0xa4, - 0x64, 0x48, 0xe9, 0x3a, 0x36, 0xf9, 0x94, 0x86, 0x6c, 0x94, 0x08, 0x98, - 0xd3, 0xe5, 0x29, 0x77, 0xfa, 0x48, 0x8e, 0xce, 0xd4, 0x09, 0xbb, 0x0c, - 0x26, 0xdd, 0x1a, 0x7a, 0x24, 0x78, 0xfe, 0xaa, 0xa8, 0x88, 0xf4, 0x9d, - 0x11, 0x30, 0xf8, 0x53, 0xa1, 0xd1, 0x93, 0x09, 0x21, 0xcb, 0x66, 0x14, - 0x70, 0x3a, 0x06, 0x7e, 0x3a, 0x55, 0x18, 0x4d, 0x44, 0x42, 0x50, 0x8f, - 0x19, 0x9c, 0x6f, 0x76, 0x74, 0x09, 0xe2, 0x04, 0xc6, 0x3a, 0x99, 0xc0, - 0xd5, 0x30, 0xd8, 0xf3, 0xab, 0xe7, 0xb0, 0xe6, 0x54, 0xa5, 0x7a, 0x84, - 0x92, 0x26, 0x63, 0x70, 0x1b, 0x3c, 0x2a, 0x14, 0x96, 0x98, 0xbc, 0x96, - 0x31, 0x75, 0x0b, 0x43, 0x85, 0xab, 0x56, 0x3f, 0x49, 0xd7, 0xab, 0x64, - 0x74, 0x1b, 0xda, 0xec, 0xd5, 0x55, 0x11, 0x7a, 0x92, 0x8d, 0xfd, 0x35, - 0x0b, 0x3a, 0x15, 0x6c, 0x0e, 0x09, 0xcb, 0x52, 0x1d, 0x5e, 0xca, 0xac, - 0x7a, 0xbd, 0xa0, 0x42, 0xa1, 0x7a, 0x84, 0xb6, 0x7a, 0x49, 0xb2, 0x13, - 0x71, 0xc2, 0x58, 0x45, 0xbb, 0x92, 0xc4, 0x2e, 0xe8, 0xac, 0x4e, 0xd0, - 0x80, 0x45, 0xfd, 0x59, 0xce, 0xc7, 0x3e, 0x0a, 0xb4, 0x99, 0x55, 0xc2, - 0x68, 0x9b, 0x90, 0xd5, 0x6a, 0xba, 0x30, 0xb6, 0x6a, 0xf0, 0x6c, 0x17, - 0xde, 0x0a, 0xdb, 0x6d, 0xb0, 0x76, 0xb6, 0x4d, 0x48, 0x68, 0x32, 0x4c, - 0xcb, 0xcc, 0x37, 0xe8, 0x96, 0x0b, 0x81, 0xed, 0x2d, 0x31, 0x36, 0x0a, - 0xdc, 0x26, 0x1c, 0x96, 0x19, 0x72, 0x55, 0x2c, 0x6a, 0xcf, 0x70, 0x5c, - 0x2d, 0x44, 0x56, 0xb9, 0xcc, 0x80, 0x6a, 0x73, 0xd9, 0x5a, 0x56, 0xe2, - 0x2d, 0x36, 0x0d, 0xd5, 0xcd, 0xc2, 0x47, 0xb1, 0x5b, 0x8d, 0xb0, 0x22, - 0xa7, 0xb0, 0x4a, 0x78, 0xff, 0xee, 0x32, 0xf0, 0x3a, 0x84, 0xe2, 0xba, - 0x21, 0xbc, 0x58, 0x78, 0x29, 0x79, 0x85, 0xc1, 0xd3, 0x24, 0x6c, 0x97, - 0x09, 0xc2, 0xdd, 0xa2, 0x41, 0xb7, 0xc1, 0xde, 0x31, 0xc0, 0x97, 0x84, - 0xf3, 0x6d, 0x47, 0x0a, 0xef, 0xcb, 0x04, 0xaf, 0x12, 0x03, 0xa2, 0x79, - 0xe5, 0xe1, 0x7b, 0x5d, 0xfb, 0xaa, 0x00, 0x47, 0x85, 0xac, 0xa8, 0x9b, - 0x42, 0x7e, 0x87, 0xe1, 0x4f, 0xf7, 0xb6, 0xe1, 0xbf, 0x54, 0xb8, 0xae, - 0x83, 0x6b, 0xb8, 0xc8, 0xca, 0x4e, 0x41, 0xbe, 0xca, 0xc0, 0xa7, 0x85, - 0xd9, 0x80, 0xe1, 0x29, 0x8c, 0x37, 0xae, 0xd7, 0x4b, 0xb1, 0x8a, 0x57, - 0xcc, 0xe2, 0xea, 0x81, 0x98, 0x18, 0x83, 0x23, 0x30, 0x84, 0x19, 0x52, - 0xd4, 0x11, 0xaf, 0xa1, 0xc4, 0x52, 0x78, 0xf1, 0x30, 0xcc, 0xbb, 0x05, - 0xbb, 0x52, 0x58, 0xb6, 0xe8, 0x6d, 0xe6, 0x4a, 0x78, 0x6c, 0xe3, 0xdc, - 0x32, 0x38, 0x0a, 0x13, 0x0e, 0x06, 0x6b, 0xb1, 0xc0, 0xd7, 0x75, 0x48, - 0x50, 0xc6, 0x4c, 0xf0, 0x31, 0x7d, 0x1f, 0x59, 0x64, 0xf0, 0x1e, 0x79, - 0x9e, 0x6d, 0x44, 0xc3, 0xd0, 0x3e, 0x90, 0x38, 0x28, 0xa3, 0xb5, 0xb4, - 0x32, 0x55, 0xf0, 0x85, 0xaf, 0x6c, 0xd9, 0x86, 0x98, 0x16, 0x0b, 0x49, - 0x06, 0x46, 0x13, 0xbd, 0x1c, 0xe6, 0x0a, 0xb6, 0x39, 0x92, 0x70, 0xc0, - 0x31, 0x4d, 0x3b, 0xa9, 0x06, 0x1d, 0x4f, 0x59, 0xac, 0x41, 0x66, 0x02, - 0x6f, 0xd9, 0x31, 0xaa, 0x2a, 0xa3, 0x41, 0xce, 0xb4, 0xb5, 0x73, 0x30, - 0xaa, 0x1a, 0xaf, 0x5d, 0xe1, 0xd9, 0xc3, 0xdf, 0x32, 0x49, 0xd0, 0xfc, - 0x4c, 0x5d, 0x32, 0xe3, 0xd7, 0x24, 0xc2, 0x0c, 0x83, 0x86, 0x27, 0x3b, - 0x57, 0x44, 0x53, 0x21, 0x9d, 0xb3, 0x33, 0xaa, 0x98, 0x49, 0xec, 0xe8, - 0x25, 0xa8, 0x37, 0x19, 0xd1, 0x1d, 0x92, 0x49, 0xdb, 0x00, 0xc7, 0xe6, - 0x66, 0x0a, 0x3a, 0x18, 0x0b, 0x63, 0xb4, 0x19, 0x00, 0xfd, 0xe5, 0xff, - 0x71, 0xfa, 0x4b, 0xdb, 0xcc, 0x73, 0x13, 0x4e, 0xbc, 0x0e, 0xdc, 0xa9, - 0xba, 0x0c, 0xac, 0x56, 0x82, 0x94, 0x83, 0xc1, 0xd9, 0x2f, 0x18, 0x78, - 0x18, 0xf0, 0x2a, 0xf5, 0x12, 0x26, 0x3d, 0xb0, 0x04, 0x0b, 0x71, 0xcc, - 0xb1, 0xc2, 0x02, 0x40, 0xd7, 0x81, 0xe0, 0x33, 0x60, 0x7a, 0x1b, 0x1a, - 0x12, 0xb6, 0x09, 0x57, 0x82, 0xb1, 0x5b, 0x93, 0x21, 0xd7, 0x48, 0x48, - 0xf3, 0x2f, 0x62, 0x3a, 0x86, 0x65, 0xd7, 0x3a, 0xaa, 0x96, 0xae, 0x02, - 0xb1, 0x99, 0x61, 0x24, 0x6b, 0xfb, 0xb7, 0xd3, 0x48, 0xf8, 0x34, 0x31, - 0xea, 0xbb, 0x86, 0x5d, 0xab, 0x19, 0xdc, 0x11, 0x5e, 0xe6, 0x4a, 0x2e, - 0x63, 0x6e, 0x31, 0x60, 0xbb, 0x97, 0x0d, 0x21, 0xe7, 0x1a, 0x9a, 0x2c, - 0xbc, 0xa9, 0x48, 0x9b, 0xa1, 0x26, 0x51, 0x59, 0xbd, 0x49, 0x82, 0x6e, - 0x23, 0xb8, 0xfb, 0x17, 0x4b, 0x16, 0xc3, 0x96, 0x5f, 0xf2, 0xef, 0x37, - 0x03, 0xcc, 0x6b, 0xdf, 0xfd, 0x73, 0xc1, 0x8b, 0x60, 0x92, 0x85, 0xba, - 0x41, 0xdb, 0x1f, 0x38, 0x4f, 0xc3, 0x95, 0x10, 0xcd, 0x5f, 0x00, 0x70, - 0xe0, 0x60, 0xb8, 0xf7, 0x2e, 0x46, 0x4e, 0xf2, 0x92, 0x9b, 0xfc, 0xe4, - 0x28, 0x4f, 0xb9, 0xca, 0x57, 0xce, 0xf2, 0x96, 0xbb, 0xfc, 0xe5, 0x30, - 0x8f, 0xb9, 0xcc, 0x67, 0x4e, 0xf3, 0x9a, 0xdb, 0xfc, 0xe6, 0x38, 0xcf, - 0xb9, 0xce, 0x77, 0xce, 0xf3, 0x9e, 0xfb, 0xfc, 0xe7, 0x90, 0x08, 0x02, - 0x00, 0x3b, 0x00 -}; - -int main(void) -{ - ANNOTATE_SETUP; - - ANNOTATE_VISUAL(arm_logo_limited_use, sizeof(arm_logo_limited_use), "ARM"); - - return 0; -} diff --git a/notify/CMakeLists.txt b/notify/CMakeLists.txt deleted file mode 100644 index e9edc1be..00000000 --- a/notify/CMakeLists.txt +++ /dev/null @@ -1,150 +0,0 @@ -# Copyright (C) ARM Limited 2010-2016. All rights reserved. - -CMAKE_MINIMUM_REQUIRED(VERSION 2.8) - -PROJECT(notify-dex) - -SET(NOTIFY_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) -SET(NOTIFY_SOURCE_FILES ${NOTIFY_SOURCE_DIR}/Notify.java) -SET(NOTIFY_CLASS_OUTDIR ${CMAKE_CURRENT_BINARY_DIR}) -SET(NOTIFY_DEX_PATH ${CMAKE_CURRENT_BINARY_DIR}/notify.dex) - -# Parse the relative paths to the source files to get the class paths -SET(NOTIFY_CLASS_FILES ) -SET(NOTIFY_CLASS_PATHS ) -FOREACH(NOTIFY_SOURCE_FILE ${NOTIFY_SOURCE_FILES}) - GET_FILENAME_COMPONENT( NOTIFY_SOURCE_FILE_DIRECTORY - ${NOTIFY_SOURCE_FILE} - PATH) - GET_FILENAME_COMPONENT( NOTIFY_SOURCE_FILE_NAME_WE - ${NOTIFY_SOURCE_FILE} - NAME_WE) - - SET(NOTIFY_SOURCE_FILE "${NOTIFY_SOURCE_FILE_DIRECTORY}/${NOTIFY_SOURCE_FILE_NAME_WE}.class") - - FILE(RELATIVE_PATH NOTIFY_CLASS_FILE - ${NOTIFY_SOURCE_DIR} - ${NOTIFY_SOURCE_FILE}) - - SET(NOTIFY_CLASS_FILES ${NOTIFY_CLASS_FILES} "${NOTIFY_CLASS_FILE}") - SET(NOTIFY_CLASS_PATHS ${NOTIFY_CLASS_PATHS} "${NOTIFY_CLASS_OUTDIR}/${NOTIFY_CLASS_FILE}") -ENDFOREACH() - -# Locate the android SDK base path -IF((NOT DEFINED ANDROID_HOME) OR ("${ANDROID_HOME}" STREQUAL "")) - IF("$ENV{ANDROID_HOME}" STREQUAL "") - MESSAGE(FATAL_ERROR "ANDROID_HOME is not set, and neither is the environment variable") - ENDIF() - SET(ANDROID_HOME "$ENV{ANDROID_HOME}") -ENDIF() - -MESSAGE(STATUS "ANDROID_HOME detected as '${ANDROID_HOME}'") - -IF(NOT IS_DIRECTORY ${ANDROID_HOME}) - MESSAGE(FATAL_ERROR "ANDROID_HOME does not point to a valid path") -ENDIF() - -# Find the oldest SDK Platform installed >= 16 -FILE(GLOB SDK_PLATFORMS - ${ANDROID_HOME}/platforms/android-1[6-9]/ - ${ANDROID_HOME}/platforms/android-[2-9][0-9]/) -LIST(SORT SDK_PLATFORMS) -LIST(REMOVE_DUPLICATES SDK_PLATFORMS) -LIST(LENGTH SDK_PLATFORMS - SDK_PLATFORMS_LENGTH) - -IF(${SDK_PLATFORMS_LENGTH} EQUAL 0) - MESSAGE(FATAL_ERROR "No SDK platforms found in ${ANDROID_HOME}/platforms/ for Android target levels >= 16") -ENDIF() - -LIST(GET SDK_PLATFORMS - 0 - SDK_PLATFORM) - -MESSAGE(STATUS "Using Android SDK platform '${SDK_PLATFORM}'") - -# Find location of layoutlib.jar -FIND_FILE(ANDROID_LAYOUTLIB_PATH "layoutlib.jar" - PATHS "${SDK_PLATFORM}" - "${SDK_PLATFORM}/*/" - NO_DEFAULT_PATH - NO_CMAKE_FIND_ROOT_PATH - DOC "Path to Android platform SDK layoutlib.jar") - -IF(NOT EXISTS "${ANDROID_LAYOUTLIB_PATH}") - MESSAGE(FATAL_ERROR "Could not find layoutlib.jar in ${SDK_PLATFORM}") -ENDIF() - -MESSAGE(STATUS "Android layoutlib.jar detected as '${ANDROID_LAYOUTLIB_PATH}'") - -# Find the location of DX command which is either on the PATH or in the newest SDK build tools dir -FILE(GLOB SDK_BUILDTOOLS - ${ANDROID_HOME}/build-tools/*/) -LIST(SORT SDK_BUILDTOOLS) -LIST(REMOVE_DUPLICATES SDK_BUILDTOOLS) -LIST(REVERSE SDK_BUILDTOOLS) -LIST(LENGTH SDK_BUILDTOOLS - SDK_BUILDTOOLS_LENGTH) -LIST(GET SDK_BUILDTOOLS - 0 - SDK_BUILDTOOL) - -FIND_FILE(DX_COMMAND - NAMES "dx" - "dx.bat" - PATHS ENV PATH - ${SDK_BUILDTOOL} - NO_DEFAULT_PATH - NO_CMAKE_FIND_ROOT_PATH - DOC "Path to Android build tools 'dx' command") - -IF(NOT EXISTS "${DX_COMMAND}") - MESSAGE(FATAL_ERROR "Could not find 'dx' command") -ENDIF() - -MESSAGE(STATUS "Android 'dx' command detected as '${DX_COMMAND}'") - -# Find the location of the javac command on the PATH -FIND_FILE(JAVAC - NAMES "javac" - "javac.exe" - PATHS ENV PATH - NO_CMAKE_FIND_ROOT_PATH - DOC "Path to 'javac' command") - -IF(NOT EXISTS "${JAVAC}") - MESSAGE(FATAL_ERROR "Could not find 'javac' command") -ENDIF() - -MESSAGE(STATUS "'javac' command detected as '${JAVAC}'") - -# Compile the java -> class file -ADD_CUSTOM_COMMAND(OUTPUT ${NOTIFY_CLASS_PATHS} - COMMAND ${JAVAC} -cp ${ANDROID_LAYOUTLIB_PATH} -source 1.6 -target 1.6 ${NOTIFY_SOURCE_FILES} -d ${NOTIFY_CLASS_OUTDIR} - WORKING_DIRECTORY ${NOTIFY_CLASS_OUTDIR} - DEPENDS ${NOTIFY_SOURCE_FILES} - COMMENT "Compiling Notify.java") - -# Create the dex file from the class file -ADD_CUSTOM_COMMAND(OUTPUT ${NOTIFY_DEX_PATH} - COMMAND ${DX_COMMAND} --dex --output=${NOTIFY_DEX_PATH} ${NOTIFY_CLASS_FILES} - WORKING_DIRECTORY ${NOTIFY_CLASS_OUTDIR} - DEPENDS ${NOTIFY_CLASS_PATHS} - COMMENT "Creating notify.dex") - -# The custom target ensure that everything gets build as part of the 'all' target -ADD_CUSTOM_TARGET(notify-dex ALL - DEPENDS ${NOTIFY_DEX_PATH}) - -# Installation configuration -IF(NOT DEFINED GATOR_INSTALL_PREFIX) - SET(GATOR_INSTALL_PREFIX "share/gator-${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}") -ENDIF() - -SET(NOTIFY_INSTALL_DIR ./${GATOR_INSTALL_PREFIX}/notify/) - -INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/COPYING - ${NOTIFY_DEX_PATH} - ${NOTIFY_SOURCE_FILES} - DESTINATION ${NOTIFY_INSTALL_DIR}) - diff --git a/protocol/annotate/annotate-1.html b/protocol/annotate/annotate-1.html deleted file mode 100644 index 55bf9daa..00000000 --- a/protocol/annotate/annotate-1.html +++ /dev/null @@ -1,856 +0,0 @@ - - - - - - - Annotate v1 (DS-5 v5.20) Protocol - - -
-

Annotate v1 (DS-5 v5.20) Protocol

-

Index

- -

Types

-
-
int32
4-byte signed little endian
-
packed32
variable length packed 4-byte signed value, see Packed Values
-
packed64
variable length packed 8-byte signed value, see Packed Values
-
UTF-8 chars
Some number of UTF-8 characters, not null terminated unless explicitly indicated. Length is usually derived from the message size.
-
#
A constant packed32 value of #, ex: 5 is the packed32 number 5
-
timestamp
packed64 monotonic time value in nanoseconds using the same monotonic clock used by the gator protocol without applying the monotonic delta.
-
color
four unpacked bytes, 0xRR 0xGG 0xBB 0xTT, where TT represents 4 predefined template colors (1-4); TT of 0 cycles between the template colors; TT >= 5 uses the RRGGBB component.
-
-

Packed Values

-

To reduce their size, integers are packed. This is done by avoiding the transmission of duplicate high bits. The value is split into 7 bit bytes in little endian order. The most significant bit of the byte is set to 1, if there is a subsequent byte for this value. On the last byte, the most significant bit is set to 0. For positive values, the most significant encoded bit must be 0 and for negative numbers it must be 1. This is very similar to signed LEB128 used in DWARF.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
BitsLast valueByte 1Byte 2Byte 3Byte 4Byte 5
31-21474836481XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb01111XXXb
27-1342177281XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
20-10485761XXXXXXXb1XXXXXXXb01XXXXXXb
13-81921XXXXXXXb01XXXXXXb
6-6401XXXXXXb
66300XXXXXXb
1381911XXXXXXXb00XXXXXXb
2010485751XXXXXXXb1XXXXXXXb00XXXXXXb
271342177271XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
3121474836471XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb00000XXXb
-

For example, 429389 (01101000110101001101b) would be encoded as 0xCD (11001101b) 0x9A (10011010b) 0x1A (00011010b)

-

Packed 64 values work in much the same way:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
BitsLast valueByte 1Byte 2Byte 3Byte 4Byte 5Byte 6Byte 7Byte 8Byte 9Byte 10
63-92233720368547758081XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb0111111Xb
62-46116860184273879041XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
55-360287970189639681XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
48-2814749767106561XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
41-21990232555521XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
34-171798691841XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
27-1342177281XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
20-10485761XXXXXXXb1XXXXXXXb01XXXXXXb
13-81921XXXXXXXb01XXXXXXb
6-6401XXXXXXb
66300XXXXXXb
1381911XXXXXXXb00XXXXXXb
2010485751XXXXXXXb1XXXXXXXb00XXXXXXb
271342177271XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
34171798691831XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
4121990232555511XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
482814749767106551XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
55360287970189639671XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
6246116860184273879031XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
6392233720368547758071XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb0000000Xb
-

For example, -4758616141418899142 would be encoded as 0xBA 0xB2 0xA5 0xA2 0xCE 0xFA 0xFF 0xFA 0xBD 0x7F.

-

Annotation Messages

-

Magic string to use in the setup message for this protocol is ANNOTATE 1\n

-

-

Id Message

-

This is the first message after the Setup Message to identify the thread sending annotations

- - - - - - - - - - - - - - - - -
NameTypeDescription
tidint32Thread ID. In the Linux kernel, this is the PID.
pidint32Process ID. In the Linux kernel, this is the Thread Group ID
-

UTF-8 String Annotations

-

This is used to add a line in the Log tab.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
Marker Code0x1 
Lengthint32Number of bytes in the body after the length
Timestamptimestamp 
Channelpacked32Channel the annotation belongs to
UTF-8 StringUTF-8 charsText annotation
-

UTF-8 Color String Annotations

-

This is used to add a line in the Log tab.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
Marker Code0x2 
Lengthint32Number of bytes in the body after the length
Timestamptimestamp 
Channelpacked32Channel the annotation belongs to
Colorcolor 
UTF-8 StringUTF-8 charsText annotation
-

Create Channel Annotation

-

This is used to name a channel in the Thread Disclosure

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
Marker Code0x3 
Lengthint32Number of bytes in the body after the length
Timestamptimestamp 
Channelpacked32 
Grouppacked32Group the channel belongs to
UTF-8 StringUTF-8 charsChannel name
-

Create Group Annotation

-

This is used to name a group in the Thread Disclosure

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
Marker Code0x4 
Lengthint32Number of bytes in the body after the length
Timestamptimestamp 
Grouppacked32 
UTF-8 StringUTF-8 charsGroup name
-

Visual Annotation

-

This is used to add a line in the Log tab and an image to the Visual Annotation Chart.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
Marker Code0x5 
Lengthint32Number of bytes in the body after the length
Timestamptimestamp 
UTF-8 StringUTF-8 chars, null terminatedText annotation
Image DataImage bytes 
-

Marker Annotation

-

This is used to add a Bookmark

- - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
Marker Code0x6 
Lengthint32Number of bytes in the body after the length
Timestamptimestamp 
UTF-8 StringUTF-8 charsText annotation
-

Marker Color Annotation

-

This is used to add a Bookmark

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
Marker Code0x7 
Lengthint32Number of bytes in the body after the length
Timestamptimestamp 
Colorcolor 
UTF-8 StringUTF-8 charsText annotation
-

Counter Annotation

-

Create a counter to use with a counter value annotation, see the event node for more details

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
Marker Code0x8 
Lengthint32Number of bytes in the body after the length
keypacked32Key for this counter, unique in the process
per_cpupacked32 - - - -
0= false
1= true
-
classpacked32 - - - - -
1= delta
2= absolute
3= activity
-
displaypacked32 - - - - - - -
1= average
2= accumulate
3= hertz
4= maximum
5= minimum
-
modifierpacked32 
series_compositionpacked32 - - - -
1= stacked
2= overlay
-
rendering_typepacked32 - - - - -
1= line
2= fill
3= bar
-
average_selectionpacked32 - - - -
0= false
1= true
-
average_corespacked32 - - - -
0= false
1= true
-
percentagepacked32 - - - -
0= false
1= true
-
activity_countpacked32Number of activities and activity_colors
corespacked32 
Colorcolor 
activitiesactivity_count occurances of UTF-8 chars, null terminated and 4 bytes (RR, GG, BB, TT) pairs 
titleUTF-8 chars, null terminated 
nameUTF-8 chars, null terminated 
unitsUTF-8 chars, null terminated 
descriptionUTF-8 chars 
-

Counter Value Annotation

-

Emit a counter value similar to Counter Frame from the gator protocol

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
Marker Code0x9 
Lengthint32Number of bytes in the body after the length
Timestamptimestamp 
Corepacked32Core to which this counter applies
Keypacked32Key used when the counter was created
Valuepacked64Value of the specified counter
-
- - - diff --git a/protocol/annotate/annotate-2.html b/protocol/annotate/annotate-2.html deleted file mode 100644 index 82e6ff5c..00000000 --- a/protocol/annotate/annotate-2.html +++ /dev/null @@ -1,1080 +0,0 @@ - - - - - - - Annotate v2 (DS-5 v5.21) Protocol - - -
-

Annotate v2 (DS-5 v5.21) Protocol

-

Index

- -

Introduction

-

This document describes the TCP/IP protocol used by clients to communicate with gator v21 or later. This protocol is encapsulated in the gator frames sent to Streamline. Like the gator-Streamline protocol, the source code acts as a reference implementation. The protocol may change with future releases of Streamline, but Streamline and gator will maintain backwards compatibility with this version of the protocol so that clients need only implement one version of the protocol.

-

Changes in v2 (DS-5 v5.21)

-

Annotate v2, the version shipped with Streamline version 5.21, has a few important updates that you should familiarize yourself with before implementing or updating your own customized Annotate protocol

-
    -
  • Added Custom Activity Map messages
  • -
  • Added a new counter class type 'incident', which is the same as the 'delta' class except it does not do interpolation of the data, in other words, the time is known when the data occurs
  • -
-

Types

-
-
int32
4-byte signed little endian
-
packed32
variable length packed 4-byte signed value, see Packed Values
-
packed64
variable length packed 8-byte signed value, see Packed Values
-
UTF-8 chars
Some number of UTF-8 characters, not null terminated unless explicitly indicated. Length is usually derived from the message size.
-
#
A constant packed32 value of #, ex: 5 is the packed32 number 5
-
timestamp
packed64 monotonic time value in nanoseconds using the same monotonic clock used by the gator protocol without applying the monotonic delta.
-
color
four unpacked bytes, 0xRR 0xGG 0xBB 0xTT, where TT represents 4 predefined template colors (1-4); TT of 0 cycles between the template colors; TT >= 5 uses the RRGGBB component.
-
-

Packed Values

-

To reduce their size, integers are packed. This is done by avoiding the transmission of duplicate high bits. The value is split into 7 bit bytes in little endian order. The most significant bit of the byte is set to 1, if there is a subsequent byte for this value. On the last byte, the most significant bit is set to 0. For positive values, the most significant encoded bit must be 0 and for negative numbers it must be 1. This is very similar to signed LEB128 used in DWARF.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
BitsLast valueByte 1Byte 2Byte 3Byte 4Byte 5
31-21474836481XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb01111XXXb
27-1342177281XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
20-10485761XXXXXXXb1XXXXXXXb01XXXXXXb
13-81921XXXXXXXb01XXXXXXb
6-6401XXXXXXb
66300XXXXXXb
1381911XXXXXXXb00XXXXXXb
2010485751XXXXXXXb1XXXXXXXb00XXXXXXb
271342177271XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
3121474836471XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb00000XXXb
-

For example, 429389 (01101000110101001101b) would be encoded as 0xCD (11001101b) 0x9A (10011010b) 0x1A (00011010b)

-

Packed 64 values work in much the same way:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
BitsLast valueByte 1Byte 2Byte 3Byte 4Byte 5Byte 6Byte 7Byte 8Byte 9Byte 10
63-92233720368547758081XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb0111111Xb
62-46116860184273879041XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
55-360287970189639681XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
48-2814749767106561XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
41-21990232555521XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
34-171798691841XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
27-1342177281XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
20-10485761XXXXXXXb1XXXXXXXb01XXXXXXb
13-81921XXXXXXXb01XXXXXXb
6-6401XXXXXXb
66300XXXXXXb
1381911XXXXXXXb00XXXXXXb
2010485751XXXXXXXb1XXXXXXXb00XXXXXXb
271342177271XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
34171798691831XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
4121990232555511XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
482814749767106551XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
55360287970189639671XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
6246116860184273879031XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
6392233720368547758071XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb0000000Xb
-

For example, -4758616141418899142 would be encoded as 0xBA 0xB2 0xA5 0xA2 0xCE 0xFA 0xFF 0xFA 0xBD 0x7F.

-

Setup Message

-

This message is the first message sent by any source and is never sent again; it is used to initialize the source.

- - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
MagicStringValue must always be ANNOTATE 2\n
tidint32Thread ID. In the Linux kernel, this is the PID.
pidint32Process ID. In the Linux kernel, this is the Thread Group ID
-

String Messages

-

UTF-8 String Message

-

This is used to add a line in the Log tab.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
Marker Code0x1 
Lengthint32Number of bytes in the body after the length
Timestamptimestamp 
Channelpacked32Channel the annotation belongs to
UTF-8 StringUTF-8 charsText annotation
-

UTF-8 Color String Message

-

This is used to add a line in the Log tab.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
Marker Code0x2 
Lengthint32Number of bytes in the body after the length
Timestamptimestamp 
Channelpacked32Channel the annotation belongs to
Colorcolor 
UTF-8 StringUTF-8 charsText annotation
-

Create Channel Message

-

This is used to name a channel in the Thread Disclosure

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
Marker Code0x3 
Lengthint32Number of bytes in the body after the length
Timestamptimestamp 
Channelpacked32 
Grouppacked32Group the channel belongs to
UTF-8 StringUTF-8 charsChannel name
-

Create Group Message

-

This is used to name a group in the Thread Disclosure

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
Marker Code0x4 
Lengthint32Number of bytes in the body after the length
Timestamptimestamp 
Grouppacked32 
UTF-8 StringUTF-8 charsGroup name
-

Visual Messages

-

Visual Message

-

This is used to add a line in the Log tab and an image to the Visual Annotation Chart.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
Marker Code0x5 
Lengthint32Number of bytes in the body after the length
Timestamptimestamp 
UTF-8 StringUTF-8 chars, null terminatedText annotation
Image DataImage bytes 
-

Marker Messages

-

Marker Message

-

This is used to add a Bookmark

- - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
Marker Code0x6 
Lengthint32Number of bytes in the body after the length
Timestamptimestamp 
UTF-8 StringUTF-8 charsText annotation
-

Marker Color Message

-

This is used to add a Bookmark

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
Marker Code0x7 
Lengthint32Number of bytes in the body after the length
Timestamptimestamp 
Colorcolor 
UTF-8 StringUTF-8 charsText annotation
-

Counter Messages

-

Counter Message

-

Create a counter to use with a counter value or activity switch annotation, see the event node for more details

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
Marker Code0x8 
Lengthint32Number of bytes in the body after the length
keypacked32Key for this counter, unique in the process
per_cpupacked32 - - - -
0= false
1= true
-
classpacked32 - - - - - -
1= delta
2= absolute
3= activity
4= incident
-
displaypacked32 - - - - - - -
1= average
2= accumulate
3= hertz
4= maximum
5= minimum
-
modifierpacked32 
series_compositionpacked32 - - - -
1= stacked
2= overlay
-
rendering_typepacked32 - - - - -
1= line
2= fill
3= bar
-
average_selectionpacked32 - - - -
0= false
1= true
-
average_corespacked32 - - - -
0= false
1= true
-
percentagepacked32 - - - -
0= false
1= true
-
activity_countpacked32Number of activities and activity_colors
corespacked32 
Colorcolor 
activitiesactivity_count occurances of UTF-8 chars, null terminated and 4 bytes (RR, GG, BB, TT) pairs 
titleUTF-8 chars, null terminated 
nameUTF-8 chars, null terminated 
unitsUTF-8 chars, null terminated 
descriptionUTF-8 chars 
-

Counter Value Message

-

Emit a counter value similar to Counter Frame from the gator protocol

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
Marker Code0x9 
Lengthint32Number of bytes in the body after the length
Timestamptimestamp 
Corepacked32Core to which this counter applies
Keypacked32Key used when the counter was created
Valuepacked64Value of the specified counter
-

Activity Switch Message

-

Emit a sched switch similar to Activity Switch from the gator protocol

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
Marker Code0xa 
Lengthint32Number of bytes in the body after the length
Timestamptimestamp 
Corepacked32Core on which this activity occurred
Keypacked32Key used when the counter was created
Activitypacked32One of the activity types defined when the counter was created or zero for idle
tidpacked32CPU thread ID (in the Linux kernel this is the PID) associated with this activity, use -1 if no tid association is desired
-

Custom Activity Map Messages

-

Custom Activity Map Track

-

This is used to define a track on which jobs execute.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
Marker Code0xb 
Lengthint32Number of bytes in the body after the length
ViewUIDpacked32The unique id for the view, it is recommended to pick a random number to obtain the view uid
TrackUIDpacked32A unique track id, zero is reserved for no track. The initial order of the tracks is determined by the TrackUID.
ParentTrackpacked32The TrackUID of the parent track or -1 if it is a root track with no parent
NameUTF-8 charsThe name of the track
-

Custom Activity Map Job

-

This is used to define a job within the Custom Activity Map timeline.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
Marker Code0xc 
Lengthint32Number of bytes in the body after the length
ViewUIDpacked32The unique id for the view, it is recommended to pick a random number to obtain the view uid
JobUIDpacked32A unique job id
Trackpacked32The TrackUID on which this job executes
StartTimeTimestampThe start time of the job
DurationTimestampThe duration of the job
Colorcolor 
Primary Dependencypacked32The JobUID of the primary dependency. A value of -1 indicates no primary dependency.
Number of Dependenciespacked32The number N of dependencies to follow
Dependency (repeated N times)packed32The JobUID of the dependency. A dependency is a job that must complete prior to this job running. Only direct dependencies need to be tracked.
NameUTF-8 charsThe string name for the job
-

Custom Activity Map View Name

-

The name for this Custom Activity Map view.

- - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
Marker Code0xd 
Lengthint32Number of bytes in the body after the length
ViewUIDpacked32The unique id for the view, it is recommended to pick a random number to obtain the view uid
View NameUTF-8 charsThe name for the view that is being described, this will be the view’s title in the UI and folder on disk. As such, the name must be a valid file system folder name.
-
- - diff --git a/protocol/annotate/annotate-3.html b/protocol/annotate/annotate-3.html deleted file mode 100644 index 086185b7..00000000 --- a/protocol/annotate/annotate-3.html +++ /dev/null @@ -1,1086 +0,0 @@ - - - - - - - Annotate v3 (DS-5 v5.22) Protocol - - -
-

Annotate v3 (DS-5 v5.22) Protocol

-

Index

- -

Introduction

-

This document describes the TCP/IP protocol used by clients to communicate with gator v22 or later. This protocol is encapsulated in the gator frames sent to Streamline. Like the gator-Streamline protocol, the source code acts as a reference implementation. The protocol may change with future releases of Streamline, but Streamline and gator will maintain backwards compatibility with this version of the protocol so that clients need only implement one version of the protocol.

-

Changes in v3 (DS-5 v5.22)

-

Annotate v3, the version shipped with Streamline version 5.22, has a few important updates that you should familiarize yourself with before implementing or updating your own customized Annotate protocol

-
    -
  • Documentation fixes with respect to rendering_type and series_composition along with support for the log10 series composition
  • -
  • Added a flag to the Setup Message to indicate that counter keys should not be mangled by Streamline to be unique.
  • -
-

Types

-
-
int32
4-byte signed little endian
-
packed32
variable length packed 4-byte signed value, see Packed Values
-
packed64
variable length packed 8-byte signed value, see Packed Values
-
UTF-8 chars
Some number of UTF-8 characters, not null terminated unless explicitly indicated. Length is usually derived from the message size.
-
#
A constant packed32 value of #, ex: 5 is the packed32 number 5
-
timestamp
packed64 monotonic time value in nanoseconds using the same monotonic clock used by the gator protocol without applying the monotonic delta.
-
color
four unpacked bytes, 0xRR 0xGG 0xBB 0xTT, where TT represents 4 predefined template colors (1-4); TT of 0 cycles between the template colors; TT >= 5 uses the RRGGBB component.
-
-

Packed Values

-

To reduce their size, integers are packed. This is done by avoiding the transmission of duplicate high bits. The value is split into 7 bit bytes in little endian order. The most significant bit of the byte is set to 1, if there is a subsequent byte for this value. On the last byte, the most significant bit is set to 0. For positive values, the most significant encoded bit must be 0 and for negative numbers it must be 1. This is very similar to signed LEB128 used in DWARF.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
BitsLast valueByte 1Byte 2Byte 3Byte 4Byte 5
31-21474836481XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb01111XXXb
27-1342177281XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
20-10485761XXXXXXXb1XXXXXXXb01XXXXXXb
13-81921XXXXXXXb01XXXXXXb
6-6401XXXXXXb
66300XXXXXXb
1381911XXXXXXXb00XXXXXXb
2010485751XXXXXXXb1XXXXXXXb00XXXXXXb
271342177271XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
3121474836471XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb00000XXXb
-

For example, 429389 (01101000110101001101b) would be encoded as 0xCD (11001101b) 0x9A (10011010b) 0x1A (00011010b)

-

Packed 64 values work in much the same way:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
BitsLast valueByte 1Byte 2Byte 3Byte 4Byte 5Byte 6Byte 7Byte 8Byte 9Byte 10
63-92233720368547758081XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb0111111Xb
62-46116860184273879041XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
55-360287970189639681XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
48-2814749767106561XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
41-21990232555521XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
34-171798691841XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
27-1342177281XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
20-10485761XXXXXXXb1XXXXXXXb01XXXXXXb
13-81921XXXXXXXb01XXXXXXb
6-6401XXXXXXb
66300XXXXXXb
1381911XXXXXXXb00XXXXXXb
2010485751XXXXXXXb1XXXXXXXb00XXXXXXb
271342177271XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
34171798691831XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
4121990232555511XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
482814749767106551XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
55360287970189639671XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
6246116860184273879031XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
6392233720368547758071XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb0000000Xb
-

For example, -4758616141418899142 would be encoded as 0xBA 0xB2 0xA5 0xA2 0xCE 0xFA 0xFF 0xFA 0xBD 0x7F.

-

Setup Message

-

This message is the first message sent by any source and is never sent again; it is used to initialize the source.

- - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
MagicStringValue must always be ANNOTATE 3\n
tidint32Thread ID. In the Linux kernel, this is the PID.
pidint32Process ID. In the Linux kernel, this is the Thread Group ID
Don't mangle keysint8Streamline add per-process information to keys received by annotation clients to ensure they are globally unique. If this value nonzero, then no mangling is done.
-

String Messages

-

UTF-8 String Message

-

This is used to add a line in the Log tab.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
Marker Code0x1 
Lengthint32Number of bytes in the body after the length
Timestamptimestamp 
Channelpacked32Channel the annotation belongs to
UTF-8 StringUTF-8 charsText annotation
-

UTF-8 Color String Message

-

This is used to add a line in the Log tab.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
Marker Code0x2 
Lengthint32Number of bytes in the body after the length
Timestamptimestamp 
Channelpacked32Channel the annotation belongs to
Colorcolor 
UTF-8 StringUTF-8 charsText annotation
-

Create Channel Message

-

This is used to name a channel in the Thread Disclosure

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
Marker Code0x3 
Lengthint32Number of bytes in the body after the length
Timestamptimestamp 
Channelpacked32 
Grouppacked32Group the channel belongs to
UTF-8 StringUTF-8 charsChannel name
-

Create Group Message

-

This is used to name a group in the Thread Disclosure

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
Marker Code0x4 
Lengthint32Number of bytes in the body after the length
Timestamptimestamp 
Grouppacked32 
UTF-8 StringUTF-8 charsGroup name
-

Visual Messages

-

Visual Message

-

This is used to add a line in the Log tab and an image to the Visual Annotation Chart.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
Marker Code0x5 
Lengthint32Number of bytes in the body after the length
Timestamptimestamp 
UTF-8 StringUTF-8 chars, null terminatedText annotation
Image DataImage bytes 
-

Marker Messages

-

Marker Message

-

This is used to add a Bookmark

- - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
Marker Code0x6 
Lengthint32Number of bytes in the body after the length
Timestamptimestamp 
UTF-8 StringUTF-8 charsText annotation
-

Marker Color Message

-

This is used to add a Bookmark

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
Marker Code0x7 
Lengthint32Number of bytes in the body after the length
Timestamptimestamp 
Colorcolor 
UTF-8 StringUTF-8 charsText annotation
-

Counter Messages

-

Counter Message

-

Create a counter to use with a counter value or activity switch annotation, see the event node for more details

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
Marker Code0x8 
Lengthint32Number of bytes in the body after the length
keypacked32Key for this counter, unique in the process
per_cpupacked32 - - - -
0= false
1= true
-
classpacked32 - - - - - -
1= delta
2= absolute
3= activity
4= incident
-
displaypacked32 - - - - - - -
1= average
2= accumulate
3= hertz
4= maximum
5= minimum
-
modifierpacked32 
series_compositionpacked32 - - - - -
1= stacked
2= overlay
3= log10
-
rendering_typepacked32 - - - - -
1= filled
2= line
3= bar
-
average_selectionpacked32 - - - -
0= false
1= true
-
average_corespacked32 - - - -
0= false
1= true
-
percentagepacked32 - - - -
0= false
1= true
-
activity_countpacked32Number of activities and activity_colors
corespacked32 
Colorcolor 
activitiesactivity_count occurances of UTF-8 chars, null terminated and 4 bytes (RR, GG, BB, TT) pairs 
titleUTF-8 chars, null terminated 
nameUTF-8 chars, null terminated 
unitsUTF-8 chars, null terminated 
descriptionUTF-8 chars 
-

Counter Value Message

-

Emit a counter value similar to Counter Frame from the gator protocol

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
Marker Code0x9 
Lengthint32Number of bytes in the body after the length
Timestamptimestamp 
Corepacked32Core to which this counter applies
Keypacked32Key used when the counter was created
Valuepacked64Value of the specified counter
-

Activity Switch Message

-

Emit a sched switch similar to Activity Switch from the gator protocol

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
Marker Code0xa 
Lengthint32Number of bytes in the body after the length
Timestamptimestamp 
Corepacked32Core on which this activity occurred
Keypacked32Key used when the counter was created
Activitypacked32One of the activity types defined when the counter was created or zero for idle
tidpacked32CPU thread ID (in the Linux kernel this is the PID) associated with this activity, use -1 if no tid association is desired
-

Custom Activity Map Messages

-

Custom Activity Map Track

-

This is used to define a track on which jobs execute.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
Marker Code0xb 
Lengthint32Number of bytes in the body after the length
ViewUIDpacked32The unique id for the view, it is recommended to pick a random number to obtain the view uid
TrackUIDpacked32A unique track id, zero is reserved for no track. The initial order of the tracks is determined by the TrackUID.
ParentTrackpacked32The TrackUID of the parent track or -1 if it is a root track with no parent
NameUTF-8 charsThe name of the track
-

Custom Activity Map Job

-

This is used to define a job within the Custom Activity Map timeline.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
Marker Code0xc 
Lengthint32Number of bytes in the body after the length
ViewUIDpacked32The unique id for the view, it is recommended to pick a random number to obtain the view uid
JobUIDpacked32A unique job id
Trackpacked32The TrackUID on which this job executes
StartTimeTimestampThe start time of the job
DurationTimestampThe duration of the job
Colorcolor 
Primary Dependencypacked32The JobUID of the primary dependency. A value of -1 indicates no primary dependency.
Number of Dependenciespacked32The number N of dependencies to follow
Dependency (repeated N times)packed32The JobUID of the dependency. A dependency is a job that must complete prior to this job running. Only direct dependencies need to be tracked.
NameUTF-8 charsThe string name for the job
-

Custom Activity Map View Name

-

The name for this Custom Activity Map view.

- - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
Marker Code0xd 
Lengthint32Number of bytes in the body after the length
ViewUIDpacked32The unique id for the view, it is recommended to pick a random number to obtain the view uid
View NameUTF-8 charsThe name for the view that is being described, this will be the view’s title in the UI and folder on disk. As such, the name must be a valid file system folder name.
-
- - diff --git a/protocol/gator/capture-14.png b/protocol/gator/capture-14.png deleted file mode 100644 index 753966514ef969c393a6ce5084862b632fafe69c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11680 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 UEC@S;6(j@Xq?9Eq#6Jc7KcVN`q5uE@ diff --git a/protocol/gator/capture_ping.png b/protocol/gator/capture_ping.png deleted file mode 100644 index 06b16704c3d30dcacfac6133185094abc38b75c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5029 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

)Ci4-Rx6`L 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 diff --git a/protocol/gator/config_cancel.png b/protocol/gator/config_cancel.png deleted file mode 100644 index c77bf7972445b26372952f2a2cdbf6683a92efe0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5338 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 a5g0MC2(4~su()p!0F)Kf<*PuigZ~eD6r{cY diff --git a/protocol/gator/gator_protocol-5-12.html b/protocol/gator/gator_protocol-5-12.html deleted file mode 100644 index ecddf187..00000000 --- a/protocol/gator/gator_protocol-5-12.html +++ /dev/null @@ -1,1509 +0,0 @@ - - - - - - - - -

-

Gator v11 (DS-5v5.12) Protocol

-

Introduction

-

The purpose of this document is to describe the TCP/IP protocol used by gator or other implementing clients to communicate with Streamline version 5.12 or later. The gator source code, distributed as part of DS-5, is the reference implementation of this protocol. The protocol may change with future releases of Streamline, but Streamline will maintain backwards compatibility with this version of the protocol so that clients need only implement one version of the protocol. The client is expected to be able to parse and generate simple XML as well as be able to ignore additional or unexpected nodes or attributes. Only the XML features described will be used, so the more complex features of XML, such as XML namespaces, are not required.

-

Target-Host Protocol

-

Magic Exchange

-

A handshake so server and client recognize each other

-
    -
  1. The client reads ASCII newline (\n) delimited strings until STREAMLINE\n is read. Anything else is discarded.
  2. -
  3. Send GATOR 11\n
  4. -
-

Further communication from Streamline come as Commands

-

Command Header

-

Commands from Streamline consist of a header followed by a body. Streamline then expects a Response

- - - - - - - - - - - - - - - - -
NameTypeDescription
CodebyteThe type of command - - - - - - - -
0= Request XML
1= Deliver XML
2= APC Start
3= APC Stop
4= Disconnect
5= Ping
-
LengthLittle Endian int32Number of bytes in the body
-

If the client receives an unrecognized command, it should respond with a NAK.

-

Request XML Body

-

Represents a request from Streamline formatted as XML with the root node request and an attribute representing the type of request. For example, this is a request for Events XML

-

- <?xml version="1.0" encoding="US-ASCII" ?>
- <request type="events">
- </request> -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
RequestResponse CodeResponse Body
<request type="events">XMLEvents XML
<request type="configuration">XMLConfiguration XML
<request type="counters">XMLCounters XML
<request type="session">XMLSession XML. Must return exactly what was delivered by Streamline. If not received when requested, send a NAK. Streamline requests Session XML prior to requesting Captured XML
<request type="captured">XMLCaptured XML Streamline requests Captured XML prior to starting a capture.
<request type="defaults">XMLdefault Configuration XML
-

Deliver XML Body

-

- - - - - - - - - - - - - -
RequestResponse Code
Session XMLACK
Configuration XMLACK
-

APC Start Body

-

No Command Body. This indicates that capture should begin and Streamline now expects to receive APC Data Responses. No ACK is expected and no further XML exchange takes place. If a failure occurs, the client should send an Error.

-

APC Stop Body

-

No Command Body. Capture should now end and no ACK is expected, but APC Data Responses can continue to arrive until all captured data is sent, then the connection should be closed. If a failure occurs, the client should send an Error.

-

Disconnect Body

-

No Command Body. No ACK is expected, close the connection

-

Ping Body

-

No Command Body. Send an ACK Response

-

Response Format

-

Responses consist of a header followed by a body

-

Response Header

-

Identical to the Command Header but the Codes are different

- - - - - - - - - - - - - - - - -
NameTypeDescription
CodebyteThe type of command - - - - - - -
1= XML
3= APC Data
4= ACK
5= NAK
0xFF= Error
-
LengthLittle Endian int32Number of bytes in the body
-

XML Body

-

XML, format is dependent on the Request see Request XML Body

-

APC Data Body

-

An APC Frame. If the length is zero, it is the End of Sequence message which indicates that all APC Frames have been transmitted to Streamline.

-

ACK Body

-

No Response Body. Indicates the Command was successful

-

NAK Body

-

Indicates a synchronous non-fatal error occurred when handling a request. Can contain a UTF-8 error message. The length is specified in the header, so no NULL character is expected. Indicates the Command failed. The connection can continue.

-

Error Body

-

Indicates a synchronous fatal error occurred when responding to a request. A UTF-8 error message. The length is specified in the header, so no NULL character is expected. The error is terminal and the connection must be closed. Errors may be sent asynchronously, ie without a request, but Streamline may not process them immediately.

-

XML

-

Events

-

Listing of all possible counters

-

events

-

The events root node of Events XML can have any number of counter_set and category child nodes

-

counter_set

-

The counter_set node has no children and the following attributes. Counter sets are used when the number of counters that can be enabled in a category is restricted. Streamline will respect the restriction and assign a name from the set to a counter in Configuration XML.

- - - - - - - - - - - - - - - - -
NameTypeDescription
nameStringName of the counter_set
countStringNumber of counters in the set. Counter names are derived by appending a number, starting at zero, to the set name. Ex, if the set name is ARM_Cortex-A8_cnt and the count is 4, then the counter names in the set are ARM_Cortex-A8_cnt0, ARM_Cortex-A8_cnt1, ARM_Cortex-A8_cnt2 and ARM_Cortex-A8_cnt3
-

category

-

The category node can have any number of event child nodes and the following attributes

- - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
nameStringName of the category show in Streamline
counter_setStringRequired if sub event uses the event attribute, name of the related counter_set
per_cpuBooleanDefaults to false, see the per_cpu attribute of the event node
supports_event_based_samplingBooleanDefaults to false, see the supports_event_based_sampling attribute of the event node
-

event

-

The event node has no children and the following attributes

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
counterStringRequired if event is not present, name of the counter
eventHex IntegerRequired if counter is not present, hardware counter number
titleStringTitle of the event, shown in Streamline before the name. Used to group counters.
nameStringName of the event, shown in Streamline after the title
per_cpuBooleanIs true if this event is per cpu as opposed to global. Defaults to the per_cpu attribute of the category node
supports_event_based_samplingBooleanIs true if this event supports event base sampling. Defaults to the supports_event_based_sampling attribute of the category node
displayStringOptional, one of average, maximum, minimum, hertz, accumulate (Default). This is the same as adding .avg, .max, .min or .hz (accumulate is the default) to the counter name in the chart configuration panel in Streamline.
unitsStringOptional, units to display in Streamline
average_selectionBooleanOptional, Averages the values displayed by the Cross Section Marker in Streamline
descriptionStringDescription to show in Streamline. Used as the tooltip for the counter
-

Example:

-

- <?xml version="1.0" encoding="UTF-8"?>
- <events>
-   <counter_set name="ARM_Cortex-A8_cnt" count="4"/>
-   <category name="Cortex-A8" counter_set="ARM_Cortex-A8_cnt" per_cpu="yes" supports_event_based_sampling="yes">
-     <event counter="ARM_Cortex-A8_ccnt" title="Clock" name="Cycles" display="hertz" units="Hz" average_selection="yes" description="The number of core clock cycles"/>
-     <event event="0x00" title="Software" name="Increment" description="Incremented only on writes to the Software Increment Register"/>
-     <event event="0x01" title="Cache" name="Instruction refill" description="Instruction fetch that causes a refill of at least the level of instruction or unified cache closest to the processor"/>
-     <!-- ... -->
-   </category>
-   <counter_set name="ARM_Cortex-A9_cnt" count="6"/>
-   <category name="Cortex-A9" counter_set="ARM_Cortex-A9_cnt" per_cpu="yes" supports_event_based_sampling="yes">
-     <event counter="ARM_Cortex-A9_ccnt" title="Clock" name="Cycles" display="hertz" units="Hz" average_selection="yes" description="The number of core clock cycles"/>
-     <event event="0x00" title="Software" name="Increment" description="Incremented only on writes to the Software Increment Register"/>
-     <event event="0x01" title="Cache" name="Instruction refill" description="Instruction fetch that causes a refill of at least the level of instruction or unified cache closest to the processor"/>
-     <!-- ... -->
-   </category>
-   <category name="Linux">
-     <event counter="Linux_cpuload_user" title="CPU Load" name="User" per_cpu="yes" description="Scheduler CPU Load of User Application"/>
-     <event counter="Linux_cpuload_system" title="CPU Load" name="System" per_cpu="yes" description="Scheduler CPU Load of System Behavior"/>
-     <event counter="Linux_irq_softirq" title="Interrupts" name="SoftIRQ" per_cpu="yes" description="Linux SoftIRQ taken"/>
-     <!-- ... -->
-   </category>
- </events> -

-

Configuration

-

List of counters that are currently enabled. Can include counters not available on the target which will be ignored

-

configurations

-

The configurations root node of Configuration XML can have any number of configuration child nodes and has the following attribute

- - - - - - - - - - - -
NameTypeDescription
revisionInteger1
-

configuration

-

The configuration node has no children and has the following attributes

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
counterStringSee the counter attribute of the event node. Required, unique. If Events XML did not have a counter for this event, a counter from the related counter_set can be taken, see the description of counter_set in Events XML
eventHex IntegerSee the event attribute of the event node, set if it was set in Events XML
titleStringSee the title attribute of the event node
nameStringSee the name attribute of the event node
per_cpuBooleanSee the per_cpu attribute of the event node
supports_event_based_samplingBooleanSee the supports_event_based_sampling attribute of the event node
countIntegerOptional. How many samples to collect before the event is triggered
displayStringSee the display attribute of the event node
unitsStringSee the units attribute of the event node
average_selectionBooleanSee the average_selection attribute of the event node
descriptionStringSee the description attribute of the event node
-

Example:

-

- <?xml version="1.0" encoding='UTF-8'?>
- <configurations revision="1">
-   <configuration counter="ARM_Cortex-A8_ccnt" title="Clock" name="Cycles" per_cpu="yes" supports_event_based_sampling="yes" display="hertz" units="Hz" average_selection="yes" description="The number of core clock cycles"/>
-   <configuration counter="ARM_Cortex-A8_cnt0" event="0x8" title="Instruction" name="Executed" per_cpu="yes" supports_event_based_sampling="yes" description="Instruction architecturally executed"/>
-   <configuration counter="ARM_Cortex-A8_cnt1" event="0x44" title="Cache" name="L2 miss" per_cpu="yes" supports_event_based_sampling="yes" description="Any cacheable miss in the L2 cache"/>
-   <configuration counter="ARM_Cortex-A8_cnt2" event="0x43" title="Cache" name="L1 miss" per_cpu="yes" supports_event_based_sampling="yes" description="Any accesses to the L2 cache"/>
-   <configuration counter="ARM_Cortex-A8_cnt3" event="0x10" title="Branch" name="Mispredicted" per_cpu="yes" supports_event_based_sampling="yes" description="Branch mispredicted or not predicted"/>
-   <configuration counter="ARM_Cortex-A9_ccnt" title="Clock" name="Cycles" per_cpu="yes" supports_event_based_sampling="yes" display="hertz" units="Hz" average_selection="yes" description="The number of core clock cycles"/>
-   <configuration counter="ARM_Cortex-A9_cnt0" event="0x68" title="Instruction" name="Executed" per_cpu="yes" supports_event_based_sampling="yes" description="Counts the number of instructions going through the Register Renaming stage. This number is an approximate number of the total number of instructions speculatively executed, and even more approximate of the total number of instructions architecturally executed"/>
-   <configuration counter="ARM_Cortex-A9_cnt1" event="0x06" title="Instruction" name="Memory read" per_cpu="yes" supports_event_based_sampling="yes" description="Memory-reading instruction architecturally executed"/>
-   <configuration counter="ARM_Cortex-A9_cnt2" event="0x07" title="Instruction" name="Memory write" per_cpu="yes" supports_event_based_sampling="yes" description="Memory-writing instruction architecturally executed"/>
-   <configuration counter="ARM_Cortex-A9_cnt3" event="0x03" title="Cache" name="Data refill" per_cpu="yes" supports_event_based_sampling="yes" description="Memory Read or Write operation that causes a refill of at least the level of data or unified cache closest to the processor"/>
-   <configuration counter="ARM_Cortex-A9_cnt4" event="0x04" title="Cache" name="Data access" per_cpu="yes" supports_event_based_sampling="yes" description="Memory Read or Write operation that causes a cache access to at least the level of data or unified cache closest to the processor"/>
-   <configuration counter="Linux_block_rq_wr" title="Disk IO" name="Write" units="B" description="Disk IO Bytes Written"/>
-   <configuration counter="Linux_block_rq_rd" title="Disk IO" name="Read" units="B" description="Disk IO Bytes Read"/>
-   <configuration counter="Linux_net_rx" title="Network" name="Receive" units="B" description="Receive network traffic, including effect from Streamline"/>
-   <configuration counter="Linux_net_tx" title="Network" name="Transmit" units="B" description="Transmit network traffic, including effect from Streamline"/>
-   <configuration counter="Linux_cpuload_system" title="CPU Load" name="System" description="Scheduler CPU Load of System Behavior"/>
-   <configuration counter="Linux_cpuload_user" title="CPU Load" name="User" description="Scheduler CPU Load of User Application"/>
-   <configuration counter="Linux_meminfo_memused" title="Memory" name="Used" display="maximum" units="B" average_selection="yes" description="Total used memory size"/>
-   <configuration counter="Linux_meminfo_memfree" title="Memory" name="Free" display="minimum" units="B" average_selection="yes" description="Available memory size"/>
-   <configuration counter="Linux_power_cpu_freq" title="Clock" name="Frequency" per_cpu="yes" display="maximum" units="Hz" average_selection="yes" description="Frequency setting of the CPU"/>
- </configurations> -

-

Counters

-

Listing of counters available on the target

-

counters

-

The counters root node of Counters XML can have any number of counter child nodes

-

counter

-

The counter node has the following attribute

- - - - - - - - - - - -
NameTypeDescription
nameStringAvailable counter name from the counter_set node or the counter attribute of the event node
-

Example

-

- <?xml version="1.0" encoding="utf-8"?>
- <counters>
-   <counter name="Linux_power_cpu_idle" />
-   <counter name="Linux_power_cpu_freq" />
-   <counter name="Linux_sched_switch" />
-   <counter name="ARM_Cortex-A8_cnt3" />
-   <counter name="ARM_Cortex-A8_cnt2" />
-   <counter name="ARM_Cortex-A8_cnt1" />
-   <counter name="ARM_Cortex-A8_cnt0" />
-   <counter name="ARM_Cortex-A8_ccnt" />
-   <counter name="Linux_net_tx" />
-   <counter name="Linux_net_rx" />
-   <counter name="mmaped_cnt2" />
-   <counter name="mmaped_cnt1" />
-   <counter name="mmaped_cnt0" />
-   <counter name="Linux_meminfo_bufferram" />
-   <counter name="Linux_meminfo_memused" />
-   <counter name="Linux_meminfo_memfree" />
-   <counter name="Linux_irq_softirq" />
-   <counter name="Linux_irq_irq" />
-   <counter name="Linux_block_rq_rd" />
-   <counter name="Linux_block_rq_wr" />
- </counters> -

-

Session

-

XML representing generated by Streamline representing the Capture & Analysis Options dialog. Must be sent by Streamline before it's requested by Streamline. Send back the received XML.

-

session

-

The session root node of Session XML can have any number of image child nodes and has the following attributes

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
versionInteger1
call_stack_unwindingBooleanIf Call Stack Unwinding is selected
parse_debug_infoBooleanIf Process Debug Information is selected
high_resolutionBooleanIf High Resolution Timeline is selected
buffer_modeStringOne of streaming, small, normal or large
sample_rateStringOne of normal, low, none
durationIntegerDuration of the capture in seconds
target_hostStringTarget address
target_portIntegerTarget port
energy_cmd_lineStringOptional, Energy Capture command line
-

image

-

The image node has no child nodes and the following attributes

- - - - - - - - - - - - - - - - -
NameTypeDescription
pathStringProgram Image. Used during local capture where images may be copied into the .apc folder. Can be updated in Streamline post-capture.
enabledBooleanDefaults to false, is the Program Image is enabled
-

Example:

-

- <?xml version="1.0" encoding="US-ASCII" ?>
- <session version="1" call_stack_unwinding="yes" parse_debug_info="yes" high_resolution="no" buffer_mode="streaming" sample_rate="low" duration="0" target_host="10.99.3.109" target_port="8080" energy_cmd_line="&quot;C:\Program Files (x86)\DS-5\bin\caiman.exe&quot;">
-   <image path="H:\ls"/>
-   <image path="H:\libc.so.6"/>
- </session> -

-

Captured

-

Information about a capture session. This is very similar to Configuration XML

-

captured

-

The captured root node of Captured XML has one target child node, one counters child node and the following attributes

- - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
versionInteger1
protocolInteger11
createdIntegerCapture date in seconds since the epoch (midnight January 1, 1970 UTC)
-

target

-

The target node as no children and the following attributes

- - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
nameStringTarget name
sample_rateIntegerNumber of samples collected per second
coresIntegerNumber of cores on the target
-

counters

-

The counters node can have any number of counter child nodes

-

counter

-

The counter node has the following attributes

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
titleStringSee the title attribute of the event node
nameStringSee the name attribute of the event node
colorHex IntegerColor in Streamline
keyHex IntegerKey for this counter in the APC data
typeStringSee the counter attribute of the configuration node
eventHex IntegerSee the event attribute of the configuration node
per_cpuBooleanSee the per_cpu attribute of the event node
countIntegerCan only be set on one counter. See the count attribute of the configuration node
displayStringSee the display attribute of the event node
unitsStringSee the units attribute of the event node
average_selectionBooleanSee the average_selection attribute of the event node
descriptionStringSee the description attribute of the event node
-

Example

-

- <?xml version="1.0" encoding="utf-8"?>
- <captured version="1" protocol="11">
-   <target name="ARM-Versatile Express" sample_rate="100" cores="5" />
-   <counters>
-     <counter title="Branch" name="Mispredicted" color="0x00000000" key="0x00000003" type="ARM_Cortex-A7_cnt1" event="0x00000010" per_cpu="yes" description="Branch mispredicted or not predicted" />
-     <counter title="Cache" name="L2 data access" color="0x00000000" key="0x00000004" type="ARM_Cortex-A7_cnt2" event="0x00000016" per_cpu="yes" description="Level 2 data cache access" />
-     <counter title="Clock" name="Cycles" color="0x00000000" key="0x00000001" type="ARM_Cortex-A7_ccnt" event="0x00000000" per_cpu="yes" display="hertz" units="Hz" average_selection="yes" description="The number of core clock cycles" />
-     <counter title="Instruction" name="Executed" color="0x00000000" key="0x00000002" type="ARM_Cortex-A7_cnt0" event="0x00000008" per_cpu="yes" description="Instruction architecturally executed" />
-     <counter title="Clock" name="Frequency" color="0x00000000" key="0x00000015" type="Linux_power_cpu_freq" event="0x00000000" per_cpu="yes" display="maximum" units="Hz" average_selection="yes" description="Frequency setting of the CPU" />
-     <counter title="Disk IO" name="Read" color="0x00000000" key="0x00000009" type="Linux_block_rq_rd" event="0x00000000" units="B" description="Disk IO Bytes Read" />
-     <counter title="Disk IO" name="Write" color="0x00000000" key="0x00000008" type="Linux_block_rq_wr" event="0x00000000" units="B" description="Disk IO Bytes Written" />
-     <counter title="Memory" name="Free" color="0x00000000" key="0x0000000c" type="Linux_meminfo_memfree" event="0x00000000" display="minimum" units="B" average_selection="yes" description="Available memory size" />
-     <counter title="Memory" name="Used" color="0x00000000" key="0x0000000d" type="Linux_meminfo_memused" event="0x00000000" display="maximum" units="B" average_selection="yes" description="Total used memory size" />
-     <counter title="Network" name="Receive" color="0x00000000" key="0x00000012" type="Linux_net_rx" event="0x00000000" units="B" description="Receive network traffic, including effect from Streamline" />
-     <counter title="Network" name="Transmit" color="0x00000000" key="0x00000013" type="Linux_net_tx" event="0x00000000" units="B" description="Transmit network traffic, including effect from Streamline" />
-   </counters>
- </captured> -

-

APC Frame Format

-

Overview

- The XML files and .apc data (ten-digit files with no extension starting with 0000000000) collected by Streamline are placed in an .apc folder. When Streamline processes this folder, it creates a 'db' folder follwed by a separate .apd folder. When creating a new report from the same .apc folder, Streamline will not regenerate the 'db' folder, even if the .apc data has changed. In other words, the .apc data is ignored if a valid 'db' folder exists. In order to ensure that Streamline generates a new report from the .apc data, delete the 'db' folder so Streamline will recreate it from the .apc data files. -

Types

-
-
int32
4-byte signed little endian
-
packed32
variable length packed 4-byte signed value, see Packed Values
-
packed64
variable length packed 8-byte signed value, see Packed Values
-
string
A packed32 length followed by the specified number of characters
-
#
A constant packed32 value of #, ex: 5 is the packed32 number 5
-
timestamp
packed64 time value in nanoseconds relative to the uptime from the Summary Message
-
-

Packed Values

-

Integers are packed to reduce their size by avoiding sending high unset bits. The value is split into 7 bit bytes in little endian order. The most significant byte is set to 1 if there is a subsequent byte for this value or 0 if it is the last byte. This is very similar to unsigned LEB128 used in DWARF.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
BitsLast valueByte 1Byte 2Byte 3Byte 4Byte 5
70x7F0XXXXXXXb
140x3FFF1XXXXXXXb0XXXXXXXb
210x1FFFFF1XXXXXXXb1XXXXXXXb0XXXXXXXb
280xFFFFFFF1XXXXXXXb1XXXXXXXb1XXXXXXXb0XXXXXXXb
320xFFFFFFFF1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb0000XXXXb
-

For example, 0x68D4D (1101000110101001101b) would be encoded as 0xCD (11001101b) 0x9A (10011010b) 0x1A (00011010b)

-

Packed 64 bit values are similar.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
BitsLast valueByte 1Byte 2Byte 3Byte 4Byte 5Byte 6Byte 7Byte 8Byte 9Byte 10
70x7F0XXXXXXXb
140x3FFF1XXXXXXXb0XXXXXXXb
210x1FFFFF1XXXXXXXb1XXXXXXXb0XXXXXXXb
280xFFFFFFF1XXXXXXXb1XXXXXXXb1XXXXXXXb0XXXXXXXb
350x7FFFFFFFF1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb0XXXXXXXb
420x3FFFFFFFFFF1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb0XXXXXXXb
490x1FFFFFFFFFFFF1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb0XXXXXXXb
560xFFFFFFFFFFFFFF1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb0XXXXXXXb
630x7FFFFFFFFFFFFFFF1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb0XXXXXXXb
640xFFFFFFFFFFFFFFFF1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb0000000Xb
-

For example, 0xBDF5FFD4E449593A would be encoded as 0xBA 0xB2 0xA5 0xA2 0xCE 0xFA 0xFF 0xFA 0xBD 0x01.

-

Frames consist of a header followed by a body of zero or more type specific messages

-

Ordering

-

The order of messages in a frame is significant and must be preserved. However the order of the frames is not important and will be resolved by Streamline.

-

Frame Header

-

- - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
Lengthint32Number of bytes after the length in the frame
Codepacked32Indicates the type of this frame. - - - - - - - - - - -
1= Summary
2= Backtrace
3= Name
4= Counter
5= Block Counter
6= Annotate
7= Sched Trace
8= GPU Trace
9= Idle
-
Corepacked32The processor that originated the messages in the frame. This field must always be present but is ignored for Summary, Counter, Annotate, GPU Trace and Idle Frames as these frames can have messages from multiple cores.
-

If there are multiple message types for a frame, each message will start with an unique code

-

Summary Frame Messages

-

The summary frame will appear only once and have only have one message.

- - - - - - - - - - - - - - - - -
NameTypeDescription
Timestamppacked64Current system time in nanoseconds since the epoch (midnight January 1, 1970 UTC) or 0 if the target does not have system time
Uptimepacked64How long the system has been running in nanoseconds - not affected by external influences like changing the system time, ntp, hibernating, etc... Can be used to reference kernel log messages. If the target does not support uptime, send 0 and use a monotonically increasing timer for the timestamp messages.
-

Backtrace Frame Messages

-
    -
  • Exec cookie vs Offset cookie -
    • If a sample occurs in libx.so called by my-app, the exec cookie is my-app and the offset cookie is libx.so
    -
  • -
-

Cookies should be positive. The special values 0 indicates kernel or idle and -1 indicate an invalid cookie

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
Timestamptimestamp 
Exec Cookiepacked32Cookie of the current process
pidpacked32Process ID (in Linux this is the Thread Group ID)
tidpacked32Thread ID (in Linux this is the PID)
InKernelpacked32 - - - -
0= not in kernel
1= in kernel
-
Body  - One or more repetitions of the following: - - - - - - - - - - - - - - - - -
NameTypeDescription
Offsetpacked64Offset in the backtrace (must always be even)
Offset Cookiepacked32Executable or library at the offset
-
End of Message1 
-

Name Frame Messages

-

Cookie Name Message

-

Cookies are stored in a pseudo hashmap which limits the number of possible collisions, thus duplicate cookies may be emitted. In addition, cookies are stored per core, thus when a task migrates to a new core, a fresh cookie may be emitted for that core. However cookies are unique across all cores.

- - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
Code1 
Cookiepacked32Cookie key
NamestringCookie value
-

Thread Name Message

-

Thread names are stored in a pseudo hashmap which to limit the number of times the name is sent, but duplicate thread names may be emitted. Thread numbers can be reused as long as the context switch process free event is sent before it is reused.

- - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
Code2 
Timestamptimestamp 
Thread IDpacked32tid of the named thread
NamestringName of the thread
-

Core Name Message

- - - - - - - - - - - - - - - - -
NameTypeDescription
Code3 
NamestringName of this core, ex: Cortex-A8
-

Counter Frame Messages

-

- - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
Timestamptimestamp 
Corepacked32Core the counter applies to
Keypacked32Key in Captured XML
Valuepacked64Value of the specified counter
-

Block Counter Frame Messages

-

Block counters are used to save space when counters are sampled at the same timestamp and on the same core. To start the block the key of 0 and a timestamp value is emitted. Then any counters sampled at that time are emitted.

- - - - - - - - - - - - - - - - -
NameTypeDescription
Keypacked32Zero for timestamp or key in Captured XML
Valuepacked64Value of the specified counter
-

Annotate Frame Messages

-

Annotations are messages sent by arbitrary userspace programs, so their format is different from other messages.

-

A single annotation may be broken across frame boundaries. This is why the Annotation Message has a size and the Userspace Annotations either have a size or are '\n' terminated.

-

To colorize any ASCII string within the annotation data, prefix the string with 0x1B (escape character) followed by a 3-byte RGB value

-

Annotate Message

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
Corepacked32 
tidpacked32Thread ID (in Linux this is the PID)
Timestamptimestamp 
Sizepacked32Message size
Body Userspace Annotation data fragment
-

Userspace Annotations

-

ASCII String Annotation

-

Can also be sent from the command line, ex: echo 'Hello World' > /dev/gator/annotate

- - - - - - - - - - - - - - - - -
NameTypeDescription
ColorcolorOptional, 0x1B, RR, GG, BB
ASCII Stringzero or more ASCII characters followed by '\n'Text annotation
-

UTF-8 String Annotations

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
Escape Code0x1C 
Marker Code0x03 
String LengthLittle Endian int16 
ColorcolorOptional, 0x1B, RR, GG, BB, counts against String Length
UTF-8 StringString Length UTF-8 bytesText annotation
-

Visual Annotation

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
Escape Code0x1C 
Visual Code0x04 
String LengthLittle Endian int16 
UTF-8 StringString Length UTF-8 bytesText annotation
Image LengthLittle Endian int32 
Image DataImage Length bytes 
-

Marker Annotation

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
Escape Code0x1C 
Marker Code0x05 
String LengthLittle Endian int16 
ColorcolorOptional, 0x1B, RR, GG, BB, counts against String Length
UTF-8 StringString Length UTF-8 bytesText annotation
-

Scheduler Trace Frame Messages

-

As with Backtrace Frame Messages, the cookies should be positive. The special cookie value 0, in conjunction of a pid of 0, indicates kernel. A cookie value of 0 and a pid of 1 indicates idle.

-

Sched Switch

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
Code1 
Timestamptimestamp 
pidpacked32Process ID (in Linux this is the Thread Group ID)
tidpacked32Thread ID (in Linux this is the PID)
Cookiepacked32Cookie of the current process
Statepacked32State - - - - - -
0= Waiting on other event besides I/O
1= Contention/pre-emption
2= Waiting on I/O
3= Waiting on mutex
-
-

Sched Thread Exit

- - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
Code2 
Timestamptimestamp 
tidpacked32Thread ID (in Linux this is the PID)
-

GPU Trace Frame Messages

-

GPU Start

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
Code1 
Timestamptimestamp 
Unitpacked32GPU Unit
Corepacked32GPU Unit Core
pidpacked32Process ID (in Linux this is the Thread Group ID)
tidpacked32Thread ID (in Linux this is the PID)
-

GPU Stop

- - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
Code2 
Timestamptimestamp 
Unitpacked32GPU Unit
Corepacked32GPU Unit Core
-

Idle Frame Messages

-

Enter Idle

- - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
Code1 
Timestamptimestamp 
Corepacked32 
-

Exit Idle

- - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
Code2 
Timestamptimestamp 
Corepacked32 
-

Sequence Diagrams

-

Configuration

-

Here are the events that occur when the Counter Configuration button is clicked in Streamline. Below are the events that occur when various buttons are pressed in the dialog

-
-

When the Load Defaults button is clicked from the Counter Configuration dialog

-
-

When the Cancel or close button is clicked from the Counter Configuration dialog, after which the dialog closes

-
-

When the Save button is clicked from the Counter Configuration dialog, after which the dialog closes

-
-

Capture

-

Here are the events that occur when the Start Capture button is clicked in Streamline

-
-

At any point during the capture Streamline can send a ping to verify that the host is still running. If the ping is not acknowledged Streamline will end the capture

-
-
- - diff --git a/protocol/gator/gator_protocol-5-13.html b/protocol/gator/gator_protocol-5-13.html deleted file mode 100644 index dd9e6b04..00000000 --- a/protocol/gator/gator_protocol-5-13.html +++ /dev/null @@ -1,1686 +0,0 @@ - - - - - - - - -
-

Gator v12 (DS-5v5.13) Protocol

-

Index

-
  • - Introduction -
  • -
  • - Target-Host Protocol - -
  • -
  • - Response Format - -
  • -
  • - XML - -
  • -
  • - APC Frame Format - -
  • -
  • - Sequence Diagrams - -
  • -
  • - Local Capture -
  • -

    Introduction

    -

    The purpose of this document is to describe the TCP/IP protocol used by gator or other implementing clients to communicate with Streamline version 5.13 or later. The gator source code, distributed as part of DS-5, is the reference implementation of this protocol. The protocol may change with future releases of Streamline, but Streamline will maintain backwards compatibility with this version of the protocol so that clients need only implement one version of the protocol. The client is expected to be able to parse and generate simple XML as well as be able to ignore additional or unexpected nodes or attributes. Only the XML features described will be used, so the more complex features of XML, such as XML namespaces, are not required.

    -

    Target-Host Protocol

    -

    Magic Exchange

    -

    A handshake so server and client recognize each other

    -
      -
    1. The client reads ASCII newline (\n) delimited strings until STREAMLINE\n is read. Anything else is discarded.
    2. -
    3. Send GATOR 12\n
    4. -
    -

    Further communication from Streamline come as Commands

    -

    Command Header

    -

    Commands from Streamline consist of a header followed by a body. Streamline then expects a Response

    -

    - - - - - - - - - - - - - - - -
    NameTypeDescription
    CodebyteThe type of command - - - - - - - -
    0= Request XML
    1= Deliver XML
    2= APC Start
    3= APC Stop
    4= Disconnect
    5= Ping
    -
    LengthLittle Endian int32Number of bytes in the body

    -

    If the client receives an unrecognized command, it should respond with a NAK.

    -

    Request XML Body

    -

    Represents a request from Streamline formatted as XML with the root node request and an attribute representing the type of request. For example, this is a request for Events XML

    -

    - <?xml version="1.0" encoding="US-ASCII" ?>
    - <request type="events">
    - </request> -

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    RequestResponse CodeResponse Body
    <request type="events">XMLEvents XML
    <request type="configuration">XMLConfiguration XML
    <request type="counters">XMLCounters XML
    <request type="session">XMLSession XML. Must return exactly what was delivered by Streamline. If not received when requested, send a NAK. Streamline requests Session XML prior to requesting Captured XML
    <request type="captured">XMLCaptured XML Streamline requests Captured XML prior to starting a capture.
    <request type="defaults">XMLdefault Configuration XML

    -

    Deliver XML Body

    -

    - - - - - - - - - - - - -
    RequestResponse Code
    Session XMLACK
    Configuration XMLACK

    -

    APC Start Body

    -

    No Command Body. This indicates that capture should begin and Streamline now expects to receive APC Data Responses. No ACK is expected and no further XML exchange takes place. If a failure occurs, the client should send an Error.

    -

    APC Stop Body

    -

    No Command Body. Capture should now end and no ACK is expected, but APC Data Responses can continue to arrive until all captured data is sent, then the connection should be closed. If a failure occurs, the client should send an Error.

    -

    Disconnect Body

    -

    No Command Body. No ACK is expected, close the connection

    -

    Ping Body

    -

    No Command Body. Send an ACK Response

    -

    Response Format

    -

    Responses consist of a header followed by a body

    -

    Response Header

    -

    Identical to the Command Header but the Codes are different

    -

    - - - - - - - - - - - - - - - -
    NameTypeDescription
    CodebyteThe type of command - - - - - - -
    1= XML
    3= APC Data
    4= ACK
    5= NAK
    0xFF= Error
    -
    LengthLittle Endian int32Number of bytes in the body

    -

    XML Body

    -

    XML, format is dependent on the Request see Request XML Body

    -

    APC Data Body

    -

    An APC Frame. If the length is zero, it is the End of Sequence message which indicates that all APC Frames have been transmitted to Streamline.

    -

    ACK Body

    -

    No Response Body. Indicates the Command was successful

    -

    NAK Body

    -

    Indicates a synchronous non-fatal error occurred when handling a request. Can contain a UTF-8 error message. The length is specified in the header, so no NULL character is expected. Indicates the Command failed. The connection can continue.

    -

    Error Body

    -

    Indicates a synchronous fatal error occurred when responding to a request. A UTF-8 error message. The length is specified in the header, so no NULL character is expected. The error is terminal and the connection must be closed. Errors may be sent asynchronously, ie without a request, but Streamline may not process them immediately.

    -

    XML

    -

    Events

    -

    Listing of all possible counters

    -

    events

    -

    The events root node of Events XML can have any number of counter_set and category child nodes

    -

    counter_set

    -

    The counter_set node has no children and the following attributes. Counter sets are used when the number of counters that can be enabled in a category is restricted. Streamline will respect the restriction and assign a name from the set to a counter in Configuration XML.

    -

    - - - - - - - - - - - - - - - -
    NameTypeDescription
    nameStringName of the counter_set
    countStringNumber of counters in the set. Counter names are derived by appending a number, starting at zero, to the set name. Ex, if the set name is ARM_Cortex-A8_cnt and the count is 4, then the counter names in the set are ARM_Cortex-A8_cnt0, ARM_Cortex-A8_cnt1, ARM_Cortex-A8_cnt2 and ARM_Cortex-A8_cnt3

    -

    category

    -

    The category node can have any number of event child nodes and the following attributes

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    nameStringName of the category show in Streamline
    counter_setStringRequired if sub event uses the event attribute, name of the related counter_set
    per_cpuBooleanDefaults to false, see the per_cpu attribute of the event node
    supports_event_based_samplingBooleanDefaults to false, see the supports_event_based_sampling attribute of the event node

    -

    event

    -

    The event node has no children and the following attributes

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    counterStringRequired if event is not present, name of the counter
    eventHex IntegerRequired if counter is not present, hardware counter number
    titleStringTitle of the event, shown in Streamline before the name. Used to group counters.
    nameStringName of the event, shown in Streamline after the title
    per_cpuBooleanIs true if this event is per cpu as opposed to global. Defaults to the per_cpu attribute of the category node
    supports_event_based_samplingBooleanIs true if this event supports event base sampling. Defaults to the supports_event_based_sampling attribute of the category node
    displayStringOptional, one of average, maximum, minimum, hertz, accumulate (Default). This is the same as adding .avg, .max, .min or .hz (accumulate is the default) to the counter name in the chart configuration panel in Streamline.
    unitsStringOptional, units to display in Streamline
    average_selectionBooleanOptional, Averages the values displayed by the Cross Section Marker in Streamline
    descriptionStringDescription to show in Streamline. Used as the tooltip for the counter

    -

    Example:

    -

    - <?xml version="1.0" encoding="UTF-8"?>
    - <events>
    -   <counter_set name="ARM_Cortex-A8_cnt" count="4"/>
    -   <category name="Cortex-A8" counter_set="ARM_Cortex-A8_cnt" per_cpu="yes" supports_event_based_sampling="yes">
    -     <event counter="ARM_Cortex-A8_ccnt" title="Clock" name="Cycles" display="hertz" units="Hz" average_selection="yes" description="The number of core clock cycles"/>
    -     <event event="0x00" title="Software" name="Increment" description="Incremented only on writes to the Software Increment Register"/>
    -     <event event="0x01" title="Cache" name="Instruction refill" description="Instruction fetch that causes a refill of at least the level of instruction or unified cache closest to the processor"/>
    -     <!-- ... -->
    -   </category>
    -   <counter_set name="ARM_Cortex-A9_cnt" count="6"/>
    -   <category name="Cortex-A9" counter_set="ARM_Cortex-A9_cnt" per_cpu="yes" supports_event_based_sampling="yes">
    -     <event counter="ARM_Cortex-A9_ccnt" title="Clock" name="Cycles" display="hertz" units="Hz" average_selection="yes" description="The number of core clock cycles"/>
    -     <event event="0x00" title="Software" name="Increment" description="Incremented only on writes to the Software Increment Register"/>
    -     <event event="0x01" title="Cache" name="Instruction refill" description="Instruction fetch that causes a refill of at least the level of instruction or unified cache closest to the processor"/>
    -     <!-- ... -->
    -   </category>
    -   <category name="Linux">
    -     <event counter="Linux_cpuload_user" title="CPU Load" name="User" per_cpu="yes" description="Scheduler CPU Load of User Application"/>
    -     <event counter="Linux_cpuload_system" title="CPU Load" name="System" per_cpu="yes" description="Scheduler CPU Load of System Behavior"/>
    -     <event counter="Linux_irq_softirq" title="Interrupts" name="SoftIRQ" per_cpu="yes" description="Linux SoftIRQ taken"/>
    -     <!-- ... -->
    -   </category>
    - </events> -

    -

    Configuration

    -

    List of counters that are currently enabled. Can include counters not available on the target which will be ignored

    -

    configurations

    -

    The configurations root node of Configuration XML can have any number of configuration child nodes and has the following attribute

    -

    - - - - - - - - - - -
    NameTypeDescription
    revisionInteger1

    -

    configuration

    -

    The configuration node has no children and has the following attributes

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    counterStringSee the counter attribute of the event node. Required, unique. If Events XML did not have a counter for this event, a counter from the related counter_set can be taken, see the description of counter_set in Events XML
    eventHex IntegerSee the event attribute of the event node, set if it was set in Events XML
    titleStringSee the title attribute of the event node
    nameStringSee the name attribute of the event node
    per_cpuBooleanSee the per_cpu attribute of the event node
    supports_event_based_samplingBooleanSee the supports_event_based_sampling attribute of the event node
    countIntegerOptional. How many samples to collect before the event is triggered
    displayStringSee the display attribute of the event node
    unitsStringSee the units attribute of the event node
    average_selectionBooleanSee the average_selection attribute of the event node
    descriptionStringSee the description attribute of the event node

    -

    Example:

    -

    - <?xml version="1.0" encoding='UTF-8'?>
    - <configurations revision="1">
    -   <configuration counter="ARM_Cortex-A8_ccnt" title="Clock" name="Cycles" per_cpu="yes" supports_event_based_sampling="yes" display="hertz" units="Hz" average_selection="yes" description="The number of core clock cycles"/>
    -   <configuration counter="ARM_Cortex-A8_cnt0" event="0x8" title="Instruction" name="Executed" per_cpu="yes" supports_event_based_sampling="yes" description="Instruction architecturally executed"/>
    -   <configuration counter="ARM_Cortex-A8_cnt1" event="0x44" title="Cache" name="L2 miss" per_cpu="yes" supports_event_based_sampling="yes" description="Any cacheable miss in the L2 cache"/>
    -   <configuration counter="ARM_Cortex-A8_cnt2" event="0x43" title="Cache" name="L1 miss" per_cpu="yes" supports_event_based_sampling="yes" description="Any accesses to the L2 cache"/>
    -   <configuration counter="ARM_Cortex-A8_cnt3" event="0x10" title="Branch" name="Mispredicted" per_cpu="yes" supports_event_based_sampling="yes" description="Branch mispredicted or not predicted"/>
    -   <configuration counter="ARM_Cortex-A9_ccnt" title="Clock" name="Cycles" per_cpu="yes" supports_event_based_sampling="yes" display="hertz" units="Hz" average_selection="yes" description="The number of core clock cycles"/>
    -   <configuration counter="ARM_Cortex-A9_cnt0" event="0x68" title="Instruction" name="Executed" per_cpu="yes" supports_event_based_sampling="yes" description="Counts the number of instructions going through the Register Renaming stage. This number is an approximate number of the total number of instructions speculatively executed, and even more approximate of the total number of instructions architecturally executed"/>
    -   <configuration counter="ARM_Cortex-A9_cnt1" event="0x06" title="Instruction" name="Memory read" per_cpu="yes" supports_event_based_sampling="yes" description="Memory-reading instruction architecturally executed"/>
    -   <configuration counter="ARM_Cortex-A9_cnt2" event="0x07" title="Instruction" name="Memory write" per_cpu="yes" supports_event_based_sampling="yes" description="Memory-writing instruction architecturally executed"/>
    -   <configuration counter="ARM_Cortex-A9_cnt3" event="0x03" title="Cache" name="Data refill" per_cpu="yes" supports_event_based_sampling="yes" description="Memory Read or Write operation that causes a refill of at least the level of data or unified cache closest to the processor"/>
    -   <configuration counter="ARM_Cortex-A9_cnt4" event="0x04" title="Cache" name="Data access" per_cpu="yes" supports_event_based_sampling="yes" description="Memory Read or Write operation that causes a cache access to at least the level of data or unified cache closest to the processor"/>
    -   <configuration counter="Linux_block_rq_wr" title="Disk IO" name="Write" units="B" description="Disk IO Bytes Written"/>
    -   <configuration counter="Linux_block_rq_rd" title="Disk IO" name="Read" units="B" description="Disk IO Bytes Read"/>
    -   <configuration counter="Linux_net_rx" title="Network" name="Receive" units="B" description="Receive network traffic, including effect from Streamline"/>
    -   <configuration counter="Linux_net_tx" title="Network" name="Transmit" units="B" description="Transmit network traffic, including effect from Streamline"/>
    -   <configuration counter="Linux_cpuload_system" title="CPU Load" name="System" description="Scheduler CPU Load of System Behavior"/>
    -   <configuration counter="Linux_cpuload_user" title="CPU Load" name="User" description="Scheduler CPU Load of User Application"/>
    -   <configuration counter="Linux_meminfo_memused" title="Memory" name="Used" display="maximum" units="B" average_selection="yes" description="Total used memory size"/>
    -   <configuration counter="Linux_meminfo_memfree" title="Memory" name="Free" display="minimum" units="B" average_selection="yes" description="Available memory size"/>
    -   <configuration counter="Linux_power_cpu_freq" title="Clock" name="Frequency" per_cpu="yes" display="maximum" units="Hz" average_selection="yes" description="Frequency setting of the CPU"/>
    - </configurations> -

    -

    Counters

    -

    Listing of counters available on the target

    -

    counters

    -

    The counters root node of Counters XML can have any number of counter child nodes

    -

    counter

    -

    The counter node has the following attribute

    -

    - - - - - - - - - - -
    NameTypeDescription
    nameStringAvailable counter name from the counter_set node or the counter attribute of the event node

    -

    Example:

    -

    - <?xml version="1.0" encoding="utf-8"?>
    - <counters>
    -   <counter name="Linux_power_cpu_idle" />
    -   <counter name="Linux_power_cpu_freq" />
    -   <counter name="Linux_sched_switch" />
    -   <counter name="ARM_Cortex-A8_cnt3" />
    -   <counter name="ARM_Cortex-A8_cnt2" />
    -   <counter name="ARM_Cortex-A8_cnt1" />
    -   <counter name="ARM_Cortex-A8_cnt0" />
    -   <counter name="ARM_Cortex-A8_ccnt" />
    -   <counter name="Linux_net_tx" />
    -   <counter name="Linux_net_rx" />
    -   <counter name="mmaped_cnt2" />
    -   <counter name="mmaped_cnt1" />
    -   <counter name="mmaped_cnt0" />
    -   <counter name="Linux_meminfo_bufferram" />
    -   <counter name="Linux_meminfo_memused" />
    -   <counter name="Linux_meminfo_memfree" />
    -   <counter name="Linux_irq_softirq" />
    -   <counter name="Linux_irq_irq" />
    -   <counter name="Linux_block_rq_rd" />
    -   <counter name="Linux_block_rq_wr" />
    - </counters> -

    -

    Session

    -

    XML representing generated by Streamline representing the Capture & Analysis Options dialog. Must be sent by Streamline before it's requested by Streamline. Send back the received XML.

    -

    session

    -

    The session root node of Session XML can have any number of image child nodes and has the following attributes

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    versionInteger1
    call_stack_unwindingBooleanIf Call Stack Unwinding is selected
    parse_debug_infoBooleanIf Process Debug Information is selected
    high_resolutionBooleanIf High Resolution Timeline is selected
    buffer_modeStringOne of streaming, small, normal or large
    sample_rateStringOne of normal, low, none
    durationIntegerDuration of the capture in seconds
    target_hostStringTarget address
    target_portIntegerTarget port
    energy_cmd_lineStringOptional, Energy Capture command line

    -

    image

    -

    The image node has no child nodes and the following attributes

    -

    - - - - - - - - - - - - - - - -
    NameTypeDescription
    pathStringProgram Image. Used during local capture where images may be copied into the .apc folder. Can be updated in Streamline post-capture.
    enabledBooleanDefaults to false, is the Program Image is enabled

    -

    Example:

    -

    - <?xml version="1.0" encoding="US-ASCII" ?>
    - <session version="1" call_stack_unwinding="yes" parse_debug_info="yes" high_resolution="no" buffer_mode="streaming" sample_rate="low" duration="0" target_host="10.99.3.109" target_port="8080" energy_cmd_line="&quot;C:\Program Files (x86)\DS-5\bin\caiman.exe&quot;">
    -   <image path="H:\ls"/>
    -   <image path="H:\libc.so.6"/>
    - </session> -

    -

    Captured

    -

    Information about a capture session. This is very similar to Configuration XML

    -

    captured

    -

    The captured root node of Captured XML has one target child node, one counters child node and the following attributes

    -

    - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    versionInteger1
    protocolInteger12
    createdIntegerCapture date in seconds since the epoch (midnight January 1, 1970 UTC)

    -

    target

    -

    The target node as no children and the following attributes

    -

    - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    nameStringTarget name
    sample_rateIntegerNumber of samples collected per second
    coresIntegerNumber of cores on the target

    -

    counters

    -

    The counters node can have any number of counter child nodes

    -

    counter

    -

    The counter node has the following attributes

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    titleStringSee the title attribute of the event node
    nameStringSee the name attribute of the event node
    colorHex IntegerColor in Streamline
    keyHex IntegerKey for this counter in the APC data
    typeStringSee the counter attribute of the configuration node
    eventHex IntegerSee the event attribute of the configuration node
    per_cpuBooleanSee the per_cpu attribute of the event node
    countIntegerCan only be set on one counter. See the count attribute of the configuration node
    displayStringSee the display attribute of the event node
    unitsStringSee the units attribute of the event node
    average_selectionBooleanSee the average_selection attribute of the event node
    descriptionStringSee the description attribute of the event node

    -

    Example:

    -

    - <?xml version="1.0" encoding="utf-8"?>
    - <captured version="1" protocol="12">
    -   <target name="ARM-Versatile Express" sample_rate="100" cores="5" />
    -   <counters>
    -     <counter title="Branch" name="Mispredicted" color="0x00000000" key="0x00000003" type="ARM_Cortex-A7_cnt1" event="0x00000010" per_cpu="yes" description="Branch mispredicted or not predicted" />
    -     <counter title="Cache" name="L2 data access" color="0x00000000" key="0x00000004" type="ARM_Cortex-A7_cnt2" event="0x00000016" per_cpu="yes" description="Level 2 data cache access" />
    -     <counter title="Clock" name="Cycles" color="0x00000000" key="0x00000001" type="ARM_Cortex-A7_ccnt" event="0x00000000" per_cpu="yes" display="hertz" units="Hz" average_selection="yes" description="The number of core clock cycles" />
    -     <counter title="Instruction" name="Executed" color="0x00000000" key="0x00000002" type="ARM_Cortex-A7_cnt0" event="0x00000008" per_cpu="yes" description="Instruction architecturally executed" />
    -     <counter title="Clock" name="Frequency" color="0x00000000" key="0x00000015" type="Linux_power_cpu_freq" event="0x00000000" per_cpu="yes" display="maximum" units="Hz" average_selection="yes" description="Frequency setting of the CPU" />
    -     <counter title="Disk IO" name="Read" color="0x00000000" key="0x00000009" type="Linux_block_rq_rd" event="0x00000000" units="B" description="Disk IO Bytes Read" />
    -     <counter title="Disk IO" name="Write" color="0x00000000" key="0x00000008" type="Linux_block_rq_wr" event="0x00000000" units="B" description="Disk IO Bytes Written" />
    -     <counter title="Memory" name="Free" color="0x00000000" key="0x0000000c" type="Linux_meminfo_memfree" event="0x00000000" display="minimum" units="B" average_selection="yes" description="Available memory size" />
    -     <counter title="Memory" name="Used" color="0x00000000" key="0x0000000d" type="Linux_meminfo_memused" event="0x00000000" display="maximum" units="B" average_selection="yes" description="Total used memory size" />
    -     <counter title="Network" name="Receive" color="0x00000000" key="0x00000012" type="Linux_net_rx" event="0x00000000" units="B" description="Receive network traffic, including effect from Streamline" />
    -     <counter title="Network" name="Transmit" color="0x00000000" key="0x00000013" type="Linux_net_tx" event="0x00000000" units="B" description="Transmit network traffic, including effect from Streamline" />
    -   </counters>
    - </captured> -

    -

    APC Frame Format

    -

    Overview

    -

    The XML files and .apc data (ten-digit files with no extension starting with 0000000000) collected by Streamline are placed in an .apc folder. When Streamline processes this folder, it creates a 'db' folder followed by a separate .apd folder. When creating a new report from the same .apc folder, Streamline will not regenerate the 'db' folder, even if the .apc data has changed. In other words, the .apc data is ignored if a valid 'db' folder exists. In order to ensure that Streamline generates a new report from the .apc data, delete the 'db' folder so Streamline will recreate it from the .apc data files.

    -

    Types

    -
    -
    int32
    4-byte signed little endian
    -
    packed32
    variable length packed 4-byte signed value, see Packed Values
    -
    packed64
    variable length packed 8-byte signed value, see Packed Values
    -
    string
    A packed32 length followed by the specified number of characters
    -
    #
    A constant packed32 value of #, ex: 5 is the packed32 number 5
    -
    timestamp
    packed64 time value in nanoseconds relative to the uptime from the Summary Message
    -
    -

    Packed Values

    -

    Integers are packed to reduce their size by avoiding sending high unset bits. The value is split into 7 bit bytes in little endian order. The most significant byte is set to 1 if there is a subsequent byte for this value or 0 if it is the last byte. This is very similar to unsigned LEB128 used in DWARF.

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    BitsLast valueByte 1Byte 2Byte 3Byte 4Byte 5
    70x7F0XXXXXXXb
    140x3FFF1XXXXXXXb0XXXXXXXb
    210x1FFFFF1XXXXXXXb1XXXXXXXb0XXXXXXXb
    280xFFFFFFF1XXXXXXXb1XXXXXXXb1XXXXXXXb0XXXXXXXb
    320xFFFFFFFF1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb0000XXXXb

    -

    For example, 0x68D4D (1101000110101001101b) would be encoded as 0xCD (11001101b) 0x9A (10011010b) 0x1A (00011010b)

    -

    Packed 64 bit values are similar.

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    BitsLast valueByte 1Byte 2Byte 3Byte 4Byte 5Byte 6Byte 7Byte 8Byte 9Byte 10
    70x7F0XXXXXXXb
    140x3FFF1XXXXXXXb0XXXXXXXb
    210x1FFFFF1XXXXXXXb1XXXXXXXb0XXXXXXXb
    280xFFFFFFF1XXXXXXXb1XXXXXXXb1XXXXXXXb0XXXXXXXb
    350x7FFFFFFFF1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb0XXXXXXXb
    420x3FFFFFFFFFF1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb0XXXXXXXb
    490x1FFFFFFFFFFFF1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb0XXXXXXXb
    560xFFFFFFFFFFFFFF1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb0XXXXXXXb
    630x7FFFFFFFFFFFFFFF1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb0XXXXXXXb
    640xFFFFFFFFFFFFFFFF1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb0000000Xb

    -

    For example, 0xBDF5FFD4E449593A would be encoded as 0xBA 0xB2 0xA5 0xA2 0xCE 0xFA 0xFF 0xFA 0xBD 0x01.

    -

    Frames consist of a header followed by a body of zero or more type specific messages

    -

    Ordering

    -

    The order of messages in a frame is significant and must be preserved. However the order of the frames is not important and will be resolved by Streamline.

    -

    Required Messages

    -

    To generate a valid capture at least one Sched Switch, Counter or Block Counter message must be present. All other messages are optional.

    -

    Frame Header

    -

    - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Lengthint32Number of bytes after the length in the frame
    Codepacked32Indicates the type of this frame. - - - - - - - - - - -
    1= Summary
    2= Backtrace
    3= Name
    4= Counter
    5= Block Counter
    6= Annotate
    7= Sched Trace
    8= GPU Trace
    9= Idle
    -
    Corepacked32The processor that originated the messages in the frame. This field must always be present but is ignored for Summary, Counter, Annotate, GPU Trace and Idle Frames as these frames can have messages from multiple cores.

    -

    If there are multiple message types for a frame, each message will start with an unique code

    -

    Summary Frame Messages

    -

    The summary frame will appear only once and have only have one message.

    -

    - - - - - - - - - - - - - - - -
    NameTypeDescription
    Timestamppacked64Current system time in nanoseconds since the epoch (midnight January 1, 1970 UTC) or 0 if the target does not have system time
    Uptimepacked64How long the system has been running in nanoseconds - not affected by external influences like changing the system time, ntp, hibernating, etc... Can be used to reference kernel log messages. If the target does not support uptime, send 0 and use a monotonically increasing timer for the timestamp messages.

    -

    Backtrace Frame Messages

    -

    This is used to populate the Call Paths tab

    -
      -
    • Exec cookie vs Offset cookie -
      • If a sample occurs in libx.so called by my-app, the exec cookie is my-app and the offset cookie is libx.so
      -
    • -
    -

    Cookies should be positive. The special values 0 indicates kernel or idle, -1 indicate an invalid cookie and 1 is reserved to avoid confusion with End of Message, 1 below.

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Timestamptimestamp 
    Exec Cookiepacked32Cookie of the current process
    pidpacked32Process ID (in Linux this is the Thread Group ID)
    tidpacked32Thread ID (in Linux this is the PID)
    InKernelpacked32 - - - -
    0= not in kernel
    1= in kernel
    -
    Body  - One or more repetitions of the following: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Offset Cookiepacked32Executable or library at the offset
    Offsetpacked64Offset in the backtrace
    -
    End of Message1 

    -

    Name Frame Messages

    -

    Cookie Name Message

    -

    This is used to get the name for the Process Handle. Cookies are stored in a pseudo hashmap which limits the number of possible collisions, thus duplicate cookies may be emitted. In addition, cookies are stored per core, thus when a task migrates to a new core, a fresh cookie may be emitted for that core. However cookies are unique across all cores.

    -

    - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code1 
    Cookiepacked32Cookie key
    NamestringCookie value

    -

    Thread Name Message

    -

    This is used to show thread names in the Thread Disclosure. Thread names are stored in a pseudo hashmap which to limit the number of times the name is sent, but duplicate thread names may be emitted. Thread numbers can be reused as long as the context switch process free event is sent before it is reused.

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code2 
    Timestamptimestamp 
    Thread IDpacked32tid of the named thread
    NamestringName of the thread

    -

    Core Name Message

    -

    This is used to identify clusters and in the tooltip in X-Ray mode

    -

    - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code3 
    NamestringName of this core, ex: Cortex-A8

    -

    Counter Frame Messages

    -

    This is used to populate Charts in the Timeline view

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Timestamptimestamp 
    Corepacked32Core the counter applies to
    Keypacked32Key in Captured XML
    Valuepacked64Value of the specified counter

    -

    Block Counter Frame Messages

    -

    Block counters are the same as counters, but used less space when multiple counters are sampled at the same timestamp and on the same core. To start the block, the key of 0 and a timestamp value is emitted. Then any counters sampled at that time are emitted.

    -

    - - - - - - - - - - - - - - - -
    NameTypeDescription
    Keypacked32Zero for timestamp or key in Captured XML
    Valuepacked64Value of the specified counter

    -

    Annotate Frame Messages

    -

    Annotations are messages sent by arbitrary userspace programs, so their format is different from other messages.

    -

    A single annotation may be broken across frame boundaries. This is why the Annotation Message has a size and the Userspace Annotations either have a size or are '\n' terminated.

    -

    To colorize any ASCII string within the annotation data, prefix the string with 0x1B (escape character) followed by a 3-byte RGB value

    -

    Annotate Message

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Corepacked32 
    tidpacked32Thread ID (in Linux this is the PID)
    Timestamptimestamp 
    Sizepacked32Message size
    Body Userspace Annotation data fragment

    -

    Userspace Annotations

    -

    Annotations belong to a channel with 0 being the default channel. Channels belong to groups with 0 as the default group.

    -

    ASCII String Annotation

    -

    This is used to add a line in the Log tab. Can also be sent from the command line, ex: echo 'Hello World' > /dev/gator/annotate

    -

    - - - - - - - - - - - - - - - -
    NameTypeDescription
    ColorcolorOptional, 0x1B, RR, GG, BB
    ASCII Stringzero or more ASCII characters followed by '\n'Text annotation

    -

    Create Group Annotation

    -

    This is used to name a group in the Thread Disclosure

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Escape Code0x1C 
    Marker Code0x08 
    GroupLittle Endian int32 
    String LengthLittle Endian int16 
    UTF-8 StringString Length UTF-8 bytesChannel name

    -

    Create Channel Annotation

    -

    This is used to name a channel in the Thread Disclosure

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Escape Code0x1C 
    Marker Code0x07 
    ChannelLittle Endian int32 
    GroupLittle Endian int32Group the channel belongs to
    String LengthLittle Endian int16 
    UTF-8 StringString Length UTF-8 bytesChannel name

    -

    UTF-8 String Annotations

    -

    This is used to add a line in the Log tab.

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Escape Code0x1C 
    Marker Code0x06 
    ChannelLittle Endian int32Channel the annotation belongs to
    String LengthLittle Endian int16 
    ColorcolorOptional, 0x1B, RR, GG, BB, counts against String Length
    UTF-8 StringString Length UTF-8 bytesText annotation

    -

    Visual Annotation

    -

    This is used to add a line in the Log tab and an image to the Visual Annotation Chart.

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Escape Code0x1C 
    Visual Code0x04 
    String LengthLittle Endian int16 
    UTF-8 StringString Length UTF-8 bytesText annotation
    Image LengthLittle Endian int32 
    Image DataImage Length bytes 

    -

    Marker Annotation

    -

    This is used to add a Bookmark

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Escape Code0x1C 
    Marker Code0x05 
    String LengthLittle Endian int16 
    ColorcolorOptional, 0x1B, RR, GG, BB, counts against String Length
    UTF-8 StringString Length UTF-8 bytesText annotation

    -

    Scheduler Trace Frame Messages

    -

    As with Backtrace Frame Messages, the cookies should be positive. The special cookie value 0, in conjunction of a pid of 0, indicates kernel. A cookie value of 0 and a pid of 1 indicates idle.

    -

    Sched Switch

    -

    This is used to populate the CPU Activity Chart and the Heat Map

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code1 
    Timestamptimestamp 
    pidpacked32Process ID (in Linux this is the Thread Group ID)
    tidpacked32Thread ID (in Linux this is the PID)
    Cookiepacked32Cookie of the current process
    Statepacked32State - - - - - -
    0= Waiting on other event besides I/O
    1= Contention/pre-emption
    2= Waiting on I/O
    3= Waiting on mutex
    -

    -

    Sched Thread Exit

    -

    This is used by the Heat Map to identify when a process terminates

    -

    - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code2 
    Timestamptimestamp 
    tidpacked32Thread ID (in Linux this is the PID)

    -

    GPU Trace Frame Messages

    -

    GPU Start

    -

    This is used to indicate a part of the GPU has begun execution

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code1 
    Timestamptimestamp 
    Unitpacked32GPU Unit
    Corepacked32GPU Unit Core
    pidpacked32Process ID (in Linux this is the Thread Group ID)
    tidpacked32Thread ID (in Linux this is the PID)

    -

    GPU Stop

    -

    This is used to indicate a part of the GPU has ceased execution

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code2 
    Timestamptimestamp 
    Unitpacked32GPU Unit
    Corepacked32GPU Unit Core

    -

    Idle Frame Messages

    -

    Enter Idle

    -

    This is used to indicate that a core has ceased execution.

    -

    - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code1 
    Timestamptimestamp 
    Corepacked32 

    -

    Exit Idle

    -

    This is used to indicate that a core has resumed execution.

    -

    - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code2 
    Timestamptimestamp 
    Corepacked32 

    -

    Sequence Diagrams

    -

    Configuration

    -

    Here are the events that occur when the Counter Configuration button is clicked in Streamline. Below are the events that occur when various buttons are pressed in the dialog

    -
    -

    When the Load Defaults button is clicked from the Counter Configuration dialog

    -
    -

    When the Cancel or close button is clicked from the Counter Configuration dialog, after which the dialog closes

    -
    -

    When the Save button is clicked from the Counter Configuration dialog, after which the dialog closes

    -
    -

    Capture

    -

    Here are the events that occur when the Start Capture button is clicked in Streamline

    -
    -

    At any point during the capture Streamline can send a ping to verify that the host is still running. If the ping is not acknowledged Streamline will end the capture

    -
    -

    Local Capture

    -

    Streamline also support a local capture mode where data is collected without interaction with Streamline. In this case the Target-Host Protocol is omitted. Instead a directory, ending in .apc, is provided to Streamline. This directory contains captured.xml containg the Captured XML, session.xml containing the Session XML and 0000000000 which contains the APC Data with one or more structures of the following format

    -

    - - - - - - - - - - - - - - - -
    NameTypeDescription
    LengthLittle Endian int32Number of bytes in the body
    bodyAPC Data 

    -
    - - diff --git a/protocol/gator/gator_protocol-5-14.html b/protocol/gator/gator_protocol-5-14.html deleted file mode 100644 index 34319837..00000000 --- a/protocol/gator/gator_protocol-5-14.html +++ /dev/null @@ -1,1886 +0,0 @@ - - - - - - - - -
    -

    Gator v13 (DS-5 v5.14) Protocol

    -

    Index

    -
  • - Introduction -
  • -
  • Changes in v13 (DS-5 v5.14)
  • -
  • - Target-Host Protocol - -
  • -
  • - Response Format - -
  • -
  • - XML - -
  • -
  • - APC Frame Format - -
  • -
  • - Sequence Diagrams - -
  • -
  • - Local Capture -
  • -

    Introduction

    -

    The purpose of this document is to describe the TCP/IP protocol used by gator or other implementing clients to communicate with Streamline version 5.14 or later. The gator source code, distributed as part of DS-5, is the reference implementation of this protocol. The protocol may change with future releases of Streamline, but Streamline will maintain backwards compatibility with this version of the protocol so that clients need only implement one version of the protocol. The client is expected to be able to parse and generate simple XML as well as be able to ignore additional or unexpected nodes or attributes. Only the XML features described will be used, so the more complex features of XML, such as XML namespaces, are not required.

    -

    Changes in v13 (DS-5 v5.14)

    -

    The following changes have been made in v13 (DS-5 v5.14)

    - -

    Target-Host Protocol

    -

    Magic Exchange

    -

    A handshake so server and client recognize each other

    -
      -
    1. The client reads ASCII newline (\n) delimited strings until STREAMLINE\n is read. Anything else is discarded.
    2. -
    3. Send GATOR 13\n
    4. -
    -

    Further communication from Streamline comes as Commands

    -

    Command Header

    -

    Commands from Streamline consist of a header followed by a body. Streamline then expects a Response

    -

    - - - - - - - - - - - - - - - -
    NameTypeDescription
    Codeint8The type of command - - - - - - - -
    0= Request XML
    1= Deliver XML
    2= APC Start
    3= APC Stop
    4= Disconnect
    5= Ping
    -
    LengthLittle Endian int32Number of bytes in the body

    -

    If the client receives an unrecognized command, it should respond with a NAK.

    -

    Request XML Body

    -

    Represents a request from Streamline formatted as XML with the root node request and an attribute representing the type of request. For example, this is a request for Events XML

    -

    - <?xml version="1.0" encoding="US-ASCII"?>
    - <request type="events">
    - </request> -

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    RequestResponse CodeResponse Body
    <request type="events">XMLEvents XML
    <request type="configuration">XMLConfiguration XML
    <request type="counters">XMLCounters XML
    <request type="captured">XMLCaptured XML Streamline requests Captured XML prior to starting a capture.
    <request type="defaults">XMLdefault Configuration XML

    -

    Deliver XML Body

    -

    - - - - - - - - - - - - -
    RequestResponse Code
    Session XMLACK
    Configuration XMLACK

    -

    APC Start Body

    -

    No Command Body. This indicates that capture should begin and Streamline now expects to receive APC Data Responses. No ACK is expected and no further XML exchange takes place. If a failure occurs, the client should send an Error.

    -

    APC Stop Body

    -

    No Command Body. Capture should now end and no ACK is expected, but APC Data Responses can continue to arrive until all captured data is sent, then the connection should be closed. If a failure occurs, the client should send an Error.

    -

    Disconnect Body

    -

    No Command Body. No ACK is expected, close the connection

    -

    Ping Body

    -

    No Command Body. Send an ACK Response

    -

    Response Format

    -

    Responses consist of a header followed by a body

    -

    Response Header

    -

    Identical to the Command Header but the Codes are different

    -

    - - - - - - - - - - - - - - - -
    NameTypeDescription
    Codeint8The type of command - - - - - - -
    1= XML
    3= APC Data
    4= ACK
    5= NAK
    0xFF= Error
    -
    LengthLittle Endian int32Number of bytes in the body

    -

    XML Body

    -

    XML, format is dependent on the Request see Request XML Body

    -

    APC Data Body

    -

    An APC Frame. If the length is zero, it is the End of Sequence message which indicates that all APC Frames have been transmitted to Streamline.

    -

    ACK Body

    -

    No Response Body. Indicates the Command was successful

    -

    NAK Body

    -

    Indicates a synchronous non-fatal error occurred when handling a request. Can contain a UTF-8 error message. The length is specified in the header, so no NULL character is expected. Indicates the Command failed. The connection can continue.

    -

    Error Body

    -

    Indicates a synchronous fatal error occurred when responding to a request. A UTF-8 error message. The length is specified in the header, so no NULL character is expected. The error is terminal and the connection must be closed. Errors may be sent asynchronously, ie without a request, but Streamline may not process them immediately.

    -

    XML

    -

    Events

    -

    Listing of all possible counters

    -

    events

    -

    The events root node of Events XML can have any number of counter_set and category child nodes

    -

    counter_set

    -

    The counter_set node has no children and the following attributes. Counter sets are used when the number of counters that can be enabled in a category is restricted. Streamline will respect the restriction and assign a name from the set to a counter in Configuration XML.

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    nameStringName of the counter_set
    countStringNumber of counters in the set. Counter names are derived by appending a number, starting at zero, to the set name. Ex, if the set name is ARM_Cortex-A8_cnt and the count is 4, then the counter names in the set are ARM_Cortex-A8_cnt0, ARM_Cortex-A8_cnt1, ARM_Cortex-A8_cnt2 and ARM_Cortex-A8_cnt3
    titleStringAppended to the title of the event when counter_set is a child of category, shown in Streamline before the name. Used to group counters.
    descriptionStringAppended to the description to show in Streamline when counter_set is a child of category. Used as the tooltip for the counter

    -

    category

    -

    The category node can have any number of event and option_set child nodes. It can also have one or more counter_set child nodes instead of the counter_set attribute if the same set of child event nodes show up for to multiple counter sets. The category node can have the following attributes

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    nameStringName of the category show in Streamline
    counter_setStringRequired if child event uses the event attribute and no child counter_set nodes are present, name of the related counter_set
    per_cpuBooleanDefaults to false, see the per_cpu attribute of the event node
    supports_event_based_samplingBooleanDefaults to false, see the supports_event_based_sampling attribute of the event node

    -

    option_set

    -

    The event node has one or more option child nodes and the following attributes. This is used when the same event is applicable for multiple devices

    -

    - - - - - - - - - - -
    NameTypeDescription
    nameStringThe name of this option_set

    -

    option

    -

    The option node has no children and the following attributes

    -

    - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    event_deltaHex IntegerThe offset to add to the applicable event to get the resulting event number
    nameStringThe device name to append to the event name
    descriptionStringThe device description to append to the event description

    -

    event

    -

    The event node has no children and the following attributes

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    counterStringRequired if event is not present, name of the counter
    eventHex IntegerRequired if counter is not present, hardware counter number
    option_setStringName of the option_set to use
    titleStringTitle of the event, shown in Streamline before the name. Used to group counters.
    nameStringName of the event, shown in Streamline after the title
    per_cpuBooleanIs true if this event is per cpu as opposed to global. Defaults to the per_cpu attribute of the category node
    supports_event_based_samplingBooleanIs true if this event supports event base sampling. Defaults to the supports_event_based_sampling attribute of the category node
    displayStringOptional, one of average, maximum, minimum, hertz, accumulate (Default). This is the same as adding .avg, .max, .min or .hz (accumulate is the default) to the counter name in the chart configuration panel in Streamline.
    unitsStringOptional, units to display in Streamline
    modifierIntegerOptional, number to divide read numbers by for fixed point math
    average_selectionBooleanOptional, Averages the values displayed by the Cross Section Marker in Streamline
    descriptionStringDescription to show in Streamline. Used as the tooltip for the counter

    -

    Example:

    -

    - <?xml version="1.0" encoding="UTF-8"?>
    - <events>
    -   <counter_set name="ARM_Cortex-A8_cnt" count="4"/>
    -   <category name="Cortex-A8" counter_set="ARM_Cortex-A8_cnt" per_cpu="yes" supports_event_based_sampling="yes">
    -     <event counter="ARM_Cortex-A8_ccnt" event="0xff" title="Clock" name="Cycles" display="hertz" units="Hz" average_selection="yes" description="The number of core clock cycles"/>
    -     <event event="0x0" title="Software" name="Increment" description="Incremented only on writes to the Software Increment Register"/>
    -     <event event="0x1" title="Cache" name="Instruction refill" description="Instruction fetch that causes a refill of at least the level of instruction or unified cache closest to the processor"/>
    -     <!-- ... -->
    -   </category>
    -   <category name="CCI-400" counter_set="cci-400_cnt" supports_event_based_sampling="yes">
    -     <event counter="cci-400_ccnt" event="0xff" title="CCI-400" name="Cycles" display="hertz" units="Hz" average_selection="yes" description="The number of core clock cycles"/>
    -     <option_set name="Slave">
    -       <option event_delta="0x0" name="S0" description="Slave interface 0"/>
    -       <option event_delta="0x20" name="S1" description="Slave interface 1"/>
    -       <option event_delta="0x40" name="S2" description="Slave interface 2"/>
    -       <!-- ... -->
    -     </option_set>
    -     <event event="0x0" option_set="Slave" title="CCI-400" name="Read: any" description="Read request handshake: any"/>
    -     <event event="0x1" option_set="Slave" title="CCI-400" name="Read: transaction" description="Read request handshake: device transaction"/>
    -     <event event="0x2" option_set="Slave" title="CCI-400" name="Read: normal" description="Read request handshake: normal, non-shareable or system-shareable, but not barrier or cache maintenance operation"/>
    -     <!-- ... -->
    -     <option_set name="Master">
    -       <option event_delta="0xa0" name="M0" description="Master interface 0"/>
    -       <option event_delta="0xc0" name="M1" description="Master interface 1"/>
    -       <option event_delta="0xe0" name="M2" description="Master interface 2"/>
    -       <!-- ... -->
    -     </option_set>
    -     <event event="0x14" option_set="Master" title="CCI-400" name="Retry fetch" description="RETRY of speculative fetch transaction"/>
    -     <event event="0x15" option_set="Master" title="CCI-400" name="Read stall: address hazard" description="Read request stall cycle because of an address hazard"/>
    -     <event event="0x16" option_set="Master" title="CCI-400" name="Read stall: ID hazard" description="Read request stall cycle because of an ID hazard"/>
    -     <!-- ... -->
    -   </category>
    -   <category name="Mali GPU Fragment Processor">
    -     <counter_set name="ARM_Mali-400_FP0_cnt" title="Mali-400 FP0" description="Mali GPU Fragment Processor 0" count="2"/>
    -     <counter_set name="ARM_Mali-400_FP1_cnt" title="Mali-400 FP1" description="Mali GPU Fragment Processor 1" count="2"/>
    -     <counter_set name="ARM_Mali-400_FP2_cnt" title="Mali-400 FP2" description="Mali GPU Fragment Processor 2" count="2"/>
    -     <!-- ... -->
    -     <event event="0x0" title="Mali-400 FP" name="Active clock cycles" description="Active clock cycles, between polygon start and IRQ."/>
    -     <event event="0x2" title="Mali-400 FP" name="Total bus reads" description="Total number of 64-bit words read from the bus."/>
    -     <event event="0x3" title="Mali-400 FP" name="Total bus writes" description="Total number of 64-bit words written to the bus."/>
    -     <!-- ... -->
    -   </category>
    -   <category name="Linux">
    -     <event counter="Linux_irq_softirq" title="Interrupts" name="SoftIRQ" per_cpu="yes" description="Linux SoftIRQ taken"/>
    -     <event counter="Linux_irq_irq" title="Interrupts" name="IRQ" per_cpu="yes" description="Linux IRQ taken"/>
    -     <event counter="Linux_block_rq_wr" title="Disk IO" name="Write" units="B" description="Disk IO Bytes Written"/>
    -     <!-- ... -->
    -   </category>
    -   <category name="hwmon">
    -     <event counter="hwmon_ab8500-isa-0000_0" title="Temperature" name="ext_rtc_xtal" display="average" units="C" modifier="1000" average_selection="yes" description="libsensors Temperature sensor ext_rtc_xtal (hwmon_ab8500-isa-0000_0)"/>
    -     <event counter="hwmon_ab8500-isa-0000_1" title="Temperature" name="ext_db8500" display="average" units="C" modifier="1000" average_selection="yes" description="libsensors Temperature sensor ext_db8500 (hwmon_ab8500-isa-0000_1)"/>
    -     <event counter="hwmon_ab8500-isa-0000_2" title="Temperature" name="bat_temp" display="average" units="C" modifier="1000" average_selection="yes" description="libsensors Temperature sensor bat_temp (hwmon_ab8500-isa-0000_2)"/>
    -     <!-- ... -->
    -   </category>
    - </events> -

    -

    Configuration

    -

    List of counters that are currently enabled. Can include counters not available on the target which will be ignored

    -

    configurations

    -

    The configurations root node of Configuration XML can have any number of configuration child nodes and has the following attribute

    -

    - - - - - - - - - - -
    NameTypeDescription
    revisionInteger2

    -

    configuration

    -

    The configuration node has no children and has the following attributes

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    counterStringSee the counter attribute of the event node. Required, unique. If Events XML did not have a counter for this event, a counter from the related counter_set can be taken, see the description of counter_set in Events XML
    eventHex IntegerSee the event attribute of the event node, set if it was set in Events XML
    titleStringSee the title attribute of the event node
    nameStringSee the name attribute of the event node
    per_cpuBooleanSee the per_cpu attribute of the event node
    supports_event_based_samplingBooleanSee the supports_event_based_sampling attribute of the event node
    countIntegerOptional. How many samples to collect before the event is triggered
    displayStringSee the display attribute of the event node
    unitsStringSee the units attribute of the event node
    modifierIntegerSee the modifier attribute of the event node
    average_selectionBooleanSee the average_selection attribute of the event node
    descriptionStringSee the description attribute of the event node

    -

    Example:

    -

    - <?xml version="1.0" encoding="US-ASCII"?>
    - <configurations revision="2">
    -   <configuration counter="ARM_Cortex-A8_ccnt" event="0xFF" title="Clock" name="Cycles" per_cpu="yes" supports_event_based_sampling="yes" display="hertz" units="Hz" average_selection="yes" description="The number of core clock cycles"/>
    -   <configuration counter="ARM_Cortex-A8_cnt0" event="0x8" title="Instruction" name="Executed" per_cpu="yes" supports_event_based_sampling="yes" description="Instruction architecturally executed"/>
    -   <configuration counter="ARM_Cortex-A8_cnt1" event="0x44" title="Cache" name="L2 miss" per_cpu="yes" supports_event_based_sampling="yes" description="Any cacheable miss in the L2 cache"/>
    -   <configuration counter="ARM_Cortex-A8_cnt2" event="0x43" title="Cache" name="L1 miss" per_cpu="yes" supports_event_based_sampling="yes" description="Any accesses to the L2 cache"/>
    -   <configuration counter="ARM_Cortex-A8_cnt3" event="0x10" title="Branch" name="Mispredicted" per_cpu="yes" supports_event_based_sampling="yes" description="Branch mispredicted or not predicted"/>
    -   <configuration counter="ARM_Cortex-A9_ccnt" event="0xFF" title="Clock" name="Cycles" per_cpu="yes" supports_event_based_sampling="yes" display="hertz" units="Hz" average_selection="yes" description="The number of core clock cycles"/>
    -   <configuration counter="ARM_Cortex-A9_cnt0" event="0x68" title="Instruction" name="Executed" per_cpu="yes" supports_event_based_sampling="yes" description="Counts the number of instructions going through the Register Renaming stage. This number is an approximate number of the total number of instructions speculatively executed, and even more approximate of the total number of instructions architecturally executed"/>
    -   <configuration counter="ARM_Cortex-A9_cnt1" event="0x6" title="Instruction" name="Memory read" per_cpu="yes" supports_event_based_sampling="yes" description="Memory-reading instruction architecturally executed"/>
    -   <configuration counter="ARM_Cortex-A9_cnt2" event="0x7" title="Instruction" name="Memory write" per_cpu="yes" supports_event_based_sampling="yes" description="Memory-writing instruction architecturally executed"/>
    -   <configuration counter="ARM_Cortex-A9_cnt3" event="0x3" title="Cache" name="Data refill" per_cpu="yes" supports_event_based_sampling="yes" description="Memory Read or Write operation that causes a refill of at least the level of data or unified cache closest to the processor"/>
    -   <configuration counter="ARM_Cortex-A9_cnt4" event="0x4" title="Cache" name="Data access" per_cpu="yes" supports_event_based_sampling="yes" description="Memory Read or Write operation that causes a cache access to at least the level of data or unified cache closest to the processor"/>
    -   <configuration counter="Linux_block_rq_wr" title="Disk IO" name="Write" units="B" description="Disk IO Bytes Written"/>
    -   <configuration counter="Linux_block_rq_rd" title="Disk IO" name="Read" units="B" description="Disk IO Bytes Read"/>
    -   <configuration counter="Linux_meminfo_memused" title="Memory" name="Used" display="maximum" units="B" average_selection="yes" description="Total used memory size"/>
    -   <configuration counter="Linux_meminfo_memfree" title="Memory" name="Free" display="minimum" units="B" average_selection="yes" description="Available memory size"/>
    -   <configuration counter="Linux_power_cpu_freq" title="Clock" name="Frequency" per_cpu="yes" display="maximum" units="Hz" average_selection="yes" description="Frequency setting of the CPU"/>
    -   <configuration counter="cci-400_cnt0" event="0xB4" title="CCI-400" name="Retry fetch (M0)" supports_event_based_sampling="yes" description="RETRY of speculative fetch transaction"/>
    -   <configuration counter="cci-400_cnt1" event="0xD4" title="CCI-400" name="Retry fetch (M1)" supports_event_based_sampling="yes" description="RETRY of speculative fetch transaction"/>
    -   <configuration counter="cci-400_cnt2" event="0xB5" title="CCI-400" name="Read stall: address hazard (M0)" supports_event_based_sampling="yes" description="Read request stall cycle because of an address hazard"/>
    -   <configuration counter="hwmon_arm,vexpress-amp-isa-0011_0" title="Current" name="A7 Icore" display="average" units="A" modifier="1000" average_selection="yes" description="libsensors Current sensor A7 Icore (hwmon_arm,vexpress-amp-isa-0011_0)"/>
    -   <configuration counter="hwmon_arm,vexpress-amp-isa-0010_0" title="Current" name="A15 Icore" display="average" units="A" modifier="1000" average_selection="yes" description="libsensors Current sensor A15 Icore (hwmon_arm,vexpress-amp-isa-0010_0)"/>
    - </configurations> -

    -

    Counters

    -

    Listing of counters available on the target

    -

    counters

    -

    The counters root node of Counters XML can have any number of counter child nodes

    -

    counter

    -

    The counter node has the following attribute

    -

    - - - - - - - - - - -
    NameTypeDescription
    nameStringAvailable counter name from the counter_set node or the counter attribute of the event node

    -

    Example:

    -

    - <?xml version="1.0" encoding="utf-8"?>
    - <counters>
    -   <counter name="Linux_power_cpu_idle"/>
    -   <counter name="Linux_power_cpu_freq"/>
    -   <counter name="Linux_sched_switch"/>
    -   <counter name="ARM_Cortex-A8_cnt3"/>
    -   <counter name="ARM_Cortex-A8_cnt2"/>
    -   <counter name="ARM_Cortex-A8_cnt1"/>
    -   <counter name="ARM_Cortex-A8_cnt0"/>
    -   <counter name="ARM_Cortex-A8_ccnt"/>
    -   <counter name="Linux_net_tx"/>
    -   <counter name="Linux_net_rx"/>
    -   <counter name="mmaped_cnt2"/>
    -   <counter name="mmaped_cnt1"/>
    -   <counter name="mmaped_cnt0"/>
    -   <counter name="Linux_meminfo_bufferram"/>
    -   <counter name="Linux_meminfo_memused"/>
    -   <counter name="Linux_meminfo_memfree"/>
    -   <counter name="Linux_irq_softirq"/>
    -   <counter name="Linux_irq_irq"/>
    -   <counter name="Linux_block_rq_rd"/>
    -   <counter name="Linux_block_rq_wr"/>
    - </counters> -

    -

    Session

    -

    XML representing generated by Streamline representing the Capture & Analysis Options dialog. Must be sent by Streamline before it's requested by Streamline. Send back the received XML.

    -

    session

    -

    The session root node of Session XML can have any number of image child nodes, zero or one energy_capture child nodes and has the following attributes

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    versionInteger1
    call_stack_unwindingBooleanIf Call Stack Unwinding is selected
    parse_debug_infoBooleanIf Process Debug Information is selected
    high_resolutionBooleanIf High Resolution Timeline is selected
    buffer_modeStringOne of streaming, small, normal or large
    sample_rateStringOne of normal, low, none
    durationIntegerDuration of the capture in seconds
    target_hostStringTarget address
    target_portIntegerTarget port
    live_rateStringOptional, how often in milliseconds the Counter, Block Counter and Scheduler Trace Frames should be flushed for Live

    -

    image

    -

    The image node has no child nodes and the following attributes

    -

    - - - - - - - - - - - - - - - -
    NameTypeDescription
    pathStringProgram Image. Used during local capture where images may be copied into the .apc folder. Can be updated in Streamline post-capture.
    enabledBooleanDefaults to false, is the Program Image is enabled

    -

    energy_capture

    -

    The energy_capture node can have zero or more channel child nodes and the following attributes

    -

    - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    versionInteger1
    command_pathStringFull path to the caiman executable
    typeStringOne of none, energy_probe or nidaq

    -

    channel

    -

    The channel node has no child nodes and the following attributes

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    idIntegerChannel number
    resistanceIntegerChannel resistance
    powerBooleanTrue if power data is to be collected and displayed
    voltageBooleanTrue if voltage data is to be collected and displayed
    currentBooleanTrue if current data is to be collected and displayed

    -

    Example:

    -

    - <?xml version="1.0" encoding="US-ASCII"?>
    - <session version="1" call_stack_unwinding="yes" parse_debug_info="yes" high_resolution="no" buffer_mode="streaming" sample_rate="low" duration="0" target_host="10.99.3.109" target_port="8080" live_rate="100">
    -   <image path="H:\ls"/>
    -   <image path="H:\libc.so.6"/>
    -   <energy_capture version="1" command_path="C:\Program Files (x86)\DS-5\bin\caiman.exe" type="none">
    -     <channel id="0" resistance="20" power="yes" voltage="yes" current="yes"/>
    -   </energy_capture>
    - </session> -

    -

    Captured

    -

    Information about a capture session. This is very similar to Configuration XML

    -

    captured

    -

    The captured root node of Captured XML has one target child node, one counters child node and the following attributes

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    versionInteger1
    live_energy_deltaIntegerThis attribute is added by Streamline
    createdIntegerCapture date in seconds since the epoch (midnight January 1, 1970 UTC). Gator populates this attribute for a local capture, otherwise Streamline adds this attribute.
    protocolInteger13

    -

    target

    -

    The target node as no children and the following attributes

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    nameStringTarget name
    sample_rateIntegerNumber of samples collected per second
    coresIntegerNumber of cores on the target
    cpuidHex Integercpuid of a core, ex: 0xc08

    -

    counters

    -

    The counters node can have any number of counter child nodes

    -

    counter

    -

    The counter node has the following attributes

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    titleStringSee the title attribute of the event node
    nameStringSee the name attribute of the event node
    colorHex IntegerColor in Streamline
    keyHex IntegerKey for this counter in the APC data
    typeStringSee the counter attribute of the configuration node
    eventHex IntegerSee the event attribute of the configuration node
    per_cpuBooleanSee the per_cpu attribute of the event node
    countIntegerCan only be set on one counter. See the count attribute of the configuration node
    displayStringSee the display attribute of the event node
    unitsStringSee the units attribute of the event node
    modifierIntegerSee the modifier attribute of the event node
    average_selectionBooleanSee the average_selection attribute of the event node
    descriptionStringSee the description attribute of the event node

    -

    Example:

    -

    - <?xml version="1.0" encoding="utf-8"?>
    - <captured version="1" created="1361467764" protocol="13">
    -   <target name="ARM-Versatile Express" sample_rate="100" cores="5" cpuid="0xc0f"/>
    -   <counters>
    -     <counter title="Branch" name="Mispredicted" key="0x3" type="ARM_Cortex-A7_cnt1" event="0x10" per_cpu="yes" description="Branch mispredicted or not predicted"/>
    -     <counter title="Cache" name="L2 data access" key="0x4" type="ARM_Cortex-A7_cnt2" event="0x16" per_cpu="yes" description="Level 2 data cache access"/>
    -     <counter title="Clock" name="Cycles" key="0x1" type="ARM_Cortex-A7_ccnt" event="0xff" per_cpu="yes" display="hertz" units="Hz" average_selection="yes" description="The number of core clock cycles"/>
    -     <counter title="Instruction" name="Executed" key="0x2" type="ARM_Cortex-A7_cnt0" event="0x8" per_cpu="yes" description="Instruction architecturally executed"/>
    -     <counter title="Clock" name="Frequency" key="0x15" type="Linux_power_cpu_freq" event="0x0" per_cpu="yes" display="maximum" units="Hz" average_selection="yes" description="Frequency setting of the CPU"/>
    -     <counter title="Disk IO" name="Read" key="0x9" type="Linux_block_rq_rd" event="0x0" units="B" description="Disk IO Bytes Read"/>
    -     <counter title="Disk IO" name="Write" key="0x8" type="Linux_block_rq_wr" event="0x0" units="B" description="Disk IO Bytes Written"/>
    -     <counter title="Memory" name="Free" key="0xc" type="Linux_meminfo_memfree" event="0x0" display="minimum" units="B" average_selection="yes" description="Available memory size"/>
    -     <counter title="Memory" name="Used" key="0xd" type="Linux_meminfo_memused" event="0x0" display="maximum" units="B" average_selection="yes" description="Total used memory size"/>
    -     <counter title="Network" name="Receive" key="0x12" type="Linux_net_rx" event="0x0" units="B" description="Receive network traffic, including effect from Streamline"/>
    -     <counter title="Network" name="Transmit" key="0x13" type="Linux_net_tx" event="0x0" units="B" description="Transmit network traffic, including effect from Streamline"/>
    -   </counters>
    - </captured> -

    -

    APC Frame Format

    -

    Overview

    -

    The XML files and .apc data (ten-digit files with no extension starting with 0000000000) collected by Streamline are placed in an .apc folder. When Streamline processes this folder, it creates a 'db' folder followed by a separate .apd folder. When creating a new report from the same .apc folder, Streamline will not regenerate the 'db' folder, even if the .apc data has changed. In other words, the .apc data is ignored if a valid 'db' folder exists. In order to ensure that Streamline generates a new report from the .apc data, delete the 'db' folder so Streamline will recreate it from the .apc data files.

    -

    Types

    -
    -
    int32
    4-byte signed little endian
    -
    packed32
    variable length packed 4-byte signed value, see Packed Values
    -
    packed64
    variable length packed 8-byte signed value, see Packed Values
    -
    string
    A packed32 length followed by the specified number of characters
    -
    #
    A constant packed32 value of #, ex: 5 is the packed32 number 5
    -
    timestamp
    packed64 time value in nanoseconds relative to the uptime from the Summary Message
    -
    -

    Packed Values

    -

    Integers are packed to reduce their size by avoiding sending high unset bits. The value is split into 7 bit bytes in little endian order. The most significant byte is set to 1 if there is a subsequent byte for this value or 0 if it is the last byte. This is very similar to unsigned LEB128 used in DWARF.

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    BitsLast valueByte 1Byte 2Byte 3Byte 4Byte 5
    70x7F0XXXXXXXb
    140x3FFF1XXXXXXXb0XXXXXXXb
    210x1FFFFF1XXXXXXXb1XXXXXXXb0XXXXXXXb
    280xFFFFFFF1XXXXXXXb1XXXXXXXb1XXXXXXXb0XXXXXXXb
    320xFFFFFFFF1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb0000XXXXb

    -

    For example, 0x68D4D (1101000110101001101b) would be encoded as 0xCD (11001101b) 0x9A (10011010b) 0x1A (00011010b)

    -

    Packed 64 bit values are similar.

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    BitsLast valueByte 1Byte 2Byte 3Byte 4Byte 5Byte 6Byte 7Byte 8Byte 9Byte 10
    70x7F0XXXXXXXb
    140x3FFF1XXXXXXXb0XXXXXXXb
    210x1FFFFF1XXXXXXXb1XXXXXXXb0XXXXXXXb
    280xFFFFFFF1XXXXXXXb1XXXXXXXb1XXXXXXXb0XXXXXXXb
    350x7FFFFFFFF1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb0XXXXXXXb
    420x3FFFFFFFFFF1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb0XXXXXXXb
    490x1FFFFFFFFFFFF1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb0XXXXXXXb
    560xFFFFFFFFFFFFFF1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb0XXXXXXXb
    630x7FFFFFFFFFFFFFFF1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb0XXXXXXXb
    640xFFFFFFFFFFFFFFFF1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb0000000Xb

    -

    For example, 0xBDF5FFD4E449593A would be encoded as 0xBA 0xB2 0xA5 0xA2 0xCE 0xFA 0xFF 0xFA 0xBD 0x01.

    -

    Frames consist of a header followed by a body of zero or more type specific messages

    -

    Ordering

    -

    The order of messages in a frame is significant and must be preserved. However the order of the frames is not important and will be resolved by Streamline.

    -

    Required Messages

    -

    To generate a valid capture at least one Sched Switch, Counter or Block Counter message must be present. All other messages are optional.

    -

    Frame Header

    -

    - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Lengthint32Number of bytes after the length in the frame
    Codepacked32Indicates the type of this frame. - - - - - - - - - - -
    1= Summary
    2= Backtrace
    3= Name
    4= Counter
    5= Block Counter
    6= Annotate
    7= Sched Trace
    8= GPU Trace
    9= Idle
    -
    Corepacked32The processor that originated the messages in the frame. This field must always be present but is ignored for Summary, Counter, Annotate, GPU Trace and Idle Frames as these frames can have messages from multiple cores.

    -

    If there are multiple message types for a frame, each message will start with an unique code

    -

    Summary Frame Messages

    -

    The summary frame will appear only once and have only have one message. It is recommended that this is the first frame sent to Streamline so the Newline Canary can be checked for correctness before any other processing occurs.

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Newline CanarystringAlways "1\n2\r\n3\r4\n\r5"
    Timestamppacked64Current system time in nanoseconds since the epoch (midnight January 1, 1970 UTC) or 0 if the target does not have system time
    Uptimepacked64How long the system has been running in nanoseconds - not affected by external influences like changing the system time, ntp, hibernating, etc... Can be used to reference kernel log messages. If the target does not support uptime, send 0 and use a monotonically increasing timer for the timestamp messages.
    unamestringsystem information string similar to the output of uname -a

    -

    Backtrace Frame Messages

    -

    This is used to populate the Call Paths tab

    -
      -
    • Exec cookie vs Offset cookie -
      • If a sample occurs in libx.so called by my-app, the exec cookie is my-app and the offset cookie is libx.so
      -
    • -
    -

    Cookies should be positive. The special values 0 indicates kernel or idle, -1 indicate an invalid cookie and 1 is reserved to avoid confusion with End of Message, 1 below.

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Timestamptimestamp 
    Exec Cookiepacked32Cookie of the current process
    pidpacked32Process ID (in Linux this is the Thread Group ID)
    tidpacked32Thread ID (in Linux this is the PID)
    InKernelpacked32 - - - -
    0= not in kernel
    1= in kernel
    -
    Body  - One or more repetitions of the following: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Offset Cookiepacked32Executable or library at the offset
    Offsetpacked64Offset in the backtrace
    -
    End of Message1 

    -

    Name Frame Messages

    -

    Cookie Name Message

    -

    This is used to get the name for the Process Handle. Cookies are stored in a pseudo hashmap which limits the number of possible collisions, thus duplicate cookies may be emitted. In addition, cookies are stored per core, thus when a task migrates to a new core, a fresh cookie may be emitted for that core. However cookies are unique across all cores.

    -

    - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code1 
    Cookiepacked32Cookie key
    NamestringCookie value

    -

    Thread Name Message

    -

    This is used to show thread names in the Thread Disclosure. Thread names are stored in a pseudo hashmap which to limit the number of times the name is sent, but duplicate thread names may be emitted. Thread numbers can be reused as long as the context switch process free event is sent before it is reused.

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code2 
    Timestamptimestamp 
    Thread IDpacked32tid of the named thread
    NamestringName of the thread

    -

    Core Name Message

    -

    This is used to identify clusters and in the tooltip in X-Ray mode

    -

    - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code3 
    cpuidpacked32cpuid of this core, ex: 0xc08
    NamestringHuman readable name of this core, ex: Cortex-A8

    -

    Counter Frame Messages

    -

    This is used to populate Charts in the Timeline view

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Timestamptimestamp 
    Corepacked32Core the counter applies to
    Keypacked32Key in Captured XML
    Valuepacked64Value of the specified counter

    -

    Block Counter Frame Messages

    -

    Block counters are the same as counters, but used less space when multiple counters are sampled at the same timestamp and on the same core. To start the block, the key of 0 and a timestamp value is emitted. Then any counters sampled at that time are emitted. A block of counters (counters using the same timestamp) must all be emitted in the same frame, ie. the first block counter message emitted in a frame must be the timestamp.

    -

    - - - - - - - - - - - - - - - -
    NameTypeDescription
    Keypacked32Zero for timestamp or key in Captured XML
    Valuepacked64Value of the specified counter

    -

    Annotate Frame Messages

    -

    Annotations are messages sent by arbitrary userspace programs, so their format is different from other messages.

    -

    A single annotation may be broken across frame boundaries. This is why the Annotation Message has a size and the Userspace Annotations either have a size or are '\n' terminated.

    -

    To colorize any ASCII string within the annotation data, prefix the string with 0x1B (escape character) followed by a 3-byte RGB value

    -

    Annotate Message

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Corepacked32 
    tidpacked32Thread ID (in Linux this is the PID)
    Timestamptimestamp 
    Sizepacked32Message size
    Body Userspace Annotation data fragment

    -

    Userspace Annotations

    -

    Annotations belong to a channel with 0 being the default channel. Channels belong to groups with 0 as the default group.

    -

    ASCII String Annotation

    -

    This is used to add a line in the Log tab. Can also be sent from the command line, ex: echo 'Hello World' > /dev/gator/annotate

    -

    - - - - - - - - - - - - - - - -
    NameTypeDescription
    ColorcolorOptional, 0x1B, RR, GG, BB
    ASCII Stringzero or more ASCII characters followed by '\n'Text annotation

    -

    Create Group Annotation

    -

    This is used to name a group in the Thread Disclosure

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Escape Code0x1C 
    Marker Code0x8 
    GroupLittle Endian int32 
    String LengthLittle Endian int16 
    UTF-8 StringString Length UTF-8 bytesChannel name

    -

    Create Channel Annotation

    -

    This is used to name a channel in the Thread Disclosure

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Escape Code0x1C 
    Marker Code0x7 
    ChannelLittle Endian int32 
    GroupLittle Endian int32Group the channel belongs to
    String LengthLittle Endian int16 
    UTF-8 StringString Length UTF-8 bytesChannel name

    -

    UTF-8 String Annotations

    -

    This is used to add a line in the Log tab.

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Escape Code0x1C 
    Marker Code0x6 
    ChannelLittle Endian int32Channel the annotation belongs to
    String LengthLittle Endian int16 
    ColorcolorOptional, 0x1B, RR, GG, BB, counts against String Length
    UTF-8 StringString Length UTF-8 bytesText annotation

    -

    Visual Annotation

    -

    This is used to add a line in the Log tab and an image to the Visual Annotation Chart.

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Escape Code0x1C 
    Visual Code0x4 
    String LengthLittle Endian int16 
    UTF-8 StringString Length UTF-8 bytesText annotation
    Image LengthLittle Endian int32 
    Image DataImage Length bytes 

    -

    Marker Annotation

    -

    This is used to add a Bookmark

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Escape Code0x1C 
    Marker Code0x5 
    String LengthLittle Endian int16 
    ColorcolorOptional, 0x1B, RR, GG, BB, counts against String Length
    UTF-8 StringString Length UTF-8 bytesText annotation

    -

    Scheduler Trace Frame Messages

    -

    As with Backtrace Frame Messages, the cookies should be positive. The special cookie value 0, in conjunction of a pid of 0, indicates kernel. A cookie value of 0 and a pid of 1 indicates idle.

    -

    Sched Switch

    -

    This is used to populate the CPU Activity Chart and the Heat Map

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code1 
    Timestamptimestamp 
    pidpacked32Process ID (in Linux this is the Thread Group ID)
    tidpacked32Thread ID (in Linux this is the PID)
    Cookiepacked32Cookie of the current process
    Statepacked32State - - - - - -
    0= Waiting on other event besides I/O
    1= Contention/pre-emption
    2= Waiting on I/O
    3= Waiting on mutex
    -

    -

    Sched Thread Exit

    -

    This is used by the Heat Map to identify when a process terminates

    -

    - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code2 
    Timestamptimestamp 
    tidpacked32Thread ID (in Linux this is the PID)

    -

    GPU Trace Frame Messages

    -

    GPU Start

    -

    This is used to indicate a part of the GPU has begun execution

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code1 
    Timestamptimestamp 
    Unitpacked32GPU Unit
    Corepacked32GPU Unit Core
    pidpacked32Process ID (in Linux this is the Thread Group ID)
    tidpacked32Thread ID (in Linux this is the PID)

    -

    GPU Stop

    -

    This is used to indicate a part of the GPU has ceased execution

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code2 
    Timestamptimestamp 
    Unitpacked32GPU Unit
    Corepacked32GPU Unit Core

    -

    Idle Frame Messages

    -

    Enter Idle

    -

    This is used to indicate that a core has ceased execution.

    -

    - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code1 
    Timestamptimestamp 
    Corepacked32 

    -

    Exit Idle

    -

    This is used to indicate that a core has resumed execution.

    -

    - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code2 
    Timestamptimestamp 
    Corepacked32 

    -

    Sequence Diagrams

    -

    Configuration

    -

    Here are the events that occur when the Counter Configuration button is clicked in Streamline. Below are the events that occur when various buttons are pressed in the dialog where $VER is 13

    -
    -

    When the Load Defaults button is clicked from the Counter Configuration dialog

    -
    -

    When the Cancel or close button is clicked from the Counter Configuration dialog, after which the dialog closes

    -
    -

    When the Save button is clicked from the Counter Configuration dialog, after which the dialog closes

    -
    -

    Capture

    -

    Here are the events that occur when the Start Capture button is clicked in Streamline where $VER is 13

    -
    -

    At any point during the capture Streamline can send a ping to verify that the host is still running. If the ping is not acknowledged Streamline will end the capture

    -
    -

    Local Capture

    -

    Streamline also support a local capture mode where data is collected without interaction with Streamline. In this case the Target-Host Protocol is omitted. Instead a directory, ending in .apc, is provided to Streamline. This directory contains captured.xml containing the Captured XML, session.xml containing the Session XML and 0000000000 which contains the APC Data with one or more structures of the following format

    -

    - - - - - - - - - - - - - - - - -
    NameTypeDescription
    LengthLittle Endian int32Number of bytes in the body
    bodyAPC Data 

    -
    - - diff --git a/protocol/gator/gator_protocol-5-15.html b/protocol/gator/gator_protocol-5-15.html deleted file mode 100644 index dc38bdc0..00000000 --- a/protocol/gator/gator_protocol-5-15.html +++ /dev/null @@ -1,2013 +0,0 @@ - - - - - - - - -
    -

    Gator v14 (DS-5 v5.15) Protocol

    -

    Index

    -
  • - Introduction -
  • -
  • Changes in v14 (DS-5 v5.15)
  • -
  • Changes in v13 (DS-5 v5.14)
  • -
  • - Target-Host Protocol - -
  • -
  • - Response Format - -
  • -
  • - XML - -
  • -
  • - APC Frame Format - -
  • -
  • - Sequence Diagrams - -
  • -
  • - Local Capture -
  • -

    Introduction

    -

    This document describes the TCP/IP protocol used by gator or other implementing clients to communicate with Streamline version 5.15 or later. Use this information to build a customized client to communicate profiling data to Streamline. The gator source code, distributed as part of DS-5, is the reference implementation of this protocol. The protocol may change with future releases of Streamline, but Streamline will maintain backwards compatibility with this version of the protocol so that clients need only implement one version of the protocol. Streamline requires that your client is able to parse and generate simple XML and ignore additional or unexpected nodes or attributes. Because the XML features described in this protocol documentation are the only ones used, Streamline does not require the more complex features of XML.

    -

    Changes in v14 (DS-5 v5.15)

    -

    gator v14, the version of gator shipped with Streamline version 5.15, has a few important updates that you should familiarize yourself with before implementing or updating your own customized Streamline TCP/IP protocol.

    - -

    Changes in v13 (DS-5 v5.14)

    -

    The following changes have been made in v13 (DS-5 v5.14)

    - -

    Target-Host Protocol

    -

    Magic Exchange

    -

    A handshake is required so that your target and client can recognize each other. It consists of ASCII newline (\n) delimited strings. If the client receives a string it does not recognize, the string must be discarded and another string is read.

    -

    The standard Streamline client is gator. But, as you can customize gator and call it what you wish, the term client is used generically to refer to your customized protocol.

    -
      -
    1. The client receives Streamlines highest supported protocol version VERSION $VER\n, for example if Streamline supports up to version 23, the client would recieve VERSION 23\n.
    2. -
    3. The client receives STREAMLINE\n
    4. -
    5. Send GATOR 14\n
    6. -
    -

    Further communication from Streamline comes as Commands

    -

    Command Header

    -

    Streamline issues commands that consist of a header and a body. Streamline expects a Response to these commands from the client.

    -

    - - - - - - - - - - - - - - - -
    NameTypeDescription
    Codeint8The type of command - - - - - - - -
    0= Request XML
    1= Deliver XML
    2= APC Start
    3= APC Stop
    4= Disconnect
    5= Ping
    -
    LengthLittle Endian int32Number of bytes in the body

    -

    If the client receives an unrecognized command, it should respond with a NAK.

    -

    Request XML Body

    -

    Command code 0 is a request from Streamline for XML. The root node is request and it has the type attribute that tells the client which xml is required. For example, this is a request for Events XML

    -

    - <?xml version="1.0" encoding="US-ASCII"?>
    - <request type="events">
    - </request> -

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    RequestResponse CodeResponse Body
    <request type="events">XMLEvents XML
    <request type="configuration">XMLConfiguration XML
    <request type="counters">XMLCounters XML
    <request type="captured">XMLCaptured XML Streamline requests Captured XML prior to starting a capture.
    <request type="defaults">XMLdefault Configuration XML

    -

    Deliver XML Body

    -

    The Deliver XML command sends XML to the client:

    -

    - - - - - - - - - - - - -
    RequestResponse Code
    Session XMLACK
    Configuration XMLACK

    -

    APC Start Body

    -

    The APC Start command does not have a body. This command initiates a capture and readies Streamline to receive APC Data Responses. No ACK is expected and no further XML exchange takes place. If a failure occurs, the client should send an Error.

    -

    APC Stop Body

    -

    The APC Stop command also does not have a body. This command triggers the end of the APC and no ACK is expected. APC Data Responses can continue to arrive until all captured data is sent, then the connection should be closed. If a failure occurs, the client should send an Error.

    -

    Disconnect Body

    -

    The Disconnect command, which closes the connection to the target, does not contain a command body. No ACK is expected.

    -

    Ping Body

    -

    The Ping command does not have a body. Send an ACK response to this command.

    -

    Response Format

    -

    Responses consist of a header followed by a body

    -

    Response Header

    -

    The format for the response header is identical to that of the Command Header but the Codes are different

    -

    - - - - - - - - - - - - - - - -
    NameTypeDescription
    Codeint8The type of command - - - - - - -
    1= XML
    3= APC Data
    4= ACK
    5= NAK
    0xFF= Error
    -
    LengthLittle Endian int32Number of bytes in the body

    -

    XML Body

    -

    The body should contain XML, the format of which is dependent on the Request type. For a list of types, see Request XML Body

    -

    APC Data Body

    -

    The APC body should contain an APC Frame. If the length is zero, it is the End of Sequence message which indicates that all APC Frames have been transmitted to Streamline.

    -

    ACK Body

    -

    This response, which indicates the Command was successful, does not have a response body.

    -

    NAK Body

    -

    Indicates a synchronous non-fatal error occurred when handling a request. It can contain a UTF-8 error message. The length is specified in the header, so no NULL character is expected. Indicates that the Command failed, but that the connection can continue.

    -

    Error Body

    -

    Indicates a synchronous fatal error occurred when responding to a request. A UTF-8 error message. The length is specified in the header, so no NULL character is expected. Use this response when the error is terminal and the connection must be closed. Errors may be sent without a request, but Streamline may not process them immediately.

    -

    XML

    -

    Events

    -

    The Events XML defines the list of counters that you can choose from in the Counter Configuration dialog box. Modify this list to create your own custom counters.

    -

    events

    -

    The events root node of Events XML can have any number of counter_set and category child nodes.

    -

    counter_set

    -

    The counter_set node has no children and the following attributes. Counter sets are used when the number of counters that can be enabled in a category is restricted. Streamline will respect the restriction and assign a name from the set to a counter in Configuration XML.

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    nameStringName of the counter_set
    countStringNumber of counters in the set. Counter names are derived by appending a number, starting at zero, to the set name. Ex, if the set name is ARM_Cortex-A8_cnt and the count is 4, then the counter names in the set are ARM_Cortex-A8_cnt0, ARM_Cortex-A8_cnt1, ARM_Cortex-A8_cnt2 and ARM_Cortex-A8_cnt3
    titleStringAppended to the title of the event when counter_set is a child of category, shown in Streamline before the name. Used to group counters.
    descriptionStringThe value of this attribute is appended to the description to show in Streamline when counter_set is a child of category. Used as the tooltip for the counter

    -

    category

    -

    The category node can have any number of event and option_set child nodes. It can also have one or more counter_set child nodes instead of the counter_set attribute if the same set of child event nodes show up for to multiple counter sets. The category node can have the following attributes:

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    nameStringThe name of the category. The value given here appears as the category name in the Counter Configuration dialog box in Streamline.
    counter_setStringDefines the counter_set to be used. You must use this attribute if any child event uses the event attribute and there are no child counter_set nodes present.
    per_cpuBooleanDefines whether or not Streamline collects data on a per cpu basis. Set this value to yes and Streamline collects data from each cpu separately for these counters. The default value is no.
    supports_event_based_samplingBooleanUse yes or no to define whether or not the counters in this category can be used for event based sampling. The default value is no.

    -

    option_set

    -

    The event node has one or more option_set child nodes and the following attributes. Use this node when the same event applies to multiple devices. It has the following attributes:

    -

    - - - - - - - - - - -
    NameTypeDescription
    nameStringThe name of this option_set

    -

    option

    -

    The option_set node contains one or more option child nodes. The option node has no children and the following attributes

    -

    - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    event_deltaHex IntegerThe offset to add to the applicable event to get the event number.
    nameStringThe name of the device. The value of name is appended to the event name.
    descriptionStringA description of the device option. This description is appended to the event description.

    -

    event

    -

    The event node has no children and the following attributes

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    counterStringEvery event element must have either the counter or event attribute defined. Use the counter attribute for fixed counter types, like cycle count. Use the event attribute for all other events. The counter attribute is the name of the counter.
    eventHex Integer Architecture specific or implementation-specific event number, in hexadecimal, determined from either the architecture specification document or the Technical Reference Manual of the processor. This attribute is required if the element does not have a counter attribute.
    option_setStringThe name of the option_set to use.
    titleStringTitle of the event, shown in Streamline before the name. Use this attribute to group counters.
    nameStringName of the event, shown in Streamline after the title.
    per_cpuBooleanDefines whether or not Streamline collects data on a per cpu basis. Set this value to yes and Streamline collects data from each cpu separately for this event. The default is the value of the per_cpu attribute of the category node.
    supports_event_based_samplingBooleanUse yes or no to define whether or not the event can be used for event based sampling. This value defaults to the category value if the attribute is not present in the event.
    displayStringUse one of the following values with the display attribute: average, maximum, minimum, hertz, accumulate. This is the same as adding .avg, .max, .min or .hz to the counter name in the chart configuration panel of Streamline. The default value is accumulate. This attribute is optional.
    unitsStringDefines the unit type to display in Streamline. This attribute is optional.
    modifierIntegerOptional, number to divide read numbers by for fixed point math. This attribute is optional.
    derivedBooleanDefines whether or not the the data is derived from the data of another chart.
    series_compositionStringDefines how to arrange the data in the Timeline view. Enter either overlay or stacked as the value for this attribute. This attribute is optional and the default value is stacked.
    rendering_typeStringThe type of chart to render for the Timeline view in Streamline. This attribute is optional and can be set to either bar, line, or fill. The default value is fill.
    average_selectionBooleanSets whether or not average values are displayed by the Cross Section Marker in Streamline. This attribute is optional.
    average_coresBooleanSet whether or not Streamline averages the values of multiple cores when viewing the aggregate data of a per-cpu chart. This attribute is optional.
    percentageBooleanOptional, Sets whether or not the Timeline view displays data as a percentage of the maximum value in the chart.
    descriptionStringUse this attribute to define a description to show in Streamline. The value of this attribute is used as the tooltip for the counter.

    -

    Events XML example:

    -

    - <?xml version="1.0" encoding="UTF-8"?>
    - <events>
    -   <counter_set name="ARM_Cortex-A8_cnt" count="4"/>
    -   <category name="Cortex-A8" counter_set="ARM_Cortex-A8_cnt" per_cpu="yes" supports_event_based_sampling="yes">
    -     <event counter="ARM_Cortex-A8_ccnt" event="0xff" title="Clock" name="Cycles" display="hertz" units="Hz" average_selection="yes" description="The number of core clock cycles"/>
    -     <event event="0x0" title="Software" name="Increment" description="Incremented only on writes to the Software Increment Register"/>
    -     <event event="0x1" title="Cache" name="Instruction refill" description="Instruction fetch that causes a refill of at least the level of instruction or unified cache closest to the processor"/>
    -     <!-- ... -->
    -   </category>
    -   <category name="CCI-400" counter_set="cci-400_cnt" supports_event_based_sampling="yes">
    -     <event counter="cci-400_ccnt" event="0xff" title="CCI-400" name="Cycles" display="hertz" units="Hz" average_selection="yes" description="The number of core clock cycles"/>
    -     <option_set name="Slave">
    -       <option event_delta="0x0" name="S0" description="Slave interface 0"/>
    -       <option event_delta="0x20" name="S1" description="Slave interface 1"/>
    -       <option event_delta="0x40" name="S2" description="Slave interface 2"/>
    -       <!-- ... -->
    -     </option_set>
    -     <event event="0x0" option_set="Slave" title="CCI-400" name="Read: any" description="Read request handshake: any"/>
    -     <event event="0x1" option_set="Slave" title="CCI-400" name="Read: transaction" description="Read request handshake: device transaction"/>
    -     <event event="0x2" option_set="Slave" title="CCI-400" name="Read: normal" description="Read request handshake: normal, non-shareable or system-shareable, but not barrier or cache maintenance operation"/>
    -     <!-- ... -->
    -     <option_set name="Master">
    -       <option event_delta="0xa0" name="M0" description="Master interface 0"/>
    -       <option event_delta="0xc0" name="M1" description="Master interface 1"/>
    -       <option event_delta="0xe0" name="M2" description="Master interface 2"/>
    -       <!-- ... -->
    -     </option_set>
    -     <event event="0x14" option_set="Master" title="CCI-400" name="Retry fetch" description="RETRY of speculative fetch transaction"/>
    -     <event event="0x15" option_set="Master" title="CCI-400" name="Read stall: address hazard" description="Read request stall cycle because of an address hazard"/>
    -     <event event="0x16" option_set="Master" title="CCI-400" name="Read stall: ID hazard" description="Read request stall cycle because of an ID hazard"/>
    -     <!-- ... -->
    -   </category>
    -   <category name="Mali GPU Fragment Processor">
    -     <counter_set name="ARM_Mali-400_FP0_cnt" title="Mali-400 FP0" description="Mali GPU Fragment Processor 0" count="2"/>
    -     <counter_set name="ARM_Mali-400_FP1_cnt" title="Mali-400 FP1" description="Mali GPU Fragment Processor 1" count="2"/>
    -     <counter_set name="ARM_Mali-400_FP2_cnt" title="Mali-400 FP2" description="Mali GPU Fragment Processor 2" count="2"/>
    -     <!-- ... -->
    -     <event event="0x0" title="Mali-400 FP" name="Active clock cycles" description="Active clock cycles, between polygon start and IRQ."/>
    -     <event event="0x2" title="Mali-400 FP" name="Total bus reads" description="Total number of 64-bit words read from the bus."/>
    -     <event event="0x3" title="Mali-400 FP" name="Total bus writes" description="Total number of 64-bit words written to the bus."/>
    -     <!-- ... -->
    -   </category>
    -   <category name="Linux">
    -     <event counter="Linux_irq_softirq" title="Interrupts" name="SoftIRQ" per_cpu="yes" description="Linux SoftIRQ taken"/>
    -     <event counter="Linux_irq_irq" title="Interrupts" name="IRQ" per_cpu="yes" description="Linux IRQ taken"/>
    -     <event counter="Linux_block_rq_wr" title="Disk IO" name="Write" units="B" description="Disk IO Bytes Written"/>
    -     <!-- ... -->
    -   </category>
    -   <category name="hwmon">
    -     <event counter="hwmon_ab8500-isa-0000_0" title="Temperature" name="ext_rtc_xtal" display="average" units="C" modifier="1000" average_selection="yes" description="libsensors Temperature sensor ext_rtc_xtal (hwmon_ab8500-isa-0000_0)"/>
    -     <event counter="hwmon_ab8500-isa-0000_1" title="Temperature" name="ext_db8500" display="average" units="C" modifier="1000" average_selection="yes" description="libsensors Temperature sensor ext_db8500 (hwmon_ab8500-isa-0000_1)"/>
    -     <event counter="hwmon_ab8500-isa-0000_2" title="Temperature" name="bat_temp" display="average" units="C" modifier="1000" average_selection="yes" description="libsensors Temperature sensor bat_temp (hwmon_ab8500-isa-0000_2)"/>
    -     <!-- ... -->
    -   </category>
    - </events> -

    -

    Configuration

    -

    Configuration XML defines the set of counters that are enabled for a capture session. It is sent to the client using the Deliver XML command. Any counters listed in Configuration XML that are not available on the target are ignored.

    -

    configurations

    -

    The configurations root node of Configuration XML can have any number of configuration child nodes and has one attribute:

    -

    - - - - - - - - - - -
    NameTypeDescription
    revisionInteger2

    -

    configuration

    -

    The configuration node has no children and has the following attributes:

    -

    - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    counterStringEvery configuration element must have either the counter or event attribute defined. Use the counter attribute for fixed counter types and the event attribute for all other events. If Events XML did not have a counter for this event, a counter from the related counter_set can be taken. See the description of counter_set in Events XML. This attribute is required.
    eventHex IntegerArchitecture-specific or implementation-specific event number, in hexadecimal, determined from either the architecture specification document or the Technical Reference Manual of the processor. This attribute is required if the element does not have a counter attribute.
    countIntegerTells the client how many samples to collect before triggering the event. This attribute is optional.

    -

    Configuration XML example:

    -

    - <?xml version="1.0" encoding="US-ASCII"?>
    - <configurations revision="2">
    -   <configuration counter="ARM_Cortex-A8_ccnt" event="0xFF"/>
    -   <configuration counter="ARM_Cortex-A8_cnt0" event="0x8"/>
    -   <configuration counter="ARM_Cortex-A8_cnt1" event="0x44"/>
    -   <configuration counter="ARM_Cortex-A8_cnt2" event="0x43"/>
    -   <configuration counter="ARM_Cortex-A8_cnt3" event="0x10"/>
    -   <configuration counter="ARM_Cortex-A9_ccnt" event="0xFF"/>
    -   <configuration counter="ARM_Cortex-A9_cnt0" event="0x68"/>
    -   <configuration counter="ARM_Cortex-A9_cnt1" event="0x6"/>
    -   <configuration counter="ARM_Cortex-A9_cnt2" event="0x7"/>
    -   <configuration counter="ARM_Cortex-A9_cnt3" event="0x3"/>
    -   <configuration counter="ARM_Cortex-A9_cnt4" event="0x4"/>
    -   <configuration counter="Linux_block_rq_wr"/>
    -   <configuration counter="Linux_block_rq_rd"/>
    -   <configuration counter="Linux_meminfo_memused"/>
    -   <configuration counter="Linux_meminfo_memfree"/>
    -   <configuration counter="Linux_power_cpu_freq"/>
    -   <configuration counter="cci-400_cnt0" event="0xB4"/>
    -   <configuration counter="cci-400_cnt1" event="0xD4"/>
    -   <configuration counter="cci-400_cnt2" event="0xB5"/>
    -   <configuration counter="hwmon_arm,vexpress-amp-isa-0011_0"/>
    -   <configuration counter="hwmon_arm,vexpress-amp-isa-0010_0"/>
    - </configurations> -

    -

    Counters

    -

    Counters XML lists the counters available on the target.

    -

    counters

    -

    The counters root node of Counters XML can have any number of counter child nodes

    -

    counter

    -

    The counter node has the following attribute

    -

    - - - - - - - - - - -
    NameTypeDescription
    nameStringAn available counter name from counter_set or the counter attribute of the event node.

    -

    Counters XML Example:

    -

    - <?xml version="1.0" encoding="utf-8"?>
    - <counters>
    -   <counter name="Linux_power_cpu_idle"/>
    -   <counter name="Linux_power_cpu_freq"/>
    -   <counter name="Linux_sched_switch"/>
    -   <counter name="ARM_Cortex-A8_cnt3"/>
    -   <counter name="ARM_Cortex-A8_cnt2"/>
    -   <counter name="ARM_Cortex-A8_cnt1"/>
    -   <counter name="ARM_Cortex-A8_cnt0"/>
    -   <counter name="ARM_Cortex-A8_ccnt"/>
    -   <counter name="Linux_net_tx"/>
    -   <counter name="Linux_net_rx"/>
    -   <counter name="mmaped_cnt2"/>
    -   <counter name="mmaped_cnt1"/>
    -   <counter name="mmaped_cnt0"/>
    -   <counter name="Linux_meminfo_bufferram"/>
    -   <counter name="Linux_meminfo_memused"/>
    -   <counter name="Linux_meminfo_memfree"/>
    -   <counter name="Linux_irq_softirq"/>
    -   <counter name="Linux_irq_irq"/>
    -   <counter name="Linux_block_rq_rd"/>
    -   <counter name="Linux_block_rq_wr"/>
    - </counters> -

    -

    Session

    -

    Session XML is created by Streamline and delivered to the client. Values in Session XML are based on the settings defined in the Capture & Analysis Options dialog box.

    -

    Note: Session XML must be delivered by Streamline via the Deliver XML command before it is requested by Streamline. Send back the received XML.

    -

    session

    -

    The session root node of Session XML can have any number of image child nodes, zero or one energy_capture child nodes and has the following attributes

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    versionInteger1
    call_stack_unwindingBooleanThe value is yes if the Call Stack Unwinding checkbox is selected, or no if it is not.
    parse_debug_infoBooleanThe value is yes if the Process Debug Information checkbox is selected, no if it is not.
    high_resolutionBooleanThe value is yes if the High Resolution Timeline checkbox is selected, no if it is not.
    buffer_modeStringThe mode chosen using the Buffer Mode drop-down menu. It can set to streaming or one of the following store-and-forward buffers: large - 16MB, medium - 4MB, or small - 1MB.
    sample_rateStringThe sample rate chosen using the Sample Rate drop-down menu. It can be set to one of the following options: normal, low, or none.
    durationIntegerThe maximum duration of the capture session, in seconds.
    target_hostStringThe address of the target.
    target_portIntegerThe target port.
    live_rateStringThe value of this attribute dictates how often, in milliseconds, the Counter, Block Counter and Scheduler Trace Frames should be flushed for the Live view.

    -

    image

    -

    There is no restriction to the number of image nodes the session node can have. The image node has no child nodes and the following attributes:

    -

    - - - - - - - - - - - - - - - -
    NameTypeDescription
    pathStringThis attribute defines the Program Image. This attribute can be used during local capture to copy images into the .apc folder. You can update all Program Images in Streamline post-capture.
    enabledBooleanA yes value means the Program Image is enabled, a no value means it is not. The default value is no.

    -

    energy_capture

    -

    The session node can either have zero or one energy_capture child nodes. The energy_capture node can have zero or more channel child nodes and the following attributes:

    -

    - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    versionInteger1
    command_pathStringThe full path to the caiman executable
    typeStringThe type attribute can have one of three possible values: none, energy_probe or ni-daq. none means no energy data is collected during a capture. energy_probe or ni-daq define the hardware used to capture the energy data from the target.

    -

    channel

    -

    The energy_capture node can any number of channel nodes. The channel node has the following attributes:

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    idIntegerThe channel number
    resistanceIntegerThe channel resistance, set using the resistance field.
    powerBooleanTrue if power data is to be collected and displayed
    voltageBooleanSet to yes if the Voltage checkbox has been enabled for this channel.
    currentBooleanSet to yes if the Current checkbox has been enabled for this channel.

    -

    Example:

    -

    - <?xml version="1.0" encoding="US-ASCII"?>
    - <session version="1" call_stack_unwinding="yes" parse_debug_info="yes" high_resolution="no" buffer_mode="streaming" sample_rate="low" duration="0" target_host="10.99.3.109" target_port="8080" live_rate="100">
    -   <image path="H:\ls"/>
    -   <image path="H:\libc.so.6"/>
    -   <energy_capture version="1" command_path="C:\Program Files (x86)\DS-5\bin\caiman.exe" type="none">
    -     <channel id="0" resistance="20" power="yes" voltage="yes" current="yes"/>
    -   </energy_capture>
    - </session> -

    -

    Captured

    -

    Captured XML contains information about a capture session. This is very similar to Configuration XML

    -

    captured

    -

    The captured root node of Captured XML has one target child node, one counters child node, and the following attributes:

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    versionInteger1
    live_energy_deltaIntegerThis attribute is added by Streamline
    createdIntegerCapture date in seconds since the epoch (midnight January 1, 1970 UTC). If you are doing a local capture, gator populates this attribute. Otherwise, Streamline adds this attribute.
    protocolInteger14
    backtrace_processingStringThe value of backtrace_processing can be either gator or none. This attribute is optional and the default value is gator. Indicates the type of call stack post-processing to use.

    -

    target

    -

    The captured node always contains one target child node. The target child node has the following attributes:

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    nameStringThe name of the target
    sample_rateIntegerNumber of samples collected per second
    coresIntegerNumber of cores on the target
    cpuidHex IntegerThe cpuid of a core. For example, 0xc08

    -

    counters

    -

    The captured node always contains one counters node. The counters node has the following child node:

    -

    counter

    -

    The counters node can contain any number of counter child nodes. The counter child node contains the following attributes:

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    keyHex IntegerThe key for this counter in the APC data.
    typeStringThe same as the counter attribute in the configuration node of Configuration XML.
    eventHex IntegerThe same as the event attribute in the configuration node of Configuration XML.
    countIntegerThe count value used during the capture session. Dictated how many samples had to be collected before triggering the event. This can only be set on one counter. This attribute is optional.

    -

    Example:

    -

    - <?xml version="1.0" encoding="utf-8"?>
    - <captured version="1" created="1361467764" protocol="14">
    -   <target sample_rate="100" cores="5" cpuid="0xc0f"/>
    -   <counters>
    -     <counter key="0x3" type="ARM_Cortex-A7_cnt1" event="0x10"/>
    -     <counter key="0x4" type="ARM_Cortex-A7_cnt2" event="0x16"/>
    -     <counter key="0x1" type="ARM_Cortex-A7_ccnt" event="0xff"/>
    -     <counter key="0x2" type="ARM_Cortex-A7_cnt0" event="0x8"/>
    -     <counter key="0x15" type="Linux_power_cpu_freq" event="0x0"/>
    -     <counter key="0x9" type="Linux_block_rq_rd" event="0x0"/>
    -     <counter key="0x8" type="Linux_block_rq_wr" event="0x0"/>
    -     <counter key="0xc" type="Linux_meminfo_memfree" event="0x0"/>
    -     <counter key="0xd" type="Linux_meminfo_memused" event="0x0"/>
    -     <counter key="0x12" type="Linux_net_rx" event="0x0"/>
    -     <counter key="0x13" type="Linux_net_tx" event="0x0"/>
    -   </counters>
    - </captured> -

    -

    APC Frame Format

    -

    Overview

    -

    The XML files and .apc data collected by Streamline are placed in an .apc folder. When Streamline processes this folder, it creates a db folder, followed by a separate .apd folder.

    -

    Note: The APC files are ten-digit files with no extension starting with 0000000000.

    -

    When creating a new report from the same .apc folder, Streamline does not regenerate the db folder, even if the .apc data has changed. In other words, the .apc data is ignored if a valid db folder exists. To ensure Streamline generates a new report from the .apc data, delete the db directory. If this folder is missing, Streamline recreates it from the .apc data files.

    -

    Types

    -
    -
    int32
    4-byte signed little endian
    -
    packed32
    variable length packed 4-byte signed value, see Packed Values
    -
    packed64
    variable length packed 8-byte signed value, see Packed Values
    -
    string
    A packed32 length followed by the specified number of characters
    -
    #
    A constant packed32 value of #, ex: 5 is the packed32 number 5
    -
    timestamp
    packed64 time value in nanoseconds relative to the uptime from the Summary Message
    -
    -

    Packed Values

    -

    To reduce their size, integers are packed. This is done by avoiding the transmission of duplicate high bits. The value is split into 7 bit bytes in little endian order. The most significant bit of the byte is set to 1, if there is a subsequent byte for this value. On the last byte, the most significant bit is set to 0. For positive values, the most signifiant encoded bit must be 0 and for negative numbers it must be 1. This is very similar to signed LEB128 used in DWARF.

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    BitsLast valueByte 1Byte 2Byte 3Byte 4Byte 5
    31-21474836481XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb01111XXXb
    27-1342177281XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
    20-10485761XXXXXXXb1XXXXXXXb01XXXXXXb
    13-81921XXXXXXXb01XXXXXXb
    6-6401XXXXXXb
    66300XXXXXXb
    1381911XXXXXXXb00XXXXXXb
    2010485751XXXXXXXb1XXXXXXXb00XXXXXXb
    271342177271XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
    3121474836471XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb00000XXXb

    -

    For example, 429389 (01101000110101001101b) would be encoded as 0xCD (11001101b) 0x9A (10011010b) 0x1A (00011010b)

    -

    Packed 64 values work in much the same way:

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    BitsLast valueByte 1Byte 2Byte 3Byte 4Byte 5Byte 6Byte 7Byte 8Byte 9Byte 10
    63-92233720368547758081XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb0111111Xb
    62-46116860184273879041XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
    55-360287970189639681XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
    48-2814749767106561XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
    41-21990232555521XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
    34-171798691841XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
    27-1342177281XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
    20-10485761XXXXXXXb1XXXXXXXb01XXXXXXb
    13-81921XXXXXXXb01XXXXXXb
    6-6401XXXXXXb
    66300XXXXXXb
    1381911XXXXXXXb00XXXXXXb
    2010485751XXXXXXXb1XXXXXXXb00XXXXXXb
    271342177271XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
    34171798691831XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
    4121990232555511XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
    482814749767106551XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
    55360287970189639671XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
    6246116860184273879031XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
    6392233720368547758071XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb0000000Xb

    -

    For example, -4758616141418899142 would be encoded as 0xBA 0xB2 0xA5 0xA2 0xCE 0xFA 0xFF 0xFA 0xBD 0x7F.

    -

    Frames consist of a header followed by a body of zero or more type specific messages

    -

    Ordering

    -

    The timestamp order of messages is significant and must be in-order on the same core. A specific counter is only be populated in Counter frames or Block Counter frames, not a mix of both.

    -

    Required Messages

    -

    To generate a valid capture at least one Sched Switch, Counter or Block Counter message must be present. All other messages are optional.

    -

    Frame Header

    -

    - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    LengthLittle Endian int32Number of bytes after the length in the frame
    Codepacked32Indicates the type of this frame. - - - - - - - - - - -
    1= Summary
    2= Backtrace
    3= Name
    4= Counter
    5= Block Counter
    6= Annotate
    7= Sched Trace
    8= GPU Trace
    9= Idle
    -
    Corepacked32The processor that originated the messages in the frame. This field must always be present but is ignored for Summary, Counter, Annotate, GPU Trace and Idle Frames as these frames can have messages from multiple cores.

    -

    If there are multiple message types for a frame, each message will start with an unique code

    -

    Summary Frame Messages

    -

    The summary frame will appear only once and have only have one message. It is recommended that this is the first frame sent to Streamline so the Newline Canary can be checked for correctness before any other processing occurs.

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Newline CanarystringAlways "1\n2\r\n3\r4\n\r5"
    Timestamppacked64Current system time in nanoseconds since the epoch (midnight January 1, 1970 UTC) or 0 if the target does not have system time
    Uptimepacked64How long the system has been running in nanoseconds. This is not affected by external influences like changing the system time, ntp, hibernating, etc... Can be used to reference kernel log messages. If the target does not support uptime, send 0 and use a monotonically increasing timer for the timestamp messages.
    Attributes  - Zero or more repetitions of the following: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    KeyStringAttribute key. Must not be empty
    ValueStringAttribute value
    -
    End of AttributesStringAlways the empty string

    -

    Backtrace Frame Messages

    -

    This is used to populate the Call Paths tab

    -
      -
    • Exec cookie vs Offset cookie -
      • If a sample occurs in libx.so called by my-app, the exec cookie is my-app and the offset cookie is libx.so
      -
    • -
    -

    Cookies should be positive. The special values 0 indicates kernel or idle, -1 indicate an invalid cookie and 1 is reserved to avoid confusion with End of Message, 1 below.

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Timestamptimestamp 
    Exec Cookiepacked32Cookie of the current process
    pidpacked32Process ID. In Linux, this is the Thread Group ID
    tidpacked32Thread ID. In Linux, this is the PID
    InKernelpacked32 - - - -
    0= not in kernel
    1= in kernel
    -
    Body  - One or more repetitions of the following: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Offset Cookiepacked32Executable or library at the offset
    Offsetpacked64Offset in the backtrace
    -
    End of Message1 

    -

    Name Frame Messages

    -

    Cookie Name Message

    -

    This is used to get the name for the Process Handle. Cookies are stored in a pseudo hashmap which limits the number of possible collisions, thus duplicate cookies may be emitted. In addition, cookies are stored per core, thus when a task migrates to a new core, a fresh cookie may be emitted for that core. However cookies are unique across all cores.

    -

    - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code1 
    Cookiepacked32Cookie key
    NamestringCookie value

    -

    Thread Name Message

    -

    This is used to show thread names in the Thread Disclosure. Thread names are stored in a pseudo hashmap which to limit the number of times the name is sent, but duplicate thread names may be emitted. Thread numbers can be reused as long as the context switch process free event is sent before it is reused.

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code2 
    Timestamptimestamp 
    Thread IDpacked32tid of the named thread
    NamestringName of the thread

    -

    Core Name Message

    -

    This is used to identify clusters and in the tooltip in X-Ray mode

    -

    - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code3 
    cpuidpacked32cpuid of this core. For example, 0xc08
    NamestringHuman readable name of this core. For example, Cortex-A8

    -

    Counter Frame Messages

    -

    This is used to populate Charts in the Timeline view

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Timestamptimestamp 
    Corepacked32Core to which this counter applies
    Keypacked32Key in Captured XML
    Valuepacked64Value of the specified counter

    -

    Block Counter Frame Messages

    -

    Block counters are the same as counters, but used less space when multiple counters are sampled at the same timestamp and on the same core. To start the block, the key of 0 and a timestamp value is emitted. Then any counters sampled at that time are emitted. A block of counters - counters using the same timestamp - must all be emitted in the same frame. For example, the first block counter message emitted in a frame must be the timestamp.

    -

    - - - - - - - - - - - - - - - -
    NameTypeDescription
    Keypacked32Zero for timestamp or key in Captured XML
    Valuepacked64Value of the specified counter

    -

    Annotate Frame Messages

    -

    Annotations are messages sent by arbitrary userspace programs, so their format is different from other messages.

    -

    A single annotation may be broken across frame boundaries. This is why the Annotation Message has a size and the Userspace Annotations either have a size or are '\n' terminated.

    -

    To colorize any ASCII string within the annotation data, prefix the string with 0x1B escape character followed by a 3-byte RGB value

    -

    Annotate Message

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Corepacked32 
    tidpacked32Thread ID (in Linux this is the PID)
    Timestamptimestamp 
    Sizepacked32Message size
    Body Userspace Annotation data fragment

    -

    Userspace Annotations

    -

    Annotations belong to a channel with 0 being the default channel. Channels belong to groups with 0 as the default group.

    -

    ASCII String Annotation

    -

    This is used to add a line in the Log tab. Can also be sent from the command line. For example, echo 'Hello World' > /dev/gator/annotate

    -

    - - - - - - - - - - - - - - - -
    NameTypeDescription
    ColorcolorOptional, 0x1B, RR, GG, BB
    ASCII StringZero or more ASCII characters followed by '\n'Text annotation

    -

    Create Group Annotation

    -

    This is used to name a group in the Thread Disclosure

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Escape Code0x1C 
    Marker Code0x8 
    GroupLittle Endian int32 
    String LengthLittle Endian int16 
    UTF-8 StringString Length UTF-8 bytesChannel name

    -

    Create Channel Annotation

    -

    This is used to name a channel in the Thread Disclosure

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Escape Code0x1C 
    Marker Code0x7 
    ChannelLittle Endian int32 
    GroupLittle Endian int32Group the channel belongs to
    String LengthLittle Endian int16 
    UTF-8 StringString Length UTF-8 bytesChannel name

    -

    UTF-8 String Annotations

    -

    This is used to add a line in the Log tab.

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Escape Code0x1C 
    Marker Code0x6 
    ChannelLittle Endian int32Channel the annotation belongs to
    String LengthLittle Endian int16 
    ColorcolorOptional, 0x1B, RR, GG, BB, counts against String Length
    UTF-8 StringString Length UTF-8 bytesText annotation

    -

    Visual Annotation

    -

    This is used to add a line in the Log tab and an image to the Visual Annotation Chart.

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Escape Code0x1C 
    Visual Code0x4 
    String LengthLittle Endian int16 
    UTF-8 StringString Length UTF-8 bytesText annotation
    Image LengthLittle Endian int32 
    Image DataImage Length bytes 

    -

    Marker Annotation

    -

    This is used to add a Bookmark

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Escape Code0x1C 
    Marker Code0x5 
    String LengthLittle Endian int16 
    ColorcolorOptional, 0x1B, RR, GG, BB, counts against String Length
    UTF-8 StringString Length UTF-8 bytesText annotation

    -

    Scheduler Trace Frame Messages

    -

    As with Backtrace Frame Messages, the cookies should be positive. The special cookie value 0, in conjunction of a pid of 0, indicates kernel. A cookie value of 0 and a pid of 1 indicates idle.

    -

    Sched Switch

    -

    This is used to populate the CPU Activity Chart and the Heat Map

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code1 
    Timestamptimestamp 
    pidpacked32Process ID (in Linux this is the Thread Group ID)
    tidpacked32Thread ID (in Linux this is the PID)
    Cookiepacked32Cookie of the current process
    Statepacked32State - - - - - -
    0= Waiting on other event besides I/O
    1= Contention/pre-emption
    2= Waiting on I/O
    3= Waiting on mutex
    -

    -

    Sched Thread Exit

    -

    This is used by the Heat Map to identify when a process terminates

    -

    - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code2 
    Timestamptimestamp 
    tidpacked32Thread ID (in Linux this is the PID)

    -

    GPU Trace Frame Messages

    -

    GPU Start

    -

    This is used to indicate a part of the GPU has begun execution

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code1 
    Timestamptimestamp 
    Unitpacked32GPU Unit
    Corepacked32GPU Unit Core
    pidpacked32Process ID (in Linux this is the Thread Group ID)
    tidpacked32Thread ID (in Linux this is the PID)

    -

    GPU Stop

    -

    This is used to indicate a part of the GPU has ceased execution

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code2 
    Timestamptimestamp 
    Unitpacked32GPU Unit
    Corepacked32GPU Unit Core

    -

    Idle Frame Messages

    -

    Enter Idle

    -

    This is used to indicate that a core has ceased execution.

    -

    - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code1 
    Timestamptimestamp 
    Corepacked32 

    -

    Exit Idle

    -

    This is used to indicate that a core has resumed execution.

    -

    - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code2 
    Timestamptimestamp 
    Corepacked32 

    -

    Sequence Diagrams

    -

    Configuration

    -

    The diagrams in this topic depict the series of events that are triggered when you click various buttons in the Streamline user interface. Here are the events that occur when the Counter Configuration button is clicked in Streamline where $VER is 14

    -
    -

    This is the sequence of events when you click the Load Defaults in the Counter Configuration dialog box:

    -
    -

    This diagram illustrates the sequence of events that occur when you click either the Cancel or Close button in the Counter Configuration dialog box:

    -
    -

    This is the sequence of events triggered when the Save button is clicked from the Counter Configuration dialog box:

    -
    -

    Note: After you click Save, Cancel or Close, the Counter Configuration dialog box closes.

    -

    Capture

    -

    Here are the events that occur when you click the Start Capture button in Streamline, when the $VER is 14.

    -
    -

    At any point during the capture, Streamline can send a ping to verify that the host is still running. If the ping is not acknowledged, Streamline ends the capture.

    -
    -

    Local Capture

    -

    Streamline also support a local capture mode, a mode in which data is collected without interaction with Streamline. In this case the Target-Host Protocol is omitted. Instead a directory, ending in .apc, is provided to Streamline. This directory contains captured.xml containing the Captured XML, session.xml containing the Session XML, events.xml containing the Events XML and 0000000000 which contains the APC Data with one or more structures of the following format:

    -

    - - - - - - - - - - - - - - - - -
    NameTypeDescription
    LengthLittle Endian int32Number of bytes in the body
    bodyAPC Data 

    -
    - - diff --git a/protocol/gator/gator_protocol-5-16.html b/protocol/gator/gator_protocol-5-16.html deleted file mode 100644 index e9089e6c..00000000 --- a/protocol/gator/gator_protocol-5-16.html +++ /dev/null @@ -1,2042 +0,0 @@ - - - - - - - - -
    -

    Gator v16 (DS-5 v5.16) Protocol

    -

    Index

    -
  • - Introduction -
  • -
  • Changes in v16 (DS-5 v5.16)
  • -
  • - Target-Host Protocol - -
  • -
  • - Response Format - -
  • -
  • - XML - -
  • -
  • - APC Frame Format - -
  • -
  • - Sequence Diagrams - -
  • -
  • - Local Capture -
  • -

    Introduction

    -

    This document describes the TCP/IP protocol used by gator or other implementing clients to communicate with Streamline version 5.16 or later. Use this information to build a customized client to communicate profiling data to Streamline. The gator source code, distributed as part of DS-5, is the reference implementation of this protocol. The protocol may change with future releases of Streamline, but Streamline will maintain backwards compatibility with this version of the protocol so that clients need only implement one version of the protocol. Streamline requires that your client is able to parse and generate simple XML and ignore additional or unexpected nodes or attributes. Because the XML features described in this protocol documentation are the only ones used, Streamline does not require the more complex features of XML.

    -

    Changes in v16 (DS-5 v5.16)

    -

    gator v16, the version of gator shipped with Streamline version 5.16, has a few important updates that you should familiarize yourself with before implementing or updating your own customized Streamline TCP/IP protocol.

    -
      -
    • Gator protocol v15 is skipped so that the protocol version and the Streamline version are now in sync.
    • -
    • Add the core to the Core Name Message instead of using the core from the Frame Header.
    • -
    • Added the supports_live attribute to Captured XML
    • -
    • Added monotonic delta to the Summary Message
    • -
    -

    Target-Host Protocol

    -

    Magic Exchange

    -

    A handshake is required so that your target and client can recognize each other. It consists of ASCII newline (\n) delimited strings. If the client receives a string it does not recognize, the string must be discarded and another string is read.

    -

    The standard Streamline client is gator. But, as you can customize gator and call it what you wish, the term client is used generically to refer to your customized protocol.

    -
      -
    1. The client receives Streamlines highest supported protocol version VERSION $VER\n, for example if Streamline supports up to version 23, the client would recieve VERSION 23\n.
    2. -
    3. The client receives STREAMLINE\n
    4. -
    5. Send GATOR 16\n
    6. -
    -

    Further communication from Streamline comes as Commands

    -

    Command Header

    -

    Streamline issues commands that consist of a header and a body. Streamline expects a Response to these commands from the client.

    -

    - - - - - - - - - - - - - - - -
    NameTypeDescription
    Codeint8The type of command - - - - - - - -
    0= Request XML
    1= Deliver XML
    2= APC Start
    3= APC Stop
    4= Disconnect
    5= Ping
    -
    LengthLittle Endian int32Number of bytes in the body

    -

    If the client receives an unrecognized command, it should respond with a NAK.

    -

    Request XML Body

    -

    Command code 0 is a request from Streamline for XML. The root node is request and it has the type attribute that tells the client which xml is required. For example, this is a request for Events XML

    -

    - <?xml version="1.0" encoding="US-ASCII"?>
    - <request type="events">
    - </request> -

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    RequestResponse CodeResponse Body
    <request type="events">XMLEvents XML
    <request type="configuration">XMLConfiguration XML
    <request type="counters">XMLCounters XML
    <request type="captured">XMLCaptured XML Streamline requests Captured XML prior to starting a capture.
    <request type="defaults">XMLdefault Configuration XML

    -

    Deliver XML Body

    -

    The Deliver XML command sends XML to the client:

    -

    - - - - - - - - - - - - -
    RequestResponse Code
    Session XMLACK
    Configuration XMLACK

    -

    APC Start Body

    -

    The APC Start command does not have a body. This command initiates a capture and readies Streamline to receive APC Data Responses. No ACK is expected and no further XML exchange takes place. If a failure occurs, the client should send an Error.

    -

    APC Stop Body

    -

    The APC Stop command also does not have a body. This command triggers the end of the APC and no ACK is expected. APC Data Responses can continue to arrive until all captured data is sent, then the connection should be closed. If a failure occurs, the client should send an Error.

    -

    Disconnect Body

    -

    The Disconnect command, which closes the connection to the target, does not contain a command body. No ACK is expected.

    -

    Ping Body

    -

    The Ping command does not have a body. Send an ACK response to this command.

    -

    Response Format

    -

    Responses consist of a header followed by a body

    -

    Response Header

    -

    The format for the response header is identical to that of the Command Header but the Codes are different

    -

    - - - - - - - - - - - - - - - -
    NameTypeDescription
    Codeint8The type of command - - - - - - -
    1= XML
    3= APC Data
    4= ACK
    5= NAK
    0xFF= Error
    -
    LengthLittle Endian int32Number of bytes in the body

    -

    XML Body

    -

    The body should contain XML, the format of which is dependent on the Request type. For a list of types, see Request XML Body

    -

    APC Data Body

    -

    The APC body should contain an APC Frame. If the length is zero, it is the End of Sequence message which indicates that all APC Frames have been transmitted to Streamline.

    -

    ACK Body

    -

    This response, which indicates the Command was successful, does not have a response body.

    -

    NAK Body

    -

    Indicates a synchronous non-fatal error occurred when handling a request. It can contain a UTF-8 error message. The length is specified in the header, so no NULL character is expected. Indicates that the Command failed, but that the connection can continue.

    -

    Error Body

    -

    Indicates a synchronous fatal error occurred when responding to a request. A UTF-8 error message. The length is specified in the header, so no NULL character is expected. Use this response when the error is terminal and the connection must be closed. Errors may be sent without a request, but Streamline may not process them immediately.

    -

    XML

    -

    Events

    -

    The Events XML defines the list of counters that you can choose from in the Counter Configuration dialog box. Modify this list to create your own custom counters.

    -

    events

    -

    The events root node of Events XML can have any number of counter_set and category child nodes.

    -

    counter_set

    -

    The counter_set node has no children and the following attributes. Counter sets are used when the number of counters that can be enabled in a category is restricted. Streamline will respect the restriction and assign a name from the set to a counter in Configuration XML.

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    nameStringName of the counter_set
    countStringNumber of counters in the set. Counter names are derived by appending a number, starting at zero, to the set name. Ex, if the set name is ARM_Cortex-A8_cnt and the count is 4, then the counter names in the set are ARM_Cortex-A8_cnt0, ARM_Cortex-A8_cnt1, ARM_Cortex-A8_cnt2 and ARM_Cortex-A8_cnt3
    titleStringAppended to the title of the event when counter_set is a child of category, shown in Streamline before the name. Used to group counters.
    descriptionStringThe value of this attribute is appended to the description to show in Streamline when counter_set is a child of category. Used as the tooltip for the counter

    -

    category

    -

    The category node can have any number of event and option_set child nodes. It can also have one or more counter_set child nodes instead of the counter_set attribute if the same set of child event nodes show up for to multiple counter sets. The category node can have the following attributes:

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    nameStringThe name of the category. The value given here appears as the category name in the Counter Configuration dialog box in Streamline.
    counter_setStringDefines the counter_set to be used. You must use this attribute if any child event uses the event attribute and there are no child counter_set nodes present.
    per_cpuBooleanDefines whether or not Streamline collects data on a per cpu basis. Set this value to yes and Streamline collects data from each cpu separately for these counters. The default value is no.
    supports_event_based_samplingBooleanUse yes or no to define whether or not the counters in this category can be used for event based sampling. The default value is no.

    -

    option_set

    -

    The event node has one or more option_set child nodes and the following attributes. Use this node when the same event applies to multiple devices. It has the following attributes:

    -

    - - - - - - - - - - -
    NameTypeDescription
    nameStringThe name of this option_set

    -

    option

    -

    The option_set node contains one or more option child nodes. The option node has no children and the following attributes

    -

    - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    event_deltaHex IntegerThe offset to add to the applicable event to get the event number.
    nameStringThe name of the device. The value of name is appended to the event name.
    descriptionStringA description of the device option. This description is appended to the event description.

    -

    event

    -

    The event node has no children and the following attributes

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    counterStringEvery event element must have either the counter or event attribute defined. Use the counter attribute for fixed counter types, like cycle count. Use the event attribute for all other events. The counter attribute is the name of the counter.
    eventHex Integer Architecture specific or implementation-specific event number, in hexadecimal, determined from either the architecture specification document or the Technical Reference Manual of the processor. This attribute is required if the element does not have a counter attribute.
    option_setStringThe name of the option_set to use.
    titleStringTitle of the event, shown in Streamline before the name. Use this attribute to group counters.
    nameStringName of the event, shown in Streamline after the title.
    per_cpuBooleanDefines whether or not Streamline collects data on a per cpu basis. Set this value to yes and Streamline collects data from each cpu separately for this event. The default is the value of the per_cpu attribute of the category node.
    supports_event_based_samplingBooleanUse yes or no to define whether or not the event can be used for event based sampling. This value defaults to the category value if the attribute is not present in the event.
    displayStringUse one of the following values with the display attribute: average, maximum, minimum, hertz, accumulate. This is the same as adding .avg, .max, .min or .hz to the counter name in the chart configuration panel of Streamline. The default value is accumulate. This attribute is optional.
    unitsStringDefines the unit type to display in Streamline. This attribute is optional.
    modifierIntegerOptional, number to divide read numbers by for fixed point math. This attribute is optional.
    derivedBooleanDefines whether or not the the data is derived from the data of another chart.
    series_compositionStringDefines how to arrange the data in the Timeline view. Enter either overlay or stacked as the value for this attribute. This attribute is optional and the default value is stacked.
    rendering_typeStringThe type of chart to render for the Timeline view in Streamline. This attribute is optional and can be set to either bar or fill. The default value is fill.
    average_selectionBooleanSets whether or not average values are displayed by the Cross Section Marker in Streamline. This attribute is optional.
    average_coresBooleanSet whether or not Streamline averages the values of multiple cores when viewing the aggregate data of a per-cpu chart. This attribute is optional.
    percentageBooleanOptional, Sets whether or not the Timeline view displays data as a percentage of the maximum value in the chart.
    descriptionStringUse this attribute to define a description to show in Streamline. The value of this attribute is used as the tooltip for the counter.

    -

    Events XML example:

    -

    - <?xml version="1.0" encoding="UTF-8"?>
    - <events>
    -   <counter_set name="ARM_Cortex-A8_cnt" count="4"/>
    -   <category name="Cortex-A8" counter_set="ARM_Cortex-A8_cnt" per_cpu="yes" supports_event_based_sampling="yes">
    -     <event counter="ARM_Cortex-A8_ccnt" event="0xff" title="Clock" name="Cycles" display="hertz" units="Hz" average_selection="yes" average_cores="yes" description="The number of core clock cycles"/>
    -     <event event="0x0" title="Software" name="Increment" description="Incremented only on writes to the Software Increment Register"/>
    -     <event event="0x1" title="Cache" name="Instruction refill" description="Instruction fetch that causes a refill of at least the level of instruction or unified cache closest to the processor"/>
    -     <!-- ... -->
    -   </category>
    -   <category name="CCI-400" counter_set="cci-400_cnt" supports_event_based_sampling="yes">
    -     <event counter="cci-400_ccnt" event="0xff" title="CCI-400" name="Cycles" display="hertz" units="Hz" average_selection="yes" description="The number of core clock cycles"/>
    -     <option_set name="Slave">
    -       <option event_delta="0x0" name="S0" description="Slave interface 0"/>
    -       <option event_delta="0x20" name="S1" description="Slave interface 1"/>
    -       <option event_delta="0x40" name="S2" description="Slave interface 2"/>
    -       <!-- ... -->
    -     </option_set>
    -     <event event="0x0" option_set="Slave" title="CCI-400" name="Read: any" description="Read request handshake: any"/>
    -     <event event="0x1" option_set="Slave" title="CCI-400" name="Read: transaction" description="Read request handshake: device transaction"/>
    -     <event event="0x2" option_set="Slave" title="CCI-400" name="Read: normal" description="Read request handshake: normal, non-shareable or system-shareable, but not barrier or cache maintenance operation"/>
    -     <!-- ... -->
    -     <option_set name="Master">
    -       <option event_delta="0xa0" name="M0" description="Master interface 0"/>
    -       <option event_delta="0xc0" name="M1" description="Master interface 1"/>
    -       <option event_delta="0xe0" name="M2" description="Master interface 2"/>
    -       <!-- ... -->
    -     </option_set>
    -     <event event="0x14" option_set="Master" title="CCI-400" name="Retry fetch" description="RETRY of speculative fetch transaction"/>
    -     <event event="0x15" option_set="Master" title="CCI-400" name="Read stall: address hazard" description="Read request stall cycle because of an address hazard"/>
    -     <event event="0x16" option_set="Master" title="CCI-400" name="Read stall: ID hazard" description="Read request stall cycle because of an ID hazard"/>
    -     <!-- ... -->
    -   </category>
    -   <category name="Mali GPU Fragment Processor">
    -     <counter_set name="ARM_Mali-400_FP0_cnt" title="Mali-400 FP0" description="Mali GPU Fragment Processor 0" count="2"/>
    -     <counter_set name="ARM_Mali-400_FP1_cnt" title="Mali-400 FP1" description="Mali GPU Fragment Processor 1" count="2"/>
    -     <counter_set name="ARM_Mali-400_FP2_cnt" title="Mali-400 FP2" description="Mali GPU Fragment Processor 2" count="2"/>
    -     <!-- ... -->
    -     <event event="0x0" title="Mali-400 FP" name="Active clock cycles" description="Active clock cycles, between polygon start and IRQ."/>
    -     <event event="0x2" title="Mali-400 FP" name="Total bus reads" description="Total number of 64-bit words read from the bus."/>
    -     <event event="0x3" title="Mali-400 FP" name="Total bus writes" description="Total number of 64-bit words written to the bus."/>
    -     <!-- ... -->
    -   </category>
    -   <category name="Linux">
    -     <event counter="Linux_irq_softirq" title="Interrupts" name="SoftIRQ" per_cpu="yes" description="Linux SoftIRQ taken"/>
    -     <event counter="Linux_irq_irq" title="Interrupts" name="IRQ" per_cpu="yes" description="Linux IRQ taken"/>
    -     <event counter="Linux_block_rq_wr" title="Disk IO" name="Write" units="B" description="Disk IO Bytes Written"/>
    -     <!-- ... -->
    -   </category>
    -   <category name="hwmon">
    -     <event counter="hwmon_ab8500-isa-0000_0" title="Temperature" name="ext_rtc_xtal" display="average" units="C" modifier="1000" average_selection="yes" description="libsensors Temperature sensor ext_rtc_xtal (hwmon_ab8500-isa-0000_0)"/>
    -     <event counter="hwmon_ab8500-isa-0000_1" title="Temperature" name="ext_db8500" display="average" units="C" modifier="1000" average_selection="yes" description="libsensors Temperature sensor ext_db8500 (hwmon_ab8500-isa-0000_1)"/>
    -     <event counter="hwmon_ab8500-isa-0000_2" title="Temperature" name="bat_temp" display="average" units="C" modifier="1000" average_selection="yes" description="libsensors Temperature sensor bat_temp (hwmon_ab8500-isa-0000_2)"/>
    -     <!-- ... -->
    -   </category>
    - </events> -

    -

    Configuration

    -

    Configuration XML defines the set of counters that are enabled for a capture session. It is sent to the client using the Deliver XML command. Any counters listed in Configuration XML that are not available on the target are ignored.

    -

    configurations

    -

    The configurations root node of Configuration XML can have any number of configuration child nodes and has one attribute:

    -

    - - - - - - - - - - -
    NameTypeDescription
    revisionInteger2

    -

    configuration

    -

    The configuration node has no children and has the following attributes:

    -

    - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    counterStringEvery configuration element must have either the counter or event attribute defined. Use the counter attribute for fixed counter types and the event attribute for all other events. If Events XML did not have a counter for this event, a counter from the related counter_set can be taken. See the description of counter_set in Events XML. This attribute is required.
    eventHex IntegerArchitecture-specific or implementation-specific event number, in hexadecimal, determined from either the architecture specification document or the Technical Reference Manual of the processor. This attribute is required if the element does not have a counter attribute.
    countIntegerTells the client how many samples to collect before triggering the event. This attribute is optional.

    -

    Configuration XML example:

    -

    - <?xml version="1.0" encoding="US-ASCII"?>
    - <configurations revision="2">
    -   <configuration counter="ARM_Cortex-A8_ccnt" event="0xFF"/>
    -   <configuration counter="ARM_Cortex-A8_cnt0" event="0x8"/>
    -   <configuration counter="ARM_Cortex-A8_cnt1" event="0x44"/>
    -   <configuration counter="ARM_Cortex-A8_cnt2" event="0x43"/>
    -   <configuration counter="ARM_Cortex-A8_cnt3" event="0x10"/>
    -   <configuration counter="ARM_Cortex-A9_ccnt" event="0xFF"/>
    -   <configuration counter="ARM_Cortex-A9_cnt0" event="0x68"/>
    -   <configuration counter="ARM_Cortex-A9_cnt1" event="0x6"/>
    -   <configuration counter="ARM_Cortex-A9_cnt2" event="0x7"/>
    -   <configuration counter="ARM_Cortex-A9_cnt3" event="0x3"/>
    -   <configuration counter="ARM_Cortex-A9_cnt4" event="0x4"/>
    -   <configuration counter="Linux_block_rq_wr"/>
    -   <configuration counter="Linux_block_rq_rd"/>
    -   <configuration counter="Linux_meminfo_memused"/>
    -   <configuration counter="Linux_meminfo_memfree"/>
    -   <configuration counter="Linux_power_cpu_freq"/>
    -   <configuration counter="cci-400_cnt0" event="0xB4"/>
    -   <configuration counter="cci-400_cnt1" event="0xD4"/>
    -   <configuration counter="cci-400_cnt2" event="0xB5"/>
    -   <configuration counter="hwmon_arm,vexpress-amp-isa-0011_0"/>
    -   <configuration counter="hwmon_arm,vexpress-amp-isa-0010_0"/>
    - </configurations> -

    -

    Counters

    -

    Counters XML lists the counters available on the target.

    -

    counters

    -

    The counters root node of Counters XML can have any number of counter child nodes

    -

    counter

    -

    The counter node has the following attribute

    -

    - - - - - - - - - - -
    NameTypeDescription
    nameStringAn available counter name from counter_set or the counter attribute of the event node.

    -

    Counters XML Example:

    -

    - <?xml version="1.0" encoding="utf-8"?>
    - <counters>
    -   <counter name="Linux_power_cpu_idle"/>
    -   <counter name="Linux_power_cpu_freq"/>
    -   <counter name="Linux_sched_switch"/>
    -   <counter name="ARM_Cortex-A8_cnt3"/>
    -   <counter name="ARM_Cortex-A8_cnt2"/>
    -   <counter name="ARM_Cortex-A8_cnt1"/>
    -   <counter name="ARM_Cortex-A8_cnt0"/>
    -   <counter name="ARM_Cortex-A8_ccnt"/>
    -   <counter name="Linux_net_tx"/>
    -   <counter name="Linux_net_rx"/>
    -   <counter name="mmaped_cnt2"/>
    -   <counter name="mmaped_cnt1"/>
    -   <counter name="mmaped_cnt0"/>
    -   <counter name="Linux_meminfo_bufferram"/>
    -   <counter name="Linux_meminfo_memused"/>
    -   <counter name="Linux_meminfo_memfree"/>
    -   <counter name="Linux_irq_softirq"/>
    -   <counter name="Linux_irq_irq"/>
    -   <counter name="Linux_block_rq_rd"/>
    -   <counter name="Linux_block_rq_wr"/>
    - </counters> -

    -

    Session

    -

    Session XML is created by Streamline and delivered to the client. Values in Session XML are based on the settings defined in the Capture & Analysis Options dialog box.

    -

    Note: Session XML must be delivered by Streamline via the Deliver XML command before it is requested by Streamline. Send back the received XML.

    -

    session

    -

    The session root node of Session XML can have any number of image child nodes, zero or one energy_capture child nodes and has the following attributes

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    versionInteger1
    call_stack_unwindingBooleanThe value is yes if the Call Stack Unwinding checkbox is selected, or no if it is not.
    parse_debug_infoBooleanThe value is yes if the Process Debug Information checkbox is selected, no if it is not.
    high_resolutionBooleanThe value is yes if the High Resolution Timeline checkbox is selected, no if it is not.
    buffer_modeStringThe mode chosen using the Buffer Mode drop-down menu. It can set to streaming or one of the following store-and-forward buffers: large - 16MB, medium - 4MB, or small - 1MB.
    sample_rateStringThe sample rate chosen using the Sample Rate drop-down menu. It can be set to one of the following options: normal, low, or none.
    durationIntegerThe maximum duration of the capture session, in seconds.
    target_hostStringThe address of the target.
    target_portIntegerThe target port.
    live_rateStringThe value of this attribute dictates how often, in milliseconds, the Counter, Block Counter and Scheduler Trace Frames should be flushed to Streamline for the Live view.

    -

    image

    -

    There is no restriction to the number of image nodes the session node can have. The image node has no child nodes and the following attributes:

    -

    - - - - - - - - - - - - - - - -
    NameTypeDescription
    pathStringThis attribute defines the Program Image. This attribute can be used during local capture to copy images into the .apc folder. You can update all Program Images in Streamline post-capture.
    enabledBooleanA yes value means the Program Image is enabled, a no value means it is not. The default value is no.

    -

    energy_capture

    -

    The session node can either have zero or one energy_capture child nodes. The energy_capture node can have zero or more channel child nodes and the following attributes:

    -

    - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    versionInteger1
    command_pathStringThe full path to the caiman executable
    typeStringThe type attribute can have one of three possible values: none, energy_probe or ni-daq. none means no energy data is collected during a capture. energy_probe or ni-daq define the hardware used to capture the energy data from the target.

    -

    channel

    -

    The energy_capture node can any number of channel nodes. The channel node has the following attributes:

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    idIntegerThe channel number
    resistanceIntegerThe channel resistance, set using the resistance field.
    powerBooleanTrue if power data is to be collected and displayed
    voltageBooleanSet to yes if the Voltage checkbox has been enabled for this channel.
    currentBooleanSet to yes if the Current checkbox has been enabled for this channel.

    -

    Example:

    -

    - <?xml version="1.0" encoding="US-ASCII"?>
    - <session version="1" call_stack_unwinding="yes" parse_debug_info="yes" high_resolution="no" buffer_mode="streaming" sample_rate="low" duration="0" target_host="10.99.3.109" target_port="8080" live_rate="100">
    -   <image path="H:\ls"/>
    -   <image path="H:\libc.so.6"/>
    -   <energy_capture version="1" command_path="C:\Program Files (x86)\DS-5\bin\caiman.exe" type="none">
    -     <channel id="0" resistance="20" power="yes" voltage="yes" current="yes"/>
    -   </energy_capture>
    - </session> -

    -

    Captured

    -

    Captured XML contains information about a capture session. This is very similar to Configuration XML

    -

    captured

    -

    The captured root node of Captured XML has one target child node, one counters child node, and the following attributes:

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    versionInteger1
    live_energy_deltaIntegerThis attribute is added by Streamline
    createdIntegerCapture date in seconds since the epoch (midnight January 1, 1970 UTC). If you are doing a local capture, gator populates this attribute. Otherwise, Streamline adds this attribute.
    protocolInteger16
    backtrace_processingStringThe value of backtrace_processing can be either gator or none. This attribute is optional and the default value is gator. Indicates the type of call stack post-processing to use.

    -

    target

    -

    The captured node always contains one target child node. The target child node has the following attributes:

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    nameStringThe name of the target
    sample_rateIntegerNumber of samples collected per second
    coresIntegerNumber of cores on the target
    cpuidHex IntegerThe cpuid of a core. For example, 0xc08
    supports_liveBooleanIndicates if the Counter, Block Counter and Scheduler Trace Frames are flushed to Streamline for the Live view.

    -

    counters

    -

    The captured node always contains one counters node. The counters node has the following child node:

    -

    counter

    -

    The counters node can contain any number of counter child nodes. The counter child node contains the following attributes:

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    keyHex IntegerThe key for this counter in the APC data.
    typeStringThe same as the counter attribute in the configuration node of Configuration XML.
    eventHex IntegerThe same as the event attribute in the configuration node of Configuration XML.
    countIntegerThe count value used during the capture session. Dictated how many samples had to be collected before triggering the event. This can only be set on one counter. This attribute is optional.

    -

    Example:

    -

    - <?xml version="1.0" encoding="utf-8"?>
    - <captured version="1" created="1361467764" protocol="16">
    -   <target sample_rate="100" cores="5" cpuid="0xc0f"/>
    -   <counters>
    -     <counter key="0x3" type="ARM_Cortex-A7_cnt1" event="0x10"/>
    -     <counter key="0x4" type="ARM_Cortex-A7_cnt2" event="0x16"/>
    -     <counter key="0x1" type="ARM_Cortex-A7_ccnt" event="0xff"/>
    -     <counter key="0x2" type="ARM_Cortex-A7_cnt0" event="0x8"/>
    -     <counter key="0x15" type="Linux_power_cpu_freq" event="0x0"/>
    -     <counter key="0x9" type="Linux_block_rq_rd" event="0x0"/>
    -     <counter key="0x8" type="Linux_block_rq_wr" event="0x0"/>
    -     <counter key="0xc" type="Linux_meminfo_memfree" event="0x0"/>
    -     <counter key="0xd" type="Linux_meminfo_memused" event="0x0"/>
    -     <counter key="0x12" type="Linux_net_rx" event="0x0"/>
    -     <counter key="0x13" type="Linux_net_tx" event="0x0"/>
    -   </counters>
    - </captured> -

    -

    APC Frame Format

    -

    Overview

    -

    The XML files and .apc data collected by Streamline are placed in an .apc folder. When Streamline processes this folder, it creates a db folder, followed by a separate .apd folder.

    -

    Note: The APC files are ten-digit files with no extension starting with 0000000000.

    -

    When creating a new report from the same .apc folder, Streamline does not regenerate the db folder, even if the .apc data has changed. In other words, the .apc data is ignored if a valid db folder exists. To ensure Streamline generates a new report from the .apc data, delete the db directory. If this folder is missing, Streamline recreates it from the .apc data files.

    -

    Types

    -
    -
    int32
    4-byte signed little endian
    -
    packed32
    variable length packed 4-byte signed value, see Packed Values
    -
    packed64
    variable length packed 8-byte signed value, see Packed Values
    -
    string
    A packed32 length followed by the specified number of characters
    -
    #
    A constant packed32 value of #, ex: 5 is the packed32 number 5
    -
    timestamp
    packed64 monotonic time value in nanoseconds relative to the monotonic delta from the Summary Message
    -
    -

    Packed Values

    -

    To reduce their size, integers are packed. This is done by avoiding the transmission of duplicate high bits. The value is split into 7 bit bytes in little endian order. The most significant bit of the byte is set to 1, if there is a subsequent byte for this value. On the last byte, the most significant bit is set to 0. For positive values, the most signifiant encoded bit must be 0 and for negative numbers it must be 1. This is very similar to signed LEB128 used in DWARF.

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    BitsLast valueByte 1Byte 2Byte 3Byte 4Byte 5
    31-21474836481XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb01111XXXb
    27-1342177281XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
    20-10485761XXXXXXXb1XXXXXXXb01XXXXXXb
    13-81921XXXXXXXb01XXXXXXb
    6-6401XXXXXXb
    66300XXXXXXb
    1381911XXXXXXXb00XXXXXXb
    2010485751XXXXXXXb1XXXXXXXb00XXXXXXb
    271342177271XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
    3121474836471XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb00000XXXb

    -

    For example, 429389 (01101000110101001101b) would be encoded as 0xCD (11001101b) 0x9A (10011010b) 0x1A (00011010b)

    -

    Packed 64 values work in much the same way:

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    BitsLast valueByte 1Byte 2Byte 3Byte 4Byte 5Byte 6Byte 7Byte 8Byte 9Byte 10
    63-92233720368547758081XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb0111111Xb
    62-46116860184273879041XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
    55-360287970189639681XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
    48-2814749767106561XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
    41-21990232555521XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
    34-171798691841XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
    27-1342177281XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
    20-10485761XXXXXXXb1XXXXXXXb01XXXXXXb
    13-81921XXXXXXXb01XXXXXXb
    6-6401XXXXXXb
    66300XXXXXXb
    1381911XXXXXXXb00XXXXXXb
    2010485751XXXXXXXb1XXXXXXXb00XXXXXXb
    271342177271XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
    34171798691831XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
    4121990232555511XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
    482814749767106551XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
    55360287970189639671XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
    6246116860184273879031XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
    6392233720368547758071XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb0000000Xb

    -

    For example, -4758616141418899142 would be encoded as 0xBA 0xB2 0xA5 0xA2 0xCE 0xFA 0xFF 0xFA 0xBD 0x7F.

    -

    Frames consist of a header followed by a body of zero or more type specific messages

    -

    Ordering

    -

    The timestamp order of messages is significant and must be in-order on the same core. Timestamps within a frame must also be in order. A specific counter is only be populated in Counter frames or Block Counter frames, not a mix of both.

    -

    Required Messages

    -

    To generate a valid capture at least one Sched Switch, Counter or Block Counter message must be present. All other messages are optional.

    -

    Frame Header

    -

    - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    LengthLittle Endian int32Number of bytes after the length in the frame
    Codepacked32Indicates the type of this frame. - - - - - - - - - - -
    1= Summary
    2= Backtrace
    3= Name
    4= Counter
    5= Block Counter
    6= Annotate
    7= Sched Trace
    8= GPU Trace
    9= Idle
    -
    Corepacked32The processor that originated the messages in the frame. This field must always be present but is ignored for Summary, Counter, Annotate, GPU Trace and Idle Frames as these frames can have messages from multiple cores.

    -

    If there are multiple message types for a frame, each message will start with an unique code

    -

    Summary Frame Messages

    -

    The summary frame will appear only once and have only have one message. It is recommended that this is the first frame sent to Streamline so the Newline Canary can be checked for correctness before any other processing occurs.

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Newline CanarystringAlways "1\n2\r\n3\r4\n\r5"
    Timestamppacked64Current system time in nanoseconds since the epoch (midnight January 1, 1970 UTC) or 0 if the target does not have system time
    Uptimepacked64How long the system has been running in nanoseconds. This is not affected by external influences like changing the system time, ntp, hibernating, etc... Can be used to reference kernel log messages. If the target does not support uptime, send 0 and use a monotonically increasing timer for the timestamp messages.
    Monotonic Deltapacked64The delta applied to the monotonic clock to zero-base the timestamps.
    Attributes  - Zero or more repetitions of the following: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    KeyStringAttribute key. Must not be empty
    ValueStringAttribute value
    -
    End of AttributesStringAlways the empty string

    -

    Backtrace Frame Messages

    -

    This is used to populate the Call Paths tab

    -
      -
    • Exec cookie vs Offset cookie -
      • If a sample occurs in libx.so called by my-app, the exec cookie is my-app and the offset cookie is libx.so
      -
    • -
    -

    Cookies should be positive. The special values 0 indicates kernel or idle, -1 indicate an invalid cookie and 1 is reserved to avoid confusion with End of Message, 1 below.

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Timestamptimestamp 
    Exec Cookiepacked32Cookie of the current process
    pidpacked32Process ID. In Linux, this is the Thread Group ID
    tidpacked32Thread ID. In Linux, this is the PID
    InKernelpacked32 - - - -
    0= not in kernel
    1= in kernel
    -
    Body  - One or more repetitions of the following: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Offset Cookiepacked32Executable or library at the offset
    Offsetpacked64Offset in the backtrace
    -
    End of Message1 

    -

    Name Frame Messages

    -

    Cookie Name Message

    -

    This is used to get the name for the Process Handle. Cookies are stored in a pseudo hashmap which limits the number of possible collisions, thus duplicate cookies may be emitted. In addition, cookies are stored per core, thus when a task migrates to a new core, a fresh cookie may be emitted for that core. However cookies are unique across all cores.

    -

    - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code1 
    Cookiepacked32Cookie key
    NamestringCookie value

    -

    Thread Name Message

    -

    This is used to show thread names in the Thread Disclosure. Thread names are stored in a pseudo hashmap which to limit the number of times the name is sent, but duplicate thread names may be emitted. Thread numbers can be reused as long as the scheduler sched thread exit message is sent before it is reused.

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code2 
    Timestamptimestamp 
    Thread IDpacked32tid of the named thread
    NamestringName of the thread

    -

    Core Name Message

    -

    This is used to identify clusters and in the tooltip in X-Ray mode

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code3 
    Corepacked32The core which the cpuid and Name describe
    cpuidpacked32cpuid of this core. For example, 0xc08
    NamestringHuman readable name of this core. For example, Cortex-A8

    -

    Counter Frame Messages

    -

    This is used to populate Charts in the Timeline view

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Timestamptimestamp 
    Corepacked32Core to which this counter applies
    Keypacked32Key in Captured XML
    Valuepacked64Value of the specified counter

    -

    Block Counter Frame Messages

    -

    Block counters are the same as counters, but used less space when multiple counters are sampled at the same timestamp and on the same core. To start the block, the key of 0 and a timestamp value is emitted. Then any counters sampled at that time are emitted. A block of counters - counters using the same timestamp - must all be emitted in the same frame. For example, the first block counter message emitted in a frame must be the timestamp.

    -

    - - - - - - - - - - - - - - - -
    NameTypeDescription
    Keypacked32Zero for timestamp or key in Captured XML
    Valuepacked64Value of the specified counter

    -

    Annotate Frame Messages

    -

    Annotations are messages sent by arbitrary userspace programs, so their format is different from other messages.

    -

    A single annotation may be broken across frame boundaries. This is why the Annotation Message has a size and the Userspace Annotations either have a size or are '\n' terminated.

    -

    To colorize any ASCII string within the annotation data, prefix the string with 0x1B escape character followed by a 3-byte RGB value

    -

    Annotate Message

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Corepacked32 
    tidpacked32Thread ID (in Linux this is the PID)
    Timestamptimestamp 
    Sizepacked32Message size
    Body Userspace Annotation data fragment

    -

    Userspace Annotations

    -

    Annotations belong to a channel with 0 being the default channel. Channels belong to groups with 0 as the default group.

    -

    ASCII String Annotation

    -

    This is used to add a line in the Log tab. Can also be sent from the command line. For example, echo 'Hello World' > /dev/gator/annotate

    -

    - - - - - - - - - - - - - - - -
    NameTypeDescription
    ColorcolorOptional, 0x1B, RR, GG, BB
    ASCII StringZero or more ASCII characters followed by '\n'Text annotation

    -

    Create Group Annotation

    -

    This is used to name a group in the Thread Disclosure

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Escape Code0x1C 
    Marker Code0x8 
    GroupLittle Endian int32 
    String LengthLittle Endian int16 
    UTF-8 StringString Length UTF-8 bytesChannel name

    -

    Create Channel Annotation

    -

    This is used to name a channel in the Thread Disclosure

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Escape Code0x1C 
    Marker Code0x7 
    ChannelLittle Endian int32 
    GroupLittle Endian int32Group the channel belongs to
    String LengthLittle Endian int16 
    UTF-8 StringString Length UTF-8 bytesChannel name

    -

    UTF-8 String Annotations

    -

    This is used to add a line in the Log tab.

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Escape Code0x1C 
    Marker Code0x6 
    ChannelLittle Endian int32Channel the annotation belongs to
    String LengthLittle Endian int16 
    ColorcolorOptional, 0x1B, RR, GG, BB, counts against String Length
    UTF-8 StringString Length UTF-8 bytesText annotation

    -

    Visual Annotation

    -

    This is used to add a line in the Log tab and an image to the Visual Annotation Chart.

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Escape Code0x1C 
    Visual Code0x4 
    String LengthLittle Endian int16 
    UTF-8 StringString Length UTF-8 bytesText annotation
    Image LengthLittle Endian int32 
    Image DataImage Length bytes 

    -

    Marker Annotation

    -

    This is used to add a Bookmark

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Escape Code0x1C 
    Marker Code0x5 
    String LengthLittle Endian int16 
    ColorcolorOptional, 0x1B, RR, GG, BB, counts against String Length
    UTF-8 StringString Length UTF-8 bytesText annotation

    -

    Scheduler Trace Frame Messages

    -

    As with Backtrace Frame Messages, the cookies should be positive. The special cookie value 0, in conjunction of a pid of 0, indicates idle. A cookie value of 0 and a pid of > 0 indicates kernel.

    -

    Sched Thread Start

    -

    This is used by the Heat Map to identify when a thread starts

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code3 
    Timestamptimestamp 
    pidpacked32Process ID (in Linux this is the Thread Group ID)
    tidpacked32Thread ID (in Linux this is the PID)
    Cookiepacked32Cookie of the current process

    -

    Sched Switch

    -

    This is used to populate the CPU Activity Chart and the Heat Map

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code1 
    Timestamptimestamp 
    pidpacked32Process ID (in Linux this is the Thread Group ID)
    tidpacked32Thread ID (in Linux this is the PID)
    Cookiepacked32Cookie of the current process
    Statepacked32State - - - - -
    0= Waiting on other event besides I/O
    1= Contention/pre-emption
    2= Waiting on I/O
    -

    -

    Sched Thread Exit

    -

    This is used by the Heat Map to identify when a thread terminates

    -

    - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code2 
    Timestamptimestamp 
    tidpacked32Thread ID (in Linux this is the PID)

    -

    GPU Trace Frame Messages

    -

    GPU Start

    -

    This is used to indicate a part of the GPU has begun execution

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code1 
    Timestamptimestamp 
    Unitpacked32GPU Unit
    Corepacked32GPU Unit Core
    pidpacked32Process ID (in Linux this is the Thread Group ID)
    tidpacked32Thread ID (in Linux this is the PID)

    -

    GPU Stop

    -

    This is used to indicate a part of the GPU has ceased execution

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code2 
    Timestamptimestamp 
    Unitpacked32GPU Unit
    Corepacked32GPU Unit Core

    -

    Idle Frame Messages

    -

    Enter Idle

    -

    This is used to indicate that a core has ceased execution.

    -

    - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code1 
    Timestamptimestamp 
    Corepacked32 

    -

    Exit Idle

    -

    This is used to indicate that a core has resumed execution.

    -

    - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code2 
    Timestamptimestamp 
    Corepacked32 

    -

    Sequence Diagrams

    -

    Configuration

    -

    The diagrams in this topic depict the series of events that are triggered when you click various buttons in the Streamline user interface. Here are the events that occur when the Counter Configuration button is clicked in Streamline where $VER is 16

    -
    -

    This is the sequence of events when you click the Load Defaults in the Counter Configuration dialog box:

    -
    -

    This diagram illustrates the sequence of events that occur when you click either the Cancel or Close button in the Counter Configuration dialog box:

    -
    -

    This is the sequence of events triggered when the Save button is clicked from the Counter Configuration dialog box:

    -
    -

    Note: After you click Save, Cancel or Close, the Counter Configuration dialog box closes.

    -

    Capture

    -

    Here are the events that occur when you click the Start Capture button in Streamline, when the $VER is 16.

    -
    -

    At any point during the capture, Streamline can send a ping to verify that the host is still running. If the ping is not acknowledged, Streamline ends the capture.

    -
    -

    Local Capture

    -

    Streamline also support a local capture mode, a mode in which data is collected without interaction with Streamline. In this case the Target-Host Protocol is omitted. Instead a directory, ending in .apc, is provided to Streamline. This directory contains captured.xml containing the Captured XML, session.xml containing the Session XML, events.xml containing the Events XML and 0000000000 which contains the APC Data with one or more structures of the following format:

    -

    - - - - - - - - - - - - - - - - -
    NameTypeDescription
    LengthLittle Endian int32Number of bytes in the body
    bodyAPC Data 

    -
    - - diff --git a/protocol/gator/gator_protocol-5-17.html b/protocol/gator/gator_protocol-5-17.html deleted file mode 100644 index f366964a..00000000 --- a/protocol/gator/gator_protocol-5-17.html +++ /dev/null @@ -1,2103 +0,0 @@ - - - - - - - - -
    -

    Gator v17 (DS-5 v5.17) Protocol

    -

    Index

    - -

    Introduction

    -

    This document describes the TCP/IP protocol used by gator or other implementing clients to communicate with Streamline version 5.17 or later. Use this information to build a customized client to communicate profiling data to Streamline. The gator source code, distributed as part of DS-5, is the reference implementation of this protocol. The protocol may change with future releases of Streamline, but Streamline will maintain backwards compatibility with this version of the protocol so that clients need only implement one version of the protocol. Streamline requires that your client is able to parse and generate simple XML and ignore additional or unexpected nodes or attributes. Because the XML features described in this protocol documentation are the only ones used, this protocol does not require the more complex features of XML.

    -

    Changes in v17 (DS-5 v5.17)

    -

    gator v17, the version of gator shipped with Streamline version 5.17, has a few important updates that you should familiarize yourself with before implementing or updating your own customized Streamline TCP/IP protocol.

    - -

    Target-Host Protocol

    -

    Magic Exchange

    -

    A handshake is required so that your client and Streamline can recognize each other. It consists of ASCII newline (\n) delimited strings. If the client receives a string it does not recognize, the string must be discarded and another string is read.

    -

    The standard Streamline client is gator. But, as you can customize gator and call it what you wish, the term client is used generically to refer to your customized protocol.

    -
      -
    1. The client receives Streamline's highest supported protocol version VERSION $VER\n, for example if Streamline supports up to version 23, the client would receive VERSION 23\n.
    2. -
    3. The client receives STREAMLINE\n
    4. -
    5. Send GATOR 17\n
    6. -
    -

    Further communication from Streamline comes as Commands

    -

    Command Header

    -

    Streamline issues commands that consist of a header and a body. Streamline expects a Response to these commands from the client.

    -

    - - - - - - - - - - - - - - - -
    NameTypeDescription
    Codeint8The type of command - - - - - - - -
    0= Request XML
    1= Deliver XML
    2= APC Start
    3= APC Stop
    4= Disconnect
    5= Ping
    -
    LengthLittle Endian int32Number of bytes in the body

    -

    If the client receives an unrecognized command, it should respond with a NAK.

    -

    Request XML Body

    -

    Command code 0 is a request from Streamline for XML. The root node is request and it has the type attribute that tells the client which xml is required. For example, this is a request for Events XML

    -

    - <?xml version="1.0" encoding="US-ASCII"?>
    - <request type="events">
    - </request> -

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    RequestResponse CodeResponse Body
    <request type="events">XMLEvents XML
    <request type="configuration">XMLConfiguration XML
    <request type="counters">XMLCounters XML
    <request type="captured">XMLCaptured XML Streamline requests Captured XML prior to starting a capture.
    <request type="defaults">XMLdefault Configuration XML

    -

    Deliver XML Body

    -

    The Deliver XML command sends XML to the client:

    -

    - - - - - - - - - - - - -
    RequestResponse Code
    Session XMLACK
    Configuration XMLACK

    -

    APC Start Body

    -

    The APC Start command does not have a body. This command initiates a capture and readies Streamline to receive APC Data Responses. No ACK is expected and no further XML exchange takes place. If a failure occurs, the client should send an Error.

    -

    APC Stop Body

    -

    The APC Stop command also does not have a body. This command triggers the end of the APC and no ACK is expected. APC Data Responses can continue to arrive until all captured data is sent, then the connection should be closed. If a failure occurs, the client should send an Error.

    -

    Disconnect Body

    -

    The Disconnect command, which closes the connection to the target, does not contain a command body. No ACK is expected.

    -

    Ping Body

    -

    The Ping command does not have a body. Send an ACK response to this command.

    -

    Response Format

    -

    Responses consist of a header followed by a body

    -

    Response Header

    -

    The format for the response header is identical to that of the Command Header but the Codes are different

    -

    - - - - - - - - - - - - - - - -
    NameTypeDescription
    Codeint8The type of command - - - - - - -
    1= XML
    3= APC Data
    4= ACK
    5= NAK
    0xFF= Error
    -
    LengthLittle Endian int32Number of bytes in the body

    -

    XML Body

    -

    The body should contain XML, the format of which is dependent on the Request type. For a list of types, see Request XML Body

    -

    APC Data Body

    -

    The APC body should contain an APC Frame. If the length is zero, it is the End of Sequence message which indicates that all APC Frames have been transmitted to Streamline.

    -

    ACK Body

    -

    This response, which indicates the Command was successful, does not have a response body.

    -

    NAK Body

    -

    Indicates a synchronous non-fatal error occurred when handling a request. It can contain a UTF-8 error message. The length is specified in the header, so no NULL character is expected. Indicates that the Command failed, but that the connection can continue.

    -

    Error Body

    -

    Indicates a synchronous fatal error occurred when responding to a request. A UTF-8 error message. The length is specified in the header, so no NULL character is expected. Use this response when the error is terminal and the connection must be closed. Errors may be sent without a request, but Streamline may not process them immediately.

    -

    XML

    -

    Events

    -

    The Events XML defines the list of counters that you can choose from in the Counter Configuration dialog box. Modify this list to create your own custom counters.

    -

    events

    -

    The events root node of Events XML can have any number of counter_set and category child nodes.

    -

    counter_set

    -

    The counter_set node has no children and the following attributes. Counter sets are used when the number of counters that can be enabled in a category is restricted. Streamline will respect the restriction and assign a name from the set to a counter in Configuration XML.

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    nameStringName of the counter_set
    countStringNumber of counters in the set. Counter names are derived by appending a number, starting at zero, to the set name. Ex, if the set name is ARM_Cortex-A8_cnt and the count is 4, then the counter names in the set are ARM_Cortex-A8_cnt0, ARM_Cortex-A8_cnt1, ARM_Cortex-A8_cnt2 and ARM_Cortex-A8_cnt3
    titleStringAppended to the title of the event when counter_set is a child of category, shown in Streamline before the name. Used to group counters.
    descriptionStringThe value of this attribute is appended to the description to show in Streamline when counter_set is a child of category. Used as the tooltip for the counter

    -

    category

    -

    The category node can have any number of event and option_set child nodes. It can also have one or more counter_set child nodes instead of the counter_set attribute if the same set of child event nodes show up for to multiple counter sets. The category node can have the following attributes:

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    nameStringThe name of the category. The value given here appears as the category name in the Counter Configuration dialog box in Streamline.
    counter_setStringDefines the counter_set to be used. You must use this attribute if any child event uses the event attribute and there are no child counter_set nodes present.
    per_cpuBooleanDefines whether or not Streamline collects data on a per cpu basis. Set this value to yes and Streamline collects data from each cpu separately for these counters. The default value is no.
    supports_event_based_samplingBooleanUse yes or no to define whether or not the counters in this category can be used for event based sampling. The default value is no.

    -

    option_set

    -

    The event node has one or more option_set child nodes and the following attributes. Use this node when the same event applies to multiple devices. It has the following attributes:

    -

    - - - - - - - - - - -
    NameTypeDescription
    nameStringThe name of this option_set

    -

    option

    -

    The option_set node contains one or more option child nodes. The option node has no children and the following attributes

    -

    - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    event_deltaHex IntegerThe offset to add to the applicable event to get the event number.
    nameStringThe name of the device. The value of name is appended to the event name.
    descriptionStringA description of the device option. This description is appended to the event description.

    -

    event

    -

    The event node has no children and the following attributes

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    counterStringEvery event element must have either the counter or event attribute defined. Use the counter attribute for fixed counter types, like cycle count. Use the event attribute for all other events. The counter attribute is the name of the counter.
    eventHex Integer Architecture specific or implementation-specific event number, in hexadecimal, determined from either the architecture specification document or the Technical Reference Manual of the processor. This attribute is required if the element does not have a counter attribute.
    option_setStringThe name of the option_set to use.
    titleStringTitle of the event, shown in Streamline before the name. Use this attribute to group counters.
    nameStringName of the event, shown in Streamline after the title.
    per_cpuBooleanDefines whether or not Streamline collects data on a per cpu basis. Set this value to yes and Streamline collects data from each cpu separately for this event. The default is the value of the per_cpu attribute of the category node.
    supports_event_based_samplingBooleanUse yes or no to define whether or not the event can be used for event based sampling. This value defaults to the category value if the attribute is not present in the event.
    displayStringUse one of the following values with the display attribute: average, maximum, minimum, hertz, accumulate. This is the same as adding .avg, .max, .min or .hz to the counter name in the chart configuration panel of Streamline. The default value is accumulate. This attribute is optional.
    unitsStringDefines the unit type to display in Streamline. This attribute is optional.
    modifierIntegerOptional, number to divide read numbers by for fixed point math. This attribute is optional.
    derivedBooleanDefines whether or not the data is derived from the data of another chart.
    series_compositionStringDefines how to arrange the data in the Timeline view. Enter either overlay or stacked as the value for this attribute. This attribute is optional and the default value is stacked.
    rendering_typeStringThe type of chart to render for the Timeline view in Streamline. This attribute is optional and can be set to either bar or fill. The default value is fill.
    average_selectionBooleanSets whether or not average values are displayed by the Cross Section Marker in Streamline. This attribute is optional.
    average_coresBooleanSet whether or not Streamline averages the values of multiple cores when viewing the aggregate data of a per-cpu chart. This attribute is optional.
    percentageBooleanOptional, Sets whether or not the Timeline view displays data as a percentage of the maximum value in the chart.
    descriptionStringUse this attribute to define a description to show in Streamline. The value of this attribute is used as the tooltip for the counter.

    -

    Events XML example:

    -

    - <?xml version="1.0" encoding="UTF-8"?>
    - <events>
    -   <counter_set name="ARM_Cortex-A8_cnt" count="4"/>
    -   <category name="Cortex-A8" counter_set="ARM_Cortex-A8_cnt" per_cpu="yes" supports_event_based_sampling="yes">
    -     <event counter="ARM_Cortex-A8_ccnt" event="0xff" title="Clock" name="Cycles" display="hertz" units="Hz" average_selection="yes" average_cores="yes" description="The number of core clock cycles"/>
    -     <event event="0x0" title="Software" name="Increment" description="Incremented only on writes to the Software Increment Register"/>
    -     <event event="0x1" title="Cache" name="Instruction refill" description="Instruction fetch that causes a refill of at least the level of instruction or unified cache closest to the processor"/>
    -     <!-- ... -->
    -   </category>
    -   <category name="CCI-400" counter_set="cci-400_cnt" supports_event_based_sampling="yes">
    -     <event counter="cci-400_ccnt" event="0xff" title="CCI-400" name="Cycles" display="hertz" units="Hz" average_selection="yes" description="The number of core clock cycles"/>
    -     <option_set name="Slave">
    -       <option event_delta="0x0" name="S0" description="Slave interface 0"/>
    -       <option event_delta="0x20" name="S1" description="Slave interface 1"/>
    -       <option event_delta="0x40" name="S2" description="Slave interface 2"/>
    -       <!-- ... -->
    -     </option_set>
    -     <event event="0x0" option_set="Slave" title="CCI-400" name="Read: any" description="Read request handshake: any"/>
    -     <event event="0x1" option_set="Slave" title="CCI-400" name="Read: transaction" description="Read request handshake: device transaction"/>
    -     <event event="0x2" option_set="Slave" title="CCI-400" name="Read: normal" description="Read request handshake: normal, non-shareable or system-shareable, but not barrier or cache maintenance operation"/>
    -     <!-- ... -->
    -     <option_set name="Master">
    -       <option event_delta="0xa0" name="M0" description="Master interface 0"/>
    -       <option event_delta="0xc0" name="M1" description="Master interface 1"/>
    -       <option event_delta="0xe0" name="M2" description="Master interface 2"/>
    -       <!-- ... -->
    -     </option_set>
    -     <event event="0x14" option_set="Master" title="CCI-400" name="Retry fetch" description="RETRY of speculative fetch transaction"/>
    -     <event event="0x15" option_set="Master" title="CCI-400" name="Read stall: address hazard" description="Read request stall cycle because of an address hazard"/>
    -     <event event="0x16" option_set="Master" title="CCI-400" name="Read stall: ID hazard" description="Read request stall cycle because of an ID hazard"/>
    -     <!-- ... -->
    -   </category>
    -   <category name="Mali GPU Fragment Processor">
    -     <counter_set name="ARM_Mali-400_FP0_cnt" title="Mali-400 FP0" description="Mali GPU Fragment Processor 0" count="2"/>
    -     <counter_set name="ARM_Mali-400_FP1_cnt" title="Mali-400 FP1" description="Mali GPU Fragment Processor 1" count="2"/>
    -     <counter_set name="ARM_Mali-400_FP2_cnt" title="Mali-400 FP2" description="Mali GPU Fragment Processor 2" count="2"/>
    -     <!-- ... -->
    -     <event event="0x0" title="Mali-400 FP" name="Active clock cycles" description="Active clock cycles, between polygon start and IRQ."/>
    -     <event event="0x2" title="Mali-400 FP" name="Total bus reads" description="Total number of 64-bit words read from the bus."/>
    -     <event event="0x3" title="Mali-400 FP" name="Total bus writes" description="Total number of 64-bit words written to the bus."/>
    -     <!-- ... -->
    -   </category>
    -   <category name="Linux">
    -     <event counter="Linux_irq_softirq" title="Interrupts" name="SoftIRQ" per_cpu="yes" description="Linux SoftIRQ taken"/>
    -     <event counter="Linux_irq_irq" title="Interrupts" name="IRQ" per_cpu="yes" description="Linux IRQ taken"/>
    -     <event counter="Linux_block_rq_wr" title="Disk IO" name="Write" units="B" description="Disk IO Bytes Written"/>
    -     <!-- ... -->
    -   </category>
    -   <category name="hwmon">
    -     <event counter="hwmon_ab8500-isa-0000_0" title="Temperature" name="ext_rtc_xtal" display="average" units="C" modifier="1000" average_selection="yes" description="libsensors Temperature sensor ext_rtc_xtal (hwmon_ab8500-isa-0000_0)"/>
    -     <event counter="hwmon_ab8500-isa-0000_1" title="Temperature" name="ext_db8500" display="average" units="C" modifier="1000" average_selection="yes" description="libsensors Temperature sensor ext_db8500 (hwmon_ab8500-isa-0000_1)"/>
    -     <event counter="hwmon_ab8500-isa-0000_2" title="Temperature" name="bat_temp" display="average" units="C" modifier="1000" average_selection="yes" description="libsensors Temperature sensor bat_temp (hwmon_ab8500-isa-0000_2)"/>
    -     <!-- ... -->
    -   </category>
    - </events> -

    -

    Configuration

    -

    Configuration XML defines the set of counters that are enabled for a capture session. It is sent to the client using the Deliver XML command. Any counters listed in Configuration XML that are not available on the target are ignored.

    -

    configurations

    -

    The configurations root node of Configuration XML can have any number of configuration child nodes and has one attribute:

    -

    - - - - - - - - - - -
    NameTypeDescription
    revisionInteger2

    -

    configuration

    -

    The configuration node has no children and has the following attributes:

    -

    - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    counterStringEvery configuration element must have either the counter or event attribute defined. Use the counter attribute for fixed counter types and the event attribute for all other events. If Events XML did not have a counter for this event, a counter from the related counter_set can be taken. See the description of counter_set in Events XML. This attribute is required.
    eventHex IntegerArchitecture-specific or implementation-specific event number, in hexadecimal, determined from either the architecture specification document or the Technical Reference Manual of the processor. This attribute is required if the element does not have a counter attribute.
    countIntegerTells the client how many samples to collect before triggering the event. This attribute is optional.

    -

    Configuration XML example:

    -

    - <?xml version="1.0" encoding="US-ASCII"?>
    - <configurations revision="2">
    -   <configuration counter="ARM_Cortex-A8_ccnt" event="0xFF"/>
    -   <configuration counter="ARM_Cortex-A8_cnt0" event="0x8"/>
    -   <configuration counter="ARM_Cortex-A8_cnt1" event="0x44"/>
    -   <configuration counter="ARM_Cortex-A8_cnt2" event="0x43"/>
    -   <configuration counter="ARM_Cortex-A8_cnt3" event="0x10"/>
    -   <configuration counter="ARM_Cortex-A9_ccnt" event="0xFF"/>
    -   <configuration counter="ARM_Cortex-A9_cnt0" event="0x68"/>
    -   <configuration counter="ARM_Cortex-A9_cnt1" event="0x6"/>
    -   <configuration counter="ARM_Cortex-A9_cnt2" event="0x7"/>
    -   <configuration counter="ARM_Cortex-A9_cnt3" event="0x3"/>
    -   <configuration counter="ARM_Cortex-A9_cnt4" event="0x4"/>
    -   <configuration counter="Linux_block_rq_wr"/>
    -   <configuration counter="Linux_block_rq_rd"/>
    -   <configuration counter="Linux_meminfo_memused"/>
    -   <configuration counter="Linux_meminfo_memfree"/>
    -   <configuration counter="Linux_power_cpu_freq"/>
    -   <configuration counter="cci-400_cnt0" event="0xB4"/>
    -   <configuration counter="cci-400_cnt1" event="0xD4"/>
    -   <configuration counter="cci-400_cnt2" event="0xB5"/>
    -   <configuration counter="hwmon_arm,vexpress-amp-isa-0011_0"/>
    -   <configuration counter="hwmon_arm,vexpress-amp-isa-0010_0"/>
    - </configurations> -

    -

    Counters

    -

    Counters XML lists the counters available on the target.

    -

    counters

    -

    The counters root node of Counters XML can have any number of counter child nodes

    -

    counter

    -

    The counter node has the following attribute

    -

    - - - - - - - - - - -
    NameTypeDescription
    nameStringAn available counter name from counter_set or the counter attribute of the event node.

    -

    Counters XML Example:

    -

    - <?xml version="1.0" encoding="utf-8"?>
    - <counters>
    -   <counter name="Linux_power_cpu_idle"/>
    -   <counter name="Linux_power_cpu_freq"/>
    -   <counter name="Linux_sched_switch"/>
    -   <counter name="ARM_Cortex-A8_cnt3"/>
    -   <counter name="ARM_Cortex-A8_cnt2"/>
    -   <counter name="ARM_Cortex-A8_cnt1"/>
    -   <counter name="ARM_Cortex-A8_cnt0"/>
    -   <counter name="ARM_Cortex-A8_ccnt"/>
    -   <counter name="Linux_net_tx"/>
    -   <counter name="Linux_net_rx"/>
    -   <counter name="mmaped_cnt2"/>
    -   <counter name="mmaped_cnt1"/>
    -   <counter name="mmaped_cnt0"/>
    -   <counter name="Linux_meminfo_bufferram"/>
    -   <counter name="Linux_meminfo_memused"/>
    -   <counter name="Linux_meminfo_memfree"/>
    -   <counter name="Linux_irq_softirq"/>
    -   <counter name="Linux_irq_irq"/>
    -   <counter name="Linux_block_rq_rd"/>
    -   <counter name="Linux_block_rq_wr"/>
    - </counters> -

    -

    Session

    -

    Session XML is created by Streamline and delivered to the client. Values in Session XML are based on the settings defined in the Capture & Analysis Options dialog box.

    -

    Note: Session XML must be delivered by Streamline via the Deliver XML command before it is requested by Streamline. Send back the received XML.

    -

    session

    -

    The session root node of Session XML can have any number of image child nodes, zero or one energy_capture child nodes and has the following attributes

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    versionInteger1
    call_stack_unwindingBooleanThe value is yes if the Call Stack Unwinding checkbox is selected, or no if it is not.
    parse_debug_infoBooleanThe value is yes if the Process Debug Information checkbox is selected, no if it is not.
    high_resolutionBooleanThe value is yes if the High Resolution Timeline checkbox is selected, no if it is not.
    buffer_modeStringThe mode chosen using the Buffer Mode drop-down menu. It can set to streaming or one of the following store-and-forward buffers: large - 16MB, medium - 4MB, or small - 1MB.
    sample_rateStringThe sample rate chosen using the Sample Rate drop-down menu. It can be set to one of the following options: normal, low, or none.
    durationIntegerThe maximum duration of the capture session, in seconds.
    target_hostStringThe address of the target.
    target_portIntegerThe target port.
    live_rateStringThe value of this attribute dictates how often, in milliseconds, the Name, Counter, Block Counter and Scheduler Trace Frames should be flushed to Streamline for the Live view.

    -

    image

    -

    There is no restriction to the number of image nodes the session node can have. The image node has no child nodes and the following attributes:

    -

    - - - - - - - - - - - - - - - -
    NameTypeDescription
    pathStringThis attribute defines the Program Image. This attribute can be used during local capture to copy images into the .apc folder. You can update all Program Images in Streamline post-capture.
    enabledBooleanA yes value means the Program Image is enabled, a no value means it is not. The default value is no.

    -

    energy_capture

    -

    The session node can either have zero or one energy_capture child nodes. The energy_capture node can have zero or more channel child nodes and the following attributes:

    -

    - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    versionInteger1
    command_pathStringThe full path to the caiman executable
    typeStringThe type attribute can have one of three possible values: none, energy_probe or ni-daq. none means no energy data is collected during a capture. energy_probe or ni-daq define the hardware used to capture the energy data from the target.

    -

    channel

    -

    The energy_capture node can any number of channel nodes. The channel node has the following attributes:

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    idIntegerThe channel number
    resistanceIntegerThe channel resistance, set using the resistance field.
    powerBooleanTrue if power data is to be collected and displayed
    voltageBooleanSet to yes if the Voltage checkbox has been enabled for this channel.
    currentBooleanSet to yes if the Current checkbox has been enabled for this channel.

    -

    Example:

    -

    - <?xml version="1.0" encoding="US-ASCII"?>
    - <session version="1" call_stack_unwinding="yes" parse_debug_info="yes" high_resolution="no" buffer_mode="streaming" sample_rate="low" duration="0" target_host="10.99.3.109" target_port="8080" live_rate="100">
    -   <image path="H:\ls"/>
    -   <image path="H:\libc.so.6"/>
    -   <energy_capture version="1" command_path="C:\Program Files (x86)\DS-5\bin\caiman.exe" type="none">
    -     <channel id="0" resistance="20" power="yes" voltage="yes" current="yes"/>
    -   </energy_capture>
    - </session> -

    -

    Captured

    -

    Captured XML contains information about a capture session. This is very similar to Configuration XML

    -

    captured

    -

    The captured root node of Captured XML has one target child node, one counters child node, and the following attributes:

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    versionInteger1
    live_energy_deltaIntegerThis attribute is added by Streamline
    createdIntegerCapture date in seconds since the epoch (midnight January 1, 1970 UTC). If you are doing a local capture, gator populates this attribute. Otherwise, Streamline adds this attribute.
    protocolInteger17
    backtrace_processingStringThe value of backtrace_processing can be either gator or none. This attribute is optional and the default value is gator. Indicates the type of call stack post-processing to use.

    -

    target

    -

    The captured node always contains one target child node. The target child node has the following attributes:

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    nameStringThe name of the target
    sample_rateIntegerNumber of samples collected per second
    coresIntegerNumber of CPU cores on the target
    cpuidHex IntegerThe cpuid of a core. For example, 0xc08
    supports_liveBooleanIndicates if the Name, Counter, Block Counter and Scheduler Trace Frames are flushed to Streamline for the Live view.

    -

    counters

    -

    The captured node always contains one counters node. The counters node has the following child node:

    -

    counter

    -

    The counters node can contain any number of counter child nodes. The counter child node contains the following attributes:

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    keyHex IntegerThe key for this counter in the APC data.
    typeStringThe same as the counter attribute in the configuration node of Configuration XML.
    eventHex IntegerThe same as the event attribute in the configuration node of Configuration XML.
    countIntegerThe count value used during the capture session. Dictated how many samples had to be collected before triggering the event. This can only be set on one counter. This attribute is optional.

    -

    Example:

    -

    - <?xml version="1.0" encoding="utf-8"?>
    - <captured version="1" created="1361467764" protocol="17">
    -   <target sample_rate="100" cores="5" cpuid="0xc0f"/>
    -   <counters>
    -     <counter key="0x3" type="ARM_Cortex-A7_cnt1" event="0x10"/>
    -     <counter key="0x4" type="ARM_Cortex-A7_cnt2" event="0x16"/>
    -     <counter key="0x1" type="ARM_Cortex-A7_ccnt" event="0xff"/>
    -     <counter key="0x2" type="ARM_Cortex-A7_cnt0" event="0x8"/>
    -     <counter key="0x15" type="Linux_power_cpu_freq" event="0x0"/>
    -     <counter key="0x9" type="Linux_block_rq_rd" event="0x0"/>
    -     <counter key="0x8" type="Linux_block_rq_wr" event="0x0"/>
    -     <counter key="0xc" type="Linux_meminfo_memfree" event="0x0"/>
    -     <counter key="0xd" type="Linux_meminfo_memused" event="0x0"/>
    -     <counter key="0x12" type="Linux_net_rx" event="0x0"/>
    -     <counter key="0x13" type="Linux_net_tx" event="0x0"/>
    -   </counters>
    - </captured> -

    -

    APC Frame Format

    -

    Overview

    -

    The XML files and .apc data collected by Streamline are placed in an .apc folder. When Streamline processes this folder, it creates a db folder, followed by a report folder.

    -

    Note: The APC files are ten-digit files with no extension starting with 0000000000.

    -

    When creating a new report from the same .apc folder, Streamline does not regenerate the db folder, even if the .apc data has changed. In other words, the .apc data is ignored if a valid db folder exists. To ensure Streamline generates a new report from the .apc data, delete the db directory. If this folder is missing, Streamline recreates it from the .apc data files.

    -

    Types

    -
    -
    int32
    4-byte signed little endian
    -
    packed32
    variable length packed 4-byte signed value, see Packed Values
    -
    packed64
    variable length packed 8-byte signed value, see Packed Values
    -
    string
    A packed32 length followed by the specified number of characters
    -
    #
    A constant packed32 value of #, ex: 5 is the packed32 number 5
    -
    timestamp
    packed64 monotonic time value in nanoseconds relative to the monotonic delta from the Summary Message
    -
    -

    Packed Values

    -

    To reduce their size, integers are packed. This is done by avoiding the transmission of duplicate high bits. The value is split into 7 bit bytes in little endian order. The most significant bit of the byte is set to 1, if there is a subsequent byte for this value. On the last byte, the most significant bit is set to 0. For positive values, the most significant encoded bit must be 0 and for negative numbers it must be 1. This is very similar to signed LEB128 used in DWARF.

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    BitsLast valueByte 1Byte 2Byte 3Byte 4Byte 5
    31-21474836481XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb01111XXXb
    27-1342177281XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
    20-10485761XXXXXXXb1XXXXXXXb01XXXXXXb
    13-81921XXXXXXXb01XXXXXXb
    6-6401XXXXXXb
    66300XXXXXXb
    1381911XXXXXXXb00XXXXXXb
    2010485751XXXXXXXb1XXXXXXXb00XXXXXXb
    271342177271XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
    3121474836471XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb00000XXXb

    -

    For example, 429389 (01101000110101001101b) would be encoded as 0xCD (11001101b) 0x9A (10011010b) 0x1A (00011010b)

    -

    Packed 64 values work in much the same way:

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    BitsLast valueByte 1Byte 2Byte 3Byte 4Byte 5Byte 6Byte 7Byte 8Byte 9Byte 10
    63-92233720368547758081XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb0111111Xb
    62-46116860184273879041XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
    55-360287970189639681XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
    48-2814749767106561XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
    41-21990232555521XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
    34-171798691841XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
    27-1342177281XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
    20-10485761XXXXXXXb1XXXXXXXb01XXXXXXb
    13-81921XXXXXXXb01XXXXXXb
    6-6401XXXXXXb
    66300XXXXXXb
    1381911XXXXXXXb00XXXXXXb
    2010485751XXXXXXXb1XXXXXXXb00XXXXXXb
    271342177271XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
    34171798691831XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
    4121990232555511XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
    482814749767106551XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
    55360287970189639671XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
    6246116860184273879031XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
    6392233720368547758071XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb0000000Xb

    -

    For example, -4758616141418899142 would be encoded as 0xBA 0xB2 0xA5 0xA2 0xCE 0xFA 0xFF 0xFA 0xBD 0x7F.

    -

    Frames consist of a header followed by a body of zero or more type specific messages

    -

    Ordering

    -

    The timestamp order of messages is significant and must be in-order on the same core. Timestamps within a frame must also be in order. A specific counter is only be populated in Counter frames or Block Counter frames, not a mix of both.

    -

    Required Messages

    -

    To generate a valid capture at least one Sched Switch, Counter or Block Counter message must be present. All other messages are optional.

    -

    Frame Header

    -

    - - - - - - - - - - - - - - - -
    NameTypeDescription
    Codepacked32Indicates the type of this frame. - - - - - - - - - - -
    1= Summary
    2= Backtrace
    3= Name
    4= Counter
    5= Block Counter
    6= Annotate
    7= Sched Trace
    8= GPU Trace
    9= Idle
    -
    Corepacked32The processor that originated the messages in the frame. This field must always be present but is ignored for Summary, Counter, Annotate, GPU Trace and Idle Frames as these frames can have messages from multiple cores.

    -

    If there are multiple message types for a frame, each message will start with a unique code

    -

    Summary Frame Messages

    -

    The summary frame will appear only once and have only one message. It is recommended that this is the first frame sent to Streamline so the Newline Canary can be checked for correctness before any other processing occurs.

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Newline CanarystringAlways "1\n2\r\n3\r4\n\r5"
    Timestamppacked64Current system time in nanoseconds since the epoch (midnight January 1, 1970 UTC) or 0 if the target does not have system time
    Uptimepacked64How long the system has been running in nanoseconds. This is not affected by external influences like changing the system time, ntp, hibernating, etc... Can be used to reference kernel log messages. If the target does not support uptime, send 0 and use a monotonically increasing timer for the timestamp messages.
    Monotonic Deltapacked64The delta applied to the monotonic clock to zero-base the timestamps, may be zero if the platform does not support absolute timestamps.
    Attributes  - Zero or more repetitions of the following: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    KeyStringAttribute key. Must not be empty
    ValueStringAttribute value
    -
    End of AttributesStringAlways the empty string

    -

    Backtrace Frame Messages

    -

    This is used to populate the Call Paths tab

    -
      -
    • Exec cookie vs Offset cookie -
      • If a sample occurs in libx.so called by my-app, the exec cookie is my-app and the offset cookie is libx.so
      -
    • -
    -

    Cookies should be positive. The special values 0 indicates kernel or idle, -1 indicate an invalid cookie and 1 is reserved to avoid confusion with End of Message, 1 below.

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Timestamptimestamp 
    Exec Cookiepacked32Cookie of the current process
    pidpacked32Process ID. In Linux, this is the Thread Group ID
    tidpacked32Thread ID. In Linux, this is the PID
    InKernelpacked32 - - - -
    0= not in kernel
    1= in kernel
    -
    Body  - One or more repetitions of the following: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Offset Cookiepacked32Executable or library at the offset
    Offsetpacked64Offset in the backtrace
    -
    End of Message1 

    -

    Name Frame Messages

    -

    Cookie Name Message

    -

    This is used to get the name for the Process Handle. Cookies are stored in a pseudo hashmap which limits the number of possible collisions, thus duplicate cookies may be emitted. In addition, cookies are stored per core, thus when a task migrates to a new core, a fresh cookie may be emitted for that core. However cookies are unique across all cores.

    -

    - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code1 
    Cookiepacked32Cookie key
    NamestringCookie value

    -

    IRQ Cookie Name Message

    -

    This is similar to the Cookie Name Message but instead is used used to get the name for an IRQ/Exception.

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code5 
    Cookiepacked32Cookie key
    NamestringCookie value
    IRQpacked32IRQ/Exception number

    -

    Thread Name Message

    -

    This is used to show thread names in the Thread Disclosure. Thread names are stored in a pseudo hashmap which to limit the number of times the name is sent, but duplicate thread names may be emitted. Thread numbers can be reused as long as the scheduler sched thread exit message is sent before it is reused.

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code2 
    Timestamptimestamp 
    Thread IDpacked32tid of the named thread
    NamestringName of the thread

    -

    CPU Core Name Message

    -

    This is used to identify clusters and in the tooltip in X-Ray mode

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code3 
    Corepacked32The core which the cpuid and Name describe
    cpuidpacked32cpuid of this core. For example, 0xc08
    NamestringHuman readable name of this core. For example, Cortex-A8

    -

    Link Message

    -

    This is used to link a cookie, pid and tid if cookie resolution is postponed

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code4 
    Timestamptimestamp 
    Cookiepacked32Cookie of the current process
    pidpacked32Process ID (in Linux this is the Thread Group ID)
    tidpacked32Thread ID (in Linux this is the PID)

    -

    Counter Frame Messages

    -

    This is used to populate Charts in the Timeline view

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Timestamptimestamp 
    Corepacked32Core to which this counter applies
    Keypacked32Key in Captured XML
    Valuepacked64Value of the specified counter

    -

    Block Counter Frame Messages

    -

    Block counters are the same as counters, but used less space when multiple counters are sampled at the same timestamp and on the same core. To start the block, the key of 0 and a timestamp value is emitted. Then any counters sampled at that time are emitted. A block of counters (counters using the same timestamp) must all be emitted in the same frame. This means that the first block counter message emitted in a frame must be the timestamp.

    -

    Before emitting thread specific values, emit key 1 and the pid value. Any following values apply to the specified pid until another pid or timestamp is emitted

    -

    - - - - - - - - - - - - - - - -
    NameTypeDescription
    Keypacked320 for timestamp, 1 for pid or key (where key > 1) in Captured XML
    Valuepacked64Value of the specified counter

    -

    Annotate Frame Messages

    -

    Annotations are messages sent by arbitrary userspace programs, so their format is different from other messages.

    -

    A single annotation may be broken across frame boundaries. This is why the Annotation Message has a size and the Userspace Annotations either have a size or are '\n' terminated.

    -

    To colorize any ASCII string within the annotation data, prefix the string with 0x1B escape character followed by a 3-byte RGB value

    -

    Annotate Message

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Corepacked32 
    tidpacked32Thread ID (in Linux this is the PID)
    Timestamptimestamp 
    Sizepacked32Message size
    Body Userspace Annotation data fragment

    -

    Userspace Annotations

    -

    Annotations belong to a channel with 0 being the default channel. Channels belong to groups with 0 as the default group.

    -

    ASCII String Annotation

    -

    This is used to add a line in the Log tab. Can also be sent from the command line. For example, echo 'Hello World' > /dev/gator/annotate

    -

    - - - - - - - - - - - - - - - -
    NameTypeDescription
    ColorcolorOptional, 0x1B, RR, GG, BB
    ASCII StringZero or more ASCII characters followed by '\n'Text annotation

    -

    Create Group Annotation

    -

    This is used to name a group in the Thread Disclosure

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Escape Code0x1C 
    Marker Code0x8 
    GroupLittle Endian int32 
    String LengthLittle Endian int16 
    UTF-8 StringString Length UTF-8 bytesChannel name

    -

    Create Channel Annotation

    -

    This is used to name a channel in the Thread Disclosure

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Escape Code0x1C 
    Marker Code0x7 
    ChannelLittle Endian int32 
    GroupLittle Endian int32Group the channel belongs to
    String LengthLittle Endian int16 
    UTF-8 StringString Length UTF-8 bytesChannel name

    -

    UTF-8 String Annotations

    -

    This is used to add a line in the Log tab.

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Escape Code0x1C 
    Marker Code0x6 
    ChannelLittle Endian int32Channel the annotation belongs to
    String LengthLittle Endian int16 
    ColorcolorOptional, 0x1B, RR, GG, BB, counts against String Length
    UTF-8 StringString Length UTF-8 bytesText annotation

    -

    Visual Annotation

    -

    This is used to add a line in the Log tab and an image to the Visual Annotation Chart.

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Escape Code0x1C 
    Visual Code0x4 
    String LengthLittle Endian int16 
    UTF-8 StringString Length UTF-8 bytesText annotation
    Image LengthLittle Endian int32 
    Image DataImage Length bytes 

    -

    Marker Annotation

    -

    This is used to add a Bookmark

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Escape Code0x1C 
    Marker Code0x5 
    String LengthLittle Endian int16 
    ColorcolorOptional, 0x1B, RR, GG, BB, counts against String Length
    UTF-8 StringString Length UTF-8 bytesText annotation

    -

    Scheduler Trace Frame Messages

    -

    As with Backtrace Frame Messages, the cookies should be positive. The special cookie value 0, in conjunction of a pid of 0, indicates idle. A cookie value of 0 and a pid of > 0 indicates kernel.

    -

    Sched Thread Start

    -

    This is used by the Heat Map to identify when a thread starts

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code3 
    Timestamptimestamp 
    pidpacked32Process ID (in Linux this is the Thread Group ID)
    tidpacked32Thread ID (in Linux this is the PID)
    Cookiepacked32Cookie of the current process

    -

    Sched Switch

    -

    This is used to populate the CPU Activity Chart and the Heat Map

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code1 
    Timestamptimestamp 
    pidpacked32Process ID (in Linux this is the Thread Group ID)
    tidpacked32Thread ID (in Linux this is the PID)
    Cookiepacked32Cookie of the current process
    Statepacked32State - - - - -
    0= Waiting on other event besides I/O
    1= Contention/pre-emption
    2= Waiting on I/O
    -

    -

    Sched Thread Exit

    -

    This is used by the Heat Map to identify when a thread terminates

    -

    - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code2 
    Timestamptimestamp 
    tidpacked32Thread ID (in Linux this is the PID)

    -

    GPU Trace Frame Messages

    -

    GPU Start

    -

    This is used to indicate a part of the GPU has begun execution

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code1 
    Timestamptimestamp 
    Unitpacked32GPU Unit
    Corepacked32GPU Unit Core
    pidpacked32Process ID (in Linux this is the Thread Group ID)
    tidpacked32Thread ID (in Linux this is the PID)

    -

    GPU Stop

    -

    This is used to indicate a part of the GPU has ceased execution

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code2 
    Timestamptimestamp 
    Unitpacked32GPU Unit
    Corepacked32GPU Unit Core

    -

    Idle Frame Messages

    -

    Enter Idle

    -

    This is used to indicate that a core has ceased execution.

    -

    - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code1 
    Timestamptimestamp 
    Corepacked32 

    -

    Exit Idle

    -

    This is used to indicate that a core has resumed execution.

    -

    - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code2 
    Timestamptimestamp 
    Corepacked32 

    -

    Sequence Diagrams

    -

    Configuration

    -

    The diagrams in this topic depict the series of events that are triggered when you click various buttons in the Streamline user interface. Here are the events that occur when the Counter Configuration button is clicked in Streamline where $VER is 17

    -
    -

    This is the sequence of events when you click the Load Defaults in the Counter Configuration dialog box:

    -
    -

    This diagram illustrates the sequence of events that occur when you click either the Cancel or Close button in the Counter Configuration dialog box:

    -
    -

    This is the sequence of events triggered when the Save button is clicked from the Counter Configuration dialog box:

    -
    -

    Note: After you click Save, Cancel or Close, the Counter Configuration dialog box closes.

    -

    Capture

    -

    Here are the events that occur when you click the Start Capture button in Streamline, when the $VER is 17.

    -
    -

    At any point during the capture, Streamline can send a ping to verify that the host is still running. If the ping is not acknowledged, Streamline ends the capture.

    -
    -

    Local Capture

    -

    Streamline also support a local capture mode, a mode in which data is collected without interaction with Streamline. In this case the Target-Host Protocol is omitted. Instead a directory, ending in .apc, is provided to Streamline. This directory contains captured.xml containing the Captured XML, session.xml containing the Session XML, events.xml containing the Events XML and 0000000000 which contains the APC Data with one or more structures of the following format:

    -

    - - - - - - - - - - - - - - - - -
    NameTypeDescription
    LengthLittle Endian int32Number of bytes in the body
    bodyAPC Data 

    -
    - - diff --git a/protocol/gator/gator_protocol-5-18.html b/protocol/gator/gator_protocol-5-18.html deleted file mode 100644 index 6382d445..00000000 --- a/protocol/gator/gator_protocol-5-18.html +++ /dev/null @@ -1,2103 +0,0 @@ - - - - - - - - -
    -

    Gator v18 (DS-5 v5.18) Protocol

    -

    Index

    - -

    Introduction

    -

    This document describes the TCP/IP protocol used by gator or other implementing clients to communicate with Streamline version 5.18 or later. Use this information to build a customized client to communicate profiling data to Streamline. The gator source code, distributed as part of DS-5, is the reference implementation of this protocol. The protocol may change with future releases of Streamline, but Streamline will maintain backwards compatibility with this version of the protocol so that clients need only implement one version of the protocol. Streamline requires that your client is able to parse and generate simple XML and ignore additional or unexpected nodes or attributes. Because the XML features described in this protocol documentation are the only ones used, this protocol does not require the more complex features of XML.

    -

    Changes in v18 (DS-5 v5.18)

    -

    gator v18, the version of gator shipped with Streamline version 5.18, has a few important updates that you should familiarize yourself with before implementing or updating your own customized Streamline TCP/IP protocol.

    - -

    Target-Host Protocol

    -

    Magic Exchange

    -

    A handshake is required so that your client and Streamline can recognize each other. It consists of ASCII newline (\n) delimited strings. If the client receives a string it does not recognize, the string must be discarded and another string is read.

    -

    The standard Streamline client is gator. But, as you can customize gator and call it what you wish, the term client is used generically to refer to your customized protocol.

    -
      -
    1. The client receives Streamline's highest supported protocol version VERSION $VER\n, for example if Streamline supports up to version 23, the client would receive VERSION 23\n.
    2. -
    3. The client receives STREAMLINE\n
    4. -
    5. Send GATOR 18\n
    6. -
    -

    Further communication from Streamline comes as Commands

    -

    Command Header

    -

    Streamline issues commands that consist of a header and a body. Streamline expects a Response to these commands from the client.

    -

    - - - - - - - - - - - - - - - -
    NameTypeDescription
    Codeint8The type of command - - - - - - - -
    0= Request XML
    1= Deliver XML
    2= APC Start
    3= APC Stop
    4= Disconnect
    5= Ping
    -
    LengthLittle Endian int32Number of bytes in the body

    -

    If the client receives an unrecognized command, it should respond with a NAK.

    -

    Request XML Body

    -

    Command code 0 is a request from Streamline for XML. The root node is request and it has the type attribute that tells the client which xml is required. For example, this is a request for Events XML

    -

    - <?xml version="1.0" encoding="US-ASCII"?>
    - <request type="events">
    - </request> -

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    RequestResponse CodeResponse Body
    <request type="events">XMLEvents XML
    <request type="configuration">XMLConfiguration XML
    <request type="counters">XMLCounters XML
    <request type="captured">XMLCaptured XML Streamline requests Captured XML prior to starting a capture.
    <request type="defaults">XMLdefault Configuration XML

    -

    Deliver XML Body

    -

    The Deliver XML command sends XML to the client:

    -

    - - - - - - - - - - - - -
    RequestResponse Code
    Session XMLACK
    Configuration XMLACK

    -

    APC Start Body

    -

    The APC Start command does not have a body. This command initiates a capture and readies Streamline to receive APC Data Responses. No ACK is expected and no further XML exchange takes place. If a failure occurs, the client should send an Error.

    -

    APC Stop Body

    -

    The APC Stop command also does not have a body. This command triggers the end of the APC and no ACK is expected. APC Data Responses can continue to arrive until all captured data is sent, then the connection should be closed. If a failure occurs, the client should send an Error.

    -

    Disconnect Body

    -

    The Disconnect command, which closes the connection to the target, does not contain a command body. No ACK is expected.

    -

    Ping Body

    -

    The Ping command does not have a body. Send an ACK response to this command.

    -

    Response Format

    -

    Responses consist of a header followed by a body

    -

    Response Header

    -

    The format for the response header is identical to that of the Command Header but the Codes are different

    -

    - - - - - - - - - - - - - - - -
    NameTypeDescription
    Codeint8The type of command - - - - - - -
    1= XML
    3= APC Data
    4= ACK
    5= NAK
    0xFF= Error
    -
    LengthLittle Endian int32Number of bytes in the body

    -

    XML Body

    -

    The body should contain XML, the format of which is dependent on the Request type. For a list of types, see Request XML Body

    -

    APC Data Body

    -

    The APC body should contain an APC Frame. If the length is zero, it is the End of Sequence message which indicates that all APC Frames have been transmitted to Streamline.

    -

    ACK Body

    -

    This response, which indicates the Command was successful, does not have a response body.

    -

    NAK Body

    -

    Indicates a synchronous non-fatal error occurred when handling a request. It can contain a UTF-8 error message. The length is specified in the header, so no NULL character is expected. Indicates that the Command failed, but that the connection can continue.

    -

    Error Body

    -

    Indicates a synchronous fatal error occurred when responding to a request. A UTF-8 error message. The length is specified in the header, so no NULL character is expected. Use this response when the error is terminal and the connection must be closed. Errors may be sent without a request, but Streamline may not process them immediately.

    -

    XML

    -

    Events

    -

    The Events XML defines the list of counters that you can choose from in the Counter Configuration dialog box. Modify this list to create your own custom counters.

    -

    events

    -

    The events root node of Events XML can have any number of counter_set and category child nodes.

    -

    counter_set

    -

    The counter_set node has no children and the following attributes. Counter sets are used when the number of counters that can be enabled in a category is restricted. Streamline will respect the restriction and assign a name from the set to a counter in Configuration XML.

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    nameStringName of the counter_set
    countStringNumber of counters in the set. Counter names are derived by appending a number, starting at zero, to the set name. Ex, if the set name is ARMv7_Cortex_A8_cnt and the count is 4, then the counter names in the set are ARMv7_Cortex_A8_cnt0, ARMv7_Cortex_A8_cnt1, ARMv7_Cortex_A8_cnt2 and ARMv7_Cortex_A8_cnt3
    titleStringAppended to the title of the event when counter_set is a child of category, shown in Streamline before the name. Used to group counters.
    descriptionStringThe value of this attribute is appended to the description to show in Streamline when counter_set is a child of category. Used as the tooltip for the counter

    -

    category

    -

    The category node can have any number of event and option_set child nodes. It can also have one or more counter_set child nodes instead of the counter_set attribute if the same set of child event nodes show up for to multiple counter sets. The category node can have the following attributes:

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    nameStringThe name of the category. The value given here appears as the category name in the Counter Configuration dialog box in Streamline.
    counter_setStringDefines the counter_set to be used. You must use this attribute if any child event uses the event attribute and there are no child counter_set nodes present.
    per_cpuBooleanDefines whether or not Streamline collects data on a per cpu basis. Set this value to yes and Streamline collects data from each cpu separately for these counters. The default value is no.
    supports_event_based_samplingBooleanUse yes or no to define whether or not the counters in this category can be used for event based sampling. The default value is no.

    -

    option_set

    -

    The event node has one or more option_set child nodes and the following attributes. Use this node when the same event applies to multiple devices. It has the following attributes:

    -

    - - - - - - - - - - -
    NameTypeDescription
    nameStringThe name of this option_set

    -

    option

    -

    The option_set node contains one or more option child nodes. The option node has no children and the following attributes

    -

    - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    event_deltaHex IntegerThe offset to add to the applicable event to get the event number.
    nameStringThe name of the device. The value of name is appended to the event name.
    descriptionStringA description of the device option. This description is appended to the event description.

    -

    event

    -

    The event node has no children and the following attributes

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    counterStringEvery event element must have either the counter or event attribute defined. Use the counter attribute for fixed counter types, like cycle count. Use the event attribute for all other events. The counter attribute is the name of the counter.
    eventHex Integer Architecture specific or implementation-specific event number, in hexadecimal, determined from either the architecture specification document or the Technical Reference Manual of the processor. This attribute is required if the element does not have a counter attribute.
    option_setStringThe name of the option_set to use.
    titleStringTitle of the event, shown in Streamline before the name. Use this attribute to group counters.
    nameStringName of the event, shown in Streamline after the title.
    per_cpuBooleanDefines whether or not Streamline collects data on a per cpu basis. Set this value to yes and Streamline collects data from each cpu separately for this event. The default is the value of the per_cpu attribute of the category node.
    supports_event_based_samplingBooleanUse yes or no to define whether or not the event can be used for event based sampling. This value defaults to the category value if the attribute is not present in the event.
    classStringUse one of the following values with the class attribute: delta, absolute, activity. 'delta' is used for values that increment or are accumulated over time such as hardware performance counters. 'absolute' is used for singular or impulse values such as system memory used. 'activity' is used in conjunction with scheduler trace data such as CPU activity. The default value is delta. This attribute is optional.
    displayStringUse one of the following values with the display attribute: average, maximum, minimum, hertz, accumulate. This is the same as adding .avg, .max, .min or .hz to the counter name in the chart configuration panel of Streamline. The default value is 'accumulate' for delta counters or 'maximum' for absolute counters or 'average' for activity counters. This attribute is optional.
    unitsStringDefines the unit type to display in Streamline. This attribute is optional.
    modifierIntegerOptional, number to divide read numbers by for fixed point math. This attribute is optional.
    derivedBooleanDefines whether or not the data is derived from the data of another chart.
    series_compositionStringDefines how to arrange the data in the Timeline view. Enter either overlay or stacked as the value for this attribute. This attribute is optional and the default value is stacked.
    rendering_typeStringThe type of chart to render for the Timeline view in Streamline. This attribute is optional and can be set to either bar or fill. The default value is fill.
    average_selectionBooleanSets whether or not average values are displayed by the Cross Section Marker in Streamline. This attribute is optional.
    average_coresBooleanSet whether or not Streamline averages the values of multiple cores when viewing the aggregate data of a per-cpu chart. This attribute is optional.
    percentageBooleanOptional, Sets whether or not the Timeline view displays data as a percentage of the maximum value in the chart.
    descriptionStringUse this attribute to define a description to show in Streamline. The value of this attribute is used as the tooltip for the counter.

    -

    Events XML example:

    -

    - <?xml version="1.0" encoding="UTF-8"?>
    - <events>
    -   <counter_set name="ARMv7_Cortex_A8_cnt" count="4"/>
    -   <category name="Cortex-A8" counter_set="ARMv7_Cortex_A8_cnt" per_cpu="yes" supports_event_based_sampling="yes">
    -     <event counter="ARMv7_Cortex_A8_ccnt" event="0xff" title="Clock" name="Cycles" display="hertz" units="Hz" average_selection="yes" average_cores="yes" description="The number of core clock cycles"/>
    -     <event event="0x0" title="Software" name="Increment" description="Incremented only on writes to the Software Increment Register"/>
    -     <event event="0x1" title="Cache" name="Instruction refill" description="Instruction fetch that causes a refill of at least the level of instruction or unified cache closest to the processor"/>
    -     <!-- ... -->
    -   </category>
    -   <category name="CCI-400" counter_set="cci-400_cnt" supports_event_based_sampling="yes">
    -     <event counter="cci-400_ccnt" event="0xff" title="CCI-400" name="Cycles" display="hertz" units="Hz" average_selection="yes" description="The number of core clock cycles"/>
    -     <option_set name="Slave">
    -       <option event_delta="0x0" name="S0" description="Slave interface 0"/>
    -       <option event_delta="0x20" name="S1" description="Slave interface 1"/>
    -       <option event_delta="0x40" name="S2" description="Slave interface 2"/>
    -       <!-- ... -->
    -     </option_set>
    -     <event event="0x0" option_set="Slave" title="CCI-400" name="Read: any" description="Read request handshake: any"/>
    -     <event event="0x1" option_set="Slave" title="CCI-400" name="Read: transaction" description="Read request handshake: device transaction"/>
    -     <event event="0x2" option_set="Slave" title="CCI-400" name="Read: normal" description="Read request handshake: normal, non-shareable or system-shareable, but not barrier or cache maintenance operation"/>
    -     <!-- ... -->
    -     <option_set name="Master">
    -       <option event_delta="0xa0" name="M0" description="Master interface 0"/>
    -       <option event_delta="0xc0" name="M1" description="Master interface 1"/>
    -       <option event_delta="0xe0" name="M2" description="Master interface 2"/>
    -       <!-- ... -->
    -     </option_set>
    -     <event event="0x14" option_set="Master" title="CCI-400" name="Retry fetch" description="RETRY of speculative fetch transaction"/>
    -     <event event="0x15" option_set="Master" title="CCI-400" name="Read stall: address hazard" description="Read request stall cycle because of an address hazard"/>
    -     <event event="0x16" option_set="Master" title="CCI-400" name="Read stall: ID hazard" description="Read request stall cycle because of an ID hazard"/>
    -     <!-- ... -->
    -   </category>
    -   <category name="Mali GPU Fragment Processor">
    -     <counter_set name="ARM_Mali-400_FP0_cnt" title="Mali-400 FP0" description="Mali GPU Fragment Processor 0" count="2"/>
    -     <counter_set name="ARM_Mali-400_FP1_cnt" title="Mali-400 FP1" description="Mali GPU Fragment Processor 1" count="2"/>
    -     <counter_set name="ARM_Mali-400_FP2_cnt" title="Mali-400 FP2" description="Mali GPU Fragment Processor 2" count="2"/>
    -     <!-- ... -->
    -     <event event="0x0" title="Mali-400 FP" name="Active clock cycles" description="Active clock cycles, between polygon start and IRQ."/>
    -     <event event="0x2" title="Mali-400 FP" name="Total bus reads" description="Total number of 64-bit words read from the bus."/>
    -     <event event="0x3" title="Mali-400 FP" name="Total bus writes" description="Total number of 64-bit words written to the bus."/>
    -     <!-- ... -->
    -   </category>
    -   <category name="Linux">
    -     <event counter="Linux_irq_softirq" title="Interrupts" name="SoftIRQ" per_cpu="yes" description="Linux SoftIRQ taken"/>
    -     <event counter="Linux_irq_irq" title="Interrupts" name="IRQ" per_cpu="yes" description="Linux IRQ taken"/>
    -     <event counter="Linux_block_rq_wr" title="Disk IO" name="Write" units="B" description="Disk IO Bytes Written"/>
    -     <!-- ... -->
    -   </category>
    -   <category name="hwmon">
    -     <event counter="hwmon_ab8500-isa-0000_0" title="Temperature" name="ext_rtc_xtal" display="average" units="C" modifier="1000" average_selection="yes" description="libsensors Temperature sensor ext_rtc_xtal (hwmon_ab8500-isa-0000_0)"/>
    -     <event counter="hwmon_ab8500-isa-0000_1" title="Temperature" name="ext_db8500" display="average" units="C" modifier="1000" average_selection="yes" description="libsensors Temperature sensor ext_db8500 (hwmon_ab8500-isa-0000_1)"/>
    -     <event counter="hwmon_ab8500-isa-0000_2" title="Temperature" name="bat_temp" display="average" units="C" modifier="1000" average_selection="yes" description="libsensors Temperature sensor bat_temp (hwmon_ab8500-isa-0000_2)"/>
    -     <!-- ... -->
    -   </category>
    - </events> -

    -

    Configuration

    -

    Configuration XML defines the set of counters that are enabled for a capture session. It is sent to the client using the Deliver XML command. Any counters listed in Configuration XML that are not available on the target are ignored.

    -

    configurations

    -

    The configurations root node of Configuration XML can have any number of configuration child nodes and has one attribute:

    -

    - - - - - - - - - - -
    NameTypeDescription
    revisionInteger2

    -

    configuration

    -

    The configuration node has no children and has the following attributes:

    -

    - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    counterStringEvery configuration element must have either the counter or event attribute defined. Use the counter attribute for fixed counter types and the event attribute for all other events. If Events XML did not have a counter for this event, a counter from the related counter_set can be taken. See the description of counter_set in Events XML. This attribute is required.
    eventHex IntegerArchitecture-specific or implementation-specific event number, in hexadecimal, determined from either the architecture specification document or the Technical Reference Manual of the processor. This attribute is required if the element does not have a counter attribute.
    countIntegerTells the client how many samples to collect before triggering the event. This attribute is optional.

    -

    Configuration XML example:

    -

    - <?xml version="1.0" encoding="US-ASCII"?>
    - <configurations revision="2">
    -   <configuration counter="ARMv7_Cortex_A8_ccnt" event="0xFF"/>
    -   <configuration counter="ARMv7_Cortex_A8_cnt0" event="0x8"/>
    -   <configuration counter="ARMv7_Cortex_A8_cnt1" event="0x44"/>
    -   <configuration counter="ARMv7_Cortex_A8_cnt2" event="0x43"/>
    -   <configuration counter="ARMv7_Cortex_A8_cnt3" event="0x10"/>
    -   <configuration counter="ARMv7_Cortex_A9_ccnt" event="0xFF"/>
    -   <configuration counter="ARMv7_Cortex_A9_cnt0" event="0x68"/>
    -   <configuration counter="ARMv7_Cortex_A9_cnt1" event="0x6"/>
    -   <configuration counter="ARMv7_Cortex_A9_cnt2" event="0x7"/>
    -   <configuration counter="ARMv7_Cortex_A9_cnt3" event="0x3"/>
    -   <configuration counter="ARMv7_Cortex_A9_cnt4" event="0x4"/>
    -   <configuration counter="Linux_block_rq_wr"/>
    -   <configuration counter="Linux_block_rq_rd"/>
    -   <configuration counter="Linux_meminfo_memused"/>
    -   <configuration counter="Linux_meminfo_memfree"/>
    -   <configuration counter="Linux_power_cpu_freq"/>
    -   <configuration counter="cci-400_cnt0" event="0xB4"/>
    -   <configuration counter="cci-400_cnt1" event="0xD4"/>
    -   <configuration counter="cci-400_cnt2" event="0xB5"/>
    -   <configuration counter="hwmon_arm,vexpress-amp-isa-0011_0"/>
    -   <configuration counter="hwmon_arm,vexpress-amp-isa-0010_0"/>
    - </configurations> -

    -

    Counters

    -

    Counters XML lists the counters available on the target.

    -

    counters

    -

    The counters root node of Counters XML can have any number of counter child nodes

    -

    counter

    -

    The counter node has the following attribute

    -

    - - - - - - - - - - -
    NameTypeDescription
    nameStringAn available counter name from counter_set or the counter attribute of the event node.

    -

    Counters XML Example:

    -

    - <?xml version="1.0" encoding="utf-8"?>
    - <counters>
    -   <counter name="Linux_power_cpu_idle"/>
    -   <counter name="Linux_power_cpu_freq"/>
    -   <counter name="Linux_sched_switch"/>
    -   <counter name="ARMv7_Cortex_A8_cnt3"/>
    -   <counter name="ARMv7_Cortex_A8_cnt2"/>
    -   <counter name="ARMv7_Cortex_A8_cnt1"/>
    -   <counter name="ARMv7_Cortex_A8_cnt0"/>
    -   <counter name="ARMv7_Cortex_A8_ccnt"/>
    -   <counter name="Linux_net_tx"/>
    -   <counter name="Linux_net_rx"/>
    -   <counter name="mmaped_cnt2"/>
    -   <counter name="mmaped_cnt1"/>
    -   <counter name="mmaped_cnt0"/>
    -   <counter name="Linux_meminfo_bufferram"/>
    -   <counter name="Linux_meminfo_memused"/>
    -   <counter name="Linux_meminfo_memfree"/>
    -   <counter name="Linux_irq_softirq"/>
    -   <counter name="Linux_irq_irq"/>
    -   <counter name="Linux_block_rq_rd"/>
    -   <counter name="Linux_block_rq_wr"/>
    - </counters> -

    -

    Session

    -

    Session XML is created by Streamline and delivered to the client. Values in Session XML are based on the settings defined in the Capture & Analysis Options dialog box.

    -

    Note: Session XML must be delivered by Streamline via the Deliver XML command before it is requested by Streamline. Send back the received XML.

    -

    session

    -

    The session root node of Session XML can have any number of image child nodes, zero or one energy_capture child nodes and has the following attributes

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    versionInteger1
    call_stack_unwindingBooleanThe value is yes if the Call Stack Unwinding checkbox is selected, or no if it is not.
    parse_debug_infoBooleanThe value is yes if the Process Debug Information checkbox is selected, no if it is not.
    high_resolutionBooleanThe value is yes if the High Resolution Timeline checkbox is selected, no if it is not.
    buffer_modeStringThe mode chosen using the Buffer Mode drop-down menu. It can set to streaming or one of the following store-and-forward buffers: large - 16MB, medium - 4MB, or small - 1MB.
    sample_rateStringThe sample rate chosen using the Sample Rate drop-down menu. It can be set to one of the following options: normal, low, or none.
    durationIntegerThe maximum duration of the capture session, in seconds.
    target_hostStringThe address of the target.
    target_portIntegerThe target port.
    live_rateIntegerThe value of this attribute dictates how often, in milliseconds, the Name, Counter, Block Counter and Scheduler Trace Frames should be flushed to Streamline for the Live view.

    -

    image

    -

    There is no restriction to the number of image nodes the session node can have. The image node has no child nodes and the following attributes:

    -

    - - - - - - - - - - - - - - - -
    NameTypeDescription
    pathStringThis attribute defines the Program Image. This attribute can be used during local capture to copy images into the .apc folder. You can update all Program Images in Streamline post-capture.
    enabledBooleanA yes value means the Program Image is enabled, a no value means it is not. The default value is no.

    -

    energy_capture

    -

    The session node can either have zero or one energy_capture child nodes. The energy_capture node can have zero or more channel child nodes and the following attributes:

    -

    - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    versionInteger1
    command_pathStringThe full path to the caiman executable
    typeStringThe type attribute can have one of three possible values: none, energy_probe or ni-daq. none means no energy data is collected during a capture. energy_probe or ni-daq define the hardware used to capture the energy data from the target.

    -

    channel

    -

    The energy_capture node can any number of channel nodes. The channel node has the following attributes:

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    idIntegerThe channel number
    resistanceIntegerThe channel resistance, set using the resistance field.
    powerBooleanTrue if power data is to be collected and displayed
    voltageBooleanSet to yes if the Voltage checkbox has been enabled for this channel.
    currentBooleanSet to yes if the Current checkbox has been enabled for this channel.

    -

    Example:

    -

    - <?xml version="1.0" encoding="US-ASCII"?>
    - <session version="1" call_stack_unwinding="yes" parse_debug_info="yes" high_resolution="no" buffer_mode="streaming" sample_rate="low" duration="0" target_host="10.99.3.109" target_port="8080" live_rate="100">
    -   <image path="H:\ls"/>
    -   <image path="H:\libc.so.6"/>
    -   <energy_capture version="1" command_path="C:\Program Files (x86)\DS-5\bin\caiman.exe" type="none">
    -     <channel id="0" resistance="20" power="yes" voltage="yes" current="yes"/>
    -   </energy_capture>
    - </session> -

    -

    Captured

    -

    Captured XML contains information about a capture session. This is very similar to Configuration XML

    -

    captured

    -

    The captured root node of Captured XML has one target child node, one counters child node, and the following attributes:

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    versionInteger1
    live_energy_deltaIntegerThis attribute is added by Streamline
    createdIntegerCapture date in seconds since the epoch (midnight January 1, 1970 UTC). If you are doing a local capture, gator populates this attribute. Otherwise, Streamline adds this attribute.
    protocolInteger18
    backtrace_processingStringThe value of backtrace_processing can be either gator or none. This attribute is optional and the default value is gator. Indicates the type of call stack post-processing to use.

    -

    target

    -

    The captured node always contains one target child node. The target child node has the following attributes:

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    nameStringThe name of the target
    sample_rateIntegerNumber of samples collected per second
    coresIntegerNumber of CPU cores on the target
    cpuidHex IntegerThe cpuid of a core. For example, 0xc08
    supports_liveBooleanIndicates if the Name, Counter, Block Counter and Scheduler Trace Frames are flushed to Streamline for the Live view.

    -

    counters

    -

    The captured node always contains one counters node. The counters node has the following child node:

    -

    counter

    -

    The counters node can contain any number of counter child nodes. The counter child node contains the following attributes:

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    keyHex IntegerThe key for this counter in the APC data.
    typeStringThe same as the counter attribute in the configuration node of Configuration XML.
    eventHex IntegerThe same as the event attribute in the configuration node of Configuration XML.
    countIntegerThe count value used during the capture session. Dictated how many samples had to be collected before triggering the event. This can only be set on one counter. This attribute is optional.

    -

    Example:

    -

    - <?xml version="1.0" encoding="utf-8"?>
    - <captured version="1" created="1361467764" protocol="18">
    -   <target sample_rate="100" cores="5" cpuid="0xc0f"/>
    -   <counters>
    -     <counter key="0x3" type="ARMv7_Cortex_A7_cnt1" event="0x10"/>
    -     <counter key="0x4" type="ARMv7_Cortex_A7_cnt2" event="0x16"/>
    -     <counter key="0x1" type="ARMv7_Cortex_A7_ccnt" event="0xff"/>
    -     <counter key="0x2" type="ARMv7_Cortex_A7_cnt0" event="0x8"/>
    -     <counter key="0x15" type="Linux_power_cpu_freq" event="0x0"/>
    -     <counter key="0x9" type="Linux_block_rq_rd" event="0x0"/>
    -     <counter key="0x8" type="Linux_block_rq_wr" event="0x0"/>
    -     <counter key="0xc" type="Linux_meminfo_memfree" event="0x0"/>
    -     <counter key="0xd" type="Linux_meminfo_memused" event="0x0"/>
    -     <counter key="0x12" type="Linux_net_rx" event="0x0"/>
    -     <counter key="0x13" type="Linux_net_tx" event="0x0"/>
    -   </counters>
    - </captured> -

    -

    APC Frame Format

    -

    Overview

    -

    The XML files and .apc data collected by Streamline are placed in an .apc folder. When Streamline processes this folder, it creates a db folder, followed by a report folder.

    -

    Note: The APC files are ten-digit files with no extension starting with 0000000000.

    -

    When creating a new report from the same .apc folder, Streamline does not regenerate the db folder, even if the .apc data has changed. In other words, the .apc data is ignored if a valid db folder exists. To ensure Streamline generates a new report from the .apc data, delete the db directory. If this folder is missing, Streamline recreates it from the .apc data files.

    -

    Types

    -
    -
    int32
    4-byte signed little endian
    -
    packed32
    variable length packed 4-byte signed value, see Packed Values
    -
    packed64
    variable length packed 8-byte signed value, see Packed Values
    -
    string
    A packed32 length followed by the specified number of characters
    -
    #
    A constant packed32 value of #, ex: 5 is the packed32 number 5
    -
    timestamp
    packed64 monotonic time value in nanoseconds relative to the monotonic delta from the Summary Message
    -
    -

    Packed Values

    -

    To reduce their size, integers are packed. This is done by avoiding the transmission of duplicate high bits. The value is split into 7 bit bytes in little endian order. The most significant bit of the byte is set to 1, if there is a subsequent byte for this value. On the last byte, the most significant bit is set to 0. For positive values, the most significant encoded bit must be 0 and for negative numbers it must be 1. This is very similar to signed LEB128 used in DWARF.

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    BitsLast valueByte 1Byte 2Byte 3Byte 4Byte 5
    31-21474836481XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb01111XXXb
    27-1342177281XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
    20-10485761XXXXXXXb1XXXXXXXb01XXXXXXb
    13-81921XXXXXXXb01XXXXXXb
    6-6401XXXXXXb
    66300XXXXXXb
    1381911XXXXXXXb00XXXXXXb
    2010485751XXXXXXXb1XXXXXXXb00XXXXXXb
    271342177271XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
    3121474836471XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb00000XXXb

    -

    For example, 429389 (01101000110101001101b) would be encoded as 0xCD (11001101b) 0x9A (10011010b) 0x1A (00011010b)

    -

    Packed 64 values work in much the same way:

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    BitsLast valueByte 1Byte 2Byte 3Byte 4Byte 5Byte 6Byte 7Byte 8Byte 9Byte 10
    63-92233720368547758081XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb0111111Xb
    62-46116860184273879041XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
    55-360287970189639681XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
    48-2814749767106561XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
    41-21990232555521XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
    34-171798691841XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
    27-1342177281XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
    20-10485761XXXXXXXb1XXXXXXXb01XXXXXXb
    13-81921XXXXXXXb01XXXXXXb
    6-6401XXXXXXb
    66300XXXXXXb
    1381911XXXXXXXb00XXXXXXb
    2010485751XXXXXXXb1XXXXXXXb00XXXXXXb
    271342177271XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
    34171798691831XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
    4121990232555511XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
    482814749767106551XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
    55360287970189639671XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
    6246116860184273879031XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
    6392233720368547758071XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb0000000Xb

    -

    For example, -4758616141418899142 would be encoded as 0xBA 0xB2 0xA5 0xA2 0xCE 0xFA 0xFF 0xFA 0xBD 0x7F.

    -

    Frames consist of a header followed by a body of zero or more type specific messages

    -

    Ordering

    -

    The timestamp order of messages is significant and must be in-order on the same core. Timestamps within a frame must also be in order. A specific counter is only be populated in Counter frames or Block Counter frames, not a mix of both.

    -

    Required Messages

    -

    To generate a valid capture at least one Sched Switch, Counter or Block Counter message must be present. All other messages are optional.

    -

    Frame Header

    -

    A length always precedes the frame header either from the Response Header or when the .apc data is written to disk by Streamline during a streaming capture or by gator during a Local Capture.

    -

    - - - - - - - - - - - - - - - -
    NameTypeDescription
    Codepacked32Indicates the type of this frame. - - - - - - - - - - -
    1= Summary
    2= Backtrace
    3= Name
    4= Counter
    5= Block Counter
    6= Annotate
    7= Sched Trace
    8= GPU Trace
    9= Idle
    -
    Corepacked32The processor that originated the messages in the frame. This field must always be present but is ignored for Summary, Counter, Annotate, GPU Trace and Idle Frames as these frames can have messages from multiple cores.

    -

    If there are multiple message types for a frame, each message will start with a unique code

    -

    Summary Frame Messages

    -

    Summary Message

    -

    This message should appear only once and it is recommended that it is the first message in the first frame sent to Streamline so the Newline Canary can be checked for correctness before any other processing occurs.

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code1 
    Newline CanarystringAlways "1\n2\r\n3\r4\n\r5"
    Timestamppacked64Current system time in nanoseconds since the epoch (midnight January 1, 1970 UTC) or 0 if the target does not have system time
    Uptimepacked64How long the system has been running in nanoseconds. This is not affected by external influences like changing the system time, ntp, hibernating, etc... Can be used to reference kernel log messages. If the target does not support uptime, send 0 and use a monotonically increasing timer for the timestamp messages.
    Monotonic Deltapacked64The delta applied to the monotonic clock to zero-base the timestamps, may be zero if the platform does not support absolute timestamps.
    Attributes  - Zero or more repetitions of the following: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    KeyStringAttribute key. Must not be empty
    ValueStringAttribute value
    -
    End of AttributesStringAlways the empty string

    -

    CPU Core Name Message

    -

    This is used to identify clusters and in the tooltip in X-Ray mode

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code3 
    Corepacked32The core which the cpuid and Name describe
    cpuidpacked32cpuid of this core. For example, 0xc08
    NamestringHuman readable name of this core. For example, Cortex-A8

    -

    Backtrace Frame Messages

    -

    This is used to populate the Call Paths tab

    -
      -
    • Exec cookie vs Offset cookie -
      • If a sample occurs in libx.so called by my-app, the exec cookie is my-app and the offset cookie is libx.so
      -
    • -
    -

    Cookies should be positive. The special values 0 indicates kernel or idle, -1 indicate an invalid cookie and 1 is reserved to avoid confusion with End of Message, 1 below.

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Timestamptimestamp 
    Exec Cookiepacked32Cookie of the current process
    pidpacked32Process ID. In Linux, this is the Thread Group ID
    tidpacked32Thread ID. In Linux, this is the PID
    Body  - One or more repetitions of the following: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Offset Cookiepacked32Executable or library at the offset
    Offsetpacked64Offset in the backtrace
    -
    End of Message1 

    -

    Name Frame Messages

    -

    Cookie Name Message

    -

    This is used to get the name for the Process Handle. Cookies are stored in a pseudo hashmap which limits the number of possible collisions, thus duplicate cookies may be emitted. In addition, cookies are stored per core, thus when a task migrates to a new core, a fresh cookie may be emitted for that core. However cookies are unique across all cores.

    -

    - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code1 
    Cookiepacked32Cookie key
    NamestringCookie value

    -

    IRQ Cookie Name Message

    -

    This is similar to the Cookie Name Message but instead is used used to get the name for an IRQ/Exception.

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code5 
    Cookiepacked32Cookie key
    NamestringCookie value
    IRQpacked32IRQ/Exception number

    -

    Thread Name Message

    -

    This is used to show thread names in the Thread Disclosure. Thread names are stored in a pseudo hashmap which to limit the number of times the name is sent, but duplicate thread names may be emitted. Thread numbers can be reused as long as the scheduler sched thread exit message is sent before it is reused.

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code2 
    Timestamptimestamp 
    Thread IDpacked32tid of the named thread
    NamestringName of the thread

    -

    Link Message

    -

    This is used to link a cookie, pid and tid if cookie resolution is postponed

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code4 
    Timestamptimestamp 
    Cookiepacked32Cookie of the current process
    pidpacked32Process ID (in Linux this is the Thread Group ID)
    tidpacked32Thread ID (in Linux this is the PID)

    -

    Counter Frame Messages

    -

    This is used to populate Charts in the Timeline view

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Timestamptimestamp 
    Corepacked32Core to which this counter applies
    Keypacked32Key in Captured XML
    Valuepacked64Value of the specified counter

    -

    Block Counter Frame Messages

    -

    Block counters are the same as counters, but used less space when multiple counters are sampled at the same timestamp and on the same core. To start the block, the key of 0 and a timestamp value is emitted. Then any counters sampled at that time are emitted. A block of counters (counters using the same timestamp) must all be emitted in the same frame. This means that the first block counter message emitted in a frame must be the timestamp.

    -

    Before emitting thread specific values, emit key 1 and the pid value. Any following values apply to the specified pid until another pid or timestamp is emitted

    -

    - - - - - - - - - - - - - - - -
    NameTypeDescription
    Keypacked320 for timestamp, 1 for pid or key (where key > 1) in Captured XML
    Valuepacked64Value of the specified counter

    -

    Annotate Frame Messages

    -

    Annotations are messages sent by arbitrary userspace programs, so their format is different from other messages.

    -

    A single annotation may be broken across frame boundaries. This is why the Annotation Message has a size and the Userspace Annotations either have a size or are '\n' terminated.

    -

    To colorize any ASCII string within the annotation data, prefix the string with 0x1B escape character followed by a 3-byte RGB value

    -

    Annotate Message

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Corepacked32 
    tidpacked32Thread ID (in Linux this is the PID)
    Timestamptimestamp 
    Sizepacked32Message size
    Body Userspace Annotation data fragment

    -

    Userspace Annotations

    -

    Annotations belong to a channel with 0 being the default channel. Channels belong to groups with 0 as the default group.

    -

    ASCII String Annotation

    -

    This is used to add a line in the Log tab. Can also be sent from the command line. For example, echo 'Hello World' > /dev/gator/annotate

    -

    - - - - - - - - - - - - - - - -
    NameTypeDescription
    ColorcolorOptional, 0x1B, RR, GG, BB
    ASCII StringZero or more ASCII characters followed by '\n'Text annotation

    -

    Create Group Annotation

    -

    This is used to name a group in the Thread Disclosure

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Escape Code0x1C 
    Marker Code0x8 
    GroupLittle Endian int32 
    String LengthLittle Endian int16 
    UTF-8 StringString Length UTF-8 bytesChannel name

    -

    Create Channel Annotation

    -

    This is used to name a channel in the Thread Disclosure

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Escape Code0x1C 
    Marker Code0x7 
    ChannelLittle Endian int32 
    GroupLittle Endian int32Group the channel belongs to
    String LengthLittle Endian int16 
    UTF-8 StringString Length UTF-8 bytesChannel name

    -

    UTF-8 String Annotations

    -

    This is used to add a line in the Log tab.

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Escape Code0x1C 
    Marker Code0x6 
    ChannelLittle Endian int32Channel the annotation belongs to
    String LengthLittle Endian int16 
    ColorcolorOptional, 0x1B, RR, GG, BB, counts against String Length
    UTF-8 StringString Length UTF-8 bytesText annotation

    -

    Visual Annotation

    -

    This is used to add a line in the Log tab and an image to the Visual Annotation Chart.

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Escape Code0x1C 
    Visual Code0x4 
    String LengthLittle Endian int16 
    UTF-8 StringString Length UTF-8 bytesText annotation
    Image LengthLittle Endian int32 
    Image DataImage Length bytes 

    -

    Marker Annotation

    -

    This is used to add a Bookmark

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Escape Code0x1C 
    Marker Code0x5 
    String LengthLittle Endian int16 
    ColorcolorOptional, 0x1B, RR, GG, BB, counts against String Length
    UTF-8 StringString Length UTF-8 bytesText annotation

    -

    Scheduler Trace Frame Messages

    -

    As with Backtrace Frame Messages, the cookies should be positive. The special cookie value 0, in conjunction of a pid of 0, indicates idle. A cookie value of 0 and a pid of > 0 indicates kernel.

    -

    Sched Thread Start

    -

    This is used by the Heat Map to identify when a thread starts

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code3 
    Timestamptimestamp 
    pidpacked32Process ID (in Linux this is the Thread Group ID)
    tidpacked32Thread ID (in Linux this is the PID)
    Cookiepacked32Cookie of the current process

    -

    Sched Switch

    -

    This is used to populate the CPU Activity Chart and the Heat Map

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code1 
    Timestamptimestamp 
    pidpacked32Process ID (in Linux this is the Thread Group ID)
    tidpacked32Thread ID (in Linux this is the PID)
    Cookiepacked32Cookie of the current process
    Statepacked32State - - - - -
    0= Waiting on other event besides I/O
    1= Contention/pre-emption
    2= Waiting on I/O
    -

    -

    Sched Thread Exit

    -

    This is used by the Heat Map to identify when a thread terminates

    -

    - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code2 
    Timestamptimestamp 
    tidpacked32Thread ID (in Linux this is the PID)

    -

    GPU Trace Frame Messages

    -

    GPU Start

    -

    This is used to indicate a part of the GPU has begun execution

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code1 
    Timestamptimestamp 
    Unitpacked32GPU Unit
    Corepacked32GPU Unit Core
    pidpacked32Process ID (in Linux this is the Thread Group ID)
    tidpacked32Thread ID (in Linux this is the PID)

    -

    GPU Stop

    -

    This is used to indicate a part of the GPU has ceased execution

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code2 
    Timestamptimestamp 
    Unitpacked32GPU Unit
    Corepacked32GPU Unit Core

    -

    Idle Frame Messages

    -

    Enter Idle

    -

    This is used to indicate that a core has ceased execution.

    -

    - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code1 
    Timestamptimestamp 
    Corepacked32 

    -

    Exit Idle

    -

    This is used to indicate that a core has resumed execution.

    -

    - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code2 
    Timestamptimestamp 
    Corepacked32 

    -

    Sequence Diagrams

    -

    Configuration

    -

    The diagrams in this topic depict the series of events that are triggered when you click various buttons in the Streamline user interface. Here are the events that occur when the Counter Configuration button is clicked in Streamline where $VER is 18

    -
    -

    This is the sequence of events when you click the Load Defaults in the Counter Configuration dialog box:

    -
    -

    This diagram illustrates the sequence of events that occur when you click either the Cancel or Close button in the Counter Configuration dialog box:

    -
    -

    This is the sequence of events triggered when the Save button is clicked from the Counter Configuration dialog box:

    -
    -

    Note: After you click Save, Cancel or Close, the Counter Configuration dialog box closes.

    -

    Capture

    -

    Here are the events that occur when you click the Start Capture button in Streamline, when the $VER is 18.

    -
    -

    At any point during the capture, Streamline can send a ping to verify that the host is still running. If the ping is not acknowledged, Streamline ends the capture.

    -
    -

    Local Capture

    -

    Streamline also support a local capture mode, a mode in which data is collected without interaction with Streamline. In this case the Target-Host Protocol is omitted. Instead a directory, ending in .apc, is provided to Streamline. This directory contains captured.xml containing the Captured XML, session.xml containing the Session XML, events.xml containing the Events XML and 0000000000 which contains the APC Data with one or more structures of the following format:

    -

    - - - - - - - - - - - - - - - -
    NameTypeDescription
    LengthLittle Endian int32Number of bytes in the body
    bodyAPC Data 

    -
    - - diff --git a/protocol/gator/gator_protocol-5-19.html b/protocol/gator/gator_protocol-5-19.html deleted file mode 100644 index 474622b4..00000000 --- a/protocol/gator/gator_protocol-5-19.html +++ /dev/null @@ -1,2162 +0,0 @@ - - - - - - - Gator v19 (DS-5 v5.19) Protocol - - -
    -

    Gator v19 (DS-5 v5.19) Protocol

    -

    Index

    - -

    Introduction

    -

    This document describes the TCP/IP protocol used by gator or other implementing clients to communicate with Streamline version 5.19 or later. Use this information to build a customized client to communicate profiling data to Streamline. The gator source code, distributed as part of DS-5, is the reference implementation of this protocol. The protocol may change with future releases of Streamline, but Streamline will maintain backwards compatibility with this version of the protocol so that clients need only implement one version of the protocol. Streamline requires that your client is able to parse and generate simple XML and ignore additional or unexpected nodes or attributes. Because the XML features described in this protocol documentation are the only ones used, this protocol does not require the more complex features of XML.

    -

    Changes in v19 (DS-5 v5.19)

    -

    gator v19, the version of gator shipped with Streamline version 5.19, has a few important updates that you should familiarize yourself with before implementing or updating your own customized Streamline TCP/IP protocol

    -
      -
    • Added the Summary Table message to the Summary Frame
    • -
    • Replaced GPU Trace frame messages with the Activity Frame. An Events XML entry is required for activity including CPU activity which specifies the new attributes activityX and cores.
    • -
    • Removed Sched Thread Start message and pid and cookie from Sched Switch message from the Scheduler Trace Frame. This information is now conveyed by the Link message
    • -
    • Moved the link message, where a task (pid, tid, cookie) is defined from the Name Frame to the Activity Frame
    • -
    -

    Target-Host Protocol

    -

    Magic Exchange

    -

    A handshake is required so that your client and Streamline can recognize each other. It consists of ASCII newline (\n) delimited strings. If the client receives a string it does not recognize, the string must be discarded and another string is read.

    -

    The standard Streamline client is gator. But, as you can customize gator and call it what you wish, the term client is used generically to refer to your customized protocol.

    -
      -
    1. The client receives Streamline's highest supported protocol version VERSION $VER\n, for example if Streamline supports up to version 23, the client would receive VERSION 23\n.
    2. -
    3. The client receives STREAMLINE\n
    4. -
    5. Send GATOR 19\n
    6. -
    -

    Further communication from Streamline comes as Commands

    -

    Command Header

    -

    Streamline issues commands that consist of a header and a body. Streamline expects a Response to these commands from the client.

    - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Codeint8The type of command - - - - - - - -
    0= Request XML
    1= Deliver XML
    2= APC Start
    3= APC Stop
    4= Disconnect
    5= Ping
    -
    LengthLittle Endian int32Number of bytes in the body
    -

    If the client receives an unrecognized command, it should respond with a NAK.

    -

    Request XML Body

    -

    Command code 0 is a request from Streamline for XML. The root node is request and it has the type attribute that tells the client which XML is required. For example, this is a request for Events XML

    -

    - <?xml version="1.0" encoding="US-ASCII"?>
    - <request type="events">
    - </request> -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    RequestResponse CodeResponse Body
    <request type="events">XMLEvents XML
    <request type="configuration">XMLConfiguration XML
    <request type="counters">XMLCounters XML
    <request type="captured">XMLCaptured XML Streamline requests Captured XML prior to starting a capture.
    <request type="defaults">XMLdefault Configuration XML
    -

    Deliver XML Body

    -

    The Deliver XML command sends XML to the client:

    - - - - - - - - - - - - - -
    RequestResponse Code
    Session XMLACK
    Configuration XMLACK
    -

    APC Start Body

    -

    The APC Start command does not have a body. This command initiates a capture and readies Streamline to receive APC Data Responses. No ACK is expected and no further XML exchange takes place. If a failure occurs, the client should send an Error.

    -

    APC Stop Body

    -

    The APC Stop command also does not have a body. This command triggers the end of the APC and no ACK is expected. APC Data Responses can continue to arrive until all captured data is sent, then the connection should be closed. If a failure occurs, the client should send an Error.

    -

    Disconnect Body

    -

    The Disconnect command, which closes the connection to the target, does not contain a command body. No ACK is expected.

    -

    Ping Body

    -

    The Ping command does not have a body. Send an ACK response to this command.

    -

    Response Format

    -

    Responses consist of a header followed by a body

    -

    Response Header

    -

    The format for the response header is identical to that of the Command Header but the Codes are different

    - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Codeint8The type of command - - - - - - -
    1= XML
    3= APC Data
    4= ACK
    5= NAK
    0xFF= Error
    -
    LengthLittle Endian int32Number of bytes in the body
    -

    XML Body

    -

    The body should contain XML, the format of which is dependent on the Request type. For a list of types, see Request XML Body

    -

    APC Data Body

    -

    The APC body should contain an APC Frame. If the length is zero, it is the End of Sequence message which indicates that all APC Frames have been transmitted to Streamline.

    -

    ACK Body

    -

    This response, which indicates the Command was successful, does not have a response body.

    -

    NAK Body

    -

    Indicates a synchronous non-fatal error occurred when handling a request. It can contain a UTF-8 error message. The length is specified in the header, so no NULL character is expected. Indicates that the Command failed, but that the connection can continue.

    -

    Error Body

    -

    Indicates a synchronous fatal error occurred when responding to a request. A UTF-8 error message. The length is specified in the header, so no NULL character is expected. Use this response when the error is terminal and the connection must be closed. Errors may be sent without a request, but Streamline may not process them immediately.

    -

    XML

    -

    Events

    -

    The Events XML defines the list of counters that you can choose from in the Counter Configuration dialog box. Modify this list to create your own custom counters.

    -

    events

    -

    The events root node of Events XML can have any number of counter_set and category child nodes.

    -

    counter_set

    -

    The counter_set node has no children and the following attributes. Counter sets are used when the number of counters that can be enabled in a category is restricted. Streamline will respect the restriction and assign a name from the set to a counter in Configuration XML.

    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    nameStringName of the counter_set
    countStringNumber of counters in the set. Counter names are derived by appending a number, starting at zero, to the set name. Ex, if the set name is ARMv7_Cortex_A8_cnt and the count is 4, then the counter names in the set are ARMv7_Cortex_A8_cnt0, ARMv7_Cortex_A8_cnt1, ARMv7_Cortex_A8_cnt2 and ARMv7_Cortex_A8_cnt3
    titleStringAppended to the title of the event when counter_set is a child of category, shown in Streamline before the name. Used to group counters.
    descriptionStringThe value of this attribute is appended to the description to show in Streamline when counter_set is a child of category. Used as the tooltip for the counter
    -

    category

    -

    The category node can have any number of event and option_set child nodes. It can also have one or more counter_set child nodes instead of the counter_set attribute if the same set of child event nodes show up for to multiple counter sets. The category node can have the following attributes:

    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    nameStringThe name of the category. The value given here appears as the category name in the Counter Configuration dialog box in Streamline.
    counter_setStringDefines the counter_set to be used. You must use this attribute if any child event uses the event attribute and there are no child counter_set nodes present.
    per_cpuBooleanDefines whether or not Streamline collects data on a per cpu basis. Set this value to yes and Streamline collects data from each cpu separately for these counters. The default value is no.
    supports_event_based_samplingBooleanUse yes or no to define whether or not the counters in this category can be used for event based sampling. The default value is no.
    -

    option_set

    -

    The event node has one or more option_set child nodes and the following attributes. Use this node when the same event applies to multiple devices. It has the following attributes:

    - - - - - - - - - - - -
    NameTypeDescription
    nameStringThe name of this option_set
    -

    option

    -

    The option_set node contains one or more option child nodes. The option node has no children and the following attributes

    - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    event_deltaHex IntegerThe offset to add to the applicable event to get the event number.
    nameStringThe name of the device. The value of name is appended to the event name.
    descriptionStringA description of the device option. This description is appended to the event description.
    -

    event

    -

    The event node has no children and the following attributes

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    counterStringEvery event element must have either the counter or event attribute defined. Use the counter attribute for fixed counter types, like cycle count. Use the event attribute for all other events. The counter attribute is the name of the counter.
    eventHex Integer Architecture specific or implementation-specific event number, in hexadecimal, determined from either the architecture specification document or the Technical Reference Manual of the processor. This attribute is required if the element does not have a counter attribute.
    option_setStringThe name of the option_set to use.
    titleStringTitle of the event, shown in Streamline before the name. Use this attribute to group counters.
    nameStringName of the event, shown in Streamline after the title.
    per_cpuBooleanDefines whether or not Streamline collects data on a per cpu basis. Set this value to yes and Streamline collects data from each cpu separately for this event. The default is the value of the per_cpu attribute of the category node.
    supports_event_based_samplingBooleanUse yes or no to define whether or not the event can be used for event based sampling. This value defaults to the category value if the attribute is not present in the event.
    classStringUse one of the following values with the class attribute: delta, absolute, activity. 'delta' is used for values that increment or are accumulated over time such as hardware performance counters. 'absolute' is used for singular or impulse values such as system memory used. 'activity' is used in conjunction with scheduler trace data such as CPU activity. The default value is delta. This attribute is optional.
    displayStringUse one of the following values with the display attribute: average, maximum, minimum, hertz, accumulate. This is the same as adding .avg, .max, .min or .hz to the counter name in the chart configuration panel of Streamline. The default value is 'accumulate' for delta counters or 'maximum' for absolute counters or 'average' for activity counters. This attribute is optional.
    unitsStringDefines the unit type to display in Streamline. This attribute is optional.
    modifierIntegerNumber to divide by for fixed point math. The value 1.23 can be represented by the value 123 with a modifier of 100. This attribute is optional.
    derivedBooleanDefines whether or not the data is derived from the data of another chart. The default value is false.
    series_compositionStringDefines how to arrange the data in the Timeline view. Enter either overlay or stacked as the value for this attribute. The default value is stacked.
    rendering_typeStringThe type of chart to render for the Timeline view in Streamline. This attribute is optional and can be set to either bar or fill. The default value is fill.
    average_selectionBooleanSets whether or not average values are displayed by the Cross Section Marker in Streamline. This attribute is optional.
    average_coresBooleanSet whether or not Streamline averages the values of multiple cores when viewing the aggregate data of a per-cpu chart. This attribute is optional.
    percentageBooleanOptional, Sets whether or not the Timeline view displays data as a percentage of the maximum value in the chart.
    activityXStringOnly valid where class is 'activity'. 'X' starts with 1 and increments by 1 for each subsequent activityX entry. The integer is used in the Activity Messages to define the type of activity. These activity names will override the 'name' attribute.
    activity_colorXIntegerOnly valid when activityX is used where 'X' matches the activity. The integer is of the format 0xZZRRGGBB where ZZ is ignored, RR is an 8-bit red value, GG is an 8-bit green value, and BB is an 8-bit blue value. This attribute is optional.
    coresIntegerOnly valid where class is 'activity'. Number of processing units associated with the activity. Defaults to 1
    colorIntegerThe integer is of the format 0xZZRRGGBB where ZZ is ignored, RR is an 8-bit red value, GG is an 8-bit green value, and BB is an 8-bit blue value. This attribute is optional.
    descriptionStringUse this attribute to define a description to show in Streamline. The value of this attribute is used as the tooltip for the counter.
    -

    Events XML example:

    -

    - <?xml version="1.0" encoding="UTF-8"?>
    - <events>
    -   <counter_set name="ARMv7_Cortex_A8_cnt" count="4"/>
    -   <category name="Cortex-A8" counter_set="ARMv7_Cortex_A8_cnt" per_cpu="yes" supports_event_based_sampling="yes">
    -     <event counter="ARMv7_Cortex_A8_ccnt" event="0xff" title="Clock" name="Cycles" display="hertz" units="Hz" average_selection="yes" average_cores="yes" description="The number of core clock cycles"/>
    -     <event event="0x0" title="Software" name="Increment" description="Incremented only on writes to the Software Increment Register"/>
    -     <event event="0x1" title="Cache" name="Instruction refill" description="Instruction fetch that causes a refill of at least the level of instruction or unified cache closest to the processor"/>
    -     <!-- ... -->
    -   </category>
    -   <category name="CCI-400" counter_set="cci-400_cnt" supports_event_based_sampling="yes">
    -     <event counter="cci-400_ccnt" event="0xff" title="CCI-400" name="Cycles" display="hertz" units="Hz" average_selection="yes" description="The number of core clock cycles"/>
    -     <option_set name="Slave">
    -       <option event_delta="0x0" name="S0" description="Slave interface 0"/>
    -       <option event_delta="0x20" name="S1" description="Slave interface 1"/>
    -       <option event_delta="0x40" name="S2" description="Slave interface 2"/>
    -       <!-- ... -->
    -     </option_set>
    -     <event event="0x0" option_set="Slave" title="CCI-400" name="Read: any" description="Read request handshake: any"/>
    -     <event event="0x1" option_set="Slave" title="CCI-400" name="Read: transaction" description="Read request handshake: device transaction"/>
    -     <event event="0x2" option_set="Slave" title="CCI-400" name="Read: normal" description="Read request handshake: normal, non-shareable or system-shareable, but not barrier or cache maintenance operation"/>
    -     <!-- ... -->
    -     <option_set name="Master">
    -       <option event_delta="0xa0" name="M0" description="Master interface 0"/>
    -       <option event_delta="0xc0" name="M1" description="Master interface 1"/>
    -       <option event_delta="0xe0" name="M2" description="Master interface 2"/>
    -       <!-- ... -->
    -     </option_set>
    -     <event event="0x14" option_set="Master" title="CCI-400" name="Retry fetch" description="RETRY of speculative fetch transaction"/>
    -     <event event="0x15" option_set="Master" title="CCI-400" name="Read stall: address hazard" description="Read request stall cycle because of an address hazard"/>
    -     <event event="0x16" option_set="Master" title="CCI-400" name="Read stall: ID hazard" description="Read request stall cycle because of an ID hazard"/>
    -     <!-- ... -->
    -   </category>
    -   <category name="Mali GPU Fragment Processor">
    -     <counter_set name="ARM_Mali-400_FP0_cnt" title="Mali-400 FP0" description="Mali GPU Fragment Processor 0" count="2"/>
    -     <counter_set name="ARM_Mali-400_FP1_cnt" title="Mali-400 FP1" description="Mali GPU Fragment Processor 1" count="2"/>
    -     <counter_set name="ARM_Mali-400_FP2_cnt" title="Mali-400 FP2" description="Mali GPU Fragment Processor 2" count="2"/>
    -     <!-- ... -->
    -     <event event="0x0" title="Mali-400 FP" name="Active clock cycles" description="Active clock cycles, between polygon start and IRQ."/>
    -     <event event="0x2" title="Mali-400 FP" name="Total bus reads" description="Total number of 64-bit words read from the bus."/>
    -     <event event="0x3" title="Mali-400 FP" name="Total bus writes" description="Total number of 64-bit words written to the bus."/>
    -     <!-- ... -->
    -   </category>
    -   <category name="Linux">
    -     <event counter="Linux_irq_softirq" title="Interrupts" name="SoftIRQ" per_cpu="yes" description="Linux SoftIRQ taken"/>
    -     <event counter="Linux_irq_irq" title="Interrupts" name="IRQ" per_cpu="yes" description="Linux IRQ taken"/>
    -     <event counter="Linux_block_rq_wr" title="Disk IO" name="Write" units="B" description="Disk IO Bytes Written"/>
    -     <!-- ... -->
    -   </category>
    -   <category name="hwmon">
    -     <event counter="hwmon_ab8500-isa-0000_0" title="Temperature" name="ext_rtc_xtal" display="average" units="C" modifier="1000" average_selection="yes" description="libsensors Temperature sensor ext_rtc_xtal (hwmon_ab8500-isa-0000_0)"/>
    -     <event counter="hwmon_ab8500-isa-0000_1" title="Temperature" name="ext_db8500" display="average" units="C" modifier="1000" average_selection="yes" description="libsensors Temperature sensor ext_db8500 (hwmon_ab8500-isa-0000_1)"/>
    -     <event counter="hwmon_ab8500-isa-0000_2" title="Temperature" name="bat_temp" display="average" units="C" modifier="1000" average_selection="yes" description="libsensors Temperature sensor bat_temp (hwmon_ab8500-isa-0000_2)"/>
    -     <!-- ... -->
    -   </category>
    - </events> -

    -

    Configuration

    -

    Configuration XML defines the set of counters that are enabled for a capture session. It is sent to the client using the Deliver XML command. Any counters listed in Configuration XML that are not available on the target are ignored.

    -

    configurations

    -

    The configurations root node of Configuration XML can have any number of configuration child nodes and has one attribute:

    - - - - - - - - - - - -
    NameTypeDescription
    revisionInteger2
    -

    configuration

    -

    The configuration node has no children and has the following attributes:

    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    counterStringEvery configuration element must have either the counter or event attribute defined. Use the counter attribute for fixed counter types and the event attribute for all other events. If Events XML did not have a counter for this event, a counter from the related counter_set can be taken. See the description of counter_set in Events XML. This attribute is required.
    eventHex IntegerArchitecture-specific or implementation-specific event number, in hexadecimal, determined from either the architecture specification document or the Technical Reference Manual of the processor. This attribute is required if the element does not have a counter attribute.
    countIntegerTells the client how many samples to collect before triggering the event. This attribute is optional.
    coresIntegerThe same as the cores attribute in the event node of Events XML.
    -

    Configuration XML example:

    -

    - <?xml version="1.0" encoding="US-ASCII"?>
    - <configurations revision="2">
    -   <configuration counter="ARMv7_Cortex_A8_ccnt" event="0xFF"/>
    -   <configuration counter="ARMv7_Cortex_A8_cnt0" event="0x8"/>
    -   <configuration counter="ARMv7_Cortex_A8_cnt1" event="0x44"/>
    -   <configuration counter="ARMv7_Cortex_A8_cnt2" event="0x43"/>
    -   <configuration counter="ARMv7_Cortex_A8_cnt3" event="0x10"/>
    -   <configuration counter="ARMv7_Cortex_A9_ccnt" event="0xFF"/>
    -   <configuration counter="ARMv7_Cortex_A9_cnt0" event="0x68"/>
    -   <configuration counter="ARMv7_Cortex_A9_cnt1" event="0x6"/>
    -   <configuration counter="ARMv7_Cortex_A9_cnt2" event="0x7"/>
    -   <configuration counter="ARMv7_Cortex_A9_cnt3" event="0x3"/>
    -   <configuration counter="ARMv7_Cortex_A9_cnt4" event="0x4"/>
    -   <configuration counter="Linux_block_rq_wr"/>
    -   <configuration counter="Linux_block_rq_rd"/>
    -   <configuration counter="Linux_meminfo_memused"/>
    -   <configuration counter="Linux_meminfo_memfree"/>
    -   <configuration counter="Linux_power_cpu_freq"/>
    -   <configuration counter="cci-400_cnt0" event="0xB4"/>
    -   <configuration counter="cci-400_cnt1" event="0xD4"/>
    -   <configuration counter="cci-400_cnt2" event="0xB5"/>
    -   <configuration counter="hwmon_arm,vexpress-amp-isa-0011_0"/>
    -   <configuration counter="hwmon_arm,vexpress-amp-isa-0010_0"/>
    - </configurations> -

    -

    Counters

    -

    Counters XML lists the counters available on the target.

    -

    counters

    -

    The counters root node of Counters XML can have any number of counter child nodes

    -

    counter

    -

    The counter node has the following attribute

    - - - - - - - - - - - -
    NameTypeDescription
    nameStringAn available counter name from counter_set or the counter attribute of the event node.
    -

    Counters XML Example:

    -

    - <?xml version="1.0" encoding="utf-8"?>
    - <counters>
    -   <counter name="Linux_power_cpu_idle"/>
    -   <counter name="Linux_power_cpu_freq"/>
    -   <counter name="Linux_sched_switch"/>
    -   <counter name="ARMv7_Cortex_A8_cnt3"/>
    -   <counter name="ARMv7_Cortex_A8_cnt2"/>
    -   <counter name="ARMv7_Cortex_A8_cnt1"/>
    -   <counter name="ARMv7_Cortex_A8_cnt0"/>
    -   <counter name="ARMv7_Cortex_A8_ccnt"/>
    -   <counter name="Linux_net_tx"/>
    -   <counter name="Linux_net_rx"/>
    -   <counter name="mmaped_cnt2"/>
    -   <counter name="mmaped_cnt1"/>
    -   <counter name="mmaped_cnt0"/>
    -   <counter name="Linux_meminfo_bufferram"/>
    -   <counter name="Linux_meminfo_memused"/>
    -   <counter name="Linux_meminfo_memfree"/>
    -   <counter name="Linux_irq_softirq"/>
    -   <counter name="Linux_irq_irq"/>
    -   <counter name="Linux_block_rq_rd"/>
    -   <counter name="Linux_block_rq_wr"/>
    - </counters> -

    -

    Session

    -

    Session XML is created by Streamline and delivered to the client. Values in Session XML are based on the settings defined in the Capture & Analysis Options dialog box.

    -

    Note: Session XML must be delivered by Streamline via the Deliver XML command before it is requested by Streamline. Send back the received XML.

    -

    session

    -

    The session root node of Session XML can have any number of image child nodes, zero or one energy_capture child nodes and has the following attributes

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    versionInteger1
    call_stack_unwindingBooleanThe value is yes if the Call Stack Unwinding checkbox is selected, or no if it is not.
    parse_debug_infoBooleanThe value is yes if the Process Debug Information checkbox is selected, no if it is not.
    high_resolutionBooleanThe value is yes if the High Resolution Timeline checkbox is selected, no if it is not.
    buffer_modeStringThe mode chosen using the Buffer Mode drop-down menu. It can set to streaming or one of the following store-and-forward buffers: large - 16MB, medium - 4MB, or small - 1MB.
    sample_rateStringThe sample rate chosen using the Sample Rate drop-down menu. It can be set to one of the following options: normal, low, or none.
    durationIntegerThe maximum duration of the capture session, in seconds.
    target_hostStringThe address of the target.
    target_portIntegerThe target port.
    live_rateIntegerThe value of this attribute dictates how often, in milliseconds, the Name, Counter, Block Counter, Scheduler Trace and Activity Frames should be flushed to Streamline for the Live view.
    -

    image

    -

    There is no restriction to the number of image nodes the session node can have. The image node has no child nodes and the following attributes:

    - - - - - - - - - - - - - - - - -
    NameTypeDescription
    pathStringThis attribute defines the Program Image. This attribute can be used during local capture to copy images into the .apc folder. You can update all Program Images in Streamline post-capture.
    enabledBooleanA yes value means the Program Image is enabled, a no value means it is not. The default value is no.
    -

    energy_capture

    -

    The session node can either have zero or one energy_capture child nodes. The energy_capture node can have zero or more channel child nodes and the following attributes:

    - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    versionInteger1
    command_pathStringThe full path to the caiman executable
    typeStringThe type attribute can have one of three possible values: none, energy_probe or ni-daq. none means no energy data is collected during a capture. energy_probe or ni-daq define the hardware used to capture the energy data from the target.
    -

    channel

    -

    The energy_capture node can any number of channel nodes. The channel node has the following attributes:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    idIntegerThe channel number
    resistanceIntegerThe channel resistance, set using the resistance field.
    powerBooleanTrue if power data is to be collected and displayed
    voltageBooleanSet to yes if the Voltage checkbox has been enabled for this channel.
    currentBooleanSet to yes if the Current checkbox has been enabled for this channel.
    -

    Example:

    -

    - <?xml version="1.0" encoding="US-ASCII"?>
    - <session version="1" call_stack_unwinding="yes" parse_debug_info="yes" high_resolution="no" buffer_mode="streaming" sample_rate="low" duration="0" target_host="10.99.3.109" target_port="8080" live_rate="100">
    -   <image path="H:\ls"/>
    -   <image path="H:\libc.so.6"/>
    -   <energy_capture version="1" command_path="C:\Program Files (x86)\DS-5\bin\caiman.exe" type="none">
    -     <channel id="0" resistance="20" power="yes" voltage="yes" current="yes"/>
    -   </energy_capture>
    - </session> -

    -

    Captured

    -

    Captured XML contains information about a capture session. This is very similar to Configuration XML

    -

    captured

    -

    The captured root node of Captured XML has one target child node, one counters child node, and the following attributes:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    versionInteger1
    live_energy_deltaIntegerThis attribute is added by Streamline
    createdIntegerCapture date in seconds since the epoch (midnight January 1, 1970 UTC). If you are doing a local capture, gator populates this attribute. Otherwise, Streamline adds this attribute.
    protocolInteger19
    backtrace_processingStringThe value of backtrace_processing can be either gator or none. This attribute is optional and the default value is gator. Indicates the type of call stack post-processing to use.
    -

    target

    -

    The captured node always contains one target child node. The target child node has the following attributes:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    nameStringThe name of the target
    sample_rateIntegerNumber of samples collected per second
    coresIntegerNumber of CPU cores on the target
    cpuidHex IntegerThe cpuid of a core. For example, 0xc08
    supports_liveBooleanIndicates if the Name, Counter, Block Counter, Scheduler Trace and Activity Frames are flushed to Streamline for the Live view.
    -

    counters

    -

    The captured node always contains one counters node. The counters node has the following child node:

    -

    counter

    -

    The counters node can contain any number of counter child nodes. The counter child node contains the following attributes:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    keyHex IntegerThe key for this counter in the APC data.
    typeStringThe same as the counter attribute in the configuration node of Configuration XML.
    eventHex IntegerThe same as the event attribute in the configuration node of Configuration XML.
    countIntegerThe count value used during the capture session. Dictated how many samples had to be collected before triggering the event. This can only be set on one counter. This attribute is optional.
    coresIntegerThe same as the cores attribute in the event node of Events XML.
    -

    Example:

    -

    - <?xml version="1.0" encoding="utf-8"?>
    - <captured version="1" created="1361467764" protocol="19">
    -   <target sample_rate="100" cores="5" cpuid="0xc0f"/>
    -   <counters>
    -     <counter key="0x3" type="ARMv7_Cortex_A7_cnt1" event="0x10"/>
    -     <counter key="0x4" type="ARMv7_Cortex_A7_cnt2" event="0x16"/>
    -     <counter key="0x1" type="ARMv7_Cortex_A7_ccnt" event="0xff"/>
    -     <counter key="0x2" type="ARMv7_Cortex_A7_cnt0" event="0x8"/>
    -     <counter key="0x15" type="Linux_power_cpu_freq" event="0x0"/>
    -     <counter key="0x9" type="Linux_block_rq_rd" event="0x0"/>
    -     <counter key="0x8" type="Linux_block_rq_wr" event="0x0"/>
    -     <counter key="0xc" type="Linux_meminfo_memfree" event="0x0"/>
    -     <counter key="0xd" type="Linux_meminfo_memused" event="0x0"/>
    -     <counter key="0x12" type="Linux_net_rx" event="0x0"/>
    -     <counter key="0x13" type="Linux_net_tx" event="0x0"/>
    -   </counters>
    - </captured> -

    -

    APC Frame Format

    -

    Overview

    -

    The XML files and .apc data collected by Streamline are placed in an .apc folder. When Streamline processes this folder, it creates a db folder, followed by a report folder.

    -

    Note: The APC files are ten-digit files with no extension starting with 0000000000.

    -

    When creating a new report from the same .apc folder, Streamline does not regenerate the db folder, even if the .apc data has changed. In other words, the .apc data is ignored if a valid db folder exists. To ensure Streamline generates a new report from the .apc data, delete the db directory. If this folder is missing, Streamline recreates it from the .apc data files.

    -

    Types

    -
    -
    int32
    4-byte signed little endian
    -
    packed32
    variable length packed 4-byte signed value, see Packed Values
    -
    packed64
    variable length packed 8-byte signed value, see Packed Values
    -
    string
    A packed32 length followed by the specified number of characters
    -
    #
    A constant packed32 value of #, ex: 5 is the packed32 number 5
    -
    timestamp
    packed64 monotonic time value in nanoseconds relative to the monotonic delta from the Summary Message
    -
    -

    Packed Values

    -

    To reduce their size, integers are packed. This is done by avoiding the transmission of duplicate high bits. The value is split into 7 bit bytes in little endian order. The most significant bit of the byte is set to 1, if there is a subsequent byte for this value. On the last byte, the most significant bit is set to 0. For positive values, the most significant encoded bit must be 0 and for negative numbers it must be 1. This is very similar to signed LEB128 used in DWARF.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    BitsLast valueByte 1Byte 2Byte 3Byte 4Byte 5
    31-21474836481XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb01111XXXb
    27-1342177281XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
    20-10485761XXXXXXXb1XXXXXXXb01XXXXXXb
    13-81921XXXXXXXb01XXXXXXb
    6-6401XXXXXXb
    66300XXXXXXb
    1381911XXXXXXXb00XXXXXXb
    2010485751XXXXXXXb1XXXXXXXb00XXXXXXb
    271342177271XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
    3121474836471XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb00000XXXb
    -

    For example, 429389 (01101000110101001101b) would be encoded as 0xCD (11001101b) 0x9A (10011010b) 0x1A (00011010b)

    -

    Packed 64 values work in much the same way:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    BitsLast valueByte 1Byte 2Byte 3Byte 4Byte 5Byte 6Byte 7Byte 8Byte 9Byte 10
    63-92233720368547758081XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb0111111Xb
    62-46116860184273879041XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
    55-360287970189639681XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
    48-2814749767106561XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
    41-21990232555521XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
    34-171798691841XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
    27-1342177281XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
    20-10485761XXXXXXXb1XXXXXXXb01XXXXXXb
    13-81921XXXXXXXb01XXXXXXb
    6-6401XXXXXXb
    66300XXXXXXb
    1381911XXXXXXXb00XXXXXXb
    2010485751XXXXXXXb1XXXXXXXb00XXXXXXb
    271342177271XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
    34171798691831XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
    4121990232555511XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
    482814749767106551XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
    55360287970189639671XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
    6246116860184273879031XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
    6392233720368547758071XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb0000000Xb
    -

    For example, -4758616141418899142 would be encoded as 0xBA 0xB2 0xA5 0xA2 0xCE 0xFA 0xFF 0xFA 0xBD 0x7F.

    -

    Frames consist of a header followed by a body of zero or more type specific messages

    -

    Ordering

    -

    The timestamp order of messages is significant and must be in-order on the same core. Timestamps within a frame must also be in order. A specific counter is only be populated in Counter frames or Block Counter frames, not a mix of both.

    -

    Required Messages

    -

    To generate a valid capture at least one Activity, Counter or Block Counter message must be present. All other messages are optional.

    -

    Frame Header

    -

    A length always precedes the frame header either from the Response Header or when the .apc data is written to disk by Streamline during a streaming capture or by gator during a Local Capture.

    - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Codepacked32Indicates the type of this frame. - - - - - - - - - - -
    1= Summary
    2= Backtrace
    3= Name
    4= Counter
    5= Block Counter
    6= Annotate
    7= Sched Trace
    9= Idle
    13= Activity Trace
    -
    Corepacked32The processor that originated the messages in the frame. This field must always be present but is ignored for Summary, Counter, Annotate, Activity and Idle Frames as these frames can have messages from multiple cores.
    -

    If there are multiple message types for a frame, each message will start with a unique code

    -

    Summary Frame Messages

    -

    Summary Message

    -

    This message should appear only once and it is recommended that it is the first message in the first frame sent to Streamline so the Newline Canary can be checked for correctness before any other processing occurs.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code1 
    Newline CanarystringAlways "1\n2\r\n3\r4\n\r5"
    Timestamppacked64Current system time in nanoseconds since the epoch (midnight January 1, 1970 UTC) or 0 if the target does not have system time
    Uptimepacked64How long the system has been running in nanoseconds. This is not affected by external influences like changing the system time, ntp, hibernating, etc... Can be used to reference kernel log messages. If the target does not support uptime, send 0 and use a monotonically increasing timer for the timestamp messages.
    Monotonic Deltapacked64The delta applied to the monotonic clock to zero-base the timestamps, may be zero if the platform does not support absolute timestamps.
    Attributes  - Zero or more repetitions of the following: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    KeyStringAttribute key. Must not be empty
    ValueStringAttribute value
    -
    End of AttributesStringAlways the empty string
    -

    CPU Core Name Message

    -

    This is used to identify clusters and in the tooltip in X-Ray mode

    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code3 
    Corepacked32The core which the cpuid and Name describe
    cpuidpacked32cpuid of this core. For example, 0xc08
    NamestringHuman readable name of this core. For example, Cortex-A8
    -

    Summary Table

    -

    This message is used to send arbitrary table information to Streamline

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code2 
    NameStringThe name of this table
    Column Countpacked32Number of columns
    Columns  - Column count repetitions of the following: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    NameStringName of the column
    Typepacked32The type of the column - - - - -
    1= packed64
    2= string
    3= string cell with a link to source code serialized as string, string, packed32 where the first string is the cell text, the second string is the source filename and the packed32 is the line number.
    -
    -
    Row Countpacked32Number of rows
    Rows Row count repetitions of rows as specified by columns. Ex: if Columns is [["IRQ", 2], ["Count", 1]] then each row would be a string and a packed64.
    -

    Backtrace Frame Messages

    -

    This is used to populate the Call Paths tab

    -
      -
    • Exec cookie vs Offset cookie -
      • If a sample occurs in libx.so called by my-app, the exec cookie is my-app and the offset cookie is libx.so
      -
    • -
    -

    Cookies should be positive. The special values 0 indicates kernel or idle, -1 indicate an invalid cookie and 1 is reserved to avoid confusion with End of Message, 1 below.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Timestamptimestamp 
    Exec Cookiepacked32Cookie of the current process
    pidpacked32Process ID. In Linux, this is the Thread Group ID
    tidpacked32Thread ID. In Linux, this is the PID
    Body  - One or more repetitions of the following: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Offset Cookiepacked32Executable or library at the offset
    Offsetpacked64Offset in the backtrace
    -
    End of Message1 
    -

    Name Frame Messages

    -

    Cookie Name Message

    -

    This is used to get the name for the Process Handle. Cookies are stored in a pseudo hashmap which limits the number of possible collisions, thus duplicate cookies may be emitted. In addition, cookies are stored per core, thus when a task migrates to a new core, a fresh cookie may be emitted for that core. However cookies are unique across all cores.

    - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code1 
    Cookiepacked32Cookie key
    NamestringCookie value
    -

    IRQ Cookie Name Message

    -

    This is similar to the Cookie Name Message but instead is used used to get the name for an IRQ/Exception.

    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code5 
    Cookiepacked32Cookie key
    NamestringCookie value
    IRQpacked32IRQ/Exception number
    -

    Thread Name Message

    -

    This is used to show thread names in the Thread Disclosure. Thread names are stored in a pseudo hashmap which to limit the number of times the name is sent, but duplicate thread names may be emitted. Thread numbers can be reused as long as the activity thread exit message is sent before it is reused.

    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code2 
    Timestamptimestamp 
    Thread IDpacked32tid of the named thread
    NamestringName of the thread
    -

    Counter Frame Messages

    -

    This is used to populate Charts in the Timeline view

    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Timestamptimestamp 
    Corepacked32Core to which this counter applies
    Keypacked32Key in Captured XML
    Valuepacked64Value of the specified counter
    -

    Block Counter Frame Messages

    -

    Block counters are the same as counters, but used less space when multiple counters are sampled at the same timestamp and on the same core. To start the block, the key of 0 and a timestamp value is emitted. Then any counters sampled at that time are emitted. A block of counters (counters using the same timestamp) must all be emitted in the same frame. This means that the first block counter message emitted in a frame must be the timestamp.

    -

    Before emitting thread specific values, emit key 1 and the pid value. Any following values apply to the specified pid until another pid or timestamp is emitted

    - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Keypacked320 for timestamp, 1 for pid or key (where key > 1) in Captured XML
    Valuepacked64Value of the specified counter
    -

    Annotate Frame Messages

    -

    Annotations are messages sent by arbitrary userspace programs, so their format is different from other messages.

    -

    A single annotation may be broken across frame boundaries. This is why the Annotation Message has a size and the Userspace Annotations either have a size or are '\n' terminated.

    -

    To colorize any ASCII string within the annotation data, prefix the string with 0x1B escape character followed by a 3-byte RGB value

    -

    Annotate Message

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Corepacked32 
    tidpacked32Thread ID (in Linux this is the PID)
    Timestamptimestamp 
    Sizepacked32Message size
    Body Userspace Annotation data fragment
    -

    Userspace Annotations

    -

    Annotations belong to a channel with 0 being the default channel. Channels belong to groups with 0 as the default group.

    -

    ASCII String Annotation

    -

    This is used to add a line in the Log tab. Can also be sent from the command line. For example, echo 'Hello World' > /dev/gator/annotate

    - - - - - - - - - - - - - - - - -
    NameTypeDescription
    ColorcolorOptional, 0x1B, RR, GG, BB
    ASCII StringZero or more ASCII characters followed by '\n'Text annotation
    -

    Create Group Annotation

    -

    This is used to name a group in the Thread Disclosure

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Escape Code0x1C 
    Marker Code0x8 
    GroupLittle Endian int32 
    String LengthLittle Endian int16 
    UTF-8 StringString Length UTF-8 bytesChannel name
    -

    Create Channel Annotation

    -

    This is used to name a channel in the Thread Disclosure

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Escape Code0x1C 
    Marker Code0x7 
    ChannelLittle Endian int32 
    GroupLittle Endian int32Group the channel belongs to
    String LengthLittle Endian int16 
    UTF-8 StringString Length UTF-8 bytesChannel name
    -

    UTF-8 String Annotations

    -

    This is used to add a line in the Log tab.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Escape Code0x1C 
    Marker Code0x6 
    ChannelLittle Endian int32Channel the annotation belongs to
    String LengthLittle Endian int16 
    ColorcolorOptional, 0x1B, RR, GG, BB, counts against String Length
    UTF-8 StringString Length UTF-8 bytesText annotation
    -

    Visual Annotation

    -

    This is used to add a line in the Log tab and an image to the Visual Annotation Chart.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Escape Code0x1C 
    Visual Code0x4 
    String LengthLittle Endian int16 
    UTF-8 StringString Length UTF-8 bytesText annotation
    Image LengthLittle Endian int32 
    Image DataImage Length bytes 
    -

    Marker Annotation

    -

    This is used to add a Bookmark

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Escape Code0x1C 
    Marker Code0x5 
    String LengthLittle Endian int16 
    ColorcolorOptional, 0x1B, RR, GG, BB, counts against String Length
    UTF-8 StringString Length UTF-8 bytesText annotation
    -

    Scheduler Trace Frame Messages

    -

    Sched Switch

    -

    This is used to populate the CPU Activity Chart and the Heat Map

    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code1 
    Timestamptimestamp 
    tidpacked32Thread ID (in Linux this is the PID)
    Statepacked32State - - - - -
    0= Waiting on other event besides I/O
    1= Contention/pre-emption
    2= Waiting on I/O
    -
    -

    Sched Thread Exit

    -

    This is used by the Heat Map to identify when a thread terminates

    - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code2 
    Timestamptimestamp 
    tidpacked32Thread ID (in Linux this is the PID)
    -

    Activity Frame Messages

    -

    With Activity messages something is always running, though that something can be idle.

    -

    Link Message

    -

    This is used to link a cookie, pid and tid. This message must have a timestamp corresponding to before or shortly after the first time a task runs.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code1 
    Timestamptimestamp 
    Cookiepacked32Cookie of the current process
    pidpacked32Process ID (in Linux this is the Thread Group ID)
    tidpacked32Thread ID (in Linux this is the PID)
    -

    Activity Switch

    -

    Causes the task specified by the tid to become active and the previous task on the same core to stop running.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code2 
    Timestamptimestamp 
    Corepacked32Core on which this activity occurred
    Keypacked32key is defined in Captured XML (where key > 1)
    Activitypacked32One of the activity types defined in Events XML or zero for idle
    tidpacked32CPU thread ID (in Linux this is the PID) associated with this activity, use -1 if no tid association is desired
    Wait Statepacked32 - Reason the previously running task stopped - - - - -
    0= Waiting on other (default)
    1= Contention/pre-emption
    2= Waiting on I/O
    -
    -

    Task Exit

    -

    Causes the task specified by the tid to terminate and is only used to differentiate idle from terminated

    - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code3 
    Timestamptimestamp 
    tidpacked32Thread ID (in Linux this is the PID)
    -

    Idle Frame Messages

    -

    Enter Idle

    -

    This is used to indicate that a core has ceased execution

    - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code1 
    Timestamptimestamp 
    Corepacked32 
    -

    Exit Idle

    -

    This is used to indicate that a core has resumed execution.

    - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code2 
    Timestamptimestamp 
    Corepacked32 
    -

    Sequence Diagrams

    -

    Configuration

    -

    The diagrams in this topic depict the series of events that are triggered when you click various buttons in the Streamline user interface. Here are the events that occur when the Counter Configuration button is clicked in Streamline where $VER is 19

    -
    -

    This is the sequence of events when you click the Load Defaults in the Counter Configuration dialog box:

    -
    -

    This diagram illustrates the sequence of events that occur when you click either the Cancel or Close button in the Counter Configuration dialog box:

    -
    -

    This is the sequence of events triggered when the Save button is clicked from the Counter Configuration dialog box:

    -
    -

    Note: After you click Save, Cancel or Close, the Counter Configuration dialog box closes.

    -

    Capture

    -

    Here are the events that occur when you click the Start Capture button in Streamline, when the $VER is 19.

    -
    -

    At any point during the capture, Streamline can send a ping to verify that the host is still running. If the ping is not acknowledged, Streamline ends the capture.

    -
    -

    Local Capture

    -

    Streamline also support a local capture mode, a mode in which data is collected without interaction with Streamline. In this case the Target-Host Protocol is omitted. Instead a directory, ending in .apc, is provided to Streamline. This directory contains captured.xml containing the Captured XML, session.xml containing the Session XML, events.xml containing the Events XML and 0000000000 which contains the APC Data with one or more structures of the following format:

    - - - - - - - - - - - - - - - - -
    NameTypeDescription
    LengthLittle Endian int32Number of bytes in the body
    bodyAPC Data 
    -
    - - diff --git a/protocol/gator/gator_protocol-5-20.html b/protocol/gator/gator_protocol-5-20.html deleted file mode 100644 index f54b4710..00000000 --- a/protocol/gator/gator_protocol-5-20.html +++ /dev/null @@ -1,2232 +0,0 @@ - - - - - - - Gator v20 (DS-5 v5.20) Protocol - - -
    -

    Gator v20 (DS-5 v5.20) Protocol

    -

    Index

    - -

    Introduction

    -

    This document describes the TCP/IP protocol used by gator or other implementing clients to communicate with Streamline version 5.20 or later. Use this information to build a customized client to communicate profiling data to Streamline. The gator source code, distributed as part of DS-5, is the reference implementation of this protocol. The protocol may change with future releases of Streamline, but Streamline will maintain backwards compatibility with this version of the protocol so that clients need only implement one version of the protocol. Streamline requires that your client is able to parse and generate simple XML and ignore additional or unexpected nodes or attributes. Because the XML features described in this protocol documentation are the only ones used, this protocol does not require the more complex features of XML.

    -

    Changes in v20 (DS-5 v5.20)

    -

    gator v20, the version of gator shipped with Streamline version 5.20, has a few important updates that you should familiarize yourself with before implementing or updating your own customized Streamline TCP/IP protocol

    - -

    Target-Host Protocol

    -

    Magic Exchange

    -

    A handshake is required so that your client and Streamline can recognize each other. It consists of ASCII newline (\n) delimited strings. If the client receives a string it does not recognize, the string must be discarded and another string is read.

    -

    The standard Streamline client is gator. But, as you can customize gator and call it what you wish, the term client is used generically to refer to your customized protocol.

    -
      -
    1. The client receives Streamline's highest supported protocol version VERSION $VER\n, for example if Streamline supports up to version 23, the client would receive VERSION 23\n.
    2. -
    3. The client receives STREAMLINE\n
    4. -
    5. Send GATOR 20\n
    6. -
    -

    Further communication from Streamline comes as Commands

    -

    Command Header

    -

    Streamline issues commands that consist of a header and a body. Streamline expects a Response to these commands from the client.

    - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Codeint8The type of command - - - - - - - -
    0= Request XML
    1= Deliver XML
    2= APC Start
    3= APC Stop
    4= Disconnect
    5= Ping
    -
    LengthLittle Endian int32Number of bytes in the body
    -

    If the client receives an unrecognized command, it should respond with a NAK.

    -

    Request XML Body

    -

    Command code 0 is a request from Streamline for XML. The root node is request and it has the type attribute that tells the client which XML is required. For example, this is a request for Events XML

    -

    - <?xml version="1.0" encoding="US-ASCII"?>
    - <request type="events">
    - </request> -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    RequestResponse CodeResponse Body
    <request type="events">XMLEvents XML
    <request type="configuration">XMLConfiguration XML
    <request type="counters">XMLCounters XML
    <request type="captured">XMLCaptured XML Streamline requests Captured XML prior to starting a capture.
    <request type="defaults">XMLdefault Configuration XML
    -

    Deliver XML Body

    -

    The Deliver XML command sends XML to the client:

    - - - - - - - - - - - - - -
    RequestResponse Code
    Session XMLACK
    Configuration XMLACK
    -

    APC Start Body

    -

    The APC Start command does not have a body. This command initiates a capture and readies Streamline to receive APC Data Responses. No ACK is expected and no further XML exchange takes place. If a failure occurs, the client should send an Error.

    -

    APC Stop Body

    -

    The APC Stop command also does not have a body. This command triggers the end of the APC and no ACK is expected. APC Data Responses can continue to arrive until all captured data is sent, then the connection should be closed. If a failure occurs, the client should send an Error.

    -

    Disconnect Body

    -

    The Disconnect command, which closes the connection to the target, does not contain a command body. No ACK is expected.

    -

    Ping Body

    -

    The Ping command does not have a body. Send an ACK response to this command.

    -

    Response Format

    -

    Responses consist of a header followed by a body

    -

    Response Header

    -

    The format for the response header is identical to that of the Command Header but the Codes are different

    - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Codeint8The type of command - - - - - - -
    1= XML
    3= APC Data
    4= ACK
    5= NAK
    0xFF= Error
    -
    LengthLittle Endian int32Number of bytes in the body
    -

    XML Body

    -

    The body should contain XML, the format of which is dependent on the Request type. For a list of types, see Request XML Body

    -

    APC Data Body

    -

    The APC body should contain an APC Frame. If the length is zero, it is the End of Sequence message which indicates that all APC Frames have been transmitted to Streamline.

    -

    ACK Body

    -

    This response, which indicates the Command was successful, does not have a response body.

    -

    NAK Body

    -

    Indicates a synchronous non-fatal error occurred when handling a request. It can contain a UTF-8 error message. The length is specified in the header, so no NULL character is expected. Indicates that the Command failed, but that the connection can continue.

    -

    Error Body

    -

    Indicates a synchronous fatal error occurred when responding to a request. A UTF-8 error message. The length is specified in the header, so no NULL character is expected. Use this response when the error is terminal and the connection must be closed. Errors may be sent without a request, but Streamline may not process them immediately.

    -

    XML

    -

    Events

    -

    The Events XML defines the list of counters that you can choose from in the Counter Configuration dialog box. Modify this list to create your own custom counters.

    -

    events

    -

    The events root node of Events XML can have any number of counter_set and category child nodes.

    -

    counter_set

    -

    The counter_set node has no children and the following attributes. Counter sets are used when the number of counters that can be enabled in a category is restricted. Streamline will respect the restriction and assign a name from the set to a counter in Configuration XML.

    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    nameStringName of the counter_set
    countStringNumber of counters in the set. Counter names are derived by appending a number, starting at zero, to the set name. Ex, if the set name is ARMv7_Cortex_A8_cnt and the count is 4, then the counter names in the set are ARMv7_Cortex_A8_cnt0, ARMv7_Cortex_A8_cnt1, ARMv7_Cortex_A8_cnt2 and ARMv7_Cortex_A8_cnt3
    titleStringAppended to the title of the event when counter_set is a child of category, shown in Streamline before the name. Used to group counters.
    descriptionStringThe value of this attribute is appended to the description to show in Streamline when counter_set is a child of category. Used as the tooltip for the counter
    -

    category

    -

    The category node can have any number of event and option_set child nodes. It can also have one or more counter_set child nodes instead of the counter_set attribute if the same set of child event nodes show up for to multiple counter sets. The category node can have the following attributes:

    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    nameStringThe name of the category. The value given here appears as the category name in the Counter Configuration dialog box in Streamline.
    counter_setStringDefines the counter_set to be used. You must use this attribute if any child event uses the event attribute and there are no child counter_set nodes present.
    per_cpuBooleanDefines whether or not Streamline collects data on a per cpu basis. Set this value to yes and Streamline collects data from each cpu separately for these counters. The default value is no.
    supports_event_based_samplingBooleanUse yes or no to define whether or not the counters in this category can be used for event based sampling. The default value is no.
    -

    option_set

    -

    The event node has one or more option_set child nodes and the following attributes. Use this node when the same event applies to multiple devices. It has the following attributes:

    - - - - - - - - - - - -
    NameTypeDescription
    nameStringThe name of this option_set
    -

    option

    -

    The option_set node contains one or more option child nodes. The option node has no children and the following attributes

    - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    event_deltaHex IntegerThe offset to add to the applicable event to get the event number.
    nameStringThe name of the device. The value of name is appended to the event name.
    descriptionStringA description of the device option. This description is appended to the event description.
    -

    event

    -

    The event node has no children and the following attributes

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    counterStringEvery event element must have either the counter or event attribute defined. Use the counter attribute for fixed counter types, like cycle count. Use the event attribute for all other events. The counter attribute is the name of the counter.
    eventHex Integer Architecture specific or implementation-specific event number, in hexadecimal, determined from either the architecture specification document or the Technical Reference Manual of the processor. This attribute is required if the element does not have a counter attribute.
    option_setStringThe name of the option_set to use.
    titleStringTitle of the event, shown in Streamline before the name. Use this attribute to group counters.
    nameStringName of the event, shown in Streamline after the title.
    per_cpuBooleanDefines whether or not Streamline collects data on a per cpu basis. Set this value to yes and Streamline collects data from each cpu separately for this event. The default is the value of the per_cpu attribute of the category node.
    supports_event_based_samplingBooleanUse yes or no to define whether or not the event can be used for event based sampling. This value defaults to the category value if the attribute is not present in the event.
    classStringUse one of the following values with the class attribute: delta, absolute, activity. 'delta' is used for values that increment or are accumulated over time such as hardware performance counters. 'absolute' is used for singular or impulse values such as system memory used. 'activity' is used in conjunction with scheduler trace data such as CPU activity. The default value is delta. This attribute is optional.
    displayStringUse one of the following values with the display attribute: average, maximum, minimum, hertz, accumulate. This is the same as adding .avg, .max, .min or .hz to the counter name in the chart configuration panel of Streamline. The default value is 'accumulate' for delta counters or 'maximum' for absolute counters or 'average' for activity counters. This attribute is optional.
    unitsStringDefines the unit type to display in Streamline. This attribute is optional.
    modifierIntegerNumber to divide by for fixed point math. The value 1.23 can be represented by the value 123 with a modifier of 100. This attribute is optional.
    derivedBooleanDefines whether or not the data is derived from the data of another chart. The default value is false.
    series_compositionStringDefines how to arrange the data in the Timeline view. Enter either overlay or stacked as the value for this attribute. The default value is stacked.
    rendering_typeStringThe type of chart to render for the Timeline view in Streamline. This attribute is optional and can be set to either bar or fill. The default value is fill.
    average_selectionBooleanSets whether or not average values are displayed by the Cross Section Marker in Streamline. This attribute is optional.
    average_coresBooleanSet whether or not Streamline averages the values of multiple cores when viewing the aggregate data of a per-cpu chart. This attribute is optional.
    percentageBooleanOptional, Sets whether or not the Timeline view displays data as a percentage of the maximum value in the chart.
    activityXStringOnly valid where class is 'activity'. 'X' starts with 1 and increments by 1 for each subsequent activityX entry. The integer is used in the Activity Messages to define the type of activity. These activity names will override the 'name' attribute.
    activity_colorXIntegerOnly valid when activityX is used where 'X' matches the activity. The integer is of the format 0xZZRRGGBB where ZZ is ignored, RR is an 8-bit red value, GG is an 8-bit green value, and BB is an 8-bit blue value. This attribute is optional.
    coresIntegerOnly valid where class is 'activity'. Number of processing units associated with the activity. Defaults to 1
    colorIntegerThe integer is of the format 0xZZRRGGBB where ZZ is ignored, RR is an 8-bit red value, GG is an 8-bit green value, and BB is an 8-bit blue value. This attribute is optional.
    descriptionStringUse this attribute to define a description to show in Streamline. The value of this attribute is used as the tooltip for the counter.
    -

    Events XML example:

    -

    - <?xml version="1.0" encoding="UTF-8"?>
    - <events>
    -   <counter_set name="ARMv7_Cortex_A8_cnt" count="4"/>
    -   <category name="Cortex-A8" counter_set="ARMv7_Cortex_A8_cnt" per_cpu="yes" supports_event_based_sampling="yes">
    -     <event counter="ARMv7_Cortex_A8_ccnt" event="0xff" title="Clock" name="Cycles" display="hertz" units="Hz" average_selection="yes" average_cores="yes" description="The number of core clock cycles"/>
    -     <event event="0x0" title="Software" name="Increment" description="Incremented only on writes to the Software Increment Register"/>
    -     <event event="0x1" title="Cache" name="Instruction refill" description="Instruction fetch that causes a refill of at least the level of instruction or unified cache closest to the processor"/>
    -     <!-- ... -->
    -   </category>
    -   <category name="CCI-400" counter_set="cci-400_cnt" supports_event_based_sampling="yes">
    -     <event counter="cci-400_ccnt" event="0xff" title="CCI-400" name="Cycles" display="hertz" units="Hz" average_selection="yes" description="The number of core clock cycles"/>
    -     <option_set name="Slave">
    -       <option event_delta="0x0" name="S0" description="Slave interface 0"/>
    -       <option event_delta="0x20" name="S1" description="Slave interface 1"/>
    -       <option event_delta="0x40" name="S2" description="Slave interface 2"/>
    -       <!-- ... -->
    -     </option_set>
    -     <event event="0x0" option_set="Slave" title="CCI-400" name="Read: any" description="Read request handshake: any"/>
    -     <event event="0x1" option_set="Slave" title="CCI-400" name="Read: transaction" description="Read request handshake: device transaction"/>
    -     <event event="0x2" option_set="Slave" title="CCI-400" name="Read: normal" description="Read request handshake: normal, non-shareable or system-shareable, but not barrier or cache maintenance operation"/>
    -     <!-- ... -->
    -     <option_set name="Master">
    -       <option event_delta="0xa0" name="M0" description="Master interface 0"/>
    -       <option event_delta="0xc0" name="M1" description="Master interface 1"/>
    -       <option event_delta="0xe0" name="M2" description="Master interface 2"/>
    -       <!-- ... -->
    -     </option_set>
    -     <event event="0x14" option_set="Master" title="CCI-400" name="Retry fetch" description="RETRY of speculative fetch transaction"/>
    -     <event event="0x15" option_set="Master" title="CCI-400" name="Read stall: address hazard" description="Read request stall cycle because of an address hazard"/>
    -     <event event="0x16" option_set="Master" title="CCI-400" name="Read stall: ID hazard" description="Read request stall cycle because of an ID hazard"/>
    -     <!-- ... -->
    -   </category>
    -   <category name="Mali GPU Fragment Processor">
    -     <counter_set name="ARM_Mali-400_FP0_cnt" title="Mali-400 FP0" description="Mali GPU Fragment Processor 0" count="2"/>
    -     <counter_set name="ARM_Mali-400_FP1_cnt" title="Mali-400 FP1" description="Mali GPU Fragment Processor 1" count="2"/>
    -     <counter_set name="ARM_Mali-400_FP2_cnt" title="Mali-400 FP2" description="Mali GPU Fragment Processor 2" count="2"/>
    -     <!-- ... -->
    -     <event event="0x0" title="Mali-400 FP" name="Active clock cycles" description="Active clock cycles, between polygon start and IRQ."/>
    -     <event event="0x2" title="Mali-400 FP" name="Total bus reads" description="Total number of 64-bit words read from the bus."/>
    -     <event event="0x3" title="Mali-400 FP" name="Total bus writes" description="Total number of 64-bit words written to the bus."/>
    -     <!-- ... -->
    -   </category>
    -   <category name="Linux">
    -     <event counter="Linux_irq_softirq" title="Interrupts" name="SoftIRQ" per_cpu="yes" description="Linux SoftIRQ taken"/>
    -     <event counter="Linux_irq_irq" title="Interrupts" name="IRQ" per_cpu="yes" description="Linux IRQ taken"/>
    -     <event counter="Linux_block_rq_wr" title="Disk IO" name="Write" units="B" description="Disk IO Bytes Written"/>
    -     <!-- ... -->
    -   </category>
    -   <category name="hwmon">
    -     <event counter="hwmon_ab8500-isa-0000_0" title="Temperature" name="ext_rtc_xtal" display="average" units="C" modifier="1000" average_selection="yes" description="libsensors Temperature sensor ext_rtc_xtal (hwmon_ab8500-isa-0000_0)"/>
    -     <event counter="hwmon_ab8500-isa-0000_1" title="Temperature" name="ext_db8500" display="average" units="C" modifier="1000" average_selection="yes" description="libsensors Temperature sensor ext_db8500 (hwmon_ab8500-isa-0000_1)"/>
    -     <event counter="hwmon_ab8500-isa-0000_2" title="Temperature" name="bat_temp" display="average" units="C" modifier="1000" average_selection="yes" description="libsensors Temperature sensor bat_temp (hwmon_ab8500-isa-0000_2)"/>
    -     <!-- ... -->
    -   </category>
    - </events> -

    -

    Configuration

    -

    Configuration XML defines the set of counters that are enabled for a capture session. It is sent to the client using the Deliver XML command. Any counters listed in Configuration XML that are not available on the target are ignored.

    -

    configurations

    -

    The configurations root node of Configuration XML can have any number of configuration child nodes and has one attribute:

    - - - - - - - - - - - -
    NameTypeDescription
    revisionInteger2
    -

    configuration

    -

    The configuration node has no children and has the following attributes:

    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    counterStringEvery configuration element must have either the counter or event attribute defined. Use the counter attribute for fixed counter types and the event attribute for all other events. If Events XML did not have a counter for this event, a counter from the related counter_set can be taken. See the description of counter_set in Events XML. This attribute is required.
    eventHex IntegerArchitecture-specific or implementation-specific event number, in hexadecimal, determined from either the architecture specification document or the Technical Reference Manual of the processor. This attribute is required if the element does not have a counter attribute.
    countIntegerTells the client how many samples to collect before triggering the event. This attribute is optional.
    coresIntegerThe same as the cores attribute in the event node of Events XML.
    -

    Configuration XML example:

    -

    - <?xml version="1.0" encoding="US-ASCII"?>
    - <configurations revision="2">
    -   <configuration counter="ARMv7_Cortex_A8_ccnt" event="0xFF"/>
    -   <configuration counter="ARMv7_Cortex_A8_cnt0" event="0x8"/>
    -   <configuration counter="ARMv7_Cortex_A8_cnt1" event="0x44"/>
    -   <configuration counter="ARMv7_Cortex_A8_cnt2" event="0x43"/>
    -   <configuration counter="ARMv7_Cortex_A8_cnt3" event="0x10"/>
    -   <configuration counter="ARMv7_Cortex_A9_ccnt" event="0xFF"/>
    -   <configuration counter="ARMv7_Cortex_A9_cnt0" event="0x68"/>
    -   <configuration counter="ARMv7_Cortex_A9_cnt1" event="0x6"/>
    -   <configuration counter="ARMv7_Cortex_A9_cnt2" event="0x7"/>
    -   <configuration counter="ARMv7_Cortex_A9_cnt3" event="0x3"/>
    -   <configuration counter="ARMv7_Cortex_A9_cnt4" event="0x4"/>
    -   <configuration counter="Linux_block_rq_wr"/>
    -   <configuration counter="Linux_block_rq_rd"/>
    -   <configuration counter="Linux_meminfo_memused"/>
    -   <configuration counter="Linux_meminfo_memfree"/>
    -   <configuration counter="Linux_power_cpu_freq"/>
    -   <configuration counter="cci-400_cnt0" event="0xB4"/>
    -   <configuration counter="cci-400_cnt1" event="0xD4"/>
    -   <configuration counter="cci-400_cnt2" event="0xB5"/>
    -   <configuration counter="hwmon_arm,vexpress-amp-isa-0011_0"/>
    -   <configuration counter="hwmon_arm,vexpress-amp-isa-0010_0"/>
    - </configurations> -

    -

    Counters

    -

    Counters XML lists the counters available on the target.

    -

    counters

    -

    The counters root node of Counters XML can have any number of counter child nodes

    -

    counter

    -

    The counter node has the following attribute

    - - - - - - - - - - - -
    NameTypeDescription
    nameStringAn available counter name from counter_set or the counter attribute of the event node.
    -

    Counters XML Example:

    -

    - <?xml version="1.0" encoding="utf-8"?>
    - <counters>
    -   <counter name="Linux_power_cpu_idle"/>
    -   <counter name="Linux_power_cpu_freq"/>
    -   <counter name="Linux_sched_switch"/>
    -   <counter name="ARMv7_Cortex_A8_cnt3"/>
    -   <counter name="ARMv7_Cortex_A8_cnt2"/>
    -   <counter name="ARMv7_Cortex_A8_cnt1"/>
    -   <counter name="ARMv7_Cortex_A8_cnt0"/>
    -   <counter name="ARMv7_Cortex_A8_ccnt"/>
    -   <counter name="Linux_net_tx"/>
    -   <counter name="Linux_net_rx"/>
    -   <counter name="mmaped_cnt2"/>
    -   <counter name="mmaped_cnt1"/>
    -   <counter name="mmaped_cnt0"/>
    -   <counter name="Linux_meminfo_bufferram"/>
    -   <counter name="Linux_meminfo_memused"/>
    -   <counter name="Linux_meminfo_memfree"/>
    -   <counter name="Linux_irq_softirq"/>
    -   <counter name="Linux_irq_irq"/>
    -   <counter name="Linux_block_rq_rd"/>
    -   <counter name="Linux_block_rq_wr"/>
    - </counters> -

    -

    Session

    -

    Session XML is created by Streamline and delivered to the client. Values in Session XML are based on the settings defined in the Capture & Analysis Options dialog box.

    -

    Note: Session XML must be delivered by Streamline via the Deliver XML command before it is requested by Streamline. Send back the received XML.

    -

    session

    -

    The session root node of Session XML can have any number of image child nodes, zero or one energy_capture child nodes and has the following attributes

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    versionInteger1
    call_stack_unwindingBooleanThe value is yes if the Call Stack Unwinding checkbox is selected, or no if it is not.
    parse_debug_infoBooleanThe value is yes if the Process Debug Information checkbox is selected, no if it is not.
    high_resolutionBooleanThe value is yes if the High Resolution Timeline checkbox is selected, no if it is not.
    buffer_modeStringThe mode chosen using the Buffer Mode drop-down menu. It can set to streaming or one of the following store-and-forward buffers: large - 16MB, medium - 4MB, or small - 1MB.
    sample_rateStringThe sample rate chosen using the Sample Rate drop-down menu. It can be set to one of the following options: normal, low, or none.
    durationIntegerThe maximum duration of the capture session, in seconds.
    target_hostStringThe address of the target.
    target_portIntegerThe target port.
    live_rateIntegerThe value of this attribute dictates how often, in milliseconds, the Name, Counter, Block Counter, Scheduler Trace and Activity Frames should be flushed to Streamline for the Live view.
    -

    image

    -

    There is no restriction to the number of image nodes the session node can have. The image node has no child nodes and the following attributes:

    - - - - - - - - - - - - - - - - -
    NameTypeDescription
    pathStringThis attribute defines the Program Image. This attribute can be used during local capture to copy images into the .apc folder. You can update all Program Images in Streamline post-capture.
    enabledBooleanA yes value means the Program Image is enabled, a no value means it is not. The default value is no.
    -

    energy_capture

    -

    The session node can either have zero or one energy_capture child nodes. The energy_capture node can have zero or more channel child nodes and the following attributes:

    - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    versionInteger1
    command_pathStringThe full path to the caiman executable
    typeStringThe type attribute can have one of three possible values: none, energy_probe or ni-daq. none means no energy data is collected during a capture. energy_probe or ni-daq define the hardware used to capture the energy data from the target.
    -

    channel

    -

    The energy_capture node can any number of channel nodes. The channel node has the following attributes:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    idIntegerThe channel number
    resistanceIntegerThe channel resistance, set using the resistance field.
    powerBooleanTrue if power data is to be collected and displayed
    voltageBooleanSet to yes if the Voltage checkbox has been enabled for this channel.
    currentBooleanSet to yes if the Current checkbox has been enabled for this channel.
    -

    Example:

    -

    - <?xml version="1.0" encoding="US-ASCII"?>
    - <session version="1" call_stack_unwinding="yes" parse_debug_info="yes" high_resolution="no" buffer_mode="streaming" sample_rate="low" duration="0" target_host="10.99.3.109" target_port="8080" live_rate="100">
    -   <image path="H:\ls"/>
    -   <image path="H:\libc.so.6"/>
    -   <energy_capture version="1" command_path="C:\Program Files (x86)\DS-5\bin\caiman.exe" type="none">
    -     <channel id="0" resistance="20" power="yes" voltage="yes" current="yes"/>
    -   </energy_capture>
    - </session> -

    -

    Captured

    -

    Captured XML contains information about a capture session. This is very similar to Configuration XML

    -

    captured

    -

    The captured root node of Captured XML has one target child node, one counters child node, and the following attributes:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    versionInteger1
    live_energy_deltaIntegerThis attribute is added by Streamline
    createdIntegerCapture date in seconds since the epoch (midnight January 1, 1970 UTC). If you are doing a local capture, gator populates this attribute. Otherwise, Streamline adds this attribute.
    protocolInteger20
    backtrace_processingStringThe value of backtrace_processing can be either gator or none. This attribute is optional and the default value is gator. Indicates the type of call stack post-processing to use.
    -

    target

    -

    The captured node always contains one target child node. The target child node has the following attributes:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    nameStringThe name of the target
    sample_rateIntegerNumber of samples collected per second
    coresIntegerNumber of CPU cores on the target
    cpuidHex IntegerThe cpuid of a core. For example, 0xc08
    supports_liveBooleanIndicates if the Name, Counter, Block Counter, Scheduler Trace and Activity Frames are flushed to Streamline for the Live view.
    -

    counters

    -

    The captured node always contains one counters node. The counters node has the following child node:

    -

    counter

    -

    The counters node can contain any number of counter child nodes. The counter child node contains the following attributes:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    keyHex IntegerThe key for this counter in the APC data (where key > 2).
    typeStringThe same as the counter attribute in the configuration node of Configuration XML.
    eventHex IntegerThe same as the event attribute in the configuration node of Configuration XML.
    countIntegerThe count value used during the capture session. Dictated how many samples had to be collected before triggering the event. This can only be set on one counter. This attribute is optional.
    coresIntegerThe same as the cores attribute in the event node of Events XML.
    -

    Example:

    -

    - <?xml version="1.0" encoding="utf-8"?>
    - <captured version="1" created="1361467764" protocol="20">
    -   <target sample_rate="100" cores="5" cpuid="0xc0f"/>
    -   <counters>
    -     <counter key="0x3" type="ARMv7_Cortex_A7_cnt1" event="0x10"/>
    -     <counter key="0x4" type="ARMv7_Cortex_A7_cnt2" event="0x16"/>
    -     <counter key="0x1" type="ARMv7_Cortex_A7_ccnt" event="0xff"/>
    -     <counter key="0x2" type="ARMv7_Cortex_A7_cnt0" event="0x8"/>
    -     <counter key="0x15" type="Linux_power_cpu_freq" event="0x0"/>
    -     <counter key="0x9" type="Linux_block_rq_rd" event="0x0"/>
    -     <counter key="0x8" type="Linux_block_rq_wr" event="0x0"/>
    -     <counter key="0xc" type="Linux_meminfo_memfree" event="0x0"/>
    -     <counter key="0xd" type="Linux_meminfo_memused" event="0x0"/>
    -     <counter key="0x12" type="Linux_net_rx" event="0x0"/>
    -     <counter key="0x13" type="Linux_net_tx" event="0x0"/>
    -   </counters>
    - </captured> -

    -

    APC Frame Format

    -

    Overview

    -

    The XML files and .apc data collected by Streamline are placed in an .apc folder. When Streamline processes this folder, it creates a db folder, followed by a report folder.

    -

    Note: The APC files are ten-digit files with no extension starting with 0000000000.

    -

    When creating a new report from the same .apc folder, Streamline does not regenerate the db folder, even if the .apc data has changed. In other words, the .apc data is ignored if a valid db folder exists. To ensure Streamline generates a new report from the .apc data, delete the db directory. If this folder is missing, Streamline recreates it from the .apc data files.

    -

    Types

    -
    -
    int32
    4-byte signed little endian
    -
    packed32
    variable length packed 4-byte signed value, see Packed Values
    -
    packed64
    variable length packed 8-byte signed value, see Packed Values
    -
    string
    A packed32 length followed by the specified number of characters
    -
    #
    A constant packed32 value of #, ex: 5 is the packed32 number 5
    -
    timestamp
    packed64 monotonic time value in nanoseconds relative to the monotonic delta from the Summary Message
    -
    -

    Packed Values

    -

    To reduce their size, integers are packed. This is done by avoiding the transmission of duplicate high bits. The value is split into 7 bit bytes in little endian order. The most significant bit of the byte is set to 1, if there is a subsequent byte for this value. On the last byte, the most significant bit is set to 0. For positive values, the most significant encoded bit must be 0 and for negative numbers it must be 1. This is very similar to signed LEB128 used in DWARF.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    BitsLast valueByte 1Byte 2Byte 3Byte 4Byte 5
    31-21474836481XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb01111XXXb
    27-1342177281XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
    20-10485761XXXXXXXb1XXXXXXXb01XXXXXXb
    13-81921XXXXXXXb01XXXXXXb
    6-6401XXXXXXb
    66300XXXXXXb
    1381911XXXXXXXb00XXXXXXb
    2010485751XXXXXXXb1XXXXXXXb00XXXXXXb
    271342177271XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
    3121474836471XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb00000XXXb
    -

    For example, 429389 (01101000110101001101b) would be encoded as 0xCD (11001101b) 0x9A (10011010b) 0x1A (00011010b)

    -

    Packed 64 values work in much the same way:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    BitsLast valueByte 1Byte 2Byte 3Byte 4Byte 5Byte 6Byte 7Byte 8Byte 9Byte 10
    63-92233720368547758081XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb0111111Xb
    62-46116860184273879041XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
    55-360287970189639681XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
    48-2814749767106561XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
    41-21990232555521XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
    34-171798691841XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
    27-1342177281XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
    20-10485761XXXXXXXb1XXXXXXXb01XXXXXXb
    13-81921XXXXXXXb01XXXXXXb
    6-6401XXXXXXb
    66300XXXXXXb
    1381911XXXXXXXb00XXXXXXb
    2010485751XXXXXXXb1XXXXXXXb00XXXXXXb
    271342177271XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
    34171798691831XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
    4121990232555511XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
    482814749767106551XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
    55360287970189639671XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
    6246116860184273879031XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
    6392233720368547758071XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb0000000Xb
    -

    For example, -4758616141418899142 would be encoded as 0xBA 0xB2 0xA5 0xA2 0xCE 0xFA 0xFF 0xFA 0xBD 0x7F.

    -

    Frames consist of a header followed by a body of zero or more type specific messages

    -

    Ordering

    -

    The timestamp order of messages is significant and must be in-order on the same core. Timestamps within a frame must also be in order. A specific counter is only be populated in Counter frames or Block Counter frames, not a mix of both.

    -

    Required Messages

    -

    To generate a valid capture at least one Activity, Counter or Block Counter message must be present. All other messages are optional.

    -

    Frame Header

    -

    A length always precedes the frame header either from the Response Header or when the .apc data is written to disk by Streamline during a streaming capture or by gator during a Local Capture.

    - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Codepacked32Indicates the type of this frame. - - - - - - - - - - - - -
    1= Summary
    2= Backtrace
    3= Name
    4= Counter
    5= Block Counter
    6= Annotate
    7= Sched Trace
    9= Idle
    10= External
    11= Proc
    13= Activity Trace
    -
    Corepacked32The processor that originated the messages in the frame. This is only present for Backtrace, Name, Block Counter, Scheduler Trace and Proc Frames other frames can have messages from multiple cores.
    idpacked32Only present for the External Frame, it is used to match data from the same source.
    -

    If there are multiple message types for a frame, each message will start with a unique code

    -

    Summary Frame Messages

    -

    Summary Message

    -

    This message should appear only once and it is recommended that it is the first message in the first frame sent to Streamline so the Newline Canary can be checked for correctness before any other processing occurs.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code1 
    Newline CanarystringAlways "1\n2\r\n3\r4\n\r5"
    Timestamppacked64Current system time in nanoseconds since the epoch (midnight January 1, 1970 UTC) or 0 if the target does not have system time
    Uptimepacked64How long the system has been running in nanoseconds. This is not affected by external influences like changing the system time, ntp, hibernating, etc... Can be used to reference kernel log messages. If the target does not support uptime, send 0 and use a monotonically increasing timer for the timestamp messages.
    Monotonic Deltapacked64The delta applied to the monotonic clock to zero-base the timestamps, may be zero if the platform does not support absolute timestamps.
    Attributes  - Zero or more repetitions of the following: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    KeyStringAttribute key. Must not be empty
    ValueStringAttribute value
    -
    End of AttributesStringAlways the empty string
    -

    CPU Core Name Message

    -

    This is used to identify clusters and in the tooltip in X-Ray mode

    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code3 
    Corepacked32The core which the cpuid and Name describe
    cpuidpacked32cpuid of this core. For example, 0xc08
    NamestringHuman readable name of this core. For example, Cortex-A8
    -

    Summary Table

    -

    This message is used to send arbitrary table information to Streamline

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code2 
    NameStringThe name of this table
    Column Countpacked32Number of columns
    Columns  - Column count repetitions of the following: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    NameStringName of the column
    Typepacked32The type of the column - - - - -
    1= packed64
    2= string
    3= string cell with a link to source code serialized as string, string, packed32 where the first string is the cell text, the second string is the source filename and the packed32 is the line number.
    -
    -
    Row Countpacked32Number of rows
    Rows Row count repetitions of rows as specified by columns. Ex: if Columns is [["IRQ", 2], ["Count", 1]] then each row would be a string and a packed64.
    -

    Backtrace Frame Messages

    -

    This is used to populate the Call Paths tab

    -
      -
    • Exec cookie vs Offset cookie -
      • If a sample occurs in libx.so called by my-app, the exec cookie is my-app and the offset cookie is libx.so
      -
    • -
    -

    Cookies should be positive. The special values 0 indicates kernel or idle, -1 indicate an invalid cookie and 1 is reserved to avoid confusion with End of Message, 1 below.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Timestamptimestamp 
    Exec Cookiepacked32Cookie of the current process
    pidpacked32Process ID. In the Linux kernel, this is the Thread Group ID
    tidpacked32Thread ID. In the Linux kernel, this is the PID
    Body  - One or more repetitions of the following: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Offset Cookiepacked32Executable or library at the offset
    Offsetpacked64Offset in the backtrace
    -
    End of Message1 
    -

    Name Frame Messages

    -

    Cookie Name Message

    -

    This is used to get the name for the Process Handle. Cookies are stored in a pseudo hashmap which limits the number of possible collisions, thus duplicate cookies may be emitted. In addition, cookies are stored per core, thus when a task migrates to a new core, a fresh cookie may be emitted for that core. However cookies are unique across all cores.

    - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code1 
    Cookiepacked32Cookie key
    NamestringCookie value
    -

    IRQ Cookie Name Message

    -

    This is similar to the Cookie Name Message but instead is used used to get the name for an IRQ/Exception.

    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code5 
    Cookiepacked32Cookie key
    NamestringCookie value
    IRQpacked32IRQ/Exception number
    -

    Thread Name Message

    -

    This is used to show thread names in the Thread Disclosure. Thread names are stored in a pseudo hashmap which to limit the number of times the name is sent, but duplicate thread names may be emitted. Thread numbers can be reused as long as the activity thread exit message is sent before it is reused.

    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code2 
    Timestamptimestamp 
    Thread IDpacked32tid of the named thread
    NamestringName of the thread
    -

    Counter Frame Messages

    -

    This is used to populate Charts in the Timeline view

    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Timestamptimestamp 
    Corepacked32Core to which this counter applies
    Keypacked32Key in Captured XML
    Valuepacked64Value of the specified counter
    -

    Block Counter Frame Messages

    -

    Block counters are the same as counters, but used less space when multiple counters are sampled at the same timestamp and on the same core. To start the block, the key of 0 and a timestamp value is emitted. Then any counters sampled at that time are emitted. A block of counters (counters using the same timestamp) must all be emitted in the same frame. This means that the first block counter message emitted in a frame must be the timestamp.

    -

    Before emitting thread specific values, emit key 1 and the pid value. If the pid value is 0 any subsequent values are not associated with any pid. Any following values apply to the specified pid until another pid or timestamp is emitted.

    -

    Before emitting events from a different core, emit key 2 and the core. Any following values apply to the specified pid until another core or timestamp is emitted.

    - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Keypacked320 for timestamp, 1 for pid, 2 for core or key in Captured XML
    Valuepacked64Value of the specified counter
    -

    Annotate Frame Messages

    -

    This form of annotations is deprecated but is still emitted by gator in some cases. New implementations should use annotations in the External Frame

    -

    Annotations are messages sent by arbitrary userspace programs, so their format is different from other messages.

    -

    A single annotation may be broken across frame boundaries. This is why the Annotation Message has a size and the Userspace Annotations either have a size or are '\n' terminated.

    -

    To colorize any ASCII string within the annotation data, prefix the string with 0x1B escape character followed by a 3-byte RGB value

    -

    Annotate Message

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Corepacked32 
    tidpacked32Thread ID (in the Linux kernel this is the PID)
    Timestamptimestamp 
    Sizepacked32Message size
    Body Userspace Annotation data fragment
    -

    Userspace Annotations

    -

    Annotations belong to a channel with 0 being the default channel. Channels belong to groups with 0 as the default group.

    -

    ASCII String Annotation

    -

    This is used to add a line in the Log tab. Can also be sent from the command line. For example, echo 'Hello World' > /dev/gator/annotate

    - - - - - - - - - - - - - - - - -
    NameTypeDescription
    ColorcolorOptional, 0x1B, RR, GG, BB
    ASCII StringZero or more ASCII characters followed by '\n'Text annotation
    -

    Create Group Annotation

    -

    This is used to name a group in the Thread Disclosure

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Escape Code0x1C 
    Marker Code0x8 
    GroupLittle Endian int32 
    String LengthLittle Endian int16 
    UTF-8 StringString Length UTF-8 bytesGroup name
    -

    Create Channel Annotation

    -

    This is used to name a channel in the Thread Disclosure

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Escape Code0x1C 
    Marker Code0x7 
    ChannelLittle Endian int32 
    GroupLittle Endian int32Group the channel belongs to
    String LengthLittle Endian int16 
    UTF-8 StringString Length UTF-8 bytesChannel name
    -

    UTF-8 String Annotations

    -

    This is used to add a line in the Log tab.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Escape Code0x1C 
    Marker Code0x6 
    ChannelLittle Endian int32Channel the annotation belongs to
    String LengthLittle Endian int16 
    ColorcolorOptional, 0x1B, RR, GG, BB, counts against String Length
    UTF-8 StringString Length UTF-8 bytesText annotation
    -

    Visual Annotation

    -

    This is used to add a line in the Log tab and an image to the Visual Annotation Chart.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Escape Code0x1C 
    Visual Code0x4 
    String LengthLittle Endian int16 
    UTF-8 StringString Length UTF-8 bytesText annotation
    Image LengthLittle Endian int32 
    Image DataImage Length bytes 
    -

    Marker Annotation

    -

    This is used to add a Bookmark

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Escape Code0x1C 
    Marker Code0x5 
    String LengthLittle Endian int16 
    ColorcolorOptional, 0x1B, RR, GG, BB, counts against String Length
    UTF-8 StringString Length UTF-8 bytesText annotation
    -

    Scheduler Trace Frame Messages

    -

    Sched Switch

    -

    This is used to populate the CPU Activity Chart and the Heat Map

    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code1 
    Timestamptimestamp 
    tidpacked32Thread ID (in the Linux kernel this is the PID)
    Statepacked32State - - - - -
    0= Waiting on other event besides I/O
    1= Contention/pre-emption
    2= Waiting on I/O
    -
    -

    Sched Thread Exit

    -

    This is used by the Heat Map to identify when a thread terminates

    - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code2 
    Timestamptimestamp 
    tidpacked32Thread ID (in the Linux kernel this is the PID)
    -

    Activity Frame Messages

    -

    With Activity messages something is always running, though that something can be idle.

    -

    Link Message

    -

    This is used to link a cookie, pid and tid. This message must have a timestamp corresponding to before or shortly after the first time a task runs.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code1 
    Timestamptimestamp 
    Cookiepacked32Cookie of the current process
    pidpacked32Process ID (in the Linux kernel this is the Thread Group ID)
    tidpacked32Thread ID (in the Linux kernel this is the PID)
    -

    Activity Switch

    -

    Causes the task specified by the tid to become active and the previous task on the same core to stop running.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code2 
    Timestamptimestamp 
    Corepacked32Core on which this activity occurred
    Keypacked32key is defined in Captured XML
    Activitypacked32One of the activity types defined in Events XML or zero for idle
    tidpacked32CPU thread ID (in the Linux kernel this is the PID) associated with this activity, use -1 if no tid association is desired
    Wait Statepacked32 - Reason the previously running task stopped - - - - -
    0= Waiting on other (default)
    1= Contention/pre-emption
    2= Waiting on I/O
    -
    -

    Task Exit

    -

    Causes the task specified by the tid to terminate and is only used to differentiate idle from terminated

    - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code3 
    Timestamptimestamp 
    tidpacked32Thread ID (in the Linux kernel this is the PID)
    -

    Idle Frame Messages

    -

    Enter Idle

    -

    This is used to indicate that a core has ceased execution

    - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code1 
    Timestamptimestamp 
    Corepacked32 
    -

    Exit Idle

    -

    This is used to indicate that a core has resumed execution.

    - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code2 
    Timestamptimestamp 
    Corepacked32 
    -

    External Frame Messages

    -

    This frame is used to collect data obtained from external sources like annotations obtained via TCP/IP. The id from the Frame Header is used to identify what messages came from the same source. A single message from an external source may be broken across frame bounderies. This is why the wrapped messages all contain a size.

    -

    Disconnect message

    -

    Use an id of -1 in the header. Indicates that the source has disconnected and the id may be reused in the future.

    - - - - - - - - - - - -
    NameTypeDescription
    idpacked32The id of the disconnected source
    -

    Setup Message

    -

    This is the first message sent by any source and is never sent again; it is used to identify the source

    - - - - - - - - - - - -
    NameTypeDescription
    MagicStringThe magic string specifying the protocol that is to be used with this id (from the frame header).
    -

    Proc Frame Messages

    -

    Comm message

    -

    Sends information about all threads running on the machine on startup so that pids and cookies do not need to be collected on schedule switch

    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    pidpacked32Process ID (in the Linux kernel this is the Thread Group ID)
    tidpacked32Thread ID (in the Linux kernel this is the PID)
    imageStringName of the exectuable (same as the string associated with the exec cookie)
    commStringName of the thread
    -

    Sequence Diagrams

    -

    Configuration

    -

    The diagrams in this topic depict the series of events that are triggered when you click various buttons in the Streamline user interface. Here are the events that occur when the Counter Configuration button is clicked in Streamline where $VER is 20

    -
    -

    This is the sequence of events when you click the Load Defaults in the Counter Configuration dialog box:

    -
    -

    This diagram illustrates the sequence of events that occur when you click either the Cancel or Close button in the Counter Configuration dialog box:

    -
    -

    This is the sequence of events triggered when the Save button is clicked from the Counter Configuration dialog box:

    -
    -

    Note: After you click Save, Cancel or Close, the Counter Configuration dialog box closes.

    -

    Capture

    -

    Here are the events that occur when you click the Start Capture button in Streamline, when the $VER is 20.

    -
    -

    At any point during the capture, Streamline can send a ping to verify that the host is still running. If the ping is not acknowledged, Streamline ends the capture.

    -
    -

    Local Capture

    -

    Streamline also support a local capture mode, a mode in which data is collected without interaction with Streamline. In this case the Target-Host Protocol is omitted. Instead a directory, ending in .apc, is provided to Streamline. This directory contains captured.xml containing the Captured XML, session.xml containing the Session XML, events.xml containing the Events XML and 0000000000 which contains the APC Data with one or more structures of the following format:

    - - - - - - - - - - - - - - - - -
    NameTypeDescription
    LengthLittle Endian int32Number of bytes in the body
    bodyAPC Data 
    -
    - - diff --git a/protocol/gator/gator_protocol-5-21.html b/protocol/gator/gator_protocol-5-21.html deleted file mode 100644 index 81635840..00000000 --- a/protocol/gator/gator_protocol-5-21.html +++ /dev/null @@ -1,2215 +0,0 @@ - - - - - - - Gator v21 (DS-5 v5.21) Protocol - - -
    -

    Gator v21 (DS-5 v5.21) Protocol

    -

    Index

    - -

    Introduction

    -

    This document describes the TCP/IP protocol used by gator or other implementing clients to communicate with Streamline version 5.21 or later. Use this information to build a customized client to communicate profiling data to Streamline. The gator source code, distributed as part of DS-5, is the reference implementation of this protocol. The protocol may change with future releases of Streamline, but Streamline will maintain backwards compatibility with this version of the protocol so that clients need only implement one version of the protocol. Streamline requires that your client is able to parse and generate simple XML and ignore additional or unexpected nodes or attributes. Because the XML features described in this protocol documentation are the only ones used, this protocol does not require the more complex features of XML.

    -

    Changes in v21 (DS-5 v5.21)

    -

    gator v21, the version of gator shipped with Streamline version 5.21, has a few important updates that you should familiarize yourself with before implementing or updating your own customized Streamline TCP/IP protocol

    -
      -
    • The attribute 'modifier' is replaced with the attribute 'multiplier' in the event tag of events.xml
    • -
    • A new counter class type 'incident' which is the same as the 'delta' class except it does not do interpolation of the data, in other words, the time is known when the data occurs
    • -
    • Change the Idle message so -1 signals an exit from wfi and anything >= 0 signals entry into a wfi state
    • -
    -

    Additional Reading

    -

    This spec references Streamline related concepts and terminology. Please see "Using ARM Streamline" for this version of DS-5 in the ARM infocenter, particularly the Glossary

    -

    Target-Host Protocol

    -

    Connection

    -

    Streamline connects to the user agent on the target via TCP/IP. In Streamline, the user can specify the address and optionally the port to use, port 8080 is the default port.

    -

    Magic Exchange

    -

    A handshake is required so that your client and Streamline can recognize each other. It consists of ASCII newline (\n) delimited strings. If the client receives a string it does not recognize, the string must be discarded and another string is read.

    -

    The standard Streamline client is gator. But, as you can customize gator and call it what you wish, the term client is used generically to refer to your customized protocol.

    -
      -
    1. The client receives Streamline's highest supported protocol version VERSION $VER\n, for example if Streamline supports up to version 23, the client would receive VERSION 23\n.
    2. -
    3. The client receives STREAMLINE\n
    4. -
    5. Send GATOR 21\n
    6. -
    -

    Further communication from Streamline comes as Commands

    -

    Command Header

    -

    Streamline issues commands that consist of a header and a body. Streamline expects a Response to these commands from the client.

    - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Codeint8The type of command - - - - - - - -
    0= Request XML
    1= Deliver XML
    2= APC Start
    3= APC Stop
    4= Disconnect
    5= Ping
    -
    LengthLittle Endian int32Number of bytes in the body
    -

    If the client receives an unrecognized command, it should respond with a NAK.

    -

    Request XML Body

    -

    Command code 0 is a request from Streamline for XML. The root node is request and it has the type attribute that tells the client which XML is required. For example, this is a request for Events XML

    -

    - <?xml version="1.0" encoding="US-ASCII"?>
    - <request type="events">
    - </request> -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    RequestResponse CodeResponse Body
    <request type="events">XMLEvents XML
    <request type="configuration">XMLConfiguration XML
    <request type="counters">XMLCounters XML
    <request type="captured">XMLCaptured XML Streamline requests Captured XML prior to starting a capture.
    <request type="defaults">XMLdefault Configuration XML
    -

    Deliver XML Body

    -

    The Deliver XML command sends XML to the client:

    - - - - - - - - - - - - - -
    RequestResponse Code
    Session XMLACK
    Configuration XMLACK
    -

    APC Start Body

    -

    The APC Start command does not have a body. This command initiates a capture and readies Streamline to receive APC Data Responses. No ACK is expected and no further XML exchange takes place. If a failure occurs, the client should send an Error.

    -

    APC Stop Body

    -

    The APC Stop command also does not have a body. This command triggers the end of the APC and no ACK is expected. APC Data Responses can continue to arrive until all captured data is sent, then the connection should be closed. If a failure occurs, the client should send an Error.

    -

    Disconnect Body

    -

    The Disconnect command, which closes the connection to the target, does not contain a command body. No ACK is expected.

    -

    Ping Body

    -

    The Ping command does not have a body. Send an ACK response to this command.

    -

    Response Format

    -

    Responses consist of a header followed by a body

    -

    Response Header

    -

    The format for the response header is identical to that of the Command Header but the Codes are different

    - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Codeint8The type of command - - - - - - -
    1= XML
    3= APC Data
    4= ACK
    5= NAK
    0xFF= Error
    -
    LengthLittle Endian int32Number of bytes in the body
    -

    XML Body

    -

    The body should contain XML, the format of which is dependent on the Request type. For a list of types, see Request XML Body

    -

    APC Data Body

    -

    The APC body should contain an APC Frame. If the length is zero, it is the End of Sequence message which indicates that all APC Frames have been transmitted to Streamline.

    -

    ACK Body

    -

    This response, which indicates the Command was successful, does not have a response body.

    -

    NAK Body

    -

    Indicates a synchronous non-fatal error occurred when handling a request. It can contain a UTF-8 error message. The length is specified in the header, so no NULL character is expected. Indicates that the Command failed, but that the connection can continue.

    -

    Error Body

    -

    Indicates a synchronous fatal error occurred when responding to a request. A UTF-8 error message. The length is specified in the header, so no NULL character is expected. Use this response when the error is terminal and the connection must be closed. Errors may be sent without a request, but Streamline may not process them immediately.

    -

    XML

    -

    Events

    -

    The Events XML defines the list of counters that you can choose from in the Counter Configuration dialog box. Modify this list to create your own custom counters.

    -

    events

    -

    The events root node of Events XML can have any number of counter_set and category child nodes.

    -

    counter_set

    -

    The counter_set node has no children and the following attributes. Counter sets are used when the number of counters that can be enabled in a category is restricted. Streamline will respect the restriction and assign a name from the set to a counter in Configuration XML.

    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    nameStringName of the counter_set
    countStringNumber of counters in the set. Counter names are derived by appending a number, starting at zero, to the set name. Ex, if the set name is ARMv7_Cortex_A8_cnt and the count is 4, then the counter names in the set are ARMv7_Cortex_A8_cnt0, ARMv7_Cortex_A8_cnt1, ARMv7_Cortex_A8_cnt2 and ARMv7_Cortex_A8_cnt3
    titleStringAppended to the title of the event when counter_set is a child of category, shown in Streamline before the name. Used to group counters.
    descriptionStringThe value of this attribute is appended to the description to show in Streamline when counter_set is a child of category. Used as the tooltip for the counter
    -

    category

    -

    The category node can have any number of event and option_set child nodes. It can also have one or more counter_set child nodes instead of the counter_set attribute if the same set of child event nodes are valid for multiple counter sets. The category node can have the following attributes:

    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    nameStringThe name of the category. The value given here appears as the category name in the Counter Configuration dialog box in Streamline.
    counter_setStringDefines the counter_set to be used. You must use this attribute if any child event uses the event attribute and there are no child counter_set nodes present.
    per_cpuBooleanDefines whether or not Streamline collects data on a per cpu basis. Set this value to yes and Streamline collects data from each cpu separately for these counters. The default value is no.
    supports_event_based_samplingBooleanUse yes or no to define whether or not the counters in this category can be used for event-based sampling. The default value is no.
    -

    option_set

    -

    The category node has one or more option_set child nodes and the following attributes. Use this node when the same event applies to multiple devices. It has the following attributes:

    - - - - - - - - - - - -
    NameTypeDescription
    nameStringThe name of this option_set
    -

    option

    -

    The option_set node contains one or more option child nodes. The option node has no children and the following attributes

    - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    event_deltaHex IntegerThe offset to add to the applicable event to get the event number.
    nameStringThe name of the device. The value of name is appended to the event name.
    descriptionStringA description of the device option. This description is appended to the event description.
    -

    event

    -

    The event node has no children and the following attributes

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    counterStringEvery event element must have either the counter or event attribute defined. Use the counter attribute for fixed counter types, like cycle count. Use the event attribute for all other events. The counter attribute is the name of the counter.
    eventHex Integer Architecture specific or implementation-specific event number, in hexadecimal, determined from either the architecture specification document or the Technical Reference Manual of the processor. This attribute is required if the element does not have a counter attribute.
    option_setStringThe name of the option_set to use.
    titleStringTitle of the event, shown in Streamline before the name. Use this attribute to group counters.
    nameStringName of the event, shown in Streamline after the title.
    per_cpuBooleanDefines whether or not Streamline collects data on a per cpu basis. Set this value to yes and Streamline collects data from each cpu separately for this event. The default is the value of the per_cpu attribute of the category node.
    supports_event_based_samplingBooleanUse yes or no to define whether or not the event can be used for event-based sampling. This value defaults to the category value if the attribute is not present in the event.
    classStringUse one of the following values with the class attribute: delta, incident, absolute, activity. 'delta' is used for values that increment or are accumulated over time such as hardware performance counters but the exact time when the data occurs is unknown and therefore the data is interpolated between timestamps. 'incident' is the same as 'delta' except the exact time is known so no interpolation is calculated and is used for counters such as software trace. 'absolute' is used for singular or impulse values such as system memory used. 'activity' is used in conjunction with scheduler trace data such as CPU activity. The default value is delta. This attribute is optional.
    displayStringUse one of the following values with the display attribute: accumulate, hertz, maximum, average, minimum. The display value determines how to calculate the data when zooming out. 'accumulate' will sum up the data. 'hertz' will do the same as 'accumulate' then normalize the value to one second. 'maximum'/'minimum' will display the largest or smallest value encountered, and 'average' will display the average. Only 'accumulate' and 'hertz' are valid for delta and incident counters. Only 'maximum', 'minimum', and 'average' are valid for absolute counters. Only 'average' is valid for activity counters. The default value is 'accumulate' for delta counters, 'maximum' for absolute counters, and 'average' for activity counters. This attribute is optional.
    unitsStringDefines the unit type to display in Streamline. This attribute is optional.
    multiplierDoubleNumber to multiply by for fixed point math. The value 1.23 can be represented by the value 123 with a multiplier of 0.01. This attribute is optional.
    derivedBooleanDefines whether or not the data is derived from the data of another chart. The default value is false.
    series_compositionStringDefines how to arrange the data in the Timeline view. Enter either overlay or stacked as the value for this attribute. The default value is stacked.
    rendering_typeStringThe type of chart to render for the Timeline view in Streamline. This attribute is optional and can be set to either bar or fill. The default value is fill.
    average_selectionBooleanSets whether or not average values are displayed by the Cross Section Marker in Streamline. This attribute is optional.
    average_coresBooleanSet whether or not Streamline averages the values of multiple cores when viewing the aggregate data of a per-cpu chart. This attribute is optional.
    percentageBooleanOptional, Sets whether or not the Timeline view displays data as a percentage of the maximum value in the chart.
    activityXStringOnly valid where class is 'activity'. 'X' starts with 1 and increments by 1 for each subsequent activityX entry. The integer is used in the Activity Messages to define the type of activity. These activity names will override the 'name' attribute.
    activity_colorXIntegerOnly valid when activityX is used where 'X' matches the activity. The integer is of the format 0xZZRRGGBB where ZZ is ignored, RR is an 8-bit red value, GG is an 8-bit green value, and BB is an 8-bit blue value. This attribute is optional.
    coresIntegerOnly valid where class is 'activity'. Number of processing units associated with the activity. Defaults to 1
    colorIntegerThe integer is of the format 0xZZRRGGBB where ZZ is ignored, RR is an 8-bit red value, GG is an 8-bit green value, and BB is an 8-bit blue value. This attribute is optional.
    descriptionStringUse this attribute to define a description to show in Streamline. The value of this attribute is used as the tooltip for the counter.
    -

    Events XML example:

    -

    - <?xml version="1.0" encoding="UTF-8"?>
    - <events>
    -   <counter_set name="ARMv7_Cortex_A8_cnt" count="4"/>
    -   <category name="Cortex-A8" counter_set="ARMv7_Cortex_A8_cnt" per_cpu="yes" supports_event_based_sampling="yes">
    -     <event counter="ARMv7_Cortex_A8_ccnt" event="0xff" title="Clock" name="Cycles" display="hertz" units="Hz" average_selection="yes" average_cores="yes" description="The number of core clock cycles"/>
    -     <event event="0x0" title="Software" name="Increment" description="Incremented only on writes to the Software Increment Register"/>
    -     <event event="0x1" title="Cache" name="Instruction refill" description="Instruction fetch that causes a refill of at least the level of instruction or unified cache closest to the processor"/>
    -     <!-- ... -->
    -   </category>
    -   <category name="CCI-400" counter_set="cci-400_cnt" supports_event_based_sampling="yes">
    -     <event counter="cci-400_ccnt" event="0xff" title="CCI-400" name="Cycles" display="hertz" units="Hz" average_selection="yes" description="The number of core clock cycles"/>
    -     <option_set name="Slave">
    -       <option event_delta="0x0" name="S0" description="Slave interface 0"/>
    -       <option event_delta="0x20" name="S1" description="Slave interface 1"/>
    -       <option event_delta="0x40" name="S2" description="Slave interface 2"/>
    -       <!-- ... -->
    -     </option_set>
    -     <event event="0x0" option_set="Slave" title="CCI-400" name="Read: any" description="Read request handshake: any"/>
    -     <event event="0x1" option_set="Slave" title="CCI-400" name="Read: transaction" description="Read request handshake: device transaction"/>
    -     <event event="0x2" option_set="Slave" title="CCI-400" name="Read: normal" description="Read request handshake: normal, non-shareable or system-shareable, but not barrier or cache maintenance operation"/>
    -     <!-- ... -->
    -     <option_set name="Master">
    -       <option event_delta="0xa0" name="M0" description="Master interface 0"/>
    -       <option event_delta="0xc0" name="M1" description="Master interface 1"/>
    -       <option event_delta="0xe0" name="M2" description="Master interface 2"/>
    -       <!-- ... -->
    -     </option_set>
    -     <event event="0x14" option_set="Master" title="CCI-400" name="Retry fetch" description="RETRY of speculative fetch transaction"/>
    -     <event event="0x15" option_set="Master" title="CCI-400" name="Read stall: address hazard" description="Read request stall cycle because of an address hazard"/>
    -     <event event="0x16" option_set="Master" title="CCI-400" name="Read stall: ID hazard" description="Read request stall cycle because of an ID hazard"/>
    -     <!-- ... -->
    -   </category>
    -   <category name="Mali GPU Fragment Processor">
    -     <counter_set name="ARM_Mali-400_FP0_cnt" title="Mali-400 FP0" description="Mali GPU Fragment Processor 0" count="2"/>
    -     <counter_set name="ARM_Mali-400_FP1_cnt" title="Mali-400 FP1" description="Mali GPU Fragment Processor 1" count="2"/>
    -     <counter_set name="ARM_Mali-400_FP2_cnt" title="Mali-400 FP2" description="Mali GPU Fragment Processor 2" count="2"/>
    -     <!-- ... -->
    -     <event event="0x0" title="Mali-400 FP" name="Active clock cycles" description="Active clock cycles, between polygon start and IRQ."/>
    -     <event event="0x2" title="Mali-400 FP" name="Total bus reads" description="Total number of 64-bit words read from the bus."/>
    -     <event event="0x3" title="Mali-400 FP" name="Total bus writes" description="Total number of 64-bit words written to the bus."/>
    -     <!-- ... -->
    -   </category>
    -   <category name="Linux">
    -     <event counter="Linux_irq_softirq" title="Interrupts" name="SoftIRQ" per_cpu="yes" description="Linux SoftIRQ taken"/>
    -     <event counter="Linux_irq_irq" title="Interrupts" name="IRQ" per_cpu="yes" description="Linux IRQ taken"/>
    -     <event counter="Linux_block_rq_wr" title="Disk IO" name="Write" units="B" description="Disk IO Bytes Written"/>
    -     <!-- ... -->
    -   </category>
    -   <category name="hwmon">
    -     <event counter="hwmon_ab8500-isa-0000_0" title="Temperature" name="ext_rtc_xtal" display="average" units="C" multiplier="0.001" average_selection="yes" description="libsensors Temperature sensor ext_rtc_xtal (hwmon_ab8500-isa-0000_0)"/>
    -     <event counter="hwmon_ab8500-isa-0000_1" title="Temperature" name="ext_db8500" display="average" units="C" multiplier="0.001" average_selection="yes" description="libsensors Temperature sensor ext_db8500 (hwmon_ab8500-isa-0000_1)"/>
    -     <event counter="hwmon_ab8500-isa-0000_2" title="Temperature" name="bat_temp" display="average" units="C" multiplier="0.001" average_selection="yes" description="libsensors Temperature sensor bat_temp (hwmon_ab8500-isa-0000_2)"/>
    -     <!-- ... -->
    -   </category>
    - </events> -

    -

    Configuration

    -

    Configuration XML defines the set of counters that are enabled for a capture session. It is sent to the client using the Deliver XML command. Any counters listed in Configuration XML that are not available on the target are ignored.

    -

    configurations

    -

    The configurations root node of Configuration XML can have any number of configuration child nodes and has one attribute:

    - - - - - - - - - - - -
    NameTypeDescription
    revisionInteger2
    -

    configuration

    -

    The configuration node has no children and has the following attributes:

    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    counterStringEvery configuration element must have either the counter or event attribute defined. Use the counter attribute for fixed counter types and the event attribute for all other events. If Events XML did not have a counter for this event, a counter from the related counter_set can be taken. See the description of counter_set in Events XML. This attribute is required.
    eventHex IntegerArchitecture-specific or implementation-specific event number, in hexadecimal, determined from either the architecture specification document or the Technical Reference Manual of the processor. This attribute is required if the element does not have a counter attribute.
    countIntegerTells the client how many samples to collect before triggering the event. This attribute is optional.
    coresIntegerThe same as the cores attribute in the event node of Events XML.
    -

    Configuration XML example:

    -

    - <?xml version="1.0" encoding="US-ASCII"?>
    - <configurations revision="2">
    -   <configuration counter="ARMv7_Cortex_A8_ccnt" event="0xFF"/>
    -   <configuration counter="ARMv7_Cortex_A8_cnt0" event="0x8"/>
    -   <configuration counter="ARMv7_Cortex_A8_cnt1" event="0x44"/>
    -   <configuration counter="ARMv7_Cortex_A8_cnt2" event="0x43"/>
    -   <configuration counter="ARMv7_Cortex_A8_cnt3" event="0x10"/>
    -   <configuration counter="ARMv7_Cortex_A9_ccnt" event="0xFF"/>
    -   <configuration counter="ARMv7_Cortex_A9_cnt0" event="0x68"/>
    -   <configuration counter="ARMv7_Cortex_A9_cnt1" event="0x6"/>
    -   <configuration counter="ARMv7_Cortex_A9_cnt2" event="0x7"/>
    -   <configuration counter="ARMv7_Cortex_A9_cnt3" event="0x3"/>
    -   <configuration counter="ARMv7_Cortex_A9_cnt4" event="0x4"/>
    -   <configuration counter="Linux_block_rq_wr"/>
    -   <configuration counter="Linux_block_rq_rd"/>
    -   <configuration counter="Linux_meminfo_memused"/>
    -   <configuration counter="Linux_meminfo_memfree"/>
    -   <configuration counter="Linux_power_cpu_freq"/>
    -   <configuration counter="cci-400_cnt0" event="0xB4"/>
    -   <configuration counter="cci-400_cnt1" event="0xD4"/>
    -   <configuration counter="cci-400_cnt2" event="0xB5"/>
    -   <configuration counter="hwmon_arm,vexpress-amp-isa-0011_0"/>
    -   <configuration counter="hwmon_arm,vexpress-amp-isa-0010_0"/>
    - </configurations> -

    -

    Counters

    -

    Counters XML lists the counters available on the target.

    -

    counters

    -

    The counters root node of Counters XML can have any number of counter child nodes

    -

    counter

    -

    The counter node has the following attribute

    - - - - - - - - - - - -
    NameTypeDescription
    nameStringAn available counter name from counter_set or the counter attribute of the event node.
    -

    Counters XML Example:

    -

    - <?xml version="1.0" encoding="utf-8"?>
    - <counters>
    -   <counter name="Linux_power_cpu_idle"/>
    -   <counter name="Linux_power_cpu_freq"/>
    -   <counter name="Linux_sched_switch"/>
    -   <counter name="ARMv7_Cortex_A8_cnt3"/>
    -   <counter name="ARMv7_Cortex_A8_cnt2"/>
    -   <counter name="ARMv7_Cortex_A8_cnt1"/>
    -   <counter name="ARMv7_Cortex_A8_cnt0"/>
    -   <counter name="ARMv7_Cortex_A8_ccnt"/>
    -   <counter name="Linux_net_tx"/>
    -   <counter name="Linux_net_rx"/>
    -   <counter name="mmaped_cnt2"/>
    -   <counter name="mmaped_cnt1"/>
    -   <counter name="mmaped_cnt0"/>
    -   <counter name="Linux_meminfo_bufferram"/>
    -   <counter name="Linux_meminfo_memused"/>
    -   <counter name="Linux_meminfo_memfree"/>
    -   <counter name="Linux_irq_softirq"/>
    -   <counter name="Linux_irq_irq"/>
    -   <counter name="Linux_block_rq_rd"/>
    -   <counter name="Linux_block_rq_wr"/>
    - </counters> -

    -

    Session

    -

    Session XML is created by Streamline and delivered to the client. Values in Session XML are based on the settings defined in the Capture & Analysis Options dialog box.

    -

    Note: Session XML must be delivered by Streamline via the Deliver XML command before it is requested by Streamline. Send back the received XML.

    -

    session

    -

    The session root node of Session XML can have any number of image child nodes, zero or one energy_capture child nodes and has the following attributes

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    versionInteger1
    call_stack_unwindingBooleanThe value is yes if the Call Stack Unwinding checkbox is selected, or no if it is not.
    parse_debug_infoBooleanThe value is yes if the Process Debug Information checkbox is selected, no if it is not.
    high_resolutionBooleanThe value is yes if the High Resolution Timeline checkbox is selected, no if it is not.
    buffer_modeStringThe mode chosen using the Buffer Mode drop-down menu. It can set to streaming or one of the following store-and-forward buffers: large - 16MB, medium - 4MB, or small - 1MB.
    sample_rateStringThe sample rate chosen using the Sample Rate drop-down menu. It can be set to one of the following options: normal, low, or none.
    durationIntegerThe maximum duration of the capture session, in seconds.
    target_hostStringThe address of the target.
    target_portIntegerThe target port.
    live_rateIntegerThe value of this attribute dictates how often, in milliseconds, the Name, Counter, Block Counter, Scheduler Trace and Activity Frames should be flushed to Streamline for the Live view.
    -

    image

    -

    There is no restriction to the number of image nodes the session node can have. The image node has no child nodes and the following attributes:

    - - - - - - - - - - - - - - - - -
    NameTypeDescription
    pathStringThis attribute defines the Program Image. This attribute can be used during local capture to copy images into the .apc folder. You can update all Program Images in Streamline post-capture.
    enabledBooleanA yes value means the Program Image is enabled, a no value means it is not. The default value is no.
    -

    energy_capture

    -

    The session node can either have zero or one energy_capture child nodes. The energy_capture node can have zero or more channel child nodes and the following attributes:

    - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    versionInteger1
    command_pathStringThe full path to the caiman executable
    typeStringThe type attribute can have one of three possible values: none, energy_probe or ni-daq. none means no energy data is collected during a capture. energy_probe or ni-daq define the hardware used to capture the energy data from the target.
    -

    channel

    -

    The energy_capture node can any number of channel nodes. The channel node has the following attributes:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    idIntegerThe channel number
    resistanceIntegerThe channel resistance, set using the resistance field.
    powerBooleanTrue if power data is to be collected and displayed
    voltageBooleanSet to yes if the Voltage checkbox has been enabled for this channel.
    currentBooleanSet to yes if the Current checkbox has been enabled for this channel.
    -

    Example:

    -

    - <?xml version="1.0" encoding="US-ASCII"?>
    - <session version="1" call_stack_unwinding="yes" parse_debug_info="yes" high_resolution="no" buffer_mode="streaming" sample_rate="low" duration="0" target_host="10.99.3.109" target_port="8080" live_rate="100">
    -   <image path="H:\ls"/>
    -   <image path="H:\libc.so.6"/>
    -   <energy_capture version="1" command_path="C:\Program Files (x86)\DS-5\bin\caiman.exe" type="none">
    -     <channel id="0" resistance="20" power="yes" voltage="yes" current="yes"/>
    -   </energy_capture>
    - </session> -

    -

    Captured

    -

    Captured XML contains information about a capture session. This is very similar to Configuration XML

    -

    captured

    -

    The captured root node of Captured XML has one target child node, one counters child node, and the following attributes:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    versionInteger1
    live_energy_deltaIntegerThis attribute is added by Streamline
    createdIntegerCapture date in seconds since the epoch (midnight January 1, 1970 UTC). If you are doing a local capture, gator populates this attribute. Otherwise, Streamline adds this attribute.
    protocolInteger21
    backtrace_processingStringThe value of backtrace_processing can be either gator or none. This attribute is optional and the default value is gator. Indicates the type of call stack post-processing to use.
    -

    target

    -

    The captured node always contains one target child node. The target child node has the following attributes:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    nameStringThe name of the target
    sample_rateIntegerNumber of samples collected per second
    coresIntegerNumber of CPU cores on the target
    cpuidHex IntegerThe cpuid of a core. For example, 0xc08
    supports_liveBooleanIndicates if the Name, Counter, Block Counter, Scheduler Trace and Activity Frames are flushed to Streamline at the live_rate for the Live view.
    -

    counters

    -

    The captured node always contains one counters node. The counters node has the following child node:

    -

    counter

    -

    The counters node can contain any number of counter child nodes. The counter child node contains the following attributes:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    keyHex IntegerThe key for this counter in the APC data (where key > 2).
    typeStringThe same as the counter attribute in the configuration node of Configuration XML.
    eventHex IntegerThe same as the event attribute in the configuration node of Configuration XML.
    countIntegerThe count value used during the capture session. Dictated how many samples had to be collected before triggering the event. This can only be set on one counter. This attribute is optional.
    coresIntegerThe same as the cores attribute in the event node of Events XML.
    -

    Example:

    -

    - <?xml version="1.0" encoding="utf-8"?>
    - <captured version="1" created="1361467764" protocol="21">
    -   <target sample_rate="100" cores="5" cpuid="0xc0f"/>
    -   <counters>
    -     <counter key="0x3" type="ARMv7_Cortex_A7_cnt1" event="0x10"/>
    -     <counter key="0x4" type="ARMv7_Cortex_A7_cnt2" event="0x16"/>
    -     <counter key="0x1" type="ARMv7_Cortex_A7_ccnt" event="0xff"/>
    -     <counter key="0x2" type="ARMv7_Cortex_A7_cnt0" event="0x8"/>
    -     <counter key="0x15" type="Linux_power_cpu_freq" event="0x0"/>
    -     <counter key="0x9" type="Linux_block_rq_rd" event="0x0"/>
    -     <counter key="0x8" type="Linux_block_rq_wr" event="0x0"/>
    -     <counter key="0xc" type="Linux_meminfo_memfree" event="0x0"/>
    -     <counter key="0xd" type="Linux_meminfo_memused" event="0x0"/>
    -     <counter key="0x12" type="Linux_net_rx" event="0x0"/>
    -     <counter key="0x13" type="Linux_net_tx" event="0x0"/>
    -   </counters>
    - </captured> -

    -

    APC Frame Format

    -

    Overview

    -

    The XML files and .apc data collected by Streamline are placed in an .apc folder. When Streamline processes this folder, it creates a db folder, followed by a report folder.

    -

    Note: The APC files are ten-digit files with no extension starting with 0000000000.

    -

    When creating a new report from the same .apc folder, Streamline does not regenerate the db folder, even if the .apc data has changed. In other words, the .apc data is ignored if a valid db folder exists. To ensure Streamline generates a new report from the .apc data, delete the db directory. If this folder is missing, Streamline recreates it from the .apc data files.

    -

    Types

    -
    -
    int32
    4-byte signed little endian
    -
    packed32
    variable length packed 4-byte signed value, see Packed Values
    -
    packed64
    variable length packed 8-byte signed value, see Packed Values
    -
    string
    A packed32 length followed by the specified number of characters
    -
    #
    A constant packed32 value of #, ex: 5 is the packed32 number 5
    -
    timestamp
    packed64 monotonic time value in nanoseconds relative to the monotonic delta from the Summary Message
    -
    -

    Packed Values

    -

    To reduce their size, integers are packed. This is done by avoiding the transmission of duplicate high bits. The value is split into 7 bit bytes in little endian order. The most significant bit of the byte is set to 1, if there is a subsequent byte for this value. On the last byte, the most significant bit is set to 0. For positive values, the most significant encoded bit must be 0 and for negative numbers it must be 1. This is very similar to signed LEB128 used in DWARF.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    BitsLast valueByte 1Byte 2Byte 3Byte 4Byte 5
    31-21474836481XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb01111XXXb
    27-1342177281XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
    20-10485761XXXXXXXb1XXXXXXXb01XXXXXXb
    13-81921XXXXXXXb01XXXXXXb
    6-6401XXXXXXb
    66300XXXXXXb
    1381911XXXXXXXb00XXXXXXb
    2010485751XXXXXXXb1XXXXXXXb00XXXXXXb
    271342177271XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
    3121474836471XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb00000XXXb
    -

    For example, 429389 (01101000110101001101b) would be encoded as 0xCD (11001101b) 0x9A (10011010b) 0x1A (00011010b)

    -

    Packed 64 values work in much the same way:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    BitsLast valueByte 1Byte 2Byte 3Byte 4Byte 5Byte 6Byte 7Byte 8Byte 9Byte 10
    63-92233720368547758081XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb0111111Xb
    62-46116860184273879041XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
    55-360287970189639681XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
    48-2814749767106561XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
    41-21990232555521XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
    34-171798691841XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
    27-1342177281XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
    20-10485761XXXXXXXb1XXXXXXXb01XXXXXXb
    13-81921XXXXXXXb01XXXXXXb
    6-6401XXXXXXb
    66300XXXXXXb
    1381911XXXXXXXb00XXXXXXb
    2010485751XXXXXXXb1XXXXXXXb00XXXXXXb
    271342177271XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
    34171798691831XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
    4121990232555511XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
    482814749767106551XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
    55360287970189639671XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
    6246116860184273879031XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
    6392233720368547758071XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb0000000Xb
    -

    For example, -4758616141418899142 would be encoded as 0xBA 0xB2 0xA5 0xA2 0xCE 0xFA 0xFF 0xFA 0xBD 0x7F.

    -

    Frames consist of a header followed by a body of zero or more type specific messages

    -

    Ordering

    -

    The timestamp order of messages is significant and must be in-order on the same core. Timestamps within a frame must also be in order. A specific counter is only be populated in Counter frames or Block Counter frames, not a mix of both.

    -

    Required Messages

    -

    To generate a valid capture at least one Activity, Counter or Block Counter message must be present. All other messages are optional.

    -

    If all you want to get is counters only the Counter or Block Counter message needs to be sent.

    -

    Frame Header

    -

    A length always precedes the frame header either from the Response Header or when the .apc data is written to disk by Streamline during a streaming capture or by gator during a Local Capture.

    - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Codepacked32Indicates the type of this frame. - - - - - - - - - - - - -
    1= Summary
    2= Backtrace
    3= Name
    4= Counter
    5= Block Counter
    6= Annotate
    7= Scheduler Trace
    9= Idle
    10= External
    11= Proc
    13= Activity Trace
    -
    Corepacked32The processor that originated the messages in the frame. This is only present for Backtrace, Name, Block Counter, Scheduler Trace and Proc Frames; other frames can have messages from multiple cores.
    -

    If there are multiple message types for a frame, each message will start with a unique code

    -

    Summary Frame Messages

    -

    Summary Message

    -

    This message should appear only once and it is recommended that it is the first message in the first frame sent to Streamline so the Newline Canary can be checked for correctness before any other processing occurs.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code1 
    Newline CanarystringAlways "1\n2\r\n3\r4\n\r5"
    Timestamppacked64Current system time in nanoseconds since the epoch (midnight January 1, 1970 UTC) or 0 if the target does not have system time
    Uptimepacked64How long the system has been running in nanoseconds. This is not affected by external influences like changing the system time, ntp, hibernating, etc... Can be used to reference kernel log messages. If the target does not support uptime, send 0 and use a monotonically increasing timer for the timestamp messages.
    Monotonic Deltapacked64The delta applied to the monotonic clock to zero-base the timestamps, may be zero if the platform does not support absolute timestamps.
    Attributes  - Zero or more repetitions of the following: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    KeyStringAttribute key. Must not be empty
    ValueStringAttribute value
    -
    End of AttributesStringAlways the empty string
    -

    CPU Core Name Message

    -

    This is used to identify clusters and in the tooltip in X-Ray mode

    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code3 
    Corepacked32The core which the cpuid and Name describe
    cpuidpacked32cpuid of this core. For example, 0xc08
    NamestringHuman readable name of this core. For example, Cortex-A8
    -

    Summary Table

    -

    This message is used to send arbitrary table information to Streamline

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code2 
    NameStringThe name of this table
    Column Countpacked32Number of columns
    Columns  - Column count repetitions of the following: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    NameStringName of the column
    Typepacked32The type of the column - - - - -
    1= packed64
    2= string
    3= string cell with a link to source code serialized as string, string, packed32 where the first string is the cell text, the second string is the source filename and the packed32 is the line number.
    -
    -
    Row Countpacked32Number of rows
    Rows Row count repetitions of rows as specified by columns. Ex: if Columns is [["IRQ", 2], ["Count", 1]] then each row would be a string and a packed64.
    -

    Backtrace Frame Messages

    -

    This is used to populate the Call Paths tab

    -
      -
    • Exec cookie vs Offset cookie -
      • If a sample occurs in libx.so called by my-app, the exec cookie is my-app and the offset cookie is libx.so
      -
    • -
    -

    Cookies should be positive. The special values 0 indicates kernel or idle, -1 indicate an invalid cookie and 1 is reserved to avoid confusion with End of Message, 1 below.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Timestamptimestamp 
    Exec Cookiepacked32Cookie of the current process
    pidpacked32Process ID. In the Linux kernel, this is the Thread Group ID
    tidpacked32Thread ID. In the Linux kernel, this is the PID
    Body  - One or more repetitions of the following: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Offset Cookiepacked32Executable or library at the offset
    Offsetpacked64Offset in the backtrace
    -
    End of Message1 
    -

    Name Frame Messages

    -

    Cookie Name Message

    -

    This is used to get the name for the Process Handle. Cookies are stored in a pseudo hashmap which limits the number of possible collisions, thus duplicate cookies may be emitted. In addition, cookies are stored per core, thus when a task migrates to a new core, a fresh cookie may be emitted for that core. However cookies are unique across all cores.

    - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code1 
    Cookiepacked32Cookie key
    NamestringCookie value
    -

    IRQ Cookie Name Message

    -

    This is similar to the Cookie Name Message but instead is used used to get the name for an IRQ/Exception.

    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code5 
    Cookiepacked32Cookie key
    NamestringCookie value
    IRQpacked32IRQ/Exception number
    -

    Thread Name Message

    -

    This is used to show thread names in the Thread Disclosure. Thread names are stored in a pseudo hashmap which to limit the number of times the name is sent, but duplicate thread names may be emitted. Thread numbers can be reused as long as the activity thread exit message is sent before it is reused.

    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code2 
    Timestamptimestamp 
    Thread IDpacked32tid of the named thread
    NamestringName of the thread
    -

    Counter Frame Messages

    -

    This is used to populate Charts in the Timeline view

    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Timestamptimestamp 
    Corepacked32Core to which this counter applies
    Keypacked32Key in Captured XML
    Valuepacked64Value of the specified counter
    -

    Block Counter Frame Messages

    -

    Block counters are the same as counters, but used less space when multiple counters are sampled at the same timestamp and on the same core. To start the block, the key of 0 and a timestamp value is emitted. Then any counters sampled at that time are emitted. A block of counters (counters using the same timestamp) must all be emitted in the same frame. This means that the first block counter message emitted in a frame must be the timestamp.

    -

    Before emitting thread specific values, emit key 1 and the pid value. If the pid value is 0 any subsequent values are not associated with any pid. Any following values apply to the specified pid until another pid or timestamp is emitted.

    -

    Before emitting events from a different core, emit key 2 and the core. Any following values apply to the specified pid until another core or timestamp is emitted.

    - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Keypacked320 for timestamp, 1 for pid, 2 for core or key in Captured XML
    Valuepacked64Value of the specified counter
    -

    Annotate Frame Messages

    -

    This form of annotations is deprecated but is still emitted by gator in some cases. New implementations should use annotations in the External Frame

    -

    Annotations are messages sent by arbitrary userspace programs, so their format is different from other messages.

    -

    A single annotation may be broken across frame boundaries. This is why the Annotation Message has a size and the Userspace Annotations either have a size or are '\n' terminated.

    -

    To colorize any ASCII string within the annotation data, prefix the string with 0x1B escape character followed by a 3-byte RGB value

    -

    Annotate Message

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Corepacked32 
    tidpacked32Thread ID (in the Linux kernel this is the PID)
    Timestamptimestamp 
    Sizepacked32Message size
    Body Userspace Annotation data fragment
    -

    Userspace Annotations

    -

    Annotations belong to a channel with 0 being the default channel. Channels belong to groups with 0 as the default group.

    -

    ASCII String Annotation

    -

    This is used to add a line in the Log tab. Can also be sent from the command line. For example, echo 'Hello World' > /dev/gator/annotate

    - - - - - - - - - - - - - - - - -
    NameTypeDescription
    ColorcolorOptional, 0x1B, RR, GG, BB
    ASCII StringZero or more ASCII characters followed by '\n'Text annotation
    -

    Create Group Annotation

    -

    This is used to name a group in the Thread Disclosure

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Escape Code0x1C 
    Marker Code0x8 
    GroupLittle Endian int32 
    String LengthLittle Endian int16 
    UTF-8 StringString Length UTF-8 bytesGroup name
    -

    Create Channel Annotation

    -

    This is used to name a channel in the Thread Disclosure

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Escape Code0x1C 
    Marker Code0x7 
    ChannelLittle Endian int32 
    GroupLittle Endian int32Group the channel belongs to
    String LengthLittle Endian int16 
    UTF-8 StringString Length UTF-8 bytesChannel name
    -

    UTF-8 String Annotations

    -

    This is used to add a line in the Log tab.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Escape Code0x1C 
    Marker Code0x6 
    ChannelLittle Endian int32Channel the annotation belongs to
    String LengthLittle Endian int16 
    ColorcolorOptional, 0x1B, RR, GG, BB, counts against String Length
    UTF-8 StringString Length UTF-8 bytesText annotation
    -

    Visual Annotation

    -

    This is used to add a line in the Log tab and an image to the Visual Annotation Chart.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Escape Code0x1C 
    Visual Code0x4 
    String LengthLittle Endian int16 
    UTF-8 StringString Length UTF-8 bytesText annotation
    Image LengthLittle Endian int32 
    Image DataImage Length bytes 
    -

    Marker Annotation

    -

    This is used to add a Bookmark

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Escape Code0x1C 
    Marker Code0x5 
    String LengthLittle Endian int16 
    ColorcolorOptional, 0x1B, RR, GG, BB, counts against String Length
    UTF-8 StringString Length UTF-8 bytesText annotation
    -

    Scheduler Trace Frame Messages

    -

    Sched Switch

    -

    This is used to populate the CPU Activity Chart and the Heat Map

    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code1 
    Timestamptimestamp 
    tidpacked32Thread ID (in the Linux kernel this is the PID)
    Statepacked32State - - - - -
    0= Waiting on other event besides I/O
    1= Contention/pre-emption
    2= Waiting on I/O
    -
    -

    Sched Thread Exit

    -

    This is used by the Heat Map to identify when a thread terminates

    - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code2 
    Timestamptimestamp 
    tidpacked32Thread ID (in the Linux kernel this is the PID)
    -

    Activity Frame Messages

    -

    With Activity messages something is always running, though that something can be idle.

    -

    Link Message

    -

    This is used to link a cookie, pid and tid. This message must have a timestamp corresponding to before or shortly after the first time a task runs.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code1 
    Timestamptimestamp 
    Cookiepacked32Cookie of the current process
    pidpacked32Process ID (in the Linux kernel this is the Thread Group ID)
    tidpacked32Thread ID (in the Linux kernel this is the PID)
    -

    Activity Switch

    -

    Causes the task specified by the tid to become active and the previous task on the same core to stop running.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code2 
    Timestamptimestamp 
    Corepacked32Core on which this activity occurred
    Keypacked32key is defined in Captured XML
    Activitypacked32One of the activity types defined in Events XML or zero for idle
    tidpacked32CPU thread ID (in the Linux kernel this is the PID) associated with this activity, use -1 if no tid association is desired
    Wait Statepacked32 - Reason the previously running task stopped - - - - -
    0= Waiting on other (default)
    1= Contention/pre-emption
    2= Waiting on I/O
    -
    -

    Task Exit

    -

    Causes the task specified by the tid to terminate and is only used to differentiate idle from terminated

    - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code3 
    Timestamptimestamp 
    tidpacked32Thread ID (in the Linux kernel this is the PID)
    -

    Idle Frame Messages

    -

    Idle Message

    -

    This is used to indicate the execution state of a core

    - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    statepacked32-1 means the core is no longer in the wfi state and is executing. A value >= 0 means the core is in the wfi state and has ceased execution.
    Timestamptimestamp 
    Corepacked32 
    -

    External Frame Messages

    -

    This frame is used for annotation data collected from external sources obtained via TCP/IP. Details of the external frame messages can be found in one the Annotation External Protocols. A single message from an external source may be broken across frame boundaries, this is why the wrapped messages all contain a size.

    -

    External frame

    -

    Every external frame except a disconnect frame shall begin with an id used to match data to a source

    - - - - - - - - - - - -
    NameTypeDescription
    idpacked32id used to match data from the same source, must be >= 0
    -

    Disconnect frame

    -

    This header indicates that the source has disconnected, no other messages are permitted in this frame

    - - - - - - - - - - - - - - - - -
    NameTypeDescription
    code-1
    idpacked32The id of the disconnected source, the id may now be reused in the future
    -

    Proc Frame Messages

    -

    Comm message

    -

    Sends information about all threads running on the machine on startup so that pids and cookies do not need to be collected on schedule switch

    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    pidpacked32Process ID (in the Linux kernel this is the Thread Group ID)
    tidpacked32Thread ID (in the Linux kernel this is the PID)
    imageStringName of the exectuable (same as the string associated with the exec cookie)
    commStringName of the thread
    -

    Sequence Diagrams

    -

    Configuration

    -

    The diagrams in this topic depict the series of events that are triggered when you click various buttons in the Streamline user interface. Here are the events that occur when the Counter Configuration button is clicked in Streamline where $VER is 21

    -
    -

    This is the sequence of events when you click the Load Defaults in the Counter Configuration dialog box:

    -
    -

    This diagram illustrates the sequence of events that occur when you click either the Cancel or Close button in the Counter Configuration dialog box:

    -
    -

    This is the sequence of events triggered when the Save button is clicked from the Counter Configuration dialog box:

    -
    -

    Note: After you click Save, Cancel or Close, the Counter Configuration dialog box closes.

    -

    Capture

    -

    Here are the events that occur when you click the Start Capture button in Streamline, when the $VER is 21.

    -
    -

    At any point during the capture, Streamline can send a ping to verify that the host is still running. If the ping is not acknowledged, Streamline ends the capture.

    -
    -

    Local Capture

    -

    Streamline also support a local capture mode, a mode in which data is collected without interaction with Streamline. In this case the Target-Host Protocol is omitted. Instead a directory, ending in .apc, is provided to Streamline. This directory contains captured.xml containing the Captured XML, session.xml containing the Session XML, events.xml containing the Events XML and 0000000000 which contains the APC Data with one or more structures of the following format:

    - - - - - - - - - - - - - - - - -
    NameTypeDescription
    LengthLittle Endian int32Number of bytes in the body
    bodyAPC Data 
    -
    - - diff --git a/protocol/gator/gator_protocol-5-22.html b/protocol/gator/gator_protocol-5-22.html deleted file mode 100644 index ca7a020c..00000000 --- a/protocol/gator/gator_protocol-5-22.html +++ /dev/null @@ -1,2185 +0,0 @@ - - - - - - - Gator v22 (DS-5 v5.22) Protocol - - -
    -

    Gator v22 (DS-5 v5.22) Protocol

    -

    Index

    - -

    Introduction

    -

    This document describes the TCP/IP protocol used by gator or other implementing clients to communicate with Streamline version 5.22 or later. Use this information to build a customized client to communicate profiling data to Streamline. The gator source code, distributed as part of DS-5, is the reference implementation of this protocol. The protocol may change with future releases of Streamline, but Streamline will maintain backwards compatibility with this version of the protocol so that clients need only implement one version of the protocol. Streamline requires that your client is able to parse and generate simple XML and ignore additional or unexpected nodes or attributes. Because the XML features described in this protocol documentation are the only ones used, this protocol does not require the more complex features of XML.

    -

    Changes in v22 (DS-5 v5.22)

    -

    gator v22, the version of gator shipped with Streamline version 5.22, has a few important updates that you should familiarize yourself with before implementing or updating your own customized Streamline TCP/IP protocol

    -
      -
    • Documentation fixes with respect to rendering_type and series_composition
    • -
    • Removed the unused IRQ Cookie Name Message from the Name Frame
    • -
    -

    Additional Reading

    -

    This spec references Streamline related concepts and terminology. Please see "Using ARM Streamline" for this version of DS-5 in the ARM infocenter, particularly the Glossary

    -

    Target-Host Protocol

    -

    Connection

    -

    Streamline connects to the user agent on the target via TCP/IP. In Streamline, the user can specify the address and optionally the port to use, port 8080 is the default port.

    -

    Magic Exchange

    -

    A handshake is required so that your client and Streamline can recognize each other. It consists of ASCII newline (\n) delimited strings. If the client receives a string it does not recognize, the string must be discarded and another string is read.

    -

    The standard Streamline client is gator. But, as you can customize gator and call it what you wish, the term client is used generically to refer to your customized protocol.

    -
      -
    1. The client receives Streamline's highest supported protocol version VERSION $VER\n, for example if Streamline supports up to version 23, the client would receive VERSION 23\n.
    2. -
    3. The client receives STREAMLINE\n
    4. -
    5. Send GATOR 22\n
    6. -
    -

    Further communication from Streamline comes as Commands

    -

    Command Header

    -

    Streamline issues commands that consist of a header and a body. Streamline expects a Response to these commands from the client.

    - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Codeint8The type of command - - - - - - - -
    0= Request XML
    1= Deliver XML
    2= APC Start
    3= APC Stop
    4= Disconnect
    5= Ping
    -
    LengthLittle Endian int32Number of bytes in the body
    -

    If the client receives an unrecognized command, it should respond with a NAK.

    -

    Request XML Body

    -

    Command code 0 is a request from Streamline for XML. The root node is request and it has the type attribute that tells the client which XML is required. For example, this is a request for Events XML

    -

    - <?xml version="1.0" encoding="US-ASCII"?>
    - <request type="events">
    - </request> -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    RequestResponse CodeResponse Body
    <request type="events">XMLEvents XML
    <request type="configuration">XMLConfiguration XML
    <request type="counters">XMLCounters XML
    <request type="captured">XMLCaptured XML Streamline requests Captured XML prior to starting a capture.
    <request type="defaults">XMLdefault Configuration XML
    -

    Deliver XML Body

    -

    The Deliver XML command sends XML to the client:

    - - - - - - - - - - - - - -
    RequestResponse Code
    Session XMLACK
    Configuration XMLACK
    -

    APC Start Body

    -

    The APC Start command does not have a body. This command initiates a capture and readies Streamline to receive APC Data Responses. No ACK is expected and no further XML exchange takes place. If a failure occurs, the client should send an Error.

    -

    APC Stop Body

    -

    The APC Stop command also does not have a body. This command triggers the end of the APC and no ACK is expected. APC Data Responses can continue to arrive until all captured data is sent, then the connection should be closed. If a failure occurs, the client should send an Error.

    -

    Disconnect Body

    -

    The Disconnect command, which closes the connection to the target, does not contain a command body. No ACK is expected.

    -

    Ping Body

    -

    The Ping command does not have a body. Send an ACK response to this command.

    -

    Response Format

    -

    Responses consist of a header followed by a body

    -

    Response Header

    -

    The format for the response header is identical to that of the Command Header but the Codes are different

    - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Codeint8The type of command - - - - - - -
    1= XML
    3= APC Data
    4= ACK
    5= NAK
    0xFF= Error
    -
    LengthLittle Endian int32Number of bytes in the body
    -

    XML Body

    -

    The body should contain XML, the format of which is dependent on the Request type. For a list of types, see Request XML Body

    -

    APC Data Body

    -

    The APC body should contain an APC Frame. If the length is zero, it is the End of Sequence message which indicates that all APC Frames have been transmitted to Streamline.

    -

    ACK Body

    -

    This response, which indicates the Command was successful, does not have a response body.

    -

    NAK Body

    -

    Indicates a synchronous non-fatal error occurred when handling a request. It can contain a UTF-8 error message. The length is specified in the header, so no NULL character is expected. Indicates that the Command failed, but that the connection can continue.

    -

    Error Body

    -

    Indicates a synchronous fatal error occurred when responding to a request. A UTF-8 error message. The length is specified in the header, so no NULL character is expected. Use this response when the error is terminal and the connection must be closed. Errors may be sent without a request, but Streamline may not process them immediately.

    -

    XML

    -

    Events

    -

    The Events XML defines the list of counters that you can choose from in the Counter Configuration dialog box. Modify this list to create your own custom counters.

    -

    events

    -

    The events root node of Events XML can have any number of counter_set and category child nodes.

    -

    counter_set

    -

    The counter_set node has no children and the following attributes. Counter sets are used when the number of counters that can be enabled in a category is restricted. Streamline will respect the restriction and assign a name from the set to a counter in Configuration XML.

    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    nameStringName of the counter_set
    countStringNumber of counters in the set. Counter names are derived by appending a number, starting at zero, to the set name. Ex, if the set name is ARMv7_Cortex_A8_cnt and the count is 4, then the counter names in the set are ARMv7_Cortex_A8_cnt0, ARMv7_Cortex_A8_cnt1, ARMv7_Cortex_A8_cnt2 and ARMv7_Cortex_A8_cnt3
    titleStringAppended to the title of the event when counter_set is a child of category, shown in Streamline before the name. Used to group counters.
    descriptionStringThe value of this attribute is appended to the description to show in Streamline when counter_set is a child of category. Used as the tooltip for the counter
    -

    category

    -

    The category node can have any number of event and option_set child nodes. It can also have one or more counter_set child nodes instead of the counter_set attribute if the same set of child event nodes are valid for multiple counter sets. The category node can have the following attributes:

    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    nameStringThe name of the category. The value given here appears as the category name in the Counter Configuration dialog box in Streamline.
    counter_setStringDefines the counter_set to be used. You must use this attribute if any child event uses the event attribute and there are no child counter_set nodes present.
    per_cpuBooleanDefines whether or not Streamline collects data on a per cpu basis. Set this value to yes and Streamline collects data from each cpu separately for these counters. The default value is no.
    supports_event_based_samplingBooleanUse yes or no to define whether or not the counters in this category can be used for event-based sampling. The default value is no.
    -

    option_set

    -

    The category node has one or more option_set child nodes and the following attributes. Use this node when the same event applies to multiple devices. It has the following attributes:

    - - - - - - - - - - - -
    NameTypeDescription
    nameStringThe name of this option_set
    -

    option

    -

    The option_set node contains one or more option child nodes. The option node has no children and the following attributes

    - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    event_deltaHex IntegerThe offset to add to the applicable event to get the event number.
    nameStringThe name of the device. The value of name is appended to the event name.
    descriptionStringA description of the device option. This description is appended to the event description.
    -

    event

    -

    The event node has no children and the following attributes

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    counterStringEvery event element must have either the counter or event attribute defined. Use the counter attribute for fixed counter types, like cycle count. Use the event attribute for all other events. The counter attribute is the name of the counter.
    eventHex Integer Architecture specific or implementation-specific event number, in hexadecimal, determined from either the architecture specification document or the Technical Reference Manual of the processor. This attribute is required if the element does not have a counter attribute.
    option_setStringThe name of the option_set to use.
    titleStringTitle of the event, shown in Streamline before the name. Use this attribute to group counters.
    nameStringName of the event, shown in Streamline after the title.
    per_cpuBooleanDefines whether or not Streamline collects data on a per cpu basis. Set this value to yes and Streamline collects data from each cpu separately for this event. The default is the value of the per_cpu attribute of the category node.
    supports_event_based_samplingBooleanUse yes or no to define whether or not the event can be used for event-based sampling. This value defaults to the category value if the attribute is not present in the event.
    classStringUse one of the following values with the class attribute: delta, incident, absolute, activity. 'delta' is used for values that increment or are accumulated over time such as hardware performance counters but the exact time when the data occurs is unknown and therefore the data is interpolated between timestamps. 'incident' is the same as 'delta' except the exact time is known so no interpolation is calculated and is used for counters such as software trace. 'absolute' is used for singular or impulse values such as system memory used. 'activity' is used in conjunction with scheduler trace data such as CPU activity. The default value is delta. This attribute is optional.
    displayStringUse one of the following values with the display attribute: accumulate, hertz, maximum, average, minimum. The display value determines how to calculate the data when zooming out. 'accumulate' will sum up the data. 'hertz' will do the same as 'accumulate' then normalize the value to one second. 'maximum'/'minimum' will display the largest or smallest value encountered, and 'average' will display the average. Only 'accumulate' and 'hertz' are valid for delta and incident counters. Only 'maximum', 'minimum', and 'average' are valid for absolute counters. Only 'average' is valid for activity counters. The default value is 'accumulate' for delta counters, 'maximum' for absolute counters, and 'average' for activity counters. This attribute is optional.
    unitsStringDefines the unit type to display in Streamline. This attribute is optional.
    multiplierDoubleNumber to multiply by for fixed point math. The value 1.23 can be represented by the value 123 with a multiplier of 0.01. This attribute is optional.
    derivedBooleanDefines whether or not the data is derived from the data of another chart. The default value is false.
    series_compositionStringDefines how to arrange the data in the Timeline view. Enter either stacked, overlay, or log10 as the value for this attribute. The default value is stacked.
    rendering_typeStringThe type of chart to render for the Timeline view in Streamline. This attribute is optional and can be set to either filled, bar, or line. The default value is filled.
    average_selectionBooleanSets whether or not average values are displayed by the Cross Section Marker in Streamline. This attribute is optional.
    average_coresBooleanSet whether or not Streamline averages the values of multiple cores when viewing the aggregate data of a per-cpu chart. This attribute is optional.
    percentageBooleanOptional, Sets whether or not the Timeline view displays data as a percentage of the maximum value in the chart.
    activityXStringOnly valid where class is 'activity'. 'X' starts with 1 and increments by 1 for each subsequent activityX entry. The integer is used in the Activity Messages to define the type of activity. These activity names will override the 'name' attribute.
    activity_colorXIntegerOnly valid when activityX is used where 'X' matches the activity. The integer is of the format 0xZZRRGGBB where ZZ is ignored, RR is an 8-bit red value, GG is an 8-bit green value, and BB is an 8-bit blue value. This attribute is optional.
    coresIntegerOnly valid where class is 'activity'. Number of processing units associated with the activity. Defaults to 1
    colorIntegerThe integer is of the format 0xZZRRGGBB where ZZ is ignored, RR is an 8-bit red value, GG is an 8-bit green value, and BB is an 8-bit blue value. This attribute is optional.
    descriptionStringUse this attribute to define a description to show in Streamline. The value of this attribute is used as the tooltip for the counter.
    -

    Events XML example:

    -

    - <?xml version="1.0" encoding="UTF-8"?>
    - <events>
    -   <counter_set name="ARMv7_Cortex_A8_cnt" count="4"/>
    -   <category name="Cortex-A8" counter_set="ARMv7_Cortex_A8_cnt" per_cpu="yes" supports_event_based_sampling="yes">
    -     <event counter="ARMv7_Cortex_A8_ccnt" event="0xff" title="Clock" name="Cycles" display="hertz" units="Hz" average_selection="yes" average_cores="yes" description="The number of core clock cycles"/>
    -     <event event="0x0" title="Software" name="Increment" description="Incremented only on writes to the Software Increment Register"/>
    -     <event event="0x1" title="Cache" name="Instruction refill" description="Instruction fetch that causes a refill of at least the level of instruction or unified cache closest to the processor"/>
    -     <!-- ... -->
    -   </category>
    -   <category name="CCI-400" counter_set="cci-400_cnt" supports_event_based_sampling="yes">
    -     <event counter="cci-400_ccnt" event="0xff" title="CCI-400" name="Cycles" display="hertz" units="Hz" average_selection="yes" description="The number of core clock cycles"/>
    -     <option_set name="Slave">
    -       <option event_delta="0x0" name="S0" description="Slave interface 0"/>
    -       <option event_delta="0x20" name="S1" description="Slave interface 1"/>
    -       <option event_delta="0x40" name="S2" description="Slave interface 2"/>
    -       <!-- ... -->
    -     </option_set>
    -     <event event="0x0" option_set="Slave" title="CCI-400" name="Read: any" description="Read request handshake: any"/>
    -     <event event="0x1" option_set="Slave" title="CCI-400" name="Read: transaction" description="Read request handshake: device transaction"/>
    -     <event event="0x2" option_set="Slave" title="CCI-400" name="Read: normal" description="Read request handshake: normal, non-shareable or system-shareable, but not barrier or cache maintenance operation"/>
    -     <!-- ... -->
    -     <option_set name="Master">
    -       <option event_delta="0xa0" name="M0" description="Master interface 0"/>
    -       <option event_delta="0xc0" name="M1" description="Master interface 1"/>
    -       <option event_delta="0xe0" name="M2" description="Master interface 2"/>
    -       <!-- ... -->
    -     </option_set>
    -     <event event="0x14" option_set="Master" title="CCI-400" name="Retry fetch" description="RETRY of speculative fetch transaction"/>
    -     <event event="0x15" option_set="Master" title="CCI-400" name="Read stall: address hazard" description="Read request stall cycle because of an address hazard"/>
    -     <event event="0x16" option_set="Master" title="CCI-400" name="Read stall: ID hazard" description="Read request stall cycle because of an ID hazard"/>
    -     <!-- ... -->
    -   </category>
    -   <category name="Mali GPU Fragment Processor">
    -     <counter_set name="ARM_Mali-400_FP0_cnt" title="Mali-400 FP0" description="Mali GPU Fragment Processor 0" count="2"/>
    -     <counter_set name="ARM_Mali-400_FP1_cnt" title="Mali-400 FP1" description="Mali GPU Fragment Processor 1" count="2"/>
    -     <counter_set name="ARM_Mali-400_FP2_cnt" title="Mali-400 FP2" description="Mali GPU Fragment Processor 2" count="2"/>
    -     <!-- ... -->
    -     <event event="0x0" title="Mali-400 FP" name="Active clock cycles" description="Active clock cycles, between polygon start and IRQ."/>
    -     <event event="0x2" title="Mali-400 FP" name="Total bus reads" description="Total number of 64-bit words read from the bus."/>
    -     <event event="0x3" title="Mali-400 FP" name="Total bus writes" description="Total number of 64-bit words written to the bus."/>
    -     <!-- ... -->
    -   </category>
    -   <category name="Linux">
    -     <event counter="Linux_irq_softirq" title="Interrupts" name="SoftIRQ" per_cpu="yes" description="Linux SoftIRQ taken"/>
    -     <event counter="Linux_irq_irq" title="Interrupts" name="IRQ" per_cpu="yes" description="Linux IRQ taken"/>
    -     <event counter="Linux_block_rq_wr" title="Disk IO" name="Write" units="B" description="Disk IO Bytes Written"/>
    -     <!-- ... -->
    -   </category>
    -   <category name="hwmon">
    -     <event counter="hwmon_ab8500-isa-0000_0" title="Temperature" name="ext_rtc_xtal" display="average" units="C" multiplier="0.001" average_selection="yes" description="libsensors Temperature sensor ext_rtc_xtal (hwmon_ab8500-isa-0000_0)"/>
    -     <event counter="hwmon_ab8500-isa-0000_1" title="Temperature" name="ext_db8500" display="average" units="C" multiplier="0.001" average_selection="yes" description="libsensors Temperature sensor ext_db8500 (hwmon_ab8500-isa-0000_1)"/>
    -     <event counter="hwmon_ab8500-isa-0000_2" title="Temperature" name="bat_temp" display="average" units="C" multiplier="0.001" average_selection="yes" description="libsensors Temperature sensor bat_temp (hwmon_ab8500-isa-0000_2)"/>
    -     <!-- ... -->
    -   </category>
    - </events> -

    -

    Configuration

    -

    Configuration XML defines the set of counters that are enabled for a capture session. It is sent to the client using the Deliver XML command. Any counters listed in Configuration XML that are not available on the target are ignored.

    -

    configurations

    -

    The configurations root node of Configuration XML can have any number of configuration child nodes and has one attribute:

    - - - - - - - - - - - -
    NameTypeDescription
    revisionInteger2
    -

    configuration

    -

    The configuration node has no children and has the following attributes:

    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    counterStringEvery configuration element must have either the counter or event attribute defined. Use the counter attribute for fixed counter types and the event attribute for all other events. If Events XML did not have a counter for this event, a counter from the related counter_set can be taken. See the description of counter_set in Events XML. This attribute is required.
    eventHex IntegerArchitecture-specific or implementation-specific event number, in hexadecimal, determined from either the architecture specification document or the Technical Reference Manual of the processor. This attribute is required if the element does not have a counter attribute.
    countIntegerTells the client how many samples to collect before triggering the event. This attribute is optional.
    coresIntegerThe same as the cores attribute in the event node of Events XML.
    -

    Configuration XML example:

    -

    - <?xml version="1.0" encoding="US-ASCII"?>
    - <configurations revision="2">
    -   <configuration counter="ARMv7_Cortex_A8_ccnt" event="0xFF"/>
    -   <configuration counter="ARMv7_Cortex_A8_cnt0" event="0x8"/>
    -   <configuration counter="ARMv7_Cortex_A8_cnt1" event="0x44"/>
    -   <configuration counter="ARMv7_Cortex_A8_cnt2" event="0x43"/>
    -   <configuration counter="ARMv7_Cortex_A8_cnt3" event="0x10"/>
    -   <configuration counter="ARMv7_Cortex_A9_ccnt" event="0xFF"/>
    -   <configuration counter="ARMv7_Cortex_A9_cnt0" event="0x68"/>
    -   <configuration counter="ARMv7_Cortex_A9_cnt1" event="0x6"/>
    -   <configuration counter="ARMv7_Cortex_A9_cnt2" event="0x7"/>
    -   <configuration counter="ARMv7_Cortex_A9_cnt3" event="0x3"/>
    -   <configuration counter="ARMv7_Cortex_A9_cnt4" event="0x4"/>
    -   <configuration counter="Linux_block_rq_wr"/>
    -   <configuration counter="Linux_block_rq_rd"/>
    -   <configuration counter="Linux_meminfo_memused"/>
    -   <configuration counter="Linux_meminfo_memfree"/>
    -   <configuration counter="Linux_power_cpu_freq"/>
    -   <configuration counter="cci-400_cnt0" event="0xB4"/>
    -   <configuration counter="cci-400_cnt1" event="0xD4"/>
    -   <configuration counter="cci-400_cnt2" event="0xB5"/>
    -   <configuration counter="hwmon_arm,vexpress-amp-isa-0011_0"/>
    -   <configuration counter="hwmon_arm,vexpress-amp-isa-0010_0"/>
    - </configurations> -

    -

    Counters

    -

    Counters XML lists the counters available on the target.

    -

    counters

    -

    The counters root node of Counters XML can have any number of counter child nodes

    -

    counter

    -

    The counter node has the following attribute

    - - - - - - - - - - - -
    NameTypeDescription
    nameStringAn available counter name from counter_set or the counter attribute of the event node.
    -

    Counters XML Example:

    -

    - <?xml version="1.0" encoding="utf-8"?>
    - <counters>
    -   <counter name="Linux_power_cpu_idle"/>
    -   <counter name="Linux_power_cpu_freq"/>
    -   <counter name="Linux_sched_switch"/>
    -   <counter name="ARMv7_Cortex_A8_cnt3"/>
    -   <counter name="ARMv7_Cortex_A8_cnt2"/>
    -   <counter name="ARMv7_Cortex_A8_cnt1"/>
    -   <counter name="ARMv7_Cortex_A8_cnt0"/>
    -   <counter name="ARMv7_Cortex_A8_ccnt"/>
    -   <counter name="Linux_net_tx"/>
    -   <counter name="Linux_net_rx"/>
    -   <counter name="mmaped_cnt2"/>
    -   <counter name="mmaped_cnt1"/>
    -   <counter name="mmaped_cnt0"/>
    -   <counter name="Linux_meminfo_bufferram"/>
    -   <counter name="Linux_meminfo_memused"/>
    -   <counter name="Linux_meminfo_memfree"/>
    -   <counter name="Linux_irq_softirq"/>
    -   <counter name="Linux_irq_irq"/>
    -   <counter name="Linux_block_rq_rd"/>
    -   <counter name="Linux_block_rq_wr"/>
    - </counters> -

    -

    Session

    -

    Session XML is created by Streamline and delivered to the client. Values in Session XML are based on the settings defined in the Capture & Analysis Options dialog box.

    -

    Note: Session XML must be delivered by Streamline via the Deliver XML command before it is requested by Streamline. Send back the received XML.

    -

    session

    -

    The session root node of Session XML can have any number of image child nodes, zero or one energy_capture child nodes and has the following attributes

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    versionInteger1
    call_stack_unwindingBooleanThe value is yes if the Call Stack Unwinding checkbox is selected, or no if it is not.
    parse_debug_infoBooleanThe value is yes if the Process Debug Information checkbox is selected, no if it is not.
    high_resolutionBooleanThe value is yes if the High Resolution Timeline checkbox is selected, no if it is not.
    buffer_modeStringThe mode chosen using the Buffer Mode drop-down menu. It can set to streaming or one of the following store-and-forward buffers: large - 16MB, medium - 4MB, or small - 1MB.
    sample_rateStringThe sample rate chosen using the Sample Rate drop-down menu. It can be set to one of the following options: normal, low, or none.
    durationIntegerThe maximum duration of the capture session, in seconds.
    target_hostStringThe address of the target.
    target_portIntegerThe target port.
    live_rateIntegerThe value of this attribute dictates how often, in milliseconds, the Name, Counter, Block Counter, Scheduler Trace and Activity Frames should be flushed to Streamline for the Live view.
    -

    image

    -

    There is no restriction to the number of image nodes the session node can have. The image node has no child nodes and the following attributes:

    - - - - - - - - - - - - - - - - -
    NameTypeDescription
    pathStringThis attribute defines the Program Image. This attribute can be used during local capture to copy images into the .apc folder. You can update all Program Images in Streamline post-capture.
    enabledBooleanA yes value means the Program Image is enabled, a no value means it is not. The default value is no.
    -

    energy_capture

    -

    The session node can either have zero or one energy_capture child nodes. The energy_capture node can have zero or more channel child nodes and the following attributes:

    - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    versionInteger1
    command_pathStringThe full path to the caiman executable
    typeStringThe type attribute can have one of three possible values: none, energy_probe or ni-daq. none means no energy data is collected during a capture. energy_probe or ni-daq define the hardware used to capture the energy data from the target.
    -

    channel

    -

    The energy_capture node can any number of channel nodes. The channel node has the following attributes:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    idIntegerThe channel number
    resistanceIntegerThe channel resistance, set using the resistance field.
    powerBooleanTrue if power data is to be collected and displayed
    voltageBooleanSet to yes if the Voltage checkbox has been enabled for this channel.
    currentBooleanSet to yes if the Current checkbox has been enabled for this channel.
    -

    Example:

    -

    - <?xml version="1.0" encoding="US-ASCII"?>
    - <session version="1" call_stack_unwinding="yes" parse_debug_info="yes" high_resolution="no" buffer_mode="streaming" sample_rate="low" duration="0" target_host="10.99.3.109" target_port="8080" live_rate="100">
    -   <image path="H:\ls"/>
    -   <image path="H:\libc.so.6"/>
    -   <energy_capture version="1" command_path="C:\Program Files (x86)\DS-5\bin\caiman.exe" type="none">
    -     <channel id="0" resistance="20" power="yes" voltage="yes" current="yes"/>
    -   </energy_capture>
    - </session> -

    -

    Captured

    -

    Captured XML contains information about a capture session. This is very similar to Configuration XML

    -

    captured

    -

    The captured root node of Captured XML has one target child node, one counters child node, and the following attributes:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    versionInteger1
    live_energy_deltaIntegerThis attribute is added by Streamline
    createdIntegerCapture date in seconds since the epoch (midnight January 1, 1970 UTC). If you are doing a local capture, gator populates this attribute. Otherwise, Streamline adds this attribute.
    protocolInteger22
    backtrace_processingStringThe value of backtrace_processing can be either gator or none. This attribute is optional and the default value is gator. Indicates the type of call stack post-processing to use.
    -

    target

    -

    The captured node always contains one target child node. The target child node has the following attributes:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    nameStringThe name of the target
    sample_rateIntegerNumber of samples collected per second
    coresIntegerNumber of CPU cores on the target
    cpuidHex IntegerThe cpuid of a core. For example, 0xc08
    supports_liveBooleanIndicates if the Name, Counter, Block Counter, Scheduler Trace and Activity Frames are flushed to Streamline at the live_rate for the Live view.
    -

    counters

    -

    The captured node always contains one counters node. The counters node has the following child node:

    -

    counter

    -

    The counters node can contain any number of counter child nodes. The counter child node contains the following attributes:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    keyHex IntegerThe key for this counter in the APC data (where key > 2).
    typeStringThe same as the counter attribute in the configuration node of Configuration XML.
    eventHex IntegerThe same as the event attribute in the configuration node of Configuration XML.
    countIntegerThe count value used during the capture session. Dictated how many samples had to be collected before triggering the event. This can only be set on one counter. This attribute is optional.
    coresIntegerThe same as the cores attribute in the event node of Events XML.
    -

    Example:

    -

    - <?xml version="1.0" encoding="utf-8"?>
    - <captured version="1" created="1361467764" protocol="22">
    -   <target sample_rate="100" cores="5" cpuid="0xc0f"/>
    -   <counters>
    -     <counter key="0x3" type="ARMv7_Cortex_A7_cnt1" event="0x10"/>
    -     <counter key="0x4" type="ARMv7_Cortex_A7_cnt2" event="0x16"/>
    -     <counter key="0x1" type="ARMv7_Cortex_A7_ccnt" event="0xff"/>
    -     <counter key="0x2" type="ARMv7_Cortex_A7_cnt0" event="0x8"/>
    -     <counter key="0x15" type="Linux_power_cpu_freq" event="0x0"/>
    -     <counter key="0x9" type="Linux_block_rq_rd" event="0x0"/>
    -     <counter key="0x8" type="Linux_block_rq_wr" event="0x0"/>
    -     <counter key="0xc" type="Linux_meminfo_memfree" event="0x0"/>
    -     <counter key="0xd" type="Linux_meminfo_memused" event="0x0"/>
    -     <counter key="0x12" type="Linux_net_rx" event="0x0"/>
    -     <counter key="0x13" type="Linux_net_tx" event="0x0"/>
    -   </counters>
    - </captured> -

    -

    APC Frame Format

    -

    Overview

    -

    The XML files and .apc data collected by Streamline are placed in an .apc folder. When Streamline processes this folder, it creates a db folder, followed by a report folder.

    -

    Note: The APC files are ten-digit files with no extension starting with 0000000000.

    -

    When creating a new report from the same .apc folder, Streamline does not regenerate the db folder, even if the .apc data has changed. In other words, the .apc data is ignored if a valid db folder exists. To ensure Streamline generates a new report from the .apc data, delete the db directory. If this folder is missing, Streamline recreates it from the .apc data files.

    -

    Types

    -
    -
    int32
    4-byte signed little endian
    -
    packed32
    variable length packed 4-byte signed value, see Packed Values
    -
    packed64
    variable length packed 8-byte signed value, see Packed Values
    -
    string
    A packed32 length followed by the specified number of characters
    -
    #
    A constant packed32 value of #, ex: 5 is the packed32 number 5
    -
    timestamp
    packed64 monotonic time value in nanoseconds relative to the monotonic delta from the Summary Message
    -
    -

    Packed Values

    -

    To reduce their size, integers are packed. This is done by avoiding the transmission of duplicate high bits. The value is split into 7 bit bytes in little endian order. The most significant bit of the byte is set to 1, if there is a subsequent byte for this value. On the last byte, the most significant bit is set to 0. For positive values, the most significant encoded bit must be 0 and for negative numbers it must be 1. This is very similar to signed LEB128 used in DWARF.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    BitsLast valueByte 1Byte 2Byte 3Byte 4Byte 5
    31-21474836481XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb01111XXXb
    27-1342177281XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
    20-10485761XXXXXXXb1XXXXXXXb01XXXXXXb
    13-81921XXXXXXXb01XXXXXXb
    6-6401XXXXXXb
    66300XXXXXXb
    1381911XXXXXXXb00XXXXXXb
    2010485751XXXXXXXb1XXXXXXXb00XXXXXXb
    271342177271XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
    3121474836471XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb00000XXXb
    -

    For example, 429389 (01101000110101001101b) would be encoded as 0xCD (11001101b) 0x9A (10011010b) 0x1A (00011010b)

    -

    Packed 64 values work in much the same way:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    BitsLast valueByte 1Byte 2Byte 3Byte 4Byte 5Byte 6Byte 7Byte 8Byte 9Byte 10
    63-92233720368547758081XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb0111111Xb
    62-46116860184273879041XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
    55-360287970189639681XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
    48-2814749767106561XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
    41-21990232555521XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
    34-171798691841XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
    27-1342177281XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
    20-10485761XXXXXXXb1XXXXXXXb01XXXXXXb
    13-81921XXXXXXXb01XXXXXXb
    6-6401XXXXXXb
    66300XXXXXXb
    1381911XXXXXXXb00XXXXXXb
    2010485751XXXXXXXb1XXXXXXXb00XXXXXXb
    271342177271XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
    34171798691831XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
    4121990232555511XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
    482814749767106551XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
    55360287970189639671XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
    6246116860184273879031XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
    6392233720368547758071XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb0000000Xb
    -

    For example, -4758616141418899142 would be encoded as 0xBA 0xB2 0xA5 0xA2 0xCE 0xFA 0xFF 0xFA 0xBD 0x7F.

    -

    Frames consist of a header followed by a body of zero or more type specific messages

    -

    Ordering

    -

    The timestamp order of messages is significant and must be in-order on the same core. Timestamps within a frame must also be in order. A specific counter is only be populated in Counter frames or Block Counter frames, not a mix of both.

    -

    Required Messages

    -

    To generate a valid capture at least one Activity, Counter or Block Counter message must be present. All other messages are optional.

    -

    If all you want to get is counters only the Counter or Block Counter message needs to be sent.

    -

    Frame Header

    -

    A length always precedes the frame header either from the Response Header or when the .apc data is written to disk by Streamline during a streaming capture or by gator during a Local Capture.

    - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Codepacked32Indicates the type of this frame. - - - - - - - - - - - - -
    1= Summary
    2= Backtrace
    3= Name
    4= Counter
    5= Block Counter
    6= Annotate
    7= Scheduler Trace
    9= Idle
    10= External
    11= Proc
    13= Activity Trace
    -
    Corepacked32The processor that originated the messages in the frame. This is only present for Backtrace, Name, Block Counter, Scheduler Trace and Proc Frames; other frames can have messages from multiple cores.
    -

    If there are multiple message types for a frame, each message will start with a unique code

    -

    Summary Frame Messages

    -

    Summary Message

    -

    This message should appear only once and it is recommended that it is the first message in the first frame sent to Streamline so the Newline Canary can be checked for correctness before any other processing occurs.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code1 
    Newline CanarystringAlways "1\n2\r\n3\r4\n\r5"
    Timestamppacked64Current system time in nanoseconds since the epoch (midnight January 1, 1970 UTC) or 0 if the target does not have system time
    Uptimepacked64How long the system has been running in nanoseconds. This is not affected by external influences like changing the system time, ntp, hibernating, etc... Can be used to reference kernel log messages. If the target does not support uptime, send 0 and use a monotonically increasing timer for the timestamp messages.
    Monotonic Deltapacked64The delta applied to the monotonic clock to zero-base the timestamps, may be zero if the platform does not support absolute timestamps.
    Attributes  - Zero or more repetitions of the following: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    KeyStringAttribute key. Must not be empty
    ValueStringAttribute value
    -
    End of AttributesStringAlways the empty string
    -

    CPU Core Name Message

    -

    This is used to identify clusters and in the tooltip in X-Ray mode

    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code3 
    Corepacked32The core which the cpuid and Name describe
    cpuidpacked32cpuid of this core. For example, 0xc08
    NamestringHuman readable name of this core. For example, Cortex-A8
    -

    Summary Table

    -

    This message is used to send arbitrary table information to Streamline

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code2 
    NameStringThe name of this table
    Column Countpacked32Number of columns
    Columns  - Column count repetitions of the following: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    NameStringName of the column
    Typepacked32The type of the column - - - - -
    1= packed64
    2= string
    3= string cell with a link to source code serialized as string, string, packed32 where the first string is the cell text, the second string is the source filename and the packed32 is the line number.
    -
    -
    Row Countpacked32Number of rows
    Rows Row count repetitions of rows as specified by columns. Ex: if Columns is [["IRQ", 2], ["Count", 1]] then each row would be a string and a packed64.
    -

    Backtrace Frame Messages

    -

    This is used to populate the Call Paths tab

    -
      -
    • Exec cookie vs Offset cookie -
      • If a sample occurs in libx.so called by my-app, the exec cookie is my-app and the offset cookie is libx.so
      -
    • -
    -

    Cookies should be positive. The special values 0 indicates kernel or idle, -1 indicate an invalid cookie and 1 is reserved to avoid confusion with End of Message, 1 below.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Timestamptimestamp 
    Exec Cookiepacked32Cookie of the current process
    pidpacked32Process ID. In the Linux kernel, this is the Thread Group ID
    tidpacked32Thread ID. In the Linux kernel, this is the PID
    Body  - One or more repetitions of the following: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Offset Cookiepacked32Executable or library at the offset
    Offsetpacked64Offset in the backtrace
    -
    End of Message1 
    -

    Name Frame Messages

    -

    Cookie Name Message

    -

    This is used to get the name for the Process Handle. Cookies are stored in a pseudo hashmap which limits the number of possible collisions, thus duplicate cookies may be emitted. In addition, cookies are stored per core, thus when a task migrates to a new core, a fresh cookie may be emitted for that core. However cookies are unique across all cores.

    - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code1 
    Cookiepacked32Cookie key
    NamestringCookie value
    -

    Thread Name Message

    -

    This is used to show thread names in the Thread Disclosure. Thread names are stored in a pseudo hashmap which to limit the number of times the name is sent, but duplicate thread names may be emitted. Thread numbers can be reused as long as the activity thread exit message is sent before it is reused.

    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code2 
    Timestamptimestamp 
    Thread IDpacked32tid of the named thread
    NamestringName of the thread
    -

    Counter Frame Messages

    -

    This is used to populate Charts in the Timeline view

    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Timestamptimestamp 
    Corepacked32Core to which this counter applies
    Keypacked32Key in Captured XML
    Valuepacked64Value of the specified counter
    -

    Block Counter Frame Messages

    -

    Block counters are the same as counters, but used less space when multiple counters are sampled at the same timestamp and on the same core. To start the block, the key of 0 and a timestamp value is emitted. Then any counters sampled at that time are emitted. A block of counters (counters using the same timestamp) must all be emitted in the same frame. This means that the first block counter message emitted in a frame must be the timestamp.

    -

    Before emitting thread specific values, emit key 1 and the pid value. If the pid value is 0 any subsequent values are not associated with any pid. Any following values apply to the specified pid until another pid or timestamp is emitted.

    -

    Before emitting events from a different core, emit key 2 and the core. Any following values apply to the specified pid until another core or timestamp is emitted.

    - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Keypacked320 for timestamp, 1 for pid, 2 for core or key in Captured XML
    Valuepacked64Value of the specified counter
    -

    Annotate Frame Messages

    -

    This form of annotations is deprecated but is still emitted by gator in some cases. New implementations should use annotations in the External Frame

    -

    Annotations are messages sent by arbitrary userspace programs, so their format is different from other messages.

    -

    A single annotation may be broken across frame boundaries. This is why the Annotation Message has a size and the Userspace Annotations either have a size or are '\n' terminated.

    -

    To colorize any ASCII string within the annotation data, prefix the string with 0x1B escape character followed by a 3-byte RGB value

    -

    Annotate Message

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Corepacked32 
    tidpacked32Thread ID (in the Linux kernel this is the PID)
    Timestamptimestamp 
    Sizepacked32Message size
    Body Userspace Annotation data fragment
    -

    Userspace Annotations

    -

    Annotations belong to a channel with 0 being the default channel. Channels belong to groups with 0 as the default group.

    -

    ASCII String Annotation

    -

    This is used to add a line in the Log tab. Can also be sent from the command line. For example, echo 'Hello World' > /dev/gator/annotate

    - - - - - - - - - - - - - - - - -
    NameTypeDescription
    ColorcolorOptional, 0x1B, RR, GG, BB
    ASCII StringZero or more ASCII characters followed by '\n'Text annotation
    -

    Create Group Annotation

    -

    This is used to name a group in the Thread Disclosure

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Escape Code0x1C 
    Marker Code0x8 
    GroupLittle Endian int32 
    String LengthLittle Endian int16 
    UTF-8 StringString Length UTF-8 bytesGroup name
    -

    Create Channel Annotation

    -

    This is used to name a channel in the Thread Disclosure

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Escape Code0x1C 
    Marker Code0x7 
    ChannelLittle Endian int32 
    GroupLittle Endian int32Group the channel belongs to
    String LengthLittle Endian int16 
    UTF-8 StringString Length UTF-8 bytesChannel name
    -

    UTF-8 String Annotations

    -

    This is used to add a line in the Log tab.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Escape Code0x1C 
    Marker Code0x6 
    ChannelLittle Endian int32Channel the annotation belongs to
    String LengthLittle Endian int16 
    ColorcolorOptional, 0x1B, RR, GG, BB, counts against String Length
    UTF-8 StringString Length UTF-8 bytesText annotation
    -

    Visual Annotation

    -

    This is used to add a line in the Log tab and an image to the Visual Annotation Chart.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Escape Code0x1C 
    Visual Code0x4 
    String LengthLittle Endian int16 
    UTF-8 StringString Length UTF-8 bytesText annotation
    Image LengthLittle Endian int32 
    Image DataImage Length bytes 
    -

    Marker Annotation

    -

    This is used to add a Bookmark

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Escape Code0x1C 
    Marker Code0x5 
    String LengthLittle Endian int16 
    ColorcolorOptional, 0x1B, RR, GG, BB, counts against String Length
    UTF-8 StringString Length UTF-8 bytesText annotation
    -

    Scheduler Trace Frame Messages

    -

    Sched Switch

    -

    This is used to populate the CPU Activity Chart and the Heat Map

    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code1 
    Timestamptimestamp 
    tidpacked32Thread ID (in the Linux kernel this is the PID)
    Statepacked32State - - - - -
    0= Waiting on other event besides I/O
    1= Contention/pre-emption
    2= Waiting on I/O
    -
    -

    Sched Thread Exit

    -

    This is used by the Heat Map to identify when a thread terminates

    - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code2 
    Timestamptimestamp 
    tidpacked32Thread ID (in the Linux kernel this is the PID)
    -

    Activity Frame Messages

    -

    With Activity messages something is always running, though that something can be idle.

    -

    Link Message

    -

    This is used to link a cookie, pid and tid. This message must have a timestamp corresponding to before or shortly after the first time a task runs.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code1 
    Timestamptimestamp 
    Cookiepacked32Cookie of the current process
    pidpacked32Process ID (in the Linux kernel this is the Thread Group ID)
    tidpacked32Thread ID (in the Linux kernel this is the PID)
    -

    Activity Switch

    -

    Causes the task specified by the tid to become active and the previous task on the same core to stop running.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code2 
    Timestamptimestamp 
    Corepacked32Core on which this activity occurred
    Keypacked32key is defined in Captured XML
    Activitypacked32One of the activity types defined in Events XML or zero for idle
    tidpacked32CPU thread ID (in the Linux kernel this is the PID) associated with this activity, use -1 if no tid association is desired
    Wait Statepacked32 - Reason the previously running task stopped - - - - -
    0= Waiting on other (default)
    1= Contention/pre-emption
    2= Waiting on I/O
    -
    -

    Task Exit

    -

    Causes the task specified by the tid to terminate and is only used to differentiate idle from terminated

    - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code3 
    Timestamptimestamp 
    tidpacked32Thread ID (in the Linux kernel this is the PID)
    -

    Idle Frame Messages

    -

    Idle Message

    -

    This is used to indicate the execution state of a core

    - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    statepacked32-1 means the core is no longer in the wfi state and is executing. A value >= 0 means the core is in the wfi state and has ceased execution.
    Timestamptimestamp 
    Corepacked32 
    -

    External Frame Messages

    -

    This frame is used for annotation data collected from external sources obtained via TCP/IP. Details of the external frame messages can be found in one the Annotation External Protocols. A single message from an external source may be broken across frame boundaries, this is why the wrapped messages all contain a size.

    -

    External frame

    -

    Every external frame except a disconnect frame shall begin with an id used to match data to a source

    - - - - - - - - - - - -
    NameTypeDescription
    idpacked32id used to match data from the same source, must be >= 0
    -

    Disconnect frame

    -

    This header indicates that the source has disconnected, no other messages are permitted in this frame

    - - - - - - - - - - - - - - - - -
    NameTypeDescription
    code-1
    idpacked32The id of the disconnected source, the id may now be reused in the future
    -

    Proc Frame Messages

    -

    Comm message

    -

    Sends information about all threads running on the machine on startup so that pids and cookies do not need to be collected on schedule switch

    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    pidpacked32Process ID (in the Linux kernel this is the Thread Group ID)
    tidpacked32Thread ID (in the Linux kernel this is the PID)
    imageStringName of the exectuable (same as the string associated with the exec cookie)
    commStringName of the thread
    -

    Sequence Diagrams

    -

    Configuration

    -

    The diagrams in this topic depict the series of events that are triggered when you click various buttons in the Streamline user interface. Here are the events that occur when the Counter Configuration button is clicked in Streamline where $VER is 22

    -
    -

    This is the sequence of events when you click the Load Defaults in the Counter Configuration dialog box:

    -
    -

    This diagram illustrates the sequence of events that occur when you click either the Cancel or Close button in the Counter Configuration dialog box:

    -
    -

    This is the sequence of events triggered when the Save button is clicked from the Counter Configuration dialog box:

    -
    -

    Note: After you click Save, Cancel or Close, the Counter Configuration dialog box closes.

    -

    Capture

    -

    Here are the events that occur when you click the Start Capture button in Streamline, when the $VER is 22.

    -
    -

    At any point during the capture, Streamline can send a ping to verify that the host is still running. If the ping is not acknowledged, Streamline ends the capture.

    -
    -

    Local Capture

    -

    Streamline also support a local capture mode, a mode in which data is collected without interaction with Streamline. In this case the Target-Host Protocol is omitted. Instead a directory, ending in .apc, is provided to Streamline. This directory contains captured.xml containing the Captured XML, session.xml containing the Session XML, events.xml containing the Events XML and 0000000000 which contains the APC Data with one or more structures of the following format:

    - - - - - - - - - - - - - - - - -
    NameTypeDescription
    LengthLittle Endian int32Number of bytes in the body
    bodyAPC Data 
    -
    - - diff --git a/protocol/gator/gator_protocol-5-23.html b/protocol/gator/gator_protocol-5-23.html deleted file mode 100644 index 40ac969c..00000000 --- a/protocol/gator/gator_protocol-5-23.html +++ /dev/null @@ -1,2120 +0,0 @@ - - - - - - - Gator v23 (DS-5 v5.23) Protocol - - -
    -

    Gator v23 (DS-5 v5.23) Protocol

    -

    Index

    - -

    Introduction

    -

    This document describes the TCP/IP protocol used by gator or other implementing clients to communicate with Streamline version 5.23 or later. Use this information to build a customized client to communicate profiling data to Streamline. The gator source code, distributed as part of DS-5, is the reference implementation of this protocol. The protocol may change with future releases of Streamline, but Streamline will maintain backwards compatibility with this version of the protocol so that clients need only implement one version of the protocol. Streamline requires that your client is able to parse and generate simple XML and ignore additional or unexpected nodes or attributes. Because the XML features described in this protocol documentation are the only ones used, this protocol does not require the more complex features of XML.

    -

    Changes in v23 (DS-5 v5.23)

    -

    gator v23, the version of gator shipped with Streamline version 5.23, has a few important updates that you should familiarize yourself with before implementing or updating your own customized Streamline TCP/IP protocol

    - -

    Additional Reading

    -

    This spec references Streamline related concepts and terminology. Please see "Using ARM Streamline" for this version of DS-5 in the ARM infocenter, particularly the Glossary

    -

    Target-Host Protocol

    -

    Connection

    -

    Streamline connects to the user agent on the target via TCP/IP. In Streamline, the user can specify the address and optionally the port to use, port 8080 is the default port.

    -

    Magic Exchange

    -

    A handshake is required so that your client and Streamline can recognize each other. It consists of ASCII newline (\n) delimited strings. If the client receives a string it does not recognize, the string must be discarded and another string is read.

    -

    The standard Streamline client is gator. But, as you can customize gator and call it what you wish, the term client is used generically to refer to your customized protocol.

    -
      -
    1. The client receives Streamline's highest supported protocol version VERSION $VER\n, for example if Streamline supports up to version 23, the client would receive VERSION 23\n.
    2. -
    3. The client receives STREAMLINE\n
    4. -
    5. Send GATOR 23\n
    6. -
    -

    Further communication from Streamline comes as Commands

    -

    Command Header

    -

    Streamline issues commands that consist of a header and a body. Streamline expects a Response to these commands from the client.

    - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Codeint8The type of command - - - - - - - -
    0= Request XML
    1= Deliver XML
    2= APC Start
    3= APC Stop
    4= Disconnect
    5= Ping
    -
    LengthLittle Endian int32Number of bytes in the body
    -

    If the client receives an unrecognized command, it should respond with a NAK.

    -

    Request XML Body

    -

    Command code 0 is a request from Streamline for XML. The root node is request and it has the type attribute that tells the client which XML is required. For example, this is a request for Events XML

    -

    - <?xml version="1.0" encoding="US-ASCII"?>
    - <request type="events">
    - </request> -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    RequestResponse CodeResponse Body
    <request type="events">XMLEvents XML
    <request type="configuration">XMLConfiguration XML
    <request type="counters">XMLCounters XML
    <request type="captured">XMLCaptured XML Streamline requests Captured XML prior to starting a capture.
    <request type="defaults">XMLdefault Configuration XML
    -

    Deliver XML Body

    -

    The Deliver XML command sends XML to the client:

    - - - - - - - - - - - - - -
    RequestResponse Code
    Session XMLACK
    Configuration XMLACK
    -

    APC Start Body

    -

    The APC Start command does not have a body. This command initiates a capture and readies Streamline to receive APC Data Responses. No ACK is expected and no further XML exchange takes place. If a failure occurs, the client should send an Error.

    -

    APC Stop Body

    -

    The APC Stop command also does not have a body. This command triggers the end of the APC and no ACK is expected. APC Data Responses can continue to arrive until all captured data is sent, then the connection should be closed. If a failure occurs, the client should send an Error.

    -

    Disconnect Body

    -

    The Disconnect command, which closes the connection to the target, does not contain a command body. No ACK is expected.

    -

    Ping Body

    -

    The Ping command does not have a body. Send an ACK response to this command.

    -

    Response Format

    -

    Responses consist of a header followed by a body

    -

    Response Header

    -

    The format for the response header is identical to that of the Command Header but the Codes are different

    - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Codeint8The type of command - - - - - - -
    1= XML
    3= APC Data
    4= ACK
    5= NAK
    0xFF= Error
    -
    LengthLittle Endian int32Number of bytes in the body
    -

    XML Body

    -

    The body should contain XML, the format of which is dependent on the Request type. For a list of types, see Request XML Body

    -

    APC Data Body

    -

    The APC body should contain an APC Frame. If the length is zero, it is the End of Sequence message which indicates that all APC Frames have been transmitted to Streamline.

    -

    ACK Body

    -

    This response, which indicates the Command was successful, does not have a response body.

    -

    NAK Body

    -

    Indicates a synchronous non-fatal error occurred when handling a request. It can contain a UTF-8 error message. The length is specified in the header, so no NULL character is expected. Indicates that the Command failed, but that the connection can continue.

    -

    Error Body

    -

    Indicates a synchronous fatal error occurred when responding to a request. A UTF-8 error message. The length is specified in the header, so no NULL character is expected. Use this response when the error is terminal and the connection must be closed. Errors may be sent without a request, but Streamline may not process them immediately.

    -

    XML

    -

    Events

    -

    The Events XML defines the list of counters that you can choose from in the Counter Configuration dialog box. Modify this list to create your own custom counters.

    -

    events

    -

    The events root node of Events XML can have any number of counter_set and category child nodes.

    -

    counter_set

    -

    The counter_set node has no children and the following attributes. Counter sets are used when the number of counters that can be enabled in a category is restricted. Streamline will respect the restriction and assign a name from the set to a counter in Configuration XML.

    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    nameStringName of the counter_set
    countStringNumber of counters in the set. Counter names are derived by appending a number, starting at zero, to the set name. Ex, if the set name is ARMv7_Cortex_A8_cnt and the count is 4, then the counter names in the set are ARMv7_Cortex_A8_cnt0, ARMv7_Cortex_A8_cnt1, ARMv7_Cortex_A8_cnt2 and ARMv7_Cortex_A8_cnt3
    titleStringAppended to the title of the event when counter_set is a child of category, shown in Streamline before the name. Used to group counters.
    descriptionStringThe value of this attribute is appended to the description to show in Streamline when counter_set is a child of category. Used as the tooltip for the counter
    -

    category

    -

    The category node can have any number of event and option_set child nodes. It can also have one or more counter_set child nodes instead of the counter_set attribute if the same set of child event nodes are valid for multiple counter sets. The category node can have the following attributes:

    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    nameStringThe name of the category. The value given here appears as the category name in the Counter Configuration dialog box in Streamline.
    counter_setStringDefines the counter_set to be used. You must use this attribute if any child event uses the event attribute and there are no child counter_set nodes present.
    per_cpuBooleanDefines whether or not Streamline collects data on a per cpu basis. Set this value to yes and Streamline collects data from each cpu separately for these counters. The default value is no.
    supports_event_based_samplingBooleanUse yes or no to define whether or not the counters in this category can be used for event-based sampling. The default value is no.
    -

    option_set

    -

    The category node has one or more option_set child nodes and the following attributes. Use this node when the same event applies to multiple devices. It has the following attributes:

    - - - - - - - - - - - -
    NameTypeDescription
    nameStringThe name of this option_set
    -

    option

    -

    The option_set node contains one or more option child nodes. The option node has no children and the following attributes

    - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    event_deltaHex IntegerThe offset to add to the applicable event to get the event number.
    nameStringThe name of the device. The value of name is appended to the event name.
    descriptionStringA description of the device option. This description is appended to the event description.
    -

    event

    -

    The event node has no children and the following attributes

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    counterStringEvery event element must have either the counter or event attribute defined. Use the counter attribute for fixed counter types, like cycle count. Use the event attribute for all other events. The counter attribute is the name of the counter.
    eventHex Integer Architecture specific or implementation-specific event number, in hexadecimal, determined from either the architecture specification document or the Technical Reference Manual of the processor. This attribute is required if the element does not have a counter attribute.
    option_setStringThe name of the option_set to use.
    titleStringTitle of the event, shown in Streamline before the name. Use this attribute to group counters.
    nameStringName of the event, shown in Streamline after the title.
    per_cpuBooleanDefines whether or not Streamline collects data on a per cpu basis. Set this value to yes and Streamline collects data from each cpu separately for this event. The default is the value of the per_cpu attribute of the category node.
    supports_event_based_samplingBooleanUse yes or no to define whether or not the event can be used for event-based sampling. This value defaults to the category value if the attribute is not present in the event.
    classStringUse one of the following values with the class attribute: delta, incident, absolute, activity. 'delta' is used for values that increment or are accumulated over time such as hardware performance counters but the exact time when the data occurs is unknown and therefore the data is interpolated between timestamps. 'incident' is the same as 'delta' except the exact time is known so no interpolation is calculated and is used for counters such as software trace. 'absolute' is used for singular or impulse values such as system memory used. 'activity' is used in conjunction with scheduler trace data such as CPU activity. The default value is delta. This attribute is optional.
    displayStringUse one of the following values with the display attribute: accumulate, hertz, maximum, average, minimum. The display value determines how to calculate the data when zooming out. 'accumulate' will sum up the data. 'hertz' will do the same as 'accumulate' then normalize the value to one second. 'maximum'/'minimum' will display the largest or smallest value encountered, and 'average' will display the average. Only 'accumulate' and 'hertz' are valid for delta and incident counters. Only 'maximum', 'minimum', and 'average' are valid for absolute counters. Only 'average' is valid for activity counters. The default value is 'accumulate' for delta counters, 'maximum' for absolute counters, and 'average' for activity counters. This attribute is optional.
    unitsStringDefines the unit type to display in Streamline. This attribute is optional.
    multiplierDoubleNumber to multiply by for fixed point math. The value 1.23 can be represented by the value 123 with a multiplier of 0.01. This attribute is optional.
    derivedBooleanDefines whether or not the data is derived from the data of another chart. The default value is false.
    series_compositionStringDefines how to arrange the data in the Timeline view. Enter either stacked, overlay, or log10 as the value for this attribute. The default value is stacked.
    rendering_typeStringThe type of chart to render for the Timeline view in Streamline. This attribute is optional and can be set to either filled, bar, or line. The default value is filled.
    average_selectionBooleanSets whether or not average values are displayed by the Cross Section Marker in Streamline. This attribute is optional.
    average_coresBooleanSet whether or not Streamline averages the values of multiple cores when viewing the aggregate data of a per-cpu chart. This attribute is optional.
    percentageBooleanOptional, Sets whether or not the Timeline view displays data as a percentage of the maximum value in the chart.
    activityXStringOnly valid where class is 'activity'. 'X' starts with 1 and increments by 1 for each subsequent activityX entry. The integer is used in the Activity Messages to define the type of activity. These activity names will override the 'name' attribute.
    activity_colorXIntegerOnly valid when activityX is used where 'X' matches the activity. The integer is of the format 0xZZRRGGBB where ZZ is ignored, RR is an 8-bit red value, GG is an 8-bit green value, and BB is an 8-bit blue value. This attribute is optional.
    coresIntegerOnly valid where class is 'activity'. Number of processing units associated with the activity. Defaults to 1
    colorIntegerThe integer is of the format 0xZZRRGGBB where ZZ is ignored, RR is an 8-bit red value, GG is an 8-bit green value, and BB is an 8-bit blue value. This attribute is optional.
    descriptionStringUse this attribute to define a description to show in Streamline. The value of this attribute is used as the tooltip for the counter.
    -

    Events XML example:

    -

    - <?xml version="1.0" encoding="UTF-8"?>
    - <events>
    -   <counter_set name="ARMv7_Cortex_A8_cnt" count="4"/>
    -   <category name="Cortex-A8" counter_set="ARMv7_Cortex_A8_cnt" per_cpu="yes" supports_event_based_sampling="yes">
    -     <event counter="ARMv7_Cortex_A8_ccnt" event="0xff" title="Clock" name="Cycles" display="hertz" units="Hz" average_selection="yes" average_cores="yes" description="The number of core clock cycles"/>
    -     <event event="0x0" title="Software" name="Increment" description="Incremented only on writes to the Software Increment Register"/>
    -     <event event="0x1" title="Cache" name="Instruction refill" description="Instruction fetch that causes a refill of at least the level of instruction or unified cache closest to the processor"/>
    -     <!-- ... -->
    -   </category>
    -   <category name="CCI-400" counter_set="cci-400_cnt" supports_event_based_sampling="yes">
    -     <event counter="cci-400_ccnt" event="0xff" title="CCI-400" name="Cycles" display="hertz" units="Hz" average_selection="yes" description="The number of core clock cycles"/>
    -     <option_set name="Slave">
    -       <option event_delta="0x0" name="S0" description="Slave interface 0"/>
    -       <option event_delta="0x20" name="S1" description="Slave interface 1"/>
    -       <option event_delta="0x40" name="S2" description="Slave interface 2"/>
    -       <!-- ... -->
    -     </option_set>
    -     <event event="0x0" option_set="Slave" title="CCI-400" name="Read: any" description="Read request handshake: any"/>
    -     <event event="0x1" option_set="Slave" title="CCI-400" name="Read: transaction" description="Read request handshake: device transaction"/>
    -     <event event="0x2" option_set="Slave" title="CCI-400" name="Read: normal" description="Read request handshake: normal, non-shareable or system-shareable, but not barrier or cache maintenance operation"/>
    -     <!-- ... -->
    -     <option_set name="Master">
    -       <option event_delta="0xa0" name="M0" description="Master interface 0"/>
    -       <option event_delta="0xc0" name="M1" description="Master interface 1"/>
    -       <option event_delta="0xe0" name="M2" description="Master interface 2"/>
    -       <!-- ... -->
    -     </option_set>
    -     <event event="0x14" option_set="Master" title="CCI-400" name="Retry fetch" description="RETRY of speculative fetch transaction"/>
    -     <event event="0x15" option_set="Master" title="CCI-400" name="Read stall: address hazard" description="Read request stall cycle because of an address hazard"/>
    -     <event event="0x16" option_set="Master" title="CCI-400" name="Read stall: ID hazard" description="Read request stall cycle because of an ID hazard"/>
    -     <!-- ... -->
    -   </category>
    -   <category name="Mali GPU Fragment Processor">
    -     <counter_set name="ARM_Mali-400_FP0_cnt" title="Mali-400 FP0" description="Mali GPU Fragment Processor 0" count="2"/>
    -     <counter_set name="ARM_Mali-400_FP1_cnt" title="Mali-400 FP1" description="Mali GPU Fragment Processor 1" count="2"/>
    -     <counter_set name="ARM_Mali-400_FP2_cnt" title="Mali-400 FP2" description="Mali GPU Fragment Processor 2" count="2"/>
    -     <!-- ... -->
    -     <event event="0x0" title="Mali-400 FP" name="Active clock cycles" description="Active clock cycles, between polygon start and IRQ."/>
    -     <event event="0x2" title="Mali-400 FP" name="Total bus reads" description="Total number of 64-bit words read from the bus."/>
    -     <event event="0x3" title="Mali-400 FP" name="Total bus writes" description="Total number of 64-bit words written to the bus."/>
    -     <!-- ... -->
    -   </category>
    -   <category name="Linux">
    -     <event counter="Linux_irq_softirq" title="Interrupts" name="SoftIRQ" per_cpu="yes" description="Linux SoftIRQ taken"/>
    -     <event counter="Linux_irq_irq" title="Interrupts" name="IRQ" per_cpu="yes" description="Linux IRQ taken"/>
    -     <event counter="Linux_block_rq_wr" title="Disk IO" name="Write" units="B" description="Disk IO Bytes Written"/>
    -     <!-- ... -->
    -   </category>
    -   <category name="hwmon">
    -     <event counter="hwmon_ab8500-isa-0000_0" title="Temperature" name="ext_rtc_xtal" display="average" units="C" multiplier="0.001" average_selection="yes" description="libsensors Temperature sensor ext_rtc_xtal (hwmon_ab8500-isa-0000_0)"/>
    -     <event counter="hwmon_ab8500-isa-0000_1" title="Temperature" name="ext_db8500" display="average" units="C" multiplier="0.001" average_selection="yes" description="libsensors Temperature sensor ext_db8500 (hwmon_ab8500-isa-0000_1)"/>
    -     <event counter="hwmon_ab8500-isa-0000_2" title="Temperature" name="bat_temp" display="average" units="C" multiplier="0.001" average_selection="yes" description="libsensors Temperature sensor bat_temp (hwmon_ab8500-isa-0000_2)"/>
    -     <!-- ... -->
    -   </category>
    - </events> -

    -

    Configuration

    -

    Configuration XML defines the set of counters that are enabled for a capture session. It is sent to the client using the Deliver XML command. Any counters listed in Configuration XML that are not available on the target are ignored.

    -

    configurations

    -

    The configurations root node of Configuration XML can have any number of configuration child nodes and has one attribute:

    - - - - - - - - - - - -
    NameTypeDescription
    revisionInteger2
    -

    configuration

    -

    The configuration node has no children and has the following attributes:

    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    counterStringEvery configuration element must have either the counter or event attribute defined. Use the counter attribute for fixed counter types and the event attribute for all other events. If Events XML did not have a counter for this event, a counter from the related counter_set can be taken. See the description of counter_set in Events XML. This attribute is required.
    eventHex IntegerArchitecture-specific or implementation-specific event number, in hexadecimal, determined from either the architecture specification document or the Technical Reference Manual of the processor. This attribute is required if the element does not have a counter attribute.
    countIntegerTells the client how many samples to collect before triggering the event. This attribute is optional.
    coresIntegerThe same as the cores attribute in the event node of Events XML.
    -

    Configuration XML example:

    -

    - <?xml version="1.0" encoding="US-ASCII"?>
    - <configurations revision="2">
    -   <configuration counter="ARMv7_Cortex_A8_ccnt" event="0xFF"/>
    -   <configuration counter="ARMv7_Cortex_A8_cnt0" event="0x8"/>
    -   <configuration counter="ARMv7_Cortex_A8_cnt1" event="0x44"/>
    -   <configuration counter="ARMv7_Cortex_A8_cnt2" event="0x43"/>
    -   <configuration counter="ARMv7_Cortex_A8_cnt3" event="0x10"/>
    -   <configuration counter="ARMv7_Cortex_A9_ccnt" event="0xFF"/>
    -   <configuration counter="ARMv7_Cortex_A9_cnt0" event="0x68"/>
    -   <configuration counter="ARMv7_Cortex_A9_cnt1" event="0x6"/>
    -   <configuration counter="ARMv7_Cortex_A9_cnt2" event="0x7"/>
    -   <configuration counter="ARMv7_Cortex_A9_cnt3" event="0x3"/>
    -   <configuration counter="ARMv7_Cortex_A9_cnt4" event="0x4"/>
    -   <configuration counter="Linux_block_rq_wr"/>
    -   <configuration counter="Linux_block_rq_rd"/>
    -   <configuration counter="Linux_meminfo_memused"/>
    -   <configuration counter="Linux_meminfo_memfree"/>
    -   <configuration counter="Linux_power_cpu_freq"/>
    -   <configuration counter="cci-400_cnt0" event="0xB4"/>
    -   <configuration counter="cci-400_cnt1" event="0xD4"/>
    -   <configuration counter="cci-400_cnt2" event="0xB5"/>
    -   <configuration counter="hwmon_arm,vexpress-amp-isa-0011_0"/>
    -   <configuration counter="hwmon_arm,vexpress-amp-isa-0010_0"/>
    - </configurations> -

    -

    Counters

    -

    Counters XML lists the counters available on the target.

    -

    counters

    -

    The counters root node of Counters XML can have any number of counter child nodes

    -

    counter

    -

    The counter node has the following attribute

    - - - - - - - - - - - -
    NameTypeDescription
    nameStringAn available counter name from counter_set or the counter attribute of the event node.
    -

    Counters XML Example:

    -

    - <?xml version="1.0" encoding="utf-8"?>
    - <counters>
    -   <counter name="Linux_power_cpu_idle"/>
    -   <counter name="Linux_power_cpu_freq"/>
    -   <counter name="Linux_sched_switch"/>
    -   <counter name="ARMv7_Cortex_A8_cnt3"/>
    -   <counter name="ARMv7_Cortex_A8_cnt2"/>
    -   <counter name="ARMv7_Cortex_A8_cnt1"/>
    -   <counter name="ARMv7_Cortex_A8_cnt0"/>
    -   <counter name="ARMv7_Cortex_A8_ccnt"/>
    -   <counter name="Linux_net_tx"/>
    -   <counter name="Linux_net_rx"/>
    -   <counter name="mmaped_cnt2"/>
    -   <counter name="mmaped_cnt1"/>
    -   <counter name="mmaped_cnt0"/>
    -   <counter name="Linux_meminfo_bufferram"/>
    -   <counter name="Linux_meminfo_memused"/>
    -   <counter name="Linux_meminfo_memfree"/>
    -   <counter name="Linux_irq_softirq"/>
    -   <counter name="Linux_irq_irq"/>
    -   <counter name="Linux_block_rq_rd"/>
    -   <counter name="Linux_block_rq_wr"/>
    - </counters> -

    -

    Session

    -

    Session XML is created by Streamline and delivered to the client. Values in Session XML are based on the settings defined in the Capture & Analysis Options dialog box.

    -

    Note: Session XML must be delivered by Streamline via the Deliver XML command before it is requested by Streamline. Send back the received XML.

    -

    session

    -

    The session root node of Session XML can have any number of image child nodes, zero or one energy_capture child nodes and has the following attributes

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    versionInteger1
    call_stack_unwindingBooleanThe value is yes if the Call Stack Unwinding checkbox is selected, or no if it is not.
    parse_debug_infoBooleanThe value is yes if the Process Debug Information checkbox is selected, no if it is not.
    high_resolutionBooleanThe value is yes if the High Resolution Timeline checkbox is selected, no if it is not.
    buffer_modeStringThe mode chosen using the Buffer Mode drop-down menu. It can set to streaming or one of the following store-and-forward buffers: large - 16MB, medium - 4MB, or small - 1MB.
    sample_rateStringThe sample rate chosen using the Sample Rate drop-down menu. It can be set to one of the following options: normal, low, or none.
    durationIntegerThe maximum duration of the capture session, in seconds.
    target_hostStringThe address of the target.
    target_portIntegerThe target port.
    live_rateIntegerThe value of this attribute dictates how often, in milliseconds, the Name, Counter, Block Counter, Scheduler Trace and Activity Frames should be flushed to Streamline for the Live view.
    -

    image

    -

    There is no restriction to the number of image nodes the session node can have. The image node has no child nodes and the following attributes:

    - - - - - - - - - - - - - - - - -
    NameTypeDescription
    pathStringThis attribute defines the Program Image. This attribute can be used during local capture to copy images into the .apc folder. You can update all Program Images in Streamline post-capture.
    enabledBooleanA yes value means the Program Image is enabled, a no value means it is not. The default value is no.
    -

    energy_capture

    -

    The session node can either have zero or one energy_capture child nodes. The energy_capture node can have zero or more channel child nodes and the following attributes:

    - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    versionInteger1
    command_pathStringThe full path to the caiman executable
    typeStringThe type attribute can have one of three possible values: none, energy_probe or ni-daq. none means no energy data is collected during a capture. energy_probe or ni-daq define the hardware used to capture the energy data from the target.
    -

    channel

    -

    The energy_capture node can any number of channel nodes. The channel node has the following attributes:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    idIntegerThe channel number
    resistanceIntegerThe channel resistance, set using the resistance field.
    powerBooleanTrue if power data is to be collected and displayed
    voltageBooleanSet to yes if the Voltage checkbox has been enabled for this channel.
    currentBooleanSet to yes if the Current checkbox has been enabled for this channel.
    -

    Example:

    -

    - <?xml version="1.0" encoding="US-ASCII"?>
    - <session version="1" call_stack_unwinding="yes" parse_debug_info="yes" high_resolution="no" buffer_mode="streaming" sample_rate="low" duration="0" target_host="10.99.3.109" target_port="8080" live_rate="100">
    -   <image path="H:\ls"/>
    -   <image path="H:\libc.so.6"/>
    -   <energy_capture version="1" command_path="C:\Program Files (x86)\DS-5\bin\caiman.exe" type="none">
    -     <channel id="0" resistance="20" power="yes" voltage="yes" current="yes"/>
    -   </energy_capture>
    - </session> -

    -

    Captured

    -

    Captured XML contains information about a capture session. This is very similar to Configuration XML

    -

    captured

    -

    The captured root node of Captured XML has one target child node, one counters child node, and the following attributes:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    versionInteger1
    live_energy_deltaIntegerThis attribute is added by Streamline
    createdIntegerCapture date in seconds since the epoch (midnight January 1, 1970 UTC). If you are doing a local capture, gator populates this attribute. Otherwise, Streamline adds this attribute.
    protocolInteger23
    backtrace_processingStringThe value of backtrace_processing can be either gator or none. This attribute is optional and the default value is gator. Indicates the type of call stack post-processing to use.
    -

    target

    -

    The captured node always contains one target child node. The target child node has the following attributes:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    nameStringThe name of the target
    sample_rateIntegerNumber of samples collected per second
    coresIntegerNumber of CPU cores on the target
    cpuidHex IntegerThe cpuid of a core. For example, 0xc08
    supports_liveBooleanIndicates if the Name, Counter, Block Counter, Scheduler Trace and Activity Frames are flushed to Streamline at the live_rate for the Live view.
    -

    counters

    -

    The captured node always contains one counters node. The counters node has the following child node:

    -

    counter

    -

    The counters node can contain any number of counter child nodes. The counter child node contains the following attributes:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    keyHex IntegerThe key for this counter in the APC data (where key > 2).
    typeStringThe same as the counter attribute in the configuration node of Configuration XML.
    eventHex IntegerThe same as the event attribute in the configuration node of Configuration XML.
    countIntegerThe count value used during the capture session. Dictated how many samples had to be collected before triggering the event. This can only be set on one counter. This attribute is optional.
    coresIntegerThe same as the cores attribute in the event node of Events XML.
    -

    Example:

    -

    - <?xml version="1.0" encoding="utf-8"?>
    - <captured version="1" created="1361467764" protocol="23">
    -   <target sample_rate="100" cores="5" cpuid="0xc0f"/>
    -   <counters>
    -     <counter key="0x3" type="ARMv7_Cortex_A7_cnt1" event="0x10"/>
    -     <counter key="0x4" type="ARMv7_Cortex_A7_cnt2" event="0x16"/>
    -     <counter key="0x1" type="ARMv7_Cortex_A7_ccnt" event="0xff"/>
    -     <counter key="0x2" type="ARMv7_Cortex_A7_cnt0" event="0x8"/>
    -     <counter key="0x15" type="Linux_power_cpu_freq" event="0x0"/>
    -     <counter key="0x9" type="Linux_block_rq_rd" event="0x0"/>
    -     <counter key="0x8" type="Linux_block_rq_wr" event="0x0"/>
    -     <counter key="0xc" type="Linux_meminfo_memfree" event="0x0"/>
    -     <counter key="0xd" type="Linux_meminfo_memused" event="0x0"/>
    -     <counter key="0x12" type="Linux_net_rx" event="0x0"/>
    -     <counter key="0x13" type="Linux_net_tx" event="0x0"/>
    -   </counters>
    - </captured> -

    -

    APC Frame Format

    -

    Overview

    -

    The XML files and .apc data collected by Streamline are placed in an .apc folder. When Streamline processes this folder, it creates a db folder, followed by a report folder.

    -

    Note: The APC files are ten-digit files with no extension starting with 0000000000.

    -

    When creating a new report from the same .apc folder, Streamline does not regenerate the db folder, even if the .apc data has changed. In other words, the .apc data is ignored if a valid db folder exists. To ensure Streamline generates a new report from the .apc data, delete the db directory. If this folder is missing, Streamline recreates it from the .apc data files.

    -

    Types

    -
    -
    int32
    4-byte signed little endian
    -
    packed32
    variable length packed 4-byte signed value, see Packed Values
    -
    packed64
    variable length packed 8-byte signed value, see Packed Values
    -
    string
    A packed32 length followed by the specified number of characters
    -
    #
    A constant packed32 value of #, ex: 5 is the packed32 number 5
    -
    timestamp
    packed64 monotonic time value in nanoseconds relative to the monotonic delta from the Summary Message
    -
    -

    Packed Values

    -

    To reduce their size, integers are packed. This is done by avoiding the transmission of duplicate high bits. The value is split into 7 bit bytes in little endian order. The most significant bit of the byte is set to 1, if there is a subsequent byte for this value. On the last byte, the most significant bit is set to 0. For positive values, the most significant encoded bit must be 0 and for negative numbers it must be 1. This is very similar to signed LEB128 used in DWARF.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    BitsLast valueByte 1Byte 2Byte 3Byte 4Byte 5
    31-21474836481XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb01111XXXb
    27-1342177281XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
    20-10485761XXXXXXXb1XXXXXXXb01XXXXXXb
    13-81921XXXXXXXb01XXXXXXb
    6-6401XXXXXXb
    66300XXXXXXb
    1381911XXXXXXXb00XXXXXXb
    2010485751XXXXXXXb1XXXXXXXb00XXXXXXb
    271342177271XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
    3121474836471XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb00000XXXb
    -

    For example, 429389 (01101000110101001101b) would be encoded as 0xCD (11001101b) 0x9A (10011010b) 0x1A (00011010b)

    -

    Packed 64 values work in much the same way:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    BitsLast valueByte 1Byte 2Byte 3Byte 4Byte 5Byte 6Byte 7Byte 8Byte 9Byte 10
    63-92233720368547758081XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb0111111Xb
    62-46116860184273879041XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
    55-360287970189639681XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
    48-2814749767106561XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
    41-21990232555521XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
    34-171798691841XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
    27-1342177281XXXXXXXb1XXXXXXXb1XXXXXXXb01XXXXXXb
    20-10485761XXXXXXXb1XXXXXXXb01XXXXXXb
    13-81921XXXXXXXb01XXXXXXb
    6-6401XXXXXXb
    66300XXXXXXb
    1381911XXXXXXXb00XXXXXXb
    2010485751XXXXXXXb1XXXXXXXb00XXXXXXb
    271342177271XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
    34171798691831XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
    4121990232555511XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
    482814749767106551XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
    55360287970189639671XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
    6246116860184273879031XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb00XXXXXXb
    6392233720368547758071XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb1XXXXXXXb0000000Xb
    -

    For example, -4758616141418899142 would be encoded as 0xBA 0xB2 0xA5 0xA2 0xCE 0xFA 0xFF 0xFA 0xBD 0x7F.

    -

    Frames consist of a header followed by a body of zero or more type specific messages

    -

    Ordering

    -

    The timestamp order of messages is significant and must be in-order on the same core. Timestamps within a frame must also be in order. A specific counter is only be populated in Counter frames or Block Counter frames, not a mix of both.

    -

    Required Messages

    -

    To generate a valid capture at least one Activity, Counter or Block Counter message must be present. All other messages are optional.

    -

    If all you want to get is counters only the Counter or Block Counter message needs to be sent.

    -

    Frame Header

    -

    A length always precedes the frame header either from the Response Header or when the .apc data is written to disk by Streamline during a streaming capture or by gator during a Local Capture.

    - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Codepacked32Indicates the type of this frame. - - - - - - - - - - - - -
    1= Summary
    2= Backtrace
    3= Name
    4= Counter
    5= Block Counter
    6= Annotate
    7= Scheduler Trace
    9= Idle
    10= External
    11= Proc
    13= Activity Trace
    -
    Corepacked32The processor that originated the messages in the frame. This is only present for Backtrace, Name, Block Counter, Scheduler Trace and Proc Frames; other frames can have messages from multiple cores.
    -

    If there are multiple message types for a frame, each message will start with a unique code

    -

    Summary Frame Messages

    -

    Summary Message

    -

    This message should appear only once and it is recommended that it is the first message in the first frame sent to Streamline so the Newline Canary can be checked for correctness before any other processing occurs.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code1 
    Newline CanarystringAlways "1\n2\r\n3\r4\n\r5"
    Timestamppacked64Current system time in nanoseconds since the epoch (midnight January 1, 1970 UTC) or 0 if the target does not have system time
    Uptimepacked64How long the system has been running in nanoseconds. This is not affected by external influences like changing the system time, ntp, hibernating, etc... Can be used to reference kernel log messages. If the target does not support uptime, send 0 and use a monotonically increasing timer for the timestamp messages.
    Monotonic Deltapacked64The delta applied to the monotonic clock to zero-base the timestamps, may be zero if the platform does not support absolute timestamps.
    Attributes  - Zero or more repetitions of the following: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    KeyStringAttribute key. Must not be empty
    ValueStringAttribute value
    -
    End of AttributesStringAlways the empty string
    -

    CPU Core Name Message

    -

    This is used to identify clusters and in the tooltip in X-Ray mode

    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code3 
    Corepacked32The core which the cpuid and Name describe
    cpuidpacked32cpuid of this core. For example, 0xc08
    NamestringHuman readable name of this core. For example, Cortex-A8
    -

    Backtrace Frame Messages

    -

    This is used to populate the Call Paths tab

    -
      -
    • Exec cookie vs Offset cookie -
      • If a sample occurs in libx.so called by my-app, the exec cookie is my-app and the offset cookie is libx.so
      -
    • -
    -

    Cookies should be positive. The special values 0 indicates kernel or idle, -1 indicate an invalid cookie and 1 is reserved to avoid confusion with End of Message, 1 below.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Timestamptimestamp 
    Exec Cookiepacked32Cookie of the current process
    pidpacked32Process ID. In the Linux kernel, this is the Thread Group ID
    tidpacked32Thread ID. In the Linux kernel, this is the PID
    Body  - One or more repetitions of the following: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Offset Cookiepacked32Executable or library at the offset
    Offsetpacked64Offset in the backtrace
    -
    End of Message1 
    -

    Name Frame Messages

    -

    Cookie Name Message

    -

    This is used to get the name for the Process Handle. Cookies are stored in a pseudo hashmap which limits the number of possible collisions, thus duplicate cookies may be emitted. In addition, cookies are stored per core, thus when a task migrates to a new core, a fresh cookie may be emitted for that core. However cookies are unique across all cores.

    - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code1 
    Cookiepacked32Cookie key
    NamestringCookie value
    -

    Thread Name Message

    -

    This is used to show thread names in the Thread Disclosure. Thread names are stored in a pseudo hashmap which to limit the number of times the name is sent, but duplicate thread names may be emitted. Thread numbers can be reused as long as the activity thread exit message is sent before it is reused.

    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code2 
    Timestamptimestamp 
    Thread IDpacked32tid of the named thread
    NamestringName of the thread
    -

    Counter Frame Messages

    -

    This is used to populate Charts in the Timeline view

    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Timestamptimestamp 
    Corepacked32Core to which this counter applies
    Keypacked32Key in Captured XML
    Valuepacked64Value of the specified counter
    -

    Block Counter Frame Messages

    -

    Block counters are the same as counters, but used less space when multiple counters are sampled at the same timestamp and on the same core. To start the block, the key of 0 and a timestamp value is emitted. Then any counters sampled at that time are emitted. A block of counters (counters using the same timestamp) must all be emitted in the same frame. This means that the first block counter message emitted in a frame must be the timestamp.

    -

    Before emitting thread specific values, emit key 1 and the pid value. If the pid value is 0 any subsequent values are not associated with any pid. Any following values apply to the specified pid until another pid or timestamp is emitted.

    -

    Before emitting events from a different core, emit key 2 and the core. Any following values apply to the specified pid until another core or timestamp is emitted.

    - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Keypacked320 for timestamp, 1 for pid, 2 for core or key in Captured XML
    Valuepacked64Value of the specified counter
    -

    Annotate Frame Messages

    -

    This form of annotations is deprecated but is still emitted by gator in some cases. New implementations should use annotations in the External Frame

    -

    Annotations are messages sent by arbitrary userspace programs, so their format is different from other messages.

    -

    A single annotation may be broken across frame boundaries. This is why the Annotation Message has a size and the Userspace Annotations either have a size or are '\n' terminated.

    -

    To colorize any ASCII string within the annotation data, prefix the string with 0x1B escape character followed by a 3-byte RGB value

    -

    Annotate Message

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Corepacked32 
    tidpacked32Thread ID (in the Linux kernel this is the PID)
    Timestamptimestamp 
    Sizepacked32Message size
    Body Userspace Annotation data fragment
    -

    Userspace Annotations

    -

    Annotations belong to a channel with 0 being the default channel. Channels belong to groups with 0 as the default group.

    -

    ASCII String Annotation

    -

    This is used to add a line in the Log tab. Can also be sent from the command line. For example, echo 'Hello World' > /dev/gator/annotate

    - - - - - - - - - - - - - - - - -
    NameTypeDescription
    ColorcolorOptional, 0x1B, RR, GG, BB
    ASCII StringZero or more ASCII characters followed by '\n'Text annotation
    -

    Create Group Annotation

    -

    This is used to name a group in the Thread Disclosure

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Escape Code0x1C 
    Marker Code0x8 
    GroupLittle Endian int32 
    String LengthLittle Endian int16 
    UTF-8 StringString Length UTF-8 bytesGroup name
    -

    Create Channel Annotation

    -

    This is used to name a channel in the Thread Disclosure

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Escape Code0x1C 
    Marker Code0x7 
    ChannelLittle Endian int32 
    GroupLittle Endian int32Group the channel belongs to
    String LengthLittle Endian int16 
    UTF-8 StringString Length UTF-8 bytesChannel name
    -

    UTF-8 String Annotations

    -

    This is used to add a line in the Log tab.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Escape Code0x1C 
    Marker Code0x6 
    ChannelLittle Endian int32Channel the annotation belongs to
    String LengthLittle Endian int16 
    ColorcolorOptional, 0x1B, RR, GG, BB, counts against String Length
    UTF-8 StringString Length UTF-8 bytesText annotation
    -

    Visual Annotation

    -

    This is used to add a line in the Log tab and an image to the Visual Annotation Chart.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Escape Code0x1C 
    Visual Code0x4 
    String LengthLittle Endian int16 
    UTF-8 StringString Length UTF-8 bytesText annotation
    Image LengthLittle Endian int32 
    Image DataImage Length bytes 
    -

    Marker Annotation

    -

    This is used to add a Bookmark

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Escape Code0x1C 
    Marker Code0x5 
    String LengthLittle Endian int16 
    ColorcolorOptional, 0x1B, RR, GG, BB, counts against String Length
    UTF-8 StringString Length UTF-8 bytesText annotation
    -

    Scheduler Trace Frame Messages

    -

    Sched Switch

    -

    This is used to populate the CPU Activity Chart and the Heat Map

    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code1 
    Timestamptimestamp 
    tidpacked32Thread ID (in the Linux kernel this is the PID)
    Statepacked32State - - - - -
    0= Waiting on other event besides I/O
    1= Contention/pre-emption
    2= Waiting on I/O
    -
    -

    Sched Thread Exit

    -

    This is used by the Heat Map to identify when a thread terminates

    - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code2 
    Timestamptimestamp 
    tidpacked32Thread ID (in the Linux kernel this is the PID)
    -

    Activity Frame Messages

    -

    With Activity messages something is always running, though that something can be idle.

    -

    Link Message

    -

    This is used to link a cookie, pid and tid. This message must have a timestamp corresponding to before or shortly after the first time a task runs.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code1 
    Timestamptimestamp 
    Cookiepacked32Cookie of the current process
    pidpacked32Process ID (in the Linux kernel this is the Thread Group ID)
    tidpacked32Thread ID (in the Linux kernel this is the PID)
    -

    Activity Switch

    -

    Causes the task specified by the tid to become active and the previous task on the same core to stop running.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code2 
    Timestamptimestamp 
    Corepacked32Core on which this activity occurred
    Keypacked32key is defined in Captured XML
    Activitypacked32One of the activity types defined in Events XML or zero for idle
    tidpacked32CPU thread ID (in the Linux kernel this is the PID) associated with this activity, use -1 if no tid association is desired
    Wait Statepacked32 - Reason the previously running task stopped - - - - -
    0= Waiting on other (default)
    1= Contention/pre-emption
    2= Waiting on I/O
    -
    -

    Task Exit

    -

    Causes the task specified by the tid to terminate and is only used to differentiate idle from terminated

    - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    Code3 
    Timestamptimestamp 
    tidpacked32Thread ID (in the Linux kernel this is the PID)
    -

    Idle Frame Messages

    -

    Idle Message

    -

    This is used to indicate the execution state of a core

    - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    statepacked32-1 means the core is no longer in the wfi state and is executing. A value >= 0 means the core is in the wfi state and has ceased execution.
    Timestamptimestamp 
    Corepacked32 
    -

    External Frame Messages

    -

    This frame is used for annotation data collected from external sources obtained via TCP/IP. Details of the external frame messages can be found in one the Annotation External Protocols. A single message from an external source may be broken across frame boundaries, this is why the wrapped messages all contain a size.

    -

    External frame

    -

    Every external frame except a disconnect frame shall begin with an id used to match data to a source

    - - - - - - - - - - - -
    NameTypeDescription
    idpacked32id used to match data from the same source, must be >= 0
    -

    Disconnect frame

    -

    This header indicates that the source has disconnected, no other messages are permitted in this frame

    - - - - - - - - - - - - - - - - -
    NameTypeDescription
    code-1
    idpacked32The id of the disconnected source, the id may now be reused in the future
    -

    Proc Frame Messages

    -

    Comm message

    -

    Sends information about all threads running on the machine on startup so that pids and cookies do not need to be collected on schedule switch

    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    pidpacked32Process ID (in the Linux kernel this is the Thread Group ID)
    tidpacked32Thread ID (in the Linux kernel this is the PID)
    imageStringName of the exectuable (same as the string associated with the exec cookie)
    commStringName of the thread
    -

    Sequence Diagrams

    -

    Configuration

    -

    The diagrams in this topic depict the series of events that are triggered when you click various buttons in the Streamline user interface. Here are the events that occur when the Counter Configuration button is clicked in Streamline where $VER is 23

    -
    -

    This is the sequence of events when you click the Load Defaults in the Counter Configuration dialog box:

    -
    -

    This diagram illustrates the sequence of events that occur when you click either the Cancel or Close button in the Counter Configuration dialog box:

    -
    -

    This is the sequence of events triggered when the Save button is clicked from the Counter Configuration dialog box:

    -
    -

    Note: After you click Save, Cancel or Close, the Counter Configuration dialog box closes.

    -

    Capture

    -

    Here are the events that occur when you click the Start Capture button in Streamline, when the $VER is 23.

    -
    -

    At any point during the capture, Streamline can send a ping to verify that the host is still running. If the ping is not acknowledged, Streamline ends the capture.

    -
    -

    Local Capture

    -

    Streamline also support a local capture mode, a mode in which data is collected without interaction with Streamline. In this case the Target-Host Protocol is omitted. Instead a directory, ending in .apc, is provided to Streamline. This directory contains captured.xml containing the Captured XML, session.xml containing the Session XML, events.xml containing the Events XML and 0000000000 which contains the APC Data with one or more structures of the following format:

    - - - - - - - - - - - - - - - - -
    NameTypeDescription
    LengthLittle Endian int32Number of bytes in the body
    bodyAPC Data 
    -
    - - diff --git a/protocol/index.html b/protocol/index.html deleted file mode 100644 index 058bf951..00000000 --- a/protocol/index.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - diff --git a/setup/CMakeLists.txt b/setup/CMakeLists.txt deleted file mode 100644 index 4341f29c..00000000 --- a/setup/CMakeLists.txt +++ /dev/null @@ -1,139 +0,0 @@ -# Copyright (C) ARM Limited 2010-2016. All rights reserved. - -CMAKE_MINIMUM_REQUIRED(VERSION 2.8) - -PROJECT(setup) - -SET(CROSS_COMPILE_ARM "arm-linux-gnueabihf-" - CACHE STRING "ARM Cross compiler prefix") - -SET(CROSS_COMPILE_AARCH64 "aarch64-linux-gnu-" - CACHE STRING "AARCH64 Cross compiler prefix") - -# Macro to compile for each target -MACRO(COMPILE_ELF ASM_FILE CMD_PREFIX AS_ARGS LD_TEXT_BASE) - # Determine the generated output paths - GET_FILENAME_COMPONENT( ASM_NAME_WE - ${ASM_FILE} - NAME_WE) - - SET(TARGET "${ASM_NAME_WE}-all") - SET(OUT_O_PATH "${CMAKE_CURRENT_BINARY_DIR}/${ASM_NAME_WE}.o") - SET(OUT_ELF_PATH "${CMAKE_CURRENT_BINARY_DIR}/${ASM_NAME_WE}.elf") - SET(OUT_BIN_PATH "${CMAKE_CURRENT_BINARY_DIR}/${ASM_NAME_WE}") - - SET(AS_CMD_NAME "${ASM_NAME_WE}_AS_CMD") - SET(LD_CMD_NAME "${ASM_NAME_WE}_LD_CMD") - SET(OBJCOPY_CMD_NAME "${ASM_NAME_WE}_OBJCOPY_CMD") - - # Find the location of the 'as' command on the PATH - IF(EXISTS "${CMD_PREFIX}as") - SET(${AS_CMD_NAME} "${CMD_PREFIX}as") - ELSE() - FIND_FILE(${AS_CMD_NAME} - NAMES "${CMD_PREFIX}as" - "${CMD_PREFIX}as.exe" - PATHS ENV PATH - NO_CMAKE_FIND_ROOT_PATH - DOC "Path to 'as' command for ${CMD_PREFIX}") - ENDIF() - - SET(AS_CMD ${${AS_CMD_NAME}}) - - IF(NOT EXISTS "${AS_CMD}") - MESSAGE(FATAL_ERROR "Could not find 'as' command for ${CMD_PREFIX}") - ENDIF() - - MESSAGE(STATUS "'as' command detected as '${AS_CMD}' for ${CMD_PREFIX}") - - # Find the location of the 'ld' command on the PATH - IF(EXISTS "${CMD_PREFIX}ld") - SET(${LD_CMD_NAME} "${CMD_PREFIX}ld") - ELSE() - FIND_FILE(${LD_CMD_NAME} - NAMES "${CMD_PREFIX}ld" - "${CMD_PREFIX}ld.exe" - PATHS ENV PATH - NO_CMAKE_FIND_ROOT_PATH - DOC "Path to 'ld' command for ${CMD_PREFIX}") - ENDIF() - - SET(LD_CMD ${${LD_CMD_NAME}}) - - IF(NOT EXISTS "${LD_CMD}") - MESSAGE(FATAL_ERROR "Could not find 'ld' command for ${CMD_PREFIX}") - ENDIF() - - MESSAGE(STATUS "'ld' command detected as '${LD_CMD}' for ${CMD_PREFIX}") - - # Find the location of the 'objcopy' command on the PATH - IF(EXISTS "${CMD_PREFIX}objcopy") - SET(${OBJCOPY_CMD_NAME} "${CMD_PREFIX}objcopy") - ELSE() - FIND_FILE(${OBJCOPY_CMD_NAME} - NAMES "${CMD_PREFIX}objcopy" - "${CMD_PREFIX}objcopy.exe" - PATHS ENV PATH - NO_CMAKE_FIND_ROOT_PATH - DOC "Path to 'objcopy' command for ${CMD_PREFIX}") - ENDIF() - - SET(OBJCOPY_CMD ${${OBJCOPY_CMD_NAME}}) - - IF(NOT EXISTS "${OBJCOPY_CMD}") - MESSAGE(FATAL_ERROR "Could not find 'objcopy' command for ${CMD_PREFIX}") - ENDIF() - - MESSAGE(STATUS "'objcopy' command detected as '${OBJCOPY_CMD}' for ${CMD_PREFIX}") - - - # Assemble the input file - ADD_CUSTOM_COMMAND(OUTPUT ${OUT_O_PATH} - COMMAND ${AS_CMD} ${AS_ARGS} -o ${OUT_O_PATH} ${ASM_FILE} - DEPENDS ${ASM_FILE} - COMMENT "Assembling ${ASM_NAME_WE}.s -> ${ASM_NAME_WE}.o") - - # Link the .o file - ADD_CUSTOM_COMMAND(OUTPUT ${OUT_ELF_PATH} - COMMAND ${LD_CMD} -Ttext ${LD_TEXT_BASE} -o ${OUT_ELF_PATH} ${OUT_O_PATH} - DEPENDS ${OUT_O_PATH} - COMMENT "Linking ${ASM_NAME_WE}.o -> ${ASM_NAME_WE}.elf") - - # Extract the elf file using objcopy - ADD_CUSTOM_COMMAND(OUTPUT ${OUT_BIN_PATH} - COMMAND ${OBJCOPY_CMD} -O binary ${OUT_ELF_PATH} ${OUT_BIN_PATH} - DEPENDS ${OUT_ELF_PATH} - COMMENT "Linking ${ASM_NAME_WE}.elf -> ${ASM_NAME_WE}") - - # Custom target ensures is part of 'make all' - ADD_CUSTOM_TARGET(${TARGET} ALL - DEPENDS ${OUT_BIN_PATH}) - -ENDMACRO() - - -COMPILE_ELF("${CMAKE_CURRENT_SOURCE_DIR}/armv7.s" - "${CROSS_COMPILE_ARM}" - "-mfpu=vfp" - 10000) - -COMPILE_ELF("${CMAKE_CURRENT_SOURCE_DIR}/aarch64.s" - "${CROSS_COMPILE_AARCH64}" - "" - 400000) - -# Installation configuration -IF(NOT DEFINED GATOR_INSTALL_PREFIX) - SET(GATOR_INSTALL_PREFIX "share/gator-${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}") -ENDIF() - -SET(SETUP_INSTALL_DIR ./${GATOR_INSTALL_PREFIX}/setup/) - -INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/gator_setup - DESTINATION ${SETUP_INSTALL_DIR}) - -INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/armv7 - ${CMAKE_CURRENT_BINARY_DIR}/aarch64 - PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE - DESTINATION ${SETUP_INSTALL_DIR}) -