summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/powerpc
diff options
context:
space:
mode:
Diffstat (limited to 'c/src/lib/libbsp/powerpc')
-rw-r--r--c/src/lib/libbsp/powerpc/shared/startup/bspgetworkarea.c51
-rw-r--r--c/src/lib/libbsp/powerpc/shared/startup/sbrk.c47
-rw-r--r--c/src/lib/libbsp/powerpc/tqm8xx/startup/bspgetworkarea.c27
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 );
}