|
| 1 | +/* |
| 2 | + * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD |
| 3 | + * |
| 4 | + * SPDX-License-Identifier: Apache-2.0 |
| 5 | + */ |
| 6 | + |
| 7 | +#include "sdkconfig.h" |
| 8 | + |
| 9 | +#if CONFIG_ESP_COREDUMP_CHECKSUM_CRC32 |
| 10 | + |
| 11 | +#include "esp_rom_crc.h" |
| 12 | +#include "esp_core_dump_types.h" |
| 13 | + |
| 14 | +const static char TAG[] __attribute__((unused)) = "esp_core_dump_crc"; |
| 15 | + |
| 16 | +typedef uint32_t core_dump_crc_t; |
| 17 | + |
| 18 | +typedef struct { |
| 19 | + core_dump_crc_t crc; |
| 20 | + uint32_t total_bytes_checksum; /* Number of bytes used to calculate the checksum */ |
| 21 | +} core_dump_crc_ctx_t; |
| 22 | + |
| 23 | +static core_dump_crc_ctx_t s_core_dump_crc_ctx = { 0 }; |
| 24 | + |
| 25 | +void esp_core_dump_checksum_init(core_dump_checksum_ctx *out_ctx) __attribute__((alias("core_dump_crc_init"))); |
| 26 | +void esp_core_dump_checksum_update(core_dump_checksum_ctx cks_ctx, void* data, size_t data_len) __attribute__((alias("core_dump_crc_update"))); |
| 27 | +uint32_t esp_core_dump_checksum_finish(core_dump_checksum_ctx cks_ctx, core_dump_checksum_bytes* chs_ptr) __attribute__((alias("core_dump_crc_finish"))); |
| 28 | +void esp_core_dump_print_checksum(const char* msg, core_dump_checksum_bytes checksum) __attribute__((alias("core_dump_crc_print"))); |
| 29 | +uint32_t esp_core_dump_checksum_size(void) __attribute__((alias("core_dump_crc_size"))); |
| 30 | +uint32_t esp_core_dump_elf_version(void) __attribute__((alias("core_dump_crc_version"))); |
| 31 | + |
| 32 | +static void core_dump_crc_print(const char *msg, const uint8_t *checksum) |
| 33 | +{ |
| 34 | + ESP_COREDUMP_DEBUG_ASSERT(checksum != NULL); |
| 35 | + |
| 36 | + if (msg != NULL) { |
| 37 | + ESP_COREDUMP_PRINT("%s=", msg); |
| 38 | + } |
| 39 | + ESP_COREDUMP_PRINT("'%08x'\r\n", *((const uint32_t*)checksum)); |
| 40 | +} |
| 41 | + |
| 42 | +static uint32_t core_dump_crc_size(void) |
| 43 | +{ |
| 44 | + return sizeof(core_dump_crc_t); |
| 45 | +} |
| 46 | + |
| 47 | +static uint32_t core_dump_crc_version(void) |
| 48 | +{ |
| 49 | + return COREDUMP_VERSION_ELF_CRC32; |
| 50 | +} |
| 51 | + |
| 52 | +static void core_dump_crc_init(core_dump_checksum_ctx *out_ctx) |
| 53 | +{ |
| 54 | + if (out_ctx) { |
| 55 | + s_core_dump_crc_ctx.crc = 0; |
| 56 | + s_core_dump_crc_ctx.total_bytes_checksum = 0; |
| 57 | + *out_ctx = &s_core_dump_crc_ctx; |
| 58 | + } |
| 59 | +} |
| 60 | + |
| 61 | +static void core_dump_crc_update(core_dump_checksum_ctx cks_ctx, void* data, size_t data_len) |
| 62 | +{ |
| 63 | + if (data) { |
| 64 | + core_dump_crc_ctx_t *crc_ctx = cks_ctx; |
| 65 | + crc_ctx->crc = esp_rom_crc32_le(crc_ctx->crc, data, data_len); |
| 66 | + // keep counter of cashed bytes |
| 67 | + crc_ctx->total_bytes_checksum += data_len; |
| 68 | + } else { |
| 69 | + ESP_COREDUMP_LOGE("Empty data to add to checksum calculation!"); |
| 70 | + } |
| 71 | +} |
| 72 | + |
| 73 | +static uint32_t core_dump_crc_finish(core_dump_checksum_ctx cks_ctx, core_dump_checksum_bytes* chs_ptr) |
| 74 | +{ |
| 75 | + if (cks_ctx) { |
| 76 | + core_dump_crc_ctx_t *crc_ctx = cks_ctx; |
| 77 | + |
| 78 | + if (chs_ptr) { |
| 79 | + *chs_ptr = (core_dump_checksum_bytes)&crc_ctx->crc; |
| 80 | + } |
| 81 | + |
| 82 | + ESP_COREDUMP_LOG_PROCESS("Total length of hashed data: %d", crc_ctx->total_bytes_checksum); |
| 83 | + } |
| 84 | + |
| 85 | + return core_dump_crc_size(); |
| 86 | +} |
| 87 | + |
| 88 | +#endif /* CONFIG_ESP_COREDUMP_CHECKSUM_CRC32 */ |
0 commit comments