Signed-off-by: Krzysztof Hałasa <khc@xxxxxxxxx> --- a/arch/arm/cpu/start.c +++ b/arch/arm/cpu/start.c @@ -58,7 +58,6 @@ static noinline __noreturn void __start(uint32_t membase, uint32_t memsize, endmem -= STACK_SIZE; /* Stack */ if (IS_ENABLED(CONFIG_MMU_EARLY)) { - endmem &= ~0x3fff; endmem -= SZ_16K; /* ttb */ @@ -66,6 +65,9 @@ static noinline __noreturn void __start(uint32_t membase, uint32_t memsize, mmu_early_enable(membase, memsize, endmem); } +#ifdef CONFIG_MEMORY_LAYOUT_ALTERNATE + malloc_end = endmem; +#else if ((unsigned long)_text > membase + memsize || (unsigned long)_text < membase) /* @@ -76,15 +78,21 @@ static noinline __noreturn void __start(uint32_t membase, uint32_t memsize, malloc_end = endmem; else malloc_end = (unsigned long)_text; +#endif /* * Maximum malloc space is the Kconfig value if given * or 64MB. */ if (MALLOC_SIZE > 0) { - malloc_start = malloc_end - MALLOC_SIZE; - if (malloc_start < membase) + if (malloc_end > membase + MALLOC_SIZE) + malloc_start = malloc_end - MALLOC_SIZE; + else malloc_start = membase; + if (malloc_start < (unsigned long)_end && + malloc_end > (unsigned long)_text) + /* malloc area follows text */ + malloc_start = (unsigned long)_end; } else { malloc_start = malloc_end - (malloc_end - membase) / 2; if (malloc_end - malloc_start > SZ_64M) --- a/common/Kconfig +++ b/common/Kconfig @@ -161,7 +161,7 @@ choice config MEMORY_LAYOUT_DEFAULT bool "use default memory layout" help - select this option to use bareboxs standard memory layout: + select this option to use barebox's standard memory layout: stack ----- @@ -169,6 +169,17 @@ config MEMORY_LAYOUT_DEFAULT ----- TEXT_BASE +config MEMORY_LAYOUT_ALTERNATE + bool "use alternate memory layout" + help + select this option to use barebox's alternate memory layout: + + TEXT_BASE + ----- + malloc heap + ----- + stack + config MEMORY_LAYOUT_FIXED bool "manually assign a memory layout" help _______________________________________________ barebox mailing list barebox@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/barebox