[PATCH 12 v2] SPARC BSPs: bsp_early_malloc() routine for startup memory allocation

Gedare Bloom gedare at rtems.org
Thu Mar 29 02:36:38 UTC 2012


Committed with a minor tweak to the shortlog.

On Wed, Mar 28, 2012 at 4:49 AM, Daniel Hellstrom <daniel at gaisler.com> wrote:
> If bsp_early_malloc() is called early during boot room will be
> allocated after BSS END. If the function is called after boot
> is will call malloc() instead. The returned memory is not freeable
> and always 8-byte aligned.
>
> If the bsp_early_malloc() isn't called the function is not
> dragged in and the workspace will be unmodified in size.
>
> Signed-off-by: Daniel Hellstrom <daniel at gaisler.com>
> ---
>  c/src/lib/libbsp/sparc/erc32/Makefile.am           |    2 +-
>  c/src/lib/libbsp/sparc/erc32/include/bsp.h         |    9 +++-
>  c/src/lib/libbsp/sparc/leon2/Makefile.am           |    3 +-
>  c/src/lib/libbsp/sparc/leon2/include/bsp.h         |    9 +++-
>  c/src/lib/libbsp/sparc/leon3/Makefile.am           |    2 +-
>  c/src/lib/libbsp/sparc/leon3/include/bsp.h         |    9 +++-
>  c/src/lib/libbsp/sparc/shared/bspgetworkarea.c     |   12 +++--
>  .../lib/libbsp/sparc/shared/startup/early_malloc.c |   47 ++++++++++++++++++++
>  8 files changed, 80 insertions(+), 13 deletions(-)
>  create mode 100644 c/src/lib/libbsp/sparc/shared/startup/early_malloc.c
>
> diff --git a/c/src/lib/libbsp/sparc/erc32/Makefile.am b/c/src/lib/libbsp/sparc/erc32/Makefile.am
> index cecfe14..e70310d 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 8655732..a88673e 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 9df3c7d..6e2697f 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 994f89b..796290e 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 8eae306..dc24051 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 421d850..07a7412 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 c6e1491..45d3d0e 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 0000000..1f968da
> --- /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;
> +}
> --
> 1.7.0.4
>




More information about the devel mailing list