From 9c8136355a1169e99e51221fc9ee3c9417203a83 Mon Sep 17 00:00:00 2001 From: Erhan Kurubas Date: Wed, 2 Sep 2026 23:13:22 +0200 Subject: [PATCH] fix(esp_riscv_trace): Stop the encoder writing past the trace buffer --- components/esp_riscv_trace/src/esp_riscv_trace.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/components/esp_riscv_trace/src/esp_riscv_trace.c b/components/esp_riscv_trace/src/esp_riscv_trace.c index 79981518ae5..d7610987843 100644 --- a/components/esp_riscv_trace/src/esp_riscv_trace.c +++ b/components/esp_riscv_trace/src/esp_riscv_trace.c @@ -31,6 +31,9 @@ #define ESP_RISCV_TRACE_BUFFER_ALIGNMENT 4 +/* One word is reserved so mem_end_addr can point at the last writable word. */ +#define ESP_RISCV_TRACE_BUFFER_MIN_SIZE 8 + static const char *TAG = "esp_riscv_trace"; /* Handles created at startup by esp_riscv_trace_early_init(), one slot per core. */ @@ -165,7 +168,8 @@ static esp_err_t validate_trace_config(esp_riscv_trace_core_t core_id, const esp ESP_RETURN_ON_FALSE(ret_handle != NULL, ESP_ERR_INVALID_ARG, TAG, "invalid argument"); ESP_RETURN_ON_FALSE((int)core_id >= 0 && (int)core_id < SOC_CPU_CORES_NUM, ESP_ERR_INVALID_ARG, TAG, "invalid core id"); - ESP_RETURN_ON_FALSE(config->buffer_size != 0, ESP_ERR_INVALID_SIZE, TAG, "trace buffer size is 0"); + ESP_RETURN_ON_FALSE(config->buffer_size >= ESP_RISCV_TRACE_BUFFER_MIN_SIZE, ESP_ERR_INVALID_SIZE, TAG, + "trace buffer must be at least %d bytes", ESP_RISCV_TRACE_BUFFER_MIN_SIZE); ESP_RETURN_ON_FALSE(is_valid_address_mode(config->address_mode), ESP_ERR_INVALID_ARG, TAG, "invalid address mode"); ESP_RETURN_ON_FALSE(is_valid_mem_mode(config->mem_mode), ESP_ERR_INVALID_ARG, TAG, "invalid memory mode"); ESP_RETURN_ON_FALSE(is_valid_resync_mode(config->resync_mode), ESP_ERR_INVALID_ARG, TAG, "invalid resync mode"); @@ -197,7 +201,7 @@ static esp_err_t esp_riscv_trace_new(esp_riscv_trace_core_t core_id, const esp_r riscv_trace_hal_context_t hal_ctx; riscv_trace_hal_config_t hal_config = { .mem_start_addr = (uint32_t)trace_mem, - .mem_end_addr = (uint32_t)trace_mem + trace_mem_size, + .mem_end_addr = (uint32_t)trace_mem + trace_mem_size - sizeof(uint32_t), .full_address = (config->address_mode == ESP_RISCV_TRACE_ADDR_FULL), .mem_loop = (config->mem_mode == ESP_RISCV_TRACE_MEM_LOOP), .auto_restart = config->auto_restart,