[U-Boot] [PATCH v2] sunxi: Increase SPL header size to 64 bytes to avoid code corruption

Hans de Goede hdegoede at redhat.com
Sun May 15 12:04:34 CEST 2016


Hi,

On 14-05-16 03:13, Siarhei Siamashka wrote:
> The current SPL header, created by the 'mksunxiboot' tool, has size
> 32 bytes. But the code in the boot ROM stores the information about
> the boot media at the offset 0x28 before passing control to the SPL.
> For example, when booting from the SD card, the magic number written
> by the boot ROM is 0. And when booting from the SPI flash, the magic
> number is 3. NAND and eMMC probably have their own special magic
> numbers too.
>
> Currently the corrupted byte is a part of one of the instructions in
> the reset vectors table:
>
>     b     reset
>     ldr   pc, _undefined_instruction
>     ldr   pc, _software_interrupt      <- Corruption happens here
>     ldr   pc, _prefetch_abort
>     ldr   pc, _data_abort
>     ldr   pc, _not_used
>     ldr   pc, _irq
>     ldr   pc, _fiq
>
> In practice this does not cause any visible problems, but it's still
> better to fix it. As a bonus, the reported boot media type can be
> later used in the 'spl_boot_device' function, but this is out of
> the scope of this patch.
>
> Signed-off-by: Siarhei Siamashka <siarhei.siamashka at gmail.com>

Thanks, looks good to me applied to:

http://git.denx.de/?p=u-boot/u-boot-sunxi.git;a=shortlog;h=refs/heads/next

This will be part of my first pull-req for u-boot v2016.07.

Regards,

Hans



> ---
>
> Changes in v2:
>  - Increase the header size to 64 bytes instead of 48 bytes in order
>    to satisfy the VBAR alignment requirements.
>
>  arch/arm/include/asm/arch-sunxi/spl.h |  8 +++++++-
>  include/configs/sunxi-common.h        | 12 ++++++------
>  2 files changed, 13 insertions(+), 7 deletions(-)
>
> diff --git a/arch/arm/include/asm/arch-sunxi/spl.h b/arch/arm/include/asm/arch-sunxi/spl.h
> index ca9a4f9..a0f33b0 100644
> --- a/arch/arm/include/asm/arch-sunxi/spl.h
> +++ b/arch/arm/include/asm/arch-sunxi/spl.h
> @@ -18,6 +18,10 @@
>  #define SPL_ADDR		0x0
>  #endif
>
> +/* The low 8-bits of the 'boot_media' field in the SPL header */
> +#define SUNXI_BOOTED_FROM_MMC0	0
> +#define SUNXI_BOOTED_FROM_SPI	3
> +
>  /* boot head definition from sun4i boot code */
>  struct boot_file_head {
>  	uint32_t b_instruction;	/* one intruction jumping to real code */
> @@ -45,7 +49,9 @@ struct boot_file_head {
>  		uint8_t spl_signature[4];
>  	};
>  	uint32_t fel_script_address;
> -	uint32_t reserved;		/* padding, align to 32 bytes */
> +	uint32_t reserved1[3];
> +	uint32_t boot_media;		/* written here by the boot ROM */
> +	uint32_t reserved2[5];		/* padding, align to 64 bytes */
>  };
>
>  #define is_boot0_magic(addr)	(memcmp((void *)addr, BOOT0_MAGIC, 8) == 0)
> diff --git a/include/configs/sunxi-common.h b/include/configs/sunxi-common.h
> index 2406115..e2ee908 100644
> --- a/include/configs/sunxi-common.h
> +++ b/include/configs/sunxi-common.h
> @@ -189,14 +189,14 @@
>  #define CONFIG_SPL_BOARD_LOAD_IMAGE
>
>  #if defined(CONFIG_MACH_SUN9I)
> -#define CONFIG_SPL_TEXT_BASE		0x10020		/* sram start+header */
> -#define CONFIG_SPL_MAX_SIZE		0x5fe0		/* ? KiB on sun9i */
> +#define CONFIG_SPL_TEXT_BASE		0x10040		/* sram start+header */
> +#define CONFIG_SPL_MAX_SIZE		0x5fc0		/* ? KiB on sun9i */
>  #elif defined(CONFIG_MACH_SUN50I)
> -#define CONFIG_SPL_TEXT_BASE		0x10020		/* sram start+header */
> -#define CONFIG_SPL_MAX_SIZE		0x7fe0		/* 32 KiB on sun50i */
> +#define CONFIG_SPL_TEXT_BASE		0x10040		/* sram start+header */
> +#define CONFIG_SPL_MAX_SIZE		0x7fc0		/* 32 KiB on sun50i */
>  #else
> -#define CONFIG_SPL_TEXT_BASE		0x20		/* sram start+header */
> -#define CONFIG_SPL_MAX_SIZE		0x5fe0		/* 24KB on sun4i/sun7i */
> +#define CONFIG_SPL_TEXT_BASE		0x40		/* sram start+header */
> +#define CONFIG_SPL_MAX_SIZE		0x5fc0		/* 24KB on sun4i/sun7i */
>  #endif
>
>  #define CONFIG_SPL_LIBDISK_SUPPORT
>


More information about the U-Boot mailing list