From patchwork Tue Jul 11 20:06:20 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Heinrich Schuchardt X-Patchwork-Id: 786840 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 3x6YB64dzhz9s81 for ; Wed, 12 Jul 2017 06:11:10 +1000 (AEST) Received: by lists.denx.de (Postfix, from userid 105) id 49E95C21EF7; Tue, 11 Jul 2017 20:10:29 +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 DBF7BC21F2B; Tue, 11 Jul 2017 20:08:04 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id B7140C21F09; Tue, 11 Jul 2017 20:07:38 +0000 (UTC) Received: from mout.gmx.net (mout.gmx.net [212.227.15.15]) by lists.denx.de (Postfix) with ESMTPS id 7A673C21EDE for ; Tue, 11 Jul 2017 20:07:32 +0000 (UTC) Received: from workstation4.fritz.box ([88.152.145.149]) by mail.gmx.com (mrgmx001 [212.227.17.184]) with ESMTPSA (Nemesis) id 0MZCxA-1dEZwA2Jw4-00KuNS; Tue, 11 Jul 2017 22:06:38 +0200 From: Heinrich Schuchardt To: Alexander Graf Date: Tue, 11 Jul 2017 22:06:20 +0200 Message-Id: <20170711200625.7108-8-xypron.glpk@gmx.de> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20170711200625.7108-1-xypron.glpk@gmx.de> References: <20170711200625.7108-1-xypron.glpk@gmx.de> X-Provags-ID: V03:K0:g/Uy7ohVYCzyaT7Znhj46TSyNATqYVKM93lR/93dqMmcMCX3jy1 dUohDd6wbdzs1MXUAuaizdMsl1ZK3LcTwEmij80qTjLcmX3KRqIVUMoz18qxPJTX8JvitrK z13l17EznZM/B7x64efOfUO2eF3Oo4qmj2KG+i9dfudlu4OkQseRQXeSdbQHvXmB11O3Fmh PfFoD6xbejRvD6DOpXO8Q== X-UI-Out-Filterresults: notjunk:1; V01:K0:Y83pbkW4C1w=:6hakgarAYsg+hzGeMRjdVP RWM8y83V18wFRxbCHRTnD1wCkK6uW0Ow680fifvp+JR1svsyG/s13kM/HYADVjF5pKhBQQUcx fPlehNGaMmlKgcToUGHmBaw25RmLDW5AK0HNiinUnaq5i1rRtnFX0gzLAmPKL/vKRTsAd87jR qA0TEmaoQLw7sRkKj1hYDi6CZNVMqLXpHYqKJEC2xhwzRvAHdzExqTskhO+INivJ9K0W6zC1c b9l2GHh+RNHGzOdx4vq1RGaryjITDVzf6/3e+YQURHQQw5Wc2qz9MmbggUvEBNUHzFSeMQX8+ Dn4ukVGnD3VU/zvymq6Scmh7vd9MUL6GUEBhsMZ4CWbFHaGORYOxrcwveDBDJow3Yp4ssWVEp 7e2JDCLL7m6KiSLle/i2cp++3xp/DVclsz/kcMg1CU7RQYs4gnioEOWiSvoxHZaTKTx3JMTAe Cl3jHLOKJFb2j6NEqWiPKz0kmo/arP8Kzxg93MVz7AeUJbYqWPbQfDg6otXYVQGqoLQ0o/Bo0 jYXaM6gW53QZTKCdvqjwURI1XANxITPo1YM/J31xBXK5ifdx1+WPf+muwiM6Ka5HwwtLrjX6Q Eeo0ZXbtDzhdiZJOePqLPISP1doPRPMWVACvpD5FbbyGDhUdG9ijeUP4TwcGXlpwOA2T3vqSX LYmLRC5UWLRf4vVErTS6f01hvVk8QK2mgJgqvmd2dM/KCJOC0RBDIahDQ0A2tmBXPv99/XEID wV40xBqbFr0o5oZwupJyDGWpO7wFVzSzVz0V+nSMcVhcITP0CBKIpXleIl8= Cc: Heinrich Schuchardt , u-boot@lists.denx.de Subject: [U-Boot] [PATCH v2 07/12] efi_loader: implement InstallMultipleProtocolInterfaces 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" Implement InstallMultipleProtocolInterfaces in function efi_install_multiple_protocol_interfaces by repeatedly calling efi_install_protocol_interface. Signed-off-by: Heinrich Schuchardt --- v2 no change --- lib/efi_loader/efi_boottime.c | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/lib/efi_loader/efi_boottime.c b/lib/efi_loader/efi_boottime.c index 607287d01f..74b9620ad8 100644 --- a/lib/efi_loader/efi_boottime.c +++ b/lib/efi_loader/efi_boottime.c @@ -778,7 +778,44 @@ static efi_status_t EFIAPI efi_install_multiple_protocol_interfaces( void **handle, ...) { EFI_ENTRY("%p", handle); - return EFI_EXIT(EFI_OUT_OF_RESOURCES); + + va_list argptr; + efi_guid_t *protocol; + void *protocol_interface; + efi_status_t r = EFI_SUCCESS; + int i = 0; + + if (!handle) + return EFI_EXIT(EFI_INVALID_PARAMETER); + + va_start(argptr, handle); + for (;;) { + protocol = va_arg(argptr, efi_guid_t*); + if (!protocol) + break; + protocol_interface = va_arg(argptr, void*); + r = efi_install_protocol_interface(handle, protocol, + EFI_NATIVE_INTERFACE, + protocol_interface); + if (r != EFI_SUCCESS) + break; + i++; + } + va_end(argptr); + if (r == EFI_SUCCESS) + return EFI_EXIT(r); + + /* If an error occured undo all changes. */ + va_start(argptr, handle); + for (; i; --i) { + protocol = va_arg(argptr, efi_guid_t*); + protocol_interface = va_arg(argptr, void*); + efi_uninstall_protocol_interface(handle, protocol, + protocol_interface); + } + va_end(argptr); + + return EFI_EXIT(r); } static efi_status_t EFIAPI efi_uninstall_multiple_protocol_interfaces(