[U-Boot] [PATCH] Makefile: ensure DTB doesn't overflow into initial stack

Simon Glass sjg at chromium.org
Wed Jan 10 23:04:21 UTC 2018


Hi Stephen,

On 9 January 2018 at 11:52, Stephen Warren <swarren at wwwdotorg.org> wrote:
>
> From: Stephen Warren <swarren at nvidia.com>
>
> With CONFIG_SYS_INIT_SP_BSS_OFFSET enabled, the initial (pre-relocation)
> stack is placed some distance after bss_start. The control DTB is appended
> to the U-Boot binary at bss_start. If the DTB is too large, or the SP BSS
> offset too small, then the initial stack could corrupt the DTB. Enhance
> the Makefile to check whether this is likely to occur.
>
> Signed-off-by: Stephen Warren <swarren at nvidia.com>
> ---
> This builds on top of my previous patch "ARMv8: Allow dynamic early stack
> pointer". However, since all the logic is conditional and only activated
> if CONFIG_SYS_INIT_SP_BSS_OFFSET is defined, it can be applied with or
> without that other patch. It'd make sense to apply it afterwards and in
> the same branch though, or the change won't make a lot of sense to someone
> reading history in order.
>
>  Makefile | 31 +++++++++++++++++++++++++++++++
>  1 file changed, 31 insertions(+)
>
> diff --git a/Makefile b/Makefile
> index d8f419bcd900..52cd6ea72161 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -811,6 +811,10 @@ ifneq ($(CONFIG_BUILD_TARGET),)
>  ALL-y += $(CONFIG_BUILD_TARGET:"%"=%)
>  endif
>
> +ifneq ($(CONFIG_SYS_INIT_SP_BSS_OFFSET),)
> +ALL-y += init_sp_bss_offset_check
> +endif
> +
>  LDFLAGS_u-boot += $(LDFLAGS_FINAL)
>
>  # Avoid 'Not enough room for program headers' error on binutils 2.28 onwards.
> @@ -939,6 +943,33 @@ binary_size_check: u-boot-nodtb.bin FORCE
>                 fi \
>         fi
>
> +ifneq ($(CONFIG_SYS_INIT_SP_BSS_OFFSET),)
> +ifneq ($(CONFIG_SYS_MALLOC_F_LEN),)
> +subtract_sys_malloc_f_len = space=$$(($${space} - $(CONFIG_SYS_MALLOC_F_LEN)))
> +else
> +subtract_sys_malloc_f_len = true
> +endif
> +# The 1/4 margin below is somewhat arbitrary. The likely initial SP usage is
> +# so low that the DTB could probably use 90%+ of the available space, for
> +# current values of CONFIG_SYS_INIT_SP_BSS_OFFSET at least. However, let's be
> +# safe for now and tweak this later if space becomes tight.
> +# A rejected alternative would be to check that some absolute minimum stack
> +# space was available. However, since CONFIG_SYS_INIT_SP_BSS_OFFSET is
> +# deliberately build-specific, to take account of build-to-build stack usage
> +# differences due to different feature sets, there is no common absolute value
> +# to check against.
> +init_sp_bss_offset_check: u-boot.dtb FORCE
> +       @dtb_size=$(shell wc -c u-boot.dtb | awk '{print $$1}') ; \
> +       space=$(CONFIG_SYS_INIT_SP_BSS_OFFSET) ; \
> +       $(subtract_sys_malloc_f_len) ; \
> +       quarter_space=$$(($${space} / 4)) ; \
> +       if [ $${dtb_size} -gt $${quarter_space} ]; then \
> +               echo "u-boot.dtb is larger than 1 quarter of " >&2 ; \
> +               echo "(CONFIG_SYS_INIT_SP_BSS_OFFSET - CONFIG_SYS_MALLOC_F_LEN)" >&2 ; \
> +               exit 1 ; \
> +       fi
> +endif
> +
>  u-boot-nodtb.bin: u-boot FORCE
>         $(call if_changed,objcopy)
>         $(call DO_STATIC_RELA,$<,$@,$(CONFIG_SYS_TEXT_BASE))
> --
> 2.15.1
>

Looking at the code here I wonder if it would be easy to check this in binman?

Regards,
Simon


More information about the U-Boot mailing list