From patchwork Fri Jan 20 12:31:19 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ilias Apalodimas X-Patchwork-Id: 644644 Delivered-To: patch@linaro.org Received: by 2002:a17:522:b9de:b0:4b9:b062:db3b with SMTP id fj30csp751653pvb; Fri, 20 Jan 2023 04:31:51 -0800 (PST) X-Google-Smtp-Source: AMrXdXtyrja4rubqPcLDKYy87XTXijBxODqcseC4zXUiDSh9jSoczbCZ4RaOLAsZX+c1uhdMyFIl X-Received: by 2002:aca:f045:0:b0:36a:b87b:c40d with SMTP id o66-20020acaf045000000b0036ab87bc40dmr6008054oih.44.1674217911629; Fri, 20 Jan 2023 04:31:51 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1674217911; cv=none; d=google.com; s=arc-20160816; b=0gcwj9D8tLgl3L0x+NrHPJTA/nG2kuPgsGP4GNuSPC+4tVuUGcMDWbANnZK1qa1Nkw wGw0G6pOKohKrCByZWn9LZTl0X94uV0q5gbvKo9g3w4cREst0+BVU8vlxsr8jwbd5fol 1qL/i98fP7h4P0rwAmFMYVGAuM73MJCsCkh4SxQ9Z9RRsGQxUY+SIC/3so6WaNxqtN3p 7n74naceHLrRq9A+xwrbjtLTV3rp6WQP4dWW79LCwVWOTazcY50gNp0OKvEZ63aForz1 UiU6MaaAYwBNihkMUcIgPvNfEwxnm8SCxvv/Yl8pRhU5HOmYCapFZqOJZiWAIt7+ntYx AvYA== 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=kdN7OQfk8+FONy4LfzNFcHvfiYmUTCDSTGBZDd9DOdk=; b=ZS06e/0Dluf6EMvUlHbglVHP2K+mw64bBFsrQXLepY78/6lmwBTy4qjI16ReRQKt0z ezXAZoI5tYQW1LjUxRT7Eyeaz5m4Px6vOEM4CcvxqPJH2DB+B+p7uBfi9YdWvINdD2aL 9KxwVyT9NjYjljXnVmiCdkboY7+71xEScGAUQJnoaYTA4tB7HHhy89rrNZr1oupeEay+ VEN7ZSXW5VO7k8dM9ZmH7CqmzRA2yPqouPSsPsfXKpzlDZ9eCFpgIzxF/2E9Ko77wdJM Ls5vJsYSf4S48klhQD4NZc+zHlOdBiSm50SWBVxDs2s/PXkkuAwiUCO5E1k2WRYMcA0x Pvng== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=pVjxeBvN; spf=pass (google.com: domain of u-boot-bounces@lists.denx.de designates 2a01:238:438b:c500:173d:9f52:ddab:ee01 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. [2a01:238:438b:c500:173d:9f52:ddab:ee01]) by mx.google.com with ESMTPS id y14-20020a056830208e00b006863fbc9cefsi10988701otq.308.2023.01.20.04.31.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 20 Jan 2023 04:31:51 -0800 (PST) Received-SPF: pass (google.com: domain of u-boot-bounces@lists.denx.de designates 2a01:238:438b:c500:173d:9f52:ddab:ee01 as permitted sender) client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=pVjxeBvN; spf=pass (google.com: domain of u-boot-bounces@lists.denx.de designates 2a01:238:438b:c500:173d:9f52:ddab:ee01 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 B738B854CD; Fri, 20 Jan 2023 13:31:46 +0100 (CET) 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="pVjxeBvN"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 73705854CE; Fri, 20 Jan 2023 13:31:44 +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,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.2 Received: from mail-ej1-x62f.google.com (mail-ej1-x62f.google.com [IPv6:2a00:1450:4864:20::62f]) (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 BFEA58533F for ; Fri, 20 Jan 2023 13:31:40 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=ilias.apalodimas@linaro.org Received: by mail-ej1-x62f.google.com with SMTP id v6so13579474ejg.6 for ; Fri, 20 Jan 2023 04:31:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=kdN7OQfk8+FONy4LfzNFcHvfiYmUTCDSTGBZDd9DOdk=; b=pVjxeBvNSdEJn7LyULrUtXJ18ZkgN8vVmdiKV725OepbRDEsJWQdJnfxIGwWJaCQDw kRq0Z7rJxgYQeX+fDb6wy5FLpibCxulsN42/LT4JBQ1ZwVNqDshIexwzhJ9NDCVq2LSX ucvD51gqLLAWmblw9L+oaY2vnEr4ohhC2DUNhUtr9RFqvOkQN6HKnEqezvJyfSH7pLma sn8C/FouihJ2eW2dXPbwrKBVnmocPTKey7/tCGoEcnm6ZvXB9Z1D3MNlrAGu8egCdd5C KmvTxDbJlHKSVZogHZO58zMoVVhG0GOdgf3LdIBCfzgmpdoHUeQqSF1ZlMRV5+Vh7CLT h8lQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=kdN7OQfk8+FONy4LfzNFcHvfiYmUTCDSTGBZDd9DOdk=; b=HkEarlV5thWUk8CXd9d0Ac7+bSDVU5k3lbhxsNC2ujTy1QjpzVjlWgIiVuPGZ9Cokn roK7F+gGllLO/11uc2dm3TFR/51GXmjftLl5n/HVxUakVkRws6IGAAmFYquOg+Jejef0 o1GorpQ9VvPKipslDBzBeO65ccXrHihFQmj/if3MINuLyfCtvT7BP+pl3+KcZMsuDDlq fyf1RAG2AzpNqJRi5bxvdd/GPZofn3NoT+YPxHertJc197aBiFuMmecytNr6VlFFhGHA lQLdMokStGpQOjB3c16X7iIxH3B04P5XP2CJAC7UboOX98g0cKt880ArO9TCp+97zDam 7nlg== X-Gm-Message-State: AFqh2kr/iHfPa+IEhKXVgBJXwpnJGheoIBxQuC5QFYNfOfyP+JYd88ut yNcjLFGIKOzWdmdasU/2W4cL2mv6EioeGy/z X-Received: by 2002:a17:907:a786:b0:877:5b8a:5a5d with SMTP id vx6-20020a170907a78600b008775b8a5a5dmr9861483ejc.44.1674217900338; Fri, 20 Jan 2023 04:31:40 -0800 (PST) Received: from localhost.localdomain ([2a02:85f:fc9d:e4b5:8225:9a2f:d09d:5e54]) by smtp.gmail.com with ESMTPSA id gj19-20020a170907741300b0085e05b4f815sm12649749ejc.95.2023.01.20.04.31.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 20 Jan 2023 04:31:39 -0800 (PST) From: Ilias Apalodimas To: u-boot@lists.denx.de Cc: Ilias Apalodimas , Heinrich Schuchardt , Simon Glass , =?utf-8?q?Pali_Roh=C3=A1r?= , Masahisa Kojima , AKASHI Takahiro , Sughosh Ganu , Etienne Carriere , Patrick Delaunay Subject: [RFC PATCH 1/1] efi_loader: get rid of ad-hoc EFI subsystem init Date: Fri, 20 Jan 2023 14:31:19 +0200 Message-Id: <20230120123120.1014589-1-ilias.apalodimas@linaro.org> X-Mailer: git-send-email 2.38.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.6 at phobos.denx.de X-Virus-Status: Clean Up to now the EFI subsystem was left out of the main U-Boot init process. This has led to various hacks over the years, with the most notable one being sprinkling around the efi init call to various places such as U-Boot commands, the early boot code etc. Since EFI has it's own Kconfig option and people can remove it, let's wire up the EFI init call on an event for EVT_MAIN_LOOP. This will also get rid of ad-hoc code in the main event loop, which was trying to initialize the subsystem early and perform capsule updates. TODO: - The efi_tcg protocol implicitly initializes the TPM, as a result some of the tpm selftests will fail with the RFC. If everyone agrees that this is a good idea, I'll clean up the TPM hacks as well - We still need to run capsule updates on the main_loop() code since in some cases (e.g sandbox) we need preboot commands. - wider tests, I've only run QEMU for now Signed-off-by: Ilias Apalodimas --- boot/bootm_os.c | 8 -------- cmd/bootefi.c | 8 -------- cmd/bootmenu.c | 9 --------- cmd/eficonfig.c | 8 -------- cmd/efidebug.c | 9 --------- cmd/nvedit_efi.c | 17 ----------------- common/main.c | 8 +++----- include/efi_loader.h | 2 -- lib/efi_loader/Kconfig | 10 ---------- lib/efi_loader/efi_setup.c | 25 ++++++++++++++++++------- lib/fwu_updates/Kconfig | 1 - lib/fwu_updates/fwu.c | 3 --- 12 files changed, 21 insertions(+), 87 deletions(-) -- 2.38.1 diff --git a/boot/bootm_os.c b/boot/bootm_os.c index 99ff0e6c02d2..4775cecb4e64 100644 --- a/boot/bootm_os.c +++ b/boot/bootm_os.c @@ -505,14 +505,6 @@ static int do_bootm_efi(int flag, int argc, char *const argv[], if (ret) return ret; - /* Initialize EFI drivers */ - efi_ret = efi_init_obj_list(); - if (efi_ret != EFI_SUCCESS) { - printf("## Failed to initialize UEFI sub-system: r = %lu\n", - efi_ret & ~EFI_ERROR_MASK); - return 1; - } - /* Install device tree */ efi_ret = efi_install_fdt(images->ft_len ? images->ft_addr : EFI_FDT_USE_INTERNAL); diff --git a/cmd/bootefi.c b/cmd/bootefi.c index 2a7d42925d65..5d56448ee6ce 100644 --- a/cmd/bootefi.c +++ b/cmd/bootefi.c @@ -668,14 +668,6 @@ static int do_bootefi(struct cmd_tbl *cmdtp, int flag, int argc, if (argc < 2) return CMD_RET_USAGE; - /* Initialize EFI drivers */ - ret = efi_init_obj_list(); - if (ret != EFI_SUCCESS) { - log_err("Error: Cannot initialize UEFI sub-system, r = %lu\n", - ret & ~EFI_ERROR_MASK); - return CMD_RET_FAILURE; - } - if (argc > 2) { uintptr_t fdt_addr; diff --git a/cmd/bootmenu.c b/cmd/bootmenu.c index 3236ca5d7994..1c604c79e01d 100644 --- a/cmd/bootmenu.c +++ b/cmd/bootmenu.c @@ -449,15 +449,6 @@ static void handle_uefi_bootnext(void) efi_status_t ret; efi_uintn_t size; - /* Initialize EFI drivers */ - ret = efi_init_obj_list(); - if (ret != EFI_SUCCESS) { - log_err("Error: Cannot initialize UEFI sub-system, r = %lu\n", - ret & ~EFI_ERROR_MASK); - - return; - } - /* If UEFI BootNext variable is set, boot the BootNext load option */ size = sizeof(u16); ret = efi_get_variable_int(u"BootNext", diff --git a/cmd/eficonfig.c b/cmd/eficonfig.c index d830e4af53b8..16025d451901 100644 --- a/cmd/eficonfig.c +++ b/cmd/eficonfig.c @@ -2545,14 +2545,6 @@ static int do_eficonfig(struct cmd_tbl *cmdtp, int flag, int argc, char *const a if (argc > 1) return CMD_RET_USAGE; - ret = efi_init_obj_list(); - if (ret != EFI_SUCCESS) { - log_err("Error: Cannot initialize UEFI sub-system, r = %lu\n", - ret & ~EFI_ERROR_MASK); - - return CMD_RET_FAILURE; - } - ret = eficonfig_init(); if (ret != EFI_SUCCESS) return CMD_RET_FAILURE; diff --git a/cmd/efidebug.c b/cmd/efidebug.c index e6959ede930f..9ad253da91b2 100644 --- a/cmd/efidebug.c +++ b/cmd/efidebug.c @@ -1464,21 +1464,12 @@ static int do_efidebug(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) { struct cmd_tbl *cp; - efi_status_t r; if (argc < 2) return CMD_RET_USAGE; argc--; argv++; - /* Initialize UEFI drivers */ - r = efi_init_obj_list(); - if (r != EFI_SUCCESS) { - printf("Error: Cannot initialize UEFI sub-system, r = %lu\n", - r & ~EFI_ERROR_MASK); - return CMD_RET_FAILURE; - } - cp = find_cmd_tbl(argv[0], cmd_efidebug_sub, ARRAY_SIZE(cmd_efidebug_sub)); if (!cp) diff --git a/cmd/nvedit_efi.c b/cmd/nvedit_efi.c index 24944ab81e23..1ac1114d4c89 100644 --- a/cmd/nvedit_efi.c +++ b/cmd/nvedit_efi.c @@ -210,15 +210,6 @@ int do_env_print_efi(struct cmd_tbl *cmdtp, int flag, int argc, const efi_guid_t *guid_p = NULL; efi_guid_t guid; bool verbose = true; - efi_status_t ret; - - /* Initialize EFI drivers */ - ret = efi_init_obj_list(); - if (ret != EFI_SUCCESS) { - printf("Error: Cannot initialize UEFI sub-system, r = %lu\n", - ret & ~EFI_ERROR_MASK); - return CMD_RET_FAILURE; - } for (argc--, argv++; argc > 0 && argv[0][0] == '-'; argc--, argv++) { if (!strcmp(argv[0], "-guid")) { @@ -388,14 +379,6 @@ int do_env_set_efi(struct cmd_tbl *cmdtp, int flag, int argc, if (argc == 1) return CMD_RET_USAGE; - /* Initialize EFI drivers */ - ret = efi_init_obj_list(); - if (ret != EFI_SUCCESS) { - printf("Error: Cannot initialize UEFI sub-system, r = %lu\n", - ret & ~EFI_ERROR_MASK); - return CMD_RET_FAILURE; - } - /* * attributes = EFI_VARIABLE_BOOTSERVICE_ACCESS | * EFI_VARIABLE_RUNTIME_ACCESS; diff --git a/common/main.c b/common/main.c index 682f3359ea38..edb5f4c20682 100644 --- a/common/main.c +++ b/common/main.c @@ -54,11 +54,9 @@ void main_loop(void) if (IS_ENABLED(CONFIG_UPDATE_TFTP)) update_tftp(0UL, NULL, NULL); - if (IS_ENABLED(CONFIG_EFI_CAPSULE_ON_DISK_EARLY)) { - /* efi_init_early() already called */ - if (efi_init_obj_list() == EFI_SUCCESS) - efi_launch_capsules(); - } + /* EFI subsystem will be initialized from an event */ + if (IS_ENABLED(CONFIG_EFI_CAPSULE_ON_DISK)) + efi_launch_capsules(); s = bootdelay_process(); if (cli_process_fdt(&s)) diff --git a/include/efi_loader.h b/include/efi_loader.h index f9e427f09059..3a801cbbc4c1 100644 --- a/include/efi_loader.h +++ b/include/efi_loader.h @@ -513,8 +513,6 @@ extern struct list_head efi_register_notify_events; /* called at pre-initialization */ int efi_init_early(void); -/* Initialize efi execution environment */ -efi_status_t efi_init_obj_list(void); /* Set up console modes */ void efi_setup_console_size(void); /* Install device tree */ diff --git a/lib/efi_loader/Kconfig b/lib/efi_loader/Kconfig index b630d88ef9e2..f3aaa51bb36a 100644 --- a/lib/efi_loader/Kconfig +++ b/lib/efi_loader/Kconfig @@ -153,16 +153,6 @@ config EFI_IGNORE_OSINDICATIONS without setting the EFI_OS_INDICATIONS_FILE_CAPSULE_DELIVERY_SUPPORTED flag in variable OsIndications. -config EFI_CAPSULE_ON_DISK_EARLY - bool "Initiate capsule-on-disk at U-Boot boottime" - depends on EFI_CAPSULE_ON_DISK - help - Normally, without this option enabled, capsules will be - executed only at the first time of invoking one of efi command. - If this option is enabled, capsules will be enforced to be - executed as part of U-Boot initialisation so that they will - surely take place whatever is set to distro_bootcmd. - config EFI_CAPSULE_FIRMWARE bool diff --git a/lib/efi_loader/efi_setup.c b/lib/efi_loader/efi_setup.c index f0f01d3b1d5a..e2317aed1ec2 100644 --- a/lib/efi_loader/efi_setup.c +++ b/lib/efi_loader/efi_setup.c @@ -215,7 +215,7 @@ out: * * Return: status code */ -efi_status_t efi_init_obj_list(void) +static efi_status_t efi_init_obj_list(void) { efi_status_t ret = EFI_SUCCESS; @@ -335,14 +335,25 @@ efi_status_t efi_init_obj_list(void) /* Initialize EFI runtime services */ ret = efi_reset_system_init(); - if (ret != EFI_SUCCESS) - goto out; - /* Execute capsules after reboot */ - if (IS_ENABLED(CONFIG_EFI_CAPSULE_ON_DISK) && - !IS_ENABLED(CONFIG_EFI_CAPSULE_ON_DISK_EARLY)) - ret = efi_launch_capsules(); out: efi_obj_list_initialized = ret; return ret; } + +static int efi_evt_int(void *ctx, struct event *event) +{ + efi_status_t ret; + int r = 0; + + ret = efi_init_obj_list(); + if (ret != EFI_SUCCESS) { + log_err("Error: Cannot initialize UEFI sub-system, r = %lu\n", + ret & ~EFI_ERROR_MASK); + r = -1; + } + + return r; +} + +EVENT_SPY(EVT_MAIN_LOOP, efi_evt_int); diff --git a/lib/fwu_updates/Kconfig b/lib/fwu_updates/Kconfig index 78759e6618df..6ff577cb53b3 100644 --- a/lib/fwu_updates/Kconfig +++ b/lib/fwu_updates/Kconfig @@ -3,7 +3,6 @@ config FWU_MULTI_BANK_UPDATE depends on EFI_CAPSULE_ON_DISK select PARTITION_TYPE_GUID select EFI_SETUP_EARLY - imply EFI_CAPSULE_ON_DISK_EARLY select EVENT help Feature for updating firmware images on platforms having diff --git a/lib/fwu_updates/fwu.c b/lib/fwu_updates/fwu.c index 5313d0730202..e4256bea7a2c 100644 --- a/lib/fwu_updates/fwu.c +++ b/lib/fwu_updates/fwu.c @@ -700,9 +700,6 @@ static int fwu_boottime_checks(void *ctx, struct event *event) return 0; } - if (efi_init_obj_list() != EFI_SUCCESS) - return 0; - ret = fwu_get_dev_mdata(&dev, &mdata); if (ret) return ret;