[U-Boot] [PATCH v3] spl: add overall SPL size check

Jean-Jacques Hiblot jjhiblot at ti.com
Mon May 27 13:47:13 UTC 2019


Simon,


On 24/05/2019 22:10, Simon Goldschmidt wrote:
> Am 24.05.2019 um 22:07 schrieb Simon Goldschmidt:
>> This adds a size check for SPL that can dynamically check generated
>> SPL binaries (including devicetree) for a size limit that ensures
>> this image plus global data, heap and stack fit in initial SRAM.
>>
>> Since some of these sizes are not available to make, a new host tool
>> 'spl_size_limit' is added that dumps the resulting maximum size for
>> an SPL binary to stdout. This tool is used in toplevel Makefile to
>> implement the size check on SPL binaries.
>>
>> Signed-off-by: Simon Goldschmidt <simon.k.r.goldschmidt at gmail.com>
>> ---
>>
>> Changes in v3:
>> - don't build this new tools for 'make tools-only'
>
> So this is how far I got.
>
> Tom, your idea with making this multi-config aware (U-Boot, SPL and 
> TPL) does not seem to work as 'tools' are only built once, not once 
> per U-Boot/SPL/TPL. So if we wanted to use this for TPL, too, that 
> would either mean create yet another tool or pass an option to this 
> new tool to differ between SPL and TPL.

If the trouble comes from GENERATED_GBL_DATA_SIZE, you could get its 
value by parsing lib/asm-offsets.s. all the other values could be 
extracted from {.,spl,tpl}/u-boot.cfg

If this flies, it could be done by a python script without the need to 
compile a program

JJ

