From patchwork Thu Jul 13 21:24:32 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Heinrich Schuchardt X-Patchwork-Id: 787995 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 3x7pmZ3TbHz9s4s for ; Fri, 14 Jul 2017 07:26:54 +1000 (AEST) Received: by lists.denx.de (Postfix, from userid 105) id 41E2BC21E7C; Thu, 13 Jul 2017 21:26:26 +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.7 required=5.0 tests=FREEMAIL_FROM, RCVD_IN_DNSWL_LOW, 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 93203C21EF8; Thu, 13 Jul 2017 21:26:24 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id 1DBF1C21EFE; Thu, 13 Jul 2017 21:25:03 +0000 (UTC) Received: from mout.gmx.net (mout.gmx.net [212.227.17.21]) by lists.denx.de (Postfix) with ESMTPS id 3EFCFC21E5F for ; Thu, 13 Jul 2017 21:25:02 +0000 (UTC) Received: from localhost.localdomain ([88.152.145.149]) by mail.gmx.com (mrgmx102 [212.227.17.168]) with ESMTPSA (Nemesis) id 0MYLKn-1d9PGH2mNl-00V9CG; Thu, 13 Jul 2017 23:25:00 +0200 From: Heinrich Schuchardt To: Alexander Graf Date: Thu, 13 Jul 2017 23:24:32 +0200 Message-Id: <20170713212432.6328-1-xypron.glpk@gmx.de> X-Mailer: git-send-email 2.11.0 X-Provags-ID: V03:K0:NtJJk3iPUSnZA9skMTcDpjcJggvwaTuS60gZ9pX77QVdEnnzGWk tAfk7R+C4+i5SDjzJ5qDgizebRSuG/UrEWyVR/KY+RV8OpnkKdddeXyvO5i7NW3MEIYBuQP TjnvnSvhDAfvEXO89K4fA+JjsCyA74Ua/eKzZ6SAMH+5E5IdB28/zLF9sVXyVqkD5nGNGNT b8vHrrkrXXhsO5jbykHBg== X-UI-Out-Filterresults: notjunk:1; V01:K0:HVMevcTE5Mk=:lk63Ngaqzi/S/pf+X5caJi VeE1XxFnaD6KvzIgyCOwtBe/8BvFIqIxy7MUxSLCtRVLDrtDbNBJNntr7SG5xpftHkBdE98eJ gWK4nbzalnafj169cQFVQ8C9A7Xt+8EH9lrP3dplFJf9WO+96bZlstG3S86qaYxsoIpj8hQK7 wEJsvN6ICEsYQeKMnQnWGV8Q3P5sTp7kQABUZZhdg2eEomdT8CPZ7+MezooYzBIYdQuAclSXV zRM4+qYfMxJdWzXNG3Kq1smUySOh435qancYjzAQFkVmUgFekSGqhPSzB2N5jLAU7cM+xDI6u NoLUU39uadk3m54ZTYl0WhjVfwOs2wPSBTgyKdDNf0tAeINaZOe5UMKdJAsXU129fSSCOd9ia B+l71wRnEr97zaPqBZXi23h6EmBcBsuvtl8Gvu750mtkpBqJZtt3zlxxNtlT0OdC7BxiV6Kfb CNjofdLzUvFPPgHgfLsLTR19BcFFRG7NBo8sXneU9pCI4GjLkkbqozv5HPXV2hEyT0HFw3f44 /G9bZMa12MqFCVSLHQVLw6fqk/Lxs45TzO4QCHVD9sRefqHWs79RCiwBlhMGrIJXKp+XalxU1 gX3GeyI8NFy771btQzP0VTzE52i126rhTxNczO1CkAIxBgVq7bdBGRi/Zv8pK0yPUV5YngTRf VG0mpjbCl4ehlBtYkJ8Kh32CAhgE0tkS/3J7lzgGO+P7l4dOdvp0lteoeJm44Ay0j89wGIYxk EDyMCOLMn0X2QusG7L6v9dbxV8ts0Tu/KMj3oUTlH/LiKdMQygHrghgxvem2t+E98HLIeO6Oh pDrX/bj7hR+ryQx55jvsLztGiOW9A== Cc: u-boot@lists.denx.de, Heinrich Schuchardt Subject: [U-Boot] [PATCH 1/1] efi_loader: implement ProtocolsPerHandle 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" Boot service ProtocolsPerHandle is implemented in efi_protocols_per_handle. Signed-off-by: Heinrich Schuchardt --- lib/efi_loader/efi_boottime.c | 46 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/lib/efi_loader/efi_boottime.c b/lib/efi_loader/efi_boottime.c index d2b5768ec0..c868b935b2 100644 --- a/lib/efi_loader/efi_boottime.c +++ b/lib/efi_loader/efi_boottime.c @@ -749,9 +749,53 @@ static efi_status_t EFIAPI efi_protocols_per_handle(void *handle, efi_guid_t ***protocol_buffer, unsigned long *protocol_buffer_count) { + unsigned long buffer_size; + struct efi_object *efiobj; + unsigned long i, j; + struct list_head *lhandle; + efi_status_t r; + EFI_ENTRY("%p, %p, %p", handle, protocol_buffer, protocol_buffer_count); - return EFI_EXIT(EFI_OUT_OF_RESOURCES); + + if (!handle || !protocol_buffer || !protocol_buffer_count) + return EFI_EXIT(EFI_INVALID_PARAMETER); + + *protocol_buffer = NULL; + *protocol_buffer_count = 0; + list_for_each(lhandle, &efi_obj_list) { + efiobj = list_entry(lhandle, struct efi_object, link); + + if (efiobj->handle != handle) + continue; + + /* Count protocols */ + for (i = 0; i < ARRAY_SIZE(efiobj->protocols); i++) { + if (efiobj->protocols[i].guid) + ++*protocol_buffer_count; + } + /* Copy guids */ + if (*protocol_buffer_count) { + buffer_size = sizeof(efi_guid_t *) * + *protocol_buffer_count; + r = efi_allocate_pool(EFI_ALLOCATE_ANY_PAGES, + buffer_size, + (void **)protocol_buffer); + if (r != EFI_SUCCESS) + return EFI_EXIT(r); + j = 0; + for (i = 0; i < ARRAY_SIZE(efiobj->protocols); ++i) { + if (efiobj->protocols[i].guid) { + (*protocol_buffer)[j] = (void *) + efiobj->protocols[i].guid; + ++j; + } + } + } + break; + } + + return EFI_EXIT(EFI_SUCCESS); } static efi_status_t EFIAPI efi_locate_handle_buffer(