From patchwork Sat Mar 3 14:29:02 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Heinrich Schuchardt X-Patchwork-Id: 881036 X-Patchwork-Delegate: agraf@suse.de 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=none (p=none dis=none) header.from=gmx.de Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 3ztpbz2x1Lz9s8J for ; Sun, 4 Mar 2018 01:35:11 +1100 (AEDT) Received: by lists.denx.de (Postfix, from userid 105) id EE7EEC21FEA; Sat, 3 Mar 2018 14:32:16 +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, RCVD_IN_DNSWL_BLOCKED,RCVD_IN_MSPIKE_H2 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 5103EC22072; Sat, 3 Mar 2018 14:30:04 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id 6E7D3C22039; Sat, 3 Mar 2018 14:29:50 +0000 (UTC) Received: from mout.gmx.net (mout.gmx.net [212.227.15.15]) by lists.denx.de (Postfix) with ESMTPS id 71DA8C21EC9 for ; Sat, 3 Mar 2018 14:29:47 +0000 (UTC) Received: from workstation4.fritz.box ([84.118.156.34]) by mail.gmx.com (mrgmx002 [212.227.17.184]) with ESMTPSA (Nemesis) id 0MVe87-1fCmko0rmB-00YzUl; Sat, 03 Mar 2018 15:29:45 +0100 From: Heinrich Schuchardt To: Alexander Graf Date: Sat, 3 Mar 2018 15:29:02 +0100 Message-Id: <20180303142904.24332-10-xypron.glpk@gmx.de> X-Mailer: git-send-email 2.14.2 In-Reply-To: <20180303142904.24332-1-xypron.glpk@gmx.de> References: <20180303142904.24332-1-xypron.glpk@gmx.de> X-Provags-ID: V03:K0:1NK/MjUW8yxWlypvS5YmWLzII5PVR/x2zSjMgE5U3dpmUT9GSyl tSLFak4WNtbJUZeHuX3PtFXs1Fog9737wc4vhBSA0LMb9N4SdYOAHKpzmnXFguW7u7jOEK9 utOFXuKWXhH5enI3lrayXA9CTSlMjYxgmdO9tk0qDtW3YPDqmPPd5EqPpnho7VDQgMQjchk Z0zma8GltdEf33E1qWdow== X-UI-Out-Filterresults: notjunk:1; V01:K0:8Yngj5brWlc=:9AOp+6OvgRAoMj8pjzH5+8 Ca+qDrPTp6kAw1eIKQBqsWCv8hzzZdGqFcqNFqEVnH07W4jVuKeAkYvoaIgrNkvj31DQAM8ws kxsvr7WzzAJnhMaWSB4LPu3UOEOJa5pOvtQPMvr3PEDviZrOPnhfJ1hfS40q6sx2x1SeSI3ui c0rkrvd0hLQTX/3KF6pZ1RkEKpjgHC+ZiowflckbR6TWby/2sw21fi/Ej4lIM1gj4uYlrxEAX AnEAYtZPIqI69g/Mu+C9EeGYd87sKVybApsNE65je/8HcFmY7u0P1YUccKRIyMdcu1GCBEmr+ i5qZe8aHX8nht8zvIv/faMJAAXVFGVSZjkMHSLENcOraxYuY0IroZWvvHEJPPXP0tkd374cnB NTsBdR3UJINdlAAkSRmpkhjbgnLUeFnV49VznsfR89lI8peLli3XN+RsiDLPB5wUz1UL33sL0 XzAqipJIsbmeMtsKEUOgPHt5t5YFRNcpnOrG3/N1mni2lYfTuFIk7ZuAC+qAWGdYUq0Yuu4+o ZCgIiFlnOUxqs/+ul6dN5nBo7DdExyMfle7KUyaCktAJeDr6wIAGyiNj8+dnoKjPQJp3tVbgI LqD7C70OhRQyaoX9NeaBUK24fK8YAkkRTg/d4Xn9qiPMJM+x7qiycunu4wlFBzacyIj6Juaqd TNcvuulPA8H9IEO6Z7bUyRsQ6S1Kp9srtf2ILVwlA7wNrl7AhEOo8QkFaihc6nx++M3Uc/Phw uysttZXQ9F56/eHsko+PEEKTNKH4o4+8sKKZ/z7fi4NAOL1b0PoMObzsM0MdnCN0BJfLsqMeT 2DNX3532PC9gfHXEwEDlEzVGON7DQ== Cc: Yuantian Tang , Priyanka Jain , u-boot@lists.denx.de, Heinrich Schuchardt , Stefan Roese , Hou Zhiqiang Subject: [U-Boot] [PATCH v3 09/11] efi_loader: check initialization of EFI subsystem is successful 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: , MIME-Version: 1.0 Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" Up to now errors in the initialization of the EFI subsystems was not checked. If any initialization fails, leave the bootefi command. We do not retry initialization because this would require to undo all prior initalization steps. Suggested-by: Simon Glass Signed-off-by: Heinrich Schuchardt --- v3 rebased (dependency on CONFIG_CMD_NET instead of CONFIG_NET) v2 no change, patch resent --- cmd/bootefi.c | 67 +++++++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 47 insertions(+), 20 deletions(-) diff --git a/cmd/bootefi.c b/cmd/bootefi.c index 1f1c15a908..0eb9a1baab 100644 --- a/cmd/bootefi.c +++ b/cmd/bootefi.c @@ -22,40 +22,65 @@ DECLARE_GLOBAL_DATA_PTR; -static u8 efi_obj_list_initialized; +#define OBJ_LIST_NOT_INITIALIZED 1 + +static efi_status_t efi_obj_list_initialized = OBJ_LIST_NOT_INITIALIZED; static struct efi_device_path *bootefi_image_path; static struct efi_device_path *bootefi_device_path; /* Initialize and populate EFI object list */ -static void efi_init_obj_list(void) +efi_status_t efi_init_obj_list(void) { + efi_status_t ret = EFI_SUCCESS; + /* Initialize once only */ - if (efi_obj_list_initialized) - return; - efi_obj_list_initialized = 1; + if (efi_obj_list_initialized != OBJ_LIST_NOT_INITIALIZED) + return efi_obj_list_initialized; /* Initialize EFI driver uclass */ - efi_driver_init(); + ret = efi_driver_init(); + if (ret != EFI_SUCCESS) + goto out; - efi_console_register(); + ret = efi_console_register(); + if (ret != EFI_SUCCESS) + goto out; #ifdef CONFIG_PARTITIONS - efi_disk_register(); + ret = efi_disk_register(); + if (ret != EFI_SUCCESS) + goto out; #endif #if defined(CONFIG_LCD) || defined(CONFIG_DM_VIDEO) - efi_gop_register(); + ret = efi_gop_register(); + if (ret != EFI_SUCCESS) + goto out; #endif #ifdef CONFIG_CMD_NET - efi_net_register(); + ret = efi_net_register(); + if (ret != EFI_SUCCESS) + goto out; #endif #ifdef CONFIG_GENERATE_SMBIOS_TABLE - efi_smbios_register(); + ret = efi_smbios_register(); + if (ret != EFI_SUCCESS) + goto out; #endif - efi_watchdog_register(); + ret = efi_watchdog_register(); + if (ret != EFI_SUCCESS) + goto out; /* Initialize EFI runtime services */ - efi_reset_system_init(); - efi_get_time_init(); + ret = efi_reset_system_init(); + if (ret != EFI_SUCCESS) + goto out; + ret = efi_get_time_init(); + if (ret != EFI_SUCCESS) + goto out; + +out: + efi_obj_list_initialized = ret; + return ret; } /* @@ -186,9 +211,6 @@ static efi_status_t do_bootefi_exec(void *efi, void *fdt, assert(device_path && image_path); } - /* Initialize and populate EFI object list */ - efi_init_obj_list(); - efi_setup_loaded_image(&loaded_image_info, &loaded_image_info_obj, device_path, image_path); @@ -285,9 +307,6 @@ static int do_bootefi_bootmgr_exec(unsigned long fdt_addr) void *addr; efi_status_t r; - /* Initialize and populate EFI object list */ - efi_init_obj_list(); - /* * gd lives in a fixed register which may get clobbered while we execute * the payload. So save it here and restore it on every callback entry @@ -316,6 +335,14 @@ static int do_bootefi(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) unsigned long addr, fdt_addr = 0; efi_status_t r; + /* Initialize EFI drivers */ + r = efi_init_obj_list(); + if (r != EFI_SUCCESS) { + printf("Error: Cannot set up EFI drivers, r = %lu\n", + r & ~EFI_ERROR_MASK); + return CMD_RET_FAILURE; + } + if (argc < 2) return CMD_RET_USAGE; #ifdef CONFIG_CMD_BOOTEFI_HELLO