From patchwork Wed Jul 22 06:05:23 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: AKASHI Takahiro X-Patchwork-Id: 246947 Delivered-To: patch@linaro.org Received: by 2002:a92:d244:0:0:0:0:0 with SMTP id v4csp253066ilg; Tue, 21 Jul 2020 23:06:17 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwCZRSeXpa4wv3fH9MPE8CAe+88SaHFdwd+jBWdYI0Bw6+4HgiEK/BQuZSllO0HiWJ9WPcS X-Received: by 2002:a17:906:82d4:: with SMTP id a20mr26902064ejy.165.1595397976996; Tue, 21 Jul 2020 23:06:16 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1595397976; cv=none; d=google.com; s=arc-20160816; b=vc+oR2KuEXXPFTu+FZis94r2ppGRjI3NTOm9pJ9jbn4P0Y0XXHekefMTj+QB05EQsy zMrXrH7m3MBiLYr7RsTLZPRnw/GeyRHNCDQfRegCP0GAy/EYg/0v9GLHD/ME2FkcCirr /WZhM95RC64FolZnDWSvKewWCMcDOHjolGYeI9on0ijX3UhSSsL3CHDqZoPFaYJtRRAB 3KPTp6Ic2W35P6uXXAODv+YOhyx707GLBohd8BLi28AJhJMX4OitKDKmUphk67OvveAj wxK1XL5ecDW+tzk/rnSGL3+BntBOEZxN3JSxCDXdlec/8D0rnOtFGe/Z1BbNXGHqKEoP Ko8g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:content-transfer-encoding :mime-version:message-id:date:subject:cc:to:from:dkim-signature; bh=UfAf2uUxynM80dMRgem7RN4sLZ33Ugy5Ks5IwL/31v0=; b=RXxPh3/loJRTpVsF5jei48mcF7r4bu1tGBtaYexuNPVwtxVuv+94oWnltifmd6o0bt E6OcpU7ql0ez7edgUnj9ho4J57x27R++LZcUH1ygXKrHNWmzVtf2DTrah81EHmi/JSAG rpiLdxgGIS9XnplZDm3y5TRessU15U1nMUaUVEzh03sYJLorVyPyOe3fOuZzWgPUdf5e /ZSOMZDsvJe+cvWNdWnMe0WfqsbOpvWH3te8yet40fNxqtZQ+z3yTZlsqceVyJ06yVMI ATwBdhScjdpzY4Yxykv/sWbqZQFiAWfDXXH8EV9AMaMrl8dMlSSvM31g4n5LtcWggmeA feoA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=Nxae3oU5; spf=pass (google.com: domain of u-boot-bounces@lists.denx.de designates 85.214.62.61 as permitted sender) smtp.mailfrom=u-boot-bounces@lists.denx.de; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from phobos.denx.de (phobos.denx.de. [85.214.62.61]) by mx.google.com with ESMTPS id v21si13705676edw.286.2020.07.21.23.06.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 21 Jul 2020 23:06:16 -0700 (PDT) Received-SPF: pass (google.com: domain of u-boot-bounces@lists.denx.de designates 85.214.62.61 as permitted sender) client-ip=85.214.62.61; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=Nxae3oU5; spf=pass (google.com: domain of u-boot-bounces@lists.denx.de designates 85.214.62.61 as permitted sender) smtp.mailfrom=u-boot-bounces@lists.denx.de; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 18A15819EA; Wed, 22 Jul 2020 08:06:16 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=linaro.org 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=linaro.org header.i=@linaro.org header.b="Nxae3oU5"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 84FC981B6E; Wed, 22 Jul 2020 08:06:14 +0200 (CEST) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,SPF_HELO_NONE,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from mail-pg1-x52c.google.com (mail-pg1-x52c.google.com [IPv6:2607:f8b0:4864:20::52c]) (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 88C5081765 for ; Wed, 22 Jul 2020 08:06:10 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=takahiro.akashi@linaro.org Received: by mail-pg1-x52c.google.com with SMTP id j19so620549pgm.11 for ; Tue, 21 Jul 2020 23:06:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=UfAf2uUxynM80dMRgem7RN4sLZ33Ugy5Ks5IwL/31v0=; b=Nxae3oU5hPwa/s3vCJToIAud8FV+V52hh0ZvyHXm1T51QIAc3y8I6Rgf0k8cW01h/s B/ACsvRyusR7XDojvg307n0J7h2Wj2ngh2496Z4g/0vUBdpTHxTL6mhBRWXXLV92onJU 8EuMP4eJalx/NqtrCqrjzd7hn6N+K9KEma9lNOQtUJ1ttbxzsl0HdaXkkJEPmiSPcEcz SVvvlNnkmaFijOB88CMi5XPfPaANqFFGq8ZLhJE0IaR8ySbfyDdBE0BbtbilopArzbR7 0E9ptC9QnqoiStrFC8O3ZNIFXxxKZlgewOI97+uugIvRBUhcoXK1nSiRnkPvLCybrdkv XphA== 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=UfAf2uUxynM80dMRgem7RN4sLZ33Ugy5Ks5IwL/31v0=; b=ITmPCPz/XodgbslkNY1+fz4Pj1GNSed1qodcJOeZOWW0Egn/iB9nNm7xZA/6PYNseB 1zlhaVK/vsm/V+z+kpyHysndm9tKMObi6tIbu2743kuhF8fZx1LO660Fk2wAVl6jFm3J zyyLs8jLUsjWyRRQXRCj5R2pfQ4Pv2sWtOU+eh+z7Ls1iEWSvXMHGDqnCq2yYFuxZ0Pl M/jCDN884HP3RvRBdQ+ueelHN0zsSyEUz9HZAKOJBCW+eleFZkOkzgiAMeww0xNdekr2 gkSnPLZXAS3UfxJsWOLD3BusOrgc72cEhYxaY50nMbHe/sR+61p/ZIpdxIjJysZ18B3P MU1w== X-Gm-Message-State: AOAM533D46o+lf+7YJIyEAdunB2EuiCZLGgtzDFNC1z1TRUEN68YUmnd C/sXfc+W+aXxKr7/ox1NW1bFFA== X-Received: by 2002:a63:a06b:: with SMTP id u43mr25387093pgn.294.1595397969033; Tue, 21 Jul 2020 23:06:09 -0700 (PDT) Received: from localhost.localdomain (p6e424d9a.tkyea130.ap.so-net.ne.jp. [110.66.77.154]) by smtp.gmail.com with ESMTPSA id p10sm19578759pgn.6.2020.07.21.23.06.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 21 Jul 2020 23:06:08 -0700 (PDT) From: AKASHI Takahiro To: lukma@denx.de, trini@konsulko.com, xypron.glpk@gmx.de, agraf@csgraf.de Cc: sughosh.ganu@linaro.org, u-boot@lists.denx.de, AKASHI Takahiro Subject: [PATCH v4 00/16] efi_loader: add capsule update support Date: Wed, 22 Jul 2020 15:05:23 +0900 Message-Id: <20200722060539.15168-1-takahiro.akashi@linaro.org> X-Mailer: git-send-email 2.27.0 MIME-Version: 1.0 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.34 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.102.3 at phobos.denx.de X-Virus-Status: Clean Summary ======= 'UpdateCapsule' is one of runtime services defined in UEFI specification and its aim is to allow a caller (OS) to pass information to the firmware, i.e. U-Boot. This is mostly used to update firmware binary on devices by instructions from OS. While 'UpdateCapsule' is a runtime services function, it is, at least initially, supported only before exiting boot services alike other runtime functions, [Get/]SetVariable. This is because modifying storage which may be shared with OS must be carefully designed and there is no general assumption that we can do it. Therefore, we practically support only "capsule on disk"; any capsule can be handed over to UEFI subsystem as a file on a specific file system. In this patch series, all the related definitions and structures are given as UEFI specification describes, and basic framework for capsule support is provided. Currently supported is * firmware update (Firmware Management Protocol or simply FMP) Most of functionality of firmware update is provided by FMP driver and it can be, by nature, system/platform-specific. So you can and should implement your own FMP driver(s) based on your system requirements. Under the current implementation, we provide two basic but generic drivers with two formats: * FIT image format (as used in TFTP update and dfu) * raw image format It's totally up to users which one, or both, should be used on users' system depending on user requirements. Quick usage =========== 1. You can create a capsule file with the following host command: $ mkeficapsule [--fit | --raw ] 2. Put the file under: /EFI/UpdateCapsule of UEFI system partition 3. Specify firmware storage to be updated in "dfu_alt_info" variable (Please follow README.dfu for details.) ==> env set dfu_alt_info '...' 4. After setting up UEFI's OsIndications variable, reboot U-Boot: OsIndications <= EFI_OS_INDICATIONS_FILE_CAPSULE_DELIVERY_SUPPORTED Patch structure =============== Patch#1-#4,#11: preparatory patches Patch#5-#10,#12: main part of implementation Patch#13-#14: utilities Patch#15-#16: pytests [1] https://git.linaro.org/people/takahiro.akashi/u-boot.git efi/capsule Prerequisite patches ==================== dfu change by Heinrich[2] [2] https://lists.denx.de/pipermail/u-boot/2020-July/420950.html Test ==== * passed all the pytests which are included in this patch series on sandbox build locally. Please note that, while Travic CI passed, the capsule pytest itself won't be run in the CI partly because some specific configuration for sandbox build is required and partly because there is a problem with virt-make-fs. See test_efi_capsule_firmware.py. Issues ====== * Timing of executing capsules-on-disk Currently, processing a capsule is triggered only as part of UEFI subsystem initialization. This means that, for example, firmware update, may not take place at system booting time and will potentially be delayed until a first call of any UEFI functions. => See patch#5 for my proposal * A bunch of warnings like WARNING: Use 'if (IS_ENABLED(CONFIG...))' instead of '#if or #ifdef' where possible I don't think that fixing those improves anything. * Add a document in uefi.rst TODO's ====== (Won't be addressed in this series.) * capsule authentication * capsule dependency (dependency expression instruction set) * loading drivers in a capsule * handling RESET flag in a capsule and QeuryCapsuleCaps * full semantics of ESRT (EFI System Resource Table) * enabling capsule API at runtime * json capsule * recovery from update failure Changes ======= v4 (July 22, 2020) * rebased to Heinrich's current efi-2020-10 * rework dfu-related code to align with Heinrich's change (Patch#1,#3) * change a type of 'addr' argument from int to 'void *' per Sughosh's comment (Patch#2-#3,#11-#12) * rework/simplify pytests (Patch#15-#16) - utilize virt-make-fs - drop Test Case 1 (updating U-Boot environment data) - remove useless definitions (MNT_PNT, EFI_CAPSULE_IMAGE_NAME) - apply autopep8 v3 (July 10, 2020) * rebased to Heinrich's current efi-2020-10-rc1 * refactor efi_firmware_[fit|raw]_get_image_info() (patch#11,#13) v2 (June 17, 2020) * rebased to v2020.07-rc4 * add preparatory patches for dfu (Patch#1-#5, #12) * rework FIT capsule driver to utilize dfu_alt_info instead of CONFIG_xxx (patch#11) * extend get_image_info() to correspond to dfu_alt_info (patch#11) * add a 'raw binary' capsule support (patch#13, #17) * allow multiple capsule formats (with different GUIDs) to be installed (patch#11, #13) * extend mkeficapsule command to accept additional parameters, like version/index/hardware instance for a capsule header info. (patch#15) * mkeficapsule can now also generate raw-binary capsule (patch#16) * add function descriptions * apply autopep8 to pytests and fix more against pylint v1 (April 27, 2020) * rebased to v2020.07-rc * removed already-merged patches (RFC's #1 to #4) * dropped 'variable update' capsule support (RFC's patch#10) * dropped 'variable configuration table' support (RFC's patch#11) (Those two should be discussed separately.) * add preparatory patches (patch#1/#2) * fix several build errors * rename some Kconfig options to be aligned with UEFI specification's terms (patch#3,4,6,7) * enforce UpdateCapsule API to be disabled after ExitBootServices (patch#3) * use config table, runtime_services_supported, instead of variable (patch#3) * make EFI_CAPSULE_ON_DISK buildable even if UpdateCapsule API is disabled (patch4) * support OsIndications, invoking capsule-on-disk only if the variable indicates so (patch#4) * introduced EFI_CAPSULE_ON_DISK_EARLY to invoke capsule-on-disk in U-Boot initialization (patch#4) * detect capsule files only if they are on EFI system partition (patch#4) * use printf, rather than EFI_PRINT, in error cases (patch#4) * use 'header_size' field to retrieve capsule data, adding sanity checks against capsule size (patch#6) * call fmpt driver interfaces with EFI_CALL (patch#6) * remove 'variable update capsule'-related code form mkeficapsule (patch#9) * add a test case of OsIndications not being set properly (patch#10) * adjust test scenario for EFI_CAPSULE_ON_DISK_EARLY (patch#10) * revise pytest scripts (patch#10) Initial release as RFC (March 17, 2020) AKASHI Takahiro (16): dfu: rename dfu_tftp_write() to dfu_write_by_name() dfu: modify an argument type for an address common: update: add a generic interface for FIT image dfu: export dfu_list efi_loader: add option to initialise EFI subsystem early efi_loader: define UpdateCapsule api efi_loader: capsule: add capsule_on_disk support efi_loader: capsule: add memory range capsule definitions efi_loader: capsule: support firmware update efi_loader: add firmware management protocol for FIT image dfu: add dfu_write_by_alt() efi_loader: add firmware management protocol for raw image cmd: add "efidebug capsule" command tools: add mkeficapsule command for UEFI capsule update test/py: add a test for uefi firmware update capsule of FIT image test/py: add a test for uefi firmware update capsule of raw image cmd/efidebug.c | 235 +++++ common/Kconfig | 14 + common/Makefile | 3 +- common/board_r.c | 6 + common/main.c | 4 + common/update.c | 77 +- drivers/dfu/Kconfig | 6 + drivers/dfu/Makefile | 2 +- drivers/dfu/dfu.c | 2 +- drivers/dfu/dfu_alt.c | 125 +++ drivers/dfu/dfu_tftp.c | 65 -- include/dfu.h | 57 +- include/efi_api.h | 160 +++ include/efi_loader.h | 34 + include/image.h | 12 + lib/efi_loader/Kconfig | 72 ++ lib/efi_loader/Makefile | 2 + lib/efi_loader/efi_capsule.c | 925 ++++++++++++++++++ lib/efi_loader/efi_firmware.c | 398 ++++++++ lib/efi_loader/efi_runtime.c | 104 +- lib/efi_loader/efi_setup.c | 45 +- test/py/tests/test_efi_capsule/conftest.py | 72 ++ test/py/tests/test_efi_capsule/defs.py | 12 + .../test_efi_capsule/test_capsule_firmware.py | 241 +++++ .../tests/test_efi_capsule/uboot_bin_env.its | 36 + tools/Makefile | 3 + tools/mkeficapsule.c | 237 +++++ 27 files changed, 2811 insertions(+), 138 deletions(-) create mode 100644 drivers/dfu/dfu_alt.c delete mode 100644 drivers/dfu/dfu_tftp.c create mode 100644 lib/efi_loader/efi_capsule.c create mode 100644 lib/efi_loader/efi_firmware.c create mode 100644 test/py/tests/test_efi_capsule/conftest.py create mode 100644 test/py/tests/test_efi_capsule/defs.py create mode 100644 test/py/tests/test_efi_capsule/test_capsule_firmware.py create mode 100644 test/py/tests/test_efi_capsule/uboot_bin_env.its create mode 100644 tools/mkeficapsule.c -- 2.27.0