[U-Boot] [PATCH v2 4/9] Add a simple malloc() implementation for pre-relocation
Graeme Russ
gruss at tss-engineering.com
Tue Jul 15 05:08:55 CEST 2014
Hi Simon,
Nice to see this being tackled after all the DM discussions I got
involved
in a long time ago (in a galaxy far far away...)
I think we can save a few bytes and simplify the code if we define only
the
base address and current pointer in global_data.h
#ifdef CONFIG_SYS_MALLOC_F_LEN
unsigned long malloc_base; /* limit address */
unsigned long malloc_ptr; /* current address */
#endif
On 2014-07-08 09:19, Simon Glass wrote:
> +static int initf_malloc(void)
> +{
> +#ifdef CONFIG_SYS_MALLOC_F_LEN
> + assert(gd->malloc_base); /* Set up by crt0.S */
> + gd->malloc_limit = gd->malloc_base + CONFIG_SYS_MALLOC_F_LEN;
> + gd->malloc_ptr = 0;
> +#endif
#ifdef CONFIG_SYS_MALLOC_F_LEN
assert(gd->malloc_base); /* Set up by crt0.S */
gd->malloc_ptr= gd->malloc_base;
#endif
> +
> + return 0;
> +}
> +
> diff --git a/common/board_r.c b/common/board_r.c
> index 602a239..86424a0 100644
> --- a/common/board_r.c
> +++ b/common/board_r.c
> @@ -259,6 +259,10 @@ static int initr_malloc(void)
> {
> ulong malloc_start;
>
> +#ifdef CONFIG_SYS_MALLOC_F_LEN
> + debug("Pre-reloc malloc() used %#lx bytes (%ld KB)\n",
> gd->malloc_ptr,
> + gd->malloc_ptr / 1024);
> +#endif
Use (gd->malloc_ptr - gd->malloc_base) to calculate the size
> +#ifdef CONFIG_SYS_MALLOC_F_LEN
> + if (!(gd->flags & GD_FLG_RELOC)) {
> + ulong new_ptr;
> + void *ptr;
> +
> + new_ptr = gd->malloc_ptr + bytes;
> + if (new_ptr > gd->malloc_limit)
> + panic("Out of pre-reloc memory");
> + ptr = map_sysmem(gd->malloc_base + gd->malloc_ptr, bytes);
> + gd->malloc_ptr = ALIGN(new_ptr, sizeof(new_ptr));
> + return ptr;
> + }
> +#endif
> +
#ifdef CONFIG_SYS_MALLOC_F_LEN
if (!(gd->flags & GD_FLG_RELOC)) {
ulong curr_ptr;
curr_ptr = gd->malloc_ptr;
gd->malloc_ptr = ALIGN(gd->malloc_ptr + bytes,
sizeof(gd->malloc_ptr));
if (gd->malloc_ptr >= (gd->malloc_base + CONFIG_SYS_MALLOC_F_LEN))
panic("Out of pre-reloc memory");
return map_sysmem(curr_ptr, bytes);
#endif
Regards,
Graeme
More information about the U-Boot
mailing list