/* * This set of routines are the BSP specific initialization * support routines. * * COPYRIGHT (c) 1989-2008. * On-Line Applications Research Corporation (OAR). * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at * http://www.rtems.com/license/LICENSE. */ /* #define BSP_GET_WORK_AREA_DEBUG */ #include #include #ifdef BSP_GET_WORK_AREA_DEBUG #include #endif /* Tells us where to put the workspace in case remote debugger is present. */ extern uint32_t rdb_start; /* Must be aligned to 8, _end is aligned to 8 */ unsigned int early_mem = (unsigned int)&end; /* * This method returns the base address and size of the area which * is to be allocated between the RTEMS Workspace and the C Program * Heap. */ void bsp_work_area_initialize(void) { /* must be identical to STACK_SIZE in start.S */ #define STACK_SIZE (16 * 1024) /* Early dynamic memory allocator is placed just above _end */ void *work_area_start = (void *)early_mem; uintptr_t work_area_size = (uintptr_t)rdb_start - (uintptr_t)early_mem - STACK_SIZE; early_mem = ~0; /* Signal bsp_early_malloc not to be used anymore */ /* * The following may be helpful in debugging what goes wrong when * you are allocating the Work Area in a new BSP. */ #ifdef BSP_GET_WORK_AREA_DEBUG { void *sp = __builtin_frame_address(0); void *end = *work_area_start + *work_area_size; printk( "work_area_start = 0x%p\n" "work_area_size = %d 0x%08x\n" "end = 0x%p\n" "current stack pointer = 0x%p%s\n", work_area_start, work_area_size, /* decimal */ work_area_size, /* hexadecimal */ end, sp, ((sp >= *work_area_start && sp <= end) ? " OVERLAPS!" : "") ); printk( "rdb_start = 0x%08x\n", rdb_start ); } #endif bsp_work_area_initialize_default(work_area_start, work_area_size); }