From patchwork Tue Jul 4 21:15:21 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Heinrich Schuchardt X-Patchwork-Id: 784316 X-Patchwork-Delegate: agraf@suse.de Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 3x2Gzz3fcbz9sBR for ; Wed, 5 Jul 2017 07:17:35 +1000 (AEST) Received: by lists.denx.de (Postfix, from userid 105) id 389DAC21EE1; Tue, 4 Jul 2017 21:16:32 +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_NONE, 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 90007C21EE8; Tue, 4 Jul 2017 21:15:43 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id 4BA85C21C59; Tue, 4 Jul 2017 21:15:40 +0000 (UTC) Received: from mout.gmx.net (mout.gmx.net [212.227.17.20]) by lists.denx.de (Postfix) with ESMTPS id 63F3DC21C59 for ; Tue, 4 Jul 2017 21:15:39 +0000 (UTC) Received: from workstation4.fritz.box ([88.152.145.149]) by mail.gmx.com (mrgmx102 [212.227.17.174]) with ESMTPSA (Nemesis) id 0MWxtA-1dEJn32JkK-00Vy83; Tue, 04 Jul 2017 23:15:37 +0200 From: Heinrich Schuchardt To: Alexander Graf Date: Tue, 4 Jul 2017 23:15:21 +0200 Message-Id: <20170704211523.5135-2-xypron.glpk@gmx.de> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20170704211523.5135-1-xypron.glpk@gmx.de> References: <20170704211523.5135-1-xypron.glpk@gmx.de> X-Provags-ID: V03:K0:u5q8v7E6sZr6QRjT2vYdMdHV4O1RINfXgAO7olBs8iomjD8fY+b GIt3q831MlwUDQwboj8ZI7SqRj1Q0mVD8BgjbK0KVWiBqjwPhUvRrvEv4CS5qLxp3T6BL9v 6YGgTjI98Sy7nlK/CqGqx8FaDRnEvFLYNfv94X+/Hatn0D3jl0NaQ89E3Bh1JV13VFKpT9k fMmO6XqZS+cB2Vrt3NPIQ== X-UI-Out-Filterresults: notjunk:1; V01:K0:lpnBknPWDMo=:TYcb6ktu2KgAUIFLHOX6p0 tnFIpHXB7TGdM8hKgpCn26j3bQtMDifrKgmmZyFMwsTvakSfpDYJOIbGtbCaKFiXmjXtQyBu7 sA/lve0b5/w8TPt2n0u7nXHP8namcCKK0nBfmFyRPwsRInapS4A+zIVVyitmEvmR4rkFue892 JLoW849I5KBtC9LTx8d8/WpPX7AzAB7+LqnKJj+ZdUnmxRCcV4UGFvn9fx6ji7wx3DPxwY5s3 iu3ngH1HY4HEjo7xBpNaGJz8IL7KFWU2vWvF71xHJgIG2gSy1eBv9/71HkgfRDpKvRhqlG9pG AhQ0wu9AJlvBqkFQi0TQrvXv51bqWuFHXM3o8PweQmNeeyqLvaQaGLbtaOZ2oiuWb8aLdBFoG lF2sPi+ggx2KN17tsLG75rMk9gkDOPtP9V1IM0mO3XvhsqwBD0X0np1RteQySHe9iJvgu0lmm TM+u2FURiUN3FI5xZ6ci+/IzbwLCupc0NZqg+wVfX6XPmHZt2IT2ylwZnlNfWaVFIKM+S4Neo BlTQMQpsZp7PBSCkpr6+8JRNIUQrTyWZkHJED9zvzavQPn4l+6H2B4om6jsr5/K/zDdy/REqE Y/epf/yX64KOBQyH/fIrSyR3ASbE04s61/RUr2W3t7cMNS3xjMEPTtf/tR5D0BwhevcAS5lH0 BE98QpcMOjladbRISXFyf32FAbiL4+V/rf/NgUHlawts06WYFgUvk2W7Z80y+ry1ESdB1CC3z bqzrq7+R6vODTzuvzPMzB22ktkaWlkbXvXMMZjYVoLX9nFRlDeShtYlk+Pk= Cc: u-boot@lists.denx.de, Heinrich Schuchardt Subject: [U-Boot] [PATCH v3 1/3] bootefi: allow return without EFI_BOOT_SERVICES.Exit 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" The Unified Extensible Firmware Interface Specification, version 2.7, defines in chapter 2.1.2 - UEFI Application that an EFI application may either directly return or call EFI_BOOT_SERVICES.Exit(). Unfortunately U-Boot makes the incorrect assumption that EFI_BOOT_SERVICES.Exit() is always called. So the following application leads to a memory exception on the aarch64 architecture when returning: EFI_STATUS efi_main( EFI_HANDLE handle, EFI_SYSTEM_TABlE systable) { return EFI_SUCCESS; } With this patch the entry point is stored in the image handle. The new wrapper function do_enter is used to call the EFI entry point. Cc: Alexander Graf Signed-off-by: Heinrich Schuchardt --- v3: change sequence of arguments for efi_do_enter to save 12 bytes of object code on armv8 as suggested by alexander. v2: do not store entry in loaded_image_info but use additonal function parameter as suggested by Alexander --- cmd/bootefi.c | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/cmd/bootefi.c b/cmd/bootefi.c index 771300ee94..7869cb4279 100644 --- a/cmd/bootefi.c +++ b/cmd/bootefi.c @@ -147,15 +147,28 @@ static void *copy_fdt(void *fdt) return new_fdt; } +static ulong efi_do_enter(void *image_handle, + struct efi_system_table *st, + asmlinkage ulong (*entry)(void *image_handle, + struct efi_system_table *st)) +{ + efi_status_t ret = EFI_LOAD_ERROR; + + if (entry) + ret = entry(image_handle, st); + st->boottime->exit(image_handle, ret, 0, NULL); + return ret; +} + #ifdef CONFIG_ARM64 -static unsigned long efi_run_in_el2(ulong (*entry)(void *image_handle, - struct efi_system_table *st), void *image_handle, - struct efi_system_table *st) +static unsigned long efi_run_in_el2(asmlinkage ulong (*entry)( + void *image_handle, struct efi_system_table *st), + void *image_handle, struct efi_system_table *st) { /* Enable caches again */ dcache_enable(); - return entry(image_handle, st); + return efi_do_enter(image_handle, st, entry); } #endif @@ -260,7 +273,7 @@ static unsigned long do_bootefi_exec(void *efi, void *fdt) } #endif - return entry(&loaded_image_info, &systab); + return efi_do_enter(&loaded_image_info, &systab, entry); }