diff options
Diffstat (limited to 'c/src/lib/libbsp/powerpc')
-rw-r--r-- | c/src/lib/libbsp/powerpc/shared/startup/bspgetworkarea.c | 51 | ||||
-rw-r--r-- | c/src/lib/libbsp/powerpc/shared/startup/sbrk.c | 47 | ||||
-rw-r--r-- | c/src/lib/libbsp/powerpc/tqm8xx/startup/bspgetworkarea.c | 27 |
3 files changed, 36 insertions, 89 deletions
diff --git a/c/src/lib/libbsp/powerpc/shared/startup/bspgetworkarea.c b/c/src/lib/libbsp/powerpc/shared/startup/bspgetworkarea.c index 174cf68df1..02d47c8b98 100644 --- a/c/src/lib/libbsp/powerpc/shared/startup/bspgetworkarea.c +++ b/c/src/lib/libbsp/powerpc/shared/startup/bspgetworkarea.c @@ -4,28 +4,12 @@ * http://www.rtems.com/license/LICENSE. */ -/* #define BSP_GET_WORK_AREA_DEBUG */ - #include <bsp.h> #include <bsp/bootcard.h> -#include <stdint.h> -#ifdef BSP_GET_WORK_AREA_DEBUG - #include <rtems/bspIo.h> -#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 -) +void bsp_work_area_initialize(void) { uintptr_t work_size; uintptr_t work_area; @@ -34,36 +18,5 @@ void bsp_get_work_area( 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 + bsp_work_area_initialize_default((void *) work_area, work_size); } - diff --git a/c/src/lib/libbsp/powerpc/shared/startup/sbrk.c b/c/src/lib/libbsp/powerpc/shared/startup/sbrk.c index 35ce1f4f06..cd1867d93a 100644 --- a/c/src/lib/libbsp/powerpc/shared/startup/sbrk.c +++ b/c/src/lib/libbsp/powerpc/shared/startup/sbrk.c @@ -61,15 +61,15 @@ * for module code. */ -#include <rtems.h> - -#include <signal.h> #include <errno.h> -#include <sys/types.h> #include <unistd.h> -static void * remaining_start=(void*)-1LL; -static uintptr_t remaining_size=0; +#include <bsp/bootcard.h> + +#define INVALID_REMAINING_START ((uintptr_t) -1) + +static uintptr_t remaining_start = INVALID_REMAINING_START; +static uintptr_t remaining_size = 0; /* App. may provide a value by defining the BSP_sbrk_policy * variable. @@ -81,24 +81,24 @@ static uintptr_t remaining_size=0; */ extern uintptr_t BSP_sbrk_policy __attribute__((weak)); -#define LIMIT_32M ((void*)0x02000000) +#define LIMIT_32M 0x02000000 -uintptr_t bsp_sbrk_init( - void *heap_start, - uintptr_t *heap_size_p -) +ptrdiff_t bsp_sbrk_init(Heap_Area *area, uintptr_t min_size) { - uintptr_t rval=0; + uintptr_t rval = 0; uintptr_t policy; + uintptr_t remaining_end; - remaining_start = heap_start; - remaining_size = *heap_size_p; + remaining_start = (uintptr_t) area->begin; + remaining_size = area->size; + remaining_end = remaining_start + remaining_size; if (remaining_start < LIMIT_32M && - remaining_start + remaining_size > LIMIT_32M) { + remaining_end > LIMIT_32M && + min_size <= LIMIT_32M - remaining_start) { /* clip at LIMIT_32M */ - rval = remaining_start + remaining_size - LIMIT_32M; - *heap_size_p = LIMIT_32M - remaining_start; + rval = remaining_end - LIMIT_32M; + area->size = LIMIT_32M - remaining_start; remaining_start = LIMIT_32M; remaining_size = rval; } @@ -106,8 +106,8 @@ uintptr_t bsp_sbrk_init( policy = (0 == &BSP_sbrk_policy ? (uintptr_t)(-1) : BSP_sbrk_policy); switch ( policy ) { case (uintptr_t)(-1): - *heap_size_p += rval; - remaining_start = heap_start + *heap_size_p; + area->size += rval; + remaining_start = (uintptr_t) area->begin + area->size; remaining_size = 0; break; @@ -121,7 +121,7 @@ uintptr_t bsp_sbrk_init( break; } - return rval; + return (ptrdiff_t) (rval <= PTRDIFF_MAX ? rval : rval / 2); } /* @@ -129,14 +129,13 @@ uintptr_t bsp_sbrk_init( * should just use the default implementation in this file. */ void *sbrk(ptrdiff_t incr) __attribute__ (( weak, alias("bsp_sbrk") )); -void *bsp_sbrk(ptrdiff_t incr) +static void *bsp_sbrk(ptrdiff_t incr) { void *rval=(void*)-1; - /* FIXME: BEWARE if size >2G */ - if ( remaining_start != (void*)-1LL && incr <= remaining_size) { + if ( remaining_start != INVALID_REMAINING_START && incr <= remaining_size) { remaining_size-=incr; - rval = remaining_start; + rval = (void *) remaining_start; remaining_start += incr; } else { errno = ENOMEM; diff --git a/c/src/lib/libbsp/powerpc/tqm8xx/startup/bspgetworkarea.c b/c/src/lib/libbsp/powerpc/tqm8xx/startup/bspgetworkarea.c index bd06b70fdd..d9521896f5 100644 --- a/c/src/lib/libbsp/powerpc/tqm8xx/startup/bspgetworkarea.c +++ b/c/src/lib/libbsp/powerpc/tqm8xx/startup/bspgetworkarea.c @@ -7,12 +7,13 @@ */ /* - * Copyright (c) 2008 - * Embedded Brains GmbH - * Obere Lagerstr. 30 - * D-82178 Puchheim - * Germany - * rtems@embedded-brains.de + * Copyright (c) 2008-2012 embedded brains GmbH. All rights reserved. + * + * embedded brains GmbH + * Obere Lagerstr. 30 + * 82178 Puchheim + * Germany + * <rtems@embedded-brains.de> * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at @@ -24,17 +25,11 @@ #include <bsp.h> #include <bsp/bootcard.h> -void bsp_get_work_area( - void **work_area_start, - uintptr_t *work_area_size, - void **heap_start, - uintptr_t *heap_size -) +void bsp_work_area_initialize(void) { char *ram_end = (char *) (TQM_BD_INFO.sdram_size - (uint32_t)TopRamReserved); + void *area_start = bsp_work_area_start; + uintptr_t area_size = (uintptr_t) ram_end - (uintptr_t) bsp_work_area_start; - *work_area_start = bsp_work_area_start; - *work_area_size = ram_end - bsp_work_area_start; - *heap_start = BSP_BOOTCARD_HEAP_USES_WORK_AREA; - *heap_size = BSP_BOOTCARD_HEAP_SIZE_DEFAULT; + bsp_work_area_initialize_default( area_start, area_size ); } |