diff --git a/.flake8 b/.flake8 index 3d6f324761..34bb7118af 100644 --- a/.flake8 +++ b/.flake8 @@ -160,5 +160,4 @@ exclude = components/wifi_provisioning/python/wifi_constants_pb2.py, examples/provisioning/custom_config/components/custom_provisioning/python/custom_config_pb2.py, # temporary list (should be empty) - tools/esp_app_trace/pylibelf, tools/mass_mfg/mfg_gen.py, diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index da7db2a359..23d499090e 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -643,6 +643,30 @@ test_espcoredump: - cd components/espcoredump/test/ - ${IDF_PATH}/tools/ci/multirun_with_pyenv.sh ./test_espcoredump.sh +test_logtrace_proc: + <<: *host_test_template + artifacts: + when: on_failure + paths: + - tools/esp_app_trace/test/logtrace/output + - tools/esp_app_trace/test/logtrace/.coverage + expire_in: 1 week + script: + - cd ${IDF_PATH}/tools/esp_app_trace/test/logtrace + - ${IDF_PATH}/tools/ci/multirun_with_pyenv.sh ./test.sh + +test_sysviewtrace_proc: + <<: *host_test_template + artifacts: + when: on_failure + paths: + - tools/esp_app_trace/test/sysview/output + - tools/esp_app_trace/test/sysview/.coverage + expire_in: 1 week + script: + - cd ${IDF_PATH}/tools/esp_app_trace/test/sysview + - ${IDF_PATH}/tools/ci/multirun_with_pyenv.sh ./test.sh + push_to_github: stage: deploy image: $CI_DOCKER_REGISTRY/esp32-ci-env$BOT_DOCKER_IMAGE_TAG diff --git a/components/app_trace/CMakeLists.txt b/components/app_trace/CMakeLists.txt index c1b3537ca6..46ab5930d1 100644 --- a/components/app_trace/CMakeLists.txt +++ b/components/app_trace/CMakeLists.txt @@ -13,11 +13,17 @@ if(CONFIG_SYSVIEW_ENABLE) list(APPEND COMPONENT_SRCS "sys_view/SEGGER/SEGGER_SYSVIEW.c" "sys_view/Sample/Config/SEGGER_SYSVIEW_Config_FreeRTOS.c" "sys_view/Sample/OS/SEGGER_SYSVIEW_FreeRTOS.c" - "sys_view/esp32/SEGGER_RTT_esp32.c") + "sys_view/esp32/SEGGER_RTT_esp32.c" + "sys_view/ext/heap_trace_module.c" + "sys_view/ext/logging.c") +endif() + +if(CONFIG_HEAP_TRACING_TOHOST) + list(APPEND COMPONENT_SRCS "heap_trace_tohost.c") endif() set(COMPONENT_REQUIRES) -set(COMPONENT_PRIV_REQUIRES) +set(COMPONENT_PRIV_REQUIRES heap) set(COMPONENT_ADD_LDFRAGMENTS linker.lf) register_component() diff --git a/components/app_trace/Kconfig b/components/app_trace/Kconfig index 064f9cf7c0..67387c6615 100644 --- a/components/app_trace/Kconfig +++ b/components/app_trace/Kconfig @@ -107,6 +107,14 @@ menu "Application Level Tracing" help Configures maximum supported tasks in sysview debug + config SYSVIEW_BUF_WAIT_TMO + int "Trace buffer wait timeout" + depends on SYSVIEW_ENABLE + default 500 + help + Configures timeout (in us) to wait for free space in trace buffer. + Set to -1 to wait forever and avoid lost events. + config SYSVIEW_EVT_OVERFLOW_ENABLE bool "Trace Buffer Overflow Event" depends on SYSVIEW_ENABLE diff --git a/components/app_trace/app_trace.c b/components/app_trace/app_trace.c index 445e0f7c2f..84e39d7b16 100644 --- a/components/app_trace/app_trace.c +++ b/components/app_trace/app_trace.c @@ -929,6 +929,9 @@ esp_err_t esp_apptrace_read(esp_apptrace_dest_t dest, void *buf, uint32_t *size, ESP_APPTRACE_LOGE("Trace destinations other then TRAX are not supported yet!"); return ESP_ERR_NOT_SUPPORTED; } + if (buf == NULL || size == NULL || *size == 0) { + return ESP_ERR_INVALID_ARG; + } //TODO: callback system esp_apptrace_tmo_init(&tmo, user_tmo); @@ -963,8 +966,10 @@ uint8_t *esp_apptrace_down_buffer_get(esp_apptrace_dest_t dest, uint32_t *size, ESP_APPTRACE_LOGE("Trace destinations other then TRAX are not supported yet!"); return NULL; } + if (size == NULL || *size == 0) { + return NULL; + } - // ESP_APPTRACE_LOGE("esp_apptrace_down_buffer_get %d", *size); esp_apptrace_tmo_init(&tmo, user_tmo); return hw->get_down_buffer(size, &tmo); } @@ -985,6 +990,9 @@ esp_err_t esp_apptrace_down_buffer_put(esp_apptrace_dest_t dest, uint8_t *ptr, u ESP_APPTRACE_LOGE("Trace destinations other then TRAX are not supported yet!"); return ESP_ERR_NOT_SUPPORTED; } + if (ptr == NULL) { + return ESP_ERR_INVALID_ARG; + } esp_apptrace_tmo_init(&tmo, user_tmo); return hw->put_down_buffer(ptr, &tmo); @@ -1007,6 +1015,9 @@ esp_err_t esp_apptrace_write(esp_apptrace_dest_t dest, const void *data, uint32_ ESP_APPTRACE_LOGE("Trace destinations other then TRAX are not supported yet!"); return ESP_ERR_NOT_SUPPORTED; } + if (data == NULL || size == 0) { + return ESP_ERR_INVALID_ARG; + } esp_apptrace_tmo_init(&tmo, user_tmo); ptr = hw->get_up_buffer(size, &tmo); @@ -1040,6 +1051,9 @@ int esp_apptrace_vprintf_to(esp_apptrace_dest_t dest, uint32_t user_tmo, const c ESP_APPTRACE_LOGE("Trace destinations other then TRAX are not supported yet!"); return ESP_ERR_NOT_SUPPORTED; } + if (fmt == NULL) { + return ESP_ERR_INVALID_ARG; + } esp_apptrace_tmo_init(&tmo, user_tmo); ESP_APPTRACE_LOGD("fmt %x", fmt); @@ -1101,6 +1115,9 @@ uint8_t *esp_apptrace_buffer_get(esp_apptrace_dest_t dest, uint32_t size, uint32 ESP_APPTRACE_LOGE("Trace destinations other then TRAX are not supported yet!"); return NULL; } + if (size == 0) { + return NULL; + } esp_apptrace_tmo_init(&tmo, user_tmo); return hw->get_up_buffer(size, &tmo); @@ -1122,6 +1139,9 @@ esp_err_t esp_apptrace_buffer_put(esp_apptrace_dest_t dest, uint8_t *ptr, uint32 ESP_APPTRACE_LOGE("Trace destinations other then TRAX are not supported yet!"); return ESP_ERR_NOT_SUPPORTED; } + if (ptr == NULL) { + return ESP_ERR_INVALID_ARG; + } esp_apptrace_tmo_init(&tmo, user_tmo); return hw->put_up_buffer(ptr, &tmo); diff --git a/components/app_trace/component.mk b/components/app_trace/component.mk index 384a04a768..a17fa814f0 100644 --- a/components/app_trace/component.mk +++ b/components/app_trace/component.mk @@ -23,7 +23,8 @@ COMPONENT_SRCDIRS += \ sys_view/SEGGER \ sys_view/Sample/OS \ sys_view/Sample/Config \ - sys_view/esp32 + sys_view/esp32 \ + sys_view/ext else COMPONENT_SRCDIRS += gcov endif diff --git a/components/app_trace/heap_trace_tohost.c b/components/app_trace/heap_trace_tohost.c new file mode 100644 index 0000000000..764022aba4 --- /dev/null +++ b/components/app_trace/heap_trace_tohost.c @@ -0,0 +1,114 @@ +// Copyright 2018 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +#include + +#define HEAP_TRACE_SRCFILE /* don't warn on inclusion here */ +#include "esp_heap_trace.h" +#undef HEAP_TRACE_SRCFILE + +#if CONFIG_SYSVIEW_ENABLE +#include "esp_app_trace.h" +#include "esp_sysview_trace.h" +#endif + +#define STACK_DEPTH CONFIG_HEAP_TRACING_STACK_DEPTH + +#ifdef CONFIG_HEAP_TRACING_TOHOST + +#if !CONFIG_SYSVIEW_ENABLE +#error None of the heap tracing backends is enabled! You must enable SystemView compatible tracing to use this feature. +#endif + +static bool s_tracing; + +esp_err_t heap_trace_init_tohost() +{ + if (s_tracing) { + return ESP_ERR_INVALID_STATE; + } + return ESP_OK; +} + +esp_err_t heap_trace_start(heap_trace_mode_t mode_param) +{ +#if CONFIG_SYSVIEW_ENABLE + esp_err_t ret = esp_sysview_heap_trace_start((uint32_t)-1); + if (ret != ESP_OK) { + return ret; + } +#endif + s_tracing = true; + return ESP_OK; +} + +esp_err_t heap_trace_stop(void) +{ + esp_err_t ret = ESP_ERR_NOT_SUPPORTED; +#if CONFIG_SYSVIEW_ENABLE + ret = esp_sysview_heap_trace_stop(); +#endif + s_tracing = false; + return ret; +} + +esp_err_t heap_trace_resume(void) +{ + return heap_trace_start(HEAP_TRACE_ALL); +} + +size_t heap_trace_get_count(void) +{ + return 0; +} + +esp_err_t heap_trace_get(size_t index, heap_trace_record_t *record) +{ + return ESP_ERR_NOT_SUPPORTED; +} + +void heap_trace_dump(void) +{ + return; +} + +/* Add a new allocation to the heap trace records */ +static IRAM_ATTR void record_allocation(const heap_trace_record_t *record) +{ + if (!s_tracing) { + return; + } +#if CONFIG_SYSVIEW_ENABLE + esp_sysview_heap_trace_alloc(record->address, record->size, record->alloced_by); +#endif +} + +/* record a free event in the heap trace log + + For HEAP_TRACE_ALL, this means filling in the freed_by pointer. + For HEAP_TRACE_LEAKS, this means removing the record from the log. +*/ +static IRAM_ATTR void record_free(void *p, void **callers) +{ + if (!s_tracing) { + return; + } +#if CONFIG_SYSVIEW_ENABLE + esp_sysview_heap_trace_free(p, callers); +#endif +} + +#include "heap_trace.inc" + +#endif /*CONFIG_HEAP_TRACING_TOHOST*/ + diff --git a/components/app_trace/host_file_io.c b/components/app_trace/host_file_io.c index b818440145..b59b837aa2 100644 --- a/components/app_trace/host_file_io.c +++ b/components/app_trace/host_file_io.c @@ -145,6 +145,9 @@ void *esp_apptrace_fopen(esp_apptrace_dest_t dest, const char *path, const char esp_apptrace_fopen_args_t cmd_args; ESP_EARLY_LOGV(TAG, "esp_apptrace_fopen '%s' '%s'", path, mode); + if (path == NULL || mode == NULL) { + return 0; + } cmd_args.path = path; cmd_args.path_len = strlen(path) + 1; @@ -213,6 +216,10 @@ size_t esp_apptrace_fwrite(esp_apptrace_dest_t dest, const void *ptr, size_t siz ESP_EARLY_LOGV(TAG, "esp_apptrace_fwrite f %p l %d", stream, size*nmemb); + if (ptr == NULL) { + return 0; + } + cmd_args.buf = (void *)ptr; cmd_args.size = size * nmemb; cmd_args.file = stream; @@ -248,6 +255,10 @@ size_t esp_apptrace_fread(esp_apptrace_dest_t dest, void *ptr, size_t size, size ESP_EARLY_LOGV(TAG, "esp_apptrace_fread f %p l %d", stream, size*nmemb); + if (ptr == NULL) { + return 0; + } + cmd_args.size = size * nmemb; cmd_args.file = stream; esp_err_t ret = esp_apptrace_file_cmd_send(dest, ESP_APPTRACE_FILE_CMD_FREAD, esp_apptrace_fread_args_prepare, diff --git a/components/app_trace/include/esp_sysview_trace.h b/components/app_trace/include/esp_sysview_trace.h new file mode 100644 index 0000000000..3cf04f1d25 --- /dev/null +++ b/components/app_trace/include/esp_sysview_trace.h @@ -0,0 +1,80 @@ +// Copyright 2018 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +#ifndef ESP_SYSVIEW_TRACE_H_ +#define ESP_SYSVIEW_TRACE_H_ + +#include +#include "esp_err.h" +#include "SEGGER_RTT.h" // SEGGER_RTT_ESP32_Flush +#include "esp_app_trace_util.h" // ESP_APPTRACE_TMO_INFINITE + +/** + * @brief Flushes remaining data in SystemView trace buffer to host. + * + * @param tmo Timeout for operation (in us). Use ESP_APPTRACE_TMO_INFINITE to wait indefinetly. + * + * @return ESP_OK. + */ +static inline esp_err_t esp_sysview_flush(uint32_t tmo) +{ + SEGGER_RTT_ESP32_Flush(0, tmo); + return ESP_OK; +} + +/** + * @brief vprintf-like function to sent log messages to the host. + * + * @param format Address of format string. + * @param args List of arguments. + * + * @return Number of bytes written. + */ +int esp_sysview_vprintf(const char * format, va_list args); + +/** + * @brief Starts SystemView heap tracing. + * + * @param tmo Timeout (in us) to wait for the host to be connected. Use -1 to wait forever. + * + * @return ESP_OK on success, ESP_ERR_TIMEOUT if operation has been timed out. + */ +esp_err_t esp_sysview_heap_trace_start(uint32_t tmo); + +/** + * @brief Stops SystemView heap tracing. + * + * @return ESP_OK. + */ +esp_err_t esp_sysview_heap_trace_stop(void); + +/** + * @brief Sends heap allocation event to the host. + * + * @param addr Address of allocated block. + * @param size Size of allocated block. + * @param callers Pointer to array with callstack addresses. + * Array size must be CONFIG_HEAP_TRACING_STACK_DEPTH. + */ +void esp_sysview_heap_trace_alloc(void *addr, uint32_t size, const void *callers); + +/** + * @brief Sends heap de-allocation event to the host. + * + * @param addr Address of de-allocated block. + * @param callers Pointer to array with callstack addresses. + * Array size must be CONFIG_HEAP_TRACING_STACK_DEPTH. + */ +void esp_sysview_heap_trace_free(void *addr, const void *callers); + +#endif //ESP_SYSVIEW_TRACE_H_ diff --git a/components/app_trace/linker.lf b/components/app_trace/linker.lf index 5494afc00c..a109829953 100644 --- a/components/app_trace/linker.lf +++ b/components/app_trace/linker.lf @@ -1,7 +1,12 @@ [mapping] archive: libapp_trace.a entries: - * (noflash) + app_trace (noflash) + app_trace_util (noflash) + SEGGER_SYSVIEW (noflash) + SEGGER_RTT_esp32 (noflash) + SEGGER_SYSVIEW_Config_FreeRTOS (noflash) + SEGGER_SYSVIEW_FreeRTOS (noflash) [mapping] archive: libdriver.a diff --git a/components/app_trace/sys_view/SEGGER/SEGGER_RTT.h b/components/app_trace/sys_view/SEGGER/SEGGER_RTT.h index a4673f5aad..877d6ee331 100644 --- a/components/app_trace/sys_view/SEGGER/SEGGER_RTT.h +++ b/components/app_trace/sys_view/SEGGER/SEGGER_RTT.h @@ -160,6 +160,7 @@ unsigned SEGGER_RTT_WriteSkipNoLock (unsigned BufferIndex, const voi unsigned SEGGER_RTT_WriteString (unsigned BufferIndex, const char* s); void SEGGER_RTT_WriteWithOverwriteNoLock(unsigned BufferIndex, const void* pBuffer, unsigned NumBytes); void SEGGER_RTT_ESP32_FlushNoLock (unsigned long min_sz, unsigned long tmo); +void SEGGER_RTT_ESP32_Flush (unsigned long min_sz, unsigned long tmo); // // Function macro for performance optimization // diff --git a/components/app_trace/sys_view/SEGGER/SEGGER_SYSVIEW.c b/components/app_trace/sys_view/SEGGER/SEGGER_SYSVIEW.c index e0d48aca28..bc21811cc3 100644 --- a/components/app_trace/sys_view/SEGGER/SEGGER_SYSVIEW.c +++ b/components/app_trace/sys_view/SEGGER/SEGGER_SYSVIEW.c @@ -1689,6 +1689,10 @@ void SEGGER_SYSVIEW_Stop(void) { RECORD_END(); } +U8 SEGGER_SYSVIEW_Started(void) { + return _SYSVIEW_Globals.EnableState; +} + /********************************************************************* * * SEGGER_SYSVIEW_GetSysDesc() @@ -2678,7 +2682,7 @@ void SEGGER_SYSVIEW_ErrorfTarget(const char* s, ...) { void SEGGER_SYSVIEW_Print(const char* s) { U8* pPayload; U8* pPayloadStart; - RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 2 * SEGGER_SYSVIEW_QUANTA_U32 + SEGGER_SYSVIEW_MAX_STRING_LEN); + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 2 * SEGGER_SYSVIEW_QUANTA_U32 + SEGGER_SYSVIEW_MAX_STRING_LEN + 3/*1 or 3 bytes for string length*/); // pPayload = _EncodeStr(pPayloadStart, s, SEGGER_SYSVIEW_MAX_STRING_LEN); ENCODE_U32(pPayload, SEGGER_SYSVIEW_LOG); diff --git a/components/app_trace/sys_view/SEGGER/SEGGER_SYSVIEW.h b/components/app_trace/sys_view/SEGGER/SEGGER_SYSVIEW.h index 91cc0c6f4d..b5b5519d08 100644 --- a/components/app_trace/sys_view/SEGGER/SEGGER_SYSVIEW.h +++ b/components/app_trace/sys_view/SEGGER/SEGGER_SYSVIEW.h @@ -230,6 +230,8 @@ void SEGGER_SYSVIEW_GetSysDesc (void); void SEGGER_SYSVIEW_SendTaskList (void); void SEGGER_SYSVIEW_SendTaskInfo (const SEGGER_SYSVIEW_TASKINFO* pInfo); void SEGGER_SYSVIEW_SendSysDesc (const char* sSysDesc); +// Checks whether tracing has been started +U8 SEGGER_SYSVIEW_Started(void); /********************************************************************* * diff --git a/components/app_trace/sys_view/Sample/OS/SEGGER_SYSVIEW_FreeRTOS.h b/components/app_trace/sys_view/Sample/OS/SEGGER_SYSVIEW_FreeRTOS.h index a13af030b6..a66a91471e 100644 --- a/components/app_trace/sys_view/Sample/OS/SEGGER_SYSVIEW_FreeRTOS.h +++ b/components/app_trace/sys_view/Sample/OS/SEGGER_SYSVIEW_FreeRTOS.h @@ -244,8 +244,10 @@ Notes: #define traceQUEUE_SEND( pxQueue ) SYSVIEW_RecordU32x4(apiFastID_OFFSET + apiID_XQUEUEGENERICSEND, SEGGER_SYSVIEW_ShrinkId((U32)pxQueue), 0, 0, xCopyPosition) #endif #define traceQUEUE_SEND_FAILED( pxQueue ) SYSVIEW_RecordU32x4(apiFastID_OFFSET + apiID_XQUEUEGENERICSEND, SEGGER_SYSVIEW_ShrinkId((U32)pxQueue), (U32)pvItemToQueue, xTicksToWait, xCopyPosition) -#define traceQUEUE_SEND_FROM_ISR( pxQueue ) SEGGER_SYSVIEW_RecordU32x2(apiFastID_OFFSET + apiID_XQUEUEGENERICSENDFROMISR, SEGGER_SYSVIEW_ShrinkId((U32)pxQueue), (U32)pxHigherPriorityTaskWoken) -#define traceQUEUE_SEND_FROM_ISR_FAILED( pxQueue ) SEGGER_SYSVIEW_RecordU32x2(apiFastID_OFFSET + apiID_XQUEUEGENERICSENDFROMISR, SEGGER_SYSVIEW_ShrinkId((U32)pxQueue), (U32)pxHigherPriorityTaskWoken) +#define traceQUEUE_SEND_FROM_ISR( pxQueue ) SEGGER_SYSVIEW_RecordU32x4(apiFastID_OFFSET + apiID_XQUEUEGENERICSENDFROMISR, SEGGER_SYSVIEW_ShrinkId((U32)pxQueue), (U32)pvItemToQueue, (U32)pxHigherPriorityTaskWoken, xCopyPosition) +#define traceQUEUE_SEND_FROM_ISR_FAILED( pxQueue ) SEGGER_SYSVIEW_RecordU32x4(apiFastID_OFFSET + apiID_XQUEUEGENERICSENDFROMISR, SEGGER_SYSVIEW_ShrinkId((U32)pxQueue), (U32)pvItemToQueue, (U32)pxHigherPriorityTaskWoken, xCopyPosition) +#define traceQUEUE_GIVE_FROM_ISR( pxQueue ) SEGGER_SYSVIEW_RecordU32x2(apiFastID_OFFSET + apiID_XQUEUEGIVEFROMISR, SEGGER_SYSVIEW_ShrinkId((U32)pxQueue), (U32)pxHigherPriorityTaskWoken) +#define traceQUEUE_GIVE_FROM_ISR_FAILED( pxQueue ) SEGGER_SYSVIEW_RecordU32x2(apiFastID_OFFSET + apiID_XQUEUEGIVEFROMISR, SEGGER_SYSVIEW_ShrinkId((U32)pxQueue), (U32)pxHigherPriorityTaskWoken) #if( portSTACK_GROWTH < 0 ) #define traceTASK_CREATE(pxNewTCB) if (pxNewTCB != NULL) { \ diff --git a/components/app_trace/sys_view/esp32/SEGGER_RTT_esp32.c b/components/app_trace/sys_view/esp32/SEGGER_RTT_esp32.c index 410f303a3f..2ee0a49500 100644 --- a/components/app_trace/sys_view/esp32/SEGGER_RTT_esp32.c +++ b/components/app_trace/sys_view/esp32/SEGGER_RTT_esp32.c @@ -16,6 +16,7 @@ #include "freertos/FreeRTOS.h" #include "SEGGER_RTT.h" #include "SEGGER_SYSVIEW.h" +#include "SEGGER_SYSVIEW_Conf.h" #include "esp32/rom/ets_sys.h" #include "esp_app_trace.h" @@ -27,8 +28,12 @@ const static char *TAG = "segger_rtt"; // size of down channel data buf #define SYSVIEW_DOWN_BUF_SIZE 32 -#define SEGGER_HOST_WAIT_TMO 500 //us #define SEGGER_STOP_WAIT_TMO 1000000 //us +#if CONFIG_SYSVIEW_BUF_WAIT_TMO == -1 +#define SEGGER_HOST_WAIT_TMO ESP_APPTRACE_TMO_INFINITE +#else +#define SEGGER_HOST_WAIT_TMO CONFIG_SYSVIEW_BUF_WAIT_TMO +#endif static uint8_t s_events_buf[SYSVIEW_EVENTS_BUF_SZ]; static uint16_t s_events_buf_filled; @@ -57,9 +62,12 @@ static uint8_t s_down_buf[SYSVIEW_DOWN_BUF_SIZE]; */ void SEGGER_RTT_ESP32_FlushNoLock(unsigned long min_sz, unsigned long tmo) { - esp_err_t res = esp_apptrace_write(ESP_APPTRACE_DEST_TRAX, s_events_buf, s_events_buf_filled, tmo); - if (res != ESP_OK) { - ESP_LOGE(TAG, "Failed to flush buffered events (%d)!\n", res); + esp_err_t res; + if (s_events_buf_filled > 0) { + res = esp_apptrace_write(ESP_APPTRACE_DEST_TRAX, s_events_buf, s_events_buf_filled, tmo); + if (res != ESP_OK) { + ESP_LOGE(TAG, "Failed to flush buffered events (%d)!\n", res); + } } // flush even if we failed to write buffered events, because no new events will be sent after STOP res = esp_apptrace_flush_nolock(ESP_APPTRACE_DEST_TRAX, min_sz, tmo); @@ -69,6 +77,27 @@ void SEGGER_RTT_ESP32_FlushNoLock(unsigned long min_sz, unsigned long tmo) s_events_buf_filled = 0; } +/********************************************************************* +* +* SEGGER_RTT_ESP32_Flush() +* +* Function description +* Flushes buffered events. +* +* Parameters +* min_sz Threshold for flushing data. If current filling level is above this value, data will be flushed. TRAX destinations only. +* tmo Timeout for operation (in us). Use ESP_APPTRACE_TMO_INFINITE to wait indefinetly. +* +* Return value +* None. +*/ +void SEGGER_RTT_ESP32_Flush(unsigned long min_sz, unsigned long tmo) +{ + SEGGER_SYSVIEW_LOCK(); + SEGGER_RTT_ESP32_FlushNoLock(min_sz, tmo); + SEGGER_SYSVIEW_UNLOCK(); +} + /********************************************************************* * * SEGGER_RTT_ReadNoLock() diff --git a/components/app_trace/sys_view/ext/heap_trace_module.c b/components/app_trace/sys_view/ext/heap_trace_module.c new file mode 100644 index 0000000000..3d86f2e647 --- /dev/null +++ b/components/app_trace/sys_view/ext/heap_trace_module.c @@ -0,0 +1,100 @@ +// Copyright 2018 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +#include +#include +#include "SEGGER_SYSVIEW.h" +#include "SEGGER_RTT.h" +#include "esp_app_trace.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" + +#include "esp_log.h" +const static char *TAG = "sysview_heap_trace"; + +#ifdef CONFIG_HEAP_TRACING_STACK_DEPTH +#define CALLSTACK_SIZE CONFIG_HEAP_TRACING_STACK_DEPTH +#else +#define CALLSTACK_SIZE 0 +#endif + +static SEGGER_SYSVIEW_MODULE s_esp_sysview_heap_module = { + .sModule = "ESP32 SystemView Heap Tracing Module", + .NumEvents = 2, +}; + +static bool s_mod_registered; + + +esp_err_t esp_sysview_heap_trace_start(uint32_t tmo) +{ + uint32_t tmo_ticks = tmo/(1000*portTICK_PERIOD_MS); + + ESP_EARLY_LOGV(TAG, "%s", __func__); + do { + if (tmo != (uint32_t)-1) { + // Currently timeout implementation is simple and has granularity of 1 OS tick, + // so just count down the number of times to call vTaskDelay + if (tmo_ticks-- == 0) { + return ESP_ERR_TIMEOUT; + } + } + vTaskDelay(1); + } while(!SEGGER_SYSVIEW_Started()); + + SEGGER_SYSVIEW_RegisterModule(&s_esp_sysview_heap_module); + s_mod_registered = true; + return ESP_OK; +} + +esp_err_t esp_sysview_heap_trace_stop(void) +{ + ESP_EARLY_LOGV(TAG, "%s", __func__); + SEGGER_RTT_ESP32_Flush(0, ESP_APPTRACE_TMO_INFINITE); + return ESP_OK; +} + +void esp_sysview_heap_trace_alloc(const void *addr, uint32_t size, const void *callers) +{ + U8 aPacket[SEGGER_SYSVIEW_INFO_SIZE + (2+CALLSTACK_SIZE)*SEGGER_SYSVIEW_QUANTA_U32]; + U8* pPayload = SEGGER_SYSVIEW_PREPARE_PACKET(aPacket); + U32 *calls = (U32 *)callers; + + if (!s_mod_registered) { + return; + } + ESP_EARLY_LOGV(TAG, "%s %p %lu", __func__, addr, size); + pPayload = SEGGER_SYSVIEW_EncodeU32(pPayload, (U32)addr); + pPayload = SEGGER_SYSVIEW_EncodeU32(pPayload, size); + for (int i = 0; i < CALLSTACK_SIZE; i++) { + pPayload = SEGGER_SYSVIEW_EncodeU32(pPayload, calls[i]); + } + SEGGER_SYSVIEW_SendPacket(&aPacket[0], pPayload, s_esp_sysview_heap_module.EventOffset + 0); +} + +void esp_sysview_heap_trace_free(const void *addr, const void *callers) +{ + U8 aPacket[SEGGER_SYSVIEW_INFO_SIZE + (1+CALLSTACK_SIZE)*SEGGER_SYSVIEW_QUANTA_U32]; + U8* pPayload = SEGGER_SYSVIEW_PREPARE_PACKET(aPacket); + U32 *calls = (U32 *)callers; + + if (!s_mod_registered) { + return; + } + ESP_EARLY_LOGV(TAG, "%s %p", __func__, addr); + pPayload = SEGGER_SYSVIEW_EncodeU32(pPayload, (U32)addr); + for (int i = 0; i < CALLSTACK_SIZE; i++) { + pPayload = SEGGER_SYSVIEW_EncodeU32(pPayload, calls[i]); + } + SEGGER_SYSVIEW_SendPacket(&aPacket[0], pPayload, s_esp_sysview_heap_module.EventOffset + 1); +} diff --git a/components/app_trace/sys_view/ext/logging.c b/components/app_trace/sys_view/ext/logging.c new file mode 100644 index 0000000000..b7aa5ff10c --- /dev/null +++ b/components/app_trace/sys_view/ext/logging.c @@ -0,0 +1,34 @@ +// Copyright 2018 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +#include +#include +#include +#include "SEGGER_SYSVIEW_Int.h" +#include "freertos/FreeRTOS.h" + +static portMUX_TYPE s_log_mutex = portMUX_INITIALIZER_UNLOCKED; + +int esp_sysview_vprintf(const char * format, va_list args) +{ + static char log_buffer[SEGGER_SYSVIEW_MAX_STRING_LEN]; + + portENTER_CRITICAL(&s_log_mutex); + size_t len = vsnprintf(log_buffer, sizeof(log_buffer), format, args); + if (len > sizeof(log_buffer) - 1) { + log_buffer[sizeof(log_buffer - 1)] = 0; + } + SEGGER_SYSVIEW_Print(log_buffer); + portEXIT_CRITICAL(&s_log_mutex); + return len; +} diff --git a/components/freertos/include/freertos/FreeRTOS.h b/components/freertos/include/freertos/FreeRTOS.h index 486d9c329a..207e653450 100644 --- a/components/freertos/include/freertos/FreeRTOS.h +++ b/components/freertos/include/freertos/FreeRTOS.h @@ -514,6 +514,14 @@ extern "C" { #define traceTASK_CREATE( pxNewTCB ) #endif +#ifndef traceQUEUE_GIVE_FROM_ISR + #define traceQUEUE_GIVE_FROM_ISR( pxQueue ) +#endif + +#ifndef traceQUEUE_GIVE_FROM_ISR_FAILED + #define traceQUEUE_GIVE_FROM_ISR_FAILED( pxQueue ) +#endif + #ifndef traceTASK_CREATE_FAILED #define traceTASK_CREATE_FAILED() #endif diff --git a/components/freertos/queue.c b/components/freertos/queue.c index 0107bbc10a..1859dbd1dd 100644 --- a/components/freertos/queue.c +++ b/components/freertos/queue.c @@ -1333,7 +1333,7 @@ Queue_t * const pxQueue = ( Queue_t * ) xQueue; space'. */ if( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) { - traceQUEUE_SEND_FROM_ISR( pxQueue ); + traceQUEUE_GIVE_FROM_ISR( pxQueue ); /* A task can only have an inherited priority if it is a mutex holder - and if there is a mutex holder then the mutex cannot be @@ -1427,7 +1427,7 @@ Queue_t * const pxQueue = ( Queue_t * ) xQueue; } else { - traceQUEUE_SEND_FROM_ISR_FAILED( pxQueue ); + traceQUEUE_GIVE_FROM_ISR_FAILED( pxQueue ); xReturn = errQUEUE_FULL; } taskEXIT_CRITICAL_ISR(&pxQueue->mux); diff --git a/components/heap/CMakeLists.txt b/components/heap/CMakeLists.txt index 442a9676f1..fbbd10eeae 100644 --- a/components/heap/CMakeLists.txt +++ b/components/heap/CMakeLists.txt @@ -1,6 +1,5 @@ set(COMPONENT_SRCS "heap_caps.c" "heap_caps_init.c" - "heap_trace.c" "multi_heap.c") if(NOT CONFIG_HEAP_POISONING_DISABLED) @@ -11,6 +10,10 @@ if(CONFIG_HEAP_TASK_TRACKING) list(APPEND COMPONENT_SRCS "heap_task_info.c") endif() +if(CONFIG_HEAP_TRACING_STANDALONE) + list(APPEND COMPONENT_SRCS "heap_trace_standalone.c") +endif() + set(COMPONENT_ADD_INCLUDEDIRS "include") set(COMPONENT_ADD_LDFRAGMENTS linker.lf) set(COMPONENT_REQUIRES "") diff --git a/components/heap/Kconfig b/components/heap/Kconfig index b2e00ab3a0..c0e226bdd2 100644 --- a/components/heap/Kconfig +++ b/components/heap/Kconfig @@ -17,14 +17,31 @@ menu "Heap memory debugging" bool "Comprehensive" endchoice - config HEAP_TRACING - bool "Enable heap tracing" + choice HEAP_TRACING_DEST + bool "Heap tracing" + default HEAP_TRACING_OFF help Enables the heap tracing API defined in esp_heap_trace.h. This function causes a moderate increase in IRAM code side and a minor increase in heap function - (malloc/free/realloc) CPU overhead, even when the tracing feature is not used. So it's best to keep it - disabled unless tracing is being used. + (malloc/free/realloc) CPU overhead, even when the tracing feature is not used. + So it's best to keep it disabled unless tracing is being used. + + config HEAP_TRACING_OFF + bool "Disabled" + config HEAP_TRACING_STANDALONE + bool "Standalone" + select HEAP_TRACING + config HEAP_TRACING_TOHOST + bool "Host-based" + select HEAP_TRACING + endchoice + + config HEAP_TRACING + bool + default F + help + Enables/disables heap tracing API. config HEAP_TRACING_STACK_DEPTH int "Heap tracing stack depth" diff --git a/components/heap/component.mk b/components/heap/component.mk index 7d8ef920af..266fbada07 100644 --- a/components/heap/component.mk +++ b/components/heap/component.mk @@ -2,7 +2,7 @@ # Component Makefile # -COMPONENT_OBJS := heap_caps_init.o heap_caps.o multi_heap.o heap_trace.o +COMPONENT_OBJS := heap_caps_init.o heap_caps.o multi_heap.o ifndef CONFIG_HEAP_POISONING_DISABLED COMPONENT_OBJS += multi_heap_poisoning.o @@ -12,6 +12,12 @@ COMPONENT_OBJS += heap_task_info.o endif endif +ifdef CONFIG_HEAP_TRACING_STANDALONE + +COMPONENT_OBJS += heap_trace_standalone.o + +endif + ifdef CONFIG_HEAP_TRACING WRAP_FUNCTIONS = calloc malloc free realloc heap_caps_malloc heap_caps_free heap_caps_realloc heap_caps_malloc_default heap_caps_realloc_default diff --git a/components/heap/heap_trace.c b/components/heap/heap_trace_standalone.c similarity index 56% rename from components/heap/heap_trace.c rename to components/heap/heap_trace_standalone.c index 58babbc19e..138a8cd35f 100644 --- a/components/heap/heap_trace.c +++ b/components/heap/heap_trace_standalone.c @@ -12,23 +12,21 @@ // See the License for the specific language governing permissions and // limitations under the License. #include -#include #include #define HEAP_TRACE_SRCFILE /* don't warn on inclusion here */ #include "esp_heap_trace.h" #undef HEAP_TRACE_SRCFILE -#include "esp_heap_caps.h" #include "esp_attr.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" -#include "soc/soc_memory_layout.h" -#include "heap_private.h" #define STACK_DEPTH CONFIG_HEAP_TRACING_STACK_DEPTH +#if CONFIG_HEAP_TRACING_STANDALONE + static portMUX_TYPE trace_mux = portMUX_INITIALIZER_UNLOCKED; static bool tracing; static heap_trace_mode_t mode; @@ -55,10 +53,6 @@ static bool has_overflowed = false; esp_err_t heap_trace_init_standalone(heap_trace_record_t *record_buffer, size_t num_records) { -#ifndef CONFIG_HEAP_TRACING - return ESP_ERR_NOT_SUPPORTED; -#endif - if (tracing) { return ESP_ERR_INVALID_STATE; } @@ -70,13 +64,10 @@ esp_err_t heap_trace_init_standalone(heap_trace_record_t *record_buffer, size_t esp_err_t heap_trace_start(heap_trace_mode_t mode_param) { -#ifndef CONFIG_HEAP_TRACING - return ESP_ERR_NOT_SUPPORTED; -#endif - if (buffer == NULL || total_records == 0) { return ESP_ERR_INVALID_STATE; } + portENTER_CRITICAL(&trace_mux); tracing = false; @@ -93,9 +84,6 @@ esp_err_t heap_trace_start(heap_trace_mode_t mode_param) static esp_err_t set_tracing(bool enable) { -#ifndef CONFIG_HEAP_TRACING - return ESP_ERR_NOT_SUPPORTED; -#endif if (tracing == enable) { return ESP_ERR_INVALID_STATE; } @@ -120,9 +108,6 @@ size_t heap_trace_get_count(void) esp_err_t heap_trace_get(size_t index, heap_trace_record_t *record) { -#ifndef CONFIG_HEAP_TRACING - return ESP_ERR_NOT_SUPPORTED; -#endif if (record == NULL) { return ESP_ERR_INVALID_STATE; } @@ -141,10 +126,6 @@ esp_err_t heap_trace_get(size_t index, heap_trace_record_t *record) void heap_trace_dump(void) { -#ifndef CONFIG_HEAP_TRACING - printf("no data, heap tracing is disabled.\n"); - return; -#endif size_t delta_size = 0; size_t delta_allocs = 0; printf("%u allocations trace (%u entry buffer)\n", @@ -192,6 +173,10 @@ void heap_trace_dump(void) /* Add a new allocation to the heap trace records */ static IRAM_ATTR void record_allocation(const heap_trace_record_t *record) { + if (!tracing || record->address == NULL) { + return; + } + portENTER_CRITICAL(&trace_mux); if (tracing) { if (count == total_records) { @@ -224,6 +209,10 @@ static void remove_record(int index); */ static IRAM_ATTR void record_free(void *p, void **callers) { + if (!tracing || p == NULL) { + return; + } + portENTER_CRITICAL(&trace_mux); if (tracing && count > 0) { total_frees++; @@ -261,179 +250,6 @@ static IRAM_ATTR void remove_record(int index) count--; } -/* Encode the CPU ID in the LSB of the ccount value */ -inline static uint32_t get_ccount(void) -{ - uint32_t ccount = xthal_get_ccount() & ~3; -#ifndef CONFIG_FREERTOS_UNICORE - ccount |= xPortGetCoreID(); -#endif - return ccount; -} +#include "heap_trace.inc" -// Caller is 2 stack frames deeper than we care about -#define STACK_OFFSET 2 - -#define TEST_STACK(N) do { \ - if (STACK_DEPTH == N) { \ - return; \ - } \ - callers[N] = __builtin_return_address(N+STACK_OFFSET); \ - if (!esp_ptr_executable(callers[N])) { \ - return; \ - } \ - } while(0) - -/* Static function to read the call stack for a traced heap call. - - Calls to __builtin_return_address are "unrolled" via TEST_STACK macro as gcc requires the - argument to be a compile-time constant. -*/ -static IRAM_ATTR __attribute__((noinline)) void get_call_stack(void **callers) -{ - bzero(callers, sizeof(void *) * STACK_DEPTH); - TEST_STACK(0); - TEST_STACK(1); - TEST_STACK(2); - TEST_STACK(3); - TEST_STACK(4); - TEST_STACK(5); - TEST_STACK(6); - TEST_STACK(7); - TEST_STACK(8); - TEST_STACK(9); -} - -_Static_assert(STACK_DEPTH >= 0 && STACK_DEPTH <= 10, "CONFIG_HEAP_TRACING_STACK_DEPTH must be in range 0-10"); - - -typedef enum { - TRACE_MALLOC_CAPS, - TRACE_MALLOC_DEFAULT -} trace_malloc_mode_t; - - -void *__real_heap_caps_malloc(size_t size, uint32_t caps); -void *__real_heap_caps_malloc_default( size_t size ); -void *__real_heap_caps_realloc_default( void *ptr, size_t size ); - -/* trace any 'malloc' event */ -static IRAM_ATTR __attribute__((noinline)) void *trace_malloc(size_t size, uint32_t caps, trace_malloc_mode_t mode) -{ - uint32_t ccount = get_ccount(); - void *p; - if ( mode == TRACE_MALLOC_CAPS ) { - p = __real_heap_caps_malloc(size, caps); - } else { //TRACE_MALLOC_DEFAULT - p = __real_heap_caps_malloc_default(size); - } - - if (tracing && p != NULL) { - heap_trace_record_t rec = { - .address = p, - .ccount = ccount, - .size = size, - }; - get_call_stack(rec.alloced_by); - record_allocation(&rec); - } - return p; -} - -void __real_heap_caps_free(void *p); - -/* trace any 'free' event */ -static IRAM_ATTR __attribute__((noinline)) void trace_free(void *p) -{ - if (tracing && p != NULL) { - void *callers[STACK_DEPTH]; - get_call_stack(callers); - record_free(p, callers); - } - __real_heap_caps_free(p); -} - -void * __real_heap_caps_realloc(void *p, size_t size, uint32_t caps); - -/* trace any 'realloc' event */ -static IRAM_ATTR __attribute__((noinline)) void *trace_realloc(void *p, size_t size, uint32_t caps, trace_malloc_mode_t mode) -{ - void *callers[STACK_DEPTH]; - uint32_t ccount = get_ccount(); - if (tracing && p != NULL && size == 0) { - get_call_stack(callers); - record_free(p, callers); - } - void *r; - if (mode == TRACE_MALLOC_CAPS ) { - r = __real_heap_caps_realloc(p, size, caps); - } else { //TRACE_MALLOC_DEFAULT - r = __real_heap_caps_realloc_default(p, size); - } - if (tracing && r != NULL) { - get_call_stack(callers); - if (p != NULL) { - /* trace realloc as free-then-alloc */ - record_free(p, callers); - } - heap_trace_record_t rec = { - .address = r, - .ccount = ccount, - .size = size, - }; - memcpy(rec.alloced_by, callers, sizeof(void *) * STACK_DEPTH); - record_allocation(&rec); - } - return r; -} - -/* Note: this changes the behaviour of libc malloc/realloc/free a bit, - as they no longer go via the libc functions in ROM. But more or less - the same in the end. */ - -IRAM_ATTR void *__wrap_malloc(size_t size) -{ - return trace_malloc(size, 0, TRACE_MALLOC_DEFAULT); -} - -IRAM_ATTR void __wrap_free(void *p) -{ - trace_free(p); -} - -IRAM_ATTR void *__wrap_realloc(void *p, size_t size) -{ - return trace_realloc(p, size, 0, TRACE_MALLOC_DEFAULT); -} - -IRAM_ATTR void *__wrap_calloc(size_t nmemb, size_t size) -{ - size = size * nmemb; - void *result = trace_malloc(size, 0, TRACE_MALLOC_DEFAULT); - if (result != NULL) { - memset(result, 0, size); - } - return result; -} - -IRAM_ATTR void *__wrap_heap_caps_malloc(size_t size, uint32_t caps) -{ - return trace_malloc(size, caps, TRACE_MALLOC_CAPS); -} - -void __wrap_heap_caps_free(void *p) __attribute__((alias("__wrap_free"))); - -IRAM_ATTR void *__wrap_heap_caps_realloc(void *p, size_t size, uint32_t caps) -{ - return trace_realloc(p, size, caps, TRACE_MALLOC_CAPS); -} - -IRAM_ATTR void *__wrap_heap_caps_malloc_default( size_t size ) -{ - return trace_malloc(size, 0, TRACE_MALLOC_DEFAULT); -} - -IRAM_ATTR void *__wrap_heap_caps_realloc_default( void *ptr, size_t size ) -{ - return trace_realloc(ptr, size, 0, TRACE_MALLOC_DEFAULT); -} +#endif /*CONFIG_HEAP_TRACING_STANDALONE*/ diff --git a/components/heap/include/esp_heap_trace.h b/components/heap/include/esp_heap_trace.h index 5573d5e5ab..a71f96362c 100644 --- a/components/heap/include/esp_heap_trace.h +++ b/components/heap/include/esp_heap_trace.h @@ -47,7 +47,6 @@ typedef struct { /** * @brief Initialise heap tracing in standalone mode. - * @note Standalone mode is the only mode currently supported. * * This function must be called before any other heap tracing functions. * @@ -63,6 +62,17 @@ typedef struct { */ esp_err_t heap_trace_init_standalone(heap_trace_record_t *record_buffer, size_t num_records); +/** + * @brief Initialise heap tracing in host-based mode. + * + * This function must be called before any other heap tracing functions. + * + * @return + * - ESP_ERR_INVALID_STATE Heap tracing is currently in progress. + * - ESP_OK Heap tracing initialised successfully. + */ +esp_err_t heap_trace_init_tohost(void); + /** * @brief Start heap tracing. All heap allocations & frees will be traced, until heap_trace_stop() is called. * diff --git a/components/heap/include/heap_trace.inc b/components/heap/include/heap_trace.inc new file mode 100644 index 0000000000..a51b07a6ab --- /dev/null +++ b/components/heap/include/heap_trace.inc @@ -0,0 +1,189 @@ +// Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +#include +#include +#include "soc/soc_memory_layout.h" +#include "esp_attr.h" + +/* Encode the CPU ID in the LSB of the ccount value */ +inline static uint32_t get_ccount(void) +{ + uint32_t ccount = xthal_get_ccount() & ~3; +#ifndef CONFIG_FREERTOS_UNICORE + ccount |= xPortGetCoreID(); +#endif + return ccount; +} + +// Caller is 2 stack frames deeper than we care about +#define STACK_OFFSET 2 + +#define TEST_STACK(N) do { \ + if (STACK_DEPTH == N) { \ + return; \ + } \ + callers[N] = __builtin_return_address(N+STACK_OFFSET); \ + if (!esp_ptr_executable(callers[N])) { \ + return; \ + } \ + } while(0) + +/* Static function to read the call stack for a traced heap call. + + Calls to __builtin_return_address are "unrolled" via TEST_STACK macro as gcc requires the + argument to be a compile-time constant. +*/ +static IRAM_ATTR __attribute__((noinline)) void get_call_stack(void **callers) +{ + bzero(callers, sizeof(void *) * STACK_DEPTH); + TEST_STACK(0); + TEST_STACK(1); + TEST_STACK(2); + TEST_STACK(3); + TEST_STACK(4); + TEST_STACK(5); + TEST_STACK(6); + TEST_STACK(7); + TEST_STACK(8); + TEST_STACK(9); +} + +_Static_assert(STACK_DEPTH >= 0 && STACK_DEPTH <= 10, "CONFIG_HEAP_TRACING_STACK_DEPTH must be in range 0-10"); + + +typedef enum { + TRACE_MALLOC_CAPS, + TRACE_MALLOC_DEFAULT +} trace_malloc_mode_t; + + +void *__real_heap_caps_malloc(size_t size, uint32_t caps); +void *__real_heap_caps_malloc_default( size_t size ); +void *__real_heap_caps_realloc_default( void *ptr, size_t size ); + +/* trace any 'malloc' event */ +static IRAM_ATTR __attribute__((noinline)) void *trace_malloc(size_t size, uint32_t caps, trace_malloc_mode_t mode) +{ + uint32_t ccount = get_ccount(); + void *p; + + if ( mode == TRACE_MALLOC_CAPS ) { + p = __real_heap_caps_malloc(size, caps); + } else { //TRACE_MALLOC_DEFAULT + p = __real_heap_caps_malloc_default(size); + } + + heap_trace_record_t rec = { + .address = p, + .ccount = ccount, + .size = size, + }; + get_call_stack(rec.alloced_by); + record_allocation(&rec); + return p; +} + +void __real_heap_caps_free(void *p); + +/* trace any 'free' event */ +static IRAM_ATTR __attribute__((noinline)) void trace_free(void *p) +{ + void *callers[STACK_DEPTH]; + get_call_stack(callers); + record_free(p, callers); + + __real_heap_caps_free(p); +} + +void * __real_heap_caps_realloc(void *p, size_t size, uint32_t caps); + +/* trace any 'realloc' event */ +static IRAM_ATTR __attribute__((noinline)) void *trace_realloc(void *p, size_t size, uint32_t caps, trace_malloc_mode_t mode) +{ + void *callers[STACK_DEPTH]; + uint32_t ccount = get_ccount(); + void *r; + + /* trace realloc as free-then-alloc */ + get_call_stack(callers); + record_free(p, callers); + + if (mode == TRACE_MALLOC_CAPS ) { + r = __real_heap_caps_realloc(p, size, caps); + } else { //TRACE_MALLOC_DEFAULT + r = __real_heap_caps_realloc_default(p, size); + } + /* realloc with zero size is a free */ + if (size != 0) { + heap_trace_record_t rec = { + .address = r, + .ccount = ccount, + .size = size, + }; + memcpy(rec.alloced_by, callers, sizeof(void *) * STACK_DEPTH); + record_allocation(&rec); + } + return r; +} + +/* Note: this changes the behaviour of libc malloc/realloc/free a bit, + as they no longer go via the libc functions in ROM. But more or less + the same in the end. */ + +IRAM_ATTR void *__wrap_malloc(size_t size) +{ + return trace_malloc(size, 0, TRACE_MALLOC_DEFAULT); +} + +IRAM_ATTR void __wrap_free(void *p) +{ + trace_free(p); +} + +IRAM_ATTR void *__wrap_realloc(void *p, size_t size) +{ + return trace_realloc(p, size, 0, TRACE_MALLOC_DEFAULT); +} + +IRAM_ATTR void *__wrap_calloc(size_t nmemb, size_t size) +{ + size = size * nmemb; + void *result = trace_malloc(size, 0, TRACE_MALLOC_DEFAULT); + if (result != NULL) { + memset(result, 0, size); + } + return result; +} + +IRAM_ATTR void *__wrap_heap_caps_malloc(size_t size, uint32_t caps) +{ + return trace_malloc(size, caps, TRACE_MALLOC_CAPS); +} + +void __wrap_heap_caps_free(void *p) __attribute__((alias("__wrap_free"))); + +IRAM_ATTR void *__wrap_heap_caps_realloc(void *p, size_t size, uint32_t caps) +{ + return trace_realloc(p, size, caps, TRACE_MALLOC_CAPS); +} + +IRAM_ATTR void *__wrap_heap_caps_malloc_default( size_t size ) +{ + return trace_malloc(size, 0, TRACE_MALLOC_DEFAULT); +} + +IRAM_ATTR void *__wrap_heap_caps_realloc_default( void *ptr, size_t size ) +{ + return trace_realloc(ptr, size, 0, TRACE_MALLOC_DEFAULT); +} diff --git a/docs/Doxyfile b/docs/Doxyfile index aa3096bad4..17258901c7 100644 --- a/docs/Doxyfile +++ b/docs/Doxyfile @@ -184,6 +184,7 @@ INPUT = \ ## Application Level Tracing - API Reference ## ../../components/app_trace/include/esp_app_trace.h \ + ../../components/app_trace/include/esp_sysview_trace.h \ ### Power management ../../components/esp_common/include/esp_pm.h \ ../../components/esp32/include/esp32/pm.h \ diff --git a/docs/en/api-reference/system/app_trace.rst b/docs/en/api-reference/system/app_trace.rst index 91860fb431..437d389e3f 100644 --- a/docs/en/api-reference/system/app_trace.rst +++ b/docs/en/api-reference/system/app_trace.rst @@ -15,4 +15,5 @@ API Reference ------------- .. include:: /_build/inc/esp_app_trace.inc +.. include:: /_build/inc/esp_sysview_trace.inc diff --git a/docs/en/api-reference/system/heap_debug.rst b/docs/en/api-reference/system/heap_debug.rst index a6d4c2c503..2f03907060 100644 --- a/docs/en/api-reference/system/heap_debug.rst +++ b/docs/en/api-reference/system/heap_debug.rst @@ -122,11 +122,10 @@ Calls to :cpp:func:`heap_caps_check_integrity` may print errors relating to 0xFE Heap Tracing ------------ -Heap Tracing allows tracing of code which allocates/frees memory. +Heap Tracing allows tracing of code which allocates/frees memory. Two tracing modes are supported: -.. note:: - - Heap tracing "standalone" mode is currently implemented, meaning that tracing does not require any external hardware but uses internal memory to hold trace data. Heap tracing via JTAG trace port is also planned. +- Standalone. In this mode trace data are kept on-board, so the size of gathered information is limited by the buffer assigned for that purposes. Analysis is done by the on-board code. There are a couple of APIs available for accessing and dumping collected info. +- Host-based. This mode does not have the limitation of the standalone mode, because trace data are sent to the host over JTAG connection using app_trace library. Later on they can be analysed using special tools. Heap tracing can perform two functions: @@ -138,9 +137,13 @@ How To Diagnose Memory Leaks If you suspect a memory leak, the first step is to figure out which part of the program is leaking memory. Use the :cpp:func:`xPortGetFreeHeapSize`, :cpp:func:`heap_caps_get_free_size`, or :ref:`related functions ` to track memory use over the life of the application. Try to narrow the leak down to a single function or sequence of functions where free memory always decreases and never recovers. + +Standalone Mode ++++++++++++++++ + Once you've identified the code which you think is leaking: -- Under ``make menuconfig``, navigate to ``Component settings`` -> ``Heap Memory Debugging`` and set :ref:`CONFIG_HEAP_TRACING`. +- Under ``make menuconfig``, navigate to ``Component settings`` -> ``Heap Memory Debugging`` -> ``Heap tracing`` and select ``Standalone`` option (see :ref:`CONFIG_HEAP_TRACING_DEST`). - Call the function :cpp:func:`heap_trace_init_standalone` early in the program, to register a buffer which can be used to record the memory trace. - Call the function :cpp:func:`heap_trace_start` to begin recording all mallocs/frees in the system. Call this immediately before the piece of code which you suspect is leaking memory. - Call the function :cpp:func:`heap_trace_stop` to stop the trace once the suspect piece of code has finished executing. @@ -165,9 +168,9 @@ An example:: void some_function() { ESP_ERROR_CHECK( heap_trace_start(HEAP_TRACE_LEAKS) ); - + do_something_you_suspect_is_leaking(); - + ESP_ERROR_CHECK( heap_trace_stop() ); heap_trace_dump(); ... @@ -208,6 +211,164 @@ Finally, the total number of 'leaked' bytes (bytes allocated but not freed while A warning will be printed if the trace buffer was not large enough to hold all the allocations which happened. If you see this warning, consider either shortening the tracing period or increasing the number of records in the trace buffer. + +Host-Based Mode ++++++++++++++++ + +Once you've identified the code which you think is leaking: + +- Under ``make menuconfig``, navigate to ``Component settings`` -> ``Heap Memory Debugging`` -> ``Heap tracing`` and select ``Host-Based`` option (see :ref:`CONFIG_HEAP_TRACING_DEST`). +- Under ``make menuconfig``, navigate to ``Component settings`` -> ``Application Level Tracing`` -> ``Data Destination`` and select ``Trace memory``. +- Under ``make menuconfig``, navigate to ``Component settings`` -> ``Application Level Tracing`` -> ``FreeRTOS SystemView Tracing`` and check ``SystemView Tracing Enable``. +- Call the function :cpp:func:`heap_trace_init_tohost` early in the program, to initialize JTAG heap tracing module. +- Call the function :cpp:func:`heap_trace_start` to begin recording all mallocs/frees in the system. Call this immediately before the piece of code which you suspect is leaking memory. + In host-based mode argument to this function is ignored and heap tracing module behaves like ``HEAP_TRACE_ALL`` was passed: all allocations and deallocations are sent to the host. +- Call the function :cpp:func:`heap_trace_stop` to stop the trace once the suspect piece of code has finished executing. + +An example:: + + #include "esp_heap_trace.h" + + ... + + void app_main() + { + ... + ESP_ERROR_CHECK( heap_trace_init_tohost() ); + ... + } + + void some_function() + { + ESP_ERROR_CHECK( heap_trace_start(HEAP_TRACE_LEAKS) ); + + do_something_you_suspect_is_leaking(); + + ESP_ERROR_CHECK( heap_trace_stop() ); + ... + } + +To gather and analyse heap trace do the following on the host: + +1. Build the program and download it to the target as described in :doc:`Build and Flash `. + +2. Run OpenOCD (see :doc:`JTAG Debugging `). + +.. note:: + + In order to use this feature you need OpenOCD version `v0.10.0-esp32-20181105` or later. + +3. You can use GDB to start and/or stop tracing automatically. To do this you need to prepare special ``gdbinit`` file:: + + target remote :3333 + + mon reset halt + flushregs + + tb heap_trace_start + commands + mon esp32 sysview start file:///tmp/heap.svdat + c + end + + tb heap_trace_stop + commands + mon esp32 sysview stop + end + + c + +Using this file GDB will connect to the target, reset it, and start tracing when program hits breakpoint at :cpp:func:`heap_trace_start`. Trace data will be saved to ``/tmp/heap_log.svdat``. Tracing will be stopped when program hits breakpoint at :cpp:func:`heap_trace_stop`. + +4. Run GDB using the following command ``xtensa-esp32-elf-gdb -x gdbinit `` + +5. Quit GDB when program stops at :cpp:func:`heap_trace_stop`. Trace data are saved in ``/tmp/heap.svdat`` + +6. Run processing script ``$IDF_PATH/tools/esp_app_trace/sysviewtrace_proc.py /tmp/heap_log.svdat `` + +The output from the heap trace will look something like this:: + + Parse trace from '/tmp/heap.svdat'... + Stop parsing trace. (Timeout 0.000000 sec while reading 1 bytes!) + Process events from '['/tmp/heap.svdat']'... + [0.002244575] HEAP: Allocated 1 bytes @ 0x3ffaffd8 from task "alloc" on core 0 by: + /home/user/projects/esp/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:47 + /home/user/projects/esp/esp-idf/components/freertos/port.c:355 (discriminator 1) + + [0.002258425] HEAP: Allocated 2 bytes @ 0x3ffaffe0 from task "alloc" on core 0 by: + /home/user/projects/esp/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:48 + /home/user/projects/esp/esp-idf/components/freertos/port.c:355 (discriminator 1) + + [0.002563725] HEAP: Freed bytes @ 0x3ffaffe0 from task "free" on core 0 by: + /home/user/projects/esp/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:31 (discriminator 9) + /home/user/projects/esp/esp-idf/components/freertos/port.c:355 (discriminator 1) + + [0.002782950] HEAP: Freed bytes @ 0x3ffb40b8 from task "main" on core 0 by: + /home/user/projects/esp/esp-idf/components/freertos/tasks.c:4590 + /home/user/projects/esp/esp-idf/components/freertos/tasks.c:4590 + + [0.002798700] HEAP: Freed bytes @ 0x3ffb50bc from task "main" on core 0 by: + /home/user/projects/esp/esp-idf/components/freertos/tasks.c:4590 + /home/user/projects/esp/esp-idf/components/freertos/tasks.c:4590 + + [0.102436025] HEAP: Allocated 2 bytes @ 0x3ffaffe0 from task "alloc" on core 0 by: + /home/user/projects/esp/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:47 + /home/user/projects/esp/esp-idf/components/freertos/port.c:355 (discriminator 1) + + [0.102449800] HEAP: Allocated 4 bytes @ 0x3ffaffe8 from task "alloc" on core 0 by: + /home/user/projects/esp/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:48 + /home/user/projects/esp/esp-idf/components/freertos/port.c:355 (discriminator 1) + + [0.102666150] HEAP: Freed bytes @ 0x3ffaffe8 from task "free" on core 0 by: + /home/user/projects/esp/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:31 (discriminator 9) + /home/user/projects/esp/esp-idf/components/freertos/port.c:355 (discriminator 1) + + [0.202436200] HEAP: Allocated 3 bytes @ 0x3ffaffe8 from task "alloc" on core 0 by: + /home/user/projects/esp/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:47 + /home/user/projects/esp/esp-idf/components/freertos/port.c:355 (discriminator 1) + + [0.202451725] HEAP: Allocated 6 bytes @ 0x3ffafff0 from task "alloc" on core 0 by: + /home/user/projects/esp/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:48 + /home/user/projects/esp/esp-idf/components/freertos/port.c:355 (discriminator 1) + + [0.202667075] HEAP: Freed bytes @ 0x3ffafff0 from task "free" on core 0 by: + /home/user/projects/esp/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:31 (discriminator 9) + /home/user/projects/esp/esp-idf/components/freertos/port.c:355 (discriminator 1) + + [0.302436000] HEAP: Allocated 4 bytes @ 0x3ffafff0 from task "alloc" on core 0 by: + /home/user/projects/esp/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:47 + /home/user/projects/esp/esp-idf/components/freertos/port.c:355 (discriminator 1) + + [0.302451475] HEAP: Allocated 8 bytes @ 0x3ffb40b8 from task "alloc" on core 0 by: + /home/user/projects/esp/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:48 + /home/user/projects/esp/esp-idf/components/freertos/port.c:355 (discriminator 1) + + [0.302667500] HEAP: Freed bytes @ 0x3ffb40b8 from task "free" on core 0 by: + /home/user/projects/esp/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:31 (discriminator 9) + /home/user/projects/esp/esp-idf/components/freertos/port.c:355 (discriminator 1) + + Processing completed. + Processed 1019 events + =============== HEAP TRACE REPORT =============== + Processed 14 heap events. + [0.002244575] HEAP: Allocated 1 bytes @ 0x3ffaffd8 from task "alloc" on core 0 by: + /home/user/projects/esp/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:47 + /home/user/projects/esp/esp-idf/components/freertos/port.c:355 (discriminator 1) + + [0.102436025] HEAP: Allocated 2 bytes @ 0x3ffaffe0 from task "alloc" on core 0 by: + /home/user/projects/esp/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:47 + /home/user/projects/esp/esp-idf/components/freertos/port.c:355 (discriminator 1) + + [0.202436200] HEAP: Allocated 3 bytes @ 0x3ffaffe8 from task "alloc" on core 0 by: + /home/user/projects/esp/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:47 + /home/user/projects/esp/esp-idf/components/freertos/port.c:355 (discriminator 1) + + [0.302436000] HEAP: Allocated 4 bytes @ 0x3ffafff0 from task "alloc" on core 0 by: + /home/user/projects/esp/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:47 + /home/user/projects/esp/esp-idf/components/freertos/port.c:355 (discriminator 1) + + Found 10 leaked bytes in 4 blocks. + Heap Tracing To Find Heap Corruption ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/docs/en/get-started-cmake/linux-setup-scratch.rst b/docs/en/get-started-cmake/linux-setup-scratch.rst index e36f9c9836..a95c502842 100644 --- a/docs/en/get-started-cmake/linux-setup-scratch.rst +++ b/docs/en/get-started-cmake/linux-setup-scratch.rst @@ -15,15 +15,15 @@ To compile with ESP-IDF you need to get the following packages: - CentOS 7:: - sudo yum install git wget ncurses-devel flex bison gperf python pyserial cmake ninja-build ccache + sudo yum install git wget ncurses-devel flex bison gperf python pyserial python-pyelftools cmake ninja-build ccache - Ubuntu and Debian:: - sudo apt-get install git wget libncurses-dev flex bison gperf python python-pip python-setuptools python-serial python-cryptography python-future python-pyparsing cmake ninja-build ccache + sudo apt-get install git wget libncurses-dev flex bison gperf python python-pip python-setuptools python-serial python-cryptography python-future python-pyparsing python-pyelftools cmake ninja-build ccache - Arch:: - sudo pacman -S --needed gcc git make ncurses flex bison gperf python2-pyserial python2-cryptography python2-future python2-pyparsing cmake ninja ccache + sudo pacman -S --needed gcc git make ncurses flex bison gperf python2-pyserial python2-cryptography python2-future python2-pyparsing python2-pyelftools cmake ninja ccache .. note:: CMake version 3.5 or newer is required for use with ESP-IDF. Older Linux distributions may require updating, enabling of a "backports" repository, or installing of a "cmake3" package rather than "cmake". diff --git a/docs/en/get-started-cmake/linux-setup.rst b/docs/en/get-started-cmake/linux-setup.rst index 8418378b21..1edca98b7c 100644 --- a/docs/en/get-started-cmake/linux-setup.rst +++ b/docs/en/get-started-cmake/linux-setup.rst @@ -13,15 +13,15 @@ To compile with ESP-IDF you need to get the following packages: - CentOS 7:: - sudo yum install git wget ncurses-devel flex bison gperf python pyserial cmake ninja-build ccache + sudo yum install git wget ncurses-devel flex bison gperf python pyserial python-pyelftools cmake ninja-build ccache - Ubuntu and Debian:: - sudo apt-get install git wget libncurses-dev flex bison gperf python python-pip python-setuptools python-serial python-cryptography python-future python-pyparsing cmake ninja-build ccache + sudo apt-get install git wget libncurses-dev flex bison gperf python python-pip python-setuptools python-serial python-cryptography python-future python-pyparsing python-pyelftools cmake ninja-build ccache - Arch:: - sudo pacman -S --needed gcc git make ncurses flex bison gperf python2-pyserial python2-cryptography python2-future python2-pyparsing cmake ninja ccache + sudo pacman -S --needed gcc git make ncurses flex bison gperf python2-pyserial python2-cryptography python2-future python2-pyparsing python2-pyelftools cmake ninja ccache .. note:: CMake version 3.5 or newer is required for use with ESP-IDF. Older Linux distributions may require updating, enabling of a "backports" repository, or installing of a "cmake3" package rather than "cmake". diff --git a/docs/en/get-started/linux-setup-scratch.rst b/docs/en/get-started/linux-setup-scratch.rst index 71028e64df..395458153f 100644 --- a/docs/en/get-started/linux-setup-scratch.rst +++ b/docs/en/get-started/linux-setup-scratch.rst @@ -14,11 +14,11 @@ To compile with ESP-IDF you need to get the following packages: - Ubuntu and Debian:: - sudo apt-get install gcc git wget make libncurses-dev flex bison gperf python python-pip python-setuptools python-serial python-cryptography python-future python-pyparsing + sudo apt-get install gcc git wget make libncurses-dev flex bison gperf python python-pip python-setuptools python-serial python-cryptography python-future python-pyparsing python-pyelftools - Arch:: - sudo pacman -S --needed gcc git make ncurses flex bison gperf python2-pyserial python2-cryptography python2-future python2-pyparsing + sudo pacman -S --needed gcc git make ncurses flex bison gperf python2-pyserial python2-cryptography python2-future python2-pyparsing python2-pyelftools .. note:: diff --git a/docs/en/get-started/linux-setup.rst b/docs/en/get-started/linux-setup.rst index 564fa63fad..7484b4c624 100644 --- a/docs/en/get-started/linux-setup.rst +++ b/docs/en/get-started/linux-setup.rst @@ -14,11 +14,11 @@ To compile with ESP-IDF you need to get the following packages: - Ubuntu and Debian:: - sudo apt-get install gcc git wget make libncurses-dev flex bison gperf python python-pip python-setuptools python-serial python-cryptography python-future python-pyparsing + sudo apt-get install gcc git wget make libncurses-dev flex bison gperf python python-pip python-setuptools python-serial python-cryptography python-future python-pyparsing python-pyelftools - Arch:: - sudo pacman -S --needed gcc git make ncurses flex bison gperf python2-pyserial python2-cryptography python2-future python2-pyparsing + sudo pacman -S --needed gcc git make ncurses flex bison gperf python2-pyserial python2-cryptography python2-future python2-pyparsing python2-pyelftools .. note:: diff --git a/docs/zh_CN/get-started-cmake/linux-setup-scratch.rst b/docs/zh_CN/get-started-cmake/linux-setup-scratch.rst index 05bcc281d2..9927087789 100644 --- a/docs/zh_CN/get-started-cmake/linux-setup-scratch.rst +++ b/docs/zh_CN/get-started-cmake/linux-setup-scratch.rst @@ -15,15 +15,15 @@ - CentOS 7:: - sudo yum install git wget ncurses-devel flex bison gperf python pyserial cmake ninja-build ccache + sudo yum install git wget ncurses-devel flex bison gperf python pyserial cmake ninja-build ccache python-pyelftools - Ubuntu 和 Debian:: - sudo apt-get install git wget libncurses-dev flex bison gperf python python-pip python-setuptools python-serial python-cryptography python-future python-pyparsing cmake ninja-build ccache + sudo apt-get install git wget libncurses-dev flex bison gperf python python-pip python-setuptools python-serial python-cryptography python-future python-pyparsing cmake ninja-build ccache python-pyelftools - Arch:: - sudo pacman -S --needed gcc git make ncurses flex bison gperf python2-pyserial python2-cryptography python2-future python2-pyparsing cmake ninja ccache + sudo pacman -S --needed gcc git make ncurses flex bison gperf python2-pyserial python2-cryptography python2-future python2-pyparsing cmake ninja ccache python2-pyelftools .. note:: 使用 ESP-IDF 需要 CMake 3.5 或以上版本。较早版本的 Linux 可能需要升级才能向后移植仓库,或安装 "cmake3" 软件包,而不是安装 "cmake"。 diff --git a/docs/zh_CN/get-started-cmake/linux-setup.rst b/docs/zh_CN/get-started-cmake/linux-setup.rst index acc1cd3bf5..7e1afbcb5a 100644 --- a/docs/zh_CN/get-started-cmake/linux-setup.rst +++ b/docs/zh_CN/get-started-cmake/linux-setup.rst @@ -13,15 +13,15 @@ Linux 平台工具链的标准设置 (CMake) - CentOS 7:: - sudo yum install git wget ncurses-devel flex bison gperf python pyserial cmake ninja-build ccache + sudo yum install git wget ncurses-devel flex bison gperf python pyserial cmake ninja-build ccache python-pyelftools - Ubuntu 和 Debian:: - sudo apt-get install git wget libncurses-dev flex bison gperf python python-pip python-setuptools python-serial python-cryptography python-future python-pyparsing cmake ninja-build ccache + sudo apt-get install git wget libncurses-dev flex bison gperf python python-pip python-setuptools python-serial python-cryptography python-future python-pyparsing cmake ninja-build ccache python-pyelftools - Arch:: - sudo pacman -S --needed gcc git make ncurses flex bison gperf python2-pyserial python2-cryptography python2-future python2-pyparsing cmake ninja ccache + sudo pacman -S --needed gcc git make ncurses flex bison gperf python2-pyserial python2-cryptography python2-future python2-pyparsing cmake ninja ccache python2-pyelftools .. note:: 使用 ESP-IDF 需要 CMake 3.5 或以上版本。较早版本的 Linux 可能需要升级才能向后移植仓库,或安装 "cmake3" 软件包,而不是安装 "cmake"。 diff --git a/docs/zh_CN/get-started/linux-setup-scratch.rst b/docs/zh_CN/get-started/linux-setup-scratch.rst index f79816892e..4b58f2d082 100644 --- a/docs/zh_CN/get-started/linux-setup-scratch.rst +++ b/docs/zh_CN/get-started/linux-setup-scratch.rst @@ -4,7 +4,7 @@ :link_to_translation:`en:[English]` .. note:: - + 安装工具链的标准流程可以通过阅读文档 :doc:`Linux 平台工具链的标准设置 ` 来获得,:ref:`工具链的自定义设置 ` 章节会介绍哪些情况下我们必须要重新定义工具链。 @@ -15,11 +15,11 @@ - Ubuntu 和 Debian:: - sudo apt-get install gcc git wget make libncurses-dev flex bison gperf python python-pip python-setuptools python-serial python-cryptography python-future python-pyparsing + sudo apt-get install gcc git wget make libncurses-dev flex bison gperf python python-pip python-setuptools python-serial python-cryptography python-future python-pyparsing python-pyelftools - Arch:: - sudo pacman -S --needed gcc git make ncurses flex bison gperf python2-pyserial python2-cryptography python2-future python2-pyparsing + sudo pacman -S --needed gcc git make ncurses flex bison gperf python2-pyserial python2-cryptography python2-future python2-pyparsing python2-pyelftools .. note:: diff --git a/docs/zh_CN/get-started/linux-setup.rst b/docs/zh_CN/get-started/linux-setup.rst index 62bf8ed738..72bcbfabc0 100644 --- a/docs/zh_CN/get-started/linux-setup.rst +++ b/docs/zh_CN/get-started/linux-setup.rst @@ -12,15 +12,15 @@ Linux 平台工具链的标准设置 - CentOS 7:: - sudo yum install gcc git wget make ncurses-devel flex bison gperf python pyserial + sudo yum install gcc git wget make ncurses-devel flex bison gperf python pyserial python-pyelftools - Ubuntu and Debian:: - sudo apt-get install gcc git wget make libncurses-dev flex bison gperf python python-pip python-setuptools python-serial python-cryptography python-future python-pyparsing + sudo apt-get install gcc git wget make libncurses-dev flex bison gperf python python-pip python-setuptools python-serial python-cryptography python-future python-pyparsing python-pyelftools - Arch:: - sudo pacman -S --needed gcc git make ncurses flex bison gperf python2-pyserial python2-cryptography python2-future python2-pyparsing + sudo pacman -S --needed gcc git make ncurses flex bison gperf python2-pyserial python2-cryptography python2-future python2-pyparsing python2-pyelftools .. note:: @@ -52,7 +52,7 @@ Linux 版的 ESP32 工具链可以从 Espressif 的网站下载: .. include:: /_build/inc/unpack-code-linux32.inc -.. _setup-linux-toolchain-add-it-to-path: +.. _setup-linux-toolchain-add-it-to-path: 2. 工具链将会被解压到 ``~/esp/xtensa-esp32-elf/`` 目录。 @@ -67,9 +67,9 @@ Linux 版的 ESP32 工具链可以从 Espressif 的网站下载: 然后,当你需要使用工具链时,在命令行输入 ``get_esp32``,然后工具链会自动添加到你的 ``PATH`` 中。 .. note:: - + 如果将 ``/bin/bash`` 设置为登录 shell,且同时存在 ``.bash_profile`` 和 ``.profile``,则更新 ``.bash_profile`` 。在 CentOS 环境下, ``alias`` 需要添加到 ``.bashrc`` 文件中。 - + 3. 退出并重新登录以使 ``.profile`` 更改生效。 运行以下命令来检查 ``PATH`` 设置是否正确: :: printenv PATH diff --git a/examples/system/sysview_tracing/main/sysview_tracing.c b/examples/system/sysview_tracing/main/sysview_tracing.c index 3ac03d8da0..c422d9e46a 100644 --- a/examples/system/sysview_tracing/main/sysview_tracing.c +++ b/examples/system/sysview_tracing/main/sysview_tracing.c @@ -198,9 +198,12 @@ void app_main() #if CONFIG_SYSVIEW_ENABLE && CONFIG_USE_CUSTOM_EVENT_ID // Currently OpenOCD does not support requesting module info from target. So do the following... - // Give SystemView tracing module some time to handle START command from host, - // after that data can be sent to the host using onboard API, so user module description does not need to be requested by OpenOCD itself. - vTaskDelay(1); + // Wait untill SystemView module receives START command from host, + // after that data can be sent to the host using onboard API, + // so user module description does not need to be requested by OpenOCD itself. + while(!SEGGER_SYSVIEW_Started()) { + vTaskDelay(1); + } SEGGER_SYSVIEW_RegisterModule(&s_example_sysview_module); #endif diff --git a/examples/system/sysview_tracing/sdkconfig.defaults b/examples/system/sysview_tracing/sdkconfig.defaults index d27d2611cd..21dd3c78f2 100644 --- a/examples/system/sysview_tracing/sdkconfig.defaults +++ b/examples/system/sysview_tracing/sdkconfig.defaults @@ -1,5 +1,7 @@ +# Enable single core mode by default CONFIG_MEMMAP_SMP=n CONFIG_FREERTOS_UNICORE=y +# 1ms tick period CONFIG_FREERTOS_HZ=1000 # Enable application tracing by default CONFIG_ESP32_APPTRACE_DEST_TRAX=y diff --git a/examples/system/sysview_tracing_heap_log/CMakeLists.txt b/examples/system/sysview_tracing_heap_log/CMakeLists.txt new file mode 100644 index 0000000000..39a10b5524 --- /dev/null +++ b/examples/system/sysview_tracing_heap_log/CMakeLists.txt @@ -0,0 +1,6 @@ +# The following lines of boilerplate have to be in your project's CMakeLists +# in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.5) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(sysview_tracing_heap_log) diff --git a/examples/system/sysview_tracing_heap_log/Makefile b/examples/system/sysview_tracing_heap_log/Makefile new file mode 100644 index 0000000000..d14ffd8caa --- /dev/null +++ b/examples/system/sysview_tracing_heap_log/Makefile @@ -0,0 +1,9 @@ +# +# This is a project Makefile. It is assumed the directory this Makefile resides in is a +# project subdirectory. +# + +PROJECT_NAME := sysview_tracing_heap_log + +include $(IDF_PATH)/make/project.mk + diff --git a/examples/system/sysview_tracing_heap_log/README.md b/examples/system/sysview_tracing_heap_log/README.md new file mode 100644 index 0000000000..8d39311644 --- /dev/null +++ b/examples/system/sysview_tracing_heap_log/README.md @@ -0,0 +1,164 @@ +# SystemView Heap and Log Tracing Example + +Heap memory leaking is quite widespread software bug. IDF provides [heap tracing feature](https://docs.espressif.com/projects/esp-idf/en/latest/api-reference/system/heap_debug.html#heap-tracing) which allows to collect information related to heap operations (allocations/deallocations) and detect potential memory leaks. This feature can be used in two modes: standalone and host-based. In standalone mode collected data are kept on-board, so this mode is limited by avaialable memory in the system. Host-based mode does not have such limitation because collected data are sent to the host and can be analysed there using special tools. One of such tool is SEGGER SystemView. For description of [SystemView tracing feature](https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/app_trace.html#system-behaviour-analysis-with-segger-systemview) please refer to **ESP32 Programming Guide**, section **Application Level Tracing library**. SystemView is also can be useful to show log message sent from the target. +This example shows how to use this tool and IDF's scripts for host-based heap and log tracing analysis. + +Consider the following situation. User program have two tasks. One task allocates memory and puts obtained addresses into the queue. Another task waits on that queue, reads sent pointers and frees memory. The first task queues only part of the pointers so some of the allocated blocks are not freed and become leaked. Both tasks uses IDF's logging API to report their actions. This example uses IDF's heap tracing module to record allocations and deallocations to detect memory leaks. Both heap tracing records and log mesages are redirected to the host. + +## How to use example + +### Hardware and tools required + +This example does not require any special hardware, and can be run on any common development board. +This example requires the following tools: +1. [OpenOCD](https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/jtag-debugging/index.html#run-openocd). +NOTE: In order to run this example you need OpenOCD version `v0.10.0-esp32-20190313` or later. + +2. [GDB](https://docs.espressif.com/projects/esp-idf/en/latest/get-started/index.html#setup-toolchain) can be used to start and/or stop tracing automatically. To do this you need to prepare special GDB command file. Having provided with `gdbinit` file from the example project directory GDB will connect to the target, reset it, start and stop tracing automatically. +when program hits breakpoint at `heap_trace_start`. Trace data will be saved to `/tmp/hesp_log.svdat`. Tracing will be stopped when program hits breakpoint at `heap_trace_stop`. + +3. [SEGGER SystemView tool](https://www.segger.com/products/development-tools/systemview/). By default SystemView shows only numeric values of IDs and parameters for IDF's heap messages in `Events` view. To make them pretty-looking you need to copy `SYSVIEW_FreeRTOS.txt` from the project's root directory to SystemView installation one. + +### Configure the project + +If using Make based build system, run `make menuconfig` and set serial port under Serial Flasher Options. + +If using CMake based build system, no configuration is required. + +### Build and flash + +Build the project and flash it to the board, then run monitor tool to view serial output: + +``` +make -j4 flash monitor +``` + +Or, for CMake based build system (replace PORT with serial port name): + +``` +idf.py -p PORT flash monitor +``` + +(To exit the serial monitor, type ``Ctrl-]``.) + +See the Getting Started Guide for full steps to configure and use ESP-IDF to build projects. + +### Collect And View Trace Data + +To run the example and collect trace data: + +1. Run GDB using the following command from the project root directory: + + ``` + xtensa-esp32-elf-gdb -x gdbinit build/sysview_tracing_heap_log.elf + ``` +2. When program stops at `heap_trace_stop` quit GDB. + +3. Open trace data file in SystemView tool. + +4. Now you can inspect all collected events. Log messages are shown in `Terminal` view. + +5. You can filter out API related and heap events by right-clicking on any item in `Events` view and select `Show APIs only`. + +### Auto-detect Heap Leaks + +Since SystemView tool is mostly intended for OS level analysis. It allows just to inspect custom events' timestamps and parameters. So it can require some efforts to analyse heap operations flow. IDF provides special script to make the life a bit more easy. This script parses SystemView trace file sand reports detected memory leaks. The script also prints found log messages. To run it type the following from the project root directory: + +``` +$IDF_PATH/tools/esp_app_trace/sysviewtrace_proc.py -p /tmp/heap_log.svdat build/sysview_tracing_heap_log.elf +``` + +Below is the sample scripts output. + +``` +Parse trace from '/tmp/heap_log.svdat'... +Stop parsing trace. (Timeout 0.000000 sec while reading 1 bytes!) +Process events from '['/tmp/heap_log.svdat']'... +[0.002244575] HEAP: Allocated 1 bytes @ 0x3ffaffd8 from task "alloc" on core 0 by: +/home/user/projects/esp/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:47 +/home/user/projects/esp/esp-idf/components/freertos/port.c:355 (discriminator 1) + +[0.002258425] HEAP: Allocated 2 bytes @ 0x3ffaffe0 from task "alloc" on core 0 by: +/home/user/projects/esp/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:48 +/home/user/projects/esp/esp-idf/components/freertos/port.c:355 (discriminator 1) + +[0.002405000] LOG: I (264) example: Task[0x3ffb6cf4]: allocated 2 bytes @ 0x3ffaffe0 +[0.002553425] LOG: I (265) example: Task[0x3ffb7660]: free memory @ 0x3ffaffe0 +[0.002563725] HEAP: Freed bytes @ 0x3ffaffe0 from task "free" on core 0 by: +/home/user/projects/esp/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:31 (discriminator 9) +/home/user/projects/esp/esp-idf/components/freertos/port.c:355 (discriminator 1) + +[0.002782950] HEAP: Freed bytes @ 0x3ffb40b8 from task "main" on core 0 by: +/home/user/projects/esp/esp-idf/components/freertos/tasks.c:4590 +/home/user/projects/esp/esp-idf/components/freertos/tasks.c:4590 + +[0.002798700] HEAP: Freed bytes @ 0x3ffb50bc from task "main" on core 0 by: +/home/user/projects/esp/esp-idf/components/freertos/tasks.c:4590 +/home/user/projects/esp/esp-idf/components/freertos/tasks.c:4590 + +[0.102436025] HEAP: Allocated 2 bytes @ 0x3ffaffe0 from task "alloc" on core 0 by: +/home/user/projects/esp/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:47 +/home/user/projects/esp/esp-idf/components/freertos/port.c:355 (discriminator 1) + +[0.102449800] HEAP: Allocated 4 bytes @ 0x3ffaffe8 from task "alloc" on core 0 by: +/home/user/projects/esp/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:48 +/home/user/projects/esp/esp-idf/components/freertos/port.c:355 (discriminator 1) + +[0.102536400] LOG: I (365) example: Task[0x3ffb6cf4]: allocated 4 bytes @ 0x3ffaffe8 +[0.102655625] LOG: I (365) example: Task[0x3ffb7660]: free memory @ 0x3ffaffe8 +[0.102666150] HEAP: Freed bytes @ 0x3ffaffe8 from task "free" on core 0 by: +/home/user/projects/esp/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:31 (discriminator 9) +/home/user/projects/esp/esp-idf/components/freertos/port.c:355 (discriminator 1) + +[0.202436200] HEAP: Allocated 3 bytes @ 0x3ffaffe8 from task "alloc" on core 0 by: +/home/user/projects/esp/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:47 +/home/user/projects/esp/esp-idf/components/freertos/port.c:355 (discriminator 1) + +[0.202451725] HEAP: Allocated 6 bytes @ 0x3ffafff0 from task "alloc" on core 0 by: +/home/user/projects/esp/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:48 +/home/user/projects/esp/esp-idf/components/freertos/port.c:355 (discriminator 1) + +[0.202538225] LOG: I (465) example: Task[0x3ffb6cf4]: allocated 6 bytes @ 0x3ffafff0 +[0.202654475] LOG: I (465) example: Task[0x3ffb7660]: free memory @ 0x3ffafff0 +[0.202667075] HEAP: Freed bytes @ 0x3ffafff0 from task "free" on core 0 by: +/home/user/projects/esp/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:31 (discriminator 9) +/home/user/projects/esp/esp-idf/components/freertos/port.c:355 (discriminator 1) + +[0.302436000] HEAP: Allocated 4 bytes @ 0x3ffafff0 from task "alloc" on core 0 by: +/home/user/projects/esp/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:47 +/home/user/projects/esp/esp-idf/components/freertos/port.c:355 (discriminator 1) + +[0.302451475] HEAP: Allocated 8 bytes @ 0x3ffb40b8 from task "alloc" on core 0 by: +/home/user/projects/esp/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:48 +/home/user/projects/esp/esp-idf/components/freertos/port.c:355 (discriminator 1) + +[0.302540900] LOG: I (565) example: Task[0x3ffb6cf4]: allocated 8 bytes @ 0x3ffb40b8 +[0.302657050] LOG: I (565) example: Task[0x3ffb7660]: free memory @ 0x3ffb40b8 +[0.302667500] HEAP: Freed bytes @ 0x3ffb40b8 from task "free" on core 0 by: +/home/user/projects/esp/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:31 (discriminator 9) +/home/user/projects/esp/esp-idf/components/freertos/port.c:355 (discriminator 1) + +Processing completed. +Processed 1027 events +=============== LOG TRACE REPORT =============== +Processed 8 log messages. +=============== HEAP TRACE REPORT =============== +Processed 14 heap events. +[0.002244575] HEAP: Allocated 1 bytes @ 0x3ffaffd8 from task "alloc" on core 0 by: +/home/user/projects/esp/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:47 +/home/user/projects/esp/esp-idf/components/freertos/port.c:355 (discriminator 1) + +[0.102436025] HEAP: Allocated 2 bytes @ 0x3ffaffe0 from task "alloc" on core 0 by: +/home/user/projects/esp/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:47 +/home/user/projects/esp/esp-idf/components/freertos/port.c:355 (discriminator 1) + +[0.202436200] HEAP: Allocated 3 bytes @ 0x3ffaffe8 from task "alloc" on core 0 by: +/home/user/projects/esp/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:47 +/home/user/projects/esp/esp-idf/components/freertos/port.c:355 (discriminator 1) + +[0.302436000] HEAP: Allocated 4 bytes @ 0x3ffafff0 from task "alloc" on core 0 by: +/home/user/projects/esp/esp-idf/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c:47 +/home/user/projects/esp/esp-idf/components/freertos/port.c:355 (discriminator 1) + +Found 10 leaked bytes in 4 blocks. +``` \ No newline at end of file diff --git a/examples/system/sysview_tracing_heap_log/SYSVIEW_FreeRTOS.txt b/examples/system/sysview_tracing_heap_log/SYSVIEW_FreeRTOS.txt new file mode 100644 index 0000000000..8162a5d968 --- /dev/null +++ b/examples/system/sysview_tracing_heap_log/SYSVIEW_FreeRTOS.txt @@ -0,0 +1,107 @@ +128 vTaskAllocateMPURegions xTask=%t pxRegions=%u +33 vTaskDelete xTaskToDelete=%t +34 vTaskDelay xTicksToDelay=%u +35 vTaskDelayUntil +129 uxTaskPriorityGet xTask=%t +56 uxTaskPriorityGetFromISR xTask=%t +130 eTaskGetState xTask=%t +55 vTaskPrioritySet xTask=%t uxNewPriority=%u +36 vTaskSuspend xTaskToSuspend=%t +40 vTaskResume xTaskToResume=%t +43 xTaskResumeFromISR xTaskToResume=%t +131 vTaskStartScheduler +132 vTaskEndScheduler +133 vTaskSuspendAll +134 xTaskResumeAll +135 xTaskGetTickCount +57 xTaskGetTickCountFromISR +136 uxTaskGetNumberOfTasks +137 pcTaskGetTaskName xTaskToQuery=%t +138 uxTaskGetStackHighWaterMark xTask=%t +139 vTaskSetApplicationTaskTag xTask=%t pxHookFunction=%u +140 xTaskGetApplicationTaskTag xTask=%t +141 vTaskSetThreadLocalStoragePointer xTaskToSet=%T xIndex=%u pvValue=%u +142 pvTaskGetThreadLocalStoragePointer xTaskToQuery=%T xIndex=%u +143 xTaskCallApplicationTaskHook xTask=%T pvParameter=%u +144 xTaskGetIdleTaskHandle +145 uxTaskGetSystemState pxTaskStatusArray=%u uxArraySize=%u pulTotalRunTime=%u +146 vTaskList pcWriteBuffer=%u +147 vTaskGetRunTimeStats pcWriteBuffer=%u +44 xTaskGenericNotify xTaskToNotify=%t ulValue=%u eAction=%u pulPreviousNotificationValue=%u +45 xTaskGenericNotifyFromISR xTaskToNotify=%t ulValue=%u eAction=%u pulPreviousNotificationValue=%u pxHigherPriorityTaskWoken=%u +46 xTaskNotifyWait ulBitsToClearOnEntry=%u ulBitsToClearOnExit=%u pulNotificationValue=%u xTicksToWait=%u +38 vTaskNotifyGiveFromISR xTaskToNotify=%t pxHigherPriorityTaskWoken=%u +37 ulTaskNotifyTake xClearCountOnExit=%u xTicksToWait=%u +148 xTaskNotifyStateClear xTask=%t +149 xTaskGetCurrentTaskHandle +150 vTaskSetTimeOutState pxTimeOut=%u +151 xTaskCheckForTimeOut pxTimeOut=%u pxTicksToWait=%u +152 vTaskMissedYield +153 xTaskGetSchedulerState +39 vTaskPriorityInherit pxMutexHolder=%p +42 xTaskPriorityDisinherit pxMutexHolder=%p +154 xTaskGenericCreate pxTaskCode=%u pcName=%u usStackDepth=%u pvParameters=%u uxPriority=%u pxCreatedTask=%u puxStackBuffer=%u xRegions=%u +155 uxTaskGetTaskNumber xTask=%u +156 vTaskSetTaskNumber xTask=%u uxHandle=%u +41 vTaskStepTick xTicksToJump=%u +157 eTaskConfirmSleepModeStatus +158 xTimerCreate pcTimerName=%u xTimerPeriodInTicks=%u uxAutoReload=%u pvTimerID=%u pxCallbackFunction=%u +159 pvTimerGetTimerID xTimer=%u +160 vTimerSetTimerID xTimer=%u pvNewID=%u +161 xTimerIsTimerActive xTimer=%u +162 xTimerGetTimerDaemonTaskHandle +163 xTimerPendFunctionCallFromISR xFunctionToPend=%u pvParameter1=%u ulParameter2=%u pxHigherPriorityTaskWoken=%u +164 xTimerPendFunctionCall xFunctionToPend=%u pvParameter1=%u ulParameter2=%u xTicksToWait=%u +165 pcTimerGetTimerName xTimer=%u +166 xTimerCreateTimerTask +167 xTimerGenericCommand xTimer=%u xCommandID=%u xOptionalValue=%u pxHigherPriorityTaskWoken=%u xTicksToWait=%u +53 xQueueGenericSend xQueue=%I pvItemToQueue=%p xTicksToWait=%u xCopyPosition=%u +50 xQueuePeekFromISR xQueue=%I pvBuffer=%p +49 xQueueGenericReceive xQueue=%I pvBuffer=%p xTicksToWait=%u xJustPeek=%u +168 uxQueueMessagesWaiting xQueue=%I +169 uxQueueSpacesAvailable xQueue=%I +48 vQueueDelete xQueue=%I +54 xQueueGenericSendFromISR xQueue=%I pvItemToQueue=%p pxHigherPriorityTaskWoken=%u xCopyPosition=%u +61 xQueueGiveFromISR xQueue=%I pxHigherPriorityTaskWoken=%u +51 xQueueReceiveFromISR xQueue=%I pvBuffer=%p pxHigherPriorityTaskWoken=%u +62 xQueueIsQueueEmptyFromISR xQueue=%I +63 xQueueIsQueueFullFromISR xQueue=%I +170 uxQueueMessagesWaitingFromISR xQueue=%I +171 xQueueAltGenericSend xQueue=%I pvItemToQueue=%p xTicksToWait=%u xCopyPosition=%u +172 xQueueAltGenericReceive xQueue=%I pvBuffer=%p xTicksToWait=%u xJustPeeking=%u +173 xQueueCRSendFromISR xQueue=%I pvItemToQueue=%p xCoRoutinePreviouslyWoken=%u +174 xQueueCRReceiveFromISR xQueue=%I pvBuffer=%p pxTaskWoken=%u +175 xQueueCRSend xQueue=%I pvItemToQueue=%p xTicksToWait=%u +176 xQueueCRReceive xQueue=%I pvBuffer=%p xTicksToWait=%u +177 xQueueCreateMutex ucQueueType=%u +178 xQueueCreateCountingSemaphore uxMaxCount=%u uxInitialCount=%u +179 xQueueGetMutexHolder xSemaphore=%u +180 xQueueTakeMutexRecursive xMutex=%u xTicksToWait=%u +181 xQueueGiveMutexRecursive pxMutex=%u +52 vQueueAddToRegistry xQueue=%I pcName=%u +182 vQueueUnregisterQueue xQueue=%I +47 xQueueGenericCreate uxQueueLength=%u uxItemSize=%u ucQueueType=%u +183 xQueueCreateSet uxEventQueueLength=%u +184 xQueueAddToSet xQueueOrSemaphore=%u xQueueSet=%u +185 xQueueRemoveFromSet xQueueOrSemaphore=%u xQueueSet=%u +186 xQueueSelectFromSet xQueueSet=%u xTicksToWait=%u +187 xQueueSelectFromSetFromISR xQueueSet=%u +188 xQueueGenericReset xQueue=%I xNewQueue=%u +189 vListInitialise pxList=%u +190 vListInitialiseItem pxItem=%u +191 vListInsert pxList=%u pxNewListItem=%u +192 vListInsertEnd pxList=%u pxNewListItem=%u +193 uxListRemove pxItemToRemove=%u +194 xEventGroupCreate +195 xEventGroupWaitBits xEventGroup=%u uxBitsToWaitFor=%u xClearOnExit=%u xWaitForAllBits=%u xTicksToWait=%u +196 xEventGroupClearBits xEventGroup=%u uxBitsToClear=%u +58 xEventGroupClearBitsFromISR xEventGroup=%u uxBitsToSet=%u +197 xEventGroupSetBits xEventGroup=%u uxBitsToSet=%u +59 xEventGroupSetBitsFromISR xEventGroup=%u uxBitsToSet=%u pxHigherPriorityTaskWoken=%u +198 xEventGroupSync xEventGroup=%u uxBitsToSet=%u uxBitsToWaitFor=%u xTicksToWait=%u +60 xEventGroupGetBitsFromISR xEventGroup=%u +199 vEventGroupDelete xEventGroup=%u +200 uxEventGroupGetNumber xEventGroup=%u + +512 esp_sysview_heap_trace_alloc addr=%p size=%u callers=%x +513 esp_sysview_heap_trace_free addr=%p callers=%x diff --git a/examples/system/sysview_tracing_heap_log/gdbinit b/examples/system/sysview_tracing_heap_log/gdbinit new file mode 100644 index 0000000000..f68ad1880f --- /dev/null +++ b/examples/system/sysview_tracing_heap_log/gdbinit @@ -0,0 +1,17 @@ +target remote :3333 + +mon reset halt +flushregs + +tb heap_trace_start +commands +mon esp32 sysview start file:///tmp/heap_log.svdat +c +end + +tb heap_trace_stop +commands +mon esp32 sysview stop +end + +c diff --git a/examples/system/sysview_tracing_heap_log/main/CMakeLists.txt b/examples/system/sysview_tracing_heap_log/main/CMakeLists.txt new file mode 100644 index 0000000000..58d592c8b2 --- /dev/null +++ b/examples/system/sysview_tracing_heap_log/main/CMakeLists.txt @@ -0,0 +1,4 @@ +set(COMPONENT_SRCS "sysview_heap_log.c") +set(COMPONENT_ADD_INCLUDEDIRS ".") + +register_component() diff --git a/examples/system/sysview_tracing_heap_log/main/component.mk b/examples/system/sysview_tracing_heap_log/main/component.mk new file mode 100644 index 0000000000..44bd2b5273 --- /dev/null +++ b/examples/system/sysview_tracing_heap_log/main/component.mk @@ -0,0 +1,3 @@ +# +# Main Makefile. This is basically the same as a component makefile. +# diff --git a/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c b/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c new file mode 100644 index 0000000000..d34c93de61 --- /dev/null +++ b/examples/system/sysview_tracing_heap_log/main/sysview_heap_log.c @@ -0,0 +1,75 @@ +/* Application Trace to Host Example + + This example code is in the Public Domain (or CC0 licensed, at your option.) + + Unless required by applicable law or agreed to in writing, this + software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + CONDITIONS OF ANY KIND, either express or implied. +*/ + +#include "esp_sysview_trace.h" +#include "esp_heap_trace.h" +#include "esp_log.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/queue.h" + + +static const char *TAG = "example"; + +// waits on queue for memory addresses and frees memory allocated by 'alloc_task' +static void free_task(void *p) +{ + QueueHandle_t queue = (QueueHandle_t)p; + while (1) { + void *p = NULL; + if (xQueueReceive(queue, ( void * )&p, portMAX_DELAY) != pdPASS) { + ESP_LOGE(TAG, "Failed to send to queue!"); + } else { + ESP_LOGI(TAG, "Task[%p]: free memory @ %p", xTaskGetCurrentTaskHandle(), p); + free(p); + } + } +} + +// allocates memory and puts addresses to the queue +static void alloc_task(void *p) +{ + QueueHandle_t queue = (QueueHandle_t)p; + + xTaskCreatePinnedToCore(free_task, "free", 2048, queue, 5, NULL, portNUM_PROCESSORS-1); + + // here GDB will stop at brekpoint and execute OpenOCD command to start tracing + heap_trace_start(HEAP_TRACE_ALL); + for(int i = 1; i < 5; i++) { + uint32_t sz = 2*i; + void *p = malloc(sz/2); + // WARNING: the previous allocated memory is intentionally not deallocated in order to cause memory leak! + p = malloc(sz); + ESP_LOGI(TAG, "Task[%p]: allocated %d bytes @ %p", xTaskGetCurrentTaskHandle(), sz, p); + if (xQueueSend(queue, ( void * )&p, portMAX_DELAY) != pdPASS) { + ESP_LOGE(TAG, "Failed to send to queue!"); + } + vTaskDelay(100/portTICK_PERIOD_MS); + } + // here GDB will stop at brekpoint and execute OpenOCD command to stop tracing + heap_trace_stop(); + while(1); +} + +void app_main() +{ + // redirect log messages to the host using SystemView tracing module + esp_log_set_vprintf(&esp_sysview_vprintf); + QueueHandle_t queue = xQueueCreate(10, sizeof(void *)); + if(queue == 0) { + ESP_LOGE(TAG, "Failed to create queue!"); + return; + } + // init host-based heap tracing + if(heap_trace_init_tohost() != ESP_OK) { + ESP_LOGE(TAG, "Failed to init heap trace!"); + return; + } + xTaskCreatePinnedToCore(alloc_task, "alloc", 2048, queue, 5, NULL, 0); +} diff --git a/examples/system/sysview_tracing_heap_log/sdkconfig.defaults b/examples/system/sysview_tracing_heap_log/sdkconfig.defaults new file mode 100644 index 0000000000..26ca10d1df --- /dev/null +++ b/examples/system/sysview_tracing_heap_log/sdkconfig.defaults @@ -0,0 +1,28 @@ +# Enable single core mode by default +CONFIG_MEMMAP_SMP=n +CONFIG_FREERTOS_UNICORE=y +# 1ms tick period +CONFIG_FREERTOS_HZ=1000 +# Enable application tracing by default +CONFIG_ESP32_APPTRACE_DEST_TRAX=y +CONFIG_ESP32_APPTRACE_ENABLE=y +# Enable FreeRTOS SystemView Tracing by default +CONFIG_SYSVIEW_ENABLE=y +CONFIG_SYSVIEW_TS_SOURCE_TIMER_00=y +CONFIG_SYSVIEW_EVT_OVERFLOW_ENABLE=y +CONFIG_SYSVIEW_EVT_ISR_ENTER_ENABLE=y +CONFIG_SYSVIEW_EVT_ISR_EXIT_ENABLE=y +CONFIG_SYSVIEW_EVT_ISR_TO_SCHEDULER_ENABLE=y +CONFIG_SYSVIEW_EVT_TASK_START_EXEC_ENABLE=y +CONFIG_SYSVIEW_EVT_TASK_STOP_EXEC_ENABLE=y +CONFIG_SYSVIEW_EVT_TASK_START_READY_ENABLE=y +CONFIG_SYSVIEW_EVT_TASK_STOP_READY_ENABLE=y +CONFIG_SYSVIEW_EVT_TASK_CREATE_ENABLE=y +CONFIG_SYSVIEW_EVT_TASK_TERMINATE_ENABLE=y +CONFIG_SYSVIEW_EVT_IDLE_ENABLE=y +CONFIG_SYSVIEW_EVT_TIMER_ENTER_ENABLE=y +CONFIG_SYSVIEW_EVT_TIMER_EXIT_ENABLE=y +# Disable color output in logs +CONFIG_LOG_COLORS= +# Enable heap tracing to host +CONFIG_HEAP_TRACING_TOHOST=y diff --git a/requirements.txt b/requirements.txt index 97d9bd0576..db38a1c0c3 100644 --- a/requirements.txt +++ b/requirements.txt @@ -8,4 +8,5 @@ setuptools pyserial>=3.0 future>=0.15.2 cryptography>=2.1.4 -pyparsing>=2.0.3 \ No newline at end of file +pyparsing>=2.0.3 +pyelftools>=0.22 diff --git a/tools/ci/executable-list.txt b/tools/ci/executable-list.txt index 8e4238344e..75a8e9d106 100644 --- a/tools/ci/executable-list.txt +++ b/tools/ci/executable-list.txt @@ -34,8 +34,10 @@ tools/ci/test_build_system_cmake.sh tools/ci/test_configure_ci_environment.sh tools/cmake/convert_to_cmake.py tools/cmake/run_cmake_lint.sh -tools/esp_app_trace/apptrace_proc.py tools/esp_app_trace/logtrace_proc.py +tools/esp_app_trace/sysviewtrace_proc.py +tools/esp_app_trace/test/logtrace/test.sh +tools/esp_app_trace/test/sysview/test.sh tools/format.sh tools/gen_esp_err_to_name.py tools/idf.py diff --git a/tools/esp_app_trace/SYSVIEW_FreeRTOS.txt b/tools/esp_app_trace/SYSVIEW_FreeRTOS.txt new file mode 100644 index 0000000000..8162a5d968 --- /dev/null +++ b/tools/esp_app_trace/SYSVIEW_FreeRTOS.txt @@ -0,0 +1,107 @@ +128 vTaskAllocateMPURegions xTask=%t pxRegions=%u +33 vTaskDelete xTaskToDelete=%t +34 vTaskDelay xTicksToDelay=%u +35 vTaskDelayUntil +129 uxTaskPriorityGet xTask=%t +56 uxTaskPriorityGetFromISR xTask=%t +130 eTaskGetState xTask=%t +55 vTaskPrioritySet xTask=%t uxNewPriority=%u +36 vTaskSuspend xTaskToSuspend=%t +40 vTaskResume xTaskToResume=%t +43 xTaskResumeFromISR xTaskToResume=%t +131 vTaskStartScheduler +132 vTaskEndScheduler +133 vTaskSuspendAll +134 xTaskResumeAll +135 xTaskGetTickCount +57 xTaskGetTickCountFromISR +136 uxTaskGetNumberOfTasks +137 pcTaskGetTaskName xTaskToQuery=%t +138 uxTaskGetStackHighWaterMark xTask=%t +139 vTaskSetApplicationTaskTag xTask=%t pxHookFunction=%u +140 xTaskGetApplicationTaskTag xTask=%t +141 vTaskSetThreadLocalStoragePointer xTaskToSet=%T xIndex=%u pvValue=%u +142 pvTaskGetThreadLocalStoragePointer xTaskToQuery=%T xIndex=%u +143 xTaskCallApplicationTaskHook xTask=%T pvParameter=%u +144 xTaskGetIdleTaskHandle +145 uxTaskGetSystemState pxTaskStatusArray=%u uxArraySize=%u pulTotalRunTime=%u +146 vTaskList pcWriteBuffer=%u +147 vTaskGetRunTimeStats pcWriteBuffer=%u +44 xTaskGenericNotify xTaskToNotify=%t ulValue=%u eAction=%u pulPreviousNotificationValue=%u +45 xTaskGenericNotifyFromISR xTaskToNotify=%t ulValue=%u eAction=%u pulPreviousNotificationValue=%u pxHigherPriorityTaskWoken=%u +46 xTaskNotifyWait ulBitsToClearOnEntry=%u ulBitsToClearOnExit=%u pulNotificationValue=%u xTicksToWait=%u +38 vTaskNotifyGiveFromISR xTaskToNotify=%t pxHigherPriorityTaskWoken=%u +37 ulTaskNotifyTake xClearCountOnExit=%u xTicksToWait=%u +148 xTaskNotifyStateClear xTask=%t +149 xTaskGetCurrentTaskHandle +150 vTaskSetTimeOutState pxTimeOut=%u +151 xTaskCheckForTimeOut pxTimeOut=%u pxTicksToWait=%u +152 vTaskMissedYield +153 xTaskGetSchedulerState +39 vTaskPriorityInherit pxMutexHolder=%p +42 xTaskPriorityDisinherit pxMutexHolder=%p +154 xTaskGenericCreate pxTaskCode=%u pcName=%u usStackDepth=%u pvParameters=%u uxPriority=%u pxCreatedTask=%u puxStackBuffer=%u xRegions=%u +155 uxTaskGetTaskNumber xTask=%u +156 vTaskSetTaskNumber xTask=%u uxHandle=%u +41 vTaskStepTick xTicksToJump=%u +157 eTaskConfirmSleepModeStatus +158 xTimerCreate pcTimerName=%u xTimerPeriodInTicks=%u uxAutoReload=%u pvTimerID=%u pxCallbackFunction=%u +159 pvTimerGetTimerID xTimer=%u +160 vTimerSetTimerID xTimer=%u pvNewID=%u +161 xTimerIsTimerActive xTimer=%u +162 xTimerGetTimerDaemonTaskHandle +163 xTimerPendFunctionCallFromISR xFunctionToPend=%u pvParameter1=%u ulParameter2=%u pxHigherPriorityTaskWoken=%u +164 xTimerPendFunctionCall xFunctionToPend=%u pvParameter1=%u ulParameter2=%u xTicksToWait=%u +165 pcTimerGetTimerName xTimer=%u +166 xTimerCreateTimerTask +167 xTimerGenericCommand xTimer=%u xCommandID=%u xOptionalValue=%u pxHigherPriorityTaskWoken=%u xTicksToWait=%u +53 xQueueGenericSend xQueue=%I pvItemToQueue=%p xTicksToWait=%u xCopyPosition=%u +50 xQueuePeekFromISR xQueue=%I pvBuffer=%p +49 xQueueGenericReceive xQueue=%I pvBuffer=%p xTicksToWait=%u xJustPeek=%u +168 uxQueueMessagesWaiting xQueue=%I +169 uxQueueSpacesAvailable xQueue=%I +48 vQueueDelete xQueue=%I +54 xQueueGenericSendFromISR xQueue=%I pvItemToQueue=%p pxHigherPriorityTaskWoken=%u xCopyPosition=%u +61 xQueueGiveFromISR xQueue=%I pxHigherPriorityTaskWoken=%u +51 xQueueReceiveFromISR xQueue=%I pvBuffer=%p pxHigherPriorityTaskWoken=%u +62 xQueueIsQueueEmptyFromISR xQueue=%I +63 xQueueIsQueueFullFromISR xQueue=%I +170 uxQueueMessagesWaitingFromISR xQueue=%I +171 xQueueAltGenericSend xQueue=%I pvItemToQueue=%p xTicksToWait=%u xCopyPosition=%u +172 xQueueAltGenericReceive xQueue=%I pvBuffer=%p xTicksToWait=%u xJustPeeking=%u +173 xQueueCRSendFromISR xQueue=%I pvItemToQueue=%p xCoRoutinePreviouslyWoken=%u +174 xQueueCRReceiveFromISR xQueue=%I pvBuffer=%p pxTaskWoken=%u +175 xQueueCRSend xQueue=%I pvItemToQueue=%p xTicksToWait=%u +176 xQueueCRReceive xQueue=%I pvBuffer=%p xTicksToWait=%u +177 xQueueCreateMutex ucQueueType=%u +178 xQueueCreateCountingSemaphore uxMaxCount=%u uxInitialCount=%u +179 xQueueGetMutexHolder xSemaphore=%u +180 xQueueTakeMutexRecursive xMutex=%u xTicksToWait=%u +181 xQueueGiveMutexRecursive pxMutex=%u +52 vQueueAddToRegistry xQueue=%I pcName=%u +182 vQueueUnregisterQueue xQueue=%I +47 xQueueGenericCreate uxQueueLength=%u uxItemSize=%u ucQueueType=%u +183 xQueueCreateSet uxEventQueueLength=%u +184 xQueueAddToSet xQueueOrSemaphore=%u xQueueSet=%u +185 xQueueRemoveFromSet xQueueOrSemaphore=%u xQueueSet=%u +186 xQueueSelectFromSet xQueueSet=%u xTicksToWait=%u +187 xQueueSelectFromSetFromISR xQueueSet=%u +188 xQueueGenericReset xQueue=%I xNewQueue=%u +189 vListInitialise pxList=%u +190 vListInitialiseItem pxItem=%u +191 vListInsert pxList=%u pxNewListItem=%u +192 vListInsertEnd pxList=%u pxNewListItem=%u +193 uxListRemove pxItemToRemove=%u +194 xEventGroupCreate +195 xEventGroupWaitBits xEventGroup=%u uxBitsToWaitFor=%u xClearOnExit=%u xWaitForAllBits=%u xTicksToWait=%u +196 xEventGroupClearBits xEventGroup=%u uxBitsToClear=%u +58 xEventGroupClearBitsFromISR xEventGroup=%u uxBitsToSet=%u +197 xEventGroupSetBits xEventGroup=%u uxBitsToSet=%u +59 xEventGroupSetBitsFromISR xEventGroup=%u uxBitsToSet=%u pxHigherPriorityTaskWoken=%u +198 xEventGroupSync xEventGroup=%u uxBitsToSet=%u uxBitsToWaitFor=%u xTicksToWait=%u +60 xEventGroupGetBitsFromISR xEventGroup=%u +199 vEventGroupDelete xEventGroup=%u +200 uxEventGroupGetNumber xEventGroup=%u + +512 esp_sysview_heap_trace_alloc addr=%p size=%u callers=%x +513 esp_sysview_heap_trace_free addr=%p callers=%x diff --git a/tools/esp_app_trace/apptrace_proc.py b/tools/esp_app_trace/apptrace_proc.py deleted file mode 100755 index 6698591361..0000000000 --- a/tools/esp_app_trace/apptrace_proc.py +++ /dev/null @@ -1,130 +0,0 @@ -#!/usr/bin/env python -# - -from __future__ import print_function -import argparse -import struct -import sys - - -class bcolors: - HEADER = '\033[95m' - OKBLUE = '\033[94m' - OKGREEN = '\033[92m' - WARNING = '\033[93m' - FAIL = '\033[91m' - ENDC = '\033[0m' - BOLD = '\033[1m' - UNDERLINE = '\033[4m' - - -def main(): - ESP32_TRACE_BLOCK_HDR_SZ = 8 - ESP32_TRACE_BLOCK_TASK_IDX = 0 - ESP32_TRACE_BLOCK_TS_IDX = 1 - ESP32_TRACE_BLOCK_DATA_IDX = 2 - - parser = argparse.ArgumentParser(description='ESP32 App Trace Parse Tool') - - parser.add_argument('file', help='Path to app trace file', type=str) - parser.add_argument('--print-tasks', '-p', help='Print tasks', action='store_true') - parser.add_argument('--print-details', '-d', help='Print detailed stats', action='store_true') - parser.add_argument('--no-errors', '-n', help='Do not print errors', action='store_true') - parser.add_argument('--block-len', '-b', help='Block length', type=int, default=1024) - - args = parser.parse_args() - - print("====================================================================") - try: - ftrc = open(args.file, 'rb') - except IOError as e: - print("Failed to open trace file (%s)!" % e) - sys.exit(2) - - passed = True - off = 0 - data_stats = {} - last_ts = None - tot_discont = 0 - while True: - # ftrc.seek(off) - task = None - ts = 0 - trc_buf = ftrc.read(args.block_len) - if len(trc_buf) == 0: - # print('EOF') - break - trc_data = struct.unpack('= ts: - # print("Global TS discontinuity %x -> %x, task %x, stamp %x at %x" % (last_ts, ts, task, - # data_stats[task]['stamp'], off)) - if args.print_details: - print("Global TS discontinuity %x -> %x, task %x at %x" % (last_ts, ts, task, off)) - # tot_discont += 1 - # passed = False - last_ts = ts - if task not in data_stats: - print("%x: NEW TASK" % task) - data_stats[task] = {'stamp': trc_data[ESP32_TRACE_BLOCK_DATA_IDX], 'last_ts': ts, 'count': 1, 'discont_offs': [], 'inv_stamps_offs': []} - else: - if data_stats[task]['last_ts'] == ts: - print("Task TS discontinuity %x -> %x, task %x, stamp %x at %x" % (last_ts, ts, task, data_stats[task]['stamp'], off)) - data_stats[task]['discont_offs'].append(off) - tot_discont += 1 - passed = False - data_stats[task]['last_ts'] = ts - data_stats[task]['count'] += 1 - if len(trc_data) > ESP32_TRACE_BLOCK_DATA_IDX: - # print("DATA = %x %x %x %x" % (trc_data[-4], trc_data[-3], trc_data[-2], trc_data[-1])) - if args.print_tasks: - print("Task[%d] %x, ts %08x, stamp %x" % (off / args.block_len, task, ts, trc_data[ESP32_TRACE_BLOCK_DATA_IDX])) - else: - print("%x: NO DATA" % task) - else: - print("Failed to unpack data!") - sys.exit(2) - - # check data - for i in range(ESP32_TRACE_BLOCK_DATA_IDX, len(trc_data)): - if trc_data[i] != data_stats[task]['stamp']: - if not args.no_errors: - print("Invalid stamp %x->%x at %x, task %x" % (data_stats[task]['stamp'], trc_data[i], off + ESP32_TRACE_BLOCK_HDR_SZ + i, task)) - passed = False - data_stats[task]['stamp'] = trc_data[i] - data_stats[task]['inv_stamps_offs'].append(off) -# break - if len(trc_buf) < args.block_len: - print('Last block (not full)') - break - - if data_stats[task]['stamp'] is not None: - data_stats[task]['stamp'] = (data_stats[task]['stamp'] + 1) & 0xFF -# print("stamp=%x" % data_stats[task][ESP32_TRACE_STAMP_IDX]) - off += args.block_len - - ftrc.close() - print("====================================================================") - print("Trace size %d bytes, discont %d\n" % (off, tot_discont)) - for t in data_stats: - print("Task %x. Total count %d. Inv stamps %d. TS Discontinuities %d." % (t, data_stats[t]['count'], - len(data_stats[t]['inv_stamps_offs']), len(data_stats[t]['discont_offs']))) - if args.print_details: - print('Invalid stamps offs: [{}]'.format(', '.join(hex(x) for x in data_stats[t]['inv_stamps_offs']))) - print('TS Discontinuities offs: [{}]'.format(', '.join(hex(x) for x in data_stats[t]['discont_offs']))) - print("\n") - - if passed: - print("Data - OK") - else: - print("Data - FAILED!") - - -if __name__ == '__main__': - main() diff --git a/tools/esp_app_trace/espytrace/README.md b/tools/esp_app_trace/espytrace/README.md new file mode 100644 index 0000000000..af9119f238 --- /dev/null +++ b/tools/esp_app_trace/espytrace/README.md @@ -0,0 +1,5 @@ +# espytrace Python package + +This package implements base routines and classes for processing ESP32 application level trace data. +- `apptrace.py` includes functionality which is common for all types of trace data. +- `sysview.py` includes functionality which is specific for SystemView trace data format. diff --git a/tools/esp_app_trace/espytrace/__init__.py b/tools/esp_app_trace/espytrace/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tools/esp_app_trace/espytrace/apptrace.py b/tools/esp_app_trace/espytrace/apptrace.py new file mode 100644 index 0000000000..b793ce64f7 --- /dev/null +++ b/tools/esp_app_trace/espytrace/apptrace.py @@ -0,0 +1,720 @@ +import os +try: + from urlparse import urlparse +except ImportError: + from urllib.parse import urlparse +try: + import SocketServer +except ImportError: + import socketserver as SocketServer +import threading +import tempfile +import time +import subprocess +import os.path +import elftools.elf.elffile as elffile +import elftools.elf.constants as elfconst + + +def addr2line(toolchain, elf_path, addr): + """ + Creates trace reader. + + Parameters + ---------- + toolchain : string + toolchain prefix to retrieve source line locations using addresses + elf_path : string + path to ELF file to use + addr : int + address to retrieve source line location + + Returns + ------- + string + source line location string + """ + try: + return subprocess.check_output(['%saddr2line' % toolchain, '-e', elf_path, '0x%x' % addr]).decode("utf-8") + except subprocess.CalledProcessError: + return '' + + +class ParseError(RuntimeError): + """ + Parse error exception + """ + def __init__(self, message): + RuntimeError.__init__(self, message) + + +class ReaderError(RuntimeError): + """ + Trace reader error exception + """ + def __init__(self, message): + RuntimeError.__init__(self, message) + + +class ReaderTimeoutError(ReaderError): + """ + Trace reader timeout error + """ + def __init__(self, tmo, sz): + ReaderError.__init__(self, 'Timeout %f sec while reading %d bytes!' % (tmo, sz)) + + +class ReaderShutdownRequest(ReaderError): + """ + Trace reader shutdown request error + Raised when user presses CTRL+C (SIGINT). + """ + def __init__(self): + ReaderError.__init__(self, 'Shutdown request!') + + +class Reader: + """ + Base abstract reader class + """ + def __init__(self, tmo): + """ + Constructor + + Parameters + ---------- + tmo : int + read timeout + """ + self.timeout = tmo + self.need_stop = False + + def read(self, sz): + """ + Reads a number of bytes + + Parameters + ---------- + sz : int + number of bytes to read + + Returns + ------- + bytes object + read bytes + + Returns + ------- + ReaderTimeoutError + if timeout expires + ReaderShutdownRequest + if SIGINT was received during reading + """ + pass + + def readline(self): + """ + Reads line + + Parameters + ---------- + sz : int + number of bytes to read + + Returns + ------- + string + read line + """ + pass + + def forward(self, sz): + """ + Moves read pointer to a number of bytes + + Parameters + ---------- + sz : int + number of bytes to read + """ + pass + + def cleanup(self): + """ + Cleans up reader + """ + self.need_stop = True + + +class FileReader(Reader): + """ + File reader class + """ + def __init__(self, path, tmo): + """ + Constructor + + Parameters + ---------- + path : string + path to file to read + tmo : int + see Reader.__init__() + """ + Reader.__init__(self, tmo) + self.trace_file_path = path + self.trace_file = open(path, 'rb') + + def read(self, sz): + """ + see Reader.read() + """ + data = b'' + start_tm = time.clock() + while not self.need_stop: + data += self.trace_file.read(sz - len(data)) + if len(data) == sz: + break + if self.timeout != -1 and time.clock() >= start_tm + self.timeout: + raise ReaderTimeoutError(self.timeout, sz) + if self.need_stop: + raise ReaderShutdownRequest() + return data + + def get_pos(self): + """ + Retrieves current file read position + + Returns + ------- + int + read position + """ + return self.trace_file.tell() + + def readline(self, linesep=os.linesep): + """ + see Reader.read() + """ + line = '' + start_tm = time.clock() + while not self.need_stop: + line += self.trace_file.readline().decode("utf-8") + if line.endswith(linesep): + break + if self.timeout != -1 and time.clock() >= start_tm + self.timeout: + raise ReaderTimeoutError(self.timeout, 1) + if self.need_stop: + raise ReaderShutdownRequest() + return line + + def forward(self, sz): + """ + see Reader.read() + """ + cur_pos = self.trace_file.tell() + start_tm = time.clock() + while not self.need_stop: + file_sz = os.path.getsize(self.trace_file_path) + if file_sz - cur_pos >= sz: + break + if self.timeout != -1 and time.clock() >= start_tm + self.timeout: + raise ReaderTimeoutError(self.timeout, sz) + if self.need_stop: + raise ReaderShutdownRequest() + self.trace_file.seek(sz, os.SEEK_CUR) + + +class NetRequestHandler: + """ + Handler for incoming network requests (connections, datagrams) + """ + def handle(self): + while not self.server.need_stop: + data = self.rfile.read(1024) + if len(data) == 0: + break + self.server.wtrace.write(data) + self.server.wtrace.flush() + + +class NetReader(FileReader): + """ + Base netwoek socket reader class + """ + def __init__(self, tmo): + """ + see Reader.__init__() + """ + fhnd,fname = tempfile.mkstemp() + FileReader.__init__(self, fname, tmo) + self.wtrace = os.fdopen(fhnd, 'wb') + self.server_thread = threading.Thread(target=self.serve_forever) + self.server_thread.start() + + def cleanup(self): + """ + see Reader.cleanup() + """ + FileReader.cleanup(self) + self.shutdown() + self.server_close() + self.server_thread.join() + time.sleep(0.1) + self.trace_file.close() + self.wtrace.close() + + +class TCPRequestHandler(NetRequestHandler, SocketServer.StreamRequestHandler): + """ + Handler for incoming TCP connections + """ + pass + + +class TCPReader(NetReader, SocketServer.TCPServer): + """ + TCP socket reader class + """ + def __init__(self, host, port, tmo): + """ + Constructor + + Parameters + ---------- + host : string + see SocketServer.BaseServer.__init__() + port : int + see SocketServer.BaseServer.__init__() + tmo : int + see Reader.__init__() + """ + SocketServer.TCPServer.__init__(self, (host, port), TCPRequestHandler) + NetReader.__init__(self, tmo) + + +class UDPRequestHandler(NetRequestHandler, SocketServer.DatagramRequestHandler): + """ + Handler for incoming UDP datagrams + """ + pass + + +class UDPReader(NetReader, SocketServer.UDPServer): + """ + UDP socket reader class + """ + def __init__(self, host, port, tmo): + """ + Constructor + + Parameters + ---------- + host : string + see SocketServer.BaseServer.__init__() + port : int + see SocketServer.BaseServer.__init__() + tmo : int + see Reader.__init__() + """ + SocketServer.UDPServer.__init__(self, (host, port), UDPRequestHandler) + NetReader.__init__(self, tmo) + + +def reader_create(trc_src, tmo): + """ + Creates trace reader. + + Parameters + ---------- + trc_src : string + trace source URL. Supports 'file:///path/to/file' or (tcp|udp)://host:port + tmo : int + read timeout + + Returns + ------- + Reader + reader object or None if URL scheme is not supported + """ + url = urlparse(trc_src) + if len(url.scheme) == 0 or url.scheme == 'file': + if os.name == 'nt': + # workaround for Windows path + return FileReader(trc_src[7:], tmo) + else: + return FileReader(url.path, tmo) + if url.scheme == 'tcp': + return TCPReader(url.hostname, url.port, tmo) + if url.scheme == 'udp': + return UDPReader(url.hostname, url.port, tmo) + return None + + +class TraceDataProcessor: + """ + Base abstract class for all trace data processors. + """ + def __init__(self, print_events, keep_all_events=False): + """ + Constructor. + + Parameters + ---------- + print_events : bool + if True every event will be printed as they arrive + keep_all_events : bool + if True all events will be kept in self.events in the order they arrive + """ + self.print_events = print_events + self.keep_all_events = keep_all_events + self.total_events = 0 + self.events = [] + # This can be changed by the root procesor that includes several sub-processors. + # It is used access some method of root processor which can contain methods/data common for all sub-processors. + # Common info could be current execution context, info about running tasks, available IRQs etc. + self.root_proc = self + + def _print_event(self, event): + """ + Base method to print an event. + + Parameters + ---------- + event : object + Event object + """ + print("EVENT[{:d}]: {}".format(self.total_events, event)) + + def print_report(self): + """ + Base method to print report. + """ + print("Processed {:d} events".format(self.total_events)) + + def cleanup(self): + """ + Base method to make cleanups. + """ + pass + + def on_new_event(self, event): + """ + Base method to process event. + """ + if self.print_events: + self._print_event(event) + if self.keep_all_events: + self.events.append(event) + self.total_events += 1 + + +class LogTraceParseError(ParseError): + """ + Log trace parse error exception. + """ + pass + + +def get_str_from_elf(felf, str_addr): + """ + Retrieves string from ELF file. + + Parameters + ---------- + felf : elffile.ELFFile + open ELF file handle to retrive format string from + str_addr : int + address of the string + + Returns + ------- + string + string or None if it was not found + """ + tgt_str = '' + for sect in felf.iter_sections(): + if sect['sh_addr'] == 0 or (sect['sh_flags'] & elfconst.SH_FLAGS.SHF_ALLOC) == 0: + continue + if str_addr < sect['sh_addr'] or str_addr >= sect['sh_addr'] + sect['sh_size']: + continue + sec_data = sect.data() + for i in range(str_addr - sect['sh_addr'], sect['sh_size']): + if type(sec_data) is str: + ch = sec_data[i] + else: + ch = str(chr(sec_data[i])) + if ch == '\0': + break + tgt_str += ch + if len(tgt_str) > 0: + return tgt_str + return None + + +class LogTraceEvent: + """ + Log trace event. + """ + def __init__(self, fmt_addr, log_args): + """ + Constructor. + + Parameters + ---------- + fmt_addr : int + address of the format string + log_args : list + list of log message arguments + """ + self.fmt_addr = fmt_addr + self.args = log_args + + def get_message(self, felf): + """ + Retrieves log message. + + Parameters + ---------- + felf : elffile.ELFFile + open ELF file handle to retrive format string from + + Returns + ------- + string + formatted log message + + Raises + ------ + LogTraceParseError + if format string has not been found in ELF file + """ + fmt_str = get_str_from_elf(felf, self.fmt_addr) + if not fmt_str: + raise LogTraceParseError('Failed to find format string for 0x%x' % self.fmt_addr) + prcnt_idx = 0 + for i, arg in enumerate(self.args): + prcnt_idx = fmt_str.find('%', prcnt_idx, -2) # TODO: check str ending with % + if prcnt_idx == -1: + break + prcnt_idx += 1 # goto next char + if fmt_str[prcnt_idx] == 's': + # find string + arg_str = get_str_from_elf(felf, self.args[i]) + if arg_str: + self.args[i] = arg_str + else: + self.args[i] = '' + fmt_str = fmt_str.replace('%p', '%x') + return fmt_str % tuple(self.args) + + +class BaseLogTraceDataProcessorImpl: + """ + Base implementation for log data processors. + """ + def __init__(self, print_log_events=False, elf_path=''): + """ + Constructor. + + Parameters + ---------- + print_log_events : bool + if True every log event will be printed as they arrive + elf_path : string + path to ELF file to retrieve format strings for log messages + """ + if len(elf_path): + self.felf = elffile.ELFFile(open(elf_path, 'rb')) + else: + self.felf = None + self.print_log_events = print_log_events + self.messages = [] + + def cleanup(self): + """ + Cleanup + """ + if self.felf: + self.felf.stream.close() + + def print_report(self): + """ + Prints log report + """ + print("=============== LOG TRACE REPORT ===============") + print("Processed {:d} log messages.".format(len(self.messages))) + + def on_new_event(self, event): + """ + Processes log events. + + Parameters + ---------- + event : LogTraceEvent + Event object. + """ + msg = event.get_message(self.felf) + self.messages.append(msg) + if self.print_log_events: + print(msg), + + +class HeapTraceParseError(ParseError): + """ + Heap trace parse error exception. + """ + pass + + +class HeapTraceDuplicateAllocError(HeapTraceParseError): + """ + Heap trace duplicate allocation error exception. + """ + def __init__(self, addr, new_size, prev_size): + """ + Constructor. + + Parameters + ---------- + addr : int + memory block address + new_size : int + size of the new allocation + prev_size : int + size of the previous allocation + """ + HeapTraceParseError.__init__(self, """Duplicate alloc @ 0x{:x}! + New alloc is {:d} bytes, + previous is {:d} bytes.""".format(addr, new_size, prev_size)) + + +class HeapTraceEvent: + """ + Heap trace event. + """ + def __init__(self, ctx_name, in_irq, core_id, ts, alloc, size, addr, callers, toolchain='', elf_path=''): + """ + Constructor. + + Parameters + ---------- + ctx_name : string + name of event context (task or IRQ name) + in_irq : bool + True if event has been generated in IRQ context, otherwise False + core_id : int + core which generated the event + ts : float + event timestamp + alloc : bool + True for allocation event, otherwise False + size : int + size of allocation; has no meaning for de-allocation event + addr : int + address of allocation/de-allocation + callers : list + list of callers (callstack) for event + toolchain_pref : string + toolchain prefix to retrieve source line locations using addresses + elf_path : string + path to ELF file to retrieve format strings for log messages + """ + self.ctx_name = ctx_name + self.in_irq = in_irq + self.core_id = core_id + self.ts = ts + self.alloc = alloc + self.size = size + self.addr = addr + self.callers = callers + self.toolchain = toolchain + self.elf_path = elf_path + + def __repr__(self): + if len(self.toolchain) and len(self.elf_path): + callers = os.linesep + for addr in self.callers: + callers += '{}'.format(addr2line(self.toolchain, self.elf_path, addr)) + else: + callers = '' + for addr in self.callers: + if len(callers): + callers += ':' + callers += '0x{:x}'.format(addr) + if self.in_irq: + ctx_desc = 'IRQ "%s"' % self.ctx_name + else: + ctx_desc = 'task "%s"' % self.ctx_name + if self.alloc: + return "[{:.9f}] HEAP: Allocated {:d} bytes @ 0x{:x} from {} on core {:d} by: {}".format(self.ts, self.size, + self.addr, ctx_desc, + self.core_id, callers) + else: + return "[{:.9f}] HEAP: Freed bytes @ 0x{:x} from {} on core {:d} by: {}".format(self.ts, self.addr, ctx_desc, + self.core_id, callers) + + +class BaseHeapTraceDataProcessorImpl: + """ + Base implementation for heap data processors. + """ + def __init__(self, print_heap_events=False): + """ + Constructor. + + Parameters + ---------- + print_heap_events : bool + if True every heap event will be printed as they arrive + """ + self._alloc_addrs = {} + self.allocs = [] + self.frees = [] + self.heap_events_count = 0 + self.print_heap_events = print_heap_events + + def on_new_event(self, event): + """ + Processes heap events. Keeps track of active allocations list. + + Parameters + ---------- + event : HeapTraceEvent + Event object. + """ + self.heap_events_count += 1 + if self.print_heap_events: + print(event) + if event.alloc: + if event.addr in self._alloc_addrs: + raise HeapTraceDuplicateAllocError(event.addr, event.size, self._alloc_addrs[event.addr].size) + self.allocs.append(event) + self._alloc_addrs[event.addr] = event + else: + # do not treat free on unknown addresses as errors, because these blocks coould be allocated when tracing was disabled + if event.addr in self._alloc_addrs: + event.size = self._alloc_addrs[event.addr].size + self.allocs.remove(self._alloc_addrs[event.addr]) + del self._alloc_addrs[event.addr] + else: + self.frees.append(event) + + def print_report(self): + """ + Prints heap report + """ + print("=============== HEAP TRACE REPORT ===============") + print("Processed {:d} heap events.".format(self.heap_events_count)) + if len(self.allocs) == 0: + print("OK - Heap errors was not found.") + return + leaked_bytes = 0 + for alloc in self.allocs: + leaked_bytes += alloc.size + print(alloc) + for free in self.frees: + if free.addr > alloc.addr and free.addr <= alloc.addr + alloc.size: + print("Possible wrong free operation found") + print(free) + print("Found {:d} leaked bytes in {:d} blocks.".format(leaked_bytes, len(self.allocs))) diff --git a/tools/esp_app_trace/espytrace/sysview.py b/tools/esp_app_trace/espytrace/sysview.py new file mode 100644 index 0000000000..66ed0dde76 --- /dev/null +++ b/tools/esp_app_trace/espytrace/sysview.py @@ -0,0 +1,1220 @@ +import re +import struct +import copy +import espytrace.apptrace as apptrace + + +SYSVIEW_EVTID_NOP = 0 # Dummy packet. +SYSVIEW_EVTID_OVERFLOW = 1 +SYSVIEW_EVTID_ISR_ENTER = 2 +SYSVIEW_EVTID_ISR_EXIT = 3 +SYSVIEW_EVTID_TASK_START_EXEC = 4 +SYSVIEW_EVTID_TASK_STOP_EXEC = 5 +SYSVIEW_EVTID_TASK_START_READY = 6 +SYSVIEW_EVTID_TASK_STOP_READY = 7 +SYSVIEW_EVTID_TASK_CREATE = 8 +SYSVIEW_EVTID_TASK_INFO = 9 +SYSVIEW_EVTID_TRACE_START = 10 +SYSVIEW_EVTID_TRACE_STOP = 11 +SYSVIEW_EVTID_SYSTIME_CYCLES = 12 +SYSVIEW_EVTID_SYSTIME_US = 13 +SYSVIEW_EVTID_SYSDESC = 14 +SYSVIEW_EVTID_USER_START = 15 +SYSVIEW_EVTID_USER_STOP = 16 +SYSVIEW_EVTID_IDLE = 17 +SYSVIEW_EVTID_ISR_TO_SCHEDULER = 18 +SYSVIEW_EVTID_TIMER_ENTER = 19 +SYSVIEW_EVTID_TIMER_EXIT = 20 +SYSVIEW_EVTID_STACK_INFO = 21 +SYSVIEW_EVTID_MODULEDESC = 22 +SYSVIEW_EVTID_INIT = 24 +SYSVIEW_EVENT_ID_PREDEF_LEN_MAX = SYSVIEW_EVTID_INIT +SYSVIEW_EVTID_NAME_RESOURCE = 25 +SYSVIEW_EVTID_PRINT_FORMATTED = 26 +SYSVIEW_EVTID_NUMMODULES = 27 +SYSVIEW_EVENT_ID_PREDEF_MAX = SYSVIEW_EVTID_NUMMODULES + +SYSVIEW_EVENT_ID_MAX = 200 + +SYSVIEW_MODULE_EVENT_OFFSET = 512 + +SYSVIEW_SYNC_LEN = 10 + + +def parse_trace(reader, parser, os_evt_map_file=''): + """ + Parses trace. + + Parameters + ---------- + reader : apptrace.Reader + Trace reader object. + parser : SysViewTraceDataParser + Top level parser object. + os_evt_map_file : string + Path to file containg events format description. + """ + # parse OS events formats file + os_evt_map = _read_events_map(os_evt_map_file) + _read_file_header(reader) + _read_init_seq(reader) + while True: + event = parser.read_event(reader, os_evt_map) + parser.on_new_event(event) + + +def _read_events_map(os_evt_map_file): + """ + Reads SystemView events format description from file. + + Parameters + ---------- + os_evt_map_file : string + Path to file containg events format description. + + Returns + ------- + dict + a dict with event IDs as keys and values as tuples containg event name and a list of parameters. + """ + os_evt_map = {} + with open(os_evt_map_file) as f: + for line in f: + comps = line.split() + if len(comps) < 2: + continue + params = [] + if len(comps) > 2: + for p in comps[2:]: + sp = p.split('=') + if sp[1].startswith('%'): + sp[1] = sp[1][1:] + if sp[1] == 'u': + params.append(SysViewEventParamSimple(sp[0], _decode_u32)) + elif sp[1] == 's': + params.append(SysViewEventParamSimple(sp[0], _decode_str)) + elif sp[1] == 't' or sp[1] == 'T' or sp[1] == 'I' or sp[1] == 'p': + # TODO: handle shrinked task/queue ID and addresses + params.append(SysViewEventParamSimple(sp[0], _decode_u32)) + os_evt_map[int(comps[0])] = (comps[1], params) + return os_evt_map + + +def _read_file_header(reader): + """ + Reads SystemView trace file header. + + Parameters + ---------- + reader : apptrace.Reader + Trace reader object. + + Returns + ------- + list + a list of header lines. + """ + empty_count = 0 + lines = [] + while empty_count < 2: + lines.append(reader.readline(linesep='\n')) + if lines[-1] == ';\n': + empty_count += 1 + return lines + + +def _read_init_seq(reader): + """ + Reads SystemView trace initial synchronisation sequence of bytes. + + Parameters + ---------- + reader : apptrace.Reader + Trace reader object. + + Raises + ------- + SysViewTraceParseError + If sync sequence is broken. + """ + SYNC_SEQ_FMT = '<%dB' % SYSVIEW_SYNC_LEN + sync_bytes = struct.unpack(SYNC_SEQ_FMT, reader.read(struct.calcsize(SYNC_SEQ_FMT))) + for b in sync_bytes: + if b != 0: + raise SysViewTraceParseError("Invalid sync sequense!") + + +def _decode_u32(reader): + """ + Reads and decodes unsigned 32-bit integer. + + Parameters + ---------- + reader : apptrace.Reader + Trace reader object. + + Returns + ------- + tuple + a tuple containg number of read bytes and decoded value. + """ + sz = 0 + val = 0 + while True: + b, = struct.unpack('= SYSVIEW_EVENT_ID_PREDEF_LEN_MAX: + self.plen = _decode_plen(reader) + if events_fmt_map: + self._read_payload(reader, events_fmt_map) + else: + reader.forward(self.plen) + _,self.ts = _decode_u32(reader) + + def _read_payload(self, reader, events_fmt_map): + """ + Reads event's payload and populates its parameters dictionary. + + Parameters + ---------- + reader : apptrace.Reader + Trace reader object. + events_fmt_map : dict + see return value of _read_events_map() + + Raises + ------- + SysViewTraceParseError + if event has unknown or invalid format. + """ + if self.id not in events_fmt_map: + raise SysViewTraceParseError("Unknown event ID %d!" % self.id) + self.name = events_fmt_map[self.id][0] + evt_params_templates = events_fmt_map[self.id][1] + params_len = 0 + for i in range(len(evt_params_templates)): + event_param = copy.deepcopy(evt_params_templates[i]) + try: + cur_pos = reader.get_pos() + sz,param_val = event_param.decode(reader, self.plen - params_len) + except Exception as e: + raise SysViewTraceParseError("Failed to decode event {}({:d}) {:d} param @ 0x{:x}! {}".format(self.name, self.id, self.plen, cur_pos, e)) + event_param.idx = i + event_param.value = param_val + self.params[event_param.name] = event_param + params_len += sz + if self.id >= SYSVIEW_EVENT_ID_PREDEF_LEN_MAX and self.plen != params_len: + raise SysViewTraceParseError("Invalid event {}({:d}) payload len {:d}! Must be {:d}.".format(self.name, self.id, self.plen, params_len)) + + def __str__(self): + params = '' + for param in sorted(self.params.values(), key=lambda x: x.idx): + params += '{}, '.format(param) + if len(params): + params = params[:-2] # remove trailing ', ' + return '{:.9f} - core[{:d}].{}({:d}), plen {:d}: [{}]'.format(self.ts, self.core_id, self.name, self.id, self.plen, params) + + +class SysViewEventParam: + """ + Abstract base SystemView event's parameter class. This is a base class for all event's parameters. + """ + def __init__(self, name, decode_func): + """ + Constructor. + + Parameters + ---------- + name : string + Event parameter name. + decode_func : callable object + Parameter decoding function. + """ + self.name = name + self.decode_func = decode_func + self.value = None + # positional index, used for sorting parameters before printing to make them looking as they appear in the event + self.idx = 0 + + def decode(self, reader, max_sz): + """ + Reads and decodes events parameter. + + Parameters + ---------- + reader : apptrace.Reader + Trace reader object. + max_sz : int + Maximum number of bytes to read. + + Returns + ------- + tuple + a tuple containg number of read bytes and decoded value. + """ + pass + + def __str__(self): + return '{}: {}'.format(self.name, self.value) + + +class SysViewEventParamSimple(SysViewEventParam): + """ + Simple SystemView event's parameter class. + """ + def decode(self, reader, max_sz): + """ + see SysViewEventParam.decode() + """ + return self.decode_func(reader) + + +class SysViewEventParamArray(SysViewEventParamSimple): + """ + Array SystemView event's parameter class. + """ + def __init__(self, name, decode_func, size=-1): + """ + Constructor. + + Parameters + ---------- + name : string + see SysViewEventParam.__init__() + decode_func : callable object + see SysViewEventParam.__init__() + size : int + Array's size. If -1 decode() will try to read all bytes from reader. + """ + SysViewEventParamSimple.__init__(self, name, decode_func) + self.arr_size = size + + def decode(self, reader, max_sz): + """ + see SysViewEventParam.decode() + """ + tottal_sz = 0 + vals = [] + i = 0 + while tottal_sz < max_sz: + sz,val = self.decode_func(reader) + vals.append(val) + tottal_sz += sz + i += 1 + if self.arr_size != -1 and i == self.arr_size: + break + return tottal_sz,vals + + +class SysViewPredefinedEvent(SysViewEvent): + """ + Pre-defined SystemView events class. + """ + _predef_events_fmt = { + SYSVIEW_EVTID_NOP: ('svNop', []), + SYSVIEW_EVTID_OVERFLOW: ('svOverflow', [SysViewEventParamSimple('drop_cnt', _decode_u32)]), + SYSVIEW_EVTID_ISR_ENTER: ('svIsrEnter', [SysViewEventParamSimple('irq_num', _decode_u32)]), + SYSVIEW_EVTID_ISR_EXIT: ('svIsrExit', []), + SYSVIEW_EVTID_TASK_START_EXEC: ('svTaskStartExec', [SysViewEventParamSimple('tid', _decode_id)]), + SYSVIEW_EVTID_TASK_STOP_EXEC: ('svTaskStopExec', []), + SYSVIEW_EVTID_TASK_START_READY: ('svTaskStartReady', [SysViewEventParamSimple('tid', _decode_id)]), + SYSVIEW_EVTID_TASK_STOP_READY: ('svTaskStopReady', [SysViewEventParamSimple('tid', _decode_id), + SysViewEventParamSimple('cause', _decode_u32)]), + SYSVIEW_EVTID_TASK_CREATE: ('svTaskCreate', [SysViewEventParamSimple('tid', _decode_id)]), + SYSVIEW_EVTID_TASK_INFO: ('svTaskInfo', [SysViewEventParamSimple('tid', _decode_id), + SysViewEventParamSimple('prio', _decode_u32), + SysViewEventParamSimple('name', _decode_str)]), + SYSVIEW_EVTID_TRACE_START: ('svTraceStart', []), + SYSVIEW_EVTID_TRACE_STOP: ('svTraceStop', []), + SYSVIEW_EVTID_SYSTIME_CYCLES: ('svSysTimeCycles', [SysViewEventParamSimple('cycles', _decode_u32)]), + SYSVIEW_EVTID_SYSTIME_US: ('svSysTimeUs', [SysViewEventParamSimple('time', _decode_u64)]), + SYSVIEW_EVTID_SYSDESC: ('svSysDesc', [SysViewEventParamSimple('desc', _decode_str)]), + SYSVIEW_EVTID_USER_START: ('svUserStart', [SysViewEventParamSimple('user_id', _decode_u32)]), + SYSVIEW_EVTID_USER_STOP: ('svUserStart', [SysViewEventParamSimple('user_id', _decode_u32)]), + SYSVIEW_EVTID_IDLE: ('svIdle', []), + SYSVIEW_EVTID_ISR_TO_SCHEDULER: ('svExitIsrToScheduler', []), + SYSVIEW_EVTID_TIMER_ENTER: ('svTimerEnter', [SysViewEventParamSimple('tim_id', _decode_u32)]), + SYSVIEW_EVTID_TIMER_EXIT: ('svTimerExit', []), + SYSVIEW_EVTID_STACK_INFO: ('svStackInfo', [SysViewEventParamSimple('tid', _decode_id), + SysViewEventParamSimple('base', _decode_u32), + SysViewEventParamSimple('sz', _decode_u32), + SysViewEventParamSimple('unused', _decode_u32)]), + SYSVIEW_EVTID_MODULEDESC: ('svModuleDesc', [SysViewEventParamSimple('mod_id', _decode_u32), + SysViewEventParamSimple('evt_off', _decode_u32), + SysViewEventParamSimple('desc', _decode_str)]), + SYSVIEW_EVTID_INIT: ('svInit', [SysViewEventParamSimple('sys_freq', _decode_u32), + SysViewEventParamSimple('cpu_freq', _decode_u32), + SysViewEventParamSimple('ram_base', _decode_u32), + SysViewEventParamSimple('id_shift', _decode_u32)]), + SYSVIEW_EVTID_NAME_RESOURCE: ('svNameResource', [SysViewEventParamSimple('res_id', _decode_u32), + SysViewEventParamSimple('name', _decode_str)]), + SYSVIEW_EVTID_PRINT_FORMATTED: ('svPrint', [SysViewEventParamSimple('msg', _decode_str), + SysViewEventParamSimple('id', _decode_u32), + SysViewEventParamSimple('unused', _decode_u32)]), + SYSVIEW_EVTID_NUMMODULES: ('svNumModules', [SysViewEventParamSimple('mod_cnt', _decode_u32)]), + } + + def __init__(self, evt_id, reader, core_id): + """ + see SysViewEvent.__init__() + """ + self.name = 'SysViewPredefinedEvent' + SysViewEvent.__init__(self, evt_id, reader, core_id, self._predef_events_fmt) + + +class SysViewOSEvent(SysViewEvent): + """ + OS related SystemView events class. + """ + def __init__(self, evt_id, reader, core_id, events_fmt_map): + """ + see SysViewEvent.__init__() + """ + self.name = 'SysViewOSEvent' + SysViewEvent.__init__(self, evt_id, reader, core_id, events_fmt_map) + + +class SysViewHeapEvent(SysViewEvent): + """ + Heap related SystemView events class. + + Attributes + ---------- + events_fmt : dict + see return value of _read_events_map() + """ + events_fmt = { + 0: ('esp_sysview_heap_trace_alloc', [SysViewEventParamSimple('addr', _decode_u32), + SysViewEventParamSimple('size', _decode_u32), + SysViewEventParamArray('callers', _decode_u32)]), + 1: ('esp_sysview_heap_trace_free', [SysViewEventParamSimple('addr', _decode_u32), + SysViewEventParamArray('callers', _decode_u32)]), + } + + def __init__(self, evt_id, events_off, reader, core_id): + """ + Constructor. Reads and optionally decodes event. + + Parameters + ---------- + evt_id : int + see SysViewEvent.__init__() + events_off : int + Offset for heap events IDs. Greater or equal to SYSVIEW_MODULE_EVENT_OFFSET. + reader : apptrace.Reader + see SysViewEvent.__init__() + core_id : int + see SysViewEvent.__init__() + """ + self.name = 'SysViewHeapEvent' + cur_events_map = {} + for id in self.events_fmt: + cur_events_map[events_off + id] = self.events_fmt[id] + SysViewEvent.__init__(self, evt_id, reader, core_id, cur_events_map) + + +class SysViewTraceDataParser(apptrace.TraceDataProcessor): + """ + Base SystemView trace data parser class. + + Attributes + ---------- + STREAMID_SYS : int + system events stream ID. Reserved for internal uses. + STREAMID_LOG : int + log events stream ID. + STREAMID_HEAP : int + heap events stream ID. + """ + STREAMID_SYS = -1 + STREAMID_LOG = 0 + STREAMID_HEAP = 1 + + def __init__(self, print_events=False, core_id=0): + """ + Constructor. + + Parameters + ---------- + print_events : bool + see apptrace.TraceDataProcessor.__init__() + core_id : int + id of the core this parser object relates to. + """ + apptrace.TraceDataProcessor.__init__(self, print_events, keep_all_events=True) + self.sys_info = None + self._last_ts = 0 + self.irqs_info = {} + self.tasks_info = {} + self.core_id = core_id + + def _parse_irq_desc(self, desc): + """ + Parses IRQ description. + + Parameters + ---------- + desc : string + IRQ description string. + + Returns + ------- + tuple + a tuple with IRQ number and name or None on error. + """ + m = re.match('I#([0-9]+)=(.+)', desc) + if m: + return m.group(2),m.group(1) + return None + + def _update_ts(self, ts): + """ + Calculates real event timestamp. + + Parameters + ---------- + ts : int + Event timestamp offset. + + Returns + ------- + float + real event timestamp. + """ + self._last_ts += ts + return float(self._last_ts) / self.sys_info.params['sys_freq'].value + + def read_extension_event(self, evt_id, reader): + """ + Reads extension event. + Default implementation which just reads out event. + + Parameters + ---------- + evt_id : int + Event ID. + reader : apptrace.Reader + Trace reader object. + + Returns + ------- + SysViewEvent + if this is top level parser returns object for generic event, + otherwise returns None indicating to the calling top level parser + that extension event are not supported. + """ + if self.root_proc == self: + # by default just read out and skip unknown event + return SysViewEvent(evt_id, reader, self.core_id) + return None # let decide to root parser + + def read_event(self, reader, os_evt_map): + """ + Reads pre-defined or OS-related event. + + Parameters + ---------- + reader : apptrace.Reader + Trace reader object. + os_evt_map : dict + see return value of _read_events_map() + + Returns + ------- + SysViewEvent + pre-defined, OS-related or extension event object. + """ + evt_hdr, = struct.unpack('= SYSVIEW_MODULE_EVENT_OFFSET and evt_id >= self.events_off and + evt_id < self.events_off + self.events_num): + return SysViewHeapEvent(evt_id, self.events_off, reader, self.core_id) + return SysViewTraceDataParser.read_extension_event(self, evt_id, reader) + + def on_new_event(self, event): + """ + Keeps track of heap module descriptions. + """ + if self.root_proc == self: + SysViewTraceDataParser.on_new_event(self, event) + if event.id == SYSVIEW_EVTID_MODULEDESC and event.params['desc'].value == 'ESP32 SystemView Heap Tracing Module': + self.events_off = event.params['evt_off'].value + + +class SysViewHeapTraceDataProcessor(SysViewTraceDataProcessor, apptrace.BaseHeapTraceDataProcessorImpl): + """ + SystemView trace data processor supporting heap events. + """ + def __init__(self, toolchain_pref, elf_path, traces=[], print_events=False, print_heap_events=False): + """ + Constructor. + see SysViewTraceDataProcessor.__init__() + see apptrace.BaseHeapTraceDataProcessorImpl.__init__() + """ + SysViewTraceDataProcessor.__init__(self, traces, print_events) + apptrace.BaseHeapTraceDataProcessorImpl.__init__(self, print_heap_events) + self.toolchain = toolchain_pref + self.elf_path = elf_path + self.no_ctx_events = [] + + def on_new_event(self, event): + """ + Processes heap events. + """ + if self.root_proc == self: + SysViewTraceDataProcessor.on_new_event(self, event) + heap_stream = self.root_proc.get_trace_stream(event.core_id, SysViewTraceDataParser.STREAMID_HEAP) + if (heap_stream.events_off < SYSVIEW_MODULE_EVENT_OFFSET or event.id < heap_stream.events_off or + event.id >= (heap_stream.events_off + heap_stream.events_num)): + return + curr_ctx = self._get_curr_context(event.core_id) + if curr_ctx: + in_irq = curr_ctx.irq + ctx_name = curr_ctx.name + else: + in_irq = False + ctx_name = 'None' + if (event.id - heap_stream.events_off) == 0: + heap_event = apptrace.HeapTraceEvent(ctx_name, in_irq, event.core_id, event.ts, + True, event.params['size'].value, event.params['addr'].value, + event.params['callers'].value, toolchain=self.toolchain, + elf_path=self.elf_path) + else: + heap_event = apptrace.HeapTraceEvent(ctx_name, in_irq, event.core_id, event.ts, + False, 0, event.params['addr'].value, + event.params['callers'].value, toolchain=self.toolchain, + elf_path=self.elf_path) + if not curr_ctx: + # postpone events handling till their context is known + self.no_ctx_events.append(heap_event) + else: + # here we know the previous context: we switched from it or implied upon the 1st context switching event + prev_ctx = self._get_prev_context(event.core_id) + for cached_evt in self.no_ctx_events: + cached_evt.ctx_name = prev_ctx.name + cached_evt.in_irq = prev_ctx.irq + apptrace.BaseHeapTraceDataProcessorImpl.on_new_event(self, cached_evt) + del self.no_ctx_events[:] + apptrace.BaseHeapTraceDataProcessorImpl.on_new_event(self, heap_event) + + def print_report(self): + """ + see apptrace.TraceDataProcessor.print_report() + """ + if self.root_proc == self: + SysViewTraceDataProcessor.print_report(self) + apptrace.BaseHeapTraceDataProcessorImpl.print_report(self) + + +class SysViewLogTraceEvent(apptrace.LogTraceEvent): + """ + SystemView log event. + """ + def __init__(self, ts, msg): + """ + Constructor. + + Parameters + ---------- + msg : string + Log message string. + """ + self.msg = msg + self.ts = ts + + def get_message(self, unused): + """ + Retrieves log message. + + Returns + ------- + string + formatted log message + """ + return '[{:.9f}] LOG: {}'.format(self.ts, self.msg) + + +class SysViewLogTraceDataParser(SysViewTraceDataParser): + """ + SystemView trace data parser supporting log events. + """ + def on_new_event(self, event): + """ + see SysViewTraceDataParser.on_new_event() + """ + if self.root_proc == self: + SysViewTraceDataParser.on_new_event(self, event) + + +class SysViewLogTraceDataProcessor(SysViewTraceDataProcessor, apptrace.BaseLogTraceDataProcessorImpl): + """ + SystemView trace data processor supporting heap events. + """ + def __init__(self, traces=[], print_events=False, print_log_events=False): + """ + Constructor. + see SysViewTraceDataProcessor.__init__() + see apptrace.BaseLogTraceDataProcessorImpl.__init__() + """ + SysViewTraceDataProcessor.__init__(self, traces, print_events) + apptrace.BaseLogTraceDataProcessorImpl.__init__(self, print_log_events) + + def on_new_event(self, event): + """ + Processes log events. + """ + if self.root_proc == self: + SysViewTraceDataProcessor.on_new_event(self, event) + if event.id == SYSVIEW_EVTID_PRINT_FORMATTED: + log_evt = SysViewLogTraceEvent(event.ts, event.params['msg'].value) + apptrace.BaseLogTraceDataProcessorImpl.on_new_event(self, log_evt) + + def print_report(self): + """ + see apptrace.TraceDataProcessor.print_report() + """ + if self.root_proc == self: + SysViewTraceDataProcessor.print_report(self) + apptrace.BaseLogTraceDataProcessorImpl.print_report(self) diff --git a/tools/esp_app_trace/logtrace_proc.py b/tools/esp_app_trace/logtrace_proc.py index 37463edb14..702dd1fab8 100755 --- a/tools/esp_app_trace/logtrace_proc.py +++ b/tools/esp_app_trace/logtrace_proc.py @@ -5,11 +5,8 @@ from __future__ import print_function import argparse import struct import sys -import pylibelf as elf -import pylibelf.util as elfutil -import pylibelf.iterators as elfiter -import pylibelf.constants as elfconst -import ctypes +import elftools.elf.elffile as elffile +import espytrace.apptrace as apptrace class ESPLogTraceParserError(RuntimeError): @@ -77,34 +74,14 @@ def logtrace_parse(fname): return recs -def logtrace_get_str_from_elf(felf, str_addr): - tgt_str = "" - for sect in elfiter.sections(felf): - hdr = elfutil.section_hdr(felf, sect) - if hdr.sh_addr == 0 or hdr.sh_type != elfconst.SHT_PROGBITS: - continue - if str_addr < hdr.sh_addr or str_addr >= hdr.sh_addr + hdr.sh_size: - continue - # print("Found SECT: %x..%x @ %x" % (hdr.sh_addr, hdr.sh_addr + hdr.sh_size, str_addr - hdr.sh_addr)) - sec_data = elfiter.getOnlyData(sect).contents - buf = ctypes.cast(sec_data.d_buf, ctypes.POINTER(ctypes.c_char)) - for i in range(str_addr - hdr.sh_addr, hdr.sh_size): - if buf[i] == "\0": - break - tgt_str += buf[i] - if len(tgt_str) > 0: - return tgt_str - return None - - def logtrace_formated_print(recs, elfname, no_err): try: - felf = elfutil.open_elf(elfname) + felf = elffile.ELFFile(open(elfname, 'rb')) except OSError as e: raise ESPLogTraceParserError("Failed to open ELF file (%s)!" % e) for lrec in recs: - fmt_str = logtrace_get_str_from_elf(felf, lrec.fmt_addr) + fmt_str = apptrace.get_str_from_elf(felf, lrec.fmt_addr) i = 0 prcnt_idx = 0 while i < len(lrec.args): @@ -114,7 +91,7 @@ def logtrace_formated_print(recs, elfname, no_err): prcnt_idx += 1 # goto next char if fmt_str[prcnt_idx] == 's': # find string - arg_str = logtrace_get_str_from_elf(felf, lrec.args[i]) + arg_str = apptrace.get_str_from_elf(felf, lrec.args[i]) if arg_str: lrec.args[i] = arg_str i += 1 @@ -129,8 +106,7 @@ def logtrace_formated_print(recs, elfname, no_err): if not no_err: print("Print error (%s)" % e) print("\nFmt = {%s}, args = %d/%s" % (fmt_str, len(lrec.args), lrec.args)) - - elf.elf_end(felf) + felf.stream.close() def main(): diff --git a/tools/esp_app_trace/pylibelf/.gitignore b/tools/esp_app_trace/pylibelf/.gitignore deleted file mode 100644 index 42ac64781c..0000000000 --- a/tools/esp_app_trace/pylibelf/.gitignore +++ /dev/null @@ -1,59 +0,0 @@ -# Byte-compiled / optimized / DLL files -__pycache__/ -*.py[cod] - -# C extensions -*.so - -# Distribution / packaging -.Python -env/ -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -*.egg-info/ -.installed.cfg -*.egg - -# PyInstaller -# Usually these files are written by a python script from a template -# before PyInstaller builds the exe, so as to inject date/other infos into it. -*.manifest -*.spec - -# Installer logs -pip-log.txt -pip-delete-this-directory.txt - -# Unit test / coverage reports -htmlcov/ -.tox/ -.coverage -.cache -nosetests.xml -coverage.xml - -# Translations -*.mo -*.pot - -# Django stuff: -*.log - -# Sphinx documentation -docs/_build/ - -# PyBuilder -target/ - -*.swp -*.swo -*.swn - diff --git a/tools/esp_app_trace/pylibelf/LICENSE b/tools/esp_app_trace/pylibelf/LICENSE deleted file mode 100644 index 2e216332ff..0000000000 --- a/tools/esp_app_trace/pylibelf/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 d1m0 - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - diff --git a/tools/esp_app_trace/pylibelf/README.md b/tools/esp_app_trace/pylibelf/README.md deleted file mode 100644 index 1019a8f32d..0000000000 --- a/tools/esp_app_trace/pylibelf/README.md +++ /dev/null @@ -1,5 +0,0 @@ -pylibelf -======== - -Python binding for libelf. - diff --git a/tools/esp_app_trace/pylibelf/__init__.py b/tools/esp_app_trace/pylibelf/__init__.py deleted file mode 100644 index d00da18abb..0000000000 --- a/tools/esp_app_trace/pylibelf/__init__.py +++ /dev/null @@ -1,155 +0,0 @@ -from types import * -from constants import * -from ctypes import * - -lelf=CDLL("libelf.so.1") - -__all__ = [] - -all_objs = [] - -class ElfError(Exception): - def __init__(self, msg): - self.msg = msg - self.errno = elf_errno() - self.elfmsg = elf_errmsg(self.errno) - - def __str__(self): - return "ElfError(%d, %s): %s" % (self.errno, self.elfmsg, self.msg) - -__all__.append("ElfError") - -def nonNullDec(f): - def decorated(*args): - res = f(*args) - try: - a = res.contents - all_objs.append(res) - except ValueError: # NULL - raise ElfError(f.__name__ + " returned NULL") - return res - return decorated - -def nonNegDec(f): - def decorated(*args): - res = f(*args) - if 0 > res: - raise ElfError(f.__name__ + " returned %d" % (res,)) - return res - return decorated - -def badValDec(badVal): - def decorator(f): - def decorated(*args): - res = f(*args) - if res == badVal: - raise ElfError(f.__name__ + " returned %s" % (str(res),)) - return res - return decorated - return decorator - -def define(f, argtypes, restype, err_decorator = None): - f.argtypes = argtypes - f.restype = restype - name = f.__name__ - __all__.append(name) - - if (err_decorator != None): - f = err_decorator(f) - - globals()[name] = f - -define(lelf.elf_version, [ c_int ], c_int ) - -if (elf_version(EV_CURRENT) == EV_NONE): - raise Exception("Version mismatch") - -off_t = c_size_t # TODO(dbounov): Figure out actual off_t type - -define(lelf.elf_begin, [ c_int, Elf_Cmd, ElfP ], ElfP) -define(lelf.elf_getident, [ ElfP, POINTER(c_int) ], POINTER(Elf_IdentT), nonNullDec) -define(lelf.elf_end, [ ElfP ], c_int, nonNegDec ) -define(lelf.elf_cntl, [ ElfP, c_int ], c_int, nonNegDec) -define(lelf.elf_errmsg, [ c_int ], c_char_p) -define(lelf.elf_errno, [ ], c_int) -define(lelf.elf_fill, [ c_int ], None) -define(lelf.elf_flagdata, [ Elf_DataP, c_int, c_uint ], c_uint) -define(lelf.elf_flagehdr, [ ElfP, c_int, c_uint ], c_uint) -define(lelf.elf_flagelf, [ ElfP, c_int, c_uint ], c_uint) -define(lelf.elf_flagphdr, [ ElfP, c_int, c_uint ], c_uint) -define(lelf.elf_flagscn, [ Elf_ScnP, c_int, c_uint ], c_uint) -define(lelf.elf_flagshdr, [ Elf_ScnP, c_int, c_uint ], c_uint) -define(lelf.elf_getarhdr, [ ElfP ], POINTER(Elf_Arhdr)) -#define(lelf.elf_getarsym, [ ], ) -define(lelf.elf_getbase, [ ElfP ], off_t, nonNegDec) -define(lelf.elf_getdata, [ Elf_ScnP, Elf_DataP ], Elf_DataP) -define(lelf.elf_getscn, [ ElfP, c_size_t ], Elf_ScnP, nonNullDec ) -define(lelf.elf_getshnum, [ ElfP, POINTER(c_size_t) ], c_int, nonNegDec ) -define(lelf.elf_getshstrndx, [ ElfP, POINTER(c_size_t) ], c_int, nonNegDec ) -define(lelf.elf_hash, [ c_char_p ], c_ulong) -define(lelf.elf_kind, [ ElfP ], c_int ) -define(lelf.elf_memory, [ POINTER(c_char), c_size_t ], ElfP, nonNullDec) -define(lelf.elf_ndxscn, [ Elf_ScnP ], c_size_t, badValDec(SHN_UNDEF)) -define(lelf.elf_newdata, [ Elf_ScnP ], Elf_DataP, nonNullDec) -define(lelf.elf_newscn, [ ElfP ], Elf_ScnP, nonNullDec) -#define(lelf.elf_next, [ ], ) -define(lelf.elf_nextscn, [ ElfP, Elf_ScnP ], Elf_ScnP) -#define(lelf.elf_rand, [ ], ) -define(lelf.elf_rawdata, [ Elf_ScnP, Elf_DataP ], Elf_DataP) -#define(lelf.elf_rawfile, [ ], ) -define(lelf.elf_strptr, [ ElfP, c_size_t, c_size_t ], c_char_p) -define(lelf.elf_update, [ ElfP, c_int], off_t, nonNegDec) - -define(lelf.elf32_checksum, [ ElfP ], c_long) -define(lelf.elf32_fsize, [ c_int, c_size_t, c_uint ], c_size_t, nonNegDec) -define(lelf.elf32_getehdr, [ ElfP ], POINTER(Elf32_Ehdr), nonNullDec) -define(lelf.elf32_getphdr, [ ElfP ], POINTER(Elf32_Phdr), nonNullDec) -define(lelf.elf32_getshdr, [ Elf_ScnP ], POINTER(Elf32_Shdr), nonNullDec) -define(lelf.elf32_newehdr, [ ElfP ], POINTER(Elf32_Ehdr), nonNullDec) -define(lelf.elf32_newphdr, [ ElfP, c_size_t ], POINTER(Elf32_Phdr), nonNullDec) -define(lelf.elf32_xlatetof, [ Elf_DataP, Elf_DataP, c_uint ], Elf_DataP, nonNullDec) -define(lelf.elf32_xlatetom, [ Elf_DataP, Elf_DataP, c_uint ], Elf_DataP, nonNullDec) - - -define(lelf.elf64_checksum, [ ElfP ], c_long ) -define(lelf.elf64_fsize, [ c_int, c_size_t, c_uint ], c_size_t, nonNegDec) -define(lelf.elf64_getehdr,[ ElfP ], POINTER(Elf64_Ehdr), nonNullDec) -define(lelf.elf64_getphdr, [ ElfP ], POINTER(Elf64_Phdr), nonNullDec) -define(lelf.elf64_getshdr, [ Elf_ScnP ], POINTER(Elf64_Shdr), nonNullDec) -define(lelf.elf64_newehdr, [ ElfP ], POINTER(Elf64_Ehdr), nonNullDec) -define(lelf.elf64_newphdr, [ ElfP, c_size_t ], POINTER(Elf64_Phdr), nonNullDec) -define(lelf.elf64_xlatetof, [ Elf_DataP, Elf_DataP, c_uint ], Elf_DataP, nonNullDec) -define(lelf.elf64_xlatetom, [ Elf_DataP, Elf_DataP, c_uint ], Elf_DataP, nonNullDec) - -# NOTE(dbounov): Ignoring gelf functions for now - -#define(lelf.gelf_checksum, [ ], ) -#define(lelf.gelf_fsize, [ ], ) -#define(lelf.gelf_getcap, [ ], ) -#define(lelf.gelf_getclass, [ ], ) -#define(lelf.gelf_getdyn, [ ], ) -#define(lelf.gelf_getehdr, [ ], ) -#define(lelf.gelf_getmove, [ ], ) -#define(lelf.gelf_getphdr, [ ], ) -#define(lelf.gelf_getrel, [ ], ) -#define(lelf.gelf_getrela, [ ], ) -#define(lelf.gelf_getshdr, [ ], ) -#define(lelf.gelf_getsym, [ ], ) -#define(lelf.gelf_getsyminfo, [ ], ) -#define(lelf.gelf_getsymshndx, [ ], ) -#define(lelf.gelf_newehdr, [ ], ) -#define(lelf.gelf_newphdr, [ ], ) -#define(lelf.gelf_update_cap, [ ], ) -#define(lelf.gelf_update_dyn, [ ], ) -#define(lelf.gelf_update_ehdr, [ ], ) -#define(lelf.gelf_update_move, [ ], ) -#define(lelf.gelf_update_phdr, [ ], ) -#define(lelf.gelf_update_rel, [ ], ) -#define(lelf.gelf_update_rela, [ ], ) -#define(lelf.gelf_update_shdr, [ ], ) -#define(lelf.gelf_update_sym, [ ], ) -#define(lelf.gelf_update_symshndx, [ ], ) -#define(lelf.gelf_update_syminfo, [ ], ) -#define(lelf.gelf_xlatetof, [ ], ) -#define(lelf.gelf_xlatetom, [ ], ) -#define(lelf.nlist, [ ], ) diff --git a/tools/esp_app_trace/pylibelf/constants/__init__.py b/tools/esp_app_trace/pylibelf/constants/__init__.py deleted file mode 100644 index 890f97abb7..0000000000 --- a/tools/esp_app_trace/pylibelf/constants/__init__.py +++ /dev/null @@ -1,1850 +0,0 @@ - -# Really simple expression types to handle arithmetic expressions referring -# to other # defines -class MacroExp: pass -class MacroRef(MacroExp): - def __init__(s, name): - s._name = name; - - def eval(s): - return lookup(s._name) - - def __add__(s, o): - return MacroAdd(s, o) - - def __radd__(s, o): - return MacroAdd(o, s) - -class MacroAdd(MacroExp): - def __init__(s, l, r): - s.l = l; - s.r = r; - - def eval(s): - l = s.l.eval() if (isinstance(s.l, MacroExp)) else s.l - r = s.r.eval() if (isinstance(s.r, MacroExp)) else s.r - - return l + r - - def __add__(s, o): - return MacroAdd(s, o) - - def __radd__(s, o): - return MacroAdd(o, s) - - -def lookup(n): - v = _consts[n] - if isinstance(v, MacroExp): - return v.eval() - else: - return v - -# Macro constants -_consts = { - "EI_NIDENT": 16 , # - "EI_MAG0": 0 , # File identification byte 0 index - "ELFMAG0": 0x7f , # Magic number byte 0 - "EI_MAG1": 1 , # File identification byte 1 index - "ELFMAG1": 'E' , # Magic number byte 1 - "EI_MAG2": 2 , # File identification byte 2 index - "ELFMAG2": 'L' , # Magic number byte 2 - "EI_MAG3": 3 , # File identification byte 3 index - "ELFMAG3": 'F' , # Magic number byte 3 - "ELFMAG": "\177ELF" , # - "SELFMAG": 4 , # - "EI_CLASS": 4 , # File class byte index - "ELFCLASSNONE": 0 , # Invalid class - "ELFCLASS32": 1 , # 32-bit objects - "ELFCLASS64": 2 , # 64-bit objects - "ELFCLASSNUM": 3 , # - "EI_DATA": 5 , # Data encoding byte index - "ELFDATANONE": 0 , # Invalid data encoding - "ELFDATA2LSB": 1 , # 2's complement, little endian - "ELFDATA2MSB": 2 , # 2's complement, big endian - "ELFDATANUM": 3 , # - "EI_VERSION": 6 , # File version byte index - "EI_OSABI": 7 , # OS ABI identification - "ELFOSABI_NONE": 0 , # UNIX System V ABI - "ELFOSABI_SYSV": 0 , # Alias. - "ELFOSABI_HPUX": 1 , # HP-UX - "ELFOSABI_NETBSD": 2 , # NetBSD. - "ELFOSABI_GNU": 3 , # Object uses GNU ELF extensions. - "ELFOSABI_LINUX": MacroRef("ELFOSABI_GNU") , # Compatibility alias. - "ELFOSABI_SOLARIS": 6 , # Sun Solaris. - "ELFOSABI_AIX": 7 , # IBM AIX. - "ELFOSABI_IRIX": 8 , # SGI Irix. - "ELFOSABI_FREEBSD": 9 , # FreeBSD. - "ELFOSABI_TRU64": 10 , # Compaq TRU64 UNIX. - "ELFOSABI_MODESTO": 11 , # Novell Modesto. - "ELFOSABI_OPENBSD": 12 , # OpenBSD. - "ELFOSABI_ARM_AEABI": 64 , # ARM EABI - "ELFOSABI_ARM": 97 , # ARM - "ELFOSABI_STANDALONE": 255 , # Standalone (embedded) application - "EI_ABIVERSION": 8 , # ABI version - "EI_PAD": 9 , # Byte index of padding bytes - "ET_NONE": 0 , # No file type - "ET_REL": 1 , # Relocatable file - "ET_EXEC": 2 , # Executable file - "ET_DYN": 3 , # Shared object file - "ET_CORE": 4 , # Core file - "ET_NUM": 5 , # Number of defined types - "ET_LOOS": 0xfe00 , # OS-specific range start - "ET_HIOS": 0xfeff , # OS-specific range end - "ET_LOPROC": 0xff00 , # Processor-specific range start - "ET_HIPROC": 0xffff , # Processor-specific range end - "EM_NONE": 0 , # No machine - "EM_M32": 1 , # AT&T WE 32100 - "EM_SPARC": 2 , # SUN SPARC - "EM_386": 3 , # Intel 80386 - "EM_68K": 4 , # Motorola m68k family - "EM_88K": 5 , # Motorola m88k family - "EM_860": 7 , # Intel 80860 - "EM_MIPS": 8 , # MIPS R3000 big-endian - "EM_S370": 9 , # IBM System/370 - "EM_MIPS_RS3_LE": 10 , # MIPS R3000 little-endian - "EM_PARISC": 15 , # HPPA - "EM_VPP500": 17 , # Fujitsu VPP500 - "EM_SPARC32PLUS": 18 , # Sun's "v8plus" - "EM_960": 19 , # Intel 80960 - "EM_PPC": 20 , # PowerPC - "EM_PPC64": 21 , # PowerPC 64-bit - "EM_S390": 22 , # IBM S390 - "EM_V800": 36 , # NEC V800 series - "EM_FR20": 37 , # Fujitsu FR20 - "EM_RH32": 38 , # TRW RH-32 - "EM_RCE": 39 , # Motorola RCE - "EM_ARM": 40 , # ARM - "EM_FAKE_ALPHA": 41 , # Digital Alpha - "EM_SH": 42 , # Hitachi SH - "EM_SPARCV9": 43 , # SPARC v9 64-bit - "EM_TRICORE": 44 , # Siemens Tricore - "EM_ARC": 45 , # Argonaut RISC Core - "EM_H8_300": 46 , # Hitachi H8/300 - "EM_H8_300H": 47 , # Hitachi H8/300H - "EM_H8S": 48 , # Hitachi H8S - "EM_H8_500": 49 , # Hitachi H8/500 - "EM_IA_64": 50 , # Intel Merced - "EM_MIPS_X": 51 , # Stanford MIPS-X - "EM_COLDFIRE": 52 , # Motorola Coldfire - "EM_68HC12": 53 , # Motorola M68HC12 - "EM_MMA": 54 , # Fujitsu MMA Multimedia Accelerator - "EM_PCP": 55 , # Siemens PCP - "EM_NCPU": 56 , # Sony nCPU embeeded RISC - "EM_NDR1": 57 , # Denso NDR1 microprocessor - "EM_STARCORE": 58 , # Motorola Start*Core processor - "EM_ME16": 59 , # Toyota ME16 processor - "EM_ST100": 60 , # STMicroelectronic ST100 processor - "EM_TINYJ": 61 , # Advanced Logic Corp. Tinyj emb.fam - "EM_X86_64": 62 , # AMD x86-64 architecture - "EM_PDSP": 63 , # Sony DSP Processor - "EM_FX66": 66 , # Siemens FX66 microcontroller - "EM_ST9PLUS": 67 , # STMicroelectronics ST9+ 8/16 mc - "EM_ST7": 68 , # STmicroelectronics ST7 8 bit mc - "EM_68HC16": 69 , # Motorola MC68HC16 microcontroller - "EM_68HC11": 70 , # Motorola MC68HC11 microcontroller - "EM_68HC08": 71 , # Motorola MC68HC08 microcontroller - "EM_68HC05": 72 , # Motorola MC68HC05 microcontroller - "EM_SVX": 73 , # Silicon Graphics SVx - "EM_ST19": 74 , # STMicroelectronics ST19 8 bit mc - "EM_VAX": 75 , # Digital VAX - "EM_CRIS": 76 , # Axis Communications 32-bit embedded processor - "EM_JAVELIN": 77 , # Infineon Technologies 32-bit embedded processor - "EM_FIREPATH": 78 , # Element 14 64-bit DSP Processor - "EM_ZSP": 79 , # LSI Logic 16-bit DSP Processor - "EM_MMIX": 80 , # Donald Knuth's educational 64-bit processor - "EM_HUANY": 81 , # Harvard University machine-independent object files - "EM_PRISM": 82 , # SiTera Prism - "EM_AVR": 83 , # Atmel AVR 8-bit microcontroller - "EM_FR30": 84 , # Fujitsu FR30 - "EM_D10V": 85 , # Mitsubishi D10V - "EM_D30V": 86 , # Mitsubishi D30V - "EM_V850": 87 , # NEC v850 - "EM_M32R": 88 , # Mitsubishi M32R - "EM_MN10300": 89 , # Matsushita MN10300 - "EM_MN10200": 90 , # Matsushita MN10200 - "EM_PJ": 91 , # picoJava - "EM_OPENRISC": 92 , # OpenRISC 32-bit embedded processor - "EM_ARC_A5": 93 , # ARC Cores Tangent-A5 - "EM_XTENSA": 94 , # Tensilica Xtensa Architecture - "EM_NUM": 95 , # - "EM_ALPHA": 0x9026 , # - "EV_NONE": 0 , # Invalid ELF version - "EV_CURRENT": 1 , # Current version - "EV_NUM": 2 , # - "SHN_UNDEF": 0 , # Undefined section - "SHN_LORESERVE": 0xff00 , # Start of reserved indices - "SHN_LOPROC": 0xff00 , # Start of processor-specific - "SHN_BEFORE": 0xff00 , # Order section before all others - "SHN_AFTER": 0xff01 , # Order section after all others - "SHN_HIPROC": 0xff1f , # End of processor-specific - "SHN_LOOS": 0xff20 , # Start of OS-specific - "SHN_HIOS": 0xff3f , # End of OS-specific - "SHN_ABS": 0xfff1 , # Associated symbol is absolute - "SHN_COMMON": 0xfff2 , # Associated symbol is common - "SHN_XINDEX": 0xffff , # Index is in extra table. - "SHN_HIRESERVE": 0xffff , # End of reserved indices - "SHT_NULL": 0 , # Section header table entry unused - "SHT_PROGBITS": 1 , # Program data - "SHT_SYMTAB": 2 , # Symbol table - "SHT_STRTAB": 3 , # String table - "SHT_RELA": 4 , # Relocation entries with addends - "SHT_HASH": 5 , # Symbol hash table - "SHT_DYNAMIC": 6 , # Dynamic linking information - "SHT_NOTE": 7 , # Notes - "SHT_NOBITS": 8 , # Program space with no data (bss) - "SHT_REL": 9 , # Relocation entries, no addends - "SHT_SHLIB": 10 , # Reserved - "SHT_DYNSYM": 11 , # Dynamic linker symbol table - "SHT_INIT_ARRAY": 14 , # Array of constructors - "SHT_FINI_ARRAY": 15 , # Array of destructors - "SHT_PREINIT_ARRAY": 16 , # Array of pre-constructors - "SHT_GROUP": 17 , # Section group - "SHT_SYMTAB_SHNDX": 18 , # Extended section indeces - "SHT_NUM": 19 , # Number of defined types. - "SHT_LOOS": 0x60000000 , # Start OS-specific. - "SHT_GNU_ATTRIBUTES": 0x6ffffff5 , # Object attributes. - "SHT_GNU_HASH": 0x6ffffff6 , # GNU-style hash table. - "SHT_GNU_LIBLIST": 0x6ffffff7 , # Prelink library list - "SHT_CHECKSUM": 0x6ffffff8 , # Checksum for DSO content. - "SHT_LOSUNW": 0x6ffffffa , # Sun-specific low bound. - "SHT_SUNW_move": 0x6ffffffa , # - "SHT_SUNW_COMDAT": 0x6ffffffb , # - "SHT_SUNW_syminfo": 0x6ffffffc , # - "SHT_GNU_verdef": 0x6ffffffd , # Version definition section. - "SHT_GNU_verneed": 0x6ffffffe , # Version needs section. - "SHT_GNU_versym": 0x6fffffff , # Version symbol table. - "SHT_HISUNW": 0x6fffffff , # Sun-specific high bound. - "SHT_HIOS": 0x6fffffff , # End OS-specific type - "SHT_LOPROC": 0x70000000 , # Start of processor-specific - "SHT_HIPROC": 0x7fffffff , # End of processor-specific - "SHT_LOUSER": 0x80000000 , # Start of application-specific - "SHT_HIUSER": 0x8fffffff , # End of application-specific - "SHF_MASKOS": 0x0ff00000 , # OS-specific. - "SHF_MASKPROC": 0xf0000000 , # Processor-specific - "SHF_ORDERED": (1 << 30) , # Special ordering requirement - "SHF_EXCLUDE": (1 << 31) , # Section is excluded unless - "GRP_COMDAT": 0x1 , # Mark group as COMDAT. - "SYMINFO_BT_SELF": 0xffff , # Symbol bound to self - "SYMINFO_BT_PARENT": 0xfffe , # Symbol bound to parent - "SYMINFO_BT_LOWRESERVE": 0xff00 , # Beginning of reserved entries - "SYMINFO_FLG_DIRECT": 0x0001 , # Direct bound symbol - "SYMINFO_FLG_PASSTHRU": 0x0002 , # Pass-thru symbol for translator - "SYMINFO_FLG_COPY": 0x0004 , # Symbol is a copy-reloc - "SYMINFO_FLG_LAZYLOAD": 0x0008 , # Symbol bound to object to be lazy - "SYMINFO_NONE": 0 , # - "SYMINFO_CURRENT": 1 , # - "SYMINFO_NUM": 2 , # - "STB_LOCAL": 0 , # Local symbol - "STB_GLOBAL": 1 , # Global symbol - "STB_WEAK": 2 , # Weak symbol - "STB_NUM": 3 , # Number of defined types. - "STB_LOOS": 10 , # Start of OS-specific - "STB_GNU_UNIQUE": 10 , # Unique symbol. - "STB_HIOS": 12 , # End of OS-specific - "STB_LOPROC": 13 , # Start of processor-specific - "STB_HIPROC": 15 , # End of processor-specific - "STT_NOTYPE": 0 , # Symbol type is unspecified - "STT_OBJECT": 1 , # Symbol is a data object - "STT_FUNC": 2 , # Symbol is a code object - "STT_SECTION": 3 , # Symbol associated with a section - "STT_FILE": 4 , # Symbol's name is file name - "STT_COMMON": 5 , # Symbol is a common data object - "STT_TLS": 6 , # Symbol is thread-local data object - "STT_NUM": 7 , # Number of defined types. - "STT_LOOS": 10 , # Start of OS-specific - "STT_GNU_IFUNC": 10 , # Symbol is indirect code object - "STT_HIOS": 12 , # End of OS-specific - "STT_LOPROC": 13 , # Start of processor-specific - "STT_HIPROC": 15 , # End of processor-specific - "STN_UNDEF": 0 , # End of a chain. - "STV_DEFAULT": 0 , # Default symbol visibility rules - "STV_INTERNAL": 1 , # Processor specific hidden class - "STV_HIDDEN": 2 , # Sym unavailable in other modules - "STV_PROTECTED": 3 , # Not preemptible, not exported - "PN_XNUM": 0xffff , # - "PT_NULL": 0 , # Program header table entry unused - "PT_LOAD": 1 , # Loadable program segment - "PT_DYNAMIC": 2 , # Dynamic linking information - "PT_INTERP": 3 , # Program interpreter - "PT_NOTE": 4 , # Auxiliary information - "PT_SHLIB": 5 , # Reserved - "PT_PHDR": 6 , # Entry for header table itself - "PT_TLS": 7 , # Thread-local storage segment - "PT_NUM": 8 , # Number of defined types - "PT_LOOS": 0x60000000 , # Start of OS-specific - "PT_GNU_EH_FRAME": 0x6474e550 , # GCC .eh_frame_hdr segment - "PT_GNU_STACK": 0x6474e551 , # Indicates stack executability - "PT_GNU_RELRO": 0x6474e552 , # Read-only after relocation - "PT_LOSUNW": 0x6ffffffa , # - "PT_SUNWBSS": 0x6ffffffa , # Sun Specific segment - "PT_SUNWSTACK": 0x6ffffffb , # Stack segment - "PT_HISUNW": 0x6fffffff , # - "PT_HIOS": 0x6fffffff , # End of OS-specific - "PT_LOPROC": 0x70000000 , # Start of processor-specific - "PT_HIPROC": 0x7fffffff , # End of processor-specific - "PF_X": (1 << 0) , # Segment is executable - "PF_W": (1 << 1) , # Segment is writable - "PF_R": (1 << 2) , # Segment is readable - "PF_MASKOS": 0x0ff00000 , # OS-specific - "PF_MASKPROC": 0xf0000000 , # Processor-specific - "NT_PRSTATUS": 1 , # Contains copy of prstatus struct - "NT_FPREGSET": 2 , # Contains copy of fpregset struct - "NT_PRPSINFO": 3 , # Contains copy of prpsinfo struct - "NT_PRXREG": 4 , # Contains copy of prxregset struct - "NT_TASKSTRUCT": 4 , # Contains copy of task structure - "NT_PLATFORM": 5 , # String from sysinfo(SI_PLATFORM) - "NT_AUXV": 6 , # Contains copy of auxv array - "NT_GWINDOWS": 7 , # Contains copy of gwindows struct - "NT_ASRS": 8 , # Contains copy of asrset struct - "NT_PSTATUS": 10 , # Contains copy of pstatus struct - "NT_PSINFO": 13 , # Contains copy of psinfo struct - "NT_PRCRED": 14 , # Contains copy of prcred struct - "NT_UTSNAME": 15 , # Contains copy of utsname struct - "NT_LWPSTATUS": 16 , # Contains copy of lwpstatus struct - "NT_LWPSINFO": 17 , # Contains copy of lwpinfo struct - "NT_PRFPXREG": 20 , # Contains copy of fprxregset struct - "NT_PRXFPREG": 0x46e62b7f , # Contains copy of user_fxsr_struct - "NT_PPC_VMX": 0x100 , # PowerPC Altivec/VMX registers - "NT_PPC_SPE": 0x101 , # PowerPC SPE/EVR registers - "NT_PPC_VSX": 0x102 , # PowerPC VSX registers - "NT_386_TLS": 0x200 , # i386 TLS slots (struct user_desc) - "NT_386_IOPERM": 0x201 , # x86 io permission bitmap (1=deny) - "NT_X86_XSTATE": 0x202 , # x86 extended state using xsave - "NT_VERSION": 1 , # Contains a version string. - "DT_NULL": 0 , # Marks end of dynamic section - "DT_NEEDED": 1 , # Name of needed library - "DT_PLTRELSZ": 2 , # Size in bytes of PLT relocs - "DT_PLTGOT": 3 , # Processor defined value - "DT_HASH": 4 , # Address of symbol hash table - "DT_STRTAB": 5 , # Address of string table - "DT_SYMTAB": 6 , # Address of symbol table - "DT_RELA": 7 , # Address of Rela relocs - "DT_RELASZ": 8 , # Total size of Rela relocs - "DT_RELAENT": 9 , # Size of one Rela reloc - "DT_STRSZ": 10 , # Size of string table - "DT_SYMENT": 11 , # Size of one symbol table entry - "DT_INIT": 12 , # Address of init function - "DT_FINI": 13 , # Address of termination function - "DT_SONAME": 14 , # Name of shared object - "DT_RPATH": 15 , # Library search path (deprecated) - "DT_SYMBOLIC": 16 , # Start symbol search here - "DT_REL": 17 , # Address of Rel relocs - "DT_RELSZ": 18 , # Total size of Rel relocs - "DT_RELENT": 19 , # Size of one Rel reloc - "DT_PLTREL": 20 , # Type of reloc in PLT - "DT_DEBUG": 21 , # For debugging; unspecified - "DT_TEXTREL": 22 , # Reloc might modify .text - "DT_JMPREL": 23 , # Address of PLT relocs - "DT_BIND_NOW": 24 , # Process relocations of object - "DT_INIT_ARRAY": 25 , # Array with addresses of init fct - "DT_FINI_ARRAY": 26 , # Array with addresses of fini fct - "DT_INIT_ARRAYSZ": 27 , # Size in bytes of DT_INIT_ARRAY - "DT_FINI_ARRAYSZ": 28 , # Size in bytes of DT_FINI_ARRAY - "DT_RUNPATH": 29 , # Library search path - "DT_FLAGS": 30 , # Flags for the object being loaded - "DT_ENCODING": 32 , # Start of encoded range - "DT_PREINIT_ARRAY": 32 , # Array with addresses of preinit fct - "DT_PREINIT_ARRAYSZ": 33 , # size in bytes of DT_PREINIT_ARRAY - "DT_NUM": 34 , # Number used - "DT_LOOS": 0x6000000d , # Start of OS-specific - "DT_HIOS": 0x6ffff000 , # End of OS-specific - "DT_LOPROC": 0x70000000 , # Start of processor-specific - "DT_HIPROC": 0x7fffffff , # End of processor-specific - "DT_PROCNUM": MacroRef("DT_MIPS_NUM") , # Most used by any processor - "DT_VALRNGLO": 0x6ffffd00 , # - "DT_GNU_PRELINKED": 0x6ffffdf5 , # Prelinking timestamp - "DT_GNU_CONFLICTSZ": 0x6ffffdf6 , # Size of conflict section - "DT_GNU_LIBLISTSZ": 0x6ffffdf7 , # Size of library list - "DT_CHECKSUM": 0x6ffffdf8 , # - "DT_PLTPADSZ": 0x6ffffdf9 , # - "DT_MOVEENT": 0x6ffffdfa , # - "DT_MOVESZ": 0x6ffffdfb , # - "DT_FEATURE_1": 0x6ffffdfc , # Feature selection (DTF_*). - "DT_POSFLAG_1": 0x6ffffdfd , # Flags for DT_* entries, effecting - "DT_SYMINSZ": 0x6ffffdfe , # Size of syminfo table (in bytes) - "DT_SYMINENT": 0x6ffffdff , # Entry size of syminfo - "DT_VALRNGHI": 0x6ffffdff , # - "DT_VALNUM": 12 , # - "DT_ADDRRNGLO": 0x6ffffe00 , # - "DT_GNU_HASH": 0x6ffffef5 , # GNU-style hash table. - "DT_TLSDESC_PLT": 0x6ffffef6 , # - "DT_TLSDESC_GOT": 0x6ffffef7 , # - "DT_GNU_CONFLICT": 0x6ffffef8 , # Start of conflict section - "DT_GNU_LIBLIST": 0x6ffffef9 , # Library list - "DT_CONFIG": 0x6ffffefa , # Configuration information. - "DT_DEPAUDIT": 0x6ffffefb , # Dependency auditing. - "DT_AUDIT": 0x6ffffefc , # Object auditing. - "DT_PLTPAD": 0x6ffffefd , # PLT padding. - "DT_MOVETAB": 0x6ffffefe , # Move table. - "DT_SYMINFO": 0x6ffffeff , # Syminfo table. - "DT_ADDRRNGHI": 0x6ffffeff , # - "DT_ADDRNUM": 11 , # - "DT_VERSYM": 0x6ffffff0 , # - "DT_RELACOUNT": 0x6ffffff9 , # - "DT_RELCOUNT": 0x6ffffffa , # - "DT_FLAGS_1": 0x6ffffffb , # State flags, see DF_1_* below. - "DT_VERDEF": 0x6ffffffc , # Address of version definition - "DT_VERDEFNUM": 0x6ffffffd , # Number of version definitions - "DT_VERNEED": 0x6ffffffe , # Address of table with needed - "DT_VERNEEDNUM": 0x6fffffff , # Number of needed versions - "DT_VERSIONTAGNUM": 16 , # - "DT_AUXILIARY": 0x7ffffffd , # Shared object to load before self - "DT_FILTER": 0x7fffffff , # Shared object to get values from - "DT_EXTRANUM": 3 , # - "DF_ORIGIN": 0x00000001 , # Object may use DF_ORIGIN - "DF_SYMBOLIC": 0x00000002 , # Symbol resolutions starts here - "DF_TEXTREL": 0x00000004 , # Object contains text relocations - "DF_BIND_NOW": 0x00000008 , # No lazy binding for this object - "DF_STATIC_TLS": 0x00000010 , # Module uses the static TLS model - "DF_1_NOW": 0x00000001 , # Set RTLD_NOW for this object. - "DF_1_GLOBAL": 0x00000002 , # Set RTLD_GLOBAL for this object. - "DF_1_GROUP": 0x00000004 , # Set RTLD_GROUP for this object. - "DF_1_NODELETE": 0x00000008 , # Set RTLD_NODELETE for this object. - "DF_1_LOADFLTR": 0x00000010 , # Trigger filtee loading at runtime. - "DF_1_INITFIRST": 0x00000020 , # Set RTLD_INITFIRST for this object - "DF_1_NOOPEN": 0x00000040 , # Set RTLD_NOOPEN for this object. - "DF_1_ORIGIN": 0x00000080 , # $ORIGIN must be handled. - "DF_1_DIRECT": 0x00000100 , # Direct binding enabled. - "DF_1_TRANS": 0x00000200 , # - "DF_1_INTERPOSE": 0x00000400 , # Object is used to interpose. - "DF_1_NODEFLIB": 0x00000800 , # Ignore default lib search path. - "DF_1_NODUMP": 0x00001000 , # Object can't be dldump'ed. - "DF_1_CONFALT": 0x00002000 , # Configuration alternative created. - "DF_1_ENDFILTEE": 0x00004000 , # Filtee terminates filters search. - "DF_1_DISPRELDNE": 0x00008000 , # Disp reloc applied at build time. - "DF_1_DISPRELPND": 0x00010000 , # Disp reloc applied at run-time. - "DTF_1_PARINIT": 0x00000001 , # - "DTF_1_CONFEXP": 0x00000002 , # - "DF_P1_LAZYLOAD": 0x00000001 , # Lazyload following object. - "DF_P1_GROUPPERM": 0x00000002 , # Symbols from next object are not - "VER_DEF_NONE": 0 , # No version - "VER_DEF_CURRENT": 1 , # Current version - "VER_DEF_NUM": 2 , # Given version number - "VER_FLG_BASE": 0x1 , # Version definition of file itself - "VER_FLG_WEAK": 0x2 , # Weak version identifier - "VER_NDX_LOCAL": 0 , # Symbol is local. - "VER_NDX_GLOBAL": 1 , # Symbol is global. - "VER_NDX_LORESERVE": 0xff00 , # Beginning of reserved entries. - "VER_NDX_ELIMINATE": 0xff01 , # Symbol is to be eliminated. - "VER_NEED_NONE": 0 , # No version - "VER_NEED_CURRENT": 1 , # Current version - "VER_NEED_NUM": 2 , # Given version number - "VER_FLG_WEAK": 0x2 , # Weak version identifier - "AT_NULL": 0 , # End of vector - "AT_IGNORE": 1 , # Entry should be ignored - "AT_EXECFD": 2 , # File descriptor of program - "AT_PHDR": 3 , # Program headers for program - "AT_PHENT": 4 , # Size of program header entry - "AT_PHNUM": 5 , # Number of program headers - "AT_PAGESZ": 6 , # System page size - "AT_BASE": 7 , # Base address of interpreter - "AT_FLAGS": 8 , # Flags - "AT_ENTRY": 9 , # Entry point of program - "AT_NOTELF": 10 , # Program is not ELF - "AT_UID": 11 , # Real uid - "AT_EUID": 12 , # Effective uid - "AT_GID": 13 , # Real gid - "AT_EGID": 14 , # Effective gid - "AT_CLKTCK": 17 , # Frequency of times() - "AT_PLATFORM": 15 , # String identifying platform. - "AT_HWCAP": 16 , # Machine dependent hints about - "AT_FPUCW": 18 , # Used FPU control word. - "AT_DCACHEBSIZE": 19 , # Data cache block size. - "AT_ICACHEBSIZE": 20 , # Instruction cache block size. - "AT_UCACHEBSIZE": 21 , # Unified cache block size. - "AT_IGNOREPPC": 22 , # Entry should be ignored. - "AT_SECURE": 23 , # Boolean, was exec setuid-like? - "AT_BASE_PLATFORM": 24 , # String identifying real platforms. - "AT_RANDOM": 25 , # Address of 16 random bytes. - "AT_EXECFN": 31 , # Filename of executable. - "AT_SYSINFO": 32 , # - "AT_SYSINFO_EHDR": 33 , # - "AT_L1I_CACHESHAPE": 34 , # - "AT_L1D_CACHESHAPE": 35 , # - "AT_L2_CACHESHAPE": 36 , # - "AT_L3_CACHESHAPE": 37 , # - "ELF_NOTE_SOLARIS": "SUNW Solaris" , # - "ELF_NOTE_GNU": "GNU" , # - "ELF_NOTE_PAGESIZE_HINT": 1 , # - "NT_GNU_ABI_TAG": 1 , # - "ELF_NOTE_ABI": MacroRef("NT_GNU_ABI_TAG") , # Old name. - "ELF_NOTE_OS_LINUX": 0 , # - "ELF_NOTE_OS_GNU": 1 , # - "ELF_NOTE_OS_SOLARIS2": 2 , # - "ELF_NOTE_OS_FREEBSD": 3 , # - "NT_GNU_HWCAP": 2 , # - "NT_GNU_BUILD_ID": 3 , # - "NT_GNU_GOLD_VERSION": 4 , # - "EF_CPU32": 0x00810000 , # - "R_68K_NONE": 0 , # No reloc - "R_68K_32": 1 , # Direct 32 bit - "R_68K_16": 2 , # Direct 16 bit - "R_68K_8": 3 , # Direct 8 bit - "R_68K_PC32": 4 , # PC relative 32 bit - "R_68K_PC16": 5 , # PC relative 16 bit - "R_68K_PC8": 6 , # PC relative 8 bit - "R_68K_GOT32": 7 , # 32 bit PC relative GOT entry - "R_68K_GOT16": 8 , # 16 bit PC relative GOT entry - "R_68K_GOT8": 9 , # 8 bit PC relative GOT entry - "R_68K_GOT32O": 10 , # 32 bit GOT offset - "R_68K_GOT16O": 11 , # 16 bit GOT offset - "R_68K_GOT8O": 12 , # 8 bit GOT offset - "R_68K_PLT32": 13 , # 32 bit PC relative PLT address - "R_68K_PLT16": 14 , # 16 bit PC relative PLT address - "R_68K_PLT8": 15 , # 8 bit PC relative PLT address - "R_68K_PLT32O": 16 , # 32 bit PLT offset - "R_68K_PLT16O": 17 , # 16 bit PLT offset - "R_68K_PLT8O": 18 , # 8 bit PLT offset - "R_68K_COPY": 19 , # Copy symbol at runtime - "R_68K_GLOB_DAT": 20 , # Create GOT entry - "R_68K_JMP_SLOT": 21 , # Create PLT entry - "R_68K_RELATIVE": 22 , # Adjust by program base - "R_68K_TLS_GD32": 25 , # 32 bit GOT offset for GD - "R_68K_TLS_GD16": 26 , # 16 bit GOT offset for GD - "R_68K_TLS_GD8": 27 , # 8 bit GOT offset for GD - "R_68K_TLS_LDM32": 28 , # 32 bit GOT offset for LDM - "R_68K_TLS_LDM16": 29 , # 16 bit GOT offset for LDM - "R_68K_TLS_LDM8": 30 , # 8 bit GOT offset for LDM - "R_68K_TLS_LDO32": 31 , # 32 bit module-relative offset - "R_68K_TLS_LDO16": 32 , # 16 bit module-relative offset - "R_68K_TLS_LDO8": 33 , # 8 bit module-relative offset - "R_68K_TLS_IE32": 34 , # 32 bit GOT offset for IE - "R_68K_TLS_IE16": 35 , # 16 bit GOT offset for IE - "R_68K_TLS_IE8": 36 , # 8 bit GOT offset for IE - "R_68K_TLS_LE32": 37 , # 32 bit offset relative to - "R_68K_TLS_LE16": 38 , # 16 bit offset relative to - "R_68K_TLS_LE8": 39 , # 8 bit offset relative to - "R_68K_TLS_DTPMOD32": 40 , # 32 bit module number - "R_68K_TLS_DTPREL32": 41 , # 32 bit module-relative offset - "R_68K_TLS_TPREL32": 42 , # 32 bit TP-relative offset - "R_68K_NUM": 43 , # - "R_386_NONE": 0 , # No reloc - "R_386_32": 1 , # Direct 32 bit - "R_386_PC32": 2 , # PC relative 32 bit - "R_386_GOT32": 3 , # 32 bit GOT entry - "R_386_PLT32": 4 , # 32 bit PLT address - "R_386_COPY": 5 , # Copy symbol at runtime - "R_386_GLOB_DAT": 6 , # Create GOT entry - "R_386_JMP_SLOT": 7 , # Create PLT entry - "R_386_RELATIVE": 8 , # Adjust by program base - "R_386_GOTOFF": 9 , # 32 bit offset to GOT - "R_386_GOTPC": 10 , # 32 bit PC relative offset to GOT - "R_386_32PLT": 11 , # - "R_386_TLS_TPOFF": 14 , # Offset in static TLS block - "R_386_TLS_IE": 15 , # Address of GOT entry for static TLS - "R_386_TLS_GOTIE": 16 , # GOT entry for static TLS block - "R_386_TLS_LE": 17 , # Offset relative to static TLS - "R_386_TLS_GD": 18 , # Direct 32 bit for GNU version of - "R_386_TLS_LDM": 19 , # Direct 32 bit for GNU version of - "R_386_16": 20 , # - "R_386_PC16": 21 , # - "R_386_8": 22 , # - "R_386_PC8": 23 , # - "R_386_TLS_GD_32": 24 , # Direct 32 bit for general dynamic - "R_386_TLS_GD_PUSH": 25 , # Tag for pushl in GD TLS code - "R_386_TLS_GD_CALL": 26 , # Relocation for call to - "R_386_TLS_GD_POP": 27 , # Tag for popl in GD TLS code - "R_386_TLS_LDM_32": 28 , # Direct 32 bit for local dynamic - "R_386_TLS_LDM_PUSH": 29 , # Tag for pushl in LDM TLS code - "R_386_TLS_LDM_CALL": 30 , # Relocation for call to - "R_386_TLS_LDM_POP": 31 , # Tag for popl in LDM TLS code - "R_386_TLS_LDO_32": 32 , # Offset relative to TLS block - "R_386_TLS_IE_32": 33 , # GOT entry for negated static TLS - "R_386_TLS_LE_32": 34 , # Negated offset relative to static - "R_386_TLS_DTPMOD32": 35 , # ID of module containing symbol - "R_386_TLS_DTPOFF32": 36 , # Offset in TLS block - "R_386_TLS_TPOFF32": 37 , # Negated offset in static TLS block - "R_386_TLS_GOTDESC": 39 , # GOT offset for TLS descriptor. - "R_386_TLS_DESC_CALL": 40 , # Marker of call through TLS - "R_386_TLS_DESC": 41 , # TLS descriptor containing - "R_386_IRELATIVE": 42 , # Adjust indirectly by program base - "R_386_NUM": 43 , # - "STT_SPARC_REGISTER": 13 , # Global register reserved to app. - "EF_SPARCV9_MM": 3 , # - "EF_SPARCV9_TSO": 0 , # - "EF_SPARCV9_PSO": 1 , # - "EF_SPARCV9_RMO": 2 , # - "EF_SPARC_LEDATA": 0x800000 , # little endian data - "EF_SPARC_EXT_MASK": 0xFFFF00 , # - "EF_SPARC_32PLUS": 0x000100 , # generic V8+ features - "EF_SPARC_SUN_US1": 0x000200 , # Sun UltraSPARC1 extensions - "EF_SPARC_HAL_R1": 0x000400 , # HAL R1 extensions - "EF_SPARC_SUN_US3": 0x000800 , # Sun UltraSPARCIII extensions - "R_SPARC_NONE": 0 , # No reloc - "R_SPARC_8": 1 , # Direct 8 bit - "R_SPARC_16": 2 , # Direct 16 bit - "R_SPARC_32": 3 , # Direct 32 bit - "R_SPARC_DISP8": 4 , # PC relative 8 bit - "R_SPARC_DISP16": 5 , # PC relative 16 bit - "R_SPARC_DISP32": 6 , # PC relative 32 bit - "R_SPARC_WDISP30": 7 , # PC relative 30 bit shifted - "R_SPARC_WDISP22": 8 , # PC relative 22 bit shifted - "R_SPARC_HI22": 9 , # High 22 bit - "R_SPARC_22": 10 , # Direct 22 bit - "R_SPARC_13": 11 , # Direct 13 bit - "R_SPARC_LO10": 12 , # Truncated 10 bit - "R_SPARC_GOT10": 13 , # Truncated 10 bit GOT entry - "R_SPARC_GOT13": 14 , # 13 bit GOT entry - "R_SPARC_GOT22": 15 , # 22 bit GOT entry shifted - "R_SPARC_PC10": 16 , # PC relative 10 bit truncated - "R_SPARC_PC22": 17 , # PC relative 22 bit shifted - "R_SPARC_WPLT30": 18 , # 30 bit PC relative PLT address - "R_SPARC_COPY": 19 , # Copy symbol at runtime - "R_SPARC_GLOB_DAT": 20 , # Create GOT entry - "R_SPARC_JMP_SLOT": 21 , # Create PLT entry - "R_SPARC_RELATIVE": 22 , # Adjust by program base - "R_SPARC_UA32": 23 , # Direct 32 bit unaligned - "R_SPARC_PLT32": 24 , # Direct 32 bit ref to PLT entry - "R_SPARC_HIPLT22": 25 , # High 22 bit PLT entry - "R_SPARC_LOPLT10": 26 , # Truncated 10 bit PLT entry - "R_SPARC_PCPLT32": 27 , # PC rel 32 bit ref to PLT entry - "R_SPARC_PCPLT22": 28 , # PC rel high 22 bit PLT entry - "R_SPARC_PCPLT10": 29 , # PC rel trunc 10 bit PLT entry - "R_SPARC_10": 30 , # Direct 10 bit - "R_SPARC_11": 31 , # Direct 11 bit - "R_SPARC_64": 32 , # Direct 64 bit - "R_SPARC_OLO10": 33 , # 10bit with secondary 13bit addend - "R_SPARC_HH22": 34 , # Top 22 bits of direct 64 bit - "R_SPARC_HM10": 35 , # High middle 10 bits of ... - "R_SPARC_LM22": 36 , # Low middle 22 bits of ... - "R_SPARC_PC_HH22": 37 , # Top 22 bits of pc rel 64 bit - "R_SPARC_PC_HM10": 38 , # High middle 10 bit of ... - "R_SPARC_PC_LM22": 39 , # Low miggle 22 bits of ... - "R_SPARC_WDISP16": 40 , # PC relative 16 bit shifted - "R_SPARC_WDISP19": 41 , # PC relative 19 bit shifted - "R_SPARC_GLOB_JMP": 42 , # was part of v9 ABI but was removed - "R_SPARC_7": 43 , # Direct 7 bit - "R_SPARC_5": 44 , # Direct 5 bit - "R_SPARC_6": 45 , # Direct 6 bit - "R_SPARC_DISP64": 46 , # PC relative 64 bit - "R_SPARC_PLT64": 47 , # Direct 64 bit ref to PLT entry - "R_SPARC_HIX22": 48 , # High 22 bit complemented - "R_SPARC_LOX10": 49 , # Truncated 11 bit complemented - "R_SPARC_H44": 50 , # Direct high 12 of 44 bit - "R_SPARC_M44": 51 , # Direct mid 22 of 44 bit - "R_SPARC_L44": 52 , # Direct low 10 of 44 bit - "R_SPARC_REGISTER": 53 , # Global register usage - "R_SPARC_UA64": 54 , # Direct 64 bit unaligned - "R_SPARC_UA16": 55 , # Direct 16 bit unaligned - "R_SPARC_TLS_GD_HI22": 56 , # - "R_SPARC_TLS_GD_LO10": 57 , # - "R_SPARC_TLS_GD_ADD": 58 , # - "R_SPARC_TLS_GD_CALL": 59 , # - "R_SPARC_TLS_LDM_HI22": 60 , # - "R_SPARC_TLS_LDM_LO10": 61 , # - "R_SPARC_TLS_LDM_ADD": 62 , # - "R_SPARC_TLS_LDM_CALL": 63 , # - "R_SPARC_TLS_LDO_HIX22": 64 , # - "R_SPARC_TLS_LDO_LOX10": 65 , # - "R_SPARC_TLS_LDO_ADD": 66 , # - "R_SPARC_TLS_IE_HI22": 67 , # - "R_SPARC_TLS_IE_LO10": 68 , # - "R_SPARC_TLS_IE_LD": 69 , # - "R_SPARC_TLS_IE_LDX": 70 , # - "R_SPARC_TLS_IE_ADD": 71 , # - "R_SPARC_TLS_LE_HIX22": 72 , # - "R_SPARC_TLS_LE_LOX10": 73 , # - "R_SPARC_TLS_DTPMOD32": 74 , # - "R_SPARC_TLS_DTPMOD64": 75 , # - "R_SPARC_TLS_DTPOFF32": 76 , # - "R_SPARC_TLS_DTPOFF64": 77 , # - "R_SPARC_TLS_TPOFF32": 78 , # - "R_SPARC_TLS_TPOFF64": 79 , # - "R_SPARC_GOTDATA_HIX22": 80 , # - "R_SPARC_GOTDATA_LOX10": 81 , # - "R_SPARC_GOTDATA_OP_HIX22": 82 , # - "R_SPARC_GOTDATA_OP_LOX10": 83 , # - "R_SPARC_GOTDATA_OP": 84 , # - "R_SPARC_H34": 85 , # - "R_SPARC_SIZE32": 86 , # - "R_SPARC_SIZE64": 87 , # - "R_SPARC_JMP_IREL": 248 , # - "R_SPARC_IRELATIVE": 249 , # - "R_SPARC_GNU_VTINHERIT": 250 , # - "R_SPARC_GNU_VTENTRY": 251 , # - "R_SPARC_REV32": 252 , # - "R_SPARC_NUM": 253 , # - "DT_SPARC_REGISTER": 0x70000001 , # - "DT_SPARC_NUM": 2 , # - "EF_MIPS_NOREORDER": 1 , # A .noreorder directive was used - "EF_MIPS_PIC": 2 , # Contains PIC code - "EF_MIPS_CPIC": 4 , # Uses PIC calling sequence - "EF_MIPS_XGOT": 8 , # - "EF_MIPS_64BIT_WHIRL": 16 , # - "EF_MIPS_ABI2": 32 , # - "EF_MIPS_ABI_ON32": 64 , # - "EF_MIPS_ARCH": 0xf0000000 , # MIPS architecture level - "EF_MIPS_ARCH_1": 0x00000000 , # -mips1 code. - "EF_MIPS_ARCH_2": 0x10000000 , # -mips2 code. - "EF_MIPS_ARCH_3": 0x20000000 , # -mips3 code. - "EF_MIPS_ARCH_4": 0x30000000 , # -mips4 code. - "EF_MIPS_ARCH_5": 0x40000000 , # -mips5 code. - "EF_MIPS_ARCH_32": 0x60000000 , # MIPS32 code. - "EF_MIPS_ARCH_64": 0x70000000 , # MIPS64 code. - "E_MIPS_ARCH_1": 0x00000000 , # -mips1 code. - "E_MIPS_ARCH_2": 0x10000000 , # -mips2 code. - "E_MIPS_ARCH_3": 0x20000000 , # -mips3 code. - "E_MIPS_ARCH_4": 0x30000000 , # -mips4 code. - "E_MIPS_ARCH_5": 0x40000000 , # -mips5 code. - "E_MIPS_ARCH_32": 0x60000000 , # MIPS32 code. - "E_MIPS_ARCH_64": 0x70000000 , # MIPS64 code. - "SHN_MIPS_ACOMMON": 0xff00 , # Allocated common symbols - "SHN_MIPS_TEXT": 0xff01 , # Allocated test symbols. - "SHN_MIPS_DATA": 0xff02 , # Allocated data symbols. - "SHN_MIPS_SCOMMON": 0xff03 , # Small common symbols - "SHN_MIPS_SUNDEFINED": 0xff04 , # Small undefined symbols - "SHT_MIPS_LIBLIST": 0x70000000 , # Shared objects used in link - "SHT_MIPS_MSYM": 0x70000001 , # - "SHT_MIPS_CONFLICT": 0x70000002 , # Conflicting symbols - "SHT_MIPS_GPTAB": 0x70000003 , # Global data area sizes - "SHT_MIPS_UCODE": 0x70000004 , # Reserved for SGI/MIPS compilers - "SHT_MIPS_DEBUG": 0x70000005 , # MIPS ECOFF debugging information - "SHT_MIPS_REGINFO": 0x70000006 , # Register usage information - "SHT_MIPS_PACKAGE": 0x70000007 , # - "SHT_MIPS_PACKSYM": 0x70000008 , # - "SHT_MIPS_RELD": 0x70000009 , # - "SHT_MIPS_IFACE": 0x7000000b , # - "SHT_MIPS_CONTENT": 0x7000000c , # - "SHT_MIPS_OPTIONS": 0x7000000d , # Miscellaneous options. - "SHT_MIPS_SHDR": 0x70000010 , # - "SHT_MIPS_FDESC": 0x70000011 , # - "SHT_MIPS_EXTSYM": 0x70000012 , # - "SHT_MIPS_DENSE": 0x70000013 , # - "SHT_MIPS_PDESC": 0x70000014 , # - "SHT_MIPS_LOCSYM": 0x70000015 , # - "SHT_MIPS_AUXSYM": 0x70000016 , # - "SHT_MIPS_OPTSYM": 0x70000017 , # - "SHT_MIPS_LOCSTR": 0x70000018 , # - "SHT_MIPS_LINE": 0x70000019 , # - "SHT_MIPS_RFDESC": 0x7000001a , # - "SHT_MIPS_DELTASYM": 0x7000001b , # - "SHT_MIPS_DELTAINST": 0x7000001c , # - "SHT_MIPS_DELTACLASS": 0x7000001d , # - "SHT_MIPS_DWARF": 0x7000001e , # DWARF debugging information. - "SHT_MIPS_DELTADECL": 0x7000001f , # - "SHT_MIPS_SYMBOL_LIB": 0x70000020 , # - "SHT_MIPS_EVENTS": 0x70000021 , # Event section. - "SHT_MIPS_TRANSLATE": 0x70000022 , # - "SHT_MIPS_PIXIE": 0x70000023 , # - "SHT_MIPS_XLATE": 0x70000024 , # - "SHT_MIPS_XLATE_DEBUG": 0x70000025 , # - "SHT_MIPS_WHIRL": 0x70000026 , # - "SHT_MIPS_EH_REGION": 0x70000027 , # - "SHT_MIPS_XLATE_OLD": 0x70000028 , # - "SHT_MIPS_PDR_EXCEPTION": 0x70000029 , # - "SHF_MIPS_GPREL": 0x10000000 , # Must be part of global data area - "SHF_MIPS_MERGE": 0x20000000 , # - "SHF_MIPS_ADDR": 0x40000000 , # - "SHF_MIPS_STRINGS": 0x80000000 , # - "SHF_MIPS_NOSTRIP": 0x08000000 , # - "SHF_MIPS_LOCAL": 0x04000000 , # - "SHF_MIPS_NAMES": 0x02000000 , # - "SHF_MIPS_NODUPE": 0x01000000 , # - "STO_MIPS_DEFAULT": 0x0 , # - "STO_MIPS_INTERNAL": 0x1 , # - "STO_MIPS_HIDDEN": 0x2 , # - "STO_MIPS_PROTECTED": 0x3 , # - "STO_MIPS_PLT": 0x8 , # - "STO_MIPS_SC_ALIGN_UNUSED": 0xff , # - "STB_MIPS_SPLIT_COMMON": 13 , # - "ODK_NULL": 0 , # Undefined. - "ODK_REGINFO": 1 , # Register usage information. - "ODK_EXCEPTIONS": 2 , # Exception processing options. - "ODK_PAD": 3 , # Section padding options. - "ODK_HWPATCH": 4 , # Hardware workarounds performed - "ODK_FILL": 5 , # record the fill value used by the linker. - "ODK_TAGS": 6 , # reserve space for desktop tools to write. - "ODK_HWAND": 7 , # HW workarounds. 'AND' bits when merging. - "ODK_HWOR": 8 , # HW workarounds. 'OR' bits when merging. - "OEX_FPU_MIN": 0x1f , # FPE's which MUST be enabled. - "OEX_FPU_MAX": 0x1f00 , # FPE's which MAY be enabled. - "OEX_PAGE0": 0x10000 , # page zero must be mapped. - "OEX_SMM": 0x20000 , # Force sequential memory mode? - "OEX_FPDBUG": 0x40000 , # Force floating point debug mode? - "OEX_PRECISEFP": MacroRef("OEX_FPDBUG") , # - "OEX_DISMISS": 0x80000 , # Dismiss invalid address faults? - "OEX_FPU_INVAL": 0x10 , # - "OEX_FPU_DIV0": 0x08 , # - "OEX_FPU_OFLO": 0x04 , # - "OEX_FPU_UFLO": 0x02 , # - "OEX_FPU_INEX": 0x01 , # - "OHW_R4KEOP": 0x1 , # R4000 end-of-page patch. - "OHW_R8KPFETCH": 0x2 , # may need R8000 prefetch patch. - "OHW_R5KEOP": 0x4 , # R5000 end-of-page patch. - "OHW_R5KCVTL": 0x8 , # R5000 cvt.[ds].l bug. clean=1. - "OPAD_PREFIX": 0x1 , # - "OPAD_POSTFIX": 0x2 , # - "OPAD_SYMBOL": 0x4 , # - "OHWA0_R4KEOP_CHECKED": 0x00000001 , # - "OHWA1_R4KEOP_CLEAN": 0x00000002 , # - "R_MIPS_NONE": 0 , # No reloc - "R_MIPS_16": 1 , # Direct 16 bit - "R_MIPS_32": 2 , # Direct 32 bit - "R_MIPS_REL32": 3 , # PC relative 32 bit - "R_MIPS_26": 4 , # Direct 26 bit shifted - "R_MIPS_HI16": 5 , # High 16 bit - "R_MIPS_LO16": 6 , # Low 16 bit - "R_MIPS_GPREL16": 7 , # GP relative 16 bit - "R_MIPS_LITERAL": 8 , # 16 bit literal entry - "R_MIPS_GOT16": 9 , # 16 bit GOT entry - "R_MIPS_PC16": 10 , # PC relative 16 bit - "R_MIPS_CALL16": 11 , # 16 bit GOT entry for function - "R_MIPS_GPREL32": 12 , # GP relative 32 bit - "R_MIPS_SHIFT5": 16 , # - "R_MIPS_SHIFT6": 17 , # - "R_MIPS_64": 18 , # - "R_MIPS_GOT_DISP": 19 , # - "R_MIPS_GOT_PAGE": 20 , # - "R_MIPS_GOT_OFST": 21 , # - "R_MIPS_GOT_HI16": 22 , # - "R_MIPS_GOT_LO16": 23 , # - "R_MIPS_SUB": 24 , # - "R_MIPS_INSERT_A": 25 , # - "R_MIPS_INSERT_B": 26 , # - "R_MIPS_DELETE": 27 , # - "R_MIPS_HIGHER": 28 , # - "R_MIPS_HIGHEST": 29 , # - "R_MIPS_CALL_HI16": 30 , # - "R_MIPS_CALL_LO16": 31 , # - "R_MIPS_SCN_DISP": 32 , # - "R_MIPS_REL16": 33 , # - "R_MIPS_ADD_IMMEDIATE": 34 , # - "R_MIPS_PJUMP": 35 , # - "R_MIPS_RELGOT": 36 , # - "R_MIPS_JALR": 37 , # - "R_MIPS_TLS_DTPMOD32": 38 , # Module number 32 bit - "R_MIPS_TLS_DTPREL32": 39 , # Module-relative offset 32 bit - "R_MIPS_TLS_DTPMOD64": 40 , # Module number 64 bit - "R_MIPS_TLS_DTPREL64": 41 , # Module-relative offset 64 bit - "R_MIPS_TLS_GD": 42 , # 16 bit GOT offset for GD - "R_MIPS_TLS_LDM": 43 , # 16 bit GOT offset for LDM - "R_MIPS_TLS_DTPREL_HI16": 44 , # Module-relative offset, high 16 bits - "R_MIPS_TLS_DTPREL_LO16": 45 , # Module-relative offset, low 16 bits - "R_MIPS_TLS_GOTTPREL": 46 , # 16 bit GOT offset for IE - "R_MIPS_TLS_TPREL32": 47 , # TP-relative offset, 32 bit - "R_MIPS_TLS_TPREL64": 48 , # TP-relative offset, 64 bit - "R_MIPS_TLS_TPREL_HI16": 49 , # TP-relative offset, high 16 bits - "R_MIPS_TLS_TPREL_LO16": 50 , # TP-relative offset, low 16 bits - "R_MIPS_GLOB_DAT": 51 , # - "R_MIPS_COPY": 126 , # - "R_MIPS_JUMP_SLOT": 127 , # - "R_MIPS_NUM": 128 , # - "PT_MIPS_REGINFO": 0x70000000 , # Register usage information - "PT_MIPS_RTPROC": 0x70000001 , # Runtime procedure table. - "PT_MIPS_OPTIONS": 0x70000002 , # - "PF_MIPS_LOCAL": 0x10000000 , # - "DT_MIPS_RLD_VERSION": 0x70000001 , # Runtime linker interface version - "DT_MIPS_TIME_STAMP": 0x70000002 , # Timestamp - "DT_MIPS_ICHECKSUM": 0x70000003 , # Checksum - "DT_MIPS_IVERSION": 0x70000004 , # Version string (string tbl index) - "DT_MIPS_FLAGS": 0x70000005 , # Flags - "DT_MIPS_BASE_ADDRESS": 0x70000006 , # Base address - "DT_MIPS_MSYM": 0x70000007 , # - "DT_MIPS_CONFLICT": 0x70000008 , # Address of CONFLICT section - "DT_MIPS_LIBLIST": 0x70000009 , # Address of LIBLIST section - "DT_MIPS_LOCAL_GOTNO": 0x7000000a , # Number of local GOT entries - "DT_MIPS_CONFLICTNO": 0x7000000b , # Number of CONFLICT entries - "DT_MIPS_LIBLISTNO": 0x70000010 , # Number of LIBLIST entries - "DT_MIPS_SYMTABNO": 0x70000011 , # Number of DYNSYM entries - "DT_MIPS_UNREFEXTNO": 0x70000012 , # First external DYNSYM - "DT_MIPS_GOTSYM": 0x70000013 , # First GOT entry in DYNSYM - "DT_MIPS_HIPAGENO": 0x70000014 , # Number of GOT page table entries - "DT_MIPS_RLD_MAP": 0x70000016 , # Address of run time loader map. - "DT_MIPS_DELTA_CLASS": 0x70000017 , # Delta C++ class definition. - "DT_MIPS_DELTA_CLASS_NO": 0x70000018 , # Number of entries in - "DT_MIPS_DELTA_INSTANCE": 0x70000019 , # Delta C++ class instances. - "DT_MIPS_DELTA_INSTANCE_NO": 0x7000001a , # Number of entries in - "DT_MIPS_DELTA_RELOC": 0x7000001b , # Delta relocations. - "DT_MIPS_DELTA_RELOC_NO": 0x7000001c , # Number of entries in - "DT_MIPS_DELTA_SYM": 0x7000001d , # Delta symbols that Delta - "DT_MIPS_DELTA_SYM_NO": 0x7000001e , # Number of entries in - "DT_MIPS_DELTA_CLASSSYM": 0x70000020 , # Delta symbols that hold the - "DT_MIPS_DELTA_CLASSSYM_NO": 0x70000021 , # Number of entries in - "DT_MIPS_CXX_FLAGS": 0x70000022 , # Flags indicating for C++ flavor. - "DT_MIPS_PIXIE_INIT": 0x70000023 , # - "DT_MIPS_SYMBOL_LIB": 0x70000024 , # - "DT_MIPS_LOCALPAGE_GOTIDX": 0x70000025 , # - "DT_MIPS_LOCAL_GOTIDX": 0x70000026 , # - "DT_MIPS_HIDDEN_GOTIDX": 0x70000027 , # - "DT_MIPS_PROTECTED_GOTIDX": 0x70000028 , # - "DT_MIPS_OPTIONS": 0x70000029 , # Address of .options. - "DT_MIPS_INTERFACE": 0x7000002a , # Address of .interface. - "DT_MIPS_DYNSTR_ALIGN": 0x7000002b , # - "DT_MIPS_INTERFACE_SIZE": 0x7000002c , # Size of the .interface section. - "DT_MIPS_RLD_TEXT_RESOLVE_ADDR": 0x7000002d , # Address of rld_text_rsolve - "DT_MIPS_PERF_SUFFIX": 0x7000002e , # Default suffix of dso to be added - "DT_MIPS_COMPACT_SIZE": 0x7000002f , # (O32)Size of compact rel section. - "DT_MIPS_GP_VALUE": 0x70000030 , # GP value for aux GOTs. - "DT_MIPS_AUX_DYNAMIC": 0x70000031 , # Address of aux .dynamic. - "DT_MIPS_PLTGOT": 0x70000032 , # - "DT_MIPS_RWPLT": 0x70000034 , # - "DT_MIPS_NUM": 0x35 , # - "RHF_NONE": 0 , # No flags - "RHF_QUICKSTART": (1 << 0) , # Use quickstart - "RHF_NOTPOT": (1 << 1) , # Hash size not power of 2 - "RHF_NO_LIBRARY_REPLACEMENT": (1 << 2) , # Ignore LD_LIBRARY_PATH - "RHF_NO_MOVE": (1 << 3) , # - "RHF_SGI_ONLY": (1 << 4) , # - "RHF_GUARANTEE_INIT": (1 << 5) , # - "RHF_DELTA_C_PLUS_PLUS": (1 << 6) , # - "RHF_GUARANTEE_START_INIT": (1 << 7) , # - "RHF_PIXIE": (1 << 8) , # - "RHF_DEFAULT_DELAY_LOAD": (1 << 9) , # - "RHF_REQUICKSTART": (1 << 10) , # - "RHF_REQUICKSTARTED": (1 << 11) , # - "RHF_CORD": (1 << 12) , # - "RHF_NO_UNRES_UNDEF": (1 << 13) , # - "RHF_RLD_ORDER_SAFE": (1 << 14) , # - "LL_NONE": 0 , # - "LL_EXACT_MATCH": (1 << 0) , # Require exact match - "LL_IGNORE_INT_VER": (1 << 1) , # Ignore interface version - "LL_REQUIRE_MINOR": (1 << 2) , # - "LL_EXPORTS": (1 << 3) , # - "LL_DELAY_LOAD": (1 << 4) , # - "LL_DELTA": (1 << 5) , # - "EF_PARISC_TRAPNIL": 0x00010000 , # Trap nil pointer dereference. - "EF_PARISC_EXT": 0x00020000 , # Program uses arch. extensions. - "EF_PARISC_LSB": 0x00040000 , # Program expects little endian. - "EF_PARISC_WIDE": 0x00080000 , # Program expects wide mode. - "EF_PARISC_NO_KABP": 0x00100000 , # No kernel assisted branch - "EF_PARISC_LAZYSWAP": 0x00400000 , # Allow lazy swapping. - "EF_PARISC_ARCH": 0x0000ffff , # Architecture version. - "EFA_PARISC_1_0": 0x020b , # PA-RISC 1.0 big-endian. - "EFA_PARISC_1_1": 0x0210 , # PA-RISC 1.1 big-endian. - "EFA_PARISC_2_0": 0x0214 , # PA-RISC 2.0 big-endian. - "SHN_PARISC_ANSI_COMMON": 0xff00 , # Section for tenatively declared - "SHN_PARISC_HUGE_COMMON": 0xff01 , # Common blocks in huge model. - "SHT_PARISC_EXT": 0x70000000 , # Contains product specific ext. - "SHT_PARISC_UNWIND": 0x70000001 , # Unwind information. - "SHT_PARISC_DOC": 0x70000002 , # Debug info for optimized code. - "SHF_PARISC_SHORT": 0x20000000 , # Section with short addressing. - "SHF_PARISC_HUGE": 0x40000000 , # Section far from gp. - "SHF_PARISC_SBP": 0x80000000 , # Static branch prediction code. - "STT_PARISC_MILLICODE": 13 , # Millicode function entry point. - "STT_HP_OPAQUE": (MacroRef("STT_LOOS") + 0x1) , # - "STT_HP_STUB": (MacroRef("STT_LOOS") + 0x2) , # - "R_PARISC_NONE": 0 , # No reloc. - "R_PARISC_DIR32": 1 , # Direct 32-bit reference. - "R_PARISC_DIR21L": 2 , # Left 21 bits of eff. address. - "R_PARISC_DIR17R": 3 , # Right 17 bits of eff. address. - "R_PARISC_DIR17F": 4 , # 17 bits of eff. address. - "R_PARISC_DIR14R": 6 , # Right 14 bits of eff. address. - "R_PARISC_PCREL32": 9 , # 32-bit rel. address. - "R_PARISC_PCREL21L": 10 , # Left 21 bits of rel. address. - "R_PARISC_PCREL17R": 11 , # Right 17 bits of rel. address. - "R_PARISC_PCREL17F": 12 , # 17 bits of rel. address. - "R_PARISC_PCREL14R": 14 , # Right 14 bits of rel. address. - "R_PARISC_DPREL21L": 18 , # Left 21 bits of rel. address. - "R_PARISC_DPREL14R": 22 , # Right 14 bits of rel. address. - "R_PARISC_GPREL21L": 26 , # GP-relative, left 21 bits. - "R_PARISC_GPREL14R": 30 , # GP-relative, right 14 bits. - "R_PARISC_LTOFF21L": 34 , # LT-relative, left 21 bits. - "R_PARISC_LTOFF14R": 38 , # LT-relative, right 14 bits. - "R_PARISC_SECREL32": 41 , # 32 bits section rel. address. - "R_PARISC_SEGBASE": 48 , # No relocation, set segment base. - "R_PARISC_SEGREL32": 49 , # 32 bits segment rel. address. - "R_PARISC_PLTOFF21L": 50 , # PLT rel. address, left 21 bits. - "R_PARISC_PLTOFF14R": 54 , # PLT rel. address, right 14 bits. - "R_PARISC_LTOFF_FPTR32": 57 , # 32 bits LT-rel. function pointer. - "R_PARISC_LTOFF_FPTR21L": 58 , # LT-rel. fct ptr, left 21 bits. - "R_PARISC_LTOFF_FPTR14R": 62 , # LT-rel. fct ptr, right 14 bits. - "R_PARISC_FPTR64": 64 , # 64 bits function address. - "R_PARISC_PLABEL32": 65 , # 32 bits function address. - "R_PARISC_PLABEL21L": 66 , # Left 21 bits of fdesc address. - "R_PARISC_PLABEL14R": 70 , # Right 14 bits of fdesc address. - "R_PARISC_PCREL64": 72 , # 64 bits PC-rel. address. - "R_PARISC_PCREL22F": 74 , # 22 bits PC-rel. address. - "R_PARISC_PCREL14WR": 75 , # PC-rel. address, right 14 bits. - "R_PARISC_PCREL14DR": 76 , # PC rel. address, right 14 bits. - "R_PARISC_PCREL16F": 77 , # 16 bits PC-rel. address. - "R_PARISC_PCREL16WF": 78 , # 16 bits PC-rel. address. - "R_PARISC_PCREL16DF": 79 , # 16 bits PC-rel. address. - "R_PARISC_DIR64": 80 , # 64 bits of eff. address. - "R_PARISC_DIR14WR": 83 , # 14 bits of eff. address. - "R_PARISC_DIR14DR": 84 , # 14 bits of eff. address. - "R_PARISC_DIR16F": 85 , # 16 bits of eff. address. - "R_PARISC_DIR16WF": 86 , # 16 bits of eff. address. - "R_PARISC_DIR16DF": 87 , # 16 bits of eff. address. - "R_PARISC_GPREL64": 88 , # 64 bits of GP-rel. address. - "R_PARISC_GPREL14WR": 91 , # GP-rel. address, right 14 bits. - "R_PARISC_GPREL14DR": 92 , # GP-rel. address, right 14 bits. - "R_PARISC_GPREL16F": 93 , # 16 bits GP-rel. address. - "R_PARISC_GPREL16WF": 94 , # 16 bits GP-rel. address. - "R_PARISC_GPREL16DF": 95 , # 16 bits GP-rel. address. - "R_PARISC_LTOFF64": 96 , # 64 bits LT-rel. address. - "R_PARISC_LTOFF14WR": 99 , # LT-rel. address, right 14 bits. - "R_PARISC_LTOFF14DR": 100 , # LT-rel. address, right 14 bits. - "R_PARISC_LTOFF16F": 101 , # 16 bits LT-rel. address. - "R_PARISC_LTOFF16WF": 102 , # 16 bits LT-rel. address. - "R_PARISC_LTOFF16DF": 103 , # 16 bits LT-rel. address. - "R_PARISC_SECREL64": 104 , # 64 bits section rel. address. - "R_PARISC_SEGREL64": 112 , # 64 bits segment rel. address. - "R_PARISC_PLTOFF14WR": 115 , # PLT-rel. address, right 14 bits. - "R_PARISC_PLTOFF14DR": 116 , # PLT-rel. address, right 14 bits. - "R_PARISC_PLTOFF16F": 117 , # 16 bits LT-rel. address. - "R_PARISC_PLTOFF16WF": 118 , # 16 bits PLT-rel. address. - "R_PARISC_PLTOFF16DF": 119 , # 16 bits PLT-rel. address. - "R_PARISC_LTOFF_FPTR64": 120 , # 64 bits LT-rel. function ptr. - "R_PARISC_LTOFF_FPTR14WR": 123 , # LT-rel. fct. ptr., right 14 bits. - "R_PARISC_LTOFF_FPTR14DR": 124 , # LT-rel. fct. ptr., right 14 bits. - "R_PARISC_LTOFF_FPTR16F": 125 , # 16 bits LT-rel. function ptr. - "R_PARISC_LTOFF_FPTR16WF": 126 , # 16 bits LT-rel. function ptr. - "R_PARISC_LTOFF_FPTR16DF": 127 , # 16 bits LT-rel. function ptr. - "R_PARISC_LORESERVE": 128 , # - "R_PARISC_COPY": 128 , # Copy relocation. - "R_PARISC_IPLT": 129 , # Dynamic reloc, imported PLT - "R_PARISC_EPLT": 130 , # Dynamic reloc, exported PLT - "R_PARISC_TPREL32": 153 , # 32 bits TP-rel. address. - "R_PARISC_TPREL21L": 154 , # TP-rel. address, left 21 bits. - "R_PARISC_TPREL14R": 158 , # TP-rel. address, right 14 bits. - "R_PARISC_LTOFF_TP21L": 162 , # LT-TP-rel. address, left 21 bits. - "R_PARISC_LTOFF_TP14R": 166 , # LT-TP-rel. address, right 14 bits. - "R_PARISC_LTOFF_TP14F": 167 , # 14 bits LT-TP-rel. address. - "R_PARISC_TPREL64": 216 , # 64 bits TP-rel. address. - "R_PARISC_TPREL14WR": 219 , # TP-rel. address, right 14 bits. - "R_PARISC_TPREL14DR": 220 , # TP-rel. address, right 14 bits. - "R_PARISC_TPREL16F": 221 , # 16 bits TP-rel. address. - "R_PARISC_TPREL16WF": 222 , # 16 bits TP-rel. address. - "R_PARISC_TPREL16DF": 223 , # 16 bits TP-rel. address. - "R_PARISC_LTOFF_TP64": 224 , # 64 bits LT-TP-rel. address. - "R_PARISC_LTOFF_TP14WR": 227 , # LT-TP-rel. address, right 14 bits. - "R_PARISC_LTOFF_TP14DR": 228 , # LT-TP-rel. address, right 14 bits. - "R_PARISC_LTOFF_TP16F": 229 , # 16 bits LT-TP-rel. address. - "R_PARISC_LTOFF_TP16WF": 230 , # 16 bits LT-TP-rel. address. - "R_PARISC_LTOFF_TP16DF": 231 , # 16 bits LT-TP-rel. address. - "R_PARISC_GNU_VTENTRY": 232 , # - "R_PARISC_GNU_VTINHERIT": 233 , # - "R_PARISC_TLS_GD21L": 234 , # GD 21-bit left. - "R_PARISC_TLS_GD14R": 235 , # GD 14-bit right. - "R_PARISC_TLS_GDCALL": 236 , # GD call to __t_g_a. - "R_PARISC_TLS_LDM21L": 237 , # LD module 21-bit left. - "R_PARISC_TLS_LDM14R": 238 , # LD module 14-bit right. - "R_PARISC_TLS_LDMCALL": 239 , # LD module call to __t_g_a. - "R_PARISC_TLS_LDO21L": 240 , # LD offset 21-bit left. - "R_PARISC_TLS_LDO14R": 241 , # LD offset 14-bit right. - "R_PARISC_TLS_DTPMOD32": 242 , # DTP module 32-bit. - "R_PARISC_TLS_DTPMOD64": 243 , # DTP module 64-bit. - "R_PARISC_TLS_DTPOFF32": 244 , # DTP offset 32-bit. - "R_PARISC_TLS_DTPOFF64": 245 , # DTP offset 32-bit. - "R_PARISC_TLS_LE21L": MacroRef("R_PARISC_TPREL21L"), # - "R_PARISC_TLS_LE14R": MacroRef("R_PARISC_TPREL14R"), # - "R_PARISC_TLS_IE21L": MacroRef("R_PARISC_LTOFF_TP21L") , # - "R_PARISC_TLS_IE14R": MacroRef("R_PARISC_LTOFF_TP14R") , # - "R_PARISC_TLS_TPREL32": MacroRef("R_PARISC_TPREL32") , # - "R_PARISC_TLS_TPREL64": MacroRef("R_PARISC_TPREL64") , # - "R_PARISC_HIRESERVE": 255 , # - "PT_HP_TLS": (MacroRef("PT_LOOS") + 0x0) , # - "PT_HP_CORE_NONE": (MacroRef("PT_LOOS") + 0x1) , # - "PT_HP_CORE_VERSION": (MacroRef("PT_LOOS") + 0x2) , # - "PT_HP_CORE_KERNEL": (MacroRef("PT_LOOS") + 0x3) , # - "PT_HP_CORE_COMM": (MacroRef("PT_LOOS") + 0x4) , # - "PT_HP_CORE_PROC": (MacroRef("PT_LOOS") + 0x5) , # - "PT_HP_CORE_LOADABLE": (MacroRef("PT_LOOS") + 0x6) , # - "PT_HP_CORE_STACK": (MacroRef("PT_LOOS") + 0x7) , # - "PT_HP_CORE_SHM": (MacroRef("PT_LOOS") + 0x8) , # - "PT_HP_CORE_MMF": (MacroRef("PT_LOOS") + 0x9) , # - "PT_HP_PARALLEL": (MacroRef("PT_LOOS") + 0x10) , # - "PT_HP_FASTBIND": (MacroRef("PT_LOOS") + 0x11) , # - "PT_HP_OPT_ANNOT": (MacroRef("PT_LOOS") + 0x12) , # - "PT_HP_HSL_ANNOT": (MacroRef("PT_LOOS") + 0x13) , # - "PT_HP_STACK": (MacroRef("PT_LOOS") + 0x14) , # - "PT_PARISC_ARCHEXT": 0x70000000 , # - "PT_PARISC_UNWIND": 0x70000001 , # - "PF_PARISC_SBP": 0x08000000 , # - "PF_HP_PAGE_SIZE": 0x00100000 , # - "PF_HP_FAR_SHARED": 0x00200000 , # - "PF_HP_NEAR_SHARED": 0x00400000 , # - "PF_HP_CODE": 0x01000000 , # - "PF_HP_MODIFY": 0x02000000 , # - "PF_HP_LAZYSWAP": 0x04000000 , # - "PF_HP_SBP": 0x08000000 , # - "EF_ALPHA_32BIT": 1 , # All addresses must be < 2GB. - "EF_ALPHA_CANRELAX": 2 , # Relocations for relaxing exist. - "SHT_ALPHA_DEBUG": 0x70000001 , # - "SHT_ALPHA_REGINFO": 0x70000002 , # - "SHF_ALPHA_GPREL": 0x10000000 , # - "STO_ALPHA_NOPV": 0x80 , # No PV required. - "STO_ALPHA_STD_GPLOAD": 0x88 , # PV only used for initial ldgp. - "R_ALPHA_NONE": 0 , # No reloc - "R_ALPHA_REFLONG": 1 , # Direct 32 bit - "R_ALPHA_REFQUAD": 2 , # Direct 64 bit - "R_ALPHA_GPREL32": 3 , # GP relative 32 bit - "R_ALPHA_LITERAL": 4 , # GP relative 16 bit w/optimization - "R_ALPHA_LITUSE": 5 , # Optimization hint for LITERAL - "R_ALPHA_GPDISP": 6 , # Add displacement to GP - "R_ALPHA_BRADDR": 7 , # PC+4 relative 23 bit shifted - "R_ALPHA_HINT": 8 , # PC+4 relative 16 bit shifted - "R_ALPHA_SREL16": 9 , # PC relative 16 bit - "R_ALPHA_SREL32": 10 , # PC relative 32 bit - "R_ALPHA_SREL64": 11 , # PC relative 64 bit - "R_ALPHA_GPRELHIGH": 17 , # GP relative 32 bit, high 16 bits - "R_ALPHA_GPRELLOW": 18 , # GP relative 32 bit, low 16 bits - "R_ALPHA_GPREL16": 19 , # GP relative 16 bit - "R_ALPHA_COPY": 24 , # Copy symbol at runtime - "R_ALPHA_GLOB_DAT": 25 , # Create GOT entry - "R_ALPHA_JMP_SLOT": 26 , # Create PLT entry - "R_ALPHA_RELATIVE": 27 , # Adjust by program base - "R_ALPHA_TLS_GD_HI": 28 , # - "R_ALPHA_TLSGD": 29 , # - "R_ALPHA_TLS_LDM": 30 , # - "R_ALPHA_DTPMOD64": 31 , # - "R_ALPHA_GOTDTPREL": 32 , # - "R_ALPHA_DTPREL64": 33 , # - "R_ALPHA_DTPRELHI": 34 , # - "R_ALPHA_DTPRELLO": 35 , # - "R_ALPHA_DTPREL16": 36 , # - "R_ALPHA_GOTTPREL": 37 , # - "R_ALPHA_TPREL64": 38 , # - "R_ALPHA_TPRELHI": 39 , # - "R_ALPHA_TPRELLO": 40 , # - "R_ALPHA_TPREL16": 41 , # - "R_ALPHA_NUM": 46 , # - "LITUSE_ALPHA_ADDR": 0 , # - "LITUSE_ALPHA_BASE": 1 , # - "LITUSE_ALPHA_BYTOFF": 2 , # - "LITUSE_ALPHA_JSR": 3 , # - "LITUSE_ALPHA_TLS_GD": 4 , # - "LITUSE_ALPHA_TLS_LDM": 5 , # - "DT_ALPHA_PLTRO": (MacroRef("DT_LOPROC") + 0) , # - "DT_ALPHA_NUM": 1 , # - "EF_PPC_EMB": 0x80000000 , # PowerPC embedded flag - "EF_PPC_RELOCATABLE": 0x00010000 , # PowerPC -mrelocatable flag - "EF_PPC_RELOCATABLE_LIB": 0x00008000 , # PowerPC -mrelocatable-lib - "R_PPC_NONE": 0 , # - "R_PPC_ADDR32": 1 , # 32bit absolute address - "R_PPC_ADDR24": 2 , # 26bit address, 2 bits ignored. - "R_PPC_ADDR16": 3 , # 16bit absolute address - "R_PPC_ADDR16_LO": 4 , # lower 16bit of absolute address - "R_PPC_ADDR16_HI": 5 , # high 16bit of absolute address - "R_PPC_ADDR16_HA": 6 , # adjusted high 16bit - "R_PPC_ADDR14": 7 , # 16bit address, 2 bits ignored - "R_PPC_ADDR14_BRTAKEN": 8 , # - "R_PPC_ADDR14_BRNTAKEN": 9 , # - "R_PPC_REL24": 10 , # PC relative 26 bit - "R_PPC_REL14": 11 , # PC relative 16 bit - "R_PPC_REL14_BRTAKEN": 12 , # - "R_PPC_REL14_BRNTAKEN": 13 , # - "R_PPC_GOT16": 14 , # - "R_PPC_GOT16_LO": 15 , # - "R_PPC_GOT16_HI": 16 , # - "R_PPC_GOT16_HA": 17 , # - "R_PPC_PLTREL24": 18 , # - "R_PPC_COPY": 19 , # - "R_PPC_GLOB_DAT": 20 , # - "R_PPC_JMP_SLOT": 21 , # - "R_PPC_RELATIVE": 22 , # - "R_PPC_LOCAL24PC": 23 , # - "R_PPC_UADDR32": 24 , # - "R_PPC_UADDR16": 25 , # - "R_PPC_REL32": 26 , # - "R_PPC_PLT32": 27 , # - "R_PPC_PLTREL32": 28 , # - "R_PPC_PLT16_LO": 29 , # - "R_PPC_PLT16_HI": 30 , # - "R_PPC_PLT16_HA": 31 , # - "R_PPC_SDAREL16": 32 , # - "R_PPC_SECTOFF": 33 , # - "R_PPC_SECTOFF_LO": 34 , # - "R_PPC_SECTOFF_HI": 35 , # - "R_PPC_SECTOFF_HA": 36 , # - "R_PPC_TLS": 67 , # none (sym+add)@tls - "R_PPC_DTPMOD32": 68 , # word32 (sym+add)@dtpmod - "R_PPC_TPREL16": 69 , # half16* (sym+add)@tprel - "R_PPC_TPREL16_LO": 70 , # half16 (sym+add)@tprel@l - "R_PPC_TPREL16_HI": 71 , # half16 (sym+add)@tprel@h - "R_PPC_TPREL16_HA": 72 , # half16 (sym+add)@tprel@ha - "R_PPC_TPREL32": 73 , # word32 (sym+add)@tprel - "R_PPC_DTPREL16": 74 , # half16* (sym+add)@dtprel - "R_PPC_DTPREL16_LO": 75 , # half16 (sym+add)@dtprel@l - "R_PPC_DTPREL16_HI": 76 , # half16 (sym+add)@dtprel@h - "R_PPC_DTPREL16_HA": 77 , # half16 (sym+add)@dtprel@ha - "R_PPC_DTPREL32": 78 , # word32 (sym+add)@dtprel - "R_PPC_GOT_TLSGD16": 79 , # half16* (sym+add)@got@tlsgd - "R_PPC_GOT_TLSGD16_LO": 80 , # half16 (sym+add)@got@tlsgd@l - "R_PPC_GOT_TLSGD16_HI": 81 , # half16 (sym+add)@got@tlsgd@h - "R_PPC_GOT_TLSGD16_HA": 82 , # half16 (sym+add)@got@tlsgd@ha - "R_PPC_GOT_TLSLD16": 83 , # half16* (sym+add)@got@tlsld - "R_PPC_GOT_TLSLD16_LO": 84 , # half16 (sym+add)@got@tlsld@l - "R_PPC_GOT_TLSLD16_HI": 85 , # half16 (sym+add)@got@tlsld@h - "R_PPC_GOT_TLSLD16_HA": 86 , # half16 (sym+add)@got@tlsld@ha - "R_PPC_GOT_TPREL16": 87 , # half16* (sym+add)@got@tprel - "R_PPC_GOT_TPREL16_LO": 88 , # half16 (sym+add)@got@tprel@l - "R_PPC_GOT_TPREL16_HI": 89 , # half16 (sym+add)@got@tprel@h - "R_PPC_GOT_TPREL16_HA": 90 , # half16 (sym+add)@got@tprel@ha - "R_PPC_GOT_DTPREL16": 91 , # half16* (sym+add)@got@dtprel - "R_PPC_GOT_DTPREL16_LO": 92 , # half16* (sym+add)@got@dtprel@l - "R_PPC_GOT_DTPREL16_HI": 93 , # half16* (sym+add)@got@dtprel@h - "R_PPC_GOT_DTPREL16_HA": 94 , # half16* (sym+add)@got@dtprel@ha - "R_PPC_EMB_NADDR32": 101 , # - "R_PPC_EMB_NADDR16": 102 , # - "R_PPC_EMB_NADDR16_LO": 103 , # - "R_PPC_EMB_NADDR16_HI": 104 , # - "R_PPC_EMB_NADDR16_HA": 105 , # - "R_PPC_EMB_SDAI16": 106 , # - "R_PPC_EMB_SDA2I16": 107 , # - "R_PPC_EMB_SDA2REL": 108 , # - "R_PPC_EMB_SDA21": 109 , # 16 bit offset in SDA - "R_PPC_EMB_MRKREF": 110 , # - "R_PPC_EMB_RELSEC16": 111 , # - "R_PPC_EMB_RELST_LO": 112 , # - "R_PPC_EMB_RELST_HI": 113 , # - "R_PPC_EMB_RELST_HA": 114 , # - "R_PPC_EMB_BIT_FLD": 115 , # - "R_PPC_EMB_RELSDA": 116 , # 16 bit relative offset in SDA - "R_PPC_DIAB_SDA21_LO": 180 , # like EMB_SDA21, but lower 16 bit - "R_PPC_DIAB_SDA21_HI": 181 , # like EMB_SDA21, but high 16 bit - "R_PPC_DIAB_SDA21_HA": 182 , # like EMB_SDA21, adjusted high 16 - "R_PPC_DIAB_RELSDA_LO": 183 , # like EMB_RELSDA, but lower 16 bit - "R_PPC_DIAB_RELSDA_HI": 184 , # like EMB_RELSDA, but high 16 bit - "R_PPC_DIAB_RELSDA_HA": 185 , # like EMB_RELSDA, adjusted high 16 - "R_PPC_IRELATIVE": 248 , # - "R_PPC_REL16": 249 , # half16 (sym+add-.) - "R_PPC_REL16_LO": 250 , # half16 (sym+add-.)@l - "R_PPC_REL16_HI": 251 , # half16 (sym+add-.)@h - "R_PPC_REL16_HA": 252 , # half16 (sym+add-.)@ha - "R_PPC_TOC16": 255 , # - "DT_PPC_GOT": (MacroRef("DT_LOPROC") + 0) , # - "DT_PPC_NUM": 1 , # - "R_PPC64_NONE": MacroRef("R_PPC_NONE") , # - "R_PPC64_ADDR32": MacroRef("R_PPC_ADDR32") , # 32bit absolute address - "R_PPC64_ADDR24": MacroRef("R_PPC_ADDR24") , # 26bit address, word aligned - "R_PPC64_ADDR16": MacroRef("R_PPC_ADDR16") , # 16bit absolute address - "R_PPC64_ADDR16_LO": MacroRef("R_PPC_ADDR16_LO") , # lower 16bits of address - "R_PPC64_ADDR16_HI": MacroRef("R_PPC_ADDR16_HI") , # high 16bits of address. - "R_PPC64_ADDR16_HA": MacroRef("R_PPC_ADDR16_HA") , # adjusted high 16bits. - "R_PPC64_ADDR14": MacroRef("R_PPC_ADDR14") , # 16bit address, word aligned - "R_PPC64_ADDR14_BRTAKEN": MacroRef("R_PPC_ADDR14_BRTAKEN") , # - "R_PPC64_ADDR14_BRNTAKEN": MacroRef("R_PPC_ADDR14_BRNTAKEN") , # - "R_PPC64_REL24": MacroRef("R_PPC_REL24") , # PC-rel. 26 bit, word aligned - "R_PPC64_REL14": MacroRef("R_PPC_REL14") , # PC relative 16 bit - "R_PPC64_REL14_BRTAKEN": MacroRef("R_PPC_REL14_BRTAKEN") , # - "R_PPC64_REL14_BRNTAKEN": MacroRef("R_PPC_REL14_BRNTAKEN") , # - "R_PPC64_GOT16": MacroRef("R_PPC_GOT16") , # - "R_PPC64_GOT16_LO": MacroRef("R_PPC_GOT16_LO") , # - "R_PPC64_GOT16_HI": MacroRef("R_PPC_GOT16_HI") , # - "R_PPC64_GOT16_HA": MacroRef("R_PPC_GOT16_HA") , # - "R_PPC64_COPY": MacroRef("R_PPC_COPY") , # - "R_PPC64_GLOB_DAT": MacroRef("R_PPC_GLOB_DAT") , # - "R_PPC64_JMP_SLOT": MacroRef("R_PPC_JMP_SLOT") , # - "R_PPC64_RELATIVE": MacroRef("R_PPC_RELATIVE") , # - "R_PPC64_UADDR32": MacroRef("R_PPC_UADDR32") , # - "R_PPC64_UADDR16": MacroRef("R_PPC_UADDR16") , # - "R_PPC64_REL32": MacroRef("R_PPC_REL32") , # - "R_PPC64_PLT32": MacroRef("R_PPC_PLT32") , # - "R_PPC64_PLTREL32": MacroRef("R_PPC_PLTREL32") , # - "R_PPC64_PLT16_LO": MacroRef("R_PPC_PLT16_LO") , # - "R_PPC64_PLT16_HI": MacroRef("R_PPC_PLT16_HI") , # - "R_PPC64_PLT16_HA": MacroRef("R_PPC_PLT16_HA") , # - "R_PPC64_SECTOFF": MacroRef("R_PPC_SECTOFF") , # - "R_PPC64_SECTOFF_LO": MacroRef("R_PPC_SECTOFF_LO") , # - "R_PPC64_SECTOFF_HI": MacroRef("R_PPC_SECTOFF_HI") , # - "R_PPC64_SECTOFF_HA": MacroRef("R_PPC_SECTOFF_HA") , # - "R_PPC64_ADDR30": 37 , # word30 (S + A - P) >> 2 - "R_PPC64_ADDR64": 38 , # doubleword64 S + A - "R_PPC64_ADDR16_HIGHER": 39 , # half16 #higher(S + A) - "R_PPC64_ADDR16_HIGHERA": 40 , # half16 #highera(S + A) - "R_PPC64_ADDR16_HIGHEST": 41 , # half16 #highest(S + A) - "R_PPC64_ADDR16_HIGHESTA": 42 , # half16 #highesta(S + A) - "R_PPC64_UADDR64": 43 , # doubleword64 S + A - "R_PPC64_REL64": 44 , # doubleword64 S + A - P - "R_PPC64_PLT64": 45 , # doubleword64 L + A - "R_PPC64_PLTREL64": 46 , # doubleword64 L + A - P - "R_PPC64_TOC16": 47 , # half16* S + A - .TOC - "R_PPC64_TOC16_LO": 48 , # half16 #lo(S + A - .TOC.) - "R_PPC64_TOC16_HI": 49 , # half16 #hi(S + A - .TOC.) - "R_PPC64_TOC16_HA": 50 , # half16 #ha(S + A - .TOC.) - "R_PPC64_TOC": 51 , # doubleword64 .TOC - "R_PPC64_PLTGOT16": 52 , # half16* M + A - "R_PPC64_PLTGOT16_LO": 53 , # half16 #lo(M + A) - "R_PPC64_PLTGOT16_HI": 54 , # half16 #hi(M + A) - "R_PPC64_PLTGOT16_HA": 55 , # half16 #ha(M + A) - "R_PPC64_ADDR16_DS": 56 , # half16ds* (S + A) >> 2 - "R_PPC64_ADDR16_LO_DS": 57 , # half16ds #lo(S + A) >> 2 - "R_PPC64_GOT16_DS": 58 , # half16ds* (G + A) >> 2 - "R_PPC64_GOT16_LO_DS": 59 , # half16ds #lo(G + A) >> 2 - "R_PPC64_PLT16_LO_DS": 60 , # half16ds #lo(L + A) >> 2 - "R_PPC64_SECTOFF_DS": 61 , # half16ds* (R + A) >> 2 - "R_PPC64_SECTOFF_LO_DS": 62 , # half16ds #lo(R + A) >> 2 - "R_PPC64_TOC16_DS": 63 , # half16ds* (S + A - .TOC.) >> 2 - "R_PPC64_TOC16_LO_DS": 64 , # half16ds #lo(S + A - .TOC.) >> 2 - "R_PPC64_PLTGOT16_DS": 65 , # half16ds* (M + A) >> 2 - "R_PPC64_PLTGOT16_LO_DS": 66 , # half16ds #lo(M + A) >> 2 - "R_PPC64_TLS": 67 , # none (sym+add)@tls - "R_PPC64_DTPMOD64": 68 , # doubleword64 (sym+add)@dtpmod - "R_PPC64_TPREL16": 69 , # half16* (sym+add)@tprel - "R_PPC64_TPREL16_LO": 70 , # half16 (sym+add)@tprel@l - "R_PPC64_TPREL16_HI": 71 , # half16 (sym+add)@tprel@h - "R_PPC64_TPREL16_HA": 72 , # half16 (sym+add)@tprel@ha - "R_PPC64_TPREL64": 73 , # doubleword64 (sym+add)@tprel - "R_PPC64_DTPREL16": 74 , # half16* (sym+add)@dtprel - "R_PPC64_DTPREL16_LO": 75 , # half16 (sym+add)@dtprel@l - "R_PPC64_DTPREL16_HI": 76 , # half16 (sym+add)@dtprel@h - "R_PPC64_DTPREL16_HA": 77 , # half16 (sym+add)@dtprel@ha - "R_PPC64_DTPREL64": 78 , # doubleword64 (sym+add)@dtprel - "R_PPC64_GOT_TLSGD16": 79 , # half16* (sym+add)@got@tlsgd - "R_PPC64_GOT_TLSGD16_LO": 80 , # half16 (sym+add)@got@tlsgd@l - "R_PPC64_GOT_TLSGD16_HI": 81 , # half16 (sym+add)@got@tlsgd@h - "R_PPC64_GOT_TLSGD16_HA": 82 , # half16 (sym+add)@got@tlsgd@ha - "R_PPC64_GOT_TLSLD16": 83 , # half16* (sym+add)@got@tlsld - "R_PPC64_GOT_TLSLD16_LO": 84 , # half16 (sym+add)@got@tlsld@l - "R_PPC64_GOT_TLSLD16_HI": 85 , # half16 (sym+add)@got@tlsld@h - "R_PPC64_GOT_TLSLD16_HA": 86 , # half16 (sym+add)@got@tlsld@ha - "R_PPC64_GOT_TPREL16_DS": 87 , # half16ds* (sym+add)@got@tprel - "R_PPC64_GOT_TPREL16_LO_DS": 88 , # half16ds (sym+add)@got@tprel@l - "R_PPC64_GOT_TPREL16_HI": 89 , # half16 (sym+add)@got@tprel@h - "R_PPC64_GOT_TPREL16_HA": 90 , # half16 (sym+add)@got@tprel@ha - "R_PPC64_GOT_DTPREL16_DS": 91 , # half16ds* (sym+add)@got@dtprel - "R_PPC64_GOT_DTPREL16_LO_DS": 92 , # half16ds (sym+add)@got@dtprel@l - "R_PPC64_GOT_DTPREL16_HI": 93 , # half16 (sym+add)@got@dtprel@h - "R_PPC64_GOT_DTPREL16_HA": 94 , # half16 (sym+add)@got@dtprel@ha - "R_PPC64_TPREL16_DS": 95 , # half16ds* (sym+add)@tprel - "R_PPC64_TPREL16_LO_DS": 96 , # half16ds (sym+add)@tprel@l - "R_PPC64_TPREL16_HIGHER": 97 , # half16 (sym+add)@tprel@higher - "R_PPC64_TPREL16_HIGHERA": 98 , # half16 (sym+add)@tprel@highera - "R_PPC64_TPREL16_HIGHEST": 99 , # half16 (sym+add)@tprel@highest - "R_PPC64_TPREL16_HIGHESTA": 100 , # half16 (sym+add)@tprel@highesta - "R_PPC64_DTPREL16_DS": 101 , # half16ds* (sym+add)@dtprel - "R_PPC64_DTPREL16_LO_DS": 102 , # half16ds (sym+add)@dtprel@l - "R_PPC64_DTPREL16_HIGHER": 103 , # half16 (sym+add)@dtprel@higher - "R_PPC64_DTPREL16_HIGHERA": 104 , # half16 (sym+add)@dtprel@highera - "R_PPC64_DTPREL16_HIGHEST": 105 , # half16 (sym+add)@dtprel@highest - "R_PPC64_DTPREL16_HIGHESTA": 106 , # half16 (sym+add)@dtprel@highesta - "R_PPC64_JMP_IREL": 247 , # - "R_PPC64_IRELATIVE": 248 , # - "R_PPC64_REL16": 249 , # half16 (sym+add-.) - "R_PPC64_REL16_LO": 250 , # half16 (sym+add-.)@l - "R_PPC64_REL16_HI": 251 , # half16 (sym+add-.)@h - "R_PPC64_REL16_HA": 252 , # half16 (sym+add-.)@ha - "DT_PPC64_GLINK": (MacroRef("DT_LOPROC") + 0) , # - "DT_PPC64_OPD": (MacroRef("DT_LOPROC") + 1) , # - "DT_PPC64_OPDSZ": (MacroRef("DT_LOPROC") + 2) , # - "DT_PPC64_NUM": 3 , # - "EF_ARM_RELEXEC": 0x01 , # - "EF_ARM_HASENTRY": 0x02 , # - "EF_ARM_INTERWORK": 0x04 , # - "EF_ARM_APCS_26": 0x08 , # - "EF_ARM_APCS_FLOAT": 0x10 , # - "EF_ARM_PIC": 0x20 , # - "EF_ARM_ALIGN8": 0x40 , # 8-bit structure alignment is in use - "EF_ARM_NEW_ABI": 0x80 , # - "EF_ARM_OLD_ABI": 0x100 , # - "EF_ARM_SOFT_FLOAT": 0x200 , # - "EF_ARM_VFP_FLOAT": 0x400 , # - "EF_ARM_MAVERICK_FLOAT": 0x800 , # - "EF_ARM_SYMSARESORTED": 0x04 , # - "EF_ARM_DYNSYMSUSESEGIDX": 0x08 , # - "EF_ARM_MAPSYMSFIRST": 0x10 , # - "EF_ARM_EABIMASK": 0XFF000000 , # - "EF_ARM_BE8": 0x00800000 , # - "EF_ARM_LE8": 0x00400000 , # - "EF_ARM_EABI_UNKNOWN": 0x00000000 , # - "EF_ARM_EABI_VER1": 0x01000000 , # - "EF_ARM_EABI_VER2": 0x02000000 , # - "EF_ARM_EABI_VER3": 0x03000000 , # - "EF_ARM_EABI_VER4": 0x04000000 , # - "EF_ARM_EABI_VER5": 0x05000000 , # - "STT_ARM_TFUNC": MacroRef("STT_LOPROC") , # A Thumb function. - "STT_ARM_16BIT": MacroRef("STT_HIPROC") , # A Thumb label. - "SHF_ARM_ENTRYSECT": 0x10000000 , # Section contains an entry point - "SHF_ARM_COMDEF": 0x80000000 , # Section may be multiply defined - "PF_ARM_SB": 0x10000000 , # Segment contains the location - "PF_ARM_PI": 0x20000000 , # Position-independent segment. - "PF_ARM_ABS": 0x40000000 , # Absolute segment. - "PT_ARM_EXIDX": (MacroRef("PT_LOPROC") + 1) , # ARM unwind segment. - "SHT_ARM_EXIDX": (MacroRef("SHT_LOPROC") + 1) , # ARM unwind section. - "SHT_ARM_PREEMPTMAP": (MacroRef("SHT_LOPROC") + 2) , # Preemption details. - "SHT_ARM_ATTRIBUTES": (MacroRef("SHT_LOPROC") + 3) , # ARM attributes section. - "R_ARM_NONE": 0 , # No reloc - "R_ARM_PC24": 1 , # PC relative 26 bit branch - "R_ARM_ABS32": 2 , # Direct 32 bit - "R_ARM_REL32": 3 , # PC relative 32 bit - "R_ARM_PC13": 4 , # - "R_ARM_ABS16": 5 , # Direct 16 bit - "R_ARM_ABS12": 6 , # Direct 12 bit - "R_ARM_THM_ABS5": 7 , # - "R_ARM_ABS8": 8 , # Direct 8 bit - "R_ARM_SBREL32": 9 , # - "R_ARM_THM_PC22": 10 , # - "R_ARM_THM_PC8": 11 , # - "R_ARM_AMP_VCALL9": 12 , # - "R_ARM_SWI24": 13 , # Obsolete static relocation. - "R_ARM_TLS_DESC": 13 , # Dynamic relocation. - "R_ARM_THM_SWI8": 14 , # - "R_ARM_XPC25": 15 , # - "R_ARM_THM_XPC22": 16 , # - "R_ARM_TLS_DTPMOD32": 17 , # ID of module containing symbol - "R_ARM_TLS_DTPOFF32": 18 , # Offset in TLS block - "R_ARM_TLS_TPOFF32": 19 , # Offset in static TLS block - "R_ARM_COPY": 20 , # Copy symbol at runtime - "R_ARM_GLOB_DAT": 21 , # Create GOT entry - "R_ARM_JUMP_SLOT": 22 , # Create PLT entry - "R_ARM_RELATIVE": 23 , # Adjust by program base - "R_ARM_GOTOFF": 24 , # 32 bit offset to GOT - "R_ARM_GOTPC": 25 , # 32 bit PC relative offset to GOT - "R_ARM_GOT32": 26 , # 32 bit GOT entry - "R_ARM_PLT32": 27 , # 32 bit PLT address - "R_ARM_ALU_PCREL_7_0": 32 , # - "R_ARM_ALU_PCREL_15_8": 33 , # - "R_ARM_ALU_PCREL_23_15": 34 , # - "R_ARM_LDR_SBREL_11_0": 35 , # - "R_ARM_ALU_SBREL_19_12": 36 , # - "R_ARM_ALU_SBREL_27_20": 37 , # - "R_ARM_TLS_GOTDESC": 90 , # - "R_ARM_TLS_CALL": 91 , # - "R_ARM_TLS_DESCSEQ": 92 , # - "R_ARM_THM_TLS_CALL": 93 , # - "R_ARM_GNU_VTENTRY": 100 , # - "R_ARM_GNU_VTINHERIT": 101 , # - "R_ARM_THM_PC11": 102 , # thumb unconditional branch - "R_ARM_THM_PC9": 103 , # thumb conditional branch - "R_ARM_TLS_GD32": 104 , # PC-rel 32 bit for global dynamic - "R_ARM_TLS_LDM32": 105 , # PC-rel 32 bit for local dynamic - "R_ARM_TLS_LDO32": 106 , # 32 bit offset relative to TLS - "R_ARM_TLS_IE32": 107 , # PC-rel 32 bit for GOT entry of - "R_ARM_TLS_LE32": 108 , # 32 bit offset relative to static - "R_ARM_THM_TLS_DESCSEQ": 129 , # - "R_ARM_IRELATIVE": 160 , # - "R_ARM_RXPC25": 249 , # - "R_ARM_RSBREL32": 250 , # - "R_ARM_THM_RPC22": 251 , # - "R_ARM_RREL32": 252 , # - "R_ARM_RABS22": 253 , # - "R_ARM_RPC24": 254 , # - "R_ARM_RBASE": 255 , # - "R_ARM_NUM": 256 , # - "EF_IA_64_MASKOS": 0x0000000f , # os-specific flags - "EF_IA_64_ABI64": 0x00000010 , # 64-bit ABI - "EF_IA_64_ARCH": 0xff000000 , # arch. version mask - "PT_IA_64_ARCHEXT": (MacroRef("PT_LOPROC") + 0) , # arch extension bits - "PT_IA_64_UNWIND": (MacroRef("PT_LOPROC") + 1) , # ia64 unwind bits - "PT_IA_64_HP_OPT_ANOT": (MacroRef("PT_LOOS") + 0x12) , # - "PT_IA_64_HP_HSL_ANOT": (MacroRef("PT_LOOS") + 0x13) , # - "PT_IA_64_HP_STACK": (MacroRef("PT_LOOS") + 0x14) , # - "PF_IA_64_NORECOV": 0x80000000 , # spec insns w/o recovery - "SHT_IA_64_EXT": (MacroRef("SHT_LOPROC") + 0) , # extension bits - "SHT_IA_64_UNWIND": (MacroRef("SHT_LOPROC") + 1) , # unwind bits - "SHF_IA_64_SHORT": 0x10000000 , # section near gp - "SHF_IA_64_NORECOV": 0x20000000 , # spec insns w/o recovery - "DT_IA_64_PLT_RESERVE": (MacroRef("DT_LOPROC") + 0) , # - "DT_IA_64_NUM": 1 , # - "R_IA64_NONE": 0x00 , # none - "R_IA64_IMM14": 0x21 , # symbol + addend, add imm14 - "R_IA64_IMM22": 0x22 , # symbol + addend, add imm22 - "R_IA64_IMM64": 0x23 , # symbol + addend, mov imm64 - "R_IA64_DIR32MSB": 0x24 , # symbol + addend, data4 MSB - "R_IA64_DIR32LSB": 0x25 , # symbol + addend, data4 LSB - "R_IA64_DIR64MSB": 0x26 , # symbol + addend, data8 MSB - "R_IA64_DIR64LSB": 0x27 , # symbol + addend, data8 LSB - "R_IA64_GPREL22": 0x2a , # @gprel(sym + add), add imm22 - "R_IA64_GPREL64I": 0x2b , # @gprel(sym + add), mov imm64 - "R_IA64_GPREL32MSB": 0x2c , # @gprel(sym + add), data4 MSB - "R_IA64_GPREL32LSB": 0x2d , # @gprel(sym + add), data4 LSB - "R_IA64_GPREL64MSB": 0x2e , # @gprel(sym + add), data8 MSB - "R_IA64_GPREL64LSB": 0x2f , # @gprel(sym + add), data8 LSB - "R_IA64_LTOFF22": 0x32 , # @ltoff(sym + add), add imm22 - "R_IA64_LTOFF64I": 0x33 , # @ltoff(sym + add), mov imm64 - "R_IA64_PLTOFF22": 0x3a , # @pltoff(sym + add), add imm22 - "R_IA64_PLTOFF64I": 0x3b , # @pltoff(sym + add), mov imm64 - "R_IA64_PLTOFF64MSB": 0x3e , # @pltoff(sym + add), data8 MSB - "R_IA64_PLTOFF64LSB": 0x3f , # @pltoff(sym + add), data8 LSB - "R_IA64_FPTR64I": 0x43 , # @fptr(sym + add), mov imm64 - "R_IA64_FPTR32MSB": 0x44 , # @fptr(sym + add), data4 MSB - "R_IA64_FPTR32LSB": 0x45 , # @fptr(sym + add), data4 LSB - "R_IA64_FPTR64MSB": 0x46 , # @fptr(sym + add), data8 MSB - "R_IA64_FPTR64LSB": 0x47 , # @fptr(sym + add), data8 LSB - "R_IA64_PCREL60B": 0x48 , # @pcrel(sym + add), brl - "R_IA64_PCREL21B": 0x49 , # @pcrel(sym + add), ptb, call - "R_IA64_PCREL21M": 0x4a , # @pcrel(sym + add), chk.s - "R_IA64_PCREL21F": 0x4b , # @pcrel(sym + add), fchkf - "R_IA64_PCREL32MSB": 0x4c , # @pcrel(sym + add), data4 MSB - "R_IA64_PCREL32LSB": 0x4d , # @pcrel(sym + add), data4 LSB - "R_IA64_PCREL64MSB": 0x4e , # @pcrel(sym + add), data8 MSB - "R_IA64_PCREL64LSB": 0x4f , # @pcrel(sym + add), data8 LSB - "R_IA64_LTOFF_FPTR22": 0x52 , # @ltoff(@fptr(s+a)), imm22 - "R_IA64_LTOFF_FPTR64I": 0x53 , # @ltoff(@fptr(s+a)), imm64 - "R_IA64_LTOFF_FPTR32MSB": 0x54 , # @ltoff(@fptr(s+a)), data4 MSB - "R_IA64_LTOFF_FPTR32LSB": 0x55 , # @ltoff(@fptr(s+a)), data4 LSB - "R_IA64_LTOFF_FPTR64MSB": 0x56 , # @ltoff(@fptr(s+a)), data8 MSB - "R_IA64_LTOFF_FPTR64LSB": 0x57 , # @ltoff(@fptr(s+a)), data8 LSB - "R_IA64_SEGREL32MSB": 0x5c , # @segrel(sym + add), data4 MSB - "R_IA64_SEGREL32LSB": 0x5d , # @segrel(sym + add), data4 LSB - "R_IA64_SEGREL64MSB": 0x5e , # @segrel(sym + add), data8 MSB - "R_IA64_SEGREL64LSB": 0x5f , # @segrel(sym + add), data8 LSB - "R_IA64_SECREL32MSB": 0x64 , # @secrel(sym + add), data4 MSB - "R_IA64_SECREL32LSB": 0x65 , # @secrel(sym + add), data4 LSB - "R_IA64_SECREL64MSB": 0x66 , # @secrel(sym + add), data8 MSB - "R_IA64_SECREL64LSB": 0x67 , # @secrel(sym + add), data8 LSB - "R_IA64_REL32MSB": 0x6c , # data 4 + REL - "R_IA64_REL32LSB": 0x6d , # data 4 + REL - "R_IA64_REL64MSB": 0x6e , # data 8 + REL - "R_IA64_REL64LSB": 0x6f , # data 8 + REL - "R_IA64_LTV32MSB": 0x74 , # symbol + addend, data4 MSB - "R_IA64_LTV32LSB": 0x75 , # symbol + addend, data4 LSB - "R_IA64_LTV64MSB": 0x76 , # symbol + addend, data8 MSB - "R_IA64_LTV64LSB": 0x77 , # symbol + addend, data8 LSB - "R_IA64_PCREL21BI": 0x79 , # @pcrel(sym + add), 21bit inst - "R_IA64_PCREL22": 0x7a , # @pcrel(sym + add), 22bit inst - "R_IA64_PCREL64I": 0x7b , # @pcrel(sym + add), 64bit inst - "R_IA64_IPLTMSB": 0x80 , # dynamic reloc, imported PLT, MSB - "R_IA64_IPLTLSB": 0x81 , # dynamic reloc, imported PLT, LSB - "R_IA64_COPY": 0x84 , # copy relocation - "R_IA64_SUB": 0x85 , # Addend and symbol difference - "R_IA64_LTOFF22X": 0x86 , # LTOFF22, relaxable. - "R_IA64_LDXMOV": 0x87 , # Use of LTOFF22X. - "R_IA64_TPREL14": 0x91 , # @tprel(sym + add), imm14 - "R_IA64_TPREL22": 0x92 , # @tprel(sym + add), imm22 - "R_IA64_TPREL64I": 0x93 , # @tprel(sym + add), imm64 - "R_IA64_TPREL64MSB": 0x96 , # @tprel(sym + add), data8 MSB - "R_IA64_TPREL64LSB": 0x97 , # @tprel(sym + add), data8 LSB - "R_IA64_LTOFF_TPREL22": 0x9a , # @ltoff(@tprel(s+a)), imm2 - "R_IA64_DTPMOD64MSB": 0xa6 , # @dtpmod(sym + add), data8 MSB - "R_IA64_DTPMOD64LSB": 0xa7 , # @dtpmod(sym + add), data8 LSB - "R_IA64_LTOFF_DTPMOD22": 0xaa , # @ltoff(@dtpmod(sym + add)), imm22 - "R_IA64_DTPREL14": 0xb1 , # @dtprel(sym + add), imm14 - "R_IA64_DTPREL22": 0xb2 , # @dtprel(sym + add), imm22 - "R_IA64_DTPREL64I": 0xb3 , # @dtprel(sym + add), imm64 - "R_IA64_DTPREL32MSB": 0xb4 , # @dtprel(sym + add), data4 MSB - "R_IA64_DTPREL32LSB": 0xb5 , # @dtprel(sym + add), data4 LSB - "R_IA64_DTPREL64MSB": 0xb6 , # @dtprel(sym + add), data8 MSB - "R_IA64_DTPREL64LSB": 0xb7 , # @dtprel(sym + add), data8 LSB - "R_IA64_LTOFF_DTPREL22": 0xba , # @ltoff(@dtprel(s+a)), imm22 - "EF_SH_MACH_MASK": 0x1f , # - "EF_SH_UNKNOWN": 0x0 , # - "EF_SH1": 0x1 , # - "EF_SH2": 0x2 , # - "EF_SH3": 0x3 , # - "EF_SH_DSP": 0x4 , # - "EF_SH3_DSP": 0x5 , # - "EF_SH4AL_DSP": 0x6 , # - "EF_SH3E": 0x8 , # - "EF_SH4": 0x9 , # - "EF_SH2E": 0xb , # - "EF_SH4A": 0xc , # - "EF_SH2A": 0xd , # - "EF_SH4_NOFPU": 0x10 , # - "EF_SH4A_NOFPU": 0x11 , # - "EF_SH4_NOMMU_NOFPU": 0x12 , # - "EF_SH2A_NOFPU": 0x13 , # - "EF_SH3_NOMMU": 0x14 , # - "EF_SH2A_SH4_NOFPU": 0x15 , # - "EF_SH2A_SH3_NOFPU": 0x16 , # - "EF_SH2A_SH4": 0x17 , # - "EF_SH2A_SH3E": 0x18 , # - "R_SH_NONE": 0 , # - "R_SH_DIR32": 1 , # - "R_SH_REL32": 2 , # - "R_SH_DIR8WPN": 3 , # - "R_SH_IND12W": 4 , # - "R_SH_DIR8WPL": 5 , # - "R_SH_DIR8WPZ": 6 , # - "R_SH_DIR8BP": 7 , # - "R_SH_DIR8W": 8 , # - "R_SH_DIR8L": 9 , # - "R_SH_SWITCH16": 25 , # - "R_SH_SWITCH32": 26 , # - "R_SH_USES": 27 , # - "R_SH_COUNT": 28 , # - "R_SH_ALIGN": 29 , # - "R_SH_CODE": 30 , # - "R_SH_DATA": 31 , # - "R_SH_LABEL": 32 , # - "R_SH_SWITCH8": 33 , # - "R_SH_GNU_VTINHERIT": 34 , # - "R_SH_GNU_VTENTRY": 35 , # - "R_SH_TLS_GD_32": 144 , # - "R_SH_TLS_LD_32": 145 , # - "R_SH_TLS_LDO_32": 146 , # - "R_SH_TLS_IE_32": 147 , # - "R_SH_TLS_LE_32": 148 , # - "R_SH_TLS_DTPMOD32": 149 , # - "R_SH_TLS_DTPOFF32": 150 , # - "R_SH_TLS_TPOFF32": 151 , # - "R_SH_GOT32": 160 , # - "R_SH_PLT32": 161 , # - "R_SH_COPY": 162 , # - "R_SH_GLOB_DAT": 163 , # - "R_SH_JMP_SLOT": 164 , # - "R_SH_RELATIVE": 165 , # - "R_SH_GOTOFF": 166 , # - "R_SH_GOTPC": 167 , # - "R_SH_NUM": 256 , # - "EF_S390_HIGH_GPRS": 0x00000001 , # High GPRs kernel facility needed. - "R_390_NONE": 0 , # No reloc. - "R_390_8": 1 , # Direct 8 bit. - "R_390_12": 2 , # Direct 12 bit. - "R_390_16": 3 , # Direct 16 bit. - "R_390_32": 4 , # Direct 32 bit. - "R_390_PC32": 5 , # PC relative 32 bit. - "R_390_GOT12": 6 , # 12 bit GOT offset. - "R_390_GOT32": 7 , # 32 bit GOT offset. - "R_390_PLT32": 8 , # 32 bit PC relative PLT address. - "R_390_COPY": 9 , # Copy symbol at runtime. - "R_390_GLOB_DAT": 10 , # Create GOT entry. - "R_390_JMP_SLOT": 11 , # Create PLT entry. - "R_390_RELATIVE": 12 , # Adjust by program base. - "R_390_GOTOFF32": 13 , # 32 bit offset to GOT. - "R_390_GOTPC": 14 , # 32 bit PC relative offset to GOT. - "R_390_GOT16": 15 , # 16 bit GOT offset. - "R_390_PC16": 16 , # PC relative 16 bit. - "R_390_PC16DBL": 17 , # PC relative 16 bit shifted by 1. - "R_390_PLT16DBL": 18 , # 16 bit PC rel. PLT shifted by 1. - "R_390_PC32DBL": 19 , # PC relative 32 bit shifted by 1. - "R_390_PLT32DBL": 20 , # 32 bit PC rel. PLT shifted by 1. - "R_390_GOTPCDBL": 21 , # 32 bit PC rel. GOT shifted by 1. - "R_390_64": 22 , # Direct 64 bit. - "R_390_PC64": 23 , # PC relative 64 bit. - "R_390_GOT64": 24 , # 64 bit GOT offset. - "R_390_PLT64": 25 , # 64 bit PC relative PLT address. - "R_390_GOTENT": 26 , # 32 bit PC rel. to GOT entry >> 1. - "R_390_GOTOFF16": 27 , # 16 bit offset to GOT. - "R_390_GOTOFF64": 28 , # 64 bit offset to GOT. - "R_390_GOTPLT12": 29 , # 12 bit offset to jump slot. - "R_390_GOTPLT16": 30 , # 16 bit offset to jump slot. - "R_390_GOTPLT32": 31 , # 32 bit offset to jump slot. - "R_390_GOTPLT64": 32 , # 64 bit offset to jump slot. - "R_390_GOTPLTENT": 33 , # 32 bit rel. offset to jump slot. - "R_390_PLTOFF16": 34 , # 16 bit offset from GOT to PLT. - "R_390_PLTOFF32": 35 , # 32 bit offset from GOT to PLT. - "R_390_PLTOFF64": 36 , # 16 bit offset from GOT to PLT. - "R_390_TLS_LOAD": 37 , # Tag for load insn in TLS code. - "R_390_TLS_GDCALL": 38 , # Tag for function call in general - "R_390_TLS_LDCALL": 39 , # Tag for function call in local - "R_390_TLS_GD32": 40 , # Direct 32 bit for general dynamic - "R_390_TLS_GD64": 41 , # Direct 64 bit for general dynamic - "R_390_TLS_GOTIE12": 42 , # 12 bit GOT offset for static TLS - "R_390_TLS_GOTIE32": 43 , # 32 bit GOT offset for static TLS - "R_390_TLS_GOTIE64": 44 , # 64 bit GOT offset for static TLS - "R_390_TLS_LDM32": 45 , # Direct 32 bit for local dynamic - "R_390_TLS_LDM64": 46 , # Direct 64 bit for local dynamic - "R_390_TLS_IE32": 47 , # 32 bit address of GOT entry for - "R_390_TLS_IE64": 48 , # 64 bit address of GOT entry for - "R_390_TLS_IEENT": 49 , # 32 bit rel. offset to GOT entry for - "R_390_TLS_LE32": 50 , # 32 bit negated offset relative to - "R_390_TLS_LE64": 51 , # 64 bit negated offset relative to - "R_390_TLS_LDO32": 52 , # 32 bit offset relative to TLS - "R_390_TLS_LDO64": 53 , # 64 bit offset relative to TLS - "R_390_TLS_DTPMOD": 54 , # ID of module containing symbol. - "R_390_TLS_DTPOFF": 55 , # Offset in TLS block. - "R_390_TLS_TPOFF": 56 , # Negated offset in static TLS - "R_390_20": 57 , # Direct 20 bit. - "R_390_GOT20": 58 , # 20 bit GOT offset. - "R_390_GOTPLT20": 59 , # 20 bit offset to jump slot. - "R_390_TLS_GOTIE20": 60 , # 20 bit GOT offset for static TLS - "R_390_NUM": 61 , # - "R_CRIS_NONE": 0 , # - "R_CRIS_8": 1 , # - "R_CRIS_16": 2 , # - "R_CRIS_32": 3 , # - "R_CRIS_8_PCREL": 4 , # - "R_CRIS_16_PCREL": 5 , # - "R_CRIS_32_PCREL": 6 , # - "R_CRIS_GNU_VTINHERIT": 7 , # - "R_CRIS_GNU_VTENTRY": 8 , # - "R_CRIS_COPY": 9 , # - "R_CRIS_GLOB_DAT": 10 , # - "R_CRIS_JUMP_SLOT": 11 , # - "R_CRIS_RELATIVE": 12 , # - "R_CRIS_16_GOT": 13 , # - "R_CRIS_32_GOT": 14 , # - "R_CRIS_16_GOTPLT": 15 , # - "R_CRIS_32_GOTPLT": 16 , # - "R_CRIS_32_GOTREL": 17 , # - "R_CRIS_32_PLT_GOTREL": 18 , # - "R_CRIS_32_PLT_PCREL": 19 , # - "R_CRIS_NUM": 20 , # - "R_X86_64_NONE": 0 , # No reloc - "R_X86_64_64": 1 , # Direct 64 bit - "R_X86_64_PC32": 2 , # PC relative 32 bit signed - "R_X86_64_GOT32": 3 , # 32 bit GOT entry - "R_X86_64_PLT32": 4 , # 32 bit PLT address - "R_X86_64_COPY": 5 , # Copy symbol at runtime - "R_X86_64_GLOB_DAT": 6 , # Create GOT entry - "R_X86_64_JUMP_SLOT": 7 , # Create PLT entry - "R_X86_64_RELATIVE": 8 , # Adjust by program base - "R_X86_64_GOTPCREL": 9 , # 32 bit signed PC relative - "R_X86_64_32": 10 , # Direct 32 bit zero extended - "R_X86_64_32S": 11 , # Direct 32 bit sign extended - "R_X86_64_16": 12 , # Direct 16 bit zero extended - "R_X86_64_PC16": 13 , # 16 bit sign extended pc relative - "R_X86_64_8": 14 , # Direct 8 bit sign extended - "R_X86_64_PC8": 15 , # 8 bit sign extended pc relative - "R_X86_64_DTPMOD64": 16 , # ID of module containing symbol - "R_X86_64_DTPOFF64": 17 , # Offset in module's TLS block - "R_X86_64_TPOFF64": 18 , # Offset in initial TLS block - "R_X86_64_TLSGD": 19 , # 32 bit signed PC relative offset - "R_X86_64_TLSLD": 20 , # 32 bit signed PC relative offset - "R_X86_64_DTPOFF32": 21 , # Offset in TLS block - "R_X86_64_GOTTPOFF": 22 , # 32 bit signed PC relative offset - "R_X86_64_TPOFF32": 23 , # Offset in initial TLS block - "R_X86_64_PC64": 24 , # PC relative 64 bit - "R_X86_64_GOTOFF64": 25 , # 64 bit offset to GOT - "R_X86_64_GOTPC32": 26 , # 32 bit signed pc relative - "R_X86_64_GOT64": 27 , # 64-bit GOT entry offset - "R_X86_64_GOTPCREL64": 28 , # 64-bit PC relative offset - "R_X86_64_GOTPC64": 29 , # 64-bit PC relative offset to GOT - "R_X86_64_GOTPLT64": 30 , # like GOT64, says PLT entry needed - "R_X86_64_PLTOFF64": 31 , # 64-bit GOT relative offset - "R_X86_64_SIZE32": 32 , # Size of symbol plus 32-bit addend - "R_X86_64_SIZE64": 33 , # Size of symbol plus 64-bit addend - "R_X86_64_GOTPC32_TLSDESC": 34 , # GOT offset for TLS descriptor. - "R_X86_64_TLSDESC_CALL": 35 , # Marker for call through TLS - "R_X86_64_TLSDESC": 36 , # TLS descriptor. - "R_X86_64_IRELATIVE": 37 , # Adjust indirectly by program base - "R_X86_64_NUM": 38 , # - "R_MN10300_NONE": 0 , # No reloc. - "R_MN10300_32": 1 , # Direct 32 bit. - "R_MN10300_16": 2 , # Direct 16 bit. - "R_MN10300_8": 3 , # Direct 8 bit. - "R_MN10300_PCREL32": 4 , # PC-relative 32-bit. - "R_MN10300_PCREL16": 5 , # PC-relative 16-bit signed. - "R_MN10300_PCREL8": 6 , # PC-relative 8-bit signed. - "R_MN10300_GNU_VTINHERIT": 7 , # Ancient C++ vtable garbage... - "R_MN10300_GNU_VTENTRY": 8 , # ... collection annotation. - "R_MN10300_24": 9 , # Direct 24 bit. - "R_MN10300_GOTPC32": 10 , # 32-bit PCrel offset to GOT. - "R_MN10300_GOTPC16": 11 , # 16-bit PCrel offset to GOT. - "R_MN10300_GOTOFF32": 12 , # 32-bit offset from GOT. - "R_MN10300_GOTOFF24": 13 , # 24-bit offset from GOT. - "R_MN10300_GOTOFF16": 14 , # 16-bit offset from GOT. - "R_MN10300_PLT32": 15 , # 32-bit PCrel to PLT entry. - "R_MN10300_PLT16": 16 , # 16-bit PCrel to PLT entry. - "R_MN10300_GOT32": 17 , # 32-bit offset to GOT entry. - "R_MN10300_GOT24": 18 , # 24-bit offset to GOT entry. - "R_MN10300_GOT16": 19 , # 16-bit offset to GOT entry. - "R_MN10300_COPY": 20 , # Copy symbol at runtime. - "R_MN10300_GLOB_DAT": 21 , # Create GOT entry. - "R_MN10300_JMP_SLOT": 22 , # Create PLT entry. - "R_MN10300_RELATIVE": 23 , # Adjust by program base. - "R_MN10300_NUM": 24 , # - "R_M32R_NONE": 0 , # No reloc. - "R_M32R_16": 1 , # Direct 16 bit. - "R_M32R_32": 2 , # Direct 32 bit. - "R_M32R_24": 3 , # Direct 24 bit. - "R_M32R_10_PCREL": 4 , # PC relative 10 bit shifted. - "R_M32R_18_PCREL": 5 , # PC relative 18 bit shifted. - "R_M32R_26_PCREL": 6 , # PC relative 26 bit shifted. - "R_M32R_HI16_ULO": 7 , # High 16 bit with unsigned low. - "R_M32R_HI16_SLO": 8 , # High 16 bit with signed low. - "R_M32R_LO16": 9 , # Low 16 bit. - "R_M32R_SDA16": 10 , # 16 bit offset in SDA. - "R_M32R_GNU_VTINHERIT": 11 , # - "R_M32R_GNU_VTENTRY": 12 , # - "R_M32R_16_RELA": 33 , # Direct 16 bit. - "R_M32R_32_RELA": 34 , # Direct 32 bit. - "R_M32R_24_RELA": 35 , # Direct 24 bit. - "R_M32R_10_PCREL_RELA": 36 , # PC relative 10 bit shifted. - "R_M32R_18_PCREL_RELA": 37 , # PC relative 18 bit shifted. - "R_M32R_26_PCREL_RELA": 38 , # PC relative 26 bit shifted. - "R_M32R_HI16_ULO_RELA": 39 , # High 16 bit with unsigned low - "R_M32R_HI16_SLO_RELA": 40 , # High 16 bit with signed low - "R_M32R_LO16_RELA": 41 , # Low 16 bit - "R_M32R_SDA16_RELA": 42 , # 16 bit offset in SDA - "R_M32R_RELA_GNU_VTINHERIT": 43 , # - "R_M32R_RELA_GNU_VTENTRY": 44 , # - "R_M32R_REL32": 45 , # PC relative 32 bit. - "R_M32R_GOT24": 48 , # 24 bit GOT entry - "R_M32R_26_PLTREL": 49 , # 26 bit PC relative to PLT shifted - "R_M32R_COPY": 50 , # Copy symbol at runtime - "R_M32R_GLOB_DAT": 51 , # Create GOT entry - "R_M32R_JMP_SLOT": 52 , # Create PLT entry - "R_M32R_RELATIVE": 53 , # Adjust by program base - "R_M32R_GOTOFF": 54 , # 24 bit offset to GOT - "R_M32R_GOTPC24": 55 , # 24 bit PC relative offset to GOT - "R_M32R_GOT16_HI_ULO": 56 , # High 16 bit GOT entry with unsigned - "R_M32R_GOT16_HI_SLO": 57 , # High 16 bit GOT entry with signed - "R_M32R_GOT16_LO": 58 , # Low 16 bit GOT entry - "R_M32R_GOTPC_HI_ULO": 59 , # High 16 bit PC relative offset to - "R_M32R_GOTPC_HI_SLO": 60 , # High 16 bit PC relative offset to - "R_M32R_GOTPC_LO": 61 , # Low 16 bit PC relative offset to - "R_M32R_GOTOFF_HI_ULO": 62 , # High 16 bit offset to GOT - "R_M32R_GOTOFF_HI_SLO": 63 , # High 16 bit offset to GOT - "R_M32R_GOTOFF_LO": 64 , # Low 16 bit offset to GOT - "R_M32R_NUM": 256 , # Keep this the last entry. - "SHF_WRITE": (1 << 0) , # Writable - "SHF_ALLOC": (1 << 1) , # Occupies memory during execution - "SHF_EXECINSTR": (1 << 2) , # Executable - "SHF_MERGE": (1 << 4) , # Might be merged - "SHF_STRINGS": (1 << 5) , # Contains nul-terminated strings - "SHF_INFO_LINK": (1 << 6) , # `sh_info' contains SHT index - "SHF_LINK_ORDER": (1 << 7) , # Preserve order after combining - "SHF_OS_NONCONFORMING": (1 << 8) , # Non-standard OS specific handling - "SHF_GROUP": (1 << 9) , # Section is member of a group. - "SHF_TLS": (1 << 10) , # Section hold thread-local data. -# libelf.h constants -# ELF_C - "ELF_C_NULL": 0, - "ELF_C_READ": 1, - "ELF_C_WRITE": 2, - "ELF_C_CLR": 3, - "ELF_C_SET": 4, - "ELF_C_FDDONE": 5, - "ELF_C_FDREAD": 6, - "ELF_C_RDWR": 7, - "ELF_C_NUM": 8, -# ELF_K - "ELF_K_NONE": 0, - "ELF_K_AR": 1, - "ELF_K_COFF": 2, - "ELF_K_ELF": 3, - "ELF_K_NUM": 4, -# ELF_T - "ELF_T_BYTE": 00, - "ELF_T_ADDR": 01, - "ELF_T_DYN": 02, - "ELF_T_EHDR": 03, - "ELF_T_HALF": 04, - "ELF_T_OFF": 05, - "ELF_T_PHDR": 06, - "ELF_T_RELA": 07, - "ELF_T_REL": 8, - "ELF_T_SHDR": 9, - "ELF_T_SWORD": 10, - "ELF_T_SYM": 11, - "ELF_T_WORD": 12, - "ELF_T_SXWORD": 13, - "ELF_T_XWORD": 14, - "ELF_T_VDEF": 15, - "ELF_T_VNEED": 16, - "ELF_T_NUM": 17, -# ELF_F (ELF flags) - "ELF_F_DIRTY": 0x1 , # - "ELF_F_LAYOUT": 0x4 , # - "ELF_F_LAYOUT_OVERLAP": 0x10000000 , # -} - -# Now lets generate constants for all - -g = globals() - -for c in _consts: - g[c] = _consts[c] - -__all__ = _consts.keys() - -# TODO: Move these to the macros module - -#elf.h - -# Macro functions - -#define ELF32_ST_VISIBILITY(o) ((o) & 0x03) -#define ELF64_ST_VISIBILITY(o) ELF32_ST_VISIBILITY (o) - -#define DT_VALTAGIDX(tag) (DT_VALRNGHI - (tag)) # Reverse order! - -#define DT_ADDRTAGIDX(tag) (DT_ADDRRNGHI - (tag)) # Reverse order! - -#define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) # Reverse order! -#define DT_EXTRATAGIDX(tag) ((Elf32_Word)-((Elf32_Sword) (tag) <<1>>1)-1) - -#define ELF32_M_SYM(info) ((info) >> 8) -#define ELF32_M_SIZE(info) ((unsigned char) (info)) -#define ELF32_M_INFO(sym, size) (((sym) << 8) + (unsigned char) (size)) -#define ELF64_M_SYM(info) ELF32_M_SYM (info) -#define ELF64_M_SIZE(info) ELF32_M_SIZE (info) -#define ELF64_M_INFO(sym, size) ELF32_M_INFO (sym, size) - -#define EF_ARM_EABI_VERSION(flags) ((flags) & EF_ARM_EABIMASK) - -#libelf.h diff --git a/tools/esp_app_trace/pylibelf/iterators/__init__.py b/tools/esp_app_trace/pylibelf/iterators/__init__.py deleted file mode 100644 index 437a7118cb..0000000000 --- a/tools/esp_app_trace/pylibelf/iterators/__init__.py +++ /dev/null @@ -1,216 +0,0 @@ -import sys -import os -from .. import * -from ..constants import * -from ..types import * -from ..util import * -from ctypes import * - -def sections(elf, **kwargs): - i = None - ndx = 0 # we skip the first null section - if 'info' in kwargs: - if (isinstance(kwargs['info'], Elf_Scn)): - info = elf_ndxscn(kwargs['info']) - else: - info = kwargs['info'] - else: - info = None - while 1: - i = elf_nextscn(elf, i) - ndx += 1 - - if (not bool(i)): - break - - try: - if ('name' in kwargs and section_name(elf, i) != kwargs['name']): - continue - - if ('type' in kwargs and section_type(elf, i) != kwargs['type']): - continue - - if ('link' in kwargs and section_link(elf, i) != kwargs['link']): - continue - - if (info != None and section_hdr(elf, i).sh_info != info): - continue - except ValueError: - print "Error iterating over section ", i - continue - - if ('ndx' in kwargs and kwargs['ndx']): - yield (ndx, i.contents) - else: - yield i.contents - - -def shdrs(elf): - i = None - while 1: - i = elf_nextscn(elf, i) - if (not bool(i)): - break - - yield select(elf, 'getshdr')(i.contents).contents - -def phdrs(elf): - phdrTbl = select(elf, "getphdr")(elf) - ehdr = select(elf, "getehdr")(elf).contents - phdrCnt = ehdr.e_phnum - - for i in xrange(0, phdrCnt): - yield phdrTbl[i] - -def data(elf_scn): - i = None - while 1: - i = elf_getdata(elf_scn, i) - - if (not bool(i)): - break - - yield i.contents - -def strings(v): - if (isinstance(v, Elf_Data)): - strtab_data = v - size = strtab_data.d_size - buf = cast(strtab_data.d_buf, POINTER(c_char)) - start = 0; - while start < size: - end = start; - while buf[end] != '\x00': end += 1 - yield (strtab_data.d_off + start, buf[start:end]) - - start = end+1 - elif (isinstance(v, Elf_Scn)): - for d in data(v): - strtab_data = d - size = strtab_data.d_size - buf = cast(strtab_data.d_buf, POINTER(c_char)) - start = 0; - while start < size: - end = start; - while buf[end] != '\x00': end += 1 - yield (strtab_data.d_off + start, buf[start:end]) - - start = end+1 - - -def arr_iter(data, itemT, ind = False): - size = data.d_size - - if size % sizeof(itemT) != 0: - raise Exception("Data size not a multiple of symbol size!") - - buf = cast(data.d_buf, POINTER(itemT)) - nelems = size / sizeof(itemT) - - for i in xrange(0, nelems): - if ind: - yield (i, buf[i]) - else: - yield buf[i] - -def syms(elf, v = None): - symT = Elf32_Sym if (is32(elf)) else Elf64_Sym - if v == None: - for s in sections(elf): - hdr = section_hdr(elf, s) - - if (hdr.sh_type != SHT_SYMTAB and hdr.sh_type != SHT_DYNSYM): - continue - - for d in data(s): - for (ind, sym) in arr_iter(d, symT, True): - yield (ind, sym) - elif isinstance(v, Elf_Scn): - for d in data(v): - for (ind, sym) in arr_iter(d, symT, True): - yield (ind, sym) - else: - assert isinstance(v, Elf_Data) - for (ind, sym) in arr_iter(v, symT, True): - yield (ind, sym) - -def rels(elf, **kwargs): - relT = Elf32_Rel if (is32(elf)) else Elf64_Rel - if 'section' in kwargs: - secl = sections(elf, type = SHT_REL, info = kwargs['section']) - else: - secl = sections(elf, type = SHT_REL) - - - if 'range' in kwargs: - for scn in secl: - for d in data(scn): - for rel in arr_iter(d, relT): - if (rel.r_offset >= kwargs['range'][0] and - rel.r_offset < kwargs['range'][1]): - yield (rel, section_hdr(elf, scn).sh_link) - else: - for scn in secl: - for d in data(scn): - for rel in arr_iter(d, relT): - yield (rel, section_hdr(elf, scn).sh_link) - -def relas(elf, **kwargs): - relT = Elf32_Rela if (is32(elf)) else Elf64_Rela - if 'section' in kwargs: - scn = kwargs['section'] - if (type(scn) == str): scn = list(sections(elf, name=scn))[0] - if (isinstance(scn, Elf_Scn)): scn = elf_ndxscn(byref(scn)) - secl = list(sections(elf, type = SHT_RELA, info = scn)) - else: - secl = list(sections(elf, type = SHT_RELA)) - - if 'range' in kwargs: - for scn in secl: - for d in data(scn): - for rel in arr_iter(d, relT): - if (rel.r_offset + rel.r_addend >= kwargs['range'][0] and - rel.r_offset + rel.r_addend < kwargs['range'][1]): - yield (rel, section_hdr(elf, scn).sh_link) - else: - addSecId = kwargs['withSectionId']==True \ - if 'withSectionId' in kwargs \ - else False - if not addSecId: - for scn in secl: - for d in data(scn): - for rel in arr_iter(d, relT): - yield (rel, section_hdr(elf, scn).sh_link) - else: - for scn in secl: - for d in data(scn): - for rel in arr_iter(d, relT): - yield (rel, section_hdr(elf, scn).sh_info) - -def getOnlyData(scn): - d = elf_getdata(scn, None); - assert bool(elf_getdata(scn, d)) == False - return d - -def dyns(elf): - relT = Elf64_Dyn - for scn in sections(elf, name=".dynamic"): - for d in data(scn): - for dyn in arr_iter(d, relT): - yield dyn - -def elfs(fname): - fd = os.open(fname, os.O_RDONLY) - ar = elf_begin(fd, ELF_C_READ, None) - - i = None - while 1: - i = elf_begin(fd, ELF_C_READ, ar) - if (not bool(i)): - break - - yield i - - elf_end(ar) - os.close(fd) - diff --git a/tools/esp_app_trace/pylibelf/macros/__init__.py b/tools/esp_app_trace/pylibelf/macros/__init__.py deleted file mode 100644 index d51a8d93f8..0000000000 --- a/tools/esp_app_trace/pylibelf/macros/__init__.py +++ /dev/null @@ -1,55 +0,0 @@ -def ELF32_R_SYM(i): - if type(i) == str: - assert(len(i) == 1) # Single char - i = ord(i) - return i >> 8 - -def ELF32_R_TYPE(i): - if type(i) == str: - assert(len(i) == 1) # Single char - i = ord(i) - return i % 256 # Lowest 8 bits - -def ELF32_R_INFO(sym, typ): - return (((sym) << 8) + typ % 256) - -def ELF64_R_SYM(i): - if type(i) == str: - assert(len(i) == 1) # Single char - i = ord(i) - return i >> 32 - -def ELF64_R_TYPE(i): - if type(i) == str: - assert(len(i) == 1) # Single char - i = ord(i) - return i & 0xffffffffL - -def ELF64_R_INFO(sym, typ): - return ((sym << 32) + (typ & 0xffffffffL)) - -# symbol st_info - -def ELF32_ST_BIND(val): - if type(val) == str: - assert(len(val) == 1) # Single char - val = ord(val) - return val >> 4 - -def ELF32_ST_TYPE(val): - if type(val) == str: - assert(len(val) == 1) # Single char - val = ord(val) - return val & 0xf - -def ELF32_ST_INFO(bind, type): - return (((bind) << 4) + ((type) & 0xf)) - -def ELF64_ST_BIND(val): - return ELF32_ST_BIND(val) - -def ELF64_ST_TYPE(val): - return ELF32_ST_TYPE(val) - -def ELF64_ST_INFO(bind, type): - return ELF32_ST_INFO(bind, type) diff --git a/tools/esp_app_trace/pylibelf/types/__init__.py b/tools/esp_app_trace/pylibelf/types/__init__.py deleted file mode 100644 index cc838d2f0a..0000000000 --- a/tools/esp_app_trace/pylibelf/types/__init__.py +++ /dev/null @@ -1,274 +0,0 @@ -from ctypes import * -from ..constants import EI_NIDENT - -# Obtained from /usr/lib/elf.h - -# Type for a 16-bit quantity. -Elf32_Half = c_uint16 -Elf64_Half = c_uint16 - -# Types for signed and unsigned 32-bit quantities. -Elf32_Word = c_uint32 -Elf32_Sword = c_int32 -Elf64_Word = c_uint32 -Elf64_Sword = c_int32 - -# Types for signed and unsigned 64-bit quantities. -Elf32_Xword = c_uint64 -Elf32_Sxword = c_int64 -Elf64_Xword = c_uint64 -Elf64_Sxword = c_int64 - -# Type of addresses. -Elf32_Addr = c_uint32 -Elf64_Addr = c_uint64 - -# Type of file offsets. -Elf32_Off = c_uint32 -Elf64_Off = c_uint64 - -# Type for section indices, which are 16-bit quantities. -Elf32_Section = c_uint16 -Elf64_Section = c_uint16 - -# Type for version symbol information. -Elf32_Versym = Elf32_Half -Elf64_Versym = Elf64_Half - -# The ELF file header. This appears at the start of every ELF file. - -Elf_IdentT = c_char * EI_NIDENT - -Elf_Cmd = c_int - -class _ElfStructure(Structure): - def __str__(self): - return self.__class__.__name__ + '(' + \ - ','.join([field[0] + '=' + str(getattr(self, field[0])) for field in self._fields_]) + ')' - -class _ElfUnion(Union): - def __str__(self): - return self.__class__.__name__ + '(' + \ - ','.join([field[0] + '=' + str(getattr(self, field[0])) for field in self._fields_]) + ')' - -# Libelf opaque handles -class Elf(_ElfStructure): - _fields_ = [] -class Elf_Scn(_ElfStructure): - _fields_ = [] - -class Elf_Data(_ElfStructure): - _fields_ = [ - ('d_buf', c_void_p), - ('d_type', c_int), - ('d_size', c_size_t), - ('d_off', c_size_t), - ('d_align', c_size_t), - ('d_version', c_uint) - ] - -ElfP = POINTER(Elf) -Elf_ScnP = POINTER(Elf_Scn) -Elf_DataP = POINTER(Elf_Data) - -class Elf32_Ehdr(_ElfStructure): - _fields_ = [ - ('e_ident', Elf_IdentT ), # Magic number and other info - ('e_type', Elf32_Half ), # Object file type - ('e_machine', Elf32_Half ), # Architecture - ('e_version', Elf32_Word ), # Object file version - ('e_entry', Elf32_Addr ), # Entry point virtual address - ('e_phoff', Elf32_Off), # Program header table file offset - ('e_shoff', Elf32_Off), # Section header table file offset - ('e_flags', Elf32_Word ), # Processor-specific flags - ('e_ehsize', Elf32_Half ), # ELF header size in bytes - ('e_phentsize', Elf32_Half ), # Program header table entry size - ('e_phnum', Elf32_Half ), # Program header table entry count - ('e_shentsize', Elf32_Half ), # Section header table entry size - ('e_shnum', Elf32_Half ), # Section header table entry count - ('e_shstrndx', Elf32_Half ), # Section header string table index - ] - -class Elf64_Ehdr(_ElfStructure): - _fields_ = [ - ('e_ident', Elf_IdentT ), # Magic number and other info - ('e_type', Elf64_Half ), # Object file type - ('e_machine', Elf64_Half ), # Architecture - ('e_version', Elf64_Word ), # Object file version - ('e_entry', Elf64_Addr ), # Entry point virtual address - ('e_phoff', Elf64_Off), # Program header table file offset - ('e_shoff', Elf64_Off), # Section header table file offset - ('e_flags', Elf64_Word ), # Processor-specific flags - ('e_ehsize', Elf64_Half ), # ELF header size in bytes - ('e_phentsize', Elf64_Half ), # Program header table entry size - ('e_phnum', Elf64_Half ), # Program header table entry count - ('e_shentsize', Elf64_Half ), # Section header table entry size - ('e_shnum', Elf64_Half ), # Section header table entry count - ('e_shstrndx', Elf64_Half ), # Section header string table index - ] - -class Elf32_Shdr(_ElfStructure): - _fields_ = [ - ('sh_name', Elf32_Word), # Section name (string tbl index) - ('sh_type', Elf32_Word), # Section type - ('sh_flags', Elf32_Word), # Section flags - ('sh_addr', Elf32_Addr), # Section virtual addr at execution - ('sh_offset', Elf32_Off), # Section file offset - ('sh_size', Elf32_Word), # Section size in bytes - ('sh_link', Elf32_Word), # Link to another section - ('sh_info', Elf32_Word), # Additional section information - ('sh_addralign', Elf32_Word), # Section alignment - ('sh_entsize', Elf32_Word), # Entry size if section holds table - ] - -class Elf64_Shdr(_ElfStructure): - _fields_ = [ - ('sh_name', Elf64_Word), # Section name (string tbl index) - ('sh_type', Elf64_Word), # Section type - ('sh_flags', Elf64_Xword), # Section flags - ('sh_addr', Elf64_Addr), # Section virtual addr at execution - ('sh_offset', Elf64_Off), # Section file offset - ('sh_size', Elf64_Xword), # Section size in bytes - ('sh_link', Elf64_Word), # Link to another section - ('sh_info', Elf64_Word), # Additional section information - ('sh_addralign', Elf64_Xword), # Section alignment - ('sh_entsize', Elf64_Xword), # Entry size if section holds table - ] - -class Elf32_Phdr(_ElfStructure): - _fields_ = [ - ('p_type', Elf32_Word), # Segment type - ('p_offset', Elf32_Off), # Segment file offset - ('p_vaddr', Elf32_Addr), # Segment virtual address - ('p_paddr', Elf32_Addr), # Segment physical address - ('p_filesz', Elf32_Word), # Segment size in file - ('p_memsz', Elf32_Word), # Segment size in memory - ('p_flags', Elf32_Word), # Segment flags - ('p_align', Elf32_Word), # Segment alignment - ] - -class Elf64_Phdr(_ElfStructure): - _fields_ = [ - ('p_type', Elf64_Word), # Segment type - ('p_flags', Elf64_Word), # Segment flags - ('p_offset', Elf64_Off), # Segment file offset - ('p_vaddr', Elf64_Addr), # Segment virtual address - ('p_paddr', Elf64_Addr), # Segment physical address - ('p_filesz', Elf64_Xword), # Segment size in file - ('p_memsz', Elf64_Xword), # Segment size in memory - ('p_align', Elf64_Xword), # Segment alignment - ] - -# /* Symbol table entry. */ -class Elf32_Sym(_ElfStructure): - _fields_ = [ - ('st_name', Elf32_Word), # Symbol name (string tbl index) - ('st_value', Elf32_Addr), # Symbol value - ('st_size', Elf32_Word), # Symbol size - ('st_info', c_char), # Symbol type and binding - ('st_other', c_char), # Symbol visibility - ('st_shndx', Elf32_Section), # Section index - ] - -class Elf64_Sym(_ElfStructure): - _fields_ = [ - ('st_name', Elf64_Word), # Symbol name (string tbl index) - ('st_info', c_char), # Symbol type and binding - ('st_other', c_char), # Symbol visibility - ('st_shndx', Elf64_Section), # Section index - ('st_value', Elf64_Addr), # Symbol value - ('st_size', Elf64_Xword), # Symbol size - ] - -#/* The syminfo section if available contains additional information about -# every dynamic symbol. */ - -class Elf32_Syminfo(_ElfStructure): - _fields_ = [ - ('si_boundto', Elf32_Half), # Direct bindings, symbol bound to - ('si_flags', Elf32_Half), # Per symbol flags - ] - -class Elf64_Syminfo(_ElfStructure): - _fields_ = [ - ('si_boundto', Elf64_Half), # Direct bindings, symbol bound to - ('si_flags', Elf64_Half), # Per symbol flags - ] - -# /* Relocation table entry without addend (in section of type SHT_REL). */ - -class Elf32_Rel(_ElfStructure): - _fields_ = [ - ('r_offset', Elf32_Addr), # Address - ('r_info', Elf32_Word), # Relocation type and symbol index - ] - -class Elf64_Rel(_ElfStructure): - _fields_ = [ - ('r_offset', Elf64_Addr), # Address - ('r_info', Elf64_Xword), # Relocation type and symbol index - ] - -# # Relocation table entry with addend (in section of type SHT_RELA). - -class Elf32_Rela(_ElfStructure): - _fields_ = [ - ('r_offset', Elf32_Addr), # Address - ('r_info', Elf32_Word), # Relocation type and symbol index - ('r_addend', Elf32_Sword), # Addend - ] - -class Elf64_Rela(_ElfStructure): - _fields_ = [ - ('r_offset', Elf64_Addr), # Address - ('r_info', Elf64_Xword), # Relocation type and symbol index - ('r_addend', Elf64_Sxword), # Addend - ] - -time_t = c_int64 -uid_t = c_int32 -gid_t = c_int32 -mode_t = c_int32 -off_t = c_int64 - -class Elf_Arhdr(_ElfStructure): - _fields_ = [ - ('ar_name', c_char_p), - ('ar_date', time_t), - ('ar_uid', uid_t), - ('ar_gid', gid_t), - ('ar_mode', mode_t), - ('ar_size', off_t), - ('ar_fmag', POINTER(c_char)), - ] - -class _Elf64_DynUnion(_ElfUnion): - _fields_ = [ - ('d_val', Elf64_Xword), - ('d_ptr', Elf64_Addr), - ] - -class Elf64_Dyn(_ElfStructure): - _fields_ = [ - ('d_tag', Elf64_Xword), - ('d_un', _Elf64_DynUnion), - ] - -# GNU Extensions -class Elf64_Verneed(_ElfStructure): - _fields_ = [ - ('vn_version', Elf64_Half), - ('vn_cnt', Elf64_Half), - ('vn_file', Elf64_Word), - ('vn_aux', Elf64_Word), - ('vn_next', Elf64_Word), - ] - -class Elf64_Vernaux(_ElfStructure): - _fields_ = [ - ('vna_hash', Elf64_Word), - ('vna_flags', Elf64_Half), - ('vna_other', Elf64_Half), - ('vna_name', Elf64_Word), - ('vna_next', Elf64_Word), - ] diff --git a/tools/esp_app_trace/pylibelf/util/__init__.py b/tools/esp_app_trace/pylibelf/util/__init__.py deleted file mode 100644 index 5eb472a4f4..0000000000 --- a/tools/esp_app_trace/pylibelf/util/__init__.py +++ /dev/null @@ -1,38 +0,0 @@ -from .. import * -from ..types import * -from ..constants import * -from ctypes import * -import os - -def _class(elf): return ord(elf_getident(elf, None).contents[EI_CLASS]) - -def is32(elf): return _class(elf) == ELFCLASS32 -def is64(elf): return _class(elf) == ELFCLASS64 - -def select(elf, fname): - if is32(elf): - return globals()['elf32_' + fname] - else: - return globals()['elf64_' + fname] - -def section_name(elfP, secP): - shstrndx = c_size_t() - r = elf_getshstrndx(elfP, byref(shstrndx)) - shdr = select(elfP, 'getshdr')(secP) - return elf_strptr(elfP, shstrndx, shdr.contents.sh_name) - -def section_type(elfP, secP): - return select(elfP, 'getshdr')(secP).contents.sh_type - -def section_link(elfP, secP): - return select(elfP, 'getshdr')(secP).contents.sh_link - -def section_hdr(elfP, secP): - return select(elfP, 'getshdr')(secP).contents - -def open_elf(fname): - fd = os.open(fname, os.O_RDONLY) - return elf_begin(fd, ELF_C_READ, None) - -def sym_name(elf, scn, sym): - return elf_strptr(elf, section_link(elf, scn), sym.st_name) diff --git a/tools/esp_app_trace/pylibelf/util/syms/__init__.py b/tools/esp_app_trace/pylibelf/util/syms/__init__.py deleted file mode 100644 index ac7267e181..0000000000 --- a/tools/esp_app_trace/pylibelf/util/syms/__init__.py +++ /dev/null @@ -1,58 +0,0 @@ -from .. import * -from ...types import * -from ...iterators import * - -def defined(s): return s.st_shndx != SHN_UNDEF - -def defines(elf, symN): - s = findSymbol(elf, symN) - print elf, symN, s - if s != None: - print s.st_shndx, s.st_name - return s != None and defined(s[1]) - -def derefSymbol(elf, s): - assert defined(s) - if s.st_shndx == SHN_ABS: - raise Exception("NYI") - else: - scn = elf_getscn(elf, s.st_shndx) - shdr = section_hdr(elf, scn); - off = 0 - base = shdr.sh_addr if shdr.sh_addr != 0 else 0 - start = s.st_value - end = s.st_value + s.st_size - r = '' - for d in data(scn): - if start >= end: break; - off = base + d.d_off - if start >= off and start < off + d.d_size: - c = cast(d.d_buf, POINTER(c_char)) - l = min(off + d.d_size, end) - start - r += c[start- off : start - off + l] - start += l - - return r - -def derefSymbolFull(elf, s): - """ Given an elf file and a Elf{32/64}_Sym defined in the elf file, - return a tuple with the contents of memory refered to by the symbol, - and any Rel's and Rela's inside that memory. - """ - assert (defined(s)) - contents = derefSymbol(elf, s) - relL = list(rels(elf, section=s.st_shndx, \ - range=(s.st_value, s.st_size + s.st_value))) - relaL = list(relas(elf, section=s.st_shndx, \ - range=(s.st_value, s.st_size + s.st_value))) - return (contents, relL, relaL) - -# Given a symbol name return the symbol and section in which it occurs -def findSymbol(elf, s): - for scn in sections(elf, type=SHT_SYMTAB): - strndx = section_link(elf, scn) - for d in data(scn): - for (ind, sym) in syms(elf, d): - if s == elf_strptr(elf, strndx, sym.st_name): - return (scn, sym) - return None diff --git a/tools/esp_app_trace/sysviewtrace_proc.py b/tools/esp_app_trace/sysviewtrace_proc.py new file mode 100755 index 0000000000..d94555982a --- /dev/null +++ b/tools/esp_app_trace/sysviewtrace_proc.py @@ -0,0 +1,119 @@ +#!/usr/bin/env python +# +# Copyright 2019 Espressif Systems (Shanghai) PTE LTD +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# This is python script to process various types trace data streams in SystemView format. +# Trace data can be provided in multiple trace files (one per CPU). After processing phase +# script prints report for every type of trace data stream which was found. +# + +import argparse +import sys +import os.path +import signal +import traceback +import espytrace.apptrace as apptrace +import espytrace.sysview as sysview + + +def main(): + + parser = argparse.ArgumentParser(description='ESP32 SEGGER SystemView Trace Parsing Tool') + + parser.add_argument('trace_sources', help='Trace data sources. Format: [file://]/path/to/file.', nargs='+', type=str) + parser.add_argument('elf_file', help='Path to program ELF file.', type=str) + parser.add_argument('--tmo', '-w', help='Data wait timeout in sec. -1: infinite, 0: no wait', type=int, default=0) + parser.add_argument('--dump-events', '-d', help='Dump all events.', action='store_true') + parser.add_argument('--print-events', '-p', help='Print events of selected types. By default only reports are printed', action='store_true') + parser.add_argument('--include-events', '-i', help='Events types to be included into report.', type=str, choices=['heap', 'log', 'all'], default='all') + parser.add_argument('--toolchain', '-t', help='Toolchain prefix.', type=str, default='xtensa-esp32-elf-') + parser.add_argument('--events-map', '-e', help='Events map file.', type=str, default=os.path.join(os.path.dirname(__file__), 'SYSVIEW_FreeRTOS.txt')) + args = parser.parse_args() + + def sig_int_handler(signum, frame): + reader.cleanup() + + signal.signal(signal.SIGINT, sig_int_handler) + + include_events = {'heap': False, 'log': False} + if args.include_events == 'all': + for k in include_events: + include_events[k] = True + elif args.include_events == 'heap': + include_events['heap'] = True + elif args.include_events == 'log': + include_events['log'] = True + + # parse trace files + parsers = [] + for i, trace_source in enumerate(args.trace_sources): + try: + parser = sysview.SysViewMultiTraceDataParser(print_events=False, core_id=i) + if include_events['heap']: + parser.add_stream_parser(sysview.SysViewTraceDataParser.STREAMID_HEAP, + sysview.SysViewHeapTraceDataParser(print_events=False, core_id=i)) + if include_events['log']: + parser.add_stream_parser(sysview.SysViewTraceDataParser.STREAMID_LOG, + sysview.SysViewLogTraceDataParser(print_events=False, core_id=i)) + parsers.append(parser) + except Exception as e: + print("Failed to create data parser ({})!".format(e)) + traceback.print_exc() + sys.exit(2) + reader = apptrace.reader_create(trace_source, args.tmo) + if not reader: + print("Failed to create trace reader!") + sys.exit(2) + try: + print("Parse trace from '{}'...".format(trace_source)) + sysview.parse_trace(reader, parser, args.events_map) + print("Parsing completed.") + except (apptrace.ReaderTimeoutError, apptrace.ReaderShutdownRequest) as e: + print("Stop parsing trace. ({})".format(e)) + except Exception as e: + print("Failed to parse trace ({})!".format(e)) + parser.cleanup() + traceback.print_exc() + sys.exit(2) + finally: + reader.cleanup() + + # merge and process traces + try: + proc = sysview.SysViewMultiTraceDataProcessor(traces=parsers, print_events=args.dump_events) + if include_events['heap']: + proc.add_stream_processor(sysview.SysViewTraceDataParser.STREAMID_HEAP, + sysview.SysViewHeapTraceDataProcessor(args.toolchain, args.elf_file, print_heap_events=args.print_events)) + if include_events['log']: + proc.add_stream_processor(sysview.SysViewTraceDataParser.STREAMID_LOG, + sysview.SysViewLogTraceDataProcessor(print_log_events=args.print_events)) + except Exception as e: + print("Failed to create data processor ({})!".format(e)) + traceback.print_exc() + sys.exit(2) + try: + print("Process events from '{}'...".format(args.trace_sources)) + proc.merge_and_process() + print("Processing completed.") + except Exception as e: + print("Failed to process trace ({})!".format(e)) + traceback.print_exc() + sys.exit(2) + finally: + proc.print_report() + + +if __name__ == '__main__': + main() diff --git a/tools/esp_app_trace/test/logtrace/adc_log.trc b/tools/esp_app_trace/test/logtrace/adc_log.trc new file mode 100644 index 0000000000..925213b0ea Binary files /dev/null and b/tools/esp_app_trace/test/logtrace/adc_log.trc differ diff --git a/tools/esp_app_trace/test/logtrace/expected_output b/tools/esp_app_trace/test/logtrace/expected_output new file mode 100644 index 0000000000..2f9368cb4e --- /dev/null +++ b/tools/esp_app_trace/test/logtrace/expected_output @@ -0,0 +1,436 @@ +Parse trace file 'adc_log.trc'... +Unprocessed 7 bytes of log record args! +Parsing completed. +==================================================================== +I (75854) example: Sample:1, Value:0 +I (75854) example: Sample:2, Value:0 +I (75854) example: Sample:3, Value:0 +I (75854) example: Sample:4, Value:0 +I (75854) example: Sample:5, Value:0 +I (75854) example: Sample:6, Value:0 +I (75854) example: Sample:7, Value:0 +I (75854) example: Sample:8, Value:0 +I (75854) example: Sample:9, Value:0 +I (75854) example: Sample:10, Value:0 +I (75854) example: Sample:11, Value:0 +I (75854) example: Sample:12, Value:0 +I (75854) example: Sample:13, Value:0 +I (75854) example: Sample:14, Value:0 +I (75854) example: Sample:15, Value:0 +I (75854) example: Sample:16, Value:0 +I (75854) example: Sample:17, Value:0 +I (75854) example: Sample:18, Value:0 +I (75854) example: Sample:19, Value:0 +I (75854) example: Sample:20, Value:0 +I (75854) example: Sample:21, Value:0 +I (75854) example: Sample:22, Value:0 +I (75854) example: Sample:23, Value:0 +I (75854) example: Sample:24, Value:0 +I (75854) example: Sample:25, Value:0 +I (75854) example: Sample:26, Value:0 +I (75854) example: Sample:27, Value:0 +I (75854) example: Sample:28, Value:0 +I (75854) example: Sample:29, Value:0 +I (75854) example: Sample:30, Value:0 +I (75854) example: Sample:31, Value:0 +I (75854) example: Sample:32, Value:0 +I (75854) example: Sample:33, Value:0 +I (75854) example: Sample:34, Value:0 +I (75854) example: Sample:35, Value:0 +I (75854) example: Sample:36, Value:0 +I (75854) example: Sample:37, Value:0 +I (75854) example: Sample:38, Value:0 +I (75854) example: Sample:39, Value:0 +I (75854) example: Sample:40, Value:0 +I (75854) example: Sample:41, Value:0 +I (75854) example: Sample:42, Value:0 +I (75854) example: Sample:43, Value:0 +I (75854) example: Sample:44, Value:0 +I (75854) example: Sample:45, Value:0 +I (75854) example: Sample:46, Value:0 +I (75854) example: Sample:47, Value:0 +I (75854) example: Sample:48, Value:0 +I (75854) example: Sample:49, Value:0 +I (75854) example: Sample:50, Value:0 +I (75854) example: Sample:51, Value:0 +I (75854) example: Sample:52, Value:0 +I (75854) example: Sample:53, Value:0 +I (75854) example: Sample:54, Value:0 +I (75854) example: Sample:55, Value:0 +I (75854) example: Sample:56, Value:0 +I (75854) example: Sample:57, Value:0 +I (75854) example: Sample:58, Value:0 +I (75854) example: Sample:59, Value:0 +I (75854) example: Sample:60, Value:0 +I (75854) example: Sample:61, Value:0 +I (75854) example: Sample:62, Value:0 +I (75854) example: Sample:63, Value:0 +I (75854) example: Sample:64, Value:0 +I (75854) example: Sample:65, Value:0 +I (75854) example: Sample:66, Value:0 +I (75854) example: Sample:67, Value:0 +I (75854) example: Sample:68, Value:0 +I (75854) example: Sample:69, Value:0 +I (75854) example: Sample:70, Value:0 +I (75854) example: Sample:71, Value:0 +I (75854) example: Sample:72, Value:0 +I (75854) example: Sample:73, Value:0 +I (75854) example: Sample:74, Value:0 +I (75854) example: Sample:75, Value:0 +I (75854) example: Sample:76, Value:0 +I (75854) example: Sample:77, Value:0 +I (75854) example: Sample:78, Value:0 +I (75854) example: Sample:79, Value:0 +I (75854) example: Sample:80, Value:0 +I (75854) example: Sample:81, Value:0 +I (75854) example: Sample:82, Value:0 +I (75854) example: Sample:83, Value:0 +I (75854) example: Sample:84, Value:0 +I (75854) example: Sample:85, Value:0 +I (75854) example: Sample:86, Value:0 +I (75854) example: Sample:87, Value:0 +I (75854) example: Sample:88, Value:0 +I (75854) example: Sample:89, Value:0 +I (75854) example: Sample:90, Value:0 +I (75854) example: Sample:91, Value:0 +I (75854) example: Sample:92, Value:0 +I (75854) example: Sample:93, Value:0 +I (75854) example: Sample:94, Value:0 +I (75854) example: Sample:95, Value:0 +I (75854) example: Sample:96, Value:0 +I (75854) example: Sample:97, Value:0 +I (75854) example: Sample:98, Value:0 +I (75854) example: Sample:99, Value:0 +I (75854) example: Sample:100, Value:0 +I (75854) example: Sample:101, Value:0 +I (75854) example: Sample:102, Value:0 +I (75854) example: Sample:103, Value:0 +I (75854) example: Sample:104, Value:0 +I (75854) example: Sample:105, Value:0 +I (75854) example: Sample:106, Value:0 +I (75854) example: Sample:107, Value:0 +I (75854) example: Sample:108, Value:0 +I (75854) example: Sample:109, Value:0 +I (75854) example: Sample:110, Value:0 +I (75854) example: Sample:111, Value:0 +I (75854) example: Sample:112, Value:0 +I (75854) example: Sample:113, Value:0 +I (75854) example: Sample:114, Value:0 +I (75854) example: Sample:115, Value:0 +I (75854) example: Sample:116, Value:0 +I (75854) example: Sample:117, Value:0 +I (75854) example: Sample:118, Value:0 +I (75854) example: Sample:119, Value:0 +I (75854) example: Sample:120, Value:0 +I (75854) example: Sample:121, Value:0 +I (75854) example: Sample:122, Value:0 +I (75854) example: Sample:123, Value:0 +I (75854) example: Sample:124, Value:0 +I (75854) example: Sample:125, Value:0 +I (75854) example: Sample:126, Value:0 +I (75854) example: Sample:127, Value:0 +I (75854) example: Sample:128, Value:0 +I (75854) example: Sample:129, Value:0 +I (75854) example: Sample:130, Value:0 +I (75854) example: Sample:131, Value:0 +I (75854) example: Sample:132, Value:0 +I (75854) example: Sample:133, Value:0 +I (75854) example: Sample:134, Value:0 +I (75854) example: Sample:135, Value:0 +I (75854) example: Sample:136, Value:0 +I (75854) example: Sample:137, Value:0 +I (75854) example: Sample:138, Value:0 +I (75854) example: Sample:139, Value:0 +I (75854) example: Sample:140, Value:0 +I (75854) example: Sample:141, Value:0 +I (75854) example: Sample:142, Value:0 +I (75854) example: Sample:143, Value:0 +I (75854) example: Sample:144, Value:0 +I (75854) example: Sample:145, Value:0 +I (75854) example: Sample:146, Value:0 +I (75854) example: Sample:147, Value:0 +I (75854) example: Sample:148, Value:0 +I (75854) example: Sample:149, Value:0 +I (75854) example: Sample:150, Value:0 +I (75854) example: Sample:151, Value:0 +I (75854) example: Sample:152, Value:0 +I (75854) example: Sample:153, Value:0 +I (75854) example: Sample:154, Value:0 +I (75854) example: Sample:155, Value:0 +I (75854) example: Sample:156, Value:0 +I (75854) example: Sample:157, Value:0 +I (75854) example: Sample:158, Value:0 +I (75854) example: Sample:159, Value:0 +I (75854) example: Sample:160, Value:0 +I (75854) example: Sample:161, Value:0 +I (75854) example: Sample:162, Value:0 +I (75854) example: Sample:163, Value:0 +I (75854) example: Sample:164, Value:0 +I (75854) example: Sample:165, Value:0 +I (75854) example: Sample:166, Value:0 +I (75854) example: Sample:167, Value:0 +I (75854) example: Sample:168, Value:0 +I (75854) example: Sample:169, Value:0 +I (75854) example: Sample:170, Value:0 +I (75854) example: Sample:171, Value:0 +I (75854) example: Sample:172, Value:0 +I (75854) example: Sample:173, Value:0 +I (75854) example: Sample:174, Value:0 +I (75854) example: Sample:175, Value:0 +I (75854) example: Sample:176, Value:0 +I (75864) example: Sample:177, Value:0 +I (75864) example: Sample:178, Value:0 +I (75864) example: Sample:179, Value:0 +I (75864) example: Sample:180, Value:0 +I (75864) example: Sample:181, Value:0 +I (75864) example: Sample:182, Value:0 +I (75864) example: Sample:183, Value:0 +I (75864) example: Sample:184, Value:0 +I (75864) example: Sample:185, Value:0 +I (75864) example: Sample:186, Value:0 +I (75864) example: Sample:187, Value:0 +I (75864) example: Sample:188, Value:0 +I (75864) example: Sample:189, Value:0 +I (75864) example: Sample:190, Value:0 +I (75864) example: Sample:191, Value:0 +I (75864) example: Sample:192, Value:0 +I (75864) example: Sample:193, Value:0 +I (75864) example: Sample:194, Value:0 +I (75864) example: Sample:195, Value:0 +I (75864) example: Sample:196, Value:0 +I (75864) example: Sample:197, Value:0 +I (75864) example: Sample:198, Value:0 +I (75864) example: Sample:199, Value:0 +I (75864) example: Sample:200, Value:0 +I (75864) example: Sample:201, Value:0 +I (75864) example: Sample:202, Value:0 +I (75864) example: Sample:203, Value:0 +I (75864) example: Sample:204, Value:0 +I (75864) example: Sample:205, Value:0 +I (75864) example: Sample:206, Value:0 +I (75864) example: Sample:207, Value:0 +I (75864) example: Sample:208, Value:0 +I (75864) example: Sample:209, Value:0 +I (75864) example: Sample:210, Value:0 +I (75864) example: Sample:211, Value:0 +I (75864) example: Sample:212, Value:0 +I (75864) example: Sample:213, Value:0 +I (75864) example: Sample:214, Value:0 +I (75864) example: Sample:215, Value:0 +I (75864) example: Sample:216, Value:0 +I (75864) example: Sample:217, Value:0 +I (75864) example: Sample:218, Value:0 +I (75864) example: Sample:219, Value:0 +I (75864) example: Sample:220, Value:0 +I (75864) example: Sample:221, Value:0 +I (75864) example: Sample:222, Value:0 +I (75864) example: Sample:223, Value:0 +I (75864) example: Sample:224, Value:0 +I (75864) example: Sample:225, Value:0 +I (75864) example: Sample:226, Value:0 +I (75864) example: Sample:227, Value:0 +I (75864) example: Sample:228, Value:0 +I (75864) example: Sample:229, Value:0 +I (75864) example: Sample:230, Value:0 +I (75864) example: Sample:231, Value:0 +I (75864) example: Sample:232, Value:0 +I (75864) example: Sample:233, Value:0 +I (75864) example: Sample:234, Value:0 +I (75864) example: Sample:235, Value:0 +I (75864) example: Sample:236, Value:0 +I (75864) example: Sample:237, Value:0 +I (75864) example: Sample:238, Value:0 +I (75864) example: Sample:239, Value:0 +I (75864) example: Sample:240, Value:0 +I (75864) example: Sample:241, Value:0 +I (75864) example: Sample:242, Value:0 +I (75864) example: Sample:243, Value:0 +I (75864) example: Sample:244, Value:0 +I (75864) example: Sample:245, Value:0 +I (75864) example: Sample:246, Value:0 +I (75864) example: Sample:247, Value:0 +I (75864) example: Sample:248, Value:0 +I (75864) example: Sample:249, Value:0 +I (75864) example: Sample:250, Value:0 +I (75864) example: Sample:251, Value:0 +I (75864) example: Sample:252, Value:0 +I (75864) example: Sample:253, Value:0 +I (75864) example: Sample:254, Value:0 +I (75864) example: Sample:255, Value:0 +I (75864) example: Sample:256, Value:0 +I (75864) example: Sample:257, Value:0 +I (75864) example: Sample:258, Value:0 +I (75864) example: Sample:259, Value:0 +I (75864) example: Sample:260, Value:0 +I (75864) example: Sample:261, Value:0 +I (75864) example: Sample:262, Value:0 +I (75864) example: Sample:263, Value:0 +I (75864) example: Sample:264, Value:0 +I (75864) example: Sample:265, Value:0 +I (75864) example: Sample:266, Value:0 +I (75864) example: Sample:267, Value:0 +I (75864) example: Sample:268, Value:0 +I (75864) example: Sample:269, Value:0 +I (75864) example: Sample:270, Value:0 +I (75864) example: Sample:271, Value:0 +I (75864) example: Sample:272, Value:0 +I (75864) example: Sample:273, Value:0 +I (75864) example: Sample:274, Value:0 +I (75864) example: Sample:275, Value:0 +I (75864) example: Sample:276, Value:0 +I (75864) example: Sample:277, Value:0 +I (75864) example: Sample:278, Value:0 +I (75864) example: Sample:279, Value:0 +I (75864) example: Sample:280, Value:0 +I (75864) example: Sample:281, Value:0 +I (75864) example: Sample:282, Value:0 +I (75864) example: Sample:283, Value:0 +I (75864) example: Sample:284, Value:0 +I (75864) example: Sample:285, Value:0 +I (75864) example: Sample:286, Value:0 +I (75864) example: Sample:287, Value:0 +I (75864) example: Sample:288, Value:0 +I (75864) example: Sample:289, Value:0 +I (75864) example: Sample:290, Value:0 +I (75864) example: Sample:291, Value:0 +I (75864) example: Sample:292, Value:0 +I (75864) example: Sample:293, Value:0 +I (75864) example: Sample:294, Value:0 +I (75864) example: Sample:295, Value:0 +I (75864) example: Sample:296, Value:0 +I (75864) example: Sample:297, Value:0 +I (75864) example: Sample:298, Value:0 +I (75864) example: Sample:299, Value:0 +I (75864) example: Sample:300, Value:0 +I (75864) example: Sample:301, Value:0 +I (75864) example: Sample:302, Value:0 +I (75864) example: Sample:303, Value:0 +I (75864) example: Sample:304, Value:0 +I (75864) example: Sample:305, Value:0 +I (75864) example: Sample:306, Value:0 +I (75864) example: Sample:307, Value:0 +I (75864) example: Sample:308, Value:0 +I (75864) example: Sample:309, Value:0 +I (75864) example: Sample:310, Value:0 +I (75864) example: Sample:311, Value:0 +I (75864) example: Sample:312, Value:0 +I (75864) example: Sample:313, Value:0 +I (75864) example: Sample:314, Value:0 +I (75864) example: Sample:315, Value:0 +I (75864) example: Sample:316, Value:0 +I (75864) example: Sample:317, Value:0 +I (75864) example: Sample:318, Value:0 +I (75864) example: Sample:319, Value:0 +I (75864) example: Sample:320, Value:0 +I (75864) example: Sample:321, Value:0 +I (75864) example: Sample:322, Value:0 +I (75864) example: Sample:323, Value:0 +I (75864) example: Sample:324, Value:0 +I (75864) example: Sample:325, Value:0 +I (75864) example: Sample:326, Value:0 +I (75864) example: Sample:327, Value:0 +I (75864) example: Sample:328, Value:0 +I (75864) example: Sample:329, Value:0 +I (75864) example: Sample:330, Value:0 +I (75864) example: Sample:331, Value:0 +I (75864) example: Sample:332, Value:0 +I (75864) example: Sample:333, Value:0 +I (75864) example: Sample:334, Value:0 +I (75864) example: Sample:335, Value:0 +I (75864) example: Sample:336, Value:0 +I (75864) example: Sample:337, Value:0 +I (75864) example: Sample:338, Value:0 +I (75864) example: Sample:339, Value:0 +I (75864) example: Sample:340, Value:0 +I (75864) example: Sample:341, Value:0 +I (75864) example: Sample:342, Value:0 +I (75864) example: Sample:343, Value:0 +I (75864) example: Sample:344, Value:0 +I (75864) example: Sample:345, Value:0 +I (75864) example: Sample:346, Value:0 +I (75864) example: Sample:347, Value:0 +I (75864) example: Sample:348, Value:0 +I (75864) example: Sample:349, Value:0 +I (75864) example: Sample:350, Value:0 +I (75864) example: Sample:351, Value:0 +I (75864) example: Sample:352, Value:0 +I (75864) example: Sample:353, Value:0 +I (77894) example: Sample:1, Value:0 +I (77894) example: Sample:2, Value:0 +I (77894) example: Sample:3, Value:0 +I (77894) example: Sample:4, Value:0 +I (77894) example: Sample:5, Value:0 +I (77894) example: Sample:6, Value:0 +I (77894) example: Sample:7, Value:0 +I (77894) example: Sample:8, Value:0 +I (77894) example: Sample:9, Value:0 +I (77894) example: Sample:10, Value:0 +I (77894) example: Sample:11, Value:0 +I (77894) example: Sample:12, Value:0 +I (77894) example: Sample:13, Value:0 +I (77894) example: Sample:14, Value:0 +I (77894) example: Sample:15, Value:0 +I (77894) example: Sample:16, Value:0 +I (77894) example: Sample:17, Value:0 +I (77894) example: Sample:18, Value:0 +I (77894) example: Sample:19, Value:0 +I (77894) example: Sample:20, Value:0 +I (77894) example: Sample:21, Value:0 +I (77894) example: Sample:22, Value:0 +I (77894) example: Sample:23, Value:0 +I (77894) example: Sample:24, Value:0 +I (77894) example: Sample:25, Value:0 +I (77894) example: Sample:26, Value:0 +I (77894) example: Sample:27, Value:0 +I (77894) example: Sample:28, Value:0 +I (77894) example: Sample:29, Value:0 +I (77894) example: Sample:30, Value:0 +I (77894) example: Sample:31, Value:0 +I (77894) example: Sample:32, Value:0 +I (77894) example: Sample:33, Value:0 +I (77894) example: Sample:34, Value:0 +I (77894) example: Sample:35, Value:0 +I (77894) example: Sample:36, Value:0 +I (77894) example: Sample:37, Value:0 +I (77894) example: Sample:38, Value:0 +I (77894) example: Sample:39, Value:0 +I (77894) example: Sample:40, Value:0 +I (77894) example: Sample:41, Value:0 +I (77894) example: Sample:42, Value:0 +I (77894) example: Sample:43, Value:0 +I (77894) example: Sample:44, Value:0 +I (77894) example: Sample:45, Value:0 +I (77894) example: Sample:46, Value:0 +I (77894) example: Sample:47, Value:0 +I (77894) example: Sample:48, Value:0 +I (77894) example: Sample:49, Value:0 +I (77894) example: Sample:50, Value:0 +I (77894) example: Sample:51, Value:0 +I (77894) example: Sample:52, Value:0 +I (77894) example: Sample:53, Value:0 +I (77894) example: Sample:54, Value:0 +I (77894) example: Sample:55, Value:0 +I (77894) example: Sample:56, Value:0 +I (77894) example: Sample:57, Value:0 +I (77894) example: Sample:58, Value:0 +I (77894) example: Sample:59, Value:0 +I (77894) example: Sample:60, Value:0 +I (77894) example: Sample:61, Value:0 +I (77894) example: Sample:62, Value:0 +I (77894) example: Sample:63, Value:0 +I (77894) example: Sample:64, Value:0 +I (77894) example: Sample:65, Value:0 +I (77894) example: Sample:66, Value:0 +I (77894) example: Sample:67, Value:0 +I (77894) example: Sample:68, Value:0 +I (77894) example: Sample:69, Value:0 +I (77894) example: Sample:70, Value:0 +I (77894) example: Sample:71, Value:0 +I (77894) example: Sample:72, Value:0 +I (77894) example: Sample:73, Value:0 +I (77894) example: Sample:74, Value:0 +I (77894) example: Sample:75, Value:0 + +==================================================================== + +Log records count: 428 diff --git a/tools/esp_app_trace/test/logtrace/test.elf b/tools/esp_app_trace/test/logtrace/test.elf new file mode 100644 index 0000000000..5e88b2550b Binary files /dev/null and b/tools/esp_app_trace/test/logtrace/test.elf differ diff --git a/tools/esp_app_trace/test/logtrace/test.sh b/tools/esp_app_trace/test/logtrace/test.sh new file mode 100755 index 0000000000..35ba45405a --- /dev/null +++ b/tools/esp_app_trace/test/logtrace/test.sh @@ -0,0 +1,8 @@ +#! /bin/bash + +{ coverage debug sys \ + && coverage erase &> output \ + && coverage run -a $IDF_PATH/tools/esp_app_trace/logtrace_proc.py adc_log.trc test.elf &>> output \ + && diff output expected_output \ + && coverage report \ +; } || { echo 'The test for logtrace_proc has failed. Please examine the artifacts.' ; exit 1; } diff --git a/tools/esp_app_trace/test/sysview/blink.c b/tools/esp_app_trace/test/sysview/blink.c new file mode 100644 index 0000000000..ecbdf64499 --- /dev/null +++ b/tools/esp_app_trace/test/sysview/blink.c @@ -0,0 +1,88 @@ +/* Blink Example + + This example code is in the Public Domain (or CC0 licensed, at your option.) + + Unless required by applicable law or agreed to in writing, this + software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + CONDITIONS OF ANY KIND, either express or implied. +*/ +#include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "driver/gpio.h" +#include "sdkconfig.h" +#include "esp_heap_trace.h" + +/* Can run 'make menuconfig' to choose the GPIO to blink, + or you can edit the following line and set a number here. +*/ +#define BLINK_GPIO CONFIG_BLINK_GPIO + +void blink_task2(void *pvParameter) +{ + TaskHandle_t task = (TaskHandle_t)pvParameter; + + while(1) { + if (xTaskNotifyWait(0, 0, NULL, portMAX_DELAY) != pdPASS) { + printf("Failed to wait for main task!\n"); + return; + } + void *a = malloc(65); + printf("Alloced 65 bytes @ %p\n", a); + void *b = malloc(97); + printf("Alloced 97 bytes @ %p\n", b); + free(a); + printf("Freed @ %p\n", a); + b = malloc(11); + printf("Alloced 11 bytes @ %p\n", b); + b = malloc(24); + printf("Alloced 24 bytes @ %p\n", b); + free(b); + printf("Freed @ %p\n", b); + if (xTaskNotify(task, 0, eNoAction) != pdPASS) { + printf("Failed to notify main task!\n"); + return; + } + } +} + +void blink_task(void *pvParameter) +{ + TaskHandle_t task = 0; + + if(heap_trace_init_tohost() != ESP_OK) { + printf("Failed to init heap trace!\n"); + return; + } + xTaskCreatePinnedToCore(&blink_task2, "blink_task2", 2048, xTaskGetCurrentTaskHandle(), 5, &task, 1); + + while(1) { + heap_trace_start(HEAP_TRACE_ALL); + if (xTaskNotify(task, 0, eNoAction) != pdPASS) { + printf("Failed to notify slave task!\n"); + return; + } + void *a = malloc(64); + printf("Alloced 64 bytes @ %p\n", a); + void *b = malloc(96); + printf("Alloced 96 bytes @ %p\n", b); + free(a); + printf("Freed @ %p\n", a); + b = malloc(10); + printf("Alloced 10 bytes @ %p\n", b); + b = malloc(23); + printf("Alloced 23 bytes @ %p\n", b); + free(b); + printf("Freed @ %p\n", b); + if (xTaskNotifyWait(0, 0, NULL, portMAX_DELAY) != pdPASS) { + printf("Failed to wait for slave task!\n"); + return; + } + heap_trace_stop(); + } +} + +void app_main() +{ + xTaskCreatePinnedToCore(&blink_task, "blink_task", 2048, NULL, 5, NULL, 0); +} diff --git a/tools/esp_app_trace/test/sysview/cpu0.svdat b/tools/esp_app_trace/test/sysview/cpu0.svdat new file mode 100644 index 0000000000..501b9729dc Binary files /dev/null and b/tools/esp_app_trace/test/sysview/cpu0.svdat differ diff --git a/tools/esp_app_trace/test/sysview/cpu1.svdat b/tools/esp_app_trace/test/sysview/cpu1.svdat new file mode 100644 index 0000000000..d339cd190d Binary files /dev/null and b/tools/esp_app_trace/test/sysview/cpu1.svdat differ diff --git a/tools/esp_app_trace/test/sysview/expected_output b/tools/esp_app_trace/test/sysview/expected_output new file mode 100644 index 0000000000..e55aee1fdd --- /dev/null +++ b/tools/esp_app_trace/test/sysview/expected_output @@ -0,0 +1,450 @@ +Parse trace from 'cpu0.svdat'... +Stop parsing trace. (Timeout 0.000000 sec while reading 1 bytes!) +Parse trace from 'cpu1.svdat'... +Stop parsing trace. (Timeout 0.000000 sec while reading 1 bytes!) +Process events from '['cpu0.svdat', 'cpu1.svdat']'... +EVENT[0]: 0.000000000 - core[0].svTraceStart(10), plen 0: [] +EVENT[1]: 0.000000000 - core[1].svTraceStart(10), plen 0: [] +EVENT[2]: 0.000010950 - core[0].svInit(24), plen 14: [sys_freq: 40000000, cpu_freq: 160000000, ram_base: 1061158912, id_shift: 0] +EVENT[3]: 0.000010950 - core[1].svInit(24), plen 14: [sys_freq: 40000000, cpu_freq: 160000000, ram_base: 1061158912, id_shift: 0] +EVENT[4]: 0.000024800 - core[0].svSysDesc(14), plen 0: [desc: N=FreeRTOS Application,D=ESP32,C=Xtensa,O=FreeRTOS] +EVENT[5]: 0.000024800 - core[1].svSysDesc(14), plen 0: [desc: N=FreeRTOS Application,D=ESP32,C=Xtensa,O=FreeRTOS] +EVENT[6]: 0.000051650 - core[0].svSysDesc(14), plen 0: [desc: I#5=SysTick] +EVENT[7]: 0.000051650 - core[1].svSysDesc(14), plen 0: [desc: I#5=SysTick] +EVENT[8]: 0.000104150 - core[0].svSysDesc(14), plen 0: [desc: I#6=WIFI_MAC] +EVENT[9]: 0.000104150 - core[1].svSysDesc(14), plen 0: [desc: I#6=WIFI_MAC] +EVENT[10]: 0.000121100 - core[0].svSysDesc(14), plen 0: [desc: I#7=WIFI_NMI] +EVENT[11]: 0.000121100 - core[1].svSysDesc(14), plen 0: [desc: I#7=WIFI_NMI] +EVENT[12]: 0.000138125 - core[0].svSysDesc(14), plen 0: [desc: I#8=WIFI_BB] +EVENT[13]: 0.000138125 - core[1].svSysDesc(14), plen 0: [desc: I#8=WIFI_BB] +EVENT[14]: 0.000154825 - core[0].svSysDesc(14), plen 0: [desc: I#9=BT_MAC] +EVENT[15]: 0.000154825 - core[1].svSysDesc(14), plen 0: [desc: I#9=BT_MAC] +EVENT[16]: 0.000193350 - core[0].svSysDesc(14), plen 0: [desc: I#10=BT_BB] +EVENT[17]: 0.000193350 - core[1].svSysDesc(14), plen 0: [desc: I#10=BT_BB] +EVENT[18]: 0.000212875 - core[0].svSysDesc(14), plen 0: [desc: I#11=BT_BB_NMI] +EVENT[19]: 0.000212875 - core[1].svSysDesc(14), plen 0: [desc: I#11=BT_BB_NMI] +EVENT[20]: 0.000231625 - core[0].svSysDesc(14), plen 0: [desc: I#12=RWBT] +EVENT[21]: 0.000231625 - core[1].svSysDesc(14), plen 0: [desc: I#12=RWBT] +EVENT[22]: 0.000250250 - core[0].svSysDesc(14), plen 0: [desc: I#13=RWBLE] +EVENT[23]: 0.000250250 - core[1].svSysDesc(14), plen 0: [desc: I#13=RWBLE] +EVENT[24]: 0.000269450 - core[0].svSysDesc(14), plen 0: [desc: I#14=RWBT_NMI] +EVENT[25]: 0.000269450 - core[1].svSysDesc(14), plen 0: [desc: I#14=RWBT_NMI] +EVENT[26]: 0.000288925 - core[0].svSysDesc(14), plen 0: [desc: I#15=RWBLE_NMI] +EVENT[27]: 0.000288925 - core[1].svSysDesc(14), plen 0: [desc: I#15=RWBLE_NMI] +EVENT[28]: 0.000310575 - core[0].svSysDesc(14), plen 0: [desc: I#16=SLC0] +EVENT[29]: 0.000310575 - core[1].svSysDesc(14), plen 0: [desc: I#16=SLC0] +EVENT[30]: 0.000329150 - core[0].svSysDesc(14), plen 0: [desc: I#17=SLC1] +EVENT[31]: 0.000329150 - core[1].svSysDesc(14), plen 0: [desc: I#17=SLC1] +EVENT[32]: 0.000347675 - core[0].svSysDesc(14), plen 0: [desc: I#18=UHCI0] +EVENT[33]: 0.000347675 - core[1].svSysDesc(14), plen 0: [desc: I#18=UHCI0] +EVENT[34]: 0.000366225 - core[0].svSysDesc(14), plen 0: [desc: I#19=UHCI1] +EVENT[35]: 0.000366225 - core[1].svSysDesc(14), plen 0: [desc: I#19=UHCI1] +EVENT[36]: 0.000386350 - core[0].svSysDesc(14), plen 0: [desc: I#20=TG0_T0_LEVEL] +EVENT[37]: 0.000386350 - core[1].svSysDesc(14), plen 0: [desc: I#20=TG0_T0_LEVEL] +EVENT[38]: 0.000406575 - core[0].svSysDesc(14), plen 0: [desc: I#21=TG0_T1_LEVEL] +EVENT[39]: 0.000406575 - core[1].svSysDesc(14), plen 0: [desc: I#21=TG0_T1_LEVEL] +EVENT[40]: 0.000427300 - core[0].svSysDesc(14), plen 0: [desc: I#22=TG0_WDT_LEVEL] +EVENT[41]: 0.000427300 - core[1].svSysDesc(14), plen 0: [desc: I#22=TG0_WDT_LEVEL] +EVENT[42]: 0.000448000 - core[0].svSysDesc(14), plen 0: [desc: I#23=TG0_LACT_LEVEL] +EVENT[43]: 0.000448000 - core[1].svSysDesc(14), plen 0: [desc: I#23=TG0_LACT_LEVEL] +EVENT[44]: 0.000468250 - core[0].svSysDesc(14), plen 0: [desc: I#24=TG1_T0_LEVEL] +EVENT[45]: 0.000468250 - core[1].svSysDesc(14), plen 0: [desc: I#24=TG1_T0_LEVEL] +EVENT[46]: 0.000488500 - core[0].svSysDesc(14), plen 0: [desc: I#25=TG1_T1_LEVEL] +EVENT[47]: 0.000488500 - core[1].svSysDesc(14), plen 0: [desc: I#25=TG1_T1_LEVEL] +EVENT[48]: 0.000508975 - core[0].svSysDesc(14), plen 0: [desc: I#26=TG1_WDT_LEVEL] +EVENT[49]: 0.000508975 - core[1].svSysDesc(14), plen 0: [desc: I#26=TG1_WDT_LEVEL] +EVENT[50]: 0.000529850 - core[0].svSysDesc(14), plen 0: [desc: I#27=TG1_LACT_LEVEL] +EVENT[51]: 0.000529850 - core[1].svSysDesc(14), plen 0: [desc: I#27=TG1_LACT_LEVEL] +EVENT[52]: 0.000548375 - core[0].svSysDesc(14), plen 0: [desc: I#28=GPIO] +EVENT[53]: 0.000548375 - core[1].svSysDesc(14), plen 0: [desc: I#28=GPIO] +EVENT[54]: 0.000570825 - core[0].svSysDesc(14), plen 0: [desc: I#29=GPIO_NMI] +EVENT[55]: 0.000570825 - core[1].svSysDesc(14), plen 0: [desc: I#29=GPIO_NMI] +EVENT[56]: 0.000590425 - core[0].svSysDesc(14), plen 0: [desc: I#30=FROM_CPU0] +EVENT[57]: 0.000590425 - core[1].svSysDesc(14), plen 0: [desc: I#30=FROM_CPU0] +EVENT[58]: 0.000610000 - core[0].svSysDesc(14), plen 0: [desc: I#31=FROM_CPU1] +EVENT[59]: 0.000610000 - core[1].svSysDesc(14), plen 0: [desc: I#31=FROM_CPU1] +EVENT[60]: 0.000629625 - core[0].svSysDesc(14), plen 0: [desc: I#32=FROM_CPU2] +EVENT[61]: 0.000629625 - core[1].svSysDesc(14), plen 0: [desc: I#32=FROM_CPU2] +EVENT[62]: 0.000649425 - core[0].svSysDesc(14), plen 0: [desc: I#33=FROM_CPU3] +EVENT[63]: 0.000649425 - core[1].svSysDesc(14), plen 0: [desc: I#33=FROM_CPU3] +EVENT[64]: 0.000667975 - core[0].svSysDesc(14), plen 0: [desc: I#34=SPI0] +EVENT[65]: 0.000667975 - core[1].svSysDesc(14), plen 0: [desc: I#34=SPI0] +EVENT[66]: 0.000686500 - core[0].svSysDesc(14), plen 0: [desc: I#35=SPI1] +EVENT[67]: 0.000686500 - core[1].svSysDesc(14), plen 0: [desc: I#35=SPI1] +EVENT[68]: 0.000704825 - core[0].svSysDesc(14), plen 0: [desc: I#36=SPI2] +EVENT[69]: 0.000704825 - core[1].svSysDesc(14), plen 0: [desc: I#36=SPI2] +EVENT[70]: 0.000723100 - core[0].svSysDesc(14), plen 0: [desc: I#37=SPI3] +EVENT[71]: 0.000723100 - core[1].svSysDesc(14), plen 0: [desc: I#37=SPI3] +EVENT[72]: 0.000741550 - core[0].svSysDesc(14), plen 0: [desc: I#38=I2S0] +EVENT[73]: 0.000741550 - core[1].svSysDesc(14), plen 0: [desc: I#38=I2S0] +EVENT[74]: 0.000760000 - core[0].svSysDesc(14), plen 0: [desc: I#39=I2S1] +EVENT[75]: 0.000760000 - core[1].svSysDesc(14), plen 0: [desc: I#39=I2S1] +EVENT[76]: 0.000778475 - core[0].svSysDesc(14), plen 0: [desc: I#40=UART0] +EVENT[77]: 0.000778475 - core[1].svSysDesc(14), plen 0: [desc: I#40=UART0] +EVENT[78]: 0.000797050 - core[0].svSysDesc(14), plen 0: [desc: I#41=UART1] +EVENT[79]: 0.000797050 - core[1].svSysDesc(14), plen 0: [desc: I#41=UART1] +EVENT[80]: 0.000815625 - core[0].svSysDesc(14), plen 0: [desc: I#42=UART2] +EVENT[81]: 0.000815625 - core[1].svSysDesc(14), plen 0: [desc: I#42=UART2] +EVENT[82]: 0.000835000 - core[0].svSysDesc(14), plen 0: [desc: I#43=SDIO_HOST] +EVENT[83]: 0.000835000 - core[1].svSysDesc(14), plen 0: [desc: I#43=SDIO_HOST] +EVENT[84]: 0.000854075 - core[0].svSysDesc(14), plen 0: [desc: I#44=ETH_MAC] +EVENT[85]: 0.000854075 - core[1].svSysDesc(14), plen 0: [desc: I#44=ETH_MAC] +EVENT[86]: 0.000875600 - core[0].svSysDesc(14), plen 0: [desc: I#45=PWM0] +EVENT[87]: 0.000875600 - core[1].svSysDesc(14), plen 0: [desc: I#45=PWM0] +EVENT[88]: 0.000893850 - core[0].svSysDesc(14), plen 0: [desc: I#46=PWM1] +EVENT[89]: 0.000893850 - core[1].svSysDesc(14), plen 0: [desc: I#46=PWM1] +EVENT[90]: 0.000912375 - core[0].svSysDesc(14), plen 0: [desc: I#47=PWM2] +EVENT[91]: 0.000912375 - core[1].svSysDesc(14), plen 0: [desc: I#47=PWM2] +EVENT[92]: 0.000930950 - core[0].svSysDesc(14), plen 0: [desc: I#48=PWM3] +EVENT[93]: 0.000930950 - core[1].svSysDesc(14), plen 0: [desc: I#48=PWM3] +EVENT[94]: 0.000949375 - core[0].svSysDesc(14), plen 0: [desc: I#49=LEDC] +EVENT[95]: 0.000949375 - core[1].svSysDesc(14), plen 0: [desc: I#49=LEDC] +EVENT[96]: 0.000968075 - core[0].svSysDesc(14), plen 0: [desc: I#50=EFUSE] +EVENT[97]: 0.000968075 - core[1].svSysDesc(14), plen 0: [desc: I#50=EFUSE] +EVENT[98]: 0.000986275 - core[0].svSysDesc(14), plen 0: [desc: I#51=CAN] +EVENT[99]: 0.000986275 - core[1].svSysDesc(14), plen 0: [desc: I#51=CAN] +EVENT[100]: 0.001005625 - core[0].svSysDesc(14), plen 0: [desc: I#52=RTC_CORE] +EVENT[101]: 0.001005625 - core[1].svSysDesc(14), plen 0: [desc: I#52=RTC_CORE] +EVENT[102]: 0.001023700 - core[0].svSysDesc(14), plen 0: [desc: I#53=RMT] +EVENT[103]: 0.001023700 - core[1].svSysDesc(14), plen 0: [desc: I#53=RMT] +EVENT[104]: 0.001042050 - core[0].svSysDesc(14), plen 0: [desc: I#54=PCNT] +EVENT[105]: 0.001042050 - core[1].svSysDesc(14), plen 0: [desc: I#54=PCNT] +EVENT[106]: 0.001061500 - core[0].svSysDesc(14), plen 0: [desc: I#55=I2C_EXT0] +EVENT[107]: 0.001061500 - core[1].svSysDesc(14), plen 0: [desc: I#55=I2C_EXT0] +EVENT[108]: 0.001081100 - core[0].svSysDesc(14), plen 0: [desc: I#56=I2C_EXT1] +EVENT[109]: 0.001081100 - core[1].svSysDesc(14), plen 0: [desc: I#56=I2C_EXT1] +EVENT[110]: 0.001099425 - core[0].svSysDesc(14), plen 0: [desc: I#57=RSA] +EVENT[111]: 0.001099425 - core[1].svSysDesc(14), plen 0: [desc: I#57=RSA] +EVENT[112]: 0.001118625 - core[0].svSysDesc(14), plen 0: [desc: I#58=SPI1_DMA] +EVENT[113]: 0.001118625 - core[1].svSysDesc(14), plen 0: [desc: I#58=SPI1_DMA] +EVENT[114]: 0.001137775 - core[0].svSysDesc(14), plen 0: [desc: I#59=SPI2_DMA] +EVENT[115]: 0.001137775 - core[1].svSysDesc(14), plen 0: [desc: I#59=SPI2_DMA] +EVENT[116]: 0.001156950 - core[0].svSysDesc(14), plen 0: [desc: I#60=SPI3_DMA] +EVENT[117]: 0.001156950 - core[1].svSysDesc(14), plen 0: [desc: I#60=SPI3_DMA] +EVENT[118]: 0.001175175 - core[0].svSysDesc(14), plen 0: [desc: I#61=WDT] +EVENT[119]: 0.001175175 - core[1].svSysDesc(14), plen 0: [desc: I#61=WDT] +EVENT[120]: 0.001197300 - core[0].svSysDesc(14), plen 0: [desc: I#62=TIMER1] +EVENT[121]: 0.001197300 - core[1].svSysDesc(14), plen 0: [desc: I#62=TIMER1] +EVENT[122]: 0.001216250 - core[0].svSysDesc(14), plen 0: [desc: I#63=TIMER2] +EVENT[123]: 0.001216250 - core[1].svSysDesc(14), plen 0: [desc: I#63=TIMER2] +EVENT[124]: 0.001236175 - core[0].svSysDesc(14), plen 0: [desc: I#64=TG0_T0_EDGE] +EVENT[125]: 0.001236175 - core[1].svSysDesc(14), plen 0: [desc: I#64=TG0_T0_EDGE] +EVENT[126]: 0.001256275 - core[0].svSysDesc(14), plen 0: [desc: I#65=TG0_T1_EDGE] +EVENT[127]: 0.001256275 - core[1].svSysDesc(14), plen 0: [desc: I#65=TG0_T1_EDGE] +EVENT[128]: 0.001276675 - core[0].svSysDesc(14), plen 0: [desc: I#66=TG0_WDT_EDGE] +EVENT[129]: 0.001276675 - core[1].svSysDesc(14), plen 0: [desc: I#66=TG0_WDT_EDGE] +EVENT[130]: 0.001297375 - core[0].svSysDesc(14), plen 0: [desc: I#67=TG0_LACT_EDGE] +EVENT[131]: 0.001297375 - core[1].svSysDesc(14), plen 0: [desc: I#67=TG0_LACT_EDGE] +EVENT[132]: 0.001317425 - core[0].svSysDesc(14), plen 0: [desc: I#68=TG1_T0_EDGE] +EVENT[133]: 0.001317425 - core[1].svSysDesc(14), plen 0: [desc: I#68=TG1_T0_EDGE] +EVENT[134]: 0.001337650 - core[0].svSysDesc(14), plen 0: [desc: I#69=TG1_T1_EDGE] +EVENT[135]: 0.001337650 - core[1].svSysDesc(14), plen 0: [desc: I#69=TG1_T1_EDGE] +EVENT[136]: 0.001357950 - core[0].svSysDesc(14), plen 0: [desc: I#70=TG1_WDT_EDGE] +EVENT[137]: 0.001357950 - core[1].svSysDesc(14), plen 0: [desc: I#70=TG1_WDT_EDGE] +EVENT[138]: 0.001378625 - core[0].svSysDesc(14), plen 0: [desc: I#71=TG1_LACT_EDGE] +EVENT[139]: 0.001378625 - core[1].svSysDesc(14), plen 0: [desc: I#71=TG1_LACT_EDGE] +EVENT[140]: 0.001397500 - core[0].svSysDesc(14), plen 0: [desc: I#72=MMU_IA] +EVENT[141]: 0.001397500 - core[1].svSysDesc(14), plen 0: [desc: I#72=MMU_IA] +EVENT[142]: 0.001416425 - core[0].svSysDesc(14), plen 0: [desc: I#73=MPU_IA] +EVENT[143]: 0.001416425 - core[1].svSysDesc(14), plen 0: [desc: I#73=MPU_IA] +EVENT[144]: 0.001435550 - core[0].svSysDesc(14), plen 0: [desc: I#74=CACHE_IA] +EVENT[145]: 0.001435550 - core[1].svSysDesc(14), plen 0: [desc: I#74=CACHE_IA] +EVENT[146]: 0.001441950 - core[0].svSysTimeUs(13), plen 0: [time: 10000] +EVENT[147]: 0.001441950 - core[1].svSysTimeUs(13), plen 0: [time: 10000] +EVENT[148]: 0.001647400 - core[0].svTaskInfo(9), plen 0: [tid: 12253880, prio: 22, name: esp_timer] +EVENT[149]: 0.001647400 - core[1].svTaskInfo(9), plen 0: [tid: 12253880, prio: 22, name: esp_timer] +EVENT[150]: 0.001652000 - core[0].svStackInfo(21), plen 0: [tid: 12253880, base: 1073408692, sz: 3436, unused: 0] +EVENT[151]: 0.001652000 - core[1].svStackInfo(21), plen 0: [tid: 12253880, base: 1073408692, sz: 3436, unused: 0] +EVENT[152]: 0.001738550 - core[0].svTaskInfo(9), plen 0: [tid: 12254636, prio: 24, name: ipc0] +EVENT[153]: 0.001738550 - core[1].svTaskInfo(9), plen 0: [tid: 12254636, prio: 24, name: ipc0] +EVENT[154]: 0.001742750 - core[0].svStackInfo(21), plen 0: [tid: 12254636, base: 1073430180, sz: 1388, unused: 0] +EVENT[155]: 0.001742750 - core[1].svStackInfo(21), plen 0: [tid: 12254636, base: 1073430180, sz: 1388, unused: 0] +EVENT[156]: 0.001828975 - core[0].svTaskInfo(9), plen 0: [tid: 12275372, prio: 24, name: ipc1] +EVENT[157]: 0.001828975 - core[1].svTaskInfo(9), plen 0: [tid: 12275372, prio: 24, name: ipc1] +EVENT[158]: 0.001833225 - core[0].svStackInfo(21), plen 0: [tid: 12275372, base: 1073432232, sz: 1384, unused: 0] +EVENT[159]: 0.001833225 - core[1].svStackInfo(21), plen 0: [tid: 12275372, base: 1073432232, sz: 1384, unused: 0] +EVENT[160]: 0.001871225 - core[0].svTaskInfo(9), plen 0: [tid: 12291908, prio: 5, name: blink_task] +EVENT[161]: 0.001871225 - core[1].svTaskInfo(9), plen 0: [tid: 12291908, prio: 5, name: blink_task] +EVENT[162]: 0.001875650 - core[0].svStackInfo(21), plen 0: [tid: 12291908, base: 1073448452, sz: 524, unused: 0] +EVENT[163]: 0.001875650 - core[1].svStackInfo(21), plen 0: [tid: 12291908, base: 1073448452, sz: 524, unused: 0] +EVENT[164]: 0.002070800 - core[0].svTaskInfo(9), plen 0: [tid: 12282660, prio: 1, name: main] +EVENT[165]: 0.002070800 - core[1].svTaskInfo(9), plen 0: [tid: 12282660, prio: 1, name: main] +EVENT[166]: 0.002075200 - core[0].svStackInfo(21), plen 0: [tid: 12282660, base: 1073437472, sz: 3296, unused: 0] +EVENT[167]: 0.002075200 - core[1].svStackInfo(21), plen 0: [tid: 12282660, base: 1073437472, sz: 3296, unused: 0] +EVENT[168]: 0.002153375 - core[0].svTaskInfo(9), plen 0: [tid: 12284560, prio: 0, name: IDLE0] +EVENT[169]: 0.002153375 - core[1].svTaskInfo(9), plen 0: [tid: 12284560, prio: 0, name: IDLE0] +EVENT[170]: 0.002157850 - core[0].svStackInfo(21), plen 0: [tid: 12284560, base: 1073441932, sz: 1236, unused: 0] +EVENT[171]: 0.002157850 - core[1].svStackInfo(21), plen 0: [tid: 12284560, base: 1073441932, sz: 1236, unused: 0] +EVENT[172]: 0.002228950 - core[0].svTaskInfo(9), plen 0: [tid: 12286460, prio: 0, name: IDLE1] +EVENT[173]: 0.002228950 - core[1].svTaskInfo(9), plen 0: [tid: 12286460, prio: 0, name: IDLE1] +EVENT[174]: 0.002233250 - core[0].svStackInfo(21), plen 0: [tid: 12286460, base: 1073443832, sz: 1112, unused: 0] +EVENT[175]: 0.002233250 - core[1].svStackInfo(21), plen 0: [tid: 12286460, base: 1073443832, sz: 1112, unused: 0] +EVENT[176]: 0.002319675 - core[0].svTaskInfo(9), plen 0: [tid: 12289116, prio: 1, name: Tmr Svc] +EVENT[177]: 0.002319675 - core[1].svTaskInfo(9), plen 0: [tid: 12289116, prio: 1, name: Tmr Svc] +EVENT[178]: 0.002324100 - core[0].svStackInfo(21), plen 0: [tid: 12289116, base: 1073445976, sz: 1384, unused: 0] +EVENT[179]: 0.002324100 - core[1].svStackInfo(21), plen 0: [tid: 12289116, base: 1073445976, sz: 1384, unused: 0] +EVENT[180]: 0.002431200 - core[0].svTaskInfo(9), plen 0: [tid: 12294320, prio: 5, name: blink_task2] +EVENT[181]: 0.002431200 - core[1].svTaskInfo(9), plen 0: [tid: 12294320, prio: 5, name: blink_task2] +EVENT[182]: 0.002438750 - core[0].svStackInfo(21), plen 0: [tid: 12294320, base: 1073451180, sz: 1748, unused: 0] +EVENT[183]: 0.002438750 - core[1].svStackInfo(21), plen 0: [tid: 12294320, base: 1073451180, sz: 1748, unused: 0] +EVENT[184]: 0.002446150 - core[0].svNumModules(27), plen 1: [mod_cnt: 0] +EVENT[185]: 0.002446150 - core[1].svNumModules(27), plen 1: [mod_cnt: 0] +EVENT[186]: 0.002484225 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[187]: 0.002496125 - core[0].svTaskStopReady(7), plen 0: [tid: 12291908, cause: 4] +EVENT[188]: 0.002508025 - core[1].svTaskStartExec(4), plen 0: [tid: 12294320] +EVENT[189]: 0.002516350 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[190]: 0.002524325 - core[1].svTaskStopReady(7), plen 0: [tid: 12294320, cause: 27] +EVENT[191]: 0.002532350 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[192]: 0.002541200 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[193]: 0.002548475 - core[0].svTaskStartExec(4), plen 0: [tid: 12282660] +EVENT[194]: 0.002556375 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[195]: 0.002564450 - core[0].vTaskDelete(33), plen 4: [xTaskToDelete: 12282660] +EVENT[196]: 0.002577700 - core[1].svIdle(17), plen 0: [] +EVENT[197]: 0.002585225 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[198]: 0.002592950 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[199]: 0.002605950 - core[0].svIdle(17), plen 0: [] +EVENT[200]: 0.008819550 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[201]: 0.008828075 - core[0].svTaskStartReady(6), plen 0: [tid: 12291908] +EVENT[202]: 0.008828075 - core[1].svTaskStartReady(6), plen 0: [tid: 12291908] +EVENT[203]: 0.008837475 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[204]: 0.008850450 - core[0].svTaskStartExec(4), plen 0: [tid: 12291908] +EVENT[205]: 0.008872650 - core[0].svModuleDesc(22), plen 0: [mod_id: 0, evt_off: 512, desc: ESP32 SystemView Heap Tracing Module] +EVENT[206]: 0.008872650 - core[1].svModuleDesc(22), plen 0: [mod_id: 0, evt_off: 512, desc: ESP32 SystemView Heap Tracing Module] +EVENT[207]: 0.008886175 - core[0].svTaskStartReady(6), plen 0: [tid: 12294320] +EVENT[208]: 0.008886175 - core[1].svTaskStartReady(6), plen 0: [tid: 12294320] +EVENT[209]: 0.008897425 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[210]: 0.008906150 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[211]: 0.008919900 - core[0].esp_sysview_heap_trace_alloc(512), plen 16: [addr: 1073450504, size: 64, callers: [1074601571, 1074296884]] +[0.008919900] HEAP: Allocated 64 bytes @ 0x3ffb8e08 from task "blink_task" on core 0 by: +/home/alexey/projects/esp/esp-idf/examples/get-started/blink/main/blink.c:65 +/home/alexey/projects/esp/esp-idf/components/freertos/port.c:355 (discriminator 1) + +EVENT[212]: 0.008928250 - core[1].svTaskStartExec(4), plen 0: [tid: 12294320] +EVENT[213]: 0.008957950 - core[0].esp_sysview_heap_trace_alloc(512), plen 16: [addr: 1073450572, size: 80, callers: [1074298654, 1074299267]] +[0.008957950] HEAP: Allocated 80 bytes @ 0x3ffb8e4c from task "blink_task" on core 0 by: +/home/alexey/projects/esp/esp-idf/components/freertos/queue.c:2037 +/home/alexey/projects/esp/esp-idf/components/freertos/queue.c:2037 + +EVENT[214]: 0.008967250 - core[0].xQueueGenericCreate(47), plen 3: [uxQueueLength: 1, uxItemSize: 0, ucQueueType: 4] +EVENT[215]: 0.008977300 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12291660, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[216]: 0.008984625 - core[1].esp_sysview_heap_trace_alloc(512), plen 16: [addr: 1073450656, size: 65, callers: [1074601382, 1074296884]] +[0.008984625] HEAP: Allocated 65 bytes @ 0x3ffb8ea0 from task "blink_task2" on core 1 by: +/home/alexey/projects/esp/esp-idf/examples/get-started/blink/main/blink.c:30 +/home/alexey/projects/esp/esp-idf/components/freertos/port.c:355 (discriminator 1) + +EVENT[217]: 0.008995725 - core[0].xQueueGenericReceive(49), plen 15: [xQueue: 12291660, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 0] +EVENT[218]: 0.009010075 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[219]: 0.009018025 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[220]: 0.009031900 - core[1].svTaskStartExec(4), plen 0: [tid: 12294320] +EVENT[221]: 0.009089600 - core[0].esp_sysview_heap_trace_alloc(512), plen 16: [addr: 1073434644, size: 80, callers: [1074298654, 1074299267]] +[0.009089600] HEAP: Allocated 80 bytes @ 0x3ffb5014 from task "blink_task" on core 0 by: +/home/alexey/projects/esp/esp-idf/components/freertos/queue.c:2037 +/home/alexey/projects/esp/esp-idf/components/freertos/queue.c:2037 + +EVENT[222]: 0.009098175 - core[1].svTaskStopReady(7), plen 0: [tid: 12294320, cause: 27] +EVENT[223]: 0.009106300 - core[0].xQueueGenericCreate(47), plen 3: [uxQueueLength: 1, uxItemSize: 0, ucQueueType: 4] +EVENT[224]: 0.009113825 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[225]: 0.009121600 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12275732, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[226]: 0.009129000 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[227]: 0.009137900 - core[0].xQueueGenericReceive(49), plen 15: [xQueue: 12275732, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 0] +EVENT[228]: 0.009145425 - core[1].svIdle(17), plen 0: [] +EVENT[229]: 0.009169600 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12275732, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[230]: 0.009185225 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12291660, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[231]: 0.009195125 - core[0].svTaskStartReady(6), plen 0: [tid: 12294320] +EVENT[232]: 0.009195125 - core[1].svTaskStartReady(6), plen 0: [tid: 12294320] +EVENT[233]: 0.009207000 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[234]: 0.009215575 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[235]: 0.009223275 - core[0].esp_sysview_heap_trace_alloc(512), plen 16: [addr: 1073434728, size: 96, callers: [1074601587, 1074296884]] +[0.009223275] HEAP: Allocated 96 bytes @ 0x3ffb5068 from task "blink_task" on core 0 by: +/home/alexey/projects/esp/esp-idf/examples/get-started/blink/main/blink.c:68 +/home/alexey/projects/esp/esp-idf/components/freertos/port.c:355 (discriminator 1) + +EVENT[236]: 0.009231050 - core[1].svTaskStartExec(4), plen 0: [tid: 12294320] +EVENT[237]: 0.009241875 - core[0].xQueueGenericReceive(49), plen 15: [xQueue: 12291660, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 0] +EVENT[238]: 0.009257225 - core[1].svTaskStopReady(7), plen 0: [tid: 12294320, cause: 27] +EVENT[239]: 0.009269200 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[240]: 0.009278275 - core[0].xQueueGenericReceive(49), plen 15: [xQueue: 12275732, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 0] +EVENT[241]: 0.009286275 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[242]: 0.009303450 - core[1].svIdle(17), plen 0: [] +EVENT[243]: 0.009310950 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12275732, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[244]: 0.009329625 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12291660, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[245]: 0.009339525 - core[0].svTaskStartReady(6), plen 0: [tid: 12294320] +EVENT[246]: 0.009339525 - core[1].svTaskStartReady(6), plen 0: [tid: 12294320] +EVENT[247]: 0.009351425 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[248]: 0.009359450 - core[0].esp_sysview_heap_trace_free(513), plen 15: [addr: 1073450504, callers: [1074601600, 1074296884]] +[0.009359450] HEAP: Freed bytes @ 0x3ffb8e08 from task "blink_task" on core 0 by: +/home/alexey/projects/esp/esp-idf/examples/get-started/blink/main/blink.c:70 +/home/alexey/projects/esp/esp-idf/components/freertos/port.c:355 (discriminator 1) + +EVENT[249]: 0.009367800 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[250]: 0.009378950 - core[0].xQueueGenericReceive(49), plen 15: [xQueue: 12291660, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 0] +EVENT[251]: 0.009387450 - core[1].svTaskStartExec(4), plen 0: [tid: 12294320] +EVENT[252]: 0.009402575 - core[1].svTaskStopReady(7), plen 0: [tid: 12294320, cause: 27] +EVENT[253]: 0.009414900 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[254]: 0.009423125 - core[0].xQueueGenericReceive(49), plen 15: [xQueue: 12275732, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 0] +EVENT[255]: 0.009430250 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[256]: 0.009445425 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12275732, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[257]: 0.009453075 - core[1].svIdle(17), plen 0: [] +EVENT[258]: 0.009469225 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12291660, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[259]: 0.009479025 - core[0].svTaskStartReady(6), plen 0: [tid: 12294320] +EVENT[260]: 0.009479025 - core[1].svTaskStartReady(6), plen 0: [tid: 12294320] +EVENT[261]: 0.009490950 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[262]: 0.009499475 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[263]: 0.009507600 - core[0].esp_sysview_heap_trace_alloc(512), plen 16: [addr: 1073450504, size: 10, callers: [1074601615, 1074296884]] +[0.009507600] HEAP: Allocated 10 bytes @ 0x3ffb8e08 from task "blink_task" on core 0 by: +/home/alexey/projects/esp/esp-idf/examples/get-started/blink/main/blink.c:72 +/home/alexey/projects/esp/esp-idf/components/freertos/port.c:355 (discriminator 1) + +EVENT[264]: 0.009515300 - core[1].svTaskStartExec(4), plen 0: [tid: 12294320] +EVENT[265]: 0.009526100 - core[0].xQueueGenericReceive(49), plen 15: [xQueue: 12291660, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 0] +EVENT[266]: 0.009541550 - core[1].svTaskStopReady(7), plen 0: [tid: 12294320, cause: 27] +EVENT[267]: 0.009553850 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[268]: 0.009561100 - core[0].xQueueGenericReceive(49), plen 15: [xQueue: 12275732, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 0] +EVENT[269]: 0.009568400 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[270]: 0.009585075 - core[1].svIdle(17), plen 0: [] +EVENT[271]: 0.009593375 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12275732, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[272]: 0.009609150 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12291660, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[273]: 0.009621875 - core[0].svTaskStartReady(6), plen 0: [tid: 12294320] +EVENT[274]: 0.009621875 - core[1].svTaskStartReady(6), plen 0: [tid: 12294320] +EVENT[275]: 0.009633775 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[276]: 0.009642300 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[277]: 0.009649475 - core[0].esp_sysview_heap_trace_alloc(512), plen 16: [addr: 1073450520, size: 23, callers: [1074601628, 1074296884]] +[0.009649475] HEAP: Allocated 23 bytes @ 0x3ffb8e18 from task "blink_task" on core 0 by: +/home/alexey/projects/esp/esp-idf/examples/get-started/blink/main/blink.c:73 +/home/alexey/projects/esp/esp-idf/components/freertos/port.c:355 (discriminator 1) + +EVENT[278]: 0.009657875 - core[1].svTaskStartExec(4), plen 0: [tid: 12294320] +EVENT[279]: 0.009666025 - core[0].xQueueGenericReceive(49), plen 15: [xQueue: 12291660, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 0] +EVENT[280]: 0.009681500 - core[1].svTaskStopReady(7), plen 0: [tid: 12294320, cause: 27] +EVENT[281]: 0.009693375 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[282]: 0.009702800 - core[0].xQueueGenericReceive(49), plen 15: [xQueue: 12275732, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 0] +EVENT[283]: 0.009710550 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[284]: 0.009726725 - core[1].svIdle(17), plen 0: [] +EVENT[285]: 0.010504825 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12275732, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[286]: 0.010520650 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12291660, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[287]: 0.010530550 - core[0].svTaskStartReady(6), plen 0: [tid: 12294320] +EVENT[288]: 0.010530550 - core[1].svTaskStartReady(6), plen 0: [tid: 12294320] +EVENT[289]: 0.010542400 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[290]: 0.010550025 - core[0].esp_sysview_heap_trace_free(513), plen 15: [addr: 1073450520, callers: [1074601643, 1074296884]] +[0.010550025] HEAP: Freed bytes @ 0x3ffb8e18 from task "blink_task" on core 0 by: +/home/alexey/projects/esp/esp-idf/examples/get-started/blink/main/blink.c:76 +/home/alexey/projects/esp/esp-idf/components/freertos/port.c:355 (discriminator 1) + +EVENT[291]: 0.010557450 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[292]: 0.010569700 - core[0].xQueueGenericReceive(49), plen 15: [xQueue: 12291660, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 0] +EVENT[293]: 0.010577700 - core[1].svTaskStartExec(4), plen 0: [tid: 12294320] +EVENT[294]: 0.010592825 - core[1].svTaskStopReady(7), plen 0: [tid: 12294320, cause: 27] +EVENT[295]: 0.010605950 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[296]: 0.010613575 - core[0].xQueueGenericReceive(49), plen 15: [xQueue: 12275732, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 0] +EVENT[297]: 0.010620900 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[298]: 0.010637050 - core[1].svIdle(17), plen 0: [] +EVENT[299]: 0.012240950 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12275732, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[300]: 0.012256775 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12291660, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[301]: 0.012266650 - core[0].svTaskStartReady(6), plen 0: [tid: 12294320] +EVENT[302]: 0.012266650 - core[1].svTaskStartReady(6), plen 0: [tid: 12294320] +EVENT[303]: 0.012281350 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[304]: 0.012289475 - core[0].svTaskStopReady(7), plen 0: [tid: 12291908, cause: 27] +EVENT[305]: 0.012297450 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[306]: 0.012306350 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[307]: 0.012312875 - core[1].svTaskStartExec(4), plen 0: [tid: 12294320] +EVENT[308]: 0.012320700 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[309]: 0.012328950 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12291660, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 0] +EVENT[310]: 0.012338100 - core[0].svIdle(17), plen 0: [] +EVENT[311]: 0.012640475 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12275732, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 0] +EVENT[312]: 0.014931850 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12275732, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[313]: 0.014963325 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12291660, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[314]: 0.014984150 - core[1].esp_sysview_heap_trace_alloc(512), plen 16: [addr: 1073434828, size: 97, callers: [1074601399, 1074296884]] +[0.014984150] HEAP: Allocated 97 bytes @ 0x3ffb50cc from task "blink_task2" on core 1 by: +/home/alexey/projects/esp/esp-idf/examples/get-started/blink/main/blink.c:33 +/home/alexey/projects/esp/esp-idf/components/freertos/port.c:355 (discriminator 1) + +EVENT[315]: 0.014997400 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12291660, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 0] +EVENT[316]: 0.015031050 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12275732, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 0] +EVENT[317]: 0.017622800 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12275732, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[318]: 0.017638675 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12291660, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[319]: 0.017656375 - core[1].esp_sysview_heap_trace_free(513), plen 15: [addr: 1073450656, callers: [1074601412, 1074296884]] +[0.017656375] HEAP: Freed bytes @ 0x3ffb8ea0 from task "blink_task2" on core 1 by: +/home/alexey/projects/esp/esp-idf/examples/get-started/blink/main/blink.c:35 +/home/alexey/projects/esp/esp-idf/components/freertos/port.c:355 (discriminator 1) + +EVENT[320]: 0.017674025 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12291660, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 0] +EVENT[321]: 0.017701700 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12275732, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 0] +EVENT[322]: 0.018819550 - core[0].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[323]: 0.018829625 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[324]: 0.018844750 - core[0].svIdle(17), plen 0: [] +EVENT[325]: 0.019010075 - core[1].svIsrEnter(2), plen 0: [irq_num: 5] +EVENT[326]: 0.019017950 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[327]: 0.019033200 - core[1].svTaskStartExec(4), plen 0: [tid: 12294320] +EVENT[328]: 0.019358925 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12275732, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[329]: 0.019374600 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12291660, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[330]: 0.019395425 - core[1].esp_sysview_heap_trace_alloc(512), plen 16: [addr: 1073450520, size: 11, callers: [1074601427, 1074296884]] +[0.019395425] HEAP: Allocated 11 bytes @ 0x3ffb8e18 from task "blink_task2" on core 1 by: +/home/alexey/projects/esp/esp-idf/examples/get-started/blink/main/blink.c:37 +/home/alexey/projects/esp/esp-idf/components/freertos/port.c:355 (discriminator 1) + +EVENT[331]: 0.019412600 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12291660, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 0] +EVENT[332]: 0.019446250 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12275732, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 0] +EVENT[333]: 0.022049900 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12275732, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[334]: 0.022065775 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12291660, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[335]: 0.022086625 - core[1].esp_sysview_heap_trace_alloc(512), plen 16: [addr: 1073450536, size: 24, callers: [1074601440, 1074296884]] +[0.022086625] HEAP: Allocated 24 bytes @ 0x3ffb8e28 from task "blink_task2" on core 1 by: +/home/alexey/projects/esp/esp-idf/examples/get-started/blink/main/blink.c:38 +/home/alexey/projects/esp/esp-idf/components/freertos/port.c:355 (discriminator 1) + +EVENT[336]: 0.022103925 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12291660, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 0] +EVENT[337]: 0.022137550 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12275732, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 0] +EVENT[338]: 0.024740850 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12275732, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[339]: 0.024756725 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12291660, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[340]: 0.024770475 - core[1].esp_sysview_heap_trace_free(513), plen 15: [addr: 1073450536, callers: [1074601455, 1074296884]] +[0.024770475] HEAP: Freed bytes @ 0x3ffb8e28 from task "blink_task2" on core 1 by: +/home/alexey/projects/esp/esp-idf/examples/get-started/blink/main/blink.c:41 +/home/alexey/projects/esp/esp-idf/components/freertos/port.c:355 (discriminator 1) + +EVENT[341]: 0.024791750 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12291660, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 0] +EVENT[342]: 0.024819500 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12275732, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 0] +EVENT[343]: 0.026476950 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12275732, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[344]: 0.026495700 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12291660, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0] +EVENT[345]: 0.026506975 - core[0].svTaskStartReady(6), plen 0: [tid: 12291908] +EVENT[346]: 0.026506975 - core[1].svTaskStartReady(6), plen 0: [tid: 12291908] +EVENT[347]: 0.026518525 - core[1].svTaskStopReady(7), plen 0: [tid: 12294320, cause: 27] +EVENT[348]: 0.026526625 - core[0].svIsrEnter(2), plen 0: [irq_num: 30] +EVENT[349]: 0.026535575 - core[0].svExitIsrToScheduler(18), plen 0: [] +EVENT[350]: 0.026544075 - core[1].svIsrEnter(2), plen 0: [irq_num: 31] +EVENT[351]: 0.026551650 - core[0].svTaskStartExec(4), plen 0: [tid: 12291908] +EVENT[352]: 0.026559500 - core[1].svExitIsrToScheduler(18), plen 0: [] +EVENT[353]: 0.148816725 - core[1].svIdle(17), plen 0: [] +EVENT[354]: 0.148825750 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 1] +EVENT[355]: 0.148833200 - core[0].svTaskStopReady(7), plen 0: [tid: 12291908, cause: 4] +EVENT[356]: 0.148839250 - core[0].svTraceStop(11), plen 0: [] +EVENT[357]: 0.148839250 - core[1].svTraceStop(11), plen 0: [] +Processing completed. +Processed 358 events +=============== LOG TRACE REPORT =============== +Processed 0 log messages. +=============== HEAP TRACE REPORT =============== +Processed 14 heap events. +[0.008957950] HEAP: Allocated 80 bytes @ 0x3ffb8e4c from task "blink_task" on core 0 by: +/home/alexey/projects/esp/esp-idf/components/freertos/queue.c:2037 +/home/alexey/projects/esp/esp-idf/components/freertos/queue.c:2037 + +[0.009089600] HEAP: Allocated 80 bytes @ 0x3ffb5014 from task "blink_task" on core 0 by: +/home/alexey/projects/esp/esp-idf/components/freertos/queue.c:2037 +/home/alexey/projects/esp/esp-idf/components/freertos/queue.c:2037 + +[0.009223275] HEAP: Allocated 96 bytes @ 0x3ffb5068 from task "blink_task" on core 0 by: +/home/alexey/projects/esp/esp-idf/examples/get-started/blink/main/blink.c:68 +/home/alexey/projects/esp/esp-idf/components/freertos/port.c:355 (discriminator 1) + +[0.009507600] HEAP: Allocated 10 bytes @ 0x3ffb8e08 from task "blink_task" on core 0 by: +/home/alexey/projects/esp/esp-idf/examples/get-started/blink/main/blink.c:72 +/home/alexey/projects/esp/esp-idf/components/freertos/port.c:355 (discriminator 1) + +[0.014984150] HEAP: Allocated 97 bytes @ 0x3ffb50cc from task "blink_task2" on core 1 by: +/home/alexey/projects/esp/esp-idf/examples/get-started/blink/main/blink.c:33 +/home/alexey/projects/esp/esp-idf/components/freertos/port.c:355 (discriminator 1) + +[0.019395425] HEAP: Allocated 11 bytes @ 0x3ffb8e18 from task "blink_task2" on core 1 by: +/home/alexey/projects/esp/esp-idf/examples/get-started/blink/main/blink.c:37 +/home/alexey/projects/esp/esp-idf/components/freertos/port.c:355 (discriminator 1) + +Found 374 leaked bytes in 6 blocks. diff --git a/tools/esp_app_trace/test/sysview/gdbinit b/tools/esp_app_trace/test/sysview/gdbinit new file mode 100644 index 0000000000..137182c221 --- /dev/null +++ b/tools/esp_app_trace/test/sysview/gdbinit @@ -0,0 +1,19 @@ +target remote :3333 + +mon reset halt +flushregs + +b heap_trace_start +commands +clear heap_trace_start +mon esp32 sysview start file://cpu0.svdat file://cpu1.svdat +c +end + +b heap_trace_stop +commands +clear heap_trace_stop +mon esp32 sysview stop +end + +c diff --git a/tools/esp_app_trace/test/sysview/test.elf b/tools/esp_app_trace/test/sysview/test.elf new file mode 100644 index 0000000000..9ce51ec4ce Binary files /dev/null and b/tools/esp_app_trace/test/sysview/test.elf differ diff --git a/tools/esp_app_trace/test/sysview/test.sh b/tools/esp_app_trace/test/sysview/test.sh new file mode 100755 index 0000000000..ec45fa09c2 --- /dev/null +++ b/tools/esp_app_trace/test/sysview/test.sh @@ -0,0 +1,8 @@ +#! /bin/bash + +{ coverage debug sys \ + && coverage erase &> output \ + && coverage run -a $IDF_PATH/tools/esp_app_trace/sysviewtrace_proc.py -d -p cpu0.svdat cpu1.svdat test.elf &>> output \ + && diff output expected_output \ + && coverage report \ +; } || { echo 'The test for sysviewtrace_proc has failed. Please examine the artifacts.' ; exit 1; }