[PATCH] common/board_f: init malloc earlier

Caleb Connolly caleb.connolly at linaro.org
Tue Nov 26 13:22:13 CET 2024


Hi Simon,

On 26/11/2024 01:32, Simon Glass wrote:
> Hi Caleb,
> 
> On Sun, 24 Nov 2024 at 11:38, Caleb Connolly <caleb.connolly at linaro.org> wrote:
>>
>> Currently the early malloc initialisation is done partially in
>> board_init_f_init_reserve() (on arm64 at least), which configures
>> gd->malloc_base. But it isn't actually usable until initf_malloc() is
>> called which doesn't happen until after fdtdec_setup().
>>
>> This causes problems in a few scenarios:
>>
>> 1. when using MULTI_DTB_FIT as this needs a working malloc (especially
>>    for compressed FIT).
> 
> Hmmm, how does this work today?

I honestly have no idea, I assume boards that make use of it do some
custom board_f.
> 
>> 2. Some platforms may need to allocate memory as part of memory map
>>    initialisation (e.g. Qualcomm will need this to parse the memory map
>>    from SMEM).
> 
> That really needs to be tidied up. When does this fixup need to be
> done? I imagine it is somewhere prior to setup_dest_addr() ? Perhaps

It's necessary in order to figure out gd->ram_base/ram_size. We do it in
board_fdt_blob_setup() so that we can support another use-case where
U-Boot has an internal FDT (which it should use) but the memory layout
is provided via an external FDT which is unavailable (although this
usecase isn't enabled upstream yet).

> we could introduce an event to do 'memory map' stuff?

We could, but considering that on most platforms the pre-relocation
malloc is fixed at build time and at a known location relative to U-Boot
there is no reason for us to arbitrary decide that some codepaths at the
start of board_f aren't allowed to use malloc().

Just moving the malloc initialization earlier ensures malloc() is
consistently available and greatly simplifies things.

fwiw, I had another variation of this patch which dropped initf_malloc()
entirely and just set up gd->malloc_limit/malloc_ptr in
board_init_f_init_reserve() since that's where we set malloc_base
anyways. But after digging some more there seem to be quite a few other
entrypoints into U-Boot that don't go through
board_init_f_init_reserve() (e.g. sandbox, EFI app) and it seemed more
error prone to duplicate the implementation there.

Kind regards

> 
> Regards,
> Simon
> 
> 
>>
>> Move the initf_malloc() call earlier so that malloc is available during
>> fdtdec_setup().
>>
>> Signed-off-by: Caleb Connolly <caleb.connolly at linaro.org>
>> ---
>>  common/board_f.c | 2 +-
>>  1 file changed, 1 insertion(+), 1 deletion(-)
>>
>> diff --git a/common/board_f.c b/common/board_f.c
>> index 98dc2591e1d0..bddfa6b992b9 100644
>> --- a/common/board_f.c
>> +++ b/common/board_f.c
>> @@ -867,15 +867,15 @@ static int initf_upl(void)
>>  }
>>
>>  static const init_fnc_t init_sequence_f[] = {
>>         setup_mon_len,
>> +       initf_malloc,
>>  #ifdef CONFIG_OF_CONTROL
>>         fdtdec_setup,
>>  #endif
>>  #ifdef CONFIG_TRACE_EARLY
>>         trace_early_init,
>>  #endif
>> -       initf_malloc,
>>         initf_upl,
>>         log_init,
>>         initf_bootstage,        /* uses its own timer, so does not need DM */
>>         event_init,
>> --
>> 2.47.0
>>

-- 
// Caleb (they/them)



More information about the U-Boot mailing list