spl: add overall SPL size check

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@gmail.com>
This commit is contained in:
Simon Goldschmidt 2019-05-24 22:07:04 +02:00 committed by Tom Rini
parent dfe252b11e
commit 2577015dc5
5 changed files with 72 additions and 9 deletions

View File

@ -173,14 +173,6 @@ config TPL_SYS_MALLOC_F_LEN
particular needs this to operate, so that it can allocate the particular needs this to operate, so that it can allocate the
initial serial device and any others that are needed. 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 menuconfig EXPERT
bool "Configure standard U-Boot features (expert users)" bool "Configure standard U-Boot features (expert users)"
default y default y

View File

@ -797,7 +797,7 @@ BOARD_SIZE_CHECK =
endif endif
ifneq ($(CONFIG_SPL_SIZE_LIMIT),0) 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 else
SPL_SIZE_CHECK = SPL_SIZE_CHECK =
endif endif
@ -1782,6 +1782,7 @@ checkarmreloc: u-boot
envtools: scripts_basic $(version_h) $(timestamp_h) envtools: scripts_basic $(version_h) $(timestamp_h)
$(Q)$(MAKE) $(build)=tools/env $(Q)$(MAKE) $(build)=tools/env
tools-only: export TOOLS_ONLY=y
tools-only: scripts_basic $(version_h) $(timestamp_h) tools-only: scripts_basic $(version_h) $(timestamp_h)
$(Q)$(MAKE) $(build)=tools $(Q)$(MAKE) $(build)=tools

View File

@ -25,6 +25,42 @@ config SPL_FRAMEWORK
supports MMC, NAND and YMODEM and other methods loading of U-Boot supports MMC, NAND and YMODEM and other methods loading of U-Boot
and the Linux Kernel. If unsure, say Y. 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 config HANDOFF
bool "Pass hand-off information from SPL to U-Boot proper" bool "Pass hand-off information from SPL to U-Boot proper"
depends on BLOBLIST depends on BLOBLIST

View File

@ -199,6 +199,10 @@ hostprogs-$(CONFIG_RISCV) += prelink-riscv
hostprogs-y += fdtgrep hostprogs-y += fdtgrep
fdtgrep-objs += $(LIBFDT_OBJS) fdtgrep.o fdtgrep-objs += $(LIBFDT_OBJS) fdtgrep.o
ifneq ($(TOOLS_ONLY),y)
hostprogs-y += spl_size_limit
endif
hostprogs-$(CONFIG_MIPS) += mips-relocs hostprogs-$(CONFIG_MIPS) += mips-relocs
# We build some files with extra pedantic flags to try to minimize things # We build some files with extra pedantic flags to try to minimize things

30
tools/spl_size_limit.c Normal file
View File

@ -0,0 +1,30 @@
// SPDX-License-Identifier: GPL-2.0+
/*
* Copyright (c) 2019, Simon Goldschmidt <simon.k.r.goldschmidt@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;
}