From patchwork Mon Apr 22 20:27:21 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Goldschmidt X-Patchwork-Id: 1088885 X-Patchwork-Delegate: trini@ti.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=lists.denx.de (client-ip=81.169.180.215; helo=lists.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="M+hXkENm"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 44nyn63SJhz9s3Z for ; Tue, 23 Apr 2019 06:27:38 +1000 (AEST) Received: by lists.denx.de (Postfix, from userid 105) id 2E94EC21DB5; Mon, 22 Apr 2019 20:27:33 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on lists.denx.de X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM, KHOP_BIG_TO_CC, T_DKIM_INVALID autolearn=unavailable autolearn_force=no version=3.4.0 Received: from lists.denx.de (localhost [IPv6:::1]) by lists.denx.de (Postfix) with ESMTP id 21D56C21C2F; Mon, 22 Apr 2019 20:27:31 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id 49B64C21C2F; Mon, 22 Apr 2019 20:27:30 +0000 (UTC) Received: from mail-wm1-f65.google.com (mail-wm1-f65.google.com [209.85.128.65]) by lists.denx.de (Postfix) with ESMTPS id E197EC21C2C for ; Mon, 22 Apr 2019 20:27:29 +0000 (UTC) Received: by mail-wm1-f65.google.com with SMTP id j13so134829wmh.2 for ; Mon, 22 Apr 2019 13:27:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=ZlLYaltyP/+sKKzD9dlRoVxdmuZ8zsiQ8X2WAizjaT4=; b=M+hXkENmTJyF0VVyj0nSHp+tP9CPDApQx4Nr08t5q8weEyNeGOOujDVdZeGOWG+HwI RJeVldRLLmgI02bpdHq29oe7qOnS6PnFU07/7LeWSc5wxFHwfGNdk+E9x+XAWI5it//I LAhX7DBm6/gKCJf5snhRErzUb4UfnNEWyKJ4JiiRoL+OfaIb4lfMpNjl63LjmdUTG9Gp zA/lsf/FIRNaezLkBsriv3YItJCromVJforU/5PvVzBTlGBB4GeKWv4FRhdrbn8Udenk VwTizfw/r9SULUxB2ruO2yEfH7WLX7By7vChZ0y091raA2z9Zy7YUeQGNwIDxSoUmCnY 1n0w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=ZlLYaltyP/+sKKzD9dlRoVxdmuZ8zsiQ8X2WAizjaT4=; b=foV01nEleHF2lCwC7D1/RT1nG+XGiTWc1DCCZ8EFeJD0WyTo6NBQnlnFT3M7gSjK2W 7RE6o6+oSqQUal0OJ0HcMD153f8p5tx42excbC876nuMgsO++I9CIMpIoAHfYTwJOWIN aWsGt/RvauPFqF0BMWTuNlnVmbR3wR2dhWw47oRiyo0f+wOw3aKFWJ9IMBCgR/YdVyj+ Jcu0hfEp3tEWaXpMhGsdH/D5Sb1YMgCj1FJeQXbHaJui98B4T9KzHtmKKsX1vjSUq9C9 vv49waj8R9fLMqQyQ5R/tP9RP7X+TzcFfqADWL+7CThP1CbimqSvyVVXhn2DhXizi2wZ EYvA== X-Gm-Message-State: APjAAAXubsJ+qJdwLYwWWy+PyG5U2VcP8cM10P7AVq/vr7t31j6ylJup oFQLBSDdi/ldgu6Ztmin+nA= X-Google-Smtp-Source: APXvYqyzt/grcesfYKmqJXMDB2xWxZrYhEK2evLWtiAykTVo1JA2qq02waB/MNtG9MwtB+YJt+Mw2A== X-Received: by 2002:a1c:5f08:: with SMTP id t8mr18788wmb.65.1555964849486; Mon, 22 Apr 2019 13:27:29 -0700 (PDT) Received: from localhost.localdomain ([2a02:8071:6a3:700:4110:359:5d24:3425]) by smtp.gmail.com with ESMTPSA id z17sm14882572wmc.7.2019.04.22.13.27.27 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 22 Apr 2019 13:27:28 -0700 (PDT) From: Simon Goldschmidt To: Tom Rini Date: Mon, 22 Apr 2019 22:27:21 +0200 Message-Id: <20190422202721.15892-1-simon.k.r.goldschmidt@gmail.com> X-Mailer: git-send-email 2.19.1 MIME-Version: 1.0 Cc: Baruch Siach , Alexander Graf , Joe Hershberger , Thomas Petazzoni , Stefan Roese , Marek Vasut , Tien Fong Chee , Ryder Lee , Heinrich Schuchardt , Michal Simek , Otavio Salvador , Chris Packham , u-boot@lists.denx.de Subject: [U-Boot] [PATCH v2] spl: add overall SPL size check X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.18 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" 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 --- Changes in v2: - added missing tools/spl_size_limit.c Kconfig | 8 -------- Makefile | 2 +- common/spl/Kconfig | 36 ++++++++++++++++++++++++++++++++++++ tools/Makefile | 2 ++ tools/spl_size_limit.c | 30 ++++++++++++++++++++++++++++++ 5 files changed, 69 insertions(+), 9 deletions(-) create mode 100644 tools/spl_size_limit.c diff --git a/Kconfig b/Kconfig index ca31bcebde..7a5491bd67 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 ac375f396c..df674b0e96 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 diff --git a/common/spl/Kconfig b/common/spl/Kconfig index 206c24076d..24ddab3a48 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 d377d85f74..d3b950553f 100644 --- a/tools/Makefile +++ b/tools/Makefile @@ -199,6 +199,8 @@ hostprogs-$(CONFIG_RISCV) += prelink-riscv hostprogs-y += fdtgrep fdtgrep-objs += $(LIBFDT_OBJS) fdtgrep.o +hostprogs-y += spl_size_limit + 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 + * + * This tool helps to return the size available for SPL image during build + */ + +#include +#include + +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; +}