diff options
-rw-r--r-- | c/src/lib/libbsp/sparc/erc32/Makefile.am | 2 | ||||
-rw-r--r-- | c/src/lib/libbsp/sparc/erc32/include/bsp.h | 9 | ||||
-rw-r--r-- | c/src/lib/libbsp/sparc/leon2/Makefile.am | 3 | ||||
-rw-r--r-- | c/src/lib/libbsp/sparc/leon2/include/bsp.h | 9 | ||||
-rw-r--r-- | c/src/lib/libbsp/sparc/leon3/Makefile.am | 2 | ||||
-rw-r--r-- | c/src/lib/libbsp/sparc/leon3/include/bsp.h | 9 | ||||
-rw-r--r-- | c/src/lib/libbsp/sparc/shared/bspgetworkarea.c | 12 | ||||
-rw-r--r-- | c/src/lib/libbsp/sparc/shared/startup/early_malloc.c | 47 |
8 files changed, 80 insertions, 13 deletions
diff --git a/c/src/lib/libbsp/sparc/erc32/Makefile.am b/c/src/lib/libbsp/sparc/erc32/Makefile.am index cecfe1406e..e70310df54 100644 --- a/c/src/lib/libbsp/sparc/erc32/Makefile.am +++ b/c/src/lib/libbsp/sparc/erc32/Makefile.am @@ -38,7 +38,7 @@ libbsp_a_SOURCES += ../../shared/bspclean.c ../../shared/bsplibc.c \ ../../shared/bspstart.c ../../shared/bootcard.c ../../shared/bspinit.c \ ../../shared/sbrk.c startup/setvec.c startup/spurious.c \ startup/erc32mec.c startup/boardinit.S startup/bspidle.c \ - startup/bspdelay.c + startup/bspdelay.c ../../sparc/shared/startup/early_malloc.c # ISR Handler libbsp_a_SOURCES += ../../sparc/shared/irq_asm.S # gnatsupp diff --git a/c/src/lib/libbsp/sparc/erc32/include/bsp.h b/c/src/lib/libbsp/sparc/erc32/include/bsp.h index 8655732e05..a88673ebf4 100644 --- a/c/src/lib/libbsp/sparc/erc32/include/bsp.h +++ b/c/src/lib/libbsp/sparc/erc32/include/bsp.h @@ -15,8 +15,6 @@ * * ERC32 modifications of respective RTEMS file: COPYRIGHT (c) 1995. * European Space Agency. - * - * $Id$ */ #ifndef _BSP_H @@ -81,6 +79,13 @@ void BSP_fatal_return( void ); void bsp_spurious_initialize( void ); +/* Allocate 8-byte aligned non-freeable pre-malloc() memory. The function + * can be called at any time. The work-area will shrink when called before + * bsp_get_work_area(). malloc() is called to get memory when this function + * is called after bsp_get_work_area(). + */ +void *bsp_early_malloc(int size); + #ifdef __cplusplus } #endif diff --git a/c/src/lib/libbsp/sparc/leon2/Makefile.am b/c/src/lib/libbsp/sparc/leon2/Makefile.am index 9df3c7ded0..6e2697fb15 100644 --- a/c/src/lib/libbsp/sparc/leon2/Makefile.am +++ b/c/src/lib/libbsp/sparc/leon2/Makefile.am @@ -55,7 +55,8 @@ libbsp_a_SOURCES += ../../shared/bspclean.c ../../shared/bsplibc.c \ startup/bspstart.c ../../sparc/shared/bsppretaskinghook.c \ ../../sparc/shared/bspgetworkarea.c ../../shared/bootcard.c \ ../../shared/sbrk.c startup/setvec.c startup/spurious.c startup/bspidle.c \ - ../../shared/bspinit.c startup/bspdelay.c + ../../shared/bspinit.c startup/bspdelay.c \ + ../../sparc/shared/startup/early_malloc.c # ISR Handler libbsp_a_SOURCES += ../../sparc/shared/irq_asm.S # gnatsupp diff --git a/c/src/lib/libbsp/sparc/leon2/include/bsp.h b/c/src/lib/libbsp/sparc/leon2/include/bsp.h index 994f89bd8c..796290e915 100644 --- a/c/src/lib/libbsp/sparc/leon2/include/bsp.h +++ b/c/src/lib/libbsp/sparc/leon2/include/bsp.h @@ -15,8 +15,6 @@ * * ERC32 modifications of respective RTEMS file: COPYRIGHT (c) 1995. * European Space Agency. - * - * $Id$ */ #ifndef _BSP_H @@ -100,6 +98,13 @@ void BSP_fatal_return( void ); void bsp_spurious_initialize( void ); +/* Allocate 8-byte aligned non-freeable pre-malloc() memory. The function + * can be called at any time. The work-area will shrink when called before + * bsp_get_work_area(). malloc() is called to get memory when this function + * is called after bsp_get_work_area(). + */ +void *bsp_early_malloc(int size); + #ifdef __cplusplus } #endif diff --git a/c/src/lib/libbsp/sparc/leon3/Makefile.am b/c/src/lib/libbsp/sparc/leon3/Makefile.am index 8eae306644..dc24051b64 100644 --- a/c/src/lib/libbsp/sparc/leon3/Makefile.am +++ b/c/src/lib/libbsp/sparc/leon3/Makefile.am @@ -38,7 +38,7 @@ libbsp_a_SOURCES += ../../shared/bspclean.c ../../shared/bsplibc.c \ ../../sparc/shared/bsppretaskinghook.c ../../shared/bsppredriverhook.c \ ../../sparc/shared/bspgetworkarea.c ../../shared/sbrk.c startup/setvec.c \ startup/spurious.c startup/bspidle.S startup/bspdelay.c \ - ../../shared/bspinit.c + ../../shared/bspinit.c ../../sparc/shared/startup/early_malloc.c # ISR Handler libbsp_a_SOURCES += ../../sparc/shared/irq_asm.S diff --git a/c/src/lib/libbsp/sparc/leon3/include/bsp.h b/c/src/lib/libbsp/sparc/leon3/include/bsp.h index 421d850272..07a7412e16 100644 --- a/c/src/lib/libbsp/sparc/leon3/include/bsp.h +++ b/c/src/lib/libbsp/sparc/leon3/include/bsp.h @@ -15,8 +15,6 @@ * * ERC32 modifications of respective RTEMS file: COPYRIGHT (c) 1995. * European Space Agency. - * - * $Id$ */ #ifndef _BSP_H @@ -110,6 +108,13 @@ void BSP_fatal_return( void ); void bsp_spurious_initialize( void ); +/* Allocate 8-byte aligned non-freeable pre-malloc() memory. The function + * can be called at any time. The work-area will shrink when called before + * bsp_get_work_area(). malloc() is called to get memory when this function + * is called after bsp_get_work_area(). + */ +void *bsp_early_malloc(int size); + #ifdef __cplusplus } #endif diff --git a/c/src/lib/libbsp/sparc/shared/bspgetworkarea.c b/c/src/lib/libbsp/sparc/shared/bspgetworkarea.c index c6e1491d81..45d3d0ed87 100644 --- a/c/src/lib/libbsp/sparc/shared/bspgetworkarea.c +++ b/c/src/lib/libbsp/sparc/shared/bspgetworkarea.c @@ -8,8 +8,6 @@ * 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 */ @@ -22,6 +20,9 @@ /* 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 @@ -37,8 +38,11 @@ void bsp_get_work_area( /* must be identical to STACK_SIZE in start.S */ #define STACK_SIZE (16 * 1024) - *work_area_start = &end; - *work_area_size = (void *)rdb_start - (void *)&end - STACK_SIZE; + /* Early dynamic memory allocator is placed just above _end */ + *work_area_start = (void *)early_mem; + *work_area_size = (void *)rdb_start - (void *)early_mem - STACK_SIZE; + early_mem = ~0; /* Signal bsp_early_malloc not to be used anymore */ + *heap_start = BSP_BOOTCARD_HEAP_USES_WORK_AREA; *heap_size = BSP_BOOTCARD_HEAP_SIZE_DEFAULT; diff --git a/c/src/lib/libbsp/sparc/shared/startup/early_malloc.c b/c/src/lib/libbsp/sparc/shared/startup/early_malloc.c new file mode 100644 index 0000000000..1f968da206 --- /dev/null +++ b/c/src/lib/libbsp/sparc/shared/startup/early_malloc.c @@ -0,0 +1,47 @@ +/* + * Early dynamic memory allocation (not freeable) for BSP + * boot routines. Minimum alignment 8 bytes. Memory is + * allocated after _end, it will shrink the workspace. + * + * COPYRIGHT (c) 2011. + * Aeroflex Gaisler AB + * + * 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. + */ + +#include <bsp.h> +#include <stdlib.h> + +/* Tells us where to put the workspace in case remote debugger is present. */ +extern uint32_t rdb_start; + +/* Must be aligned to 8 */ +extern unsigned int early_mem; + +/* must be identical to STACK_SIZE in start.S */ +#define STACK_SIZE (16 * 1024) + +/* Allocate 8-byte aligned non-freeable pre-malloc() memory. The function + * can be called at any time. The work-area will shrink when called before + * bsp_get_work_area(). malloc() is called to get memory when this function + * is called after bsp_get_work_area(). + */ +void *bsp_early_malloc(int size) +{ + void *start; + + /* Not early anymore? */ + if (early_mem == ~0) + return malloc(size); + + size = (size + 7) & ~0x7; + if (rdb_start - STACK_SIZE - early_mem < size) + return NULL; + + start = (void *)early_mem; + early_mem += size; + + return start; +} |