/* * 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. * * $Id$ */ /* #define BSP_GET_WORK_AREA_DEBUG */ #include #include #include #ifdef BSP_GET_WORK_AREA_DEBUG #include #endif extern void *__rtems_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_get_work_area( void **work_area_start, uintptr_t *work_area_size, void **heap_start, uintptr_t *heap_size ) { uintptr_t work_size; uintptr_t work_area; work_area = (uintptr_t)&__rtems_end + rtems_configuration_get_interrupt_stack_size(); work_size = (uintptr_t)BSP_mem_size - work_area; *work_area_start = (void *)work_area, *work_area_size = work_size; *heap_start = BSP_BOOTCARD_HEAP_USES_WORK_AREA; *heap_size = BSP_BOOTCARD_HEAP_SIZE_DEFAULT; /* * 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" "heap_start = 0x%p\n" "heap_size = %d\n" "current stack pointer = 0x%p%s\n", *work_area_start, *work_area_size, /* decimal */ *work_area_size, /* hexadecimal */ end, *heap_start, *heap_size, sp, ((sp >= *work_area_start && sp <= end) ? " OVERLAPS!" : "") ); } #endif }