spl: Remove overwrite of relocated malloc limit
RFC 1/1 spl: Remove overwrite of relocated malloc limit
spl_init on some boards is called after stack and heap relocation, on some platforms spl_relocate_stack_gd is called to handle setting the limit to its value CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN when simple SPL malloc is enabled during relocation. spl_init should then not re-assign the old pre-relocation limit. Remove this.
Also add some debug statements that can help with find similar problems.
---
I'm not sure what the real fix should be, probably to clean-up all this spaghetti code relating to malloc, but for now without this patch we are stuck with the pre-relocation heap size and boot with simple malloc is not functional on AM335x-EVM and probably many other similar boards.
common/malloc_simple.c | 6 +++++- common/spl/spl.c | 1 - 2 files changed, 5 insertions(+), 2 deletions(-)
common/malloc_simple.c +5 -1
@@ -39,10 +39,14 @@ void *memalign_simple(size_t align, size_t bytes) addr =ALIGN (gd->malloc_base + gd->malloc_ptr, align); new_ptr = addr + bytes - gd->malloc_base; -if (new_ptr > gd->malloc_limit) +if (new_ptr > gd->malloc_limit) { +debug ("space exhausted\n" );return NULL ; + } + ptr =map_sysmem (addr, bytes); gd->malloc_ptr =ALIGN (new_ptr,sizeof (new_ptr)); +debug ("%lx\n" , (ulong )ptr);return ptr; }
common/spl/spl.c +0 -1
@@ -237,7 +237,6 @@ int spl_init(void)#ifdef CONFIG_MALLOC_F_ADDR gd->malloc_base =CONFIG_MALLOC_F_ADDR ;#endif - gd->malloc_limit =CONFIG_SYS_MALLOC_F_LEN ; gd->malloc_ptr =0 ;#endif if (CONFIG_IS_ENABLED (OF_CONTROL ) && !CONFIG_IS_ENABLED (OF_PLATDATA )) {
Signature · 1 line
2.11.0
Quoted 5 lines · Andrew F. Davis
spl_initon some boards is called after stack and heap relocation, on some platformsspl_relocate_stack_gdis called to handle setting the limit to its valueCONFIG_SPL_STACK_R_MALLOC_SIMPLE_LENwhen simple SPL malloc is enabled during relocation.spl_initshould then not re-assign the old pre-relocation limit. Remove this.
This will fail for the case if CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN and CONFIG_SYS_SPL_MALLOC_START is not defined. i.e. if someone jut use CONFIG_SYS_MALLOC_F for both board_init_f() and board_init_r().
Quoted 23 lines
Also add some debug statements that can help with find similar problems.
Signed-off-by Andrew F. Davis <[email protected]>---
I'm not sure what the real fix should be, probably to clean-up all this spaghetti code relating to malloc, but for now without this patch we are stuck with the pre-relocation heap size and boot with simple malloc is not functional on AM335x-EVM and probably many other similar boards.common/malloc_simple.c | 6 +++++- common/spl/spl.c | 1 - 2 files changed, 5 insertions(+), 2 deletions(-)common/malloc_simple.c +0
-0@@ -39,10 +39,14 @@ void *memalign_simple(size_t align, size_t bytes) addr =ALIGN (gd->malloc_base + gd->malloc_ptr, align);
common/malloc_simple.c void *memalign_simple(size_t align, size_t bytes) · line 49
Quoted 10 lines
common/malloc_simple.c +5
-1new_ptr = addr + bytes - gd->malloc_base; -if (new_ptr > gd->malloc_limit) +if (new_ptr > gd->malloc_limit) { +debug ("space exhausted\n" );return NULL ; + } + ptr =map_sysmem (addr, bytes); gd->malloc_ptr =ALIGN (new_ptr,sizeof (new_ptr)); +debug ("%lx\n" , (ulong )ptr);
This can be a separate patch.
common/spl/spl.c int spl_init(void) · line 240
Quoted 12 lines
common/malloc_simple.c +0
-0return ptr; }common/spl/spl.c +0
-1@@ -237,7 +237,6 @@ int spl_init(void)#ifdef CONFIG_MALLOC_F_ADDR gd->malloc_base =CONFIG_MALLOC_F_ADDR ;#endif - gd->malloc_limit =CONFIG_SYS_MALLOC_F_LEN ;
IMO this should be guarded with !CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN instead of removing it.
Thanks and regards,
Lokesh
Quoted 4 lines
common/spl/spl.c +0
-0gd->malloc_ptr =0 ;#endif if (CONFIG_IS_ENABLED (OF_CONTROL ) && !CONFIG_IS_ENABLED (OF_PLATDATA )) {