summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/shared/bootcard.c
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>2008-05-15 15:55:46 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>2008-05-15 15:55:46 +0000
commitec3007cafd392f6cf75d236b49ab21ae6af61ac4 (patch)
treed4d45b1a09c5ab4c5f02c9c88612f59de7a827f7 /c/src/lib/libbsp/shared/bootcard.c
parent2008-05-15 Joel Sherrill <joel.sherrill@OARcorp.com> (diff)
downloadrtems-ec3007cafd392f6cf75d236b49ab21ae6af61ac4.tar.bz2
2008-05-15 Joel Sherrill <joel.sherrill@OARcorp.com>
* bootcard.c: Add capability for bootcard.c BSP Initialization Framework to ask the BSP where it has memory for the RTEMS Workspace and C Program Heap. These collectively are referred to as work area. If the BSP supports this, then it does not have to include code to split the available memory between the two areas. This reduces the amount of code in the BSP specific bspstart.c file. Additionally, the shared framework can initialize the C Library, call rtems_debug_enable(), and dirty the work area memory. Until most/all BSPs support this new capability, if the BSP supports this, it should call RTEMS_BSP_BOOTCARD_HANDLES_RAM_ALLOCATION from its configure.ac. When the transition is complete, this autoconf macro can be removed. * bsppretaskinghook.c: New file.
Diffstat (limited to 'c/src/lib/libbsp/shared/bootcard.c')
-rw-r--r--c/src/lib/libbsp/shared/bootcard.c135
1 files changed, 127 insertions, 8 deletions
diff --git a/c/src/lib/libbsp/shared/bootcard.c b/c/src/lib/libbsp/shared/bootcard.c
index 9d6e8a2a8a..9174e8fe6c 100644
--- a/c/src/lib/libbsp/shared/bootcard.c
+++ b/c/src/lib/libbsp/shared/bootcard.c
@@ -6,18 +6,25 @@
*
* + start.S: basic CPU setup (stack, zero BSS)
* + boot_card
+ * + if defined(BSP_BOOTCARD_HANDLES_RAM_ALLOCATION)
+ * - obtain information on BSP memory and allocate RTEMS Workspace
* + bspstart.c: bsp_start - more advanced initialization
* + rtems_initialize_data_structures
+ * + if defined(BSP_BOOTCARD_HANDLES_RAM_ALLOCATION)
+ * - Allocate memory to C Program Heap
+ * - initialize C Library and C Program Heap
* + bsp_pretasking_hook
+ * + if defined(RTEMS_DEBUG)
+ * - rtems_debug_enable( RTEMS_DEBUG_ALL_MASK );
* + rtems_initialize_before_drivers
* + bsp_predriver_hook
* + rtems_initialize_device_drivers
- * + all device drivers
+ * - all device drivers
* + bsp_postdriver_hook
* + rtems_initialize_start_multitasking
- * + 1st task executes C++ global constructors
+ * - 1st task executes C++ global constructors
* .... appplication runs ...
- * + exit
+ * - exit
* + back to here eventually
* + bspclean.c: bsp_cleanup
*
@@ -26,7 +33,7 @@
* Thanks to Chris Johns <cjohns@plessey.com.au> for the idea
* to move C++ global constructors into the first task.
*
- * COPYRIGHT (c) 1989-2007.
+ * COPYRIGHT (c) 1989-2008.
* On-Line Applications Research Corporation (OAR).
*
* The license and distribution terms for this file may be
@@ -38,18 +45,60 @@
#include <bsp.h>
+/*
+ * Since there is a forward reference
+ */
+char *rtems_progname;
+
+
+/*
+ * Prototypes of external routines
+ */
extern void bsp_start( void );
extern void bsp_cleanup( void );
extern void bsp_pretasking_hook(void);
+extern void bsp_libc_init( void *, uint32_t, int );
extern void bsp_predriver_hook(void);
extern void bsp_postdriver_hook(void);
/*
- * Since there is a forward reference
+ * These are the prototypes and helper routines which are used
+ * when the BSP lets the framework handle RAM allocation between
+ * the RTEMS Workspace and C Program Heap.
*/
+#if defined(BSP_BOOTCARD_HANDLES_RAM_ALLOCATION)
+ extern void bsp_get_workarea( void **, size_t *, size_t *);
-char *rtems_progname;
+ void bootcard_bsp_libc_helper(
+ void *workarea_base,
+ size_t workarea_size,
+ size_t requested_heap_size
+ )
+ {
+ uint32_t heap_start;
+ uint32_t heap_size;
+
+ heap_start = (uint32_t) workarea_base;
+ if (heap_start & (CPU_ALIGNMENT-1))
+ heap_start = (heap_start + CPU_ALIGNMENT) & ~(CPU_ALIGNMENT-1);
+
+ if ( requested_heap_size == 0 ) {
+ heap_size = Configuration.work_space_start - workarea_base;
+ heap_size &= 0xfffffff0; /* keep it as a multiple of 16 bytes */
+ } else {
+ heap_size = requested_heap_size;
+ }
+ bsp_libc_init((void *) heap_start, heap_size, 0);
+ }
+#endif
+
+/*
+ * This is the initialization framework routine that weaves together
+ * calls to RTEMS and the BSP in the proper sequence to initialize
+ * the system while maximizing shared code and keeping BSP code in C
+ * as much as possible.
+ */
int boot_card(
int argc,
char **argv,
@@ -61,6 +110,11 @@ int boot_card(
char **argv_p = &argv_pointer;
char **envp_p = &envp_pointer;
rtems_interrupt_level bsp_isr_level;
+ #if defined(BSP_BOOTCARD_HANDLES_RAM_ALLOCATION)
+ void *workarea_base;
+ size_t workarea_size;
+ size_t heap_size;
+ #endif
/*
* Make sure interrupts are disabled.
@@ -85,6 +139,34 @@ int boot_card(
rtems_progname = "RTEMS";
/*
+ * Find out where the block of memory the BSP will use for
+ * the RTEMS Workspace and the C Program Heap is.
+ */
+ #if defined(BSP_BOOTCARD_HANDLES_RAM_ALLOCATION)
+ {
+ unsigned char *work_space_start;
+
+ bsp_get_workarea( &workarea_base, &workarea_size, &heap_size );
+
+ work_space_start = workarea_base + workarea_size
+ - rtems_configuration_get_work_space_size();
+
+ if ( work_space_start <= (unsigned char *)workarea_base ) {
+ printk( "bootcard: Not enough RAM!!!\n" );
+ bsp_cleanup();
+ return -1;
+ }
+
+ Configuration.work_space_start = work_space_start;
+
+ #if (BSP_DIRTY_MEMORY == 1)
+ memset(workarea_base, 0xCF, workarea_size);
+ #endif
+ }
+
+ #endif
+
+ /*
* Invoke Board Support Package initialization routine written in C.
*/
bsp_start();
@@ -95,14 +177,51 @@ int boot_card(
rtems_initialize_data_structures( &Configuration );
/*
+ * Initialize the C library for those BSPs using the shared
+ * framework.
+ */
+ #if defined(BSP_BOOTCARD_HANDLES_RAM_ALLOCATION)
+ bootcard_bsp_libc_helper( workarea_base, workarea_size, heap_size );
+ #endif
+
+ /*
* All BSP to do any required initialization now that RTEMS
- * data structures are initialized. This is the typical
+ * data structures are initialized. In older BSPs or those
+ * which do not use the shared framework, this is the typical
* time when the C Library is initialized so malloc()
- * can be called by device drivers.
+ * can be called by device drivers. For BSPs using the shared
+ * framework, this routine can be empty.
*/
bsp_pretasking_hook();
/*
+ * If debug is enabled, then enable all dynamic RTEMS debug
+ * capabilities.
+ *
+ * NOTE: Most debug features are conditionally compiled in
+ * or enabled via configure time plugins.
+ */
+ #ifdef RTEMS_DEBUG
+ rtems_debug_enable( RTEMS_DEBUG_ALL_MASK );
+ #endif
+
+ /*
+ * Let RTEMS perform initialization it requires before drivers
+ * are allowed to be initialized.
+ */
+ rtems_initialize_before_drivers();
+
+ /*
+ * Execute BSP specific pre-driver hook. Drivers haven't gotten
+ * to initialize yet so this is a good chance to initialize
+ * buses, spurious interrupt handlers, etc..
+ *
+ * NOTE: Many BSPs do not require this handler and use the
+ * shared stub.
+ */
+ bsp_predriver_hook();
+
+ /*
* Let RTEMS perform initialization it requires before drivers
* are allowed to be initialized.
*/