From patchwork Thu Feb 15 07:31:42 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Heinrich Schuchardt X-Patchwork-Id: 873692 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=) Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 3zhp7T5RJmz9t32 for ; Thu, 15 Feb 2018 18:39:17 +1100 (AEDT) Received: by lists.denx.de (Postfix, from userid 105) id 69696C21C3F; Thu, 15 Feb 2018 07:35:37 +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 1B6BDC220C8; Thu, 15 Feb 2018 07:32:46 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id F1B48C22051; Thu, 15 Feb 2018 07:32:11 +0000 (UTC) Received: from mout.gmx.net (mout.gmx.net [212.227.15.18]) by lists.denx.de (Postfix) with ESMTPS id 7794AC21FE1 for ; Thu, 15 Feb 2018 07:32:07 +0000 (UTC) Received: from localhost.localdomain ([89.204.154.144]) by mail.gmx.com (mrgmx001 [212.227.17.184]) with ESMTPSA (Nemesis) id 0Md3Eg-1f4RMc38gE-00ICY3; Thu, 15 Feb 2018 08:32:04 +0100 From: Heinrich Schuchardt To: Alexander Graf Date: Thu, 15 Feb 2018 08:31:42 +0100 Message-Id: <20180215073144.12979-10-xypron.glpk@gmx.de> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180215073144.12979-1-xypron.glpk@gmx.de> References: <20180215073144.12979-1-xypron.glpk@gmx.de> X-Provags-ID: V03:K0:cvxGr+8jlvN7mpvUD8najMUGwioPvWgy7UqIEsDy/npgCcNpxtG C8sKx1baPATl0qPeSpafKX47Ir+rBj2qOSUatEWDpBJDXm2ieJ0gEj91V5x1W4sTIrekQ+K 02gSuTMJX6voLkaNaDaBTkkGiHJ2pBK7rTt4DUCHCd9uMmwGkp8iSZTM+xiX5Oqawmy/L9g 9hrXrBM1SrmjWvGws6UsQ== X-UI-Out-Filterresults: notjunk:1; V01:K0:Lb9VvXq/SWM=:HMkwr4MJQFiIFjnXS+XS+B pIcZHIFOgXyipGMYrOde3Q5w71lY/jgF/nuUdws/kPUZyziw1fTQU44Npj410sif/Rvt5YPIN hwQQL96I5mRVnlFJVpauxVRrBlgUIZwyvO0WFZXcYx9h3OSDHJ4ENt4ojGaWCCF5wkRm/HDKh UgN7vv05JSNrvfwfkHiCKAhFoBJNBoDFgMZX3qBgrpjo2Nk2gw7Id3+NMHxwe3x3IssR2lG/v g355+YOvpxqaA+YnvFYxqa8CnzmK1apwjYtjjUl5VMPdvBV8i+UbK+B5ijwM8ATvgH7OWbSvE bXutlNpySpJlik+uq08SSXi0w+DFTVV7nu4ITz+ygRj9lpvwsS9KYT3W/CIGt9iLzpwN0gsFz hr58itR85ndGuiVBWGNwibzBVTumKBFue0eFLDAxBiGTq+WL2GxZHRcxEc4WbeaMFPAGUKvQV 60rol5djWXBOE8P8amyaO4oPv9WSsHe6/siz6nsdlqdHgufHzFd2BOi7wDF8MRS/5B7P3DJU0 JWxWiitj1SIiKvmGwd1rSpCWDel4hnmFznqAoHKcoOARcC2nZtAAHOHiUzMDDiklWiCvQk8Y3 O+jeDn4lVUjqqB817VeIgvncpHdyhq9sOoAbpcG8e3o2KFd3U0iGQwNLtUFvtUfLtnGb4ZKXC QAsWAQPN/NXI8F/67TSQB8jNB9GA47EWkWI0pCOygkapmM3ygwp6aJdWI16CN98A3SvkaM+k+ +wrGMGWT2ueRfOJzITruQHn43ZlULfzvqrYZEKZ7F/R3IoTp4OXwUYrtwIMSSHD+txCJ6qNwq f/d3DVRWpSp9blXnpQUzlTPekaRPQ== Cc: Yuantian Tang , Priyanka Jain , u-boot@lists.denx.de, Heinrich Schuchardt , Stefan Roese , Hou Zhiqiang Subject: [U-Boot] [PATCH v2 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 Reviewed-by: Simon Glass --- 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 7d4100ceeb9..3df1d3fbd07 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_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