@@ -25,6 +25,25 @@ const static char TAG[] __attribute__((unused)) = "esp_core_dump_common";
2525/**
2626 * @brief Memory regions to dump, defined at compile time.
2727 */
28+ #if CONFIG_ESP_COREDUMP_CAPTURE_DRAM
29+ #if !CONFIG_IDF_TARGET_ESP32P4
30+ extern int _bss_start ;
31+ extern int _bss_end ;
32+ extern int _data_start ;
33+ extern int _data_end ;
34+ #else
35+ extern int _bss_start_low ;
36+ extern int _bss_end_low ;
37+ extern int _data_start_low ;
38+ extern int _data_end_low ;
39+ extern int _bss_start_high ;
40+ extern int _bss_end_high ;
41+ extern int _data_start_high ;
42+ extern int _data_end_high ;
43+ #endif
44+ #endif
45+
46+ /* Regions for the user defined variable locations */
2847extern int _coredump_dram_start ;
2948extern int _coredump_dram_end ;
3049extern int _coredump_iram_start ;
@@ -160,6 +179,7 @@ FORCE_INLINE_ATTR void esp_core_dump_setup_stack(void)
160179FORCE_INLINE_ATTR void esp_core_dump_report_stack_usage (void )
161180{
162181}
182+
163183#endif // CONFIG_ESP_COREDUMP_STACK_SIZE > 0
164184
165185static void * s_exc_frame = NULL ;
@@ -254,56 +274,64 @@ uint32_t esp_core_dump_get_user_ram_segments(void)
254274 return total_sz ;
255275}
256276
257- uint32_t esp_core_dump_get_user_ram_size (void )
258- {
259- uint32_t total_sz = 0 ;
260-
261- total_sz += COREDUMP_GET_MEMORY_SIZE (& _coredump_dram_end , & _coredump_dram_start );
277+ static const struct {
278+ int * start ;
279+ int * end ;
280+ } s_memory_sections [COREDUMP_MEMORY_MAX ] = {
281+ [COREDUMP_MEMORY_IRAM ] = { & _coredump_iram_start , & _coredump_iram_end },
282+ #if CONFIG_ESP_COREDUMP_CAPTURE_DRAM
283+ #if !CONFIG_IDF_TARGET_ESP32P4
284+ [COREDUMP_MEMORY_DRAM_BSS ] = { & _bss_start , & _bss_end },
285+ [COREDUMP_MEMORY_DRAM_DATA ] = { & _data_start , & _data_end },
286+ #else
287+ [COREDUMP_MEMORY_DRAM_BSS ] = { & _bss_start_low , & _bss_end_low },
288+ [COREDUMP_MEMORY_DRAM_DATA ] = { & _data_start_low , & _data_end_low },
289+ [COREDUMP_MEMORY_DRAM_BSS_HIGH ] = { & _bss_start_high , & _bss_end_high },
290+ [COREDUMP_MEMORY_DRAM_DATA_HIGH ] = { & _data_start_high , & _data_end_high },
291+ #endif
292+ #else
293+ [COREDUMP_MEMORY_DRAM ] = { & _coredump_dram_start , & _coredump_dram_end },
294+ #endif
262295#if SOC_RTC_MEM_SUPPORTED
263- total_sz += COREDUMP_GET_MEMORY_SIZE ( & _coredump_rtc_end , & _coredump_rtc_start );
264- total_sz += COREDUMP_GET_MEMORY_SIZE ( & _coredump_rtc_fast_end , & _coredump_rtc_fast_start );
296+ [ COREDUMP_MEMORY_RTC ] = { & _coredump_rtc_start , & _coredump_rtc_end },
297+ [ COREDUMP_MEMORY_RTC_FAST ] = { & _coredump_rtc_fast_start , & _coredump_rtc_fast_end },
265298#endif
266- total_sz += COREDUMP_GET_MEMORY_SIZE (& _coredump_iram_end , & _coredump_iram_start );
267-
268- return total_sz ;
269- }
299+ };
270300
271301int esp_core_dump_get_user_ram_info (coredump_region_t region , uint32_t * start )
272302{
273303 int total_sz = -1 ;
274304
275305 ESP_COREDUMP_DEBUG_ASSERT (start != NULL );
276306
277- switch (region ) {
278- case COREDUMP_MEMORY_DRAM :
279- * start = (uint32_t )& _coredump_dram_start ;
280- total_sz = (uint8_t * )& _coredump_dram_end - (uint8_t * )& _coredump_dram_start ;
281- break ;
282-
283- case COREDUMP_MEMORY_IRAM :
284- * start = (uint32_t )& _coredump_iram_start ;
285- total_sz = (uint8_t * )& _coredump_iram_end - (uint8_t * )& _coredump_iram_start ;
286- break ;
287-
288- #if SOC_RTC_MEM_SUPPORTED
289- case COREDUMP_MEMORY_RTC :
290- * start = (uint32_t )& _coredump_rtc_start ;
291- total_sz = (uint8_t * )& _coredump_rtc_end - (uint8_t * )& _coredump_rtc_start ;
292- break ;
293-
294- case COREDUMP_MEMORY_RTC_FAST :
295- * start = (uint32_t )& _coredump_rtc_fast_start ;
296- total_sz = (uint8_t * )& _coredump_rtc_fast_end - (uint8_t * )& _coredump_rtc_fast_start ;
297- break ;
298- #endif
299-
300- default :
301- break ;
307+ if (region >= COREDUMP_MEMORY_START && region < COREDUMP_MEMORY_MAX ) {
308+ total_sz = (uint8_t * )s_memory_sections [region ].end - (uint8_t * )s_memory_sections [region ].start ;
309+ * start = (uint32_t )s_memory_sections [region ].start ;
302310 }
303311
304312 return total_sz ;
305313}
306314
315+ #if CONFIG_ESP_COREDUMP_CAPTURE_DRAM
316+ void esp_core_dump_get_own_stack_info (uint32_t * addr , uint32_t * size )
317+ {
318+ #if CONFIG_ESP_COREDUMP_STACK_SIZE > 0
319+ /* Custom stack reserved for the coredump */
320+ * addr = (uint32_t )s_coredump_stack ;
321+ * size = sizeof (s_coredump_stack );
322+ #else
323+ /* Shared stack with the crashed task */
324+ core_dump_task_handle_t handle = esp_core_dump_get_current_task_handle ();
325+ TaskSnapshot_t rtos_snapshot = { 0 };
326+ vTaskGetSnapshot (handle , & rtos_snapshot );
327+ StaticTask_t * current = (StaticTask_t * )handle ;
328+ * addr = (uint32_t )current -> pxDummy6 ; //pxStack
329+ * size = (uint32_t )rtos_snapshot .pxTopOfStack - (uint32_t )current -> pxDummy6 ; /* free */
330+ #endif
331+ }
332+
333+ #endif /* CONFIG_ESP_COREDUMP_CAPTURE_DRAM */
334+
307335inline bool esp_core_dump_tcb_addr_is_sane (uint32_t addr )
308336{
309337 return esp_core_dump_mem_seg_is_sane (addr , esp_core_dump_get_tcb_len ());
0 commit comments