[U-Boot] Problem with initialize in mmc_initialize in mmc.c

Faiz Abbas faiz_abbas at ti.com
Mon Oct 30 14:07:15 UTC 2017


Hi,

The variable *initialized* in mmc_initialize() is declared as static and
initialised to 0 in the following commit. This makes the compiler put it
in the .bss section of the image.

commit 1b26bab12e85e8b0d382d6775e40d14445249574
Author: Daniel Kochmański <dkochmanski at turtle-solutions.eu>
Date:   Fri May 29 16:55:43 2015 +0200

    mmc: Protect `mmc_initialize` from initialising mmc multiple times

    `mmc_initialize` might be called multiple times leading to the
mmc-controllers being initialised twice, and initialising the
`mmc_devices` list head twice which may lead to memory leaks.

    Signed-off-by: Daniel Kochmański <dkochmanski at turtle-solutions.eu>
    CC: Roy Spliet <r.spliet at ultimaker.com>
    Cc: Ian Campbell <ijc at hellion.org.uk>
    CC: Pantelis Antoniou <panto at antoniou-consulting.com>
    Acked-by: Hans de Goede <hdegoede at redhat.com>
    Signed-off-by: Hans de Goede <hdegoede at redhat.com>

diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c
index da47037..f12546a 100644
--- a/drivers/mmc/mmc.c
+++ b/drivers/mmc/mmc.c
@@ -1762,6 +1762,11 @@ static void do_preinit(void)

 int mmc_initialize(bd_t *bis)
 {
+       static int initialized = 0;
+       if (initialized)        /* Avoid initializing mmc multiple times */
+               return 0;
+       initialized = 1;
+
        INIT_LIST_HEAD (&mmc_devices);
        cur_dev_num = 0;


.bss should not be accessed in u-boot before relocation because it
overlaps with fdt and writing to variables in .bss can corrupt the fdt.
MMC can be probed before relocation if it contains the u-boot
environment. Therefore, I tried to move this variable to the .data
section by

static int initialized __attribute__((section(".data")));

When *initialized* was a part of .bss it was getting re-initilized to 0
as a part of relocation. Therefore, mmc was getting probed again
successfully after relocation with new addresses for mmc devices.

Now when *initialized* is not a part of .bss, it holds its value across
relocation and a second call to mmc_initialize() returns without doing
anything. However, the *mmc_devices* list containing pointers to the
older locations of mmc devices is not refreshed and thus mmc devices
fail to enumerate.

So *initialized* is a problem whether it is in .data or .bss.
I am not sure how to fix this. Any help is appreciated.

Thanks,
Faiz


More information about the U-Boot mailing list