/* * This routine is an implementation of the bsp_get_work_area() * that can be used by all BSPs following linkcmds conventions * regarding heap, stack, and workspace allocation. * * COPYRIGHT (c) 1989-2008. * On-Line Applications Research Corporation (OAR). * * Copyright (c) 2011 embedded brains GmbH. * * 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 #ifdef BSP_INTERRUPT_STACK_AT_WORK_AREA_BEGIN #include #endif #if defined(HAS_UBOOT) && !defined(BSP_DISABLE_UBOOT_WORK_AREA_CONFIG) #define USE_UBOOT #endif /* * These are provided by the linkcmds for ALL of the BSPs which use this file. */ extern char WorkAreaBase[]; extern char HeapSize[]; /* * We may get the size information from U-Boot or the linker scripts. */ #ifdef USE_UBOOT #include #else extern char RamBase[]; extern char RamSize[]; #endif /* * 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_base = (uintptr_t) WorkAreaBase; uintptr_t ram_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 #ifdef BSP_INTERRUPT_STACK_AT_WORK_AREA_BEGIN work_base += Configuration.interrupt_stack_size; #endif *work_area_start = (void *) work_base; *work_area_size = ram_end - work_base; *heap_start = BSP_BOOTCARD_HEAP_USES_WORK_AREA; *heap_size = (uintptr_t) HeapSize; /* * 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 }