[U-Boot] [PATCH] malloc: Use malloc simple before malloc is fully initialized in memalign()
Ley Foon Tan
lftan.linux at gmail.com
Fri May 25 03:24:08 UTC 2018
On Thu, May 24, 2018 at 12:33 AM, Simon Glass <sjg at chromium.org> wrote:
> Hi,
>
> On 23 May 2018 at 00:32, Ley Foon Tan <lftan.linux at gmail.com> wrote:
>> On Sat, May 19, 2018 at 10:37 PM, Simon Glass <sjg at chromium.org> wrote:
>>> Hi Ley,
>>>
>>> On 18 May 2018 at 04:03, Ley Foon Tan <ley.foon.tan at intel.com> wrote:
>>>> Follow implementation in mALLOc(). Check GD_FLG_FULL_MALLOC_INIT flag and use
>>>> malloc_simple if GD_FLG_FULL_MALLOC_INIT is unset. Adjust the malloc bytes
>>>> to align with the requested alignment.
>>>>
>>>> The original memalign() function will access mchunkptr struct to adjust the
>>>> alignment if there is misalignment happen, but mchunkptr struct is not being
>>>> initialized before full malloc is initialized. This cause the system crash.
>>>>
>>>> Signed-off-by: Ley Foon Tan <ley.foon.tan at intel.com>
>>>> ---
>>>> common/dlmalloc.c | 7 +++++++
>>>> 1 files changed, 7 insertions(+), 0 deletions(-)
>>>>
>>>> diff --git a/common/dlmalloc.c b/common/dlmalloc.c
>>>> index b395eef..edaad29 100644
>>>> --- a/common/dlmalloc.c
>>>> +++ b/common/dlmalloc.c
>>>> @@ -1891,6 +1891,13 @@ Void_t* mEMALIGn(alignment, bytes) size_t alignment; size_t bytes;
>>>>
>>>> if ((long)bytes < 0) return NULL;
>>>>
>>>> +#if CONFIG_VAL(SYS_MALLOC_F_LEN)
>>>
>>> How about:
>>>
>>> if (IS_ENABLED(CONFIG_SYS_MALLOC_F))
>>
>> I think this is the reason it uses #if CONFIG_VAL(SYS_MALLOC_F_LEN),
>> same for malloc().
>>
>> "spl: make SPL and normal u-boot stage use independent SYS_MALLOC_F_LEN"
>>
>> http://git.denx.de/?p=u-boot.git;a=commit;h=f1896c45cb2f7d8dbed27e784a6459a129fc0762
>
> So how about
>
> if (CONFIG_IS_ENABLED(SYS_MALLOC_F_LEN)
>
> Or you could use #if if you need to
Tested both #if (CONFIG_IS_ENABLED(SYS_MALLOC_F_LEN)) and if
(CONFIG_IS_ENABLED(SYS_MALLOC_F_LEN)), both are not working.
It will not go into this code.
>
> To me it seems better to use the setting itself (i.e. whether the
> pre-reloc malloc() is enabled) rather than one of its parameters (the
> size of the region).
>
>>
>>
>>>
>>> ?
>>>
>>>> + if (!(gd->flags & GD_FLG_FULL_MALLOC_INIT)) {
>>>> + nb = roundup(bytes, alignment);
>>>> + return malloc_simple(nb);
>>>> + }
>>>> +#endif
>>>> +
>>>> /* If need less alignment than we give anyway, just relay to malloc */
>>>>
>>>> if (alignment <= MALLOC_ALIGNMENT) return mALLOc(bytes);
>>>> --
>>>> 1.7.1
> Regards,
> Simon
Regards
Ley Foon
More information about the U-Boot
mailing list