[U-Boot] [PATCH v2 1/14] nand: sunxi: Fix modulo by zero error

Boris Brezillon boris.brezillon at free-electrons.com
Tue Nov 22 13:43:20 CET 2016


On Tue, 22 Nov 2016 13:38:31 +0100
Maxime Ripard <maxime.ripard at free-electrons.com> wrote:

> When trying to autodetect the ECC and randomization configurations, the
> driver starts with a randomization disabled and no seeds.
> 
> In this case, the number of seeds is obviously 0, and the randomize boolean
> is set to false.
> 
> However, the logic that retrieves the seed for a given page offset will
> blindly use the number of seeds, without testing if the randomization is
> enabled, basically doing a modulo by 0.
> 
> As it turns out, the libgcc in the common toolchain returns 0 here, which
> was our expected value in such a case, and why we would not detect it.
> However, U-Boot's libgcc will for some reason return from the function
> instead, resulting in an error to load the U-Boot binary in the SPL.
> 
> Signed-off-by: Maxime Ripard <maxime.ripard at free-electrons.com>

Acked-by: Boris Brezillon <boris.brezillon at free-electrons.com>

> ---
>  drivers/mtd/nand/sunxi_nand_spl.c | 7 ++++---
>  1 file changed, 4 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/mtd/nand/sunxi_nand_spl.c b/drivers/mtd/nand/sunxi_nand_spl.c
> index 1ef7366d4c42..eed4472bdc34 100644
> --- a/drivers/mtd/nand/sunxi_nand_spl.c
> +++ b/drivers/mtd/nand/sunxi_nand_spl.c
> @@ -245,7 +245,7 @@ static int nand_read_page(const struct nfc_config *conf, u32 offs,
>  {
>  	dma_addr_t dst = (dma_addr_t)dest;
>  	int nsectors = len / conf->ecc_size;
> -	u16 rand_seed;
> +	u16 rand_seed = 0;
>  	u32 val;
>  	int page;
>  
> @@ -258,8 +258,9 @@ static int nand_read_page(const struct nfc_config *conf, u32 offs,
>  	/* clear ecc status */
>  	writel(0, SUNXI_NFC_BASE + NFC_ECC_ST);
>  
> -	/* Choose correct seed */
> -	rand_seed = random_seed[page % conf->nseeds];
> +	/* Choose correct seed if randomized */
> +	if (conf->randomize)
> +		rand_seed = random_seed[page % conf->nseeds];
>  
>  	writel((rand_seed << 16) | (conf->ecc_strength << 12) |
>  		(conf->randomize ? NFC_ECC_RANDOM_EN : 0) |



More information about the U-Boot mailing list