diff options
author | sebastian.huber <sebastian.huber@ad346e48-6743-2946-b04c-964484d2d4e6> | 2019-10-25 13:19:01 +0000 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2019-11-05 07:29:00 +0100 |
commit | 3859cd63afb4cb5f76d125e80f968497478d553f (patch) | |
tree | 642d9c6e78f2fa8dcb1d027496cfb9ca1c710d49 /cpukit/score/src | |
parent | bsps/arm: Add support for small pages MMU (diff) | |
download | rtems-3859cd63afb4cb5f76d125e80f968497478d553f.tar.bz2 |
rtems-5: Improve heap fatal error information
Update #3806.
Diffstat (limited to 'cpukit/score/src')
-rw-r--r-- | cpukit/score/src/heap.c | 14 | ||||
-rw-r--r-- | cpukit/score/src/heapallocate.c | 6 | ||||
-rw-r--r-- | cpukit/score/src/heapfree.c | 6 |
3 files changed, 18 insertions, 8 deletions
diff --git a/cpukit/score/src/heap.c b/cpukit/score/src/heap.c index 371944160c..a67fef783a 100644 --- a/cpukit/score/src/heap.c +++ b/cpukit/score/src/heap.c @@ -147,17 +147,23 @@ || block->Protection_end.protector [0] != HEAP_END_PROTECTOR_0 || block->Protection_end.protector [1] != HEAP_END_PROTECTOR_1 ) { - _Heap_Protection_block_error( heap, block ); + _Heap_Protection_block_error( heap, block, HEAP_ERROR_BROKEN_PROTECTOR ); } } static void _Heap_Protection_block_error_default( Heap_Control *heap, - Heap_Block *block + Heap_Block *block, + Heap_Error_reason reason ) { - /* FIXME */ - _Terminate( INTERNAL_ERROR_CORE, 0xdeadbeef ); + Heap_Error_context error_context = { + .heap = heap, + .block = block, + .reason = reason + }; + + _Terminate( RTEMS_FATAL_SOURCE_HEAP, (uintptr_t) &error_context ); } #endif diff --git a/cpukit/score/src/heapallocate.c b/cpukit/score/src/heapallocate.c index 3984881835..2868fe5d46 100644 --- a/cpukit/score/src/heapallocate.c +++ b/cpukit/score/src/heapallocate.c @@ -45,7 +45,11 @@ Heap_Block *next_block_to_free; if ( !_Heap_Is_block_in_heap( heap, block_to_free ) ) { - _Heap_Protection_block_error( heap, block_to_free ); + _Heap_Protection_block_error( + heap, + block_to_free, + HEAP_ERROR_BAD_FREE_BLOCK + ); } next_block_to_free = diff --git a/cpukit/score/src/heapfree.c b/cpukit/score/src/heapfree.c index 04994c507b..ddc1634975 100644 --- a/cpukit/score/src/heapfree.c +++ b/cpukit/score/src/heapfree.c @@ -69,7 +69,7 @@ for ( current = pattern_begin; current != pattern_end; ++current ) { if ( *current != HEAP_FREE_PATTERN ) { - _Heap_Protection_block_error( heap, block ); + _Heap_Protection_block_error( heap, block, HEAP_ERROR_FREE_PATTERN ); break; } } @@ -89,7 +89,7 @@ } else if ( next == HEAP_PROTECTION_OBOLUS ) { _Heap_Protection_check_free_block( heap, block ); } else { - _Heap_Protection_block_error( heap, block ); + _Heap_Protection_block_error( heap, block, HEAP_ERROR_DOUBLE_FREE ); } return do_free; @@ -134,7 +134,7 @@ bool _Heap_Free( Heap_Control *heap, void *alloc_begin_ptr ) _Heap_Protection_block_check( heap, next_block ); if ( !_Heap_Is_prev_used( next_block ) ) { - _Heap_Protection_block_error( heap, block ); + _Heap_Protection_block_error( heap, block, HEAP_ERROR_BAD_USED_BLOCK ); return false; } |