>
> Regard,
> Simon
>
>>
>> Changes in v2:
>> - added missing tools/spl_size_limit.c
>>
>>   Kconfig                |  8 --------
>>   Makefile               |  3 ++-
>>   common/spl/Kconfig     | 36 ++++++++++++++++++++++++++++++++++++
>>   tools/Makefile         |  4 ++++
>>   tools/spl_size_limit.c | 30 ++++++++++++++++++++++++++++++
>>   5 files changed, 72 insertions(+), 9 deletions(-)
>>   create mode 100644 tools/spl_size_limit.c
>>
>> diff --git a/Kconfig b/Kconfig
>> index 1221d1af69..5f5c5ccfd6 100644
>> --- a/Kconfig
>> +++ b/Kconfig
>> @@ -172,14 +172,6 @@ config TPL_SYS_MALLOC_F_LEN
>>         particular needs this to operate, so that it can allocate the
>>         initial serial device and any others that are needed.
>>   -config SPL_SIZE_LIMIT
>> -    int "Maximum size of SPL image"
>> -    depends on SPL
>> -    default 0
>> -    help
>> -      Specifies the maximum length of the U-Boot SPL image.
>> -      If this value is zero, it is ignored.
>> -
>>   menuconfig EXPERT
>>       bool "Configure standard U-Boot features (expert users)"
>>       default y
>> diff --git a/Makefile b/Makefile
>> index 7d910b3682..ed7e12120f 100644
>> --- a/Makefile
>> +++ b/Makefile
>> @@ -797,7 +797,7 @@ BOARD_SIZE_CHECK =
>>   endif
>>     ifneq ($(CONFIG_SPL_SIZE_LIMIT),0)
>> -SPL_SIZE_CHECK = @$(call size_check,$@,$(CONFIG_SPL_SIZE_LIMIT))
>> +SPL_SIZE_CHECK = @$(call size_check,$@,$$(tools/spl_size_limit))
>>   else
>>   SPL_SIZE_CHECK =
>>   endif
>> @@ -1779,6 +1779,7 @@ checkarmreloc: u-boot
>>   envtools: scripts_basic $(version_h) $(timestamp_h)
>>       $(Q)$(MAKE) $(build)=tools/env
>>   +tools-only: export TOOLS_ONLY=y
>>   tools-only: scripts_basic $(version_h) $(timestamp_h)
>>       $(Q)$(MAKE) $(build)=tools
>>   diff --git a/common/spl/Kconfig b/common/spl/Kconfig
>> index c7cd34449a..6a98536f20 100644
>> --- a/common/spl/Kconfig
>> +++ b/common/spl/Kconfig
>> @@ -25,6 +25,42 @@ config SPL_FRAMEWORK
>>         supports MMC, NAND and YMODEM and other methods loading of 
>> U-Boot
>>         and the Linux Kernel.  If unsure, say Y.
>>   +config SPL_SIZE_LIMIT
>> +    hex "Maximum size of SPL image"
>> +    depends on SPL
>> +    default 0
>> +    help
>> +      Specifies the maximum length of the U-Boot SPL image.
>> +      If this value is zero, it is ignored.
>> +
>> +config SPL_SIZE_LIMIT_SUBTRACT_GD
>> +    bool "SPL image size check: provide space for global data"
>> +    depends on SPL_SIZE_LIMIT > 0
>> +    help
>> +      If enabled, aligned size of global data is reserved in
>> +      SPL_SIZE_LIMIT check to ensure such an image does not overflow 
>> SRAM
>> +      if SPL_SIZE_LIMIT describes the size of SRAM available for SPL 
>> when
>> +      pre-reloc global data is put into this SRAM, too.
>> +
>> +config SPL_SIZE_LIMIT_SUBTRACT_MALLOC
>> +    bool "SPL image size check: provide space for malloc() pool 
>> before relocation"
>> +    depends on SPL_SIZE_LIMIT > 0
>> +    help
>> +      If enabled, SPL_SYS_MALLOC_F_LEN is reserved in SPL_SIZE_LIMIT 
>> check
>> +      to ensure such an image does not overflow SRAM if SPL_SIZE_LIMIT
>> +      describes the size of SRAM available for SPL when pre-reloc 
>> malloc
>> +      pool is put into this SRAM, too.
>> +
>> +config SPL_SIZE_LIMIT_PROVIDE_STACK
>> +    hex "SPL image size check: provide stack space before relocation"
>> +    depends on SPL_SIZE_LIMIT > 0
>> +    default 0
>> +    help
>> +      If set, this size is reserved in SPL_SIZE_LIMIT check to 
>> ensure such
>> +      an image does not overflow SRAM if SPL_SIZE_LIMIT describes 
>> the size
>> +      of SRAM available for SPL when the stack required before 
>> reolcation
>> +      uses this SRAM, too.
>> +
>>   config HANDOFF
>>       bool "Pass hand-off information from SPL to U-Boot proper"
>>       depends on BLOBLIST
>> diff --git a/tools/Makefile b/tools/Makefile
>> index e2f572cae1..33e90a8025 100644
>> --- a/tools/Makefile
>> +++ b/tools/Makefile
>> @@ -199,6 +199,10 @@ hostprogs-$(CONFIG_RISCV) += prelink-riscv
>>   hostprogs-y += fdtgrep
>>   fdtgrep-objs += $(LIBFDT_OBJS) fdtgrep.o
>>   +ifneq ($(TOOLS_ONLY),y)
>> +hostprogs-y += spl_size_limit
>> +endif
>> +
>>   hostprogs-$(CONFIG_MIPS) += mips-relocs
>>     # We build some files with extra pedantic flags to try to 
>> minimize things
>> diff --git a/tools/spl_size_limit.c b/tools/spl_size_limit.c
>> new file mode 100644
>> index 0000000000..98ff491867
>> --- /dev/null
>> +++ b/tools/spl_size_limit.c
>> @@ -0,0 +1,30 @@
>> +// SPDX-License-Identifier: GPL-2.0+
>> +/*
>> + * Copyright (c) 2019, Simon Goldschmidt 
>> <simon.k.r.goldschmidt at gmail.com>
>> + *
>> + * This tool helps to return the size available for SPL image during 
>> build
>> + */
>> +
>> +#include <generated/autoconf.h>
>> +#include <generated/generic-asm-offsets.h>
>> +
>> +int main(int argc, char *argv[])
>> +{
>> +    int spl_size_limit = 0;
>> +
>> +#ifdef CONFIG_SPL_SIZE_LIMIT
>> +    spl_size_limit = CONFIG_SPL_SIZE_LIMIT;
>> +#ifdef CONFIG_SPL_SIZE_LIMIT_SUBTRACT_GD
>> +    spl_size_limit -= GENERATED_GBL_DATA_SIZE;
>> +#endif
>> +#ifdef CONFIG_SPL_SIZE_LIMIT_SUBTRACT_MALLOC
>> +    spl_size_limit -= CONFIG_SPL_SYS_MALLOC_F_LEN;
>> +#endif
>> +#ifdef CONFIG_SPL_SIZE_LIMIT_PROVIDE_STACK
>> +    spl_size_limit -= CONFIG_SPL_SIZE_LIMIT_PROVIDE_STACK;
>> +#endif
>> +#endif
>> +
>> +    printf("%d", spl_size_limit);
>> +    return 0;
>> +}
>>
>
>


More information about the U-Boot mailing list