dm: Split the simple malloc() implementation into its own file
The simple malloc() implementation is used when memory is tight. It provides a simple buffer with an incrementing pointer. At present the implementation is inside dlmalloc. Move it into its own file so that it is easier to find. Rather than using relocation as a signal that the full malloc() is available, add a special GD_FLG_FULL_MALLOC_INIT flag. This signals that the simple malloc() should no longer be used. In some cases, such as SPL, even the code space used by the full malloc() is wasteful. Add a CONFIG_SYS_MALLOC_SIMPLE option to provide only the simple malloc. In this case the full malloc is not available at all. It saves about 1KB of code space and about 0.5KB of data on Thumb 2. Acked-by: Tom Rini <trini@ti.com> Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
@@ -251,6 +251,9 @@ obj-$(CONFIG_BOUNCE_BUFFER) += bouncebuf.o
|
||||
obj-y += console.o
|
||||
obj-$(CONFIG_CROS_EC) += cros_ec.o
|
||||
obj-y += dlmalloc.o
|
||||
ifdef CONFIG_SYS_MALLOC_F_LEN
|
||||
obj-y += malloc_simple.o
|
||||
endif
|
||||
obj-y += image.o
|
||||
obj-$(CONFIG_ANDROID_BOOT_IMAGE) += image-android.o
|
||||
obj-$(CONFIG_OF_LIBFDT) += image-fdt.o
|
||||
|
||||
@@ -99,7 +99,8 @@ static int initr_trace(void)
|
||||
|
||||
static int initr_reloc(void)
|
||||
{
|
||||
gd->flags |= GD_FLG_RELOC; /* tell others: relocation done */
|
||||
/* tell others: relocation done */
|
||||
gd->flags |= GD_FLG_RELOC | GD_FLG_FULL_MALLOC_INIT;
|
||||
bootstage_mark_name(BOOTSTAGE_ID_START_UBOOT_R, "board_init_r");
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -2184,17 +2184,8 @@ Void_t* mALLOc(bytes) size_t bytes;
|
||||
INTERNAL_SIZE_T nb;
|
||||
|
||||
#ifdef CONFIG_SYS_MALLOC_F_LEN
|
||||
if (gd && !(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;
|
||||
}
|
||||
if (gd && !(gd->flags & GD_FLG_FULL_MALLOC_INIT))
|
||||
return malloc_simple(bytes);
|
||||
#endif
|
||||
|
||||
/* check if mem_malloc_init() was run */
|
||||
@@ -2462,7 +2453,7 @@ void fREe(mem) Void_t* mem;
|
||||
|
||||
#ifdef CONFIG_SYS_MALLOC_F_LEN
|
||||
/* free() is a no-op - all the memory will be freed on relocation */
|
||||
if (!(gd->flags & GD_FLG_RELOC))
|
||||
if (!(gd->flags & GD_FLG_FULL_MALLOC_INIT))
|
||||
return;
|
||||
#endif
|
||||
|
||||
@@ -2618,7 +2609,7 @@ Void_t* rEALLOc(oldmem, bytes) Void_t* oldmem; size_t bytes;
|
||||
if (oldmem == NULL) return mALLOc(bytes);
|
||||
|
||||
#ifdef CONFIG_SYS_MALLOC_F_LEN
|
||||
if (!(gd->flags & GD_FLG_RELOC)) {
|
||||
if (!(gd->flags & GD_FLG_FULL_MALLOC_INIT)) {
|
||||
/* This is harder to support and should not be needed */
|
||||
panic("pre-reloc realloc() is not supported");
|
||||
}
|
||||
@@ -2970,7 +2961,7 @@ Void_t* cALLOc(n, elem_size) size_t n; size_t elem_size;
|
||||
else
|
||||
{
|
||||
#ifdef CONFIG_SYS_MALLOC_F_LEN
|
||||
if (!(gd->flags & GD_FLG_RELOC)) {
|
||||
if (!(gd->flags & GD_FLG_FULL_MALLOC_INIT)) {
|
||||
MALLOC_ZERO(mem, sz);
|
||||
return mem;
|
||||
}
|
||||
|
||||
39
common/malloc_simple.c
Normal file
39
common/malloc_simple.c
Normal file
@@ -0,0 +1,39 @@
|
||||
/*
|
||||
* Simple malloc implementation
|
||||
*
|
||||
* Copyright (c) 2014 Google, Inc
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <malloc.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
|
||||
void *malloc_simple(size_t bytes)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SYS_MALLOC_SIMPLE
|
||||
void *calloc(size_t nmemb, size_t elem_size)
|
||||
{
|
||||
size_t size = nmemb * elem_size;
|
||||
void *ptr;
|
||||
|
||||
ptr = malloc(size);
|
||||
memset(ptr, '\0', size);
|
||||
|
||||
return ptr;
|
||||
}
|
||||
#endif
|
||||
Reference in New Issue
Block a user