From patchwork Wed Feb 9 19:02:35 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alper Nebi Yasak X-Patchwork-Id: 1590691 X-Patchwork-Delegate: sjg@chromium.org Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20210112 header.b=dLJLX0+L; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=85.214.62.61; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by bilbo.ozlabs.org (Postfix) with ESMTPS id 4Jv8Qs2L4hz9sCD for ; Thu, 10 Feb 2022 06:03:01 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 7F4B183E65; Wed, 9 Feb 2022 20:02:55 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="dLJLX0+L"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 3D9CB81277; Wed, 9 Feb 2022 20:02:54 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,SPF_HELO_NONE, SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.2 Received: from mail-ej1-x632.google.com (mail-ej1-x632.google.com [IPv6:2a00:1450:4864:20::632]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 5725183E65 for ; Wed, 9 Feb 2022 20:02:50 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=alpernebiyasak@gmail.com Received: by mail-ej1-x632.google.com with SMTP id j14so10048162ejy.6 for ; Wed, 09 Feb 2022 11:02:50 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=1QMGjG5WLyPrREvQc5B8omsmwiEkyqz2Xt8dXXTA/Lo=; b=dLJLX0+LC7mT93Dp6XpNtXQWiwIT0K5rHKgOLDUVQs8//LS8ihvnpb/C1MzYOsseND nMLxKuCosKSpsVZ0/Q4XIGfbkcX0ee9iFczLZP3oWy++QXJ6hn91wEMrJg3ozK+UKcKs BQywD7l5T7ncDV0vbrV59pz8c0G2zDuWNeC5mi90ME6fxVdxwxe9dNnY1C0DQ4yPcJCZ LEhpc+ov/5jfkfuOKjxmiJcjl6eVjtsgf47vHOCBUwykJM90iNmQ8xPM1VIBgfmuvEx+ jMYWonFJaecH4q/yA/c+Q9DQiwCo6kHBvO5PwX9F97s9je6XzQC3Px/nxOuO/bApS6n/ EWfQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=1QMGjG5WLyPrREvQc5B8omsmwiEkyqz2Xt8dXXTA/Lo=; b=JDjE+eoHFQAkAuAJGecCDPZS4rfKjXvG6eSl+UmhKEFTsKLYyj2F+3Y3Iw8LFGvmA+ MN0X4YtozoZNyWNvsP0cZfree0g11owglnMl8nuuGz6yUCzFy5ixGmNvxWOXFd/k0WiK 86tYJYG9YviFLNdWQqewlrwQTS3SAkaAObeGnhFkwCK2zp66wGE4xoAvlzTv76zvCShj 3NmhrSQU/iFGUzfS+7ZLN2g/LbNvLcc8vK5r5SvDgZYHZanU5yZDWFZbZrSDI12DiWvU cftaOW2DHudGBjJmA+3WGGtCDnKegALbXRnjcwHW10DS6zPNfHU9WM+uzaZU+yqu+PdB jB0A== X-Gm-Message-State: AOAM531b2iPv/RVAatSy6pPzjktlSOC5yWm3xqUk38nYzIOwD/uf8rl2 jBF8xLzZNNvgzV/CRe3abe0Fx7MtQTE= X-Google-Smtp-Source: ABdhPJyW4NOBfIBwnOqshaPwZaN7AmwUDA2qHh723ko1kgMbxnQJI5nGyQcy34ZE4HLlH+K4cpdfOw== X-Received: by 2002:a17:907:d13:: with SMTP id gn19mr3247963ejc.252.1644433369804; Wed, 09 Feb 2022 11:02:49 -0800 (PST) Received: from localhost.localdomain ([178.233.26.119]) by smtp.gmail.com with ESMTPSA id ce2sm4467079ejb.9.2022.02.09.11.02.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 09 Feb 2022 11:02:49 -0800 (PST) From: Alper Nebi Yasak To: u-boot@lists.denx.de Cc: Heiko Thiery , Jan Kiszka , Simon Glass , Alper Nebi Yasak Subject: [PATCH v2] binman: Skip processing "hash" subnodes of FIT subsections Date: Wed, 9 Feb 2022 22:02:35 +0300 Message-Id: <20220209190236.26479-1-alpernebiyasak@gmail.com> X-Mailer: git-send-email 2.34.1 MIME-Version: 1.0 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.39 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" X-Virus-Scanned: clamav-milter 0.103.5 at phobos.denx.de X-Virus-Status: Clean Binman's FIT entry type can have image subentries with "hash" subnodes intended to be processed by mkimage, but not binman. However, the Entry class and any subclass that reuses its implementation tries to process these unconditionally. This can lead to an error when boards specify hash algorithms that binman doesn't support, but mkimage supports. Let entries skip processing these "hash" subnodes based on an instance variable, and set this instance variable for FIT subsections. Also re-enable processing of calculated and missing properties of FIT entries which was disabled to mitigate this issue. Signed-off-by: Alper Nebi Yasak Reviewed-by: Simon Glass Reviewed-by: Simon Glass --- This applies on top of u-boot-dm/master, and does not resend my "binman: Update image positions of FIT subentries" patch [1] which should be applied on top of this. [1] https://patchwork.ozlabs.org/project/uboot/patch/20220207220809.4497-6-alpernebiyasak@gmail.com/ Changes in v2: - Set update_hash via a SetUpdateHash() method - Add a test using hash nodes in FIT subentries v1: https://patchwork.ozlabs.org/project/uboot/patch/20220208230656.43504-1-alpernebiyasak@gmail.com/ tools/binman/entry.py | 23 +++++++-- tools/binman/etype/fit.py | 12 +---- tools/binman/ftest.py | 24 ++++++++++ tools/binman/test/221_fit_subentry_hash.dts | 52 +++++++++++++++++++++ 4 files changed, 97 insertions(+), 14 deletions(-) create mode 100644 tools/binman/test/221_fit_subentry_hash.dts diff --git a/tools/binman/entry.py b/tools/binman/entry.py index dc26f8f167b0..631215dfc88a 100644 --- a/tools/binman/entry.py +++ b/tools/binman/entry.py @@ -78,6 +78,8 @@ class Entry(object): external: True if this entry contains an external binary blob bintools: Bintools used by this entry (only populated for Image) missing_bintools: List of missing bintools for this entry + update_hash: True if this entry's "hash" subnode should be + updated with a hash of the entry contents """ def __init__(self, section, etype, node, name_prefix=''): # Put this here to allow entry-docs and help to work without libfdt @@ -111,6 +113,7 @@ def __init__(self, section, etype, node, name_prefix=''): self.allow_fake = False self.bintools = {} self.missing_bintools = [] + self.update_hash = True @staticmethod def FindEntryClass(etype, expanded): @@ -315,9 +318,11 @@ def AddMissingProperties(self, have_image_pos): if self.compress != 'none': state.AddZeroProp(self._node, 'uncomp-size') - err = state.CheckAddHashProp(self._node) - if err: - self.Raise(err) + + if self.update_hash: + err = state.CheckAddHashProp(self._node) + if err: + self.Raise(err) def SetCalculatedProperties(self): """Set the value of device-tree properties calculated by binman""" @@ -333,7 +338,9 @@ def SetCalculatedProperties(self): state.SetInt(self._node, 'orig-size', self.orig_size, True) if self.uncomp_size is not None: state.SetInt(self._node, 'uncomp-size', self.uncomp_size) - state.CheckSetHashValue(self._node, self.GetData) + + if self.update_hash: + state.CheckSetHashValue(self._node, self.GetData) def ProcessFdt(self, fdt): """Allow entries to adjust the device tree @@ -1108,3 +1115,11 @@ def AddBintool(self, tools, name): btool = bintool.Bintool.create(name) tools[name] = btool return btool + + def SetUpdateHash(self, update_hash): + """Set whether this entry's "hash" subnode should be updated + + Args: + update_hash: True if hash should be updated, False if not + """ + self.update_hash = update_hash diff --git a/tools/binman/etype/fit.py b/tools/binman/etype/fit.py index a56b0564f9a1..cd7ebc571e27 100644 --- a/tools/binman/etype/fit.py +++ b/tools/binman/etype/fit.py @@ -186,6 +186,8 @@ def _AddNode(base_node, depth, node): # 'data' property later. entry = Entry.Create(self.section, node, etype='section') entry.ReadNode() + # The hash subnodes here are for mkimage, not binman. + entry.SetUpdateHash(False) self._entries[rel_path] = entry for subnode in node.subnodes: @@ -294,13 +296,3 @@ def _BuildInput(self, fdt): def AddBintools(self, tools): super().AddBintools(tools) self.mkimage = self.AddBintool(tools, 'mkimage') - - def AddMissingProperties(self, have_image_pos): - # We don't want to interfere with any hash properties in the FIT, so - # disable this for now. - pass - - def SetCalculatedProperties(self): - # We don't want to interfere with any hash properties in the FIT, so - # disable this for now. - pass diff --git a/tools/binman/ftest.py b/tools/binman/ftest.py index 59b6d52fbe4b..b6801b727568 100644 --- a/tools/binman/ftest.py +++ b/tools/binman/ftest.py @@ -5160,5 +5160,29 @@ def testFitSubentryMissingBintool(self): self.assertRegex(err, "Image 'main-section'.*missing bintools.*: futility") + def testFitSubentryHashSubnode(self): + """Test an image with a FIT inside""" + data, _, _, out_dtb_name = self._DoReadFileDtb( + '221_fit_subentry_hash.dts', use_real_dtb=True, update_dtb=True) + + mkimage_dtb = fdt.Fdt.FromData(data) + mkimage_dtb.Scan() + binman_dtb = fdt.Fdt(out_dtb_name) + binman_dtb.Scan() + + # Check that binman didn't add hash values + fnode = binman_dtb.GetNode('/binman/fit/images/kernel/hash') + self.assertNotIn('value', fnode.props) + + fnode = binman_dtb.GetNode('/binman/fit/images/fdt-1/hash') + self.assertNotIn('value', fnode.props) + + # Check that mkimage added hash values + fnode = mkimage_dtb.GetNode('/images/kernel/hash') + self.assertIn('value', fnode.props) + + fnode = mkimage_dtb.GetNode('/images/fdt-1/hash') + self.assertIn('value', fnode.props) + if __name__ == "__main__": unittest.main() diff --git a/tools/binman/test/221_fit_subentry_hash.dts b/tools/binman/test/221_fit_subentry_hash.dts new file mode 100644 index 000000000000..2cb04f96d088 --- /dev/null +++ b/tools/binman/test/221_fit_subentry_hash.dts @@ -0,0 +1,52 @@ +// SPDX-License-Identifier: GPL-2.0+ + +/dts-v1/; + +/ { + #address-cells = <1>; + #size-cells = <1>; + + binman { + fit { + description = "test-desc"; + #address-cells = <1>; + + images { + kernel { + description = "Vanilla Linux kernel"; + type = "kernel"; + arch = "ppc"; + os = "linux"; + compression = "gzip"; + load = <00000000>; + entry = <00000000>; + hash { + algo = "sha1"; + }; + u-boot { + }; + }; + fdt-1 { + description = "Flattened Device Tree blob"; + type = "flat_dt"; + arch = "ppc"; + compression = "none"; + hash { + algo = "crc32"; + }; + u-boot-spl-dtb { + }; + }; + }; + + configurations { + default = "conf-1"; + conf-1 { + description = "Boot Linux kernel with FDT blob"; + kernel = "kernel"; + fdt = "fdt-1"; + }; + }; + }; + }; +};