From: Simon Goldschmidt <simon.k.r.goldschmidt@gmail.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH v3] spl: add overall SPL size check
Date: Fri, 24 May 2019 22:10:48 +0200 [thread overview]
Message-ID: <272edc6e-1a4a-e61a-4990-d38f02218343@gmail.com> (raw)
In-Reply-To: <20190524200704.29373-1-simon.k.r.goldschmidt@gmail.com>
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@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.
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@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;
> +}
>
next prev parent reply other threads:[~2019-05-24 20:10 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-05-24 20:07 [U-Boot] [PATCH v3] spl: add overall SPL size check Simon Goldschmidt
2019-05-24 20:10 ` Simon Goldschmidt [this message]
2019-05-26 11:09 ` Tom Rini
2019-05-27 13:47 ` Jean-Jacques Hiblot
2019-05-27 14:54 ` Tom Rini
2019-05-27 15:15 ` Simon Goldschmidt
2019-05-28 15:18 ` Jean-Jacques Hiblot
2019-05-28 15:51 ` Simon Goldschmidt
2019-05-27 16:35 ` Masahiro Yamada
2019-05-27 16:48 ` Tom Rini
2019-05-27 19:28 ` Simon Goldschmidt
2019-06-07 22:05 ` Tom Rini
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=272edc6e-1a4a-e61a-4990-d38f02218343@gmail.com \
--to=simon.k.r.goldschmidt@gmail.com \
--cc=u-boot@lists.denx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox