From: Chris Johns <chr...@rtems.org> --- bsps/shared/start/bspfatal-default.c | 53 +++++++++++++++++++++++++--- 1 file changed, 49 insertions(+), 4 deletions(-)
diff --git a/bsps/shared/start/bspfatal-default.c b/bsps/shared/start/bspfatal-default.c index 0289dbda63..5e93b21b04 100644 --- a/bsps/shared/start/bspfatal-default.c +++ b/bsps/shared/start/bspfatal-default.c @@ -22,15 +22,24 @@ void bsp_fatal_extension( { #if BSP_VERBOSE_FATAL_EXTENSION Thread_Control *executing; + const char* TYPE = "*** FATAL ***\n"; + const char* type = "fatal"; + + if ( source == RTEMS_FATAL_SOURCE_EXIT ) { + TYPE = ""; + type = "exit"; + } printk( "\n" - "*** FATAL ***\n" - "fatal source: %i (%s)\n" + "%s" + "%s source: %i (%s)\n" #ifdef RTEMS_SMP "CPU: %" PRIu32 "\n" #endif , + TYPE, + type, source, rtems_fatal_source_text( source ) #ifdef RTEMS_SMP @@ -48,13 +57,49 @@ void bsp_fatal_extension( #if BSP_VERBOSE_FATAL_EXTENSION else if ( source == INTERNAL_ERROR_CORE ) { printk( - "fatal code: %ju (%s)\n", + "%s code: %ju (%s)\n", + type, (uintmax_t) code, rtems_internal_error_text( code ) ); + } else if ( source == RTEMS_FATAL_SOURCE_HEAP ) { + Heap_Error_context *error_context = (Heap_Error_context*) code; + const char* reasons[] = { + "HEAP_ERROR_BROKEN_PROTECTOR", + "HEAP_ERROR_FREE_PATTERN", + "HEAP_ERROR_DOUBLE_FREE", + "HEAP_ERROR_BAD_USED_BLOCK", + "HEAP_ERROR_BAD_FREE_BLOCK" + }; + const char* reason = "invalid reason"; + if ( error_context->reason <= (int) HEAP_ERROR_BAD_FREE_BLOCK ) { + reason = reasons[(int) error_context->reason]; + } + printk( + "heap error: heap=%p block=%p reason=%s(%d)", + error_context->heap, + error_context->block, + reason, + error_context->reason + ); + if ( error_context->reason == HEAP_ERROR_BROKEN_PROTECTOR ) { + uintptr_t *pb0 = &error_context->block->Protection_begin.protector [0]; + uintptr_t *pb1 = &error_context->block->Protection_begin.protector [1]; + uintptr_t *pe0 = &error_context->block->Protection_end.protector [0]; + uintptr_t *pe1 = &error_context->block->Protection_end.protector [1]; + printk( + "=[%p,%p,%p,%p]", + *pb0 != HEAP_BEGIN_PROTECTOR_0 ? pb0 : NULL, + *pb1 != HEAP_BEGIN_PROTECTOR_1 ? pb1 : NULL, + *pe0 != HEAP_END_PROTECTOR_0 ? pe0 : NULL, + *pe1 != HEAP_END_PROTECTOR_1 ? pe1 : NULL + ); + printk( "\n" ); + } } else { printk( - "fatal code: %ju (0x%08jx)\n", + "%s code: %ju (0x%08jx)\n", + type, (uintmax_t) code, (uintmax_t) code ); -- 2.24.1 _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel