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:
		
							parent
							
								
									dfe252b11e
								
							
						
					
					
						commit
						2577015dc5
					
				
							
								
								
									
										8
									
								
								Kconfig
								
								
								
								
							
							
						
						
									
										8
									
								
								Kconfig
								
								
								
								
							|  | @ -173,14 +173,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 | ||||
|  |  | |||
							
								
								
									
										3
									
								
								Makefile
								
								
								
								
							
							
						
						
									
										3
									
								
								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 | ||||
|  | @ -1782,6 +1782,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 | ||||
| 
 | ||||
|  |  | |||
|  | @ -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 | ||||
|  |  | |||
|  | @ -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
 | ||||
|  |  | |||
|  | @ -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; | ||||
| } | ||||
		Loading…
	
		Reference in New Issue