[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