summaryrefslogtreecommitdiffstats
path: root/cpukit/include/rtems/score/wkspaceinitone.h
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2021-12-07 16:31:45 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2021-12-07 16:32:54 +0100
commit39e6f532986c580e1eef474f69d94412eefbfeae (patch)
tree2a6623508a50a31f4b8b16d81eb6954e59b0acfd /cpukit/include/rtems/score/wkspaceinitone.h
parentlibtest: Fix sample reporting (diff)
downloadrtems-39e6f532986c580e1eef474f69d94412eefbfeae.tar.bz2
score: Fix _Workspace_Initialize_for_one_area()
In _Workspace_Initialize_for_one_area(), properly check if there is enough free memory available for the configured workspace size. The bug was introduced by commit 3d0620b607ff6459fec9d30efc1e0589bbd010f9.
Diffstat (limited to '')
-rw-r--r--cpukit/include/rtems/score/wkspaceinitone.h34
1 files changed, 20 insertions, 14 deletions
diff --git a/cpukit/include/rtems/score/wkspaceinitone.h b/cpukit/include/rtems/score/wkspaceinitone.h
index c68e1b5db1..ce26a1cf8f 100644
--- a/cpukit/include/rtems/score/wkspaceinitone.h
+++ b/cpukit/include/rtems/score/wkspaceinitone.h
@@ -59,26 +59,29 @@ extern "C" {
*/
RTEMS_INLINE_ROUTINE void _Workspace_Initialize_for_one_area( void )
{
- uintptr_t page_size;
- uintptr_t wkspace_size;
- uintptr_t wkspace_size_with_overhead;
- uintptr_t available_size;
+ uintptr_t page_size;
+ uintptr_t wkspace_size;
+ uintptr_t wkspace_size_with_overhead;
+ const Memory_Information *mem;
+ Memory_Area *area;
+ uintptr_t free_size;
+ uintptr_t available_size;
page_size = CPU_HEAP_ALIGNMENT;
wkspace_size = rtems_configuration_get_work_space_size();
wkspace_size_with_overhead = wkspace_size + _Heap_Area_overhead( page_size );
- if ( wkspace_size < wkspace_size_with_overhead ) {
- const Memory_Information *mem;
- Memory_Area *area;
- uintptr_t free_size;
- uintptr_t size;
+ mem = _Memory_Get();
+ _Assert( _Memory_Get_count( mem ) == 1 );
- mem = _Memory_Get();
- _Assert( _Memory_Get_count( mem ) == 1 );
+ area = _Memory_Get_area( mem, 0 );
+ free_size = _Memory_Get_free_size( area );
- area = _Memory_Get_area( mem, 0 );
- free_size = _Memory_Get_free_size( area );
+ if (
+ wkspace_size < wkspace_size_with_overhead &&
+ free_size >= wkspace_size_with_overhead
+ ) {
+ uintptr_t size;
if ( rtems_configuration_get_unified_work_area() ) {
size = free_size;
@@ -95,7 +98,10 @@ RTEMS_INLINE_ROUTINE void _Workspace_Initialize_for_one_area( void )
_Memory_Consume( area, size );
} else {
- /* An unsigned integer overflow happened */
+ /*
+ * An unsigned integer overflow happened, or the available free memory is
+ * not enough.
+ */
available_size = 0;
}