summaryrefslogtreecommitdiffstats
path: root/bsps/shared/start
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2019-12-13 06:18:36 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2020-02-04 06:06:41 +0100
commiteea21eaca117ecd98afea164e1808d6530ef487f (patch)
treeca4e15da28b71a5ecca5fc357798261a39b3f250 /bsps/shared/start
parentbsps: Remove uses of BSP_GET_WORK_AREA_DEBUG (diff)
downloadrtems-eea21eaca117ecd98afea164e1808d6530ef487f.tar.bz2
bsps: Rework work area initialization
The work area initialization was done by the BSP through bsp_work_area_initialize(). This approach predated the system initialization through the system initialization linker set. The workspace and C program heap were unconditionally initialized. The aim is to support RTEMS application configurations which do not need the workspace and C program heap. In these configurations, the workspace and C prgram heap should not get initialized. Change all bsp_work_area_initialize() to implement _Memory_Get() instead. Move the dirty memory, sbrk(), per-CPU data, workspace, and malloc() heap initialization into separate system initialization steps. This makes it also easier to test the individual initialization steps. This change adds a dependency to _Heap_Extend() to all BSPs. This dependency will be removed in a follow up change. Update #3838.
Diffstat (limited to 'bsps/shared/start')
-rw-r--r--bsps/shared/start/bootcard.c11
-rw-r--r--bsps/shared/start/bspgetworkarea-default.c46
2 files changed, 39 insertions, 18 deletions
diff --git a/bsps/shared/start/bootcard.c b/bsps/shared/start/bootcard.c
index a6ad1953c0..2eef1ea710 100644
--- a/bsps/shared/start/bootcard.c
+++ b/bsps/shared/start/bootcard.c
@@ -24,11 +24,18 @@
*/
const char *bsp_boot_cmdline;
+#if BSP_DIRTY_MEMORY == 1
+static void bsp_dirty_memory(void)
+{
+ _Memory_Fill( _Memory_Get(), 0xcf );
+}
+
RTEMS_SYSINIT_ITEM(
- bsp_work_area_initialize,
- RTEMS_SYSINIT_BSP_WORK_AREAS,
+ bsp_dirty_memory,
+ RTEMS_SYSINIT_DIRTY_MEMORY,
RTEMS_SYSINIT_ORDER_MIDDLE
);
+#endif
RTEMS_SYSINIT_ITEM(
bsp_start,
diff --git a/bsps/shared/start/bspgetworkarea-default.c b/bsps/shared/start/bspgetworkarea-default.c
index 18d4063089..a7c4c04ee7 100644
--- a/bsps/shared/start/bspgetworkarea-default.c
+++ b/bsps/shared/start/bspgetworkarea-default.c
@@ -1,7 +1,7 @@
/**
* @file
*
- * This routine is an implementation of the bsp_work_area_initialize()
+ * This routine is an implementation of the _Memory_Get()
* that can be used by all BSPs following linkcmds conventions
* regarding heap, stack, and workspace allocation.
*/
@@ -33,23 +33,37 @@ extern char WorkAreaBase[];
* We may get the size information from U-Boot or the linker scripts.
*/
#ifdef USE_UBOOT
- #include <bsp/u-boot.h>
-#else
- extern char RamBase[];
- extern char RamSize[];
-#endif
+#include <bsp/u-boot.h>
+#include <rtems/sysinit.h>
+
+static Memory_Area _Memory_Areas[ 1 ];
-void bsp_work_area_initialize(void)
+static void bsp_memory_initialize( void )
{
- uintptr_t work_base = (uintptr_t) WorkAreaBase;
- uintptr_t ram_end;
+ char *end;
+
+ end = (char *) bsp_uboot_board_info.bi_memstart
+ + bsp_uboot_board_info.bi_memsize;
+ _Memory_Initialize( &_Memory_Areas[ 0 ], WorkAreaBase, end );
+}
- #ifdef USE_UBOOT
- ram_end = (uintptr_t) bsp_uboot_board_info.bi_memstart +
- bsp_uboot_board_info.bi_memsize;
- #else
- ram_end = (uintptr_t)RamBase + (uintptr_t)RamSize;
- #endif
+RTEMS_SYSINIT_ITEM(
+ bsp_memory_initialize,
+ RTEMS_SYSINIT_MEMORY,
+ RTEMS_SYSINIT_ORDER_MIDDLE
+);
+#else /* !USE_UBOOT */
+extern char RamEnd[];
- bsp_work_area_initialize_default( (void *) work_base, ram_end - work_base );
+static Memory_Area _Memory_Areas[] = {
+ MEMORY_INITIALIZER(WorkAreaBase, RamEnd)
+};
+#endif /* USE_UBOOT */
+
+static const Memory_Information _Memory_Information =
+ MEMORY_INFORMATION_INITIALIZER( _Memory_Areas );
+
+const Memory_Information *_Memory_Get( void )
+{
+ return &_Memory_Information;
}